From 6c1ac58c46e262f354eb325c28552db88ba3804b Mon Sep 17 00:00:00 2001 From: Christian Ohr Date: Wed, 5 Jun 2024 16:09:51 +0200 Subject: [PATCH 01/12] #448: start with iti-119 --- .../fhir/audit/codes/FhirEventTypeCode.java | 1 + .../FhirParticipantObjectIdTypeCode.java | 1 + .../AdditionalResourceMetadataKeyEnum.java | 12 ++ .../ihe/fhir/iti119/Iti119AuditStrategy.java | 63 +++++++ .../iti119/Iti119ClientAuditStrategy.java | 30 ++++ .../iti119/Iti119ClientRequestFactory.java | 70 ++++++++ .../ihe/fhir/iti119/Iti119Constants.java | 40 +++++ .../fhir/iti119/Iti119ResourceProvider.java | 81 +++++++++ .../iti119/Iti119ServerAuditStrategy.java | 30 ++++ .../Iti119TransactionConfiguration.java | 44 +++++ .../ipf/commons/ihe/fhir/pixpdq/PDQM.java | 5 +- .../ihe/fhir/iti119/Iti119Component.java | 48 +++++ .../camel/ihe/fhir/iti119/Iti119Endpoint.java | 42 +++++ .../org/apache/camel/component/pdqm-iti119 | 12 ++ .../camel/ihe/fhir/iti78/ResponseCase.groovy | 2 +- .../ihe/fhir/iti119/AbstractTestIti119.java | 59 +++++++ .../ihe/fhir/iti119/Iti119Responder.java | 20 +++ .../fhir/iti119/Iti119TestRouteBuilder.java | 45 +++++ .../camel/ihe/fhir/iti119/ResponseCase.java | 21 +++ .../ihe/fhir/iti119/TestIti119Success.java | 165 ++++++++++++++++++ .../r4/pixpdq/src/test/resources/iti-119.xml | 28 +++ 21 files changed, 817 insertions(+), 2 deletions(-) create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/AdditionalResourceMetadataKeyEnum.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java create mode 100644 commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Component.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Endpoint.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/main/resources/META-INF/services/org/apache/camel/component/pdqm-iti119 create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java create mode 100644 platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/codes/FhirEventTypeCode.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/codes/FhirEventTypeCode.java index f831f25d6c..d281c2170d 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/codes/FhirEventTypeCode.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/codes/FhirEventTypeCode.java @@ -37,6 +37,7 @@ public enum FhirEventTypeCode implements EventType, EnumeratedCodedValue SEARCH_SCORE = + new ResourceMetadataKeyEnum<>("SEARCH_SCORE", DecimalDt.class) {}; + +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java new file mode 100644 index 0000000000..50d53d531c --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.Parameters; +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.model.AuditMessage; +import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; +import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; +import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; +import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirParticipantObjectIdTypeCode; +import org.openehealth.ipf.commons.ihe.fhir.audit.events.BalpQueryInformationBuilder; + +import java.util.Map; + +/** + * Strategy for auditing ITI-78 transactions + * + * @author Christian Ohr + * @since 3.6 + */ +class Iti119AuditStrategy extends FhirQueryAuditStrategy { + + protected Iti119AuditStrategy(boolean serverSide) { + super(serverSide); + } + + @Override + public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { + return new BalpQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.PatientDemographicsMatch) + .addPatients(auditDataset.getPatientIds()) + .setQueryParameters( + "PatientDemographicsMatch", + FhirParticipantObjectIdTypeCode.PatientDemographicsMatch, + auditDataset.getQueryString()) + + .getMessages(); + } + + @Override + public FhirQueryAuditDataset enrichAuditDatasetFromRequest(FhirQueryAuditDataset auditDataset, Object request, Map parameters) { + var dataset = super.enrichAuditDatasetFromRequest(auditDataset, request, parameters); + if (request instanceof Parameters p) { + dataset.setQueryString(auditDataset.getFhirContext().newJsonParser().encodeToString(p)); + } + return dataset; + } + +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java new file mode 100644 index 0000000000..f3f9a4cccb --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +/** + * Strategy for auditing ITI-119 transactions on the client side + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119ClientAuditStrategy extends Iti119AuditStrategy { + + public Iti119ClientAuditStrategy() { + super(false); + } + +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java new file mode 100644 index 0000000000..1e7ea5d837 --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java @@ -0,0 +1,70 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +import ca.uhn.fhir.rest.client.api.IGenericClient; +import ca.uhn.fhir.rest.gclient.IClientExecutable; +import ca.uhn.fhir.rest.gclient.IOperationUntypedWithInput; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Parameters; +import org.hl7.fhir.r4.model.Patient; +import org.hl7.fhir.r4.model.StringType; +import org.openehealth.ipf.commons.ihe.fhir.ClientRequestFactory; + +import java.util.Map; + +import static org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants.RESOURCE; + +/** + * Request Factory for Iti-119 requests + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119ClientRequestFactory implements ClientRequestFactory> { + + @Override + public IClientExecutable, ?> getClientExecutable(IGenericClient client, Object requestData, Map parameters) { + + if (requestData instanceof Parameters p) { + return getClientExecutable(client, p); + } + + var p = new Parameters(); + if (requestData instanceof Patient patient) { + p.addParameter().setResource(patient); + } else if (parameters.containsKey(RESOURCE) && parameters.get(RESOURCE) instanceof Patient patient) { + p.addParameter().setResource(patient); + } + parameters.entrySet().stream() + .filter(entry -> Iti119Constants.ITI119_PARAMETERS.contains(entry.getKey())) + .forEach(entry -> p.addParameter() + .setName(entry.getKey()) + .setValue(new StringType(entry.getValue().toString()))); + + return getClientExecutable(client, p); + } + + + private IClientExecutable, ?> getClientExecutable(IGenericClient client, Parameters requestData) { + return client.operation() + .onType(Patient.class) + .named(Iti119Constants.PDQM_MATCH_OPERATION_NAME) + .withParameters(requestData) + .returnResourceType(Bundle.class); + } +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java new file mode 100644 index 0000000000..4c811c43fb --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java @@ -0,0 +1,40 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +import org.openehealth.ipf.commons.ihe.fhir.Constants; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * @author Christian Ohr + * @since 5.0 + */ +public interface Iti119Constants { + + String RESOURCE = "resource"; + String ONLY_CERTAIN_MATCHES = "onlyCertainMatches"; + String COUNT = "count"; + + Set ITI119_PARAMETERS = new HashSet<>(Arrays.asList( + ONLY_CERTAIN_MATCHES, + COUNT)); + + String PDQM_MATCH_OPERATION_NAME = "$match"; +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java new file mode 100644 index 0000000000..a94f65a911 --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java @@ -0,0 +1,81 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +import ca.uhn.fhir.model.api.Include; +import ca.uhn.fhir.rest.annotation.IncludeParam; +import ca.uhn.fhir.rest.annotation.Operation; +import ca.uhn.fhir.rest.annotation.OperationParam; +import ca.uhn.fhir.rest.annotation.Sort; +import ca.uhn.fhir.rest.api.SortSpec; +import ca.uhn.fhir.rest.api.server.IBundleProvider; +import ca.uhn.fhir.rest.api.server.RequestDetails; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.hl7.fhir.r4.model.*; +import org.openehealth.ipf.commons.ihe.fhir.AbstractPlainProvider; +import org.openehealth.ipf.commons.ihe.fhir.iti78.PdqPatient; + +import java.util.Set; + +import static org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants.*; + +/** + * Resource Provider for PDQm Match (ITI-119) for R4 + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119ResourceProvider extends AbstractPlainProvider { + + /** + * Handles the PDQm Match request + * + * @param resource patient match input + * @param onlyCertainMatches may be optionally set to true to indicate that the Patient Demographics Consumer + * would only like matches returned when they are certain to be matches for the subject of the request + * @param count can be used to limit the number of results the Patient Demographics Supplier returns + * @param httpServletRequest servlet request + * @param httpServletResponse servlet response + * @param sortSpec sort specification + * @param includeSpec include specification + * @param requestDetails request details + * @return {@link IBundleProvider} instance that manages retrieving patients + */ + @SuppressWarnings("unused") + @Operation(name = PDQM_MATCH_OPERATION_NAME, type = PdqPatient.class) + public IBundleProvider pdqmMatch( + @OperationParam(name = RESOURCE, type = Patient.class) Patient resource, + @OperationParam(name = ONLY_CERTAIN_MATCHES, type = BooleanType.class) Boolean onlyCertainMatches, + @OperationParam(name = COUNT, type = IntegerType.class) Integer count, + @Sort SortSpec sortSpec, + @IncludeParam Set includeSpec, + RequestDetails requestDetails, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { + + var inParams = new Parameters(); + inParams.addParameter().setResource(resource); + inParams.addParameter().setName(ONLY_CERTAIN_MATCHES).setValue(new BooleanType(onlyCertainMatches)); + inParams.addParameter().setName(COUNT).setValue(new IntegerType(count)); + + // Run down the route + return requestBundleProvider(inParams, null, ResourceType.Patient.name(), + httpServletRequest, httpServletResponse, requestDetails); + } + +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java new file mode 100644 index 0000000000..bf01753548 --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +/** + * Strategy for auditing ITI-119 transactions on the server side + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119ServerAuditStrategy extends Iti119AuditStrategy { + + public Iti119ServerAuditStrategy() { + super(true); + } + +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java new file mode 100644 index 0000000000..60328c8cc4 --- /dev/null +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java @@ -0,0 +1,44 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.fhir.iti119; + +import ca.uhn.fhir.context.FhirVersionEnum; +import org.openehealth.ipf.commons.ihe.fhir.FhirTransactionConfiguration; +import org.openehealth.ipf.commons.ihe.fhir.FhirTransactionValidator; +import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; +import org.openehealth.ipf.commons.ihe.fhir.iti78.Iti78QueryResourceClientRequestFactory; + +/** + * Standard Configuration for Iti119Component. Supports lazy-loading by default. + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119TransactionConfiguration extends FhirTransactionConfiguration { + + public Iti119TransactionConfiguration() { + super("pdqm-iti119", + "Patient Demographics Match", + true, + new Iti119ClientAuditStrategy(), + new Iti119ServerAuditStrategy(), + FhirVersionEnum.R4, + new Iti119ResourceProvider(), // Consumer side. accept patient searches + new Iti119ClientRequestFactory(), + FhirTransactionValidator.NO_VALIDATION); + setSupportsLazyLoading(true); + } +} diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pixpdq/PDQM.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pixpdq/PDQM.java index 427ec638c9..a9e3b35293 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pixpdq/PDQM.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pixpdq/PDQM.java @@ -22,6 +22,7 @@ import org.openehealth.ipf.commons.ihe.fhir.FhirInteractionId; import org.openehealth.ipf.commons.ihe.fhir.FhirTransactionConfiguration; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; +import org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119TransactionConfiguration; import org.openehealth.ipf.commons.ihe.fhir.iti78.Iti78TransactionConfiguration; import java.util.Arrays; @@ -36,7 +37,8 @@ public class PDQM implements IntegrationProfile { @AllArgsConstructor public enum Interactions implements FhirInteractionId { - ITI_78(ITI_78_CONFIG); + ITI_78(ITI_78_CONFIG), + ITI_119(ITI_119_CONFIG); @Getter private final FhirTransactionConfiguration fhirTransactionConfiguration; @@ -48,4 +50,5 @@ public List getInteractionIds() { } private static final Iti78TransactionConfiguration ITI_78_CONFIG = new Iti78TransactionConfiguration(); + private static final Iti119TransactionConfiguration ITI_119_CONFIG = new Iti119TransactionConfiguration(); } diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Component.java b/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Component.java new file mode 100644 index 0000000000..331843ef5c --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Component.java @@ -0,0 +1,48 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import org.apache.camel.CamelContext; +import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; +import org.openehealth.ipf.platform.camel.ihe.fhir.core.FhirComponent; +import org.openehealth.ipf.platform.camel.ihe.fhir.core.FhirEndpointConfiguration; + +import static org.openehealth.ipf.commons.ihe.fhir.pixpdq.PDQM.Interactions.ITI_119; + +/** + * Component for PDQm Match (ITI-119) + * + * @author Christian Ohr + * @since 5.0 + */ +public class Iti119Component extends FhirComponent { + + + public Iti119Component() { + super(ITI_119); + } + + public Iti119Component(CamelContext context) { + super(context, ITI_119); + } + + @Override + protected Iti119Endpoint doCreateEndpoint(String uri, FhirEndpointConfiguration config) { + return new Iti119Endpoint(uri, this, config); + } + +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Endpoint.java b/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Endpoint.java new file mode 100644 index 0000000000..87397bef9e --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Endpoint.java @@ -0,0 +1,42 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import org.apache.camel.Category; +import org.apache.camel.spi.UriEndpoint; +import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; +import org.openehealth.ipf.platform.camel.ihe.fhir.core.FhirEndpoint; +import org.openehealth.ipf.platform.camel.ihe.fhir.core.FhirEndpointConfiguration; + +/** + * PDQm Match endpoint (ITI-119) + * + * @author Christian Ohr + * @since 5.0 + */ +@UriEndpoint(scheme = "pdqm-iti119", title = "ITI-119 PDQm", syntax = "pdqm-iti119:host:port", category = Category.HTTP) +public class Iti119Endpoint extends FhirEndpoint { + + public Iti119Endpoint(String uri, Iti119Component fhirComponent, FhirEndpointConfiguration config) { + super(uri, fhirComponent, config); + } + + @Override + protected String createEndpointUri() { + return "pdqm-iti119:" + "not-implemented yet"; + } +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/main/resources/META-INF/services/org/apache/camel/component/pdqm-iti119 b/platform-camel/ihe/fhir/r4/pixpdq/src/main/resources/META-INF/services/org/apache/camel/component/pdqm-iti119 new file mode 100644 index 0000000000..5039dcad11 --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/main/resources/META-INF/services/org/apache/camel/component/pdqm-iti119 @@ -0,0 +1,12 @@ +# Copyright 2024 the original author or authors. Licensed under the Apache +# License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable +# law or agreed to in writing, software distributed under the License is +# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the specific +# language governing permissions and limitations under the License. + +# Camel registration for the pdqm-iti119 component + +class=org.openehealth.ipf.platform.camel.ihe.fhir.iti119.Iti119Component diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/fhir/iti78/ResponseCase.groovy b/platform-camel/ihe/fhir/r4/pixpdq/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/fhir/iti78/ResponseCase.groovy index 02a8df84bf..a6ff2ad878 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/fhir/iti78/ResponseCase.groovy +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/groovy/org/openehealth/ipf/platform/camel/ihe/fhir/iti78/ResponseCase.groovy @@ -24,7 +24,7 @@ import org.openehealth.ipf.modules.hl7.message.MessageUtils /** * */ -public enum ResponseCase { +enum ResponseCase { OK(AcknowledgmentCode.AA, "OK") { @Override diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java new file mode 100644 index 0000000000..ffebe2ae4f --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java @@ -0,0 +1,59 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import ca.uhn.fhir.context.FhirVersionEnum; +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Parameters; +import org.hl7.fhir.r4.model.Patient; +import org.openehealth.ipf.commons.ihe.fhir.IpfFhirServlet; +import org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants; +import org.openehealth.ipf.platform.camel.ihe.fhir.test.FhirTestContainer; + +/** + * + */ +abstract class AbstractTestIti119 extends FhirTestContainer { + + public static void startServer(String contextDescriptor, boolean secure) { + var servlet = new IpfFhirServlet(FhirVersionEnum.R4); + startServer(servlet, contextDescriptor, secure, FhirTestContainer.DEMO_APP_PORT, "FhirServlet"); + } + + public static void startClient() { + startClient(String.format("http://localhost:%d/", FhirTestContainer.DEMO_APP_PORT)); + } + + protected Bundle sendManually(Parameters requestData) { + return client.operation() + .onType(Patient.class) + .named(Iti119Constants.PDQM_MATCH_OPERATION_NAME) + .withParameters(requestData) + .returnResourceType(Bundle.class) + .execute(); + } + + protected Bundle sendViaProducer(Parameters requestData) { + return producerTemplate.requestBody("direct:input", requestData, Bundle.class); + } + + protected Bundle sendViaProducer(Patient patient) { + return producerTemplate.requestBody("direct:input", patient, Bundle.class); + } + + +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java new file mode 100644 index 0000000000..789f42fc22 --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java @@ -0,0 +1,20 @@ +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import org.apache.camel.Exchange; +import org.apache.camel.support.ExpressionAdapter; +import org.hl7.fhir.r4.model.Parameters; + +public class Iti119Responder extends ExpressionAdapter { + + private final ResponseCase responseCase; + + public Iti119Responder(ResponseCase responseCase) { + this.responseCase = responseCase; + } + + @Override + public Object evaluate(Exchange exchange) { + Parameters request = exchange.getIn().getBody(Parameters.class); + return responseCase.populateResponse(request); + } +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java new file mode 100644 index 0000000000..92909a8966 --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java @@ -0,0 +1,45 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import org.apache.camel.builder.RouteBuilder; +import org.openehealth.ipf.platform.camel.ihe.fhir.test.FhirTestContainer; + +/** + * + */ +public class Iti119TestRouteBuilder extends RouteBuilder { + + private ResponseCase responseCase = ResponseCase.OK; + + public void setResponse(ResponseCase responseCase) { + this.responseCase = responseCase; + } + + @Override + public void configure() { + + from("direct:input") + .toF("pdqm-iti119:localhost:%d?fhirContext=#fhirContext", FhirTestContainer.DEMO_APP_PORT); + + from("pdqm-iti119:translation?audit=true&fhirContext=#fhirContext") + .errorHandler(noErrorHandler()) + .transform(new Iti119Responder(responseCase)); + } + + +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java new file mode 100644 index 0000000000..0e4448524f --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java @@ -0,0 +1,21 @@ +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; +import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum; +import org.hl7.fhir.r4.model.HumanName; +import org.hl7.fhir.r4.model.Parameters; +import org.hl7.fhir.r4.model.Patient; + +import java.util.List; + +public enum ResponseCase { + + OK; + + public List populateResponse(Parameters request) { + var patient = new Patient() + .addName(new HumanName().setFamily("Test")); + ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.MATCH); + return List.of(patient); + } +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java new file mode 100644 index 0000000000..79ef0b4a66 --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java @@ -0,0 +1,165 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; + +import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Parameters; +import org.hl7.fhir.r4.model.Patient; +import org.hl7.fhir.r4.model.ResourceType; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.openehealth.ipf.commons.audit.codes.*; +import org.openehealth.ipf.commons.audit.utils.AuditUtils; +import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; +import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirParticipantObjectIdTypeCode; +import org.openehealth.ipf.commons.ihe.fhir.iti78.PdqPatient; +import org.openehealth.ipf.commons.ihe.fhir.support.audit.marshal.BalpJsonSerializationStrategy; + +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * + */ +public class TestIti119Success extends AbstractTestIti119 { + + private static final String CONTEXT_DESCRIPTOR = "iti-119.xml"; + + @BeforeAll + public static void setUpClass() { + startServer(CONTEXT_DESCRIPTOR, false); + startClient(); + } + + @Test + public void testGetConformance() { + assertConformance("Patient"); + } + + @Test + public void testSendManualPdqmMatch() { + + var p = new Parameters(); + p.addParameter().setResource(new Patient()); + var result = sendManually(p); + + // printAsXML(result); + + assertEquals(Bundle.BundleType.SEARCHSET, result.getType()); + assertEquals(ResourceType.Bundle, result.getResourceType()); + assertTrue(result.hasEntry()); + + + var patient = (Patient)result.getEntry().get(0).getResource(); + assertEquals("Test", patient.getName().get(0).getFamily()); + assertEquals("http://localhost:8999/Patient/4711", p.getId()); + + + // Check ATNA Audit + + var sender = getAuditSender(); + assertEquals(1, sender.getMessages().size()); + var event = sender.getMessages().get(0); + + // Event + assertEquals( + EventOutcomeIndicator.Success, + event.getEventIdentification().getEventOutcomeIndicator()); + assertEquals( + EventActionCode.Execute, + event.getEventIdentification().getEventActionCode()); + assertEquals(EventIdCode.Query, event.getEventIdentification().getEventID()); + assertEquals(FhirEventTypeCode.MobilePatientDemographicsQuery, event.getEventIdentification().getEventTypeCode().get(0)); + + // ActiveParticipant Source + var source = event.getActiveParticipants().get(0); + assertTrue(source.isUserIsRequestor()); + assertEquals("127.0.0.1", source.getNetworkAccessPointID()); + assertEquals(NetworkAccessPointTypeCode.IPAddress, source.getNetworkAccessPointTypeCode()); + + // ActiveParticipant Destination + var destination = event.getActiveParticipants().get(1); + assertFalse(destination.isUserIsRequestor()); + assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient", destination.getUserID()); + assertEquals(AuditUtils.getLocalIPAddress(), destination.getNetworkAccessPointID()); + + // Audit Source + var sourceIdentificationType = event.getAuditSourceIdentification(); + assertEquals("IPF", sourceIdentificationType.getAuditSourceID()); + assertEquals("IPF", sourceIdentificationType.getAuditEnterpriseSiteID()); + + // Query + var query = event.getParticipantObjectIdentifications().get(0); + assertEquals(ParticipantObjectTypeCode.System, query.getParticipantObjectTypeCode()); + assertEquals(ParticipantObjectTypeCodeRole.Query, query.getParticipantObjectTypeCodeRole()); + assertEquals("family=Test&_format=xml", + new String(query.getParticipantObjectQuery(), StandardCharsets.UTF_8)); + + assertEquals(FhirParticipantObjectIdTypeCode.PatientDemographicsMatch, query.getParticipantObjectIDTypeCode()); + + var fhir = new BalpJsonSerializationStrategy(serverFhirContext).marshal(event, true); + // System.out.println(fhir); + + } + + @Test + public void testSendEndpointParametersResource() { + var p = new Parameters(); + p.addParameter().setResource(new Patient()); + var result = sendViaProducer(p); + // printAsXML(result); + + assertEquals(Bundle.BundleType.SEARCHSET, result.getType()); + assertEquals(ResourceType.Bundle, result.getResourceType()); + assertTrue(result.hasEntry()); + + // Check ATNA Audit + var sender = getAuditSender(); + assertEquals(2, sender.getMessages().size()); + + // Check the client-side audit + var event = sender.getMessages().get(1); + + // ActiveParticipant Source + var source = event.getActiveParticipants().get(0); + assertTrue(source.isUserIsRequestor()); + assertEquals(AuditUtils.getLocalIPAddress(), source.getNetworkAccessPointID()); + assertEquals(NetworkAccessPointTypeCode.IPAddress, source.getNetworkAccessPointTypeCode()); + + // ActiveParticipant Destination + var destination = event.getActiveParticipants().get(1); + assertFalse(destination.isUserIsRequestor()); + assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient", destination.getUserID()); + assertEquals("localhost", destination.getNetworkAccessPointID()); + assertEquals(NetworkAccessPointTypeCode.MachineName, destination.getNetworkAccessPointTypeCode()); + + // Query Parameters + var query = event.getParticipantObjectIdentifications().get(0); + assertEquals(ParticipantObjectTypeCode.System, query.getParticipantObjectTypeCode()); + assertEquals(ParticipantObjectTypeCodeRole.Query, query.getParticipantObjectTypeCodeRole()); + assertEquals("family=Test", + new String(query.getParticipantObjectQuery(), StandardCharsets.UTF_8)); + + // Audit Source + var sourceIdentificationType = event.getAuditSourceIdentification(); + assertEquals("IPF", sourceIdentificationType.getAuditSourceID()); + assertEquals("IPF", sourceIdentificationType.getAuditEnterpriseSiteID()); + } + + +} diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml b/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml new file mode 100644 index 0000000000..d353574dc6 --- /dev/null +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml @@ -0,0 +1,28 @@ + + + + + + + + + \ No newline at end of file From e5d7277dc9158f193780c5714386335f6ad2381f Mon Sep 17 00:00:00 2001 From: Christian Ohr Date: Thu, 4 Jul 2024 09:05:43 +0200 Subject: [PATCH 02/12] #448: start with iti119 --- .../iti119/AdditionalResourceMetadataKeyEnum.java | 15 +++++++++++++++ .../ihe/fhir/iti119/Iti119AuditStrategy.java | 2 +- .../fhir/iti119/Iti119ClientAuditStrategy.java | 2 +- .../fhir/iti119/Iti119ClientRequestFactory.java | 2 +- .../commons/ihe/fhir/iti119/Iti119Constants.java | 2 +- .../ihe/fhir/iti119/Iti119ResourceProvider.java | 2 +- .../fhir/iti119/Iti119ServerAuditStrategy.java | 2 +- .../iti119/Iti119TransactionConfiguration.java | 2 +- .../camel/ihe/fhir/iti119/AbstractTestIti119.java | 2 +- .../camel/ihe/fhir/iti119/Iti119Responder.java | 15 +++++++++++++++ .../ihe/fhir/iti119/Iti119TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti119/ResponseCase.java | 15 +++++++++++++++ .../camel/ihe/fhir/iti119/TestIti119Success.java | 2 +- .../fhir/r4/pixpdq/src/test/resources/iti-119.xml | 2 +- 14 files changed, 56 insertions(+), 11 deletions(-) diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/AdditionalResourceMetadataKeyEnum.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/AdditionalResourceMetadataKeyEnum.java index 5c26feff52..7514ea7ac4 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/AdditionalResourceMetadataKeyEnum.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/AdditionalResourceMetadataKeyEnum.java @@ -1,3 +1,18 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openehealth.ipf.commons.ihe.fhir.iti119; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java index 50d53d531c..420e81b7e5 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119AuditStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java index f3f9a4cccb..9401d32c6b 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientAuditStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java index 1e7ea5d837..3ca3eb8287 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ClientRequestFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java index 4c811c43fb..035926993e 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119Constants.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java index a94f65a911..400ddae228 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ResourceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java index bf01753548..814ff4cf1e 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119ServerAuditStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java index 60328c8cc4..0d3be67576 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti119/Iti119TransactionConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java index ffebe2ae4f..3d2de299ba 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java index 789f42fc22..c3f3571a85 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119Responder.java @@ -1,3 +1,18 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; import org.apache.camel.Exchange; diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java index 92909a8966..7a26428bda 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/Iti119TestRouteBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java index 0e4448524f..1347b5413b 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java @@ -1,3 +1,18 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java index 79ef0b4a66..8243f0360d 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml b/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml index d353574dc6..e3f303f570 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/resources/iti-119.xml @@ -1,5 +1,5 @@ -8yo`jGne#SR`2pI4P__Ou_0Htq^tw@(*wu z#-9ZD)M`wYTd2LgJCHu>v7u31==8*$#aUg0AKb5&HGY;tc>j(_o+L5@+0isu^}4*A z*`>fJw!tiRfhiujW4syw^wF>_m#Jy>wQ#{ zNt&r5Vv`j0u2&ZI^%jmueM{}N-BMd%cm>6aIm6{FuFf)WHncE9If*)iN^?}Bf_Zb= zrKMp%g5ltFEb*-3<7;wv?{w<4+lslspjOTPr31$Z2t<2xtI3?76ez`>hK5w$j z4-5TRH7_5UK}4!U9lY)-o)w?qx)=QR74pF=USIpNdl`)%0F4UkZ8TuWa&lzlJV!we zB%sGiwX*P}FlW@uXRtL4OkU+`Y05*f7mp~zxRZkQp^LmSP2BkX~gK8J1BQK zu6dh7Ro|S(vaJov1XNKd9at=hOL-JR*{`NBUJgB8rq1PpV3L=96c>7p`ulp64rGZE zdQi`$u1lMS;yA4GFjGq@_^|Oq@PEoBP!d9A3XpqxRCf4Y0rzb#b3UGk>{}H3D?5Vs zZGLwVnH{+Rf#{{5WJ0q_bKXr2eNK8Zm_ma+c=!aVJ{Qu^cLq`y9HPQlaSWiqa+D2W zC6<$nGFjP|m$*?id+sJ)Q9PtPe^+ufdk*q}O74%82n?W-drHw4BwTE1MCDq)hc-$v zk7ZJjxe;}AjbcYdO`4HQ^FxbwWoa@5FU7!aJ*n@D?lwcq}ckel51c1T^Xq4F8rh9Hhhb6k0gPHDDw%DtFIgNnl!Z~r?W_* zLohcGG}IN6Z9BMxZTaCkV3P=o4jD9VpqUEWMI<~uv&XGfb*~}zaji_A5$CWs2tj%} zI!#3x;J51LUM@xatDuMV>f@~EcSE-EbaeVA9K0Ux*bG`a+wNo|MOeuUGjmoCT981u z)QL<}mJ~;>*v3#dALN@zoNc<0R2hOq^qvIB=tjrmwt4T$nrP7_(IV2G(^=f_FZS1@ zs`P3o*uGWh>#f9*+4HP8nUF;D7i>s2eNMSoq3DJgiKQg$_Kv2mg9GhUZi*K z2nR@CNX1jYG?WFf$+Ha3{#9~sOz_5mN-or~A*_6SY$I+(=GQ(x4X_RCZ1NqbNr*4q zUQ)za{cjDcIpx9I*bS{jG@F4oNMw{T<)BzKCe}ICA`SJqXeD_6D7ot>BJ;Vx9oaQ- z5gs(AFs?XMAsVm-;1Lw4TIL_R2ARuD<>*)cAi1XHe(3w|nUblcPYBVX#tq6ZMgr@>Dra34 z-yru`%0YM1Bj1r+B7rIYs}7J|2ZwJ73+Owf|L6J zDvQSbw7j0geob-OI(4$&z9a6f_+P{l{K5ONzWe_%a;LQ_hkIerxq1G}$lU`Pxl4a$ zWBF%+v#|r&-e^d-Q@WBR*!^IyaAK_}Cbx{B0kE1X`cKSp$JxAeX<#27zS>1hWO6A` ze<4EjEoo5$E`j~m>`%dJp;JUvP zx!DwsQOUi}5x&9)yp2#lhPJ7_OP$g;{Mzl?hRT4)PxGjnfv71MrfN3|QQ+}&uxgJX zvzaMV$8ule@DGv82qbc~--+CoG!XuZbeQn!NsSk)J;QyBq2af!9LXnn0+f$3$>OFLQ-X0<528jQ4Aq=*qS^a}!cAds#E_TUYDd zrGMBjX)2{c$;cFq+KXU#KWZF8C|85L5>R1O6v`L*9^>Bo5!4oV1l{;TPg{8i{}o}D0`41dAt9}kCoViFyBu_Q>i0I;>fL%lGc}vO!1UUnr!snmu64_Pf#h7YDj_oKC3v$H;wsH*#yFwJLvN zRMZaujoi=r5kMoiMq2;f$elrr1RA*mwvo(Z<@Yg(e~jEa@M&q^V4#s(2Q+f+f!f~9 zUWdV60#=CqY@B}5tktqI0L@A!{!{+X1H%Ildx|#_L$3ikd0vpOoLl&Z%-e5V=3X~- zRU{L_zTblSf$v1%P+mlaY*=7$*CmA!lQ>`sn`z}|BooPuG!X-MEn%Glg;eYRs_n%-l4fnlP7g zY=GjMqL`b*yF z(@K`)rdthPTo!ARS^(0cD!Fi>QV5JA(+_m|v|0Ni$o?ePphxibuhLbR4th$`cP2xu z+_u8T`e^L5{+S5g&5J!qCj`&7*)EV+M(ub(iTs~@sEB?^H@Q@P%-Xjj@vV7(Y%qmB zrAZcfIvQ4KKas{T#v?o48vK+{G@|x248<34^yh*^j@qHjpga#b$O#)-sm98B1V6Em z8>2W`w4Gs*?|pIn9^|j2nfLL#FFhm!d+N5xyc}YF`tyiHrDbbtc~+nUcZTV-2%kg6 zOOoriAzb;NR6Z2zRo;x9FiSJVs+3oGbgdniEPQPZ@fc~dWB5cS0oV9hlrp%3Hk^;Z zAF271kQ-KOVH^uZ#Pouj)}Zn@gR2ZV$HO_(_SDNU5hy-FbD;>BHQOXK?l(Xi7cz8d z7#SDa;FX7+*@zC3^#oHrU>JFaTxP(3i3k}N!k(eI2m!1{*dO>IM8y7~9~NliEg)dgBT{mF3?lBeW0Vevf8e*9rM<)EsLNTVU1mC5AN zzSU>a=R`KmVM1$!v=%+y(!!1t7j>{2KE5sKBX(C;^|A=;mR|x^&CNl+CFAl-2(f~h z$xT+xOyp{s=&r64E+Iml=qOJ+Gd`~IU?EFXe}}WqbLz2Iu++lzL@Q;rl}-bxcx3Kk ziV?>}?%IbpTz=7FP;<8#d;1u;80rO7PV^z_p%y! z);3jJm-K4&)+jqs`+N04JG`2T&myJEO6F4f z2Yb`^eLxUt?>DuvO)?9u{>?hE7lD}AV5b<+mc3 zY-NldLazuKPYwEi)s@Wu)RpUOU|mT_MJBgeApy92+574iZW-mHwd+%a12_QH(d(PE zsR_2U7}j0C7Id5&PSMS7^d-IbUiR ziRo>t6EG^O(I}xj6O+iv<)kkDcuS4(hUBhHKyN8fKyTY(t6KZrTiS{K93-zd-q!-L zsGFZXcXN>Mf0VT7+G;!?XW;N}VyOcr7U2I6e-ev_OMicq@bP|LgZLKGvU~R6N{!#Z=NGeCKWKTIR8y7iq6_?|C3nc!pJp+ zAR(Q5^G5$BmeGF`%P}yqEQtCYfy{zir=m-A1Ge@lA6;KdC$f<7U|H;I3^8okzI9zX z1%$GPjHjA5M84R*sY+!)(i4Ab1S-ck-~LgK&%VY26(+MQ+-}p1{L~HWu6t;kP0R5D zaO<8w%5mi}4vz|b*%<_6>Z31gEn_4d{e929f6{~=oI}BQ2CUUxxTBa4>B`D2cLAb8 z8CHO=S@LfX$Y%3`ycrh;8yN+xOhhPY5IH%oTdeRqHV7%{IkI#k(6G_Ea}us>%8>3H z-P|IVLUCjSTjJ@%;+yupTY^@7G}I5<`av)j4;r0KnnKd^eU5Jye<&t4!Cox)%=G}S zU2|zQIXBEl2RL|FsXE<~K%m4#{auE+&QH|*%N)}Jnd5O^^#Zv58q@OJB1w&m@%E< z<}oOldNaG$omy(vw)kU;+TZ;1CwR?~8Abid-a^NOW%$4|P6^?(j}=UeAKJz2m7)d& zE#Xuk4T{#|ph`CN)t>@caD{`?xQdiP_n?1~V3~0NGYdpNFtf00)A>;Xh(d|6_m!CM zaomBKg@|?TZ)TCJ6!o5k`I}iBi?iZ^nZ?9??dVTt5!B`E*t0vRtnbeIC$qG`Uq1sg zi@Q?D!ipUhHYN1F=FEZpC$x&J$}c>O1{oJ^}M*#DbZ zRDhX95Ca8vW+d8QzSIqvS=@k`<&ox}%%Yi!En~J&T9XmZ`<_|!1nPtIcrk|+Njk^^ zTi-KFw6B;0i&!ATprPmgl7^Pq|N{?uHvyXoF zn0BQQ2i+dAIsz)2Z!4j$NLiOi z!o8`96nfg(o|aOYwpl`%QK49g)xoLdY!SF?gtEvP;@^6F1n$-qvB=9d1qudbbD6j( zAPX%L4n!}?j4SfRDfmxA^xYvfW3$)|K~jl8U>u$+l{Osw*Vm9rw4!#*k3Y?QRvFIj?c+H+fpuue($nW>E&%UrSGH0{Q=dv3oFj&C5?-%<$!M*R?H=wG z6k){@9v^JGEk`7mQdjq(z>-(D(!)6gpAR^}8QC@jHkWG>mvB^Kbpv%s(|Wg{8D#c- zOswoApu)ENg5!6}c1GDdq$hzWv07|wdIPWQn$aGlYXz$3wK|;q?D^GJtf9DAqR?OI z*%}2OPEX-TXJu|lo&39T`XGBKsCN{Vx`)T}>n+`U9%&K+Tr_dT&5nxs>;x=i_B;nr zJ8t;25ka#>RV>)RbHE7M@*}m^rjT7ss0UUmLP;N96hgCLI^FB6E}WoQFUFT?vZ!&0 z#$11oVy9JiBX{lALOh4{Y}LMHXZi!#B(3dk`+cD@fk8w>ZcW)c$Rr731q7K)X=R@5 zW>VdxwKlBm9=&%iu~k+y5JOUU{b_`2rM@<;^V(Mw0m zP!on$0D4Te{1s(JtZ=!%zhvlHZXtEN)e8`sPGnrW_WZe|Jy|Fplo|J*slF;HOVXzb ze2zk+XPOlURg~6N>!lO-`VEQ@z+lRS#ebg5))h2b5fgVRB^+*FSsA^PPX z8+W3d1S{-u*JXvFPb{n92;>t{y3x?;g`EPDUX?B_T-rX}zjaWH*$^6A&~~jvoUOMw zPX9N@#P%PKspk|u==i|5DmUDtYYO!BI*MCORbL1A7~y;#!TlHq%`szZ?IP%_KI@gr zHdq|QAd&nbCtRWGSM`qpbzVr#)+1!;bDxdG@976??>JLFDQ=KTBv*;uiSp5EbRgI+ z`lwAoy^xI@3pOjp%v|?!NGjF{dNTMvuB|N_!Q27?CiPOaW&9iu>sZ~p86H=2hWi$D4-ANrup+hUr&C`k4gJV7kpA1%bbR6*dEWYbmG*)x4!$yB`g(n+&8~w zaZXnyi09I9eX&ws-d>#+F@m$H6 zjb8K<%slWa5(vDCaDulBRGnMwH5MjfET_trS zse0#_od4mN=7Aj3z+a9D-swLaQ@3a9BGLNW zZ?v?8XA))sexj%D#gwM_#KYjh5Df+5f_}nZ0w6MGSuGu(&7NQEYGNJn3mk6^Af7uN z+Jmi)oJ=e8m_r_f+YL_~3|kgO0VyVSG<8?j)P-|bMP19cA1|PH+;yiF;rvc3(dGfJ zP2YjOqRhIMDxL5+C8)=}0N{%2#b)Pz6BK=6#@Yk%?3(H1B~EmE$K~|&{FK-2c6fOk zfd00&?p6J4>oTt20w%Io@g79auGK3#h~1Pu8YnJWE`$wKm0`@L(e zZ%(-D1K1R|MEfLh)FA!A)U)SfLoC6Tc)VromtyO5@?y|PFfKui)zwFv$38a!#NNFj z4rzimU>RTIC5y9sc)sY`^p0^};J_7l<-puJR@7ry>%1}PJMs`>6zbCAWcKdC%6&;8 z%YsVH9!EOo;z@Xz+{`}P0&o%8JqHj9VuLJXJ^HwLOrD?bb-XY-4tX=K_c;rJgZv`I zqb83?X6Lw+*d}017(rsKX}*qMU-g9P*p==ou*ONm=@a1eklR9-B@`4n>cSnsYJftO zLhh-w{_!&R+>=&^TAS+OdW7=Q^%4dbp>NeJ1LAGH)|I|fseK3=t9Fm5VZZ=B(;kq| zYLzRnBAy5JW*Nimj!gHY+pDDruS`HWq zfok-U{Vr}!uD0dh&r=1agl`YmFW1Mv>>+%3x_!<8?#%$C7l+67`vI50 z=Qf+X>l*^ECXQ$Bn2*of7trgQ-aeo{GMAe}5*!lGyCVpEo|l)WDG_61he#4L7tkRb z0kZ-R@-Eg}!iM3TAwYi&wp_|>?{fZY<->&m)k}rfAu7c)%kR` zrQT{k?4`KK13a7B5?;`=c=^^h-tHgHBV=rb;GX&}9WP(Mj$A(O5hiRMy4pM6$UjU) z+#YOicJayj+z)QPJ?&}iA-N00ym`Kvx4ynqKJ1M=eB0#pzFvH`>8Mj{8$xpN`ThG< zz#aOC&tgti2vAZpwW+V)1czX=5+a>K1>qux;@AM zwjM%ecV~JS@jN{q-wsl)7*jL(n_KYCcrVT+Qc@Cp2qFP*i!)bKU3Xu-G0%tOy|axr zi-%HHLoTfE*MD7Lc4cJ&xMjPZ-xe>dvtO=dZ;uyUe2|dxbuV95)p$xu7E>q|Mp=#MnXYJRqe)941LTSx7W4z!}17FU3vkkOC`@!NcXcB&aE9i7xK@# z*Ua4Qas&i?8$RriI9_=7J0&H6%v**S@7KGXWr5cMwTmvdb{DT=nfM-gkF$Xlj)z031n#av`KdaOI?(o;Il!|W~#`mX>dr&o8s z4nEm3eC-4rY&UKC5F&M4w{f>~EI-Zod4>{o7n-oU;KC@O-JQo^(yOUUroOW5xuK%(5o zAXXw0wQ^H#SCh+$Uw1L0y{;J~tSmr&?y{fOm%a}L@&pz?q!uO zVBH#8(B1-rV^k5{ro_(BQ}9B%WI1^*s?!Sb;-TR3>&oNY3xfIggLZCARM%ULIy?K$ zhIoYBtTwQqkbPA&^|2R1(JcC~yW!-C3_KKhsGRgf6YFJexeBsq(NaKhuJXAfLEiv= z5X6o3v19t$of9IpMXLx~uiE#tdp*FTqeoNSsvGC*mXj}N>*pUV`j~y(>>4)fgeM(yDFLP7DVf1PQ_P(B3F|0tDeY+_gIi8EA2!{$ z43uP+FoZ4-;Qv;;vB&yV&CTyf$*q~rbGK2$*na{}RbC^wg7?j!85WZ6b!=z_+odRV z3pbO#efx_&CX83*xXkOzm#a?sZvRfavilNXP;tppJNITxYg^z{`^M7ITp6RJHx(7K zvDKlA2Cvu7k~H8o>euff_uZX}kjK{W(Q`^9qt`nezcfMlCkbO;3J_hoZho$01ENa} zFbGgCWBh4j>-Zmm=#n4HdYHjI{5!gIeJp(6@*%lAGd`}YujY9e3J4t0Ay!p5JB?YM zS+5I5w5VY`U!uLZbd+sVWHFKS=!nM%nhiDh5_9#wqf43C6Ozs~I4S#*522)VMKfMx z+5e(TGLx$FPo~=cqD$2n@acciB{;W(36hI=9;xD@`KWYvoU1y z*dGMn8aJ40=41I`8FrqKOW9_>E@XW2=B82R06eyvItO>DBm*B;vFOjM^f(S!`(lC} zF1s8>r-q}>cGAxnWJgm`QhAv|qJ z&V+N`KW!O3Sv_xoFC!tcqYrr2A~(jZRM3!%mUMP7eRO;krI6KaQHDSnvxE=PzC?;$ zc$bq>u9k%5XP#^}cqwMi&mb2rHUhePR_)P}sndG9i@q*oQ=4G?G&_K&C4{6?VWreH zY|x}(_ADK)4jgR300URkD<7ABeMxXzl)%L5L^i%BVCiK;7=2l?ylhO#b2H|sIM(dE zD=KRhpXnSed>qP&)H1QB>pbND)pBxz-ab@0c5Lg?h`b-3s#>Etp6k3orvmcoW-(ZJ z9%HXk8Kjw(@|Ru8QPV)TSpS`pqRh5yJp&-UOm^C#Y|^+gOd}Ck>Ex^8 zRkm_~t-xKrRyg_Y_WkJ12anz5;w}?^?D#yw>S|0WH*!!4vQGSCRQY42$`5`r!k(w9 zK<&0qvQ81V%?mjKHsCQuU!#*bwAMazfXKb8OWMTjChu-i)6^jJg`Pq0o(`iyM%Oe#tX(iEdrtZz^Pq`-&Mii@R@m)%$66jXM_tPP?m3W zd`qZC|Iuut@(bHRA7!Y;@qRSJ#;R-e&6c9aq0nT0l(P=@AB$$&s(Yn z!({@^sZXTN|L{vmfB7ZPfB2S@GTx%c9RE^4pVX6M}&PPxva+`YOi0z6?|^x9CqGUGeb3Tn5BH_26L@nlwd-i}4z8O;TD{bB5LMwsIn6N$xun?BMD31^ zUQz`d+aJ8+4gAqOIXC4h+{xA)L5IC!)^=`U$a_ReNc}8_j3GVh zd(?2UVUfc+IMnW|k;n#<0Q^Ol4nHDpO{WxZf07GLj@P&7c}JI|M*bJNB+)yW5%!KQ zMdzBnO4lVxbgMdZm^5X_?6~w1wJr;)9v)sWm`V-Gf`xRAFqE6?dlfvbpi~ha^kq7I z1!24DH({-1h(rMk|4DRQ9(hym;dO_ZfhCLQ2ch|#^ zr8Kn}2Hw5<*dn4S{8kW=?waN*n@RPpPjg9;Z=G;~M91kYG9S|C8K5EIkY|7BxCPAY z;|Io0XOXF)IKg6Mq$1n66(>!uiFaKE<6D}38f-eRkO093vHxJ5Rl~Ez@*}&qg3_t* z5-<*T+bzU;%!xS*0|Sk{aT4-M6aWh4>i~~*$;ylS4TdcPLJ9aVL11fKG-;|--~ie$ zFMe9c$|s2aXEd!AuqWqVdogY*?0SBnvwCRiXZLRdW3SQ2!kq=J**-*mPY`=GMwvc{#u)361{EgejR!Q zOB=QfIneZVS2mualM=6G6$NJ{WDeypKjS7bkG8Yul%@=$LsSff`iV@!b|56ZYf9W_ zkNy0-ADP_6Va%`T3mL)xAJEddWQaipCZaa70!Nd5O!1A)w*@}y+U1Zb(jGU9H!s^% zj13e^E30ia42G-Bo1>Rs-KS05v|d(|p1GV&tFERM0c0P1i1yqwz8VvkX1&tbT%ubZ z=~+OHjLy0~0TNQyh!)POnnFC@^qv8=^=KY~DS0vD%rA2r>x^(k5q6%zxoD` zz`v&}+Bi{BsqX1^|9_Yz2&!Ztv-AX~Fa%_l%z2VD-kBxMzs!<7hWTG+Y487HmI~jQ zB@m#?DyANM6$v^c7+n8J+$3?U zc3&olgi)d8qwJQzGDH{ot+hf9H0m`4y~cOj`Z>aYap~jG;1~+AN1(HmC;<<$Jk^9) z919699^`r6oK)*&$SfVHkxJ(a!M(=~u-WCeJ!jB zYA!Y=KUsH$MJWzo7Gd}Xi9?@{*hg=32ruUW*D}jrYHh5;sy4Gv9DialZ{N9%EXWuQ zhIMiWeEB+LrW^RSf3%GC?|# zISCm}ELA=j=_U`TJ|a>)hmY;HZqAhm{F-`>azsizTWA6VbOX?h< zyv_;C3Bn0z1f;d?Pezs}ZXd9v7Dx*&1*O&vOlFfsm;u|{+ojdz3yoUy{~?x&-ials zLaQ|>7a*}z-vl(${}M~5{}M~Oj+14gdI7t6>Y8c&v096$Y1#@#_h4^Ql>@+6v^8_X zxS4UMIy?F>Y~sF_t|9&m$T3|PXv)CULBc{Cb zwtiNo2Hf}dxaI{d?y0lq488^B(S!;(7DQHu~ zRlk-pa=fYI$}{{}Lrq{$U2YVF61o{gGn9ZpSONbzp>Mj-K1c^8?uR{+@sv-P2llXI z7FZx8raZ_Gn0cR^S9>VYpFVJeZt*#as{1M2OAg6Ai=l1Gqef2Wne{whxoIMk1N{&Y zm@mgL$GC(apjVy12yO9HWmG>#LyqK79t7GJ2!C+o?vrE$;p^@L4*|nQ>?Bu&kF*tc z1rkfJ@tT+BcBI5;GMD&7Kw^pN53%IktrbjJPAcA%$o=c{(al;9nm`CyZk|~UP?3&6&q^LG~ zvZu3RaVu*lA2^MYe`P5!MTZNAhQ}r~v66nx(v625AgljkWFy-p4gcHj6J3L-s4qfD z7o0v_Pr3|6JLq|S$7ZiJwlj*+#Men)4wP&ww6wskc(?A4Dw0lH!8dCzewC?gW7!`R zb5#Sg(F%#+>pw!%Lv{ANBTN4OB1=MmPiKrKLGQ>CwF9^bC@c_Ja%+v22O>+CKxD~S zAJV`n9|5(jV6YdwN?m&9De@aeFeOQ;H(}e0T?16H)+%(ar+hDMd7jtKyRQ@g^p!T= zeWjKZ-u^=V{BL+hUvR$dxLro9kn)Yq;ad@xyCb?^z;)5=vC7r-6H%f_eceWZMUp^I z=uYI+B-s>W{Oc>_iCAk(La@crnYuKDowhta#_zS~c3b}7$Cc*9B6oXN?KdZW-z1FfmcTAVQnaZ@dBU@Ra*B^R#sObO6hlI}p~%C9 z0OCrY;Yq*1;y&7%v@2sBf4Y=Lol|TMK!BtbIC`k#{B6e(qM7*(?4wkyj^AlFbz1eq zw8#jA8S+Co6nQqjD``^>4^<*K-=RjSQ`^T+c&Kz-3A0DQH;0}1!}qbDP*gBp5iV;A ziMQk1IBvu0l~CQgZ@DPD;Il&r{dnA&taEW6t-(@T^VG1H5iZ60y?=jM`-E$QYde@9 zrwJ+ozVWEkwaGlZ%6fM3fclwvCA6*LQV z!Bm#poUZNV42N;s-H)H6lND=984XmT(qaU8`AOxDXS!&r)7txtSh-^ui7mj0arH)F z!^e;Cn)x(je%2(85vfGi5bvzeW6SOrm?sSYMr!m1PC^$7qmHbYLm47)j8@sX zwP=y*YuXZame-R2k+&?4k8mQZ88L@U@$DVXsqNQVic<(#1!<7RW;;9Oo+Z4-53!pk zL>VWIiu|b+{vO=H>Gz~E!4%2xSIl12ssRe3&nu<)H$O74#Tyn^CZGJ9)B5;Zq5@g> z+kUftU=UkHR|yIKJcC@j6P*G2>m8hV-xZOs5MdZKFxh80Pr@H*i230^?EGW~)``^^ zXMj;}?hDyy68=r)dk~8IOfI~<5O~j*_nSHPV`NR%`yKx7D_d1oC$-JcUg6& zzuk_U%0I`q`%UhHJ>V6j{ZS&xSByNeYOtjuD@VLF_#Cc+2HiT*St^ec_NyVaXwtoZ zx6=fit{CjME5ASJSx6y>V!yV86vnFVpnD4|zfvOEAG}G)^hGj;Pn?>i2{opXAF
    7^>*oXJXTxzxUqA4FRswGr(1X`*M|t0!y(dyT&Bbz>lF8$e!ef z$utHO2QLt1IbEJ$<-yId#6)=iwL}fy#o~Jb|2!H0>k{1IVFD`LNDWu+8yzH$kxm4!HNPd^xe2j)Il5Ryv`oI#V*+ zZ1`?Df#rp-r$A=JK>(@}b;*~iB>#U^m6HBPRf7Ifm8zu6x3K;IRHYXX3AcwTZ&Pqg z>i@V(4zhYovid3rMaH!b5So=t{HG3Z&FwMcSOXdh1}mj0kgM@0p_ZeQy`8$>+5&)3 zold;6Ir?kgqOOHx?DEWgr5IT$X)Bf5#_{rTgR+-tx0&)vI3adtQgAU!FTfS*z#Ai# zgELh{{;^76j&H+0PGPmL@Xno}PPqsPs|7C%R9=#Tn|4$Rqv-32s0N(|+EXnZ`of$% z)vnY4e1}I{mN8kJ^rKhxI@WgM)&O|-1QA6y^+09?Hr6^m=aiXo~K%Tg&F1;^{ z?wL ze{mD!R%>a|HvrX(X1vnH2vfKWEYQB4w%c}TI2lz9;V)TKc-Y9{$`!^D4t*&O4IWaw zm@8Yue5#+iI1!Ka0i`DzHfeM8r43|_>%x(S_aHt5RsxPm-}^$9u8DIL zY28FLVUBA5q-W?c7ec^1j|viwy?D*w)*3TAzvqS%=m=|CT)BZu-2}o)$>oZpoW&ES zA*zIpz;o1)BXahJT29_0FpLQesSmCO4oabQ1%KP$=1M)qFZ)g-nGRq44MKnjL>n?8 z@f@sS_x1CB#b~P6keVe~q=VA~=Lg?_+7H063 zgw0d(-7-zMDg1?m#ZCML^{*s-7xJ~kQz67nDox@t{n6f#&lK$YpStu6lqjz9A+dx}wW*^XnS--n7q%O>A#(Sh)0Z=P4z*jSnZs=oe>@p>A$tX(|3BIdUpXe%uLJc zQq9`>{w_MOC|y55_MiCs^QnlofLUlHi@;XmN#hbJfm&7wUUX)3L^282Nv(3Hn`N|Z z_=1INrYCvmEM#7e+-1w*1g}`H(iqn*NW3husn}+W7;G0WiF1c`JQI-2L9*8$;qJN`K>ymW_-x51(QKP+YGz35B%%)Ir3UHik?l`s1gm_x!d?)=DsyROfPHk{o;_=$MpZ6+D8~9FSyF>v) zIOz?JR-h@-8nAe-mbjqJbx{tiaXEJ{?O;9ybp*fh=nEeZEjaIN`&C?$MBL=-(t{dK{x1LjP$e!6O)iR6 z0ZZvGRB1LB%0=(i)k~H&s4OaBn1{}P1CfWln95S+o^L>GS4`)?DuwIq4OtOL={f`3 z(HJu#pn@v4mVS?-Xl>AbyL2;rrOHDYFQ#yVQAH>*k*8sjR|ZwA?Z%TYh0J8}Tz#73 zM{}^IOyr8M0gd03@k_fKm6hE5`V^P9+k?5*YQrjph)orBV)v3lJm?{L3>)>a8WZ?x zKa<+{Yb5LhMVP6gPFfq^jcHSXhHa+iZmzwiWc&=U=_*K;)@ynEt~>CTt8^$R$BXoV zQLtr2rBgXbsA;cAp9N$j*Cl8j?9x-MNBI!+pI z+Y}2~2}f6NlHSRqv-aR@z^4V~9DJ!&Wu;}GZz`fmJk`D`|3`%J*{Dss52U51 zIvo%ymmTPKRpH(aRKxE5Pzs^qE1Glxb2Fs}K?+nN;LiY5FBBa*>1aHzArAdkVh*{H zTCzyM4#6w?`Tw{|W!z@~S4nj1%T-Eu8-V(9m5wuKQh5noRaZgXKdC!+*e$V&K0t8CEu54?TQMFu~2JCe12_;|A$Db#4g)f%zYH4O#%GCdOKXZE(*WG@0sCIufE%Xe z$MN%gs4nO#)jI9A(|(+igaaV=Yue88EZZh3)~)x`w9a8xDFkl;OiD`DeCFpFv+1 z*nPiHi!&;3fYv-xkd7g{YBk=0bZvT-xMIER;BzQ)5VdbfgT<33!&%fBJ#S)5fwN!} zJgBpp$SS7-b~|&u4Qxsic4G7gQsNBK-wy>MYrJmmaz@%&P@B3BgofP1xF3p){9JPi4mt-O(R)Qhg8~J z$69YH5NL8@X4{4)NW8fhJn{MB&Am%zMRPdx# z;AWBYQ=M#z4V=R^t~y={br~Ur#p5WBwTMIwn`tzgIQeOoQ&3eRdrmsGkz`igvAj`G zSo}6E#=sdLWySaW!Gcd6J)q$1vYUn!I2^~B@WK*Ci9L6aYc31_Y zyD3ct)6?Qx9yoNdFg{at9%*R21K{giVU^KX4pqF#Rzt2+x-ONFvcrc)q)D)UUr0$wCRu(Mqe<#myk zXt0kS{K)eyut0OiTi?x(95S-Ci6RZ^+&21V73eRpwnhTGvA$F#qkpQ>13*=xaG?=} zUfNN=A$k>t`x#C5tSD4p1WAagD%jg0l-17E8;qzUn;8@J=o&}-B;m_s$3QFb_S3C!?UXq*J zW_K`1(4=4$y8g2o9u0iQ%#zHcXFACcE*;_QTS(dx&+-lJLE*9>2qO!=93~$%&`C!t z#0?hQBTy2LenR7AFJ)-fdd4jW?yc4jB$6#-#LYo zEP1Ulu)MZPawOyzg5MiRwWMW9t5`&F-Pl1`-imGSQH4nc(M{dHF8l_W-oV60wSp=o zfHg#O{Zf@OKiNQSu2A{ml+%AN%<0U~WLDbQ`^^dCv}j%x(#`6dwls*AWX?!uyAmwp z%@_AU+<-U+1N_aiJ)-L%um2(1n-RcpK14`WE115b1TuiHE*=uUeXvTCZBZ96k-0 zbsO$VE%T73L|@x=gH>0J$KZw)R}Jar0i{;U4#U-IjqLMq6DNV+h4<4hu0u+p78ypX zhZ=e}(C;Kub&X*&52N+G_0} zcn#Jgl^sf_7e*sA08t&+Y*T8lG7F+)iEa92<2!-%UM06(W|7T6j@f5r(IkDd&+^*! z2lrWyYW}Zvu?aP&Cn)UJ=8WX33w=~}8<&vR>AyDpTQ90VYh{~ww9fm~JZqQmD`)j9 zcvmbDo7V!+KbA$FUe5sKpC8RF$>&w~r20MQRjjbD))BPph7-*zFK`1$))7_mYlhMz zX=`#?%?rzwHq9<}eDW(zS8vJG-t?j@P4S`ZkpJ#gZ&TV0b_RGXQ-d79ll~i4jsccGphv*C$~ct& zcPpBeCYw^e5jGW&j;VBou_>;byqrVY#Bgw1OJkFDr}2l(^1I9*Vx=`AC~Miu%}0ym zXPlzs%dVOA08S1`T&U6HRdzL01Xo+1809jf(;#c!3N20|bI>)T{yK#1V|JLpd-c12 z6o2EtD%^wZ zd@jn5nXk^Phmt?%c*3T;ZL*BD$XAyobI^<({v53u3yD|KSXP>-gq;^R+UobzW}x_W zofjEoDap&#h@SLY zb!U*T=jlk*)EDV6hz9j!FQi6G53#a(N4wT0XFw8cK}A$n-r&Jrn^X-jX}k82a<)bP zLr*`F2;vNz#}qx9xsK>71Zkco2F+L4#GF#C0N=+s1b1#Vgi7vyM46kKD|HTz!qgpczQA{-~27Ul82 zs@I!Ut@4Ze_84rvyY-J}_s63YJJRCW)~mZ?Rcd*rFcaU~i1(BbadZy)BrgH~UB`?~ z5RJ*8VNKw$Lsi@`b7JI_P)y|cGy(v*n*h(U+Wer?llaIhnlbo0NB*@}wm#+W3G9=8EEm4EmC9q> zr-`>h6yBBX9qOB*I}7-Gj&WP~+8+!f9n-3bGH;8ersae6txWCI(NMa@Z+zk2X?hrt z4>2^hDs@O~Zr`Ad0n$>ME(E#yf21XCnx*m-xG!lb3Lq^xxWLN*q@`AXv}FFq$H&Rz zVO6}qUTZ~QVaOHIH4;C3E9bOmggM`dYO`SkF>%7RPZ50$Eb8>D=Xjf%;KY`cMK-&O za*2D80s-GH*r{ygOIljF6%tb?-RigvScSQ^45DZfU08^ZyrHI97cOXDf&Zo5oDh6o zcwIJUzxq-I-)pa^7wHdb$JaXr2SKM>69Ga8lz?Wi)YoC6U9gQ*0P{~;S}6`kr8=); zDO~LlYT?^HhSS9_dA$QQ^fVjTnVgwGc69Aqd-nU1mM|1eNmGhQQslq=la`*pq@_@1 zB^k{mtfTEapC!O$r($cJU74Ymmrt1PruB~8Xb;--AN=#yRV(wHVyZ83qX}lnG zG>A8R4z=nK4*`WLF1ndt$P-vRRdV%GZrG-@WZr3>VqAdT#8auqe!M7h)x7clBQ2F* ze@oMe21rZE0BK2?bbYfHF{mCKhZ3nhWU}-@Jr_AFr3w)rR7ARd2dN^d-kcMV=VZQ7 z*!o;2vZ3VgBMg}PisDeM&s-NEEd>^)zrQ(`TXHd7ggeY8>9bJjO+vU>G&0hUOZ5b! zYvKHPyeW1DXIv_6a~A?Ea$SO)(*Lob0vgzyr_ms5c~us{_Z$juLHF}#o|=Y_sV*w&>sOpWF>X3)9!bL+4-8(l>y#r1WS$gkbvyO*`^5mhl@kh<-ZUoVjK#lnr;T zS%ktrcKR)}IX%N#BqPfF)sT0YE#KySkm>KqTOzVeKT*19<5b(KSmSDFbCXdbTmIBI zB;ez#W}`mZ#O1tniZn;r zN}t&8nu;Wsr_a<|-={x>_^bghkaVU$KygtBe_^=yn9mSi-jx2@_xmmT72j@(Won<} z(Rdo}4}~s0yX9WR+NCOAf@vgVHlHgWSG%i1T`lM-kkf?xsa)vNO|%jY$~(kVJG1}au0t=bo8 zhwW|!rosQF3X7ZJTeM}f^Fp?g8nZMfVifQ-%W17A)@yuP=i$VFNM=gg6mBxB;<))r zxo?-5BjMd0{sn5A6=sIdBnIQ(WL`N)jaEDh*4!RWuPI$Y0BiRXl5EHaNK1Qi3~N76 zUcRIyis!a`k{~1cu=uY;P~ZekZ!Mwk>B6Mgf`8O4lhYI=YbCJS!f;$bV8@GDQHEQc z*vsQkvQL4EZL6RF4m&bl!*&9{3qA@l|z>h z%Gj?s1Dz9RwoS^IV5Vd0IHbSc|BW+1R>i#?NtG7e=5VN^!tNv?d-W)f=w9-*VQ=Yd z_qza=E08z*TsxPSe4V9TL3UFebYyS|*09U`h2`#z4o(WHOOf$il;SYALVYMt^~5}Z z#GBM|-!xwhunl7(7+n07VZMCZ+O|>jcm_Q$=AMo{v^m6&`Vg_krBT}BRb*KYA85YS3l~DAsizeaN94iwn95bk=nq+j^9snu0()z5nfNKRxzHJ=67oQDgtsJJgHEU}j3n!DUS&wV8evK*fgm%@ z)VbL4BB)#o+ZaU4Yo->=A(yuq#ElzTUvD%BMq2(UQ(!N>y`tvatR0)jqSjMqBAjh{ zHao#LaK2-1V{=Hwz`iH^AC#jCw2o#(e5f^Nr+@JSMcjAl-&O)WbzqF_L}& zyK#~rzEb^p%AU(U-n8pn%m3OK1+9wnMu^@ufDPh!PF+8=3??Kh3QUn#RH@5hS5mey z_rp1!j-)TUd?y05X;Ep|;X&A_{^^hecOf2U*oVu@ouhiEc6O)Zl(KDn&RWs{#|0kp zjR=SC8QW$|z7LUEtr}l6#o<}U&v21C!4_yx zm3U4wvo)<3yVl^XHm*GlL}Z|VkHD}O~ZSFEXvggY60OgT}e)jQ19RHvNpFui&7g~3M>s*h1bgm zrKeH-HUBYL)8<=2*@45-+d`%2SJlFFTackp1V534fuypFz6()0URUj+zn@>2 zcr=M%;@lrN?m=;;2F8Zl2#93BSmrg|$&^GT^%WeRP?RV!x=H!5Z%ZHMPa|rfIl}x4 z>l7D|Rk?3Bb-%3@eHF*qFBL{V{4sL??KwP`J%Gs8`qm?Uo#lx;6k<*JdBsd~(4(Re z3$IvP^kzf(x$4%rT=XW3uRrm!-Wtp8u!9~tnf%nENVGg-R3LOw(`xz-n!`s`*sEmS z=7WoB_@yF^V$xBsq$2&RDksg1gf7056%snE&3`uEeU?0O08S$0Pe2M>y(5~ewI&`y z(uhKnanf3-f9411Q0@Bt+Kkcs1FkU8cHM7Rno5n0{u__KNu%U??a12Fx+yw=UuAG6fCytF1aNzGRH{%k$n z$y}qAW4K{Sx7qkDdb)L3Nk!_Rj{*}q!kKO+dP2r@Yu0nSu>*mQ)ySEOjC>FxI&gj$ zUF~zwJhuL@aFFVx&iOnoVZqd?@-JPplUL3a6pazQcCr;`pR?9RTiF$Kq$fwp_L}r! zg2x|i8HOTv)(l(CiG<#)=morSj#J>B>P7`HL^JUt%mJEhvG0ryg|Rph=IAJHB5cbK zJ>fzp&P!tOMn6@M{C3vaPLLR!o=@%cY_3`B6|G7FUdELK+oYQvasR57cIDV->VO=D ze}L@ciPKrj#Y;lrV^;r#RAgJ}zV?U~`C+K4HY@H|WRJ#tx#fx!Rk%`~-Fe+?00imz zU=_=&ILVb63(US8PQ2}R<%s6p>AiT^4S_I3*tVhx%aPHb_tY*Zk|FFW%VH$v&EZo~ zXaVvY5!Hx%62Gd+GCLh2_MUP3EJuJoDP=~n=^0d zu8uHL?HB5dBjunW9V}JUQj9$vZYX}?4~!xD)@|=TQhIYyEMBr*;eM$83K!*{vZK-! zdqO$?F5md4yu;<>AlN2NUadGRIM|>K_*yI_%m`VvPdcuiEzQqPQC;kmL9EL7M-U|z zbF8|7dZ1fn(=Ae3W7)UEj6t)pC4Kn6auVP%b=vuv*35j@kdfYm{mabxP%qz=6*MEO z=GUJYLV*S=g(J9biorlL-L;7{;y6yJPNqyKr#uDyEiGNDhh_E>8tr-yR6|22caOc= zMG!;07J6~~pj5$=lcA(_L_>onv?lIs6l%T~9CkLt6AYW(#_z(@Yz$ZZfTf1*ro}J` zsCO++gdCr!EHyB-akAOMxKp4e>MgBJA~iJufh9f~&Z-|0yNxeDWVSHq#aJ|2gdd_qxkiEU?PILG|{*PRKA4RNpfUQ zu=kv>2~?Ep6}FdMemgex+}7Rn4Zm5ppm>3WJZVgRVmkigUZ%8dbIo4fJoBWixt%L&`!@E2d5Lg!LZ)u?V z_q<`?9maP+4v&w{X3Y!3niQ-y3liAUW;69{MRvzfi68H6y#E{6D#w1UAt`c()& z`inZUtKk2c+h_YPw+|GM+s722!JtwK$n87-Z*Cuo)4$w4VktmwpEh<^08RVqiPnj6@DJ;SIaAu^y%l*n34anAq+DPHG~Tw)cWy0o7+6ZBWJ6BB z*Aod4m>?lqGyY3OihEM6ye3Ls-AX?LtiobhmRnt2b{0C|uV|R2rZg$^LQxvg##0^B>Xb zRTYbfF_#Az`ucTalh}+v+=PKhWzGQ3l04g)<3LU&O=)RiVFTx4QXztIS<^;Q*@SlJ zdid_`P)4CvN*=k%@fhCIexwbn588NQ$hdDJ6JZgY1SP1_zte*bC<(?VtZy-*EBNf{ z)~10Lk;^&ubja5s-rx}Yfdn|;5ib3c8#d1B$7*JAIll#&QyZ-X{ID+nFcLyo0N9X` z`!<+H`qOLRYpLhNdnnt)G}4|^i=c^rpxmi%>0D9!M*|dc2boR`q5^*?j`lK$oM!x< z#)3E5U(IVa>0^)5=o=Nlg!yjBqmD(z1aCrS`z(| zmJG_UHOqHGNNwO-rlzn--CRL)0n*aS7=kiRu+5pGfg$36U!rwY#OPRibRsbA5eHMe zgW;aa&!iyM)om5wI31vfr|@_Lq@nAXDa)>QwgDsOrfgR%S@{DF(NPH=++-4|@N@Bj z>CNQMY4ksFb~)5v($e@tT-c@2sAzp1#lceJ0ChtS(TWv+tCW*`+PQdKIJ|WE&s+cL zP{?Brwq&;gLx8jdb66bY2Mpj7+Uf(R`}3pB=ws*+9ug@dheyy)xuQWZp@edYgtsY| ze>Alxhju|A|C5%KNdI5b64%~vE*G(bJiIT-0Fb~|Z*N1(nky+E@{`J16FSe7;WW;( zq@wJ?MDaxghS~V%yjH!x>R%Iv;#SCR^spSE=YSW&GS8D39Lz|7w50qcEmhgnNPdGg z^5~P;V-$io%>}zC0s&#eEq)KHUdR5cc%S6=0}@}xESbVB0XW5(XAX=>Z`{!XVFn%E`(B`r~%`62!;XA&WDSiatq9P>zS0Dn?}e2g01 z&oH&%%r=a5fU%6RFENnNXY4i~trpMEyP6&yXYRTM66J5qtIJW$8;JyMFc`w&21rYc z#_Q1DBP;G`T!VH=pJ{mdmc6FBjd@9-<%~+f7g|=|JRC4Xu~3gNH^2MgTy*I}6ERYD zjMZVsjHq_-_P+Bl$Vsc086nR+oNPnunbJe2`RZM+jLDwYP#vYKds`nd1 z>Keum_V<`hI{)i`V(cIiC#4}?7@ffpXLwN3Jq;CzO|{4xio2TLL5ygmkP+`=IO@H& z!UOYe^E<3#-Jqqb>-y{@8OyLNMI4K2XSaE_9ed{od~kur(8Q>iV5yUrwR zo1?j%%v`Z)P6)Fz>3LoW(2$>{&DQ0%UJE~wYha{v9+vAZwu@BsK=yfup3=pud7wid zo|Wd)8~FysQygc^RAY(NS!oPYyi#|vA~QcnJe|K^?iaO0=1snet~wZLqnae5FY=J< zDN4Kr{lXtIyjK#*6bI`{jdhLd{tYfa>DOj{$$IK(4-DA2b|ebaDLz`h$(yF%C(poV z<&u*O!+`6(oTUN=SYsZ_PZY1SQUxPd>O3OLUX#nwQWC-U=O?5mtQboPcg0>fF3UaT zTPqz|j)KEd3=$#7W%Ieq`E7Cf8*3>P^_x98Ac9a&loS|DXSOQo;Nl`6l`88P!&?ar zxqgQTgMB$363W83XICt#cJjF9M)?USv*jHHsmq1O;(cQZy?hSQS`Squ@?~eb;v#0v ziem3lPZ@h4kve9yHjVXYGGlTNv=bcT)06OiRsmJV{3s(VDL%w9>3sVHPCbs#P7*mE z_u^++-O>CvN4WKP9>%f|6=MR%2J1G8Bofh8Nj%bO(2&JwDshLYlDDy07`A{zA$c5n zOj@eijJj+%&>)$W(fAwlG0H@FDuzjjF>m(Z3Gu<=(#Sa^9fzsAxnW1X{Z_PyiO`&c zm}EmAI>1~tjFu`%{h(O>dHy9o26J2-$52vOp%ZIRF{b*mJ^q3B>G<>!oN|bBXmQGH z3iWIkmZ$rGcspCr7O<+mfP^}Z*0d=&V@%#rVxo|yGJ zRbhnTq&lheIAN)0}@CPZ`r^kE$i&yG?D>4e zEAP+G#kfC8d9758&^QSt-djpVxZy9Hr2MEUH9II+N+m%L57AW`tsrV*U&GZqi&RQ` zrA;sv2KS%9ZNTtks~hfNa#TJ2sqdkqhU*w=1%n%nOwo7v?K$Pe(J8^a7BfU_jnivf zDucr`4FGG+@h3ss#&*#lD1X4pdb5Lzg6Y0bXrNf`!6(*Ib0$Z?# zw6AhE;@#?d>!^}mE*kNzN{Nw^6;DDLUY#qG^yIun_8rmVfbUpKv}Pp5C{EBK;$%7eW?eN6qo23 z>+b^FD{yq!TT`0JqMBTYQ$rYew76#6@-J;Eji_^qM0)U{lBn3XBVLFLZj-u$R}p+b zT;Fdpu^|dJCE#Ch<$SHeRf!C&bPS+af6qS{E^78yg;4!iV*qwzhUj?8+sC zusUgcs0ahl342~s?PmC2Jz^QE^n`}ysZxDH<#0>FeC-HSXyTwPeMuEH(INTfJ)B9) z*ZNfS*qKsaBuwM|O`dC~{iCG8rw+nlv%_&QSOtBrNCe|Ys=XcQk%wJxTw*5q$f(lw zOONCFxv~8zYr(>y?$%N`IG_h6%A}Yr0t$y3tl8duKwgfpTW~bPRud6Ca zzMT4uRaT+O%QO?rq5)%}O)_;dwGubL3HOZ{DEX4(z=n6p1;)bUk+ZWIV#YgxFj;sg zvTwaPaQ=#gBNqE~G_Z9IZ*#dp&oZDT#G$-NOGLxx^Pakn}M-Z{dM>Groym;t#=I z#yX5L<0TjBH^oI%?#G2&Gp5JUD9q8JG2Spr{mQu@hDE4Dh6!!w&aNc`l%qNXCaQ5n z^P#$Lw2JaYF3E4aXk`qZFpQNSfYXLcsBNgd)eooaKv5kAnJe6v^7#^D7$g~4e4bIC(>^ z#MEfGicGqR;?ojyt#~x#Bqjo7?$~5E(HDmxaL8#DNK&gPI*nkOQuT0SM+Sd9@n@O%^@C9M-1l!15vaH%cbzi6MKWj~hD8m)?@D~Vt- zww=JO&6|*#B$J(EEc_7qD)eZD=m#k!bOpQ6MwJ|jjDv~M0op5SQLJgVrmEM&ZPo%$ z-KHbbAj0pmyhe5O!`1$-k=|!6A1(D%$!T*E#wxEC(zab0m-RO0XxGCF3KBA#*d3T9 z*6)p}cV#pjlI(rMSF_O6hg)q~-ApBkkdcb`QHSwQOk#O}NqH&XA~3falx>yHeIZM< zV(Ij`=&Zsoaj7;UkPz69^dxW;ATB-r6PIL98cs~5#(9{&XK@Vm^lsY}&h|$JHDl!{ zC%v%1tk60MEDTJzDg@*6usGe)-atP_lIlADqz-2tL10fW*YW<&-GSAC`uG#1nY=#X z&%yIHsBO7OsD^#20H#r;{a9u)H~NZpTtYa1?*m9z_OxFZdw;&X9w`}1WSQkE0%m1c7%eT&i)S)g-U$wc?m%u65k_9!0@_K z?-bF}V788ph7hy#<$y)H7_i{cABAscW({mKBIVxvhEf-9#$H(AJPsvNbB2FNP!_d$ z<)hCAjY?xrUNu>gLn=|7CxN%U(5DJ zCpQU&Ayz5eE}D3_9;p2=uGhQpGn@wAQiK<~&b-FO@NQAXD|hm%ib`IorGUSNI9->S zOW@o)$CP*3moL?5I~&QM{D4;^Hffc>rgN0G!#}TX0}&Y?jb&mgyt_<{BSKUXpneBI zBxDM78xyJ{G(nQU2D{O*pJ0M2L_--Tj0GIwKq!N{E&=KiE~H;#;hr z!g8ZOC=NYcIz*j`F*Ay%q*Oi$g6&Gqpu8$%%a^+Jrb;TE2&9-y-4@ch;|{lLYo-YM zfDb(f{<{QN(biNxI^B`^jYV`q6MEW&FwH(;+iO zb=%V8M42yh;%@)EPFm=bHl<_gl(M=}G^+6LXu|fB@`V>^?(#BwO2_c|bAYmc3t?hw zW0^FxN7?`BlUE1_-$O(gdRMPLC7@120Ewg>4RWxXd7t&PAZdrhCT(+3-0>BVFGD)v%chT01Zk&s8EE&*ky zClZ>{NN7AY)~7X7VK^|6k;p_wg7Pwnk?0WxHNS8QW&hJ#;3KJ|bnuCu@xw0Y+75pf z*Lp=VVLny|r{2!aJ=cpRg_Zj^O4o^h0_1lWZewK3Q0(XkaxY16b;%lzqo*_rsE&6Q z;ij%SUf?Y3tb1d0ygG^S4Vsy&OoHt(j2x_SmQ)y!`r1S|N%8Isv7&|qRS^pTGyxV^-`p{ zFW(}9pie*`xh?8o@&p*Si7RL*9i%MDbvO^V8oEI!@J!)g*7gKf{_9`JpVC7dcr!#qob%K!xEx zt4s)6MFFPrL2WK3PGZ%RX;s)8Jt^lfyKT}CfS8lTKfN3KA4mVgFEOV&Vp=b<9nuCZ z6F5-lfSHAR`&HpVu+hk|#8Yq&S6g}Zl`7+M(@OVKBIl#4DCm=aEB{|~-BXMxfwnH{ zwr$&X_iWpqZQHhO+qP}n?%B3&`}SIUpXBBw=ds=^snkFIF}|q_)rWu_g4*+bY}*SD zyRy<=Fm+_m65#Y}yZ$N$fNyYmvHnqW@JcPn{sIPKY-$rg)kduH+6#~-4xRW|)cvn=IkJPaqCB&t&DjJZWIaFvXdRUO!#(Rdc9zVm(d`N*g-Yt(k39uDX126kOFF17|K*oV z{+C};aHXe|iaY-=zogReamt8t0nJ82sW7O=aWAfvvm9~gw*E)>^9)qOV{{9m08kd> zebXr?HEUaY1Kx{B&`nLhZ{0hks#+z^;E5soC*V&d*?}Q!oEZ$y%yoZ|{d8w-)g{&K zNeRYnfJwJS2-vT~p^<9jad$$o&h7X22JmnHxb0uJrc|JNHZ%6mWS_?Up|LPgW> zu2LyU0+Z~RD%T}zX>T!wK9X-F5LTF1PDx5$n}n~b=h3H*J|=dLu09Ci|83idm_O5w z=P)82Z*nj)h+3>ZCto#0GW4%`uG)?E(j^HTT=Lwd=ZA?5Pt=xE7r#dG%5kJvcOq0E+OS?weZgpN@Q17rzqTmAie*~s{Qz;%oN4Z4PAZL1F z6{_h(isZkL$QAc>CJNr{}q@Xeg!52&ap=_u>yP^a>YfG0EiB+`4lUqLi$E;=5eac=*fm(v^zZ={)rus;z|jZx?o2vIupSKgBgEch zsXb4(0jLilP@yw6A>@1^nwrXi(Fr0Fy~H#b$lc{CUl<{Kn7}699u2SXhoO3bCs$8l z0CKF8pkncwIGvma1I_E6B$14i6c9Dxmtc~MJ(ohnaXGxTS1(>N%~v7%Qb|i)J?|dl&?W{nTIBOx4-_&){{*}nOHG36FjQ*m?z z9T>`IQAm33gaf{z5e~Lw8~biScBWD|h&I2b%PWL&Dq8Tg|G`lCxNOi`n3n?GUv-jj z49-%3^YLS|QS$~G3&?X6`%97<3q!Z`d%y^LakHkAM}BdPxOSI^h>#qBQzNn8fI+ei5eN zZUSoS5rEqe0Lipf)8zXctJR|rKJ|3!ni4bqhjJ>3;W0(Sb}8i4c7%t>JzVwyi!Bx| z*K$b2iV)MpXmv_FE&%|Pr4!o$`dr#)a-l^wwj>d&SeR#{PYGFP``xv0F;L1o#vM4J zdW`t2RJs>4`Ttdz%#8E@qc8zd3j{?H$kG79wB<+ZD`}96(IB%2xJ8B*A`~mv%UopO zaWKXbMgJ|xsiA0vfDlvC2s9=-6pvKLN%%u=$--kL^d!S}PV~PDlNqFliP@q!c{71p zZ3A)==t#K0m$gZ^pbp<_@Zd#0Ij(waJw#n1<3^Tu6mkbii1v)WD*0Tx%Hck@_;UxN z7B3!K_+=rXMfLP!{fLn-_q$>W8`hoU{X7uZ;qP*_8<3|0qB5uo2Y)_@$%;w-%x}on z%Fn6#H>|M&)xl$s7Fg}16$;B(C!d`p(*d-@w3un_(#i*x|2acxY2?2OQ{_BM)jh=j zC`{T&exaJ8Y?>z@S%^!=tUUX4V@Wq?^Nb=e4$V?0tZc`v%S0lECt-l!xPR+fTCuNQ ziTCE>Cqn!T$Ii2E*;btv1^r8xqLXGjv=MJI5pPlc5?sb$N()?5m)xfOE9sL`Cp1@d zi1KIiU#4g>(S5C2hlg1u9>N$^R69UzX1GUYtV#WKjlVJ!$z?uTtVD6n{fGYCUo!OP zpd1pmv_Y`4DQjTyfI;R>lXZ}?rci!amNPyiDZ9H$g!amDdP$0NMb7Vm#_rNeG_?0# zw*{~x>J$u2mNg2S0b@5d!yo96g9Mr@TIt-;=B-n=lFXEXii<8nu=t*Hvn)Gy%6cy3 z$e2xwN_6S1s24|Kd@W7h|DzeUKK@b!AvyU^#s-y|W)94sgtU@u7pb6IBet~*O@$T` zt7$e}n|FV1K;nrKUw}hZS@=p4aXv%ZztCa|I}dRcfoN%_l%?vtAKnBmWCK@0oh29h zh1kJQnp_~%k?&wixxhzw;h{p4kzDa#h^d1(HPJdf?XD?5M#iK?6D^4a-GdQNUh(`U zR1yDFIVV@kclb>^PWpnUZ9+cERi*(MxL3coWbF;N^=TGA&2U}ZW@xG=z9dVG6Wtp)95L3qN`X#7zbLhhfy*f~~Q=d&>*wq2o_ zl5o&T1!G3`>!089jo_y?!alR3aUp0~Ew3negJ<&AU9q93eQ)%3Ke8e5`E#e*Jj-|w z=c2<*m$16^h_c*>*NOPMPwLGY1uUvMp$$QcDTjHzCo8){$*dIf)91Li$j!46DUg5} zeUT$8fyS>pbgnK9@^Clg&?Vx0J8icqWy4a)V5)UV;b4di} z$#Mtm%LE}BkN1l)#W&M58odG|rH^ffy(^gexpjKJDd%OOzT zZ=Zo+tWhr&VwFGHXKhD!{u6*>2FPj8XSxn?P&j#LG(YzC*1>ALm3Gr%BYl*Q9^+n< z_bx(FDeZXIbd^6O&PjD1m+SboN1?JI*}^%Rwa;OPIFJM({$8bVF8u~YGe-y}D9MTq z!eDuy!NLJi4Q!3lO(@KTujI7ZINiQDVn3%@X~FvBI^Ywlr;=wIv9gy!MuSmnM~*=} z?|Lb)Or0{cx}AVZS-}L3OhuLaH^Kv+{~wp&Ka6V|Mlul^BOOGz;nKB*%q9xIO>?YW zj^EkKFtfDoiAyc`M$U?-S?54AMS`bbQx%32`EN$0O5~iNiVA>$EAyLCf&3?<0+K{M ztLM<}AxN~PlS zt~Zz-E$P&TgnRuw_opH8cp#M8Omn{>xy_1{PBVP+x!O1!DfNnQ|34a2+4Fdm=>!sm zF=P_>DDNZ^Me#rR6n;vnyd+Y2$+Mfz`0sB(QhDKDR9WNT&2I-C+X3wQ3c z>MmJXVYL>*&N%KjGdcXtOmJr2v82nG_s_(O&+eY_-z^{sqyDD^BHCT1N*EXH zP5NRcRy*tFgRNp)-QzCAuJj*}sWtTx_>GvIN7WPMeZyvFjqF@lr(2nmcRhTC+qTA` z6-w1q(_cHqP@|Hth{J6zeaa&~Eb^h3+MU09M%Y`qzjV2x zxPoBY);LAIsQ8q&b(p|}2oU?k_gne9bE!9ft0%}>*U3orDP9@lgUbfv zof7I3dq+XHa;24xy_)k!>PM@VZ*8?o(=s!*6^~DSV_i$P@%$na+cNgYcLFXG&0VCd`d7XYn9n&2_c#vKKdwG9dv(EiTz zg70pqGtcek=?T0f2u|$i(jAzDzvXNWPo;LD`ODw}{g3`sE!r@W(8GHuY2}sMHiEXd z&um+OzSwv&MUGn<;xxRC=F?vD)6I$VXD+B<&&C_%BYYeh(Mx2bb#*mt?UCRLUfZ@2 zHZ_W~AL*wNq6aP3i`DGa+eV*oDBpbFz^2sl^*!lhOplM)JOc%GD81T7%8AoKElK{I&xh#$7!X6c1fAgS=Z$M!~HLtvdbIgmhWFXEK&h6 z*F{mA)}rbzm-3kCN;*6+jw^6nO9SONo!M>hIz6+1igU^d7exaNlcg-5am4zAm}T zIZt<~+5MG)i|-er)?KQWS)Z$&4cU%eJs&ouZ_itVpJ;nK;2#HHBYGSqp{{JQy4ku~ zU7M$%H!d!t*@?5!iSHOTZrQ58)((9PyqH+(Q`;HO&QCR;*K@H;bMN=rk@3&FcH#HY z(se#|D0*%8Y-Wz{@$g5kYwk;KuNt4%Q`b(H1uwqNb#L>muJ5-|ueYzqpQ@MTRyx@o z-5hw$7VpngAcpA~)X&rO_ePxo%r7TJ|nI^Aa1ZEI;b4=(NA z2cs8{Pm8&y5b}$INS!a^Mno+wn4KFKpRWer+kNYg)AAjNRvj2Ix&6S%_3NWHeem9# zULGD#p72~=&o8I0r}NR>>5EC-uk5^|Zm;_i9|s3#d#~n~jZPbe&D!j4EEc!|%b#hz zi#%t{zNS&J{?|G45Zi(5=b1TP9H*J{+#Kf)xy$8SD;D?r`|3sf-t!?#ouBE|>TZwE z$9?-r_m_e@ugY%wyKB7#yxM54S^93#wgWzIhpn@f9kH7O(bbC^C#>jb{MeV5?I;a; zHu~q@EGz9=9zLH7F8YrP+h;6#SFF25kH#hU))kk6LcJHN^;O?ZH(r09_f^|qPx714 ztH`gF+S%M**OwiwpI5hP&tG&vPUnij@4Bcui14_pwKA3H`YJ4-)r^j*t0q72PF?x-#t%l^)AjG zI~=c%S-ym+o?pm(Pd$s>ezc z=hK0y_s3%Ab^o%N<0voh2B+ipg8Al4POffFv<|$B>)!2#PShx;8FN!j6=9Wl$f z(BgG^>BD$Y$m-f*{roJ>Oda&duEqZ#OWC%+$kM);D&>vd#(ki@S?Q>hkv;ZBBK;`s zO{~g?Lp7AJgE1DnWEmA(sgIBsf32i*4=Lq&w~5P53-AxTwNvH~tVNAU7bhZ8+lzT& zJyMS|7jd7(z7Gmn$;JB@QSbanlSIMK8pQ|rjY)mcLv`!izhaND!HFyu~qU_(n!11qA{l=4UDd5iDca*ko z{5+gZd{0G6HJ(ZglZ6S<`n3#iHxUwR|u@)FnSrXGWrZTgLl2mh}I zFfUUy0nJX&5XTq%JABWHTbZX`0tZY~r;4!Q&bqaoA4~ ztXF8T57InPT|^${$)|`X**_(wg&MU6O^LJfgdrV&Pa8ZxZF~*fHdBB_LBH_IOaJQ3K;5_S{}O5z&q*oxlzE=jW@A zaeTh#^B+6Pjz@gk%2$?2h|241P5W*cD_ql3f2g}B44Gacz2>dA9~q(BI_aTH(CYNK z?85;=ET;P2%8pjvVok1Qjbo~Z#hUoL3IqdB;OqCXKxD&4!9E=FFI*}p2|c2{=w^Zo z1}c)fGCl`Rm!*OnEd1}PObZG7XB5vf@We^YHS$NPQ>2|i16vV`rpy2u5fvHgBtwH! z@j`j#ih5U(;Pj8FDqgiwtuv|#m<9O^aFoS(At`T7OGAcR17(%4t#}823e6HgsFyD+ z8|o<5y5>VYkl~)z7hu!b80x&#u9idvp=C2e>)?Xrm9JuWx=0Dd#kkR&6!<_IQ0-xTWIIt@;f$IaUb9Mm_whdg4nE$8{L zan@`X$aPp>r3fojS{Rx*0nKw@5IDM}?d6n8bsMM=Qn>hl{D8E9umlkUU0AXoWB z0+eWO^&^!?hwC^3_5W)cf+DY%c#LHxfbMU@!F8STYEyzC<0SPo| zDSm)l{5?RfsC*yFp&ar8WZ1C;|Cn2sDj{eAtDpZsotaS%;~gnTNVzU&SHTI^Q<@tu zpY9?$0MV;|QZGs@gCAWmwF5ZagNC@EKzdwBe}ewfff~c$cO$Xkipwy7K0#}Mq8w1o z7*sehwwmP)VZ72-=*U~ zLA7MTqItf8II2fxLKnpJ5Qhv^0gIM(C3rAHv=Mvw*M^AjVm5T9lh5ab zN{c|;fn2cfmUiq2wpBe3M*(Ow^7`)2CBaT%GE+DPpR86U(w`R1zy4L(2C!>DNNMfW{SmBC1WP$b zK+RD;qDhihnf17k?PLC8Y)F2VXmN@>3o*EblzG?$N!T__MSm$3!aPcq@d+D{CK0(K zfEb`Xw)xRnp4sCxlK`eFP|y0`Fab=Uc{ZTjHu{E%%@A3_=EYX=mS^$?`z->PSQX0~ zQI2ec5y7zL>UO_gxn;tTx(oi<8?j&%JdS`9!Q=%)I9OR4UJl3M+>lJY&dL8Cyes*m zWEF@PrUZm6ZqWl6Ac!LRisB6u5vkEt0Z{`Bd_*}}NEkSf`Og2RE`|~6P&}1d@~n~U z(cQ�F}`mi5eql7txBa#i0iDuL7)4U>AQZgXBwW6B&}C;q`peaeRMG|`q(w<&UtxF>hcmsh zFpVE*ER}^JZC?yCxffhSpnmjF=9{Sl`itPDTVvs}pl30B#36&=SckVHB5!Qi_!N_zHm6R5&w;Y|*>q zoM+>*F?aQxNQTS#3#svpgj4ho^chfimr9%@j2}r~@-owFe0e?3D9rL*?D^uZ^Rpsf*Qz4*=^o+3Q>pJcw^#wif11U#6j<^t&O zI|3vR%uIk1G8sAH5#ofaE|g3GM~Fr&;4_Kd1n?Tja6E}5exCXyh;@u;>{7ji51&cA zVL*>`Gt3G!%uQ}XiC`V#;b3CIZo@Nj`hxni4~uPv>a9Nim?a=u;%iEL%C^t@&)ePl zfAxnt2H-g-R1ApA=AK~-}3L=Rb{$P~sEKrf4+d=(2V z7OEPF6uVpPtG^O76WIjy%BWF_O2Sc?3=wz&@c*-vfg-@1V>Pguuipt9gke2n{w+Cy z!Xs>z3u29cXb@YLkDr#HIvTvVKQthj>MxaGXM=p%2CDSgwuKiwKWhmY|9kxfL;Uv* z7xDK$iQrZg#&D6`{9XA`i`7;yPqyUVQzuk1Q)WwIx6i zgjyvhby zIrpyb9%l~|3LL4o18oGq!^65%=o@qYS$4(B1d=h308URQ(oeF;BJed?EXV#?3d6*0f*Y}w|8XRLlpjc6$R1?sN zdELj`=Oa~Ryf7UZc>SuyX;qu^bLv&;JcYHD#CI(>2-(c7&xPWWO=>95dUrw;#U`=h z^NWi))f)JpLKTB_Eq`3#8h{fjf#Q|fx|%48R&_zM(ShldM)R;N*@=Uvke2ie$=675 z@FySN47!IYmh%ej{*J?oUDIKcK9P_k@wNolLsR@qER3YmXOmDpz)&sT_kYJjCgbrf z2^G$$YF@!ejq338s=}goX*y}b^=Rx6M*}sd;-yi0xE9P7jP*C~`U*3|4`E6VY}24MZ##1wg{inRafk}a9o&T(k ziZmz}L&gL}+9vr?vpPDNVyIQgwAt~L||V~gYDSn%}+hkB(P zkLxZTT~%lSdGzw_kqAghO^XBKO960DBgIqijk`@C!W%jq!$LhuB+qW~iUy;GUfK-y zVoe)oIBB9Z4bRxUFN933{1C9xuN>%}E{&VQ)icaw%++thHca*Qu#v75?otUQ$U+G4wZH6t; zvCRB*Y~+oMDlg6w8F$L$Ml?*y;7W3INyf0^`uIuVbE9#9PeOV;x$FJiaP3vY8f;}Du4!w43V*MM%AJ+y}8A;?L0qaGDF1-|1ofGBt;j^UwZ6BtOdz@&d{;tfMdLw8ck8zn(38)xMZf!^yn@i=o0GI4Wu@Ti1!h81|pj4W)Ij(N#P{2r(g$B8vlyIJ*i^NB3OnF$| z5U8Q1Dk;k86l&Aa-g@7L5utV0%o_v>9f|^mKQ1`1))|9}}>?Q&kJqQnEq*C5dU029rW7+u$hF z9AIi12rd-WFm^U5s-FZN8ApaEAc5m*pD)f$E!MEPT)*5 zz1}~UeyaPSbI>^Vm{mT9O|0B&NdN$NG_oIKrHSH{qMMrZXRyx;C|80sAn62XS7EXs zV7o)NSTuA~XPj-ise5&vc@(46m?%s@{MutK1(dd!o?qy7hn|rmIjBEbCNW(rjrDW- zK!a&;!EA0CbH+k6;S=#zyD%aQmK@_P|@M$~dTL<@et?)hU~#est-0Doqn#2&a4 z6{do^;!4o#_2%ly)RJik2iF%QoZ8q0eJ-hfw*)4;4{(iSi0T!rq>)BQ6gb`y0HRaY zG>ZvyI*ktNYx!67oWty>A1BR!?5*h8WQHT?se^|_=0Rn+>r`0tw%J6`La=fQ#l6_JR zAfBN?eDuf-%q*5gAi)M&1}pCMM1z^@=cE?xYopKD9gcR_qO1rK-Rds!@0vU?qu}80 z2Hl->C2Ez~j?pf5x-dW0pk9~;J~ja+j=K3mNhbJ%?4DlSxu8cS+oTHmZHBQB`FTon zlxIl%-R;6Vvn6IL4Cja=L$9t};gS~sWu=<#%CJn5PXxXk%^2uB?t2L0UD4&VquQe> ztL)T2Rprs%^ zn7TC41iV3oI#$97lL;?{!-^=iO=^gWl%E7qo7ekm!(3AM6puJt6dZWO&v&^h$|{hM zrz^t%1-xv074>o4krhaqR&j{0ok^OQn|zW{s9Bxw{pR?y>RPK-+yZQ_+NxBmh>Lsh z_J?TQ9$MLQ6@H&UE@jEs8U-6;Rr{}SdjXsI`703M4MRHD`uFaSp0-|;#b|-6$Yq*z z6t7c##55d26oTv*zwu$*2|DlUXdbrJ9W|AFwM3M?0&$cU{0K^`4R#nHRavJz`UCm$ z_vBw%vI;MsBy?*5&_OeTcs$7Q+Fi}+6Nn7)ij=Nfx5W;Vl)H1 zW@<3l`dT>&3G(YOS)7|LO>e8}gbvvWNMPK}&^=O%oqdQ(1IytsY-?mON=Wm=Q_dJO z5Lv7NxZx%{G(Bn+bif5J>NWn(EP*5H4{H8Tb3=%JQ~}2U(V+ra65-4ndw(A_ZO>gG zO?(dVR|ZhM2awag~sCoqotyaxRu|$xFCLg+RFRbFJWl}QWpk0~HZX`+!&N5TB<(4L;%*?iT zu#Z6sh<-ZpJ!QbD(~-wgHpxNM8&9&#o3>)wklv+%YCj{1ougvR7vNK5?ZK!(iZ2V! zTnI_~9=m{raEJkd3P;d8U))3rWtB|fs>!B<6rE|LJ!hj3u0nW%h(j`{jOxogA4(ZA z&!$a^GX60N&qV3M!oW!exQfL5gVV5AEzG%8Bqvw>1fOD%WKbwyR3a{5}yG zUg&y!Sd5)R@09gEczDaP1&X9&a^Zsa+J2v#eS*gTAL&ah;P1$1Mf#vIs}I0Y)Ip@r z^Yd)?^Sc|s3XHn{4(Ru34X)S-ufs*pfeaNdro4m=CpxKKNGS_6kn=0*fD0$e9z{6) zYVy>Z=?W0nvYja+c(P)D`Y8lI8L6Hf%HvU%wc4sTIh)477x+_&yJ zsEe)aEY}FoQRMxuiX1(&V9G!IQ!l`w&I{h7GL9v{YEI<8)k2}SqBhHH(UiuH{4nYD z5{N6)uC@GsDMa(I0`a>(1!dNHp;o(_cHjx`cqQ!!Vj|GlDyzZq2JhCRi1_d_8!p$8 z`Ql~V;Gqy$rl@9mx6JPx-egenvjYc2cJ8ez%F#ct-4Um=KQmX4$$ySG^t|s+y~=7Z zGgZS`R43eg4U5`Y+9sXy+SB`u9s9(o>gTJ1n6%rbnwXef<{D;!1S=%yq`*&c-ZxqD zbOZp=m|KK`xy^k2;kw7`0-+Jbn!DxWkNyQx2?`C&kp%f&EC=~-U8{nyWTK6>uG_5Q z!E&hhGS+oc{$)ewi@ZT8SlH>xl(GlZG0GOPT2@?smb9W&B z(+wT;6&8P9yo1H(=eS&Vu3Cp=%7VLBHur?V;I=_dv#CO zDu>j}zK#g>e^Cv=rwy@_{9c9kM_PSzKg2U0Iv*9p4MvsggK#=DkS02lDG|OBt^PW{ zwUhC!h+OBSJId&n=sM=9Z)Eu-J$Wx?&@~fq5=U$)kxxc91PGDYV9bK%cbqgCw476> z4WF?ZeJ`Z$oS&Y*WgN`q*lj32w@s>%mTowg?GDn;^DA=jiJTC5bJdHLHykvOf}e2| z9sVI#1?0ah3rfS%pcsC^-IzSV+!^I^NR#)8>jJGDb}#}lMH<}UlLrYx{)#h$4zRI^ z&t!hEvpaiLhHms`#23MA)N9rKgDh)3z`1V?S2~x{2$&Tsj^zF1_+FzCvBg4^IEIMy z6HjNT2N!`T(d-&MN3g1u;}W)x|&z6RZ#~~ zO67Gb9Xx1s-aTku?1vonWyk*vt^5U3_{m-BLVefDpJt8~han;~1GjXl4t`O2jcBOK zt}HdhKRV)oRCW!ZAU+nj7Ak~&)Ncwwg{ivzhzE(+$w3LTx&wL@e&(oALhEhV;YFZH z=4@d)Z#o>@y$^1ixA`~0*nxH;DV@pK_|vFm$7|FOM-=+N4{hsshkBqMn9#Tr8w(AY}XQ;yf}&X-3Tmskm2279clHQkyNo`Lt}7NnC<+~lfOa7d+?wAlH1 z`$bW!EZHt2t2tAy*_T^d8ony=5KE!o+HIplgxt5}a40_Y$M5)P6ehiUPXM6_MWa$x z>1PgQ4FSkuN<}l&ARyQx+LpfK@3>>cv5qbhg+)G@xRAL2!e}m^ z2^oU$W!+}<2{b2;>2nInDx;20_Ny>|({M{Q3fLBC0TATH(4JP%N%(1l&=0-`%wgJ> zNjt>(gb*xoD$N8IiEy>h7Oni9YkHEe^FiqFM)30yZeb!w%)bzSi>ogZ3+I!t1_acm zekXb6KN}t%5Tuh9<+7)n`YT{|jye7;e=O&X9&cKwMU^0hS?FrbM_@HaiAx@@o6}mc zr9WhL!we_uuFz0#+reQ@_gYQ(Wcj$KMo=;RS>sOFkFQ!4I5L0f6u%MNfXW$Q!Cq{Q z`CVx6@Agrjjojh5oE@8LxlBdOVi-vR#m}6xl|3&6Tmq7Gn6|wzti0~HW6}&$KG?9C z8jZ3SHy(-+tDxs7sK`BjB6(44`WuPQH?yoL9&V(Z%p_jsc*UABv!W^HtenJZE#IG% z_tWSfgHqA%vD*0Bu&yk3bQJ*MdvX1>%Su05nH134<$`>%a4DmBsw0x}(bnN#@MqF+ z!}Rt@py0V}k)C-$@FxHjQZ*JW-*q%~knqk!2v_J%Zy~K}-byhSRvMZb*!Lb+ zK@q>Z$P%S>Ia0prz8S4;}L^*^0lFcA(uhY$Xa2!LF^x|mqzEyx5@@EM`gU5M-C>^pEH7n13 z#LJ3iJ||+1$=|VYi|PHKSuM9x(9Li-qQana32o=EoS1RzDzON+r56;>Q|2iuVGhuQ z63eM!86+eHrHtQrr&rG%gg$cF+ecFi%RaY$f=tI)<0mY?-(9u^z7K2}P%Hwmn-*ux zN8{W*UU9K<3tncO*Pu7l^jmq2vZg}8 zh{kET>|v5l;#OCS>^e9NYlNiC0*achst*K}&HrG1H1`7-ikG}av`h*wc7nC89`JT7 zkX_&wEnh2jg>(G3C1$3296Br$`^*+gm{1)9Nw2<`U02eL%`{P<0B!v_x<$2+_(i?x zEBNV`#ZE-?bK>;;Ha|?P9WFYE5NmquByG;hTpCEhOk?A>hMe93D)`)RdC~HP(yl&+ zvM(dSIQKkq>w+R~HnBY-ERKvs6F((i2_m?0$K;$3; zE*Gf0wGe7~NFdhu#~5oKGPK6BB{6L!sLUcA-6n+OoD8yB6vRq_5j%Tk;z>LmJK=y` zGPwJqRv&NX=&LAec)xfGihY({#_TN=xwexQp-qiWQdz>HJeZO|hQi=TB3^50oh^qh zper>_zuQ+PzdG8bB~IpCMR=D|OSh6k>eG@-Mo|o^ECGL)5EnKCG8tK)$@`fom_)$a zAhF<6{W_({npB%;Pk`CE$yyz4LXl6+llU3S6q0;Qnph07-a1x#DM#d^hl3JcfLcDY z1PT=+Wm+@=Jb zEM8j{!mA8S#;yV_Wky>aTKk85+gv|Rx-pK&YQ8-V|S`{oO)&B%Oh9|}U zq*zJ*zfZ=y?vz{J>r8i07#M_+vb$zV-77<7y(_gQ7!MCMJ}a}IbTnyb*g(*q!~xDb#5vq4Kdtn`fA*(3irA|Qlo>Q!KhOe zpdHc!C`u?1mVYJOCsN}AcLe~jfJ*msxI z+ur{RLjRNNoBU()jU8}r_>xsX+q>@7uFGTIgRQiL;tSN`9_jjT<@~97TBdU5XMt~p zeeW9C()!_U`GDL~GxNey#k>34=;5xn>OI@ny1y4O;^Y5n4U>wng=tySqgsI|!Q3L4 zyZ}Sl@+;nn50Z=&j{O@RGlf9$@jTYcy@PRC?p1 z`MS?di^y+c5abLxeu9@$*|_T>%<%ilu?O86|8H*??sMk<-y22+&DnSxKM$yB#A?^g zvbMCgcB4h_c5uwRC+$@(|PQEi}VO zavVpmvYvG8xRXn2Sb%24({ILg1B|lRbTvF7w;YikGqO3TmU->{910))N25hbI(|@Q zRS6%ESfvdTxq<~aSW85l59;K}nnbpHVqtseGUulSjf<^2e<@-$m2a%w?T~E`QVZxJ zfG_c9SRhs~uB=a4Lo7Iz*zrql`um8lx$S2*Gq(hjN(Ay>NIx5o!YofG`j?~WIfD3- z9t%PH>0D3A&W}vvA)GJ|do;e8A}Hf%J*Bcpdi9+*!<07Hr4n?h!==kUZ`P&9m!?;t zN=CA#=y>E=wx82yZYLtvaLvHsBMEYID#Y&cPYXB$W~WB}ejy0=$jai%6A;&Siy(|u z=Z-ChU0qxdh*>+z8EmfqjT1NzHPpr&nB!UN7GQ*pQ11(}MT%x7>dW-Z-C5iBMWoK0 zpRbrH`qx(^-e*goFPqK{o6lhGR%x@T_ouPx?fGugcZUM@%@P(l-*b)C2~O=z&xU!A zw<|=i$m>i0w_7hGM$Fk>cJ!j^2|7AGyGMU#_Llw0q2oajZwR)|$PL*&8W{Jb%b zjmPYZ?*)9Wce(aet*?jsTCdManXh}Z=jq7au;tA|$w{vJ-S^4X$=3<}GQ2L&?-)B{ zHZ=9a_Ud6Jmv7B>CszmVqWkH0L;EH5WH7}Vzqe!a!>e5-wg+U?le~F7(RF$dy7b!Z zs>XN0{h9O}59f#NQ733{@y_$(!JT{i^=VwF7P&@!jM~&+uv~@?uAW>#kJS*SlrD$A#CGyjHg*>-*?qdHAUI;z_5@w~o)k zXYJ;5)!qI1;Do+;CnqN>w|(o~@n_h061NpQS7#mFlCQ_dlRGN6GjS_W|EllD83Ue= zUF=3j$2Pcn@u_-J^(xyHJ27xucIAe9tsAcw%c*;B{Qb2+)pyMb1RZ_wg)30E_Y%L$ zZG+e2oPD4geQ-YUb+@3!^N-DHf9;8_+^mk=e(9_ZAFgfpJEPmf`@O0!xtTkCZdZA3 zmXIw;A`2g{@W>S6b7k<-yE@R4wB5t6Z*@ z>-*Eo{6`z&^E+3zsNuor!B;nX;d113PPf;GJ1zg z>D&3&$K~`1N=7#T*@3mG`4*p{%d1@)SCRZ(d2G`#1+?`l1 zSabCDaq9C(W9f6-8Fyu`Essr=cJ?(p9Ph`B{zvP!#MS%sMeBAXe(ZYTsA~7!Y9oD2 z&2Ovu{!)F_ImbFW=S#!ax#gwC`}64aQ`y$hv~mr*>q0b9=R?B!q~fLO#p>s7QN#0Q zdRN5ps5W{`?1Eej&*&rK6bWcCacv6>!thTB-ONV zC2&idx5{p=1&eX~V0zZIvoi%;WfvY85DJlTAcBEMoa>mBwEu$yY>Ev2aJ zC1b671MZWrDc$6oy{tXs?p#=Wce^xtMDlf+o9f5H;07s$lwEK8kbOObZTx1=++hQW z@V7tAKJ_oy{kK01feUES&R7=nKmFko@Bh;uE;{h9kry4J3d52&XE)$xU_S)@u28Q` zSb3#@lz#)H)!qWajfB%$8pFv#j)i2QV_5ySPo(>b;B$Ku&;I%GhWxpcZ4Z8SLw^AO z6xvTv_dz{{*3I`^SfKemm(syU!D4~vlTgL4+;(du+M=rohWiP0p(dCF6|Sa;Rl z(}?vV6vZ6GIu3ePhMRjN{AQQqxhtbvuYHrswe{BLqi&RJ0o|N4uw~wr$(CZQHhOo0ERu*|X2=seS64s`;`i>+@Pwt18d+yZ;lU8_zye>=?P^ zQ!*k*%m=GdP$(Q3@km2rFok@G(8`9z0OrqQD^A%a@xPLC>`~x8LA9V^ zW{;zz^A?z7#2G#Eaj%D_)Y}8I@QDLM96XEbC*}7j)%G{4hXd}*xGl~3Kh zWC9<5ICP?S=HfvAw%BjdD@i$=jc zyYx@cl&EM%F4%id9qM^{n1(z9YQ~$q3N`y4uat^^gJ>|kD$YwqG9Br}FNYdMw5|@h zhn~_f7!O&@K^NC)JWs*Pxb-f%r_ z*NsDSgY%GPB+?=wadNx*@oX4d@ML{|Q*o^^N(ov-gwSn9Qz6rBvSQLMd~8Es#L#+) zQW??zTo7bN285y)g!*w;49QC1X{mU&Al2-fiwkhviG|+mDz>{{DiS7rt*sX1dI=w0 zJh<6cJD~#Z71Aj7?AFoQ*`ltaqou>Ev$m|Qv9-CZUSVaibOxTuZt9{Mg0HX1TjpZP z{9$QqrfGDxZt~>eYq$mj3d9XyN&(et z7DniHHO%_$rV(+97-nc@e=1FVhB)#GY13T@AF^+7XzjP8nFq=?Vq}AXSxR>Vy9f`Rjz` zoeq093P)`J2X1KQKJAP%~z zcLAT9;6~P4mp;iEbSg;N=m>0ZZ|#h|(0g}Qha-+~+<}kE%TGJHe$ps)3Q0gOiU_N2 z4*M^u_{;y6iqmL@n4^gIa(3E(!0O^aHQE`BSQ6|A)DnLowdrPaSO>GTuW5c$a1lk+7PW-T&&uOKrj1&0LI$VjmtI zoj8?%#~D65l}w`TxykcC@Vb^HTm zWneIXh@1KUh{YES3%R0k*R;6mZ?IRINSWn%0P<1WDCIrt1p8B}T<}A*q2-vaBzbX8iWXcE zeMXoVTHAD27|kMN`rtldQ7%6Z$--GT`)0X1zY0RqAA?KFsa)wFwHg}M47 zBG!T{)&Op$sg^T|ZFF3MhZ&MGv$jy@8Q z-;1H&pHQB&D+e2}s=)-^aRVM$dLMxHWe4zpPp2xo)VtgB|G>({2K925AC_|vIzTN^ zT%ajhvrG%wX5_tTfo86*5gOrfTBy5N$p5O*w?FuhT~ zwA!EeZ%p3nB_jBax`m;zBGYsMYeAVC(m_z@l)wxl#nU*u|HnLtJSth(Dz?CnAiNz` zAwd7UIlk6ilh)ziqTHhE-=chc)ONXC1jX{w|C&V;8{{tXVFKIX6#8iG=A71jaBk^NK?b}`~yxv+4>R%p6Yi|f%CpeK@lniqbL*GAPylQJ+ZykAavb6OOwF@iUpms z?gd%4X;3M4o^B&b4Lz_sGI~T1`t3RM`+wW>J4zK}l<)YQ8BHrcw-Qmi|2>JtSGhuK zQ@Jou7}oMWZf>*Yd&VkcI5t^)3+ATxnD_ zA;oup4v7*&z#s}gd?%u0`Ns>WMHqr_m|6);25wR&A0csc`VTeoVmXf@{w^YSRY=!gW@ae6xp<%~bbk5}aBlS0csTpIkVh8Q zSpp5jHh&DI;9d>sm8*@hXKF{hJlk$7&vt8hv?Wn}-xQsN1K9g4n+d{>729Tk6h4tC zTg&PuEm{r+NL9C#Ju8+VXADyrK?da#7f7i)jWBIR#b*sc8V!qp$2Dl0R^U-3xc;(sy*(FcB*=g%ZVWi0EfL5 zaH%*y&isBPYQllM@+~uD!BIcPdS>D&R8*@TsmU2brt&eN6z9WRGd1@lQb;9YL=Y`h zwj6nDZt4o@D_z5BlCD)=`lS@*Dre6r!J;6jc>F5{2dt)CS)M4yS_evgQDi`kK*?FC zA?A@2xEW*y)qlq6UIOjZu~&qEEaGsWhw3u{{m$?Z9YTS8sE^eDB~UlXR42i0CM9+y z77#Bn<`56bj<6vxP4*SPe4}wg20J#$H7Hisx4sJ}L2->hMvL^nzuYw@!c6O|I)oYf zJh>Z8GWJO%8j2wTNz%#0!{svkveWG#wN>B2e%#2R4Rz(dZnQB^WY9bQFNOMME$CJH zY^7#P6JdL`NNIA#ER|EjoBpq%)@K^?d!>f+nc0kGE~5lsWh`n1MCamntCrMm7<%#3 zxK1(Mt^GDzP5)5GL$+W|rS(1R63hOvmmxG=IXH}85Y~`}m($r}zy$C&SQBmwaG(!b_hPU5(mj;L_?W<1Mq~ZAFdhmXP%^@qk#dZUL9KQK7N*05(38L(n z|HkUuKs{1SkVI1N)$^!S=&2PKw26DV3iL9VOdtM3I7K95fzk~bbEtQ81*O5hanG9MT9cJz#**PY#u$mt-fG3&680hyeuQvkO8)19J!sg2}g8$fq~N zr!D$3wFGGZnW1<|MmL8=mlDBq8XgrRSJw~{i+uM6A;+AS#vpt5s=udRVx)9~l;>ds zr5D+*Oc{aJt~HF~$VMp>X@s=`F3|e`I}DHgnR3C6l{i~g7K`Sfa+?Vg-Bs)1AAzv# zmcgct|L-U4G~l>nvng&j;W!JJ!b4ODDt1F-?FBTo5N`5q!7nT;Aajew>pq;4RLLR9 ze|~bup^$q4;^G-pA%09-VBHETGXc7Y>7(Rj+RL|O==%}ZF4c?#qA{)!$wh2T>#d#V zC@c=O<4DY#UDPlHdT$(T`uk!i@B6eN&4~^3xFDByA0NAVy%YiiM>M#CjI?Pmqje2iw^C1#_=qFk zj1KxkVH+UgzPe0orB9VdV3r-AHiZy-7 zdw-ky&?B=IsGl8(dy`3JR4DM}B};G;RCrb>YB8HcPvac62}h9WQy@~vRP zf6zee>Az?|kyJ26Z~PA%)VOALF7Qu?RkO*oSoCcR_t|~7AX;h49F<^;~7y!9K9y( z8qHG;Sctp$rC`f3REBqueuR_P@L?GO)~{2F=CUak%?=X<=>+5X@_=^iuU!18D;<|I zfr$UV$Op)Dc!z6)^DP?bO;y1DPe70j^ba6N;#!?c@ztpdOZJ_roE(>nE)!4Ql?o`l z_3SH=Ax^1EndbIbZSb)Fd8_9nrac5Ojd}`rQH^X@G(oOcz(3k^&t0lMu9{Q5Y77CLeB}LweXakVKIIO+aF|TCrz--7UXJ)y(jQ4JFu}*;J$b{>{Z$NN* z2v60o{@5q5CsF=kY09p(DI(DoZJBmH%}$=AHc(2e{Up=A$dc?@VR1V(@k-55m}rYi zGG}os6ux7A%Ot6zLVOIbu2+G2ariBLqmQ ze?VdgL!PCF9NTwRJ=%lRO5zw`2e{g98b(oBb6;~W1W^49KM{V6qS&|}Tr4(k(Ycse zRVWb}2jo}jKusRTT)Z<|h~54Q!AyftwLqD2u_D*hNsl6|EYIOOKsc-;``~bsF$}n= zUm_45*%krp?Py{BgbaX7{frt3C_vv5t~hFqKao)@kh%xyRQ0Vt(z?wmEr~)&(DYRR ztZJ|7ud`!vh(`qq-z&0Ui8wWE6XsNU*X$*5-_*HejCc&S8qi#s3-pGZa32$g7bjjiVJ}gp* z<~)7N0`Om*^!%6InnARpoQRCS`*JJ%(`1C z0Df?(ra#8WkbNWT<|ge~tn&hj)c{p+27c;QgbZ-#?vNd3nx!Orob{?P>t$})_`L+7 zitSr8<1w}WmJCo%J5pdlT3pv>j|HkCCJ?Q3V}$-@7<3^joYN}5UHjDMYWYf033uU; zFzxvvNyembG8Or0j*TzF_VKYXxx16xZPvrNuH z3h^hF9NPn&T8P5vrxWIGi-ZX78>Bsqau9fvKv()B-q54ooMQQNt-PuxvetAzkeL$D zsfB{RZt)I#sC~XjY@@+(O$IzFV#UWNF~okNqIyyH46EOEYT5T^O(HZCd$`$#dB1;o z60|vNhY(Rxfx<%Eq@(lwJWJFxiHrp2M*73^gI-2*mKDiexH0rB&g|R;EkOUqNe+~6 zQn`J3j$H+nf*^{p&tv!OCl|D7zO45BjF9*>!2nP%mAJ96jhK7ldnkrqv3k&P&r%6+ zv1^({2`#}?Rt_?^!ZtDHsF(jcm_bxu1ZDZUu5S4bmb3T0(h21HW`6$aYM8O_OY`TI zQ(%xrmS)YAov?E-Mv&l%z_``1n&%p146uwl4&(Q0#L{7U&goDE3GFt(q z4@?k55sCQ8RfC6&x}0EXqks{_yJ>ARbx#^xz)xQ4pap_TNG4T%_0g--0~)iXfAWR# zX#i0Ya0r=R#kscxe~3D+m%=8eB;lIVP{O&F7dSpi#jvWgQaP7;M}p6-^9xtXf>9aA zM65IUvm|gCkew&n_n)Y%{u<9(nW+Uoq{5!8;DAqoS0ZCUmW!b_!$2v>M5@dm0Cl9V z&ij#AI}$OD&la-1(+yDKKJeeNftu_f27na04;L+<*#7D!4%N-Eq(UJM`3P3@Kf;H6 z_T1qD0M*6mk3?PcT?(!G#u)&H7TNDh!IcfQO zB9GYzk0PtQ*^AK^`l+zW)S}V#!$JG(D#jO>XC#DeN$xsgV#%LG^OYI#3QQ2AASi$6 z+mw3_J2QOA(<=4}buuUta+1!{ay4u6ygqDftFN?cep!IcR$7*57jSS4-q{J&@1d41 zR^z>YoqL41%?&4By;Hch+-Z|-Xd?mw%+7se*7=<937}@1JYNnsnwJqth)7^FK7C$Y zQ7aY1Qm@&Hb&H=)vcjk;70A;VePr0}{*I*{%Swd(l@=&!82PvhmS+(t-u=&#=d>;1$zT;?Lqa*23)`#3J&`P-+~(s z-ehTp0Yv-{J{bDO2S_BOqt1WvK@1A?44;5&zN9C}mMPBfSt0obccXp(-X{w=S_@e? ziUbvS>U`&s2=Y9~foy`u1sZz$-N57inaQA2q_SV9928{f$J;E>baHQ)Dyqu-RFlm! zi+AJ&(IO&C^tlLZCczG@RPx>xs#=oKn`&b~7o^aXTWs3=gIO#B;ItIXWY|LGn?eHh zpSWnpK?@CFwABwje*RH_V!)rm_5NA=T-#N{r*4-dB%B51jwKO+dgE@%^uPpuI8A6A zfT4X>_}};d1I%RdM>CY-Qt%cN&_DR#5A+bfK(*Tog^4=51@kYYKzloh=s=ug5vpsP z4@WNR*KA)y-D{VuadvFtZXtt>+5_cJWQgFOYhR?douDh~_9+MW-EG=IqI@8XT@ZH~ zhfR_(+iEdQ&!DF{O2FAF`d*6N1|OmyBukLJC_@h-MC(ey)$cdGBo;K(pLIkuh#5EH#VJgD)GM^3GX7!(=X7fK-(+|4d zUoz~94T)bUOl`?xKZ?UwNSC5U9_rj%Jc$z+#62ZZV>x5?jbNcDV$O|}=R)#%V<0gT zM-bdRy_*G=_3&^kLZU#oaDzkRgtkl01Ih!Q`x%;yT1Y&jr@=8s6VK;i~j$p|jh5b(vBZHB-I%;9S#vV5k zslp|N9M+JWu(eD#h>2OsV|2?sdWP<+&MT;!#j{kxns-L_TJ6*4=FO5nUht5}JSy_B z!OCUqX_6M0jqVsy4#UHpq8KL(;@Tu-m{^fCl?fyAk+B|rk=4ksnJ%;-o{_D6T+}s7>0(gTnv_BEbVzY9N6+w&@^< z*O}P4mt6#2=y$7r48(3osnyD_06@>5)ACRFr=1CH9S{64BDwU>XhCrNRIM9Wj&xX3 zP%}@3{)HrH2y0G}y_&|$QYu4*`d$6g|9*2-%ifowoCHm9QzxWSbUY!|$|m7NozC8n z^b-TklC3273au7uvvATcC&DV@o1i8V@_F8VfBP$7#WU^0AHe z<)3nh`gJp*7IOIQ59CziV3_dqNn1@}|M~;aauKNH+39vQ2+?GfSvQ`2!fyJ4|L_Nd zKx@6!*6Kov1ZYeMa!vL`xLy*^bLn@yH1tdTcURHbX7W@WF$;?BE#0ph0N(4afW zo=dH?q(zh5b9z@Epg6>ISTdgOkQwZXltDD4s2D?D90(%sbjp zUq&l*AP5}^=^dxJ8u=lDqd+X(->PO+Y>eNI;-_Y>$gOLC~{rE^x1Aaw{#@6nT z0}L%vr|#z}+MZlKJ(ToY0psB`X*toRAzMIgI?T4G5aG1SgM!R~^0^@+0|dLkHgBx~ z^u4%^i2Q+8o;kcZtwh|K94Tc*e3fLdQXQLF;;2Sx_i45C<3RWUypA7C>TCgInl<5$ zU=bp0T-g(BQ^F6j;C}>y!3T83J6DjS#6JSTl!89AFg>f3r55mPY=?fR(v-3(841U1 zOhf09Y#2ZtfPU;e(wB)ZzbaJj+_oIUQ%V=A3MVrXz|1^RguG`v!7 z)w|?lWs-@j)Wnjd!s@*a_ty9@+*=k=iwEx&YnWT#?Pl6x7*9Q7z47A(7)zldt!ks+Ttk- zanWQz1V-a*ixV-gZ%9@v(lFyPZODG?;PLmZ4RY4wcpruRq$8yS&T#Y#i{0&fG?FL} zg#mH0ZYvnME)lIr5Lt^?rvxd8&wM=`md$Zkv=-d>ifIJJEVRagm#EOXKqI=k&S*xf zj!oHGkrvKeW$GBAnBS?F7wP3Y{OSVYwi3AHdX(kOmz3(D`a7xzp~9n9qWJ>Eg7Z!3 z(M)vmEu{By9_{l}TcngF0e&{cA=>(JFAf^ z(Ek(&s)(?CqlVE_adEkkDX<{GeE%sBYFuon&%~-?lFv#36)8%IpX6Dr0~3F~PgevF zIY<`LjT6Km*?ADKeCp37GR)v($Y5#-t7}w{Ds#ms^7=#hqm~si2-b~|HT+gE@1=F* zusa9%6HeGsPcMazwS70wLlKPb!33U%RzicihU*sZxUh=Xim-l=cS*a(*uuCc9}DoMDngRTQA5e2EXFhY80Oc$|qqnE2mDRsV-mqiXH)$cA)F38~zD( zf4h49qr!vdfMgH{9{iU(YQr0!`)`@*dT-crjHjix{<9e{*DFi>g(s`RdXBsYsgH+3@xtQY0zq^G^IITDaC!MY1F%~OseVqKoZBr8#8e99>4u6j{^2OBPsNzy zkH=tP?LH3C+yLZ%ygff_-TPM{M2I`a&rQ{$g}%x$Sb2(_i3RVO!0B2?7hq~SLjoVM z%~cUA4tiiAgEv{o)ln`$EoDUGyW|0I@U zg)v@$uNEFKS7f7FA~LWPi`*gya#PXi<4PZU3$aBFOJbnn;^Jk>KJY=RO8YAisDDZQ zGEIs2M<7VW65f=}Hr_bOjk*C~C?Bbyt*#myL9OIl3deH=oSC7BhIpN2n;eS)DBS|J z=a2kOmS-oBG`!L#W)z=JUd|`?ObjA1(fE}l<~%KlW1*24P&+@hsNJi*_dS%JLSd5+ zzxFt+c%f#08RmEU(*(qHPB8~icg36-Jx=OJRY)*mxME6KgD}*G-(kg9-jX9QTujm0;b{(WkKjTk`^h`0RTg?XN{++X zfn4I4XnkOLporh;kiNIcBdi}>#QY1I#c1sN8KW|{J*TtNiL|WUNy6s{yMv{4iGvlZ1yDq-w! z84?0OgKCM@X@@1^E5ysIEW_+;rOHHAli5Vy zYP%Pc@Qg&7noWZA!~6aKN8A$lc`$xD=}Wp*|BVlZ{^En0`pgUPzxW{aUleb)_* zk3~Om)fsfG8`Ch>2YcJHPOpQee{pbV`8xMTy*fKKys0LqpuVSKlKrPlHJXLNtVF*Zk^ zhX%3Q1x#kgtgM$a3Om;!X~jgoM-Xh=!D(T)fwr6joMw30a~4WX{4UIiaB}koRor&L z%V4R%O@`&%>%KGOtu}svex}qm8EGJ8C2$@Z{R%nb_D__nMe~cU ztXmq}PV=G|2Q6v(eI9U5l9%7S>Ltz@*4ddx6rRS}d)Igt7M2VPo`t0vR#cWbw@Yiy z!}CmF!>6&G-QJCt>RHp<$$J+t%KDe;*P+t^?_mOfkzUv1j|u`^()cih4Uw z#rvlY{Q{t=t~Vd}#1e0Xs>RS<;4#3B+bUgfp_o_5Zp~5mR?A*v15bPHr%iR_myxi~ zk)vlrYxb!M(NkHSg@rlv_y0k^S-$I@MY!DMkDGUtFGM2Za#J_UsV&d}hi57&>U8Ik zL8(sv%^8&|@>I|O>^r!{#sl_^XO+<9(*W?Hl13mpZ?%Y5%ky{B2~~)i@<+rbzt1?=cF=s1S24&EI9LDfyjM##B$#$=gR!sDwXQD}?n~bG2a{7V{!zT_7pht) zhwbk%^qtCivuq7NeLmA3v$xRCPdIfFC;W1S)(bdpNc;m%7GYEIDws~V!WOfj4D}uP z$aU%UptO$8Pohq_mGFEO`BI6MIB%hk9bA8rnj)?a?h}EFg4d!4uX6zE!OB{)Yb8M3 zy|RNdS05ZJ4T4<`t0yd297P3So|ytZu;>4rL{I*uw}z9A&3f{@EVowSv*k!KLQ4Rvh(s8nLJ2n$&0) z*mdQ(Y|{C4jrobX(*^e=`WDe+EtKKJBBPy=k=3<+4ua?CD4MZH7qRz%z;(@0CH)9D z8Kq5TMZ36H=v4h>9}|OUh#BLbCl(J^O>~a_t_IB zTBUZ8dbw@*JgVEPQ)p`Q-0o^NZpm}pyGnX|8Kkq?!h_iZa%y*D zE602Fg5KLnGQ8b6SWsT(aH)5=Debt^wR2xyJ9*70YE#Km@vCIz@?_$;s^~Ij@x8m- z8OrFv(|Ll^X}9WfIsAt;?3=hdYj1U+GoNoq)jg3FSqF+uk9x5#bC_!ZSD)Xc{k~r{3B3Ae7~PZmIKA@g zqkYc9v?;J?O1i72N@rw*Bug zx|{35NtIVP&tOFL($)zRW?C2a#Z`xdIvsA-l^6GB>na(%!#der6xv-Ty^uF=_q z@=>4mTF54FThh$oXWU>9`s6WE7s@4$7k1;+(^e-p=kxJpSKI5sh{)5aLl>`S!`88u zYmS*yY88)Xd$4ru%w$$oRHT!-Xqv~-^F|w8$A`)X&=D6q+c|3#opfZA<0dYPQ*V#i zkjy9UJgZw&S0if{Z=I;r(aY=5V%*^1!HDPHb=XzA<<|;lrA~+2+os#iSeoPQel07e z%i~L0nGQ=9j~A|E#*xOz9q*z}#-)cbo(DIF+k#tr-NHExkA0p^)kl4&-HO|$Tj$rl zT1Ur|<#le0oxSFl>!bP6+29i0RTs1dUaFkY$Fa-S=bPY@HI+;IAG{39434W4mP<0ySTJhEi0WNRTU<@X`<=fKR+3@ zPtj$&MA=i)M8k_7;ON*XgxXX=e6PHh_%x;brk4jQWNY!gj9&7+jBX=%p6ytmY$*{c zQgznX_DyPvYULBX{4~ojs-y#eaXnVe%j2zR%D+?;)~dF3?$ZI8baCdqrbp_<^FA+-qcIfCkUmw{L?a4nBFrGfe zfA_V|E!?3>R)H#p#iFX~>sIw|6_)U;OXR_7g=KI7zIr?@B=3%#txEA{|G@OTxemT-!rJDX zG2{1AyWC^aka3CFp`>I*@cg3{HEY!8J0pj>LoS00EgHhrbn!knunyEz5WkI8PTIaB zYLjT;{BCZi_iJ})i?PD<$CV3P?)eo~!|EVI)%wOZZBvDzc2-w?Z#&{Iw#*p6$*l|J zZHM1nN`24Ek@UjjjY`D|p-~sh1n!-F4@jO?{nez6!|tOEn8prWbariHrL%DcvkB9` ztlQk@7vHIJj+sjx{6EqKh5=&SUUsNU-i9lG>HeHz`0p-gk zQ-Z2uD2-X?bN0ue${%zh$@H25yG=Ejw2&C(nR>8R+6PGwTovsBRHOEbiT>ejth$E| zK`!t*TQ6~0EYD@`D;6=pnArmx494!NGaom8na_*F(!HT)`>|^^MuUh2a?(~!D18?8 zi}AytWvc&*ETw#UD+{FqR$bLew6M~o^w`-9Ev{K*Zq*5p!5FzX;CT_ThGws!SAI7^_A|2_>@kgK}y2Y4#3 zK>1vm4h{RyHARum*}$=V6eCC{frr61VY@ozSa=n~Up=Mwo`!Y!VYn-=vMpmNth z@dd)MOGoxQbu)7loQegBb(r-oN-%=*oFn5GR;$E0ZIA5VyGY$5I+2b!A(VOm;w8nAmO3N3wSl%w;9Bc z7-MDSBb4#Tv)^j|mtkE#Eayt#{C^l>Oq)~e6(^84c(*sW&f+5Drdeq{(q)4)G@_G%Dh>r~e?eGOI z?@zKlCo$Q_pV$$)+d2M0UgLI5p@oAp#@G>qGtQhw+a6nyH0?&3JU%crA83(3Bg#Ip4 z4>@x%ZI-FmwXE{Iu5|(QQg#bj>nXo}n69yDNae0^tJ%0sKP@;5zn{Mjl7=(RDb73- zK_y9us>23}>S4Lb=a?SX(Qw>1=dNtNa*UJ~IrC~i27!6rN}Id;{B(i)Z1npwZ{M(Z z5Ba{Zvyk<4L&xc-5=3@ph4nC_-C^@CaW(5WdHu8j$2swYr`@+j`2Mu>Y5W(+7T--C zj+E8i-6f@UZ1+uG7TdiS*tGNbf_($okYVFehUWI30~noO9nbLp5wdi2TM=h;GV0$#R>sq%_Tk~Q#O~H|&)RNpA*_s7 zgY#y~>;1;P&f~!SByy|Moc$v#s^Tt;7q{Zc_oMG4|HYx}PU7g`gifb(@yp%O-SO0M z3GN*YjmBx-^8I6$XY2Xk;w?|teLK<#F6cqG(QX(S2S!`6fQyp0qve?Ty{#jdk$y+WYNze%vo)+n{T` zT!Cr?RfPRW#kF#*-EsLeRP~6}Awg$>kDr=Z>cOD(~E>Tt0_h%jP=ZF7m2GjjCLu zoElR*dV(yOE*r8IooL;r+@_wgxXPNIHes}xoFXI7bfz*d+&7+I4?dD~&jcAy%kj9c z*1WuqaV<%roX+#+Din^mHwHbfw$FE&TsW6Elmx`djKL22ap5T+eH|HO`)8RFoKJpfkOc@!?W6!=1u z`8xjmG_>e=MEB%3Vt9{J$8A#qIxT*{pC!Xm-M1`+>us_g!5bm2mqu`RLFA`v!)Z%` zeFs!T5Ot~lJhpN8kb9WPtBaVph!9;%(^z<@xOi|dW{_0R#Ofgw;CzNHb20o&_e5_w zD;SG5o+$7=S<#`_*&MBn;R*jZPmMn6eAOXxX3oKa-a8qp|3s%HcjsUrw$K&Li&0m2 zzRSw^{kzRm(P_`CHDzg0<@4iZD}mw<=d?H;PUFs3h@3EMP4~CsbJ)DcSX>TS&EX7p z@jFpulPgq)z#ddx)Y`7lEa>WT%mqhZOm*0`P63S;Du+LWcVye~uDE(qGk!z3q=sH< z3KATOqD;gIfi0P@=A#c;CF?T1z)x%RwNyz>x0!G}AGWyLiQBuOF1Dp}1Y!@;P?!-) z54I2%56i9Gp-)=t0fvAY2jjHO{fNa8hO|B>8$Sg0%qbISiQ>nNqfjl0NizesJ4`@p zhLezp1iTokj;p}GygR0SAG4#wh7+j{2nO{dO1N=DDNE?DUWi8~#N@C*2bNAAx*!b- z>bP?O(RKg)y)-4G9?H>7tKI>twhlgduqA#hg3~lH1Sf5oR-boHfSPN!OB4`n8X^OT z@m{A8v~>S{dj^loGx94+4_)gL7WeVt0mf!nF4V24c==DZ9@ez^k0II4ag<0XXD-Oz zuu8OW<>=DZlQ+iPwnee^g{NJ#lXRUPw{jS)RzDLWZOg*GbS9m?mhF%O5pM@b(!uMU z&^i3u5_F@g7PtFVjyktF5iIVM7auMBo;-4#s~?{qJh6DJ4$~8kFv(K}p2qoUc~Y1- z#RbL$XqI+M96aoL|R|`5H01iH?WO_cUV=Pi< zIT|h#KZ2k5`AmL43=y-XC9mvsDSpoc;foEzhJ)(Yi=cURmwi9sgW>`a@foOOncQT$ zzUdC2QyU8N0+I4W@W7Vsn+S z0ejNaf0-O!pjG#0HFonLexP^z{_Bd*&bu}1sUJ=-8OZ6pslD##>uh&fSsCxgUXhMw z>c;6;VuvZYyw9MO-*tVfvc$?qSGkGBxp4zbmZ-qS>bawJ%3z8`im6i>mq6SP{{%0VH%DPvDUBBq*OU{g}-x8c=3X$c<5lvsbE+Y+n z>R&CJ-)8dROVpRv96w!R>s99Ao$h1$OH-yOT!oJ&|_mQ2==(p=} za<34%?6;$aDKl2DDBP(I(Z>dHsjW`?Y|ddNN2z0viAdpG(vL$QTw5NYfpW$VM}4=k zkMC1EX8ACzM&GL{5gj{l53$U+o}O?Q5lz+1GL~Lu@`0vJ*jAII!-Grenkz4Ziz6+e z{1yhw)dt|SJM?gmOphn9` zI0x4Ldz8lq@Sy@~Rdd2L7JuLtm6v~vNj-R*4g<*}69x7hiVU%IAK&DOe-bbd1GIuT zlqUMAluM(t)nf>^_vXBhm&+YP%*-|$e8CAmEZutBUXxQXORY{CXqsM^{AFXB1eSlV zugb5>dzFH?%bxmKNS$)}f{?83cSg4JgrbqMqA<%Jl z5^Pi`QLzUh44V(#g{ydUH(EQih;sqWvS;%$6E^r95q%zb5{(umvd>PuMi2aF9Q2Kb zyOBQ!JvM=pahx!SXxIk8aCv?N`E5-C2_6xrkc$uzeuVwmZ^)1(-O}huoF;kmE$?zD zAXGy}A;1jbhOf)!q^}C+S`l<)xo*RUPnP;N1i&9Ury^DSU7~M3vvupoOc>DH{lz+k z#RuiQeS-74Z1w{jK5N?im-9a+XsSXBFLY9_5TbM~l{XV4Cp=l@j2i^KI zF1Q7PhmDsVIdH#TZi1s1$-GbZ7@()>8cNOb_9VS&C-8|cWrAGs*|0PIl5ZU|V$lIG z$S#B-?$*ZkCuItNR&8DbHZg|WETNx)=&y}lZBR@+xhfWTTG`|6TYsTy(uT$e@d_zi zdhG@GJ1+^X&nl}we50SGHelwGDW=4nY()gRxX!Bq7^T}FY&RTza%M&QCp0$P#1dn8 z^!tkeL6Th2L+8xzajIb(kg;rbq@j^3-v@!F_io0)Ujitvc3rHA3f_ty*UQz~4KHqY zW*ca0iL+UgrK2w*&gnDJxN`ZiP~Ib%ZTC7!{JC9t4&Y6dp)ycv*y^OimU%TijdMI^b6=pw8i<}g6Ns-HJ^LA;ES6qK# z_~OCkQe^~!sjY?JvFXA&J=zt5@zYy9e7RayGlVL~qZKq%t&y$6=e3`8f`g?!i*qgc z?Aa`1sPpZ7KeNMc!&GusB6C>Wn-Tb$`uv6A-HSP3LQ@*R@HT4(%JlEEqr%ldy)MvgF}#vufIDSB%KBkg$(Lp5mA1nDdk&izs{ z*bqQb5Enz=d&$IPmN~V?)tO!9pI{9TSeHulq9pV1QS(2NbIEdP=aX$%oExbPEuhbG;O2UTCO(wrg#P?N%Hd9Jy zLAyBGs7v%HQo8(@o{Qd?mEC@L4!-P6TD*L!d;n4`hlj?*Gf1XHftj`xK3GinPp)L> z3ubo(_5s{xv6H-nw*CqebuZ*VT)X)j<4-!~5@q-ChIAvW7_7cu$$^8GY5WeGZtZy@ z|8^PSe0(mE5PLs#wETRQB`Y5|t8L*VGWF4@?2sfWUUxlWQc|()ykHm)_-dDw4rVXp z63#{{!ga^Q#}y8uhw31*NkiOqFxG=Hv4lTgNEu#Jh>eCBgmVo>R^_fO&W==nH*txy zL=Q&e1(i30S7{v@EW|e3F>H>bc&MYGx|U;IeB}En5}3hr=*IZq+OTP~YDgklGn6AG z|BrOK8i!`iphPQg!ScB6$mlvl*(kzzypTbVbGm}_Zz`JBJ_h>*-L<$4!#Tg=r$Tu` zPbxLJnj#dOmhni6c&@=t`f7efd!$kuL8%Jz6{u3f;?184_}8laoW~heOHPZl%Oy<8 zE>m?!hD+dKkX~K9({G`APasw5ID}6pML(*4d?l%}eUhtjChffy)`XmtE2gbN-3Rp` z9hG4CV$6|H$7ClyH!@9YGU*!lWJ8*t?Td0WxUtV@6UV(fp1&*&k49AE?Y-4i#JX90 zS_}b{MG9)efOE!M0XQurFtCuAz;2J`7Noz(qKfUGN-xHrLrhR;UOmG-N3jF_As2a2 z%w_6_kIEwSpWV1R%2jdRpM2LLr3fNQF?~g55m0on&}ze=qjJztPj9Ig81|dAl)DFj zG=J3865i7I2uao*ZaJoBiR{mRrne^!K^j1zGgQS&%Py&ngRrm`I5Fl?{wSEo3LGQ& zX#q-_B#9sY>PGNg)t|^=DJ~iipbMX7n%Dn_IBM$<`$-%HKCS&YMKaEX0yy6kEHhW$ zrTx3)zv0I=D0^*uZ{A%=75@j@MV(Z^w9~B1K7?Q%1!`VhWumY)_mp_uJaw|<1lb)u z6UMdk-_Bdp$Ts4rnEqw0xBa{Nv4RW|`|XL_zih(gHR<}4q3W|aLH?*K*-u(#>jIfs zhCL1UQag~X7`YI2-^vv*iR@yVWXsr+_Y2yFJ2G^2*`MQ}Cl~eukM%9NQR+Xd`%{my zAz?n`6n6a}O`JN6)pd0VdUrS)@kc4*kBD*a7dwbPg7$RRgEspx{PyxhlB^4Y+_Sf% z7F*tq8eZFvxGQ9g>Y8y0y{1HMExY{P^pkhQ8t584z>D1IH$H#IUTgOX4jHuK_{vLh z;TExgC({d;DexfYND60<<{vg#nPlzs1qV`3liU}ZAg&|9dGs%$f<>>YcpMqs>rUe{jUezpR7dzV9a4dt6LpKWje7( zw-qXE=pI{}MhOqrAKUPxI1G#ZJ{wpznYKu67kKw@(-IvDB*25>B-K`;`%dGmT*A_5 zK@lNm<`m3{*+HAthSE%HnnLwFhk^kK4T!WCx={EhOM?IDo?Hr&{^1+_65VFVy)l>_ z!D_rw6GKWTsdC49Yz7Jk+>Y{2{{_3jlHKBWtdOAWBYt3jJ%OC8NcoiUxz3%fCG-9=OLx))8}Y;%qkJz$SvWA~V8>#BVj z9Jw#tZ#9Ix4^5{P8eeY7)vauvSS+CEMaeIV+>JoMTa{=H zFz1ZAP{UyAj6XTgq6@I8T|wQ6bEEQn8xQrEYw1-z^M|)h6GCxAPYBn&NT>0+rS+b` zTV-OFfUy!F4EGxcdY!TPF{5??&O`{kS-v63M6hCJ_^x|eLV|xaL%9RwzU&X-RIzZV zUqi^H#DuHg;K)^NYQn4mH2#9I%YfkUKZ%%J9U`;{8=PIdLR($m%Bu}xjy0LOgEPBu zHh%UQ8~J@RjrGhZ9$tJw{{7H((mN7bTr{VMD)F!p>6G}cR1o5HR6feK`mc2*HD#BP z$c9RhEH(S2f0|8xzay7X0GWN@Swm4!fESk38YH}=6@Z5s=C4+A)$c}yB!3J)%%QCn z!juF|fg0zv49e1Qw@1P=@^S1Zf~wvrBsC5#BDr#PZW8~);)&A08CVxf+0aun3Apc7 z$;@N$04fE1=N#4Y7!#37l9eg9EK-W1^hle~f;7i!qy=SQc=Hqk{`}dvF^Yz`A}hEI z*se1dWVg%Olab0TmqT>h^jhE-y273^ov#Mfq|~{XA`VhgbvS#3qard>2W96Ft;o$# zDG&zg6gTZX85e%7B`2-O-g1L z-hY~#%^HcHE?jH$<*nNASDNv9bk;OWMhW|9-{YSu`PEWi1cJ2?15{YDme}okavxpTO%GAPlS;Q%Y_=`LLR1EI+#C9jQxR2oI;tRSR!PKi9?JBdKm1car%4>v zoAC7F1Qw~lipQni*7B!zB~GPek0h9*Mz4KN^j`VT^Mw~R%-9t8H9ddmlxP(Mw>5u@ zOck$7MTYJ8^U{bM^cj6avqC3W9;vx!VZ_i=&i4yNA->}lvF(j?P=+OD9p zOl_1Aw#l@+&IGKT1*3nle(a6tVu9tQ(^ic5V*-n{w;gxw7ViLgxNJx;O6g|?g z+ps-;lSiAsA30z0R&u&VeyTN zr?(l3m6})h9$!W5Mf8d>kiOC~J=Cj0{SVntW#s!q0uvx)c+&sn&C1nye$u<@X!XK5 zaY9OJi7ccNsd5eKP;Wb5`}1aH=xALutold!(%Zb#F&^$c)l#Wi@jUtO zi2Nu^lUM$i)vH0Eo0CekF~b##Ik-09t|UF1jiCBD8vRk%iFJhNm`bA}PTyUJte+0y zvPMaxy(z-H=8u}uoIA98kyh_J1~BpzWtaTfdH0r)cPqK3`Yg(NX4YEFT$lRGQKuB1tW$>y8Wsw!t&R2( z9uDDvER$t+2plu3eASAX2TU#^nE8 zk6iXW^Cd>?bGL}JTbas#B6M18JE4JF@in26`|T=bDL)~ACy6x7d~;=i3$%vP#g311^y5l2ogd|kRsl=|q< z3N4Hm!M@t9I@ah#)Yc8a-WT0?!&|MZPk@Y{))qM$WsSln6g2ajRe)d1LG$EG10SKi z=t1&KWPB?L==}<08PQo+Toh4D{P|2GT-oQC1us4fS~CJ3D;GF^ypdu+F#erY@f>Bd zh0hJ3v^0m4RM|+_2Wvv&S#~)lEgFSo(1S{0>tg4hyO<2x8!19IcXaRb7SL!h+ zS=N-wQoM@|e{-xn$R4}U*$-5<5qu zkmI8C5_(`+}0V`0JnaH^DPEB`LRQ;0b+TLXMHVd*;D8T z__#>2WAuxSPE~TzohBZoy$+wTW8>5(8(j(kRp>N~C!NbMT_);rX&jQQL#?{q!oNJKyJQv^oiZJ^sjam6wFzW3 z*H11KDrbF9VO<$1vD7Lfm&oQ364%%{aS=XGrBfbWnCGuH z6i)F)vxHtgGv~(ca5iqgICbB~ z2P2@yR(=ba;-C3eN?PHab;`%($pXLs5yv}|Eaj{AQn@S2o{y;tW@ZU4W>GDzcEhjS z797Sn4JMw(`~h_KP)$(EERxi4LC2<6qp!X1$;cFi%1zTy7*(5PM2A@+;!;#S=QO60 zEuu=#<7MR<^(>d07EqFg&{Ih0#4a8A$}$VjLOH!u?J$^5g7wP>Vf8uBH{s<6STm|H z`39~*qrAz%p9y5v2`sU zzSzyB%4IbGGwMDr)NV(2T*G2bbsSGa3TWE7+z96gy_NAg7jIWW@B z-)ysfS-i(RN&9y0N~NYdj@lWgpQN<#Oe9-Gpa@!J+}B z%rkDX4(-0;LubC;4~G;iRvVg~|D2VJh#9x?)jVx*O`iI7Q|u+~u_7e6WJF^^r{f6) zFjM#_5~!hR5jw+p^Env;02BAm=_@wxJg!!Y3V$cx+0$h!aKmgJh}mx&VK(O~DcuLS z#nM*JC1Sh|Ob-BuiOOf1i}9O(4Rv5<4}Up(7p}@wQ0~hd2^0jjGtjYyuO1Yt2VMRK zwUSKf6J>&3qGxJMSuIt

    YC}70OU++UtcJFT9Y>PZK|B8P1!o;QZ zBPb~S`;h7O-ltCO1%Kv|WLfz}d_4Cyd*SW$!XFW?nZ_t=$g-h1YDq?ZF#SjVnxCxH z67}z49H?~xBZ}9n3X~Y1$HP;FbXsEw#gCK`gaz_f0<~;o9-l6ID+65A_A{M-;rZfP zvWs>WsPWmjF_O**y6m198!r`e*I?u>|9ut9WyxmCOn_qNbx`?K`FSU z^+gDhgy8X<)?uM{eYiEsH|(L$L2+3&*h{hFHD@LSjnEnrKZHg3 zA#Xlps@F54(sT+8^q3glre5e@{2DeG*|8NkKlvbEa(Tz7;z#4Gz5~7IoV!W6t+(Mr zkVavW!iS^*oGl3NYKBVY%Y6l0l|_^0XHe>onUcyt(XDOc-r{z~wFZ*CSpp-xZ#CjD z6D?~$MFUlL3X{=%y>l}bWu><{6oX#>+IcCmsDZL%y?KhOem%~4A@ z0N*vZGpnHpIYshkqZXYjSp^9u6UuV`OgA86s#1!<(MgL6kcEKGceYq5V?cD{8gZP% zKpSC=lUOMS`0>3`frAk%C&eWn2T{)Gb5kV&CX;GdA;eGaqIZxHtMZK@ScH~lw%tau zFQ3PYaSc-*1_hd*wLt!;lzJrXUJ$$`wM|JDvB#%=2#JHFvV)NPzN4>& zr(VQ-6sjI3z1rW`w}mWaEzLQhcN z9#mrtk84{gy{trJ?T@*WZO;LAhxLAQZ^h{d)KTOKLf=NP-EJyY3F6*g=e`=VbZa((G#ayTp|93&{hH7XJg%q^?nIBp~?H@0{+B!akDfHrvH2pc$=l#r7>j`;TZ&l;VRkvK!t^WZ`dne1hAP>@= zo1h?JO3k>juFAy>bP@1bQgCS_6)#+sxbiYoWNGv85L-Nd?Y!xj8_ zQkZo>Z_xHF(o8_1rGwUNJ{ErwXLNu^q8v2*XZ#A`bdXv)Mr8G2O!WewjKz@S?Yb?c z(|0T8z5G6l9tmc58u;0~KeD+siuj#3-&!@DOgrL2Pe}vu*^)_ zz`!r24RBz9jQ2gm`^U-z7cYoJn|fL%icOKS__#5hmJ!I9ZKGr(dPMvxtz^T9T~Z6M zVY1CjFr2Qn-Of%h%m4tuhCufm#zGq;yY~gKVFp3ot0C}fPHl&=@O9i52L$d9_b;}g8 zX~#@K;G&)kLEzrz&sYZkP=?XL=^M=|;~J8IR^b^Mjb)`FuqcP5BeE#Rd`98;#TOPY zwZdal^VOZOP9BKzqsYBIpGyb58zq|}=d&!Mw9S+TA)Dot#&!jlPDEz`m(KsP0*Q>$ zKGHTdFs8gVH7bNm-#=UIXDDkO*~U+6ASO6WY2~Z5j$mBrG_n&5U$A|A-hA~V* z_o{?UnX~)CGJBuLOxGKU_>*UY^hT(eA2M`0cY8Ri%=2>&GOzzL9a8_B8-O#q+>0^R z{_T!k5XXNHTs!81a^b6Xj3d!C_x~lxz!;xh$csy$kF-6zSn3k=9?rx9Bi>JShePe0R*D9Tp7RF~z?&85CSh6YWt}1}-D;H| zwd7OO?mN|!?h5)W>{YDnTO83fIdSXrtTM8rJO90)pXUZYM#(v}{tck4sslT(mVgmtW2Fp$89jYu6#{9kufEb-MI3mAXrON7WB}2{Rrj zm~8oshGk0Pzky=elke`An7u%u>`7QlC{b0mxZb%_)v!I# zaRf(4ElDOZ_$Y>>hcaox!c!XX6N8RF3iCZj=CSv*hf>9cNjq;!2N;NuwW|YU0tN%w zvTK!XF0{6#&%$e!pT1mbaW<{!RB`Fns_53y#!qoa*Qu1%6)@`1rnq6s>ZjuT3|BxA zZC7I;Y6g5orlL`#g}+g?j$gUY=&?tkT?ys&<T!`T@t41PUJwXB}f_|WxZc9#wCE7&&LbBdViR4%o(9N-? zo>N>80VlNZV`6v#M;J9`^~(+C z9m~0FnW)1;;|SNvli0D0FG5(uFlHQeAYStXh0!4QhjLy%7v+))9UdWV@C@!u=5I09 zt+9d*`#7LbJS`PBD#_jVsL>90u)nKo?JW$a4kMTJ6*G7-P&EQ`rZ9_PY z=+Do)x=R$98Yu38tNv}h;*xV-4&-+dMN3S4+@qfo&4q9ZDQRQEps(_!QIhKiBfExlGnn$c!3a{*algSQLb*dRp_jRJEC-mxb zd5W|@8#m(9X3UAkuGj)&4o_!wQa?^#wF|U_T6w{^?I>NX7)Ij66BNf~4^ML{(h`rAPLMqiQzX41Bt1f6p zS5o;t6&-v+25QHY@*YX-4Ecv!hVbSeO8oSt4&}EDxwjaaBqBRFr&^tNvYVX74^l~N z+5`M{ksDn89VkjJJC9j3)bB`%s|x^=D=aZKZN(9trI*DO_rHXc7KczJ@Il_KE0u-4eI- zFHi2T%que=j2$t$zNXF{N+xua~YRI2v8U*mozCZ=2r!@5Jw`$4pAfNJP5 z&kFFUSDILOWkRhJ?&8mpbqbvtBYPd|JC|ayse7=src6Cg9)WOAaeJiqr4fL)IDI3a z@+Q9hkxnd+Y2zlwhoO>H136rS*E%qI5KM^azhQMppwZ57?#pS+n3z*kT7-~XfWyy^ z6KAZX#>`5#+=W9*kph-3;R+gTxG zF+T5!^2XA1$#z1St;i<>VwtV`c$@L%Kh&5m5z<-G?X&jI7%p&&o!&`H6q`xG7XKO8 zVz|i7^>Taegvhib4r5L}vkYsA2+yGCm&O&cxhfyCtRSVm=&SQ zPLk7vl3psI;LR;s>HCh)mT{|w<45VFKdm#FWpUtTyHJ-%(;aA)y3NyaoTT;(x#W&W z0Jvqco&hR#-);VamiTzFM^caXJP|!~bpr+GECNKebj7?1Btw64K7JplgX?2>l@5r1 z`MT^dZD-kITgMj@csH~b7C1vc9$JRg*S~H5y#((&)f_^I= zzD{+4`rs3?V5UJV3TaVb)!0M(nP8f6dD3Rik`>OE%d8Gnro^!j?hSvM^wAz1s%tcB z$2~Nr<6`PX3Z%yqrm(`>(mc2uOe}F-?sZ!gdG_}A(KhKZeVR^aL{oV!MbQfMSuzj$ zxMx#=P*-0?)a<@yos7M8WUWb9_9@647I*yMT&*w zM!OuCK>tRLS8GU{wY1i0ji!hmHZH~CC{x@A5BBkA(=u6?U8ZDzI#Nc&ZrvmGCRH!TqZLUC6Mf1X&Z(A`nhUZK<9pm9^4;gACdyN644Y3zIfwJtVhy52lE`LRZ z=O+W&5N3+b*_C_8pgK5#WHFR&ahqeduoHO-IV88r(g;f80>uHbDPeC4mrTv7`WK_Wlui zS$FySiK*aS0m|Pm_=;K7RMy2`E_XalYOZ4QM@huFIOS`Zbrvj&r^;P^&GbqpIj%OQ zp&o_!E35IdfOv*x*03=#&NkmNoTv#%-&LAWaR~(=C$-N|DC6J}Dv0&d&5t=N(AK7g z4+owA0z@$zoqeUcIyka_xe6s^|4}L#VGlZ}!J{p)bcP^v6a!$&c!N@IqdN6v!^lEl zrBrB1_*S4~e&8rRjmOKw+Dks2)0oCV1Wm=TlhpKNaOM2C>zF(!sIZn$t|R<+{#@m5 zGHY43*9*$^pR(^{;7%@&fOgG|Cb@AU4G%o7dcxD)hCpke1=KrJ?@D+%F}Ay7cxwbi z#z@eZmQu$(O8f5^xO~I-;g2ujEl-Zvbcz#-T%wK#W?Cj;aS4jkkr2wj#whPDxkS%2 zAY=Aek+p%thb*!uTagu8GCtNj1$%Kq7!p8iF{x(ytMV-==$a~^M=gNislMi-kvBH_ zlCCT+Vb2c*q*~}&IK!9<{nUz;{)Ofjfr%CLo$M$?i_z*OpG83{8*3((-zS#uN1U%R z&1S!(g(!L#ffp4Xm%6pIheKyOoe|FHwS$ibOD`_XFO=ogyzR?jkJAvc&89uQyZ2l) zn*acoVLExz6*ur8tOgpW#X&=lmEQ#lEl0v-8KChb$JlR^24R-V8gVd{sTual)7 ztomDvbBqjcLu}{fe{XkY7^So*c$Xv@J-AOtT`rSVUOEwX%|ve03QM&#f5N(`a&#e{ zd~F#vq5}juSi@rAkSr)BGMZD%K+gAS0r)uAoj;CVZ_22O)e8sJ`D~fiF zcYoL?u;k3mXgIK_p(tJM1`FrRnuDXq*dEPkh@>$kJT5O~cACKpiBzp$&Jq@m@}}|d zi`VMUb2}@WS2?W>lSf?#@ZOp{ae1a1bf$v*;Ka07mnn)!v;Lcll>`ALVlGIKKza zT==m|8GQPz)S0Pxe7ifM^MO1Zfg&?pdCy<_R=s>!rFPu>0Fk-6yC>y37M&|-O*b|u z8BHLbDjEIL)MNGq{;LQR&4`xDx6nvLP5?$EV!$3KVmOLGCGIoi&09#hLStv73#eX% zX1@OW9z>#g@$XNUcZ#O4ixtb(IOyHQ7C}h4YGwmWRM8_jSBwmin`FxosF zz|6_iB>dHp&v5%|PVeT<1X(0h@<$L?W;2))Qc^5ojfDgvMbvg6I)%cs!fnc6E4kx+ z-*I7lbASh&y4aWVV^eL0d8P7w!&%KO@1!vmvnyYTA2)H4Fc*-ZG$j`2iP@s?Nsi>0 zwQ0fC;mBhhKI;m+jVDaX#k%o9qIj00{M_-$CV2eO4 z8$jnCo2YSYBk8+N1w$>17AE?g%Ydr$`RTEf9L$b^1#9;(?$x%uy;dX}lJ5FO3{>d! zf2-}bM-Qc_C_QLOkP;bivHWGYG@b_$qn8|~k}qO>*{PvMx*C^gEl%#2#lIRI+F4iV zslorr?uqg|bv|BQWz7r{w<IDUvEmORYxO9@SmLF9u#qK%2!>e-ICUAV&SY(f3MC^s zyCba4FnMOp2Wpc9p1S#SNILEJK^*PESK!d4O z!>FEr8vHqTs?OXt2f4O1QB>!!%u?mWP$3zk5-h!BKrn8N_t$o7n15sJL{9ZQnTz%X zWS96Mck1+`_Q}y*D^*aHi(_7dodTu-MB~W&x+DdiH+=3{N@Gz)pZ2ZH-`t%+F^>pt zWRyBRz=%2H^!yP6x)h&*kxZQ?4xt<4EKVEK;sEY;^XncqB^VhQTTiURJ2bl-XL?Qs z8fmp5XD*djvYdORC?tmQfhnl7;f?L?)E3~r(K<@dK|(rOt7&AKaUGp0zjO-uGZ>u! zneA)A-Le^7XqVjJzWIh3%PZqo?tPmmc1^Z>h4aQbqg*4`^_-3GO8kop94!14{hAI3 z1~S=4v_T-fyzpjCUAa0AxhiX>JVtwNjAn2h!oGyVsTh}osh|pf{B1^K9B+fLCezut zXS_E^_0Om|=DP&E@oXH%qal!@f`GZF>%j&C3Zo5;_9Bj77Qy|*V=NpOOJ0+%KaZs< znDz7j?BqG!e22HRd(`f}3@WO&^}z)En*D_Z)CR~njm)Sjs;DZUNL=1`r^FSPv}US` zlLip#?zr7@)&VWcPb2NB=wsMjq(qRJnQ-P5^q7rWjb)&#m(4ETigZ&HMN&p5X!O$+ z@~g!s*}>QuhdpoQr;sax%q+2fWzH@ZC7+Q>5pnhSxPsc&K)b0Pu5}ORaAlPUsrC4j ziV|*>s>B(Zwj;yI=miQ2lpCgH{iYQ~$b$`$Rqb&)UG+|x;X91qDh#pZW zd!2g*ty%|<5b~QGHVVwZ;cM9%yD2qplUGr)d=%|F`>Yl;V0aBE zIKEu8N`jIZmznQ}-+gc0ZZaF2GgAJS{ZH?J6;W+$DOVm3TE|sJ*9KtIg=L;n>@tW&x(EsOw5li=Y|P^^zi2JLqrbSgBs4}=AtAh&7dnqpi*ObHVmw^e zdQ{B6K@Z_XR&L8XNTZ#P<03kskWNh@Pixag%{PhSER-)3$gpv(Nb$d-FEjDpbLJ3{ zM9v@|2o;HC1c5Rw_w6#Qm&&axOQk?{kI(1sgDAt6)oA9qOxI$_olsB)s*+(!#%pxK zEnoZzaMj@lxwzpaHwZihENL6Fp8zK-`MZV(+iwK65F3W_5!@#w>RT3AS zDMvj^402l%DykA-)gh~E_Ikz>+~*++VtXkyA4xgNWn~dmcXI{88+z9^Qymx{R56(1 zZZ1j6`avUwmV4%vAV!f>TBo4Wi4eIj&WZR?sY;Zxhy+L98z(}Y4tX5RSXD#0$b4nY zt!2rO8C{uVd9n^_KV&h)t3$lN^|-2Ra&igmA%e>AK$vMieUwljNP~h+n#LqA$i#E5 z$EFh%Lea92&aZ1v#Jour!l*au9}2zh@tsF6Uw0|dn5A3DZ>T`2s?T_qxn;Djmt zSx29RLAH~;YEMDjgNDrF=vY>Q6%%c#M-A=kEG^GSpHr$~b|6)#==fP#tGpX`nQ(A? zN4K#G7id*V&%c+soT3|mGnJ(Vmu3aQ`2PhzsI>B5oZV!JEuyY$8!8c&Nvnf(|m zugn}Tly7BPqx;$mo_YnQe1C8Qsbdx6I=O(NHDk6H;=m)0dXI{6g&ki@l)@I@a6a3= z6WuZg)GW$DV=K^EI|u>H4{W~J;F(B`O04PVSY9nh*|c!WxD`Jw;X`MJc)QrC9N68g zmcZ0sChm=sAn7s-6J*t27>!ddjFK&RyE#~!7Y7FN^y5=yD70Y^us@=IZS`vOZ59#+?SepS)D zqI){h>822gF9}PK9Epd6WNWKV#M~lsxv3zuit{oOdH@&JZ450GZS=K#RZ%Zn04wY* zz*$@~KbLka>6$wB_Ao2a`b+v$y=!c)t+;B7{wMx^Qp~wUpFSE>^`kdH+HMb0C?%P8 zr)HfU2}pGcj2;Rz3-fOhDQj!7Kl~rj!2zk_k4N;k6zWW57|Mk-$~zpV3cW3bF|%X@ z&~8K#bY8}OO#-yAY$Gi6sdbTui&l|LcQu?uh9y*~8^zsKKgblZ1R=K z3!-3WNwppdW7c8z+bFVoIq<9?S`rmIM479CL=89q;NrUF^O;2!cqmk#DMp@$Bl!7r|Jawxmk>cCHsnxWXhI4rF>bTwP zl$mZhRjPM5$w}BXqTtM!w4sBya>`z^_!zJ-wNu7<5iG-N8EW!-5?9a+!ve8hLwbcj z1eSDX(VkyYVTn}iOXH(>8?=g=L2BY^J64$^&C)`MOR}`f4OATG{#&^`jmAhDJ_}_f zoeh6K-=`d&Z5OC+S`}sdg2F73v<%+i`4MhCZ=%rbP<{uV-Q7m?9G$dfX-H<2DfhRCR zWb<8A<(Ss`5i$)QzuiUyYW~5P?Eo^D|$}AettQ=$rZ!XFDebXE^allKK)jLs&b1_gz-T}T4ee#4F4zc z{hxD#I>#`{mM(p*q$b8fjM7iU$5!gH@hd$k>6NhQopepbuvhwDly{tDKho~Y!w9`s z#?6j9n&^INhUg(Dy~Bf41kETs%G?T1(7CCsy%8~I;KtT;O4DC=uWnBrBG(|q0}mCcAw|7lZ3j) zE&HYNl$=JhB(Te`=fq)SKcyvHQ3qzR;#XlwYWf<<$6pRnc2rDhnmjn%+cLlwWS)Q( zn9SLXboO|@h!U#daM@BTk5|yTmVIKHBhG2XelFjFWu2vLXr#Tzc-!=er~jlKe%j7p z-O!5};r#Vt++@;UucJz%<->Bp5Bb;1f$b2kZIY*e!j`M?`yfG-rQ)ah_J-#iM}T6i zeIR1UFJu(YW^^C`o^6Erf~1DMCvKzux_&WY(+a&k&s;P%@sWbCoSx`5$3>QkiBS$wpzE4L>Q?OZxNUXQm){OQk}_d7j7$p_^GsA+{{Y zq3b)y!e6S2ZDNZ5=%g6pSd$L|)ycLi-ghDc59c5Y%c6q`uTe==cQj4#Y(;`?ZAb%6 z7R4$>CZW^`%kdKw?HFiY`7bD%@n29>tML;Qt*71P*-#s~>^SoryoJnT{?(XCeabX$MJ2#&=Lz-M#bzn%i*EbXe?4LuA{&GqEMjX zRcH0J)Wr~eCxjUs(&J6v{wYn6DHQs6HqWJMV&jnd1seigym5DhT0 zLZbNjZ0K!fqk_iLoo7K+>{35i;I>-zBGOuRBqNF;71OS zOvs~HQU)|j2i{pgP9!h>EmG#h1AjY@g~N5)%Ihx3rvEIRy!?oFlwHuT28()9%e#q} zJ3v1=WV?;AA+eL(b;M4xN%_;1<=F5j`~5#yD8;)98i_`aIeQEyx@AuDP50=_ zAFS^aAA2SKk6mQg)gu)3Ir!}e=`1~schipMG2At0;xdX(2mG@E!+*FEuTP-hDCs0Q z0>YbXv^4m>!qR1=N8?E4@r|Y~GiKDKV5cH+mDQ-z*Gf}(e^Rz6kgeZzDm(U_GOOA> zC&O}dyhs*QRj@4`=g@RrjGnR72|Mv@fWu2#Y;7jF(d7SuM3GL)cB#j$vma}9e4yK8 z<*3q|?f(mm)*h@%E@19uah`sR%D^GSkkqTmHwgvQSRi|>5Tc|$45=b;ms6Z~de)C6T*pb6u77dhs64vON|)@TE1->k z4o6E6!jRG?*U=Ke*XLPmiWD;9Me)YlMLZRiy6qyzMu;`O_#qq+D?E&VIQRwq{-Xis zEmYN)rdA12ZnWT=bb+JH04>&^9T+YnJ4rcN7HdpRw6U5EtwMXvw9p2_xGq*b^!Y0@ z^c1n%KMTIFrw1D3<#uC)6ZeOB0Zd$7Jxpz7i%&;4jQpj|@t!Soz}#T1?Aq zEV_D=bVq9B4+_JDr&_Yb_!zzlE(!biPaFE+(;s%4(NE2Mn;B=P6-CQP_LP#bAD=Q3 zvoNF9O+1S5Hp9k3^cBFJ37RFIc%DJlT!4UT)x8~FJMScuDo81_VTq>xZILTlQLm?A zk_mR1Addf*eaJrHRUxLL$}p!VROW)S>l7X!4$%l>ub>#rbNLvo;&&G*pl-x07mT%B zw&GoBc&uZ{XDBYaks*Vrsd@6{0-~JugKGRWUb$F6B6vSyt>Gc=@^s=!^>#oe|Bpm5 zE$s(XGHzKPFIix<;n|87U4Gn*E`sa^mTo(Yq0%?h^HWRBw6)B^M8W| z6YkL$M4Fv||N788EREl-FzU~U)2Y20DKerHRGblIXS{gIl}X9j(MV83?$p5u{6D_# zDj=>k+ZHhH?hq_Egy8P(?i!rn7TlfS?(Xh|y9Srw?(Q0b-XeSV?(Tcey)UcQQ$5tf zs;V*OKR;GIhmWjq_2lD+{ZaK5LN{KEqCzneVA4NfW0e!AYWZ= z=Cc3pnLO*o)8!z~?Wwj?!VO+kuv{ zd(`|`lx-X?lvx)nOIb0Qv((uTM0U#5Lj5Gj=!b?GpL9gz!YMI1bYkOsi1a;T-FZKN zqbrxNa~Dnf?MTDt>-P!8FmHx%BYJB%pZ1w+VdlhNIv5K*K0Jg&_&1i^N4W`+(QU7A z_&R%GZ-OPJN`UkcbTYd%t93^(KIrqksMCm7aTI-VUTGs7DtVb zSk9EM-P?ef?f5xMj*C>%7;l<2Au;+)4jL(F-S53Pz!=>kDbK8tiHmjn2*Fn=UGdAKL;zc`C_tH`)G0u0oS9#Fqrs9o?#QhLGEb8vK>V}B zb{q;4uv;%f-0SF`*OIoOEQ;+w;+3sQxlVXS+x@g%^d-ykkvdf zX%E~M?o{7HqZUjlBX2_C(;1{XcgAWkyoklny?g?A&Tr_~?eA!8d#7zfeJX11k;P>9 zl^zYs2B$ytW6WGFc$XWIY&?5Bnsr;lBYgv4L&$`)j7L5Y(Ni z*Dxj{qzMjWDc3MA@~_&<*D#MSEJ3I;2~RFCGA!h%GGlF_rp$~NE;>;RiVCCHH#T7( zQ(#=tL2XGkBggbfHf15&Lw(unHsXf7fAN8>CkVQ3l5MRg3JzshDueVeLZX~Q*BC6> zBNl=9Z^4i1f(Ujee7*Efw1N!;1Z=|`V=F&)C-5<7K>m5vnEwgw@1DL54Ta^v-O26N zE%O^39Foz7035QV%`nX#nidp8qz)bU#@+k~&wbtegv}ZHn?z8r2Af1;>&%zY+I~I~ z<~K;m0vcoT51G=$67sR7zWOx8I^|&g-hu~K4vkl%AqPj=aHADwl!ytfRV*p0dBC(=JUJ$2-@~8LBUHL&Lt-Zb(_f z$y&aIxif_1U;k4G)tqCApZA11;-D(nCc+-dAi z>qI&b=A`V`s~J3g(s;l%<52ZjVGQ@z{KiI`RGAl4;Ukh}u5a=bp zD<>SE9CwKWCPcWt7+VrLc$FzDlimWX*|(vHP_@zSyRWv1RJGl>eSy~KrqP3%obpak zm#YSidNF|6SmkYYlzgt-6uyNw2kvbC$}uiz9UoGcvLe~~gsR+A2wbKsL~0`goOtQe z^fSl>wt(?S|DPXBERakmF<&Al=F5~%<~9@Hj8GWHd5DO8%bD;jL}6#*Ab>55VGe|T zVR3Y8u7;i+v1I6<7Dn;Ch1ogUMY$@*raB^!C;biuY+=4Bqv~$opTD;-sJ)|b=xXQn zj<$*Zz!t{w4gRkdMj(%IHghe2dWXiN>aP|C=hEM_Ln{hudzLDZZuqu0o7DUU#HIsU z1`@kV_R@?#zC}BK?Xud69_u$ob*ddzZ!(pwYr(CmDu>KxcB|1-qr!9(Gn^#cnE4V% zJK8j203?{Bedv9|LPyd};^T#i}d6jErfa>;cZ3EQ#QA-mg^PJNW z*gNTJld97tFwR{X7=?u9k+?b*kKcZ*bw8{M6+MlWj82+Af~2umNsM=r*L?+yaj?rF zM#N?`dYQLXkPHROFLP*4nSRGtowI~G^`znYcj3$+4d^&d`nxnPc1WV2A`I{+G`wDNfwveYs|jbmY=cbU&s$6xcq;nN2PYxRq&KOJY39uc#r zaiFoDV6e{<#GJ)POHIOS32?+|KQ#i9%8M7w^a5Y4=kNW8YHp&6FVk8t zA0I8YXG&e+2JmD~KMc0$9+-L`A%O@Z#5og@BXSmeP&eK+JXF}z)ySfOygpqPMiq3# z3uqP{)O3w_?b9d};~NYPG>UN%RG~a3O{L_<#qy;17>`9x3X0iV_H&_F{LTa`$44{a)rczn3|vlCs!Lz(remrh8~OOyfa1)|>;MT4K_!$RKxEJR{Zx z)pXp|{9LixF@CCUeIZeCWX##5Y)$%|>UfVTHdvb*C=O1yoLVeZU;>d~5(3nGEfp8> zIpi`lPgPPPhp_jUMo7pE4>Kyn<=Mo!Cwl7?q!o(48&Nu`TF#6*!N)`h2a0*fAqNJ6 zQp8QyjOT zJZ}H5E+_I&mvajTAa>S@2G#cmA(J_)S8|hwb#B;-UXU7?!;me>D2sCrXTcklO>4f5 zq@oXYS%qn%nmJxApb*((=1I32Q@UD&1rt!o?vlKP%Kms?tgOt&mLO^sjc{-LEGh3~ zzqwQ^-a&Q6xPc^Wz(~SLzp|+)EV{RxY-;Lc9cD(E2(Fk2A*~5vZvneGf;WOAR_RF5 z&E!N1V|&E_tEh$9Xg=2qj=i5Ofk_rCuU?=H5lDJm(8Gl4P%uD?bd;8!B{OPWlJzy8 zj!E9=!S57ya1JeOY^pU@&e2=HV??f;)=m&-cEgm7YWF3e%g&WIqJZRt5et+mRjV~V z+FphqwvXOz+yV(g)6h*1;*$Nf-3n=F*Am!VCiStHU5DAXp?l7og(BK5iN72w$6o_5s|~#M+j9`HGT8NL&ja>w_?jbMFc8fs94K zQ|VIhP;qj1o2BnP2am@ULe-Zp!tH4L?piKDoW}e6i_Zw8^EV)z|DE0SsCQ8#emdn+eMAlDcX#7U z7vI`1cnUincdHMfMwu5iYfw{2xLzqli0Cn>67SoDr@<0S)i%4W&WSoP?DoKjV zDX`PUV9l2{Dzl!%%d1?*Y^=(i5BtIvL)nZR?8$A`Y{$pztX!BqRWL zXQ4`~m6$d%l_=<7L7e=}0e8%GNdc46a+UQ7Xe4#u=rI6~-o^Y0@0wqOZ`z1uKH*h3 z3=F0RpUxuZq_&tl@eymjUD*S(yPc8Zleve$zq31t`f6&kWN1%V)m3zFsKWzW73v1G z6Q1^*2=sxP>@H2Ekok%Zm_wI<+)pPTU?lZHn4H7v1uO>c*cpRYoP1CAX^RzmM1Z@W z42QJCm2F6ljO+TZRZC7w0>~>)KwQqk4cRuu6qO))AzMD(V0Vg8goAE#gZ39cPKd$h zRC9@i_`4UnUAGu{*mp(B^&3T^%)PWN?z71LxCiRs&2^C|F5|jkk}c@RkPjhwE015=Ops6CwMPDcz{F^VX>i&}e!ynHj9kcOQL^ z0i*p??L8QF0$Zq4rnl{EEnANLS)2ZV7#QH?{^0ox{Dpt)v!$d*ZIrW_B11gHTB!9N z;2r6=7QNL}9kD)GZ%K6pc9QSWnbsG^2t)6s5^&wFTyqF@>OLQ~%fk~?=_m+1gyrF< z#MClaFI?>)s{zxyPtHqEm>6peO}c`u1BDYXj8&S&!t2D71D4l9NM|S$v`J{6uJ62u z*GO@QUSy)MRrP)9q9cz;zZE|XsU&s8j`>v_(g)U!ur$d7GcN@xaVW~`Z&myxOguz8Oat>&5 zBZUDh)Res_r#v9a!HkqOkT*)zk#`8rAxI&BdscUOP0XpzSv6xt647KzN}Qrl?~(*& zJ%R>IT$=|{FluA!Nbtkt>kHZK#RW~WiqwRE*g#71^xZm{{&E+%Z{HAJ!PE%{>--UD zGSJ}mo_dipQMS;WKuk~X{!o?^&_mw?D>SAj3a>wgM|+jhECbF0HZr@2K{>v}@oMk^ zrkzFjiOw?A1fF2HZmVC|t10}|q*yz&b^|AvTD9VfodjN;9s)a^Zp=Jhe^sPt-#fUC0m}fqmoZ6%~nW#Gu zhc?~qHy&=N$1)bZ&=OjyltPnpdBLTT;9Qc`4TIoHFHbsLdsr`J0K$VBHCK&OGF**) z2UD!e=PDK78WKwMufD&EMSUAqlTy$ImOvvX@bt7WA)he8GGHB=X9ST(33u$4)mcNh zVClsvWTS`qugsy18SN_=NOp)i5nmd1+CZR7#%>=zOk8Gi_BEiH175_}K~@b!M}2On zJoP*=<(Y)VL^BKuzxO0CPhncnh=iO3<-_^X;(zK8!+6mjyjiL7kY_uH5F!YnI(708 zUFUb(Ec$9oncH=CpK0AoaebtEbV-H%<)%WjP;o}&ELjj<`Z?UwT3Q-)WuWzW4gi-4 zGez|%@xhmW-NxfQ;br@SgI9hLQ6*Nh?gCMkOfjJafhUC6kX4yWf zj(L&zwl~V`b;uk4mAmyUas_|Io03yPKapTKJm>zT69lx!(Ajeyo|OWks}R9`p7*LJ zI~C8~_`wrvyGFif^)#8~@lH4-?K%W&fJ1tWT=O$UJK3n2hO16s0z17g3wyXH$5E+K z$Qj@LK>Ss~4f)8mtu)b)mt$y?r?#L0-x#~P{ZX6xa!U&d@kTuqWJdBIvF`JmtyvR2 z2zJ67&$oycRxOOz5trf3ljX@>< zqRxiidJ?~j-^Q~6+xreek8^$73|QoD-&!?xP_YCmAXoy9IfU%D~l z-SfTjHkpdhBSmHc*+%=M@6!np^vQz{)}gq~fs4YLz--uR^+aPsEn_saztr5?MsE1-u(cIm*v145v zD80DgX4lDm_M2|>(=S`EFz}q9Cx$i!=&ZHy^9!jCh($aya3+WjK=t9pTaGH)-9cuA zPtLegg`jJqGp=SF$bYeP@qbvlE0Jnt!UGG3q6FU*Zy(rPM)oni&k0FZUterJK*DR& z=dp@0A^vUB<*uCkXnH~f5+a|%T}&pyU;i=bJfpipW5Hc^6O-Ip}(I zZ(Zti=yd#1o!yl2I`B0Adq59)-lOMr%lqeZ>&EZOo9Ejmdc6}Leoj7ar?wO5*ZS}z zZVPrk{-#NGZ;zLIGaRDkowYs#;EHrh9ON#Rc$dlQ#@_kifXZ;}vrL!toxXLsg$thb z4!jN=$BwP5fN3||7q@!UjBMnM3xwClR-cDc>!&&NE>s)d4;0ZmeK(Ki10@E~KA9c7 zoL;<9**sn^#(=x+rp@t_@UG{~oIPHjXVaI5hwJAlBHT`BielJEdd@=Rc^qzTx z6B1vOXg$dMWI1L}^mBkq@cpRZf#b`~jNGrZiN=kS@ha{d{8sV@-w^i2nj9#QEX2WSLy6} z?oafO&=YPBc8j)zdKvh(XYG7e=YavqQQ4mFARY2MNXJ(T1nG_*pXT%b4boY?t-XVE zZZGp5_bcVj*N11D;=Af53akj@qe(p~%k>C87?pQ}8Y6M0r^qve|9GMgOnesu)YhtKTZ z>APSfb)5~kRs=Zbgx8}hoIZN7#ChqIz6}#cM5{3jh99y;1VYwCCgQ6*O^T!oG zPeiLxn;5NJ2Pm3-J&>+xjwIMr|Hq>vZeff3P*@VyG}HW%?|*o7qW{yQD|=N}&aTwg zD;Nji;?@*xT?bKA-~i|2M4FCFHM9&t9r#U ztxPg<%Ht3hy(RvJ)iTVFM7Z;|hQp7#LsOg82zS7{KSFwrtXG7 zZPRFnji;dxU7g}x(0Nwx%RUcF(1#?i#9Tj1*;8)2#I}n3RiY>o<^m6!U;C^%Ugn!m zRd6u~NdA>*KIuh}<}P^Fhgz$gUd zvF?#m0182;FC(2gkYHATD;nxxgxwr%ao`{$UuFi5DVhr7|H9{>8L^_IGgD$8?k2}{ z`F-zJi3IN_BekrJQq|9G7?M}in5rkgXc>HgEF=cfb6J1UbM5G;XTrtIzv0A@bHq8%k1*#`hf0XeFyS8|*%t({v|RMZU*hzv-vZA5-r z`&jmHMdLgD08-Khc@~Y|7NS8=x}xS;MP`N&)`5lH5>xP}NCSJ@JdKv7ylQ z0smcFk$c%8#ZGZ6tIyEjIAo;ls$WfW`gQ2uNNI0(i(XQu&YMn-bM$mG!oj23M1wEe zZT@d8b&a%?nCIW}FI5*4O*V`mvOF3C>bBbHu1LG`AK@o%)4$vq>W6?zY`IUv>khrH z#a%YEbYAK22!5<{;$90`3+b8^)j!pYf}Qe}nPa$8l1>|$do58>}+h{5sWJ-cP zac;?CID}sgn78OeSi%eDrhS@U)9vgmFi6-)FWIFkI)A5RRnXTA2n$gsxf(-QWAN4QcZ3NaWu59;0txL!w zKj=!Jko$o^+?Lg~T7Gb9XzDhObbe$7y`u5X=K#Jz*>#dbAIiw%ue8^UZ38e<29ME9 zIuuV8)5TRElFV<3NoI@WWXEaA>8^fEF1HI$69{nD(X1X$2XF>HUL1z@2D{CI{uI%} z3mTzPX&QYJA&5;)tO5{fh~>5xv-K6;S-z<3$xax5wVNP!c>%78bmS^37}iy^O)h=h zk83!`RFhjAVEt`s9@MVMv~QLZs5#mS>yG=ythrTVtYz?E%p{@PAA z-d6o9Rf%DAXx|&K|5d7ows$uwlL0Ow+FsD+*JajkoGxLLI*+Zd2;j(&JkLg1*@~+c z&k=)@X3r5#!r-<~&Q@ETJB_ebA)=f=AMh?B)_-5Vrl@s+=d&*tT`}S5&bZ?G1ST_@ zc{wlJCz=@LM*%6gl$Jc=C0huT@M8dvuhVFcG4-w`uD-{UtIVqiL1b4~H!L3+p43j(`+B0T;j;3hwLxIFx>`H0~3ZHn|tB^U~rb%9k16*-cPT)hRy39HBR2wuiI9Ob!Yk5*dBUx zZ1efmJ=5#<9j_0%H+wDh=dNc}KC5nztjC0eFTA%|L4EPl9#5m1Jj>4~SN6|ixIEq+ zPAJWp^Y!b=2eyNE2b7hSmBo}@yvvX7cZ-~E_4dszSKCW-8Nn+ttt~9r|x}{N~Z2;|kP^Q{{1!#CE55WTeFwgYu-gOlB!`GN5JiMH`81KZ*g7s87#kzWv6*DoJ> z4%?ev+m~P_CPOY%Bca-Mk%Je*J2*VOXus?!;k1%K!8>u76VFgxX#AquPI3 zx)`?;)@7Mn_-QZaTkGp@^WvvP8$|i|tDOVe%-2Iv%Js`fTQQrLfqcq?XswC1uaN>e6AnLX7qfBI-)-qRCmpov#|MaFK>9n1G0E|Hs0LZof_=z zZs%RHei5}VS@LX{_sh?xS5CBbG@^F^{fPYW7xBmd#;HTncUQQJ2ye;9E2()e~xuu#3;?tQ}hbf(Jf=D74BlIQ7pZq7D6I-3u% zZDOW!_ek%AUhda=Lv$x$X2&7#>XOAh)J5xb^Mbd|M$0Mh8Sk3UZNd7w2ea$^DkoQ! z53fhvjnmFaa+6+grOS9pz4tA^*2jB+cU6k;d{MkuyLdvIEAnZ*XKBFv+P$W&JTOjf z3TY&imssT#^2|7=n*|!1no__w;Ei~;JDcFw^<<)tx|%?Y?vmOfD?&h3xMAucZMg))(SV5z=Z#{Whc$f$yPd_JTtWYcE#6NnM6X}Toq3805DqWKYV{d( zWFPEy#g@yW#7G-*E)V#*d%B%pO3nx09GR;ttDm1{x;`lnI&XgTa$F2}`y_@L9lEEx z8(wu&BwsTqH;c4pFt#F1wk49Pbs-R1ORG1|-6G}Vb0mUlwf1hoHCUnu|FPhj=Y1<} z|EC29trVNnbRu}}`=m9RK0a-BYt z^V)zyRII~CKV*mafH>r^i|&KK;f(DshdBzvMll1%d#bI&<7+?+E(n{EC`kto ztkJ)DGQaJTezL=k2d4*X8y6u8X6F};+NV&1;!=DO7RO}<7?hMBzhse+wGVFKdLN#9 zs9tQUSjk3 z8nIZlMizCfeHHFFR=vqMAB?!x13;x`pD~b2qxYk8HEcoE&-4#v^yJuL`QA=5xMX=w z*a4V0T?b5yMVor-W23lY6z&jocWsDW?-U`mE>(f@I6--XdfggjNc{p|fL&WoRQ-~tJFX!uI*mr$& zKzcS+#)9`NyDL-RlR8chq>LVi@cwA*Oz_@7Oad7`R4n?m3_#v`NF2mekd&0T0m?bV zPl7K?-gl%UnG6V8%S5YEJSpk5-g=$4lsTnol*I-Aeix8mAUJr>fxe$T|;kPCO6l zcB9pX;`W^3ShPOBx;{NRZ}#eOIMN0P-ht9FR7egLoCF&9Ue3!yvC(~r*NiV<4-|~! zmjH4s0535`H{pR^G1SR-39dY!*{vEf0$00M!a3YyS10$8fZF2U5}e&h;)8_i0*wGm z zZ}LD}OfQR0N?j+*`x?nMp_+jhL9NGB586CNDE(T%?Sw!dSU2;G4 z$J{j+uCDGR=lP46dJhNQfkj^iTe2_)@w5%}GL{H#~zf03bkHZM|4bX$@Bb731DCEo#$zNsg%SmTXSgV zOeePOoZlV^v9-#~D8~WtQ6CrYhcWfR`cWoImVMp~7EV~w5whTN^bwR%4#?0xC3vI>WRn{A>q`^H)>2^=@k_JpkbX-44RWjuD{rp8f2 zpCM5a2RvK}%?XcViUWwFY7|&6zqa~)cu(K~v%3`Hk~#ktje)a+cs zS8tjLm1ESaaNV{Q%K;II+=cWCW>FmT{Ihlw-MmzwDLmuU-^qWQRT;V7Q0kFK$`Yxh zKxNmCVYeeFWV8GSF_UkY&(UQGhyOC=Pha$hpH;~au%10P`hnuh{%0WpvVDFGylBi} zc1u4Cg-~%yR^fs#vyH!RY;%*&hWZ7r=E_20;(vCACa#ZT%iA>i1pgNW2OcBV>ckM# zf5Jdh@a;z>#tJ*}Nw06v5`side#!kC*ZJO?GLI%W6eOIhc1IWDuQeEu?&Q{K>8Xop z@0?p&b}m^c@En}GQH+L+yRXgPxe$sgH7My~4jGrqHTAL4p29)T{uFg$ zDGoCDz)A1Ymd}Wg^F(H7gr@DXxF0D%|e8Llg4k0Sf99g(sfdc;aB zx0n4U*AaSq)=Xmo7Qc#QL}uj2a8HRbq~mbZyaNhTUV-TSNK`^=PzM4FpHMX$2sV|Y zovRR7g=D3*k&$xwxaxC63(uBE03baxigD_@02<4Xp zh1q3lH#cc~S*YJ1rBJO`6 zxc$`%RUib%WPhZEt%){;E`wq0LFy54>raLUQ0%$TAZ0(-7FvwIr4CW3*ZQv3zde?R zRqNAiW5^E=@Ik>X`%qul8GN8=9Er9KNsGSyw*%Mmmjl-fCFq~AU13u>vht4uN0|Y1 z;0Q+CPJNu3d|t4(9-Q=b$e6vs{YWk#*Riwpk(UiQ#@0ScHiAB R4dryLkTfZOQ^ zeU{`U?dA=Rl8arFvS=scG7%$dCCH8SMbE?EY8ir&WZ^pV@~^bh?A_Fy5(6uRGlyt~ z;^#*QU^^%BO%vM#>7e=mGbEZaDLWy*hmo|vFeZ>=E$(Ux^RB>&{!4*F{YQaQY)2Kv z;e1!%c5VQ~N>t%YA!tRjXeB@e4*y+&>$cbUT$^S`EAcAA_#@;4xloQJx|l!cA?SZ7 zaDmMJU#EZM5SKz!!xfL^YWQD(FwTZM#loxCAwPiH9_5up;poO5=dcz{)^i&@ZmATeQyGS&lEZtrYmgaU*cer%1K9?pT(py`FX<$=$CTCdB80svX7wbmO8S`e6qQDsWn#*H6T3y+BB^#wTUf=37J+&6nJ!kD zdq8+m6GtaZ;utPE#*HI|0X8BuUv#?-W^iz6xLZrwQ6dsPR^TrKj?{yOuaksxa+Ki% zOEN50SIrfYF=lusU_RwTYSKJ5dLO&RSI@BKC)XMb&H4n4BNdfF!JD$C;l@>&hG z&Nd<2vOG7DZyO;)Ik9ZWP(hG`1_LDEVCbw{%zCycM+aonxeTJs2;?#~EYjM3b}*Uf zyZI2nbkH>MYPF!IQ~B(Fx~&gif+1%M64zqM!TkYz{2>(j*pL(1&!SLBJN=wXk>j~o z0bI~*lYcJ_@)XgD;n_u~W#1mp0F-W)?orEK)@Kw6x~L|ev5FEH#`g|R#EJ!77&3oq zm*~?o=^pnrdF`2{8WTwETz0_^7DvGY-#rC$R{jQM!1CiQM~e7Fx;y6Q1wOehiZL}< z2{_S(yDO^fkM9vg>dRRt;rbr|5e+1`(iDlnQ#fO2wP6U4Ujzvbz7WW z*|hr)*1-pF%mX=9a=IUDPSnX;%j1zqGNbocm_b?G_J|#dK)|+qe&BNP$z_bA7JOeR zkopwLUjBi4DnuH*Jj^Eo^&Nl%qv3wsEFrG>O+w}@fXt|HOTZ5BS9GSU#nSrF5ReSv7#V>z7sG*Fm7{N*!@cvTs)FI>x6*}C0SzH20kx58 z$Jqn|aH#0BfQ6I}QN~t$#s2dip}7hYeX*&$3-zSWXrX6c0#Qc8{h@T7B2qHb2JI9ZGbUG*?Nk@kkV1ZVa$Y{|m3iaP_7sS^*ck0V+&H|q zq3TcxxlJ=+hsknHc-UmihtSol^RJovmvUB<3tw`@Ivtcax9736d)`@us`k zrvQ99US%~-)V{;}ot(TvG=$eaFFljv2o(yGK>v+@HoD8(cLsG(5p!~(3|rrsKKLL1 zjp=c@*mA(o*!(~IH zEyEdb^EBAHNbrgaLJwtKkp4i6w+UK#NCKV6 zIY`dM&sm`<``I!wm0#>066ZevxHsbQC(;}s0H<*)X8bPzjzvW7{{g^>!wE!=#-KDH zaaKz|*YT!$saIKJ%LzdJ4ZykVzv`Qo{sX}E2NZMJwqoCan3(lCSEm)DZGF~n&L&Rw zNtXOEyUk&Fnoc8OzMIaWTN~`pZRk6%&E0v0JYL!_HgkDQyJj=&q8dK_MUe zU0@u0CdzR!Zz}#50LS?k0N3ybfI}&mu}mSOg$cF#aSn2TL>Z2@&e;+h-#f?g7P=_X zChsl%02z>CZ>a+Fkw#3(w$9KLlm-aEy~fwV&eveqJP9kxp}zJi6XFFcqDE7-EMigz zvOvZ!H> z=64rp{dfPZ58PD$FaM3UP6ezoLp`IplK+Mo^xc00nREdoJlm8m{p%1(NxuW>o8d>j(U>nv{RHNJW3j3@=|ctFqI%#G0~8Eo0I7 z-fLzhmcW>YK#SA`KslZzU!xL(RC1ueFOLso!Y;sB(Jx;q$zlW~5(JNXnlFCFjV~z~ z!@#!+@>{!NP)%MxfLXwq@0EVhgoax2V6OvJP3_ za~NnDH>ipg`uNT}|E72hCEw5Phu?Ljr^9?|15R+!jZo5ed!NHmBc&Us@JlTiX{lGs z1QN#&N6vIJv-Sv|Fu5(UNLz-7C)JUb5EB))F(L-gmjn-w66J#p8e-0dg(RanLb6{< z&^{d*35+;=Z!#kUGggQVKG}_Bw$i zJ>5m>M6T&XLGmXvaU^ncwhzk&{_D-DqntTN+9V;qwr3S!sY#4Z%CrA*Bk6Jaid!^a z24i@q_Ghch(jFDheI3}>t)2xs8fxg`A|Ys8XK^j^NfMCn2R!k-zhonN74HNY#uHSs z;l!22L4UAry-?+DP9@L+j%VFj5i;DJoUOb#I2YFzb$o6mXK^%k4oeA(YWC|WjLI&U zWKHvWQ_FS<4p5{AFi&9YX-WKpooGlALIXsSq#oj?weo0SgQ5n}nfduwbjuY$+J5Z2 ze`z{auNuWA=ZKvutWXSNKjS?7KyXhzqFeoM08Y$eX&dAN%s&7eSOEfI;txz7@9-UQ zu6&_Om^hpXgIac)jv`4!42U>?fds%x)QrJ!k!9ODnKuioNn!sExi%k?HbL1LVe_;R`?7QM3WcuVa3o7%bh1 zjFL-H4AHBRj|qg!6h8r+>;RIV0PX}J0H;a}BQ_9dCqic}+eYJ7GPBp!>E2*7Ti%xY zg&=hNi$a&yu7a+(7aEJJ^dtI-WOWANmHk5j+I5NsRiWO*;2!{Pk)lf4b47ZA1AWW5 z@GE07^CBWaEbUyXry5TpVv?2u>#!UE0!_qRkmTF7Z9+@($9DkEIfP@H=^cP`Fn$N% zEZzaQ*nX|Fb=HxLq8H|3uHzA~AxI0GSFA#`f{gPL4?+{_#wp^QjdnaGAOJ`8gEagd zfNKu^zW_LuX`x*p0N3J?+95cp*4*1O6v~J*jRZ95Xap8H+`UdfDUfoN--~&G&sihMPY~ zRG0WKVe3SM9AR6oxXbM;(%4j*X&YmKUEN>f?_t6Dq0xj z*VDWSZ(Ve{FW^!Br0$Dji(D3e%lC;<7MsH#2tP79>ZoL7waEoAd%`B~_xOmZwd(6E zWAja^yI5k*mtgtfiMIRKUmvmxYKW`)*Ey*^1f^XR>>;p&EKoPBARBN=e0_MW`TBIO z9!rb^x#kMdN_Qy-ZAqe7MC=28mOEsla)P)!yM3!|?F8If>xh%F1K6z^>HUQJOnt;r zZjH^55t3Z*wCz0|X_ zOl)w>8dDRaa*l~rfMkxkDPo)&|)#ye?|J#2{_{V>nefQs#UK`YWbV7OJ z|MB0P-u<`7cmFL7G_>#Cf1`#7i@>jLGc5?Pl!oT~AYot+?O6`PG9~qa=A=Q*{P)kIEdFe8IDrvwX5pyCfz!=8IZ}B zlglXv9Cl{&pi@Vc;yjTUMzIcOm)WVQvrGl_JT(V-hDxFRyMhjX;e~gq^%AGrE7E6x zE=4KL4cF<^)aG>tw{nKl?F$ln)FM>_{fB?E*t(t&_-wCjU>6svk%2Jm0 zd989;15L`{oqq#KlSr+QNFe0M8)L5{rOCuRQqy)m&P@~k9>r&Khld)~8+%O29k~`Z z=lfP=f`>F>Upi|$;gyzTi_8G4E!JQN1EFwSckkAg{LzP6H1N*9eP1rt zz)KvEoqlQ-$>G@{E5?5MD7&gRpW0s z{maioIfm;ClMtmaDFxR7r77}v-S|_#_BZtQteWA0#);6n5c2N z(nbX3c|c%bg&MleK}xw1-G)Cil}A`~=??oVCI*$*#tBbrw~@G(#28rgnPUGK$;{3p z5j>BeptamVO0SC=A8yihrNP#Xu{oUkqqE?0W;}xZL~$*C3ELjQf{04mDS|))FKq+| zfzqB6Ii&}Nj*!qtzsxjcJ`{zv*pI9OMvWq2e4=?wmdnQ9_e2m!Ii!UlDq=9KDSiLN zzs(mPeIw;08(c7`X`Ec7zE+19M|EIp{ZMmLvT{@I*QF*nnJjb*Hk7pVFaAwThNe#5 zBbQXm>oH185aDw%nMy8<8BX;=X(Db52Ql8#R%5M2%11u$jPS_fQZJopKDhN~dvYS$ zUaPXch?pnMrDZm`3R>?-1a%0;wu3kyd6^!=o=k|lF(GvoZQe-jpD3xihU}_k1clOe zyxP$P#_`{82uR_oL9^z|_P_Sju-A0~6xNZpIp^3|rdlXQCVZtfvf`}MTPntK9B

      Mw-E(&q0g!2tSi^+5j(f82!cFaJ#)(#31ERJrG( z-pXy6_jjO65_uj=2A|LQPj_)m<*ZT0XZ#GbU!2Rn>q-V25jfRxpR=eO_5$xL)8w=B z{sQ2tnp3BIe!E`_sHbd%&6}Nh`!1aw?*9e$+bH|*L>_zo-yrv z`CkCs1RHUGY$zH=qaSY?BQ+3!yZ;M-vo)NSc?aMW{|&&AEl>2L+idon{a9YB~N`nCG`Lslk#g|dxB*MTdYnCLLUp!U?u@98G* zwc^;{psw3EGZMeq%QAn5%pJ{N+G0S7Nfw1h&=rUtfHx=Yo9WAx}pj;{Uv{%5h;Zu%~$9kss6bLaunQGZK; z_leB>n9yht1E#S9(UBE08ohH!meSC4x2&yG?X*Jz;0ga|c zUd$gn?Ixj5(75vBNXG;r3h*?V{X!@Y!3_)yfiwd$>7UFp{%P=R5d#GFpNa7IL%*0Pr>i4Yo+cKlbrFV)oZfl0?jP{^eCd49g5R{PkQx zs&q>f2kHM|>#oA$XxeoF1Hs)1F2UX1T?TgzZo!@4?!gJ}?oM!b2{5<>cMBRkdq}?T zU;nz+KAWoUo~vi7PrB-@=Qe!*&1#iDFz5?FYz)W9twul#&ndGwbMJvsCX7~JjQ_xm zR^wW$tu;JM1p#Sj)9 ziJ|C-Af#eBVpJPWFfoO`fJO;5k^ps|IXqzF>$oc=l14}rGH$g@LkGb4q2 z{u`#Fi?Gwd`b_PlLK{&@5MrQ3EDNs|gG&XjaNjTSh3Q@tVht$c!E7?J>8iw(?ioK? z#Zwlj$$mTKa(;potR`cj0Ty|>eSZ|~NqZo(HKqW+^%995_`->%7<;`@oQveU-C`vB z@R_&#BrPCu4~cR5v-A!p0zVBrd+N%W%@3M`>xAO-I6d5Frx!dd4T+R^s|d9oNZ%oaZL4(95gGGJRk1f1<30xktaz%dk@ z+jqYaaOzgR3LTvV@&(nvceKDa0xpN|KLngV8*P?)_u2xJ&y6PW9A~q&A`!&yA}1$j z4*zmt_Z(5BkoUdmS;6lL^?XfC^!=lUsVFOfg5vp3nwdtc_Opm%;s!4+9&sEJqR~}# zGJn|8#c0U(QWOpKUtKT(N`-z2?>T)VC%u_R}c&=A4T;t5HM? zst8%xIJ+h5OgLp%kNAfl9BKXcMPI4#l&{c%C8Lm}=_KM9!5-ZqkQl+1fvEDRAj=DY zy3GJdDyw|0(DX^CbZVoe=~JNc%yUY2qddxJk;O+lSxZy!s)wl_%Fl_$@@m6Qu!rmw z7iV31%FUHAF}E>N8I5wk2vbuwfYvKw>l=4U==Abmseu$@E)lGHeJ&A?o^9eXHe8eW zcDdSfq7ZFX*k$p?K=@JY}^s?LKN4RF6C3%W1l1Ah75{B5vSJ`CAimeFEbfne~ zFdoHpq(DsD5s4YEbQ-eCAEpgi1swqRKm(K>V^3g>DfG4cKm#XPoRf4!W%ekO=Bx6? zfDQVp&~EiLCbz{mtDI0MR9Mm7Hb@AjHmkJ!(2!jY^_x0ZK}h=ua4#zYkzh;uv{Dbn zqe*2Trj6A>zJ^A1y_eiB{rC^l7Tmp8ac-!iz*D>uRCZ@r{>HSac`?ru0h<0YZNGq; zUd&k~fCCz!=dqw+_Ypq_(h~smc=(U8=RU&qqXOQQ6R-Ho4yL6GsuiQmH`;Q#+WRUj zarl(_4hgE!m&n6hCfg9xx;{bplo}+c4m9Sm+Li+F%gv0q#_SM-G-Py2BYVw#1p;}_ z0$j(=*~{DVg3WqvbY6pgCm#FfB3^~vew<~}!tjHv!c@AkkJvN`&Gdgizt$D>sMqPa zP)W?Sfdt=O`QY6hiu0)kgNk6$GJzw4zxZU~%w>Ihl1;w_khyO=FbjLk3i_y53|GhO znC7lAz*_x4O#GF`BjTvdY@1o0pg5wxV?#7BqMzL{l@b{U>qUut&AAOy!mQftUN)iod|R5F`Yq>@eLas3v^=8S6HzrEa1M{TZRpswolKV2qm zc4?>66h}u51E5ahKb;Fcf_Xxq)7dZ6{<*9v(|RH6sEwj$z-9gIUKbgFt|!B8>*$82 zpzHrR$yHZ&J?pfM0)z4IaSQGm&`(udag|#Mm4Cb9(}TxvTetNwl`hcjmGgLqA?g8L z$JN}KBQlEH`t=WPDYxt&%K1{Ob-(->@KkFQNz1nBI{{Bi>t|F`cNcUf;k zS+Z}llkXS&(*oU=Zyz({-}_2%EdKXTSZ7+|038~t)`f5zzgutCtn%<}Kn^XiWbCGl)u-IoCWkhV3|KVg zQpT!Z4)|KWT0g!v%BY@MZ1hd@9Nt1Kb8?BI6Eh8H`Pgkl#z4rlH;W&^(U`H;Ig&QTWG_c{CGxWCK&&@Zcl& z{s)3fgVJfl-{-D%7h|6jy>>9F%AwD$fP^MHwB9wej?AJIJ88A9rTp6i%C^_8RmFj#Ek7$_@YD{8 z2eRN`8qBumS(UA?i%ZCHk2JL!!-jT^zy5SgQ@|@u9Ez3fmpExj0qghlVPQq?SO(+b zc+c(CNe$2a4v-I90smui2M;RDQvKU@{kzE_PVG!3>)2M(+gGgeTW~3hpI2Iwo%Z2p zS;%3kLQE1PM^K+EU{cJuiuJ_P;`Oi-^n4v|7!&sc_xjC=m>H&|S?}DtIbH|j`lQW=TAKhXxf%%8b4!Jg>2Z$BY-qG{DYSMOm6ju`+A=E zwx`9@&7mBny2hMLZ2{%`?Z$AW-u6%j&!yTpe+Ok zA<6)qidJIp-ixw}%OL;|@P$ore{M78^wzt8v#b2s;DN1d*kkj^+U6z#{atViflpgL2e*g~YoSVfmx{Qf zlFKT|dAKZ{a^H6-t9DAvsWM~nsQ_&>9rBjpLSMaRCO%uBt?_*wfgU4ibvZ55Fcy6c zjQSp3OWI*9ANEUKO&d59-b-GGxOZ2?%9XlSwRU-on1ILTr{K>MFgqxvkoJGlQz9RQ zWkvMjW;(Awh)^nd;!!GI(k^TVp1WLM>I%iN_44jc&y-2&=qYAozgt6Rwbqr5QYO$X zskBwmruXGkjgbl@pDJRWJr_=aKF?J-=V8SYhw5yl6`pdR2E03f?Nz)*Z00F0z*+I# zUe4R5V{LvHQ2jw!rRGqqVfY(H^qu}U-!~CX_O+5)W@`x{e>V_jFWrBXpqo~dY)p&- zSEQQKI^{@7rdIlWYb2g4B*IuR2l~)AXRh*iGX8l8fPOorOE#vs3m{1Gbxs@huvNcA z!0vmf$O~mMIaIg$kyNAp-BqStxk}msVX-i;{T;JJ5pdasN&s&*mq|jj@@elgJ7QO^ zF_fC^1fd}#R>02mP`T;Pgt*g_I@(7Kuzx@}nEwLdnhd2jlmCKnoo^uAgF0psq6Y|s z!^}$!{NEs4gpSn&EE7I9fo;F^BGelQC;Gb*)~D31l^@{O|DcbWjfJGagLzw=rxQFC z(BmxbDM!9Kee5k<|GKjinch2`tjLl65~vi@JNRv+y<;TG@Rmbj{Xv+C^sfh3`+WoC z!J+Sfa#UPyjK6)~pf3|0f2M{2Z3j4%mHM*z{4UN()f)<(4w+h^L9w3Wpdc^;P-kr% z?i@wvq#QWNj%FK{`9(dC+ZrBN^KPPvDROHgCchBYdpwvzk-kIb!-F>1z1qgICHS2B z@S&1YP2;S9qUuO2hp5`G3u8gM<30iPD|v0^f8tZHgDrWtMF3#W&G{OWFpTqZL*WU#UH~#-_`g=tTu5l zTv9~9Phx3>2>uko#x4uyheF-<8&%)II*Y!+rdUie9t>sF6VBZk^KevfU@rX(B+6wS z0qbVStQRiTRhcrr|d z>%S@z@?aHQTnfktbrk=L+xPse2>x&0wwpl zse;tz>Yk|y|9Egbz3OQaBR+tm z%cOVHi{h;wB--9!G;+r#i?!lqMXa7z?vne?F9|X`I#taDS*l9+0s6DupaSM}U~r+Z zHMuB_BkRGg?Fm=fjcsCAr^k=1+*}pyHK}BhcI?QG3f7G0no>#2gELHRGVwYP3_Fj*&kD3Ve{y;qrxmlqhu7 zY&O268Mqy}lRU!~QA0Kn1b1Fbqh%9pg*0|$h(q!Yf;1OiN--u-A@Y*ODewxgPVvw8M4yER(;48mgkeWCQ`!QGLnj&1yglY3yo#5NVh1km`Y zj`{HtF}c$CWx=G@zfv;pYUp|3lCe>|%BzK6UZziKJ8?{a$IZOy(5qSyF6GmR~v9 zAZJu)uI~o24h?azE`_`7!sss`O1IWLwlqyAlHX%35(;tXR@w=T>)YC!#)W@6jjjn`P$%oOv}guTYBsTt!Mp2NzIGXr=5 zI9V8e|5t=7U}LPqOiuD)9+L=`_!C7+37ozm;y!B*k(+!^h>(b3{7y=g<`TZb&zN1> zz&XJ<`LNFAEsE6Kx$=b3=HOVc_d{(ohl6(Y9we~J;h=beiuwF+6scmlr!z}$>b|;N znGEH-tL9L-57jHAb=XeDFaC>zoc{6oS~|4YL4{vqKo8<43A`(v8=z&uDg2ttTU z2-R9^0wh?ZIo%c@rv8&fS{-3N@h6MaGQH=vKe!H*MY^EFqbTuC+Fk37gp+WRMT8M9 zR}BZ2Ji@eGAMK3M^KKg8@sy`?PO9*RvErE;ZsSJ|^)VOMFLA9Rca1V~a($BRrU3>r z$?4v3<=3c}EL4CO5jm%s8fJSM2&2`GC6wMC%HboKLYMRhB={$*kO+is`+zGauyP=V zMo5ueH?~V>Qyr5+3o|LH@T>eQ!r>ZjL;exrP`3g?;OKI6+PYdmsPzbs3%FvXnq%&4ZmqXRxQU}9^;b5glbe`@+=p2hA!-gK5kBWdHuaEo=3rhz|_F zBE901#JL-1rx#BelP9L`Y2;asxz+FqMZ$8%3Xu#47qqSI5yd1K@8P{J(if3^D95bQ z*xl??Q?2{7V1Q0iG^QGCg{*xJ(fL!Vxw8vRqsXW486^jS zy)_dPA|&`>1PWR*!IQSz1rDn#FJSE?eT3O2QH0q9!kg?{Ou~l3Pm*mj5nbYzC^vi< zDe-f`q++gHwAPx80i-~^k>pg>js%1OGvC#+tKEQ*0Ge67oSX{?nSli?rn1b@ zl9e=P1>+2=>gdR3QYaVWq<4iQfE4XFi{;G8u_6m>a3+q>k?&yKlm^p9$Ro*w`$A}Sn zepPfGOw$tJ_b?`M10I)k^sX(=P!Fhj$*K zNI`H%&<(rNgRFnRQ&AURJ?0ol@!`@&i%eN%$yaT;^`!4p+0QSdPgFYB^@XW*KD*mb-*(BCwF$GEhg?{$W8iZ&(}Nh*tXw1IEEjk%ODRff4?{+0K5}yr}awM!U#A7JdipF z^P0t!yxu`}C6vO(ffeofFAok0a@oFjDgZFu6ct;SKaR!)_c=$`QIzAz55s$oFn=e z^hg3a8jFWDA^$+g=F4`IXlr91&W&CD$Ai;iRf3}UNsWbCyUctRtG+R%HCfJtG)Mc> zkhej+Hv{oo;SQWU$uB71Y=x*UGZ6zV!31!OYNe_*GxzMRsByyixbsU~O$SE8={T6- z%2E&Dk_VFA5JlNIbN#w|lax?!;^nAb@YgabwKcMo5B^ycCKhO4X)BXD6TgS%DGLzSS>#`iFmg-aTurQTp z?Q8&(5Ngb;%Td;d#f5r|!TPjIP2_Jl(v0!^CH`9O5Vbq`)xynx6z;@xCS8L}Ek+!# zt)|McbW)$h7{J|qhz>XBaE2=fTPCwCA3JHuUcP(=K6@?9$Dr&pf))>5+dZF`2$d41 zvA$xjL99kRC7Np9fDPS~IU^r#_>MT@_mogz_OQY+L%Cw^FAhg)3+Wsbu`BQhQ5xeO z5f9D5;}Hc+%?ym9vJqDB@Bib$F=Ng-GunRS08mAJh*S%76~FohN2NmlGN;KCz#Jy3 zkF++juqMwR4f5cg|E~uJr26Z@1?HhMCV)J+(&{%4j@3XC6+Wfnz<&>RU=IM}+4$t8 zH6}N5_|E^Y2N&&|M-2r@MSTBx_s*O3;xWk%lkJZO_syU#6Qr64xkr9CI|y_s1jY~Q z@QR`Aym@d>)|J*(5JG~PhNtg7zZ{tshYomBSQ-ZAc{Gl>iB(DlIS%r$qVo{ES4QO} zSkJbAn_UWaIOEC6zN%Gp!kUC;6xGt|*sM80uVX3cqZn9J11?&MFfsDU$tL%F_nYa% zC8rS9ld-`^;UpGZVP*DdVD1!Qe)Hf+sx0w^^a7h#)zJgP7h@|6_KAL6of5q23CJo7 zuz?A7a-!^P(5p%ML6nJ*IR%A~LCj&u4!FQz{_DYcfIK+BzaCuWVm8QwYyWQ#E)P`I zJ$ckR1H4{(oD3Aoo>0%vw8Oa;WhBi1j846FP;lMx2fY%Fvo*RmE}!IHIwOUTGK}Cw)&oTwBmFcs zg%mG^@J}!R%)@S26dcqD5a)T=?qrWk@&AHwt8XA2oY+_tg!!~GehzJo zE5}y!af1$O@PKxKe78&xapy<_jf~z{EFZWx$t<}YmffLE<$pjp<7;Uxg?`7V@e$A# zW17PF2e>O1>GU_+t^uoa&J_=u+7)$&QF(qvOK*cp(|p4}A{@(3xFc#Si>UrpmrN zp|%nHEHfx&BZB!B%TB7a@t9^MK1ttD2=WPCziekKCQ^yfEa|c1NUGdA&E!MOMZcJS zQyNK)p~sC);SSkOghy-;k-b=Pc?e&^OpZsK!CIUkvb8x7`yyxLD09zqIg`JfBe$&4 zI;4SxrfvMevim&Q(R;6$jV`|*eL(i(7o%yvE=CkJo*p$0 z(w*3|9gVuxlh%)?P|WxtAX{OrJ%1320uj+z+st9zKOh`$4sq?m5Zz3@+ste(FLcsA)?DK!=o-{TiW(2OGNpj8qx8igX`49Wu(auV zW+zyJbXI|Uw{X!ztqw*(1dS%cSGo8Sd$hdL4|n#Sof`K$P?;kP3l7eWvU} z@~JMA_OA!m@W+GOm8#TZ{J;wK$Ae@3tTJusfR}Vtk|H7Y{fzg_(TkJ(n5#(rsZAl- zcYr_2Ap6~Z9m_m$K4$J@K0^Qy@IDK{H2%f3&?T~IQ7<;M7e|eLBBPG^YgZs%X%r2= zviOP}wX-kBFH>ZX46BszGi@;dxVr@W5wi=^*_{?AqGIVhl=efYcRN+!RVki7Hpqj6 z<1>{*kad&=*Q$z?s8CTQWHCkJ<%k;>U``T4OHBQsOm>(qTxH)Va*~5pg)-0hHSE-$ zyBk5YDZiK2U9QV&Ndb7$bPD3&P^1_9y!DjX?!R3feU@)AGINM`_l(EsJ^K{d6BW=E zTp{LU{~hf0Ii@@$WPr~pjt(foa&usx9UgUp8Tewy>|#b15eExR@=~mYu&c558*lu- zG`KQo4Uh&$W<-9%rA0PV>3t@s70Te3D24QerOK#(6(@hCTRxB~3 zIbHf-kvf+n=`)q`>c#Twi0^kq;>4}9bboP@k5Iy1*0F z9qCQKvHgCT_!&dS?}XHm7f^5QDH27NK+%Hbt9>@^0FCt$Mr|ekT+GAt&A_~FT`yQ9 zTt+FiBOHXmsemvz?1cCjOi}Is!r*BCVsPSzmb#^Z^l_J}i3_1M@+o6u6z_CYCLM*T zSQvuKKr81hRu3TC!swH-IUYU39__fR_WhPc)d!_s{u{3Wt;z(!zoFLx&JeOr9D z=UE;7pp=WAi>06rAv&bjZc4s{Qk6io%i{CtV!U|!2=Ok>fQbd|IAt^hZSf>A7VBnA zs&nd6p#}Qre>FJioL}CS?SamYDTm|) zOH?e{L-%AE)Zr4!D|2%_Gi3$U z7?&&dd&TeCn(U7T7hJzdlclPx+C7Rn%O1ksU6qoWTdZ=+hH%a?NGo3_t6DjW`A37J z0cmi9|E0lY$0JJ7HPCwFW&F&p$gb5B0>j|Qj9 zx%@|i!%&`i)8Muho+YAh5nA{i!MwNp-!!Rg%e0%zrev&wn+z>5xaW zWc-!QpzWV;8XSB884E~*EBRj<+(R$H+{@VNEgeXM>*$q9Nu`31_4q=Vubz-l`x$Ow z9fUc6G&nbfIw4hftMd%AMGHSC2OX+rUF5)}EkTZ?JKBDJU1={p?vH!+707HyxG~~? zG&ns+$@RMdTq!61f7kkyiBp=Rcbd!BeUh^AzI z70l?Amrbi_l%`U+WMcOCMAKMnoW~ITJx#%<9Da$zS-1f>j$$Z^k}|pG9pl|6U>k)~ zWEY`DL9N%WuJTZqd%C@nCB0!)CqT+aLz{yrxT#wNix$NT$c=KWa){@7%Od{<$|Cpk z{}nZRvP_Vgs?xd45`#?eQRh7rK6YRxobNYaFUmO4lS8^2)SqeSBtg(LwD2_c`j0w= z@aU*}PUKv|4XAIzX6EGnTgV$}e0p?SlB>U$pN$Ma8k{?yGqsb87X@*q8~oUZL;qpb z0-(b6GI=mNq=;5olsTQ+JiE9~+mD9lZE-yD0Z(OPmBPHt=+&f9@OI7n3MRH8GuNC6 zB=TNKIF44wZ~jtLmQqe)3_nB1Wvk24V-CGv6KL_i(uSh{J~FjFkRZ89{kanObRd(4u{)X zET!oG=E1?CuxybIjhgg{rKpIrO$AWEq8ORiD~X50L9yhKxCiQ|zkzV6N~jp{#-bu1 z4bGylGlv^9*i0VsLVLUDTeTjE#BF`?EuoUxPQF!gb7P_8Hj|Y_(%g3>NLfU6WM-=| z9i|-$Oya9f-mlVdeJ%{GAvasBl8!A6rC46Eg@=I~CG!oh(1{$0CK1G+kY`_NqT zYhcI>T)xO1xiD9m+&wy)L8DIBV|TATF05MT+kwT2z2AR~`fCRs89BTYK*a9f{&dTH zuR*_1u~>-#$lS{gU`E17 z>3eaN!lPuiOVxlYR`1iFlJ1<;fb$jwBtoiE^{~q@%cFO-%JdlvG62c9&Z9hAmdQmT z?TZCO)9zr42;hnZ`qmSFr!)%$`U=XMKql_J5~5?s%Rwey+tn`vrk)7DegI(4UF~&b zn8Q-O`(fIXf#~spEfvut5!{{?RBq5hUcaH318%=UvgRy(f3!kkdbq+a>;QNdobv(X z!R_Dy-a+=`q_l$v!m4KXB52ezpw7ZzN-1@xF2EGu21KYcSD^q-g3N4vNTyfWg_w;< zTXxzLA7HD{jQV87I#C>XCsy8;-m zj&xhZDk~lR45--G7`_MCu(PVBydE;2|OEy)bLE zxxwQ27sf(hM8+g>l31$ocOGBV(_0#4Go zk#UxobF>>1Jos-`HY!0PQ9YGdtPkvTQIa}-$a&19u0p#PV^!Mkf+L)@9*a2+bz}PQ z*w<1u3vM`cH7?|JwA-NUZ>A+@gVSz!lOlVuF4R#9i1xlI^(WWviE1a5- zQGM|)uuzqlhe2*Y-dJ8kNhBc4;U5w%f9@X=F6<8prwqy4;}X^$@!upI4rEkcw2ciF zwBDq(X;(GI^nM&JMpa6{$@d?$GsXdQp>V5|6GSl$PT7&rap$!wOwu}$yGi#*hH53$ z#frBmb_c-WWNnw87cM6?4%_r17bG*Pk)8prr05VM07IR9GmhRWA}1HZ+cJzZvz#Vq z8K&ybGEDM6B3v$*rWyNOI(jh!9BUA;R~W8Gwk(!Ntgg%de?+(yeez+9J=A+3LekBb zIoNz~M##rCHOa5so$bxU_mH95k|^(x<_e5B5MW7N;GNytewl47(M!9E$Ed zkU^VSNaKB&mbavg#NB(8|pJRyGwyJ*fx;7 zRxLPpE-5&*wWC>j1NwoM)pW{w)xn1-BL$VoXlB7qeMQq?v#J*MWUq;}j9tlXFZi)& zkyZ1~CV&8B0#eKBnaOCUcRu&vEt@pYQVX({)w!;rf=%LU7MgFMFSF^GXX2MY4@oPm zb~Wm2pqZ+&_U0B55Sk8+0c2e_<%O4!Rmm}(jX9v916sm&Rc%>NSG~0zw5;6=d&}G{ zQv`d{IPygCWy>H&P^KlORh__MW79%4#Z)+LC<3H^lZ2DPQOL92S$~#5NG4&Q>$Pai z%ClLgm+)PO8~>g82#w`ZoSDEMsb;RTwi-q(hZ84k;P5%VHm!aZG0ZngJh3dZ#u<0_ zm)Lh~!eEzl%I~lz20E2$DOAc+#h8?)y5@uVj|#q;w+%CcA@U|WTFk&jEZ39;RexgD>3lfyhGYqt9EAVc7gFHg_dcLO$a5JjiF<8VsRJR}Nd4#pSn$Z|-~WX` zkWqcb2isbr@FPdet*TBN=W+mH|6r*H?|pI_53K3VNFUrucx{usH)a#_3Ct25+WAic z-P51DU=Ss6e&7)AR=8%P6mBR)`EobXYQqbQ5pY3SS;`GgaENL9qSeir+sS&;lO73y zj(CES7bJ9y0u{pi2nO&+6cAb%X_r!zst(j8wv{&>?X^Kk50Q!% z2$aBx_W37K8R~txU&?GW)Xic(LSvCOLSj+3!v3&EEP+~~quJ|s*6Q{hC4b2_N2!Ez zI<>L@aaLW%IsX@Cy?UOc6ys@_`DZ8{RKBWVFlG@j^x`}1vW^nS_LZN*pNh7vBPrDs z)MeTw@M88T<@FvVpZ)HBxK`NG>tdd72n>0`*p`21EZxLk6jtA}c}JNl{0$>PRuXAB z!4^uJwaqZMJ^S?OQef6IgzZ2Nhhen74h~gSyZYQv?xbr!{TIi`qd3xz?ScgxO`6TJiEgP5l|0{qhfuHIF-2}@WyVvVCY!qzK&5HjTYy$IF4mk5<$9Qj^5%^*3$7+4hvNt|dX=AH8iyoVtujn#LkZg<~PqBj~K zMPK~Y)(q&2G@3*?sZWU@ItNY3?lwsR$3Gf`#zKK8HC>)0S0L35uC^15B0lXclY=9| z#;UsMb5LOJizTwNj}wv+OGEPA^qXg&$%8O^Ro~i&k~>OMK&mIULvUamXcN&#p6y_|h;Bcx))CE$6)B&+3!L(|ucK_A7M+3cC=7c43qmnaZr925ovh zV)l>99X#$XY&;XZ?o}EPk+Uyuz3&Q~Q+HI@mU=q^4ECXEUk;RqT&K4L5M{EFgPjsG z7_Sm$CxZLA;` zEzDt{u9<_^JJ?1j%N&tO4z9bPRMYTAh!nX=wrO{y*_# z-fbtgmjxMDQc2o3nC0xve2J;sC2&rGW)89M#C}Xa*ReO?a-?j&4?3$8A!{I^F^gM| z);1vOmStDEgnV&nDDnqX(*Pr9SHQ4O;#Jr_v6`pM*_}!v51FCZ3v9HXJvvek(^z>~ zPF$(8c6?hE?yjn~b^Ho}NXJBMGH{z(tv5!c+`wHj5QSa#m5ut5ez$tqM#~$vXYTie zs1HSOK&FYx7ZQ|R>xWR^etDQIj+b^bd8WRGhz~F5cZ7)-#-?uc6M1BN@wmKm#@hU% z&H9-x3&kPOn%GMItC4+(tfXc}3DrAK#FaPVO*C#R*I2t)-?;Qe>IY4-(8%-(6vC)U zrUucpNxjU$EU?8Q_Le`_u$pmi6%3nt#Dm|#TrVB+voi6 z*}c}1XR)UuDzkTPx265DU|jdpBX@e_VO8i!MjMPP*t8j$V_`H=XJZ0Z|bx5`3j{V5wmbuhseMy7j8TmIx8bW*eTHRJm%|2#DuD*@nI^G&=<+l zE`>=q{GRMH_wO#;^JHNcx_xF3b)NNS``Q#LRIMc2ASTXq9z#~R0gmm93fb4#Uc31N zy?cB)Rf?~&C0U*<{JA?ZX+e9jl*eBVFMEeZ`K5`wB)Y8+E?_b>hGai;jKXzN1!w9= z!^8tcc8Q3L!o+5^jCP&Ij(^(ndS@VS6!*9I*c*t3*=G#>w9PaGB$1hk6K2s!SjeXF zUX`&GSyqc!$j+pxxD;bfzI47nzknG@>U$V@V%#i_fDQ#${&CJ+eZ*q<&S!u82;DJkMTlhx)fn(~S!M98FoJTV_rA@lvRA?4D7nyDBh3o6uuZPMd5>>+_DO~d_*a;8#Ha(e;&DzXWTB*2J zTZ#+Vd>qNSk74UxogRvGNsi%b28$Nr554cWp6}cUJWdpb4XD<{IXfW;iLCl6auyKg zteup-HtY?<{d_;JDpiNu8tc7^qKACpv)q-Rg&ZKR;?lPm@vVbM!yVgBNZ$|&mG7H; z?`nNWtwldrCq){i$Q}8ul{sb4sxVHx(Njam0p82U^XUq%GF8ZbaHZ%X+E=l zI4LP~2v`O6jUDwJI@;QS7keRtvSxe4k`FQ#Q$j4|gRjc3`(5>kUcq?+!v`B|0q8+Q zmyaYQxe!QbW7Ho0tOKcJDd7{;$m%Z?4_jb#or2f+&n$Lr)i|%O+J^DI-5*bx(634> ztE!Uil;mGM_b2V?Cv<|I>+?JwuA^rf^;^QsRcosFMR2NjW!|s1d9-J$>v4^B;_sB4 zvA$aP_v~tQ2hziIXdbRDpGX$Xwr`>6m@hioFS5`iL1Er#20=g<x(mQTU-w{^4@TvzJJ zy*1qH_ut!n`I;acZd!u;wuPG(cnB6X_zSr;SrRcp9gTu?MYu#?v<~SNd!^1KZ>9-z zDM`Hi2XY#CaC4Kx+0qLt8{1YDo8?b6xSNc&?a@NyLjvuf4cYyS4O!)bVci_>SW7!a z0MlIar{;cQ_o6#+Th|>%tI)ei{Kr>}Ds&WS`w~QGdF&;;CGEUYG!}Tn)C_Y&Ea$KF z7h1|N3T~~>0{b47(2TLHBD@&V!kMo-5TdsR-F~e~V`qFj-II*;L+0oP7Z6ias9d|VVIIfFKdjf)A z;}<`gUueC5@>p{J`vV+^M0YmGL2>khK&KAB^dz?G>7QWk) zN4JamyIy{QwnuB`xwp0!@BuCCfNVeYRW>#VHtv+{;e!+7(m zjc3@xivH3H-~E#F26X4nE7kQe`!Q3Ou0ZsUmG$|8WZR88Jo{BmzJr#ctev5;v6ah; zz2x=`^{4xe`WCHaAFu1WIy4`jUv{>2o+clg>|)*U+zzf(cTTU?MO)7n@2nkPs?9s= z-4qP;*OLXi1o;IVb@ps8&dmCcxGFxnPc)2G6rjL#TCTRPubm{{b+~tyx~s=Bx!Gw1 z4qf(*?b$i+7+<>8bk1B=&QE5%+O_Q6A>%w+oLwn&9_M7;3fj7Ctk2*5@U`snJ5vuz zZt3*kSmC3yHMpxN{(XMae>pm1d-M71(ACfESF)e4%fr;_PyF+#W6y`5KOavwKcDPK zj9<*lQnjxi8+hzwxoh6xeHEnly7_T&v3k47zhr55Gx1XGs`A=q-lQ=pc|qQ#zy4t8 z{@AXe=E!&8Q_|S}{Akl^^s%GLu7(}wJL8>Q#*6I6N|#GTZ|JYjw?oHCLLoW%*3;)U zTJy)-6+tTto@*ZME*kB8daY$P#NIzov!?nUG+ZqT@H!b6@fQX)fXEw98H-!SwykYG z2+VD#9D!B+ik90-JVT)R_mwkye;ib)=w))1i*Zp~*69$q!7LLK~qddu7^750$pKC4mPZgNp)MeY0BE1w!Zwk(e2 z;Em6Z-8xpax$iAMO~#(}&rUwf!2CL^_%-SA(6)ZjzQ6pGp&3>2>66H~fo{a&k7Ren zX2x_FcbJm)v!a;f&+T3_@b;^d^Rq*)UR9kMy1x3>c3JKl3tY&^a_%KHT<5gzn#9$g zW1>D=CZjCy?k`3y{E+QvG$P8Z%v>TqWM5c21CA%&m$tXUg>ATe;9u|sYA!E>tDSlf zs%iOT({vh16FFiI-xg7i?5RraoOq|WzsDlsoPW$_-_z7+5_acaK>B_GWB$1#7<-Y0 z;@M`-;kOMt6P<)`f^&bVa-e!0cN4xLNHQM0Y$mU{O<3sw-gF8T88|!>4d}!i@*1IQ zo%BnZkh^?Rx$KU6@5u8YYtYY1DFn+bzkTR842Y5?4RWSj_!XL;*Uk~sKjuIt7}#@#0ON|}!s?@yllQvp(jdn+%j-(Kw2J*!@fpOp+UkpulFKlR@l=+`_kimnXJ0E zP5v!X&ugRU$qY;iR-SWnC%a@CSF+xAvaSoFDAinJTDqd}bGD(#BwVozN|87r#GZ`F zFy#&(a+X;(;E5&GdmJPEbE+XEG-QmSQ|;MmDS?jteKkj+Sf9wr(EX--FXR7y= zVFq@)wGHR-=FgsGuLvn%<5A;4u`B%QBYi;@F%kCPaD!UbzZGFVAo53$j4wsxtd>epM{0bpnI@(7QWszO72vrL8c5j@~Kkkj0012F1qF|=wjJ?8sw>$l4_MK zp45Kc1_e`z9=PMKfbs2(3-G*!9zbp8K|A3-OFCuF1xd3EKcjVBv1U*jbBMVrrVO&z zZ9gw{C=&!v@B?=2pJ8)&5z*fu?vglxZdvYhdV*tkC&6Me8Rt#&2Hw-V;PX%Nt%aW< z?VF8{>Et@@Q!un&_p-jUS7v`*h}7COK21HUN9w=r3s0Buo+$AIycYa!40(IAd|~2F zKZx64E6RDV@Q*EPkE;W77xRJw{6;jUJS02w945POegZT7zJF?!-u>&xvbmW?^%fqz z;Q`6Xot(A>%tn3<;aM!y=Q>=Q5=CaUE^L=V;|ImgDF*XAZH8W$=PD>p}V~ z(s#x>qZ%zVvb>P}=f-1fQ_Kj?cg{AVXD)t*4D=(}8{?mY7^23XaIv$)k;Pc_2VtYq zELnV#VLUjl2a`mCle!vyPrG40tbqU zs8!}(#+7OO%+07cda1y@D*vco;Mn%rX;f^K^eb~q4s+Xm9kr~dSLU8BS}i6So6ULU zYBuI&_b^2H)}mvUq<5*{V=+>whA}}33f!5t>MtS z^RW{5I(NaO9_yBw;plWTIc`kSz8!W%_D%fCeNO zkPf^1lYj|DOj* z$~Vjj`}c!-+1^;2w<(MzT^e$0FkO;SY($*TpmMNpt?8$%jGkk2|E*ljw6-erSK1L! zs9l%KLUZwwcgsJ)lQNWH3zRYYE@sCGBKd02nff%TQPQ^{?Fg?CuH{lnK~xC)K`*m4 z0j4li$tD@FuvBRMG6x9b8M2R5!Q`hOFg@r31{BHYP|(n2DML@={qOry1zin#bixUG zn+`b$Xfdt&{2{|y0ho~auH zV9*hcBYBb=;=g?LYY0ET7VbMs4?;-E-xnlZwKLx?CiEYK*INn_*STmu{@$v2uyz+F zO`a0+`UJ4H44Cac615azT#kl2#?oaHLCoM4;0f@VQ(pFf9t*FF zt0pJA#b^aUt~M-I91LdEo~t~O?Okq>F}qx%cg+-9g1j~@n-Z#JiPb&^EH4@J)@$h& zH$`4Sr>4M3VMxm0Ko=aXHag!2827W^5cq}G-n^kCAe>{5FI#}83TZ$4mgL%PYWF7} z)yV;4c0l@7uP99PVD*<_g+Wmjz(9tu&`1R8ixp5rm?$w*E zP)@ArE3KHKtQ|212=|5q^N?+Of87b;2G&Rsy7`C~66&}u1DpUu?-aTIna46=RN3*G zfMkprxDRr_pusIKddu3`eXq3{&|#`QaWo-@-Uh@l1BXTPPW>Krh=uiP9kCb&dpOr@ zM6Y6qn}aMsl)Y>bc5I?&{Ed(0pM zHlKntD%pK+HFuZ$9Kj>_U*TNPU16|&;bmeb)#&(R!N_4UV7mIhg#mPxBaneIt@hhQ zT`;@k(?^i6D6%jk^hE|C^wSg;dmmvJ!!OG7INm;%#8?2H%DuiqJX|o$tAe}Wx8*^0 z&bOWC9biz$U}ds(GL96nk$3!;r*H1p0@?63COo#56`}x4!jS@u++ihVqV;R-M##F% zdw19z_WL6^Dm{CRrnY~}n!hLfxGs9b4mj3AQeo4`F43jxvFU>)M3wrf&q+6wMp8ph+}NtYA#+7 z7ZJ=W9EP;Y{)7z)Mn@#4#00V-oe{>;M0@A0fS;8{e1J>H1~>`)p?#fDq+^6V>jP{M zY0VWG6yk*&X`$-DezxJjpvwzBd!L2JMHKrEu`yj$WR4lCG7Mj5!9rtVP{>0AIfk+* z#|)_uh7`7PsIHYkfNQaAgWLV7j_UrYj*6!jb0fTW5a$dPSVPnb1SxV2EjfZDi23KwO3s0Yx!2tm%b7i-G4LC(+`? zcWVpy4BBKpOv)ca%2r-4LQ}9>ALZKx^M;Ja?d;{!{SY8LP`C~bPa!1;&WDhE>moUX z4@+|ZFcMm))bS;M$E0Y*B={rh%>t8p%ozoM4Y$K-AS;l`OzsWS6*V6r)~VSPC86fy zWRqn`lyF-?RNZCCyYYxnZ8&vHW(Pn$?(b|yW3<;V89mjKBTb&1mgsRD*U(ibVB}E^ z3sgb4-VaPK5t)N@b~`DAYzag45d`Gj9G(Gtpa(Ao@>|otB0d9j(ugeriUkK=nfb=8$YlbKsY%NTLe)ChxOc?~kTX?T8#p&~3^bZ# zw;^pY)d!|knUuQ?kN>dULQp_6+A3f?v^XE(NTvi@Vw*OUnf&U=%iu{nrBM(N4KYWT zyH(n1FDX|7@!l&6BJTml0Ub6wUEfvjCoFTUcXE#xo+bef|V}a0)Nv7GZ z&-pkjAE$^*7vEE*rI*{!tp(j=AMKv*x}+oaGEp96NF`BLn@SfG;i{--=|n4_n3t1d z|F$ee{w5cOnFTI@wV1f+OL(Q07xpNR<|V!+A+uQIU^0OSBd^P1BM<;(g{RV_GNwFM zf=(+coG?m|aWIQfI7MinpF#zO*|%`8+keUczj|CxY-Y#5n&GQCJLtr%kjPTia6>NeCgHkhL5Bvu(a>)`fjYASrc(0oVYUsfmz zghj}`C8W$AXlsOSh#;LxrW&&(R~!}FF(4|2KonpU&3h&=K&yUO5{d)WQN31Xcg)%o zdqYe?rYUBZBI#)Gq@8Cg>wFl(h0=znQ3fI+IR7ICk(wvpcCZf(4?P4t)b|9-~=U%G3JUieT zrm5s8nTZ(5iW~rklAc100K$3@IEcx0TEkKNeLzQWO<*9_f-SYo60i8AK6_SxMDKG- z4=_bBc(r}qr_vIKu{;)G#5Oi4Z}Da0KcydJuRK@PRZf%y2Nw;cPa@IjnXy8gNnD0N zT16~m1oStA)Y%2pv7thV%+T)l7{%HIiWo6v)*XRC>?7MMz~vvzIed?$H`dSu?N*vu z!pPQ3C^sQ9 z`P2UQ-G>M7_yIH zcdsdW6?kmi-fMa*|LQEG9A*W+B2%M3b<)H*u`c&FQA+M4*Ng|A3Oe(}&@7m{q<8zgtfHy^kPeJL9qdi4fnYRN-qfPN}==f;`%L?qqp0 z+}g8Y5YErrLv~IFC_p0N4cjS8y1hP~Kq$}fP$#!cPg7Lp@@w=K-JbXs>}l+5lYobG z&+fBzGXQy7v$&YK6;(xQ-7Lb62%o0}G_&JL1-P9dmxCs`$P&;yaxpgOXf`b#qSLDxs~#i!G-VspwudP;ragO%#l55 zz5qcIya=aiKIMbD(!6MUQ;T6V@fy=y^&Glu=sXB&R+jUMrHks4G-ZpM;6WrMWyz5O z$yhdQZE^2Pu(?TC_#qXNSE2hfww(PqgOk~rT0B6_3Odi?1*Rpd4pwtF0L!?ZkOX-q z#TUgPkMO5Wk+qxFCTmE*IF(rEOd_2U|BK+X_ zcW)?Gr58X9y5gFSv{j1?N2%Q*%4zF4TjHJO-EesdSTpe63&9g%uI$S-N)L8e6{n4L zf0cRA!USSkyGyP@L>R`Ib5O&i1<%{mkBM__!bF6{}ko#~BiBmT`h_MbR z&23-_Ufoj&e>F(TB13yJ+;WKfje|S_A1j$Fl<)!2TFV%S z;xI*QpPZUSt0WTJ)cWH1K&pjJla;eOd|rF zbzwk^MZ_w?2Pd*^&x*|2{3eq%gQwibi9$5eTqW5ngSkouuP!n@06Z6IW$BwcvQ63~ z!`7kcPmEsdZ!vAK1|AwhHecF}URAls#cg};b+;M3{3O#^VNXFCJ@C=QkOm68dxzda9~}ahNsx5Ufg{;LP1}wd=S(Z7Lu0OL}bF@&=){>nh{I|c@Z=V z`SlNgV*NV45m^#L_d>L8(m@_}|6dfTR8aaMZyqL|s z1y0WS0TqK}C+}2nwn8LD2|n;sSO~#Cv%Ygw*icjO>@NoK-I5)8kwa%VkeeLiwgq_BL+yB zM7gj*SwlF(Z0tiZRpJB9mQTADCKD4-Hk~OnZdke|idIX#6&l432~0JCRl&}oh0yjdD*j?UoI;aktZAW1OG%nWh!W7BSExl3NwMh#4iv?4jq$h zh>pie#6~*sJw=3~6>LqEWsfE%#bgxo(-E7P?V9ef*wY~+iTMT(=SKst*s>4#PYomU4B^gc@)`82l}Tc zRA@Nh`Fxm5L0fdd$&(Byv4;ba%V_zc(qUGk!(YBEWQ{npc;bUd=nKV(e0f+kLOz&_>*4sM+=C{7JLmEhfq1oWMWy(n&cRw-3DFFWYf{&iX2 zjMtQT5oKMg-gcd;yDj`n2wYG^%Hi-rMzgJr)*l#FrK%xYgYb4Pxh@2IkcS1e?R0x8 zyOiuenzxhUm>2>`)?0 z)k`W%Ms$pv2@2+n3#RhHK&ItE31LN>X)^~^O zd`hdI54%xp6lqp?VO`#1$32g-5mzMTi3t`7!Hvi4&SZK44C7_%iS#3!UiDzC>^uJ< zbB!yc#`iExJSzrhw`r5`o7>LMYazzFJ5_tH1S+N1{d6(KTd2qxgiP~8UdSX{BI%|u zepE+*_vwVANQsq>iv7g zG?Bqo{bb8n`fODLn5yEeoMQ6<3og4&Cs5gJ5I$UqnX$!e&5tH5G*uB);z74E>qY#^ ziU4lMcL$>KStukA1&ZSG3v&xDk4-(|k1VK5r=ynd=OfBoU8M%H;<5|sl#i-VJ}LX6 z&cEKNhFo+?Boxtb8D+&~77!O)23e+OEvj%8LujcN=q>0acOD!wX}w_ z?}CiuN7UBk#FLwBnviqcmC3gkBiLQ{Wpmsgz{#aA?wwW#jPV-Q>C>9RwOz1oa{+Ig z(2JgpyxHi7Q4THP#jg4|{$M;pUk3iP;rh=8>=C#l%RnctFYyTEVtQZ<-+N~>kda&B zg9SM`38?m=tBPyp83|~QzmXu%^BCx?h3Tu-|A3~b9$sGJxy(G>aBdo zzYmjHI}FDuwk#0LLU;Ekm_?SIcJMiWx?1i*bf=TZ4P7qQZ*%?=f&-8KeWB5VMT<}f zRp4x1i=85M6UuLqp*!+NmtA18US{SKwMWDvha$aZ;dxn*<>pHY7#fVLg2#+}QC$2v zfgPr!WC{=Cf*_`)P+!t#7EVB{0ZMk~$xsDF>sZ}*Q0jI_XGC54*6$k~eVJ8woz#GR zGJmaoNHIfDV(l+Qn5L`z@b~sr? zs^*IQ0gp187M-TxiA1_Db%wn!wP+5$z0Y}j>)io^c|nVABkp$_bu+ws6*e=a>rPj} z4gVY!r|z|EX$Pl*%az^?+Z?_SSGl1d!=x;8U1YoT+OO(zVDe6#Z#-w7X)bDo_z^$} zf#QEKIMy9X4o==Np$f#XzZ;kRMmAEa7~E0<#ysubv@7gIuEY-OIj5E^+MGg3s- zjg|&^a;>((g2?0fm}XmNMEENY>pe^#A6?Gfjt-mjJzg8nRkt2~PRkWJ&3hYQ-_>}w zYW({<%NO%n;5{}jzg}V|#Fv!(s#JKrm%7=ml)bw>>J|Sw)Wh!xeg09uSgG97%cHWV z!Mn-L&AFm!`HG5}>UMQk<)wMq3$eb!TWOhrdp>wcJ1W1nTj6u_wEk6cvEILuGci3S z+U(uh*?uF^x0c}5eCSDTr_#B;d2Q39ySlS=y;ys(@n>Qk{NeHRyy|Ul;m)*nQ%{4F z``g81-8%ia@A_zY$+QG#`wd(>tYrRN)aUOc-G*J`5w4c?FGK5_UE>)a?8n%TyveGC z@}5__Cx)LhtH-Ie_>5R}+3H_q@1(lLVpCIFkJP5BU)!l&9XyP08=1abO^pnTJw9!9 zHV+-g_$+nsu3N6=OvuMHPW*yCYSG`Q8hYx?d>UWp^l)`me}8?yeH^s>!D_8(uw^^d zzFUklRJE~uIFE(4CvMKQ>gx~NPlem6yxptqnvhr{(9~(2Q!!CP8-Jd~CK}b)?cY1M zQa8ADPV<^4xSuNh+?GF@=6rssZ+LwaynQ#T!>VmR?=M;0R5y97)n@TSD(jA zP9?65J7=5M%avEw><%(j-5+NQrtUZ|?0nbwICd;>Xxz_xZ*QudEgNesGy7M6Xnh^^X(M#8+QH{cxm<%as18J z+HLlOqYJm5n@sbcOQNl*`3*|zWlO5(rM}I()?tCSiJN`hlE$WXeswKM-DS(JE{(l% z)%>hw`{r8F?z-)xy~Dvlvz61m-Bz`!>(h45N_SqM%BOLWu1~M!MSV9P>fzAfWaO8> zpyAvqPcOe;bbU;Qys{p=1&OJ^insZnv@t8uQY8U;{t8n#FbQf+8|(as1N+B@QnHoFT(V=!LEO68Vk*^dVVgw4QQ4_ZfG|8MpCGV|L|`@|MG8)|KZ=9{^8#O|KZ;v|Lxy) zfBf5Ve4^jK{M+G=e-jfD5lg_Mlu5{i@e_zb1Q18I;sw=}ipHy}Wl>5jLppe2&`PO% z{dp$X`Cpc2%SG@s)FLOBUX~#1$XH7*F^m-3@sY*~eT1xe{!Dy*Mp?)*XLwAJSYV3` zcf={}@ZkRhaEKW{04~rg-2nO@0FEfWl*tEMRr~^Wr#aL`;?;6%6m)JA${dfKa0Z(} z1K$2uBJ8g%;y-T>4IuOyd^GfQ^6>n#4zf4*5$&)>5V;DYCC`6dM(ZCa2X%&>7Yn{l z&|JWE7|xe_+Y-_3!KD4rLl3|alO~4t=@&Y!21Xy6lJ;*%j*bzw644w+$}EoXLyOyE z&G|_sCuXP0h_i@3bvG<|LyGAThkuc095zE5oI?JMO#o3$UN(AN*xejIpp2)c*O19g zhHL!TnZ^5Hy6WZhJO~wCkU-o?5Tf-YEI?+P;9(PqK1ynw1SqxMz*CXJFs7}ImEB4! z9V~upExi5*eG5r@5zia{ta=U4z>~gy_+!)W;iA9E13-YPKa&4f<#8s9zuDwdVN)OQ z{%g|ZV-2=v%*W2~HDv@az|0M1g7IiYc5?U;`C@uYJB?JMr6}xmJh%Zs{8YC%;4K_zX@v5DyZxn{5_+(MOzjjSlyN}x(s4{4)# z33o=Y?!})D)ap3PBPg((bLCd{c<2szz(xTCZ-aw-djTu*ZtS%m-b^vA1K3v8566h2 zUk|3ah8)zX`f|UdrN!F%BhJ*^HpqN-%6e(W>OSl&;~@bygMPcI?z>^mfhA*Aru_Q6-Gu~MXC7!|ST&*_Mk}dgb_gfw}C09T$*9>ba>Arg}+}In6mdeWUtpwqO zk`)~&~7BvTA{9I3@RDEj1t zvr?|KBK)x3euL?S^r9Glk0(swjWBmR&wh5r;Y&4n=kpl1&XjtbQP5MDaFiHF{B$XE zoWG{CCzd<`*cG6^t`JOW^I%#r0|D}18UU#*!1@%Oyco$C{%!&W*Nb{Pa75vs4x!w7 zk22EuCd&kgh^HaHY$wB``o1F6iJFgGX0U)AfG;+5caaOoBN>P`c#q*|0M`W5f=Y)6 z0)a92SoMw9&z(Lia(+L}=Hn`x`89E7{155zMt}yy97KooC|BVt6>POzd!*CT7rjM* zHd!sb2^!vX)Fwcg9jp6zS+2tWJ1t&veBx6JYfNxzk{A_I^ZRwksJ#tDo+p(BgIY1C z7-|MKvOMkxfweAPu;gbgyr6GTn>LMlNX(&a= z!}O2N@a3@MfUA%O`?lcMV!7AvUYMc9XywkeJBsGRe6Rc;2Be)#zgvzmV15{R9_6a-EG|iQK7?c7ST@>FjN$;WxK} z34LRL$(yptupuYtWg(lF-W=>GhG}9HHKKWmMs63V`ZTz@QBymltzZ2}`kQ8wi#v2` zZr_Mt`O_G>Kp3JWe|MVIl5-h%gU!*B_3Nc)l!2^VX!1pG-|DWfX|vX#NBeApO{~yv zKxALfilHTm#a?_!LNiQDj|>cU66wI9uwbVrBN(QZL7r$1CB^s)jnYt@d4YG3d^6r` zmT3X9&9t+5K+9&pBEtU@b;ytTw&RTcgLDLR9Y`6yCQ#ax`VddD0NlLc(_Ahie>^6H3?j%}Rl|jgtJ&^e`6oivta>rI{u-5yr_@DuQ zJiY!GEM6L{k#1;dP;6aLjAUcS8_@0M`tp#I1cQ2laI^+7_ z3J6&O)aF|aSbyEbWDOMgLZiOiFdJ+4{nf?;-U#p`HVkl#fGFrsk}-j>N$>N2qK%Qq zb%9K9|GpOnq_l-2H#O40w4)6OV~Efdwm?Q0IIXK9nWK2o7Q-SD)M3~{*i?v9)b&1A zK$2gU7a3ks1V`r}3fHb*qUle%>j#8+i0POeH2LYJx^mc(^eF%n)u)IUn+`}wYgg1b6 z*D!Q?tl;lmztMVwX(Pj5;=}(U8v_5GY-}?SLojW1dqmwb`R8$@k?%5NBik`)>_ss{ zX}x~$b=-X=vw-XCuZM&AZ==-ZA;iHAz_=m2j`Fzd*F;oly6OUxIwx$Sr&7WVDKdVC z;qv0o;Ep~7#JpWyW#P$0JplW!pS5gV;-qGx4w;=q%I+=_yMKaBXT36lFWJA^Xm0$q z{QdVnZ<>p&E6lM079an*{rUkLVDao(r|e8*gpuL%?UX@T$lnI_RybILt`{9FoYbHC z9k*=FP(xZk9{(0k7*`D~xoWLEr~(br?n8oDyZhqZ2ZXf%JaIJU|3+-w{ZGY4a7rCA zCNwH1&PL^?-D=~WL7O*H>4h-AiwMRWdVh+c_!J9TZ73ntriI36uYivhLOOMRff-6E z94YjOgob_w0glar18(m@ot8K2o(6$_^rg_@UaS*LKtFL42&_Vg!eKZ#AILEh6p)yE z=mJe9jDTpX#bs}3Z-vn~+Xom1^<|N9(CIp(Kn(>08jgAc@GG#VB_TZ)xKR>9-sb$H zOq7vCgJ`yR4mJcCBDLubLo`vCA(rjN0EEmeQ8jKjB*jF(P5>ee7QTa=M3X1qr33IA zc)Rr|xnL5h3iLi+v%k`U*fVgL9+1fhU7g$tpTa0dGB@EQI*<@VWPI|Bw9vPMJ0v&( zS#eJP(XYb10H-WLfxVK@fq5QtM1z4nZt!YI3FqVBxPV`ZTyqxeQErH1mGZH+%rYcM ze5%2yD>l9K&@byO9bGKhC#8@ELlVq8$Z#m5>&{;-hGZG%^t?UrSG{)_CLnDxy;$&= zG_JNu$tQJYD3vg3$$%%58iV~INf=qS+-Y(Y^rR1y_@*9)0fYA%*dR*6O(EcV@hIG+ z^LrUT|1B_7p35|VZ)rjuYr%;FmuY%cMkj&H7_&q`v0|gdf;Ige4mYsgtP-cjw8dxKeAs3 zL&(;am`J8Q(!jo>!-3iEKxTZ98<5+Mat%7j$>w?vXR}~yvh}Uoy_-J!-e!t0sst0@ zRiM)zh+PP>E9{0n{abobbFdmrl6UECq@0-r14|8V0RtoB#{$)z_i!YSI2spW_ zm-SpE9xdJb=B(PO%?hEFm_)bHRP=FNI!PUuDsiMr$Edht!~@aooElUVv|uO(Fi{+7 zP97t-%>%=Iem|c)7bDFxQiKoJXTLnIi&+k5*Z*5v*Ik)#5l42E_=q-f_xl-(P$WbT`Ai(Yl9l1=IgO3W5QaYW^( zr4_FE+rn}Og}CfQ8Oz~flKwZuUbKiIAZUW-ia0nTkA34%yT^e!R_~0n{_$~eJo`so zX3&9W7n!A!$5j0q+}SrFL23CUeoc|2PJgIHH8UuXw&~Zd$P7TM5@?Odv2DSGZj6ba9^^0oL+7#I)8nbUtOiaTBdiG7S*(AwgFFZ;&_jxs zGhu3H8QSwgjq6oD4di2{Ib{|{}XPr*J0gZIX5;0F4L3YxOW8ghw)CRWGe zfvP92tJfntG)O}`H7IXw47djCDlJK5AV#nv#=x&8<`d(9vm6FQV{%^AaOU64=nJUu z_eWc>raRfc`1Qt~Qdz<(g-1_8fk-umSTo^K- z!!q5U9!;t=MKjZ`K;gwxh1UO#ijpdEH+FgyMV2PUN@!nTC99&LuR?u`XPG(`8{;cd z*E_~WvhZ=~^ZX2+_kh^V&v9htiWR=N*J{CeXqRY@a)bB2MkFr$W|DejJP`T+h-n1= zn`wysn`s2b%(efEX?TYEnEoQ2cQ&I4yD{o;)FL+%J9|f@9N+6rh>g^i!GiFTK_{0v z%e8fORBCQ7^wZt_l^r_pcm{L920s1DreZS$h-d-|Tf`e0aE5=ToZ*}p+HrJ8WOI7i zF$D0xU>dBl{|D26`46T6{hyhJ?c{%F8X4UGW*VZ}Gt80;pv-*#bQ(@C|8yEi*aoJ- z{Z@>^Ft%^PTTC&jM1Z)rMqCW z4jR}xXm^`00adq);Iso}sx zTY}evtR<&}MaHOjbiilJL8Zb09=%qia7N08o~D?OP(&Bw_Yx?MK^SFu|yE)7Oc{9W0m zkPpY^uzqFuG%Xb0;utN^sC@7s%={;^(y!?V!Wn_t*~;n;Vo~UB9zP^C#b}^HvmElO%r2p_@N$QV%O0BrXDXJ|8J>>`W1@$KdHw>A0C~NC+9v>+B7oN9RjhB zop%~$40#Wxi)nOreb=AMm&?d1CCLw+uPFnm4;{jB2unO{vT52b@eeO$G{*)C22r;xKFRNjL6Y zC-4@6nRwO*(aty?;>&G&Q;D?2V=!C0SGJ+};4;T6xOP-LgyN7-a&V)j#d&Y|I1VX2 zK$C%VPgZz_G)Er|7c^Tak9sQH-y5@~@#r(S78&kZvV@8Lpis!XXhX`>qXcOf zJZeWC$FTPoZZ(Xr)w|&a=u=?rrAoc4f_cp{Bqlnpp*6&$KxELD<->h8hI|-k{*0D_ z4B9*{d(FS$lJ_Z+LU1!r*F{Y zfQy;?exIFiKF7j9&NGpGRV*xCL}w5syC#L=iS=qe8gUpsf)eoF%C2TJxUEtT-Uweop#h`VcE*HAh_)2CVT*!UB`9%1>li_}0@-XEq3uIi`Rf?r{o! z_e%IDR1z-a0q2nzMGS^7&ngWbArm0d=EITL$Mr^7y87#i3{b*lbR33h4hxkuLIbC= zDUia(AmkA#W{CFU>ogiM@sZ&pjT>Uh196Lv41+QgcS3XaZIY{$qcT$%mu2HmjpScQ41HY|8aFEDJ zWf7F1RBuKWX-?BcR7<{V_0xr9Me%?>t^!uw%B1lZ3o8TsX}gJHoz@*DZ#E404p(ww(g->2^$m209&nW z7$kxsxq&B7jnckOOP&=qD+MEds)7fBDloDW11d|C9TMQ{>B?Woh&mHAa&Xmk%fFe1=JqOz)VmaEgIZ!db;!u z;q(`guCA%=m(97=8a*<=O4LhUb1nW#Z2%U)|7u$k92RCds{@fF?XV4fx6#Q3;xxC- zS9{0!R(u0@Z;c^Sj6BkGu|!)?m(`Iz)nZ8({4QY zAWU(vO}e=?0LGD@Y1}B&&3ld+EH-wHP>?>=1b$BxsVD5J-lK)mf+G|La~`!Vxm9&~ zQmj-%GRbZOQNl02FX=#vC`(8ibOD_l4DpYAhByS)G{dPb+g!LQY9&@Ks$2Gt)OwLb zlgz}dcrg^G=xiSKavI8sfb1EObIFqGwzj9e2_dq zEMvT*kd7$Dy`b*A-sXm#9!xi;#CJ^4*broP&P^S@0Rj{FOE{Yf6n5N^9MI@FKR_d7 z_$!Zg#Ky}PgLBFlTNxt&z!ayLK{o(|@|--a+Npxe#eg4Wh^7~4$8yQfU%!vV4EgGJ z{1LK$&Tr4wgVGjEoLTq8C@gI;Xok2l0A+R~rt=&CNhajnZM`^Y8^!Y7jCefSe!v} zQP!kK$pFS54uA#2Xcvqkbkt#qd~Doli5+@(ID2VGd#>t)=cASG&-JvwqRt-cX?`8v zZ=|ksdoeEV#JJlMVeCJ46VASP0Q>A#Ec0t&FD7?Al`2CX_t?TEop@;QN24T`DI9)F z7{-Bp^}A>ko&+=E=1OG2cgF>ahf&U##!xCxS>T4S*><_x2~M;u*saG0!%UB~vBaUG zvXF_Dblu@|BsCiI=c7I5?6v^9fEf@R_AcRYIYb>FGxo5;kWbjW$spzJLtRh-q>`k>x_T&=+tQ+V1iqM6kV zOTCulTKQ+g4Vlc!9^cHOurSIe5Ah9u7L|h&zwMy9?qrBhL=`ci%qUtZP*HZEtoWlp zNYk_sH#WO~MzC2!mo=|XoM`rWYMXKvz$*_H=UT~)BoHVGEQ-O<-$oT0bZX*$P#yZ> zCHn{AyOa8xbx|H{F!hgz4PV&==#Rd(Cv2ln8_Jb;rBlKvp(-%A9PoQYrYg@Xt<8HC z4Npu!Q4JgA)}{jm5Qrqfg;%@Sa1i4)f!g#=%KGAcDWK3`%MXl2>Zl`_qF9~#e?ZE% zH;I2iO1W!re*sScg=ndI4M_|=)4nxUS2uK>s~{4G4m!Z{X>;F?-tDTO1|z(feCSsU zFn~lbG5imLTB>{MTLx92HIIShR&?W;#yN+`FfG_hf^FwF*`rSn>oGXA7~CFtMEljM zcztQ~mA~A*MV)7oPtL<+12V<^BnBG6}Lr=s@nUkHsaEn=ldO)Nb$Q?s%p`ZB}|gY9TU zSFBKm67|1kYy)zt184aO%~BCXhK7_23JV&fWLnb~yDU9h2!UMdLy;FDU~qNYm5t(1 z1|eGXw22Zn{@A7p$T_vXe0wa|Iw2l(k3>RB@Z<#w65iSMezFYmNQ+Ds&qG4` z=P77ZYSDr5AvnZh1%g4626xt|FrxbtQzA^}9CF+{2R77Wx=!BW=fz4|z|omm;9DXEh`wqWuIg z8FR4V6>IFlmSAzgb-9kjYF!9cwRg8Ydxlh5tmTkACORRIEPi~?8q>#$ypq6?DEuB5 z(hTjDQ+`CUJGq}F+AUn6I@#;2JA@0LFO)@ui3nUKFuM1@4wKs;9;y{*tRN0OJb|4M zS>(50{YgUv_qjh~Y77dm5*k_Btp@@jEqmo|Z5bNCNZMFp4DA;TW9CYUh`i&or^Ybo ztwKu|L&U9R*f#-tcJ~H>VL)D`xwae)Gz?pX8}i!Cq!3xEv28B-I|Q(=(tNPVnN*Me ze^!=`Cobujrb>^r(?cc&=)(fLiA7a3G<3AJ7ARkB6dghonTte42u;DZ*=+)=a?(!V zJc-s8IE$@yqZ`bx++Ohpk1D_#Ue|n|a@1e27PzZ~BlsKA0;#FtTW3lVWbWg^@*{zb zisu8EAyPVoBah{lBDIS@^XVSE1gOWA3|0F$V4UMVoaTRP>?_0KXtu3MAh^2^F2UUy zEVu;;1a}Dp55Wfu5S%1HAZYO5?hNkk!6iU&_nGOB_ndp~bMC*de(c^=_3WzZ-rdzw ztJi)T=tX<|w~Vq9`|k3=3}eKlp4a58UZaXnVU{wGTywI!?vpUepBK>u>GqqIuA;Pd zQ8r$%rb1O;cLizm{*d;(5hUU^B8~DtT%!2D7M&G|>+nA@8v2_@E2&D1Mt>F8L;E)x z^HPR<`ORmFhaPOOkOhIke!<^xAAIP@YHc#x_Q5C8X-&+JR5SQ|5!iiP=v;!+Br7&l zqgy3g{rwaZXtht|F?Le{w%%WVKC?B>;xNu`q2TApR(zSj%0ITX?t5pC1C)G2Q?`u| zRa5>IJ)`8(E@{J@s;*G1t7reg->WD@Pgj!gCFu6(191;56_iZAI7B%|233jVbf$NTx8B5}N}b)7ojpOR6Gch~z`vEKz| zSv^^a$NlV3JV5x|{+*R)Z#_7rd)oL7M&897ecLhNZe1uc-_y;Y{BuS}Z?>mD>r0X? zRcYnHA-iWVdrwkCvd_SsndJUb#(}Xwz%_JpbGBml*~RD}G9Tp?X!noGc>-Fy;1ZEd~CaMT?c~y2?GDBLA|twgMWvSs~RPb@8A+aq#eE6I`9P(vVk6%cDHhn2&(# z#}mGx_N$xui!2VRN@MkO&Oob#vS)ZP!?R2*f#eD*2Uq2Z$x-jLXej*2^XEYFCIJ?1 z@vON1=lI%>{c5oF`5mwI9DfDV?h*W>BBPCno`(hS)t3XAB;bLS&Z3Rr#vef)Kw zO&(|m{5Mx2fPer16mTRL2uQV`k4yV!37l6TLF-(HK(d?gjKhP$rYDxd-AwF90qvZ| zRWBDC8O&$6237po1cS{O#S3{PGITNS241CASu*yH6}rV=f*vq`?}M~TOf`1jAmU5D+p&xxn;9IdIpyc-R)(hoU zD_Sn_G@4T_`ORKdjo5RHbw?scF?v?THal_Rgs%FHdZNblj@Y6Gl5u2^poL{uY2Y@t z=;Uo&oEB_)8N=B6k1=?WttT zuHTOgyDTie5tZ;ggI$}|XME_D{B;W01_tahxatVK6ddzW)&!b^v^&ln zM>~snp$%-oM=|bHGOpZx4)OVnrQq1MR+q$SF<<$mFr!AY)f!%oLsZ=~Cg$$HDfF5x z9QLJS5o5SVmhY^h998uA!kJ|{9%3MmYR_ft7k_zmIO>aQqDNhk($sFOA5C}eet(6# zaZOgOo;zu}!!?(^b=>J^+UNb?Zr2rW+2Bq7>4KlolNZxjwAn|OFdBJA9noXCg09c{ zEH{w0UM7v?+hN#(DvMdB?{(&JpQ+DnER=25<&IAy#bKFcftjK*2Y^~H$-W+$fpJ|^~JjXC%;SWJ^_Yq%yAenkIqkei3 zV{MR~u5op|Ij(W2I3UcmLEf>TIjoPoUpzu>tVDw{+CYXQfd<>@jWNODd8Pj0-Lt&k zz67n#EC%UHF^r8&6PDuDMdmfAjb#ajgt_IQ8n%n;JnP89)0Uz4NREPu>?j~I6^n-# zIsrIat4SPD4X|ZP-c+s=XYLD~+OYeBn zskq@h@r>}=Di%Bv1kneng@}0izj+N1nQ6Rj+7|igZVm41%i(FIXMg&e>~nAQ8w}Wa z0x66ZpO~b%Vrer6M*9qo`k#Hg#(u@vP*9KSc#vO@t5xt}V-Mb?ibfokESs#I#hj-2 zHcP=Oql7;qyOpg53zv<6rz}DhtT>%yQp}mnNv+V!j4_0{i@h+YFugam!@luiGsl>q zKzhIOy}c;2E$IM85n*BBq1PV7Y8@T$_GPUzsD(1EQv=5%EG@Yt zmt#z_wcg4ygI zD(EG1ho0rW4CkyY^|LQ(7#&BK2D?M%m$#ZP277cznIz`7G#uji)*!f#$>~F*a?Js! zDU5W_|HcJN{t|*OOQX!K)P7lizjx`P9eB9QN*EnVtnSz9@Z+hJB zUGC&n8jF+*?vgrA&!N&fo;nMOtxa;iHwMvvuRime68c9e+uNi6GQyc&vy1z#%xdAPwh=q5ymduAhea%leG;8NF5C+v0B?6xx z^LW)-e29GX)93Fnn|dE&xy#-**JrlAS0*$9br^#nFtZJ@ijW zA;ctd$Qv;?5L3S1NHiI%wwo7p8ZgQjD!^^N^~3$Tqo# z?Ib<~?y`90eWGxf;Vsrr*qL&33CeaHBX{3`Ws&W<7k)F&`&tq5#TSzFQh$DaUR8wY z`QEAeCUEUB91`yMS^ z8OMa7>~Qsdfve_$O7a7NeK&hD;p$b=A=$K$thDyDVQ!&Kme$UE0=rqQ@@&sEU9Oyx zaN?inz7?YCZKDYGU!I`%1-#cm?^|#Wa=Y6`tNY7leg?g@F+TN9 zwc8WhhOYiySdY6H{Sor<@XH_JF{GTC{8qLq5-=VyoMOm14JYjbXTJ$ynB5GI?H(8r z`pxJt_%*1C_ve-vQD1Z{QRo!?*X_=CY(MoIVKfV;1oo?9;xLGUaAq~V9lKZ1{l-`7bBX2`pucM`wqNV!oUsm@8-SKVX z#Ck5-bmF|&AGGh8is!tblPt0`{q`eKlDdOLB`wkg{c%jx`R=}*x#P;7|32GP(8u{6 z^1<K)kW*V3j)%E&$Nx|B?b+qry#7HAes=#KHxDWmpaU3gbzY zPXZ##Ra6n#KKJ$0^tYEd7hov8N97%We-ClD)E@yR&ZjP*DM0<|Dwm3c|kYdv*^1@m2Y^+5g`dDqo$S!tPP;fvF=v>;l-D4ov~F zxAXoPx6?oE8ntCmp6j?yesi5%_uT)VJ%R?4%>2_i=vbfu##8g!MO1e7_w%WZ?@Iaz zyGMwvZ*E31V8HQ!0BQs3VBjPe9%~2)g$oW=e%LD&VaX*(QyP#t!wE?xhH+=(D4o^} zt`oMd18L;IdgTet-Ad$>@msj7t-Ir^ZD8-t0R|w!EBoOypB}SK_at=kti1Ip!@)|$ zxf{nH3nZ<#0Y=H5m5WA<9Ey(v?(l+%!25O5lvMsZhfQVzIqdQ!# z=Q(ZH-Mgl1FfGA~M3h|AW^4Zn!fiW^! zmVP(9_M!rJ2V);9MQ?*#r=u>n^!_z)R9=odyXn;FrqtA75o-qC0DyMhl=|$X3y4v} zia|zXW7)?2%K!}DxXcJiJiLan%e`&F?nQ7yXLG1&sDa=K&h@e#MGl;=Y z0KGLKBA?f5DT_vumX0kh9+@bG=*C1>KmMGxCpC_2@?FFbI25RL9d((gSNmL1Y_U$P z4*T$T#f$I3JeOioh6K~}1b!}b)n5HTKK8^NN%n^0EyC4Sb{z;vnSk1(*n-=Se+wK6 zL^lUM1vuFll5#`p+vxova0p~=I!}*2fO-=?4N}x7Sx)UQzM6nD;GS zxLF0B9~f`fF**_MP2|(@m-ONO7F&LtSAG0hcN(hTW^2%61KZtz#(IrbvB|z)wf1|( zfd-6DEJid%GS+raBMGt0fAPNwM9sT#BayzQ?rv?siNfl)lyx6zj$nm$f%;JZgfG+f z{XeAg?IKX2wKkIX#k$I5iVs6Vs1To1+11^m*()*Lbr^;il znbN(Uf*&@>^<4i*g+A9>YI8;lHp!(oOtDzK8#1aLxjCp*oTy7=HWzv0Cjx!WNKr@Q zx@y=B!U0!lHyiJ-lIP;Va?WR*M#=u@8?`2Ks)Kn6B;n1$D*scnqd+G=I1Ik0v} zVVnnI5D$hb7(Ox%`wTVnXytrdwh-#{pOV$=S#&YRW^GmRu`PMeBaD(%GY&rp-<8Rd zNJ8zJ6>5|0Q$XrFx$A$Z8X zSQ)05W19P`Em@+o(n?j^CgLJ63yCq-XdAcWdY?MvoQ~=hs+_FA9!I>p+LDD)%&yws zx_%{doE7Vw;@Xn5Wc*!AbI+k?B+%Ve3RbQRYyD z=^9T1lh>DK(+O*wuPrYc?3>w|*0cC3!biShlE`Y6;|i9$?4MecyoXb=FReA!-?Ai^ zQdMN2Q!V@1MSAlZh&ir?3m04${;n^OuMW^Ioo0t;a;kZ}S-rZDcABbuA0slzRqT-Q zLnF+{Sp0FvroX~Fm}q29+&mR7zv`{w`11Khi;Y;&l#N?2}g(JgqRF-mRBq74x%^I&2NyH+TlrZ zq#D}1{CTaxAl^A9L8}|3_bCW!Eqsq6W~E}qVY{rVP26LcBtOT%_|2+zU|(xG`AR;LEXa4N@x?mcDDGSnELu<_xbap0_l0L zG$`iLwNlyZMgqhh{YQYoyuST;V*1On3cH&qYwv;bw7v_?8EmN@^1(Ut(hYgD%HJLm zRxr^Y(-$CJszLtiwkHPry@s7*Y?!W%P-81s>2h=(SD3W#VECbROI2BF^nQE$X!xC{ z(n$dyIk!t7YNUGMYELcpcXOE8U%KCgzYEYJQ^!5A>JiCkt*im zQqt!2+prXEYM7FUc>lYz?9Xtpm@V0PHj@JZY+wSdvP;xSUAE)H>v5b=-Ptzd!HDKSk{n^`$ zKFa{zmAcAo#)T?W4jq%8Ej$PRA7zzS+rhC4udyT$A?MB^wpiptV+nFhS3*QsN)rSK z_hemIgf;a2IV2iTR6s!|pi>COe`W+SLIO6iCBQJEIAE~(^Bt%r^iGS=3j?NvUSYEV z>cBL&zKXoPc?bo=;0o2Cr?X5JY~@M90FHvuU4#wd{YTMa7}UaA+zs_AM~ySgzkYP- zz=~!}f}#9UeF`qr8~9yo>1)0DCtncVbeJ+8gH+VjKgvY8l3%E*WblPT+~&JP8Ys_N z-VcIlS!Fc(%pc0`XW8!N<{Gd@6&RYC5{wnY2n9I5>^eZoA$o(G1)SgBQp(97a1Dh} ziTl0PqJjQeMYg~FGO`9()6N9r_c3y>8H9+(Aopsdw}mpYtOhtQEC)pt!g&8sMFhyl zqG{dI?S_5FvyyH^zkDk$T>F7S=Cg5kM@=smXxGz&h7W{&5FxvIri`}*jsoboWUw~C zYG8oT-kWtCD1O@u`I4iy0WOsWwl8}sPwzqIu9ZA@Uq|n=@v~a5?m>@v;6&7OP%i`@ zkcFZBuQGABK>_OZ$3K;ALp!JK^`C!!+7%{+eneLl=B2@giqJJVy96iQC8Vd_A++A4 z-~%e5q@9rHyZdaWXE|Hx5O`4(2xu;7(mErm8rqU3>a&(?!oWx0?y{6@G7dwsloaia zo+sewu9b_Tq4y47oO)WWYU}91*rv`Ku)GqDrHzb?#`l*y!l*9Vc^v>_y*bbRd*}M( zc2^1vDDV}XD<0U`gAgh}=C7}`2*8N{b+G5x%(MUTcot!|uH3)<_a8?Ne8&H`*Glun z&a(}yt=*ozs}`aDXq^eqB@O{>EUj`7Ae!B}{{D@J^Kjem>ecrU)JK+85ilYS zFW;$1GJW9oN^4>Jii~Xo%}@`piuLhi5YVQOv2NTzeot8Ws3=cG*^E6^pQJdgFkWH- zNrMj1=1mk7Sl)#2l&=`S$WrQ28Rk&gy} zYF?=f=Z(C2HuUmhQI$Hqt4?J0jsKg}^od{1!+mQ-GmR6;GmSgv`^(;~=iU$>zi(1b zY}5CSjjOKd{*`O(<+obvHU-14+AF1`D1@@T`FZAgJmJTewKHGG{U6l*J(nUSZ#LGN z=2s81Ny`(GYY*-wM?2RIwhvzK{`51^$K~M%m6Dx3A|Xhzpbe^-9`Nf+)@x*TV~L=- zxoqiXQGGKt)^~ef5m(nw0i71e;%X7iH@o_{7k7GM{z{i$UfLJ9Uzc6&pOuM41Z;k^ zG=b~g)f@R-v3&}rdG6g9X0-`9mk0QwpO~E9Vs1cGHIoPcwNTP-;0?vY1lCBI{Uq2N zRLOYP_@E7;R~H6fu@cfxjyitRWoV@zZDcQpkcio%G#Av7sK$y}wp>5Jk>$Zgou^x^Roo}F zy}7TG4~H52bp;R!>Mms40E-;a1$Yptf#v%US_#vOk5v&t1k$xxjhba>k8Vvw>>|c>OP}sV_o?Y!@yYPKAt?Iyr=0FN447(rWamdL?hR< zA7&22Pd;W4+9!7_RlNe$cRD2DL%9SETyJz$E8u8d$0sOr`TcF}JbX(u+N zxjL3`PSO4h>b`22$!`mQjvQa=atZ@Vqz;4UZQ~)u_t`iVKyqwL%sGTGcVrCGh33SJ z+>jyHzUKOP{53>O2{B3%#Fejd1tU}Z!;Brw24t5N%fg|hM_Vwh(A{ic=8i6H2=DO6 zer>i^Z;gvqcMBG0WMoR6wX{Jl-;4S0f#Nf)thdul(c<*4Z#Y;B*colY0V^9||K3`fil+!tc=-4~s8sj{@0Ua7iSER-CcPY0!r z3>lU7wb$pK1TotGG2%*SHBWf}L2|@|X~|yhgb|j^XU$<;n|)20niKCQWjA^}TQj?n zHTp91OF?+ByEUfOpQ59rL25B=h7U9ym9jK^u#~`#R$g8!mDfv6*phse;WvwQq_lSP zgGgD8X8x=OQ_FHOHm$-bK>_=uE)F_*qVt*Ura7x8(C8rre>l-!?J%9Dft9R_ zbIk@+KYMl)lHbWKUalUEhuJpAit^GmY zqC5g^i#zgD(cD%DL(*QoU$epuM`g@%{u>|Jo5T7gES-wPjBomSHRok-xISgFw$@Fj z+YV?g7;V!B{(e_KT3GVB^0&_1Vv0XfCwu8wqw6I6h2XMG_Ea&YMm(QHJDO{)wN#z{ z6ZMp_+i$UrNrA)p!_9g{Bhs--AkEyJKHQ3$km(_%?uZ0(`ZlxP~wgn*({bB7CQ(LUVTGNliXAzwA|(W4nrqWYwWIB-ir z4v*eu-IUvwFKpY?CH94m1mz#9dM-hFavPeE>HOfJr@l-1PXN_$t0hP%-sH1Rt|wZJ z=YB{P$!JK5D5gk!4z%|Zw?Wh2kuyEz*P$D?yB{%?HlZHeO^At?6yJc)+SK>pA9&iV z!J5US!+q16en%LjumAAW%GCGh>W!{F(%TFn6uBl7mbH~=uSpSC5=JwVD%(~iNg49< z>lmlL4UBDyFQvvks>$N2gaan{8;Y%M`rKdY-iQ`Zku}A)X$oopRG^u_&2Q~qD1&V9 zO4JEpuobf(q8{<{3Oa%&BK-Uh<}A#!bd^zQ%zI&0$z(!+{h-+QRe|MV@)72&S1vNm zO4y0Tv!_4QTQ|8pl(UuCb?3kA8O^*)+?!M_-WKRNqC{S5p?$xqSgy0;)wV=b*_heb z3VTmhQ}tCQZ)GoXCyXre#V&V;wDgIHt;chY`?tf=8>2LM13_994mk#VGaWx8O1F_t z{)P~@R}mYt&qJ?x4lVDxBEwtWKlXRld5KHO%m^fBeZ5PX+t=K6)W;&7#by75IgrE_ znU4GAh^yRQc)d3MGaF6>pGCG?9-~9n;tb2iOask~>#({-tUn{E40Qzd`_Cg^%7I1= z^0b7Js2fR@*Ly&Lvo=sVToL{N#&|fUrDqqu+4r>O%?A3~<;5O?!O_&vKxbA62P~{t{#GWNSG076WhK?44 zTMG?cGxoz?wG$55`B09);knaEPx{T>r{6R7`J{7Cn#0QJ$JmM~Dx4l#-LeoDyYFv= zFcU!(dF%->{hg9~=Daxmuo|-p(u32%m}!X`%iF8n-4il%#D3rH$5Yfv| E4_+_N>i_@% literal 0 HcmV?d00001 diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java index 3d2de299ba..3b7004ddad 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/AbstractTestIti119.java @@ -22,6 +22,7 @@ import org.hl7.fhir.r4.model.Patient; import org.openehealth.ipf.commons.ihe.fhir.IpfFhirServlet; import org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants; +import org.openehealth.ipf.commons.ihe.fhir.iti119.MatchGradeEnumInterceptor; import org.openehealth.ipf.platform.camel.ihe.fhir.test.FhirTestContainer; /** @@ -31,6 +32,7 @@ abstract class AbstractTestIti119 extends FhirTestContainer { public static void startServer(String contextDescriptor, boolean secure) { var servlet = new IpfFhirServlet(FhirVersionEnum.R4); + servlet.registerInterceptor(new MatchGradeEnumInterceptor()); startServer(servlet, contextDescriptor, secure, FhirTestContainer.DEMO_APP_PORT, "FhirServlet"); } diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java index 1347b5413b..2cebefa566 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/ResponseCase.java @@ -15,14 +15,19 @@ */ package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; -import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; -import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum; import org.hl7.fhir.r4.model.HumanName; import org.hl7.fhir.r4.model.Parameters; import org.hl7.fhir.r4.model.Patient; +import org.hl7.fhir.r4.model.codesystems.MatchGrade; +import java.math.BigDecimal; import java.util.List; +import static ca.uhn.fhir.model.api.ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE; +import static ca.uhn.fhir.model.api.ResourceMetadataKeyEnum.ENTRY_SEARCH_SCORE; +import static ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum.MATCH; +import static org.openehealth.ipf.commons.ihe.fhir.iti119.AdditionalResourceMetadataKeyEnum.ENTRY_MATCH_GRADE; + public enum ResponseCase { OK; @@ -30,7 +35,10 @@ public enum ResponseCase { public List populateResponse(Parameters request) { var patient = new Patient() .addName(new HumanName().setFamily("Test")); - ResourceMetadataKeyEnum.ENTRY_SEARCH_MODE.put(patient, BundleEntrySearchModeEnum.MATCH); + patient.setId("Patient/4711"); + ENTRY_SEARCH_MODE.put(patient, MATCH); + ENTRY_SEARCH_SCORE.put(patient, new BigDecimal(String.valueOf(0.95d))); + ENTRY_MATCH_GRADE.put(patient, MatchGrade.PROBABLE); return List.of(patient); } } diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java index 8243f0360d..f0d9466a4c 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti119/TestIti119Success.java @@ -16,22 +16,20 @@ package org.openehealth.ipf.platform.camel.ihe.fhir.iti119; -import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Parameters; -import org.hl7.fhir.r4.model.Patient; -import org.hl7.fhir.r4.model.ResourceType; +import org.hl7.fhir.r4.model.*; +import org.hl7.fhir.r4.model.codesystems.MatchGrade; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openehealth.ipf.commons.audit.codes.*; import org.openehealth.ipf.commons.audit.utils.AuditUtils; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirParticipantObjectIdTypeCode; -import org.openehealth.ipf.commons.ihe.fhir.iti78.PdqPatient; import org.openehealth.ipf.commons.ihe.fhir.support.audit.marshal.BalpJsonSerializationStrategy; -import java.nio.charset.StandardCharsets; - import static org.junit.jupiter.api.Assertions.*; +import static org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants.COUNT; +import static org.openehealth.ipf.commons.ihe.fhir.iti119.Iti119Constants.RESOURCE; +import static org.openehealth.ipf.commons.ihe.fhir.iti119.MatchGradeEnumInterceptor.MATCH_GRADE_EXTENSION_URL; /** * @@ -55,7 +53,12 @@ public void testGetConformance() { public void testSendManualPdqmMatch() { var p = new Parameters(); - p.addParameter().setResource(new Patient()); + p.addParameter() + .setName(RESOURCE) + .setResource(new Patient().addName(new HumanName().setFamily("Test"))); + p.addParameter() + .setName(COUNT) + .setValue(new IntegerType(1)); var result = sendManually(p); // printAsXML(result); @@ -63,11 +66,13 @@ public void testSendManualPdqmMatch() { assertEquals(Bundle.BundleType.SEARCHSET, result.getType()); assertEquals(ResourceType.Bundle, result.getResourceType()); assertTrue(result.hasEntry()); - + var entry = result.getEntryFirstRep(); + assertEquals(Bundle.SearchEntryMode.MATCH, entry.getSearch().getMode()); + assertEquals(MatchGrade.PROBABLE.toCode(), ((Coding)entry.getSearch().getExtensionByUrl(MATCH_GRADE_EXTENSION_URL).getValue()).getCode()); var patient = (Patient)result.getEntry().get(0).getResource(); assertEquals("Test", patient.getName().get(0).getFamily()); - assertEquals("http://localhost:8999/Patient/4711", p.getId()); + assertEquals("http://localhost:8999/Patient/4711", patient.getId()); // Check ATNA Audit @@ -84,7 +89,7 @@ public void testSendManualPdqmMatch() { EventActionCode.Execute, event.getEventIdentification().getEventActionCode()); assertEquals(EventIdCode.Query, event.getEventIdentification().getEventID()); - assertEquals(FhirEventTypeCode.MobilePatientDemographicsQuery, event.getEventIdentification().getEventTypeCode().get(0)); + assertEquals(FhirEventTypeCode.PatientDemographicsMatch, event.getEventIdentification().getEventTypeCode().get(0)); // ActiveParticipant Source var source = event.getActiveParticipants().get(0); @@ -95,7 +100,7 @@ public void testSendManualPdqmMatch() { // ActiveParticipant Destination var destination = event.getActiveParticipants().get(1); assertFalse(destination.isUserIsRequestor()); - assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient", destination.getUserID()); + assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient/$match", destination.getUserID()); assertEquals(AuditUtils.getLocalIPAddress(), destination.getNetworkAccessPointID()); // Audit Source @@ -107,8 +112,6 @@ public void testSendManualPdqmMatch() { var query = event.getParticipantObjectIdentifications().get(0); assertEquals(ParticipantObjectTypeCode.System, query.getParticipantObjectTypeCode()); assertEquals(ParticipantObjectTypeCodeRole.Query, query.getParticipantObjectTypeCodeRole()); - assertEquals("family=Test&_format=xml", - new String(query.getParticipantObjectQuery(), StandardCharsets.UTF_8)); assertEquals(FhirParticipantObjectIdTypeCode.PatientDemographicsMatch, query.getParticipantObjectIDTypeCode()); @@ -120,7 +123,12 @@ public void testSendManualPdqmMatch() { @Test public void testSendEndpointParametersResource() { var p = new Parameters(); - p.addParameter().setResource(new Patient()); + p.addParameter() + .setName(RESOURCE) + .setResource(new Patient().addName(new HumanName().setFamily("Test"))); + p.addParameter() + .setName(COUNT) + .setValue(new IntegerType(1)); var result = sendViaProducer(p); // printAsXML(result); @@ -144,7 +152,7 @@ public void testSendEndpointParametersResource() { // ActiveParticipant Destination var destination = event.getActiveParticipants().get(1); assertFalse(destination.isUserIsRequestor()); - assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient", destination.getUserID()); + assertEquals("http://localhost:" + DEMO_APP_PORT + "/Patient/$match", destination.getUserID()); assertEquals("localhost", destination.getNetworkAccessPointID()); assertEquals(NetworkAccessPointTypeCode.MachineName, destination.getNetworkAccessPointTypeCode()); @@ -152,8 +160,6 @@ public void testSendEndpointParametersResource() { var query = event.getParticipantObjectIdentifications().get(0); assertEquals(ParticipantObjectTypeCode.System, query.getParticipantObjectTypeCode()); assertEquals(ParticipantObjectTypeCodeRole.Query, query.getParticipantObjectTypeCodeRole()); - assertEquals("family=Test", - new String(query.getParticipantObjectQuery(), StandardCharsets.UTF_8)); // Audit Source var sourceIdentificationType = event.getAuditSourceIdentification(); diff --git a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti83/TestIti83Success.java b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti83/TestIti83Success.java index 89ac46440c..f066f1e589 100644 --- a/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti83/TestIti83Success.java +++ b/platform-camel/ihe/fhir/r4/pixpdq/src/test/java/org/openehealth/ipf/platform/camel/ihe/fhir/iti83/TestIti83Success.java @@ -18,7 +18,6 @@ import org.hl7.fhir.r4.model.CapabilityStatement; import org.hl7.fhir.r4.model.Identifier; -import org.hl7.fhir.r4.model.Parameters; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openehealth.ipf.commons.audit.codes.*; From 9fba5d8d7f066649b7af96e546d05919ddc95751 Mon Sep 17 00:00:00 2001 From: ohr Date: Sat, 14 Dec 2024 11:57:05 +0100 Subject: [PATCH 04/12] IPF 5 preparations: update dependencies, remove a lot of warnings, javadoc cleanup Refactor Audit Builders Add AuditMessageQueue for Spring RestClient --- boot/ipf-atna-spring-boot-starter/pom.xml | 12 +- .../atna/ApplicationStartEventListener.java | 6 +- .../atna/ApplicationStopEventListener.java | 6 +- .../ipf/boot/atna/AuthenticationListener.java | 9 +- .../boot/atna/IpfAtnaAutoConfiguration.java | 3 - .../atna/IpfAtnaConfigurationProperties.java | 3 - ...pfAtnaSpringSecurityAutoConfiguration.java | 3 - .../atna/RestClientAuditMessageQueue.java | 114 + .../atna/RestTemplateAuditMessageQueue.java | 11 +- .../atna/IpfAtnaAutoConfigurationTest.java | 7 +- .../IpfAtnaBalpAutoConfigurationTest.java | 11 +- .../atna/RestClientAuditMessageQueueTest.java | 145 + .../RestTemplateAuditMessageQueueTest.java | 28 +- .../ipf/boot/atna/TestApplication.java | 2 +- .../ipf/boot/fhir/FhirApplicationTest.java | 1 - .../handler/LoggingAuditExceptionHandler.java | 4 +- .../audit/marshal/dicom/DICOM2016a.java | 4 +- .../ipf/commons/audit/model/Validateable.java | 1 - .../protocol/AuditTransmissionChannel.java | 4 +- .../protocol/NettyTLSSyslogSenderImpl.java | 10 +- .../protocol/NioTLSSyslogSenderImpl.java | 10 +- .../ReactorNettyTLSSyslogSenderImpl.java | 14 +- .../audit/protocol/TLSSyslogSenderImpl.java | 35 +- .../audit/protocol/UDPSyslogSenderImpl.java | 8 +- .../queue/AsynchronousAuditMessageQueue.java | 6 +- .../audit/queue/JmsAuditMessageListener.java | 6 +- .../commons/audit/server/Rfc5424Decoder.java | 9 +- .../commons/audit/server/SyslogServer.java | 5 +- .../commons/audit/server/TlsSyslogServer.java | 17 +- .../commons/audit/server/UdpSyslogServer.java | 19 +- .../server/support/SyslogEventCollector.java | 7 +- .../support/SyslogEventDICOMPrinter.java | 20 +- .../unmarshal/dicom/DICOMAuditParser.java | 3 +- .../audit/AbstractAuditorIntegrationTest.java | 6 +- .../ipf/commons/audit/AuditRecordServer.java | 6 +- .../TLSAuditorFailingIntegrationTest.java | 2 +- .../audit/queue/JmsAuditMessageQueueTest.java | 4 +- .../unmarshal/dicom/DICOMAuditParserTest.java | 9 +- .../ipf/commons/core/ContentMap.java | 12 +- .../org/openehealth/ipf/commons/core/URN.java | 5 +- .../commons/core/config/ContextFacade.java | 4 +- .../core/config/ExtensionModuleFactory.java | 10 +- .../config/DynamicExtensionConfigurer.java | 6 +- .../commons/core/modules/api/Converter.java | 2 - .../ipf/commons/core/modules/api/Parser.java | 21 +- .../commons/core/modules/api/Renderer.java | 12 +- .../core/modules/api/Transmogrifier.java | 2 +- .../openehealth/ipf/commons/core/URNTest.java | 4 +- .../modules/api/ValidationExceptionTest.java | 6 +- .../commons/core/test/ConditionalRule.java | 4 +- .../core/test/ConditionalRuleTest.java | 2 +- .../core/SerializableEnumInteractionId.java | 2 + .../ihe/core/atna/AuditStrategySupport.java | 1 - .../atna/event/DefaultPHIExportBuilder.java | 38 + .../atna/event/DefaultPHIImportBuilder.java | 39 + .../DefaultPatientRecordEventBuilder.java | 34 + .../event/DefaultQueryInformationBuilder.java | 28 + .../DicomInstancesAccessedAuditBuilder.java | 4 - ...DicomInstancesTransferredAuditBuilder.java | 4 - .../atna/event/IHEAuditMessageBuilder.java | 2 +- .../ihe/core/atna/event/PHIExportBuilder.java | 6 +- .../ihe/core/atna/event/PHIImportBuilder.java | 6 +- .../atna/event/PatientRecordEventBuilder.java | 2 +- .../atna/event/QueryInformationBuilder.java | 6 +- .../ihe/core/chain/ChainException.java | 1 - .../commons/ihe/core/chain/ChainUtils.java | 16 +- .../ihe/core/payload/PayloadLoggerBase.java | 12 +- .../commons/ihe/core/InteractionIdTest.java | 8 +- .../core/atna/MockedAuditMessageQueue.java | 3 +- .../ihe/core/chain/ChainUtilsTest.java | 12 +- .../ihe/fhir/AbstractPlainProvider.java | 6 +- .../commons/ihe/fhir/ApacheHttpRequest5.java | 1 - .../commons/ihe/fhir/DefaultFhirRegistry.java | 10 +- .../commons/ihe/fhir/EagerBundleProvider.java | 3 +- .../ipf/commons/ihe/fhir/FhirProvider.java | 1 - .../commons/ihe/fhir/HttpClient5Builder.java | 6 +- .../ihe/fhir/IgBasedFhirContextSupplier.java | 6 +- .../ipf/commons/ihe/fhir/IpfFhirServlet.java | 8 +- .../commons/ihe/fhir/LazyBundleProvider.java | 17 +- .../ihe/fhir/MethanolHttpResponse.java | 2 +- .../commons/ihe/fhir/SharedFhirProvider.java | 6 +- .../ihe/fhir/SpringCachePagingProvider.java | 3 +- .../SslAwareApacheRestfulClient5Factory.java | 20 +- .../SslAwareMethanolRestfulClientFactory.java | 2 +- .../fhir/audit/FhirQueryAuditStrategy.java | 1 - .../fhir/audit/GenericPatientIdExtractor.java | 4 +- .../SwissEprFhirAuditDatasetEnricher.java | 6 +- .../audit/auth/BalpJwtClaimsExtractor.java | 26 +- .../ihe/fhir/audit/auth/BalpJwtParser.java | 12 +- .../ihe/fhir/audit/events/BalpJwtUtils.java | 14 +- .../AbstractFhirRestTLSAuditRecordSender.java | 11 +- .../InvalidUriSyntaxException.java | 1 - .../auth/BalpJwtClaimsExtractorTest.java | 69 +- ...tractFhirRestTLSSenderIntegrationTest.java | 8 +- .../queue/FhirDelegateMockedMessageQueue.java | 1 - .../fhir/audit/server/TLSBalpRepository.java | 9 +- .../fhir/extension/FhirAuditRepository.java | 4 - .../ipf/commons/ihe/fhir/atna/ATNA.java | 1 + .../ihe/fhir/iti81/Iti81AuditStrategy.java | 3 +- .../fhir/iti81/Iti81ClientRequestFactory.java | 2 +- .../ihe/fhir/iti81/Iti81SearchParameters.java | 21 +- .../translation/FhirToXacmlTranslator.groovy | 2 +- .../translation/XacmlToFhirTranslator.groovy | 2 +- .../ihe/fhir/chppqm/ChPpqmConsentCreator.java | 2 +- .../commons/ihe/fhir/chppqm/ChPpqmUtils.java | 32 +- .../chppqm/chppq3/ChPpq3AuditStrategy.java | 9 +- .../chppq3/ChPpq3ClientAuditStrategy.java | 4 +- .../chppqm/chppq3/ChPpq3RequestFactory.java | 34 +- .../chppqm/chppq3/ChPpq3ResourceProvider.java | 2 +- .../chppq3/ChPpq3ServerAuditStrategy.java | 4 +- .../fhir/chppqm/chppq3/ChPpq3Validator.java | 4 +- .../chppqm/chppq4/ChPpq4AuditStrategy.java | 15 +- .../chppq4/ChPpq4ClientAuditStrategy.java | 4 +- .../chppq4/ChPpq4ServerAuditStrategy.java | 4 +- .../fhir/chppqm/chppq4/ChPpq4Validator.java | 4 +- .../chppqm/chppq5/ChPpq5AuditStrategy.java | 4 +- .../chppqm/chppq5/ChPpq5ResourceProvider.java | 2 +- .../AbstractNamingSystemServiceImpl.java | 2 +- .../support/IgBasedInstanceValidator.java | 15 +- ...bstractFhirAuditSerializationStrategy.java | 12 +- .../translation/DefaultUriMapperTest.java | 21 +- .../ihe/fhir/iti105/Iti105RequestFactory.java | 1 - .../ihe/fhir/iti65/Iti65Validator.java | 21 +- .../ihe/fhir/iti66/Iti66AuditStrategy.java | 1 - ...Iti66DocumentManifestSearchParameters.java | 19 +- .../ihe/fhir/iti66/Iti66SearchParameters.java | 13 - .../ihe/fhir/iti67/Iti67AuditStrategy.java | 1 - .../ihe/fhir/iti67/Iti67ResourceProvider.java | 4 +- .../ihe/fhir/iti67/Iti67SearchParameters.java | 21 +- .../iti67/Iti67StrictResourceProvider.java | 4 +- .../fhir/iti68/Iti68ServerAuditStrategy.java | 3 +- .../Iti68BinaryServerAuditStrategy.java | 3 +- .../commons/ihe/fhir/mhd/MhdConstants.java | 2 - .../ComprehensiveProvideDocumentBundle.java | 2 - .../ihe/fhir/mhd/model/FolderList.java | 2 - .../commons/ihe/fhir/mhd/model/MhdList.java | 11 +- .../mhd/model/MinimalDocumentReference.java | 3 - .../mhd/model/MinimalSubmissionSetList.java | 1 - .../commons/ihe/fhir/mhd/model/Source.java | 4 +- ...ntainedComprehensiveSubmissionSetList.java | 1 - .../ihe/fhir/pharm5/Pharm5AuditStrategy.java | 7 +- .../pharm5/Pharm5ClientRequestFactory.java | 2 +- .../fhir/pharm5/Pharm5SearchParameters.java | 25 +- .../ihe/fhir/iti105/Iti105ValidatorTest.java | 6 +- ...PdqResponseToPdqmResponseTranslator.groovy | 4 +- .../PdqmRequestToPdqQueryTranslator.groovy | 2 +- .../ihe/fhir/iti78/Iti78AuditStrategy.java | 3 +- ...ti78QueryResourceClientRequestFactory.java | 2 +- .../ihe/fhir/iti78/Iti78SearchParameters.java | 12 +- .../ihe/fhir/iti83/Iti83AuditStrategy.java | 6 +- .../DiagnosticReportSearchParameters.java | 17 +- .../fhir/pcc44/EncounterSearchParameters.java | 17 +- .../pcc44/ImmunizationSearchParameters.java | 19 +- .../MedicationRequestSearchParameters.java | 4 +- .../MedicationStatementSearchParameters.java | 18 +- .../pcc44/ObservationSearchParameters.java | 18 +- .../ihe/fhir/pcc44/Pcc44AuditStrategy.java | 4 +- .../fhir/pcc44/Pcc44ClientRequestFactory.java | 2 +- .../fhir/pcc44/ProcedureSearchParameters.java | 18 +- .../ipf/commons/ihe/fhir/atna/ATNA.java | 1 + .../fhir/iti81/Iti81ClientRequestFactory.java | 2 +- .../AbstractNamingSystemServiceImpl.java | 2 +- .../AbstractSystemUriMapperTest.java | 18 +- .../translation/DefaultUriMapperTest.java | 21 +- .../fhir/iti65/Iti65ClientAuditStrategy.java | 4 +- .../fhir/iti65/Iti65ServerAuditStrategy.java | 4 +- .../ihe/fhir/iti65/Iti65Validator.java | 6 +- .../ihe/fhir/iti66/Iti66AuditStrategy.java | 4 +- .../fhir/iti66/Iti66ClientRequestFactory.java | 2 +- .../ihe/fhir/iti67/Iti67AuditStrategy.java | 4 +- .../fhir/iti67/Iti67ClientRequestFactory.java | 2 +- .../fhir/iti68/Iti68ServerAuditStrategy.java | 4 +- ...PdqResponseToPdqmResponseTranslator.groovy | 6 +- .../PdqmRequestToPdqQueryTranslator.groovy | 11 +- ...eryResponseToPixmResponseTranslator.groovy | 2 +- .../PixmRequestToPixQueryTranslator.groovy | 4 +- .../ihe/fhir/iti78/Iti78AuditStrategy.java | 7 +- ...ti78QueryResourceClientRequestFactory.java | 2 +- .../ihe/fhir/iti83/Iti83AuditStrategy.java | 10 +- .../ihe/fhir/pcc44/Pcc44AuditStrategy.java | 4 +- .../fhir/pcc44/Pcc44ClientRequestFactory.java | 2 +- commons/ihe/hl7v2/pom.xml | 10 +- .../commons/ihe/hl7v2/audit/AuditUtils.groovy | 2 +- .../ihe/hl7v2/tracing/Hl7MessageGetter.groovy | 6 +- .../ihe/hl7v2/tracing/Hl7MessageSetter.groovy | 6 +- .../ihe/hl7v2/tracing/MessageTracer.groovy | 4 +- .../ihe/hl7v2/Hl7v2AcceptanceException.java | 2 - .../commons/ihe/hl7v2/QpdAwareNakFactory.java | 6 +- .../ihe/hl7v2/audit/MllpAuditDataset.java | 2 + .../hl7v2/audit/iti10/Iti10AuditStrategy.java | 6 +- .../hl7v2/audit/iti30/Iti30AuditStrategy.java | 36 +- .../hl7v2/audit/iti31/Iti31AuditStrategy.java | 66 +- .../IHEPatientRecordChangeLinkBuilder.java | 4 - .../hl7v2/audit/iti8/Iti8AuditStrategy.java | 35 +- .../hl7v2/audit/iti9/Iti9AuditStrategy.java | 4 +- .../hl7v2/audit/pdqcore/PdqAuditStrategy.java | 4 +- .../definitions/pam/v25/message/ADT_A01.java | 1 - .../definitions/pam/v25/message/ADT_A02.java | 1 - .../definitions/pam/v25/message/ADT_A03.java | 1 - .../definitions/pam/v25/message/ADT_A05.java | 1 - .../definitions/pam/v25/message/ADT_A06.java | 1 - .../definitions/pam/v25/message/ADT_A16.java | 1 - .../definitions/pam/v25/message/ADT_A54.java | 1 - .../definitions/pdq/v25/segment/QPD.java | 25 +- .../definitions/pix/v231/message/ADT_A01.java | 1 - .../definitions/pix/v25/segment/QPD.java | 14 +- .../JCacheInteractiveContinuationStorage.java | 4 +- ...ngCacheInteractiveContinuationStorage.java | 4 +- .../{RSP_K21Test.java => RSPK21Test.java} | 10 +- .../{RSP_ZV2Test.java => RSPZV2Test.java} | 4 +- .../pcd01/AbstractPCD01ValidatorTest.java | 2 +- .../ihe/hl7v2ws/pcd01/Pcd01ValidatorTest.java | 24 +- ...pesTest.java => QAPcd01DataTypesTest.java} | 4 +- ...Test.java => QAPcd01MSHValidatorTest.java} | 2 +- ...Test.java => QAPcd01OBRValidatorTest.java} | 2 +- ...Test.java => QAPcd01OBXValidatorTest.java} | 4 +- ...t.java => QAPcd01PIDPV1ValidatorTest.java} | 2 +- .../hl7v2ws/wan/ContinuaWanValidatorTest.java | 1 + .../ihe/hl7v3/audit/Hl7v3AuditStrategy.groovy | 4 +- .../ihe/hl7v3/iti44/Iti44AuditStrategy.groovy | 4 +- .../ihe/hl7v3/iti45/Iti45AuditStrategy.groovy | 9 +- .../ihe/hl7v3/iti46/Iti46AuditStrategy.groovy | 4 +- .../ihe/hl7v3/iti47/Iti47AuditStrategy.groovy | 6 +- .../ihe/hl7v3/iti55/Iti55AuditStrategy.groovy | 6 +- .../commons/ihe/hl7v3/iti55/Iti55Utils.groovy | 2 +- .../ihe/hl7v3/iti56/Iti56AuditStrategy.groovy | 10 +- .../ihe/hl7v3/pcc1/Pcc1AuditStrategy.groovy | 10 +- .../ihe/hl7v3/translation/Utils.groovy | 2 +- .../ihe/hl7v3/Hl7v3ValidationProfile.java | 2 +- .../ihe/hl7v3/audit/Hl7v3AuditDataset.java | 3 + .../EhcacheHl7v3ContinuationStorage.java | 2 - .../ihe/gazelle/adapters/DoubleAdapter.java | 10 +- .../ihe/gazelle/adapters/IntegerAdapter.java | 4 +- .../ihe/gazelle/com/templates/Template.java | 11 +- .../ihe/gazelle/com/templates/TemplateId.java | 11 +- .../com/templates/ValidationResultKind.java | 4 +- .../marshaller/ObjectMarshallerImpl.java | 2 +- .../gazelle/gen/common/CommonOperations.java | 8 +- .../gen/common/CommonOperationsStatic.java | 7 +- .../net/ihe/gazelle/gen/common/Concept.java | 17 +- .../gazelle/gen/common/ConceptProvider.java | 2 +- .../gazelle/gen/common/ValueSetProvider.java | 4 +- .../gazelle/gen/common/ValuesetChecker.java | 10 +- .../net/ihe/gazelle/gen/common/XmlUtil.java | 3 +- .../COCTMT030000UV04BirthPlace.java | 32 +- .../COCTMT030000UV04Citizen.java | 40 +- .../COCTMT030000UV04ContactParty.java | 59 +- .../COCTMT030000UV04Employment.java | 65 +- .../COCTMT030000UV04Entity.java | 54 +- .../COCTMT030000UV04Guarantor.java | 56 +- .../COCTMT030000UV04Guardian.java | 59 +- ...COCTMT030000UV04LanguageCommunication.java | 38 +- .../COCTMT030000UV04Member.java | 46 +- ...OCTMT030000UV04NonPersonLivingSubject.java | 115 +- .../COCTMT030000UV04OtherIDs.java | 37 +- .../COCTMT030000UV04Person.java | 147 +- .../COCTMT030000UV04Student.java | 55 +- .../COCTMT030007UVBirthPlace.java | 32 +- .../coctmt030007UV/COCTMT030007UVCitizen.java | 40 +- .../COCTMT030007UVContactParty.java | 59 +- .../COCTMT030007UVEmployment.java | 65 +- .../coctmt030007UV/COCTMT030007UVEntity.java | 54 +- .../COCTMT030007UVGuarantor.java | 56 +- .../COCTMT030007UVGuardian.java | 59 +- .../COCTMT030007UVLanguageCommunication.java | 38 +- .../coctmt030007UV/COCTMT030007UVMember.java | 46 +- .../COCTMT030007UVNonPersonLivingSubject.java | 112 +- .../COCTMT030007UVOtherIDs.java | 37 +- .../coctmt030007UV/COCTMT030007UVPerson.java | 144 +- .../coctmt030007UV/COCTMT030007UVStudent.java | 55 +- .../COCTMT030202UV01Birthplace.java | 32 +- .../COCTMT030202UV01Person.java | 51 +- .../COCTMT030202UV01Place.java | 49 +- ...COCTMT030203UV02LanguageCommunication.java | 38 +- .../COCTMT030203UV02Person.java | 53 +- .../COCTMT030207UVLanguageCommunication.java | 38 +- .../coctmt030207UV/COCTMT030207UVPerson.java | 63 +- .../COCTMT040008UVResponsible.java | 55 +- .../COCTMT040203UV01NotificationParty.java | 53 +- .../COCTMT050000UV01Patient.java | 65 +- .../COCTMT060000UV01Entity.java | 42 +- .../COCTMT060000UV01Escort.java | 35 +- .../COCTMT060000UV01Location.java | 32 +- .../COCTMT060000UV01Performer.java | 35 +- .../COCTMT060000UV01RoleTransport.java | 32 +- .../COCTMT060000UV01Subject.java | 32 +- .../COCTMT060000UV01Transportation.java | 81 +- .../COCTMT070000UV01LocatedEntity.java | 53 +- .../coctmt080000UV/COCTMT080000UVActRef.java | 35 +- .../COCTMT080000UVAdditive.java | 35 +- .../COCTMT080000UVAdditive2.java | 35 +- .../COCTMT080000UVAdditiveMaterial.java | 43 +- .../COCTMT080000UVAuthorOrPerformer.java | 44 +- ...0UVAutomationSpecimenObservationEvent.java | 52 +- .../COCTMT080000UVContainer.java | 82 +- .../COCTMT080000UVContent1.java | 32 +- .../COCTMT080000UVContent3.java | 40 +- .../COCTMT080000UVContent4.java | 40 +- .../COCTMT080000UVCriterion.java | 51 +- .../coctmt080000UV/COCTMT080000UVHolder.java | 49 +- .../COCTMT080000UVIdentifiedContainer.java | 35 +- .../COCTMT080000UVIdentifiedHolder.java | 35 +- .../COCTMT080000UVManufactured.java | 76 +- .../COCTMT080000UVManufacturedProduct.java | 32 +- .../coctmt080000UV/COCTMT080000UVNatural.java | 67 +- .../COCTMT080000UVNonPersonLivingSubject.java | 110 +- .../COCTMT080000UVPerformer.java | 44 +- .../coctmt080000UV/COCTMT080000UVPerson.java | 124 +- .../COCTMT080000UVPrecondition.java | 47 +- .../coctmt080000UV/COCTMT080000UVProcess.java | 67 +- .../COCTMT080000UVProcessStep.java | 64 +- .../coctmt080000UV/COCTMT080000UVProduct.java | 41 +- .../COCTMT080000UVSpecimen.java | 72 +- ...MT080000UVSpecimenAlternateIdentifier.java | 38 +- ...OCTMT080000UVSpecimenObservationEvent.java | 52 +- .../COCTMT080000UVSpecimenStub.java | 32 +- .../COCTMT080000UVSubject1.java | 41 +- .../COCTMT080000UVSubject2.java | 41 +- .../COCTMT080000UVSubject3.java | 41 +- .../COCTMT080000UVSubject4.java | 44 +- .../COCTMT090000UV01AssignedEntity.java | 65 +- .../COCTMT090000UV01Device.java | 66 +- .../COCTMT090000UV01Group.java | 48 +- ...COCTMT090000UV01LanguageCommunication.java | 38 +- .../COCTMT090000UV01LicensedEntity.java | 43 +- .../COCTMT090000UV01Member.java | 56 +- .../COCTMT090000UV01Organization.java | 60 +- .../COCTMT090000UV01Person.java | 60 +- .../COCTMT090000UV01RoleOther.java | 37 +- .../COCTMT090002UV01AssignedEntity.java | 54 +- .../COCTMT090002UV01Device.java | 43 +- .../COCTMT090002UV01Organization.java | 37 +- .../COCTMT090002UV01Person.java | 37 +- .../COCTMT090003UV01AssignedEntity.java | 59 +- .../COCTMT090003UV01Device.java | 43 +- .../COCTMT090003UV01Organization.java | 37 +- .../COCTMT090003UV01Person.java | 37 +- .../COCTMT090100UV01AssignedPerson.java | 59 +- .../COCTMT090100UV01Group.java | 48 +- ...COCTMT090100UV01LanguageCommunication.java | 38 +- .../COCTMT090100UV01LicensedEntity.java | 43 +- .../COCTMT090100UV01Member.java | 56 +- .../COCTMT090100UV01Person.java | 60 +- .../COCTMT090100UV01RoleOther.java | 37 +- .../COCTMT090102UV02AssignedPerson.java | 48 +- .../COCTMT090102UV02Person.java | 37 +- .../COCTMT090108UVAssignedPerson.java | 53 +- .../coctmt090108UV/COCTMT090108UVPerson.java | 37 +- .../COCTMT090300UV01AssignedDevice.java | 59 +- .../COCTMT090300UV01Device.java | 61 +- .../COCTMT090300UV01Group.java | 48 +- ...COCTMT090300UV01LanguageCommunication.java | 38 +- .../COCTMT090300UV01LicensedEntity.java | 43 +- .../COCTMT090300UV01Member.java | 56 +- .../COCTMT090300UV01RoleOther.java | 37 +- .../COCTMT090303UV01AssignedDevice.java | 53 +- .../COCTMT090303UV01Device.java | 43 +- .../coctmt140007UV/COCTMT140007UVDevice.java | 46 +- .../COCTMT150000UV02ContactParty.java | 50 +- .../COCTMT150000UV02Organization.java | 79 +- .../COCTMT150000UV02OrganizationContains.java | 46 +- .../COCTMT150000UV02OrganizationPartOf.java | 46 +- .../COCTMT150000UV02Person.java | 40 +- .../COCTMT150002UV01Organization.java | 50 +- .../COCTMT150003UV03ContactParty.java | 50 +- .../COCTMT150003UV03Organization.java | 50 +- .../COCTMT150003UV03Person.java | 37 +- .../COCTMT150007UVContactParty.java | 50 +- .../COCTMT150007UVOrganization.java | 50 +- .../coctmt150007UV/COCTMT150007UVPerson.java | 37 +- .../coctmt230100UV/COCTMT230100UVAgency.java | 38 +- .../COCTMT230100UVApproval.java | 47 +- .../coctmt230100UV/COCTMT230100UVAuthor.java | 35 +- .../COCTMT230100UVCharacteristic.java | 41 +- .../coctmt230100UV/COCTMT230100UVContent.java | 45 +- .../coctmt230100UV/COCTMT230100UVCountry.java | 38 +- .../COCTMT230100UVDistributedProduct.java | 32 +- .../coctmt230100UV/COCTMT230100UVHolder.java | 32 +- .../COCTMT230100UVIngredient.java | 38 +- .../COCTMT230100UVManufacturedProduct.java | 47 +- .../COCTMT230100UVManufacturer.java | 49 +- .../COCTMT230100UVMedication.java | 55 +- .../COCTMT230100UVMedicine.java | 92 +- .../COCTMT230100UVMedicineClass.java | 46 +- .../COCTMT230100UVMedicineManufacturer.java | 32 +- .../COCTMT230100UVObservationGoal.java | 41 +- .../COCTMT230100UVPackagedMedicine.java | 66 +- .../coctmt230100UV/COCTMT230100UVPart.java | 40 +- .../coctmt230100UV/COCTMT230100UVPolicy.java | 38 +- .../COCTMT230100UVRelatedManufacturer.java | 37 +- .../coctmt230100UV/COCTMT230100UVRole.java | 32 +- .../COCTMT230100UVSpecializedKind.java | 35 +- .../COCTMT230100UVSubContent.java | 35 +- .../COCTMT230100UVSubIngredient.java | 38 +- .../COCTMT230100UVSubject1.java | 32 +- .../COCTMT230100UVSubject11.java | 32 +- .../COCTMT230100UVSubject14.java | 32 +- .../COCTMT230100UVSubject15.java | 32 +- .../COCTMT230100UVSubject16.java | 32 +- .../COCTMT230100UVSubject2.java | 32 +- .../COCTMT230100UVSubject22.java | 32 +- .../COCTMT230100UVSubject25.java | 32 +- .../COCTMT230100UVSubject3.java | 32 +- .../COCTMT230100UVSubject4.java | 32 +- .../COCTMT230100UVSubject7.java | 32 +- .../COCTMT230100UVSubstance.java | 56 +- .../COCTMT230100UVSubstanceManufacturer.java | 32 +- .../COCTMT230100UVSuperContent.java | 35 +- .../COCTMT230100UVTerritorialAuthority.java | 35 +- ...CTMT240000UV01ServiceDeliveryLocation.java | 59 +- ...CTMT240003UV02ServiceDeliveryLocation.java | 53 +- .../COCTMT260003UVAssignedEntity.java | 32 +- .../coctmt260003UV/COCTMT260003UVAuthor.java | 32 +- .../COCTMT260003UVConsumable.java | 32 +- .../COCTMT260003UVDefinition.java | 32 +- ...COCTMT260003UVDetectedMedicationIssue.java | 58 +- ...03UVDetectedMedicationIssueDefinition.java | 35 +- .../COCTMT260003UVLocation.java | 32 +- .../COCTMT260003UVManagement.java | 38 +- ...OCTMT260003UVManufacturedMaterialKind.java | 35 +- .../COCTMT260003UVManufacturedProduct.java | 32 +- .../COCTMT260003UVMitigates.java | 32 +- .../COCTMT260003UVOtherMedication.java | 35 +- .../COCTMT260003UVOtherSupply.java | 44 +- .../COCTMT260003UVPharmacy.java | 32 +- .../COCTMT260003UVSeverityObservation.java | 38 +- .../coctmt260003UV/COCTMT260003UVSubject.java | 32 +- .../COCTMT260003UVSubject2.java | 35 +- .../COCTMT280000UV04CrossReference.java | 37 +- ...CTMT290000UV06AdministrativeDiagnosis.java | 49 +- ...0UV06AdministrativeDiagnosisReference.java | 35 +- .../COCTMT290000UV06AssignedEntity.java | 51 +- .../COCTMT290000UV06Author.java | 32 +- .../COCTMT290000UV06Author1.java | 35 +- .../COCTMT290000UV06Author2.java | 35 +- ...CTMT290000UV06BillableClinicalService.java | 132 +- .../COCTMT290000UV06BillableModifier.java | 35 +- .../COCTMT290000UV06Component1.java | 32 +- .../COCTMT290000UV06Component2.java | 32 +- .../COCTMT290000UV06Consultant.java | 32 +- .../COCTMT290000UV06Device.java | 32 +- .../COCTMT290000UV06Device2.java | 49 +- .../COCTMT290000UV06HealthCareProvider.java | 43 +- .../COCTMT290000UV06InFulfillmentOf.java | 32 +- ...OCTMT290000UV06IndirectAuthorithyOver.java | 32 +- .../COCTMT290000UV06Injury.java | 52 +- .../COCTMT290000UV06InjuryLocation.java | 58 +- .../COCTMT290000UV06InjuryPlace.java | 56 +- .../COCTMT290000UV06Location.java | 32 +- .../COCTMT290000UV06Location1.java | 32 +- .../COCTMT290000UV06ManufacturedMaterial.java | 35 +- .../COCTMT290000UV06ManufacturedProduct.java | 41 +- ...00UV06ManufacturedProductOrganization.java | 38 +- ...OCTMT290000UV06NonPersonLivingSubject.java | 43 +- .../COCTMT290000UV06Origin.java | 32 +- ...290000UV06PatientCareProvisionRequest.java | 51 +- .../COCTMT290000UV06PatientEncounter.java | 60 +- .../COCTMT290000UV06Performer.java | 35 +- .../COCTMT290000UV06PresentingIndication.java | 44 +- .../COCTMT290000UV06Product1.java | 32 +- .../COCTMT290000UV06Product2.java | 32 +- .../COCTMT290000UV06ProviderPerson.java | 47 +- .../COCTMT290000UV06Reason.java | 32 +- .../COCTMT290000UV06Reason1.java | 35 +- .../COCTMT290000UV06Reason3.java | 35 +- .../COCTMT290000UV06Reason4.java | 35 +- .../COCTMT290000UV06Reason5.java | 35 +- .../COCTMT290000UV06ResponsibleParty.java | 32 +- .../COCTMT290000UV06ReusableDevice.java | 32 +- .../COCTMT290000UV06SecondaryPerformer.java | 35 +- .../COCTMT290000UV06ServiceRequest.java | 43 +- .../COCTMT290000UV06Specimen.java | 29 +- ...CTMT290000UV06SpecimenCollectionEvent.java | 38 +- .../COCTMT290000UV06Subject.java | 32 +- .../COCTMT290000UV06Subject2.java | 32 +- .../COCTMT290000UV06Subject3.java | 32 +- .../COCTMT290000UV06Subject5.java | 35 +- .../COCTMT290000UV06Substitution.java | 32 +- .../COCTMT300000UV04Author.java | 32 +- .../COCTMT300000UV04Destination.java | 32 +- .../COCTMT300000UV04HealthCareProvider.java | 34 +- .../COCTMT300000UV04InFulfillmentOf.java | 32 +- .../COCTMT300000UV04Location.java | 32 +- ...TMT300000UV04ManufacturedMaterialKind.java | 38 +- .../COCTMT300000UV04ManufacturedProduct.java | 35 +- .../COCTMT300000UV04Origin.java | 32 +- .../COCTMT300000UV04Performer1.java | 32 +- .../COCTMT300000UV04Performer2.java | 32 +- .../COCTMT300000UV04PertinentInformation.java | 32 +- ...COCTMT300000UV04PertinentInformation2.java | 32 +- .../COCTMT300000UV04PrescriberPerson.java | 40 +- .../COCTMT300000UV04PrescriberRole.java | 37 +- .../COCTMT300000UV04Product.java | 32 +- .../COCTMT300000UV04Reason.java | 32 +- .../COCTMT300000UV04Reason2.java | 32 +- .../COCTMT300000UV04Subject.java | 32 +- ...0000UV04SubstanceAdministrationIntent.java | 52 +- ...00000UV04SubstanceAdministrationOrder.java | 41 +- .../COCTMT300000UV04Substitution.java | 41 +- .../COCTMT300000UV04SubstitutionRole.java | 34 +- .../COCTMT300000UV04SupplyEvent.java | 65 +- .../COCTMT300000UV04SupplyOrder.java | 38 +- ...OCTMT310000UV04AccommodationRequested.java | 41 +- ...T310000UV04AccommodationRequestorRole.java | 35 +- .../COCTMT310000UV04AccomodationSupplied.java | 53 +- ...COCTMT310000UV04AcommodationRequestor.java | 35 +- .../COCTMT310000UV04Author.java | 32 +- .../COCTMT310000UV04Encounter.java | 41 +- .../COCTMT310000UV04InFulfillmentOf.java | 32 +- .../COCTMT310000UV04Location.java | 32 +- .../COCTMT310000UV04MedicalService.java | 35 +- ...0000UV04MinimumAvailableAccommodation.java | 35 +- ...COCTMT310000UV04PertinentInformation1.java | 32 +- ...COCTMT310000UV04PertinentInformation2.java | 32 +- ...COCTMT310000UV04PertinentInformation3.java | 32 +- .../COCTMT440001UVValuedItem.java | 52 +- ...CTMT490000UV04BillableClinicalProduct.java | 64 +- .../COCTMT490000UV04Consultant.java | 32 +- ...OCTMT490000UV04ContentPackagedProduct.java | 35 +- .../COCTMT490000UV04Destination.java | 32 +- .../COCTMT490000UV04Diagnosis.java | 41 +- .../COCTMT490000UV04HealthCareProvider.java | 40 +- .../COCTMT490000UV04Location.java | 32 +- .../COCTMT490000UV04ManufacturedMaterial.java | 48 +- .../COCTMT490000UV04ManufacturedProduct.java | 41 +- ...00UV04ManufacturedProductOrganization.java | 38 +- .../COCTMT490000UV04Origin.java | 32 +- .../COCTMT490000UV04PertinentInformation.java | 35 +- .../COCTMT490000UV04Product.java | 32 +- .../COCTMT490000UV04ProviderPerson.java | 41 +- .../COCTMT490000UV04Referrer.java | 32 +- .../COCTMT490000UV04Warrantor.java | 35 +- ...COCTMT490000UV04WarrantorOrganization.java | 38 +- ...COCTMT500000UV04AccommodationCoverage.java | 35 +- .../COCTMT500000UV04Author.java | 32 +- .../COCTMT500000UV04Beneficiary.java | 35 +- .../COCTMT500000UV04CarrierOrganization.java | 35 +- .../COCTMT500000UV04CarrierRole.java | 35 +- .../COCTMT500000UV04CoveredParty.java | 41 +- .../COCTMT500000UV04EmployerOrganization.java | 35 +- .../COCTMT500000UV04Employment.java | 37 +- .../COCTMT500000UV04Holder.java | 32 +- .../COCTMT500000UV04Limitation.java | 32 +- .../COCTMT500000UV04PolicyHolder.java | 38 +- ...TMT500000UV04PolicyHolderOrganization.java | 38 +- .../COCTMT500000UV04PolicyHolderPerson.java | 43 +- .../COCTMT500000UV04PolicyOrAccount.java | 55 +- .../COCTMT510000UV06Author2.java | 35 +- .../COCTMT510000UV06Beneficiary.java | 52 +- .../COCTMT510000UV06Beneficiary2.java | 38 +- .../COCTMT510000UV06Benefit.java | 76 +- .../COCTMT510000UV06Component.java | 35 +- .../COCTMT510000UV06Coverage2.java | 35 +- .../COCTMT510000UV06CoverageCharge.java | 60 +- .../COCTMT510000UV06CoverageChargePolicy.java | 51 +- .../COCTMT510000UV06CoverageDefinition.java | 43 +- ...TMT510000UV06CoverageLimitObservation.java | 46 +- .../COCTMT510000UV06CoveragePolicy.java | 51 +- .../COCTMT510000UV06CoverageRecord.java | 56 +- .../COCTMT510000UV06CoveredParty.java | 85 +- .../COCTMT510000UV06CoveredParty2.java | 35 +- .../COCTMT510000UV06Definition.java | 80 +- .../COCTMT510000UV06Definition3.java | 32 +- .../COCTMT510000UV06DirectAuthorityOver.java | 32 +- .../COCTMT510000UV06DirectAuthorityOver2.java | 32 +- .../COCTMT510000UV06DirectAuthorityOver3.java | 32 +- .../COCTMT510000UV06DirectAuthorityOver4.java | 32 +- ...10000UV06EligibilityStatusObservation.java | 46 +- ...10000UV06FinancialParticipationCharge.java | 60 +- .../COCTMT510000UV06Holder.java | 32 +- ...OCTMT510000UV06IndirectAuthorithyOver.java | 32 +- ...CTMT510000UV06IndirectAuthorithyOver2.java | 32 +- .../COCTMT510000UV06Limitation.java | 32 +- .../COCTMT510000UV06Limitation2.java | 35 +- .../COCTMT510000UV06Limitation3.java | 32 +- .../COCTMT510000UV06Organization.java | 45 +- .../COCTMT510000UV06Part.java | 38 +- .../COCTMT510000UV06Payor.java | 66 +- .../COCTMT510000UV06Person.java | 50 +- .../COCTMT510000UV06PersonalRelationship.java | 43 +- .../COCTMT510000UV06PolicyHolder.java | 51 +- .../COCTMT510000UV06PolicyOrProgram.java | 91 +- ...0000UV06PolicyOrProgramFinancialLimit.java | 46 +- .../COCTMT510000UV06Precondition.java | 53 +- ...CTMT510000UV06PreviousPolicyOrProgram.java | 43 +- .../COCTMT510000UV06PrimaryPerformer.java | 35 +- .../COCTMT510000UV06Reference.java | 32 +- .../COCTMT510000UV06Reference2.java | 32 +- .../COCTMT510000UV06ReplacementOf.java | 32 +- .../COCTMT510000UV06ResponsibleParty.java | 56 +- .../COCTMT510000UV06ResponsibleParty2.java | 35 +- .../COCTMT510000UV06ServiceDefinition.java | 35 +- .../COCTMT510000UV06Sponsor.java | 66 +- .../COCTMT510000UV06Subject.java | 32 +- .../COCTMT510000UV06Subject3.java | 32 +- .../COCTMT510000UV06Underwriter.java | 71 +- .../coctmt530000UV/COCTMT530000UVAct.java | 136 +- .../COCTMT530000UVActDefinition.java | 38 +- .../COCTMT530000UVActReference.java | 35 +- .../COCTMT530000UVAdministerableMaterial.java | 32 +- .../coctmt530000UV/COCTMT530000UVAnimal.java | 66 +- .../coctmt530000UV/COCTMT530000UVAuthor.java | 56 +- .../COCTMT530000UVBirthplace.java | 32 +- .../COCTMT530000UVComponent.java | 65 +- .../COCTMT530000UVConditions.java | 44 +- .../COCTMT530000UVConsumable.java | 38 +- .../COCTMT530000UVControlActEvent.java | 55 +- .../COCTMT530000UVCriterion.java | 52 +- .../COCTMT530000UVDataEnterer.java | 47 +- .../COCTMT530000UVDefinition.java | 38 +- .../coctmt530000UV/COCTMT530000UVDevice.java | 35 +- .../COCTMT530000UVEncounter.java | 151 +- .../coctmt530000UV/COCTMT530000UVEntity.java | 67 +- .../COCTMT530000UVHealthCareFacility.java | 41 +- .../COCTMT530000UVInformant.java | 50 +- .../COCTMT530000UVLabeledDrug.java | 41 +- .../COCTMT530000UVLocation.java | 35 +- .../COCTMT530000UVManufacturedProduct.java | 43 +- .../COCTMT530000UVMaterial.java | 44 +- .../COCTMT530000UVMaterialKind.java | 43 +- .../COCTMT530000UVMaterialKind2.java | 38 +- .../COCTMT530000UVMaterialPart.java | 32 +- .../COCTMT530000UVObservation.java | 167 +- .../COCTMT530000UVObservationRange.java | 49 +- .../COCTMT530000UVOrganization.java | 52 +- .../COCTMT530000UVOrganizer.java | 134 +- .../COCTMT530000UVPerformer.java | 50 +- .../coctmt530000UV/COCTMT530000UVPerson.java | 74 +- .../coctmt530000UV/COCTMT530000UVPlace.java | 40 +- .../COCTMT530000UVPrecondition1.java | 44 +- .../COCTMT530000UVPrecondition2.java | 44 +- .../COCTMT530000UVProcedure.java | 166 +- .../COCTMT530000UVProduct1.java | 35 +- .../COCTMT530000UVProduct2.java | 38 +- .../COCTMT530000UVRecordTarget.java | 35 +- .../COCTMT530000UVReferenceRange.java | 41 +- .../COCTMT530000UVRelatedEntity.java | 65 +- .../COCTMT530000UVResponsibleParty1.java | 32 +- .../COCTMT530000UVResponsibleParty2.java | 35 +- .../coctmt530000UV/COCTMT530000UVRole.java | 38 +- .../COCTMT530000UVSourceOf1.java | 56 +- .../COCTMT530000UVSourceOf2.java | 71 +- .../COCTMT530000UVSourceOf3.java | 71 +- .../COCTMT530000UVSubject1.java | 38 +- .../COCTMT530000UVSubject2.java | 47 +- ...COCTMT530000UVSubstanceAdministration.java | 166 +- .../coctmt530000UV/COCTMT530000UVSupply.java | 151 +- .../COCTMT530000UVVerifier.java | 50 +- .../COCTMT600000UV06Author.java | 32 +- .../COCTMT600000UV06Destination.java | 32 +- .../COCTMT600000UV06Diagnosis.java | 44 +- .../COCTMT600000UV06HealthCareProvider.java | 40 +- .../COCTMT600000UV06InFulfillmentOf.java | 32 +- .../COCTMT600000UV06Location.java | 32 +- .../COCTMT600000UV06ManufacturedProduct.java | 40 +- .../COCTMT600000UV06Origin.java | 32 +- .../COCTMT600000UV06Performer.java | 32 +- .../COCTMT600000UV06PertinentInformation.java | 35 +- ...COCTMT600000UV06PertinentInformation1.java | 32 +- ...COCTMT600000UV06PertinentInformation2.java | 32 +- .../COCTMT600000UV06PrescriptionIntent.java | 35 +- .../COCTMT600000UV06PrescriptionOrder.java | 43 +- .../COCTMT600000UV06Product.java | 32 +- .../COCTMT600000UV06Product2.java | 32 +- .../COCTMT600000UV06ProviderPerson.java | 35 +- .../COCTMT600000UV06SupplyEvent.java | 73 +- ...OCTMT600000UV06SupplyObservationEvent.java | 35 +- ...V06VisionPrescriptionObservationEvent.java | 41 +- .../COCTMT600000UV06VisionProduct.java | 35 +- .../COCTMT670000UV04Account.java | 35 +- .../COCTMT670000UV04GuarantorLanguage.java | 35 +- ...COCTMT670000UV04GuarantorOrganization.java | 43 +- .../COCTMT670000UV04GuarantorPerson.java | 50 +- .../COCTMT670000UV04GuarantorRole.java | 60 +- .../COCTMT670000UV04Holder.java | 35 +- .../COCTMT670000UV04PersonalRelationship.java | 32 +- ...COCTMT710000UV01LocatedEntityHasParts.java | 37 +- .../COCTMT710000UV01LocatedEntityPartOf.java | 37 +- .../COCTMT710000UV01Place.java | 67 +- .../COCTMT710007UVLocatedEntity.java | 29 +- .../coctmt710007UV/COCTMT710007UVPlace.java | 60 +- .../COCTMT740000UV04Diagnosis.java | 41 +- .../COCTMT740000UV04HealthCareProvider.java | 40 +- .../COCTMT740000UV04Location.java | 32 +- .../COCTMT740000UV04OralHealthService.java | 75 +- ...UV04OralHealthSubstanceAdministration.java | 40 +- .../COCTMT740000UV04Performer.java | 32 +- ...COCTMT740000UV04PertinentInformation1.java | 32 +- ...COCTMT740000UV04PertinentInformation2.java | 35 +- .../COCTMT740000UV04ProviderPerson.java | 41 +- .../COCTMT740000UV04Reference.java | 32 +- .../COCTMT740000UV04Referral.java | 38 +- .../COCTMT740000UV04Referrer.java | 32 +- .../COCTMT740000UV04ResponsibleParty.java | 32 +- .../COCTMT810000UVInFulfillmentOf.java | 32 +- .../COCTMT810000UVInformationProvision.java | 35 +- .../COCTMT810000UVPerformer.java | 32 +- .../COCTMT810000UVPrimaryPerformer.java | 38 +- .../coctmt810000UV/COCTMT810000UVSupport.java | 32 +- .../COCTMT810000UVVerification.java | 72 +- .../COCTMT810000UVVerificationRequest.java | 37 +- .../COCTMT820000UVAssignedProvider.java | 59 +- .../COCTMT820000UVCareProvision.java | 47 +- .../COCTMT820000UVHealthCareProvider.java | 43 +- .../COCTMT820000UVPerformer.java | 35 +- .../coctmt820000UV/COCTMT820000UVPerson.java | 47 +- .../COCTMT820000UVRoleOther.java | 37 +- .../COCTMT960000UV05Author.java | 35 +- .../COCTMT960000UV05Component1.java | 41 +- .../COCTMT960000UV05Component2.java | 38 +- .../COCTMT960000UV05Device1.java | 35 +- .../COCTMT960000UV05Device2.java | 35 +- .../COCTMT960000UV05Position.java | 68 +- .../COCTMT960000UV05PositionAccuracy.java | 38 +- .../COCTMT960000UV05PositionCoordinate.java | 49 +- .../net/ihe/gazelle/hl7v3/datatypes/AD.java | 2046 +------ .../net/ihe/gazelle/hl7v3/datatypes/ADXP.java | 737 +-- .../net/ihe/gazelle/hl7v3/datatypes/ANY.java | 436 +- .../gazelle/hl7v3/datatypes/ANYNonNull.java | 10 +- .../datatypes/AdxpAdditionalLocator.java | 10 +- .../datatypes/AdxpBuildingNumberSuffix.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpCareOf.java | 10 +- .../hl7v3/datatypes/AdxpCensusTract.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/AdxpCity.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpCountry.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpCounty.java | 10 +- .../hl7v3/datatypes/AdxpDelimiter.java | 10 +- .../datatypes/AdxpDeliveryAddressLine.java | 10 +- .../AdxpDeliveryInstallationArea.java | 10 +- .../AdxpDeliveryInstallationQualifier.java | 10 +- .../AdxpDeliveryInstallationType.java | 10 +- .../hl7v3/datatypes/AdxpDeliveryMode.java | 10 +- .../datatypes/AdxpDeliveryModeIdentifier.java | 10 +- .../hl7v3/datatypes/AdxpDirection.java | 10 +- .../hl7v3/datatypes/AdxpHouseNumber.java | 10 +- .../datatypes/AdxpHouseNumberNumeric.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpPostBox.java | 10 +- .../hl7v3/datatypes/AdxpPostalCode.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpPrecinct.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpState.java | 10 +- .../datatypes/AdxpStreetAddressLine.java | 10 +- .../hl7v3/datatypes/AdxpStreetName.java | 10 +- .../hl7v3/datatypes/AdxpStreetNameBase.java | 10 +- .../hl7v3/datatypes/AdxpStreetNameType.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpUnitID.java | 10 +- .../gazelle/hl7v3/datatypes/AdxpUnitType.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/BIN.java | 13 +- .../net/ihe/gazelle/hl7v3/datatypes/BL.java | 13 +- .../net/ihe/gazelle/hl7v3/datatypes/BN.java | 13 +- .../ihe/gazelle/hl7v3/datatypes/BXITCD.java | 301 +- .../gazelle/hl7v3/datatypes/BXITIVLPQ.java | 299 +- .../hl7v3/datatypes/BinaryDataEncoding.java | 2 +- .../net/ihe/gazelle/hl7v3/datatypes/CD.java | 3439 +----------- .../net/ihe/gazelle/hl7v3/datatypes/CE.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/CO.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/CR.java | 3769 +------------ .../net/ihe/gazelle/hl7v3/datatypes/CS.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/CV.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/ED.java | 3038 +---------- .../gazelle/hl7v3/datatypes/EIVLEvent.java | 10 +- .../gazelle/hl7v3/datatypes/EIVLPPDTS.java | 1453 +---- .../ihe/gazelle/hl7v3/datatypes/EIVLTS.java | 1450 +---- .../net/ihe/gazelle/hl7v3/datatypes/EN.java | 27 +- .../net/ihe/gazelle/hl7v3/datatypes/ENXP.java | 1169 +--- .../gazelle/hl7v3/datatypes/EnDelimiter.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/EnFamily.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/EnGiven.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/EnPrefix.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/EnSuffix.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/GLISTPQ.java | 3400 +----------- .../ihe/gazelle/hl7v3/datatypes/GLISTTS.java | 3400 +----------- .../ihe/gazelle/hl7v3/datatypes/HXITCE.java | 738 +-- .../ihe/gazelle/hl7v3/datatypes/HXITPQ.java | 738 +-- .../net/ihe/gazelle/hl7v3/datatypes/II.java | 3240 +---------- .../net/ihe/gazelle/hl7v3/datatypes/INT.java | 13 +- .../ihe/gazelle/hl7v3/datatypes/IVLINT.java | 1773 +----- .../ihe/gazelle/hl7v3/datatypes/IVLMO.java | 4790 +--------------- .../ihe/gazelle/hl7v3/datatypes/IVLPPDPQ.java | 4773 +--------------- .../ihe/gazelle/hl7v3/datatypes/IVLPPDTS.java | 4823 +---------------- .../ihe/gazelle/hl7v3/datatypes/IVLPQ.java | 21 +- .../ihe/gazelle/hl7v3/datatypes/IVLREAL.java | 37 +- .../ihe/gazelle/hl7v3/datatypes/IVLTS.java | 31 +- .../ihe/gazelle/hl7v3/datatypes/IVXBINT.java | 898 +-- .../ihe/gazelle/hl7v3/datatypes/IVXBMO.java | 865 +-- .../gazelle/hl7v3/datatypes/IVXBPPDPQ.java | 865 +-- .../gazelle/hl7v3/datatypes/IVXBPPDTS.java | 865 +-- .../ihe/gazelle/hl7v3/datatypes/IVXBPQ.java | 865 +-- .../ihe/gazelle/hl7v3/datatypes/IVXBREAL.java | 898 +-- .../ihe/gazelle/hl7v3/datatypes/IVXBTS.java | 865 +-- .../net/ihe/gazelle/hl7v3/datatypes/MO.java | 724 +-- .../net/ihe/gazelle/hl7v3/datatypes/ON.java | 10 +- .../hl7v3/datatypes/ObjectFactory.java | 72 +- .../gazelle/hl7v3/datatypes/PIVLPPDTS.java | 2958 +--------- .../ihe/gazelle/hl7v3/datatypes/PIVLTS.java | 2961 +--------- .../net/ihe/gazelle/hl7v3/datatypes/PN.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/PPDPQ.java | 2340 +------- .../ihe/gazelle/hl7v3/datatypes/PPDTS.java | 2340 +------- .../net/ihe/gazelle/hl7v3/datatypes/PQ.java | 1619 +----- .../net/ihe/gazelle/hl7v3/datatypes/PQR.java | 439 +- .../net/ihe/gazelle/hl7v3/datatypes/QTY.java | 6 +- .../net/ihe/gazelle/hl7v3/datatypes/REAL.java | 13 +- .../net/ihe/gazelle/hl7v3/datatypes/RTO.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/RTOMOPQ.java | 1014 +--- .../ihe/gazelle/hl7v3/datatypes/RTOPQPQ.java | 1014 +--- .../gazelle/hl7v3/datatypes/RTOQTYQTY.java | 1013 +--- .../net/ihe/gazelle/hl7v3/datatypes/SC.java | 2183 +------- .../ihe/gazelle/hl7v3/datatypes/SLISTPQ.java | 1508 +----- .../ihe/gazelle/hl7v3/datatypes/SLISTTS.java | 1519 +----- .../net/ihe/gazelle/hl7v3/datatypes/ST.java | 10 +- .../ihe/gazelle/hl7v3/datatypes/SXCMCD.java | 880 +-- .../ihe/gazelle/hl7v3/datatypes/SXCMINT.java | 880 +-- .../ihe/gazelle/hl7v3/datatypes/SXCMMO.java | 880 +-- .../gazelle/hl7v3/datatypes/SXCMPPDPQ.java | 881 +-- .../gazelle/hl7v3/datatypes/SXCMPPDTS.java | 880 +-- .../ihe/gazelle/hl7v3/datatypes/SXCMPQ.java | 881 +-- .../ihe/gazelle/hl7v3/datatypes/SXCMREAL.java | 880 +-- .../ihe/gazelle/hl7v3/datatypes/SXCMTS.java | 880 +-- .../ihe/gazelle/hl7v3/datatypes/SXPRTS.java | 15 +- .../net/ihe/gazelle/hl7v3/datatypes/TEL.java | 1793 +----- .../net/ihe/gazelle/hl7v3/datatypes/TN.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/TS.java | 13 +- .../gazelle/hl7v3/datatypes/Thumbnail.java | 10 +- .../net/ihe/gazelle/hl7v3/datatypes/URL.java | 9 +- .../ihe/gazelle/hl7v3/datatypes/UVPTS.java | 439 +- .../MCAIMT900001UV01ActOrderRequired.java | 23 +- .../MCAIMT900001UV01DetectedIssueEvent.java | 22 +- ...AIMT900001UV01DetectedIssueManagement.java | 38 +- .../MCAIMT900001UV01Requires.java | 38 +- .../MCAIMT900001UV01Role.java | 32 +- .../MCAIMT900001UV01SourceOf.java | 35 +- .../MCAIMT900001UV01Subject.java | 32 +- .../MCCIIN000002UV01Type.java | 17 +- .../MCCIMT000100UV01Agent.java | 32 +- .../MCCIMT000100UV01AttentionLine.java | 32 +- .../MCCIMT000100UV01Device.java | 67 +- .../MCCIMT000100UV01EntityRsp.java | 45 +- .../MCCIMT000100UV01LocatedEntity.java | 32 +- .../MCCIMT000100UV01Organization.java | 50 +- .../MCCIMT000100UV01Place.java | 47 +- .../MCCIMT000100UV01Receiver.java | 35 +- .../MCCIMT000100UV01RespondTo.java | 37 +- .../MCCIMT000100UV01Sender.java | 35 +- .../MCCIMT000200UV01Acknowledgement.java | 46 +- ...MCCIMT000200UV01AcknowledgementDetail.java | 40 +- .../MCCIMT000200UV01Agent.java | 32 +- .../MCCIMT000200UV01AttentionLine.java | 32 +- .../MCCIMT000200UV01Device.java | 67 +- .../MCCIMT000200UV01EntityRsp.java | 45 +- .../MCCIMT000200UV01LocatedEntity.java | 32 +- .../MCCIMT000200UV01Message.java | 83 +- .../MCCIMT000200UV01Organization.java | 50 +- .../MCCIMT000200UV01Place.java | 47 +- .../MCCIMT000200UV01Receiver.java | 35 +- .../MCCIMT000200UV01RespondTo.java | 37 +- .../MCCIMT000200UV01Sender.java | 35 +- .../MCCIMT000200UV01TargetMessage.java | 29 +- .../MCCIMT000300UV01Acknowledgement.java | 18 +- ...MCCIMT000300UV01AcknowledgementDetail.java | 40 +- .../MCCIMT000300UV01Agent.java | 32 +- .../MCCIMT000300UV01AttentionLine.java | 32 +- .../MCCIMT000300UV01Device.java | 67 +- .../MCCIMT000300UV01EntityRsp.java | 45 +- .../MCCIMT000300UV01LocatedEntity.java | 32 +- .../MCCIMT000300UV01Organization.java | 50 +- .../MCCIMT000300UV01Place.java | 47 +- .../MCCIMT000300UV01Receiver.java | 35 +- .../MCCIMT000300UV01RespondTo.java | 37 +- .../MCCIMT000300UV01Sender.java | 35 +- .../MCCIMT000300UV01TargetMessage.java | 29 +- .../MFMIMT700701UV01ActDefinition.java | 43 +- .../MFMIMT700701UV01Author1.java | 35 +- .../MFMIMT700701UV01Author2.java | 44 +- .../MFMIMT700701UV01AuthorOrPerformer.java | 53 +- .../MFMIMT700701UV01Custodian.java | 35 +- .../MFMIMT700701UV01DataEnterer.java | 41 +- .../MFMIMT700701UV01Definition.java | 32 +- .../MFMIMT700701UV01InFulfillmentOf.java | 32 +- .../MFMIMT700701UV01InformationRecipient.java | 38 +- .../MFMIMT700701UV01Overseer.java | 50 +- .../MFMIMT700701UV01PriorRegisteredAct.java | 37 +- .../MFMIMT700701UV01PriorRegisteredRole.java | 34 +- .../MFMIMT700701UV01PriorRegistration.java | 46 +- .../MFMIMT700701UV01Reason.java | 35 +- .../MFMIMT700701UV01RegistrationRequest.java | 42 +- .../MFMIMT700701UV01ReplacementOf.java | 32 +- .../MFMIMT700701UV01Subject3.java | 32 +- .../MFMIMT700701UV01Subject4.java | 35 +- .../MFMIMT700711UV01ActDefinition.java | 43 +- .../MFMIMT700711UV01Author1.java | 35 +- .../MFMIMT700711UV01Author2.java | 44 +- .../MFMIMT700711UV01AuthorOrPerformer.java | 53 +- .../MFMIMT700711UV01Custodian.java | 35 +- .../MFMIMT700711UV01DataEnterer.java | 41 +- .../MFMIMT700711UV01Definition.java | 32 +- .../MFMIMT700711UV01InFulfillmentOf.java | 32 +- .../MFMIMT700711UV01InformationRecipient.java | 38 +- .../MFMIMT700711UV01Overseer.java | 50 +- .../MFMIMT700711UV01PriorRegisteredAct.java | 37 +- .../MFMIMT700711UV01PriorRegisteredRole.java | 34 +- .../MFMIMT700711UV01PriorRegistration.java | 46 +- .../MFMIMT700711UV01QueryAck.java | 44 +- .../MFMIMT700711UV01Reason.java | 35 +- .../MFMIMT700711UV01RegistrationRequest.java | 42 +- .../MFMIMT700711UV01ReplacementOf.java | 32 +- .../MFMIMT700711UV01Subject3.java | 32 +- .../MFMIMT700711UV01Subject4.java | 35 +- ...PAIN201301UV02MCCIMT000100UV01Message.java | 84 +- ...UV02MFMIMT700701UV01ControlActProcess.java | 89 +- ...UV02MFMIMT700701UV01RegistrationEvent.java | 67 +- ...AIN201301UV02MFMIMT700701UV01Subject1.java | 35 +- ...AIN201301UV02MFMIMT700701UV01Subject2.java | 32 +- .../PRPAIN201301UV02Type.java | 17 +- ...PAIN201302UV02MCCIMT000100UV01Message.java | 84 +- ...UV02MFMIMT700701UV01ControlActProcess.java | 89 +- ...UV02MFMIMT700701UV01RegistrationEvent.java | 67 +- ...AIN201302UV02MFMIMT700701UV01Subject1.java | 35 +- ...AIN201302UV02MFMIMT700701UV01Subject2.java | 32 +- .../PRPAIN201302UV02Type.java | 17 +- ...PAIN201304UV02MCCIMT000100UV01Message.java | 84 +- ...UV02MFMIMT700701UV01ControlActProcess.java | 89 +- ...UV02MFMIMT700701UV01RegistrationEvent.java | 67 +- ...AIN201304UV02MFMIMT700701UV01Subject1.java | 35 +- ...AIN201304UV02MFMIMT700701UV01Subject2.java | 32 +- .../PRPAIN201304UV02Type.java | 17 +- ...PAIN201305UV02MCCIMT000100UV01Message.java | 85 +- ...UV02QUQIMT021001UV01ControlActProcess.java | 87 +- .../PRPAIN201305UV02Type.java | 17 +- ...PAIN201306UV02MCCIMT000300UV01Message.java | 86 +- ...UV02MFMIMT700711UV01ControlActProcess.java | 35 +- ...UV02MFMIMT700711UV01RegistrationEvent.java | 67 +- ...AIN201306UV02MFMIMT700711UV01Subject1.java | 35 +- ...AIN201306UV02MFMIMT700711UV01Subject2.java | 32 +- .../PRPAIN201306UV02Type.java | 17 +- ...PAIN201309UV02MCCIMT000100UV01Message.java | 84 +- ...UV02QUQIMT021001UV01ControlActProcess.java | 87 +- .../PRPAIN201309UV02Type.java | 17 +- ...PAIN201310UV02MCCIMT000300UV01Message.java | 86 +- ...UV02MFMIMT700711UV01ControlActProcess.java | 95 +- ...UV02MFMIMT700711UV01RegistrationEvent.java | 67 +- ...AIN201310UV02MFMIMT700711UV01Subject1.java | 35 +- ...AIN201310UV02MFMIMT700711UV01Subject2.java | 32 +- .../PRPAIN201310UV02Type.java | 17 +- ...MT201301UV02AdministrativeObservation.java | 51 +- .../PRPAMT201301UV02BirthPlace.java | 38 +- .../PRPAMT201301UV02CareGiver.java | 56 +- .../PRPAMT201301UV02Citizen.java | 40 +- .../PRPAMT201301UV02ContactParty.java | 62 +- .../PRPAMT201301UV02CoveredParty.java | 38 +- .../PRPAMT201301UV02Employee.java | 65 +- .../PRPAMT201301UV02Group.java | 62 +- .../PRPAMT201301UV02Guardian.java | 62 +- ...PRPAMT201301UV02LanguageCommunication.java | 38 +- .../PRPAMT201301UV02Member.java | 46 +- .../PRPAMT201301UV02Nation.java | 38 +- ...RPAMT201301UV02NonPersonLivingSubject.java | 136 +- .../PRPAMT201301UV02OtherIDs.java | 43 +- .../PRPAMT201301UV02Patient.java | 77 +- ...RPAMT201301UV02PatientOfOtherProvider.java | 32 +- .../PRPAMT201301UV02Person.java | 166 +- .../PRPAMT201301UV02PersonalRelationship.java | 62 +- .../PRPAMT201301UV02Student.java | 53 +- .../PRPAMT201301UV02Subject2.java | 32 +- .../PRPAMT201301UV02Subject3.java | 32 +- .../PRPAMT201301UV02Subject4.java | 32 +- ...MT201302UV02AdministrativeObservation.java | 51 +- ...201302UV02AdministrativeObservationId.java | 13 +- ...AdministrativeObservationIdUpdateMode.java | 2 +- .../PRPAMT201302UV02BirthPlace.java | 38 +- .../PRPAMT201302UV02CareGiver.java | 56 +- .../PRPAMT201302UV02CareGiverId.java | 13 +- ...PRPAMT201302UV02CareGiverIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Citizen.java | 40 +- .../PRPAMT201302UV02CitizenId.java | 13 +- .../PRPAMT201302UV02CitizenIdUpdateMode.java | 2 +- .../PRPAMT201302UV02ContactParty.java | 62 +- .../PRPAMT201302UV02ContactPartyId.java | 13 +- ...AMT201302UV02ContactPartyIdUpdateMode.java | 2 +- .../PRPAMT201302UV02CoveredParty.java | 38 +- .../PRPAMT201302UV02Employee.java | 65 +- .../PRPAMT201302UV02EmployeeId.java | 13 +- .../PRPAMT201302UV02EmployeeIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Group.java | 62 +- .../PRPAMT201302UV02Guardian.java | 62 +- .../PRPAMT201302UV02GuardianId.java | 13 +- .../PRPAMT201302UV02GuardianIdUpdateMode.java | 2 +- ...PRPAMT201302UV02LanguageCommunication.java | 38 +- .../PRPAMT201302UV02Member.java | 46 +- .../PRPAMT201302UV02MemberId.java | 13 +- .../PRPAMT201302UV02MemberIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Nation.java | 38 +- ...RPAMT201302UV02NonPersonLivingSubject.java | 136 +- ...AMT201302UV02NonPersonLivingSubjectId.java | 13 +- ...V02NonPersonLivingSubjectIdUpdateMode.java | 2 +- .../PRPAMT201302UV02OtherIDs.java | 43 +- .../PRPAMT201302UV02OtherIDsId.java | 13 +- .../PRPAMT201302UV02OtherIDsIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Patient.java | 77 +- .../PRPAMT201302UV02PatientId.java | 13 +- .../PRPAMT201302UV02PatientIdUpdateMode.java | 2 +- ...RPAMT201302UV02PatientOfOtherProvider.java | 32 +- ...2PatientPatientNonPersonLivingSubject.java | 13 +- ...tientNonPersonLivingSubjectUpdateMode.java | 2 +- .../PRPAMT201302UV02PatientPatientPerson.java | 13 +- ...302UV02PatientPatientPersonUpdateMode.java | 2 +- .../PRPAMT201302UV02PatientStatusCode.java | 13 +- ...201302UV02PatientStatusCodeUpdateMode.java | 2 +- .../PRPAMT201302UV02Person.java | 166 +- .../PRPAMT201302UV02PersonId.java | 13 +- .../PRPAMT201302UV02PersonIdUpdateMode.java | 2 +- .../PRPAMT201302UV02PersonalRelationship.java | 62 +- ...RPAMT201302UV02PersonalRelationshipId.java | 13 +- ...2UV02PersonalRelationshipIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Student.java | 53 +- .../PRPAMT201302UV02StudentId.java | 13 +- .../PRPAMT201302UV02StudentIdUpdateMode.java | 2 +- .../PRPAMT201302UV02Subject2.java | 32 +- .../PRPAMT201302UV02Subject3.java | 32 +- .../PRPAMT201302UV02Subject4.java | 32 +- ...MT201303UV02AdministrativeObservation.java | 51 +- .../PRPAMT201303UV02BirthPlace.java | 38 +- .../PRPAMT201303UV02CareGiver.java | 56 +- .../PRPAMT201303UV02Citizen.java | 40 +- .../PRPAMT201303UV02ContactParty.java | 62 +- .../PRPAMT201303UV02CoveredParty.java | 38 +- .../PRPAMT201303UV02Employee.java | 65 +- .../PRPAMT201303UV02Group.java | 62 +- .../PRPAMT201303UV02Guardian.java | 62 +- ...PRPAMT201303UV02LanguageCommunication.java | 38 +- .../PRPAMT201303UV02Member.java | 46 +- .../PRPAMT201303UV02Nation.java | 38 +- ...RPAMT201303UV02NonPersonLivingSubject.java | 136 +- .../PRPAMT201303UV02OtherIDs.java | 43 +- .../PRPAMT201303UV02Patient.java | 77 +- ...RPAMT201303UV02PatientOfOtherProvider.java | 32 +- .../PRPAMT201303UV02Person.java | 166 +- .../PRPAMT201303UV02PersonalRelationship.java | 62 +- .../PRPAMT201303UV02Student.java | 53 +- .../PRPAMT201303UV02Subject2.java | 32 +- .../PRPAMT201303UV02Subject3.java | 32 +- .../PRPAMT201303UV02Subject4.java | 32 +- .../PRPAMT201304UV02Citizen.java | 40 +- .../PRPAMT201304UV02CoveredParty.java | 38 +- .../PRPAMT201304UV02Employee.java | 43 +- .../PRPAMT201304UV02Group.java | 45 +- .../PRPAMT201304UV02Member.java | 46 +- .../PRPAMT201304UV02Nation.java | 38 +- ...RPAMT201304UV02NonPersonLivingSubject.java | 60 +- .../PRPAMT201304UV02OtherIDs.java | 43 +- .../PRPAMT201304UV02Patient.java | 57 +- ...RPAMT201304UV02PatientOfOtherProvider.java | 32 +- .../PRPAMT201304UV02Person.java | 72 +- .../PRPAMT201304UV02Student.java | 43 +- .../PRPAMT201304UV02Subject.java | 32 +- ...UV02LivingSubjectAdministrativeGender.java | 34 +- ...306UV02LivingSubjectBirthPlaceAddress.java | 34 +- ...201306UV02LivingSubjectBirthPlaceName.java | 34 +- ...RPAMT201306UV02LivingSubjectBirthTime.java | 34 +- ...MT201306UV02LivingSubjectDeceasedTime.java | 34 +- .../PRPAMT201306UV02LivingSubjectId.java | 34 +- .../PRPAMT201306UV02LivingSubjectName.java | 34 +- .../PRPAMT201306UV02MatchAlgorithm.java | 32 +- .../PRPAMT201306UV02MatchCriterionList.java | 38 +- .../PRPAMT201306UV02MatchWeight.java | 32 +- .../PRPAMT201306UV02MinimumDegreeMatch.java | 32 +- .../PRPAMT201306UV02MothersMaidenName.java | 34 +- ...201306UV02OtherIDsScopingOrganization.java | 34 +- .../PRPAMT201306UV02ParameterList.java | 99 +- .../PRPAMT201306UV02PatientAddress.java | 34 +- .../PRPAMT201306UV02PatientStatusCode.java | 32 +- .../PRPAMT201306UV02PatientTelecom.java | 34 +- ...PAMT201306UV02PrincipalCareProviderId.java | 34 +- ...AMT201306UV02PrincipalCareProvisionId.java | 34 +- .../PRPAMT201306UV02QueryByParameter.java | 66 +- .../PRPAMT201306UV02SortControl.java | 35 +- .../PRPAMT201307UV02DataSource.java | 34 +- .../PRPAMT201307UV02ParameterList.java | 39 +- .../PRPAMT201307UV02PatientIdentifier.java | 34 +- .../PRPAMT201307UV02QueryByParameter.java | 49 +- ...MT201310UV02AdministrativeObservation.java | 51 +- .../PRPAMT201310UV02BirthPlace.java | 38 +- .../PRPAMT201310UV02CareGiver.java | 56 +- .../PRPAMT201310UV02Citizen.java | 40 +- .../PRPAMT201310UV02ContactParty.java | 62 +- .../PRPAMT201310UV02CoveredParty.java | 38 +- .../PRPAMT201310UV02Employee.java | 65 +- .../PRPAMT201310UV02Group.java | 62 +- .../PRPAMT201310UV02Guardian.java | 62 +- ...PRPAMT201310UV02LanguageCommunication.java | 38 +- .../PRPAMT201310UV02Member.java | 46 +- .../PRPAMT201310UV02Nation.java | 38 +- ...RPAMT201310UV02NonPersonLivingSubject.java | 136 +- .../PRPAMT201310UV02OtherIDs.java | 43 +- .../PRPAMT201310UV02Patient.java | 84 +- ...RPAMT201310UV02PatientOfOtherProvider.java | 32 +- .../PRPAMT201310UV02Person.java | 56 +- .../PRPAMT201310UV02PersonalRelationship.java | 62 +- ...PRPAMT201310UV02QueryMatchObservation.java | 38 +- .../PRPAMT201310UV02Student.java | 53 +- .../PRPAMT201310UV02Subject.java | 32 +- .../PRPAMT201310UV02Subject2.java | 32 +- .../PRPAMT201310UV02Subject3.java | 32 +- .../PRPAMT201310UV02Subject4.java | 32 +- .../QUQIIN000003UV01CancelType.java | 10 +- ...QIIN000003UV01MCCIMT000300UV01Message.java | 86 +- .../QUQIIN000003UV01Type.java | 17 +- .../QUQIMT000001UV01AuthorOrPerformer.java | 53 +- .../QUQIMT000001UV01ControlActProcess.java | 87 +- .../QUQIMT000001UV01DataEnterer.java | 38 +- .../QUQIMT000001UV01InformationRecipient.java | 38 +- .../QUQIMT000001UV01Overseer.java | 50 +- .../QUQIMT000001UV01QueryContinuation.java | 38 +- .../QUQIMT000001UV01Reason.java | 35 +- .../QUQIMT021001UV01AuthorOrPerformer.java | 53 +- .../QUQIMT021001UV01DataEnterer.java | 38 +- .../QUQIMT021001UV01InformationRecipient.java | 38 +- .../QUQIMT021001UV01Overseer.java | 50 +- .../QUQIMT021001UV01Reason.java | 35 +- .../net/ihe/gazelle/hl7v3/voc/Abenakian.java | 2 +- .../hl7v3/voc/AcknowledgementCondition.java | 2 +- .../hl7v3/voc/AcknowledgementDetailCode.java | 2 +- ...AcknowledgementDetailNotSupportedCode.java | 2 +- .../AcknowledgementDetailSyntaxErrorCode.java | 2 +- .../hl7v3/voc/AcknowledgementDetailType.java | 2 +- .../hl7v3/voc/AcknowledgementType.java | 2 +- .../hl7v3/voc/ActAccommodationReason.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActAccountCode.java | 2 +- .../hl7v3/voc/ActAdjudicationCode.java | 2 +- .../hl7v3/voc/ActAdjudicationGroupCode.java | 2 +- .../voc/ActAdjudicationResultActionCode.java | 2 +- ...trativeAuthorizationDetectedIssueCode.java | 2 +- ...ctAdministrativeRuleDetectedIssueCode.java | 2 +- .../hl7v3/voc/ActBillableModifierCode.java | 2 +- .../hl7v3/voc/ActBillingArrangementCode.java | 2 +- .../gazelle/hl7v3/voc/ActBoundedROICode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/ActClass.java | 2 +- .../hl7v3/voc/ActClassCareProvision.java | 2 +- .../hl7v3/voc/ActClassClinicalDocument.java | 2 +- .../hl7v3/voc/ActClassComposition.java | 2 +- .../gazelle/hl7v3/voc/ActClassCondition.java | 2 +- .../gazelle/hl7v3/voc/ActClassContainer.java | 2 +- .../gazelle/hl7v3/voc/ActClassContract.java | 2 +- .../gazelle/hl7v3/voc/ActClassControlAct.java | 2 +- .../gazelle/hl7v3/voc/ActClassDocument.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassEntry.java | 2 +- .../gazelle/hl7v3/voc/ActClassExposure.java | 2 +- .../gazelle/hl7v3/voc/ActClassExtract.java | 2 +- .../hl7v3/voc/ActClassFinancialContract.java | 2 +- .../hl7v3/voc/ActClassGenomicObservation.java | 2 +- .../hl7v3/voc/ActClassObservation.java | 2 +- .../hl7v3/voc/ActClassObservationSeries.java | 2 +- .../gazelle/hl7v3/voc/ActClassOrganizer.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassPolicy.java | 2 +- .../gazelle/hl7v3/voc/ActClassPosition.java | 2 +- .../gazelle/hl7v3/voc/ActClassProcedure.java | 2 +- .../hl7v3/voc/ActClassPublicHealthCase.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassROI.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassRoot.java | 2 +- .../voc/ActClassSubjectBodyPosition.java | 2 +- .../voc/ActClassSubjectPhysicalPosition.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassSupine.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActClassSupply.java | 2 +- .../gazelle/hl7v3/voc/ActConditionList.java | 2 +- ...onsentInformationAccessOverrideReason.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActConsentType.java | 2 +- .../voc/ActContainerRegistrationCode.java | 2 +- ...CoverageAuthorizationConfirmationCode.java | 2 +- .../hl7v3/voc/ActCoverageMaximaCodes.java | 2 +- .../voc/ActCoverageQuantityLimitCode.java | 2 +- ...ctCredentialedCareProvisionPersonCode.java | 2 +- ...tCredentialedCareProvisionProgramCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActDietCode.java | 2 +- .../gazelle/hl7v3/voc/ActEncounterCode.java | 2 +- .../gazelle/hl7v3/voc/ActExposureCode.java | 2 +- .../hl7v3/voc/ActExposureLevelCode.java | 2 +- .../voc/ActFinancialTransactionCode.java | 2 +- .../hl7v3/voc/ActHealthInsuranceTypeCode.java | 2 +- .../gazelle/hl7v3/voc/ActIncidentCode.java | 2 +- .../hl7v3/voc/ActIneligibilityReason.java | 2 +- .../hl7v3/voc/ActInformationAccess.java | 2 +- .../hl7v3/voc/ActInformationAccessCode.java | 2 +- .../voc/ActInformationAccessContextCode.java | 2 +- .../hl7v3/voc/ActInformationCategoryCode.java | 2 +- .../hl7v3/voc/ActInpatientEncounterCode.java | 2 +- .../hl7v3/voc/ActInsurancePolicyCode.java | 2 +- ...ActInsurancePolicyCodeAutomobileByBOT.java | 2 +- ...nsurancePolicyCodeDiseaseProgramByBOT.java | 2 +- ...urancePolicyCodePublicHealthcareByBOT.java | 2 +- ...olicyCodeSubsidizedHealthProgramByBOT.java | 2 +- .../hl7v3/voc/ActInsuranceTypeCode.java | 2 +- ...InvoiceAdjudicationPaymentSummaryCode.java | 2 +- ...ctInvoiceDetailGenericAdjudicatorCode.java | 2 +- .../ActInvoiceDetailGenericModifierCode.java | 2 +- .../ActInvoiceDetailGenericProviderCode.java | 2 +- .../hl7v3/voc/ActInvoiceDetailTaxCode.java | 2 +- .../hl7v3/voc/ActInvoiceElementModifier.java | 2 +- .../hl7v3/voc/ActInvoiceInterGroupCode.java | 2 +- .../hl7v3/voc/ActInvoiceOverrideCode.java | 2 +- .../hl7v3/voc/ActInvoicePaymentCode.java | 2 +- .../hl7v3/voc/ActInvoiceRootGroupCode.java | 2 +- .../hl7v3/voc/ActMedicalServiceCode.java | 2 +- .../gazelle/hl7v3/voc/ActMedicationList.java | 2 +- ...icationTherapyDurationWorkingListCode.java | 2 +- .../hl7v3/voc/ActMonitoringProtocolCode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/ActMood.java | 2 +- .../hl7v3/voc/ActMoodCompletionTrack.java | 2 +- .../gazelle/hl7v3/voc/ActMoodCriterion.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActMoodIntent.java | 2 +- .../gazelle/hl7v3/voc/ActMoodPredicate.java | 2 +- .../gazelle/hl7v3/voc/ActMoodProposal.java | 2 +- .../hl7v3/voc/ActNoImmunizationReason.java | 2 +- .../voc/ActNonObservationIndicationCode.java | 2 +- .../gazelle/hl7v3/voc/ActObservationList.java | 2 +- .../voc/ActPatientTransportationModeCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActPaymentCode.java | 2 +- .../hl7v3/voc/ActPharmacySupplyType.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActPolicyType.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActPriority.java | 2 +- .../hl7v3/voc/ActPriorityCallback.java | 2 +- .../gazelle/hl7v3/voc/ActProgramTypeCode.java | 2 +- .../hl7v3/voc/ActRelationshipCheckpoint.java | 2 +- .../hl7v3/voc/ActRelationshipConditional.java | 2 +- .../voc/ActRelationshipCostTracking.java | 2 +- .../hl7v3/voc/ActRelationshipExcerpt.java | 2 +- .../hl7v3/voc/ActRelationshipFulfills.java | 2 +- .../voc/ActRelationshipHasComponent.java | 2 +- .../hl7v3/voc/ActRelationshipHasSupport.java | 2 +- .../hl7v3/voc/ActRelationshipJoin.java | 2 +- .../hl7v3/voc/ActRelationshipMitigates.java | 2 +- .../hl7v3/voc/ActRelationshipObjective.java | 2 +- .../hl7v3/voc/ActRelationshipOutcome.java | 2 +- .../hl7v3/voc/ActRelationshipPosting.java | 2 +- .../hl7v3/voc/ActRelationshipReason.java | 2 +- .../hl7v3/voc/ActRelationshipSequel.java | 2 +- .../hl7v3/voc/ActRelationshipSplit.java | 2 +- .../hl7v3/voc/ActRelationshipSubset.java | 2 +- .../ActRelationshipTemporallyPertains.java | 2 +- .../voc/ActResearchInformationAccess.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActSpecObsCode.java | 2 +- .../hl7v3/voc/ActSpecObsDilutionCode.java | 2 +- .../hl7v3/voc/ActSpecObsInterferenceCode.java | 2 +- .../hl7v3/voc/ActSpecObsVolumeCode.java | 2 +- .../hl7v3/voc/ActSpecimenTransportCode.java | 2 +- .../hl7v3/voc/ActSpecimenTreatmentCode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/ActStatus.java | 2 +- .../gazelle/hl7v3/voc/ActStatusNormal.java | 2 +- .../ActSubstanceAdminSubstitutionCode.java | 2 +- .../voc/ActSubstanceAdministrationCode.java | 2 +- ...bstanceAdministrationImmunizationCode.java | 2 +- .../ActSupplyFulfillmentRefusalReason.java | 2 +- .../voc/ActTaskClinicalNoteEntryCode.java | 2 +- .../voc/ActTaskClinicalNoteReviewCode.java | 2 +- .../voc/ActTaskMedicationListReviewCode.java | 2 +- .../ActTaskMicrobiologyResultsReviewCode.java | 2 +- .../hl7v3/voc/ActTaskOrderEntryCode.java | 2 +- .../voc/ActTaskPatientDocumentationCode.java | 2 +- .../ActTaskPatientInformationReviewCode.java | 2 +- .../ActTaskRiskAssessmentInstrumentCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/ActUncertainty.java | 2 +- .../gazelle/hl7v3/voc/ActiveEditStatus.java | 2 +- .../gazelle/hl7v3/voc/AdditionalLocator.java | 2 +- .../gazelle/hl7v3/voc/AddressPartType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/AddressUse.java | 2 +- .../hl7v3/voc/AdjudicatedWithAdjustments.java | 2 +- .../hl7v3/voc/AdministrableDrugForm.java | 2 +- ...edIssueCodeDuplicateTherapyAlertByBOT.java | 2 +- .../voc/AdministrationMedicalDevice.java | 2 +- .../voc/AdministrativeContactRoleType.java | 2 +- .../hl7v3/voc/AdministrativeGender.java | 2 +- .../ihe/gazelle/hl7v3/voc/AdoptedChild.java | 2 +- .../gazelle/hl7v3/voc/AerosolDrugForm.java | 2 +- .../hl7v3/voc/AgeDetectedIssueCode.java | 2 +- .../hl7v3/voc/AgenciesProviderCodes.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Aleut.java | 2 +- .../AlgorithmicDecisionObservationMethod.java | 2 +- .../AllergyandImmunologyProviderCodes.java | 2 +- ...andOsteopathicPhysiciansProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Ambulance.java | 2 +- .../ihe/gazelle/hl7v3/voc/AmbulanceHIPAA.java | 2 +- .../hl7v3/voc/AmbulanceProviderCodes.java | 2 +- .../voc/AmbulatoryClinicOrCenterHIPAA.java | 2 +- ...toryHealthCareFacilitiesProviderCodes.java | 2 +- .../hl7v3/voc/AmnioticFluidSacRoute.java | 2 +- .../voc/AnesthesiologyProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Apachean.java | 2 +- .../hl7v3/voc/ApplicationMediaType.java | 2 +- .../gazelle/hl7v3/voc/ArapahoGrosVentre.java | 2 +- .../hl7v3/voc/ArtificialDentition.java | 2 +- .../gazelle/hl7v3/voc/AskedButUnknown.java | 2 +- ...ssignedNonPersonLivingSubjectRoleType.java | 2 +- .../AssistedLivingFacilityProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/AudioMediaType.java | 2 +- .../hl7v3/voc/AudiologistProviderCodes.java | 2 +- .../voc/AuthorizationIssueManagementCode.java | 2 +- .../hl7v3/voc/AutomobileInsurancePolicy.java | 2 +- .../ihe/gazelle/hl7v3/voc/BarDrugForm.java | 2 +- .../gazelle/hl7v3/voc/BarSoapDrugForm.java | 2 +- ...ealthAndOrSocialServiceCounselorHIPAA.java | 2 +- ...HealthAndOrSocialServiceProviderHIPAA.java | 2 +- ...ndSocialServiceProvidersProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/BiliaryRoute.java | 2 +- ...apeuticNonPersonLivingSubjectRoleType.java | 2 +- .../hl7v3/voc/BlisterPackEntityType.java | 2 +- .../gazelle/hl7v3/voc/BodySurfaceRoute.java | 2 +- .../gazelle/hl7v3/voc/BottleEntityType.java | 2 +- .../gazelle/hl7v3/voc/BuccalMucosaRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/BuccalTablet.java | 2 +- .../ihe/gazelle/hl7v3/voc/BuildingNumber.java | 2 +- .../hl7v3/voc/BuildingNumberSuffixByBOT.java | 2 +- .../hl7v3/voc/CVDiagTherPracticeSetting.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Cahitan.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Calendar.java | 2 +- .../ihe/gazelle/hl7v3/voc/CalendarCycle.java | 2 +- .../hl7v3/voc/CalendarCycleOneLetter.java | 2 +- .../hl7v3/voc/CalendarCycleTwoLetter.java | 2 +- .../ihe/gazelle/hl7v3/voc/CalendarType.java | 2 +- .../hl7v3/voc/CaliforniaAthapaskan.java | 2 +- .../gazelle/hl7v3/voc/CapsuleDrugForm.java | 2 +- .../hl7v3/voc/CardClinPracticeSetting.java | 2 +- ...rdiologySpecialistOrTechnologistHIPAA.java | 2 +- .../hl7v3/voc/CardiologyTechnicianHIPAA.java | 2 +- .../hl7v3/voc/CaseTransmissionMode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Catawba.java | 2 +- .../ihe/gazelle/hl7v3/voc/CecostomyRoute.java | 2 +- .../gazelle/hl7v3/voc/CentralMuskogean.java | 2 +- .../ihe/gazelle/hl7v3/voc/CentralNumic.java | 2 +- .../ihe/gazelle/hl7v3/voc/CentralSalish.java | 2 +- .../ihe/gazelle/hl7v3/voc/CervicalRoute.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Charset.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Chew.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Child.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/ChildInLaw.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Chimakuan.java | 2 +- .../gazelle/hl7v3/voc/ChiropractersHIPAA.java | 2 +- .../ChiropracticProvidersProviderCodes.java | 2 +- .../hl7v3/voc/ChiropractorProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/ChiwereWinnebago.java | 2 +- .../hl7v3/voc/ChronicCareFacility.java | 2 +- .../ChronicDiseaseHospitalProviderCodes.java | 2 +- .../voc/ClaimantCoveredPartyRoleType.java | 2 +- .../hl7v3/voc/ClinicCenterProviderCodes.java | 2 +- .../voc/ClinicalNurseSpecialistHIPAA.java | 2 +- .../ClinicalNurseSpecialistProviderCodes.java | 2 +- .../voc/ClinicalResearchEventReason.java | 2 +- .../ClinicalResearchObservationReason.java | 2 +- .../ihe/gazelle/hl7v3/voc/CodeIsNotValid.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/CodeSystem.java | 2 +- .../ihe/gazelle/hl7v3/voc/CodeSystemType.java | 2 +- .../gazelle/hl7v3/voc/CodingRationale.java | 2 +- ...ombinedPharmacyOrderSuspendReasonCode.java | 2 +- .../hl7v3/voc/CommunicationFunctionType.java | 2 +- .../gazelle/hl7v3/voc/ComplianceAlert.java | 2 +- .../voc/ComplianceDetectedIssueCode.java | 2 +- ...edIssueCodeDuplicateTherapyAlertByBOT.java | 2 +- .../voc/CompliancePackageEntityType.java | 2 +- .../hl7v3/voc/CompressionAlgorithm.java | 2 +- .../hl7v3/voc/ConceptCodeRelationship.java | 4 +- .../gazelle/hl7v3/voc/ConceptGenerality.java | 2 +- .../gazelle/hl7v3/voc/ConceptPropertyId.java | 2 +- .../ihe/gazelle/hl7v3/voc/ConceptStatus.java | 2 +- .../hl7v3/voc/ConditionDetectedIssueCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/Conditional.java | 2 +- .../gazelle/hl7v3/voc/Confidentiality.java | 2 +- .../voc/ConfidentialityByAccessKind.java | 2 +- .../hl7v3/voc/ConfidentialityByInfoType.java | 2 +- .../hl7v3/voc/ConfidentialityModifiers.java | 2 +- .../voc/ConrolActNullificationReasonCode.java | 2 +- .../ConsultedPrescriberManagementCode.java | 2 +- .../gazelle/hl7v3/voc/ContactRoleType.java | 2 +- .../ihe/gazelle/hl7v3/voc/ContainerCap.java | 2 +- .../gazelle/hl7v3/voc/ContainerSeparator.java | 2 +- .../hl7v3/voc/ContentProcessingMode.java | 2 +- .../ihe/gazelle/hl7v3/voc/ContextControl.java | 2 +- .../hl7v3/voc/ContextControlAdditive.java | 2 +- .../voc/ContextControlNonPropagating.java | 2 +- .../hl7v3/voc/ContextControlOverriding.java | 2 +- .../hl7v3/voc/ContextControlPropagating.java | 2 +- .../hl7v3/voc/ContractorProviderCodes.java | 2 +- ...ControlledSubstanceMonitoringProtocol.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Coosan.java | 2 +- .../hl7v3/voc/CounselorProviderCodes.java | 2 +- .../hl7v3/voc/CoverageEligibilityReason.java | 2 +- .../gazelle/hl7v3/voc/CoverageRoleType.java | 2 +- .../hl7v3/voc/CoverageSponsorRoleType.java | 2 +- .../ihe/gazelle/hl7v3/voc/CreamDrugForm.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/CreditCard.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Cree.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Cupan.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Currency.java | 2 +- .../CustodialCareFacilityProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Dakotan.java | 2 +- .../hl7v3/voc/DataTypeAddressPart.java | 2 +- .../gazelle/hl7v3/voc/DataTypeAnnotated.java | 2 +- .../DataTypeAnnotatedConceptDescriptor.java | 2 +- .../DataTypeAnnotatedPhysicalQuantity.java | 2 +- .../ihe/gazelle/hl7v3/voc/DataTypeBag.java | 2 +- .../voc/DataTypeBagOfConceptDescriptors.java | 2 +- .../voc/DataTypeBagOfPhysicalQuantities.java | 2 +- .../gazelle/hl7v3/voc/DataTypeBinaryData.java | 2 +- .../gazelle/hl7v3/voc/DataTypeBoolean.java | 2 +- .../hl7v3/voc/DataTypeCharacterString.java | 2 +- .../hl7v3/voc/DataTypeCodedSimpleValue.java | 2 +- .../gazelle/hl7v3/voc/DataTypeCodedValue.java | 2 +- .../voc/DataTypeCodedWithEquivalents.java | 2 +- .../hl7v3/voc/DataTypeConceptDescriptor.java | 2 +- .../hl7v3/voc/DataTypeConceptRole.java | 2 +- .../hl7v3/voc/DataTypeEncodedData.java | 2 +- .../voc/DataTypeEventRelatedInterval.java | 2 +- .../DataTypeGeneralTimingSpecification.java | 2 +- .../gazelle/hl7v3/voc/DataTypeHistorical.java | 2 +- .../hl7v3/voc/DataTypeHistoricalAddress.java | 2 +- .../hl7v3/voc/DataTypeHistoryOfAddress.java | 2 +- .../hl7v3/voc/DataTypeInstanceIdentifier.java | 2 +- .../hl7v3/voc/DataTypeIntegerNumber.java | 2 +- .../gazelle/hl7v3/voc/DataTypeInterval.java | 2 +- .../voc/DataTypeIntervalOfIntegerNumbers.java | 2 +- .../DataTypeIntervalOfPhysicalQuantities.java | 2 +- .../voc/DataTypeIntervalOfPointsInTime.java | 2 +- .../voc/DataTypeIntervalOfRealNumbers.java | 2 +- .../hl7v3/voc/DataTypeMonetaryAmount.java | 2 +- ...eNonParametricProbabilityDistribution.java | 2 +- ...bilityDistributionOfConceptDescriptor.java | 2 +- ...ibutionOfIntervalOfPhysicalQuantities.java | 2 +- .../hl7v3/voc/DataTypeObjectIdentifier.java | 2 +- .../hl7v3/voc/DataTypeOrganizationName.java | 2 +- ...TypeParametricProbabilityDistribution.java | 2 +- ...ilityDistributionOfPhysicalQuantities.java | 2 +- ...cProbabilityDistributionOfRealNumbers.java | 2 +- .../voc/DataTypePeriodicIntervalOfTime.java | 2 +- .../hl7v3/voc/DataTypePersonNamePart.java | 2 +- .../hl7v3/voc/DataTypePersonNameType.java | 2 +- .../hl7v3/voc/DataTypePhysicalQuantity.java | 2 +- .../hl7v3/voc/DataTypePointInTime.java | 2 +- .../DataTypePostalAndResidentialAddress.java | 2 +- .../ihe/gazelle/hl7v3/voc/DataTypeRatio.java | 2 +- .../gazelle/hl7v3/voc/DataTypeRealNumber.java | 2 +- .../gazelle/hl7v3/voc/DataTypeSequence.java | 2 +- .../voc/DataTypeSequenceOfBinaryData.java | 2 +- .../hl7v3/voc/DataTypeSequenceOfBooleans.java | 2 +- .../DataTypeSequenceOfCharacterStrings.java | 2 +- .../voc/DataTypeSequenceOfEncodedData.java | 2 +- .../DataTypeSequenceOfPersonNameParts.java | 2 +- .../DataTypeSequenceOfPostalAddressParts.java | 2 +- .../DataTypeSequenceOfSequenceOfBooleans.java | 2 +- ...taTypeSequenceOfSequencesOfDataValues.java | 2 +- .../ihe/gazelle/hl7v3/voc/DataTypeSet.java | 2 +- .../hl7v3/voc/DataTypeSetOfAddresses.java | 2 +- .../voc/DataTypeSetOfCharacterStrings.java | 2 +- .../voc/DataTypeSetOfCodedSimpleValue.java | 2 +- .../hl7v3/voc/DataTypeSetOfCodedValue.java | 2 +- .../DataTypeSetOfCodedWithEquivalents.java | 2 +- .../voc/DataTypeSetOfConceptDescriptors.java | 2 +- .../voc/DataTypeSetOfHistoricalAddresses.java | 2 +- .../voc/DataTypeSetOfIntegerNumbers.java | 2 +- ...TypeSetOfIntervalsOfPhysicalQuantitiy.java | 2 +- .../voc/DataTypeSetOfPhysicalQuantities.java | 2 +- .../hl7v3/voc/DataTypeSetOfPointsInTime.java | 2 +- .../hl7v3/voc/DataTypeSetOfRealNumbers.java | 2 +- ...aTypeSetOfSequencesOfCharacterStrings.java | 2 +- ...certainProbabilisticConceptDescriptor.java | 2 +- ...abilisticIntervalOfPhysicalQuantities.java | 2 +- ...aTypeSetOfUncertainValueProbabilistic.java | 2 +- .../voc/DataTypeTelecommunicationAddress.java | 2 +- ...peUncertainNarrativeConceptDescriptor.java | 2 +- ...certainProbabilisticConceptDescriptor.java | 2 +- ...abilisticIntervalOfPhysicalQuantities.java | 2 +- .../voc/DataTypeUncertainValueNarrative.java | 2 +- .../DataTypeUncertainValueProbabilistic.java | 2 +- .../voc/DataTypeUniversalResourceLocator.java | 2 +- .../hl7v3/voc/DecisionObservationMethod.java | 2 +- .../DedicatedNonClinicalLocationRoleType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Delawaran.java | 2 +- .../hl7v3/voc/DeliveryAddressLine.java | 2 +- .../gazelle/hl7v3/voc/DeltaCalifornia.java | 2 +- .../voc/DentalProvidersProviderCodes.java | 2 +- .../hl7v3/voc/DentalServiceProviderHIPAA.java | 2 +- .../ihe/gazelle/hl7v3/voc/DentistHIPAA.java | 2 +- .../hl7v3/voc/DentistProviderCodes.java | 2 +- .../voc/DependentCoveredPartyRoleType.java | 2 +- .../hl7v3/voc/DermatologyProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/DeviceAlertLevel.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Dhegiha.java | 2 +- .../hl7v3/voc/DiagTherPracticeSetting.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Diegueno.java | 2 +- ...yAndOrNutritionalServiceProviderHIPAA.java | 2 +- ...ritionalServiceProvidersProviderCodes.java | 2 +- .../voc/DietitianRegisteredProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Diffusion.java | 2 +- .../ihe/gazelle/hl7v3/voc/DiseaseProgram.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Dissolve.java | 2 +- .../gazelle/hl7v3/voc/DocumentCompletion.java | 2 +- .../gazelle/hl7v3/voc/DocumentStorage.java | 2 +- .../hl7v3/voc/DocumentStorageActive.java | 2 +- .../ihe/gazelle/hl7v3/voc/DosageProblem.java | 2 +- .../voc/DosageProblemDetectedIssueCode.java | 2 +- .../voc/DoseDurationDetectedIssueCode.java | 2 +- .../DoseDurationHighDetectedIssueCode.java | 2 +- .../voc/DoseDurationLowDetectedIssueCode.java | 2 +- .../hl7v3/voc/DoseHighDetectedIssueCode.java | 2 +- .../voc/DoseIntervalDetectedIssueCode.java | 2 +- .../hl7v3/voc/DoseLowDetectedIssueCode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Douche.java | 2 +- .../ihe/gazelle/hl7v3/voc/DropsDrugForm.java | 2 +- .../hl7v3/voc/DuplicateTherapyAlert.java | 2 +- ...ipmentAndOrMedicalSupplySupplierHIPAA.java | 2 +- ...ipmentandMedicalSuppliesProviderCodes.java | 2 +- .../hl7v3/voc/ECGObservationSeriesType.java | 2 +- .../gazelle/hl7v3/voc/ERPracticeSetting.java | 2 +- .../gazelle/hl7v3/voc/EasternAlgonquin.java | 2 +- .../gazelle/hl7v3/voc/EasternApachean.java | 2 +- .../ihe/gazelle/hl7v3/voc/EasternMiwok.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/EditStatus.java | 2 +- .../ihe/gazelle/hl7v3/voc/EducationLevel.java | 2 +- .../hl7v3/voc/ElectroOsmosisRoute.java | 2 +- .../EmergencyMedicalServiceProviderHIPAA.java | 2 +- ...yMedicalServiceProvidersProviderCodes.java | 2 +- .../voc/EmergencyMedicineProviderCodes.java | 2 +- .../voc/EmergencyPharmacySupplyType.java | 2 +- .../gazelle/hl7v3/voc/EmployeeJobClass.java | 2 +- .../hl7v3/voc/EncounterAdmissionSource.java | 2 +- .../hl7v3/voc/EncounterSpecialCourtesy.java | 2 +- .../gazelle/hl7v3/voc/EndocervicalRoute.java | 2 +- .../hl7v3/voc/EndocrinologyClinic.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Enema.java | 2 +- .../ihe/gazelle/hl7v3/voc/EnteralRoute.java | 2 +- .../hl7v3/voc/EntericCoatedCapsule.java | 2 +- .../hl7v3/voc/EntericCoatedTablet.java | 2 +- .../ihe/gazelle/hl7v3/voc/EntityClass.java | 2 +- .../hl7v3/voc/EntityClassContainer.java | 2 +- .../gazelle/hl7v3/voc/EntityClassDevice.java | 2 +- .../hl7v3/voc/EntityClassLivingSubject.java | 2 +- .../voc/EntityClassManufacturedMaterial.java | 2 +- .../hl7v3/voc/EntityClassMaterial.java | 2 +- .../EntityClassNonPersonLivingSubject.java | 2 +- .../hl7v3/voc/EntityClassOrganization.java | 2 +- .../gazelle/hl7v3/voc/EntityClassPlace.java | 2 +- .../gazelle/hl7v3/voc/EntityClassRoot.java | 2 +- .../gazelle/hl7v3/voc/EntityClassState.java | 2 +- .../gazelle/hl7v3/voc/EntityDeterminer.java | 2 +- .../hl7v3/voc/EntityDeterminerDetermined.java | 2 +- .../ihe/gazelle/hl7v3/voc/EntityHandling.java | 2 +- .../hl7v3/voc/EntityNamePartQualifier.java | 2 +- .../gazelle/hl7v3/voc/EntityNamePartType.java | 2 +- .../hl7v3/voc/EntityNameSearchUse.java | 2 +- .../ihe/gazelle/hl7v3/voc/EntityNameUse.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/EntityRisk.java | 2 +- .../ihe/gazelle/hl7v3/voc/EntityStatus.java | 2 +- .../gazelle/hl7v3/voc/EntityStatusNormal.java | 2 +- .../ihe/gazelle/hl7v3/voc/EpiduralRoute.java | 2 +- .../hl7v3/voc/EquipmentAlertLevel.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Ethnicity.java | 2 +- .../gazelle/hl7v3/voc/EthnicityHispanic.java | 2 +- .../voc/EthnicityHispanicCentralAmerican.java | 2 +- .../hl7v3/voc/EthnicityHispanicMexican.java | 2 +- .../voc/EthnicityHispanicSouthAmerican.java | 2 +- .../hl7v3/voc/EthnicityHispanicSpaniard.java | 2 +- .../ihe/gazelle/hl7v3/voc/ExpectedSubset.java | 2 +- .../ihe/gazelle/hl7v3/voc/ExposureMode.java | 2 +- .../hl7v3/voc/ExtendedReleaseCapsule.java | 2 +- .../hl7v3/voc/ExtendedReleaseSuspension.java | 2 +- .../hl7v3/voc/ExtendedReleaseTablet.java | 2 +- .../ihe/gazelle/hl7v3/voc/Extensibility.java | 2 +- .../gazelle/hl7v3/voc/ExtraAmnioticRoute.java | 2 +- .../voc/ExtracorporealCirculationRoute.java | 2 +- ...viderTechnicianAndOrTechnologistHIPAA.java | 2 +- ...ndVisionServiceProvidersProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/FamilyMember.java | 2 +- .../gazelle/hl7v3/voc/FamilyMemberAunt.java | 2 +- .../gazelle/hl7v3/voc/FamilyMemberCousin.java | 2 +- .../gazelle/hl7v3/voc/FamilyMemberUncle.java | 2 +- .../voc/FamilyPracticeProviderCodes.java | 2 +- .../FirstFillCompletePharmacySupplyType.java | 2 +- .../FirstFillPartialPharmacySupplyType.java | 2 +- .../voc/FirstFillPharmacySupplyType.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Flush.java | 2 +- .../ihe/gazelle/hl7v3/voc/FoamDrugForm.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/FontStyle.java | 2 +- .../ihe/gazelle/hl7v3/voc/FosterChild.java | 2 +- .../hl7v3/voc/GIClinicPracticeSetting.java | 2 +- .../hl7v3/voc/GIDiagTherPracticeSetting.java | 2 +- .../gazelle/hl7v3/voc/GTSAbbreviation.java | 2 +- .../hl7v3/voc/GTSAbbreviationHolidays.java | 2 +- ...GTSAbbreviationHolidaysChristianRoman.java | 2 +- .../GTSAbbreviationHolidaysUSNational.java | 2 +- .../ihe/gazelle/hl7v3/voc/GasDrugForm.java | 2 +- .../gazelle/hl7v3/voc/GasLiquidMixture.java | 2 +- .../ihe/gazelle/hl7v3/voc/GasSolidSpray.java | 2 +- .../ihe/gazelle/hl7v3/voc/GastricRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/GelDrugForm.java | 2 +- .../ihe/gazelle/hl7v3/voc/GenderStatus.java | 2 +- .../hl7v3/voc/GeneralAcuteCareHospital.java | 2 +- ...GeneralAcuteCareHospitalProviderCodes.java | 2 +- .../voc/GeneralAcuteCareHospitalWomen.java | 2 +- .../hl7v3/voc/GenericUpdateReasonCode.java | 2 +- .../gazelle/hl7v3/voc/GenitourinaryRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/GingivalRoute.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/GrandChild.java | 2 +- .../ihe/gazelle/hl7v3/voc/Grandparent.java | 2 +- .../gazelle/hl7v3/voc/GreatGrandparent.java | 2 +- .../gazelle/hl7v3/voc/GroupProviderCodes.java | 2 +- .../hl7v3/voc/HL7AccommodationCode.java | 2 +- .../hl7v3/voc/HL7CommitteeIDInRIM.java | 2 +- .../hl7v3/voc/HL7ConformanceInclusion.java | 2 +- .../hl7v3/voc/HL7DefinedRoseProperty.java | 2 +- .../gazelle/hl7v3/voc/HL7ITSVersionCode.java | 2 +- .../hl7v3/voc/HL7StandardVersionCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/HL7UpdateMode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/HairRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/HalfSibling.java | 2 +- ...ormationSpecialistOrTechnologistHIPAA.java | 2 +- .../voc/HealthInformationTechnicianHIPAA.java | 2 +- .../voc/HealthcareProviderAgencyHIPAA.java | 2 +- .../hl7v3/voc/HeightSurfaceAreaAlert.java | 2 +- .../hl7v3/voc/HemClinPracticeSetting.java | 2 +- .../ihe/gazelle/hl7v3/voc/HomeAddressUse.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Homeless.java | 2 +- .../hl7v3/voc/HospitalPracticeSetting.java | 2 +- .../voc/HospitalUnitPracticeSetting.java | 2 +- .../hl7v3/voc/HospitalUnitsProviderCodes.java | 2 +- .../hl7v3/voc/HospitalsProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/HtmlLinkType.java | 2 +- .../voc/HumanSubstanceAdministrationSite.java | 2 +- .../gazelle/hl7v3/voc/ICUPracticeSetting.java | 2 +- .../hl7v3/voc/IDClinPracticeSetting.java | 2 +- .../ihe/gazelle/hl7v3/voc/ImageMediaType.java | 2 +- .../ihe/gazelle/hl7v3/voc/Implantation.java | 2 +- .../gazelle/hl7v3/voc/InactiveEditStatus.java | 2 +- ...dentalServiceDeliveryLocationRoleType.java | 2 +- .../hl7v3/voc/InclusionNotMandatory.java | 2 +- .../hl7v3/voc/InclusionNotRequired.java | 2 +- ...IndividualInsuredCoveredPartyRoleType.java | 2 +- .../voc/IndividualPackageEntityType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Infusion.java | 2 +- .../gazelle/hl7v3/voc/InhalantDrugForm.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Inhalation.java | 2 +- .../hl7v3/voc/InhalerMedicalDevice.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Injection.java | 2 +- .../hl7v3/voc/InjectionMedicalDevice.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Insertion.java | 2 +- .../ihe/gazelle/hl7v3/voc/Instillation.java | 2 +- .../ihe/gazelle/hl7v3/voc/Institution.java | 2 +- .../hl7v3/voc/IntegrityCheckAlgorithm.java | 2 +- .../voc/InteractionDetectedIssueCode.java | 2 +- .../hl7v3/voc/InterameningealRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/InteriorSalish.java | 2 +- .../voc/InternalMedicineProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/InterstitialRoute.java | 2 +- .../hl7v3/voc/IntraabdominalRoute.java | 2 +- .../hl7v3/voc/IntraarterialInjection.java | 2 +- .../gazelle/hl7v3/voc/IntraarterialRoute.java | 2 +- .../hl7v3/voc/IntraarticularRoute.java | 2 +- .../hl7v3/voc/IntrabronchialRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrabursalRoute.java | 2 +- .../hl7v3/voc/IntracardiacInjection.java | 2 +- .../gazelle/hl7v3/voc/IntracardiacRoute.java | 2 +- .../hl7v3/voc/IntracartilaginousRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracaudalRoute.java | 2 +- .../hl7v3/voc/IntracavernosalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracavitaryRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracerebralRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracervicalRoute.java | 2 +- .../hl7v3/voc/IntracisternalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracornealRoute.java | 2 +- .../gazelle/hl7v3/voc/IntracoronalRoute.java | 2 +- .../hl7v3/voc/IntracoronaryInjection.java | 2 +- .../gazelle/hl7v3/voc/IntracoronaryRoute.java | 2 +- .../hl7v3/voc/IntracorpusCavernosumRoute.java | 2 +- .../gazelle/hl7v3/voc/IntradermalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntradiscalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraductalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraduodenalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraduralRoute.java | 2 +- .../hl7v3/voc/IntraepidermalRoute.java | 2 +- .../hl7v3/voc/IntraepithelialRoute.java | 2 +- .../hl7v3/voc/IntraesophagealRoute.java | 2 +- .../gazelle/hl7v3/voc/IntragastricRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrailealRoute.java | 2 +- .../gazelle/hl7v3/voc/IntralesionalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraluminalRoute.java | 2 +- .../hl7v3/voc/IntralymphaticRoute.java | 2 +- .../hl7v3/voc/IntramedullaryRoute.java | 2 +- .../hl7v3/voc/IntramuscularInjection.java | 2 +- .../gazelle/hl7v3/voc/IntraocularRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraosseousRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraovarianRoute.java | 2 +- .../hl7v3/voc/IntrapericardialRoute.java | 2 +- .../hl7v3/voc/IntraperitonealRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrapleuralRoute.java | 2 +- .../hl7v3/voc/IntraprostaticRoute.java | 2 +- .../hl7v3/voc/IntrapulmonaryRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrasinalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntraspinalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrasternalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrasynovialRoute.java | 2 +- .../hl7v3/voc/IntratendinousRoute.java | 2 +- .../hl7v3/voc/IntratesticularRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrathecalRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrathoracicRoute.java | 2 +- .../gazelle/hl7v3/voc/IntratrachealRoute.java | 2 +- .../gazelle/hl7v3/voc/IntratubularRoute.java | 2 +- .../gazelle/hl7v3/voc/IntratumorRoute.java | 2 +- .../gazelle/hl7v3/voc/IntratympanicRoute.java | 2 +- .../gazelle/hl7v3/voc/IntrauterineRoute.java | 2 +- .../gazelle/hl7v3/voc/IntravascularRoute.java | 2 +- .../hl7v3/voc/IntravenousInfusion.java | 2 +- .../hl7v3/voc/IntravenousInjection.java | 2 +- .../gazelle/hl7v3/voc/IntravenousRoute.java | 2 +- .../hl7v3/voc/IntraventricularRoute.java | 2 +- .../gazelle/hl7v3/voc/IntravesicleRoute.java | 2 +- .../gazelle/hl7v3/voc/IntravitrealRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/InuitInupiaq.java | 2 +- .../hl7v3/voc/InvoiceElementAdjudicated.java | 2 +- .../gazelle/hl7v3/voc/InvoiceElementPaid.java | 2 +- .../hl7v3/voc/InvoiceElementSubmitted.java | 2 +- .../gazelle/hl7v3/voc/IontophoresisRoute.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Iroquoian.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Irrigation.java | 2 +- .../gazelle/hl7v3/voc/IrrigationSolution.java | 2 +- .../gazelle/hl7v3/voc/IssueFilterCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/JejunumRoute.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Kalapuyan.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Keresan.java | 2 +- .../ihe/gazelle/hl7v3/voc/KiowaTanoan.java | 2 +- .../ihe/gazelle/hl7v3/voc/KitEntityType.java | 2 +- .../ihe/gazelle/hl7v3/voc/KoyukonIngalik.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/KutchinHan.java | 2 +- .../LOINCObservationActContextAgeType.java | 2 +- .../hl7v3/voc/LaboratoriesProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/LaboratoryHIPAA.java | 2 +- .../hl7v3/voc/LacrimalPunctaRoute.java | 2 +- .../hl7v3/voc/LanguageAbilityMode.java | 2 +- .../hl7v3/voc/LanguageAbilityProficiency.java | 2 +- .../ihe/gazelle/hl7v3/voc/LaryngealRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/LavageRoute.java | 2 +- .../gazelle/hl7v3/voc/LengthOutOfRange.java | 2 +- .../hl7v3/voc/LifeInsurancePolicy.java | 2 +- .../hl7v3/voc/LineAccessMedicalDevice.java | 2 +- .../ihe/gazelle/hl7v3/voc/LingualRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/LiquidCleanser.java | 2 +- .../gazelle/hl7v3/voc/LivingArrangement.java | 2 +- .../voc/LivingSubjectProductionClass.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Loan.java | 2 +- .../gazelle/hl7v3/voc/LocalMarkupIgnore.java | 2 +- .../hl7v3/voc/LocalRemoteControlState.java | 2 +- .../ihe/gazelle/hl7v3/voc/LotionDrugForm.java | 2 +- .../gazelle/hl7v3/voc/MDFAttributeType.java | 2 +- .../hl7v3/voc/MDFSubjectAreaPrefix.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Maiduan.java | 2 +- .../voc/ManagedCareOrganizationHIPAA.java | 2 +- ...ManagedCareOrganizationsProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/ManagedCarePolicy.java | 2 +- .../hl7v3/voc/ManagedParticipationStatus.java | 2 +- .../voc/ManagedParticipationStatusNormal.java | 2 +- .../gazelle/hl7v3/voc/MapRelationship.java | 2 +- .../ihe/gazelle/hl7v3/voc/MaritalStatus.java | 2 +- .../hl7v3/voc/MaterialDangerInfectious.java | 2 +- .../hl7v3/voc/MaterialDangerInflammable.java | 2 +- .../hl7v3/voc/MaterialEntityAdditive.java | 2 +- .../hl7v3/voc/MdfHmdMetSourceType.java | 2 +- .../ihe/gazelle/hl7v3/voc/MdfHmdRowType.java | 2 +- .../ihe/gazelle/hl7v3/voc/MdfRmimRowType.java | 2 +- .../hl7v3/voc/MedOncClinPracticeSetting.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/MediaType.java | 2 +- .../voc/MedicalGeneticsProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/MedicationCap.java | 2 +- .../voc/MedicationGeneralizationRoleType.java | 2 +- .../hl7v3/voc/MedicationObservationType.java | 2 +- .../voc/MedicationOrderReleaseReasonCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/MemberRoleType.java | 2 +- .../gazelle/hl7v3/voc/MessageCondition.java | 2 +- .../hl7v3/voc/MessageWaitingPriority.java | 2 +- .../gazelle/hl7v3/voc/MilitaryHospital.java | 2 +- .../voc/MilitaryHospitalProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/MilitaryRoleType.java | 2 +- .../ihe/gazelle/hl7v3/voc/MissouriRiver.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/MobileUnit.java | 2 +- .../gazelle/hl7v3/voc/MobilityImpaired.java | 2 +- .../ihe/gazelle/hl7v3/voc/ModelMediaType.java | 2 +- .../gazelle/hl7v3/voc/ModifyIndicator.java | 2 +- .../hl7v3/voc/MucosalAbsorptionRoute.java | 2 +- .../hl7v3/voc/MucousMembraneRoute.java | 2 +- .../voc/MultiUseContainerEntityType.java | 2 +- .../gazelle/hl7v3/voc/MultipartMediaType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Muskogean.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/NailRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/NameLegalUse.java | 2 +- .../hl7v3/voc/NameRepresentationUse.java | 2 +- .../gazelle/hl7v3/voc/NasalInhalation.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/NasalRoute.java | 2 +- .../gazelle/hl7v3/voc/NativeEntityAlaska.java | 2 +- .../hl7v3/voc/NativeEntityContiguous.java | 2 +- .../ihe/gazelle/hl7v3/voc/NaturalChild.java | 2 +- .../ihe/gazelle/hl7v3/voc/NaturalFather.java | 2 +- .../ihe/gazelle/hl7v3/voc/NaturalParent.java | 2 +- .../ihe/gazelle/hl7v3/voc/NaturalSibling.java | 2 +- .../ihe/gazelle/hl7v3/voc/Nebulization.java | 2 +- .../hl7v3/voc/NebulizationInhalation.java | 2 +- .../hl7v3/voc/NephClinPracticeSetting.java | 2 +- .../hl7v3/voc/NeuropsychologistHIPAA.java | 2 +- .../voc/NeuropsychologistProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/NieceNephew.java | 2 +- .../ihe/gazelle/hl7v3/voc/NoInformation.java | 2 +- .../gazelle/hl7v3/voc/NonDrugAgentEntity.java | 2 +- .../voc/NonRigidContainerEntityType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Nootkan.java | 2 +- .../gazelle/hl7v3/voc/NorthernCaddoan.java | 2 +- .../gazelle/hl7v3/voc/NorthernIroquoian.java | 2 +- .../voc/NuclearMedicineProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/NullFlavor.java | 2 +- .../hl7v3/voc/NursePractitionerHIPAA.java | 2 +- .../voc/NursePractitionerProviderCodes.java | 2 +- ...NursingOrCustodialCarePracticeSetting.java | 2 +- .../voc/NursingServiceProviderHIPAA.java | 2 +- .../NursingServiceProvidersProviderCodes.java | 2 +- .../NursingServiceRelatedProviderHIPAA.java | 2 +- ...ServiceRelatedProviderTechnicianHIPAA.java | 2 +- ...gServiceRelatedProvidersProviderCodes.java | 2 +- ...dCustodialCareFacilitiesProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/NutritionistHIPAA.java | 2 +- .../hl7v3/voc/NutritionistProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/ObservationAlert.java | 2 +- .../hl7v3/voc/ObservationAllergyType.java | 2 +- .../hl7v3/voc/ObservationAssetValue.java | 2 +- .../voc/ObservationDetectedIssueCode.java | 2 +- .../hl7v3/voc/ObservationDiagnosisTypes.java | 2 +- .../voc/ObservationDrugIntoleranceType.java | 2 +- .../ObservationEligibilityIndicatorValue.java | 2 +- ...servationEnvironmentalIntoleranceType.java | 2 +- .../voc/ObservationFoodIntoleranceType.java | 2 +- .../voc/ObservationHealthStatusValue.java | 2 +- .../hl7v3/voc/ObservationIncomeValue.java | 2 +- .../voc/ObservationInterpretationChange.java | 2 +- .../ObservationInterpretationExceptions.java | 2 +- .../ObservationInterpretationNormality.java | 2 +- ...vationInterpretationNormalityAbnormal.java | 2 +- ...servationInterpretationNormalityAlert.java | 2 +- ...bservationInterpretationNormalityHigh.java | 2 +- ...ObservationInterpretationNormalityLow.java | 2 +- ...vationInterpretationOustsideThreshold.java | 2 +- ...servationInterpretationSusceptibility.java | 2 +- .../hl7v3/voc/ObservationIntoleranceType.java | 2 +- .../voc/ObservationLivingDependencyValue.java | 2 +- .../voc/ObservationLivingExpenseValue.java | 2 +- .../voc/ObservationLivingSituationValue.java | 2 +- .../gazelle/hl7v3/voc/ObservationMethod.java | 2 +- .../ObservationNonAllergyIntoleranceType.java | 2 +- .../ObservationSocioEconomicStatusValue.java | 2 +- .../gazelle/hl7v3/voc/ObsoleteEditStatus.java | 2 +- .../ObstetricsGynecologyProviderCodes.java | 2 +- .../hl7v3/voc/OccupationalTherapistHIPAA.java | 2 +- .../OccupationalTherapistProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/OilDrugForm.java | 2 +- .../gazelle/hl7v3/voc/OintmentDrugForm.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Ojibwayan.java | 2 +- .../gazelle/hl7v3/voc/OphthalmicRoute.java | 2 +- .../gazelle/hl7v3/voc/OptometristHIPAA.java | 2 +- .../hl7v3/voc/OptometristProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/OralCapsule.java | 2 +- .../ihe/gazelle/hl7v3/voc/OralInhalation.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/OralRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/OralSolution.java | 2 +- .../ihe/gazelle/hl7v3/voc/OralSuspension.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/OralTablet.java | 2 +- .../gazelle/hl7v3/voc/OrderedListStyle.java | 2 +- .../gazelle/hl7v3/voc/OregonAthapaskan.java | 2 +- .../hl7v3/voc/OrganizationEntityType.java | 2 +- .../voc/OrganizationNamePartQualifier.java | 2 +- .../hl7v3/voc/OrganizationNameType.java | 2 +- .../hl7v3/voc/OrganizationNameUse.java | 2 +- .../voc/OrganizationNameUseLegalByBOT.java | 2 +- .../gazelle/hl7v3/voc/OromucosalRoute.java | 2 +- .../gazelle/hl7v3/voc/OropharyngealRoute.java | 2 +- .../hl7v3/voc/OrthoClinPracticeSetting.java | 2 +- .../voc/OrthopaedicSurgeryProviderCodes.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Other.java | 2 +- .../voc/OtherActionTakenManagementCode.java | 2 +- .../hl7v3/voc/OtherIndicationValue.java | 2 +- .../voc/OtherPhysicianOsteopathHIPAA.java | 2 +- .../OtherServiceProviderContractorHIPAA.java | 2 +- .../hl7v3/voc/OtherServiceProviderHIPAA.java | 2 +- .../OtherServiceProviderSpecialistHIPAA.java | 2 +- .../OtherServiceProvidersProviderCodes.java | 2 +- .../OtherTechnologistOrTechnicianHIPAA.java | 2 +- ...TechnologistOrTechnicianProviderHIPAA.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/OticRoute.java | 2 +- .../voc/OtolaryngologyProviderCodes.java | 2 +- .../OutpatientFacilityPracticeSetting.java | 2 +- .../ihe/gazelle/hl7v3/voc/PadDrugForm.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Pai.java | 2 +- .../hl7v3/voc/PainMedicineProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/Palaihnihan.java | 2 +- .../hl7v3/voc/ParameterizedDataType.java | 2 +- .../voc/ParameterizedDataTypeAnnotated.java | 2 +- .../hl7v3/voc/ParameterizedDataTypeBag.java | 2 +- ...meterizedDataTypeEventRelatedInterval.java | 2 +- .../voc/ParameterizedDataTypeHistorical.java | 2 +- .../voc/ParameterizedDataTypeInterval.java | 2 +- ...eNonParametricProbabilityDistribution.java | 2 +- ...TypeParametricProbabilityDistribution.java | 2 +- ...ParameterizedDataTypePeriodicInterval.java | 2 +- .../voc/ParameterizedDataTypeSequence.java | 2 +- .../hl7v3/voc/ParameterizedDataTypeSet.java | 2 +- .../hl7v3/voc/ParameterizedDataTypeType.java | 2 +- ...erizedDataTypeUncertainValueNarrative.java | 2 +- ...edDataTypeUncertainValueProbabilistic.java | 2 +- .../hl7v3/voc/ParanasalSinusesRoute.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Parent.java | 2 +- .../ihe/gazelle/hl7v3/voc/ParentInLaw.java | 2 +- .../gazelle/hl7v3/voc/ParenteralRoute.java | 2 +- .../hl7v3/voc/PartialCompletionScale.java | 2 +- .../hl7v3/voc/ParticipationAncillary.java | 2 +- .../ParticipationExposureparticipation.java | 2 +- .../voc/ParticipationIndirectTarget.java | 2 +- .../ParticipationInformationGenerator.java | 2 +- .../ParticipationInformationRecipient.java | 2 +- .../ParticipationInformationTranscriber.java | 2 +- .../gazelle/hl7v3/voc/ParticipationMode.java | 2 +- .../voc/ParticipationModeElectronicData.java | 2 +- .../hl7v3/voc/ParticipationModeVerbal.java | 2 +- .../hl7v3/voc/ParticipationModeWritten.java | 2 +- .../hl7v3/voc/ParticipationParticipation.java | 2 +- .../voc/ParticipationPhysicalPerformer.java | 2 +- .../hl7v3/voc/ParticipationSignature.java | 2 +- .../hl7v3/voc/ParticipationSubset.java | 2 +- .../hl7v3/voc/ParticipationTargetDevice.java | 2 +- .../hl7v3/voc/ParticipationTargetDirect.java | 2 +- .../voc/ParticipationTargetLocation.java | 2 +- .../hl7v3/voc/ParticipationTargetSubject.java | 2 +- .../gazelle/hl7v3/voc/ParticipationType.java | 2 +- .../hl7v3/voc/ParticipationVerifier.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/PastSubset.java | 2 +- .../ihe/gazelle/hl7v3/voc/PasteDrugForm.java | 2 +- .../ihe/gazelle/hl7v3/voc/PatchDrugForm.java | 2 +- .../hl7v3/voc/PathologyProviderCodes.java | 2 +- ...athologySpecialistOrTechnologistHIPAA.java | 2 +- .../hl7v3/voc/PathologyTechnicianHIPAA.java | 2 +- .../gazelle/hl7v3/voc/PatientImportance.java | 2 +- .../voc/PatientProfileQueryReasonCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/PaymentTerms.java | 2 +- .../hl7v3/voc/PayorParticipationFunction.java | 2 +- .../ihe/gazelle/hl7v3/voc/PayorRoleType.java | 2 +- .../hl7v3/voc/PediatricsProviderCodes.java | 2 +- .../hl7v3/voc/PedsClinPracticeSetting.java | 2 +- .../hl7v3/voc/PedsICUPracticeSetting.java | 2 +- .../hl7v3/voc/PedsPracticeSetting.java | 2 +- .../ihe/gazelle/hl7v3/voc/PerianalRoute.java | 2 +- .../gazelle/hl7v3/voc/PeriarticularRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/PeriduralRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/PerinealRoute.java | 2 +- .../gazelle/hl7v3/voc/PerineuralRoute.java | 2 +- .../gazelle/hl7v3/voc/PeriodontalRoute.java | 2 +- .../gazelle/hl7v3/voc/PermanentDentition.java | 2 +- .../hl7v3/voc/PersonDisabilityType.java | 2 +- .../hl7v3/voc/PersonNamePartAffixTypes.java | 2 +- .../voc/PersonNamePartChangeQualifier.java | 2 +- .../voc/PersonNamePartMiscQualifier.java | 2 +- .../hl7v3/voc/PersonNamePartQualifier.java | 2 +- .../ihe/gazelle/hl7v3/voc/PersonNameUse.java | 2 +- .../hl7v3/voc/PersonNameUseLegalByBOT.java | 2 +- .../hl7v3/voc/PersonNameUsePseudonym.java | 2 +- .../voc/PersonalRelationshipRoleType.java | 2 +- .../gazelle/hl7v3/voc/PharmacistHIPAA.java | 2 +- .../hl7v3/voc/PharmacistProviderCodes.java | 2 +- ...harmacyServiceProviderTechnicianHIPAA.java | 2 +- ...PharmacyServiceProvidersProviderCodes.java | 2 +- .../PharmacySupplyEventStockReasonCode.java | 2 +- ...SupplyRequestRenewalRefusalReasonCode.java | 2 +- ...edicineandRehabilitationProviderCodes.java | 2 +- .../hl7v3/voc/PhysicalTherapistHIPAA.java | 2 +- .../voc/PhysicalTherapistProviderCodes.java | 2 +- .../voc/PhysicianAndOrOsteopathHIPAA.java | 2 +- .../hl7v3/voc/PhysicianAssistantHIPAA.java | 2 +- .../voc/PhysicianAssistantProviderCodes.java | 2 +- ...rAdvancedPracticeNursingProviderHIPAA.java | 2 +- ...PracticeNursingProvidersProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Pidgin.java | 2 +- .../ihe/gazelle/hl7v3/voc/PillDrugForm.java | 2 +- .../gazelle/hl7v3/voc/PlaceEntityType.java | 2 +- .../hl7v3/voc/PlasticBottleEntityType.java | 2 +- .../voc/PlasticSurgeryProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/PlateauPenutian.java | 2 +- ...icineAndOrSurgeryServiceProviderHIPAA.java | 2 +- ...icineandSurgeryProvidersProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/PodiatristHIPAA.java | 2 +- .../hl7v3/voc/PodiatristProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Pomoan.java | 2 +- .../gazelle/hl7v3/voc/PostalAddressUse.java | 2 +- .../ihe/gazelle/hl7v3/voc/PowderDrugForm.java | 2 +- .../gazelle/hl7v3/voc/PowerOfAttorney.java | 2 +- .../voc/PrescriptionDispenseFilterCode.java | 2 +- .../voc/PreventiveMedicineProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/PrimaryDentition.java | 2 +- .../gazelle/hl7v3/voc/PrivateResidence.java | 2 +- .../voc/ProbabilityDistributionType.java | 2 +- .../ihe/gazelle/hl7v3/voc/ProcessingID.java | 2 +- .../ihe/gazelle/hl7v3/voc/ProcessingMode.java | 2 +- .../ProgramEligibleCoveredPartyRoleType.java | 2 +- .../ihe/gazelle/hl7v3/voc/Prosthodontics.java | 2 +- .../ihe/gazelle/hl7v3/voc/ProviderCodes.java | 2 +- .../PsychiatryandNeurologyProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/PsychoanalystHIPAA.java | 2 +- .../gazelle/hl7v3/voc/PsychologistHIPAA.java | 2 +- .../hl7v3/voc/PsychologistProviderCodes.java | 2 +- .../hl7v3/voc/PublicHealthcareProgram.java | 2 +- .../ihe/gazelle/hl7v3/voc/PulmonaryRoute.java | 2 +- .../hl7v3/voc/QualitySpecimenRoleType.java | 2 +- .../hl7v3/voc/QueryParameterValue.java | 2 +- .../ihe/gazelle/hl7v3/voc/QueryPriority.java | 2 +- .../gazelle/hl7v3/voc/QueryQuantityUnit.java | 2 +- .../gazelle/hl7v3/voc/QueryRequestLimit.java | 2 +- .../ihe/gazelle/hl7v3/voc/QueryResponse.java | 2 +- .../gazelle/hl7v3/voc/QueryStatusCode.java | 2 +- .../gazelle/hl7v3/voc/ROIOverlayShape.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Race.java | 2 +- .../hl7v3/voc/RaceAfricanAmericanAfrican.java | 2 +- .../gazelle/hl7v3/voc/RaceAlaskanIndian.java | 2 +- .../voc/RaceAlaskanIndianAthabascan.java | 2 +- .../gazelle/hl7v3/voc/RaceAlaskanNative.java | 2 +- .../hl7v3/voc/RaceAlaskanNativeAleut.java | 2 +- .../voc/RaceAlaskanNativeAleutAlutiiq.java | 2 +- .../voc/RaceAlaskanNativeAleutBristolBay.java | 2 +- .../voc/RaceAlaskanNativeAleutChugach.java | 2 +- .../voc/RaceAlaskanNativeAleutKoniag.java | 2 +- .../voc/RaceAlaskanNativeAleutUnangan.java | 2 +- .../hl7v3/voc/RaceAlaskanNativeEskimo.java | 2 +- .../voc/RaceAlaskanNativeInupiatEskimo.java | 2 +- .../voc/RaceAlaskanNativeSiberianEskimo.java | 2 +- .../voc/RaceAlaskanNativeYupikEskimo.java | 2 +- .../gazelle/hl7v3/voc/RaceAmericanIndian.java | 2 +- .../hl7v3/voc/RaceAmericanIndianApache.java | 2 +- .../hl7v3/voc/RaceAmericanIndianArapaho.java | 2 +- .../RaceAmericanIndianAssiniboineSioux.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCaddo.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCahuilla.java | 2 +- .../voc/RaceAmericanIndianCalifornia.java | 2 +- .../voc/RaceAmericanIndianChemakuan.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCherokee.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCheyenne.java | 2 +- .../voc/RaceAmericanIndianChickahominy.java | 2 +- .../hl7v3/voc/RaceAmericanIndianChinook.java | 2 +- .../hl7v3/voc/RaceAmericanIndianChippewa.java | 2 +- .../voc/RaceAmericanIndianChippewaCree.java | 2 +- .../hl7v3/voc/RaceAmericanIndianChoctaw.java | 2 +- .../hl7v3/voc/RaceAmericanIndianChumash.java | 2 +- .../hl7v3/voc/RaceAmericanIndianComanche.java | 2 +- .../voc/RaceAmericanIndianCoushatta.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCreek.java | 2 +- .../hl7v3/voc/RaceAmericanIndianCupeno.java | 2 +- .../hl7v3/voc/RaceAmericanIndianDelaware.java | 2 +- .../hl7v3/voc/RaceAmericanIndianDiegueno.java | 2 +- .../voc/RaceAmericanIndianEasternTribes.java | 2 +- .../voc/RaceAmericanIndianGrosVentres.java | 2 +- .../hl7v3/voc/RaceAmericanIndianHoopa.java | 2 +- .../hl7v3/voc/RaceAmericanIndianIowa.java | 2 +- .../hl7v3/voc/RaceAmericanIndianIroquois.java | 2 +- .../hl7v3/voc/RaceAmericanIndianKickapoo.java | 2 +- .../hl7v3/voc/RaceAmericanIndianKiowa.java | 2 +- .../hl7v3/voc/RaceAmericanIndianKlallam.java | 2 +- .../voc/RaceAmericanIndianLongIsland.java | 2 +- .../hl7v3/voc/RaceAmericanIndianLuiseno.java | 2 +- .../hl7v3/voc/RaceAmericanIndianMaidu.java | 2 +- .../hl7v3/voc/RaceAmericanIndianMiami.java | 2 +- .../hl7v3/voc/RaceAmericanIndianMicmac.java | 2 +- .../hl7v3/voc/RaceAmericanIndianNavajo.java | 2 +- .../RaceAmericanIndianNorthwestTribes.java | 2 +- .../hl7v3/voc/RaceAmericanIndianOttawa.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPaiute.java | 2 +- .../voc/RaceAmericanIndianPassamaquoddy.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPawnee.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPeoria.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPequot.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPima.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPomo.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPonca.java | 2 +- .../voc/RaceAmericanIndianPotawatomi.java | 2 +- .../hl7v3/voc/RaceAmericanIndianPueblo.java | 2 +- .../RaceAmericanIndianPugetSoundSalish.java | 2 +- .../hl7v3/voc/RaceAmericanIndianSacFox.java | 2 +- .../hl7v3/voc/RaceAmericanIndianSeminole.java | 2 +- .../hl7v3/voc/RaceAmericanIndianSerrano.java | 2 +- .../hl7v3/voc/RaceAmericanIndianShawnee.java | 2 +- .../hl7v3/voc/RaceAmericanIndianShoshone.java | 2 +- .../voc/RaceAmericanIndianShoshonePaiute.java | 2 +- .../hl7v3/voc/RaceAmericanIndianSioux.java | 2 +- .../voc/RaceAmericanIndianTohonoOOdham.java | 2 +- .../hl7v3/voc/RaceAmericanIndianUmpqua.java | 2 +- .../hl7v3/voc/RaceAmericanIndianUte.java | 2 +- .../voc/RaceAmericanIndianWampanoag.java | 2 +- .../hl7v3/voc/RaceAmericanIndianWashoe.java | 2 +- .../voc/RaceAmericanIndianWinnebago.java | 2 +- .../hl7v3/voc/RaceAmericanIndianYuman.java | 2 +- .../hl7v3/voc/RaceAmericanIndianYurok.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/RaceAsian.java | 2 +- .../hl7v3/voc/RaceBlackOrAfricanAmerican.java | 2 +- .../hl7v3/voc/RaceCanadianLatinIndian.java | 2 +- .../voc/RaceHawaiianOrPacificIsland.java | 2 +- .../gazelle/hl7v3/voc/RaceNativeAmerican.java | 2 +- .../voc/RacePacificIslandMelanesian.java | 2 +- .../voc/RacePacificIslandMicronesian.java | 2 +- .../voc/RacePacificIslandPolynesian.java | 2 +- .../hl7v3/voc/RaceSoutheastAlaskanIndian.java | 2 +- .../RaceSoutheastAlaskanIndianTlingit.java | 2 +- .../RaceSoutheastAlaskanIndianTsimshian.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/RaceWhite.java | 2 +- .../ihe/gazelle/hl7v3/voc/RaceWhiteArab.java | 2 +- .../gazelle/hl7v3/voc/RaceWhiteEuropean.java | 2 +- .../hl7v3/voc/RaceWhiteMiddleEast.java | 2 +- .../hl7v3/voc/RadDiagTherPracticeSetting.java | 2 +- .../voc/RadiologicTechnologistHIPAA.java | 2 +- .../RadiologicTechnologistProviderCodes.java | 2 +- .../hl7v3/voc/RadiologyProviderCodes.java | 2 +- .../hl7v3/voc/ReactionDetectedIssueCode.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/RealmOfUse.java | 2 +- .../gazelle/hl7v3/voc/RectalInstillation.java | 2 +- .../ihe/gazelle/hl7v3/voc/RectalRoute.java | 2 +- .../voc/RefillCompletePharmacySupplyType.java | 2 +- .../RefillFirstHerePharmacySupplyType.java | 2 +- .../voc/RefillPartFillPharmacySupplyType.java | 2 +- .../hl7v3/voc/RefillPharmacySupplyType.java | 2 +- .../RefillTrialBalancePharmacySupplyType.java | 2 +- .../hl7v3/voc/RegisteredDieticianHIPAA.java | 2 +- .../hl7v3/voc/RegisteredNurseHIPAA.java | 2 +- .../voc/RegisteredNurseProviderCodes.java | 2 +- .../voc/RehabilitationCounselorHIPAA.java | 2 +- .../RehabilitationCounselorProviderCodes.java | 2 +- .../hl7v3/voc/RehabilitationHospital.java | 2 +- .../RehabilitationHospitalProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/RejectedEditStatus.java | 2 +- .../voc/RelatedReactionDetectedIssueCode.java | 2 +- .../gazelle/hl7v3/voc/RelationalOperator.java | 2 +- .../hl7v3/voc/RelationshipConjunction.java | 2 +- .../hl7v3/voc/ReligiousAffiliation.java | 2 +- .../hl7v3/voc/RepetitionsOutOfRange.java | 2 +- .../hl7v3/voc/ResearchSubjectRoleBasis.java | 2 +- ...ntialTreatmentFacilitiesProviderCodes.java | 2 +- .../ResidentialTreatmentPracticeSetting.java | 2 +- .../hl7v3/voc/ResourceGroupEntityType.java | 2 +- ...litativeAndOrRestorativeProviderHIPAA.java | 2 +- ...torativeSpecialistOrTechnologistHIPAA.java | 2 +- ...torativeServiceProvidersProviderCodes.java | 2 +- ...ratoryTherapistCertifiedProviderCodes.java | 2 +- .../hl7v3/voc/RespiratoryTherapistHIPAA.java | 2 +- ...atoryTherapistRegisteredProviderCodes.java | 2 +- .../voc/RespiteCareFacilityProviderCodes.java | 2 +- .../hl7v3/voc/RespiteCareProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/ResponseLevel.java | 2 +- .../gazelle/hl7v3/voc/ResponseModality.java | 2 +- .../ihe/gazelle/hl7v3/voc/ResponseMode.java | 2 +- .../gazelle/hl7v3/voc/ResponsibleParty.java | 2 +- .../gazelle/hl7v3/voc/RetrobulbarRoute.java | 2 +- .../hl7v3/voc/RheumClinPracticeSetting.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Rinse.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Ritwan.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/River.java | 2 +- .../ihe/gazelle/hl7v3/voc/RoleClassAgent.java | 2 +- .../hl7v3/voc/RoleClassAssignedEntity.java | 2 +- .../gazelle/hl7v3/voc/RoleClassContact.java | 2 +- .../hl7v3/voc/RoleClassCoveredParty.java | 2 +- .../voc/RoleClassDistributedMaterial.java | 2 +- .../gazelle/hl7v3/voc/RoleClassEmployee.java | 2 +- .../hl7v3/voc/RoleClassEquivalentEntity.java | 2 +- .../voc/RoleClassExposureAgentCarrier.java | 2 +- .../voc/RoleClassInactiveIngredient.java | 2 +- .../hl7v3/voc/RoleClassIngredientEntity.java | 2 +- ...IngredientEntityActiveIngredientByBOT.java | 2 +- .../voc/RoleClassInvestigationSubject.java | 2 +- .../hl7v3/voc/RoleClassIsSpeciesEntity.java | 2 +- .../hl7v3/voc/RoleClassLicensedEntity.java | 2 +- .../hl7v3/voc/RoleClassLocatedEntity.java | 2 +- .../voc/RoleClassManufacturedProduct.java | 2 +- .../voc/RoleClassMutualRelationship.java | 2 +- .../hl7v3/voc/RoleClassNamedInsured.java | 2 +- .../hl7v3/voc/RoleClassOntological.java | 2 +- ...ClassOntologicalEquivalentEntityByBOT.java | 2 +- .../gazelle/hl7v3/voc/RoleClassPartitive.java | 2 +- .../voc/RoleClassPartitivePartByBOT.java | 2 +- .../gazelle/hl7v3/voc/RoleClassPassive.java | 2 +- .../voc/RoleClassRelationshipFormal.java | 2 +- .../voc/RoleClassServiceDeliveryLocation.java | 2 +- .../gazelle/hl7v3/voc/RoleClassSpecimen.java | 2 +- .../gazelle/hl7v3/voc/RoleLinkRelated.java | 2 +- .../ihe/gazelle/hl7v3/voc/RoleLinkType.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/RoleStatus.java | 2 +- .../gazelle/hl7v3/voc/RoleStatusNormal.java | 2 +- .../ihe/gazelle/hl7v3/voc/RouteByMethod.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Sahaptian.java | 2 +- .../gazelle/hl7v3/voc/SaukFoxKickapoo.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/ScalpRoute.java | 2 +- .../hl7v3/voc/SchedulingActReason.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Sequencing.java | 2 +- .../gazelle/hl7v3/voc/SerranoGabrielino.java | 2 +- .../ihe/gazelle/hl7v3/voc/SetOperator.java | 2 +- .../ihe/gazelle/hl7v3/voc/SetUpdateMode.java | 2 +- .../hl7v3/voc/SeverityObservation.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Shasta.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Sibling.java | 2 +- .../ihe/gazelle/hl7v3/voc/SiblingInLaw.java | 2 +- .../hl7v3/voc/SignificantOtherRoleType.java | 2 +- .../hl7v3/voc/SinusUnspecifiedRoute.java | 2 +- .../gazelle/hl7v3/voc/SirenikskiYupik.java | 2 +- .../SkilledNursingFacilityProviderCodes.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/SkinRoute.java | 2 +- .../gazelle/hl7v3/voc/SocialWorkerHIPAA.java | 2 +- .../hl7v3/voc/SocialWorkerProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/SoftTissueRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/SolidDrugForm.java | 2 +- .../gazelle/hl7v3/voc/SolutionDrugForm.java | 2 +- .../ihe/gazelle/hl7v3/voc/SouthernAlaska.java | 2 +- .../gazelle/hl7v3/voc/SouthernCaddoan.java | 2 +- .../ihe/gazelle/hl7v3/voc/SouthernNumic.java | 2 +- .../hl7v3/voc/SpecialistProviderCodes.java | 2 +- ...chnologistCardiovascularProviderCodes.java | 2 +- ...ologistHealthInformationProviderCodes.java | 2 +- ...cialistTechnologistOtherProviderCodes.java | 2 +- ...istTechnologistPathologyProviderCodes.java | 2 +- .../SpecialistTechnologistProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/SpecimenEntityType.java | 2 +- .../gazelle/hl7v3/voc/SpecimenRoleType.java | 2 +- ...gServiceSpecialistOrTechnologistHIPAA.java | 2 +- ...eechLanguageTechnologistProviderCodes.java | 2 +- ...guageandHearingProvidersProviderCodes.java | 2 +- .../voc/SponsorParticipationFunction.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Spouse.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/StepChild.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/StepParent.java | 2 +- .../ihe/gazelle/hl7v3/voc/StepSibling.java | 2 +- .../gazelle/hl7v3/voc/StreetAddressLine.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/StreetName.java | 2 +- .../gazelle/hl7v3/voc/StudentRoleType.java | 2 +- .../gazelle/hl7v3/voc/SubarachnoidRoute.java | 2 +- .../hl7v3/voc/SubconjunctivalRoute.java | 2 +- .../gazelle/hl7v3/voc/SubcutaneousRoute.java | 2 +- .../gazelle/hl7v3/voc/SublesionalRoute.java | 2 +- .../gazelle/hl7v3/voc/SublingualRoute.java | 2 +- .../gazelle/hl7v3/voc/SubmucosalRoute.java | 2 +- .../voc/SubscriberCoveredPartyRoleType.java | 2 +- .../hl7v3/voc/SubsidizedHealthProgram.java | 2 +- ...erRehabilitationFacilityProviderCodes.java | 2 +- .../SubstanceAdminGenericSubstitution.java | 2 +- ...anceAdminSubstitutionNotAllowedReason.java | 2 +- .../voc/SubstanceAdminSubstitutionReason.java | 2 +- .../hl7v3/voc/SubstitutionCondition.java | 2 +- .../gazelle/hl7v3/voc/SupernumeraryTooth.java | 2 +- .../ihe/gazelle/hl7v3/voc/SupplierHIPAA.java | 2 +- .../hl7v3/voc/SuppliersProviderCodes.java | 2 +- .../voc/SupplyAppropriateManagementCode.java | 2 +- .../hl7v3/voc/SupplyDetectedIssueCode.java | 2 +- .../hl7v3/voc/SupplyOrderAbortReasonCode.java | 2 +- .../hl7v3/voc/SuppositoryDrugForm.java | 2 +- .../gazelle/hl7v3/voc/SuppositoryRoute.java | 2 +- .../hl7v3/voc/SurgClinPracticeSetting.java | 2 +- .../hl7v3/voc/SurgeryProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/SuspensionDrugForm.java | 2 +- .../ihe/gazelle/hl7v3/voc/SwabDrugForm.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Swish.java | 2 +- .../hl7v3/voc/TableCellHorizontalAlign.java | 2 +- .../ihe/gazelle/hl7v3/voc/TableCellScope.java | 2 +- .../hl7v3/voc/TableCellVerticalAlign.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/TableFrame.java | 2 +- .../ihe/gazelle/hl7v3/voc/TableRuleStyle.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/TableRules.java | 2 +- .../ihe/gazelle/hl7v3/voc/TabletDrugForm.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Tanana.java | 2 +- .../ihe/gazelle/hl7v3/voc/TananaTutchone.java | 2 +- .../gazelle/hl7v3/voc/TargetAwareness.java | 2 +- ...hnicianHealthInformationProviderCodes.java | 2 +- .../voc/TechnicianOtherProviderCodes.java | 2 +- .../voc/TechnicianPathologyProviderCodes.java | 2 +- .../hl7v3/voc/TechnicianProviderCodes.java | 2 +- .../TechnicianTechnologistProviderCodes.java | 2 +- ...echnicalServiceProvidersProviderCodes.java | 2 +- .../voc/TelecommunicationAddressUse.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Tepiman.java | 2 +- .../ihe/gazelle/hl7v3/voc/TextMediaType.java | 2 +- .../TherapeuticProductDetectedIssueCode.java | 2 +- .../voc/TherapyAppropriateManagementCode.java | 2 +- .../hl7v3/voc/TimingDetectedIssueCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/TimingEvent.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Tiwa.java | 2 +- .../hl7v3/voc/TopicalAbsorptionRoute.java | 2 +- .../gazelle/hl7v3/voc/TopicalApplication.java | 2 +- .../ihe/gazelle/hl7v3/voc/TopicalPowder.java | 2 +- .../gazelle/hl7v3/voc/TopicalSolution.java | 2 +- .../gazelle/hl7v3/voc/TracheostomyRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/Transdermal.java | 2 +- .../gazelle/hl7v3/voc/TransdermalPatch.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Transfer.java | 2 +- .../gazelle/hl7v3/voc/TransferActReason.java | 2 +- .../voc/TransmissionRelationshipTypeCode.java | 2 +- .../gazelle/hl7v3/voc/TransmucosalRoute.java | 2 +- .../hl7v3/voc/TransplacentalRoute.java | 2 +- .../hl7v3/voc/TransportationServiceHIPAA.java | 2 +- .../TransportationServicesProviderCodes.java | 2 +- .../gazelle/hl7v3/voc/TranstrachealRoute.java | 2 +- .../gazelle/hl7v3/voc/TranstympanicRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/TribalEntityUS.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Tsamosan.java | 2 +- .../ihe/gazelle/hl7v3/voc/Tsimshianic.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/URLScheme.java | 2 +- .../voc/UnderwriterParticipationFunction.java | 2 +- .../voc/UnitOfMeasureAtomBaseUnitInsens.java | 2 +- .../voc/UnitOfMeasureAtomBaseUnitSens.java | 2 +- .../hl7v3/voc/UnitOfMeasureAtomInsens.java | 2 +- .../hl7v3/voc/UnitOfMeasureAtomSens.java | 2 +- .../hl7v3/voc/UnitOfMeasurePrefixInsens.java | 2 +- .../hl7v3/voc/UnitOfMeasurePrefixSens.java | 2 +- .../voc/UnitsOfMeasureCaseInsensitive.java | 2 +- .../voc/UnitsOfMeasureCaseSensitive.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Unknown.java | 2 +- .../gazelle/hl7v3/voc/UnorderedListStyle.java | 2 +- .../ihe/gazelle/hl7v3/voc/UpperChinook.java | 2 +- .../ihe/gazelle/hl7v3/voc/UreteralRoute.java | 2 +- .../ihe/gazelle/hl7v3/voc/UrethralRoute.java | 2 +- .../hl7v3/voc/UrinaryBladderIrrigation.java | 2 +- .../hl7v3/voc/UrinaryBladderRoute.java | 2 +- .../gazelle/hl7v3/voc/UrinaryTractRoute.java | 2 +- .../gazelle/hl7v3/voc/VaccineEntityType.java | 2 +- .../hl7v3/voc/VaccineManufacturer.java | 2 +- .../ihe/gazelle/hl7v3/voc/VaccineType.java | 2 +- .../ihe/gazelle/hl7v3/voc/VaginalCream.java | 2 +- .../ihe/gazelle/hl7v3/voc/VaginalFoam.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/VaginalGel.java | 2 +- .../gazelle/hl7v3/voc/VaginalOintment.java | 2 +- .../ihe/gazelle/hl7v3/voc/VaginalRoute.java | 2 +- .../gazelle/hl7v3/voc/ValidationIssue.java | 2 +- .../gazelle/hl7v3/voc/ValueSetOperator.java | 2 +- .../gazelle/hl7v3/voc/ValueSetPropertyId.java | 2 +- .../ihe/gazelle/hl7v3/voc/ValueSetStatus.java | 2 +- .../gazelle/hl7v3/voc/VerificationMethod.java | 2 +- .../hl7v3/voc/VerificationOutcomeValue.java | 2 +- .../gazelle/hl7v3/voc/VeterinarianHIPAA.java | 2 +- .../hl7v3/voc/VeterinarianProviderCodes.java | 2 +- .../ihe/gazelle/hl7v3/voc/VideoMediaType.java | 2 +- .../hl7v3/voc/VitreousHumourRoute.java | 2 +- .../hl7v3/voc/VocabularyDomainQualifier.java | 2 +- .../ihe/gazelle/hl7v3/voc/WeightAlert.java | 2 +- .../gazelle/hl7v3/voc/WesternApachean.java | 2 +- .../ihe/gazelle/hl7v3/voc/WesternMiwok.java | 2 +- .../gazelle/hl7v3/voc/WesternMuskogean.java | 2 +- .../ihe/gazelle/hl7v3/voc/WesternNumic.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Wintuan.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Wiyot.java | 2 +- .../hl7v3/voc/WorkPlaceAddressUse.java | 2 +- .../voc/XAccommodationRequestorRole.java | 2 +- .../voc/XActClassCareProvisionEncounter.java | 2 +- .../XActClassCareProvisionObservation.java | 2 +- .../voc/XActClassCareProvisionProcedure.java | 2 +- .../hl7v3/voc/XActClassDocumentEntryAct.java | 2 +- .../voc/XActClassDocumentEntryOrganizer.java | 2 +- .../hl7v3/voc/XActEncounterReason.java | 2 +- .../XActFinancialProductAcquisitionCode.java | 2 +- .../ihe/gazelle/hl7v3/voc/XActMoodDefEvn.java | 2 +- .../gazelle/hl7v3/voc/XActMoodDefEvnRqo.java | 2 +- .../hl7v3/voc/XActMoodDefEvnRqoPrmsPrp.java | 2 +- .../voc/XActMoodDocumentObservation.java | 2 +- .../hl7v3/voc/XActMoodEvnOrdPrmsPrp.java | 2 +- .../hl7v3/voc/XActMoodIntentEvent.java | 2 +- .../gazelle/hl7v3/voc/XActMoodOrdPrms.java | 2 +- .../gazelle/hl7v3/voc/XActMoodOrdPrmsEvn.java | 2 +- .../gazelle/hl7v3/voc/XActMoodPermPermrq.java | 2 +- .../hl7v3/voc/XActMoodRequestEvent.java | 2 +- .../hl7v3/voc/XActMoodRqoPrpAptArq.java | 2 +- .../hl7v3/voc/XActOrderableOrBillable.java | 2 +- .../hl7v3/voc/XActRelationshipDocument.java | 2 +- .../hl7v3/voc/XActRelationshipEntry.java | 2 +- .../XActRelationshipEntryRelationship.java | 2 +- .../XActRelationshipExternalReference.java | 2 +- .../voc/XActRelationshipPatientTransport.java | 2 +- .../voc/XActRelationshipPertinentInfo.java | 2 +- ...XActRelationshipRelatedAuthorizations.java | 2 +- .../hl7v3/voc/XActReplaceOrRevise.java | 2 +- .../hl7v3/voc/XActStatusActiveComplete.java | 2 +- .../hl7v3/voc/XActStatusActiveSuspended.java | 2 +- ...dverseEventCausalityAssessmentMethods.java | 2 +- .../hl7v3/voc/XBasicConfidentialityKind.java | 2 +- .../hl7v3/voc/XClinicalStatementActMood.java | 2 +- .../voc/XClinicalStatementEncounterMood.java | 2 +- .../XClinicalStatementObservationMood.java | 2 +- .../voc/XClinicalStatementProcedureMood.java | 2 +- .../voc/XClinicalStatementSubstanceMood.java | 2 +- .../voc/XClinicalStatementSupplyMood.java | 2 +- .../hl7v3/voc/XDeterminerInstanceKind.java | 2 +- .../gazelle/hl7v3/voc/XDocumentActMood.java | 2 +- .../hl7v3/voc/XDocumentEncounterMood.java | 2 +- .../hl7v3/voc/XDocumentEntrySubject.java | 2 +- .../hl7v3/voc/XDocumentProcedureMood.java | 2 +- .../gazelle/hl7v3/voc/XDocumentStatus.java | 2 +- .../gazelle/hl7v3/voc/XDocumentSubject.java | 2 +- .../hl7v3/voc/XDocumentSubstanceMood.java | 2 +- .../hl7v3/voc/XEncounterAdmissionUrgency.java | 2 +- .../hl7v3/voc/XEncounterParticipant.java | 2 +- .../voc/XEncounterPerformerParticipation.java | 2 +- .../voc/XEntityClassDocumentReceiving.java | 2 +- .../voc/XEntityClassPersonOrOrgReceiving.java | 2 +- .../hl7v3/voc/XInformationRecipient.java | 2 +- .../hl7v3/voc/XInformationRecipientRole.java | 2 +- .../hl7v3/voc/XLabProcessClassCodes.java | 2 +- .../voc/XLabSpecimenCollectionProviders.java | 2 +- .../hl7v3/voc/XMedicationOrImmunization.java | 2 +- .../hl7v3/voc/XOrganizationNamePartType.java | 2 +- .../voc/XParticipationAuthorPerformer.java | 2 +- .../hl7v3/voc/XParticipationEntVrf.java | 2 +- .../hl7v3/voc/XParticipationPrfEntVrf.java | 2 +- .../voc/XParticipationVrfRespSprfWit.java | 2 +- .../hl7v3/voc/XPayeeRelationshipRoleType.java | 2 +- .../hl7v3/voc/XPersonNamePartType.java | 2 +- .../hl7v3/voc/XPhoneOrEmailURLScheme.java | 2 +- .../gazelle/hl7v3/voc/XPhoneURLScheme.java | 2 +- .../voc/XPhysicalVerbalParticipationMode.java | 2 +- .../voc/XRoleClassAccommodationRequestor.java | 2 +- .../gazelle/hl7v3/voc/XRoleClassCoverage.java | 2 +- .../hl7v3/voc/XRoleClassCoverageInvoice.java | 2 +- .../voc/XRoleClassCredentialedEntity.java | 2 +- .../XRoleClassPayeePolicyRelationship.java | 2 +- .../ihe/gazelle/hl7v3/voc/XSUCCREPLPREV.java | 2 +- .../hl7v3/voc/XServiceEventPerformer.java | 2 +- ...stitutionConditionNoneOrUnconditional.java | 2 +- .../voc/XVeryBasicConfidentialityKind.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/Yaqui.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Yokuts.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Yokutsan.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/Yukian.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/_0272.java | 2 +- .../net/ihe/gazelle/hl7v3/voc/_0275a.java | 2 +- .../java/net/ihe/gazelle/hl7v3/voc/_0280.java | 2 +- .../net/ihe/gazelle/validation/Assertion.java | 9 +- .../validation/ValidationResultsOverview.java | 1 - .../PixV3QueryResponseTransformer.java | 4 +- .../PixV3QueryResponseTransformerTest.java | 2 +- .../ipf/commons/ihe/hpd/HpdUtils.java | 4 +- .../ipf/commons/ihe/hpd/HpdValidator.java | 32 +- .../ihe/hpd/controls/ConsumerHpdHandler.java | 4 +- .../pagination/ConsumerPaginationHandler.java | 33 +- .../pagination/EhcachePaginationStorage.java | 12 - .../pagination/JCachePaginationStorage.java | 17 +- .../pagination/ProducerPaginationHandler.java | 3 +- .../SpringCachePaginationStorage.java | 17 +- .../sorting/ConsumerSortingHandler.java | 21 +- .../sorting/SearchResponseSorter.java | 4 +- .../hpd/controls/sorting/SortControl2.java | 35 +- .../sorting/SortResponseControl2.java | 4 +- .../strategies/SortControlStrategy.java | 13 +- .../SortResponseControlStrategy.java | 2 +- .../ihe/hpd/iti59/Iti59AuditStrategy.java | 21 +- .../hpd/iti59/Iti59ClientAuditStrategy.java | 4 +- .../hpd/iti59/Iti59ServerAuditStrategy.java | 4 +- .../stub/json/BatchResponseIntermediary.java | 5 +- .../stub/json/ControlListDeserializer.java | 9 +- .../hpd/stub/json/ControlListSerializer.java | 10 +- .../stub/json/JaxbElementListSerializer.java | 12 +- .../commons/ihe/ws/JaxWsClientFactory.java | 6 +- .../SpringCacheAsynchronyCorrelator.java | 3 +- .../ihe/ws/cxf/AbstractSafeInterceptor.java | 4 +- .../MustUnderstandDecoratorInterceptor.java | 3 +- .../cxf/audit/AbstractAuditInterceptor.java | 10 +- .../cxf/audit/AuditResponseInterceptor.java | 6 +- .../ihe/ws/cxf/audit/WsAuditDataset.java | 2 + .../InPayloadExtractorInterceptor.java | 11 +- .../ipf/commons/ihe/ws/utils/SoapUtils.java | 4 +- .../commons/ihe/ws/server/ServletServer.java | 9 +- .../commons/ihe/ws/server/TestServers.java | 7 +- .../commons/ihe/ws/utils/LargeDataSource.java | 6 +- .../ihe/xacml20/ChPpqPolicySetCreator.groovy | 2 +- .../ipf/commons/ihe/xacml20/Xacml20Utils.java | 21 +- .../ihe/xacml20/chadr/ChAdrAuditStrategy.java | 23 +- .../chppq1/ChPpq1ClientAuditStrategy.java | 4 +- .../chppq1/ChPpq1ServerAuditStrategy.java | 4 +- .../xacml20/chppq2/ChPpq2AuditStrategy.java | 15 +- .../ihe/xacml20/iti79/Iti79AuditStrategy.java | 7 +- .../ihe/xds/core/XdsRuntimeException.java | 1 - .../ihe/xds/core/audit/XdsAuditDataset.java | 2 + ...ructiveDocumentSetRequestAuditDataset.java | 3 + .../xds/core/audit/XdsQueryAuditDataset.java | 3 + .../audit/XdsRemoveMetadataAuditDataset.java | 3 + .../xds/core/audit/XdsSubmitAuditDataset.java | 3 + .../ebxml30/EbXMLRegistryResponse30.java | 2 +- .../EbXMLRetrieveDocumentSetResponse30.java | 2 +- .../ihe/xds/core/metadata/Address.java | 2 + .../xds/core/metadata/AssigningAuthority.java | 2 + .../ihe/xds/core/metadata/Association.java | 3 + .../commons/ihe/xds/core/metadata/Author.java | 3 + .../core/metadata/CXiAssigningAuthority.java | 2 + .../commons/ihe/xds/core/metadata/Code.java | 2 + .../ihe/xds/core/metadata/Document.java | 3 + .../ihe/xds/core/metadata/DocumentEntry.java | 3 + .../commons/ihe/xds/core/metadata/Folder.java | 3 + .../ihe/xds/core/metadata/Hl7v2Based.java | 3 + .../ihe/xds/core/metadata/Identifiable.java | 6 +- .../xds/core/metadata/LocalizedString.java | 3 + .../commons/ihe/xds/core/metadata/Name.java | 7 +- .../xds/core/metadata/ObjectReference.java | 3 + .../ihe/xds/core/metadata/Organization.java | 2 + .../ihe/xds/core/metadata/PatientInfo.java | 2 + .../commons/ihe/xds/core/metadata/Person.java | 2 + .../ihe/xds/core/metadata/Recipient.java | 3 + .../ihe/xds/core/metadata/ReferenceId.java | 2 + .../ihe/xds/core/metadata/SubmissionSet.java | 3 + .../ihe/xds/core/metadata/Telecom.java | 3 + .../ihe/xds/core/metadata/TimeRange.java | 3 + .../ihe/xds/core/metadata/Timestamp.java | 22 +- .../ihe/xds/core/metadata/Version.java | 3 + .../ihe/xds/core/metadata/XDSMetaClass.java | 2 + .../ihe/xds/core/metadata/XcnName.java | 3 + .../ihe/xds/core/metadata/XpnName.java | 3 + .../ClassificationListAdapter.java | 6 +- .../xds/core/requests/DocumentReference.java | 3 + .../NonconstructiveDocumentSetRequest.java | 3 + .../ProvideAndRegisterDocumentSet.java | 2 + .../ihe/xds/core/requests/QueryRegistry.java | 3 + .../core/requests/RegisterDocumentSet.java | 2 + .../xds/core/requests/RemoveDocuments.java | 3 + .../ihe/xds/core/requests/RemoveMetadata.java | 3 + .../core/requests/RetrieveDocumentSet.java | 3 + .../requests/RetrieveImagingDocumentSet.java | 3 + .../ihe/xds/core/requests/RetrieveSeries.java | 3 + .../ihe/xds/core/requests/RetrieveStudy.java | 3 + .../core/requests/query/DocumentsQuery.java | 3 + .../xds/core/requests/query/FetchQuery.java | 3 + .../requests/query/FindDispensesQuery.java | 3 + .../FindDocumentsByReferenceIdQuery.java | 3 + ...FindDocumentsForMultiplePatientsQuery.java | 3 + .../requests/query/FindDocumentsQuery.java | 3 + .../FindFoldersForMultiplePatientsQuery.java | 3 + .../core/requests/query/FindFoldersQuery.java | 3 + .../FindMedicationAdministrationsQuery.java | 3 + .../query/FindMedicationListQuery.java | 3 + .../FindMedicationTreatmentPlansQuery.java | 3 + .../FindPrescriptionsForDispenseQuery.java | 3 + .../FindPrescriptionsForValidationQuery.java | 3 + .../query/FindPrescriptionsQuery.java | 3 + .../query/FindSubmissionSetsQuery.java | 3 + .../xds/core/requests/query/GetAllQuery.java | 3 + .../requests/query/GetAssociationsQuery.java | 3 + .../requests/query/GetByIdAndCodesQuery.java | 3 + .../xds/core/requests/query/GetByIdQuery.java | 3 + .../core/requests/query/GetByUuidQuery.java | 3 + .../GetDocumentsAndAssociationsQuery.java | 3 + .../requests/query/GetDocumentsQuery.java | 3 + .../query/GetFolderAndContentsQuery.java | 3 + .../query/GetFoldersForDocumentQuery.java | 3 + .../core/requests/query/GetFoldersQuery.java | 3 + .../requests/query/GetFromDocumentQuery.java | 3 + .../query/GetRelatedDocumentsQuery.java | 3 + .../GetSubmissionSetAndContentsQuery.java | 3 + .../query/GetSubmissionSetsQuery.java | 3 + .../query/PharmacyDocumentsQuery.java | 3 + .../query/PharmacyStableDocumentsQuery.java | 3 + .../xds/core/requests/query/QueryList.java | 3 + .../xds/core/requests/query/StoredQuery.java | 3 + .../SubscriptionForDocumentEntryQuery.java | 3 + .../query/SubscriptionForFolderQuery.java | 3 + .../ihe/xds/core/responses/ErrorInfo.java | 3 + .../ihe/xds/core/responses/QueryResponse.java | 3 + .../ihe/xds/core/responses/Response.java | 3 + .../xds/core/responses/RetrievedDocument.java | 3 + .../core/responses/RetrievedDocumentSet.java | 3 + .../requests/query/QuerySlotHelper.java | 2 +- .../ihe/xds/core/validate/CXiValidator.java | 2 +- .../core/validate/XDSMetaDataException.java | 1 - .../query/HomeCommunityIdValidation.java | 19 +- .../requests/AdhocQueryRequestValidator.java | 522 +- .../responses/QueryResponseValidator.java | 2 +- .../transform/ebxml/Ebrs30MarshalingTest.java | 4 +- ...dDocumentsByTitleQueryTransformerTest.java | 3 - ...indSubmissionSetsQueryTransformerTest.java | 2 - ...oldersForDocumentQueryTransformerTest.java | 2 - .../GetFoldersQueryTransformerTest.java | 2 - ...tRelatedDocumentsQueryTransformerTest.java | 2 - .../xds/core/validate/UUIDValidatorTest.java | 6 +- .../AdhocQueryRequestValidatorTest.java | 2 +- .../SubmitObjectsRequestValidatorTest.java | 3 +- .../CommonsCoreBeanDefinitionParser.java | 3 +- .../SpringConfigurationPostProcessor.java | 17 +- .../spring/core/config/SpringRegistry.java | 6 +- .../spring/map/config/CustomMappings.java | 4 +- .../map/config/CustomMappingsConfigurer.java | 4 +- .../map/SpringBidiMappingServiceTest.java | 4 +- .../xml/AbstractCachingXmlProcessor.java | 15 +- .../commons/xml/LSResourceResolverImpl.java | 4 +- .../commons/xml/SchematronTransmogrifier.java | 15 +- .../xml/SchematronValidationException.java | 1 - .../openehealth/ipf/commons/xml/XmlUtils.java | 2 +- .../ipf/commons/xml/XqjTransmogrifier.java | 6 +- .../ipf/commons/xml/XsdValidator.java | 12 +- .../ipf/commons/xml/XsltTransmogrifier.java | 4 +- .../xml/SchematronTransmogrifierTest.java | 7 +- .../commons/xml/SchematronValidatorTest.java | 7 +- .../commons/xml/XqjTransmogrifierTest.java | 4 +- .../ipf/commons/xml/XsdValidatorTest.java | 8 +- ...TransmogrifierWithGlobalParameterTest.java | 8 +- .../commons/xml/XsltTransmogrifierTest.java | 5 +- dependencies/pom.xml | 54 +- .../support/CCDASchematronValidationTest.java | 10 +- .../cda/support/HITSPC32ValidationTest.java | 10 +- .../cda/support/HITSPC37ValidationTest.java | 10 +- .../cda/support/LabCDA20ValidationTest.java | 12 +- .../cda/support/LabCDAValidationTest.java | 16 +- .../cda/support/PHMRValidationTest.java | 40 +- .../ipf/modules/cda/CDAR2Validator.java | 2 +- .../modules/cda/DefaultValidationHandler.java | 8 +- .../ipf/modules/cda/CDAR2ParserTest.java | 21 +- .../ipf/modules/cda/CDAR2ValidatorTest.java | 16 +- modules/hl7-kotlin/pom.xml | 2 +- .../ipf/modules/hl7/kotlin/RepeatableField.kt | 2 +- .../CustomModelClassFactoryConfigurer.kt | 2 +- .../ipf/modules/hl7/kotlin/CompositeTest.kt | 30 +- .../ipf/modules/hl7/kotlin/GroupTest.kt | 1 - .../modules/hl7/message/MessageUtils.groovy | 4 +- .../CustomModelClassFactoryConfigurer.java | 4 +- .../hl7/parser/DefaultEscapingTest.java | 4 +- .../cda/extend/AbstractExtensionTest.java | 2 +- .../cda/extend/CDAModelExtensionTest.java | 4 +- .../core/extend/CoreExtensionModule.groovy | 2 +- .../camel/core/adapter/AggregatorAdapter.java | 2 +- .../camel/core/adapter/ValidatorAdapter.java | 4 +- .../config/CustomRouteBuilderConfigurer.java | 4 +- .../core/model/AbstractXmlDataFormat.java | 4 +- .../camel/core/reifier/DelegateReifier.java | 1 - .../platform/camel/core/util/Exchanges.java | 1 - .../core/adapter/ConverterRouteTest.java | 2 +- .../core/adapter/DataFormatRouteTest.java | 4 +- .../camel/core/adapter/ParserRouteTest.java | 8 +- .../camel/core/adapter/RendererRouteTest.java | 2 +- .../core/adapter/TransmogrifierRouteTest.java | 8 +- .../core/adapter/ValidatorRouteTest.java | 12 +- .../builder/ConverterRouteBuilder.java | 2 +- .../builder/DataFormatRouteBuilder.java | 2 +- .../adapter/builder/ParserRouteBuilder.java | 2 +- .../builder/PredicateRouteBuilder.java | 2 +- .../adapter/builder/RendererRouteBuilder.java | 2 +- .../builder/TransmogrifierRouteBuilder.java | 2 +- .../builder/ValidatorRouteBuilder.java | 2 +- .../exception/ErrorHandlingRouteBuilder.java | 2 +- .../camel/exception/ErrorHandlingTest.java | 2 +- .../ExceptionHandlingRouteBuilder.java | 2 +- .../exception/ExceptionHandlingTest.java | 2 +- .../core/extend/AbstractExtensionTest.java | 2 +- .../core/extend/DataFormatExtensionTest.java | 8 +- .../extend/ExpressionClauseExtensionTest.java | 4 +- .../extend/TransmogrifierExtensionTest.java | 13 +- ...agementNamingStrategyTestRouteBuilder.java | 2 +- .../core/process/splitter/SplitIndexTest.java | 22 +- .../core/process/splitter/SplitterTest.java | 6 +- .../support/TextFileIteratorTest.java | 6 +- .../support/builder/RouteBuilderSupport.java | 2 +- .../camel/core/support/domain/Animal.java | 2 +- .../camel/core/support/domain/Cat.java | 3 +- .../camel/core/support/domain/Dog.java | 3 +- .../support/processor/CountingProcessor.java | 4 +- .../support/processor/ExceptionProcessor.java | 2 +- .../support/processor/FailureProcessor.java | 2 +- .../support/transform/min/TestAggregator.java | 2 +- .../support/transform/min/TestPredicate.java | 2 +- .../support/transform/min/TestProcessor.java | 2 +- .../support/transform/min/TestRenderer.java | 5 +- .../transformer/ConstantTransformer.java | 2 +- .../transformer/FailureTransformer.java | 4 +- platform-camel/hl7/pom.xml | 6 - .../ipf/platform/camel/hl7/HL7v2.java | 2 +- .../hl7/converter/HL7MessageConverter.java | 9 +- .../ConformanceProfileValidators.java | 4 +- .../transport/Transport2RouteBuilder.groovy | 2 +- .../camel/hl7/SampleRouteBuilder2.java | 2 +- .../camel/hl7/SampleRouteBuilder2Test.java | 8 +- .../hl7/extend/AbstractExtensionTest.java | 2 +- .../extend/AcknowledgementExtensionTest.java | 13 +- .../camel/hl7/extend/SampleExtensionTest.java | 8 +- ...ransportTest2.java => Transport2Test.java} | 12 +- .../camel/hl7/transport/TransportTest.java | 3 +- .../ConformanceProfileValidatorsTest.java | 4 +- .../hl7/validation/TestRouteBuilder.java | 2 +- .../ihe/atna/util/CamelAuditMessageQueue.java | 5 +- .../ByteArrayToClinicalDocumentConverter.java | 3 +- .../ByteArrayToDataHandlerConverter.java | 3 +- .../converters/ByteArrayToDomConverter.java | 3 +- .../ClinicalDocumentToByteArrayConverter.java | 3 +- .../DataHandlerToByteArrayConverter.java | 3 +- .../converters/DomToByteArrayConverter.java | 3 +- .../continua/hrn/ContinuaHrnRouteBuilder.java | 2 +- .../hrn/ContinuaHrnTransactionTest.java | 4 +- .../camel/ihe/continua/hrn/DocumentTest.java | 10 +- .../camel/ihe/core/InterceptableEndpoint.java | 2 - .../core/ssl/StaticSSLContextParameters.java | 1 - .../ihe/fhir/core/FhirCamelTranslators.java | 6 +- .../ihe/fhir/core/FhirCamelValidators.java | 25 +- .../camel/ihe/fhir/core/FhirComponent.java | 3 +- .../camel/ihe/fhir/core/FhirConsumer.java | 1 - .../camel/ihe/fhir/core/FhirEndpoint.java | 7 +- .../fhir/core/FhirEndpointConfiguration.java | 4 +- .../camel/ihe/fhir/core/FhirProducer.java | 11 +- .../fhir/core/custom/CustomFhirEndpoint.java | 1 - .../consumer/AuditInterceptorUtils.java | 10 +- .../consumer/ConsumerAuditInterceptor.java | 6 +- .../producer/HapiClientAuditInterceptor.java | 5 +- .../producer/ProducerAuditInterceptor.java | 6 +- .../camel/ihe/fhir/FhirMockedSender.java | 2 +- .../ihe/fhir/chppqm/chppq3/ChPpq3Test.java | 6 +- .../chppqm/chppq3/ChPpq3TestRouteBuilder.java | 2 +- .../chppqm/chppq4/ChPpq4TestRouteBuilder.java | 2 +- .../ihe/fhir/chppqm/chppq5/ChPpq5Test.java | 2 +- .../chppqm/chppq5/ChPpq5TestRouteBuilder.java | 2 +- .../iti68/Iti68ConsumerAuditInterceptor.java | 4 +- .../Iti68BinaryConsumerAuditInterceptor.java | 4 +- .../fhir/iti105/Iti105TestRouteBuilder.java | 1 - .../fhir/iti65/v320/AbstractTestIti65.java | 4 +- .../fhir/iti65/v421/AbstractTestIti65.java | 7 +- .../iti66/v320/Iti66TestRouteBuilder.java | 2 +- .../iti66/v421/Iti66TestRouteBuilder.java | 2 +- .../ihe/fhir/iti66/v421/TestIti66Success.java | 1 - .../ihe/fhir/iti67/Iti67TestRouteBuilder.java | 2 +- .../ihe/fhir/iti67/TestIti67Success.java | 1 - .../fhir/iti67/TestIti67WithBalpAudit.java | 3 +- .../ihe/fhir/iti68/AbstractTestIti68.java | 1 - .../fhir/pharm5/Pharm5TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti83/Iti83Endpoint.java | 1 - .../ihe/fhir/iti78/AbstractTestIti78.java | 2 +- .../iti78/Iti78SecureTestRouteBuilder.java | 2 +- .../fhir/iti78/TestIti78SecureSuccess.java | 1 - .../fhir/iti78/TestIti78UnknownTarget.java | 4 +- .../ihe/fhir/iti83/AbstractTestIti83.java | 3 +- .../ihe/fhir/iti83/Iti83TestRouteBuilder.java | 2 +- .../ihe/fhir/iti83/TestIti83Success.java | 3 +- .../ihe/fhir/pcc44/AbstractTestPcc44.java | 2 +- .../camel/ihe/fhir/FhirMockedSender.java | 2 +- .../iti68/Iti68ConsumerAuditInterceptor.java | 6 +- .../ihe/fhir/iti65/AbstractTestIti65.java | 4 +- .../camel/ihe/fhir/iti65/TestIti65Error.java | 6 +- .../ihe/fhir/iti65/TestIti65Success.java | 5 +- .../ihe/fhir/iti66/Iti66TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti66/TestIti66Error.java | 4 +- .../ihe/fhir/iti67/Iti67TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti67/TestIti67Error.java | 4 +- .../ihe/fhir/iti67/TestIti67Success.java | 3 +- .../ihe/fhir/iti68/Iti68TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti68/TestIti68Error.java | 2 +- .../camel/ihe/fhir/iti83/Iti83Endpoint.java | 1 - .../ihe/fhir/iti78/AbstractTestIti78.java | 2 +- .../iti78/Iti78SecureTestRouteBuilder.java | 2 +- .../ihe/fhir/iti78/Iti78TestRouteBuilder.java | 2 +- .../camel/ihe/fhir/iti78/TestIti78Paging.java | 4 +- .../fhir/iti78/TestIti78UnknownTarget.java | 4 +- .../ihe/fhir/iti83/AbstractTestIti83.java | 8 +- .../ihe/fhir/iti83/Iti83TestRouteBuilder.java | 2 +- .../ihe/fhir/iti83/TestIti83NoPatient.java | 4 +- .../fhir/iti83/TestIti83UnknownSource.java | 4 +- .../fhir/iti83/TestIti83UnknownTarget.java | 4 +- .../ihe/fhir/pcc44/AbstractTestPcc44.java | 2 +- platform-camel/ihe/hl7v2/pom.xml | 8 +- .../ihe/hl7v2/Hl7v2AdaptingException.java | 1 - .../camel/ihe/hl7v2/Hl7v2MarshalUtils.java | 16 +- .../consumer/ConsumerAdaptingInterceptor.java | 6 +- .../consumer/ConsumerMarshalInterceptor.java | 10 +- .../ihe/hl7v2ws/AbstractHl7v2WebService.java | 6 +- ...tractHl7v2WsRejectionHandlingStrategy.java | 4 +- .../pcd01/MyRejectionHandlingStrategy.java | 4 +- .../ihe/hl7v2ws/pcd01/Pcd01RouteBuilder.java | 2 +- .../camel/ihe/hl7v2ws/pcd01/Pcd01Test.java | 18 +- .../hl7v2ws/pcd01/TransactedRouteTest.java | 26 +- .../Hl7v3ContinuationAwareProducer.groovy | 16 +- .../Hl7v3ContinuationAwareWebService.groovy | 40 +- .../camel/ihe/hl7v3/iti55/Iti55Service.java | 6 +- .../hl7v3/iti55/Iti55TestRouteBuilder.groovy | 8 +- .../camel/ihe/hl7v3/CustomInterceptor.java | 2 +- .../platform/camel/ihe/hpd/HpdService.java | 4 +- .../camel/ihe/hpd/chcidd/ChCiddService.java | 2 +- .../camel/ihe/hpd/chciq/ChCiqService.java | 3 +- .../camel/ihe/hpd/chpidd/ChPiddService.java | 2 +- platform-camel/ihe/mllp/pom.xml | 6 - .../core/CustomServerInitializerFactory.java | 14 +- .../ihe/mllp/core/Hl7CorrelationManager.java | 8 +- .../camel/ihe/mllp/core/MllpComponent.java | 10 +- .../ihe/mllp/core/MllpDispatchComponent.java | 2 +- .../MllpDispatchEndpointConfiguration.java | 2 +- .../camel/ihe/mllp/core/MllpEndpoint.java | 3 +- .../mllp/core/MllpEndpointConfiguration.java | 2 +- .../MllpTransactionEndpointConfiguration.java | 2 +- .../MllpAuditInterceptorSupport.java | 10 +- .../ConsumerDispatchingInterceptor.java | 10 +- ...rInteractiveResponseSenderInterceptor.java | 22 +- ...onsumerRequestDefragmenterInterceptor.java | 8 +- ...nteractiveResponseReceiverInterceptor.java | 8 +- .../ProducerRequestFragmenterInterceptor.java | 10 +- .../mllp/iti21/Iti21TestRouteBuilder.groovy | 6 +- .../camel/ihe/mllp/iti21/TestIti21.groovy | 2 +- .../ihe/mllp/iti8/BraveTracerFactoryBean.java | 2 +- .../ihe/mllp/iti8/TestIti8Validation.groovy | 4 +- .../ihe/mllp/iti9/TestIti9QueryStream.groovy | 4 +- .../core/mbean/SomeMllpItiRouteBuilder.java | 2 +- .../ws/AbstractAsyncResponseWebService.java | 4 +- .../camel/ihe/ws/AbstractWsEndpoint.java | 4 +- .../camel/ihe/ws/AbstractWsProducer.java | 6 +- .../camel/ihe/ws/mbean/SomeItiComponent.java | 1 - .../camel/ihe/ws/mbean/SomeItiEndpoint.java | 1 - .../ihe/xacml20/Xacml20QueryService.java | 2 +- .../ihe/xacml20/chppq1/ChPpq1Producer.java | 9 +- .../ihe/xacml20/chppq1/ChPpq1Service.java | 2 +- .../camel/ihe/xacml20/chadr/ChAdrTest.java | 6 +- .../xacml20/chadr/ChAdrTestRouteBuilder.java | 2 +- .../camel/ihe/xacml20/chppq1/ChPpq1Test.java | 3 +- .../chppq1/ChPpq1TestRouteBuilder.java | 3 +- .../camel/ihe/xacml20/chppq2/ChPpq2Test.java | 5 +- .../chppq2/ChPpq2TestRouteBuilder.java | 4 +- .../camel/ihe/xacml20/iti79/Iti79Test.java | 6 +- .../xacml20/iti79/Iti79TestRouteBuilder.java | 2 +- .../xds/iti38/Iti38TestRouteBuilder.groovy | 6 +- .../xds/iti39/Iti39TestRouteBuilder.groovy | 6 +- .../xds/iti63/Iti63TestRouteBuilder.groovy | 6 +- .../xds/rad75/Rad75TestRouteBuilder.groovy | 6 +- .../camel/ihe/xds/CommonCallbackHandler.java | 8 +- .../ihe/xds/MyRejectionHandlingStrategy.java | 2 +- .../xds/dispatch/DispatchRouteBuilder.java | 6 +- .../dispatch/DocumentRegistryPortType.java | 30 +- .../camel/ihe/xds/iti42/CxfEndpointTest.java | 13 +- .../cda/extend/AbstractExtensionTest.java | 2 +- .../cda/extend/MdhtModelExtensionTest.java | 7 +- pom.xml | 10 +- src/site/changes.xml | 19 +- .../basic/route/SampleRouteTest.java | 4 +- .../ipf/tutorials/config/base/Base.java | 10 +- .../config/base/route/MockInterceptor.java | 2 +- .../base/route/SampleRouteBuilderTest.java | 15 +- .../iheclient/IHEWebServiceClientTest.java | 3 +- 2821 files changed, 20173 insertions(+), 104941 deletions(-) create mode 100644 boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueue.java create mode 100644 boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueueTest.java create mode 100644 commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIExportBuilder.java create mode 100644 commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIImportBuilder.java create mode 100644 commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPatientRecordEventBuilder.java create mode 100644 commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultQueryInformationBuilder.java rename commons/ihe/hl7v2/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pdq/v25/message/{RSP_K21Test.java => RSPK21Test.java} (80%) rename commons/ihe/hl7v2/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pdq/v25/message/{RSP_ZV2Test.java => RSPZV2Test.java} (93%) rename commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/{QA_Pcd01DataTypesTest.java => QAPcd01DataTypesTest.java} (95%) rename commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/{QA_Pcd01MSHValidatorTest.java => QAPcd01MSHValidatorTest.java} (94%) rename commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/{QA_Pcd01OBRValidatorTest.java => QAPcd01OBRValidatorTest.java} (95%) rename commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/{QA_Pcd01OBXValidatorTest.java => QAPcd01OBXValidatorTest.java} (95%) rename commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/{QA_Pcd01PIDPV1ValidatorTest.java => QAPcd01PIDPV1ValidatorTest.java} (94%) rename platform-camel/hl7/src/test/java/org/openehealth/ipf/platform/camel/hl7/transport/{TransportTest2.java => Transport2Test.java} (90%) diff --git a/boot/ipf-atna-spring-boot-starter/pom.xml b/boot/ipf-atna-spring-boot-starter/pom.xml index 4c9ad1af90..7409472888 100644 --- a/boot/ipf-atna-spring-boot-starter/pom.xml +++ b/boot/ipf-atna-spring-boot-starter/pom.xml @@ -57,6 +57,11 @@ spring-security-web true + + org.apache.httpcomponents.client5 + httpclient5 + true + @@ -64,13 +69,6 @@ spring-boot-test test - org.springframework spring-test diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStartEventListener.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStartEventListener.java index 2dd0956079..8c3fd83de8 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStartEventListener.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStartEventListener.java @@ -16,6 +16,7 @@ package org.openehealth.ipf.boot.atna; +import lombok.NonNull; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; import org.openehealth.ipf.commons.audit.event.ApplicationActivityBuilder; @@ -27,9 +28,6 @@ import static java.util.Objects.requireNonNull; -/** - * - */ public class ApplicationStartEventListener implements ApplicationListener { private final AuditContext auditContext; @@ -42,7 +40,7 @@ public ApplicationStartEventListener(AuditContext auditContext) { } @Override - public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { + public void onApplicationEvent(@NonNull ContextRefreshedEvent contextRefreshedEvent) { if (contextRefreshedEvent.getApplicationContext() == applicationContext) { auditContext.audit( new ApplicationActivityBuilder.ApplicationStart(EventOutcomeIndicator.Success) diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStopEventListener.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStopEventListener.java index f391b50ac4..d532f7a6cb 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStopEventListener.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/ApplicationStopEventListener.java @@ -16,6 +16,7 @@ package org.openehealth.ipf.boot.atna; +import lombok.NonNull; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; import org.openehealth.ipf.commons.audit.event.ApplicationActivityBuilder; @@ -27,9 +28,6 @@ import static java.util.Objects.requireNonNull; -/** - * - */ public class ApplicationStopEventListener implements ApplicationListener { private final AuditContext auditContext; @@ -42,7 +40,7 @@ public ApplicationStopEventListener(AuditContext auditContext) { } @Override - public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { + public void onApplicationEvent(@NonNull ContextClosedEvent contextClosedEvent) { if (contextClosedEvent.getApplicationContext() == applicationContext) { auditContext.audit( new ApplicationActivityBuilder.ApplicationStop(EventOutcomeIndicator.Success) diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/AuthenticationListener.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/AuthenticationListener.java index 024a729fd9..0c969f1941 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/AuthenticationListener.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/AuthenticationListener.java @@ -16,6 +16,7 @@ package org.openehealth.ipf.boot.atna; +import lombok.NonNull; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; import org.openehealth.ipf.commons.audit.event.UserAuthenticationBuilder; @@ -42,7 +43,7 @@ public AuthenticationListener(AuditContext auditContext) { } @Override - public void onApplicationEvent(AbstractAuthenticationEvent authenticationEvent) { + public void onApplicationEvent(@NonNull AbstractAuthenticationEvent authenticationEvent) { delegateListener.onApplicationEvent(authenticationEvent); var outcome = authenticationEvent instanceof AbstractAuthenticationFailureEvent ? @@ -50,11 +51,9 @@ public void onApplicationEvent(AbstractAuthenticationEvent authenticationEvent) EventOutcomeIndicator.Success; var details = authenticationEvent.getAuthentication().getDetails(); - if (details instanceof WebAuthenticationDetails) { - var webAuthenticationDetails = (WebAuthenticationDetails) details; + if (details instanceof WebAuthenticationDetails webAuthenticationDetails) { var principal = authenticationEvent.getAuthentication().getPrincipal(); - if (principal instanceof UserDetails) { - var userDetails = (UserDetails) principal; + if (principal instanceof UserDetails userDetails) { var builder = new UserAuthenticationBuilder.Login(outcome) .setAuditSource(auditContext); diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfiguration.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfiguration.java index 042b67f3c9..d407b9850e 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfiguration.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfiguration.java @@ -35,9 +35,6 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; -/** - * - */ @Configuration @EnableConfigurationProperties(IpfAtnaConfigurationProperties.class) public class IpfAtnaAutoConfiguration { diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaConfigurationProperties.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaConfigurationProperties.java index 0269edc80f..091500d3af 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaConfigurationProperties.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaConfigurationProperties.java @@ -30,9 +30,6 @@ import org.openehealth.ipf.commons.audit.types.AuditSource; import org.springframework.boot.context.properties.ConfigurationProperties; -/** - * - */ @ConfigurationProperties(prefix = "ipf.atna") public class IpfAtnaConfigurationProperties { diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaSpringSecurityAutoConfiguration.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaSpringSecurityAutoConfiguration.java index 6e9c0bbfd2..87f36c3043 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaSpringSecurityAutoConfiguration.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/IpfAtnaSpringSecurityAutoConfiguration.java @@ -26,9 +26,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.event.AbstractAuthenticationEvent; -/** - * - */ @ConditionalOnClass({AbstractAuthenticationEvent.class}) @Configuration @EnableConfigurationProperties(IpfAtnaConfigurationProperties.class) diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueue.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueue.java new file mode 100644 index 0000000000..c399372c23 --- /dev/null +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueue.java @@ -0,0 +1,114 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.boot.atna; + +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.queue.AbstractAuditMessageQueue; +import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestClientException; + +import java.net.URI; +import java.util.concurrent.TimeUnit; + +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; +import static org.springframework.http.HttpHeaders.encodeBasicAuth; + +/** + * Alternative to {@link org.openehealth.ipf.commons.audit.queue.BasicHttpAuditMessageQueue}, + * using Spring's RestClient / RestClient.Builder classes + */ +public class RestClientAuditMessageQueue extends AbstractAuditMessageQueue { + + private final RestClient.Builder restClientBuilder; + private final URI uri; + private long connectTimeout = -1; + private long readTimeout = -1; + + private RestClient restClient; + + public RestClientAuditMessageQueue(RestClient.Builder restClientBuilder, URI uri) { + this(restClientBuilder, uri, null, null); + } + + /** + * @param uri URL + * @param user user name, maybe null + * @param password password, maybe null + */ + public RestClientAuditMessageQueue(RestClient.Builder restClientBuilder, URI uri, String user, String password) { + var builder = restClientBuilder + .defaultHeader(CONTENT_TYPE, MediaType.TEXT_XML.toString()); + if (user != null && !user.isEmpty() && password != null && !password.isEmpty()) { + builder = builder.defaultHeader( + HttpHeaders.AUTHORIZATION, + encodeBasicAuth(user, password, null)); + } + this.uri = uri; + this.restClientBuilder = customize(builder); + initRestClient(); + } + + protected RestClient.Builder customize(RestClient.Builder builder) { + return builder; + } + + @Override + protected void handle(AuditContext auditContext, String auditRecord) { + try { + var response = restClient.post() + .uri(uri) + .headers(httpHeaders -> { + httpHeaders.add(X_IPF_ATNA_TIMESTAMP, auditContext.getAuditMetadataProvider().getTimestamp()); + httpHeaders.add(X_IPF_ATNA_HOSTNAME, auditContext.getAuditMetadataProvider().getHostname()); + httpHeaders.add(X_IPF_ATNA_PROCESSID, auditContext.getAuditMetadataProvider().getProcessID()); + httpHeaders.add(X_IPF_ATNA_APPLICATION, auditContext.getAuditMetadataProvider().getSendingApplication()); + }) + .body(auditRecord) + .retrieve() + .toBodilessEntity(); + } catch (RestClientException e) { + auditContext.getAuditExceptionHandler().handleException(auditContext, e, auditRecord); + } + } + + public void setConnectTimeout(long connectTimeoutMillis) { + this.connectTimeout = connectTimeoutMillis; + initRestClient(); + } + + public void setReadTimeout(long readTimeoutMillis) { + this.readTimeout = readTimeoutMillis; + initRestClient(); + } + + private synchronized void initRestClient() { + this.restClient = this.restClientBuilder + .requestFactory(ClientHttpRequestFactoryBuilder.httpComponents() + .withDefaultRequestConfigCustomizer(rcc -> { + if (connectTimeout > 0) { + rcc.setConnectionRequestTimeout(connectTimeout, TimeUnit.MILLISECONDS); + } + if (readTimeout > 0) { + rcc.setResponseTimeout(readTimeout, TimeUnit.MILLISECONDS); + } + }) + .build()) + .build(); + } +} diff --git a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueue.java b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueue.java index 65c4321729..36daa72d27 100644 --- a/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueue.java +++ b/boot/ipf-atna-spring-boot-starter/src/main/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueue.java @@ -25,7 +25,6 @@ import org.springframework.web.client.RestOperations; import java.net.URI; -import java.nio.charset.StandardCharsets; import java.time.Duration; import static java.util.Objects.requireNonNull; @@ -62,19 +61,19 @@ public RestTemplateAuditMessageQueue(RestTemplateBuilder restTemplateBuilder, UR this.restTemplateBuilder = restTemplateBuilder .defaultHeader( CONTENT_TYPE, - new MediaType("text", "xml", StandardCharsets.UTF_8).toString()); + MediaType.TEXT_XML.toString()); initRestTemplate(); } @Override protected void handle(AuditContext auditContext, String auditRecord) { try { - HttpHeaders httpHeaders = new HttpHeaders(); + var httpHeaders = new HttpHeaders(); httpHeaders.add(X_IPF_ATNA_TIMESTAMP, auditContext.getAuditMetadataProvider().getTimestamp()); httpHeaders.add(X_IPF_ATNA_HOSTNAME, auditContext.getAuditMetadataProvider().getHostname()); httpHeaders.add(X_IPF_ATNA_PROCESSID, auditContext.getAuditMetadataProvider().getProcessID()); httpHeaders.add(X_IPF_ATNA_APPLICATION, auditContext.getAuditMetadataProvider().getSendingApplication()); - HttpEntity entity = new HttpEntity<>(auditRecord, httpHeaders); + var entity = new HttpEntity<>(auditRecord, httpHeaders); restTemplate.postForEntity(uri, entity, Void.class); } catch (RestClientException e) { auditContext.getAuditExceptionHandler().handleException(auditContext, e, auditRecord); @@ -94,10 +93,10 @@ public void setReadTimeout(long readTimeoutMillis) { private synchronized void initRestTemplate() { var builder = this.restTemplateBuilder; if (connectTimeout >= 0) { - builder = builder.setConnectTimeout(Duration.ofMillis(connectTimeout)); + builder = builder.connectTimeout(Duration.ofMillis(connectTimeout)); } if (readTimeout >= 0) { - builder = builder.setReadTimeout(Duration.ofMillis(readTimeout)); + builder = builder.readTimeout(Duration.ofMillis(readTimeout)); } if (user != null && !user.isEmpty() && password != null && !password.isEmpty()) { builder = builder.basicAuthentication(user, password); diff --git a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfigurationTest.java b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfigurationTest.java index 565cac25f8..bd2f0c0fd5 100644 --- a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfigurationTest.java +++ b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaAutoConfigurationTest.java @@ -24,8 +24,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; /** @@ -39,13 +38,13 @@ public class IpfAtnaAutoConfigurationTest { private AuditContext auditContext; @Test - public void testAtnaSettings() throws Exception { + public void testAtnaSettings() { assertEquals("atna-test", auditContext.getAuditSourceId()); assertEquals("mysite", auditContext.getAuditEnterpriseSiteId()); assertEquals("localhost", auditContext.getAuditRepositoryHostName()); assertEquals(1342, auditContext.getAuditRepositoryPort()); assertEquals("TLS", auditContext.getAuditTransmissionProtocol().getTransportName()); - assertTrue(auditContext.getAuditMessageQueue() instanceof AsynchronousAuditMessageQueue); + assertInstanceOf(AsynchronousAuditMessageQueue.class, auditContext.getAuditMessageQueue()); } } diff --git a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaBalpAutoConfigurationTest.java b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaBalpAutoConfigurationTest.java index 3dd1f9d999..482ba95573 100644 --- a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaBalpAutoConfigurationTest.java +++ b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/IpfAtnaBalpAutoConfigurationTest.java @@ -16,7 +16,6 @@ package org.openehealth.ipf.boot.atna; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.openehealth.ipf.commons.audit.AuditContext; @@ -27,9 +26,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; /** @@ -44,15 +41,15 @@ public class IpfAtnaBalpAutoConfigurationTest { private AuditContext auditContext; @Test - public void testAtnaWithBalpSettings() throws Exception { - assertTrue(auditContext instanceof BalpAuditContext); + public void testAtnaWithBalpSettings() { + assertInstanceOf(BalpAuditContext.class, auditContext); assertEquals("atna-test", auditContext.getAuditSourceId()); assertEquals("mysite", auditContext.getAuditEnterpriseSiteId()); assertEquals("localhost", auditContext.getAuditRepositoryHostName()); assertEquals(1342, auditContext.getAuditRepositoryPort()); assertEquals("FHIR-REST-TLS", auditContext.getAuditTransmissionProtocol().getTransportName()); - assertTrue(auditContext.getAuditMessageQueue() instanceof AsynchronousAuditMessageQueue); + assertInstanceOf(AsynchronousAuditMessageQueue.class, auditContext.getAuditMessageQueue()); assertEquals("fhir", ((BalpAuditContext)auditContext).getAuditRepositoryContextPath()); assertArrayEquals(new String[]{"cid","client-id","my-client-id-path"}, diff --git a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueueTest.java b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueueTest.java new file mode 100644 index 0000000000..c9d11df2d1 --- /dev/null +++ b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestClientAuditMessageQueueTest.java @@ -0,0 +1,145 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.boot.atna; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; +import org.openehealth.ipf.commons.audit.DefaultAuditContext; +import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; +import org.openehealth.ipf.commons.audit.event.ApplicationActivityBuilder; +import org.openehealth.ipf.commons.audit.protocol.RecordingAuditMessageTransmission; +import org.openehealth.ipf.commons.audit.utils.AuditUtils; +import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestClientException; + +import java.net.ServerSocket; +import java.net.URI; +import java.util.concurrent.TimeUnit; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +public class RestClientAuditMessageQueueTest { + + private int port; + private ClientAndServer mockServer; + private RestClientAuditMessageQueue atnaQueue; + private DefaultAuditContext auditContext; + private Throwable caught; + + @BeforeEach + public void setup() { + port = freePort(); + mockServer = startClientAndServer(port); + auditContext = new DefaultAuditContext(); + auditContext.setAuditTransmissionProtocol(new RecordingAuditMessageTransmission()); + auditContext.setAuditExceptionHandler((auditContext, t, auditMessages) -> + caught = t); + auditContext.setAuditEnabled(true); + } + + @AfterEach + public void tearDown() { + caught = null; + if (mockServer != null) mockServer.stop(); + } + + @Test + public void testSuccessfulAudit() { + try (var server = new MockServerClient("127.0.0.1", port)) { + server + .when( + request() + .withMethod("POST") + .withPath("/audit")) + .respond( + response() + .withStatusCode(200) + .withDelay(TimeUnit.MILLISECONDS, 10) + ); + + // Setup producer + atnaQueue = new RestClientAuditMessageQueue( + RestClient.builder(), + URI.create("http://localhost:" + port + "/audit")); + auditContext.setAuditMessageQueue(atnaQueue); + sendAudit(); + } + } + + @Test + public void testUnsuccessfulAudit() { + try (var server = new MockServerClient("127.0.0.1", port)) { + server + .when( + request() + .withMethod("POST") + .withPath("/audit")) + .respond( + response() + .withStatusCode(404) + .withDelay(TimeUnit.MILLISECONDS, 10) + ); + + // Setup producer + atnaQueue = new RestClientAuditMessageQueue( + RestClient.builder(), + URI.create("http://localhost:" + port + "/audit")); + auditContext.setAuditMessageQueue(atnaQueue); + sendAudit(); + assertThat(caught, instanceOf(RestClientException.class)); + } + } + + @Test + public void testAuditSomewhere() { + atnaQueue = new RestClientAuditMessageQueue( + RestClient.builder(), + URI.create("http://localhost:" + freePort() + "/audit")); + atnaQueue.setConnectTimeout(500); + auditContext.setAuditMessageQueue(atnaQueue); + sendAudit(); + assertThat(caught, instanceOf(RestClientException.class)); + } + + private void sendAudit() { + auditContext.audit( + new ApplicationActivityBuilder.ApplicationStart(EventOutcomeIndicator.Success) + .setAuditSource(auditContext) + .setApplicationParticipant( + "appName", + null, + null, + AuditUtils.getLocalHostName()) + .addApplicationStarterParticipant(System.getProperty("user.name")) + .getMessages()); + } + + private static int freePort() { + try (var serverSocket = new ServerSocket(0)) { + return serverSocket.getLocalPort(); + } catch (Exception e) { + return -1; + } + } + +} diff --git a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueueTest.java b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueueTest.java index e7aa14fecd..4f587b55d9 100644 --- a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueueTest.java +++ b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/RestTemplateAuditMessageQueueTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openehealth.ipf.boot.atna; import org.junit.jupiter.api.AfterEach; @@ -25,21 +40,20 @@ public class RestTemplateAuditMessageQueueTest { - private int port; private ClientAndServer mockServer; private RestTemplateAuditMessageQueue atnaQueue; private DefaultAuditContext auditContext; private Throwable caught; - @BeforeEach public void setup() { port = freePort(); mockServer = startClientAndServer(port); auditContext = new DefaultAuditContext(); auditContext.setAuditTransmissionProtocol(new RecordingAuditMessageTransmission()); - auditContext.setAuditExceptionHandler((auditContext, t, auditMessages) -> caught = t); + auditContext.setAuditExceptionHandler((auditContext, t, auditMessages) -> + caught = t); auditContext.setAuditEnabled(true); } @@ -64,7 +78,9 @@ public void testSuccessfulAudit() { ); // Setup producer - atnaQueue = new RestTemplateAuditMessageQueue(new RestTemplateBuilder(), URI.create("http://localhost:" + port + "/audit")); + atnaQueue = new RestTemplateAuditMessageQueue( + new RestTemplateBuilder(), + URI.create("http://localhost:" + port + "/audit")); auditContext.setAuditMessageQueue(atnaQueue); sendAudit(); } @@ -85,7 +101,9 @@ public void testUnsuccessfulAudit() { ); // Setup producer - atnaQueue = new RestTemplateAuditMessageQueue(new RestTemplateBuilder(), URI.create("http://localhost:" + port + "/audit")); + atnaQueue = new RestTemplateAuditMessageQueue( + new RestTemplateBuilder(), + URI.create("http://localhost:" + port + "/audit")); auditContext.setAuditMessageQueue(atnaQueue); sendAudit(); assertThat(caught, instanceOf(RestClientException.class)); diff --git a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/TestApplication.java b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/TestApplication.java index 8107dd6c26..90f6b2e9a5 100644 --- a/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/TestApplication.java +++ b/boot/ipf-atna-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/atna/TestApplication.java @@ -25,7 +25,7 @@ @SpringBootApplication public class TestApplication { - public static void main(String[] args) throws Exception { + public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } diff --git a/boot/ipf-fhir-r4-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/fhir/FhirApplicationTest.java b/boot/ipf-fhir-r4-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/fhir/FhirApplicationTest.java index 135b366347..b440556c4a 100644 --- a/boot/ipf-fhir-r4-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/fhir/FhirApplicationTest.java +++ b/boot/ipf-fhir-r4-spring-boot-starter/src/test/java/org/openehealth/ipf/boot/fhir/FhirApplicationTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.openehealth.ipf.boot.IpfAutoConfiguration; import org.openehealth.ipf.commons.core.config.ContextFacade; import org.openehealth.ipf.commons.map.MappingService; import org.openehealth.ipf.commons.spring.map.config.CustomMappings; diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/handler/LoggingAuditExceptionHandler.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/handler/LoggingAuditExceptionHandler.java index 88d22f8421..20d7861898 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/handler/LoggingAuditExceptionHandler.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/handler/LoggingAuditExceptionHandler.java @@ -28,11 +28,11 @@ */ public class LoggingAuditExceptionHandler implements AuditExceptionHandler { - private static final Logger LOG = LoggerFactory.getLogger(LoggingAuditExceptionHandler.class); + private static final Logger log = LoggerFactory.getLogger(LoggingAuditExceptionHandler.class); @Override public void handleException(AuditContext auditContext, Throwable throwable, String auditMessage) { - LOG.warn("Failed to send ATNA audit event to destination {}:{} ({})", + log.warn("Failed to send ATNA audit event to destination {}:{} ({})", auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort(), auditContext.getAuditRepositoryAddress().getHostAddress(), diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/marshal/dicom/DICOM2016a.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/marshal/dicom/DICOM2016a.java index 157eca5a24..00cba27136 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/marshal/dicom/DICOM2016a.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/marshal/dicom/DICOM2016a.java @@ -96,9 +96,7 @@ protected Element eventIdentification(EventIdentificationType eventIdentificatio element.setAttribute(EVENT_ACTION_CODE, eventIdentification.getEventActionCode().getValue()); element.setAttribute(EVENT_DATE_TIME, eventIdentification.getEventDateTime().toString()); element.setAttribute(EVENT_OUTCOME_INDICATOR, eventIdentification.getEventOutcomeIndicator().getValue().toString()); - if (eventIdentification.getEventID() != null) { - element.addContent(codedValueType(EVENT_ID, eventIdentification.getEventID())); - } + element.addContent(codedValueType(EVENT_ID, eventIdentification.getEventID())); eventIdentification.getEventTypeCode().stream() .map(eventTypeCode -> codedValueType(EVENT_TYPE_CODE, eventTypeCode)) .forEach(element::addContent); diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/model/Validateable.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/model/Validateable.java index 0c020364b9..8004fdb4db 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/model/Validateable.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/model/Validateable.java @@ -26,7 +26,6 @@ public interface Validateable { * Validates the constructed audit message against the specification, because API does not completely * prevent constructing incomplete or inconsistent messages. * - * @throws org.openehealth.ipf.commons.audit.AuditException */ void validate(); diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/AuditTransmissionChannel.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/AuditTransmissionChannel.java index 1d22b2a813..33e7b613ce 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/AuditTransmissionChannel.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/AuditTransmissionChannel.java @@ -61,8 +61,8 @@ public String getProtocolName() { } public AuditTransmissionProtocol makeInstance(TlsParameters tlsParameters) { - ServiceLoader loader = ServiceLoader.load(AuditTransmissionProtocolProvider.class); - for (AuditTransmissionProtocolProvider provider : loader) { + var loader = ServiceLoader.load(AuditTransmissionProtocolProvider.class); + for (var provider : loader) { if (protocolClass.equals(provider.getClass().getName())) { return provider.createAuditTransmissionProtocol(tlsParameters); } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NettyTLSSyslogSenderImpl.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NettyTLSSyslogSenderImpl.java index 3064d761a9..9120fd4a95 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NettyTLSSyslogSenderImpl.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NettyTLSSyslogSenderImpl.java @@ -49,7 +49,7 @@ */ public class NettyTLSSyslogSenderImpl extends NioTLSSyslogSenderImpl { - private static final Logger LOG = LoggerFactory.getLogger(NettyTLSSyslogSenderImpl.class); + private static final Logger log = LoggerFactory.getLogger(NettyTLSSyslogSenderImpl.class); private int workerThreads = 1; private long connectTimeoutMillis = 5000; @@ -137,7 +137,7 @@ public Bootstrap getBootstrap() { @Override public void shutdown() { if (workerGroup != null) { - LOG.info("TLS Channel to Audit Repository at {}:{} is closed", host, port); + log.info("TLS Channel to Audit Repository at {}:{} is closed", host, port); workerGroup.shutdownGracefully(); } } @@ -161,7 +161,7 @@ public ChannelFuture getHandle() { public void write(byte[] bytes) { // The write operation is asynchronous. var channel = getHandle().channel(); - LOG.trace("Writing {} bytes using session: {}", bytes.length, channel); + log.trace("Writing {} bytes using session: {}", bytes.length, channel); try { if (!channel.writeAndFlush(Unpooled.wrappedBuffer(bytes)).await(sendTimeout)) { throw new AuditException("Could not send audit message to " + host + ":" + port); @@ -186,13 +186,13 @@ public InboundHandler(String host, int port) { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { - LOG.info("TLS Channel to Audit Repository at {}:{} is now active", host, port); + log.info("TLS Channel to Audit Repository at {}:{} is now active", host, port); super.channelActive(ctx); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - LOG.info("Exception on receiving message for context {}", ctx, cause); + log.info("Exception on receiving message for context {}", ctx, cause); if (ctx != null) { ctx.close(); } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NioTLSSyslogSenderImpl.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NioTLSSyslogSenderImpl.java index 7fd465662c..e5e9e1798f 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NioTLSSyslogSenderImpl.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/NioTLSSyslogSenderImpl.java @@ -35,7 +35,7 @@ */ public abstract class NioTLSSyslogSenderImpl> extends RFC5425Protocol implements AuditTransmissionProtocol { - private static final Logger LOG = LoggerFactory.getLogger(NioTLSSyslogSenderImpl.class); + private static final Logger log = LoggerFactory.getLogger(NioTLSSyslogSenderImpl.class); private boolean loggingEnabled = false; private final TlsParameters tlsParameters; @@ -63,15 +63,15 @@ public void send(AuditContext auditContext, AuditMetadataProvider auditMetadataP if (auditMessage != null) { Destination destination = getDestination(auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort()); var payload = getTransportPayload(auditMetadataProvider, auditMessage); - if (LOG.isDebugEnabled()) { - LOG.debug("Auditing {} bytes to {}:{}", + if (log.isDebugEnabled()) { + log.debug("Auditing {} bytes to {}:{}", payload.length, auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort()); } destination.write(payload); - if (LOG.isTraceEnabled()) { - LOG.trace(new String(payload, StandardCharsets.UTF_8)); + if (log.isTraceEnabled()) { + log.trace(new String(payload, StandardCharsets.UTF_8)); } } } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/ReactorNettyTLSSyslogSenderImpl.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/ReactorNettyTLSSyslogSenderImpl.java index 5a0ef90957..40463618b2 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/ReactorNettyTLSSyslogSenderImpl.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/ReactorNettyTLSSyslogSenderImpl.java @@ -25,9 +25,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.netty.Connection; +import reactor.netty.internal.util.Metrics; import reactor.netty.resources.LoopResources; import reactor.netty.tcp.TcpClient; -import reactor.util.Metrics; import java.time.Duration; import java.util.concurrent.TimeUnit; @@ -42,7 +42,7 @@ */ public class ReactorNettyTLSSyslogSenderImpl extends NioTLSSyslogSenderImpl { - private static final Logger LOG = LoggerFactory.getLogger(ReactorNettyTLSSyslogSenderImpl.class); + private static final Logger log = LoggerFactory.getLogger(ReactorNettyTLSSyslogSenderImpl.class); private int workerThreads = 1; private long connectTimeoutMillis = 5000; @@ -119,11 +119,11 @@ public static final class ReactorNettyDestination implements NioTLSSyslogSenderI .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, (int) connectTimeout) .option(ChannelOption.SO_KEEPALIVE, true) .wiretap(getClass().getName(), LogLevel.TRACE) - .metrics(Metrics.isInstrumentationAvailable()) + .metrics(Metrics.isMicrometerAvailable()) .secure(spec -> spec.sslContext(sslContext)) - .doOnConnect(config -> LOG.info("TLS Syslog Client is about to be started")) - .doOnConnected(connection -> LOG.info("TLS Syslog Client connected to {}", connection.address())) - .doOnDisconnected(connection -> LOG.info("TLS Syslog Client disconnected from {}", connection.address())); + .doOnConnect(config -> log.info("TLS Syslog Client is about to be started")) + .doOnConnected(connection -> log.info("TLS Syslog Client connected to {}", connection.address())) + .doOnDisconnected(connection -> log.info("TLS Syslog Client disconnected from {}", connection.address())); } @@ -150,7 +150,7 @@ public Connection getHandle() { public void write(byte[] bytes) { // The write operation is asynchronous. var channel = getHandle().channel(); - LOG.trace("Writing {} bytes using session: {}", bytes.length, channel); + log.trace("Writing {} bytes using session: {}", bytes.length, channel); try { if (!channel.writeAndFlush(Unpooled.wrappedBuffer(bytes)).await(sendTimeout)) { throw new AuditException("Could not send audit message to " + host + ":" + port); diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/TLSSyslogSenderImpl.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/TLSSyslogSenderImpl.java index 284e5a37a1..80a760b2bb 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/TLSSyslogSenderImpl.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/TLSSyslogSenderImpl.java @@ -55,7 +55,7 @@ */ public class TLSSyslogSenderImpl extends RFC5425Protocol implements AuditTransmissionProtocol { - private static final Logger LOG = LoggerFactory.getLogger(TLSSyslogSenderImpl.class); + private static final Logger log = LoggerFactory.getLogger(TLSSyslogSenderImpl.class); private static final int MIN_SO_TIMEOUT = 1; private static final Boolean DEFAULT_SOCKET_KEEPALIVE = Boolean.TRUE; @@ -118,23 +118,23 @@ private Socket getSocket(AuditContext auditContext) { public void send(AuditContext auditContext, AuditMetadataProvider auditMetadataProvider, String auditMessage) throws Exception { if (auditMessage != null) { var msgBytes = getTransportPayload(auditMetadataProvider, auditMessage); - LOG.debug("Auditing {} bytes to {}:{}", + log.debug("Auditing {} bytes to {}:{}", msgBytes.length, auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort()); try { doSend(auditContext, msgBytes); - if (LOG.isTraceEnabled()) { - LOG.trace(new String(msgBytes, StandardCharsets.UTF_8)); + if (log.isTraceEnabled()) { + log.trace(new String(msgBytes, StandardCharsets.UTF_8)); } } catch (SocketException | SocketTimeoutException e) { try { - LOG.info("Failed to use existing TLS socket. Will create a new connection and retry."); + log.info("Failed to use existing TLS socket. Will create a new connection and retry."); closeSocket(socket.get()); socket.set(null); doSend(auditContext, msgBytes); } catch (Exception exception) { - LOG.error("Failed to audit using new TLS socket, giving up - this audit message will be lost."); + log.error("Failed to audit using new TLS socket, giving up - this audit message will be lost."); closeSocket(socket.get()); socket.set(null); // re-throw the exception so caller knows what happened @@ -157,30 +157,30 @@ private synchronized void doSend(AuditContext auditContext, byte[] msgBytes) final var socket = getSocket(auditContext); if (socketTestPolicy.isBeforeWrite()) { - LOG.trace("Testing whether socket connection is alive and well before attempting to write"); + log.trace("Testing whether socket connection is alive and well before attempting to write"); if (!isSocketConnectionAlive(socket)) { closeSocket(socket); throw new FastSocketException( "Read-test before write operation determined that the socket connection is dead"); } - LOG.debug("Socket connection is confirmed to be alive."); + log.debug("Socket connection is confirmed to be alive."); } - LOG.trace("Now writing out ATNA record"); + log.trace("Now writing out ATNA record"); var out = socket.getOutputStream(); out.write(msgBytes); out.flush(); - LOG.trace("ATNA record has been written ({} bytes)", msgBytes.length); + log.trace("ATNA record has been written ({} bytes)", msgBytes.length); if (socketTestPolicy.isAfterWrite()) { - LOG.trace( + log.trace( "Testing whether socket connection is alive and well after write to confirm the write operation"); if (!isSocketConnectionAlive(socket)) { closeSocket(socket); throw new FastSocketException( "Read-test after write operation determined that the socket connection is dead"); } - LOG.debug("Socket connection is confirmed alive. Assuming write operation has succeeded"); + log.debug("Socket connection is confirmed alive. Assuming write operation has succeeded"); } } @@ -250,23 +250,23 @@ private boolean isSocketConnectionAlive(final Socket socket) { if (socket.getSoTimeout() > 0) { final var nextByte = socket.getInputStream().read(); if (nextByte > -1) { - LOG.warn( + log.warn( "Socket test was able to read a byte from the socket other than the 'stream closed' value of -1. " + "This should never happen since SYSLOG is a simplex (write only) protocol! Byte value read from stream: {}", nextByte); isAlive = true; } else { - LOG.debug("Socket test read '-1' -> connection closed by server."); + log.debug("Socket test read '-1' -> connection closed by server."); isAlive = false; } } else { throw new IllegalStateException("Test requires an SO_TIMEOUT greater than zero set on the socket."); } } catch (SocketTimeoutException e) { - LOG.debug("Socket read timed out; assuming the connection is still alive."); + log.debug("Socket read timed out; assuming the connection is still alive."); isAlive = true; } catch (IOException e) { - LOG.warn("Socket read failed for non-timeout reason; assuming the connection is dead."); + log.warn("Socket read failed for non-timeout reason; assuming the connection is dead."); isAlive = false; } @@ -283,7 +283,7 @@ private void closeSocket(final Socket socket) { try { socket.close(); } catch (IOException e) { - LOG.debug( + log.debug( "Failed to close pre-existing socket. As we are either shutting down or are in the process of replacing the socket this is not really a worry... Message: {}", e.getMessage()); } @@ -329,7 +329,6 @@ public boolean isAfterWrite() { * @author taastrad */ private static class FastSocketException extends SocketException { - private static final long serialVersionUID = 1L; public FastSocketException(final String msg) { super(msg); diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/UDPSyslogSenderImpl.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/UDPSyslogSenderImpl.java index 72eb8d3074..1ab58d1348 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/UDPSyslogSenderImpl.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/protocol/UDPSyslogSenderImpl.java @@ -41,7 +41,7 @@ */ public class UDPSyslogSenderImpl extends RFC5424Protocol implements AuditTransmissionProtocol { - private static final Logger LOG = LoggerFactory.getLogger(UDPSyslogSenderImpl.class); + private static final Logger log = LoggerFactory.getLogger(UDPSyslogSenderImpl.class); private static final int MAX_DATAGRAM_PACKET_SIZE = 65479; public UDPSyslogSenderImpl() { @@ -64,7 +64,7 @@ public void send(AuditContext auditContext, AuditMetadataProvider auditMetadataP try (var socket = new DatagramSocket()) { var msgBytes = getTransportPayload(auditMetadataProvider, auditMessage); var inetAddress = auditContext.getAuditRepositoryAddress(); - LOG.debug("Auditing {} bytes to {}:{} ({})", + log.debug("Auditing {} bytes to {}:{} ({})", msgBytes.length, auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort(), @@ -75,8 +75,8 @@ public void send(AuditContext auditContext, AuditMetadataProvider auditMetadataP inetAddress, auditContext.getAuditRepositoryPort()); socket.send(packet); - if (LOG.isTraceEnabled()) { - LOG.trace(new String(msgBytes, StandardCharsets.UTF_8)); + if (log.isTraceEnabled()) { + log.trace(new String(msgBytes, StandardCharsets.UTF_8)); } } } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/AsynchronousAuditMessageQueue.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/AsynchronousAuditMessageQueue.java index 8bee6c37f4..a2f427cbda 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/AsynchronousAuditMessageQueue.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/AsynchronousAuditMessageQueue.java @@ -43,7 +43,7 @@ */ public class AsynchronousAuditMessageQueue extends AbstractAuditMessageQueue { - private static final Logger LOG = LoggerFactory.getLogger(AsynchronousAuditMessageQueue.class); + private static final Logger log = LoggerFactory.getLogger(AsynchronousAuditMessageQueue.class); private ExecutorService executorService; private int shutdownTimeoutSeconds = 30; @@ -106,11 +106,11 @@ public void shutdown() { executorService.shutdown(); try { if (!executorService.awaitTermination(shutdownTimeoutSeconds, TimeUnit.SECONDS)) { - LOG.warn("Timeout occurred when flushing Audit events, some events might have been lost"); + log.warn("Timeout occurred when flushing Audit events, some events might have been lost"); executorService.shutdownNow(); } } catch (InterruptedException e) { - LOG.warn("Thread interrupt when flushing ATNA events, some events might have been lost", e); + log.warn("Thread interrupt when flushing ATNA events, some events might have been lost", e); } } } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageListener.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageListener.java index 2f66a1bf0f..f6a4639017 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageListener.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageListener.java @@ -42,7 +42,7 @@ */ public class JmsAuditMessageListener implements MessageListener { - private static final Logger LOG = LoggerFactory.getLogger(JmsAuditMessageListener.class); + private static final Logger log = LoggerFactory.getLogger(JmsAuditMessageListener.class); private final AuditContext auditContext; @@ -69,9 +69,9 @@ public void onMessage(Message message) { ); auditContext.getAuditTransmissionProtocol().send(auditContext, auditMetadataProvider, text); } catch (JMSException jmsException1) { - LOG.error("Could not obtain text from JMS message", jmsException1); + log.error("Could not obtain text from JMS message", jmsException1); } catch (Exception e) { - LOG.warn("Could not send audit message, rolling back", e); + log.warn("Could not send audit message, rolling back", e); throw new RuntimeException(e); } } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/Rfc5424Decoder.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/Rfc5424Decoder.java index 26aba7c164..efeec32a41 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/Rfc5424Decoder.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/Rfc5424Decoder.java @@ -44,7 +44,7 @@ */ class Rfc5424Decoder extends MessageToMessageDecoder { - private static final Logger LOG = LoggerFactory.getLogger(Rfc5424Decoder.class); + private static final Logger log = LoggerFactory.getLogger(Rfc5424Decoder.class); private static final SyslogParser syslogParser = new SyslogParserBuilder() .withNilPolicy(NilPolicy.OMIT) @@ -66,13 +66,12 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) } private static Map decode(SocketAddress socketAddress, ByteBuf msg) { - if (LOG.isDebugEnabled()) { - LOG.debug("Decoding message with {} bytes into RFC 5424 map.", msg.readableBytes()); + if (log.isDebugEnabled()) { + log.debug("Decoding message with {} bytes into RFC 5424 map.", msg.readableBytes()); } var map = parseByteBuf(msg); - if (socketAddress instanceof InetSocketAddress) { + if (socketAddress instanceof InetSocketAddress inetSocketAddress) { var enriched = new HashMap<>(map); - var inetSocketAddress = (InetSocketAddress) socketAddress; enriched.put(SYSLOG_REMOTE_HOST, inetSocketAddress.getHostName()); enriched.put(SYSLOG_REMOTE_PORT, inetSocketAddress.getPort()); enriched.put(SYSLOG_REMOTE_IP, inetSocketAddress.getAddress().getHostAddress()); diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/SyslogServer.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/SyslogServer.java index 20cf0f4369..4d1bce2d8a 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/SyslogServer.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/SyslogServer.java @@ -15,6 +15,7 @@ */ package org.openehealth.ipf.commons.audit.server; +import lombok.Setter; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; import reactor.netty.DisposableChannel; @@ -47,6 +48,8 @@ public abstract class SyslogServer implements Close protected T channel; protected final Consumer> consumer; protected final Consumer errorConsumer; + @Setter + protected int timeoutSeconds = TIMEOUT; /** * @param consumer consumer for handled syslog frames @@ -85,7 +88,7 @@ public SocketAddress address() { */ public void stop() { if (channel != null) { - channel.disposeNow(Duration.ofSeconds(TIMEOUT)); + channel.disposeNow(Duration.ofSeconds(timeoutSeconds)); } channel = null; } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/TlsSyslogServer.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/TlsSyslogServer.java index 8ed88d8689..808b970469 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/TlsSyslogServer.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/TlsSyslogServer.java @@ -38,7 +38,7 @@ */ public class TlsSyslogServer extends SyslogServer { - private static final Logger LOG = LoggerFactory.getLogger(TlsSyslogServer.class); + private static final Logger log = LoggerFactory.getLogger(TlsSyslogServer.class); protected final TlsParameters tlsParameters; public TlsSyslogServer(Consumer> consumer, @@ -60,16 +60,19 @@ public TlsSyslogServer doStart(String host, int port) { .host(host) .port(port) .option(ChannelOption.SO_REUSEADDR, true) - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, (int)Duration.ofSeconds(timeoutSeconds).toMillis()) .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535)) .wiretap(getClass().getName(), LogLevel.TRACE) .metrics(Metrics.isMicrometerAvailable()) .secure(spec -> spec.sslContext(sslContext)) - .doOnBind(serverBootstrap -> LOG.info("TLS Syslog Server is about to be started")) - .doOnBound(disposableServer -> LOG.info("TLS Syslog Server bound on {}", disposableServer.address())) - .doOnUnbound(disposableServer -> LOG.info("TLS Syslog Server unbound from {}", disposableServer.address())) + .doOnBind(serverBootstrap -> + log.info("TLS Syslog Server is about to be started")) + .doOnBound(disposableServer -> + log.info("TLS Syslog Server bound on {}", disposableServer.address())) + .doOnUnbound(disposableServer -> + log.info("TLS Syslog Server unbound from {}", disposableServer.address())) .doOnConnection(connection -> { - LOG.debug("Received connection from {}", connection.channel().localAddress()); + log.debug("Received connection from {}", connection.channel().localAddress()); connection .addHandlerLast(new Rfc5425Decoder()) // extract frame .addHandlerLast(new Rfc5424Decoder()); // parse frame, fast enough for receiver thread @@ -79,7 +82,7 @@ public TlsSyslogServer doStart(String host, int port) { .flatMap(this::handleMap) .doOnError(errorConsumer) .then()) - .bindNow(Duration.ofSeconds(TIMEOUT)); + .bindNow(Duration.ofSeconds(timeoutSeconds)); return this; } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/UdpSyslogServer.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/UdpSyslogServer.java index b20e2b28b1..bd66a51cb4 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/UdpSyslogServer.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/UdpSyslogServer.java @@ -22,8 +22,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.netty.Connection; +import reactor.netty.internal.util.Metrics; import reactor.netty.udp.UdpServer; -import reactor.util.Metrics; import java.time.Duration; import java.util.Map; @@ -37,7 +37,7 @@ */ public class UdpSyslogServer extends SyslogServer { - private static final Logger LOG = LoggerFactory.getLogger(UdpSyslogServer.class); + private static final Logger log = LoggerFactory.getLogger(UdpSyslogServer.class); public UdpSyslogServer(Consumer> consumer, Consumer errorConsumer) { @@ -48,20 +48,23 @@ public UdpSyslogServer(Consumer> consumer, public UdpSyslogServer doStart(String host, int port) { channel = UdpServer.create() .option(ChannelOption.SO_REUSEADDR, true) - .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, (int)Duration.ofSeconds(timeoutSeconds).toMillis()) .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535)) .host(host) .port(port) .wiretap(getClass().getName(), LogLevel.TRACE) - .metrics(Metrics.isInstrumentationAvailable()) + .metrics(Metrics.isMicrometerAvailable()) // This does not work! //.doOnBound(connection -> connection // .addHandler(new Rfc5426Decoder()) // .addHandler(new Rfc5424Decoder())) - .doOnBind(serverBootstrap -> LOG.info("UDP Syslog Server is about to be started")) - .doOnBound(disposableServer -> LOG.info("UDP Syslog Server bound on {}", disposableServer.channel().localAddress())) - .doOnUnbound(disposableServer -> LOG.info("UDP Syslog Server unbound from {}", disposableServer.channel().localAddress())) + .doOnBind(serverBootstrap -> + log.info("UDP Syslog Server is about to be started")) + .doOnBound(disposableServer -> + log.info("UDP Syslog Server bound on {}", disposableServer.channel().localAddress())) + .doOnUnbound(disposableServer -> + log.info("UDP Syslog Server unbound from {}", disposableServer.channel().localAddress())) .handle((udpInbound, udpOutbound) -> udpInbound .receiveObject() // Because the handlers don't seem to step in, we handle it here @@ -70,7 +73,7 @@ public UdpSyslogServer doStart(String host, int port) { .flatMap(this::handleMap) .doOnError(errorConsumer) .then()) - .bindNow(Duration.ofSeconds(TIMEOUT)); + .bindNow(Duration.ofSeconds(timeoutSeconds)); return this; } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventCollector.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventCollector.java index 5fa75a078d..fa7e7238c5 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventCollector.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventCollector.java @@ -29,7 +29,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * A simple collector of Syslog events @@ -39,7 +38,7 @@ */ public class SyslogEventCollector implements Consumer> { - private static final Logger LOG = LoggerFactory.getLogger(SyslogEventCollector.class); + private static final Logger log = LoggerFactory.getLogger(SyslogEventCollector.class); private static final AuditParser PARSER = new DICOMAuditParser(); private final Collection> syslogMaps = new ConcurrentLinkedQueue<>(); @@ -85,7 +84,7 @@ private SyslogEventCollector() { @Override public void accept(Map syslogMap) { - LOG.debug("Collecting syslog event {}", syslogMap); + log.debug("Collecting syslog event {}", syslogMap); syslogMaps.add(syslogMap); } @@ -96,7 +95,7 @@ public Collection> getSyslogEvents() { public Collection> getSyslogEvents(Predicate> predicate) { return syslogMaps.stream() .filter(predicate) - .collect(Collectors.toUnmodifiableList()); + .toList(); } public void reset() { diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventDICOMPrinter.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventDICOMPrinter.java index 82f33ced8c..e70187fa21 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventDICOMPrinter.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/server/support/SyslogEventDICOMPrinter.java @@ -33,7 +33,7 @@ */ public class SyslogEventDICOMPrinter { - private static final Logger LOG = LoggerFactory.getLogger(SyslogEventDICOMPrinter.class); + private static final Logger log = LoggerFactory.getLogger(SyslogEventDICOMPrinter.class); private static final AuditParser PARSER = new DICOMAuditParser(); public static EventConsumer newEventConsumer(String channel) { @@ -44,18 +44,18 @@ public static ErrorConsumer newErrorConsumer() { return new ErrorConsumer(); } - private static class ErrorConsumer implements Consumer { + public static class ErrorConsumer implements Consumer { private ErrorConsumer() { } @Override public void accept(Throwable throwable) { - LOG.error("Error occurred while receiving a syslog event: ", throwable); + log.error("Error occurred while receiving a syslog event: ", throwable); } } - private static class EventConsumer implements Consumer> { + public static class EventConsumer implements Consumer> { private final String channel; @@ -65,21 +65,21 @@ private EventConsumer(String channel) { @Override public void accept(Map syslogMap) { - LOG.info("Received event on {} from {}:{}", + log.info("Received event on {} from {}:{}", channel, syslogMap.get("syslog.remote.host"), syslogMap.get("syslog.remote.port")); - LOG.info("Syslog Metadata: AppName: {}, HostName: {}, Timestamp: {}", + log.info("Syslog Metadata: AppName: {}, HostName: {}, Timestamp: {}", syslogMap.get(SyslogFieldKeys.HEADER_APPNAME.getField()), syslogMap.get(SyslogFieldKeys.HEADER_HOSTNAME.getField()), syslogMap.get(SyslogFieldKeys.HEADER_TIMESTAMP.getField())); try { var auditMessage = parse(syslogMap); - LOG.info("DICOM Payload is"); - LOG.info("{}", auditMessage); + log.info("DICOM Payload is"); + log.info("{}", auditMessage); } catch (Exception e) { - LOG.warn("Could not parse payload:", e); - LOG.info("{}", syslogMap.get(SyslogFieldKeys.MESSAGE.getField())); + log.warn("Could not parse payload:", e); + log.info("{}", syslogMap.get(SyslogFieldKeys.MESSAGE.getField())); } } diff --git a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParser.java b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParser.java index 2a6ee16eb9..ca1e808d26 100644 --- a/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParser.java +++ b/commons/audit/src/main/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParser.java @@ -56,7 +56,6 @@ import java.util.Base64; import java.util.List; import java.util.function.Function; -import java.util.stream.Collectors; import static org.openehealth.ipf.commons.audit.XMLNames.*; @@ -202,7 +201,7 @@ private void mapInto(List container, Element element, String name, Functi container.addAll( element.getChildren(name).stream() .map(mapper) - .collect(Collectors.toList())); + .toList()); } private EventId eventId(Element codedValueElement) { diff --git a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AbstractAuditorIntegrationTest.java b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AbstractAuditorIntegrationTest.java index 122c0122ac..3772ddaf01 100644 --- a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AbstractAuditorIntegrationTest.java +++ b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AbstractAuditorIntegrationTest.java @@ -35,7 +35,7 @@ */ abstract class AbstractAuditorIntegrationTest { - private static final Logger LOG = LoggerFactory.getLogger(AbstractAuditorIntegrationTest.class); + private static final Logger log = LoggerFactory.getLogger(AbstractAuditorIntegrationTest.class); static final String CLIENT_KEY_STORE; static final String CLIENT_KEY_STORE_PASS = "initinit"; @@ -91,7 +91,7 @@ void sendAudit() { } void sendAudit(String userName) { - LOG.debug("Sending audit record"); + log.debug("Sending audit record"); auditContext.audit( new ApplicationActivityBuilder.ApplicationStart(EventOutcomeIndicator.Success) .setAuditSource(auditContext) @@ -108,7 +108,7 @@ int freePort() { try (var serverSocket = new ServerSocket(0)) { return serverSocket.getLocalPort(); } catch (Exception e) { - LOG.error(e.getMessage()); + log.error(e.getMessage()); return -1; } } diff --git a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AuditRecordServer.java b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AuditRecordServer.java index 9636c67bcc..a22a425cbd 100644 --- a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AuditRecordServer.java +++ b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/AuditRecordServer.java @@ -35,7 +35,7 @@ */ public class AuditRecordServer { - private static final Logger LOG = LoggerFactory.getLogger(AuditRecordServer.class); + private static final Logger log = LoggerFactory.getLogger(AuditRecordServer.class); private static Optional> getSyslogServer( String channel, @@ -52,11 +52,11 @@ private static Optional> getSyslogServer( public static void main(String... args) throws Exception { if (args.length < 2) { - LOG.error("Usage: AuditRecordServer (-1 for not launching channel, 0 for using a random port)"); + log.error("Usage: AuditRecordServer (-1 for not launching channel, 0 for using a random port)"); } else { final var tlsSyslogServer = getSyslogServer("TLS", TlsSyslogServer::new, Integer.parseInt(args[0])); final var udpSyslogServer = getSyslogServer("UDP", UdpSyslogServer::new, Integer.parseInt(args[1])); - LOG.info("Waiting for requests..."); + log.info("Waiting for requests..."); Runtime.getRuntime().addShutdownHook(new Thread(() -> { tlsSyslogServer.ifPresent(SyslogServer::stop); udpSyslogServer.ifPresent(SyslogServer::stop); diff --git a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/TLSAuditorFailingIntegrationTest.java b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/TLSAuditorFailingIntegrationTest.java index c083336097..b130a152dc 100644 --- a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/TLSAuditorFailingIntegrationTest.java +++ b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/TLSAuditorFailingIntegrationTest.java @@ -30,7 +30,7 @@ public class TLSAuditorFailingIntegrationTest extends AbstractAuditorIntegrationTest { - private static final Logger LOG = LoggerFactory.getLogger(TLSAuditorFailingIntegrationTest.class); + private static final Logger log = LoggerFactory.getLogger(TLSAuditorFailingIntegrationTest.class); private CustomTlsParameters tlsParameters; diff --git a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageQueueTest.java b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageQueueTest.java index b665825e8c..f9f9682c16 100644 --- a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageQueueTest.java +++ b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/queue/JmsAuditMessageQueueTest.java @@ -40,7 +40,7 @@ */ public class JmsAuditMessageQueueTest { - private static final Logger LOG = LoggerFactory.getLogger(JmsAuditMessageQueueTest.class); + private static final Logger log = LoggerFactory.getLogger(JmsAuditMessageQueueTest.class); private static final String JMS_BROKER_URL = "tcp://localhost:61616"; private static final String JMS_QUEUE_NAME = "atna"; @@ -105,7 +105,7 @@ public void testActiveMQ() throws Exception { } private void sendAudit() { - LOG.debug("Sending audit record"); + log.debug("Sending audit record"); auditContext.audit( new ApplicationActivityBuilder.ApplicationStart(EventOutcomeIndicator.Success) .setAuditSource(auditContext) diff --git a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParserTest.java b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParserTest.java index e66b31b0de..bcb44d6fc6 100644 --- a/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParserTest.java +++ b/commons/audit/src/test/java/org/openehealth/ipf/commons/audit/unmarshal/dicom/DICOMAuditParserTest.java @@ -20,7 +20,7 @@ public class DICOMAuditParserTest { - private static final Logger LOG = LoggerFactory.getLogger(DICOMAuditParser.class); + private static final Logger log = LoggerFactory.getLogger(DICOMAuditParserTest.class); @Test public void roundtrip() throws IOException, URISyntaxException { @@ -28,7 +28,7 @@ public void roundtrip() throws IOException, URISyntaxException { var parser = new DICOMAuditParser(); var files = getAllFilesFromResource("audit"); for (var file : files) { - LOG.debug("Parsing {}", file); + log.debug("Parsing {}", file); var read = Files.readString(file, StandardCharsets.UTF_8); var auditMessage = parser.parse(read, true); var written = Current.INSTANCE.marshal(auditMessage, true); @@ -46,10 +46,9 @@ public void roundtrip() throws IOException, URISyntaxException { private List getAllFilesFromResource(String folder) throws URISyntaxException, IOException { var classLoader = getClass().getClassLoader(); var resource = classLoader.getResource(folder); - var collect = Files.walk(Paths.get(resource.toURI())) + + return Files.walk(Paths.get(resource.toURI())) .filter(Files::isRegularFile) .collect(Collectors.toList()); - - return collect; } } diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/ContentMap.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/ContentMap.java index 19f37c77f6..b31cad7efd 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/ContentMap.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/ContentMap.java @@ -31,12 +31,12 @@ */ @XmlTransient public class ContentMap { - private static final transient Logger LOG = LoggerFactory.getLogger(ContentMap.class); + private static final Logger log = LoggerFactory.getLogger(ContentMap.class); // synchronized manually private transient final Map, Object> map = new HashMap<>(); - private static transient TypeConverter conversionService; + private static TypeConverter conversionService; /** @@ -54,12 +54,12 @@ public class ContentMap { public T getContent(Class targetType) { var result = (T) map.get(targetType); if (result != null) { - LOG.debug("Return existing content of type {}", targetType); + log.debug("Return existing content of type {}", targetType); return result; } if (conversionService == null) { - LOG.debug("Conversion service not configured"); + log.debug("Conversion service not configured"); return null; } @@ -69,7 +69,7 @@ public T getContent(Class targetType) { if (conversionService.canConvert(sourceTypeEntry.getKey(), targetType)) { result = conversionService.convert(sourceTypeEntry.getValue(), targetType); if (result != null) { - LOG.debug("Successfully generated {} from {}", targetType, sourceTypeEntry.getKey()); + log.debug("Successfully generated {} from {}", targetType, sourceTypeEntry.getKey()); setContent(targetType, result); return result; } @@ -77,7 +77,7 @@ public T getContent(Class targetType) { } } - LOG.debug("Could not find appropriate converter for the target type {}", targetType); + log.debug("Could not find appropriate converter for the target type {}", targetType); return null; } diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/URN.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/URN.java index 657a711e35..cde8afd312 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/URN.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/URN.java @@ -15,8 +15,10 @@ */ package org.openehealth.ipf.commons.core; +import lombok.NonNull; import org.ietf.jgss.Oid; +import java.io.Serial; import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; @@ -35,6 +37,7 @@ */ public final class URN implements Comparable, Serializable { + @Serial private static final long serialVersionUID = -7978304633360508549L; public static final String UUID = "uuid"; public static final String OID = "oid"; @@ -73,7 +76,7 @@ public URN(String namespaceId, String namespaceSpecificString) throws URISyntaxE } @Override - public int compareTo(URN urn) { + public int compareTo(@NonNull URN urn) { return equals(urn) ? 0 : uri.compareTo(urn.uri); } diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ContextFacade.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ContextFacade.java index 52a99e01da..574a60640a 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ContextFacade.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ContextFacade.java @@ -35,11 +35,11 @@ public class ContextFacade { private static Registry instance; - private static final Logger LOG = LoggerFactory.getLogger(ContextFacade.class); + private static final Logger log = LoggerFactory.getLogger(ContextFacade.class); public static synchronized void setRegistry(Registry registry) { if (instance != null && !registry.equals(instance)) - LOG.info("Re-initializing the registry"); + log.info("Re-initializing the registry"); instance = registry; } diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ExtensionModuleFactory.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ExtensionModuleFactory.java index feeba133b9..583bc18dbb 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ExtensionModuleFactory.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/config/ExtensionModuleFactory.java @@ -35,7 +35,7 @@ */ public class ExtensionModuleFactory extends PropertiesModuleFactory { - private static final Logger LOG = LoggerFactory.getLogger(ExtensionModuleFactory.class); + private static final Logger log = LoggerFactory.getLogger(ExtensionModuleFactory.class); private static final String MODULE_NAME_INITIALIZER_CLASS = "moduleInitializerClass"; public ExtensionModuleFactory() { @@ -43,13 +43,13 @@ public ExtensionModuleFactory() { @Override public ExtensionModule newModule(Properties properties, ClassLoader classLoader) { - LOG.info("Registering new extension module {} defined in class {}", + log.info("Registering new extension module {} defined in class {}", properties.getProperty(MODULE_NAME_KEY), properties.getProperty(MetaInfExtensionModule.MODULE_INSTANCE_CLASSES_KEY)); var module = createExtensionModule(properties, classLoader); - if (LOG.isDebugEnabled()) { + if (log.isDebugEnabled()) { for(var method : module.getMetaMethods()) { - LOG.debug("registered method: {}", method); + log.debug("registered method: {}", method); } } if (properties.containsKey(MODULE_NAME_INITIALIZER_CLASS)) { @@ -58,7 +58,7 @@ public ExtensionModule newModule(Properties properties, ClassLoader classLoader) var initializerClass = Class.forName(initializerClassName); initializerClass.getDeclaredConstructor().newInstance(); } catch (Exception e) { - LOG.warn("Unable to initialize extension using {}.", initializerClassName, e); + log.warn("Unable to initialize extension using {}.", initializerClassName, e); } } diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/extend/config/DynamicExtensionConfigurer.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/extend/config/DynamicExtensionConfigurer.java index e31396fc24..fea9b0db2f 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/extend/config/DynamicExtensionConfigurer.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/extend/config/DynamicExtensionConfigurer.java @@ -43,7 +43,7 @@ public class DynamicExtensionConfigurer extends OrderedConfigurer { - private static final Logger LOG = LoggerFactory.getLogger(DynamicExtensionConfigurer.class); + private static final Logger log = LoggerFactory.getLogger(DynamicExtensionConfigurer.class); public DynamicExtensionConfigurer() { setOrder(2); @@ -52,7 +52,7 @@ public DynamicExtensionConfigurer() { @Override public void configure(DynamicExtension extension) { if (extension != null) { - LOG.info("Registering new extension module {} defined in class {}", + log.info("Registering new extension module {} defined in class {}", extension.getModuleName(), extension.getClass()); var module = DynamicExtensionModule.newModule(extension); addExtensionMethods(module); @@ -76,7 +76,7 @@ public static void addExtensionMethods(ExtensionModule module) { } else { ((MetaClassRegistryImpl)metaClassRegistry).getInstanceMethods().add(metaMethod); } - LOG.debug("registered method: {}", metaMethod); + log.debug("registered method: {}", metaMethod); } for (var cachedClassEntry : classMap.entrySet()) { cachedClassEntry.getKey().addNewMopMethods(cachedClassEntry.getValue()); diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Converter.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Converter.java index c29fa3f443..765eaba1da 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Converter.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Converter.java @@ -42,8 +42,6 @@ public abstract class Converter implements Parser, Renderer, Transmo * * @param message message to be converted * @return converted message - * @throws ParseException - * @throws RenderException */ public final String convert(String message, Object... params) { var parsed = parse(message, params); diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Parser.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Parser.java index d54cbdcb07..cf908f1e0e 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Parser.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Parser.java @@ -36,10 +36,9 @@ public interface Parser { * Parses a message and returns an internal representation of the * information. * - * @param message - * @param params + * @param message message + * @param params parse parameters * @return the parsed message - * @throws ParseException */ S parse(String message, Object... params); @@ -47,12 +46,11 @@ public interface Parser { * Parses a message and returns an internal representation of the * information. * - * @param message - * @param params + * @param message message to be parsed + * @param params parse parameters * @return the parsed message * @throws IOException * if reading from stream fails - * @throws ParseException */ S parse(InputStream message, Object... params) throws IOException; @@ -60,24 +58,23 @@ public interface Parser { * Parses a message and returns an internal representation of the * information. * - * @param source - * @param params + * @param source message to be parsed + * @param params parse parameters * @return the parsed message * @throws IOException * if reading from stream fails - * @throws ParseException */ S parse(Source source, Object... params) throws IOException; /** * Parses a message and returns an internal representation of the * information. - * - * @param params + * + * @param reader message to be parsed + * @param params parse parameters * @return the parsed message * @throws IOException * if reading from stream fails - * @throws ParseException */ S parse(Reader reader, Object... params) throws IOException; diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Renderer.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Renderer.java index c5badca933..2c69680b36 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Renderer.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Renderer.java @@ -34,52 +34,48 @@ public interface Renderer { /** * Renders the model into its external representation. * - * @param model + * @param model model to be rendered * @param params * dynamic information used during rendering. See the respective * implementation class documentation if this is required or * supported. * @return the external representation of the model - * @throws RenderException */ Result render(final T model, Result result, final Object... params) throws IOException; /** * Renders the model into its external representation. * - * @param model + * @param model model to be rendered * @param params * dynamic information used during rendering. See the respective * implementation class documentation if this is required or * supported. * @return the external representation of the model - * @throws RenderException */ OutputStream render(final T model, OutputStream result, final Object... params) throws IOException; /** * Renders the model into its external representation. * - * @param model + * @param model model to be rendered * @param params * dynamic information used during rendering. See the respective * implementation class documentation if this is required or * supported. * @return the external representation of the model - * @throws RenderException */ Writer render(final T model, Writer result, final Object... params) throws IOException; /** * Renders the model into its external representation. * - * @param model + * @param model model to be rendered * @param params * dynamic information used during rendering. See the respective * implementation class documentation if this is required or * supported. * @return the external representation of the model - * @throws RenderException */ String render(final T model, final Object... params); diff --git a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Transmogrifier.java b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Transmogrifier.java index 68f701faee..1b9813fea0 100644 --- a/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Transmogrifier.java +++ b/commons/core/src/main/java/org/openehealth/ipf/commons/core/modules/api/Transmogrifier.java @@ -31,7 +31,7 @@ public interface Transmogrifier { * Transmogrifies an object into another one. * * @param object what goes in - * @param params + * @param params parameters * @return what comes out */ T zap(S object, Object... params); diff --git a/commons/core/src/test/java/org/openehealth/ipf/commons/core/URNTest.java b/commons/core/src/test/java/org/openehealth/ipf/commons/core/URNTest.java index 8866f3edfc..910931fefb 100644 --- a/commons/core/src/test/java/org/openehealth/ipf/commons/core/URNTest.java +++ b/commons/core/src/test/java/org/openehealth/ipf/commons/core/URNTest.java @@ -31,7 +31,7 @@ public void testCorrectOID() throws URISyntaxException { } @Test - public void testCorrectUUID() throws URISyntaxException { + public void testCorrectUUID() { var uuid = UUID.randomUUID(); var urn = new URN(uuid); assertEquals("uuid", urn.getNamespaceId()); @@ -77,6 +77,6 @@ public void testHashCode() throws URISyntaxException { @Test public void testFromOid() throws GSSException, URISyntaxException { var oid = "2.999.2.3.2.43.54"; - assertEquals(URN.create("urn:oid:" + oid), new URN(new Oid(oid))); + assertEquals(new URN(new Oid(oid)), URN.create("urn:oid:" + oid)); } } diff --git a/commons/core/src/test/java/org/openehealth/ipf/commons/core/modules/api/ValidationExceptionTest.java b/commons/core/src/test/java/org/openehealth/ipf/commons/core/modules/api/ValidationExceptionTest.java index 13ea805e9d..80b4c4fb43 100644 --- a/commons/core/src/test/java/org/openehealth/ipf/commons/core/modules/api/ValidationExceptionTest.java +++ b/commons/core/src/test/java/org/openehealth/ipf/commons/core/modules/api/ValidationExceptionTest.java @@ -68,7 +68,7 @@ public void testMessages() { // ----------------- causes = new Throwable[] {}; s = new ValidationException(message, causes).getMessage(); - assertEquals(s, message); + assertEquals(message, s); s = new ValidationException(causes).getMessage(); assertEquals(s, ValidationException.class.getName()); @@ -76,7 +76,7 @@ public void testMessages() { // ----------------- causes = null; s = new ValidationException(message, causes).getMessage(); - assertEquals(s, message); + assertEquals(message, s); s = new ValidationException(causes).getMessage(); assertEquals(s, ValidationException.class.getName()); @@ -84,7 +84,7 @@ public void testMessages() { // ----------------- Throwable cause = null; s = new ValidationException(message, cause).getMessage(); - assertEquals(s, message); + assertEquals(message, s); s = new ValidationException(cause).getMessage(); assertEquals(s, ValidationException.class.getName()); diff --git a/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRule.java b/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRule.java index 6919a2f093..d6fe070dcc 100644 --- a/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRule.java +++ b/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRule.java @@ -50,7 +50,7 @@ */ public class ConditionalRule implements TestRule { - private static final Logger LOG = LoggerFactory.getLogger(ConditionalRule.class); + private static final Logger log = LoggerFactory.getLogger(ConditionalRule.class); private Predicate predicate; private String reason; @@ -129,7 +129,7 @@ public void evaluate() throws Throwable { statement.evaluate(); } catch (Throwable e) { if (isIgnoredException(e)) { - LOG.warn("Did not execute test {}: {} ", description, conditionalRule.getReason()); + log.warn("Did not execute test {}: {} ", description, conditionalRule.getReason()); return; } throw e; diff --git a/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRuleTest.java b/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRuleTest.java index 19455ea2e3..c80096aaea 100644 --- a/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRuleTest.java +++ b/commons/core/src/test/java/org/openehealth/ipf/commons/core/test/ConditionalRuleTest.java @@ -28,7 +28,7 @@ public class ConditionalRuleTest { private static final String currentArchitecture = System.getProperty("os.name"); - @Rule public ConditionalRule rule = new ConditionalRule() + @Rule public final ConditionalRule rule = new ConditionalRule() .ifSystemPropertyIs("os.name", currentArchitecture); @Test diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/SerializableEnumInteractionId.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/SerializableEnumInteractionId.java index 058dcbffc5..edb886c95c 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/SerializableEnumInteractionId.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/SerializableEnumInteractionId.java @@ -15,12 +15,14 @@ */ package org.openehealth.ipf.commons.ihe.core; +import java.io.Serial; import java.io.Serializable; /** * */ public class SerializableEnumInteractionId & InteractionId> implements Serializable, InteractionId { + @Serial private static final long serialVersionUID = -2740691943593482233L; private final String interaction; diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/AuditStrategySupport.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/AuditStrategySupport.java index 633e50e09b..99c7ff95ed 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/AuditStrategySupport.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/AuditStrategySupport.java @@ -19,7 +19,6 @@ import lombok.AccessLevel; import lombok.Getter; import org.openehealth.ipf.commons.audit.AuditContext; -import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; import org.openehealth.ipf.commons.audit.model.AuditMessage; import java.util.Map; diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIExportBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIExportBuilder.java new file mode 100644 index 0000000000..7db1262c71 --- /dev/null +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIExportBuilder.java @@ -0,0 +1,38 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.core.atna.event; + +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.codes.EventActionCode; +import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; +import org.openehealth.ipf.commons.audit.types.EventType; +import org.openehealth.ipf.commons.audit.types.PurposeOfUse; +import org.openehealth.ipf.commons.ihe.core.atna.AuditDataset; + +public class DefaultPHIExportBuilder extends PHIExportBuilder { + + public DefaultPHIExportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventType, purposesOfUse); + } + + public DefaultPHIExportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventActionCode eventActionCode, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventActionCode, eventType, purposesOfUse); + } + + public DefaultPHIExportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventOutcomeIndicator eventOutcomeIndicator, String eventOutcomeDescription, EventActionCode eventActionCode, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventOutcomeIndicator, eventOutcomeDescription, eventActionCode, eventType, purposesOfUse); + } +} diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIImportBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIImportBuilder.java new file mode 100644 index 0000000000..adcfbc5ffb --- /dev/null +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPHIImportBuilder.java @@ -0,0 +1,39 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.core.atna.event; + +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.codes.EventActionCode; +import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; +import org.openehealth.ipf.commons.audit.types.EventType; +import org.openehealth.ipf.commons.audit.types.PurposeOfUse; +import org.openehealth.ipf.commons.ihe.core.atna.AuditDataset; + +public class DefaultPHIImportBuilder extends PHIImportBuilder { + + + public DefaultPHIImportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventType, purposesOfUse); + } + + public DefaultPHIImportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventActionCode eventActionCode, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventActionCode, eventType, purposesOfUse); + } + + public DefaultPHIImportBuilder(AuditContext auditContext, AuditDataset auditDataset, EventOutcomeIndicator eventOutcomeIndicator, String eventOutcomeDescription, EventActionCode eventActionCode, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventOutcomeIndicator, eventOutcomeDescription, eventActionCode, eventType, purposesOfUse); + } +} diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPatientRecordEventBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPatientRecordEventBuilder.java new file mode 100644 index 0000000000..db26e53764 --- /dev/null +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultPatientRecordEventBuilder.java @@ -0,0 +1,34 @@ +/* + * Copyright 2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.core.atna.event; + +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.codes.EventActionCode; +import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator; +import org.openehealth.ipf.commons.audit.types.EventType; +import org.openehealth.ipf.commons.audit.types.PurposeOfUse; +import org.openehealth.ipf.commons.ihe.core.atna.AuditDataset; + +public class DefaultPatientRecordEventBuilder extends PatientRecordEventBuilder { + + public DefaultPatientRecordEventBuilder(AuditContext auditContext, AuditDataset auditDataset, EventActionCode action, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, action, eventType, purposesOfUse); + } + + public DefaultPatientRecordEventBuilder(AuditContext auditContext, AuditDataset auditDataset, EventOutcomeIndicator eventOutcomeIndicator, String eventOutcomeDescription, EventActionCode action, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventOutcomeIndicator, eventOutcomeDescription, action, eventType, purposesOfUse); + } +} diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultQueryInformationBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultQueryInformationBuilder.java new file mode 100644 index 0000000000..3c90775b78 --- /dev/null +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DefaultQueryInformationBuilder.java @@ -0,0 +1,28 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openehealth.ipf.commons.ihe.core.atna.event; + +import org.openehealth.ipf.commons.audit.AuditContext; +import org.openehealth.ipf.commons.audit.types.EventType; +import org.openehealth.ipf.commons.audit.types.PurposeOfUse; +import org.openehealth.ipf.commons.ihe.core.atna.AuditDataset; + +public class DefaultQueryInformationBuilder extends QueryInformationBuilder { + + public DefaultQueryInformationBuilder(AuditContext auditContext, AuditDataset auditDataset, EventType eventType, PurposeOfUse... purposesOfUse) { + super(auditContext, auditDataset, eventType, purposesOfUse); + } +} diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DicomInstancesAccessedAuditBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DicomInstancesAccessedAuditBuilder.java index b5c3635ccc..d9c626a74d 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DicomInstancesAccessedAuditBuilder.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/DicomInstancesAccessedAuditBuilder.java @@ -122,8 +122,4 @@ public T addTransferredStudyParticipantObject(final String studyId, final List> extends IHEAuditMessageBuilder { +public abstract class PHIExportBuilder> extends IHEAuditMessageBuilder { public PHIExportBuilder(AuditContext auditContext, AuditDataset auditDataset, @@ -128,8 +128,4 @@ public T addExportedEntity( return self(); } - @Override - public void validate() { - super.validate(); - } } \ No newline at end of file diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PHIImportBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PHIImportBuilder.java index 4df0b283a1..395550850c 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PHIImportBuilder.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PHIImportBuilder.java @@ -38,7 +38,7 @@ * @author Christian Ohr * @since 3.5 */ -public class PHIImportBuilder> extends IHEAuditMessageBuilder { +public abstract class PHIImportBuilder> extends IHEAuditMessageBuilder { public PHIImportBuilder(AuditContext auditContext, @@ -119,8 +119,4 @@ public T addImportedEntity( return self(); } - @Override - public void validate() { - super.validate(); - } } diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PatientRecordEventBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PatientRecordEventBuilder.java index c5271953f0..46675e5ed5 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PatientRecordEventBuilder.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/PatientRecordEventBuilder.java @@ -38,7 +38,7 @@ * @author Christian Ohr * @since 3.5 */ -public class PatientRecordEventBuilder> extends IHEAuditMessageBuilder { +public abstract class PatientRecordEventBuilder> extends IHEAuditMessageBuilder { private static final Pattern PATIENT_ID_PATTERN = Pattern.compile("^.+?\\^\\^\\^.*?&.+?&ISO(\\^.*){0,4}$"); diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/QueryInformationBuilder.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/QueryInformationBuilder.java index a815436562..f57fbde7f1 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/QueryInformationBuilder.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/atna/event/QueryInformationBuilder.java @@ -39,7 +39,7 @@ * @author Christian Ohr * @since 3.5 */ -public class QueryInformationBuilder> extends IHEAuditMessageBuilder { +public abstract class QueryInformationBuilder> extends IHEAuditMessageBuilder { public QueryInformationBuilder(AuditContext auditContext, AuditDataset auditDataset, @@ -150,8 +150,4 @@ public T setQueryParameters( return self(); } - @Override - public void validate() { - super.validate(); - } } diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainException.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainException.java index 20053238c9..fc3c038b74 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainException.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainException.java @@ -19,7 +19,6 @@ * @author Dmytro Rud */ public class ChainException extends RuntimeException { - private static final long serialVersionUID = 8260494759500343474L; public ChainException(String message) { super(message); diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtils.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtils.java index f8336ebd4d..71e3818861 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtils.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtils.java @@ -30,7 +30,7 @@ */ public class ChainUtils { - private static final transient Logger LOG = LoggerFactory.getLogger(ChainUtils.class); + private static final Logger log = LoggerFactory.getLogger(ChainUtils.class); /** * Extends an initial chain with elements from a custom collection. @@ -59,7 +59,7 @@ public static List createChain(List initial, Collect // check whether element with this ID is already in the chain if (chainIds.contains(cid)) { - LOG.debug("Element {} is already in the chain, ignore it", cid); + log.debug("Element {} is already in the chain, ignore it", cid); iter.remove(); successful = true; continue; @@ -73,10 +73,10 @@ public static List createChain(List initial, Collect (c.getBefore().contains(other.getId()) && !(other.getAfter().contains(cid))) || (c.getAfter().contains(other.getId()) && !(other.getBefore().contains(cid))) ) - .collect(Collectors.toList()); + .toList(); if (!unprocessedDependencies.isEmpty()) { - LOG.debug("Element {} depends on {}", cid, + log.debug("Element {} depends on {}", cid, unprocessedDependencies.stream() .map(Chainable::getId) .collect(Collectors.joining(" "))); @@ -91,12 +91,12 @@ public static List createChain(List initial, Collect var beforeIndices = c.getBefore().stream() .map(chainIds::indexOf) .filter(value -> value >= 0) - .collect(Collectors.toList()); + .toList(); var afterIndices = c.getAfter().stream() .map(chainIds::indexOf) .filter(value -> value >= 0) - .collect(Collectors.toList()); + .toList(); var minBeforePosition = 0; var maxAfterPosition = 0; @@ -123,12 +123,12 @@ public static List createChain(List initial, Collect chain.add(position, c); chainIds.add(position, cid); iter.remove(); - LOG.debug("Inserted element {} at position {}", cid, position); + log.debug("Inserted element {} at position {}", cid, position); successful = true; } if (successful) { - LOG.debug("Iteration result: {} elements in the chain, {} elements left", chain.size(), unprocessed.size()); + log.debug("Iteration result: {} elements in the chain, {} elements left", chain.size(), unprocessed.size()); } else { throw new ChainException("Cannot build a chain, probably there is a dependency loop"); } diff --git a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/payload/PayloadLoggerBase.java b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/payload/PayloadLoggerBase.java index 6afb1878a8..aa5a19cad4 100644 --- a/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/payload/PayloadLoggerBase.java +++ b/commons/ihe/core/src/main/java/org/openehealth/ipf/commons/ihe/core/payload/PayloadLoggerBase.java @@ -68,7 +68,7 @@ * @author Dmytro Rud */ abstract public class PayloadLoggerBase { - private static final transient Logger LOG = LoggerFactory.getLogger(PayloadLoggerBase.class); + private static final Logger log = LoggerFactory.getLogger(PayloadLoggerBase.class); private static final AtomicLong SEQUENCE_ID_GENERATOR = new AtomicLong(0L); @@ -97,15 +97,15 @@ protected void doLogPayload(T context, String charsetName, String... payloadPiec return; } if ((errorCountLimit >= 0) && (errorCount.get() >= errorCountLimit)) { - LOG.warn("Error count limit has bean reached, reset the counter to enable further trials"); + log.warn("Error count limit has bean reached, reset the counter to enable further trials"); return; } if (Boolean.getBoolean(PROPERTY_CONSOLE)) { // use regular Java logging - if (LOG.isDebugEnabled()) { + if (log.isDebugEnabled()) { var output = String.join("", payloadPieces); - LOG.debug(output); + log.debug(output); } } else { // compute the file path and write payload pieces into this file @@ -121,7 +121,7 @@ protected void doLogPayload(T context, String charsetName, String... payloadPiec errorCount.set(0); } catch (IOException e) { errorCount.incrementAndGet(); - LOG.warn("Cannot write into " + path, e); + log.warn("Cannot write into {}", path, e); } } } @@ -129,7 +129,7 @@ protected void doLogPayload(T context, String charsetName, String... payloadPiec public boolean canProcess() { if ((!enabled) || Boolean.getBoolean(PROPERTY_DISABLED)) { - LOG.trace("Message payload logging is disabled"); + log.trace("Message payload logging is disabled"); return false; } return true; diff --git a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/InteractionIdTest.java b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/InteractionIdTest.java index 32c54bac61..2db3022829 100644 --- a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/InteractionIdTest.java +++ b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/InteractionIdTest.java @@ -75,9 +75,9 @@ enum Interactions implements InteractionId { Interaction2("int2", "description2"); @Getter - private String name; + private final String name; @Getter - private String description; + private final String description; } @@ -99,9 +99,9 @@ enum Interactions implements InteractionId { Interaction4("int4", "description4"); @Getter - private String name; + private final String name; @Getter - private String description; + private final String description; } diff --git a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/atna/MockedAuditMessageQueue.java b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/atna/MockedAuditMessageQueue.java index 10e2fcdcdd..244a222e3a 100644 --- a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/atna/MockedAuditMessageQueue.java +++ b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/atna/MockedAuditMessageQueue.java @@ -40,10 +40,11 @@ public class MockedAuditMessageQueue implements AbstractMockedAuditMessageQueue { private static final String NEW_VALIDATION_SCHEMA = "/atna2.xsd"; - private XsdValidator validator = new XsdValidator(); + private final XsdValidator validator = new XsdValidator(); private final boolean needValidation; @Getter + final List messages = Collections.synchronizedList(new ArrayList<>()); public MockedAuditMessageQueue() { diff --git a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtilsTest.java b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtilsTest.java index a89c390b49..09f660609b 100644 --- a/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtilsTest.java +++ b/commons/ihe/core/src/test/java/org/openehealth/ipf/commons/ihe/core/chain/ChainUtilsTest.java @@ -82,9 +82,7 @@ public void testBeforeEqualsToAfter() { new MyChainable("c4", "c2", ""), new MyChainable("c5", "i4", "i4") // should fail, Before==After ); - Assertions.assertThrows(ChainException.class, () -> { - doTest(custom, "dummy"); - }); + Assertions.assertThrows(ChainException.class, () -> doTest(custom, "dummy")); } @@ -97,9 +95,7 @@ public void testBeforeGreaterThanAfter() { new MyChainable("c4", "c2", ""), new MyChainable("c5", "i3", "i4") // should fail, Before>After ); - Assertions.assertThrows(ChainException.class, () -> { - doTest(custom, "dummy"); - }); + Assertions.assertThrows(ChainException.class, () -> doTest(custom, "dummy")); } @@ -110,9 +106,7 @@ public void testDependencyLoop() { new MyChainable("c2", "c1", "c3"), new MyChainable("c3", "c1", "c2") ); - Assertions.assertThrows(ChainException.class, () -> { - doTest(custom, "dummy"); - }); + Assertions.assertThrows(ChainException.class, () -> doTest(custom, "dummy")); } } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/AbstractPlainProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/AbstractPlainProvider.java index 6557d3e5cf..90937acf29 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/AbstractPlainProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/AbstractPlainProvider.java @@ -41,7 +41,7 @@ */ public abstract class AbstractPlainProvider extends FhirProvider { - private static final Logger LOG = LoggerFactory.getLogger(AbstractPlainProvider.class); + private static final Logger log = LoggerFactory.getLogger(AbstractPlainProvider.class); private RequestConsumer consumer; @@ -62,14 +62,14 @@ public void setConsumer(RequestConsumer consumer) { throw new IllegalStateException("This provider is already used by a different consumer: " + consumer); } this.consumer = consumer; - LOG.info("Connected consumer {} to provider {}", consumer, this); + log.info("Connected consumer {} to provider {}", consumer, this); } @Override public void unsetConsumer(RequestConsumer consumer) { if (this.consumer == consumer) { this.consumer = null; - LOG.info("Disconnected consumer {} from provider {}", consumer, this); + log.info("Disconnected consumer {} from provider {}", consumer, this); } } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/ApacheHttpRequest5.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/ApacheHttpRequest5.java index b1b7532a2c..c157f81a04 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/ApacheHttpRequest5.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/ApacheHttpRequest5.java @@ -23,7 +23,6 @@ import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.routing.RoutingSupport; import org.apache.hc.core5.http.ClassicHttpRequest; -import org.apache.hc.core5.http.ClassicHttpResponse; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpException; diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/DefaultFhirRegistry.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/DefaultFhirRegistry.java index 90f38c41b2..4763354a31 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/DefaultFhirRegistry.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/DefaultFhirRegistry.java @@ -33,7 +33,7 @@ */ public class DefaultFhirRegistry implements FhirRegistry { - private static final Logger LOG = LoggerFactory.getLogger(DefaultFhirRegistry.class); + private static final Logger log = LoggerFactory.getLogger(DefaultFhirRegistry.class); private static final Map registries = new ConcurrentHashMap<>(); @@ -67,7 +67,7 @@ public void register(Object resourceProvider) { servlet.registerProvider(resourceProvider); } } else { - LOG.info("Resource Provider {} was already registered. Ignored registration.", resourceProvider); + log.info("Resource Provider {} was already registered. Ignored registration.", resourceProvider); } } } @@ -80,14 +80,14 @@ public void unregister(Object resourceProvider) { provider.unregisterProvider(resourceProvider); } } else { - LOG.info("Resource Provider {} was not registered. Ignored deregistration.", resourceProvider); + log.info("Resource Provider {} was not registered. Ignored deregistration.", resourceProvider); } } } @Override public void register(RestfulServer servlet) { - LOG.debug("Registering FHIR servlet with name {}. Providers registered so far: {}", + log.debug("Registering FHIR servlet with name {}. Providers registered so far: {}", servlet.getServletName(), resourceProviders.size()); servlets.add(servlet); servlet.registerProviders(resourceProviders); @@ -95,7 +95,7 @@ public void register(RestfulServer servlet) { @Override public void unregister(RestfulServer servlet) { - LOG.debug("Unregistering FHIR Servlet with name {} and {} connected providers", + log.debug("Unregistering FHIR Servlet with name {} and {} connected providers", servlet.getServletName(), resourceProviders.size()); servlets.remove(servlet); servlet.unregisterProviders(resourceProviders); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/EagerBundleProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/EagerBundleProvider.java index 500d06bb4f..f2aac672a8 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/EagerBundleProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/EagerBundleProvider.java @@ -16,6 +16,7 @@ package org.openehealth.ipf.commons.ihe.fhir; +import lombok.NonNull; import org.hl7.fhir.instance.model.api.IBaseResource; import java.util.List; @@ -41,7 +42,7 @@ public EagerBundleProvider(RequestConsumer consumer, boolean sort, Object payloa } @Override - public List getResources(int fromIndex, int toIndex) { + public @NonNull List getResources(int fromIndex, int toIndex) { var resources = fetchResources(); return resources.subList(fromIndex, Math.min(toIndex, resources.size())); } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/FhirProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/FhirProvider.java index 456cf533d1..5351d0f82e 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/FhirProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/FhirProvider.java @@ -19,7 +19,6 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.rest.api.server.RequestDetails; -import javax.security.cert.X509Certificate; import jakarta.servlet.http.HttpServletRequest; import java.io.Serializable; import java.util.*; diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/HttpClient5Builder.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/HttpClient5Builder.java index 335b9d556f..e00f7e70aa 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/HttpClient5Builder.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/HttpClient5Builder.java @@ -21,7 +21,7 @@ import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.TlsSocketStrategy; import org.apache.hc.core5.http.HttpHost; import java.util.function.Consumer; @@ -69,8 +69,8 @@ public CloseableHttpClient build() { .build(); } - void setSSLSocketFactory(SSLConnectionSocketFactory sslSocketFactory) { - connectionManagerBuilder.setSSLSocketFactory(sslSocketFactory); + public void setSSLSocketFactory(TlsSocketStrategy tlsSocketStrategy) { + connectionManagerBuilder.setTlsSocketStrategy(tlsSocketStrategy); } } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IgBasedFhirContextSupplier.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IgBasedFhirContextSupplier.java index 7e9c8c4e98..807dfb0dcf 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IgBasedFhirContextSupplier.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IgBasedFhirContextSupplier.java @@ -42,7 +42,7 @@ public static FhirContext getContext(FhirContext fhirContext, String... igResour } var npmValidationSupport = new NpmPackageValidationSupport(fhirContext); - for (String igResource : igResources) { + for (var igResource : igResources) { npmValidationSupport.loadPackageFromClasspath(igResource); } @@ -53,8 +53,8 @@ public static FhirContext getContext(FhirContext fhirContext, String... igResour new InMemoryTerminologyServerValidationSupport(fhirContext))); return fhirContext.setFhirValidatorFactory(ctx -> { - FhirValidator validator = new FhirValidator(ctx); - FhirInstanceValidator instanceValidator = new FhirInstanceValidator(validationSupport); + var validator = new FhirValidator(ctx); + var instanceValidator = new FhirInstanceValidator(validationSupport); validator.registerValidatorModule(instanceValidator); return validator; }); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IpfFhirServlet.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IpfFhirServlet.java index d61d52996f..d62b43eb6b 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IpfFhirServlet.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/IpfFhirServlet.java @@ -50,7 +50,7 @@ */ public class IpfFhirServlet extends RestfulServer { - private static final Logger LOG = LoggerFactory.getLogger(IpfFhirServlet.class); + private static final Logger log = LoggerFactory.getLogger(IpfFhirServlet.class); private static final String SERVLET_FHIR_VERSION_PARAMETER_NAME = "fhirVersion"; private static final String SERVLET_LOGGING_PARAMETER_NAME = "logging"; @@ -134,7 +134,7 @@ public void init(ServletConfig config) throws ServletException { throw new ServletException(e); } - LOG.debug("Initializing IpfFhirServlet {}", servletName); + log.debug("Initializing IpfFhirServlet {}", servletName); if (config.getInitParameter(SERVLET_FHIR_VERSION_PARAMETER_NAME) != null) { fhirVersion = FhirVersionEnum.valueOf(config.getInitParameter(SERVLET_FHIR_VERSION_PARAMETER_NAME)); @@ -177,11 +177,11 @@ public void destroy() { try { registry.unregister(this); } catch (Exception e) { - LOG.warn("Problem while unregistering servlet {}", getServletName(), e); + log.warn("Problem while unregistering servlet {}", getServletName(), e); } } super.destroy(); - LOG.info("Destroyed IpfFhirServlet [{}]", getServletName()); + log.info("Destroyed IpfFhirServlet [{}]", getServletName()); } /** diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/LazyBundleProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/LazyBundleProvider.java index 6fe36cbea6..8d108385ed 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/LazyBundleProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/LazyBundleProvider.java @@ -20,6 +20,7 @@ import com.google.common.collect.Range; import com.google.common.collect.RangeSet; import com.google.common.collect.TreeRangeSet; +import lombok.NonNull; import org.hl7.fhir.instance.model.api.IBaseResource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,7 +51,7 @@ */ public class LazyBundleProvider extends AbstractBundleProvider { - private static final Logger LOG = LoggerFactory.getLogger(LazyBundleProvider.class); + private static final Logger log = LoggerFactory.getLogger(LazyBundleProvider.class); private final boolean cacheResults; private int size = -1; @@ -84,27 +85,27 @@ public LazyBundleProvider(RequestConsumer consumer, boolean cacheResults, boolea } @Override - public List getResources(int fromIndex, int toIndex) { + public @NonNull List getResources(int fromIndex, int toIndex) { if (!cacheResults) { var result = getPartialResult(fromIndex, toIndex); sortIfApplicable(result); return result; } - LOG.debug("Cached results contain the following ranges: {}. Requesting resources from index {} to {}", resultRanges, fromIndex, toIndex); + log.debug("Cached results contain the following ranges: {}. Requesting resources from index {} to {}", resultRanges, fromIndex, toIndex); var wanted = Range.closedOpen(fromIndex, toIndex); var needed = resultRanges.required(wanted); - LOG.debug("Requiring the following ranges {}", needed); + log.debug("Requiring the following ranges {}", needed); for (var requiredRange : needed.asDescendingSetOfRanges()) { - LOG.debug("Now requesting the following range {}", requiredRange); + log.debug("Now requesting the following range {}", requiredRange); var results = getPartialResult(requiredRange.lowerEndpoint(), requiredRange.upperEndpoint()); - LOG.debug("Got back a list of size {}", results.size()); + log.debug("Got back a list of size {}", results.size()); if (!results.isEmpty()) { cacheAll(requiredRange.lowerEndpoint(), results); // Take care, potentially less elements than requested have been retrieved resultRanges.add(Range.closedOpen(requiredRange.lowerEndpoint(), requiredRange.lowerEndpoint() + results.size())); } } - LOG.debug("Cached results now contain the following ranges: {}", resultRanges); + log.debug("Cached results now contain the following ranges: {}", resultRanges); // Everything went OK, return whatever we got return cachedResults.subList(fromIndex, Math.min(cachedResults.size(), Math.min(cachedResults.size(), toIndex))); @@ -130,7 +131,7 @@ public Integer size() { private void cacheAll(int fromIndex, List resources) { if (cachedResults.size() <= fromIndex) { for (var i = cachedResults.size(); i < fromIndex; i++) { - LOG.debug("Adding null for index {}", i); + log.debug("Adding null for index {}", i); cachedResults.add(null); } cachedResults.addAll(resources); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/MethanolHttpResponse.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/MethanolHttpResponse.java index 986cc576cf..d311170d1f 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/MethanolHttpResponse.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/MethanolHttpResponse.java @@ -45,7 +45,7 @@ public MethanolHttpResponse(HttpResponse response, StopWatch stopWa * Buffers the response entity. This is usually only called when HAPI client interceptors * want to do some logging or response capturing. * - * @throws IOException + * @throws IOException IOException */ @Override public void bufferEntity() throws IOException { diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SharedFhirProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SharedFhirProvider.java index 5426af7692..3bb0814b87 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SharedFhirProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SharedFhirProvider.java @@ -45,7 +45,7 @@ */ public abstract class SharedFhirProvider extends FhirProvider { - private static final Logger LOG = LoggerFactory.getLogger(SharedFhirProvider.class); + private static final Logger log = LoggerFactory.getLogger(SharedFhirProvider.class); private FhirContext fhirContext; private final List consumers = new ArrayList<>(); @@ -115,7 +115,7 @@ public void setConsumer(RequestConsumer consumer) { throw new IllegalStateException("Consumer has a different FhirContext than the others: " + consumer); } consumers.add(consumer); - LOG.info("Connected consumer {} to provider {}", consumer, this); + log.info("Connected consumer {} to provider {}", consumer, this); } boolean conflictingFhirContext(FhirContext otherFhirContext) { @@ -130,7 +130,7 @@ boolean conflictingFhirContext(FhirContext otherFhirContext) { @Override public void unsetConsumer(RequestConsumer consumer) { if (consumers.remove(consumer)) { - LOG.info("Disconnected consumer {} from provider {}", consumer, this); + log.info("Disconnected consumer {} from provider {}", consumer, this); } if (consumers.isEmpty()) { fhirContext = null; diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SpringCachePagingProvider.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SpringCachePagingProvider.java index a5ed4a8849..ecbe564a21 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SpringCachePagingProvider.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SpringCachePagingProvider.java @@ -22,6 +22,7 @@ import ca.uhn.fhir.rest.server.IPagingProvider; import ca.uhn.fhir.rest.server.SimpleBundleProvider; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; @@ -82,7 +83,7 @@ public String storeResultList(RequestDetails requestDetails, IBundleProvider bun } @Override - public IBundleProvider retrieveResultList(RequestDetails requestDetails, String id) { + public IBundleProvider retrieveResultList(RequestDetails requestDetails, @NonNull String id) { return distributed ? deserialize(cache.get(id, List.class)) : cache.get(id, IBundleProvider.class); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareApacheRestfulClient5Factory.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareApacheRestfulClient5Factory.java index 5f0362839a..e139d7859b 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareApacheRestfulClient5Factory.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareApacheRestfulClient5Factory.java @@ -23,8 +23,10 @@ import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; +import org.apache.hc.client5.http.ssl.HttpsSupport; import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.ssl.SSLContexts; import org.apache.hc.core5.util.Timeout; import org.openehealth.ipf.commons.ihe.fhir.translation.FhirSecurityInformation; @@ -139,14 +141,14 @@ public ApacheFhirSecurityInformation(boolean secure, SSLContext sslContext, Host @Override public void configureHttpClientBuilder(HttpClient5Builder builder) { if (isSecure()) { - var connectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder.create().useSystemProperties(); - if (getSslContext() != null) { - connectionSocketFactoryBuilder.setSslContext(getSslContext()); - } - if (getHostnameVerifier() != null) { - connectionSocketFactoryBuilder.setHostnameVerifier(getHostnameVerifier()); - } - builder.setSSLSocketFactory(connectionSocketFactoryBuilder.build()); + var sslContext = getSslContext() != null ? + getSslContext() : + SSLContexts.createSystemDefault(); + var hostnameVerifier = getHostnameVerifier() != null ? + getHostnameVerifier() : + HttpsSupport.getDefaultHostnameVerifier(); + var tlsStrategy = new DefaultClientTlsStrategy(sslContext, hostnameVerifier); + builder.setSSLSocketFactory(tlsStrategy); } } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareMethanolRestfulClientFactory.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareMethanolRestfulClientFactory.java index d53107dbe4..47831a2023 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareMethanolRestfulClientFactory.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/SslAwareMethanolRestfulClientFactory.java @@ -126,7 +126,7 @@ protected synchronized Methanol getNativeHttpClient() { .autoAcceptEncoding(true) .proxy(proxy != null ? ProxySelector.of(proxy) : ProxySelector.getDefault()); if (executor != null) { - builder = builder.executor(executor); + builder.executor(executor); } // Chance to override or instrument httpClient = customizeHttpClientBuilder(builder).build(); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/FhirQueryAuditStrategy.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/FhirQueryAuditStrategy.java index ee1c9a305a..4c4fbce6ac 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/FhirQueryAuditStrategy.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/FhirQueryAuditStrategy.java @@ -22,7 +22,6 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Map; -import java.util.stream.Collectors; import static org.openehealth.ipf.commons.ihe.fhir.Constants.HTTP_QUERY; diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/GenericPatientIdExtractor.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/GenericPatientIdExtractor.java index 363b367c8d..40be0913e7 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/GenericPatientIdExtractor.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/GenericPatientIdExtractor.java @@ -50,7 +50,7 @@ public Optional patientReferenceFromResource(IBaseReso if (resource != null) { var resourceDefinition = fhirContext.getResourceDefinition(resource); if (PATIENT.equals(resourceDefinition.getName())) { - String id = resource.getIdElement().getIdPart(); + var id = resource.getIdElement().getIdPart(); return id != null ? Optional.of(patientReference(id)) : Optional.empty(); } else { try { @@ -69,7 +69,7 @@ public Optional patientReferenceFromResource(IBaseReso // There is probably a bug in HAPI FHIR for expressions like DocumentReference.subject.where(resolve() is Patient) // resolve() always returns null instead of the actual reference value, see FhirPathEngine#funcResolve() private String simplifyPath(String path) { - int idx = path.indexOf(".where"); + var idx = path.indexOf(".where"); return idx < 0 ? path : path.substring(0, idx); } diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/SwissEprFhirAuditDatasetEnricher.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/SwissEprFhirAuditDatasetEnricher.java index 46732c50c7..8918b361f5 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/SwissEprFhirAuditDatasetEnricher.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/SwissEprFhirAuditDatasetEnricher.java @@ -48,10 +48,10 @@ private static void enrichAuditDataset(AuditDataset auditDataset, Map parameters, String key, AuditDataset auditDataset) { if (auditDataset.getW3cTraceContextId() == null) { - Object value = parameters.get(key); + var value = parameters.get(key); if (value != null) { - Map> headers = (Map>) value; - for (String name : headers.keySet()) { + var headers = (Map>) value; + for (var name : headers.keySet()) { if ("traceparent".equalsIgnoreCase(name)) { auditDataset.setW3cTraceContextId(headers.get(name).get(0)); return; diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractor.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractor.java index d488b7c6f9..4c6bbb6df4 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractor.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractor.java @@ -19,7 +19,7 @@ public class BalpJwtClaimsExtractor { - private static final Logger LOG = LoggerFactory.getLogger(BalpJwtClaimsExtractor.class); + private static final Logger log = LoggerFactory.getLogger(BalpJwtClaimsExtractor.class); public Optional extractId(JWT jwt, BalpJwtExtractorProperties balpJwtExtractorProperties) { return Optional.ofNullable(extractStringClaimFromJWT(jwt, balpJwtExtractorProperties.getIdPath())); @@ -82,31 +82,31 @@ public Optional extractBppcAcp(JWT jwt, BalpJwtExtractorProperties balpJ } private String extractStringClaimFromJWT(JWT jwt, String[] expressions){ - Optional finalClaimForExpression = getFinalClaimSet(jwt, expressions); + var finalClaimForExpression = getFinalClaimSet(jwt, expressions); if (finalClaimForExpression.isPresent()) { - JWTClaimsSet claimsSet = finalClaimForExpression.get().jwtClaimsSet(); - String expression = finalClaimForExpression.get().expression(); + var claimsSet = finalClaimForExpression.get().jwtClaimsSet(); + var expression = finalClaimForExpression.get().expression(); try { return claimsSet.getStringClaim(expression); } catch (ParseException pe) { - LOG.warn("Not string claims present for expression key '" + expression + "'", pe); + log.warn("Not string claims present for expression key '{}'", expression, pe); } } return null; } private Set extractListClaimFromJWT(JWT jwt, String[] expressions){ - Optional finalClaimForExpression = getFinalClaimSet(jwt, expressions); + var finalClaimForExpression = getFinalClaimSet(jwt, expressions); if (finalClaimForExpression.isPresent()) { - JWTClaimsSet claimsSet = finalClaimForExpression.get().jwtClaimsSet(); - String expression = finalClaimForExpression.get().expression(); + var claimsSet = finalClaimForExpression.get().jwtClaimsSet(); + var expression = finalClaimForExpression.get().expression(); try { - List values = claimsSet.getListClaim(expression); + var values = claimsSet.getListClaim(expression); if (values != null && !values.isEmpty()) { return values.stream().map(Objects::toString).collect(Collectors.toSet()); } } catch (ParseException pe) { - LOG.warn("Not list claims present for expression key '" + expression + "'", pe); + log.warn("Not list claims present for expression key '{}'", expression, pe); } } return null; @@ -119,8 +119,8 @@ private Optional getFinalClaimSet(JWT jwt, String[] expressions) { for (var expression: expressions) { try { if (expression.contains(":")) { - JWTClaimsSet extracted = jwt.getJWTClaimsSet(); - List structure = List.of(expression.split("\\:")); + var extracted = jwt.getJWTClaimsSet(); + var structure = List.of(expression.split("\\:")); Iterator structureIterator = structure.listIterator(); String subExpression = null; while (structureIterator.hasNext()) { @@ -142,7 +142,7 @@ private Optional getFinalClaimSet(JWT jwt, String[] expressions) { } } } catch (ParseException pe) { - LOG.debug("Not claimset present for expression key: " + pe.getMessage()); + log.debug("Not claimset present for expression key: {}", pe.getMessage()); } } return Optional.empty(); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtParser.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtParser.java index fd2d438ade..05f446e844 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtParser.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtParser.java @@ -15,13 +15,13 @@ public class BalpJwtParser { private static final BalpJwtClaimsExtractor claimsExtractor = new BalpJwtClaimsExtractor(); - private static final Logger LOG = LoggerFactory.getLogger(BalpJwtParser.class); + private static final Logger log = LoggerFactory.getLogger(BalpJwtParser.class); public static Optional parseAuthorizationToBalpDataSet(String authenticationHeader, BalpJwtExtractorProperties balpJwtExtractorProperties) { - Optional jwt = parseAuthenticationToJWT(authenticationHeader); + var jwt = parseAuthenticationToJWT(authenticationHeader); return jwt.map(value -> { - BalpJwtDataSet balpJwtDataSet = parseJwtToBalpDataSet(value, claimsExtractor, balpJwtExtractorProperties); + var balpJwtDataSet = parseJwtToBalpDataSet(value, claimsExtractor, balpJwtExtractorProperties); balpJwtDataSet.setOpaqueJwt(authenticationHeader.substring(authenticationHeader.length() - 32)); return balpJwtDataSet; }); @@ -31,11 +31,11 @@ public static Optional parseAuthenticationToJWT(String authenticationHeader if (isBlank(authenticationHeader) || !authenticationHeader.toLowerCase().startsWith("bearer ")) return Optional.empty(); - String bearer = authenticationHeader.replaceAll("^[Bb][Ee][Aa][Rr][Ee][Rr][ ]+", ""); + var bearer = authenticationHeader.replaceAll("^[Bb][Ee][Aa][Rr][Ee][Rr][ ]+", ""); try { return Optional.of(JWTParser.parse(bearer)); } catch (ParseException pe) { - LOG.debug("Invalid JWT token", pe); + log.debug("Invalid JWT token", pe); return Optional.empty(); } } @@ -43,7 +43,7 @@ public static Optional parseAuthenticationToJWT(String authenticationHeader public static BalpJwtDataSet parseJwtToBalpDataSet(JWT jwt, BalpJwtClaimsExtractor claimsExtractor, BalpJwtExtractorProperties balpJwtExtractorProperties) { - BalpJwtDataSet balpJwtDataSet = new BalpJwtDataSet(); + var balpJwtDataSet = new BalpJwtDataSet(); claimsExtractor.extractIssuer(jwt, balpJwtExtractorProperties).ifPresent(balpJwtDataSet::setIssuer); claimsExtractor.extractId(jwt, balpJwtExtractorProperties).ifPresent(balpJwtDataSet::setJwtId); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/events/BalpJwtUtils.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/events/BalpJwtUtils.java index 740f2833a3..e68729968f 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/events/BalpJwtUtils.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/events/BalpJwtUtils.java @@ -23,11 +23,9 @@ import org.openehealth.ipf.commons.audit.types.ActiveParticipantRoleId; import org.openehealth.ipf.commons.audit.types.CodedValueType; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirAuditDataset; -import org.openehealth.ipf.commons.ihe.fhir.audit.auth.BalpJwtDataSet; import org.openehealth.ipf.commons.ihe.fhir.audit.auth.BalpJwtParser; import java.util.Collections; -import java.util.Optional; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.openehealth.ipf.commons.ihe.fhir.audit.codes.Constants.DCM_SYSTEM_NAME; @@ -43,9 +41,9 @@ public class BalpJwtUtils { public static > void addJwtParticipant(D delegate, FhirAuditDataset auditDataset, AuditContext auditContext) { - BalpJwtExtractorProperties balpJwtExtractorProperties = (auditContext instanceof BalpAuditContext)? + var balpJwtExtractorProperties = (auditContext instanceof BalpAuditContext)? ((BalpAuditContext)auditContext).getBalpJwtExtractorProperties() : DEFAULT_BALP_JWT_EXTRACTOR_PROPERTIES; - Optional balpDataSet = BalpJwtParser.parseAuthorizationToBalpDataSet( + var balpDataSet = BalpJwtParser.parseAuthorizationToBalpDataSet( auditDataset.getAuthorization(), balpJwtExtractorProperties); balpDataSet.ifPresent(dataSet -> { if (isNotBlank(dataSet.getIheBppcPatientId())) { @@ -56,7 +54,7 @@ public static > void addJwtParticipant(D de null); } if (isNotBlank(dataSet.getIheIuaSubjectOrganizationId())) { - ActiveParticipantType ap = new ActiveParticipantType(dataSet.getIheIuaSubjectOrganizationId(), true); + var ap = new ActiveParticipantType(dataSet.getIheIuaSubjectOrganizationId(), true); ap.setUserName(dataSet.getIheIuaSubjectOrganization()); ap.getRoleIDCodes().add( ActiveParticipantRoleId.of(CodedValueType.of(dataSet.getIheIuaSubjectOrganizationId(), @@ -64,7 +62,7 @@ public static > void addJwtParticipant(D de delegate.addActiveParticipant(ap); } if (isNotBlank(dataSet.getJwtId())) { - ActiveParticipantType ap = new ActiveParticipantType(dataSet.getSubject(), true); + var ap = new ActiveParticipantType(dataSet.getSubject(), true); ap.getRoleIDCodes().add( ActiveParticipantRoleId.of(CodedValueType.of(dataSet.getJwtId(), OUSER_AGENT_TYPE_SYSTEM_NAME, "oAuth Token ID"))); @@ -84,7 +82,7 @@ public static > void addJwtParticipant(D de } delegate.addActiveParticipant(ap); if (isNotBlank(dataSet.getClientId())) { - ActiveParticipantType clientAp = new ActiveParticipantType( + var clientAp = new ActiveParticipantType( dataSet.getClientId(), !auditDataset.isServerSide()); clientAp.getRoleIDCodes().add( ActiveParticipantRoleId.of(CodedValueType.of(dataSet.getClientId(), @@ -92,7 +90,7 @@ public static > void addJwtParticipant(D de delegate.addActiveParticipant(clientAp); } } else if (isNotBlank(dataSet.getOpaqueJwt())) { - ActiveParticipantType ap = new ActiveParticipantType(dataSet.getSubject(), true); + var ap = new ActiveParticipantType(dataSet.getSubject(), true); ap.getRoleIDCodes().add( ActiveParticipantRoleId.of(CodedValueType.of(dataSet.getOpaqueJwt(), OUSER_AGENT_TYPE_OPAQUE_SYSTEM_NAME, "oAuth Opaque Token"))); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSAuditRecordSender.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSAuditRecordSender.java index 91318a6c59..7cca0fcc1a 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSAuditRecordSender.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSAuditRecordSender.java @@ -16,7 +16,6 @@ package org.openehealth.ipf.commons.ihe.fhir.audit.protocol; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.client.api.IRestfulClientFactory; import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum; @@ -43,7 +42,7 @@ public abstract class AbstractFhirRestTLSAuditRecordSender implements AuditTrans private static final String BASE_URL_FORMAT = "https://%s:%s/%s"; private FhirContext context; private TlsParameters tlsParameters; - private static final Logger LOG = LoggerFactory.getLogger(AbstractFhirRestTLSAuditRecordSender.class); + private static final Logger log = LoggerFactory.getLogger(AbstractFhirRestTLSAuditRecordSender.class); public AbstractFhirRestTLSAuditRecordSender(final FhirContext context, String baseUrl) { this.context = Objects.requireNonNull(context, "FhirContext must not be null"); @@ -73,19 +72,19 @@ public void send(AuditContext auditContext, var clientFactory = new TlsParametersAwareRestfulClientFactory( this.context, this.tlsParameters); - String baseUrl = String.format(BASE_URL_FORMAT, + var baseUrl = String.format(BASE_URL_FORMAT, auditContext.getAuditRepositoryHostName(), auditContext.getAuditRepositoryPort(), (auditContext instanceof BalpAuditContext balpAuditContext)? balpAuditContext.getAuditRepositoryContextPath() : ""); createClient(clientFactory.getRestfulClientFactory(), baseUrl); } - MethodOutcome outcome = client + var outcome = client .create() .resource(auditEvent) .execute(); - LOG.debug("Audit Repository Response: {}", outcome.getResponseStatusCode()); + log.debug("Audit Repository Response: {}", outcome.getResponseStatusCode()); } private synchronized void createClient(IRestfulClientFactory restfulClientFactory, String baseUrl) { @@ -109,7 +108,7 @@ public TlsParametersAwareRestfulClientFactory(FhirContext fhirContext, TlsParame } private RestfulClientFactory createRestfulFactory(TlsParameters tlsParameters) { - SslAwareAbstractRestfulClientFactory factory = createSslAwareClientFactory(fhirContext); + var factory = createSslAwareClientFactory(fhirContext); factory.setServerValidationMode(ServerValidationModeEnum.NEVER); factory.initializeSecurityInformation(true, tlsParameters.getSSLContext(false), null, "", ""); diff --git a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/translation/InvalidUriSyntaxException.java b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/translation/InvalidUriSyntaxException.java index 3ef1ce8347..8fe0bdc1ef 100644 --- a/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/translation/InvalidUriSyntaxException.java +++ b/commons/ihe/fhir/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/translation/InvalidUriSyntaxException.java @@ -20,7 +20,6 @@ * */ public class InvalidUriSyntaxException extends FhirTranslationException { - private static final long serialVersionUID = 1336184411958893119L; public InvalidUriSyntaxException(String uri, Throwable cause) { super("URI " + uri + " has invalid syntax", cause); diff --git a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractorTest.java b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractorTest.java index dfd0bd7ff6..5cad1128b4 100644 --- a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractorTest.java +++ b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/auth/BalpJwtClaimsExtractorTest.java @@ -19,7 +19,7 @@ public class BalpJwtClaimsExtractorTest { private final BalpJwtGenerator balpJwtGenerator = new BalpJwtGenerator(); @Test - void testExtractor() throws Exception { + void testExtractor() { String generatedJwt = balpJwtGenerator.next(); JWT jwt = parseJWT(generatedJwt); @@ -72,37 +72,38 @@ private JWT parseJWT(String jwt) { } } - private static final String jwtAsString = "{\n" + - " \"aud\": \"master-realm\",\n" + - " \"sub\": \"f7fc9091-7b8a-42e0-a829-6c4ba22d38b2\",\n" + - " \"extensions\": {\n" + - " \"ihe_iua\": {\n" + - " \"subject_organization_id\": \"urn:oid:1.2.3.19161\",\n" + - " \"home_community_id\": \"urn:oid:1.2.3.43740\",\n" + - " \"national_provider_identifier\": \"urn:oid:1.2.3.48200\",\n" + - " \"subject_role\": [\n" + - " \"my-role-1\",\n" + - " \"my-role-2\"\n" + - " ],\n" + - " \"purpose_of_use\": [\n" + - " \"1.0.14265.1\",\n" + - " \"1.0.14265.2\"\n" + - " ],\n" + - " \"subject_name\": \"Dr. John Smith\",\n" + - " \"subject_organization\": \"Central Hospital\",\n" + - " \"person_id\": \"ABC9586\"\n" + - " },\n" + - " \"ihe_bppc\": {\n" + - " \"patient_id\": \"31494^^^&1.2.840.113619.6.197&ISO\",\n" + - " \"doc_id\": \"urn:oid:1.2.3.29380\",\n" + - " \"acp\": \"urn:oid:1.2.3.32574\"\n" + - " }\n" + - " },\n" + - " \"nbf\": 1706531233,\n" + - " \"iss\": \"https://localhost:8443/auth/realms/master\",\n" + - " \"typ\": \"Bearer\",\n" + - " \"exp\": 1706531353,\n" + - " \"jti\": \"e2093a98-9dcd-4947-b5cb-ee5b47c089c5\",\n" + - " \"client_id\": \"pbrBkyXksp\"\n" + - "}"; + private static final String jwtAsString = """ + { + "aud": "master-realm", + "sub": "f7fc9091-7b8a-42e0-a829-6c4ba22d38b2", + "extensions": { + "ihe_iua": { + "subject_organization_id": "urn:oid:1.2.3.19161", + "home_community_id": "urn:oid:1.2.3.43740", + "national_provider_identifier": "urn:oid:1.2.3.48200", + "subject_role": [ + "my-role-1", + "my-role-2" + ], + "purpose_of_use": [ + "1.0.14265.1", + "1.0.14265.2" + ], + "subject_name": "Dr. John Smith", + "subject_organization": "Central Hospital", + "person_id": "ABC9586" + }, + "ihe_bppc": { + "patient_id": "31494^^^&1.2.840.113619.6.197&ISO", + "doc_id": "urn:oid:1.2.3.29380", + "acp": "urn:oid:1.2.3.32574" + } + }, + "nbf": 1706531233, + "iss": "https://localhost:8443/auth/realms/master", + "typ": "Bearer", + "exp": 1706531353, + "jti": "e2093a98-9dcd-4947-b5cb-ee5b47c089c5", + "client_id": "pbrBkyXksp" + }"""; } diff --git a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSSenderIntegrationTest.java b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSSenderIntegrationTest.java index 93c9eab3f8..42a6da4c1a 100644 --- a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSSenderIntegrationTest.java +++ b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/protocol/AbstractFhirRestTLSSenderIntegrationTest.java @@ -25,7 +25,7 @@ public abstract class AbstractFhirRestTLSSenderIntegrationTest { protected DefaultBalpAuditContext auditContext; - private static final Logger LOG = LoggerFactory.getLogger(AbstractFhirRestTLSSenderIntegrationTest.class); + private static final Logger log = LoggerFactory.getLogger(AbstractFhirRestTLSSenderIntegrationTest.class); @BeforeEach public void setup() { @@ -55,9 +55,9 @@ TlsParameters setupDefaultTlsParameter() { @AfterEach public void tearDown() { - LOG.info("FhirAuditRepository size: " + FhirAuditRepository.getAuditEvents().size() + ". Cleanup...."); + log.info("FhirAuditRepository size: {}. Cleanup....", FhirAuditRepository.getAuditEvents().size()); FhirAuditRepository.clearAuditEvents(); - LOG.info("FhirAuditRepository size: " + FhirAuditRepository.getAuditEvents().size()); + log.info("FhirAuditRepository size: {}", FhirAuditRepository.getAuditEvents().size()); } @Test @@ -74,7 +74,7 @@ public void testTwoWayTLSFlooding() { } void sendAudit(String userName) { - LOG.debug("Sending audit record"); + log.debug("Sending audit record"); auditContext.audit( new ApplicationActivityBuilder.ApplicationStop(EventOutcomeIndicator.Success) .setAuditSource(auditContext) diff --git a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/queue/FhirDelegateMockedMessageQueue.java b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/queue/FhirDelegateMockedMessageQueue.java index 83bc681872..5c551845c3 100644 --- a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/queue/FhirDelegateMockedMessageQueue.java +++ b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/queue/FhirDelegateMockedMessageQueue.java @@ -5,7 +5,6 @@ import org.openehealth.ipf.commons.audit.queue.AbstractMockedAuditMessageQueue; import org.openehealth.ipf.commons.audit.queue.AsynchronousAuditMessageQueue; import org.openehealth.ipf.commons.audit.queue.AuditMessageQueue; -import org.openehealth.ipf.commons.audit.queue.SynchronousAuditMessageQueue; import java.util.List; diff --git a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/server/TLSBalpRepository.java b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/server/TLSBalpRepository.java index a2f5720d9c..38eaf9228b 100644 --- a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/server/TLSBalpRepository.java +++ b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/audit/server/TLSBalpRepository.java @@ -31,13 +31,12 @@ import org.slf4j.LoggerFactory; import java.io.Closeable; -import java.io.IOException; import static io.undertow.servlet.Servlets.*; public class TLSBalpRepository implements Closeable { - private static final Logger LOG = LoggerFactory.getLogger(TLSBalpRepository.class); + private static final Logger log = LoggerFactory.getLogger(TLSBalpRepository.class); protected final TlsParameters tlsParameters; private Undertow server; private final int httpsPort; @@ -53,13 +52,13 @@ public TLSBalpRepository(int httpsPort) { } @Override - public void close() throws IOException { + public void close() { stop(); } public void stop() { if (server != null) server.stop(); - LOG.info("successfully stopped FHIR Audit Server"); + log.info("successfully stopped FHIR Audit Server"); } public Undertow start() throws ServletException { @@ -85,7 +84,7 @@ public Undertow start() throws ServletException { .setHandler(path) .build(); server.start(); - LOG.info("successfully started FHIR Audit Server on port {}", httpsPort); + log.info("successfully started FHIR Audit Server on port {}", httpsPort); return server; } static class FhirServletInitiator implements InstanceFactory { diff --git a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/extension/FhirAuditRepository.java b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/extension/FhirAuditRepository.java index 23e419bc45..4b41998196 100644 --- a/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/extension/FhirAuditRepository.java +++ b/commons/ihe/fhir/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/extension/FhirAuditRepository.java @@ -3,10 +3,6 @@ import io.undertow.Handlers; import io.undertow.Undertow; import io.undertow.UndertowOptions; -import io.undertow.server.HttpHandler; -import io.undertow.server.handlers.PathHandler; -import io.undertow.servlet.api.DeploymentInfo; -import io.undertow.servlet.api.DeploymentManager; import io.undertow.servlet.api.InstanceFactory; import io.undertow.servlet.api.InstanceHandle; import net.java.quickcheck.generator.PrimitiveGenerators; diff --git a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java index a89994e44a..b80fc6899f 100644 --- a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java +++ b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java @@ -38,6 +38,7 @@ public enum Interactions implements FhirInteractionId fhirTransactionConfiguration; } diff --git a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81AuditStrategy.java b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81AuditStrategy.java index ea34050148..1d71b398ec 100644 --- a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81AuditStrategy.java +++ b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81AuditStrategy.java @@ -46,8 +46,7 @@ public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirAuditEvent @Override public boolean enrichAuditDatasetFromResponse(FhirAuditEventQueryAuditDataset auditDataset, Object response, AuditContext auditContext) { - if (response instanceof Bundle) { - var bundle = (Bundle) response; + if (response instanceof Bundle bundle) { bundle.getEntry().stream() .filter(bundleEntryComponent -> bundleEntryComponent.getResource() instanceof AuditEvent) .map(Bundle.BundleEntryComponent::getFullUrl) diff --git a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java index d2f2278e9e..a7c1e5d7ab 100644 --- a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java +++ b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java @@ -28,7 +28,7 @@ * @author Christian Ohr * @since 3.6 */ -public class Iti81ClientRequestFactory extends QueryClientRequestFactory { +public class Iti81ClientRequestFactory extends QueryClientRequestFactory { public Iti81ClientRequestFactory() { super(AuditEvent.class, Bundle.class); diff --git a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81SearchParameters.java b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81SearchParameters.java index c6f4c295d5..0a2650faf2 100644 --- a/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81SearchParameters.java +++ b/commons/ihe/fhir/r4/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81SearchParameters.java @@ -37,8 +37,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @since 3.6 @@ -83,11 +82,17 @@ public Optional> comparatorFor(String paramName) { } private static final Comparator CP_DATE = nullsLast(comparing(AuditEvent::getRecorded)); - private static final Comparator CP_ADDRESS = nullsLast(comparing(auditEvent -> { - if (!auditEvent.hasAgent()) return null; - var agent = auditEvent.getAgentFirstRep(); - if (!agent.hasNetwork()) return null; - return agent.getNetwork().getAddressElement().getValueNotNull(); - })); + private static final Comparator CP_ADDRESS = comparing( + Iti81SearchParameters::getNetworkAddress, nullsLast(naturalOrder())); + + private static String getNetworkAddress(AuditEvent auditEvent) { + if (auditEvent.hasAgent()) { + var agent = auditEvent.getAgentFirstRep(); + if (agent.hasNetwork()) { + return agent.getNetwork().getAddressElement().getValueNotNull(); + } + } + return null; + } } diff --git a/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/FhirToXacmlTranslator.groovy b/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/FhirToXacmlTranslator.groovy index 9d8101c85f..5b083f51e7 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/FhirToXacmlTranslator.groovy +++ b/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/FhirToXacmlTranslator.groovy @@ -134,7 +134,7 @@ class FhirToXacmlTranslator { * @return PPQ-2 request POJO */ XACMLPolicyQueryType translatePpq5To2Request(String httpQuery) { - List params = URLEncodedUtils.parse(httpQuery, StandardCharsets.UTF_8); + List params = URLEncodedUtils.parse(httpQuery, StandardCharsets.UTF_8) def policySetId = params.find { it.name == Consent.SP_IDENTIFIER }?.value if (policySetId) { return ppqMessageCreator.createPolicyQuery([policySetId]) diff --git a/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/XacmlToFhirTranslator.groovy b/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/XacmlToFhirTranslator.groovy index af80ea304e..fa9d30524d 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/XacmlToFhirTranslator.groovy +++ b/commons/ihe/fhir/r4/chppqm/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/chppqm/translation/XacmlToFhirTranslator.groovy @@ -219,7 +219,7 @@ class XacmlToFhirTranslator { * Rethrows a UnknownPolicySetIdFault as a FHIR exception. */ static void translateUnknownPolicySetIdFault(UnknownPolicySetIdFaultMessage fault) { - throw new ResourceNotFoundException("Unknown policy set " + fault.getFaultInfo().getMessage()); + throw new ResourceNotFoundException("Unknown policy set " + fault.getFaultInfo().getMessage()) } /** diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmConsentCreator.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmConsentCreator.java index 20c09ac1f5..574410f40f 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmConsentCreator.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmConsentCreator.java @@ -45,7 +45,7 @@ private static Consent createConsent( Date endDate, List purposesOfUse) { - Consent consent = new Consent() + var consent = new Consent() .addIdentifier(new Identifier() .setType(new CodeableConcept(new Coding() .setSystem(ChPpqmUtils.CodingSystems.CONSENT_IDENTIFIER_TYPE) diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmUtils.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmUtils.java index 208a5a97ea..b49ef4f4cd 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmUtils.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/ChPpqmUtils.java @@ -18,12 +18,9 @@ import ca.uhn.fhir.context.FhirContext; import lombok.experimental.UtilityClass; -import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Coding; import org.hl7.fhir.r4.model.Consent; -import org.hl7.fhir.r4.model.Identifier; import org.openehealth.ipf.commons.ihe.fhir.IgBasedFhirContextSupplier; import java.io.IOException; @@ -33,7 +30,6 @@ /** * @author Dmytro Rud - * @since */ @UtilityClass public class ChPpqmUtils { @@ -73,18 +69,18 @@ public static class Profiles { } public static class CodingSystems { - public static String CONSENT_IDENTIFIER_TYPE = "http://fhir.ch/ig/ch-epr-fhir/CodeSystem/PpqmConsentIdentifierType"; - public static String GLN = "urn:oid:2.51.1.3"; + public static final String CONSENT_IDENTIFIER_TYPE = "http://fhir.ch/ig/ch-epr-fhir/CodeSystem/PpqmConsentIdentifierType"; + public static final String GLN = "urn:oid:2.51.1.3"; } public static class ConsentIdTypes { - public static String POLICY_SET_ID = "policySetId"; - public static String TEMPLATE_ID = "templateId"; + public static final String POLICY_SET_ID = "policySetId"; + public static final String TEMPLATE_ID = "templateId"; } public static String extractConsentId(Consent consent, String idType) { - for (Identifier identifier : consent.getIdentifier()) { - for (Coding coding : identifier.getType().getCoding()) { + for (var identifier : consent.getIdentifier()) { + for (var coding : identifier.getType().getCoding()) { if (ChPpqmUtils.CodingSystems.CONSENT_IDENTIFIER_TYPE.equalsIgnoreCase(coding.getSystem()) && idType.equals(coding.getCode())) { @@ -102,8 +98,8 @@ public static String extractConsentIdFromUrl(String url) { if (url.contains("#")) { url = url.substring(0, url.indexOf('#')); } - List params = URLEncodedUtils.parse(url, StandardCharsets.UTF_8); - for (NameValuePair param : params) { + var params = URLEncodedUtils.parse(url, StandardCharsets.UTF_8); + for (var param : params) { if (Consent.SP_IDENTIFIER.equals(param.getName())) { return param.getValue(); } @@ -131,12 +127,12 @@ public static String createUrl(String consentId) { } public static Bundle createPpq4SubmitRequestBundle(Collection consents, Bundle.HTTPVerb httpMethod) { - Bundle bundle = new Bundle(); + var bundle = new Bundle(); bundle.setId(UUID.randomUUID().toString()); bundle.setType(Bundle.BundleType.TRANSACTION); bundle.getMeta().addProfile(Profiles.FEED_REQUEST_BUNDLE); - for (Consent consent : consents) { - Bundle.BundleEntryComponent entry = new Bundle.BundleEntryComponent(); + for (var consent : consents) { + var entry = new Bundle.BundleEntryComponent(); entry.getRequest().setMethod(httpMethod); entry.setResource(consent); switch (httpMethod) { @@ -156,12 +152,12 @@ public static Bundle createPpq4SubmitRequestBundle(Collection consents, } public static Bundle createPpq4DeleteRequestBundle(Collection consentIds) { - Bundle bundle = new Bundle(); + var bundle = new Bundle(); bundle.setId(UUID.randomUUID().toString()); bundle.setType(Bundle.BundleType.TRANSACTION); bundle.getMeta().addProfile(Profiles.FEED_REQUEST_BUNDLE); - for (String consentId : consentIds) { - Bundle.BundleEntryComponent entry = new Bundle.BundleEntryComponent(); + for (var consentId : consentIds) { + var entry = new Bundle.BundleEntryComponent(); entry.getRequest().setMethod(Bundle.HTTPVerb.DELETE); entry.getRequest().setUrl(createUrl(consentId)); bundle.getEntry().add(entry); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3AuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3AuditStrategy.java index ce1a949833..40d10e3ecb 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3AuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3AuditStrategy.java @@ -18,7 +18,6 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import lombok.extern.slf4j.Slf4j; import org.hl7.fhir.r4.model.Consent; -import org.hl7.fhir.r4.model.Identifier; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.ihe.fhir.Constants; @@ -43,7 +42,7 @@ public ChPpqmAuditDataset createAuditDataset() { @Override public ChPpqmAuditDataset enrichAuditDatasetFromRequest(ChPpqmAuditDataset auditDataset, Object request, Map parameters) { super.enrichAuditDatasetFromRequest(auditDataset, request, parameters); - String method = (String) parameters.get(Constants.HTTP_METHOD); + var method = (String) parameters.get(Constants.HTTP_METHOD); switch (method) { case "POST": auditDataset.setAction(EventActionCode.Create); @@ -65,15 +64,15 @@ public ChPpqmAuditDataset enrichAuditDatasetFromRequest(ChPpqmAuditDataset audit } private static void enrichAuditDatasetFromConsent(ChPpqmAuditDataset auditDataset, Object resource) { - Consent consent = (Consent) resource; + var consent = (Consent) resource; auditDataset.getPolicyAndPolicySetIds().add(ChPpqmUtils.extractConsentId(consent, ChPpqmUtils.ConsentIdTypes.POLICY_SET_ID)); - Identifier pid = consent.getPatient().getIdentifier(); + var pid = consent.getPatient().getIdentifier(); auditDataset.getPatientIds().add(String.format("%s^^^&%s&ISO", pid.getValue(), pid.getSystem().substring(8))); } @Override public boolean enrichAuditDatasetFromResponse(ChPpqmAuditDataset auditDataset, Object response, AuditContext auditContext) { - MethodOutcome methodOutcome = (MethodOutcome) response; + var methodOutcome = (MethodOutcome) response; if ((auditDataset.getAction() == EventActionCode.Update) && Boolean.TRUE.equals(methodOutcome.getCreated())) { auditDataset.setAction(EventActionCode.Create); } diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ClientAuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ClientAuditStrategy.java index 03a1143e60..3d365077c8 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ClientAuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ClientAuditStrategy.java @@ -19,7 +19,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.types.ParticipantObjectIdType; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.chppqm.ChPpqmAuditDataset; import static org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode.MobilePrivacyPolicyFeed; @@ -32,7 +32,7 @@ public ChPpq3ClientAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, ChPpqmAuditDataset auditDataset) { - return new PHIExportBuilder<>(auditContext, auditDataset, MobilePrivacyPolicyFeed) + return new DefaultPHIExportBuilder(auditContext, auditDataset, MobilePrivacyPolicyFeed) .setPatient(auditDataset.getPatientId()) .addSecurityResourceParticipantObjects(ParticipantObjectIdType.of(MobilePrivacyPolicyFeed), auditDataset.getPolicyAndPolicySetIds()) .getMessages(); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3RequestFactory.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3RequestFactory.java index 14c96e8dad..c6b98a2271 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3RequestFactory.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3RequestFactory.java @@ -33,24 +33,22 @@ public IClientExecutable getClientExecutable( Object requestData, Map parameters) { - String method = (String) parameters.get(Constants.HTTP_METHOD); - switch (method) { - case "POST": - return client.create().resource((Consent) requestData); - case "PUT": - Consent consent = (Consent) requestData; - String consentId = ChPpqmUtils.extractConsentId(consent, ChPpqmUtils.ConsentIdTypes.POLICY_SET_ID); - return client.update() - .resource(consent) - .conditional() - .where(Consent.IDENTIFIER.exactly().identifier(consentId)); - case "DELETE": - return client.delete() - .resourceConditionalByType(Consent.class) - .where(Consent.IDENTIFIER.exactly().identifier((String) requestData)); - default: - throw new RuntimeException("Unknown method: " + method); - } + var method = (String) parameters.get(Constants.HTTP_METHOD); + return switch (method) { + case "POST" -> client.create().resource((Consent) requestData); + case "PUT" -> { + var consent = (Consent) requestData; + var consentId = ChPpqmUtils.extractConsentId(consent, ChPpqmUtils.ConsentIdTypes.POLICY_SET_ID); + yield client.update() + .resource(consent) + .conditional() + .where(Consent.IDENTIFIER.exactly().identifier(consentId)); + } + case "DELETE" -> client.delete() + .resourceConditionalByType(Consent.class) + .where(Consent.IDENTIFIER.exactly().identifier((String) requestData)); + default -> throw new RuntimeException("Unknown method: " + method); + }; } } diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ResourceProvider.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ResourceProvider.java index 9f1d33020f..780085accd 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ResourceProvider.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ResourceProvider.java @@ -67,7 +67,7 @@ public MethodOutcome deleteConsent( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - String consentId = ChPpqmUtils.extractConsentIdFromUrl(condition); + var consentId = ChPpqmUtils.extractConsentIdFromUrl(condition); return requestAction(consentId, null, httpServletRequest, httpServletResponse, requestDetails); } diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ServerAuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ServerAuditStrategy.java index a433622821..146531afc2 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ServerAuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3ServerAuditStrategy.java @@ -19,7 +19,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.types.ParticipantObjectIdType; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIImportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIImportBuilder; import org.openehealth.ipf.commons.ihe.fhir.chppqm.ChPpqmAuditDataset; import static org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode.MobilePrivacyPolicyFeed; @@ -32,7 +32,7 @@ public ChPpq3ServerAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, ChPpqmAuditDataset auditDataset) { - return new PHIImportBuilder<>(auditContext, auditDataset, MobilePrivacyPolicyFeed) + return new DefaultPHIImportBuilder(auditContext, auditDataset, MobilePrivacyPolicyFeed) .setPatient(auditDataset.getPatientId()) .addSecurityResourceParticipantObjects(ParticipantObjectIdType.of(MobilePrivacyPolicyFeed), auditDataset.getPolicyAndPolicySetIds()) .getMessages(); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3Validator.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3Validator.java index 5cf3ff44b8..ad02759726 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3Validator.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq3/ChPpq3Validator.java @@ -38,14 +38,14 @@ public void validateRequest(Object payload, Map parameters) { } private OperationOutcome doValidateRequest(Object payload, Map parameters) { - String method = parameters.get(Constants.HTTP_METHOD).toString(); + var method = parameters.get(Constants.HTTP_METHOD).toString(); switch (method) { case "POST": case "PUT": return validateProfileConformance((Resource) payload, ChPpqmUtils.TEMPLATE_PROFILE_URIS); case "DELETE": - String resourceId = (String) payload; + var resourceId = (String) payload; if (StringUtils.isBlank(resourceId)) { return new OperationOutcome() .addIssue(new OperationOutcome.OperationOutcomeIssueComponent() diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4AuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4AuditStrategy.java index 80f0b02df6..cb2864b65a 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4AuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4AuditStrategy.java @@ -43,9 +43,9 @@ public ChPpqmAuditDataset createAuditDataset() { @Override public ChPpqmAuditDataset enrichAuditDatasetFromRequest(ChPpqmAuditDataset auditDataset, Object request, Map parameters) { super.enrichAuditDatasetFromRequest(auditDataset, request, parameters); - Bundle bundle = (Bundle) request; + var bundle = (Bundle) request; if (!bundle.getEntry().isEmpty()) { - Bundle.HTTPVerb method = bundle.getEntry().get(0).getRequest().getMethod(); + var method = bundle.getEntry().get(0).getRequest().getMethod(); switch (method) { case POST: auditDataset.setAction(EventActionCode.Create); @@ -67,8 +67,8 @@ public ChPpqmAuditDataset enrichAuditDatasetFromRequest(ChPpqmAuditDataset audit } private static void extractConsentIdsFromEntryResources(ChPpqmAuditDataset auditDataset, Bundle bundle) { - for (Bundle.BundleEntryComponent entry : bundle.getEntry()) { - Consent consent = (Consent) entry.getResource(); + for (var entry : bundle.getEntry()) { + var consent = (Consent) entry.getResource(); auditDataset.getPolicyAndPolicySetIds().add(ChPpqmUtils.extractConsentId(consent, ChPpqmUtils.ConsentIdTypes.POLICY_SET_ID)); } } @@ -76,10 +76,9 @@ private static void extractConsentIdsFromEntryResources(ChPpqmAuditDataset audit @Override public boolean enrichAuditDatasetFromResponse(ChPpqmAuditDataset auditDataset, Object response, AuditContext auditContext) { if (super.enrichAuditDatasetFromResponse(auditDataset, response, auditContext)) { - if (response instanceof Bundle) { - Bundle bundle = (Bundle) response; - for (Bundle.BundleEntryComponent entry : bundle.getEntry()) { - String status = entry.getResponse().getStatus(); + if (response instanceof Bundle bundle) { + for (var entry : bundle.getEntry()) { + var status = entry.getResponse().getStatus(); if ((status != null) && status.startsWith("2")) { if ((auditDataset.getAction() == EventActionCode.Update) && status.startsWith("201")) { auditDataset.setAction(EventActionCode.Create); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ClientAuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ClientAuditStrategy.java index e73d17bb3a..c2fc831feb 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ClientAuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ClientAuditStrategy.java @@ -19,7 +19,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.types.ParticipantObjectIdType; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.chppqm.ChPpqmAuditDataset; import static org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode.MobilePrivacyPolicyBundleFeed; @@ -32,7 +32,7 @@ public ChPpq4ClientAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, ChPpqmAuditDataset auditDataset) { - return new PHIExportBuilder<>(auditContext, auditDataset, MobilePrivacyPolicyBundleFeed) + return new DefaultPHIExportBuilder(auditContext, auditDataset, MobilePrivacyPolicyBundleFeed) .setPatient(auditDataset.getPatientId()) .addSecurityResourceParticipantObjects(ParticipantObjectIdType.of(MobilePrivacyPolicyBundleFeed), auditDataset.getPolicyAndPolicySetIds()) .getMessages(); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ServerAuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ServerAuditStrategy.java index 6b5c3ca1ab..9d08d5c575 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ServerAuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4ServerAuditStrategy.java @@ -19,7 +19,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.types.ParticipantObjectIdType; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIImportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIImportBuilder; import org.openehealth.ipf.commons.ihe.fhir.chppqm.ChPpqmAuditDataset; import static org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode.MobilePrivacyPolicyBundleFeed; @@ -32,7 +32,7 @@ public ChPpq4ServerAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, ChPpqmAuditDataset auditDataset) { - return new PHIImportBuilder<>(auditContext, auditDataset, MobilePrivacyPolicyBundleFeed) + return new DefaultPHIImportBuilder(auditContext, auditDataset, MobilePrivacyPolicyBundleFeed) .setPatient(auditDataset.getPatientId()) .addSecurityResourceParticipantObjects(ParticipantObjectIdType.of(MobilePrivacyPolicyBundleFeed), auditDataset.getPolicyAndPolicySetIds()) .getMessages(); diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4Validator.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4Validator.java index 04b72bfe6b..50765cb61d 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4Validator.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq4/ChPpq4Validator.java @@ -38,8 +38,8 @@ public void validateRequest(Object payload, Map parameters) { @Override public void validateResponse(Object payload, Map parameters) { - Bundle bundle = (Bundle) payload; - OperationOutcome outcome = validateProfileConformance(bundle, "http://hl7.org/fhir/StructureDefinition/Bundle"); + var bundle = (Bundle) payload; + var outcome = validateProfileConformance(bundle, "http://hl7.org/fhir/StructureDefinition/Bundle"); if (bundle.getType() != Bundle.BundleType.TRANSACTIONRESPONSE) { outcome.addIssue(new OperationOutcome.OperationOutcomeIssueComponent() .setSeverity(OperationOutcome.IssueSeverity.ERROR) diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5AuditStrategy.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5AuditStrategy.java index 3de5e2292f..1068cf1ec5 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5AuditStrategy.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5AuditStrategy.java @@ -19,7 +19,7 @@ import lombok.extern.slf4j.Slf4j; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; @@ -35,7 +35,7 @@ public ChPpq5AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder(auditContext, auditDataset, MobilePrivacyPolicyRetrieve) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, MobilePrivacyPolicyRetrieve) .addPatients(auditDataset.getPatientIds()) .setQueryParameters("MobilePrivacyPolicyQuery", MobilePrivacyPolicyQuery, diff --git a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5ResourceProvider.java b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5ResourceProvider.java index 90806f1918..9bc892c6d1 100644 --- a/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5ResourceProvider.java +++ b/commons/ihe/fhir/r4/chppqm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/chppqm/chppq5/ChPpq5ResourceProvider.java @@ -38,7 +38,7 @@ public IBundleProvider searchConsents( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - ChPpq5SearchParameters searchParameters = new ChPpq5SearchParameters(getFhirContext(), patientId, consentId); + var searchParameters = new ChPpq5SearchParameters(getFhirContext(), patientId, consentId); return requestBundleProvider(null, searchParameters, ResourceType.Consent.name(), httpServletRequest, httpServletResponse, requestDetails); } diff --git a/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java b/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java index b30881ede8..422e688433 100644 --- a/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java +++ b/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java @@ -42,7 +42,7 @@ public class AbstractNamingSystemServiceImpl implements NamingSystemService { public void addNamingSystems(Bundle bundle) { this.namingSystems.merge(bundle.getIdElement().getIdPart(), setOfNamingSystems(bundle), (set1, set2) -> { - var result = new HashSet(set1); + var result = new HashSet<>(set1); result.addAll(set2); return result; }); diff --git a/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/IgBasedInstanceValidator.java b/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/IgBasedInstanceValidator.java index e35452448f..6023b7e633 100644 --- a/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/IgBasedInstanceValidator.java +++ b/commons/ihe/fhir/r4/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/IgBasedInstanceValidator.java @@ -18,11 +18,8 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; -import ca.uhn.fhir.validation.FhirValidator; -import ca.uhn.fhir.validation.ValidationResult; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; -import org.hl7.fhir.r4.model.CanonicalType; import org.hl7.fhir.r4.model.OperationOutcome; import org.hl7.fhir.r4.model.Resource; import org.openehealth.ipf.commons.ihe.fhir.FhirTransactionValidator; @@ -49,9 +46,9 @@ protected IgBasedInstanceValidator(FhirContext fhirContext) { * @return {@link OperationOutcome} containing or not containing validation errors (never null). */ protected OperationOutcome validateProfileConformance(Resource resource, Set allowedProfileUris) { - String profileUri = allowedProfileUris.iterator().next(); + var profileUri = allowedProfileUris.iterator().next(); if (profileUri.startsWith(STANDARD_PREFIX)) { - String expectedResourceType = profileUri.substring(STANDARD_PREFIX.length()); + var expectedResourceType = profileUri.substring(STANDARD_PREFIX.length()); if (resource.fhirType().equals(expectedResourceType)) { return doValidate(resource); } else { @@ -62,7 +59,7 @@ protected OperationOutcome validateProfileConformance(Resource resource, Set oAuthEventAgent = oAuthActiveParticipantToAgent(ap); + var oAuthEventAgent = oAuthActiveParticipantToAgent(ap); return oAuthEventAgent.orElseGet(() -> new AuditEvent.AuditEventAgentComponent() .setType(ap.getRoleIDCodes().isEmpty() ? null : codedValueTypeToCodeableConcept(ap.getRoleIDCodes().get(0), DCM_SYSTEM_NAME)) .setWho(new Reference().setDisplay(ap.getUserID())) @@ -152,9 +152,9 @@ protected AuditEvent.AuditEventAgentComponent activeParticipantToAgent(ActivePar } private Optional oAuthActiveParticipantToAgent(ActiveParticipantType ap) { - Optional oUser = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), OUSER_AGENT_TYPE_SYSTEM_NAME); + var oUser = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), OUSER_AGENT_TYPE_SYSTEM_NAME); if (oUser.isPresent()) { - AuditEvent.AuditEventAgentComponent agent = new AuditEvent.AuditEventAgentComponent() + var agent = new AuditEvent.AuditEventAgentComponent() .setType(systemAndCodeToCodeableConcept(OUSER_AGENT_TYPE_SYSTEM_NAME, OUSER_AGENT_TYPE_CODE, "information recipient")) .addPolicy(oUser.get()) .setName(ap.getUserName()) @@ -171,7 +171,7 @@ private Optional oAuthActiveParticipantToAg systemAndCodeToCodeableConcept(OUSER_AGENT_ROLE_SYSTEM_NAME, purpose, ""))); return Optional.of(agent); } - Optional oClient = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), DCM_SYSTEM_NAME); + var oClient = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), DCM_SYSTEM_NAME); if (oClient.isPresent()) { return Optional.of(new AuditEvent.AuditEventAgentComponent() .setType(systemAndCodeToCodeableConcept(DCM_SYSTEM_NAME, DCM_OCLIENT_CODE, "Application")) @@ -179,7 +179,7 @@ private Optional oAuthActiveParticipantToAg .setWho(new Reference().setIdentifier( new Identifier().setValue(oClient.get())).setDisplay(ap.getUserName()))); } - Optional opaqueToken = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), + var opaqueToken = getOAuthAttrFromKnownRoleIdCode(ap.getRoleIDCodes(), OUSER_AGENT_TYPE_OPAQUE_SYSTEM_NAME); if (opaqueToken.isPresent()) { return Optional.of(new AuditEvent.AuditEventAgentComponent() diff --git a/commons/ihe/fhir/r4/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java b/commons/ihe/fhir/r4/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java index 77f41eea3f..8d837be168 100644 --- a/commons/ihe/fhir/r4/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java +++ b/commons/ihe/fhir/r4/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java @@ -29,42 +29,41 @@ */ public class DefaultUriMapperTest { - private BidiMappingService mappingService; private DefaultUriMapper uriMapper; @BeforeEach public void setup() { - mappingService = new BidiMappingService(); + BidiMappingService mappingService = new BidiMappingService(); mappingService.setMappingScript(getClass().getResource("/mapping.map")); uriMapper = new DefaultUriMapper(mappingService, "uriToOid", "uriToNamespace"); } @Test - public void testTranslateOidUrn() throws Exception { + public void testTranslateOidUrn() { var oid = "1.2.3.4.5.6.7.8.9"; - assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).get()); + assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).orElse(null)); } @Test - public void testTranslateUriToOid() throws Exception { + public void testTranslateUriToOid() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; - assertEquals("1.2.3.4", uriMapper.uriToOid(uri).get()); + assertEquals("1.2.3.4", uriMapper.uriToOid(uri).orElse(null)); } @Test - public void testTranslateUriToOidFails() throws Exception { + public void testTranslateUriToOidFails() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; assertFalse(uriMapper.uriToOid(uri).isPresent()); } @Test - public void testTranslatePinUrn() throws Exception { + public void testTranslatePinUrn() { var namespace = "namespace"; - assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).get()); + assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).orElse(null)); } @Test - public void testTranslateUriToNamespace() throws Exception { + public void testTranslateUriToNamespace() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; assertEquals("fhir1", uriMapper.uriToNamespace(uri).get()); uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; @@ -72,7 +71,7 @@ public void testTranslateUriToNamespace() throws Exception { } @Test - public void testTranslateNamespaceToUri() throws Exception { + public void testTranslateNamespaceToUri() { var namespace = "fhir1"; assertEquals("http://org.openehealth/ipf/commons/ihe/fhir/1", uriMapper.namespaceToUri(namespace)); } diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105RequestFactory.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105RequestFactory.java index 5b6685ca66..b4aeb358a8 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105RequestFactory.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105RequestFactory.java @@ -16,7 +16,6 @@ package org.openehealth.ipf.commons.ihe.fhir.iti105; -import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.gclient.IClientExecutable; import org.hl7.fhir.r4.model.DocumentReference; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java index d99e6360d1..5bb9afab24 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java @@ -51,7 +51,6 @@ import java.util.Optional; import java.util.Scanner; import java.util.function.Function; -import java.util.stream.Collectors; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.*; @@ -65,7 +64,7 @@ */ public class Iti65Validator extends FhirTransactionValidator.Support { - private static final Logger LOG = LoggerFactory.getLogger(Iti65Validator.class); + private static final Logger log = LoggerFactory.getLogger(Iti65Validator.class); private static final String IHE_PROFILE_PREFIX = "http://ihe.net/fhir/StructureDefinition/"; private final FhirContext fhirContext; @@ -73,11 +72,11 @@ public class Iti65Validator extends FhirTransactionValidator.Support { public Iti65Validator(FhirContext fhirContext) { this.fhirContext = fhirContext; - LOG.info("Initializing Validator for ITI-65 bundles"); + log.info("Initializing Validator for ITI-65 bundles"); validationSupportv320 = loadStructureDefinitionsv320(new DefaultProfileValidationSupport(fhirContext), "Minimal"); validationSupportv320 = loadStructureDefinitionsv320(validationSupportv320, "Comprehensive"); validationSupportv320 = new CachingValidationSupport(validationSupportv320); - LOG.info("Initialized Validator for ITI-65 bundles"); + log.info("Initialized Validator for ITI-65 bundles"); } @Override @@ -184,8 +183,7 @@ protected void validateBundleConsistency320(Bundle bundle) { .flatMap(Collection::stream) .map(Bundle.BundleEntryComponent::getResource) .forEach(resource -> { - if (resource instanceof DocumentManifest) { - var dm = (DocumentManifest) resource; + if (resource instanceof DocumentManifest dm) { for (var content : dm.getContent()) { try { expectedReferenceFullUrls.add(content.getReference()); @@ -193,8 +191,7 @@ protected void validateBundleConsistency320(Bundle bundle) { } } patientReferences.add(getSubjectReference(resource, r -> dm.getSubject())); - } else if (resource instanceof DocumentReference) { - var dr = (DocumentReference) resource; + } else if (resource instanceof DocumentReference dr) { for (var content : dr.getContent()) { var url = content.getAttachment().getUrl(); if (!url.startsWith("http")) { @@ -291,7 +288,7 @@ protected void validateBundleConsistency421(Bundle bundle) { .map(Bundle.BundleEntryComponent::getResource) .map(ListResource.class::cast) .filter(this::isListSubmissionSet) - .collect(Collectors.toList()); + .toList(); if (submissionSets.size() != 1) { throw FhirUtils.unprocessableEntity( OperationOutcome.IssueSeverity.ERROR, @@ -317,8 +314,7 @@ protected void validateBundleConsistency421(Bundle bundle) { .flatMap(Collection::stream) .map(Bundle.BundleEntryComponent::getResource) .forEach(resource -> { - if (resource instanceof ListResource) { - var listResource = (ListResource) resource; + if (resource instanceof ListResource listResource) { if (isListSubmissionSet(listResource)) { for (var entry : listResource.getEntry()) { try { @@ -328,8 +324,7 @@ protected void validateBundleConsistency421(Bundle bundle) { } } patientReferences.add(getSubjectReference(resource, r -> listResource.getSubject())); - } else if (resource instanceof DocumentReference) { - var dr = (DocumentReference) resource; + } else if (resource instanceof DocumentReference dr) { for (var content : dr.getContent()) { var url = content.getAttachment().getUrl(); if (!url.startsWith("http")) { diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java index 8e587b9654..ef5e5a9ffb 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java @@ -17,7 +17,6 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66DocumentManifestSearchParameters.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66DocumentManifestSearchParameters.java index 668ef23d74..37ae115ad8 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66DocumentManifestSearchParameters.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66DocumentManifestSearchParameters.java @@ -30,8 +30,7 @@ import java.util.*; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @since 3.6 @@ -92,23 +91,25 @@ public List getPatientIdParam() { } - private static final Comparator CP_CREATED = nullsLast(comparing(DocumentManifest::getCreated)); + private static final Comparator CP_CREATED = comparing( + DocumentManifest::getCreated, nullsLast(naturalOrder())); - private static final Comparator CP_AUTHOR = nullsLast(comparing(documentManifest -> { + private static final Comparator CP_AUTHOR = comparing( + Iti66DocumentManifestSearchParameters::getAuthorName, nullsLast(naturalOrder())); + + private static String getAuthorName(DocumentManifest documentManifest) { if (!documentManifest.hasAuthor()) return null; var author = documentManifest.getAuthorFirstRep(); - if (author.getResource() instanceof PractitionerRole) { - var practitionerRole = (PractitionerRole) author.getResource(); + if (author.getResource() instanceof PractitionerRole practitionerRole) { if (!practitionerRole.hasPractitioner()) return null; author = practitionerRole.getPractitioner(); } if (author.getResource() == null) return null; - if (author.getResource() instanceof Practitioner) { - var practitioner = (Practitioner) author.getResource(); + if (author.getResource() instanceof Practitioner practitioner) { if (!practitioner.hasName()) return null; var name = practitioner.getNameFirstRep(); return name.getFamilyElement().getValueNotNull() + name.getGivenAsSingleString(); } return null; - })); + } } diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66SearchParameters.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66SearchParameters.java index 5b24f728f1..5ea41760f6 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66SearchParameters.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66SearchParameters.java @@ -16,23 +16,10 @@ package org.openehealth.ipf.commons.ihe.fhir.iti66; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.model.api.Include; -import ca.uhn.fhir.rest.api.SortSpec; import ca.uhn.fhir.rest.param.ReferenceAndListParam; -import ca.uhn.fhir.rest.param.ReferenceParam; -import ca.uhn.fhir.rest.param.StringParam; -import ca.uhn.fhir.rest.param.TokenParam; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.SuperBuilder; import org.hl7.fhir.instance.model.api.IBaseResource; -import org.hl7.fhir.r4.model.Practitioner; import org.openehealth.ipf.commons.ihe.fhir.FhirSearchAndSortParameters; -import java.util.Collections; -import java.util.List; -import java.util.Set; - /** * Common SearchParameter base class for ITI-66 transactions * @param diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java index 91ab8a6355..719412d5ea 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java @@ -17,7 +17,6 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ResourceProvider.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ResourceProvider.java index 85135642a2..01228d83f5 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ResourceProvider.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ResourceProvider.java @@ -107,8 +107,8 @@ public IBundleProvider documentReferenceSearch( // Handle "related" parameters - ReferenceOrListParam relatedParam = new ReferenceOrListParam(); - TokenOrListParam relatedIdParam = new TokenOrListParam(); + var relatedParam = new ReferenceOrListParam(); + var relatedIdParam = new TokenOrListParam(); if (relatedRef != null) { relatedParam = relatedRef; } else if (relatedId != null) { diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67SearchParameters.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67SearchParameters.java index 65fbcd9d79..a5cadbca7e 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67SearchParameters.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67SearchParameters.java @@ -42,8 +42,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; import static org.openehealth.ipf.commons.ihe.fhir.iti67.Iti67ResourceProvider.STU3_INDEXED; /** @@ -119,24 +118,26 @@ public Optional> comparatorFor(String paramName) { return Optional.empty(); } - private static final Comparator CP_DATE = nullsLast(comparing(DocumentReference::getDate)); + private static final Comparator CP_DATE = comparing( + DocumentReference::getDate, nullsLast(naturalOrder())); - private static final Comparator CP_AUTHOR = nullsLast(comparing(documentReference -> { + private static final Comparator CP_AUTHOR = comparing( + Iti67SearchParameters::getAuthorName, nullsLast(naturalOrder())); + + private static String getAuthorName(DocumentReference documentReference) { if (!documentReference.hasAuthor()) return null; var author = documentReference.getAuthorFirstRep(); - if (author.getResource() instanceof PractitionerRole) { - var practitionerRole = (PractitionerRole) author.getResource(); + if (author.getResource() instanceof PractitionerRole practitionerRole) { if (!practitionerRole.hasPractitioner()) return null; - author = practitionerRole.getPractitioner(); + author = practitionerRole.getPractitioner(); } if (author.getResource() == null) return null; - if (author.getResource() instanceof Practitioner) { - var practitioner = (Practitioner) author.getResource(); + if (author.getResource() instanceof Practitioner practitioner) { if (!practitioner.hasName()) return null; var name = practitioner.getNameFirstRep(); return name.getFamilyElement().getValueNotNull() + name.getGivenAsSingleString(); } return null; - })); + } } diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67StrictResourceProvider.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67StrictResourceProvider.java index cfef2d0935..01aaef0549 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67StrictResourceProvider.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67StrictResourceProvider.java @@ -88,8 +88,8 @@ public IBundleProvider documentReferenceSearch( .forEach(relatedTokenParam::addOr); } - ReferenceOrListParam relatedParam = new ReferenceOrListParam(); - TokenOrListParam relatedIdParam = new TokenOrListParam(); + var relatedParam = new ReferenceOrListParam(); + var relatedIdParam = new TokenOrListParam(); if (related != null) { related.getValuesAsQueryTokens().stream() .filter(referenceParam -> !DocumentReference.SP_IDENTIFIER.equals(referenceParam.getChain())) diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java index 4bcfe8ce7e..4b2584008c 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java @@ -22,7 +22,6 @@ import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import org.openehealth.ipf.commons.ihe.fhir.audit.events.BalpPHIExportBuilder; @@ -46,7 +45,7 @@ public Iti68AuditDataset enrichAuditDatasetFromRequest(Iti68AuditDataset auditDa @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, Iti68AuditDataset auditDataset) { - BalpPHIExportBuilder builder = new BalpPHIExportBuilder(auditContext, auditDataset, + var builder = new BalpPHIExportBuilder(auditContext, auditDataset, EventActionCode.Create, FhirEventTypeCode.MobileDocumentRetrieval) .setPatient(auditDataset.getPatientId()); diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68bin/Iti68BinaryServerAuditStrategy.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68bin/Iti68BinaryServerAuditStrategy.java index b6fcee9a98..217fe0d10d 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68bin/Iti68BinaryServerAuditStrategy.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68bin/Iti68BinaryServerAuditStrategy.java @@ -20,7 +20,6 @@ import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import org.openehealth.ipf.commons.ihe.fhir.audit.events.BalpPHIExportBuilder; @@ -46,7 +45,7 @@ public FhirAuditDataset enrichAuditDatasetFromRequest(FhirAuditDataset auditData @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirAuditDataset auditDataset) { - BalpPHIExportBuilder builder = new BalpPHIExportBuilder(auditContext, auditDataset, + var builder = new BalpPHIExportBuilder(auditContext, auditDataset, EventActionCode.Create, FhirEventTypeCode.MobileDocumentRetrieval) .setPatient(auditDataset.getPatientId()); diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/MhdConstants.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/MhdConstants.java index 7c0d3cc349..0148117aca 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/MhdConstants.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/MhdConstants.java @@ -15,8 +15,6 @@ */ package org.openehealth.ipf.commons.ihe.fhir.mhd; -import org.hl7.fhir.r4.model.Coding; - interface MhdConstants { // Bundle Profiles V4 diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/ComprehensiveProvideDocumentBundle.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/ComprehensiveProvideDocumentBundle.java index b92ecf3705..5afc06efcb 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/ComprehensiveProvideDocumentBundle.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/ComprehensiveProvideDocumentBundle.java @@ -17,8 +17,6 @@ import ca.uhn.fhir.model.api.annotation.ResourceDef; import org.hl7.fhir.r4.model.Binary; -import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Resource; import org.openehealth.ipf.commons.ihe.fhir.mhd.Mhd421; import org.openehealth.ipf.commons.ihe.fhir.support.FhirUtils; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/FolderList.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/FolderList.java index 3a658e25c6..749510fe51 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/FolderList.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/FolderList.java @@ -17,8 +17,6 @@ import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; -import org.hl7.fhir.r4.model.ListResource; -import org.ietf.jgss.Oid; public abstract class FolderList> extends MhdList { diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MhdList.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MhdList.java index 4c0fd3c6ad..4451179aed 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MhdList.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MhdList.java @@ -20,7 +20,6 @@ import ca.uhn.fhir.model.api.annotation.Extension; import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.util.ElementUtil; -import org.hl7.fhir.r4.model.Annotation; import org.hl7.fhir.r4.model.Base; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.ListResource; @@ -64,7 +63,7 @@ public List getDesignationType() { } public CodeableConcept addDesignationType() { - CodeableConcept codeableConcept = new CodeableConcept(); + var codeableConcept = new CodeableConcept(); addDesignationType(codeableConcept); return codeableConcept; } @@ -92,7 +91,7 @@ public CodeableConcept getDesignationTypeFirstRep() { public boolean hasDesignationType() { if (this.designationType == null) return false; - for (CodeableConcept item : this.designationType) + for (var item : this.designationType) if (!item.isEmpty()) return true; return false; @@ -111,10 +110,10 @@ public T setEntryUuidIdentifier(UUID uuid) { @Override public void copyValues(ListResource dst) { super.copyValues(dst); - MhdList mhdList = (MhdList) dst; + var mhdList = (MhdList) dst; if (designationType != null) { mhdList.designationType = new ArrayList<>(); - for (CodeableConcept i : designationType) + for (var i : designationType) mhdList.designationType.add(i.copy()); } } @@ -125,7 +124,7 @@ public boolean equalsDeep(Base other_) { return false; if (!(other_ instanceof MhdList)) return false; - MhdList o = (MhdList) other_; + var o = (MhdList) other_; return compareDeep(designationType, o.designationType, true); } diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalDocumentReference.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalDocumentReference.java index 783a338505..6ecdd349f8 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalDocumentReference.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalDocumentReference.java @@ -16,12 +16,9 @@ package org.openehealth.ipf.commons.ihe.fhir.mhd.model; import ca.uhn.fhir.model.api.annotation.ResourceDef; -import org.hl7.fhir.r4.model.DocumentReference; import org.hl7.fhir.r4.model.Enumerations; -import org.openehealth.ipf.commons.ihe.fhir.mhd.Mhd421; import java.util.Date; -import java.util.UUID; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.MINIMAL_DOCUMENT_REFERENCE; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.MINIMAL_DOCUMENT_REFERENCE_PROFILE; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalSubmissionSetList.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalSubmissionSetList.java index 6fc0c11ba4..10496184d2 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalSubmissionSetList.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/MinimalSubmissionSetList.java @@ -16,7 +16,6 @@ package org.openehealth.ipf.commons.ihe.fhir.mhd.model; import ca.uhn.fhir.model.api.annotation.ResourceDef; -import org.hl7.fhir.r4.model.ListResource; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.MINIMAL_SUBMISSIONSET_TYPE_LIST; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.MINIMAL_SUBMISSIONSET_TYPE_LIST_PROFILE; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/Source.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/Source.java index f1e461b667..3545b52d8d 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/Source.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/Source.java @@ -19,7 +19,6 @@ import ca.uhn.fhir.model.api.annotation.DatatypeDef; import ca.uhn.fhir.model.api.annotation.Extension; import ca.uhn.fhir.util.ElementUtil; -import lombok.Getter; import org.hl7.fhir.r4.model.Base; import org.hl7.fhir.r4.model.Reference; @@ -66,9 +65,8 @@ public Source copy() { public boolean equalsDeep(Base other_) { if (!super.equalsDeep(other_)) return false; - if (!(other_ instanceof Source)) + if (!(other_ instanceof Source o)) return false; - Source o = (Source) other_; return compareDeep(authorOrg, o.authorOrg, true); } diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/UncontainedComprehensiveSubmissionSetList.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/UncontainedComprehensiveSubmissionSetList.java index b0ef23da82..d7ad241421 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/UncontainedComprehensiveSubmissionSetList.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/mhd/model/UncontainedComprehensiveSubmissionSetList.java @@ -16,7 +16,6 @@ package org.openehealth.ipf.commons.ihe.fhir.mhd.model; import ca.uhn.fhir.model.api.annotation.ResourceDef; -import org.hl7.fhir.r4.model.ListResource; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.UNCONTAINED_COMPREHENSIVE_SUBMISSIONSET_TYPE_LIST; import static org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile.UNCONTAINED_COMPREHENSIVE_SUBMISSIONSET_TYPE_LIST_PROFILE; diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5AuditStrategy.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5AuditStrategy.java index 02c74ed0ab..6ddd62e497 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5AuditStrategy.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5AuditStrategy.java @@ -22,7 +22,7 @@ import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.model.TypeValuePairType; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.Constants; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; @@ -58,7 +58,7 @@ public AuditMessage[] makeAuditMessage(final AuditContext auditContext, if (endpointUrl != null && endpointUrl.lastIndexOf("$") >= 0) { operation = endpointUrl.substring(endpointUrl.lastIndexOf("$")); } - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.QueryPharmacyDocumentsOverMhd) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.QueryPharmacyDocumentsOverMhd) .addPatients(auditDataset.getPatientIds()) .setQueryParameters( operation, @@ -97,8 +97,7 @@ public FhirQueryAuditDataset enrichAuditDatasetFromRequest(final FhirQueryAuditD if (tokenParams != null) { tokenParams.forEach(t -> addPatientId.accept(t.getValue(), t.getSystem())); } - } else if (request instanceof Parameters) { - final var bodyParameters = (Parameters) request; + } else if (request instanceof Parameters bodyParameters) { final var patientIdentifier = bodyParameters.getParameterValues(Pharm5ResourceProvider.SP_PATIENT_IDENTIFIER); if (patientIdentifier instanceof StringType) { final var parts = ((StringType) patientIdentifier).getValue().split("\\|"); diff --git a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5ClientRequestFactory.java b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5ClientRequestFactory.java index 7b01961981..dc0bb3a039 100644 --- a/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5ClientRequestFactory.java +++ b/commons/ihe/fhir/r4/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pharm5/Pharm5ClientRequestFactory.java @@ -47,7 +47,7 @@ public class Pharm5ClientRequestFactory implements ClientRequestFactory CP_DATE = nullsLast(comparing(DocumentReference::getDate)); + private static final Comparator CP_DATE = comparing( + DocumentReference::getDate, nullsLast(naturalOrder())); - private static final Comparator CP_AUTHOR = nullsLast(comparing(documentReference -> { + private static final Comparator CP_AUTHOR = comparing( + Pharm5SearchParameters::getAuthorName, nullsLast(naturalOrder())); + + private static String getAuthorName(DocumentReference documentReference) { if (!documentReference.hasAuthor()) return null; var author = documentReference.getAuthorFirstRep(); - if (author.getResource() instanceof PractitionerRole) { - var practitionerRole = (PractitionerRole) author.getResource(); + if (author.getResource() instanceof PractitionerRole practitionerRole) { if (!practitionerRole.hasPractitioner()) return null; author = practitionerRole.getPractitioner(); } if (author.getResource() == null) return null; - if (author.getResource() instanceof Practitioner) { - var practitioner = (Practitioner) author.getResource(); + if (author.getResource() instanceof Practitioner practitioner) { if (!practitioner.hasName()) return null; var name = practitioner.getNameFirstRep(); return name.getFamilyElement().getValueNotNull() + name.getGivenAsSingleString(); } return null; - })); + } } diff --git a/commons/ihe/fhir/r4/mhd/src/test/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105ValidatorTest.java b/commons/ihe/fhir/r4/mhd/src/test/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105ValidatorTest.java index e5d8dd29d7..5c64364c07 100644 --- a/commons/ihe/fhir/r4/mhd/src/test/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105ValidatorTest.java +++ b/commons/ihe/fhir/r4/mhd/src/test/java/org/openehealth/ipf/commons/ihe/fhir/iti105/Iti105ValidatorTest.java @@ -14,8 +14,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfile; -import org.openehealth.ipf.commons.ihe.fhir.mhd.MhdProfiles; -import org.openehealth.ipf.commons.ihe.fhir.mhd.MhdValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +31,7 @@ public class Iti105ValidatorTest { - private static final Logger LOG = LoggerFactory.getLogger(Iti105ValidatorTest.class); + private static final Logger log = LoggerFactory.getLogger(Iti105ValidatorTest.class); static Iti105Validator iti105Validator; @@ -57,7 +55,7 @@ void testInvalidConformance() throws Exception { ); assertNotNull(exception); var oo = (OperationOutcome) exception.getOperationOutcome(); - oo.getIssue().forEach(ooc -> LOG.error(ooc.getSeverity().getDisplay() + " : " + ooc.getDiagnostics())); + oo.getIssue().forEach(ooc -> log.error("{} : {}", ooc.getSeverity().getDisplay(), ooc.getDiagnostics())); } private static DocumentReference validDocumentreference() throws NoSuchAlgorithmException { diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy b/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy index f5c64d0f63..4bf0c0541a 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy +++ b/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy @@ -53,7 +53,7 @@ import static java.util.Objects.requireNonNull */ class PdqResponseToPdqmResponseTranslator implements ToFhirTranslator { - private static final Logger LOG = LoggerFactory.getLogger(PdqResponseToPdqmResponseTranslator) + private static final Logger log = LoggerFactory.getLogger(PdqResponseToPdqmResponseTranslator) private final UriMapper uriMapper String pdqSupplierResourceIdentifierUri @@ -131,7 +131,7 @@ class PdqResponseToPdqmResponseTranslator implements ToFhirTranslator { if (resourcePid) { patient.setId(new IdType('Patient', resourcePid[1].value)) } else { - LOG.warn("No ID found with resource system URI {}", pdqSupplierResourceIdentifierUri) + log.warn("No ID found with resource system URI {}", pdqSupplierResourceIdentifierUri) } convertIdentifiers(pid[3](), patient.getIdentifier()) diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy b/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy index 9590168ac3..1cb5df8f26 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy +++ b/commons/ihe/fhir/r4/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy @@ -201,7 +201,7 @@ class PdqmRequestToPdqQueryTranslator implements FhirTranslator { } protected String convertBirthDate(DateAndListParam birthDateParam) { - var birthDate = firstOrNull(searchDateList(birthDateParam)) + def birthDate = firstOrNull(searchDateList(birthDateParam)) return birthDate ? FastDateFormat.getInstance('yyyyMMdd').format(birthDate) : null } diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java index 2208ff4746..45418bb93f 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java @@ -53,8 +53,7 @@ public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAudit @Override public FhirQueryAuditDataset enrichAuditDatasetFromRequest(FhirQueryAuditDataset auditDataset, Object request, Map parameters) { var dataset = super.enrichAuditDatasetFromRequest(auditDataset, request, parameters); - if (request instanceof IdType) { - var idType = (IdType) request; + if (request instanceof IdType idType) { dataset.getPatientIds().add(idType.getValue()); } return dataset; diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java index afac5d38f3..e4daf7800f 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java @@ -28,7 +28,7 @@ * @author Christian Ohr * @since 3.6 */ -public class Iti78QueryResourceClientRequestFactory extends QueryClientRequestFactory { +public class Iti78QueryResourceClientRequestFactory extends QueryClientRequestFactory { public Iti78QueryResourceClientRequestFactory() { super(Patient.class, Bundle.class); diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78SearchParameters.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78SearchParameters.java index a2ee959d64..a4a6cdea16 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78SearchParameters.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78SearchParameters.java @@ -83,12 +83,12 @@ public List getPatientIdParam() { @Override public Optional> comparatorFor(String paramName) { - switch (paramName) { - case PdqPatient.SP_BIRTHDATE : return Optional.of(CP_DATE); - case PdqPatient.SP_FAMILY: return Optional.of(CP_FAMILY); - case PdqPatient.SP_GIVEN: return Optional.of(CP_GIVEN); - } - return Optional.empty(); + return switch (paramName) { + case PdqPatient.SP_BIRTHDATE -> Optional.of(CP_DATE); + case PdqPatient.SP_FAMILY -> Optional.of(CP_FAMILY); + case PdqPatient.SP_GIVEN -> Optional.of(CP_GIVEN); + default -> Optional.empty(); + }; } private static final Comparator CP_DATE = nullsLast(comparing(PdqPatient::getBirthDate)); diff --git a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java index 284e9dba96..fe289ca3ac 100644 --- a/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java +++ b/commons/ihe/fhir/r4/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java @@ -64,11 +64,9 @@ public FhirQueryAuditDataset enrichAuditDatasetFromRequest(FhirQueryAuditDataset .map(Parameters.ParametersParameterComponent::getValue) .findFirst().orElseThrow(() -> new RuntimeException("No sourceIdentifier in PIX query")); - if (sourceIdentifier instanceof Identifier) { - var identifier = (Identifier) sourceIdentifier; + if (sourceIdentifier instanceof Identifier identifier) { dataset.getPatientIds().add(String.format("%s|%s", identifier.getSystem(), identifier.getValue())); - } else if (sourceIdentifier instanceof StringType) { - var identifier = (StringType) sourceIdentifier; + } else if (sourceIdentifier instanceof StringType identifier) { dataset.getPatientIds().add(identifier.getValue()); } else { dataset.getPatientIds().add(sourceIdentifier.toString()); diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/DiagnosticReportSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/DiagnosticReportSearchParameters.java index 8790659adf..1600d98e69 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/DiagnosticReportSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/DiagnosticReportSearchParameters.java @@ -34,8 +34,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -69,13 +68,15 @@ public class DiagnosticReportSearchParameters extends Pcc44CommonSearchParameter @Override protected Optional> comparatorFor(String paramName) { - if (DiagnosticReport.SP_DATE.equals(paramName)) { - return Optional.of(nullsLast(CP_EFFECTIVE)); - } - return Optional.empty(); + return DiagnosticReport.SP_DATE.equals(paramName) ? + Optional.of(CP_EFFECTIVE) : + Optional.empty(); } - private static final Comparator CP_EFFECTIVE = nullsLast(comparing(diagnosticReport -> { + private static final Comparator CP_EFFECTIVE = comparing( + DiagnosticReportSearchParameters::getEffectiveStartTime, nullsLast(naturalOrder())); + + private static String getEffectiveStartTime(DiagnosticReport diagnosticReport) { if (!diagnosticReport.hasEffective()) return null; var effective = diagnosticReport.getEffective(); if (effective instanceof DateTimeType) { @@ -83,5 +84,5 @@ protected Optional> comparatorFor(String paramName) } else { return diagnosticReport.getEffectivePeriod().getStartElement().getValueAsString(); } - })); + } } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/EncounterSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/EncounterSearchParameters.java index 8fe15b04e7..feb057998a 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/EncounterSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/EncounterSearchParameters.java @@ -32,8 +32,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -60,14 +59,12 @@ public class EncounterSearchParameters extends Pcc44CommonSearchParameters> comparatorFor(String paramName) { - if (Encounter.SP_DATE.equals(paramName)) { - return Optional.of(nullsLast(CP_PERIOD)); - } - return Optional.empty(); + return Encounter.SP_DATE.equals(paramName) ? + Optional.of(CP_PERIOD) : + Optional.empty(); } - private static final Comparator CP_PERIOD = nullsLast(comparing(encounter -> { - if (!encounter.hasPeriod()) return null; - return encounter.getPeriod().getStart(); - })); + private static final Comparator CP_PERIOD = comparing( + encounter -> !encounter.hasPeriod() ? null : encounter.getPeriod().getStart(), + nullsLast(naturalOrder())); } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ImmunizationSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ImmunizationSearchParameters.java index e48d0fff73..5cb38f5daa 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ImmunizationSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ImmunizationSearchParameters.java @@ -29,8 +29,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -51,14 +50,14 @@ public class ImmunizationSearchParameters extends Pcc44CommonSearchParameters> comparatorFor(String paramName) { - if (Immunization.SP_DATE.equals(paramName)) { - return Optional.of(nullsLast(CP_OCCURRENCE)); - } - return Optional.empty(); + return Immunization.SP_DATE.equals(paramName) ? + Optional.of(CP_OCCURRENCE) : + Optional.empty(); } - private static final Comparator CP_OCCURRENCE = nullsLast(comparing(immunization -> { - if (!immunization.hasOccurrenceDateTimeType()) return null; - return immunization.getOccurrenceDateTimeType().getValue(); - })); + private static final Comparator CP_OCCURRENCE = comparing( + immunization -> !immunization.hasOccurrenceDateTimeType() ? + null : + immunization.getOccurrenceDateTimeType().getValue(), + nullsLast(naturalOrder())); } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationRequestSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationRequestSearchParameters.java index df889e668d..114a68084f 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationRequestSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationRequestSearchParameters.java @@ -51,8 +51,8 @@ public class MedicationRequestSearchParameters extends Pcc44CommonSearchParamete @Override protected Optional> comparatorFor(String paramName) { - switch (paramName) { - case MedicationRequest.SP_AUTHOREDON: return Optional.of(nullsLast(comparing(MedicationRequest::getAuthoredOn))); + if (paramName.equals(MedicationRequest.SP_AUTHOREDON)) { + return Optional.of(nullsLast(comparing(MedicationRequest::getAuthoredOn))); } return Optional.empty(); } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationStatementSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationStatementSearchParameters.java index 6d63c15ea6..1adbc19313 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationStatementSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/MedicationStatementSearchParameters.java @@ -30,8 +30,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -52,13 +51,16 @@ public class MedicationStatementSearchParameters extends Pcc44CommonSearchParame @Override protected Optional> comparatorFor(String paramName) { - if (MedicationStatement.SP_EFFECTIVE.equals(paramName)) { - return Optional.of(nullsLast(CP_EFFECTIVE)); - } - return Optional.empty(); + return MedicationStatement.SP_EFFECTIVE.equals(paramName) ? + Optional.of(CP_EFFECTIVE) : + Optional.empty(); } - private static final Comparator CP_EFFECTIVE = nullsLast(comparing(medicationStatement -> { + private static final Comparator CP_EFFECTIVE = comparing( + MedicationStatementSearchParameters::getEffectiveStartTime, + nullsLast(naturalOrder())); + + private static String getEffectiveStartTime(MedicationStatement medicationStatement) { if (!medicationStatement.hasEffective()) return null; var effective = medicationStatement.getEffective(); if (effective instanceof DateTimeType) { @@ -66,5 +68,5 @@ protected Optional> comparatorFor(String paramNa } else { return medicationStatement.getEffectivePeriod().getStartElement().getValueAsString(); } - })); + } } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ObservationSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ObservationSearchParameters.java index ef96ed2dc6..773a1eb16b 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ObservationSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ObservationSearchParameters.java @@ -36,8 +36,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -73,13 +72,16 @@ public class ObservationSearchParameters extends Pcc44CommonSearchParameters> comparatorFor(String paramName) { - if (Observation.SP_DATE.equals(paramName)) { - return Optional.of(nullsLast(CP_EFFECTIVE)); - } - return Optional.empty(); + return Observation.SP_DATE.equals(paramName) ? + Optional.of(CP_EFFECTIVE) : + Optional.empty(); } - private static final Comparator CP_EFFECTIVE = nullsLast(comparing(observation -> { + private static final Comparator CP_EFFECTIVE = comparing( + ObservationSearchParameters::getEffectiveStartTime, + nullsLast(naturalOrder())); + + private static String getEffectiveStartTime(Observation observation) { if (!observation.hasEffective()) return null; var effective = observation.getEffective(); if (effective instanceof DateTimeType) { @@ -91,5 +93,5 @@ protected Optional> comparatorFor(String paramName) { } else { return null; } - })); + } } diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java index 20f04f2e1e..e7af1547fe 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java @@ -17,7 +17,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; @@ -36,7 +36,7 @@ public Pcc44AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.MobileQueryExistingData) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobileQueryExistingData) .addPatients(auditDataset.getPatientIds()) .setQueryParameters("MobileQueryExistingData", FhirParticipantObjectIdTypeCode.MobileQueryExistingData, diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java index c28a26b4ca..432c90004e 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java @@ -47,7 +47,7 @@ public class Pcc44ClientRequestFactory implements ClientRequestFactory[] criteria = (ICriterion[]) requestData; + var criteria = (ICriterion[]) requestData; if (criteria.length > 0) { query = query.where(criteria[0]); if (criteria.length > 1) { diff --git a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ProcedureSearchParameters.java b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ProcedureSearchParameters.java index 038eaff30a..3e604c4559 100644 --- a/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ProcedureSearchParameters.java +++ b/commons/ihe/fhir/r4/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/ProcedureSearchParameters.java @@ -35,8 +35,7 @@ import java.util.Optional; import java.util.Set; -import static java.util.Comparator.comparing; -import static java.util.Comparator.nullsLast; +import static java.util.Comparator.*; /** * @author Christian Ohr @@ -63,13 +62,16 @@ public class ProcedureSearchParameters extends Pcc44CommonSearchParameters> comparatorFor(String paramName) { - if (Procedure.SP_DATE.equals(paramName)) { - return Optional.of(nullsLast(CP_PERFORMED)); - } - return Optional.empty(); + return Procedure.SP_DATE.equals(paramName) ? + Optional.of(CP_PERFORMED) : + Optional.empty(); } - private static final Comparator CP_PERFORMED = nullsLast(comparing(procedure -> { + private static final Comparator CP_PERFORMED = comparing( + ProcedureSearchParameters::getPerformedStartTime, + nullsLast(naturalOrder())); + + private static String getPerformedStartTime(Procedure procedure) { if (!procedure.hasPerformed()) return null; var performed = procedure.getPerformed(); if (performed instanceof DateTimeType) { @@ -81,5 +83,5 @@ protected Optional> comparatorFor(String paramName) { } else { return null; } - })); + } } diff --git a/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java b/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java index 89515b38e1..c25093ddd5 100644 --- a/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java +++ b/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/atna/ATNA.java @@ -38,6 +38,7 @@ public enum Interactions implements FhirInteractionId { ITI_81(ITI_81_CONFIG); @Getter + final FhirTransactionConfiguration fhirTransactionConfiguration; } diff --git a/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java b/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java index 0ba7dae3ab..47a2d22b47 100644 --- a/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java +++ b/commons/ihe/fhir/stu3/audit/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti81/Iti81ClientRequestFactory.java @@ -28,7 +28,7 @@ * @author Christian Ohr * @since 3.1 */ -public class Iti81ClientRequestFactory extends QueryClientRequestFactory { +public class Iti81ClientRequestFactory extends QueryClientRequestFactory { public Iti81ClientRequestFactory() { super(AuditEvent.class, Bundle.class); diff --git a/commons/ihe/fhir/stu3/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java b/commons/ihe/fhir/stu3/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java index 9a3dbc50f4..ec38b25912 100644 --- a/commons/ihe/fhir/stu3/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java +++ b/commons/ihe/fhir/stu3/core/src/main/java/org/openehealth/ipf/commons/ihe/fhir/support/AbstractNamingSystemServiceImpl.java @@ -42,7 +42,7 @@ public class AbstractNamingSystemServiceImpl implements NamingSystemService { public void addNamingSystems(Bundle bundle) { this.namingSystems.merge(bundle.getIdElement().getIdPart(), setOfNamingSystems(bundle), (set1, set2) -> { - var result = new HashSet(set1); + var result = new HashSet<>(set1); result.addAll(set2); return result; }); diff --git a/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/AbstractSystemUriMapperTest.java b/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/AbstractSystemUriMapperTest.java index cac7c2b8e9..04993a022d 100644 --- a/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/AbstractSystemUriMapperTest.java +++ b/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/AbstractSystemUriMapperTest.java @@ -40,31 +40,31 @@ public void setup() { protected abstract UriMapper initMapper(DefaultNamingSystemServiceImpl namingSystemService); @Test - public void testTranslateOidUrn() throws Exception { + public void testTranslateOidUrn() { var oid = "1.2.3.4.5.6.7.8.9"; - assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).get()); + assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).orElse(null)); } @Test - public void testTranslateUriToOid() throws Exception { + public void testTranslateUriToOid() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; - assertEquals("1.2.3.4", uriMapper.uriToOid(uri).get()); + assertEquals("1.2.3.4", uriMapper.uriToOid(uri).orElse(null)); } @Test - public void testTranslateUriToOidFails() throws Exception { + public void testTranslateUriToOidFails() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; assertFalse(uriMapper.uriToOid(uri).isPresent()); } @Test - public void testTranslatePinUrn() throws Exception { + public void testTranslatePinUrn() { var namespace = "namespace"; - assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).get()); + assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).orElse(null)); } @Test - public void testTranslateUriToNamespace() throws Exception { + public void testTranslateUriToNamespace() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; assertEquals("fhir1", uriMapper.uriToNamespace(uri).get()); uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; @@ -72,7 +72,7 @@ public void testTranslateUriToNamespace() throws Exception { } @Test - public void testTranslateNamespaceToUri() throws Exception { + public void testTranslateNamespaceToUri() { var namespace = "fhir1"; assertEquals("http://org.openehealth/ipf/commons/ihe/fhir/1", uriMapper.namespaceToUri(namespace)); } diff --git a/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java b/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java index 77f41eea3f..8d837be168 100644 --- a/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java +++ b/commons/ihe/fhir/stu3/core/src/test/java/org/openehealth/ipf/commons/ihe/fhir/support/translation/DefaultUriMapperTest.java @@ -29,42 +29,41 @@ */ public class DefaultUriMapperTest { - private BidiMappingService mappingService; private DefaultUriMapper uriMapper; @BeforeEach public void setup() { - mappingService = new BidiMappingService(); + BidiMappingService mappingService = new BidiMappingService(); mappingService.setMappingScript(getClass().getResource("/mapping.map")); uriMapper = new DefaultUriMapper(mappingService, "uriToOid", "uriToNamespace"); } @Test - public void testTranslateOidUrn() throws Exception { + public void testTranslateOidUrn() { var oid = "1.2.3.4.5.6.7.8.9"; - assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).get()); + assertEquals(oid, uriMapper.uriToOid("urn:oid:" + oid).orElse(null)); } @Test - public void testTranslateUriToOid() throws Exception { + public void testTranslateUriToOid() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; - assertEquals("1.2.3.4", uriMapper.uriToOid(uri).get()); + assertEquals("1.2.3.4", uriMapper.uriToOid(uri).orElse(null)); } @Test - public void testTranslateUriToOidFails() throws Exception { + public void testTranslateUriToOidFails() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; assertFalse(uriMapper.uriToOid(uri).isPresent()); } @Test - public void testTranslatePinUrn() throws Exception { + public void testTranslatePinUrn() { var namespace = "namespace"; - assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).get()); + assertEquals(namespace, uriMapper.uriToNamespace("urn:pin:" + namespace).orElse(null)); } @Test - public void testTranslateUriToNamespace() throws Exception { + public void testTranslateUriToNamespace() { var uri = "http://org.openehealth/ipf/commons/ihe/fhir/1"; assertEquals("fhir1", uriMapper.uriToNamespace(uri).get()); uri = "http://org.openehealth/ipf/commons/ihe/fhir/9"; @@ -72,7 +71,7 @@ public void testTranslateUriToNamespace() throws Exception { } @Test - public void testTranslateNamespaceToUri() throws Exception { + public void testTranslateNamespaceToUri() { var namespace = "fhir1"; assertEquals("http://org.openehealth/ipf/commons/ihe/fhir/1", uriMapper.namespaceToUri(namespace)); } diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ClientAuditStrategy.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ClientAuditStrategy.java index dc700378ad..24777b4963 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ClientAuditStrategy.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ClientAuditStrategy.java @@ -20,7 +20,7 @@ import org.openehealth.ipf.commons.audit.codes.ParticipantObjectIdTypeCode; import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import java.util.Collections; @@ -36,7 +36,7 @@ public Iti65ClientAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, Iti65AuditDataset auditDataset) { - return new PHIExportBuilder<>(auditContext, auditDataset, FhirEventTypeCode.ProvideDocumentBundle) + return new DefaultPHIExportBuilder(auditContext, auditDataset, FhirEventTypeCode.ProvideDocumentBundle) .setPatient(auditDataset.getPatientId()) .addExportedEntity( auditDataset.getDocumentManifestUuid() != null ? diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ServerAuditStrategy.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ServerAuditStrategy.java index bcba287c0d..7703b9fd23 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ServerAuditStrategy.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65ServerAuditStrategy.java @@ -20,7 +20,7 @@ import org.openehealth.ipf.commons.audit.codes.ParticipantObjectIdTypeCode; import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIImportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIImportBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import java.util.Collections; @@ -36,7 +36,7 @@ public Iti65ServerAuditStrategy() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, Iti65AuditDataset auditDataset) { - return new PHIImportBuilder<>(auditContext, auditDataset, FhirEventTypeCode.ProvideDocumentBundle) + return new DefaultPHIImportBuilder(auditContext, auditDataset, FhirEventTypeCode.ProvideDocumentBundle) .setPatient(auditDataset.getPatientId()) .addImportedEntity( auditDataset.getDocumentManifestUuid(), diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java index 24c00f3493..d6d18dfb8a 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti65/Iti65Validator.java @@ -154,8 +154,7 @@ protected void validateBundleConsistency(Bundle bundle) { .flatMap(Collection::stream) .map(Bundle.BundleEntryComponent::getResource) .forEach(resource -> { - if (resource instanceof DocumentManifest) { - var dm = (DocumentManifest) resource; + if (resource instanceof DocumentManifest dm) { for (var content : dm.getContent()) { try { expectedReferenceFullUrls.add(content.getPReference().getReference()); @@ -163,8 +162,7 @@ protected void validateBundleConsistency(Bundle bundle) { } } patientReferences.add(getSubjectReference(resource, r -> dm.getSubject())); - } else if (resource instanceof DocumentReference) { - var dr = (DocumentReference) resource; + } else if (resource instanceof DocumentReference dr) { for (var content : dr.getContent()) { var url = content.getAttachment().getUrl(); if (!url.startsWith("http")) { diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java index d205181c1e..74c90ec20a 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66AuditStrategy.java @@ -17,7 +17,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; @@ -37,7 +37,7 @@ public Iti66AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.MobileDocumentManifestQuery) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobileDocumentManifestQuery) .addPatients(auditDataset.getPatientIds()) .setQueryParameters("MobileDocumentManifestQuery", FhirParticipantObjectIdTypeCode.MobileDocumentManifestQuery, diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66ClientRequestFactory.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66ClientRequestFactory.java index 4cec90d1ee..670d7a69dc 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66ClientRequestFactory.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti66/Iti66ClientRequestFactory.java @@ -26,7 +26,7 @@ * @author Christian Ohr * @since 3.2 */ -public class Iti66ClientRequestFactory extends QueryClientRequestFactory { +public class Iti66ClientRequestFactory extends QueryClientRequestFactory { public Iti66ClientRequestFactory() { super(DocumentManifest.class, Bundle.class); diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java index 172538a80e..f43054dc4d 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67AuditStrategy.java @@ -17,7 +17,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; @@ -35,7 +35,7 @@ public Iti67AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobileDocumentReferenceQuery) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobileDocumentReferenceQuery) .addPatients(auditDataset.getPatientIds()) .setQueryParameters("MobileDocumentReferenceQuery", FhirParticipantObjectIdTypeCode.MobileDocumentReferenceQuery, diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ClientRequestFactory.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ClientRequestFactory.java index b977bdfa75..e13d3e5d6d 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ClientRequestFactory.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti67/Iti67ClientRequestFactory.java @@ -26,7 +26,7 @@ * @author Christian Ohr * @since 3.4 */ -public class Iti67ClientRequestFactory extends QueryClientRequestFactory { +public class Iti67ClientRequestFactory extends QueryClientRequestFactory { public Iti67ClientRequestFactory() { super(DocumentReference.class, Bundle.class); diff --git a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java index fca11053d7..e65170ea43 100644 --- a/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java +++ b/commons/ihe/fhir/stu3/mhd/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti68/Iti68ServerAuditStrategy.java @@ -22,7 +22,7 @@ import org.openehealth.ipf.commons.audit.codes.ParticipantObjectTypeCodeRole; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PHIExportBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPHIExportBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; import java.util.Map; @@ -44,7 +44,7 @@ public Iti68AuditDataset enrichAuditDatasetFromRequest(Iti68AuditDataset auditDa @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, Iti68AuditDataset auditDataset) { - PHIExportBuilder builder = new PHIExportBuilder<>(auditContext, auditDataset, + var builder = new DefaultPHIExportBuilder(auditContext, auditDataset, EventActionCode.Create, FhirEventTypeCode.MobileDocumentRetrieval) .setPatient(auditDataset.getPatientId()); diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy index 7a9dad593d..9d493db93d 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqResponseToPdqmResponseTranslator.groovy @@ -53,7 +53,7 @@ import static java.util.Objects.requireNonNull */ class PdqResponseToPdqmResponseTranslator implements ToFhirTranslator { - private static final Logger LOG = LoggerFactory.getLogger(PdqResponseToPdqmResponseTranslator) + private static final Logger log = LoggerFactory.getLogger(PdqResponseToPdqmResponseTranslator) private final UriMapper uriMapper String pdqSupplierResourceIdentifierUri @@ -88,7 +88,7 @@ class PdqResponseToPdqmResponseTranslator implements ToFhirTranslator { switch (ackCode) { case 'OK': return handleRegularSearchResponse(message.QUERY_RESPONSE()) // Case 1,2 case 'NF': return handleRegularSearchResponse(null) // Case 3 - case 'AE': return handleErrorResponse(message) // Cases 4-5 + case 'AE': return handleErrorResponse(message as RSP_K21) // Cases 4-5 default: throw new InternalErrorException("Unexpected ack code " + ackCode) } } @@ -131,7 +131,7 @@ class PdqResponseToPdqmResponseTranslator implements ToFhirTranslator { if (resourcePid) { patient.setId(new IdType('Patient', resourcePid[1].value)) } else { - LOG.warn("No ID found with resource system URI {}", pdqSupplierResourceIdentifierUri) + log.warn("No ID found with resource system URI {}", pdqSupplierResourceIdentifierUri) } convertIdentifiers(pid[3](), patient.getIdentifier()) diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy index 433c57a9c7..f6c9deeba1 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti78/PdqmRequestToPdqQueryTranslator.groovy @@ -135,7 +135,7 @@ class PdqmRequestToPdqQueryTranslator implements FhirTranslator { // Handle identifiers - List requestedDomainOids + List requestedDomainOids = null Optional searchIdentifier = Optional.empty() TokenParam resourceIdParam = searchParameters._id @@ -155,8 +155,9 @@ class PdqmRequestToPdqQueryTranslator implements FhirTranslator { // Requested domains have no identifier value. If the resource identifier system is not included here, // add it because otherwise we don't know the resource ID in the response. - requestedDomainOids = identifiers?.findAll { it.isPresent() && it.get().hasOnlySystem() } - ?.collect { it.get().oid } + requestedDomainOids = identifiers?.findAll { + it.isPresent() && it.get().hasOnlySystem() + }?.collect { it.get().oid } } // If requestedDomains is set but the pdqSupplierResourceIdentifierOid is not part of it, add it. @@ -200,7 +201,7 @@ class PdqmRequestToPdqQueryTranslator implements FhirTranslator { } protected String convertBirthDate(DateAndListParam birthDateParam) { - Date birthDate = firstOrNull(searchDateList(birthDateParam)) + def birthDate = firstOrNull(searchDateList(birthDateParam)) return birthDate ? FastDateFormat.getInstance('yyyyMMdd').format(birthDate) : null } @@ -218,7 +219,7 @@ class PdqmRequestToPdqQueryTranslator implements FhirTranslator { param?.valuesAsQueryTokens?.collect { searchString(it.valuesAsQueryTokens.find(), forceExactSearch) } } - protected List searchDateList(DateAndListParam param) { + protected List searchDateList(DateAndListParam param) { param?.valuesAsQueryTokens?.collect { searchDate(it.valuesAsQueryTokens.find()) } } diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti83/PixQueryResponseToPixmResponseTranslator.groovy b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti83/PixQueryResponseToPixmResponseTranslator.groovy index d95890d71b..fe46429e37 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti83/PixQueryResponseToPixmResponseTranslator.groovy +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/groovy/org/openehealth/ipf/commons/ihe/fhir/iti83/PixQueryResponseToPixmResponseTranslator.groovy @@ -52,7 +52,7 @@ class PixQueryResponseToPixmResponseTranslator implements ToFhirTranslator { map.put(part.name, part.value) } - handleSourceIdentifier(qry, map[Constants.SOURCE_IDENTIFIER_NAME]) + handleSourceIdentifier(qry, map[Constants.SOURCE_IDENTIFIER_NAME] as Identifier) - UriType requestedDomain = map[Constants.TARGET_SYSTEM_NAME] + UriType requestedDomain = map[Constants.TARGET_SYSTEM_NAME] as UriType if (requestedDomain) { if (!Utils.populateIdentifier(Utils.nextRepetition(qry.QPD[4]), uriMapper, requestedDomain.value)) { // UriMapper is not able to derive a PIX OID/Namespace for the target domain URI, Error Case 5 diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java index 9605ff86d6..31cafd9864 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78AuditStrategy.java @@ -18,7 +18,7 @@ import org.hl7.fhir.dstu3.model.IdType; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; @@ -40,7 +40,7 @@ protected Iti78AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.MobilePatientDemographicsQuery) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobilePatientDemographicsQuery) .addPatients(auditDataset.getPatientIds()) .setQueryParameters( "MobilePatientDemographicsQuery", @@ -53,8 +53,7 @@ public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAudit @Override public FhirQueryAuditDataset enrichAuditDatasetFromRequest(FhirQueryAuditDataset auditDataset, Object request, Map parameters) { var dataset = super.enrichAuditDatasetFromRequest(auditDataset, request, parameters); - if (request instanceof IdType) { - var idType = (IdType) request; + if (request instanceof IdType idType) { dataset.getPatientIds().add(idType.getValue()); } return dataset; diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java index 224f12bda7..e15fc925c0 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti78/Iti78QueryResourceClientRequestFactory.java @@ -28,7 +28,7 @@ * @author Christian Ohr * @since 3.4 */ -public class Iti78QueryResourceClientRequestFactory extends QueryClientRequestFactory { +public class Iti78QueryResourceClientRequestFactory extends QueryClientRequestFactory { public Iti78QueryResourceClientRequestFactory() { super(Patient.class, Bundle.class); diff --git a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java index 2b226a4018..0a7534f5bc 100644 --- a/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java +++ b/commons/ihe/fhir/stu3/pixpdq/src/main/java/org/openehealth/ipf/commons/ihe/fhir/iti83/Iti83AuditStrategy.java @@ -20,7 +20,7 @@ import org.hl7.fhir.dstu3.model.StringType; import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.Constants; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; @@ -43,7 +43,7 @@ public Iti83AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.MobilePatientIdentifierCrossReferenceQuery) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobilePatientIdentifierCrossReferenceQuery) .addPatients(auditDataset.getPatientIds()) .setQueryParameters( "PIXmQuery", @@ -64,11 +64,9 @@ public FhirQueryAuditDataset enrichAuditDatasetFromRequest(FhirQueryAuditDataset .map(Parameters.ParametersParameterComponent::getValue) .findFirst().orElseThrow(() -> new RuntimeException("No sourceIdentifier in PIX query")); - if (sourceIdentifier instanceof Identifier) { - var identifier = (Identifier) sourceIdentifier; + if (sourceIdentifier instanceof Identifier identifier) { dataset.getPatientIds().add(String.format("%s|%s", identifier.getSystem(), identifier.getValue())); - } else if (sourceIdentifier instanceof StringType) { - var identifier = (StringType) sourceIdentifier; + } else if (sourceIdentifier instanceof StringType identifier) { dataset.getPatientIds().add(identifier.getValue()); } else { dataset.getPatientIds().add(sourceIdentifier.toString()); diff --git a/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java b/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java index 26d658cf83..4b25af4f44 100644 --- a/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java +++ b/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44AuditStrategy.java @@ -17,7 +17,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditDataset; import org.openehealth.ipf.commons.ihe.fhir.audit.FhirQueryAuditStrategy; import org.openehealth.ipf.commons.ihe.fhir.audit.codes.FhirEventTypeCode; @@ -36,7 +36,7 @@ public Pcc44AuditStrategy(boolean serverSide) { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FhirQueryAuditDataset auditDataset) { - return new QueryInformationBuilder<>(auditContext, auditDataset, FhirEventTypeCode.MobileQueryExistingData) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, FhirEventTypeCode.MobileQueryExistingData) .addPatients(auditDataset.getPatientIds()) .setQueryParameters("MobileQueryExistingData", FhirParticipantObjectIdTypeCode.MobileQueryExistingData, diff --git a/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java b/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java index caf980a297..416f345524 100644 --- a/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java +++ b/commons/ihe/fhir/stu3/qedm/src/main/java/org/openehealth/ipf/commons/ihe/fhir/pcc44/Pcc44ClientRequestFactory.java @@ -46,7 +46,7 @@ public class Pcc44ClientRequestFactory implements ClientRequestFactory[] criteria = (ICriterion[]) requestData; + var criteria = (ICriterion[]) requestData; if (criteria.length > 0) { query = query.where(criteria[0]); if (criteria.length > 1) { diff --git a/commons/ihe/hl7v2/pom.xml b/commons/ihe/hl7v2/pom.xml index 04acfaf68b..60e4670b59 100644 --- a/commons/ihe/hl7v2/pom.xml +++ b/commons/ihe/hl7v2/pom.xml @@ -62,11 +62,6 @@ micrometer-tracing true - - io.micrometer - micrometer-tracing-bridge-brave - test - io.netty netty-handler @@ -90,6 +85,11 @@ ${project.version} test + + io.micrometer + micrometer-tracing-bridge-brave + test + diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/audit/AuditUtils.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/audit/AuditUtils.groovy index 628eaa8876..47353d7d70 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/audit/AuditUtils.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/audit/AuditUtils.groovy @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory * @author Dmytro Rud */ class AuditUtils { - private static final transient Logger LOG = LoggerFactory.getLogger(AuditUtils.class) + private static final transient Logger log = LoggerFactory.getLogger(AuditUtils.class) private AuditUtils() { throw new IllegalStateException('Helper class, do not instantiate') diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy index 9ed53146b8..263344b551 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageGetter.groovy @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory */ class Hl7MessageGetter implements Propagator.Getter { - private static final Logger LOG = LoggerFactory.getLogger(Hl7MessageGetter) + private static final Logger log = LoggerFactory.getLogger(Hl7MessageGetter) private final String segmentName Hl7MessageGetter(String segmentName = 'ZTR') { @@ -43,8 +43,8 @@ class Hl7MessageGetter implements Propagator.Getter { def qip = qips ? qips().find { q -> q[1].value == key } : null String value = qip ? qip[2]?.value : null - if (LOG.isDebugEnabled()) { - LOG.debug("Extracted trace context with key [{}] and value [{}]", key, value) + if (log.isDebugEnabled()) { + log.debug("Extracted trace context with key [{}] and value [{}]", key, value) } value } diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy index ae7ada6bcf..e07a972d4f 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/Hl7MessageSetter.groovy @@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory */ class Hl7MessageSetter implements Propagator.Setter { - private static final Logger LOG = LoggerFactory.getLogger(Hl7MessageSetter) + private static final Logger log = LoggerFactory.getLogger(Hl7MessageSetter) private final String segmentName @@ -53,8 +53,8 @@ class Hl7MessageSetter implements Propagator.Setter { def varies = nextRepetition(seg[1]) varies.data = qip - if (LOG.isDebugEnabled()) { - LOG.debug("Added trace context with key [{}] and value [{}]", key, value) + if (log.isDebugEnabled()) { + log.debug("Added trace context with key [{}] and value [{}]", key, value) } } } diff --git a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy index 6dd15c762e..5b01314297 100644 --- a/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy +++ b/commons/ihe/hl7v2/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v2/tracing/MessageTracer.groovy @@ -40,7 +40,7 @@ class MessageTracer { private final Tracer tracer private final boolean removeSegment private final String segmentName - private final Propagator propagator; + private final Propagator propagator private final Propagator.Setter setter private final Propagator.Getter getter @@ -56,7 +56,7 @@ class MessageTracer { this.segmentName = segmentName this.setter = new Hl7MessageSetter(segmentName) this.getter = new Hl7MessageGetter(segmentName) - this.propagator = propagator; + this.propagator = propagator } void sendMessage(Message msg, String name, Handler sender) { diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/Hl7v2AcceptanceException.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/Hl7v2AcceptanceException.java index a2aea83b7d..66fb76612f 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/Hl7v2AcceptanceException.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/Hl7v2AcceptanceException.java @@ -25,8 +25,6 @@ */ public class Hl7v2AcceptanceException extends HL7Exception { - private static final long serialVersionUID = -954901285020747868L; - public Hl7v2AcceptanceException(String message, ErrorCode code) { super(message, code); } diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/QpdAwareNakFactory.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/QpdAwareNakFactory.java index 08fd9b7e8f..a3751c441b 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/QpdAwareNakFactory.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/QpdAwareNakFactory.java @@ -34,7 +34,7 @@ */ public class QpdAwareNakFactory extends NakFactory { - private static final Logger LOG = LoggerFactory.getLogger(QpdAwareNakFactory.class); + private static final Logger log = LoggerFactory.getLogger(QpdAwareNakFactory.class); private final String messageType, triggerEvent; @@ -68,7 +68,7 @@ public Message createNak0(Message originalMessage, HL7Exception e, Acknowledgmen messageType, triggerEvent); - LOG.info("Creating NAK response event of type {}", ack.getClass().getName()); + log.info("Creating NAK response event of type {}", ack.getClass().getName()); e.populateResponse(ack, ackTypeCode, 0); @@ -80,7 +80,7 @@ public Message createNak0(Message originalMessage, HL7Exception e, Acknowledgmen if (origQpd != null) { var queryTag = Terser.get(origQpd, 2, 0, 1, 1); Terser.set(ackQak, 1, 0, 1, 1, queryTag); - LOG.debug("Set QAK-1 to {}", queryTag); + log.debug("Set QAK-1 to {}", queryTag); } Terser.set(ackQak, 2, 0, 1, 1, "AE"); diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/MllpAuditDataset.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/MllpAuditDataset.java index 9f54def442..b002eb77b4 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/MllpAuditDataset.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/MllpAuditDataset.java @@ -20,6 +20,7 @@ import org.openehealth.ipf.commons.audit.utils.AuditUtils; import org.openehealth.ipf.commons.ihe.core.atna.AuditDataset; +import java.io.Serial; import java.util.Collections; import java.util.List; @@ -31,6 +32,7 @@ */ public abstract class MllpAuditDataset extends AuditDataset { + @Serial private static final long serialVersionUID = -4427222097816361541L; /** diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti10/Iti10AuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti10/Iti10AuditStrategy.java index 4638c433d2..05721c5fcc 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti10/Iti10AuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti10/Iti10AuditStrategy.java @@ -20,9 +20,9 @@ import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PatientRecordEventBuilder; -import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPatientRecordEventBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.QueryAuditDataset; +import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; import java.util.Map; @@ -45,7 +45,7 @@ public QueryAuditDataset enrichAuditDatasetFromRequest(QueryAuditDataset auditDa @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, QueryAuditDataset auditDataset) { - return new PatientRecordEventBuilder( + return new DefaultPatientRecordEventBuilder( auditContext, auditDataset, isServerSide() ? EventActionCode.Update : EventActionCode.Read, diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti30/Iti30AuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti30/Iti30AuditStrategy.java index 97e477ad50..9d83e1877a 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti30/Iti30AuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti30/Iti30AuditStrategy.java @@ -21,7 +21,7 @@ import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PatientRecordEventBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPatientRecordEventBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.FeedAuditDataset; import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; @@ -41,33 +41,27 @@ public FeedAuditDataset enrichAuditDatasetFromRequest(FeedAuditDataset auditData @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FeedAuditDataset auditDataset) { - switch (auditDataset.getMessageType()) { - case "A28": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) - }; - case "A31": - case "A47": - case "A24": - case "A37": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - case "A40": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - default: + return switch (auditDataset.getMessageType()) { + case "A28" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) + }; + case "A31", "A47", "A24", "A37" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + case "A40" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + default -> throw new AuditException("Cannot create audit message for event " + auditDataset.getMessageType()); - } + }; } protected AuditMessage patientRecordAuditMessage(AuditContext auditContext, final FeedAuditDataset auditDataset, EventActionCode eventActionCode, boolean newPatientId) { - return new PatientRecordEventBuilder<>(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityManagement) + return new DefaultPatientRecordEventBuilder(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityManagement) // Type=MSH-10 (the literal string), Value=the value of MSH-10 (from the message content, base64 encoded) .addPatients( diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti31/Iti31AuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti31/Iti31AuditStrategy.java index 841cdc567f..65c8ad82cf 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti31/Iti31AuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti31/Iti31AuditStrategy.java @@ -21,7 +21,7 @@ import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PatientRecordEventBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPatientRecordEventBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.FeedAuditDataset; import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; @@ -42,59 +42,31 @@ public FeedAuditDataset enrichAuditDatasetFromRequest(FeedAuditDataset auditData @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FeedAuditDataset auditDataset) { - switch (auditDataset.getMessageType()) { - case "A01": - case "A04": - case "A05": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) - }; - case "A02": - case "A03": - case "A06": - case "A07": - case "A08": - case "A09": - case "A10": - case "A12": - case "A13": - case "A14": - case "A15": - case "A16": - case "A25": - case "A26": - case "A27": - case "A32": - case "A33": - case "A38": - case "A44": - case "A52": - case "A53": - case "A54": - case "A55": - case "Z99": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - case "A40": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - case "A41": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, true) - }; - default: + return switch (auditDataset.getMessageType()) { + case "A01", "A04", "A05" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) + }; + case "A02", "A03", "A06", "A07", "A08", "A09", "A10", "A12", "A13", "A14", "A15", "A16", "A25", "A26", + "A27", "A32", "A33", "A38", "A44", "A52", "A53", "A54", "A55", "Z99" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + case "A40" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + case "A41" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, true) + }; + default -> throw new AuditException("Cannot create audit message for event " + auditDataset.getMessageType()); - } + }; } protected AuditMessage patientRecordAuditMessage(AuditContext auditContext, final FeedAuditDataset auditDataset, EventActionCode eventActionCode, boolean newPatientId) { - return new PatientRecordEventBuilder<>(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityManagement) + return new DefaultPatientRecordEventBuilder(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityManagement) // Type=MSH-10 (the literal string), Value=the value of MSH-10 (from the message content, base64 encoded) .addPatients( diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti64/IHEPatientRecordChangeLinkBuilder.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti64/IHEPatientRecordChangeLinkBuilder.java index b4bd4b9c27..f47563fc3e 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti64/IHEPatientRecordChangeLinkBuilder.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti64/IHEPatientRecordChangeLinkBuilder.java @@ -133,8 +133,4 @@ public IHEPatientRecordChangeLinkBuilder setSubmissionSet(Iti64AuditDataset audi return this; } - @Override - public void validate() { - super.validate(); - } } diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti8/Iti8AuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti8/Iti8AuditStrategy.java index 21d0de9a68..8d2b658ed7 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti8/Iti8AuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti8/Iti8AuditStrategy.java @@ -21,7 +21,7 @@ import org.openehealth.ipf.commons.audit.codes.EventActionCode; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.PatientRecordEventBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPatientRecordEventBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.FeedAuditDataset; import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; @@ -46,25 +46,20 @@ public FeedAuditDataset createAuditDataset() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, FeedAuditDataset auditDataset) { - switch (auditDataset.getMessageType()) { - case "A01": - case "A04": - case "A05": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) - }; - case "A08": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - case "A40": - return new AuditMessage[]{ - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), - patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) - }; - default: + return switch (auditDataset.getMessageType()) { + case "A01", "A04", "A05" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Create, true) + }; + case "A08" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + case "A40" -> new AuditMessage[]{ + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Delete, false), + patientRecordAuditMessage(auditContext, auditDataset, EventActionCode.Update, true) + }; + default -> throw new AuditException("Cannot create audit message for event " + auditDataset.getMessageType()); - } + }; } @@ -72,7 +67,7 @@ protected AuditMessage patientRecordAuditMessage(AuditContext auditContext, final FeedAuditDataset auditDataset, EventActionCode eventActionCode, boolean newPatientId) { - return new PatientRecordEventBuilder<>(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityFeed) + return new DefaultPatientRecordEventBuilder(auditContext, auditDataset, eventActionCode, MllpEventTypeCode.PatientIdentityFeed) // Type=MSH-10 (the literal string), Value=the value of MSH-10 (from the message content, base64 encoded) .addPatients( diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti9/Iti9AuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti9/Iti9AuditStrategy.java index 6b2695a076..fa38a2b027 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti9/Iti9AuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/iti9/Iti9AuditStrategy.java @@ -19,7 +19,7 @@ import org.openehealth.ipf.commons.audit.AuditContext; import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; import org.openehealth.ipf.commons.ihe.hl7v2.audit.QueryAuditDataset; @@ -54,7 +54,7 @@ public boolean enrichAuditDatasetFromResponse(QueryAuditDataset auditDataset, @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, QueryAuditDataset auditDataset) { - return new QueryInformationBuilder(auditContext,auditDataset, MllpEventTypeCode.PIXQuery) + return new DefaultQueryInformationBuilder(auditContext,auditDataset, MllpEventTypeCode.PIXQuery) .setQueryParameters( auditDataset.getMessageControlId(), PIXQuery, diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/pdqcore/PdqAuditStrategy.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/pdqcore/PdqAuditStrategy.java index baf275873c..2500c07699 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/pdqcore/PdqAuditStrategy.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/audit/pdqcore/PdqAuditStrategy.java @@ -20,7 +20,7 @@ import org.openehealth.ipf.commons.audit.model.AuditMessage; import org.openehealth.ipf.commons.audit.types.ParticipantObjectIdType; import org.openehealth.ipf.commons.ihe.core.atna.AuditStrategySupport; -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder; +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder; import org.openehealth.ipf.commons.ihe.hl7v2.audit.codes.MllpEventTypeCode; import org.openehealth.ipf.commons.ihe.hl7v2.audit.QueryAuditDataset; @@ -63,7 +63,7 @@ public QueryAuditDataset createAuditDataset() { @Override public AuditMessage[] makeAuditMessage(AuditContext auditContext, QueryAuditDataset auditDataset) { - return new QueryInformationBuilder(auditContext, auditDataset, eventTypeCode) + return new DefaultQueryInformationBuilder(auditContext, auditDataset, eventTypeCode) .setQueryParameters( auditDataset.getMessageControlId(), participantObjectIdType, diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pam/v25/message/ADT_A01.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pam/v25/message/ADT_A01.java index 1ce11016d9..718f063d14 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pam/v25/message/ADT_A01.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pam/v25/message/ADT_A01.java @@ -52,7 +52,6 @@ protected Map, Cardinality> structures(Map, Cardinality> structures(Map, Cardinality> structures(Map, Cardinality> structures(Map, Cardinality> structures(Map, Cardinality> structures(Map, Cardinality> structures(Map new CE(getMessage()); + case 1, 4, 5, 6 -> new ST(getMessage()); + case 2 -> new QIP(getMessage()); + case 3 -> new NM(getMessage()); + case 7 -> new CX(getMessage()); + default -> null; + }; } } \ No newline at end of file diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pix/v231/message/ADT_A01.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pix/v231/message/ADT_A01.java index c768c32e6e..33d1cd1616 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pix/v231/message/ADT_A01.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/definitions/pix/v231/message/ADT_A01.java @@ -45,7 +45,6 @@ protected Map, Cardinality> structures(Map new CE(getMessage()); + case 1 -> new ST(getMessage()); + case 2, 3 -> new CX(getMessage()); + default -> null; + }; } } \ No newline at end of file diff --git a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/storage/JCacheInteractiveContinuationStorage.java b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/storage/JCacheInteractiveContinuationStorage.java index cc97b713c2..e6bf7378e3 100644 --- a/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/storage/JCacheInteractiveContinuationStorage.java +++ b/commons/ihe/hl7v2/src/main/java/org/openehealth/ipf/commons/ihe/hl7v2/storage/JCacheInteractiveContinuationStorage.java @@ -34,7 +34,7 @@ */ public class JCacheInteractiveContinuationStorage implements InteractiveContinuationStorage { - private static final Logger LOG = LoggerFactory.getLogger(JCacheInteractiveContinuationStorage.class); + private static final Logger log = LoggerFactory.getLogger(JCacheInteractiveContinuationStorage.class); private final Cache cache; @@ -48,7 +48,7 @@ public JCacheInteractiveContinuationStorage(Cache validate(maxMsgReplace("^PRN^PH^^^^123456", "^^PH^wan@continua.com^001^760^123456^02^Any text^GA"))); } diff --git a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01MSHValidatorTest.java b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01MSHValidatorTest.java similarity index 94% rename from commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01MSHValidatorTest.java rename to commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01MSHValidatorTest.java index cbd6fd2ced..9a33406c63 100644 --- a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01MSHValidatorTest.java +++ b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01MSHValidatorTest.java @@ -24,7 +24,7 @@ * @author Kingsley Nwaigbo * */ -public class QA_Pcd01MSHValidatorTest extends AbstractPCD01ValidatorTest { +public class QAPcd01MSHValidatorTest extends AbstractPCD01ValidatorTest { @Test public void testMaximalMessage() throws HL7Exception { diff --git a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBRValidatorTest.java b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBRValidatorTest.java similarity index 95% rename from commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBRValidatorTest.java rename to commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBRValidatorTest.java index 6618ac64db..aa820feaf3 100644 --- a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBRValidatorTest.java +++ b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBRValidatorTest.java @@ -27,7 +27,7 @@ * */ @Disabled -public class QA_Pcd01OBRValidatorTest extends AbstractPCD01ValidatorTest { +public class QAPcd01OBRValidatorTest extends AbstractPCD01ValidatorTest { @Test public void testMaximalMessage() throws HL7Exception { diff --git a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBXValidatorTest.java b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBXValidatorTest.java similarity index 95% rename from commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBXValidatorTest.java rename to commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBXValidatorTest.java index b5add56929..1ca51328d7 100644 --- a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01OBXValidatorTest.java +++ b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01OBXValidatorTest.java @@ -29,7 +29,7 @@ * */ @Disabled -public class QA_Pcd01OBXValidatorTest extends AbstractPCD01ValidatorTest { +public class QAPcd01OBXValidatorTest extends AbstractPCD01ValidatorTest { @Test public void testSyntheticMessageTrimmed() throws HL7Exception{ @@ -64,7 +64,7 @@ public void testOBX2_SN() { @Disabled @Test - public void testMissingOBX2_filledOBX11() throws HL7Exception { + public void testMissingOBX2_filledOBX11() { // The check "OBX-2 must be valued if the value of OBX-11 is not X" seems to be too restrictive // add the checkOBX2WhenOBX11NotX in PCD01Validator to switch on the check. assertThrows(ValidationException.class, () -> diff --git a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01PIDPV1ValidatorTest.java b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01PIDPV1ValidatorTest.java similarity index 94% rename from commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01PIDPV1ValidatorTest.java rename to commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01PIDPV1ValidatorTest.java index e029bbb7fb..40f87bae3b 100644 --- a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QA_Pcd01PIDPV1ValidatorTest.java +++ b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/pcd01/QAPcd01PIDPV1ValidatorTest.java @@ -24,7 +24,7 @@ * @author Kingsley Nwaigbo * */ -public class QA_Pcd01PIDPV1ValidatorTest extends AbstractPCD01ValidatorTest { +public class QAPcd01PIDPV1ValidatorTest extends AbstractPCD01ValidatorTest { // ################ PID Segment tests ############################### diff --git a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/wan/ContinuaWanValidatorTest.java b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/wan/ContinuaWanValidatorTest.java index 7472ec3c1b..0a1f55bbaa 100644 --- a/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/wan/ContinuaWanValidatorTest.java +++ b/commons/ihe/hl7v2ws/src/test/java/org/openehealth/ipf/commons/ihe/hl7v2ws/wan/ContinuaWanValidatorTest.java @@ -84,6 +84,7 @@ public void testInvalidResponseMessage() { assertThrows(ValidationException.class, () -> validate(load(getParser(), "wan/invalid-wan-response.hl7v2"))); } + @Test @Disabled @Override public void testSyntheticResponseMessage() { diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditStrategy.groovy index 7c3da957fc..36cd105544 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditStrategy.groovy @@ -30,7 +30,7 @@ import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.iiToCx */ abstract class Hl7v3AuditStrategy extends AuditStrategySupport { - private static final transient Logger LOG = LoggerFactory.getLogger(Hl7v3AuditStrategy.class) + private static final transient Logger log = LoggerFactory.getLogger(Hl7v3AuditStrategy.class) Hl7v3AuditStrategy(boolean serverSide) { super(serverSide) @@ -67,7 +67,7 @@ abstract class Hl7v3AuditStrategy extends AuditStrategySupport 0 ? auditDataset.patientIds.head() : null) : auditDataset.oldPatientId - return new PatientRecordEventBuilder<>(auditContext, auditDataset, eventActionCode, Hl7v3EventTypeCode.PatientIdentityFeed, auditDataset.purposesOfUse) + return new DefaultPatientRecordEventBuilder(auditContext, auditDataset, eventActionCode, Hl7v3EventTypeCode.PatientIdentityFeed, auditDataset.purposesOfUse) // Type=II (the literal string), Value=the value of the message ID (from the message content, base64 encoded) .addPatients("II", auditDataset.messageId, patientId) diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti45/Iti45AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti45/Iti45AuditStrategy.groovy index 04d4258d63..147c6a5e5d 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti45/Iti45AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti45/Iti45AuditStrategy.groovy @@ -18,16 +18,13 @@ package org.openehealth.ipf.commons.ihe.hl7v3.iti45 import groovy.xml.slurpersupport.GPathResult import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.model.AuditMessage -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditStrategy import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode +import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.* import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.PIXQuery -import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.idString -import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.iiToCx -import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.render - /** * @author Dmytro Rud */ @@ -74,7 +71,7 @@ class Iti45AuditStrategy extends Hl7v3AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - new QueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.PIXQuery, auditDataset.getPurposesOfUse()) + new DefaultQueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.PIXQuery, auditDataset.getPurposesOfUse()) .addPatients(auditDataset.patientIds) .setQueryParameters(auditDataset.messageId, PIXQuery, auditDataset.requestPayload) .getMessages() diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti46/Iti46AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti46/Iti46AuditStrategy.groovy index e01ef1743b..0be7aa92ea 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti46/Iti46AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti46/Iti46AuditStrategy.groovy @@ -18,7 +18,7 @@ package org.openehealth.ipf.commons.ihe.hl7v3.iti46 import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.codes.EventActionCode import org.openehealth.ipf.commons.audit.model.AuditMessage -import org.openehealth.ipf.commons.ihe.core.atna.event.PatientRecordEventBuilder +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultPatientRecordEventBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditStrategy import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode @@ -51,7 +51,7 @@ class Iti46AuditStrategy extends Hl7v3AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - new PatientRecordEventBuilder( + new DefaultPatientRecordEventBuilder( auditContext, auditDataset, isServerSide() ? EventActionCode.Update : EventActionCode.Read, diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti47/Iti47AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti47/Iti47AuditStrategy.groovy index afab6e9bbb..7660e010db 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti47/Iti47AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti47/Iti47AuditStrategy.groovy @@ -18,14 +18,14 @@ package org.openehealth.ipf.commons.ihe.hl7v3.iti47 import groovy.xml.slurpersupport.GPathResult import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.model.AuditMessage -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditStrategy import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode -import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.PatientDemographicsQuery import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.idString import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.render +import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.PatientDemographicsQuery /** * @author Dmytro Rud @@ -74,7 +74,7 @@ class Iti47AuditStrategy extends Hl7v3AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - new QueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.PatientDemographicsQuery, auditDataset.getPurposesOfUse()) + new DefaultQueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.PatientDemographicsQuery, auditDataset.getPurposesOfUse()) .setQueryParameters(auditDataset.messageId, PatientDemographicsQuery, auditDataset.requestPayload) .addPatients(auditDataset.patientIds) .getMessages() diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55AuditStrategy.groovy index 4c38523569..6afbd46da2 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55AuditStrategy.groovy @@ -17,14 +17,14 @@ package org.openehealth.ipf.commons.ihe.hl7v3.iti55 import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.model.AuditMessage +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder import org.openehealth.ipf.commons.ihe.core.atna.event.IHEAuditMessageBuilder -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode import org.openehealth.ipf.commons.ihe.hl7v3.iti47.Iti47AuditStrategy -import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.CrossGatewayPatientDiscovery import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.idString +import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.CrossGatewayPatientDiscovery /** * Generic audit strategy for ITI-55 (XCPD). @@ -54,7 +54,7 @@ class Iti55AuditStrategy extends Iti47AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - QueryInformationBuilder builder = new QueryInformationBuilder<>(auditContext, auditDataset, Hl7v3EventTypeCode.CrossGatewayPatientDiscovery, auditDataset.getPurposesOfUse()) + def builder = new DefaultQueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.CrossGatewayPatientDiscovery, auditDataset.getPurposesOfUse()) // No patient identifiers are included for the Initiating Gateway if (isServerSide()) { builder.addPatients(auditDataset.patientIds) diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55Utils.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55Utils.groovy index 14d7b68139..a2ca3718c0 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55Utils.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti55/Iti55Utils.groovy @@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory * @author Dmytro Rud */ abstract class Iti55Utils { - private static final transient Logger LOG = LoggerFactory.getLogger(Iti55Utils.class) + private static final transient Logger log = LoggerFactory.getLogger(Iti55Utils.class) private Iti55Utils() { throw new IllegalStateException('cannot instantiate helper class') diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti56/Iti56AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti56/Iti56AuditStrategy.groovy index a1ddb3ffa4..0653600cad 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti56/Iti56AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/iti56/Iti56AuditStrategy.groovy @@ -19,15 +19,15 @@ import groovy.xml.slurpersupport.GPathResult import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.codes.EventOutcomeIndicator import org.openehealth.ipf.commons.audit.model.AuditMessage -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditStrategy import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode import org.slf4j.Logger import org.slf4j.LoggerFactory -import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.PatientLocationQuery import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.iiToCx +import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.PatientLocationQuery /** * Generic audit strategy for ITI-56 (XCPD). @@ -36,7 +36,7 @@ import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.iiToCx */ class Iti56AuditStrategy extends Hl7v3AuditStrategy { - private static final Logger LOG = LoggerFactory.getLogger(Iti56AuditStrategy) + private static final Logger log = LoggerFactory.getLogger(Iti56AuditStrategy) Iti56AuditStrategy(boolean serverSide) { super(serverSide) @@ -57,7 +57,7 @@ class Iti56AuditStrategy extends Hl7v3AuditStrategy { (gpath.namespaceURI() == 'urn:ihe:iti:xcpd:2009')) ? EventOutcomeIndicator.Success : EventOutcomeIndicator.SeriousFailure } catch (Exception e) { - LOG.error('Exception in ITI-56 audit strategy', e) + log.error('Exception in ITI-56 audit strategy', e) return EventOutcomeIndicator.MajorFailure } } @@ -71,7 +71,7 @@ class Iti56AuditStrategy extends Hl7v3AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - new QueryInformationBuilder<>(auditContext, auditDataset, Hl7v3EventTypeCode.PatientLocationQuery, auditDataset.getPurposesOfUse()) + new DefaultQueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.PatientLocationQuery, auditDataset.getPurposesOfUse()) .addPatients(auditDataset.patientIds) .setQueryParameters("PatientLocationQueryRequest", PatientLocationQuery, auditDataset.requestPayload) .getMessages() diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/pcc1/Pcc1AuditStrategy.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/pcc1/Pcc1AuditStrategy.groovy index dc52ecd0bb..250d549ff5 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/pcc1/Pcc1AuditStrategy.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/pcc1/Pcc1AuditStrategy.groovy @@ -18,15 +18,14 @@ package org.openehealth.ipf.commons.ihe.hl7v3.pcc1 import groovy.xml.slurpersupport.GPathResult import org.openehealth.ipf.commons.audit.AuditContext import org.openehealth.ipf.commons.audit.model.AuditMessage -import org.openehealth.ipf.commons.ihe.core.atna.event.QueryInformationBuilder +import org.openehealth.ipf.commons.ihe.core.atna.event.DefaultQueryInformationBuilder import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditDataset import org.openehealth.ipf.commons.ihe.hl7v3.audit.Hl7v3AuditStrategy import org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3EventTypeCode -import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.QueryExistingData import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.idString import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.render - +import static org.openehealth.ipf.commons.ihe.hl7v3.audit.codes.Hl7v3ParticipantObjectIdTypeCode.QueryExistingData /** * @author Dmytro Rud */ @@ -49,7 +48,8 @@ class Pcc1AuditStrategy extends Hl7v3AuditStrategy { // patient IDs from request def patientIds = [] as Set addPatientIds(qbp.parameterList.patientId.value, patientIds) - auditDataset.setPatientIds(patientIds.toArray(new String[patientIds.size()]) ?: null) + String[] patientIdArray = patientIds.toArray(new String[patientIds.size()]) + auditDataset.setPatientIds(patientIdArray ?: null) // dump of the "queryByParameter" element auditDataset.requestPayload = render(qbp) @@ -58,7 +58,7 @@ class Pcc1AuditStrategy extends Hl7v3AuditStrategy { @Override AuditMessage[] makeAuditMessage(AuditContext auditContext, Hl7v3AuditDataset auditDataset) { - new QueryInformationBuilder<>(auditContext, auditDataset, Hl7v3EventTypeCode.QueryExistingData, auditDataset.getPurposesOfUse()) + new DefaultQueryInformationBuilder(auditContext, auditDataset, Hl7v3EventTypeCode.QueryExistingData, auditDataset.getPurposesOfUse()) .setQueryParameters(auditDataset.messageId, QueryExistingData, auditDataset.requestPayload) .addPatients(auditDataset.patientIds) .getMessages() diff --git a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/translation/Utils.groovy b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/translation/Utils.groovy index ebf9e3ab21..c92a5d79fe 100644 --- a/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/translation/Utils.groovy +++ b/commons/ihe/hl7v3/src/main/groovy/org/openehealth/ipf/commons/ihe/hl7v3/translation/Utils.groovy @@ -33,7 +33,7 @@ import static org.openehealth.ipf.commons.ihe.hl7v3.Hl7v3Utils.* class Utils { public static final String HL7V2_NULL = '""' - private static final Pattern OID_PATTERN = Pattern.compile("[1-9][0-9]*(\\.(0|([1-9][0-9]*)))+"); + private static final Pattern OID_PATTERN = Pattern.compile("[1-9][0-9]*(\\.(0|([1-9][0-9]*)))+") /** * Returns the next repetition of the given HL7 v2 field/segment/etc. diff --git a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/Hl7v3ValidationProfile.java b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/Hl7v3ValidationProfile.java index e0bd5fecd7..fc0364eba4 100644 --- a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/Hl7v3ValidationProfile.java +++ b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/Hl7v3ValidationProfile.java @@ -30,7 +30,7 @@ public class Hl7v3ValidationProfile implements CombinedXmlValidationProfile { public static final String DEFAULT_XSD = ""; public static final String GAZELLE_PIXPDQV3_SCHEMATRON = "/schematron/gazelle-pixpdqv3.sch.xml"; - static class Row { + public static class Row { private static final String HL7V3_SCHEMAS_PATH = "/schema/HL7V3/NE2008/multicacheschemas/"; @Getter final String rootElementName; diff --git a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditDataset.java b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditDataset.java index 82b294f8c6..acae63457a 100644 --- a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditDataset.java +++ b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/audit/Hl7v3AuditDataset.java @@ -19,6 +19,8 @@ import lombok.Setter; import org.openehealth.ipf.commons.ihe.ws.cxf.audit.WsAuditDataset; +import java.io.Serial; + /** * Generic audit dataset for IHE PIX/PDQ v3 transactions. @@ -27,6 +29,7 @@ */ public class Hl7v3AuditDataset extends WsAuditDataset { + @Serial private static final long serialVersionUID = -7303748425104562452L; /** HL7v3 message ID. */ diff --git a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/storage/EhcacheHl7v3ContinuationStorage.java b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/storage/EhcacheHl7v3ContinuationStorage.java index 3e78b2ca72..18a7d78c28 100644 --- a/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/storage/EhcacheHl7v3ContinuationStorage.java +++ b/commons/ihe/hl7v3/src/main/java/org/openehealth/ipf/commons/ihe/hl7v3/storage/EhcacheHl7v3ContinuationStorage.java @@ -21,8 +21,6 @@ import java.io.Serializable; -import static java.util.Objects.requireNonNull; - /** * @author Dmytro Rud * @author Christian Ohr diff --git a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/DoubleAdapter.java b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/DoubleAdapter.java index 0d42a8c002..a58844453f 100644 --- a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/DoubleAdapter.java +++ b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/DoubleAdapter.java @@ -12,10 +12,9 @@ public class DoubleAdapter extends XmlAdapter{ * * @param v the double to be marshalled * @return the marshaling - * @throws Exception the exception thrown if problem during marshalling - */ + */ @Override - public String marshal(final Double v) throws Exception { + public String marshal(final Double v) { if ((v != null) && !Double.isInfinite(v) && !Double.isNaN(v)) { return String.valueOf(v.doubleValue()); } @@ -27,10 +26,9 @@ public String marshal(final Double v) throws Exception { * * @param v the String to be unmarshalled. * @return the double, result of unmarshalling. - * @throws Exception thrown if problem of unmarshalling. - */ + */ @Override - public Double unmarshal(final String v) throws Exception { + public Double unmarshal(final String v) { if ((v == null) || (v.isEmpty())){ return null; } diff --git a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/IntegerAdapter.java b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/IntegerAdapter.java index bd5263a3d7..e8bc5b7b50 100644 --- a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/IntegerAdapter.java +++ b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/adapters/IntegerAdapter.java @@ -5,7 +5,7 @@ public class IntegerAdapter extends XmlAdapter{ @Override - public String marshal(final Integer v) throws Exception { + public String marshal(final Integer v) { if (v != null) { return String.valueOf(v.intValue()); } @@ -13,7 +13,7 @@ public String marshal(final Integer v) throws Exception { } @Override - public Integer unmarshal(final String v) throws Exception { + public Integer unmarshal(final String v) { if ((v == null) || (v.isEmpty())){ return null; } diff --git a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/com/templates/Template.java b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/com/templates/Template.java index 3454670261..f5d7fa2397 100644 --- a/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/com/templates/Template.java +++ b/commons/ihe/hl7v3model/src/main/java/net/ihe/gazelle/com/templates/Template.java @@ -8,9 +8,11 @@ package net.ihe.gazelle.com.templates; +import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; @@ -52,7 +54,8 @@ public class Template implements Serializable { /** * */ - private static final long serialVersionUID = 1L; + @Serial + private static final long serialVersionUID = 1L; private List templateId; @@ -147,11 +150,7 @@ public List