TEIV: Fix ordering of items in responses 14/14314/1
authorJvD_Ericsson <jeff.van.dam@est.tech>
Thu, 10 Apr 2025 09:14:10 +0000 (10:14 +0100)
committerJeff van Dam <jeff.van.dam@est.tech>
Thu, 10 Apr 2025 10:49:25 +0000 (10:49 +0000)
- Added specific yang modles for testing,
  and updated tests and sql schemas to show this

Issue-ID: SMO-186
Issue-ID: SMO-185
Change-Id: I651a548e00ab79508de344e73091fcea6a52b8e4
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
120 files changed:
teiv/src/main/java/org/oran/smo/teiv/CachedBodyHttpServletRequest.java [moved from teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyHttpServletRequest.java with 52% similarity]
teiv/src/main/java/org/oran/smo/teiv/CachedBodyServletInputStream.java [moved from teiv/src/main/java/org/oran/smo/teiv/groups/utils/CachedBodyServletInputStream.java with 98% similarity]
teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java [new file with mode: 0644]
teiv/src/main/java/org/oran/smo/teiv/exception/YangParsingException.java
teiv/src/main/java/org/oran/smo/teiv/exposure/OranTeivErrorJsonMessage.java [moved from teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditInfo.java with 52% similarity]
teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java [new file with mode: 0644]
teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRestController.java
teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java [new file with mode: 0644]
teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRestController.java
teiv/src/main/java/org/oran/smo/teiv/exposure/exception/ApplicationExceptionHandler.java
teiv/src/main/java/org/oran/smo/teiv/exposure/spi/DataRepository.java
teiv/src/main/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImpl.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/AndOrLogicalBlock.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/EmptyLogicalBlock.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/InnerFilterCriteria.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/LogicalBlock.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/ScopeLogicalBlock.java
teiv/src/main/java/org/oran/smo/teiv/exposure/teivpath/refiner/PathToJooqRefinement.java
teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupCreationRequestFilter.java [moved from teiv/src/main/java/org/oran/smo/teiv/groups/utils/GroupCreationRequestFilter.java with 86% similarity]
teiv/src/main/java/org/oran/smo/teiv/groups/rest/controller/GroupsController.java
teiv/src/main/java/org/oran/smo/teiv/groups/spi/impl/GroupsRepositoryImpl.java
teiv/src/main/java/org/oran/smo/teiv/listener/CreateTopologyProcessor.java
teiv/src/main/java/org/oran/smo/teiv/listener/DeleteTopologyProcessor.java
teiv/src/main/java/org/oran/smo/teiv/listener/MergeTopologyProcessor.java
teiv/src/main/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessor.java
teiv/src/main/java/org/oran/smo/teiv/listener/audit/IngestionAuditLogger.java
teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistry.java
teiv/src/main/java/org/oran/smo/teiv/schema/SchemaRegistryErrorCode.java
teiv/src/main/java/org/oran/smo/teiv/service/TeivDbOperations.java
teiv/src/main/java/org/oran/smo/teiv/service/kafka/KafkaTopicService.java
teiv/src/main/java/org/oran/smo/teiv/service/models/OperationResult.java
teiv/src/main/java/org/oran/smo/teiv/startup/AppInit.java
teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java [new file with mode: 0644]
teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java [new file with mode: 0644]
teiv/src/main/java/org/oran/smo/teiv/utils/YangParser.java
teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/ExposureYangParser.java
teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/IngestionYangParser.java
teiv/src/main/java/org/oran/smo/teiv/utils/yangparser/YangModelLoader.java
teiv/src/main/resources/v1/topology-exposure-inventory-kafka-asyncapi.yaml
teiv/src/test/java/org/oran/smo/teiv/db/TestPostgresqlContainer.java
teiv/src/test/java/org/oran/smo/teiv/exposure/api/contract/TopologyExposureApiBase.java
teiv/src/test/java/org/oran/smo/teiv/exposure/spi/impl/DataRepositoryImplGETRequestsContainerizedTest.java
teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/innerlanguage/DtoToJooqTest.java
teiv/src/test/java/org/oran/smo/teiv/exposure/teivpath/refiner/BasePathRefinementTest.java
teiv/src/test/java/org/oran/smo/teiv/groups/TopologyGroupsApiBase.java
teiv/src/test/java/org/oran/smo/teiv/ingestion/validation/IngestionOperationValidatorTest.java
teiv/src/test/java/org/oran/smo/teiv/listener/CreateTopologyProcessorTest.java
teiv/src/test/java/org/oran/smo/teiv/listener/DeleteTopologyProcessorTest.java
teiv/src/test/java/org/oran/smo/teiv/listener/MergeTopologyProcessorTest.java
teiv/src/test/java/org/oran/smo/teiv/listener/SourceEntityDeleteTopologyProcessorTest.java
teiv/src/test/java/org/oran/smo/teiv/schema/SchemaRegistryTest.java
teiv/src/test/java/org/oran/smo/teiv/service/EndToEndDbTest.java
teiv/src/test/java/org/oran/smo/teiv/service/TeivDbOperationResultsTest.java
teiv/src/test/java/org/oran/smo/teiv/utils/CloudEventTestUtil.java
teiv/src/test/java/org/oran/smo/teiv/utils/EndToEndTestUtil.java
teiv/src/test/java/org/oran/smo/teiv/utils/ExposureYangParserTest.java
teiv/src/test/java/org/oran/smo/teiv/utils/IngestionYangParserTest.java
teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java [new file with mode: 0644]
teiv/src/test/resources/cloudeventdata/common/ce-invalid-entity-attribute.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-inferred.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-many-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-many3.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-one-to-one.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-relationship-connecting-same-entity.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-create-second-case.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-one-to-one.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-delete-relationship-connecting-same-entity.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-long-names.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-many-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/ce-merge-one-to-many2.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-inferred.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-many-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-one-to-one.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-create-second-case.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-delete-one-to-one.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-many-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/exp-merge-one-to-many.json
teiv/src/test/resources/cloudeventdata/end-to-end/expected-results/not-exp-delete-one-to-one.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one2.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one3.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one4.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one5.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one6.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one7.json
teiv/src/test/resources/cloudeventdata/validation/one-to-one/ce-create-one-to-one8.json
teiv/src/test/resources/contracts/exposure/classifiers/01_getClassifiers_getRelationshipsByType.groovy
teiv/src/test/resources/contracts/exposure/classifiers/04_postClassifiers_delete.groovy
teiv/src/test/resources/contracts/exposure/data/00_getAllDomains.groovy
teiv/src/test/resources/contracts/exposure/data/01_getTopologyEntityTypes.groovy
teiv/src/test/resources/contracts/exposure/data/02_getTopologyByEntityTypeName.groovy
teiv/src/test/resources/contracts/exposure/data/03_getTopologyById.groovy
teiv/src/test/resources/contracts/exposure/data/04_getAllRelationshipsForEntityId.groovy
teiv/src/test/resources/contracts/exposure/data/05_getRelationshipTypes.groovy
teiv/src/test/resources/contracts/exposure/data/06_getRelationshipsByType.groovy
teiv/src/test/resources/contracts/exposure/data/07_getRelationshipById.groovy
teiv/src/test/resources/contracts/exposure/data/08_getEntitiesByDomain.groovy
teiv/src/test/resources/contracts/exposure/decorators/04_postDecoratorsDelete.groovy
teiv/src/test/resources/contracts/exposure/schemas/00_getAllSchemas.groovy
teiv/src/test/resources/contracts/exposure/schemas/01_getSchemaContent.groovy
teiv/src/test/resources/contracts/exposure/schemas/02_postSchemas.groovy
teiv/src/test/resources/contracts/exposure/schemas/03_deleteSchemas.groovy
teiv/src/test/resources/contracts/groups/00_createGroup.groovy
teiv/src/test/resources/contracts/groups/01_getGroups.groovy
teiv/src/test/resources/contracts/groups/02_getGroupById.groovy
teiv/src/test/resources/contracts/groups/03_deleteGroup.groovy
teiv/src/test/resources/contracts/groups/04_putGroup.groovy
teiv/src/test/resources/contracts/groups/05_getMembers.groovy
teiv/src/test/resources/contracts/groups/06_getProvidedMembers.groovy
teiv/src/test/resources/contracts/groups/07_updateProvidedMembers.groovy
teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql [new file with mode: 0644]
teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql [new file with mode: 0644]
teiv/src/test/resources/pgsqlschema/ingestion-test-data.sql
teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang [new file with mode: 0644]
teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang [new file with mode: 0644]
teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang [new file with mode: 0644]
teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang [new file with mode: 0644]
teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang [new file with mode: 0644]

@@ -1,7 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2024 Ericsson
- *  Modifications Copyright (C) 2024-2025 OpenInfra Foundation Europe
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.teiv.groups.utils;
+
+package org.oran.smo.teiv;
+
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
 
-import org.springframework.util.StreamUtils;
-
-import jakarta.servlet.ServletInputStream;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletRequestWrapper;
-
 public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
+    private final byte[] requestBody;
 
-    private final byte[] cachedBody;
-
-    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
+    public CachedBodyHttpServletRequest(final HttpServletRequest request) throws IOException {
         super(request);
-        InputStream requestInputStream = request.getInputStream();
-        this.cachedBody = StreamUtils.copyToByteArray(requestInputStream);
+        this.requestBody = readRequestBody(request);
     }
 
     @Override
-    public ServletInputStream getInputStream() throws IOException {
-        return new CachedBodyServletInputStream(this.cachedBody);
+    public ServletInputStream getInputStream() {
+        return new CachedBodyServletInputStream(this.requestBody);
     }
 
     @Override
-    public BufferedReader getReader() throws IOException {
-        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody);
-        return new BufferedReader(new InputStreamReader(byteArrayInputStream, StandardCharsets.UTF_8));
+    public BufferedReader getReader() {
+        return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(requestBody), StandardCharsets.UTF_8));
+    }
+
+    public String getRequestBody() {
+        return new String(requestBody, StandardCharsets.UTF_8);
+    }
+
+    private byte[] readRequestBody(final HttpServletRequest request) throws IOException {
+        StringBuilder body = new StringBuilder();
+        char[] buffer = new char[1024];
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),
+                StandardCharsets.UTF_8))) {
+            int bytesRead;
+            while ((bytesRead = reader.read(buffer)) != -1) {
+                body.append(buffer, 0, bytesRead);
+            }
+        }
+        return body.toString().getBytes(StandardCharsets.UTF_8);
     }
 }
@@ -18,7 +18,7 @@
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.teiv.groups.utils;
+package org.oran.smo.teiv;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
diff --git a/teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/RequestFilter.java
new file mode 100644 (file)
index 0000000..01f51ea
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
+import jakarta.servlet.Filter;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
+import org.oran.smo.teiv.exposure.OranTeivErrorJsonMessage;
+import org.springframework.http.HttpStatus;
+
+import java.io.IOException;
+import java.util.List;
+
+public abstract class RequestFilter implements Filter {
+    protected void writeError(final ServletResponse servletResponse, final JsonProcessingException exception,
+            final String message) throws IOException {
+        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
+        httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        httpResponse.setContentType("application/problem+json");
+        final OranTeivErrorJsonMessage errorMessage = OranTeivErrorJsonMessage.extendedBuilder().status(
+                HttpStatus.BAD_REQUEST.name()).message(message).details(getErrorDetails(exception)).build();
+        httpResponse.getWriter().write(errorMessage.toJson());
+        httpResponse.getWriter().flush();
+    }
+
+    private String getErrorDetails(JsonProcessingException exception) {
+        String details;
+        if (exception instanceof ValueInstantiationException e && exception
+                .getCause()instanceof IllegalArgumentException cause) {
+            final Class<?> targetType = e.getType().getRawClass();
+            details = cause.getMessage() + ". Invalid value for " + targetType.getSimpleName() + ", allowed values: " + List
+                    .of(targetType.getEnumConstants());
+        } else {
+            details = exception.getOriginalMessage();
+        }
+        return details;
+    }
+}
index 9ea5529..1f63c95 100644 (file)
@@ -21,6 +21,9 @@
 package org.oran.smo.teiv.exception;
 
 public class YangParsingException extends YangException {
+    private YangParsingException(final String message) {
+        super(message);
+    }
 
     public YangParsingException(final String message, final Throwable cause) {
         super(message, cause);
@@ -29,4 +32,8 @@ public class YangParsingException extends YangException {
     public static YangParsingException failedIOExecution(Exception e) {
         return new YangParsingException("Failed to execute IO operation", e);
     }
+
+    public static YangParsingException modelDirectoryDoesNotExists() {
+        return new YangParsingException("Model directory does not exist");
+    }
 }
@@ -1,7 +1,6 @@
 /*
  *  ============LICENSE_START=======================================================
- *  Copyright (C) 2024 Ericsson
- *  Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.teiv.listener.audit;
 
-import static org.oran.smo.teiv.listener.audit.ExecutionStatus.SUCCESS;
-
-import org.apache.commons.lang3.StringUtils;
+package org.oran.smo.teiv.exposure;
 
 import lombok.Builder;
+import org.oran.smo.teiv.api.model.OranTeivErrorMessage;
 
-@Builder
-public class IngestionAuditInfo {
-    private final ExecutionStatus status;
-    private final String operation;
-    private final String messageKey;
-    private final String cloudEvent;
-    private final String exceptionMessage;
-
-    @Override
-    public String toString() {
-        String baseMessage = String.format("%s - %s topology. Message key: %s, CloudEvent: %s", status, StringUtils
-                .capitalize(operation), messageKey, cloudEvent);
+public class OranTeivErrorJsonMessage extends OranTeivErrorMessage {
+    @Builder(builderMethodName = "extendedBuilder")
+    public OranTeivErrorJsonMessage(String status, final String message, final String details) {
+        super(status, message, details);
+    }
 
-        return status.equals(SUCCESS) ? baseMessage : (baseMessage + ", " + exceptionMessage);
+    public String toJson() {
+        return "{" + "\"status\": \"" + this.getStatus() + "\"," + "\"message\": \"" + this
+                .getMessage() + "\"," + "\"details\": \"" + this.getDetails() + "\"}";
     }
 }
diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/classifiers/rest/controller/ClassifiersRequestFilter.java
new file mode 100644 (file)
index 0000000..9137abc
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv.exposure.classifiers.rest.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.oran.smo.teiv.CustomMetrics;
+import org.oran.smo.teiv.RequestFilter;
+import org.oran.smo.teiv.api.model.OranTeivClassifier;
+import org.oran.smo.teiv.exposure.audit.LoggerHandler;
+import org.oran.smo.teiv.CachedBodyHttpServletRequest;
+import org.springframework.context.annotation.Profile;
+
+import java.io.IOException;
+
+@Slf4j
+@Profile("exposure")
+@RequiredArgsConstructor
+public class ClassifiersRequestFilter extends RequestFilter {
+    private final LoggerHandler loggerHandler;
+    private final ObjectMapper objectMapper;
+    private final CustomMetrics customMetrics;
+
+    @Override
+    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
+            final FilterChain filterChain) throws IOException, ServletException {
+        if (servletRequest instanceof HttpServletRequest request) {
+            CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request);
+            if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) {
+                final String payload = cachedBodyHttpServletRequest.getRequestBody();
+                try {
+                    objectMapper.readValue(payload, OranTeivClassifier.class);
+                    filterChain.doFilter(cachedBodyHttpServletRequest, servletResponse);
+                } catch (final JsonProcessingException exception) {
+                    customMetrics.incrementNumUnsuccessfullyUpdatedClassifiers();
+                    final String logMsg = String.format(
+                            "Failed to process the request to merge/remove classifiers. Exception= %s , Payload= %s",
+                            exception.getMessage(), payload);
+                    loggerHandler.logAudit(log, logMsg, cachedBodyHttpServletRequest);
+                    writeError(servletResponse, exception, "Failed to process the request to merge/remove classifiers");
+                }
+            }
+        } else {
+            filterChain.doFilter(servletRequest, servletResponse);
+        }
+    }
+}
index edc7484..a4a7d59 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import io.micrometer.core.annotation.Timed;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -39,12 +40,17 @@ import org.oran.smo.teiv.exposure.audit.LoggerHandler;
 import org.oran.smo.teiv.exposure.classifiers.api.ClassifiersService;
 import org.oran.smo.teiv.utils.TeivConstants;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Profile;
+import org.springframework.core.Ordered;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING;
+
 @Slf4j
 @RestController
 @RequestMapping(TeivConstants.REQUEST_MAPPING)
@@ -97,4 +103,13 @@ public class ClassifiersRestController implements ClassifiersApi {
             throw ex;
         }
     }
+
+    @Bean
+    public FilterRegistrationBean<ClassifiersRequestFilter> classifiersRequestFilter(final ObjectMapper objectMapper) {
+        FilterRegistrationBean<ClassifiersRequestFilter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(new ClassifiersRequestFilter(loggerHandler, objectMapper, customMetrics));
+        registrationBean.addUrlPatterns(REQUEST_MAPPING + "/classifiers");
+        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
+        return registrationBean;
+    }
 }
diff --git a/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java b/teiv/src/main/java/org/oran/smo/teiv/exposure/decorators/rest/controller/DecoratorsRequestFilter.java
new file mode 100644 (file)
index 0000000..a75aa7f
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv.exposure.decorators.rest.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.oran.smo.teiv.CachedBodyHttpServletRequest;
+import org.oran.smo.teiv.CustomMetrics;
+import org.oran.smo.teiv.RequestFilter;
+import org.oran.smo.teiv.api.model.OranTeivDecorator;
+import org.oran.smo.teiv.exposure.audit.LoggerHandler;
+import org.springframework.context.annotation.Profile;
+
+import java.io.IOException;
+
+@Slf4j
+@Profile("exposure")
+@RequiredArgsConstructor
+public class DecoratorsRequestFilter extends RequestFilter {
+    private final LoggerHandler loggerHandler;
+    private final ObjectMapper objectMapper;
+    private final CustomMetrics customMetrics;
+
+    @Override
+    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
+            final FilterChain filterChain) throws IOException, ServletException {
+        if (servletRequest instanceof HttpServletRequest request) {
+            CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(request);
+            if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) {
+                final String payload = cachedBodyHttpServletRequest.getRequestBody();
+                try {
+                    objectMapper.readValue(payload, OranTeivDecorator.class);
+                    filterChain.doFilter(cachedBodyHttpServletRequest, servletResponse);
+                } catch (final JsonProcessingException exception) {
+                    customMetrics.incrementNumUnsuccessfullyUpdatedDecorators();
+                    final String logMsg = String.format(
+                            "Failed to process the request to merge/remove decorators. Exception= %s , Payload= %s",
+                            exception.getMessage(), payload);
+                    loggerHandler.logAudit(log, logMsg, cachedBodyHttpServletRequest);
+                    writeError(servletResponse, exception, "Failed to process the request to merge/remove decorators");
+                }
+            }
+        } else {
+            filterChain.doFilter(servletRequest, servletResponse);
+        }
+    }
+
+}
index 9a460f4..53b3575 100644 (file)
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.servlet.http.HttpServletRequest;
 
 import io.micrometer.core.annotation.Timed;
@@ -37,17 +39,21 @@ import org.oran.smo.teiv.exception.TeivException;
 import org.oran.smo.teiv.exposure.audit.AuditMapper;
 import org.oran.smo.teiv.exposure.audit.LoggerHandler;
 import org.oran.smo.teiv.exposure.decorators.api.DecoratorsService;
-import org.oran.smo.teiv.utils.TeivConstants;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Profile;
+import org.springframework.core.Ordered;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING;
+
 @Slf4j
 @RestController
-@RequestMapping(TeivConstants.REQUEST_MAPPING)
+@RequestMapping(REQUEST_MAPPING)
 @RequiredArgsConstructor
 @Profile("exposure")
 public class DecoratorsRestController implements DecoratorsApi {
@@ -97,4 +103,13 @@ public class DecoratorsRestController implements DecoratorsApi {
             throw ex;
         }
     }
+
+    @Bean
+    public FilterRegistrationBean<DecoratorsRequestFilter> decoratorsRequestFilter(final ObjectMapper objectMapper) {
+        FilterRegistrationBean<DecoratorsRequestFilter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(new DecoratorsRequestFilter(loggerHandler, objectMapper, customMetrics));
+        registrationBean.addUrlPatterns(REQUEST_MAPPING + "/decorators");
+        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
+        return registrationBean;
+    }
 }
index 113a0f5..90bb607 100644 (file)
@@ -38,6 +38,8 @@ import org.springframework.web.context.request.WebRequest;
 import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
 import org.springframework.web.servlet.resource.NoResourceFoundException;
 
+import static org.oran.smo.teiv.utils.ResponseUtil.getHeadersContentTypeAppProblemJson;
+
 @Slf4j
 @ControllerAdvice
 public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler {
@@ -48,8 +50,9 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler
         if (exception.getException() != null) {
             log.error(exception.getMessage(), exception.getException());
         }
-        return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).details(exception
-                .getDetails()).status(exception.getStatus().name()), exception.getStatus());
+        return ResponseEntity.status(exception.getStatus()).headers(getHeadersContentTypeAppProblemJson()).body(
+                OranTeivErrorMessage.builder().status(exception.getStatus().name()).message(exception.getMessage()).details(
+                        exception.getDetails()).build());
     }
 
     @ResponseBody
@@ -58,8 +61,9 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler
         if (exception.getResponse() != null) {
             return new ResponseEntity<>(exception.getResponse(), HttpStatus.OK);
         } else {
-            return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).details(exception
-                    .getDetails()).status(exception.getHttpStatus().name()), exception.getHttpStatus());
+            return ResponseEntity.status(exception.getHttpStatus()).headers(getHeadersContentTypeAppProblemJson()).body(
+                    OranTeivErrorMessage.builder().status(exception.getHttpStatus().name()).message(exception.getMessage())
+                            .details(exception.getDetails()).build());
         }
     }
 
@@ -67,28 +71,32 @@ public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler
     @ExceptionHandler(Exception.class)
     protected ResponseEntity<OranTeivErrorMessage> handleGeneralException(final Exception ex) {
         log.error("Handling general exception", ex);
-        return new ResponseEntity<>(new OranTeivErrorMessage().status(HttpStatus.INTERNAL_SERVER_ERROR.name()),
-                HttpStatus.INTERNAL_SERVER_ERROR);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(getHeadersContentTypeAppProblemJson()).body(
+                new OranTeivErrorMessage().status(HttpStatus.INTERNAL_SERVER_ERROR.name()));
     }
 
     @ResponseBody
     @ExceptionHandler(ConstraintViolationException.class)
     public ResponseEntity<OranTeivErrorMessage> handleConstraintViolationException(ConstraintViolationException exception) {
-        return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST
-                .name()), HttpStatus.BAD_REQUEST);
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body(
+                getBadRequestErrorMessage(exception));
     }
 
     @Override
     protected ResponseEntity<Object> handleNoResourceFoundException(NoResourceFoundException exception, HttpHeaders headers,
             HttpStatusCode status, WebRequest request) {
-        return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST
-                .name()), HttpStatus.BAD_REQUEST);
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body(
+                getBadRequestErrorMessage(exception));
     }
 
     @Override
     protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException exception,
             HttpHeaders headers, HttpStatusCode status, WebRequest request) {
-        return new ResponseEntity<>(new OranTeivErrorMessage().message(exception.getMessage()).status(HttpStatus.BAD_REQUEST
-                .name()), HttpStatus.BAD_REQUEST);
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).headers(getHeadersContentTypeAppProblemJson()).body(
+                getBadRequestErrorMessage(exception));
+    }
+
+    public static OranTeivErrorMessage getBadRequestErrorMessage(final Exception e) {
+        return OranTeivErrorMessage.builder().status(HttpStatus.BAD_REQUEST.name()).message(e.getMessage()).build();
     }
 }
index 64b7df1..cfc1eb7 100644 (file)
@@ -138,5 +138,5 @@ public interface DataRepository {
      *     The id
      * @return true if exists, false if it does not
      */
-    boolean isTopologyExist(final Persistable type, final String id);
+    boolean doesTopologyExist(final Persistable type, final String id);
 }
index 21799c9..934ab10 100644 (file)
@@ -175,7 +175,7 @@ public class DataRepositoryImpl implements DataRepository {
     }
 
     @Override
-    public boolean isTopologyExist(final Persistable type, final String id) {
+    public boolean doesTopologyExist(final Persistable type, final String id) {
         return runMethodSafe(() -> readDataDslContext.fetchExists(readDataDslContext.selectFrom(table(type.getTableName()))
                 .where(field(name(type.getIdColumnName())).eq(id))));
     }
index 5cb0c3d..dc180ae 100644 (file)
@@ -45,10 +45,10 @@ public abstract class AndOrLogicalBlock extends LogicalBlock {
     }
 
     @Override
-    public Set<Pair<String, Field>> getJoinCondition() {
+    public Set<Pair<String, Field>> getWhereExistsConditions() {
         Set<Pair<String, Field>> tables = new LinkedHashSet<>();
-        tables.addAll(children.get(0).getJoinCondition());
-        tables.addAll(children.get(1).getJoinCondition());
+        tables.addAll(children.get(0).getWhereExistsConditions());
+        tables.addAll(children.get(1).getWhereExistsConditions());
         return tables;
     }
 
index 4358fb6..f2ee75e 100644 (file)
@@ -53,7 +53,7 @@ public class EmptyLogicalBlock extends LogicalBlock {
         return Collections.emptySet();
     }
 
-    public Set<Pair<String, Field>> getJoinCondition() {
+    public Set<Pair<String, Field>> getWhereExistsConditions() {
         return Collections.emptySet();
     }
 }
index 17c4bbd..4299a6d 100644 (file)
@@ -74,11 +74,10 @@ public class InnerFilterCriteria {
         return tables;
     }
 
-    public Set<Pair<String, Field>> getJoinCondition() {
-        Set<Pair<String, Field>> joins = new LinkedHashSet<>();
-        joins.addAll(scope.getJoinCondition());
-
-        return joins;
+    public Set<Pair<String, Field>> getWhereExistsCondition() {
+        Set<Pair<String, Field>> whereExistsCondition = new LinkedHashSet<>();
+        whereExistsCondition.addAll(scope.getWhereExistsConditions());
+        return whereExistsCondition;
     }
 
     public Map<SelectField, Map<SelectField, DataType>> getSelects() {
index 29465d4..7bf92e1 100644 (file)
@@ -36,5 +36,5 @@ public abstract class LogicalBlock {
 
     public abstract Set<Table> getTables();
 
-    public abstract Set<Pair<String, Field>> getJoinCondition();
+    public abstract Set<Pair<String, Field>> getWhereExistsConditions();
 }
index f0c1330..bcfcdd6 100644 (file)
@@ -35,13 +35,16 @@ import org.oran.smo.teiv.schema.RelationshipDataLocation;
 import org.oran.smo.teiv.schema.SchemaRegistry;
 import org.oran.smo.teiv.utils.query.exception.TeivPathException;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
+import static org.jooq.impl.DSL.exists;
 import static org.jooq.impl.DSL.field;
+import static org.jooq.impl.DSL.selectOne;
 import static org.jooq.impl.DSL.table;
 import static org.oran.smo.teiv.exposure.teivpath.innerlanguage.TopologyObjectType.ASSOCIATION;
 import static org.oran.smo.teiv.utils.PersistableUtil.getTableNameWithColumnName;
@@ -56,7 +59,26 @@ public class ScopeLogicalBlock extends LogicalBlock {
 
     @Override
     public Condition getCondition() {
-        return ConditionFactory.create(scopeObject).getCondition(scopeObject);
+        Condition scopeCondition = ConditionFactory.create(scopeObject).getCondition(scopeObject);
+        List<Pair<String, Field>> whereExistsConditions = new ArrayList<>(getWhereExistsConditions());
+        if (!whereExistsConditions.isEmpty()) {
+            if (whereExistsConditions.size() > 2) {
+                //error out as with in a scope block there cannot be more than two joins/where exists conditions(many to many)
+                throw TeivException.serverException("Server unknown exception",
+                        "More than two where exists condition within a logical block is not supported", null);
+            }
+            Condition existsCondition;
+            if (whereExistsConditions.size() == 1) {
+                existsCondition = exists(selectOne().from(whereExistsConditions.get(0).getLeft()).where(scopeCondition).and(
+                        whereExistsConditions.get(0).getRight()));
+            } else {
+                existsCondition = exists(selectOne().from(whereExistsConditions.get(0).getLeft()).where(
+                        whereExistsConditions.get(0).getRight()).andExists(selectOne().from(whereExistsConditions.get(1)
+                                .getLeft()).where(whereExistsConditions.get(1).getRight()).and(scopeCondition)));
+            }
+            return existsCondition;
+        }
+        return scopeCondition;
     }
 
     @Override
@@ -75,8 +97,8 @@ public class ScopeLogicalBlock extends LogicalBlock {
     }
 
     @SuppressWarnings({ "java:S1874" })
-    public Set<Pair<String, Field>> getJoinCondition() {
-        Set<Pair<String, Field>> joinCondition = new LinkedHashSet<>();
+    public Set<Pair<String, Field>> getWhereExistsConditions() {
+        Set<Pair<String, Field>> whereExistsCondition = new LinkedHashSet<>();
         String[] topologyObjectSplit = scopeObject.getTopologyObject().split("/");
         if (scopeObject.getTopologyObjectType().equals(ASSOCIATION) && SchemaRegistry.getEntityTypeByName(
                 topologyObjectSplit[0]) != null) {
@@ -87,26 +109,26 @@ public class ScopeLogicalBlock extends LogicalBlock {
                     entityType) || relation.getBSide().equals(entityType)).findFirst().orElseThrow(() -> TeivPathException
                             .invalidAssociation(entityType.getName(), association));
             if (isManyToMany(relationType)) {
-                String columnName = getColumnNameForManyToManyJoin(entityType, relationType);
-                String col1 = constructColumnNameForJoinCondition(relationType, columnName);
+                String columnName = getColumnNameForManyToManyWhereExists(entityType, relationType);
+                String col1 = constructColumnNameForWhereExistsCondition(relationType, columnName);
                 String col2 = getTableNameWithColumnName(entityType.getTableName(), ID_COLUMN_NAME);
-                joinCondition.add(constructJoinConditionPair(relationType.getTableName(), col1, col2));
+                whereExistsCondition.add(constructWhereExistsConditionPair(relationType.getTableName(), col1, col2));
 
-                if (isSecondJoinNeeded()) {
-                    joinCondition.add(getSecondJoinCondition(entityType, relationType));
+                if (isNestedWhereExistsRequired()) {
+                    whereExistsCondition.add(getNestedWhereExistsCondition(entityType, relationType));
                 }
-            } else if (isJoinNeeded(topologyObjectSplit, relationType)) {
-                String col1 = constructColumnNameForJoinCondition(relationType, relationType
+            } else if (isWhereExistsNeeded(topologyObjectSplit, relationType)) {
+                String col1 = constructColumnNameForWhereExistsCondition(relationType, relationType
                         .getNotStoringSideEntityIdColumnNameInStoringSideTable());
                 String col2 = getTableNameWithColumnName(relationType.getNotStoringSideTableName(), ID_COLUMN_NAME);
-                String tableName = getTableNameForJoin(topologyObjectSplit, relationType);
-                joinCondition.add(constructJoinConditionPair(tableName, col1, col2));
+                String tableName = getTableNameForWhereExists(topologyObjectSplit, relationType);
+                whereExistsCondition.add(constructWhereExistsConditionPair(tableName, col1, col2));
             }
         }
-        return joinCondition;
+        return whereExistsCondition;
     }
 
-    private boolean isSecondJoinNeeded() {
+    private boolean isNestedWhereExistsRequired() {
         return !scopeObject.getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals(
                 ContainerType.NOT_NULL);
     }
@@ -115,12 +137,12 @@ public class ScopeLogicalBlock extends LogicalBlock {
         return relationType.getRelationshipStorageLocation().equals(RelationshipDataLocation.RELATION);
     }
 
-    private boolean isJoinNeeded(String[] topologyObjectSplit, RelationType relationType) {
+    private boolean isWhereExistsNeeded(String[] topologyObjectSplit, RelationType relationType) {
         return !relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0]) || (!scopeObject
                 .getContainer().equals(ContainerType.ID) && !scopeObject.getContainer().equals(ContainerType.NOT_NULL));
     }
 
-    private static String getTableNameForJoin(String[] topologyObjectSplit, RelationType relationType) {
+    private static String getTableNameForWhereExists(String[] topologyObjectSplit, RelationType relationType) {
         if (relationType.getStoringSideEntityType().getName().equals(topologyObjectSplit[0])) {
             return relationType.getNotStoringSideTableName();
         } else {
@@ -128,22 +150,25 @@ public class ScopeLogicalBlock extends LogicalBlock {
         }
     }
 
-    private static Pair<String, Field> getSecondJoinCondition(EntityType entityType, RelationType relationType) {
-        EntityType entityTypeForSecondJoin;
-        String columnNameForSecondJoin;
+    private static Pair<String, Field> getNestedWhereExistsCondition(EntityType entityType, RelationType relationType) {
+        EntityType entityTypeForNestedWhereExists;
+        String columnNameForNestedWhereExists;
         if (!relationType.getASide().equals(entityType)) {
-            columnNameForSecondJoin = relationType.aSideColumnName();
-            entityTypeForSecondJoin = relationType.getASide();
+            columnNameForNestedWhereExists = relationType.aSideColumnName();
+            entityTypeForNestedWhereExists = relationType.getASide();
         } else {
-            columnNameForSecondJoin = relationType.bSideColumnName();
-            entityTypeForSecondJoin = relationType.getBSide();
+            columnNameForNestedWhereExists = relationType.bSideColumnName();
+            entityTypeForNestedWhereExists = relationType.getBSide();
         }
-        String col1ForSecondJoin = constructColumnNameForJoinCondition(relationType, columnNameForSecondJoin);
-        String col2ForSecondJoin = getTableNameWithColumnName(entityTypeForSecondJoin.getTableName(), ID_COLUMN_NAME);
-        return constructJoinConditionPair(entityTypeForSecondJoin.getTableName(), col1ForSecondJoin, col2ForSecondJoin);
+        String col1ForNestedWhereExists = constructColumnNameForWhereExistsCondition(relationType,
+                columnNameForNestedWhereExists);
+        String col2ForNestedWhereExists = getTableNameWithColumnName(entityTypeForNestedWhereExists.getTableName(),
+                ID_COLUMN_NAME);
+        return constructWhereExistsConditionPair(entityTypeForNestedWhereExists.getTableName(), col1ForNestedWhereExists,
+                col2ForNestedWhereExists);
     }
 
-    private static String getColumnNameForManyToManyJoin(EntityType entityType, RelationType relationType) {
+    private static String getColumnNameForManyToManyWhereExists(EntityType entityType, RelationType relationType) {
         if (relationType.getASide().equals(entityType)) {
             return relationType.aSideColumnName();
         } else {
@@ -151,11 +176,11 @@ public class ScopeLogicalBlock extends LogicalBlock {
         }
     }
 
-    private static String constructColumnNameForJoinCondition(RelationType relationType, String columnName) {
+    private static String constructColumnNameForWhereExistsCondition(RelationType relationType, String columnName) {
         return relationType.getTableName() + "." + String.format(QUOTED_STRING, columnName);
     }
 
-    private static Pair<String, Field> constructJoinConditionPair(String tableName, String col1, String col2) {
+    private static Pair<String, Field> constructWhereExistsConditionPair(String tableName, String col1, String col2) {
         Field equalsField = field(col1 + "=" + col2);
         return new ImmutablePair<>(tableName, equalsField);
     }
index 349cc3f..009dab7 100644 (file)
@@ -20,8 +20,6 @@
  */
 package org.oran.smo.teiv.exposure.teivpath.refiner;
 
-import org.apache.commons.lang3.tuple.Pair;
-import org.jooq.Field;
 import org.jooq.JSONB;
 import org.jooq.OrderField;
 import org.jooq.Record;
@@ -109,10 +107,6 @@ public class PathToJooqRefinement {
         }
         SelectJoinStep<Record> query = select(resolvedFields).from(filterCriteria.getTableFromTarget(filterCriteria
                 .getTargets().get(0)));
-        List<Pair<String, Field>> joinConditions = new ArrayList<>(filterCriteria.getJoinCondition());
-        for (int i = 0; i < joinConditions.size(); i++) {
-            query = query.join(joinConditions.get(i).getLeft()).on(joinConditions.get(i).getRight());
-        }
         SelectConditionStep<Record> conditionStep = query.where(filterCriteria.getCondition());
         if (countMode) {
             return conditionStep;
  *  SPDX-License-Identifier: Apache-2.0
  *  ============LICENSE_END=========================================================
  */
-package org.oran.smo.teiv.groups.utils;
+package org.oran.smo.teiv.groups.rest.controller;
 
 import static org.oran.smo.teiv.groups.audit.ExecutionStatus.FAILED;
 import static org.oran.smo.teiv.groups.audit.GroupOperation.CREATE;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.oran.smo.teiv.CachedBodyHttpServletRequest;
 import org.oran.smo.teiv.exposure.audit.LoggerHandler;
 import org.oran.smo.teiv.groups.audit.AuditInfo;
 import org.springframework.context.annotation.Profile;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
 import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Component;
 import org.springframework.web.util.ContentCachingRequestWrapper;
 import org.springframework.web.util.ContentCachingResponseWrapper;
 
@@ -54,14 +49,12 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
-@Component
 @RequiredArgsConstructor
-@Order(Ordered.HIGHEST_PRECEDENCE)
 @Profile("groups")
 public class GroupCreationRequestFilter implements jakarta.servlet.Filter {
 
     private final LoggerHandler loggerHandler;
-    private final ObjectMapper objectMapper = new ObjectMapper();
+    private final ObjectMapper objectMapper;
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
@@ -70,7 +63,7 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter {
         CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest);
         ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper(
                 (HttpServletResponse) response);
-        String payloadString = readRequestBody(cachedBodyHttpServletRequest);
+        String payloadString = cachedBodyHttpServletRequest.getRequestBody();
         try {
             if (cachedBodyHttpServletRequest.getMethod().equalsIgnoreCase("POST")) {
                 JsonNode createGroupPayload = objectMapper.readValue(payloadString, JsonNode.class);
@@ -80,7 +73,7 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter {
                             payloadString).exceptionMessage(message).status(FAILED).build().toString(),
                             cachedBodyHttpServletRequest);
                     httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-                    httpServletResponse.setContentType("application/json");
+                    httpServletResponse.setContentType("application/problem+json");
                     httpServletResponse.getWriter().write(generateResponse(message));
                     httpServletResponse.getWriter().flush();
                     return;
@@ -125,16 +118,4 @@ public class GroupCreationRequestFilter implements jakarta.servlet.Filter {
         jsonResponse.put("status", HttpStatus.BAD_REQUEST);
         return objectMapper.writeValueAsString(jsonResponse);
     }
-
-    private String readRequestBody(HttpServletRequest request) throws IOException {
-        StringBuilder body = new StringBuilder();
-        try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),
-                StandardCharsets.UTF_8))) {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                body.append(line);
-            }
-        }
-        return body.toString();
-    }
 }
index 9e488bf..cad025f 100644 (file)
@@ -29,17 +29,19 @@ import static org.oran.smo.teiv.groups.audit.GroupOperation.REMOVE_PROVIDED_MEMB
 import static org.oran.smo.teiv.groups.audit.GroupOperation.UPDATE_NAME;
 import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.MEMBERS_HREF_TEMPLATE;
 import static org.oran.smo.teiv.groups.rest.controller.GroupsConstants.PROVIDED_MEMBERS_HREF_TEMPLATE;
+import static org.oran.smo.teiv.utils.ResponseUtil.getHeadersContentTypeAppProblemJson;
+import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING;
 
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.tuple.Pair;
 import org.oran.smo.teiv.api.model.OranTeivDynamicGroupByIdResponse;
 import org.oran.smo.teiv.api.model.OranTeivStaticGroupByIdResponse;
 import org.oran.smo.teiv.exposure.audit.LoggerHandler;
 import org.oran.smo.teiv.groups.audit.AuditInfo;
 import org.oran.smo.teiv.groups.audit.ExecutionStatus;
-import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Profile;
@@ -66,11 +68,10 @@ import org.oran.smo.teiv.api.model.OranTeivUpdateGroupNamePayload;
 import org.oran.smo.teiv.exposure.utils.RequestDetails;
 import org.oran.smo.teiv.groups.GroupsCustomMetrics;
 import org.oran.smo.teiv.groups.api.GroupsService;
-import org.oran.smo.teiv.utils.TeivConstants;
 
 @Slf4j
 @RestController
-@RequestMapping(TeivConstants.REQUEST_MAPPING)
+@RequestMapping(REQUEST_MAPPING)
 @RequiredArgsConstructor
 @Profile("groups")
 public class GroupsController implements GroupsApi {
@@ -195,7 +196,8 @@ public class GroupsController implements GroupsApi {
         final OranTeivErrorMessage errorMessage = OranTeivErrorMessage.builder().status(exception.getStatus().name())
                 .message(exception.getMessage()).details(exception.getDetails()).build();
 
-        return new ResponseEntity<>(errorMessage, exception.getStatus());
+        return ResponseEntity.status(exception.getStatus()).headers(getHeadersContentTypeAppProblemJson()).body(
+                errorMessage);
     }
 
     private <T> T runWithFailCheck(final Supplier<T> supp, final Runnable runnable) {
@@ -224,10 +226,10 @@ public class GroupsController implements GroupsApi {
     }
 
     @Bean
-    public FilterRegistrationBean<GroupCreationRequestFilter> loggingFilter() {
+    public FilterRegistrationBean<GroupCreationRequestFilter> loggingFilter(final ObjectMapper objectMapper) {
         FilterRegistrationBean<GroupCreationRequestFilter> registrationBean = new FilterRegistrationBean<>();
-        registrationBean.setFilter(new GroupCreationRequestFilter(loggerHandler));
-        registrationBean.addUrlPatterns("/groups");
+        registrationBean.setFilter(new GroupCreationRequestFilter(loggerHandler, objectMapper));
+        registrationBean.addUrlPatterns(REQUEST_MAPPING + "/groups");
         registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
         return registrationBean;
     }
index 9351839..877af76 100644 (file)
@@ -215,7 +215,7 @@ public class GroupsRepositoryImpl implements GroupsRepository {
 
     @Override
     public void createStaticGroup(final StaticGroupRecord groupRecord) {
-        log.debug("Create a static group with name {}", groupRecord.getGroupName());
+        log.debug("Create a static group with name: {}", groupRecord.getGroupName());
         writeDataDslContext.transaction((Configuration trx) -> {
             trx.dsl().insertInto(GROUPS_TABLE).set(GROUP_ID, groupRecord.getId()).set(GROUP_NAME, groupRecord
                     .getGroupName()).set(GROUP_TYPE, groupRecord.getGroupType()).execute();
index 671f4bf..b4ce191 100644 (file)
@@ -36,6 +36,7 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StopWatch;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE;
@@ -59,7 +60,7 @@ public class CreateTopologyProcessor implements TopologyProcessor {
         if (null == parsedCloudEventData) {
             log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent));
             customMetrics.incrementNumUnsuccessfullyParsedCreateCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey,
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey,
                     "Failed to parse the CloudEvent");
             return;
         }
@@ -70,28 +71,33 @@ public class CreateTopologyProcessor implements TopologyProcessor {
 
         stopWatch.start();
         List<OperationResult> operationResults;
+        List<String> inferredItems = new ArrayList<>();
         final String sourceAdapter = String.valueOf(cloudEvent.getSource());
         try {
             operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData,
                     sourceAdapter);
+            operationResults.stream().filter(OperationResult::isInferred).map(result -> String.format(
+                    "{\"%s:%s\":[{\"id\":\"%s\"}]}", result.getModule(), result.getType(), result.getId())).forEach(
+                            inferredItems::add);
         } catch (InvalidFieldInYangDataException e) {
             log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                     CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e
                     .getMessage());
             return;
         } catch (RuntimeException e) {
             log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                     CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedCreateCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, e
                     .getMessage());
             return;
         }
         stopWatch.stop();
         customMetrics.incrementNumSuccessfullyPersistedCreateCloudEvents();
         customMetrics.recordCloudEventCreatePersistTime(stopWatch.lastTaskInfo().getTimeNanos());
-        auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey, "");
+        auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_CREATE, cloudEvent, messageKey,
+                inferredItems);
     }
 }
index b8ea59c..c150f4c 100644 (file)
@@ -29,7 +29,6 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jooq.DSLContext;
 import org.oran.smo.teiv.CustomMetrics;
-import org.oran.smo.teiv.listener.audit.ExecutionStatus;
 import org.oran.smo.teiv.listener.audit.IngestionAuditLogger;
 import org.oran.smo.teiv.schema.EntityType;
 import org.oran.smo.teiv.schema.RelationType;
@@ -45,6 +44,9 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StopWatch;
 
+import static org.oran.smo.teiv.listener.audit.ExecutionStatus.FAILED;
+import static org.oran.smo.teiv.listener.audit.ExecutionStatus.SUCCESS;
+import static org.oran.smo.teiv.utils.OperationResultParser.fromOperationResults;
 import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_DELETE;
 
 @Component
@@ -68,7 +70,7 @@ public class DeleteTopologyProcessor implements TopologyProcessor {
         if (parsedCloudEventData == null) {
             log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent));
             customMetrics.incrementNumUnsuccessfullyParsedDeleteCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent");
+            auditLogger.logError(FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "Failed to parse the CloudEvent");
             return;
         }
         parsedCloudEventData.sort();
@@ -106,13 +108,13 @@ public class DeleteTopologyProcessor implements TopologyProcessor {
             log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                 CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedDeleteCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, e.getMessage());
+            auditLogger.logError(FAILED, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, e.getMessage());
             return;
         }
         stopWatch.stop();
         customMetrics.recordCloudEventDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos());
         customMetrics.incrementNumSuccessfullyPersistedDeleteCloudEvents();
-        auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, "");
+        auditLogger.logSuccess(SUCCESS, CLOUD_EVENT_WITH_TYPE_DELETE, cloudEvent, messageKey, fromOperationResults(operationResults));
     }
     //spotless:on
 }
index 920b915..44349ff 100644 (file)
@@ -65,7 +65,7 @@ public class MergeTopologyProcessor implements TopologyProcessor {
         if (null == parsedCloudEventData) {
             log.error("Failed to parse the following CloudEvent: {}", CloudEventUtil.cloudEventToPrettyString(cloudEvent));
             customMetrics.incrementNumUnsuccessfullyParsedMergeCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "Failed to parse the CloudEvent");
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "Failed to parse the CloudEvent");
             return;
         }
         parsedCloudEventData.sort();
@@ -75,27 +75,32 @@ public class MergeTopologyProcessor implements TopologyProcessor {
 
         stopWatch.start();
         List<OperationResult> operationResults = new ArrayList<>();
+        List<String> inferredItems = new ArrayList<>();
         final String sourceAdapter = String.valueOf(cloudEvent.getSource());
         try {
             operationResults = teivDbOperations.executeEntityAndRelationshipMergeOperations(parsedCloudEventData, sourceAdapter);
+            operationResults.stream()
+                .filter(OperationResult::isInferred)
+                .map(result -> String.format("{\"%s:%s\":[{\"id\":\"%s\"}]}", result.getModule(), result.getType(), result.getId()))
+                .forEach(inferredItems::add);
         } catch (InvalidFieldInYangDataException e) {
             log.error("Invalid field in yang data. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                 CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage());
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage());
             return;
         } catch (RuntimeException e) {
             log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                 CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedMergeCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage());
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, e.getMessage());
             return;
         }
         stopWatch.stop();
 
         customMetrics.incrementNumSuccessfullyPersistedMergeCloudEvents();
         customMetrics.recordCloudEventMergePersistTime(stopWatch.lastTaskInfo().getTimeNanos());
-        auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, "");
+        auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_MERGE, cloudEvent, messageKey, inferredItems);
     }
     //spotless:on
 }
index e8f5dba..b8d6258 100644 (file)
@@ -70,7 +70,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor {
         } catch (IOException e) {
             log.error("Error while parsing the {} event.", e.getMessage());
             customMetrics.incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
                     "Failed to parse the CloudEvent");
             return;
         }
@@ -80,7 +80,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor {
             log.error("Unsupported type: {} for source-entity-delete event. Event: {}", sourceEntityDelete.type,
                     cloudEvent);
             customMetrics.incrementNumReceivedCloudEventNotSupported();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
                     String.format("Unsupported type: %s for source-entity-delete event.", sourceEntityDelete.type));
             return;
         }
@@ -107,7 +107,7 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor {
             log.error("Failed to process a CloudEvent. Discarded CloudEvent: {}. Used kafka message key: {}. Reason: {}",
                     CloudEventUtil.cloudEventToPrettyString(cloudEvent), messageKey, e.getMessage());
             customMetrics.incrementNumUnsuccessfullyPersistedSourceEntityDeleteCloudEvents();
-            auditLogger.auditLog(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
+            auditLogger.logError(ExecutionStatus.FAILED, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
                     e.getMessage());
             return;
         }
@@ -115,8 +115,8 @@ public class SourceEntityDeleteTopologyProcessor implements TopologyProcessor {
         stopWatch.stop();
         customMetrics.recordCloudEventSourceEntityDeletePersistTime(stopWatch.lastTaskInfo().getTimeNanos());
         customMetrics.incrementNumSuccessfullyPersistedSourceEntityDeleteCloudEvents();
-        auditLogger.auditLog(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
-                "");
+        auditLogger.logSuccess(ExecutionStatus.SUCCESS, CLOUD_EVENT_WITH_TYPE_SOURCE_ENTITY_DELETE, cloudEvent, messageKey,
+                List.of());
     }
 
     @JsonIgnoreProperties(ignoreUnknown = true)
index e1068a4..c710f77 100644 (file)
@@ -20,6 +20,7 @@
  */
 package org.oran.smo.teiv.listener.audit;
 
+import org.apache.commons.lang3.StringUtils;
 import org.oran.smo.teiv.exposure.audit.LoggerHandler;
 import org.springframework.stereotype.Component;
 
@@ -28,6 +29,11 @@ import io.cloudevents.CloudEvent;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.List;
+
+import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_CREATE;
+import static org.oran.smo.teiv.utils.TeivConstants.CLOUD_EVENT_WITH_TYPE_MERGE;
+
 @Slf4j
 @AllArgsConstructor
 @Component
@@ -35,10 +41,25 @@ public class IngestionAuditLogger {
 
     private final LoggerHandler loggerHandler;
 
-    public void auditLog(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey,
+    public void logError(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey,
             String errorMsg) {
-        loggerHandler.logAuditBase(log, IngestionAuditInfo.builder().status(status).operation(operationType).messageKey(
-                messageKey).cloudEvent(CloudEventUtil.cloudEventToPrettyString(cloudEvent)).exceptionMessage(errorMsg)
-                .build().toString(), String.valueOf(cloudEvent.getSource()));
+        final String message = String.format("%s. Exception = %s", getMessage(status, operationType, cloudEvent,
+                messageKey), errorMsg);
+        loggerHandler.logAuditBase(log, message, cloudEvent.getSource().toString());
+    }
+
+    public void logSuccess(ExecutionStatus status, String operationType, CloudEvent cloudEvent, String messageKey,
+            List<String> inferred) {
+        final String message = String.format("%s. Implicitly %sd items = %s", getMessage(status, operationType, cloudEvent,
+                messageKey), operationType.equals(CLOUD_EVENT_WITH_TYPE_MERGE) ?
+                        CLOUD_EVENT_WITH_TYPE_CREATE :
+                        operationType, inferred);
+        loggerHandler.logAuditBase(log, message, cloudEvent.getSource().toString());
+    }
+
+    private String getMessage(final ExecutionStatus status, final String operation, final CloudEvent cloudEvent,
+            final String messageKey) {
+        return String.format("%s - %s topology. Message key: %s, CloudEvent: %s", status, StringUtils.capitalize(operation),
+                messageKey, CloudEventUtil.cloudEventToPrettyString(cloudEvent));
     }
 }
index 840bbde..6569ca6 100644 (file)
  */
 package org.oran.smo.teiv.schema;
 
+import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_ENTITY_NAME_IN_DOMAIN;
+import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN;
+import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_RELATION_NAME_IN_DOMAIN;
+import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_DOMAIN;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_MODULE;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE;
+import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DOMAIN;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -156,29 +161,44 @@ public class SchemaRegistry {
     }
 
     /**
-     * Gets the {@link EntityType} by the given module name and the entity type name.
+     * Gets the {@link EntityType} by the given domain name and the entity type name.
      * Since TEIV supports TEIV as top level domain on the exposure side, there is possibility to return more than one
-     * EntityType for a given name
-     * with domain as TIEV.
+     * EntityType for a given name with domain as TEIV. In this instance, an error will be thrown because this is not yet
+     * implemented in TEIV.
      *
      * @param domain
      *     - name of the domain
      * @param entityTypeName
      *     - name of the entityType
-     * @return the list of {@link EntityType}
+     * @return the {@link EntityType}
      * @throws SchemaRegistryException
      *     if entity type is not found in the domain
      */
-    public static List<EntityType> getEntityTypeByDomainAndName(final String domain, final String entityTypeName)
+    @Cacheable("entityTypeByDomainAndName")
+    public static EntityType getEntityTypeByDomainAndName(final String domain, final String entityTypeName)
             throws SchemaRegistryException {
-        final List<EntityType> matchedEntityTypes = entityTypes.stream().filter(entityType -> entityType.getModule()
-                .getDomain().equals(domain) && entityType.getName().equals(entityTypeName)).toList();
-        if (matchedEntityTypes.isEmpty()) {
+        final List<EntityType> matchedEntityTypes = getEntityTypesByDomain(domain).stream().filter(entityType -> entityType
+                .getName().equals(entityTypeName)).toList();
+        if (matchedEntityTypes.size() == 1) {
+            return matchedEntityTypes.get(0);
+        } else if (matchedEntityTypes.isEmpty()) {
             log.warn("Domain: {} does not contain the entity type: {}", domain, entityTypeName);
             throw new SchemaRegistryException(ENTITY_NOT_FOUND_IN_DOMAIN, String.format(
                     "Entity type: %s not found in domain: %s", entityTypeName, domain));
+        } else {
+            if (domain.equals(TEIV_DOMAIN)) {
+                log.warn("Domain: {} contains duplicate entity type: {}. This is yet to be implemented in TEIV.", domain,
+                        entityTypeName);
+                throw new SchemaRegistryException(DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN, String.format(
+                        "Duplicate entity type: %s found in domain: %s. This is yet to be implemented in TEIV.",
+                        entityTypeName, domain));
+            }
+            log.warn("Domain: {} contains duplicate entity type: {}. This is not supported in TEIV.", domain,
+                    entityTypeName);
+            throw new SchemaRegistryException(DUPLICATE_ENTITY_NAME_IN_DOMAIN, String.format(
+                    "Duplicate entity type: %s found in domain: %s. This is not supported in TEIV.", entityTypeName,
+                    domain));
         }
-        return matchedEntityTypes;
     }
 
     /**
@@ -290,28 +310,44 @@ public class SchemaRegistry {
     }
 
     /**
-     * Gets the {@link RelationType} (could be more than one when domain is TEIV) by the given module name and the relation
-     * type
-     * name.
+     * Gets the {@link RelationType} by the given domain name and the relation type name.
+     * Since TEIV supports TEIV as top level domain on the exposure side, there is possibility to return more than one
+     * RelationType for a given name with domain as TEIV. In this instance, an error will be thrown because this is not yet
+     * implemented in TEIV.
      *
      * @param domain
      *     - name of the domain
      * @param relationTypeName
      *     - name of the relation type
-     * @return the list of {@link RelationType}
+     * @return the {@link RelationType}
      * @throws SchemaRegistryException
      *     if relation type is not found in the domain
      */
-    public static List<RelationType> getRelationTypeByDomainAndName(final String domain, final String relationTypeName)
+    @Cacheable("relationTypeByDomainAndName")
+    public static RelationType getRelationTypeByDomainAndName(final String domain, final String relationTypeName)
             throws SchemaRegistryException {
-        final List<RelationType> matchedRelationTypes = relationTypes.stream().filter(relationType -> relationType
-                .getModule().getDomain().equals(domain) && relationType.getName().equals(relationTypeName)).toList();
-        if (matchedRelationTypes.isEmpty()) {
+        final List<RelationType> matchedRelationTypes = getRelationTypesByDomain(domain).stream().filter(
+                relationType -> relationType.getName().equals(relationTypeName)).toList();
+        if (matchedRelationTypes.size() == 1) {
+            return matchedRelationTypes.get(0);
+        } else if (matchedRelationTypes.isEmpty()) {
             log.warn("Domain: {} does not contain the relation type: {}", domain, relationTypeName);
             throw new SchemaRegistryException(RELATIONSHIP_NOT_FOUND_IN_DOMAIN, String.format(
                     "Relation type: %s not found in domain: %s", relationTypeName, domain));
+        } else {
+            if (domain.equals(TEIV_DOMAIN)) {
+                log.warn("Domain: {} contains duplicate relation type: {}. This is yet to be implemented in TEIV.", domain,
+                        relationTypeName);
+                throw new SchemaRegistryException(DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN, String.format(
+                        "Duplicate relation type: %s found in domain: %s. This is yet to be implemented in TEIV.",
+                        relationTypeName, domain));
+            }
+            log.warn("Domain: {} contains duplicate relation type: {}. This is not supported in TEIV.", domain,
+                    relationTypeName);
+            throw new SchemaRegistryException(DUPLICATE_RELATION_NAME_IN_DOMAIN, String.format(
+                    "Duplicate relation type: %s found in domain: %s. This is not supported in TEIV.", relationTypeName,
+                    domain));
         }
-        return matchedRelationTypes;
     }
 
     /**
index 7b48051..a3e3d4f 100644 (file)
@@ -26,6 +26,10 @@ package org.oran.smo.teiv.schema;
 public enum SchemaRegistryErrorCode {
     ENTITY_NOT_FOUND_IN_DOMAIN,
     ENTITY_NOT_FOUND_IN_MODULE,
+    DUPLICATE_ENTITY_NAME_IN_TEIV_DOMAIN,
+    DUPLICATE_ENTITY_NAME_IN_DOMAIN,
     RELATIONSHIP_NOT_FOUND_IN_DOMAIN,
-    RELATIONSHIP_NOT_FOUND_IN_MODULE
+    RELATIONSHIP_NOT_FOUND_IN_MODULE,
+    DUPLICATE_RELATION_NAME_IN_TEIV_DOMAIN,
+    DUPLICATE_RELATION_NAME_IN_DOMAIN
 }
index 3acb2bd..89ed799 100644 (file)
@@ -153,7 +153,8 @@ public class TeivDbOperations {
         int affectedRows = context.delete(table(entityType.getTableName())).where(field(ID_COLUMN_NAME).eq(entityId))
                 .execute();
         if (affectedRows > 0) {
-            result.add(OperationResult.builder().id(entityId).type(entityType.getName()).category(ENTITY_CATEGORY).build());
+            result.add(OperationResult.builder().id(entityId).type(entityType.getName()).category(ENTITY_CATEGORY).module(
+                    entityType.getModule().getName()).build());
         }
         return result;
     }
@@ -168,15 +169,14 @@ public class TeivDbOperations {
                 .getIdColumnName()), String.class)).from(table(relationType.getTableName())).where(field(String.format(
                         QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).forUpdate().fetchInto(String.class)
                 .stream().filter(Objects::nonNull).map(id -> OperationResult.builder().id(id).type(relationType.getName())
-                        .category(RELATIONSHIP_CATEGORY).build()).collect(Collectors.toList());
+                        .category(RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()).collect(
+                                Collectors.toList());
+        int updateResult;
         if (relationshipList.isEmpty()) {
             return relationshipList;
         } else {
-            int updateResult = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING,
-                    relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn)))
-                    .set(field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of()))
-                    .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String
-                            .format(QUOTED_STRING, manySideEntityIdColumn)).eq(manySideEntityId)).execute();
+            updateResult = executeRelationshipDelete(context, manySideEntityIdColumn, manySideEntityId, relationType,
+                    oneSideEntityIdColumn);
             return updateResult > 0 ? relationshipList : List.of();
         }
 
@@ -187,17 +187,28 @@ public class TeivDbOperations {
         String oneSideEntityIdColumn = relationType.getRelationshipStorageLocation().equals(B_SIDE) ?
                 relationType.aSideColumnName() :
                 relationType.bSideColumnName();
-        int affectedRows = context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING,
-                relationType.getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))).set(
-                        field(String.format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of()))
-                .setNull(field(String.format(QUOTED_STRING, relationType.getMetadataColumnName()))).where(field(String
-                        .format(QUOTED_STRING, relationType.getIdColumnName())).eq(relationshipId)).execute();
+
+        int affectedRows;
+        affectedRows = executeRelationshipDelete(context, relationType.getIdColumnName(), relationshipId, relationType,
+                oneSideEntityIdColumn);
         return affectedRows > 0 ?
                 Optional.of(OperationResult.builder().id(relationshipId).type(relationType.getName()).category(
-                        RELATIONSHIP_CATEGORY).build()) :
+                        RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()) :
                 Optional.empty();
     }
 
+    private static int executeRelationshipDelete(DSLContext context, String whereClauseColumnName,
+            String whereClauseColumnId, RelationType relationType, String oneSideEntityIdColumn) {
+        return context.update(table(relationType.getTableName())).setNull(field(String.format(QUOTED_STRING, relationType
+                .getIdColumnName()))).setNull(field(String.format(QUOTED_STRING, oneSideEntityIdColumn))).set(field(String
+                        .format(QUOTED_STRING, relationType.getSourceIdsColumnName())), toJsonb(List.of())).set(field(String
+                                .format(QUOTED_STRING, relationType.getClassifiersColumnName())), toJsonb(List.of())).set(
+                                        field(String.format(QUOTED_STRING, relationType.getDecoratorsColumnName())),
+                                        toJsonb("{}")).setNull(field(String.format(QUOTED_STRING, relationType
+                                                .getMetadataColumnName()))).where(field(String.format(QUOTED_STRING,
+                                                        whereClauseColumnName)).eq(whereClauseColumnId)).execute();
+    }
+
     public List<OperationResult> deleteManyToManyRelationByEntityId(DSLContext context, RelationType relationType,
             String entityId, String aSideColumnName, String bSideColumnName) {
         List<String> deletedIds = context.delete(table((relationType.getTableName()))).where(field(String.format(
@@ -206,7 +217,7 @@ public class TeivDbOperations {
                                 TeivConstants.ID_COLUMN_NAME), String.class);
 
         return deletedIds.stream().map(id -> OperationResult.builder().id(id).type(relationType.getName()).category(
-                RELATIONSHIP_CATEGORY).build()).collect(Collectors.toList());
+                RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()).collect(Collectors.toList());
     }
 
     public Optional<OperationResult> deleteManyToManyRelationByRelationId(DSLContext context, RelationType relationType,
@@ -215,7 +226,7 @@ public class TeivDbOperations {
                 relationshipId)).execute();
         return affectedRows > 0 ?
                 Optional.of(OperationResult.builder().id(relationshipId).type(relationType.getName()).category(
-                        RELATIONSHIP_CATEGORY).build()) :
+                        RELATIONSHIP_CATEGORY).module(relationType.getModule().getName()).build()) :
                 Optional.empty();
     }
 
@@ -348,7 +359,8 @@ public class TeivDbOperations {
                             createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray,
                                     metadataMissingEntity);
                             addEntityToOperationResults(results, relationship.getStoringSideEntityId(),
-                                    metadataMissingEntity, relationType.getStoringSideEntityType().getName());
+                                    metadataMissingEntity, relationType.getStoringSideEntityType().getName(), relationType
+                                            .getStoringSideEntityType().getModule().getName());
                             updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse(
                                     results::add, () -> {
                                         throw new IllegalOneToManyRelationshipUpdateException(relationship, true);
@@ -365,12 +377,14 @@ public class TeivDbOperations {
                     createMissingStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray,
                             metadataMissingEntity);
                     addEntityToOperationResults(results, relationship.getStoringSideEntityId(), metadataMissingEntity,
-                            relationType.getStoringSideEntityType().getName());
+                            relationType.getStoringSideEntityType().getName(), relationType.getStoringSideEntityType()
+                                    .getModule().getName());
                 }
                 createMissingNotStoringSideEntity(dslContext, relationship, relationType, respAdapterByteArray,
                         metadataMissingEntity);
                 addEntityToOperationResults(results, relationship.getNotStoringSideEntityId(), metadataMissingEntity,
-                        relationType.getNotStoringSideEntityType().getName());
+                        relationType.getNotStoringSideEntityType().getName(), relationType.getNotStoringSideEntityType()
+                                .getModule().getName());
                 updateRelationshipInEntityTable(dslContext, relationship, relationType, dbMap).ifPresentOrElse(results::add,
                         () -> {
                             throw new IllegalOneToManyRelationshipUpdateException(relationship, false);
@@ -446,20 +460,24 @@ public class TeivDbOperations {
             List<OperationResult> results, byte[] respAdapterByteArray) {
         String aSideTableName = relationType.getASide().getTableName();
         String aSideId = relationship.getASide();
+        String aSideModuleName = relationType.getASide().getModule().getName();
         String bSideTableName = relationType.getBSide().getTableName();
         String bSideId = relationship.getBSide();
+        String bSideModuleName = relationType.getASide().getModule().getName();
         String relationshipId = relationship.getId();
         final Map<String, Object> metadata = TeivMetadataResolver.getMetadataForInferredEntity();
 
         if (createMissingEntity(aSideTableName, aSideId, relationshipId, dslContext, relationType.getASide(),
                 respAdapterByteArray, metadata) == 1) {
             results.add(OperationResult.builder().id(aSideId).type(relationType.getASide().getName()).category(
-                    ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build());
+                    ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).module(aSideModuleName)
+                    .isInferred(true).build());
         }
         if (createMissingEntity(bSideTableName, bSideId, relationshipId, dslContext, relationType.getBSide(),
                 respAdapterByteArray, metadata) == 1) {
             results.add(OperationResult.builder().id(bSideId).type(relationType.getBSide().getName()).category(
-                    ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).build());
+                    ENTITY_CATEGORY).sourceIds(List.of(relationshipId)).metadata(metadata).module(bSideModuleName)
+                    .isInferred(true).build());
         }
     }
 
@@ -513,9 +531,9 @@ public class TeivDbOperations {
     }
 
     private void addEntityToOperationResults(List<OperationResult> results, String entityId, Map<String, Object> metadata,
-            String entityType) {
+            String entityType, String entityModule) {
         OperationResult result = OperationResult.builder().id(entityId).type(entityType).category(ENTITY_CATEGORY).metadata(
-                metadata).build();
+                metadata).module(entityModule).isInferred(true).build();
         if (!results.contains(result)) {
             results.add(result);
         }
index ae7d7c4..846a464 100644 (file)
@@ -25,7 +25,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 
-import io.cloudevents.CloudEvent;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
@@ -36,11 +35,9 @@ import org.apache.kafka.common.config.TopicConfig;
 import org.oran.smo.teiv.config.KafkaAdminConfig;
 import org.oran.smo.teiv.config.KafkaConfig;
 import org.oran.smo.teiv.utils.RetryOperationUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Profile;
 import org.springframework.kafka.config.TopicBuilder;
 import org.springframework.kafka.core.KafkaAdmin;
-import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.retry.support.RetryTemplate;
 import org.springframework.stereotype.Component;
 
@@ -58,9 +55,6 @@ public class KafkaTopicService {
     @Getter
     private final KafkaConfig kafkaConfig;
 
-    @Qualifier("topologyAuditKafkaTemplate")
-    private final KafkaTemplate<String, CloudEvent> topologyAuditkafkaTemplate;
-
     public boolean checkTopologyIngestionTopic() {
         return checkTopicCreated(kafkaConfig.getTopologyIngestion().getTopicName());
     }
index 8d7e516..9340ff8 100644 (file)
@@ -26,6 +26,7 @@ import java.util.Map;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import lombok.Builder;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -34,13 +35,16 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-@JsonInclude(JsonInclude.Include.NON_NULL)
+// Include.NON_NULL was chosen over NON_EMPTY, since empty classifiers/decorators means those field in DB are empty,
+// while null classifiers/decorators means they were irrelevant in terms of the executed operation.
+@JsonInclude(Include.NON_NULL)
 @Builder
 public class OperationResult {
     private String id;
     private String type; // e.g.: NRCellDU, Site, CloudNativeApplication
     private String category; // "entity" or "relationship"
     private Map<String, Object> attributes;
+    private String module;
     private String aSide;
     private String bSide;
     private List<String> classifiers;
@@ -48,6 +52,7 @@ public class OperationResult {
     private Map<String, Object> metadata;
     private List<String> sourceIds;
     private boolean isUpdatedInDb;
+    private boolean isInferred;
     public static final String ENTITY_CATEGORY = "entity";
     public static final String RELATIONSHIP_CATEGORY = "relationship";
 
index 22f249c..4b32016 100644 (file)
@@ -52,7 +52,7 @@ public class AppInit {
      * unaffected by retries.
      */
     @Async
-    @Order(value = 20)
+    @Order(value = 25)
     @EventListener(value = ApplicationReadyEvent.class)
     public void startUpHandler() {
         if (dependentServiceAvailabilityKafka.checkService()) {
diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java b/teiv/src/main/java/org/oran/smo/teiv/utils/OperationResultParser.java
new file mode 100644 (file)
index 0000000..eb88364
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv.utils;
+
+import lombok.experimental.UtilityClass;
+import org.oran.smo.teiv.service.models.OperationResult;
+
+import java.util.List;
+
+@UtilityClass
+public class OperationResultParser {
+
+    public static List<String> fromOperationResults(List<OperationResult> operationResults) {
+        return operationResults.stream().filter(op -> !op.isInferred()).map(op -> String.format(
+                "{\"%s:%s\":[{\"id\":\"%s\"}]}", op.getModule(), op.getType(), op.getId())).toList();
+    }
+}
diff --git a/teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java b/teiv/src/main/java/org/oran/smo/teiv/utils/ResponseUtil.java
new file mode 100644 (file)
index 0000000..dca9fe0
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv.utils;
+
+import lombok.experimental.UtilityClass;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+
+@UtilityClass
+public class ResponseUtil {
+    public static HttpHeaders getHeadersContentTypeAppProblemJson() {
+        final HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.valueOf(MediaType.APPLICATION_PROBLEM_JSON_VALUE));
+        return httpHeaders;
+    }
+}
index ec121f5..f0f6c32 100644 (file)
@@ -266,6 +266,7 @@ public class YangParser {
                     case "string" -> "TEXT";
                     case "boolean" -> "BOOLEAN";
                     case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT";
+                    case "decimal64" -> "DEC";
                     default -> throw TeivException.invalidFileInput("Invalid data type");
                 }));
             }
index dea6d90..a46ff9f 100644 (file)
@@ -31,6 +31,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.oran.smo.teiv.exception.YangException;
 import org.springframework.web.multipart.MultipartFile;
 
 import org.oran.smo.yangtools.parser.ParserExecutionContext;
@@ -43,7 +44,6 @@ import org.oran.smo.yangtools.parser.model.YangModel;
 import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement;
 import org.oran.smo.teiv.exception.TeivException;
 import org.oran.smo.teiv.exception.YangParsingException;
-import org.oran.smo.teiv.exception.YangSchemaException;
 
 public class ExposureYangParser extends YangModelLoader {
     private static final List<YangModel> yangModelInputs = new CopyOnWriteArrayList<>();
@@ -52,7 +52,7 @@ public class ExposureYangParser extends YangModelLoader {
             ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("ietf-*;*;*"),
             ModuleAndFindingTypeAndSchemaNodePathFilterPredicate.fromString("_3gpp*;*;*"));
 
-    public static void loadAndValidateModels() throws YangSchemaException {
+    public static void loadAndValidateModels() throws YangException {
         ParserExecutionContext context = createParserExecutionContext(List.of(), List.of(), FILTER_PREDICATES);
         context.setFailFast(false);
         final List<YangModel> yangModels = YangModelLoader.loadModulesFromSchemaRegistry();
@@ -127,6 +127,7 @@ public class ExposureYangParser extends YangModelLoader {
                         case "string" -> "TEXT";
                         case "boolean" -> "BOOLEAN";
                         case "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" -> "INT";
+                        case "decimal64" -> "DEC";
                         default -> throw TeivException.invalidFileInput("Invalid data type");
                     };
                     if (resultMap.putIfAbsent(key, value) != null) {
index 76ba229..71ec05e 100644 (file)
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.oran.smo.teiv.exception.YangException;
 import org.oran.smo.yangtools.parser.ParserExecutionContext;
 import org.oran.smo.yangtools.parser.YangDeviceModel;
 import org.oran.smo.yangtools.parser.data.YangData;
@@ -45,7 +46,6 @@ import org.oran.smo.yangtools.parser.model.statements.ietf.IetfExtensionsClassSu
 import org.oran.smo.yangtools.parser.model.statements.threegpp.ThreeGppExtensionsClassSupplier;
 import org.oran.smo.teiv.CustomMetrics;
 import org.oran.smo.teiv.exception.YangParsingException;
-import org.oran.smo.teiv.exception.YangSchemaException;
 import org.oran.smo.teiv.exception.YangValidationException;
 
 public class IngestionYangParser extends YangModelLoader {
@@ -58,7 +58,7 @@ public class IngestionYangParser extends YangModelLoader {
     private static final List<StatementClassSupplier> EXTENSION_CREATORS = List.of(new IetfExtensionsClassSupplier(),
             new ThreeGppExtensionsClassSupplier());
 
-    public static void loadModels() throws YangSchemaException, YangValidationException {
+    public static void loadModels() throws YangException {
         ParserExecutionContext context = createParserExecutionContext(EXTENSION_CREATORS, List.of(), FILTER_PREDICATES);
         final List<YangModel> yangModels = YangModelLoader.loadModulesFromSchemaRegistry();
         List<YangModel> models = YangModelLoader.parseModelsIntoContext(context, yangModels);
index e8ee177..37d6303 100644 (file)
@@ -23,8 +23,10 @@ package org.oran.smo.teiv.utils.yangparser;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Base64;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -43,15 +45,14 @@ import org.oran.smo.teiv.exception.YangParsingException;
 import org.oran.smo.teiv.exception.YangSchemaException;
 import org.oran.smo.teiv.exposure.spi.Module;
 import org.oran.smo.teiv.schema.SchemaRegistry;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.util.StringUtils;
 
 public abstract class YangModelLoader {
-    private static final Set<String> MODULES_TO_IMPORT = Set.of("_3gpp-common-yang-extensions", "_3gpp-common-yang-types",
-            "ietf-geo-location", "ietf-inet-types", "ietf-yang-types");
 
-    private static final Set<String> MODULES_TO_IMPLEMENT = Set.of("o-ran-smo-teiv-common-yang-extensions",
-            "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran",
-            "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-rel-oam-ran", "o-ran-smo-teiv-cloud",
-            "o-ran-smo-teiv-rel-cloud-ran");
+    private static final String IMPORT_MODELS_PATH = "classpath:models/import/*.yang";
+    private static final String IMPLEMENT_MODELS_PATH = "classpath:models/*.yang";
 
     public static ParserExecutionContext createParserExecutionContext(List<StatementClassSupplier> extensions,
             List<CustomProcessor> customProcessors, Set<FindingFilterPredicate> filterPredicates) {
@@ -62,24 +63,37 @@ public abstract class YangModelLoader {
         return context;
     }
 
-    public static List<YangModel> loadModulesFromSchemaRegistry() throws YangSchemaException {
+    public static List<YangModel> loadModulesFromSchemaRegistry() throws YangSchemaException, YangParsingException {
         Map<String, Module> modules = SchemaRegistry.getModuleRegistry();
         if (modules == null) {
             throw YangSchemaException.failedToLoadSchema();
         }
+        List<String> importModels = readYangModelsFromPath(IMPORT_MODELS_PATH);
+        List<String> implementModels = readYangModelsFromPath(IMPLEMENT_MODELS_PATH);
         List<String> implementList = new ArrayList<>();
         List<String> importList = new ArrayList<>();
         modules.values().stream().filter(module -> module.getContent() != null).forEach(module -> {
             String content = new String(Base64.getDecoder().decode(module.getContent()), StandardCharsets.UTF_8);
-            if (MODULES_TO_IMPORT.contains(module.getName())) {
+            if (importModels.contains(module.getName())) {
                 importList.add(content);
-            } else if (MODULES_TO_IMPLEMENT.contains(module.getName())) {
+            } else if (implementModels.contains(module.getName())) {
                 implementList.add(content);
             }
         });
         return createYangModels(importList, implementList);
     }
 
+    public static List<String> readYangModelsFromPath(String modelsPath) throws YangParsingException {
+        try {
+            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(YangModelLoader.class
+                    .getClassLoader());
+            return Arrays.stream(resolver.getResources(modelsPath)).map(f -> StringUtils.stripFilenameExtension(Objects
+                    .requireNonNull(f.getFilename()).toLowerCase(Locale.ROOT))).toList();
+        } catch (IOException e) {
+            throw YangParsingException.modelDirectoryDoesNotExists();
+        }
+    }
+
     public static List<YangModel> parseModelsIntoContext(ParserExecutionContext context, List<YangModel> yangModelInputs)
             throws YangSchemaException {
         if (yangModelInputs.isEmpty()) {
index 9fe392e..7295227 100644 (file)
@@ -82,32 +82,32 @@ components:
           payload:
             entities:
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
                     attributes:
                       cellLocalId: 4589
                       nRPCI: 12
                       nRTAC: 310
                       sourceIds:
-                        - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
+                        - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
                         - "urn:cmHandle:395221E080CCF0FD1924103B15873814"
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
                     attributes:
                       cellLocalId: 4590
                       nRPCI: 32
                       nRTAC: 510
                       sourceIds:
-                        - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+                        - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
                         - "urn:cmHandle:395221E080CCF0FD1924103B15873814"
             relationships:
               - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER:
                   - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
-                    aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
-                    bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1"
+                    aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
+                    bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1"
               - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER:
                   - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78"
-                    aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
-                    bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2"
+                    aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
+                    bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2"
           headers:
             ce_specversion: '1.0'
             ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd233
@@ -132,32 +132,32 @@ components:
           payload:
             entities:
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
                     attributes:
                       cellLocalId: 4579
                       nRPCI: 12
                       nRTAC: 310
                       sourceIds:
-                        - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
+                        - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
                         - "urn:cmHandle:395221E080CCF0FD1924103B15873814"
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
                     attributes:
                       cellLocalId: 4580
                       nRPCI: 32
                       nRTAC: 510
                       sourceIds:
-                        - "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+                        - "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
                         - "urn:cmHandle:395221E080CCF0FD1924103B15873814"
             relationships:
               - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER:
                   - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
-                    aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
-                    bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=1"
+                    aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
+                    bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=1"
               - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER:
                   - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=11AB21444F9D7C6DAC7453879AB5586D294B495E43AC6F94750767DD624014DB7317E9A5EE73239876649D801037D6347355B19C5D97222B3C25000CF8A97C78"
-                    aSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
-                    bSide: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRSectorCarrier=2"
+                    aSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
+                    bSide: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRSectorCarrier=2"
           headers:
             ce_specversion: '1.0'
             ce_id: a30e63c9-d29e-46ff-b99a-b63ed83fd234
@@ -182,9 +182,9 @@ components:
           payload:
             entities:
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=1"
               - o-ran-smo-teiv-ran:NRCellDU:
-                  - id: "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+                  - id: "urn:3gpp:dn:ManagedElement=1,ODUFunction=1,NRCellDU=2"
             relationships:
               - o-ran-smo-teiv-ran:NRCELLDU_USES_NRSECTORCARRIER:
                   - id: "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
@@ -212,15 +212,13 @@ components:
       items:
         type: object
         description: Entities schema will adhere to the entity types and
-          attributes mentioned in the yang modules. Refer to EIC Developer
-          Portal for Yang Modules.
+          attributes mentioned in the yang modules.
     relationships:
       type: array
       items:
         type: object
         description: Relationship schema will adhere to the relationship
-          types mentioned in the yang modules. Refer to EIC Developer Portal
-          for Yang Modules.
+          types mentioned in the yang modules.
   messageTraits:
     commonHeaders:
       headers:
index 7e1be03..a827293 100644 (file)
@@ -57,6 +57,10 @@ public class TestPostgresqlContainer extends PostgreSQLContainer<TestPostgresqlC
                     "/pgsqlschema/ingestion-test-model.sql");
             container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/ingestion-test-data.sql"),
                     "/pgsqlschema/ingestion-test-data.sql");
+            container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/end-to-end-test-model.sql"),
+                    "/pgsqlschema/end-to-end-test-model.sql");
+            container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/end-to-end-test-data.sql"),
+                    "/pgsqlschema/end-to-end-test-data.sql");
             container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/consumer-data.sql"),
                     "/pgsqlschema/consumer-data.sql");
             container.withCopyFileToContainer(MountableFile.forClasspathResource("pgsqlschema/groups.sql"),
@@ -104,6 +108,17 @@ public class TestPostgresqlContainer extends PostgreSQLContainer<TestPostgresqlC
         }
     }
 
+    public static void loadEndToEndTestData() {
+        try {
+            container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/end-to-end-test-data.sql",
+                    "--set=pguser=test");
+            container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/end-to-end-test-model.sql",
+                    "--set=pguser=test");
+        } catch (UnsupportedOperationException | IOException | InterruptedException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
     public static void loadIngestionTestData() {
         try {
             container.execInContainer("psql", "-U", "test", "-w", "-f", "/pgsqlschema/ingestion-test-data.sql",
index e708f2e..faf789a 100644 (file)
@@ -22,28 +22,41 @@ package org.oran.smo.teiv.exposure.api.contract;
 
 import javax.sql.DataSource;
 
+import io.restassured.module.mockmvc.RestAssuredMockMvc;
 import org.jooq.DSLContext;
 import org.jooq.SQLDialect;
 import org.jooq.impl.DSL;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.oran.smo.teiv.CustomMetrics;
 import org.oran.smo.teiv.TopologyApiBase;
 import org.oran.smo.teiv.db.TestPostgresqlContainer;
 import org.oran.smo.teiv.exception.YangException;
+import org.oran.smo.teiv.exposure.audit.LoggerHandler;
+import org.oran.smo.teiv.exposure.classifiers.rest.controller.ClassifiersRequestFilter;
+import org.oran.smo.teiv.exposure.decorators.rest.controller.DecoratorsRequestFilter;
+import org.oran.smo.teiv.service.kafka.KafkaTopicService;
 import org.oran.smo.teiv.startup.SchemaCleanUpHandler;
 import org.oran.smo.teiv.utils.yangparser.ExposureYangParser;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.ActiveProfiles;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.oran.smo.teiv.schema.PostgresSchemaLoader;
 import org.oran.smo.teiv.schema.SchemaLoaderException;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
 
 import java.util.List;
 
+import static org.oran.smo.teiv.utils.TeivConstants.REQUEST_MAPPING;
 import static org.oran.smo.teiv.utils.TeivConstants.TEIV_CONSUMER_DATA_SCHEMA;
 import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA;
 import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL_SCHEMA;
@@ -52,10 +65,22 @@ import static org.oran.smo.teiv.utils.TeivConstants.TEIV_MODEL_SCHEMA;
 @SpringBootTest
 @ActiveProfiles({ "test", "exposure" })
 public abstract class TopologyExposureApiBase extends TopologyApiBase {
+    @Autowired
+    private MockMvc mockMvc;
+    @Autowired
+    private ApplicationContext context;
+    @Autowired
+    private CustomMetrics customMetrics;
+    @Autowired
+    private LoggerHandler loggerHandler;
+    @Autowired
+    private ObjectMapper objectMapper;
 
     // This is required so that "Schema in deleting state" contract test works from 03_postSchemas.groovy
-    @MockBean
+    @MockitoBean
     private SchemaCleanUpHandler schemaCleanUpHandler;
+    @MockitoBean
+    KafkaTopicService kafkaTopicService;
 
     @BeforeAll
     public static void beforeAll() throws SchemaLoaderException, YangException {
@@ -70,4 +95,18 @@ public abstract class TopologyExposureApiBase extends TopologyApiBase {
         postgresSchemaLoader.loadSchemaRegistry();
         ExposureYangParser.loadAndValidateModels();
     }
+
+    @BeforeEach
+    public void setup() {
+        ClassifiersRequestFilter classifiersRequestFilter = new ClassifiersRequestFilter(loggerHandler, objectMapper,
+                customMetrics);
+        DecoratorsRequestFilter decoratorsRequestFilter = new DecoratorsRequestFilter(loggerHandler, objectMapper,
+                customMetrics);
+        mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilter(classifiersRequestFilter,
+                REQUEST_MAPPING + "/classifiers").addFilter(decoratorsRequestFilter, REQUEST_MAPPING + "/decorators")
+                .build();
+
+        RestAssuredMockMvc.mockMvc(mockMvc);
+
+    }
 }
index bd65066..c9b3674 100644 (file)
@@ -179,38 +179,37 @@ class DataRepositoryImplGETRequestsContainerizedTest {
     }
 
     @Test
-    void isTopologyExist_entityTest() throws SchemaRegistryException {
-        EntityType entityType = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "NRCellDU").get(0);
+    void doesTopologyExist_entityTest() throws SchemaRegistryException {
+        EntityType entityType = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "NRCellDU");
         String entityId = "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=91";
-        Assertions.assertTrue(underTest.isTopologyExist(entityType, entityId),
+        Assertions.assertTrue(underTest.doesTopologyExist(entityType, entityId),
                 "That's strange, the result should have been true as this id in DB dataset: " + entityId);
         String nonExistentEntityId = "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=19,ODUFunction=19,NRCellDU=911";
-        Assertions.assertFalse(underTest.isTopologyExist(entityType, nonExistentEntityId),
+        Assertions.assertFalse(underTest.doesTopologyExist(entityType, nonExistentEntityId),
                 "Result should have been false as the entity id is not in DB data set: " + nonExistentEntityId);
     }
 
     @Test
-    void isTopologyExist_relationshipTest() throws SchemaRegistryException {
+    void doesTopologyExist_relationshipTest() throws SchemaRegistryException {
         RelationType relationType = SchemaRegistry.getRelationTypeByDomainAndName("RAN",
-                "NRSECTORCARRIER_USES_ANTENNACAPABILITY").get(0);
+                "NRSECTORCARRIER_USES_ANTENNACAPABILITY");
         String aSideRelationshipId = "urn:o-ran:smo:teiv:sha512:NRSECTORCARRIER_USES_ANTENNACAPABILITY=11EDFC31E2BE240D3CB15DB1A3FA3B78C828524BC8FCA3365A615129A61A627C21DA8EBF6DD788CDBDEC668344D1F79A371749083D6AE04DDDD57CB4FA8C3ECB";
-        Assertions.assertTrue(underTest.isTopologyExist(relationType, aSideRelationshipId),
+        Assertions.assertTrue(underTest.doesTopologyExist(relationType, aSideRelationshipId),
                 "That's strange, the result should have been true as this id in DB dataset: " + aSideRelationshipId);
 
-        relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION")
-                .get(0);
+        relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");
         String bSideRelationshipId = "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A";
-        Assertions.assertTrue(underTest.isTopologyExist(relationType, bSideRelationshipId),
+        Assertions.assertTrue(underTest.doesTopologyExist(relationType, bSideRelationshipId),
                 "That's strange, the result should have been true as this id in DB dataset: " + bSideRelationshipId);
 
         relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_EQUIPMENT_RAN",
-                "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").get(0);
+                "ANTENNAMODULE_SERVES_ANTENNACAPABILITY");
         String manyToManyRelationshipId = "urn:o-ran:smo:teiv:sha512:ANTENNAMODULE_SERVES_ANTENNACAPABILITY=ABD52B030DF1169F9F41C898913EF30F7BB5741F53352F482310B280C90AC569B7D31D52A2BB41F1F0099AE1EDD56CACF0B285D145A5584D376DD45DED1E2D65";
-        Assertions.assertTrue(underTest.isTopologyExist(relationType, manyToManyRelationshipId),
+        Assertions.assertTrue(underTest.doesTopologyExist(relationType, manyToManyRelationshipId),
                 "That's strange, the result should have been true as this id in DB dataset: " + manyToManyRelationshipId);
 
         String nonExistentRelationshipId = "urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_OCUUPFUNCTION=5255F37093F8EB3763CE5F017DFC1E162B44FC9DF6E13744C04DC1832C5E754AB7BE440DBE1187EE8EEE42FD04E652BB8148655C6F977B1FFDDA54FE87C6411A";
-        Assertions.assertFalse(underTest.isTopologyExist(relationType, nonExistentRelationshipId),
+        Assertions.assertFalse(underTest.doesTopologyExist(relationType, nonExistentRelationshipId),
                 "Result should have been false as the relationship id is not in DB data set: " + nonExistentRelationshipId);
     }
 
index 66f397e..4d6c458 100644 (file)
@@ -733,12 +733,31 @@ class DtoToJooqTest {
         alb.setChildren(List.of(scopeObject1, scopeObject2));
         Condition actualCondition = alb.getCondition();
         // spotless:off
-        assertEquals(condition(
-            "\n" +
-                "  teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" +
-                "  and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'odu1'\n" +
-                "  and teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"REL_FK_managed-by-managedElement\" is not null\n")
-            .toString(), actualCondition.toString());
+        assertEquals(
+            condition(
+                "\n" +
+                    "  exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\" = 'odu1'\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"REL_FK_managed-by-managedElement\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n" +
+                    "  and exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"REL_FK_managed-by-managedElement\" is not null\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-ran_OCUCPFunction\".\"REL_FK_managed-by-managedElement\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-oam_ManagedElement\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n"
+            ).toString(),
+            actualCondition.toString()
+        );
         // spotless:on
     }
 
@@ -775,14 +794,31 @@ class DtoToJooqTest {
         alb.setChildren(List.of(scopeObject1, scopeObject2));
         Condition actualCondition = alb.getCondition();
         // spotless:off
-        assertEquals(condition(
-            "\n" +
-                "  (\n" +
-                "    teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" +
-                "    and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" +
-                "  )\n" +
-                "  or teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n")
-            .toString(), actualCondition.toString());
+        assertEquals(
+            condition(
+                "\n" +
+                    "  exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" = 'am1'\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-equipment_Site\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n" +
+                    "  or exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" +
+                    "      and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-equipment_Site\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n"
+            ).toString(),
+            actualCondition.toString()
+        );
         // spotless:on
     }
 
@@ -793,20 +829,33 @@ class DtoToJooqTest {
                 .innerContainer(List.of()).leaf("id").queryFunction(QueryFunction.CONTAINS).parameter("am1").build());
         Condition actualCondition = scopeObject1.getCondition();
         // spotless:off
-        assertEquals(condition(
-            "\n" +
-                "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" +
-                "and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" like (" +
-                "('%' || replace(" + "\n"+
-                "replace(" + "\n"+
-                "replace('am1', '!', '!!')," + "\n"+
-                "'%'," + "\n"+
-                "'!%'" + "\n"+
-                ")," + "\n"+
-                "'_'," + "\n"+
-                "'!_'" + "\n"+
-                ")) || '%') escape '!'" + "\n")
-            .toString().replace(" ", ""), actualCondition.toString().replace(" ", ""));
+        String expectedCondition = condition(
+            "exists (\n" +
+                "  select 1 \"one\"\n" +
+                "  from teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\"\n" +
+                "  where (\n" +
+                "    teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\" is not null\n" +
+                "    and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\" like (('%' || replace(\n" +
+                "      replace(\n" +
+                "        replace('am1', '!', '!!'),\n" +
+                "        '%',\n" +
+                "        '!%'\n" +
+                "      ),\n" +
+                "      '_',\n" +
+                "      '!_'\n" +
+                "    )) || '%') escape '!'\n" +
+                "    and teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"REL_FK_installed-at-site\"=" +
+                "teiv_data.\"o-ran-smo-teiv-equipment_Site\".\"id\"\n" +
+                "  )\n" +
+                ")"
+        ).toString();
+
+        // Remove outer parentheses if they exist
+        if (expectedCondition.startsWith("(") && expectedCondition.endsWith(")")) {
+            expectedCondition = expectedCondition.substring(1, expectedCondition.length() - 1);
+        }
+
+        assertEquals(expectedCondition, actualCondition.toString());
         // spotless:on
     }
 
@@ -818,17 +867,32 @@ class DtoToJooqTest {
                 .parameter("ac1").build());
         Condition actualCondition = scopeObject1.getCondition();
         // spotless:off
-        assertEquals(("teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"" +
-            ".\"bSide_AntennaCapability\"like(('%'||replace(" + "\n"+
-            "replace(" + "\n"+
-            "replace('ac1','!','!!')," + "\n"+
-            "'%'," + "\n"+
-            "'!%'" + "\n"+
-            ")," + "\n"+
-            "'_'," + "\n"+
-            "'!_'" + "\n"+
-            "))||'%')escape'!'")
-            .replace(" ", ""), actualCondition.toString().replace(" ", ""));
+        String expectedCondition = condition(
+            "exists (\n" +
+                "  select 1 \"one\"\n" +
+                "  from teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"\n" +
+                "  where (\n" +
+                "    teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" like (('%' || replace(\n" +
+                "      replace(\n" +
+                "        replace('ac1', '!', '!!'),\n" +
+                "        '%',\n" +
+                "        '!%'\n" +
+                "      ),\n" +
+                "      '_',\n" +
+                "      '!_'\n" +
+                "    )) || '%') escape '!'\n" +
+                "    and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\"=" +
+                "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\"\n" +
+                "  )\n" +
+                ")"
+        ).toString();
+
+        // Remove outer parentheses if they exist
+        if (expectedCondition.startsWith("(") && expectedCondition.endsWith(")")) {
+            expectedCondition = expectedCondition.substring(1, expectedCondition.length() - 1);
+        }
+
+        assertEquals(expectedCondition, actualCondition.toString());
         // spotless:on
     }
 
@@ -867,11 +931,30 @@ class DtoToJooqTest {
         alb.setChildren(List.of(scopeObject1, scopeObject2));
         Condition actualCondition = alb.getCondition();
         // spotless:off
-        assertEquals(condition(
-            "\n" +
-                "  teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" +
-                "  and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n")
-            .toString(), actualCondition.toString());
+        assertEquals(
+            condition(
+                "\n" +
+                    "  exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\" = 'ac1'\n" +
+                    "      and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n" +
+                    "  and exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n" +
+                    "      and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-equipment_AntennaModule\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n"
+            ).toString(),
+            actualCondition.toString()
+        );
         // spotless:on
     }
 
@@ -889,11 +972,30 @@ class DtoToJooqTest {
         alb.setChildren(List.of(scopeObject1, scopeObject2));
         Condition actualCondition = alb.getCondition();
         // spotless:off
-        assertEquals(condition(
-            "\n" +
-                "  teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" +
-                "  and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n")
-            .toString(), actualCondition.toString());
+        assertEquals(
+            condition(
+                "\n" + // Keeping the initial newline for consistency
+                    "  exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"aSide_AntennaModule\" = 'am1'\n" +
+                    "      and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n" +
+                    "  and exists (\n" +
+                    "    select 1 \"one\"\n" +
+                    "    from teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"\n" +
+                    "    where (\n" +
+                    "      teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".id is not null\n" +
+                    "      and teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"=" +
+                    "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\"\n" +
+                    "    )\n" +
+                    "  )\n"
+            ).toString(),
+            actualCondition.toString()
+        );
         // spotless:on
     }
 
@@ -1238,14 +1340,14 @@ class DtoToJooqTest {
     }
 
     @Test
-    void testGetJoinCondition() {
+    void testWhereExistsCondition() {
         LogicalBlock slb1 = new ScopeLogicalBlock(ScopeObject.builder("ODUFunction/provided-nrCellDu").topologyObjectType(
                 TopologyObjectType.ASSOCIATION).innerContainer(List.of()).build());
         InnerFilterCriteria innerFilterCriteria1 = InnerFilterCriteria.builder().scope(slb1).build();
         Pair<String, Field> pair1 = new ImmutablePair<>("teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\"", field(
                 "teiv_data.\"o-ran-smo-teiv-ran_NRCellDU\".\"REL_FK_provided-by-oduFunction\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_ODUFunction\".\"id\""));
         Assertions.assertEquals(new HashSet(Arrays.asList(pair1)), innerFilterCriteria1.builder().scope(slb1).build()
-                .getJoinCondition());
+                .getWhereExistsCondition());
         LogicalBlock slb2 = new ScopeLogicalBlock(ScopeObject.builder("AntennaCapability/serving-antennaModule")
                 .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.ID).innerContainer(List.of())
                 .build());
@@ -1253,6 +1355,6 @@ class DtoToJooqTest {
         Pair<String, Field> pair2 = new ImmutablePair<>("teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\"", field(
                 "teiv_data.\"CFC235E0404703D1E4454647DF8AAE2C193DB402\".\"bSide_AntennaCapability\"" + "=" + "teiv_data.\"o-ran-smo-teiv-ran_AntennaCapability\".\"id\""));
         Assertions.assertEquals(new HashSet(Arrays.asList(pair2)), innerFilterCriteria2.builder().scope(slb2).build()
-                .getJoinCondition());
+                .getWhereExistsCondition());
     }
 }
index fd6731d..06cd680 100644 (file)
@@ -20,6 +20,7 @@
  */
 package org.oran.smo.teiv.exposure.teivpath.refiner;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.oran.smo.teiv.utils.TeivConstants.ID_COLUMN_NAME;
 import static org.oran.smo.teiv.utils.TeivConstants.ITEM;
 import static org.oran.smo.teiv.utils.TeivConstants.WILDCARD;
@@ -100,7 +101,7 @@ class BasePathRefinementTest {
         expectedScopeObject.setDataType(DataType.PRIMITIVE);
         expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY);
         expectedTargets.get(0).setAllParamQueried(true);
-        Assertions.assertEquals(expectedFilterCriteria, filterCriteria);
+        assertEquals(expectedFilterCriteria, filterCriteria);
     }
 
     @Test
@@ -126,7 +127,7 @@ class BasePathRefinementTest {
         expectedScopeObject.setDataType(DataType.PRIMITIVE);
         expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY);
         expectedTargets.get(0).setAllParamQueried(false);
-        Assertions.assertEquals(expectedFilterCriteria, filterCriteria);
+        assertEquals(expectedFilterCriteria, filterCriteria);
     }
 
     @Test
@@ -138,7 +139,7 @@ class BasePathRefinementTest {
         ScopeObject scopeObjectResult1 = ScopeObject.builder(WILDCARD + "/managed-by-managedElement").container(
                 ContainerType.ID).innerContainer(List.of()).resolverDataType(ResolverDataType.STRING).queryFunction(
                         QueryFunction.EQ).leaf(null).parameter("me1").build();
-        Assertions.assertEquals(scopeObjectResult1, ((ScopeLogicalBlock) logicalBlock1).getScopeObject());
+        assertEquals(scopeObjectResult1, ((ScopeLogicalBlock) logicalBlock1).getScopeObject());
         LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/managed-by-managedElement");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build()));
         basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) logicalBlock2, "RAN");
@@ -146,7 +147,7 @@ class BasePathRefinementTest {
         ScopeObject scopeObjectResult2 = ScopeObject.builder(ODU_FUNCTION + "/managed-by-managedElement")
                 .topologyObjectType(TopologyObjectType.ASSOCIATION).container(ContainerType.NOT_NULL).resolverDataType(
                         ResolverDataType.NOT_NULL).queryFunction(QueryFunction.NOT_NULL).build();
-        Assertions.assertEquals(scopeObjectResult2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+        assertEquals(scopeObjectResult2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
         LogicalBlock logicalBlock3 = scopeResolver.process(null, "/ODUFUNCTION_PROVIDES_NRCELLDU");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock3).build()));
         Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement
@@ -156,7 +157,7 @@ class BasePathRefinementTest {
         basePathRefinement.processTopologyObjectsWithContainerTypeNull(filterCriteria);
         ScopeObject scopeObjectResult4 = ScopeObject.builder(WILDCARD + "/" + ODU_FUNCTION).container(ContainerType.ID)
                 .resolverDataType(ResolverDataType.STRING).queryFunction(QueryFunction.EQ).parameter("odu1").build();
-        Assertions.assertEquals(scopeObjectResult4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
+        assertEquals(scopeObjectResult4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
         try (MockedStatic<SchemaRegistry> utilities = Mockito.mockStatic(SchemaRegistry.class)) {
             utilities.when(() -> SchemaRegistry.getEntityNamesByDomain("RAN")).thenReturn(Arrays.asList(
                     "RelationAndEntity"));
@@ -181,7 +182,7 @@ class BasePathRefinementTest {
         ScopeObject scopeObjectResult9 = ScopeObject.builder("*/NRCellDU").container(ContainerType.ATTRIBUTES)
                 .resolverDataType(ResolverDataType.INTEGER).queryFunction(QueryFunction.EQ).leaf("nCI").parameter("12")
                 .build();
-        Assertions.assertEquals(scopeObjectResult9, ((ScopeLogicalBlock) logicalBlock9).getScopeObject());
+        assertEquals(scopeObjectResult9, ((ScopeLogicalBlock) logicalBlock9).getScopeObject());
         LogicalBlock logicalBlock10 = scopeResolver.process(null, "/NRCellDU[@nCI=12]");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock10).build()));
         Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement
@@ -215,8 +216,8 @@ class BasePathRefinementTest {
         resultTargetObjects.add(targetObjectResult);
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects, filterCriteria.getTargets());
-        Assertions.assertEquals(scopeResult1, filterCriteria.getScope());
+        assertEquals(resultTargetObjects, filterCriteria.getTargets());
+        assertEquals(scopeResult1, filterCriteria.getScope());
     }
 
     @Test
@@ -234,7 +235,7 @@ class BasePathRefinementTest {
         basePathRefinement.handleAssociationsInScope((ScopeLogicalBlock) filterCriteria.getScope(), "RAN");
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects3_1, filterCriteria.getTargets());
+        assertEquals(resultTargetObjects3_1, filterCriteria.getTargets());
     }
 
     @Test
@@ -254,7 +255,7 @@ class BasePathRefinementTest {
         resultTargetObjects4_1.add(targetObjectResult4_2);
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects4_1, filterCriteria.getTargets());
+        assertEquals(resultTargetObjects4_1, filterCriteria.getTargets());
     }
 
     @Test
@@ -307,8 +308,8 @@ class BasePathRefinementTest {
         resultTargetObjects5_1.add(targetObjectResult5_2);
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects5_1, filterCriteria.getTargets());
-        Assertions.assertEquals(or1, filterCriteria.getScope());
+        assertEquals(resultTargetObjects5_1, filterCriteria.getTargets());
+        assertEquals(or1, filterCriteria.getScope());
     }
 
     @Test
@@ -328,8 +329,8 @@ class BasePathRefinementTest {
                 "cellLocalId").queryFunction(QueryFunction.EQ).parameter("156").resolverDataType(ResolverDataType.INTEGER)
                 .build();
         LogicalBlock logicalBlockResult6_1 = new ScopeLogicalBlock(scopeObjectResult6_1);
-        Assertions.assertEquals(resultTargetObjects6_1, filterCriteria.getTargets());
-        Assertions.assertEquals(logicalBlockResult6_1, filterCriteria.getScope());
+        assertEquals(resultTargetObjects6_1, filterCriteria.getTargets());
+        assertEquals(logicalBlockResult6_1, filterCriteria.getScope());
     }
 
     @Test
@@ -396,8 +397,8 @@ class BasePathRefinementTest {
         resultTargetObjects9_1.add(targetObjectResult9_2);
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
-        Assertions.assertEquals(or, filterCriteria.getScope());
+        assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
+        assertEquals(or, filterCriteria.getScope());
     }
 
     @Test
@@ -472,8 +473,8 @@ class BasePathRefinementTest {
         resultTargetObjects11_1.add(targetObjectResult11_2);
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects11_1, filterCriteria.getTargets());
-        Assertions.assertEquals(or1, filterCriteria.getScope());
+        assertEquals(resultTargetObjects11_1, filterCriteria.getTargets());
+        assertEquals(or1, filterCriteria.getScope());
     }
 
     @Test
@@ -557,8 +558,8 @@ class BasePathRefinementTest {
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
 
-        Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
-        Assertions.assertEquals(or1, filterCriteria2.getScope());
+        assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
+        assertEquals(or1, filterCriteria2.getScope());
     }
 
     @Test
@@ -575,7 +576,7 @@ class BasePathRefinementTest {
                 .of(filterCriteria)).build());
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.ENTITY);
-        Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
+        assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
     }
 
     @Test
@@ -589,7 +590,7 @@ class BasePathRefinementTest {
                 .of(filterCriteria)).build());
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP);
-        Assertions.assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope());
+        assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope());
     }
 
     @Test
@@ -630,8 +631,8 @@ class BasePathRefinementTest {
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "RAN",
                 FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP);
 
-        Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
-        Assertions.assertEquals(or1, filterCriteria2.getScope());
+        assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
+        assertEquals(or1, filterCriteria2.getScope());
     }
 
     @Test
@@ -701,8 +702,8 @@ class BasePathRefinementTest {
         basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria2, "REL_OAM_RAN",
                 FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP);
 
-        Assertions.assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
-        Assertions.assertEquals(or1, filterCriteria2.getScope());
+        assertEquals(resultTargetObjectsResult13_1, filterCriteria2.getTargets());
+        assertEquals(or1, filterCriteria2.getScope());
     }
 
     @Test
@@ -720,15 +721,15 @@ class BasePathRefinementTest {
             utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList(
                     "ODUFUNCTION_PROVIDES_NRCELLDU"));
             basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria);
-            Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets()
-                    .get(0).getTopologyObjectType());
-            Assertions.assertEquals(TopologyObjectType.ENTITY, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList()
-                    .get(0).getScope()).getScopeObject().getTopologyObjectType());
+            assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0)
+                    .getTopologyObjectType());
+            assertEquals(TopologyObjectType.ENTITY, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList().get(0)
+                    .getScope()).getScopeObject().getTopologyObjectType());
             filterCriteria.getFilterCriteriaList().get(0).setScope(EmptyLogicalBlock.getInstance());
             targetObject.setTopologyObjectType(TopologyObjectType.UNDEFINED);
             basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria);
-            Assertions.assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets()
-                    .get(0).getTopologyObjectType());
+            assertEquals(TopologyObjectType.ENTITY, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0)
+                    .getTopologyObjectType());
         }
     }
 
@@ -747,10 +748,10 @@ class BasePathRefinementTest {
             utilities.when(() -> SchemaRegistry.getRelationNamesByDomain("RAN")).thenReturn(Arrays.asList(
                     "ODUFUNCTION_PROVIDES_NRCELLDU"));
             basePathRefinement.resolveUndefinedTopologyObjectTypes(filterCriteria);
-            Assertions.assertEquals(TopologyObjectType.RELATION, filterCriteria.getFilterCriteriaList().get(0).getTargets()
-                    .get(0).getTopologyObjectType());
-            Assertions.assertEquals(TopologyObjectType.RELATION, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList()
-                    .get(0).getScope()).getScopeObject().getTopologyObjectType());
+            assertEquals(TopologyObjectType.RELATION, filterCriteria.getFilterCriteriaList().get(0).getTargets().get(0)
+                    .getTopologyObjectType());
+            assertEquals(TopologyObjectType.RELATION, ((ScopeLogicalBlock) filterCriteria.getFilterCriteriaList().get(0)
+                    .getScope()).getScopeObject().getTopologyObjectType());
         }
     }
 
@@ -891,7 +892,7 @@ class BasePathRefinementTest {
         LogicalBlock logicalBlock1 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId=21]");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock1).build()));
         basePathRefinement.validateScopeParametersDataType(filterCriteria);
-        Assertions.assertEquals(DataType.BIGINT, ((ScopeLogicalBlock) logicalBlock1).getScopeObject().getDataType());
+        assertEquals(DataType.BIGINT, ((ScopeLogicalBlock) logicalBlock1).getScopeObject().getDataType());
         // error reason: for gNBId attribute string value is not accepted
         LogicalBlock logicalBlock2 = scopeResolver.process(ODU_FUNCTION, "/attributes[@gNBId='abc']");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock2).build()));
@@ -909,7 +910,7 @@ class BasePathRefinementTest {
                 .resolverDataType(ResolverDataType.STRING).build());
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(scopeLogicalBlock1).build()));
         basePathRefinement.validateScopeParametersDataType(filterCriteria);
-        Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType());
+        assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType());
         // error reason: scopeFilter: /managed-by-managedElement[@id=1] -> ResolverDataType is INTEGER, but in case of id it should be STRING
         ScopeLogicalBlock scopeLogicalBlock2 = new ScopeLogicalBlock(ScopeObject.builder(ODU_FUNCTION).innerContainer(
                 new ArrayList<>(Arrays.asList("managed-by-managedElement"))).container(ContainerType.ID).topologyObjectType(
@@ -930,7 +931,7 @@ class BasePathRefinementTest {
         LogicalBlock logicalBlock4 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id='odu1']");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock4).build()));
         basePathRefinement.validateScopeParametersDataType(filterCriteria);
-        Assertions.assertEquals(DataType.PRIMITIVE, ((ScopeLogicalBlock) logicalBlock4).getScopeObject().getDataType());
+        assertEquals(DataType.PRIMITIVE, ((ScopeLogicalBlock) logicalBlock4).getScopeObject().getDataType());
         // error reason: for id INTEGER ResolverDataType is not accepted
         LogicalBlock logicalBlock5 = scopeResolver.process(ODU_FUNCTION, "/ODUFunction[@id=1]");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock5).build()));
@@ -945,7 +946,7 @@ class BasePathRefinementTest {
         LogicalBlock logicalBlock7 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 'someSourceId']");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock7).build()));
         basePathRefinement.validateScopeParametersDataType(filterCriteria);
-        Assertions.assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType());
+        assertEquals(DataType.PRIMITIVE, scopeLogicalBlock1.getScopeObject().getDataType());
         // error reason: for sourceIds container INTEGER dataType is not accepted
         LogicalBlock logicalBlock8 = scopeResolver.process(ODU_FUNCTION, "/sourceIds[@items = 1]");
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(logicalBlock8).build()));
@@ -1079,8 +1080,8 @@ class BasePathRefinementTest {
                 targetObject3)).scope(fc2or1).build();
         InnerFilterCriteria innerFilterCriteria3 = InnerFilterCriteria.builder().targets(List.of(targetObject4)).scope(
                 fc3and1).build();
-        Assertions.assertEquals(Set.of(innerFilterCriteria1, innerFilterCriteria2, innerFilterCriteria3), new HashSet<>(
-                filterCriteria.getFilterCriteriaList()));
+        assertEquals(Set.of(innerFilterCriteria1, innerFilterCriteria2, innerFilterCriteria3), new HashSet<>(filterCriteria
+                .getFilterCriteriaList()));
     }
 
     @Test
@@ -1107,7 +1108,7 @@ class BasePathRefinementTest {
         scopeLogicalBlock6.setValid(false);
         filterCriteria.setFilterCriteriaList(List.of(InnerFilterCriteria.builder().scope(orLogicalBlock1).build()));
         basePathRefinement.validateQuery(filterCriteria);
-        Assertions.assertEquals(andLogicalBlock2, filterCriteria.getFilterCriteriaList().get(0).getScope());
+        assertEquals(andLogicalBlock2, filterCriteria.getFilterCriteriaList().get(0).getScope());
         ScopeLogicalBlock scopeLogicalBlock2_1 = new ScopeLogicalBlock(null);
         ScopeLogicalBlock scopeLogicalBlock2_2 = new ScopeLogicalBlock(null);
         AndOrLogicalBlock andLogicalBlock2_1 = new AndLogicalBlock();
@@ -1149,10 +1150,10 @@ class BasePathRefinementTest {
         orLogicalBlock.setChildren(Arrays.asList(orLogicalBlockChild1, orLogicalBlockChild2));
         basePathRefinement.runOnTree(orLogicalBlock, filterCriteria.getDomain(), (ScopeLogicalBlock lb, String domain) -> lb
                 .getScopeObject().setParameter("0"));
-        Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock1).getScopeObject().getParameter());
-        Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock2).getScopeObject().getParameter());
-        Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock3).getScopeObject().getParameter());
-        Assertions.assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock4).getScopeObject().getParameter());
+        assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock1).getScopeObject().getParameter());
+        assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock2).getScopeObject().getParameter());
+        assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock3).getScopeObject().getParameter());
+        assertEquals("0", ((ScopeLogicalBlock) scopeLogicalBlock4).getScopeObject().getParameter());
     }
 
     @Test
@@ -1165,8 +1166,8 @@ class BasePathRefinementTest {
 
         TeivPathException thrown = Assertions.assertThrows(TeivPathException.class, () -> basePathRefinement.refine(
                 filterCriteria));
-        Assertions.assertEquals("Querying any thing other than id is not supported in case of association of relation",
-                thrown.getDetails());
+        assertEquals("Querying any thing other than id is not supported in case of association of relation", thrown
+                .getDetails());
 
     }
 
@@ -1199,7 +1200,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria);
 
-        Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+        assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
 
         LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU",
                 "/serving-antennaModule/attributes[coveredBy(@geo-location, 'POLYGON((48 68, 50 68, 50 69, 48 69, 48 68))')]");
@@ -1221,7 +1222,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria2);
 
-        Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+        assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
 
         LogicalBlock logicalBlock3 = scopeResolver.resolve("NRCellDU",
                 "/serving-antennaModule/attributes[withinMeters(@geo-location, 'POINT(49.40199 68.94199)', 500)]");
@@ -1243,7 +1244,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria3);
 
-        Assertions.assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject());
+        assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject());
 
         LogicalBlock logicalBlock4 = scopeResolver.resolve("NRCellDU",
                 "/serving-antennaModule/attributes[@antennaModelNumber='5']");
@@ -1265,7 +1266,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria4);
 
-        Assertions.assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
+        assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
 
         LogicalBlock logicalBlock5 = scopeResolver.resolve(null,
                 "/serving-antennaModule/attributes[@antennaModelNumber='5']");
@@ -1286,7 +1287,7 @@ class BasePathRefinementTest {
         expectedScopeObject5.setDataType(DataType.PRIMITIVE);
 
         basePathRefinement.refine(filterCriteria5);
-        Assertions.assertEquals(new ScopeLogicalBlock(expectedScopeObject5), filterCriteria5.getFilterCriteriaList().get(0)
+        assertEquals(new ScopeLogicalBlock(expectedScopeObject5), filterCriteria5.getFilterCriteriaList().get(0)
                 .getScope());
 
     }
@@ -1314,7 +1315,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria);
 
-        Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+        assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
 
         LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU",
                 "/serving-antennaModule/sourceIds[contains(@item,'urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,Equipment=1,AntennaUnitGroup=1,AntennaUnit=1,AntennaSubunit=1')]");
@@ -1337,7 +1338,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria2);
 
-        Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+        assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
 
     }
 
@@ -1371,7 +1372,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria);
 
-        Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+        assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
 
         LogicalBlock logicalBlock2 = scopeResolver.resolve("NRCellDU",
                 "/serving-antennaModule/classifiers[contains(@item,'app-module:Rural')]");
@@ -1393,7 +1394,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria2);
 
-        Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+        assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
     }
 
     @Test
@@ -1418,7 +1419,7 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria);
 
-        Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+        assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
 
     }
 
@@ -1444,6 +1445,6 @@ class BasePathRefinementTest {
 
         basePathRefinement.refine(filterCriteria);
 
-        Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+        assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
     }
 }
index d29dd26..46838e9 100644 (file)
@@ -36,12 +36,11 @@ import org.jooq.impl.DSL;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.oran.smo.teiv.exposure.audit.LoggerHandler;
-import org.oran.smo.teiv.groups.utils.GroupCreationRequestFilter;
+import org.oran.smo.teiv.groups.rest.controller.GroupCreationRequestFilter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.context.ActiveProfiles;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -64,7 +63,9 @@ public abstract class TopologyGroupsApiBase extends TopologyApiBase {
     private ApplicationContext context;
     @Autowired
     private MockMvc mockMvc;
-    @MockBean
+    @Autowired
+    private ObjectMapper objectMapper;
+    @Autowired
     private LoggerHandler loggerHandler;
 
     @BeforeAll
@@ -82,7 +83,7 @@ public abstract class TopologyGroupsApiBase extends TopologyApiBase {
 
     @BeforeEach
     public void setup() {
-        GroupCreationRequestFilter groupCreationRequestFilter = new GroupCreationRequestFilter(loggerHandler);
+        GroupCreationRequestFilter groupCreationRequestFilter = new GroupCreationRequestFilter(loggerHandler, objectMapper);
         mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) context).addFilter(groupCreationRequestFilter,
                 "/topology-inventory/v1alpha11/groups").build();
 
index 5c4c40e..d265c55 100644 (file)
@@ -43,6 +43,7 @@ import org.jooq.Result;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.mockito.MockedStatic;
@@ -75,6 +76,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import jakarta.annotation.PostConstruct;
 
 @Configuration
+@TestInstance(TestInstance.Lifecycle.PER_METHOD)
 @SpringBootTest
 @ActiveProfiles({ "test", "ingestion" })
 class IngestionOperationValidatorTest {
index cf39d3e..74ff01a 100644 (file)
@@ -111,7 +111,7 @@ class CreateTopologyProcessorTest {
 
         verify(teivDbService, times(1)).execute(anyList());
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -134,7 +134,7 @@ class CreateTopologyProcessorTest {
 
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -157,7 +157,7 @@ class CreateTopologyProcessorTest {
 
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -172,7 +172,7 @@ class CreateTopologyProcessorTest {
 
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("create"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 }
index ce781a4..6001302 100644 (file)
@@ -111,7 +111,7 @@ class DeleteTopologyProcessorTest {
 
         verify(teivDbService, times(1)).execute(anyList());
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -126,7 +126,7 @@ class DeleteTopologyProcessorTest {
         verify(metrics, times(1)).incrementNumUnsuccessfullyParsedDeleteCloudEvents();
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("delete"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
index 3b7e322..5340ec6 100644 (file)
@@ -111,7 +111,7 @@ class MergeTopologyProcessorTest {
 
         verify(teivDbService, times(1)).execute(anyList());
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -134,7 +134,7 @@ class MergeTopologyProcessorTest {
 
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -157,7 +157,7 @@ class MergeTopologyProcessorTest {
 
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 
@@ -171,7 +171,7 @@ class MergeTopologyProcessorTest {
         verify(metrics, times(1)).incrementNumUnsuccessfullyParsedMergeCloudEvents();
         verifyNoMoreInteractions(metrics);
 
-        verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
+        verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("merge"), any(CloudEvent.class), anyString(),
                 anyString());
     }
 }
index 92ea516..aede674 100644 (file)
@@ -109,7 +109,7 @@ class SourceEntityDeleteTopologyProcessorTest {
             verify(metrics, times(1)).incrementNumUnsuccessfullyParsedSourceEntityDeleteCloudEvents();
             verifyNoMoreInteractions(metrics);
 
-            verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
+            verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
                     anyString(), anyString());
         }
     }
@@ -128,7 +128,7 @@ class SourceEntityDeleteTopologyProcessorTest {
             verify(metrics, times(1)).incrementNumReceivedCloudEventNotSupported();
             verifyNoMoreInteractions(metrics);
 
-            verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
+            verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
                     anyString(), anyString());
         }
     }
@@ -153,7 +153,7 @@ class SourceEntityDeleteTopologyProcessorTest {
             verify(metrics, times(1)).recordCloudEventSourceEntityDeleteParseTime(anyLong());
             verifyNoMoreInteractions(metrics);
 
-            verify(auditLogger).auditLog(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
+            verify(auditLogger).logError(eq(ExecutionStatus.FAILED), eq("source-entity-delete"), any(CloudEvent.class),
                     anyString(), any());
         }
     }
@@ -203,7 +203,7 @@ class SourceEntityDeleteTopologyProcessorTest {
 
             verifyNoMoreInteractions(metrics);
 
-            verify(auditLogger).auditLog(eq(ExecutionStatus.SUCCESS), eq("source-entity-delete"), any(CloudEvent.class),
+            verify(auditLogger).logSuccess(eq(ExecutionStatus.SUCCESS), eq("source-entity-delete"), any(CloudEvent.class),
                     anyString(), any());
             verifyNoMoreInteractions(metrics);
         } catch (IllegalAccessException e) {
index 8f7e30f..4cad968 100644 (file)
@@ -25,6 +25,7 @@ import static org.oran.smo.teiv.schema.RelationshipDataLocation.A_SIDE;
 import static org.oran.smo.teiv.schema.RelationshipDataLocation.B_SIDE;
 import static org.oran.smo.teiv.schema.RelationshipDataLocation.RELATION;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_DOMAIN;
+import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.ENTITY_NOT_FOUND_IN_MODULE;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_DOMAIN;
 import static org.oran.smo.teiv.schema.SchemaRegistryErrorCode.RELATIONSHIP_NOT_FOUND_IN_MODULE;
 import static org.oran.smo.teiv.utils.TeivConstants.QUOTED_STRING;
@@ -124,10 +125,20 @@ class SchemaRegistryTest {
     @Test
     void testGetEntityTypeByDomainAndName() throws SchemaRegistryException {
         //when
-        List<EntityType> entityTypes = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "ODUFunction");
+        EntityType entityType = SchemaRegistry.getEntityTypeByDomainAndName("RAN", "ODUFunction");
+        //then
+        assertEquals("ODUFunction", entityType.getName());
+        assertEquals("RAN", entityType.getModule().getDomain());
+
+        //when
+        entityType = SchemaRegistry.getEntityTypeByDomainAndName("TEIV", "ODUFunction");
+        //then
+        assertEquals("ODUFunction", entityType.getName());
+        assertEquals("RAN", entityType.getModule().getDomain());
+
+        //when
+        entityType = SchemaRegistry.getEntityTypeByDomainAndName("REL_OAM_RAN", "ODUFunction");
         //then
-        assertEquals(1, entityTypes.size());
-        EntityType entityType = entityTypes.get(0);
         assertEquals("ODUFunction", entityType.getName());
         assertEquals("RAN", entityType.getModule().getDomain());
 
@@ -145,8 +156,8 @@ class SchemaRegistryTest {
         assertEquals("RAN", entityType.getModule().getDomain());
 
         final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry
-                .getEntityTypeByDomainAndName("o-ran-smo-teiv-oam", "ODUFunction"));
-        assertEquals(ENTITY_NOT_FOUND_IN_DOMAIN, exception.getErrorCode());
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ODUFunction"));
+        assertEquals(ENTITY_NOT_FOUND_IN_MODULE, exception.getErrorCode());
     }
 
     @Test
@@ -280,15 +291,38 @@ class SchemaRegistryTest {
         Association expectedASideAssociation = new Association("managed-ocucpFunction", 1, 1);
         Association expectedBSideAssociation = new Association("managed-by-managedElement", 0, 9223372036854775807L);
         //when
-        List<RelationType> relationTypes = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN",
+        RelationType relationType = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN",
                 "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");
         //then
-        assertEquals(1, relationTypes.size());
-        RelationType managedElementManagesOcucpfunction = relationTypes.get(0);
-        assertEquals(expectedASideAssociation.toString(), managedElementManagesOcucpfunction.getASideAssociation()
-                .toString());
-        assertEquals(expectedBSideAssociation.toString(), managedElementManagesOcucpfunction.getBSideAssociation()
-                .toString());
+        assertEquals(expectedASideAssociation.toString(), relationType.getASideAssociation().toString());
+        assertEquals(expectedBSideAssociation.toString(), relationType.getBSideAssociation().toString());
+
+        //when
+        relationType = SchemaRegistry.getRelationTypeByDomainAndName("TEIV", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");
+        //then
+        assertEquals(expectedASideAssociation.toString(), relationType.getASideAssociation().toString());
+        assertEquals(expectedBSideAssociation.toString(), relationType.getBSideAssociation().toString());
+
+        //given
+        Association expectedASideAssociation1 = new Association("provided-nrCellDu", 1, 1);
+        Association expectedBSideAssociation1 = new Association("provided-by-oduFunction", 0, 9223372036854775807L);
+        //when
+        RelationType relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("RAN", "ODUFUNCTION_PROVIDES_NRCELLDU");
+        //then
+        assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString());
+        assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString());
+
+        //when
+        relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("TEIV", "ODUFUNCTION_PROVIDES_NRCELLDU");
+        //then
+        assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString());
+        assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString());
+
+        //when
+        relationType1 = SchemaRegistry.getRelationTypeByDomainAndName("REL_OAM_RAN", "ODUFUNCTION_PROVIDES_NRCELLDU");
+        //then
+        assertEquals(expectedASideAssociation1.toString(), relationType1.getASideAssociation().toString());
+        assertEquals(expectedBSideAssociation1.toString(), relationType1.getBSideAssociation().toString());
 
         final SchemaRegistryException exception = assertThrows(SchemaRegistryException.class, () -> SchemaRegistry
                 .getRelationTypeByDomainAndName("OAM", "MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"));
index 7431b90..efcb35a 100644 (file)
@@ -24,13 +24,18 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.oran.smo.teiv.utils.JooqTypeConverter.jsonbToMap;
+import static org.oran.smo.teiv.utils.OperationResultParser.fromOperationResults;
 import static org.oran.smo.teiv.utils.TeivConstants.TEIV_DATA_SCHEMA;
 import static org.oran.smo.teiv.utils.TeivTestConstants.KAFKA_RETRY_INTERVAL_10_MS;
 import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_HOST;
 import static org.oran.smo.teiv.utils.TeivTestConstants.SPRING_BOOT_SERVER_PORT;
 
 import java.io.File;
+import java.io.IOException;
 import java.time.Duration;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
@@ -64,16 +69,26 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInstance;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
 import org.oran.smo.teiv.CustomMetrics;
 import org.oran.smo.teiv.availability.DependentServiceAvailabilityKafka;
 import org.oran.smo.teiv.config.KafkaConfig;
 import org.oran.smo.teiv.db.TestPostgresqlContainer;
+import org.oran.smo.teiv.exception.YangException;
 import org.oran.smo.teiv.listener.ListenerStarter;
+import org.oran.smo.teiv.listener.audit.ExecutionStatus;
+import org.oran.smo.teiv.listener.audit.IngestionAuditLogger;
+import org.oran.smo.teiv.schema.MockSchemaLoader;
+import org.oran.smo.teiv.schema.SchemaLoader;
+import org.oran.smo.teiv.schema.SchemaLoaderException;
 import org.oran.smo.teiv.service.kafka.KafkaTopicService;
+import org.oran.smo.teiv.service.models.OperationResult;
 import org.oran.smo.teiv.startup.AppInit;
 import org.oran.smo.teiv.utils.CloudEventTestUtil;
 import org.oran.smo.teiv.utils.EndToEndExpectedResults;
 import org.oran.smo.teiv.utils.KafkaTestExecutionListener;
+import org.oran.smo.teiv.utils.YangModelValidationTestUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.kafka.config.KafkaListenerEndpointRegistry;
@@ -87,6 +102,7 @@ import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.DynamicPropertyRegistry;
 import org.springframework.test.context.DynamicPropertySource;
 import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
 import org.testcontainers.shaded.org.checkerframework.checker.nullness.qual.Nullable;
 
 @EmbeddedKafka
@@ -134,6 +150,9 @@ public class EndToEndDbTest {
     @Autowired
     private DSLContext writeDataDslContext;
 
+    @MockitoSpyBean
+    IngestionAuditLogger auditLogger;
+
     @DynamicPropertySource
     static void setProperties(DynamicPropertyRegistry registry) {
         registry.add("spring.datasource.read.jdbc-url", () -> postgresqlContainer.getJdbcUrl());
@@ -151,13 +170,16 @@ public class EndToEndDbTest {
     private OffsetDateTime testStartTime;
 
     @BeforeAll
-    static void beforeAll() {
+    static void beforeAll() throws SchemaLoaderException {
         TestPostgresqlContainer.loadData();
         TestPostgresqlContainer.loadIngestionTestData();
+        TestPostgresqlContainer.loadEndToEndTestData();
+        SchemaLoader mockSchemaLoader = new MockSchemaLoader();
+        mockSchemaLoader.loadSchemaRegistry();
     }
 
     @BeforeEach
-    void setupEach() {
+    void setupEach() throws IOException, YangException {
         TestPostgresqlContainer.truncateSchemas(List.of(TEIV_DATA_SCHEMA), writeDataDslContext);
         appInit = new AppInit(dependentServiceAvailabilityKafka, kafkaTopicService, listenerStarter);
         appInit.startUpHandler();
@@ -165,6 +187,7 @@ public class EndToEndDbTest {
                 new StringSerializer(), new CloudEventSerializer());
         producer = factory.createProducer();
         testStartTime = OffsetDateTime.now(ZoneOffset.UTC);
+        YangModelValidationTestUtil.mockLoadAndValidateModels();
     }
 
     @AfterEach
@@ -268,8 +291,7 @@ public class EndToEndDbTest {
 
         testStartTime = OffsetDateTime.now(ZoneOffset.UTC);
         sendEventFromFile(CREATE_INFERRED_ENTITIES);
-
-        validateWithTimeout(25, () -> {
+        validateWithTimeout(30, () -> {
             EndToEndExpectedResults expected = getExpectedResults(EXP_CREATE_INFERRED_ENTITIES);
             assertDbContainsExpectedValues(expected);
             validateReceivedCloudEventMetrics(5, 3, 0, 0);
@@ -299,6 +321,23 @@ public class EndToEndDbTest {
             EndToEndExpectedResults notExpected = getExpectedResults(NOT_EXP_DELETE_ONE_TO_ONE_PATH);
             assertDbNotContainsExpectedValues(notExpected);
             validateReceivedCloudEventMetrics(6, 3, 2, 0);
+            List<Map<String, List<String>>> expectedItems = List.of(Map.of(
+                    "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", List.of(
+                            "relation_11", "relation_12")), Map.of(
+                                    "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt",
+                                    List.of("ManagedElement_21")));
+            List<OperationResult> operationResults = List.of(OperationResult.builder().id("relation_11").type(
+                    "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").module("o-ran-smo-teiv-rel-oam-ran-test")
+                    .build(), OperationResult.builder().id("ManagedElement_21").type(
+                            "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt").module(
+                                    "o-ran-smo-teiv-oam-test").build(), OperationResult.builder().id("relation_12").type(
+                                            "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").module(
+                                                    "o-ran-smo-teiv-rel-oam-ran-test").build());
+            ArgumentCaptor<List<String>> auditLogCaptor = ArgumentCaptor.forClass(List.class);
+            Mockito.verify(auditLogger, Mockito.atLeastOnce()).logSuccess(eq(ExecutionStatus.SUCCESS), eq("delete"), any(
+                    CloudEvent.class), nullable(String.class), auditLogCaptor.capture());
+            List<String> actualResponse = auditLogCaptor.getValue();
+            assertEquals(fromOperationResults(operationResults), actualResponse);
         });
 
         testStartTime = OffsetDateTime.now(ZoneOffset.UTC);
@@ -557,7 +596,7 @@ public class EndToEndDbTest {
     }
 
     private void validateWithTimeout(int timeout, Runnable runnable) {
-        Awaitility.await().atMost(timeout, TimeUnit.SECONDS).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> {
+        Awaitility.await().atMost(timeout, TimeUnit.SECONDS).pollDelay(Duration.ofSeconds(10)).untilAsserted(() -> {
             try {
                 runnable.run();
             } catch (AssertionError e) {
index a5f7cbb..6307714 100644 (file)
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import javax.sql.DataSource;
 
@@ -57,7 +58,6 @@ import org.oran.smo.teiv.service.models.OperationResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.test.context.ActiveProfiles;
 
@@ -83,6 +83,7 @@ import org.oran.smo.teiv.service.cloudevent.data.Relationship;
 import org.oran.smo.teiv.startup.SchemaHandler;
 import org.oran.smo.teiv.utils.CloudEventTestUtil;
 import org.oran.smo.teiv.utils.JooqTypeConverter;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 
 @Configuration
 @SpringBootTest
@@ -106,7 +107,7 @@ class TeivDbOperationResultsTest {
 
     @Autowired
     CloudEventParser cloudEventParser;
-    @MockBean
+    @MockitoBean
     private SchemaHandler schemaHandler;
 
     @BeforeAll
@@ -119,6 +120,7 @@ class TeivDbOperationResultsTest {
         teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(),
                 new RelationshipMergeValidator(), new TeivMetadataResolver());
         TestPostgresqlContainer.loadIngestionTestData();
+        TestPostgresqlContainer.loadEndToEndTestData();
         PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper());
         postgresSchemaLoader.loadSchemaRegistry();
     }
@@ -130,7 +132,7 @@ class TeivDbOperationResultsTest {
             entityTypeMe = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement");
             entityTypeORU = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "ORUFunction");
             entityTypeAntennMod = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment", "AntennaModule");
-            entityTypeAntennModLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+            entityTypeAntennModLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                     "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
             entityTypeAntennCap = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran", "AntennaCapability");
             relTypeMeManagesORU = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran",
@@ -138,7 +140,7 @@ class TeivDbOperationResultsTest {
             relTypeantennServesAntennCap = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-equipment-ran",
                     "ANTENNAMODULE_SERVES_ANTENNACAPABILITY");
             relTypeAntennModRealisedByAntennaModLongName = SchemaRegistry.getRelationTypeByModuleAndName(
-                    "o-ran-smo-teiv-equipment", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE");
+                    "o-ran-smo-teiv-equipment-test", "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE");
         } catch (SchemaRegistryException e) {
             throw new RuntimeException(e);
         }
@@ -179,8 +181,8 @@ class TeivDbOperationResultsTest {
                 .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam", "ManagedElement"), "managed_element_entity_id1");
 
         assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("managed_element_entity_id1").type(
-                "ManagedElement").category(ENTITY_CATEGORY).build()),
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("managed_element_entity_id1")
+                .type("ManagedElement").category(ENTITY_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'managed_element_entity_id1'");
 
         // Delete operation with the same EIID - expected to fail
@@ -194,14 +196,14 @@ class TeivDbOperationResultsTest {
     void testDeleteOneToOneByRelationId() throws SchemaRegistryException {
         Map<String, Object> managedElementEntity = new HashMap<>();
         managedElementEntity.put("id", "me-id1");
-        EntityType entityTypeMeLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam",
+        EntityType entityTypeMeLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-oam-test",
                 "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt");
         teivDbOperations.merge(dslContext, entityTypeMeLongName, managedElementEntity);
 
         Map<String, Object> nrCellDuEntity = new HashMap<>();
         nrCellDuEntity.put("id", "nrcelldu-id1");
         nrCellDuEntity.put("020335B0F627C169E24167748C38FE756FB34AE2", 1);
-        EntityType entityTypeNrCellDuLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+        EntityType entityTypeNrCellDuLongName = SchemaRegistry.getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                 "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU");
         teivDbOperations.merge(dslContext, entityTypeNrCellDuLongName, nrCellDuEntity);
 
@@ -215,25 +217,25 @@ class TeivDbOperationResultsTest {
 
         // Delete operation for aSide - expected to succeed
         Optional<OperationResult> deleteASideResultMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId(
-                dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran",
+                dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran-test",
                         "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU"));
 
         assertTrue(deleteASideResultMatch.isPresent(), "Delete operation should return a present Optional");
-        assertEquals(OperationResult.builder().id("eiid1").type("ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU")
-                .category(RELATIONSHIP_CATEGORY).build(), deleteASideResultMatch.get(),
-                "The delete operation result should be present for: 'eiid1'");
+        assertTrue(containsWithPartialMatch(deleteASideResultMatch.stream().collect(Collectors.toList()), OperationResult
+                .builder().id("eiid1").type("ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU").category(
+                        RELATIONSHIP_CATEGORY).build()), "The delete operation result should be present for: 'eiid1'");
 
         // Delete operation with the same EIID - expected to fail
         Optional<OperationResult> deleteResultNoMatch = teivDbOperations.deleteRelationFromEntityTableByRelationId(
-                dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran",
+                dslContext, "eiid1", SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-rel-oam-ran-test",
                         "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU"));
         assertTrue(deleteResultNoMatch.isEmpty(),
                 "Delete operation should return an empty list for already deleted/non existing ID");
 
         Result<Record> nrcellduRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"84E676149362F50C55FE1E004B98D4891916BBF3\"");
+                "teiv_data.\"F93C2CA075353668A76B4718E07B741ACCD83641\"");
         Result<Record> managedElementRows = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"28C9A375E800E82308EBE7DA2932EF2C0AF13C38\"");
+                "teiv_data.\"C9475FE40C02BEB41F720B4284A856F2CF49E1F3\"");
         assertEquals("me-id1", managedElementRows.get(0).get("id"));
         assertEquals("nrcelldu-id1", nrcellduRows.get(0).get("id"));
         assertNull(managedElementRows.get(0).get("REL_FK_used-nrCellDu"));
@@ -267,9 +269,9 @@ class TeivDbOperationResultsTest {
                         "MANAGEDELEMENT_MANAGES_ORUFUNCTION"));
 
         assertFalse(deleteResultMatch.isEmpty(), "Delete operation should return a non-empty list");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid1").type(
-                "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()),
-                "The list should contain the delete operation result with id: 'eiid1'");
+        assertTrue(containsWithPartialMatch(deleteResultMatch, (OperationResult.builder().id("eiid1").type(
+                "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).module("o-ran-smo-teiv-rel-oam-ran")
+                .build())), "The list should contain the delete operation result with id: 'eiid1'");
 
         // Delete operation with the same entity ID - expected to return an empty list
         List<OperationResult> deleteResultNoMatch = teivDbOperations.deleteRelationshipByManySideEntityId(dslContext,
@@ -315,16 +317,17 @@ class TeivDbOperationResultsTest {
 
         // Check if all expected IDs are present in the deletion result
         assertEquals(4, deleteResultMatch.size(), "Delete operation should match expected size");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("me-id1").type("ManagedElement").category(
-                ENTITY_CATEGORY).build()), "The list should contain the delete operation result with id: 'me-id1'");
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("me-id1").type("ManagedElement")
+                .category(ENTITY_CATEGORY).build()),
+                "The list should contain the delete operation result with id: 'me-id1'");
 
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid1").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid1").type(
                 "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'eiid1'");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid2").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid2").type(
                 "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'eiid2'");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("eiid3").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("eiid3").type(
                 "MANAGEDELEMENT_MANAGES_ORUFUNCTION").category(RELATIONSHIP_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'eiid3'");
 
@@ -387,8 +390,9 @@ class TeivDbOperationResultsTest {
         Optional<OperationResult> deleteResultMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext,
                 relType, "rel_id1");
         assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional");
-        assertEquals(OperationResult.builder().id("rel_id1").type("ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(
-                RELATIONSHIP_CATEGORY).build(), deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'");
+        assertTrue(containsWithPartialMatch(deleteResultMatch.stream().collect(Collectors.toList()), OperationResult
+                .builder().id("rel_id1").type("ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY)
+                .build()), "Deleted relationship ID should match 'rel_id1'");
 
         // Test deletion of the same relationship ID again (expected failure)
         Optional<OperationResult> deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext,
@@ -441,11 +445,11 @@ class TeivDbOperationResultsTest {
         List<OperationResult> deleteResultMatch = teivDbOperations.deleteManyToManyRelationByEntityId(dslContext, relType,
                 "antennamodule_id1", "aSide_AntennaModule", "bSide_AntennaCapability");
         assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id1").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id1").type(
                 "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'rel_id1'");
 
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id2").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id2").type(
                 "ANTENNAMODULE_SERVES_ANTENNACAPABILITY").category(RELATIONSHIP_CATEGORY).build()),
                 "The list should contain the delete operation result with id: 'rel_id2'");
 
@@ -493,13 +497,13 @@ class TeivDbOperationResultsTest {
         teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2);
 
         Result<Record> row1 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"");
+                "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"");
         assertEquals(2, row1.size());
         Result<Record> row2 = TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\"");
+                "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"");
         assertEquals(2, row2.size());
 
-        RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment",
+        RelationType antennaRelType1 = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                 "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE");
 
         // Test deletion of a relationship by ID (expected success)
@@ -507,9 +511,9 @@ class TeivDbOperationResultsTest {
                 antennaRelType1, "rel_id1");
 
         assertTrue(deleteResultMatch.isPresent(), "Delete operation should return a present Optional");
-        assertEquals(OperationResult.builder().id("rel_id1").type(
-                "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY).build(),
-                deleteResultMatch.get(), "Deleted relationship ID should match 'rel_id1'");
+        assertTrue(containsWithPartialMatch(deleteResultMatch.stream().collect(Collectors.toList()), OperationResult
+                .builder().id("rel_id1").type("ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(
+                        RELATIONSHIP_CATEGORY).build()), "Deleted relationship ID should match 'rel_id1'");
 
         // Test deletion of the same relationship ID again (expected failure)
         Optional<OperationResult> deleteResultNoMatch = teivDbOperations.deleteManyToManyRelationByRelationId(dslContext,
@@ -554,12 +558,12 @@ class TeivDbOperationResultsTest {
         teivDbOperations.merge(dslContext, relTypeAntennModRealisedByAntennaModLongName, rel2);
 
         assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"53017288F3FE983848689A3DD21D48D298CCD23E\"").size(), "Expected two AntennaModule records");
+                "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"").size(), "Expected two AntennaModule records");
         assertEquals(2, TeivDbServiceContainerizedTest.selectAllRowsFromTable(dslContext,
-                "teiv_data.\"53089669D370B15C78B7E8376D434921D1C94240\"").size(),
+                "teiv_data.\"98D95275440120DC7A5FEF7E870FB6649F275AEC\"").size(),
                 "Expected two ANTENNAMODULE_REALISED_BY_ANTENNAMODULE relations");
 
-        RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment",
+        RelationType relType = SchemaRegistry.getRelationTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                 "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE");
 
         // Test deletion of relations by entity ID (expected to delete two relations)
@@ -567,11 +571,11 @@ class TeivDbOperationResultsTest {
                 "module_id1", "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C",
                 "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E");
         assertEquals(2, deleteResultMatch.size(), "Expected two relations to be deleted");
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id1").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id1").type(
                 "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY)
                 .build()), "The list should contain the delete operation result with id: 'rel_id1'");
 
-        assertTrue(deleteResultMatch.contains(OperationResult.builder().id("rel_id2").type(
+        assertTrue(containsWithPartialMatch(deleteResultMatch, OperationResult.builder().id("rel_id2").type(
                 "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE").category(RELATIONSHIP_CATEGORY)
                 .build()), "The list should contain the delete operation result with id: 'rel_id2'");
 
@@ -610,37 +614,37 @@ class TeivDbOperationResultsTest {
 
         // Entity with One_To_One relationship
         List<OperationResult> deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-oam-test",
                         "ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt"), "ManagedElement_3");
         assertEquals(2, deleteEntityResult1.size());
 
         // Entity with One_To_Many relationship
         List<OperationResult> deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"), "ODUFunction_1");
         assertEquals(2, deleteEntityResult2.size());
 
         // Entity and Many_To_One relationship
         List<OperationResult> deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"), "LTESectorCarrier_id1");
         assertEquals(2, deleteEntityResult3.size());
 
         // Entity with Many_To_Many relationship
         List<OperationResult> deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                         "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_7");
         assertEquals(2, deleteEntityResult4.size());
 
         // Entity with One_To_Many relationship ConnectingSameEntity
         List<OperationResult> deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                         "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_5");
         assertEquals(2, deleteEntityResult5.size());
 
         // Entity with One_To_One relationship ConnectingSameEntity
         List<OperationResult> deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                         "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_1");
         assertEquals(2, deleteEntityResult6.size());
     }
@@ -658,44 +662,44 @@ class TeivDbOperationResultsTest {
 
         // Entity with One_To_One relationship
         List<OperationResult> deleteEntityResult1 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_2");
         assertEquals(2, deleteEntityResult1.size());
 
         // Entity with One_To_Many relationship
         List<OperationResult> deleteEntityResult2 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"), "NRCellDU_1");
         assertEquals(2, deleteEntityResult2.size());
 
         // Entity with Many_To_One relationship
         List<OperationResult> deleteEntityResult3 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id2");
         assertEquals(2, deleteEntityResult3.size());
 
         // Entity with Many_To_Many relationship
         List<OperationResult> deleteEntityResult4 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1");
         assertEquals(2, deleteEntityResult4.size());
 
         // Entity with One_To_Many relationship ConnectingSameEntity
         List<OperationResult> deleteEntityResult5 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                         "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_6");
         assertEquals(2, deleteEntityResult5.size());
 
         // Entity with One_To_One relationship ConnectingSameEntity
         List<OperationResult> deleteEntityResult6 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-equipment-test",
                         "AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), "AntennaModule_2");
         assertEquals(2, deleteEntityResult6.size());
 
         // Again delete AntennaCapability(id=AntennaCapability_id1) should
         // return empty result list
         List<OperationResult> deleteEntityResult7 = teivDbOperations.deleteEntity(dslContext, SchemaRegistry
-                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran",
+                .getEntityTypeByModuleAndName("o-ran-smo-teiv-ran-test",
                         "AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"), "AntennaCapability_id1");
         assertTrue(deleteEntityResult7.isEmpty(),
                 "Delete operation should return an empty list for already deleted/non existing ID");
@@ -713,7 +717,7 @@ class TeivDbOperationResultsTest {
         assertEquals(25, mergeResult.size());
 
         // One_To_One Relationship
-        Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran",
+        Relationship oneToOneRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran-test",
                 "ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU", "ManagedElement_USES_NRCELLDU_relation_1",
                 "ManagedElement_3", "NRCellDU_2", List.of());
         RelationType oneToOneRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToOneRelationship.getModule(),
@@ -723,7 +727,7 @@ class TeivDbOperationResultsTest {
         assertTrue(deleteOneToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional");
 
         // One_To_Many Relationship
-        Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran",
+        Relationship oneToManyRelationship = new Relationship("o-ran-smo-teiv-rel-oam-ran-test",
                 "MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN",
                 "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1", "ManagedElement_1", "ODUFunction_1", List.of());
         RelationType oneToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(oneToManyRelationship
@@ -734,7 +738,7 @@ class TeivDbOperationResultsTest {
         assertTrue(deleteOneToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional");
 
         // Many_To_One Relationship
-        Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran",
+        Relationship manyToOneRelationship = new Relationship("o-ran-smo-teiv-ran-test",
                 "LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY",
                 "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1", "LTESectorCarrier_id1", "AntennaCapability_id2", List
                         .of());
@@ -746,7 +750,7 @@ class TeivDbOperationResultsTest {
         assertTrue(deleteManyToOneRelationshipResult.isPresent(), "Delete operation should return a present Optional");
 
         // Many_To_Many Relationship
-        Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran",
+        Relationship manyToManyRelationship = new Relationship("o-ran-smo-teiv-rel-equipment-ran-test",
                 "ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY",
                 "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1", "AntennaModule_7", "AntennaCapability_id1", List.of());
         RelationType manyToManyRelationType = SchemaRegistry.getRelationTypeByModuleAndName(manyToManyRelationship
@@ -756,7 +760,7 @@ class TeivDbOperationResultsTest {
         assertTrue(deleteManyToManyRelationshipResult.isPresent(), "Delete operation should return a present Optional");
 
         // One_To_One Relationship ConnectingSameEntity
-        Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-equipment",
+        Relationship connectingSameEntityOneToOneRelationship = new Relationship("o-ran-smo-teiv-equipment-test",
                 "ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE",
                 "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1", "AntennaModule_1", "AntennaModule_2", List.of());
         RelationType connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName(
@@ -768,7 +772,7 @@ class TeivDbOperationResultsTest {
                 "Delete operation should return a present Optional");
 
         // One_To_Many Relationship ConnectingSameEntity
-        Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-equipment",
+        Relationship connectingSameEntityOneToManyRelationship = new Relationship("o-ran-smo-teiv-equipment-test",
                 "ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE",
                 "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1", "AntennaModule_5", "AntennaModule_6", List.of());
         connectingSameEntityType = SchemaRegistry.getRelationTypeByModuleAndName(connectingSameEntityOneToManyRelationship
@@ -1193,4 +1197,10 @@ class TeivDbOperationResultsTest {
                 Object::toString).anyMatch(result.getId()::equals);
         assertTrue(contains);
     }
+
+    private boolean containsWithPartialMatch(List<OperationResult> list, OperationResult op) {
+        return list.stream().anyMatch(obj -> Objects.equals(obj.getId(), op.getId()) && Objects.equals(obj.getType(), op
+                .getType()) && Objects.equals(obj.getCategory(), op.getCategory()) && (op.getModule() == null || Objects
+                        .equals(obj.getModule(), op.getModule())));
+    }
 }
index 69749e7..f9e9730 100644 (file)
@@ -31,7 +31,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import io.cloudevents.CloudEvent;
 import io.cloudevents.SpecVersion;
 import io.cloudevents.core.builder.CloudEventBuilder;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 public class CloudEventTestUtil {
 
     private CloudEventTestUtil() {
@@ -62,6 +64,7 @@ public class CloudEventTestUtil {
             cloudEventBuilder.withDataSchema(URI.create(rootNode.get("dataschema").asText()));
             cloudEventBuilder.withData(rootNode.get("data").toString().getBytes());
             CloudEvent event = cloudEventBuilder.build();
+            log.info("CloudEvent data: {}", rootNode.get("data").toString());
             return event;
         } catch (Exception e) {
             throw new RuntimeException(e);
index c1b6203..c47b699 100644 (file)
@@ -1,76 +1,77 @@
-/*
- *  ============LICENSE_START=======================================================
- *  Copyright (C) 2024 Ericsson
- *  Modifications Copyright (C) 2024 OpenInfra Foundation Europe
- *  ================================================================================
- *  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.
- *
- *  SPDX-License-Identifier: Apache-2.0
- *  ============LICENSE_END=========================================================
- */
+///*
+// *  ============LICENSE_START=======================================================
+// *  Copyright (C) 2024 Ericsson
+// *  Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+// *  ================================================================================
+// *  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.
+// *
+// *  SPDX-License-Identifier: Apache-2.0
+// *  ============LICENSE_END=========================================================
+// */
 package org.oran.smo.teiv.utils;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.clients.producer.ProducerRecord;
-import org.apache.kafka.common.serialization.StringSerializer;
-import org.springframework.kafka.core.DefaultKafkaProducerFactory;
-import org.springframework.kafka.test.EmbeddedKafkaBroker;
-import org.springframework.kafka.test.utils.KafkaTestUtils;
-import org.springframework.web.client.RestTemplate;
-
-import org.oran.smo.teiv.config.KafkaConfig;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import io.cloudevents.CloudEvent;
-import io.cloudevents.kafka.CloudEventSerializer;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class EndToEndTestUtil {
-    public static void sendEventList(final List<CloudEvent> events, EmbeddedKafkaBroker embeddedKafkaBroker,
-            KafkaConfig kafkaConfig) {
-        Map<String, Object> configs = new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker));
-        Producer<String, CloudEvent> producer = new DefaultKafkaProducerFactory<>(configs, new StringSerializer(),
-                new CloudEventSerializer()).createProducer();
-        for (CloudEvent event : events) {
-            ProducerRecord<String, CloudEvent> producerRecord = new ProducerRecord<String, CloudEvent>(kafkaConfig
-                    .getTopologyIngestion().getTopicName(), null, event);
-            producer.send(producerRecord);
-        }
-    }
-
-    public static String getResponseFromApi(final String uri) {
-        RestTemplate restTemplate = new RestTemplate();
-        return restTemplate.getForObject(uri, String.class);
-    }
-
-    public static String processApiCall(final String uri) {
-        log.info("(processApiCall) Sending request for: {}", uri);
-        String responseBody = getResponseFromApi(uri);
-        log.info("(processApiCall) Response: {}", responseBody);
-        return responseBody;
-    }
-
-    public static Map<String, Object> processNode(JsonNode node) {
-        ObjectMapper mapper = new ObjectMapper();
-        return mapper.convertValue(node, new TypeReference<>() {
-        });
-    }
-
-}
+//
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+//import org.apache.kafka.clients.producer.Producer;
+//import org.apache.kafka.clients.producer.ProducerRecord;
+//import org.apache.kafka.common.serialization.StringSerializer;
+//import org.springframework.kafka.core.DefaultKafkaProducerFactory;
+//import org.springframework.kafka.test.EmbeddedKafkaBroker;
+//import org.springframework.kafka.test.utils.KafkaTestUtils;
+//import org.springframework.web.client.RestTemplate;
+//
+//import org.oran.smo.teiv.config.KafkaConfig;
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.JsonNode;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//
+//import io.cloudevents.CloudEvent;
+//import io.cloudevents.kafka.CloudEventSerializer;
+//import lombok.extern.slf4j.Slf4j;
+//
+//@Slf4j
+//public class EndToEndTestUtil {
+//    public static void sendEventList(final List<CloudEvent> events, EmbeddedKafkaBroker embeddedKafkaBroker,
+//            KafkaConfig kafkaConfig) {
+//        Map<String, Object> configs = new HashMap<>(KafkaTestUtils.producerProps(embeddedKafkaBroker));
+//        Producer<String, CloudEvent> producer = new DefaultKafkaProducerFactory<>(configs, new StringSerializer(),
+//                new CloudEventSerializer()).createProducer();
+//        for (CloudEvent event : events) {
+//            ProducerRecord<String, CloudEvent> producerRecord = new ProducerRecord<String, CloudEvent>(kafkaConfig
+//                    .getTopologyIngestion().getTopicName(), null, event);
+//            producer.send(producerRecord);
+//        }
+//    }
+//
+//    public static String getResponseFromApi(final String uri) {
+//        RestTemplate restTemplate = new RestTemplate();
+//        return restTemplate.getForObject(uri, String.class);
+//    }
+//
+//    public static String processApiCall(final String uri) {
+//        log.info("(processApiCall) Sending request for: {}", uri);
+//        String responseBody = getResponseFromApi(uri);
+//        log.info("(processApiCall) Response: {}", responseBody);
+//        return responseBody;
+//    }
+//
+//    public static Map<String, Object> processNode(JsonNode node) {
+//        ObjectMapper mapper = new ObjectMapper();
+//        return mapper.convertValue(node, new TypeReference<>() {
+//        });
+//    }
+//
+//}
index 5ca0097..f485008 100644 (file)
@@ -64,13 +64,13 @@ class ExposureYangParserTest {
     @Test
     void testValidateCorrectSchema() throws YangException {
         MultipartFile correctFile = new MockMultipartFile("file", "file.yang", MediaType.MULTIPART_FORM_DATA_VALUE,
-                ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + "    import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + "        leaf test1 {\n" + "            type string;\n" + "        }\n" + "\t\tleaf test2 {\n" + "            type boolean;\n" + "        }\n" + "\t\tleaf test3 {\n" + "            type uint32;\n" + "        }\n" + "    }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase model:classifiers;\n" + "\t}\n" + " \n" + "    identity urban {\n" + "        base geo-classifier;\n" + "    }\n" + "\t\n" + "\tidentity rural {\n" + "        base geo-classifier;\n" + "    }\n" + "\n" + "}")
+                ("module module-rapp-module1 {\n" + " \n" + "\tyang-version 1.1;\n" + "\tnamespace \"urn:module-rapp-model\";\n" + "\tprefix testModule;\n" + "\t\n" + "    import o-ran-smo-teiv-common-yang-types { prefix model; }\n" + "\timport o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }\n" + "\t\n" + "\trevision \"2024-05-08\" {\n" + "\t\tdescription\n" + "\t\t\"Initial revision.\";\n" + "\t\tor-teiv-yext:label 0.3.0;\n" + "\t}\n" + "\t\n" + "\taugment /model:decorators {\n" + "        leaf test1 {\n" + "            type string;\n" + "        }\n" + "\t\tleaf test2 {\n" + "            type boolean;\n" + "        }\n" + "\t\tleaf test3 {\n" + "            type uint32;\n" + "        }\n" + "\t\tleaf test4 {\n" + "            type decimal64;\n" + "        }\n" + "        }\n" + "\t\n" + "\tidentity geo-classifier {\n" + "\t\tbase model:classifiers;\n" + "\t}\n" + " \n" + "    identity urban {\n" + "        base geo-classifier;\n" + "    }\n" + "\t\n" + "\tidentity rural {\n" + "        base geo-classifier;\n" + "    }\n" + "\n" + "}")
                         .getBytes());
         Map<String, Object> expected = new HashMap<>();
         expected.put("moduleName", "module-rapp-module1");
         expected.put("revision", "2024-05-08");
         expected.put(CLASSIFIERS, List.of("geo-classifier", "urban", "rural"));
-        expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT"));
+        expected.put(DECORATORS, Map.of("test1", "TEXT", "test2", "BOOLEAN", "test3", "INT", "test4", "DEC"));
 
         Map<String, Object> actual = ExposureYangParser.validateSchemasYang(correctFile);
         assertEquals(expected, actual);
index 5b8e951..5fc1af7 100644 (file)
@@ -30,7 +30,9 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -73,6 +75,27 @@ class IngestionYangParserTest {
         IngestionYangParser.loadModels();
     }
 
+    @Test
+    void testLoadAndValuateModels_Successful() {
+        final Set<String> modulesToImport = Set.of("_3gpp-common-yang-extensions", "_3gpp-common-yang-types",
+                "ietf-geo-location", "ietf-inet-types", "ietf-yang-types");
+
+        final Set<String> modulesToImplement = Set.of("o-ran-smo-teiv-common-yang-extensions",
+                "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran",
+                "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-rel-oam-ran");
+
+        List<String> importModelList = assertDoesNotThrow(() -> YangModelLoader.readYangModelsFromPath(
+                "classpath:models/import/*.yang"));
+        List<String> implementModelList = assertDoesNotThrow(() -> YangModelLoader.readYangModelsFromPath(
+                "classpath:models/*.yang"));
+
+        Set<String> importModulesSet = new HashSet<>(importModelList);
+        Set<String> implementModulesSet = new HashSet<>(implementModelList);
+
+        assertTrue(importModulesSet.containsAll(modulesToImport));
+        assertTrue(implementModulesSet.containsAll(modulesToImplement));
+    }
+
     @Test
     void parseMultipleTypesOfEntities() throws YangException {
         RootInstance rootInstance = parseAndValidateFromFile("src/test/resources/yang/parser/multiple-entity.json",
diff --git a/teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java b/teiv/src/test/java/org/oran/smo/teiv/utils/YangModelValidationTestUtil.java
new file mode 100644 (file)
index 0000000..3bdfe27
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+ *  ================================================================================
+ *  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.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.oran.smo.teiv.utils;
+
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.oran.smo.teiv.exception.YangException;
+import org.oran.smo.teiv.exception.YangSchemaException;
+import org.oran.smo.teiv.exposure.spi.Module;
+import org.oran.smo.teiv.schema.SchemaRegistry;
+import org.oran.smo.teiv.utils.yangparser.IngestionYangParser;
+import org.oran.smo.teiv.utils.yangparser.YangModelLoader;
+import org.oran.smo.yangtools.parser.input.StringYangInput;
+import org.oran.smo.yangtools.parser.model.ConformanceType;
+import org.oran.smo.yangtools.parser.model.YangModel;
+import org.springframework.util.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static org.mockito.ArgumentMatchers.any;
+
+public class YangModelValidationTestUtil {
+    public static void mockLoadAndValidateModels() throws YangException, IOException {
+        try (MockedStatic<YangModelLoader> mockedLoader = Mockito.mockStatic(YangModelLoader.class)) {
+            List<String> modulesImport = collectYangFilesNameFromPath("src/main/resources/models/import");
+            List<String> modulesImplement = collectYangFilesNameFromPath("src/main/resources/models");
+            modulesImplement.addAll(collectYangFilesNameFromPath("src/test/resources/yang/models"));
+
+            Map<String, Module> modules = SchemaRegistry.getModuleRegistry();
+            if (modules == null) {
+                throw YangSchemaException.failedToLoadSchema();
+            }
+
+            List<String> implementList = new ArrayList<>();
+            List<String> importList = new ArrayList<>();
+
+            modules.values().stream().filter(module -> module.getContent() != null).forEach(module -> {
+                String content = new String(Base64.getDecoder().decode(module.getContent()), StandardCharsets.UTF_8);
+                if (modulesImport.contains(module.getName())) {
+                    importList.add(content);
+                }
+                if (modulesImplement.contains(module.getName())) {
+                    implementList.add(content);
+                }
+            });
+
+            List<YangModel> models = createYangModels(importList, implementList);
+            mockedLoader.when(() -> YangModelLoader.loadModulesFromSchemaRegistry()).thenReturn(models);
+            mockedLoader.when(() -> YangModelLoader.createParserExecutionContext(any(), any(), any())).thenCallRealMethod();
+            mockedLoader.when(() -> YangModelLoader.parseModelsIntoContext(any(), any())).thenReturn(models);
+            IngestionYangParser.loadModels();
+        }
+    }
+
+    private static List<String> collectYangFilesNameFromPath(String resourcePath) throws IOException {
+        File directory = new File(resourcePath);
+        if (directory.isFile()) {
+            return List.of(StringUtils.stripFilenameExtension(directory.getName().toLowerCase(Locale.ROOT)));
+        }
+        File[] files = directory.listFiles();
+        if (files == null) {
+            throw new IOException();
+        }
+        return Arrays.stream(files).filter(File::isFile).filter(file -> file.getName().endsWith(".yang")).map(
+                file -> StringUtils.stripFilenameExtension(file.getName().toLowerCase(Locale.ROOT))).collect(Collectors
+                        .toList());
+    }
+
+    public static List<YangModel> createYangModels(List<String> importList, List<String> implementList) {
+        List<YangModel> yangModelInputs = new ArrayList<>();
+        yangModelInputs.addAll(createYangModels(importList, ConformanceType.IMPORT));
+        yangModelInputs.addAll(createYangModels(implementList, ConformanceType.IMPLEMENT));
+        return yangModelInputs;
+    }
+
+    private static List<YangModel> createYangModels(List<String> resources, ConformanceType conformanceType) {
+        return resources.stream().map(resource -> new YangModel(new StringYangInput(resource, resource,
+                "application/yang-data+json"), conformanceType)).filter(Objects::nonNull).toList();
+    }
+}
index ef4d22e..dfed6ed 100644 (file)
@@ -13,7 +13,7 @@
                     {
                         "id": "id1",
                         "attributes": {
-                            "gNBId": -1.0
+                            "gNBId": "abba"
                         },
                         "sourceIds": [
                             "source1",
index 8dc4da7..cb0bd55 100644 (file)
                     {
                         "id": "AntennaCapability_3",
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "1",
-                                "attribute_2": "2"
-                            }
+                            "geranFqBands": [
+                                "1",
+                                "2"
+                            ]
                         },
                         "sourceIds": [
                             "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1",
@@ -45,7 +45,7 @@
                         "id": "ODU_2",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": "111",
+                                "mcc": "251",
                                 "mnc": "211"
                             },
                             "gNBDUId": 13,
                 ]
             },
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_61",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "source1",
                             "source2"
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_41",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "source1",
                             "source2"
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "relation_one_to_one_missing_bSide",
                         "aSide": "ManagedElement_61",
                             "source1",
                             "source2"
                         ]
+                    },
+                    {
+                        "id": "relation_one_to_one_both_sides_missing",
+                        "aSide": "ManagedElement_X",
+                        "bSide": "NRCellDU_X",
+                        "sourceIds": [
+                            "source1",
+                            "source2"
+                        ]
                     }
                 ]
             },
                             "source1",
                             "source2"
                         ]
+                    },
+                    {
+                        "id": "relation_one_to_many_both_sides_missing",
+                        "aSide": "ODU_X",
+                        "bSide": "NRCellDU_X",
+                        "sourceIds": [
+                            "source1",
+                            "source2"
+                        ]
                     }
                 ]
             },
index 8610767..dbb6008 100644 (file)
                     {
                         "id": "AntennaCapability_1",
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "1",
-                                "attribute_2": "2"
-                            }
+                            "geranFqBands": [
+                                "1",
+                                "2"
+                            ]
                         },
                         "sourceIds": [
                             "source1",
                     {
                         "id": "AntennaCapability_2",
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "1",
-                                "attribute_2": "2"
-                            }
+                            "geranFqBands": [
+                                "1",
+                                "2"
+                            ]
                         },
                         "sourceIds": [
                             "source1",
index b954484..6e3cef2 100644 (file)
@@ -12,9 +12,6 @@
                 "o-ran-smo-teiv-oam:ManagedElement": [
                     {
                         "id": "ManagedElement_1",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "urn:3gpp:dn:fdn1",
                             "urn:cmHandle:1234"
index 1869e10..8bc8370 100644 (file)
@@ -12,9 +12,6 @@
                 "o-ran-smo-teiv-oam:ManagedElement": [
                     {
                         "id": "ManagedElement_1",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "urn:3gpp:dn:fdn1",
                             "urn:cmHandle:12345"
@@ -22,9 +19,6 @@
                     },
                     {
                         "id": "ManagedElement_2",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "urn:3gpp:dn:fdn1",
                             "urn:cmHandle:12345"
@@ -52,8 +46,8 @@
                         "id": "ODU_1",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": 110,
-                                "mnc": 210
+                                "mcc": "250",
+                                "mnc": "210"
                             },
                             "gNBDUId": 111,
                             "gNBId": 123,
index 40b6d97..1d58268 100644 (file)
@@ -9,12 +9,9 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_21",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "source1",
                             "source2"
@@ -22,9 +19,6 @@
                     },
                     {
                         "id": "ManagedElement_41",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "source1",
                             "source2"
@@ -33,7 +27,7 @@
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_21",
                         "attributes": {
@@ -62,7 +56,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "relation_11",
                         "aSide": "ManagedElement_21",
index 1f61d05..a9e2735 100644 (file)
@@ -33,7 +33,7 @@
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
+                "o-ran-smo-teiv-equipment-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
                     {
                         "id": "AntennaModule_3",
                         "attributes": {
@@ -79,7 +79,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "one_to_many_relation_1",
                         "aSide": "AntennaModule_3",
@@ -92,7 +92,7 @@
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "one_to_one_relation_1",
                         "aSide": "AntennaModule_51",
index a8ff2d0..f27419d 100644 (file)
                             "urn:cmHandle:395221E080CCF0FD1929103B15999999"
                         ],
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "1",
-                                "attribute_2": "2"
-                            }
+                            "geranFqBands": [
+                                "1",
+                                "2"
+                            ]
                         }
                     },
                     {
                             "urn:cmHandle:395221E080CCF0FD1929103B15999999"
                         ],
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "1",
-                                "attribute_2": "2"
-                            }
+                            "geranFqBands": [
+                                "1",
+                                "2"
+                            ]
                         }
                     }
                 ]
index dc1b118..9438902 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_21"
                     }
@@ -18,7 +18,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "relation_12"
                     }
index 74985ee..6b64195 100644 (file)
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "one_to_many_relation_1"
                     }
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "one_to_one_relation_1"
                     }
index c454317..597c3ef 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_1",
                         "attributes": {
@@ -43,7 +43,7 @@
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_1",
                         "attributes": {
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [
+                "o-ran-smo-teiv-ran-test:ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn": [
                     {
                         "id": "ODUFunction_1",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": "110",
+                                "mcc": "250",
                                 "mnc": "210"
                             },
                             "gNBDUId": 12,
@@ -94,7 +94,7 @@
                         "id": "ODUFunction_2",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": "110",
+                                "mcc": "250",
                                 "mnc": "210"
                             },
                             "gNBDUId": 12,
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
+                "o-ran-smo-teiv-equipment-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
                     {
                         "id": "AntennaModule_1",
                         "attributes": {
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy": [
+                "o-ran-smo-teiv-ran-test:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy": [
                     {
                         "id": "AntennaCapability_id1",
                         "attributes": {
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr": [
+                "o-ran-smo-teiv-ran-test:LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr": [
                     {
                         "id": "LTESectorCarrier_id1",
                         "attributes": {
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN": [
+                "o-ran-smo-teiv-rel-oam-ran-test:MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN": [
                     {
                         "id": "MANAGEDELEMENT_MANAGES_ODUFUNCTION_relation_1",
                         "aSide": "ManagedElement_1",
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "ODUFUNCTION_PROVIDES_NRCELLDU_relation_1",
                         "aSide": "ODUFunction_2",
                 ]
             },
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "ManagedElement_USES_NRCELLDU_relation_1",
                         "aSide": "ManagedElement_3",
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "ANTENNAMODULE_REALISED_BY_ANTENNAMODULE_relation_1",
                         "aSide": "AntennaModule_1",
                 ]
             },
             {
-                "o-ran-smo-teiv-equipment:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
+                "o-ran-smo-teiv-equipment-test:ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE": [
                     {
                         "id": "ANTENNAMODULE_DEPLOYED_ON_ANTENNAMODULE_relation_1",
                         "aSide": "AntennaModule_5",
                 ]
             },
             {
-                "o-ran-smo-teiv-rel-equipment-ran:ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY": [
+                "o-ran-smo-teiv-rel-equipment-ran-test:ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY": [
                     {
                         "id": "ANTENNAMODULE_SERVES_ANTENNACAPABILITY_relation_1",
                         "aSide": "AntennaModule_7",
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY": [
+                "o-ran-smo-teiv-ran-test:LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY": [
                     {
                         "id": "LTESECTORCARRIER_USES_ANTENNACAPABILITY_relation_1",
                         "aSide": "LTESectorCarrier_id1",
index 5d3399a..efb1988 100644 (file)
                     {
                         "id": "AntennaCapability_1",
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "2",
-                                "attribute_2": "3"
-                            }
+                            "geranFqBands": [
+                                "2",
+                                "3"
+                            ]
                         },
                         "sourceIds": [
                             "source1",
                     {
                         "id": "AntennaCapability_2",
                         "attributes": {
-                            "geranFqBands": {
-                                "attribute_1": "23",
-                                "attribute_2": "23"
-                            }
+                            "geranFqBands": [
+                                "23",
+                                "34"
+                            ]
                         },
                         "sourceIds": [
                             "source1",
index 71dbe0c..0771248 100644 (file)
@@ -14,7 +14,7 @@
                         "id": "ODU_1",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": "110",
+                                "mcc": "250",
                                 "mnc": "210"
                             },
                             "gNBDUId": 12,
index 54608bf..cf4394d 100644 (file)
@@ -12,9 +12,6 @@
                 "o-ran-smo-teiv-oam:ManagedElement": [
                     {
                         "id": "ManagedElement_1",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "urn:3gpp:dn:fdn1",
                             "urn:cmHandle:1234"
@@ -22,9 +19,6 @@
                     },
                     {
                         "id": "ManagedElement_2",
-                        "attributes": {
-
-                        },
                         "sourceIds": [
                             "urn:3gpp:dn:fdn1",
                             "urn:cmHandle:1234"
@@ -52,8 +46,8 @@
                         "id": "ODU_1",
                         "attributes": {
                             "dUpLMNId": {
-                                "mcc": 110,
-                                "mnc": 210
+                                "mcc": "250",
+                                "mnc": "210"
                             },
                             "gNBDUId": 111,
                             "gNBId": 123,
index 01547b7..04cc9cf 100644 (file)
@@ -1,5 +1,5 @@
 {
-    "84E676149362F50C55FE1E004B98D4891916BBF3": [
+    "F93C2CA075353668A76B4718E07B741ACCD83641": [
         {
             "id": "NRCellDU_41"
         },
                 "firstDiscovered": "<AFTER TEST START TIME>",
                 "lastModified": "<AFTER TEST START TIME>"
             }
+        },
+        {
+            "id": "NRCellDU_X",
+            "CD_sourceIds": [
+                "relation_one_to_one_both_sides_missing"
+            ]
         }
     ],
-    "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+    "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
         {
             "id": "ManagedElement_61",
             "REL_FK_used-nrCellDu": "NRCellDU_51",
                 "source1",
                 "source2"
             ]
+        },
+        {
+            "id": "ManagedElement_X",
+            "REL_FK_used-nrCellDu": "NRCellDU_X",
+            "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": "relation_one_to_one_both_sides_missing",
+            "CD_sourceIds": [
+                "relation_one_to_one_both_sides_missing"
+            ],
+            "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4": [
+                "source1",
+                "source2"
+            ]
         }
     ],
     "o-ran-smo-teiv-ran_NRCellDU": [
                 "source1",
                 "source2"
             ]
+        },
+        {
+            "id": "NRCellDU_X",
+            "REL_FK_provided-by-oduFunction": "ODU_X",
+            "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU": "relation_one_to_many_both_sides_missing",
+            "CD_sourceIds": [
+                "relation_one_to_many_both_sides_missing"
+            ],
+            "metadata": {
+                "reliabilityIndicator": "ADVISED",
+                "firstDiscovered": "<AFTER TEST START TIME>",
+                "lastModified": "<AFTER TEST START TIME>"
+            },
+            "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU": [
+                "source1",
+                "source2"
+            ]
         }
     ],
     "o-ran-smo-teiv-ran_ODUFunction": [
         {
             "id": "ODU_2",
             "dUpLMNId": {
-                "mcc": "111",
+                "mcc": "251",
                 "mnc": "211"
             },
             "gNBDUId": 13,
                 "firstDiscovered": "<AFTER TEST START TIME>",
                 "lastModified": "<AFTER TEST START TIME>"
             }
+        },
+        {
+            "id": "ODU_X",
+            "CD_sourceIds": [
+                "relation_one_to_many_both_sides_missing"
+            ],
+            "metadata": {
+                "reliabilityIndicator": "ADVISED",
+                "firstDiscovered": "<AFTER TEST START TIME>",
+                "lastModified": "<AFTER TEST START TIME>"
+            }
         }
     ],
     "o-ran-smo-teiv-equipment_AntennaModule": [
     "o-ran-smo-teiv-ran_AntennaCapability": [
         {
             "id": "AntennaCapability_3",
-            "geranFqBands": {
-                "attribute_1": "1",
-                "attribute_2": "2"
-            }
+            "geranFqBands": [
+                1,
+                2
+            ]
         },
         {
             "id": "AntennaCapability_123",
index eabcc96..d27de8d 100644 (file)
     "o-ran-smo-teiv-ran_AntennaCapability": [
         {
             "id": "AntennaCapability_1",
-            "geranFqBands": {
-                "attribute_1": "1",
-                "attribute_2": "2"
-            },
+            "geranFqBands": [
+                1,
+                2
+            ],
             "metadata": {
                 "reliabilityIndicator": "OK",
                 "firstDiscovered": "<AFTER TEST START TIME>",
         },
         {
             "id": "AntennaCapability_2",
-            "geranFqBands": {
-                "attribute_1": "1",
-                "attribute_2": "2"
-            },
+            "geranFqBands": [
+                1,
+                2
+            ],
             "metadata": {
                 "reliabilityIndicator": "OK",
                 "firstDiscovered": "<AFTER TEST START TIME>",
index 0307ab0..7c90d26 100644 (file)
@@ -1,5 +1,5 @@
 {
-    "84E676149362F50C55FE1E004B98D4891916BBF3": [
+    "F93C2CA075353668A76B4718E07B741ACCD83641": [
         {
             "id": "NRCellDU_21"
         },
@@ -7,7 +7,7 @@
             "id": "NRCellDU_31"
         }
     ],
-    "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+    "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
         {
             "id": "ManagedElement_21",
             "REL_FK_used-nrCellDu": "NRCellDU_21",
index 62df5f4..c22ff47 100644 (file)
                 "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1",
                 "urn:cmHandle:395221E080CCF0FD1929103B15999999"
             ],
-            "geranFqBands": {
-                "attribute_1": "1",
-                "attribute_2": "2"
-            },
+            "geranFqBands": [
+                1,
+                2
+            ],
             "eUtranFqBands": null,
             "nRFqBands": null,
             "metadata": {
                 "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR01gNodeBRadio00009,ManagedElement=NR01gNodeBRadio00009,OCUCPFunction=1",
                 "urn:cmHandle:395221E080CCF0FD1929103B15999999"
             ],
-            "geranFqBands": {
-                "attribute_1": "1",
-                "attribute_2": "2"
-            },
+            "geranFqBands": [
+                1,
+                2
+            ],
             "eUtranFqBands": null,
             "nRFqBands": null,
             "metadata": {
index 67de539..4922325 100644 (file)
@@ -1,5 +1,5 @@
 {
-    "84E676149362F50C55FE1E004B98D4891916BBF3": [
+    "F93C2CA075353668A76B4718E07B741ACCD83641": [
         {
             "id": "NRCellDU_21"
         },
@@ -7,12 +7,16 @@
             "id": "NRCellDU_31"
         }
     ],
-    "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+    "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
         {
             "id": "ManagedElement_41",
             "REL_FK_used-nrCellDu": null,
             "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": null,
-            "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": null
+            "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB": null,
+            "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD": [],
+            "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92": {
+
+            }
         }
     ]
 }
index eef53b8..e623b99 100644 (file)
     "o-ran-smo-teiv-ran_AntennaCapability": [
         {
             "id": "AntennaCapability_1",
-            "geranFqBands": {
-                "attribute_1": "2",
-                "attribute_2": "3"
-            },
+            "geranFqBands": [
+                2,
+                3
+            ],
             "metadata": {
                 "reliabilityIndicator": "OK",
                 "firstDiscovered": "<BEFORE TEST START TIME>",
         },
         {
             "id": "AntennaCapability_2",
-            "geranFqBands": {
-                "attribute_1": "23",
-                "attribute_2": "23"
-            }
+            "geranFqBands": [
+                23,
+                34
+            ]
         }
     ],
     "CFC235E0404703D1E4454647DF8AAE2C193DB402": [
index b695a6c..25ec29b 100644 (file)
@@ -56,7 +56,7 @@
         {
             "id": "ODU_1",
             "dUpLMNId": {
-                "mcc": "110",
+                "mcc": "250",
                 "mnc": "210"
             },
             "gNBDUId": 12,
index dcfc153..4043b85 100644 (file)
@@ -1,5 +1,5 @@
 {
-    "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+    "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
         "ManagedElement_21",
         "relation_11",
         "relation_12"
index 049e2aa..1592270 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_1",
                         "attributes": {
@@ -23,7 +23,7 @@
                 ]
             },
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_1",
                         "attributes": {
@@ -42,7 +42,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_1",
index b4173e8..dc09192 100644 (file)
@@ -42,7 +42,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_2",
index e1d2134..c4048eb 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_2",
                         "attributes": {
@@ -25,7 +25,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_2",
                         "aSide": "ManagedElement_2",
index fc00d41..7e62f34 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_2",
index ea4fe25..d719b33 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_1",
                         "attributes": {
@@ -28,7 +28,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_1",
index 126787f..9601a26 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+                "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
                     {
                         "id": "ManagedElement_1",
                         "attributes": {
@@ -25,7 +25,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_1",
index 3bd21b3..9295aec 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_1",
index c71198c..bfa289e 100644 (file)
@@ -9,7 +9,7 @@
     "data": {
         "entities": [
             {
-                "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
                     {
                         "id": "NRCellDU_2",
                         "attributes": {
@@ -28,7 +28,7 @@
         ],
         "relationships": [
             {
-                "o-ran-smo-teiv-rel-oam-ran:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
+                "o-ran-smo-teiv-rel-oam-ran-test:ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU": [
                     {
                         "id": "Relation_OneToOne_1",
                         "aSide": "ManagedElement_2",
index 90d7662..bbe0ecb 100644 (file)
@@ -225,7 +225,7 @@ import org.springframework.cloud.contract.spec.Contract
         }
     },
     Contract.make {
-        description "SUCCESS - 200: Get classifiers using getRelationshipsByType - CONTAINS"
+        description "NOT FOUND - 404: Get classifiers using getRelationshipsByType - CONTAINS"
         request {
             method GET()
             url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships?offset=0&limit=500&targetFilter=/classifiers&scopeFilter=/classifiers[contains(@item,'NOT_EXISTING')]"
@@ -233,7 +233,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                     "status": "NOT_FOUND",
index 7fe40aa..449740c 100644 (file)
@@ -233,5 +233,81 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NO_CONTENT()
         }
+    },
+    Contract.make {
+        description "BAD REQUEST - 400: Invalid operation type in the classifiers request."
+        request {
+            method POST()
+            url "/topology-inventory/v1alpha11/classifiers"
+            headers {
+                contentType("application/json")
+                accept('application/problem+json')
+            }
+            body('''{
+                "classifiers": [
+                        "test-app-module-wrong:Rural",
+                        "test-app-module:Weekend"
+                 ],
+                "entityIds": [
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13",
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14"
+                ],
+                "operation": "unknown"
+            }''')
+        }
+        response {
+            status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
+            body('''{
+                "status": "BAD_REQUEST",
+                "message": "Failed to process the request to merge/remove classifiers",
+                "details": "Unexpected value 'unknown'. Invalid value for OperationEnum, allowed values: [merge, delete]"
+            }''')
+            bodyMatchers {
+                jsonPath('$.status', byEquality())
+                jsonPath('$.message', byEquality())
+                jsonPath('$.details', byEquality())
+            }
+        }
+    },
+    Contract.make {
+        description "BAD REQUEST - 400: Using object type for the classifiers parameter in the payload."
+        request {
+            method POST()
+            url "/topology-inventory/v1alpha11/classifiers"
+            headers {
+                contentType("application/json")
+                accept('application/problem+json')
+            }
+            body('''{
+                "classifiers": {
+                    "test-app-module:textdata": "Stockholm",
+                    "test-app-module:intdata": 123
+                },
+                "entityIds": [
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13",
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14"
+                ],
+                "operation": "delete"
+            }''')
+        }
+        response {
+            status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
+            body('''{
+                "status": "BAD_REQUEST",
+                "message": "Failed to process the request to merge/remove classifiers",
+                "details": "Cannot deserialize value of type `java.util.ArrayList<java.lang.String>` from Object value (token `JsonToken.START_OBJECT`)"
+            }''')
+            bodyMatchers {
+                jsonPath('$.status', byEquality())
+                jsonPath('$.message', byEquality())
+                jsonPath('$.details', byEquality())
+            }
+        }
     }
 ]
index 3ea0fd8..6005524 100644 (file)
@@ -264,7 +264,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index f3cacab..3edbcd8 100644 (file)
@@ -520,7 +520,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -538,7 +538,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index e1dd959..a2daa0b 100644 (file)
@@ -1520,7 +1520,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1538,7 +1538,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1547,6 +1547,24 @@ import org.springframework.cloud.contract.spec.Contract
             }''')
         }
     },
+    Contract.make {
+        description 'ERROR - 400: Get entities of type AntennaModule with scopeFilter inside MULTIPOLYGON - Invalid format: missing parentheses in the second list of points.'
+        request {
+            method GET()
+            url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),(60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+        }
+        response {
+            status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
+            body('''{
+                "status": "BAD_REQUEST",
+                "message": "Invalid query condition",
+                "details": "Invalid parameter for covered by condition"
+            }''')
+        }
+    },
     Contract.make {
         description 'ERROR - 400: Get entities of type AntennaModule with scopeFilter on geographic attribute with height - 1 coordinate'
         request {
@@ -1556,7 +1574,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1574,7 +1592,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1592,7 +1610,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1610,7 +1628,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1629,7 +1647,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1647,7 +1665,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1835,7 +1853,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                "status": "BAD_REQUEST",
@@ -1858,7 +1876,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                "status": "BAD_REQUEST",
@@ -1881,7 +1899,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                "status": "BAD_REQUEST",
@@ -1904,7 +1922,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                "status": "BAD_REQUEST",
@@ -2009,6 +2027,51 @@ import org.springframework.cloud.contract.spec.Contract
             }
         }
     },
+    Contract.make {
+        description 'SUCCESS - 200: Get entities of type AntennaModule inside MultiPolygon'
+        request {
+            method GET()
+            url "/topology-inventory/v1alpha11/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+        }
+        response {
+            status OK()
+            headers {
+                contentType('application/json')
+            }
+            body('''{
+                "items": [
+                    {
+                        "o-ran-smo-teiv-equipment:AntennaModule": [
+                            {
+                                "id": "urn:o-ran:smo:teiv:sha512:AntennaModule=971FCD28D02B78DDD982611639A0957140339C5522EAAF3FBACA1B8308CF7B0A870CFA80AE04E259805B2A2CB95E263261309883B4D4BF50183FA17AFBA47EA7"
+                            }
+                        ]
+                    }
+                ],
+                "self": {
+                    "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+                },
+                "first": {
+                    "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+                },
+                "prev": {
+                    "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+                },
+                "next": {
+                    "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+                },
+                "last": {
+                    "href": "/domains/EQUIPMENT/entity-types/AntennaModule/entities?offset=0&limit=500&scopeFilter=/attributes[coveredBy(@geo-location, 'MULTIPOLYGON(((48 68, 50 68, 50 69, 48 69, 48 68)),((60 70, 50 68, 50 69, 48 69, 60 70)))')]"
+                },
+                "totalCount": 1
+            }''')
+            bodyMatchers {
+                jsonPath('$.items', byType {
+                    occurrence(1)
+                })
+            }
+        }
+    },
     Contract.make {
         description "SUCCESS - 200: Get entities of type AntennaCapability by AntennaModule id"
         request {
@@ -2755,7 +2818,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -2773,7 +2836,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -3318,7 +3381,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                     "status": "BAD_REQUEST",
@@ -3341,7 +3404,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                     "status": "BAD_REQUEST",
@@ -3472,7 +3535,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                     "status": "BAD_REQUEST",
@@ -3495,7 +3558,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -3513,7 +3576,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -3625,7 +3688,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -3643,7 +3706,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index 968ca74..5c587c5 100644 (file)
@@ -94,7 +94,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "NOT_FOUND",
@@ -112,7 +112,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index 8a51d32..dcf0617 100644 (file)
@@ -737,7 +737,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
             "status": "BAD_REQUEST",
@@ -755,7 +755,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
             "status": "NOT_FOUND",
index 9bb9c60..6a2ea2a 100644 (file)
@@ -533,7 +533,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index f6a5b76..0214d0c 100644 (file)
@@ -677,7 +677,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -695,7 +695,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index 3a5241b..665ecb9 100644 (file)
@@ -70,7 +70,7 @@ import org.springframework.cloud.contract.spec.Contract
         }
     },
     Contract.make {
-        description "ERROR - 400: Get relationship with non existing id 'urn:non-existing-id'"
+        description "ERROR - 404: Get relationship with non existing id 'urn:non-existing-id'"
         request {
             method GET()
             url "/topology-inventory/v1alpha11/domains/REL_OAM_RAN/relationship-types/MANAGEDELEMENT_MANAGES_ODUFUNCTION/relationships/urn:non-existing-id"
@@ -78,7 +78,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "NOT_FOUND",
index 1789f43..32ad53f 100644 (file)
@@ -1099,7 +1099,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1117,7 +1117,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1433,12 +1433,100 @@ import org.springframework.cloud.contract.spec.Contract
                 jsonPath('$.items', byType {
                     occurrence(2)
                 })
-                jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType {
-                    minOccurrence(1)
+                jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality())
+                jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality())
+            }
+        }
+    },
+    Contract.make {
+        description 'SUCCESS - 200: Get entities of domain RAN  with complex filter here many to many relationship(ANTENNAMODULE_SERVES_NRCELLDU) , one to many(NRCELLDU_USES_NRSECTORCARRIER) where relationship information is stored in NRSECTORCARRIER , and NRCELLDU Attribute. So 3 Logical blocks and 3 joins from NRCELLDU connects to NRSectorCarrier,ANTENNAMODULE_SERVES_NRCELLDU and AntennaModule'
+        request {
+            method GET()
+            url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+        }
+        response {
+            status OK()
+            headers {
+                contentType('application/json')
+            }
+            body('''{
+                "items": [
+                    {
+                        "o-ran-smo-teiv-ran:NRCellDU": [
+                            {
+                                "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRCellDU=1"
+                            }
+                        ]
+                    }
+                ],
+                "self": {
+                    "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+                },
+                "first": {
+                    "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+                },
+                "prev": {
+                    "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+                },
+                "next": {
+                    "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+                },
+                "last": {
+                    "href": "/domains/RAN/entities?offset=0&limit=500&scopeFilter=/serving-antennaModule/attributes[@antennaModelNumber='5'];/used-nrSectorCarrier[@id='urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9,NRSectorCarrier=1'];/attributes[@nCI=1]"
+                },
+                "totalCount": 1
+            }''')
+            bodyMatchers {
+                jsonPath('$.items', byType {
+                    occurrence(1)
                 })
-                jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType {
-                    minOccurrence(1)
+                jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality())
+            }
+        }
+    },
+    Contract.make {
+        description 'SUCCESS - 200: Get entities with filter on attributes and associations. Based on local dataset ODUFunction with gNBId=9 is connected to three instances of NRCellDU but result should contain just one ODUFunction'
+        request {
+            method GET()
+            url "/topology-inventory/v1alpha11/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+        }
+        response {
+            status OK()
+            headers {
+                contentType('application/json')
+            }
+            body('''{
+                "items": [
+                    {
+                        "o-ran-smo-teiv-ran:ODUFunction": [
+                            {
+                                "id": "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=9,ODUFunction=9"
+                            }
+                        ]
+                    }
+                ],
+                "self": {
+                    "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+                },
+                "first": {
+                    "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+                },
+                "prev": {
+                    "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+                },
+                "next": {
+                    "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+                },
+                "last": {
+                    "href": "/domains/RAN/entities?offset=0&limit=100&scopeFilter=/attributes[@gNBId=9];/provided-nrCellDu[contains(@id,'urn:3gpp:dn:')]"
+                },
+                "totalCount": 1
+            }''')
+            bodyMatchers {
+                jsonPath('$.items', byType {
+                    occurrence(1)
                 })
+                jsonPath('$.items[0].o-ran-smo-teiv-ran:ODUFunction[0].id', byEquality())
             }
         }
     },
@@ -1491,12 +1579,8 @@ import org.springframework.cloud.contract.spec.Contract
                 jsonPath('$.items', byType {
                     occurrence(2)
                 })
-                jsonPath('$.items[*].o-ran-smo-teiv-ran:NRCellDU[0].id', byType {
-                    minOccurrence(1)
-                })
-                jsonPath('$.items[*].o-ran-smo-teiv-ran:AntennaCapability[0].id', byType {
-                    minOccurrence(1)
-                })
+                jsonPath('$.items[0].o-ran-smo-teiv-ran:NRCellDU[0].id', byEquality())
+                jsonPath('$.items[1].o-ran-smo-teiv-ran:AntennaCapability[0].id', byEquality())
             }
         }
     },
index 00dd9d6..50da626 100644 (file)
@@ -297,5 +297,80 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NO_CONTENT()
         }
+    },
+    Contract.make {
+        description "BAD REQUEST - 400: Invalid operation type in the decorators request."
+        request {
+            method POST()
+            url "/topology-inventory/v1alpha11/decorators"
+            headers {
+                contentType("application/json")
+                accept('application/problem+json')
+            }
+            body('''{
+                "decorators": {
+                    "test-app-module:textdata": "Stockholm",
+                    "test-app-module:intdata": 123
+                },
+                "entityIds": [
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13",
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14"
+                ],
+                "operation": "unknown"
+            }''')
+        }
+        response {
+            status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
+            body('''{
+                "status": "BAD_REQUEST",
+                "message": "Failed to process the request to merge/remove decorators",
+                "details": "Unexpected value 'unknown'. Invalid value for OperationEnum, allowed values: [merge, delete]"
+            }''')
+            bodyMatchers {
+                jsonPath('$.status', byEquality())
+                jsonPath('$.message', byEquality())
+                jsonPath('$.details', byEquality())
+            }
+        }
+    },
+    Contract.make {
+        description "BAD REQUEST - 400: Using list type for the decorators parameter in the payload."
+        request {
+            method POST()
+            url "/topology-inventory/v1alpha11/decorators"
+            headers {
+                contentType("application/json")
+                accept('application/problem+json')
+            }
+            body('''{
+                "decorators": [
+                    "test-app-module:textdata"
+                ],
+                "entityIds": [
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=13,ODUFunction=13",
+                    "urn:3gpp:dn:SubNetwork=Europe,SubNetwork=Hungary,MeContext=1,ManagedElement=14,ODUFunction=14"
+                ],
+                "operation": "delete"
+            }''')
+        }
+        response {
+            status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
+            body('''{
+                "status": "BAD_REQUEST",
+                "message": "Failed to process the request to merge/remove decorators",
+                "details": "Cannot deserialize value of type `java.util.LinkedHashMap<java.lang.String,java.lang.Object>` from Array value (token `JsonToken.START_ARRAY`)"
+            }''')
+            bodyMatchers {
+                jsonPath('$.status', byEquality())
+                jsonPath('$.message', byEquality())
+                jsonPath('$.details', byEquality())
+            }
+        }
     }
 ]
index 13b1258..50e9f29 100644 (file)
@@ -566,7 +566,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index 62c21d8..949df7f 100644 (file)
@@ -244,7 +244,7 @@ import org.springframework.cloud.contract.spec.Contract
                     "details": "Invalid schema name: invalid"
                 }''')
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
         }
     }
index 42c0abe..60b7225 100644 (file)
@@ -61,6 +61,9 @@ import org.springframework.cloud.contract.spec.Contract
                     '    leaf weekend { ' +
                     '            type uint32; ' +
                     '        } ' +
+                    '    leaf decimal { ' +
+                    '            type decimal64; ' +
+                    '        } ' +
                     '    } ' +
                     '   ' +
                     '  identity geo-classifier { ' +
@@ -225,6 +228,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid schema name",
@@ -288,6 +294,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid schema name",
@@ -363,6 +372,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -429,6 +441,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -496,6 +511,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -552,6 +570,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid schema name",
@@ -619,6 +640,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -686,6 +710,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -711,6 +738,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -734,6 +764,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
             "status": "BAD_REQUEST",
             "message": "Invalid file input",
@@ -794,6 +827,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -854,6 +890,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -902,6 +941,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -942,6 +984,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -1009,6 +1054,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -1076,6 +1124,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -1116,6 +1167,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "Invalid file input",
@@ -1177,6 +1231,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -1240,6 +1297,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
             "status": "BAD_REQUEST",
             "message": "Invalid file input",
@@ -1303,6 +1363,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid file input",
@@ -1361,11 +1424,84 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status CONFLICT()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "CONFLICT",
                 "message": "Schema in deleting state",
                 "details": "Schema test-app-in-deleting-status already exists and is in the process of being deleted. This may take some time, please try again later."
             }''')
         }
+    },
+    Contract.make {
+        description "ERROR - 400: Create a new classifier and decorator schema with not supported decorator type"
+        request {
+            method POST()
+            url("/topology-inventory/v1alpha11/schemas")
+            headers {
+                contentType(multipartFormData())
+            }
+            multipart(
+                    file: named(
+                    name: $(c(regex(nonEmpty())), p('file.yang')),
+                    contentType: p('application/yang'),
+                    content: $(c(regex(nonEmpty())),
+                    p('module module-rapp-model15 { ' +
+                    '  ' +
+                    '  yang-version 1.1; ' +
+                    '  namespace "urn:module-rapp-model15"; ' +
+                    '  prefix model15; ' +
+                    '   ' +
+                    '    import o-ran-smo-teiv-common-yang-types { prefix model; } ' +
+                    '  import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; } ' +
+                    '   ' +
+                    '  revision "2024-05-08" { ' +
+                    '    description ' +
+                    '    "Initial revision."; ' +
+                    '    or-teiv-yext:label 0.3.0; ' +
+                    '  } ' +
+                    '   ' +
+                    '  augment /model:decorators { ' +
+                    '        leaf urban { ' +
+                    '            type string; ' +
+                    '        } ' +
+                    '    leaf rural { ' +
+                    '            type boolean; ' +
+                    '        } ' +
+                    '    leaf weekend { ' +
+                    '            type uint32; ' +
+                    '        } ' +
+                    '    leaf decimal { ' +
+                    '            type decimal32; ' +
+                    '        } ' +
+                    '    } ' +
+                    '   ' +
+                    '  identity geo-classifier { ' +
+                    '    base model:classifiers; ' +
+                    '  } ' +
+                    '  ' +
+                    '    identity classifierTest1 { ' +
+                    '        base geo-classifier; ' +
+                    '    } ' +
+                    '   ' +
+                    '  identity classifierTest2 { ' +
+                    '        base geo-classifier; ' +
+                    '    } ' +
+                    '   ' +
+                    '  identity classifierTest3 { ' +
+                    '        base model:classifiers; ' +
+                    '  } ' +
+                    '   ' +
+                    '}'))))
+        }
+        response {
+            status BAD_REQUEST()
+            body('''{
+                    "status": "BAD_REQUEST",
+                    "message": "Invalid file input",
+                    "details": "Invalid file input: Cannot resolve typedef 'decimal32'."
+                }''')
+        }
     }
 ]
index 28d6615..9300388 100644 (file)
@@ -41,6 +41,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid schema name",
@@ -56,6 +59,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid schema name",
index fd35df1..7c99158 100644 (file)
@@ -333,7 +333,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -364,7 +364,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -395,7 +395,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -458,7 +458,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -493,7 +493,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -525,7 +525,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -612,7 +612,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -646,7 +646,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -684,7 +684,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -722,7 +722,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -760,7 +760,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -789,7 +789,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -823,7 +823,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -858,7 +858,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -893,7 +893,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -928,7 +928,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -964,7 +964,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1004,7 +1004,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1085,7 +1085,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1119,7 +1119,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1153,7 +1153,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1185,7 +1185,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
index 498177c..0bebf61 100644 (file)
@@ -268,6 +268,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                     "status": "BAD_REQUEST",
                     "message": "getAllGroups.limit: must be less than or equal to 500"
index 1bd72e2..83d0297 100644 (file)
@@ -204,6 +204,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status INTERNAL_SERVER_ERROR()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "INTERNAL_SERVER_ERROR",
                 "message": "Criteria deserialization exception",
@@ -225,7 +228,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -242,6 +245,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status NOT_FOUND()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "NOT_FOUND",
                 "message": "Resource Not Found",
index c29bdcf..849adb7 100644 (file)
@@ -66,6 +66,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
         }
     }
 ]
index 3242238..7972c5f 100644 (file)
@@ -70,7 +70,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "NOT_FOUND",
index 7cbec9e..87a4160 100644 (file)
@@ -597,6 +597,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status NOT_FOUND()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "NOT_FOUND",
                 "message": "Resource Not Found",
@@ -613,7 +616,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body ('''{
                 "status": "NOT_FOUND",
@@ -630,6 +633,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Grammar error",
@@ -645,6 +651,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status NOT_FOUND()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "NOT_FOUND",
                 "message": "Resource Not Found",
@@ -660,6 +669,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Filter Error",
@@ -675,6 +687,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid target filter, only relationship conditions can be provided",
index f6fc5e9..bcec9a1 100644 (file)
@@ -410,6 +410,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status BAD_REQUEST()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "BAD_REQUEST",
                 "message": "Invalid status",
@@ -425,6 +428,9 @@ import org.springframework.cloud.contract.spec.Contract
         }
         response {
             status NOT_FOUND()
+            headers {
+                contentType('application/problem+json')
+            }
             body('''{
                 "status": "NOT_FOUND",
                 "message": "Resource Not Found",
index 72463a3..0bf6068 100644 (file)
@@ -263,7 +263,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -343,7 +343,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -399,7 +399,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -454,7 +454,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -496,7 +496,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -532,7 +532,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "NOT_FOUND",
@@ -573,7 +573,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -614,7 +614,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -679,7 +679,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -815,7 +815,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -847,7 +847,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -874,7 +874,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -905,7 +905,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -938,7 +938,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -971,7 +971,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1004,7 +1004,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1038,7 +1038,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1076,7 +1076,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
@@ -1112,7 +1112,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status NOT_FOUND()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "NOT_FOUND",
@@ -1153,7 +1153,7 @@ import org.springframework.cloud.contract.spec.Contract
         response {
             status BAD_REQUEST()
             headers {
-                contentType('application/json')
+                contentType('application/problem+json')
             }
             body('''{
                 "status": "BAD_REQUEST",
diff --git a/teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql b/teiv/src/test/resources/pgsqlschema/end-to-end-test-data.sql
new file mode 100644 (file)
index 0000000..52447f0
--- /dev/null
@@ -0,0 +1,2898 @@
+--  ============LICENSE_START=======================================================
+--  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
+--  ================================================================================
+--  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.
+--
+--  SPDX-License-Identifier: Apache-2.0
+--  ============LICENSE_END=========================================================
+
+BEGIN;
+
+CREATE EXTENSION IF NOT EXISTS postgis;
+CREATE EXTENSION IF NOT EXISTS postgis_topology;
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
+
+GRANT USAGE ON SCHEMA topology to :pguser;
+GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser;
+GRANT SELECT ON ALL TABLES IN SCHEMA topology TO :pguser;
+
+CREATE SCHEMA IF NOT EXISTS teiv_data;
+ALTER SCHEMA teiv_data OWNER TO :pguser;
+SET default_tablespace = '';
+SET default_table_access_method = heap;
+
+SET ROLE :'pguser';
+
+-- Function to create CONSTRAINT only if it does not exists
+CREATE OR REPLACE FUNCTION teiv_data.create_constraint_if_not_exists (
+       t_name TEXT, c_name TEXT, constraint_sql TEXT
+)
+RETURNS void AS
+$$
+BEGIN
+       IF NOT EXISTS (SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = t_name AND constraint_name = c_name) THEN
+               EXECUTE constraint_sql;
+       END IF;
+END;
+$$ language 'plpgsql';
+
+CREATE TABLE IF NOT EXISTS teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" (
+       "id"                    TEXT,
+       "aSide_AntennaModule"                   TEXT,
+       "bSide_AntennaCapability"                       TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (
+       "id"                    TEXT,
+       "antennaBeamWidth"                      jsonb,
+       "antennaModelNumber"                    TEXT,
+       "electricalAntennaTilt"                 INTEGER,
+       "geo-location"                  geography,
+       "mechanicalAntennaBearing"                      INTEGER,
+       "mechanicalAntennaTilt"                 INTEGER,
+       "positionWithinSector"                  TEXT,
+       "totalTilt"                     INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_installed-at-site"                      TEXT,
+       "REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE"                        TEXT,
+       "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"                      jsonb,
+       "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"                    jsonb,
+       "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE"                     jsonb,
+       "REL_FK_grouped-by-sector"                      TEXT,
+       "REL_ID_SECTOR_GROUPS_ANTENNAMODULE"                    TEXT,
+       "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"                  jsonb,
+       "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"                        jsonb,
+       "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-equipment_Site" (
+       "id"                    TEXT,
+       "geo-location"                  geography,
+       "name"                  TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-equipment_Site" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-oam_ManagedElement" (
+       "id"                    TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (
+       "id"                    TEXT,
+       "eUtranFqBands"                 jsonb,
+       "geranFqBands"                  jsonb,
+       "nRFqBands"                     jsonb,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (
+       "id"                    TEXT,
+       "eNBId"                 INTEGER,
+       "eNodeBPlmnId"                  jsonb,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_managed-by-managedElement"                      TEXT,
+       "REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"                  TEXT,
+       "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"                        jsonb,
+       "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"                      jsonb,
+       "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"                       jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_EUtranCell" (
+       "id"                    TEXT,
+       "cellId"                        INTEGER,
+       "channelBandwidth"                      INTEGER,
+       "dlChannelBandwidth"                    INTEGER,
+       "duplexType"                    TEXT,
+       "earfcn"                        INTEGER,
+       "earfcndl"                      INTEGER,
+       "earfcnul"                      INTEGER,
+       "tac"                   INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_provided-by-enodebFunction"                     TEXT,
+       "REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL"                     TEXT,
+       "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL"                   jsonb,
+       "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL"                 jsonb,
+       "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL"                  jsonb,
+       "REL_FK_grouped-by-sector"                      TEXT,
+       "REL_ID_SECTOR_GROUPS_EUTRANCELL"                       TEXT,
+       "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL"                     jsonb,
+       "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL"                   jsonb,
+       "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL"                    jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_EUtranCell" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" (
+       "id"                    TEXT,
+       "gNBCUName"                     TEXT,
+       "gNBId"                 BIGINT,
+       "gNBIdLength"                   INTEGER,
+       "pLMNId"                        jsonb,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_managed-by-managedElement"                      TEXT,
+       "REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"                   TEXT,
+       "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"                 jsonb,
+       "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"                       jsonb,
+       "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"                        jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" (
+       "id"                    TEXT,
+       "gNBId"                 BIGINT,
+       "gNBIdLength"                   INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_managed-by-managedElement"                      TEXT,
+       "REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"                   TEXT,
+       "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"                 jsonb,
+       "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"                       jsonb,
+       "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"                        jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" (
+       "id"                    TEXT,
+       "dUpLMNId"                      jsonb,
+       "gNBDUId"                       BIGINT,
+       "gNBId"                 BIGINT,
+       "gNBIdLength"                   INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_managed-by-managedElement"                      TEXT,
+       "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION"                     TEXT,
+       "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"                   jsonb,
+       "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"                 jsonb,
+       "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION"                  jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" (
+       "id"                    TEXT,
+       "sectorCarrierType"                     TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_provided-by-enodebFunction"                     TEXT,
+       "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"                       TEXT,
+       "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"                     jsonb,
+       "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"                   jsonb,
+       "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"                    jsonb,
+       "REL_FK_used-by-euTranCell"                     TEXT,
+       "REL_ID_EUTRANCELL_USES_LTESECTORCARRIER"                       TEXT,
+       "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER"                     jsonb,
+       "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER"                   jsonb,
+       "REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER"                    jsonb,
+       "REL_FK_used-antennaCapability"                 TEXT,
+       "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY"                        TEXT,
+       "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"                      jsonb,
+       "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"                    jsonb,
+       "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY"                     jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellCU" (
+       "id"                    TEXT,
+       "cellLocalId"                   INTEGER,
+       "nCI"                   BIGINT,
+       "nRTAC"                 INTEGER,
+       "plmnId"                        jsonb,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_provided-by-ocucpFunction"                      TEXT,
+       "REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU"                        TEXT,
+       "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"                      jsonb,
+       "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"                    jsonb,
+       "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU"                     jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellCU" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRCellDU" (
+       "id"                    TEXT,
+       "cellLocalId"                   INTEGER,
+       "nCI"                   BIGINT,
+       "nRPCI"                 INTEGER,
+       "nRTAC"                 INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_provided-by-oduFunction"                        TEXT,
+       "REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU"                  TEXT,
+       "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"                        jsonb,
+       "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"                      jsonb,
+       "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU"                       jsonb,
+       "REL_FK_grouped-by-sector"                      TEXT,
+       "REL_ID_SECTOR_GROUPS_NRCELLDU"                 TEXT,
+       "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"                       jsonb,
+       "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"                     jsonb,
+       "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU"                      jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ALTER COLUMN "REL_CD_decorators_SECTOR_GROUPS_NRCELLDU" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" (
+       "id"                    TEXT,
+       "arfcnDL"                       INTEGER,
+       "arfcnUL"                       INTEGER,
+       "bSChannelBwDL"                 INTEGER,
+       "frequencyDL"                   INTEGER,
+       "frequencyUL"                   INTEGER,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "REL_FK_provided-by-oduFunction"                        TEXT,
+       "REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"                   TEXT,
+       "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"                 jsonb,
+       "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"                       jsonb,
+       "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"                        jsonb,
+       "REL_FK_used-by-nrCellDu"                       TEXT,
+       "REL_ID_NRCELLDU_USES_NRSECTORCARRIER"                  TEXT,
+       "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"                        jsonb,
+       "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"                      jsonb,
+       "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER"                       jsonb,
+       "REL_FK_used-antennaCapability"                 TEXT,
+       "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY"                 TEXT,
+       "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"                       jsonb,
+       "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"                     jsonb,
+       "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY"                      jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_Sector" (
+       "id"                    TEXT,
+       "azimuth"                       DECIMAL,
+       "geo-location"                  geography,
+       "sectorId"                      BIGINT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_Sector" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE',
+ 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'PK_o-ran-smo-teiv-equipment_AntennaModule_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_Site',
+ 'PK_o-ran-smo-teiv-equipment_Site_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_Site_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-oam_ManagedElement',
+ 'PK_o-ran-smo-teiv-oam_ManagedElement_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "PK_o-ran-smo-teiv-oam_ManagedElement_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_AntennaCapability',
+ 'PK_o-ran-smo-teiv-ran_AntennaCapability_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'PK_o-ran-smo-teiv-ran_EUtranCell_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_EUtranCell_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'PK_o-ran-smo-teiv-ran_OCUCPFunction_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUCPFunction_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'PK_o-ran-smo-teiv-ran_OCUUPFunction_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_OCUUPFunction_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'PK_o-ran-smo-teiv-ran_ODUFunction_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ODUFunction_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'PK_o-ran-smo-teiv-ran_NRCellCU_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellCU_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'PK_o-ran-smo-teiv-ran_NRCellDU_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRCellDU_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'PK_o-ran-smo-teiv-ran_NRSectorCarrier_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_NRSectorCarrier_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_Sector',
+ 'PK_o-ran-smo-teiv-ran_Sector_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_Sector_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960',
+ 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06',
+ 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC" FOREIGN KEY ("REL_FK_installed-at-site") REFERENCES teiv_data."o-ran-smo-teiv-equipment_Site" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1" UNIQUE ("REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_078764B2F3D613D44CC6E3586F564C83164D2481',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_078764B2F3D613D44CC6E3586F564C83164D2481" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0" UNIQUE ("REL_ID_SECTOR_GROUPS_ANTENNAMODULE");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'FK_6C99B14BF3C9BC6DE2D69AD55DF323ADCB174167',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_6C99B14BF3C9BC6DE2D69AD55DF323ADCB174167" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'UNIQUE_A30444B7D036FA579730F0D2853E52FD08DEDCF0',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "UNIQUE_A30444B7D036FA579730F0D2853E52FD08DEDCF0" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_2D1FA89480BF856AB865D58FAFB6AC0B476015EB',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_2D1FA89480BF856AB865D58FAFB6AC0B476015EB" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'UNIQUE_CA88C7E60C1A332FA7561FC965ED41DD4125CDED',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "UNIQUE_CA88C7E60C1A332FA7561FC965ED41DD4125CDED" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_EUTRANCELL");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_REL_FK_grouped-by-sector',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'UNIQUE_0513FE4A675A02C31E5EDD6BCB3728911FBDA2FA',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "UNIQUE_0513FE4A675A02C31E5EDD6BCB3728911FBDA2FA" UNIQUE ("REL_ID_SECTOR_GROUPS_EUTRANCELL");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_F1FB8F88851067901B66D53EE1420D2ECCEC98A3',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_F1FB8F88851067901B66D53EE1420D2ECCEC98A3" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'UNIQUE_50E9E4A87D93AC833B1D1AC05E3B58805909E20E',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_50E9E4A87D93AC833B1D1AC05E3B58805909E20E" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'FK_34D6E2537E8EE1D395CAF5BF9B2182A4696A1EAA',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_34D6E2537E8EE1D395CAF5BF9B2182A4696A1EAA" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'UNIQUE_0CA05800AC7D277BDCB5CF0097DC35978E9311F4',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_0CA05800AC7D277BDCB5CF0097DC35978E9311F4" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_F67FAF9D3E82B97104E2392DA0AC8A86DF2407CC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_F67FAF9D3E82B97104E2392DA0AC8A86DF2407CC" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'UNIQUE_5BD09ED226520A0BE27904AEAF0557416808E7E2',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "UNIQUE_5BD09ED226520A0BE27904AEAF0557416808E7E2" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_96E6D4983CFFDF30FCA20423B5913DEE486E42D0',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_96E6D4983CFFDF30FCA20423B5913DEE486E42D0" FOREIGN KEY ("REL_FK_used-by-euTranCell") REFERENCES teiv_data."o-ran-smo-teiv-ran_EUtranCell" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_0A76398FBBC8E01A2D3BA602AB47835794E997E5',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_0A76398FBBC8E01A2D3BA602AB47835794E997E5" UNIQUE ("REL_ID_EUTRANCELL_USES_LTESECTORCARRIER");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_F2CDD1E84C7F07BF8065F99A5F3488E91E3BB7B2',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_F2CDD1E84C7F07BF8065F99A5F3488E91E3BB7B2" FOREIGN KEY ("REL_FK_provided-by-ocucpFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'UNIQUE_EA2A6F5BA36ABB0DA357542E05AA2D07415E127A',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "UNIQUE_EA2A6F5BA36ABB0DA357542E05AA2D07415E127A" UNIQUE ("REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'UNIQUE_C3D8E5331EC71D46D4B8CED29FE5F6CEB1D8E67A',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_C3D8E5331EC71D46D4B8CED29FE5F6CEB1D8E67A" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector" FOREIGN KEY ("REL_FK_grouped-by-sector") REFERENCES teiv_data."o-ran-smo-teiv-ran_Sector" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4" UNIQUE ("REL_ID_SECTOR_GROUPS_NRCELLDU");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_F7978366174C82E41F0A6ABF29005FF01603858F',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_F7978366174C82E41F0A6ABF29005FF01603858F" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_ODUFunction" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'UNIQUE_0AC16A840F6ACDC50136E71EC6D4F3D4E04B8198',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_0AC16A840F6ACDC50136E71EC6D4F3D4E04B8198" UNIQUE ("REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu" FOREIGN KEY ("REL_FK_used-by-nrCellDu") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25" UNIQUE ("REL_ID_NRCELLDU_USES_NRSECTORCARRIER");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_65D538D54EB33081C808540235FEB28823428E64',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_65D538D54EB33081C808540235FEB28823428E64" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");'
+);
+
+CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE");
+
+CREATE INDEX IF NOT EXISTS "IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE");
+
+CREATE INDEX IF NOT EXISTS "IDX_102A50584376DE25B6BBD7157594C607A5C957F2" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_98AC4232BC02323E03416954215889CEE874A1E9" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId");
+
+CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_252AF4814C67384A7B05EA116316E83AFF9EB6AE" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_61CDCD3F69CF67EE740358D2C76FA796CFDA19BF" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_35C17C8A9BA3EF3AEADA72C21F8090C38F575BAF" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_84E36DC53519D3E334C60B5B02C1AB27130CFA24" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_C9C19F8F83F50C130F2EB6502ABB7B2833F1F783" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_EUtranCell_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_976F6A0F8991F64592B6F9E716EFEECBD5400FDA" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_EUTRANCELL"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4C77E3A51BFAB2FCD30425E4EB21CC7636438299" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_EUTRANCELL"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_FC7D79187227E0BFA69149048CC10E39AE540B8A" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_EUTRANCELL");
+
+CREATE INDEX IF NOT EXISTS "IDX_173887418DD4FD6FD592F6404EA784150B1822C0" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_EUTRANCELL"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_8A15E61498725DA9D8C78FC4B99053C06E88DCEC" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_EUTRANCELL"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E4EF3C904939ED4C0996EAB7CDFE1895CDF34BFB" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_EUTRANCELL");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("pLMNId");
+
+CREATE INDEX IF NOT EXISTS "IDX_BE4B476041D559760931630000D3F4A6DFF42707" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_588840BAE32C7FF8CF0553F631DAAF8BB6E8E7C1" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_E01081465B87F46E1CC7A22FE406C7B41C817E8C" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_1324070754C1EBF8EA78EF40743AFC1713733BA8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_13E734DE57346378DA4F21FC4EA030290A7E532F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_C6D2419F8DC299FBC98342AA00BE92308C7566A7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4C2B68358221A7FF0E68012DEDD3CBA2C4ED669F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_883506CAA3E742D82EEFCEE8C8F29927983B73B1" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_EB07ADD66F6CF51B9330403DE4500D05CA067647" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_C3141DD7D2695EF74B13981AB378A58390D203D6" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("dUpLMNId");
+
+CREATE INDEX IF NOT EXISTS "IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_601A4514FFACA8985471531013AFC8F760361F09" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_3065F7FB78C5AA9FF17972F825F89AED127A6324" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_04C614FDE6A4AE2AA106A1233D1DF95803FC122D" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_298FCD184347DEC995B06FED2B1AE61F12BF766A" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_F2D46817C2D618D8C33945F282299BF9EB49465E" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_EUTRANCELL_USES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_B291D7EFCAD3BF06A2C11F8C0429ABABEEF8308B" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_EUTRANCELL_USES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_EAE482189F45D63CD1A88B0DD5F76EEE163D9E53" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_EUTRANCELL_USES_LTESECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("plmnId");
+
+CREATE INDEX IF NOT EXISTS "IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E5930226819982DC0CFC1FA64FB3600647222435" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_36A671754CD510FFBDC2713FD142303DCA75DD65" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_04BE1EB39848069422B97C28EE3C8ED18BCC6D33" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_229957181BBC9D7B4535807BB397E8AA1378ED85" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU");
+
+CREATE INDEX IF NOT EXISTS "IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_1F6708B1E34FC908473DD7A7E5641E650B359BEF" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_2F4C43ED084968FDAF9943DB96741885C145FE1D" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_0E63D6B76B229961CD45D998C63175B569DDECD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU");
+
+CREATE INDEX IF NOT EXISTS "IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN (("REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_CD_decorators_SECTOR_GROUPS_NRCELLDU");
+
+CREATE INDEX IF NOT EXISTS "IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_CD293AD1111E344D150340A13BD299924D29A9DA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_273D43FDDD1C4643ECF8BBE51B6B369C657F0861" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_EDE8B88F488F9380DB49CB2C141318FB33C2CCEC" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_B975D24291849007D4AA6686C5D3983885D5C884" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN (("REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY");
+
+CREATE INDEX IF NOT EXISTS "IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_19C19556F9714850389595E0A16218FA229205FE" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("CD_decorators");
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "azimuth" DECIMAL;
+
+CREATE TABLE IF NOT EXISTS teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" (
+       "id"                    TEXT,
+       "aSide_AntennaModule"                   TEXT,
+       "bSide_EUtranCell"                      TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" (
+       "id"                    TEXT,
+       "aSide_AntennaModule"                   TEXT,
+       "bSide_NRCellDU"                        TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb
+);
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '1D71FC3BAE50E72552EAAC17B3B0C959B403E822',
+ 'PK_F3CAF5F2DDEBEEBA48316C708AD6E37BA12A6632',
+ 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "PK_F3CAF5F2DDEBEEBA48316C708AD6E37BA12A6632" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU',
+ 'PK_F41873285F3BD831F63C6041B4356A063403406D',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "PK_F41873285F3BD831F63C6041B4356A063403406D" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '1D71FC3BAE50E72552EAAC17B3B0C959B403E822',
+ 'FK_6AF9FA81BF3F1D3374C021E5554012492FA32B72',
+ 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_6AF9FA81BF3F1D3374C021E5554012492FA32B72" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '1D71FC3BAE50E72552EAAC17B3B0C959B403E822',
+ 'FK_D71E365C050B4B749155D43A16DCC01C12BFA055',
+ 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_D71E365C050B4B749155D43A16DCC01C12BFA055" FOREIGN KEY ("bSide_EUtranCell") REFERENCES teiv_data."o-ran-smo-teiv-ran_EUtranCell" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU',
+ 'FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649" FOREIGN KEY ("aSide_AntennaModule") REFERENCES teiv_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU',
+ 'FK_8605800A4923C52258A8CE3989E18A7C93D22E8C',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_8605800A4923C52258A8CE3989E18A7C93D22E8C" FOREIGN KEY ("bSide_NRCellDU") REFERENCES teiv_data."o-ran-smo-teiv-ran_NRCellDU" (id) ON DELETE CASCADE;'
+);
+
+CREATE INDEX IF NOT EXISTS "IDX_570AAD5BDC2B6A7DCCB840639DE232EE08D72534" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_6657C8783456D4F7FDD411B3B7FD1764E580AB80" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_0B76D3F42FB84D2D1E6B28774B52150174780BE4" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("CD_decorators");
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "horizontalBeamWidth" DECIMAL;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "verticalBeamWidth" DECIMAL;
+
+CREATE OR REPLACE FUNCTION teiv_data.create_enum_type(
+    schema_name TEXT, type_name TEXT, enum_values TEXT[]
+) RETURNS VOID AS $$
+BEGIN
+    IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = type_name AND n.nspname = schema_name) THEN
+        EXECUTE format('CREATE TYPE %I.%I AS ENUM (%s)',schema_name, type_name, array_to_string(ARRAY(SELECT quote_literal(value) FROM unnest(enum_values) AS value), ', '));
+    END IF;
+END;
+$$ language 'plpgsql';
+
+SELECT teiv_data.create_enum_type('teiv_data', 'Reliability', ARRAY['OK', 'RESTORED', 'ADVISED']);
+
+CREATE TABLE IF NOT EXISTS teiv_data."responsible_adapter" (
+       "id"                    TEXT,
+       "hashed_id"                     BYTEA
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'responsible_adapter',
+ 'PK_responsible_adapter_id',
+ 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "PK_responsible_adapter_id" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'responsible_adapter',
+ 'UNIQUE_responsible_adapter_hashed_id',
+ 'ALTER TABLE teiv_data."responsible_adapter" ADD CONSTRAINT "UNIQUE_responsible_adapter_hashed_id" UNIQUE ("hashed_id");'
+);
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_ANTENNAMODULE" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_EUTRANCELL" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_EUTRANCELL" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_EUTRANCELL_USES_LTESECTORCARRIER" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_metadata_SECTOR_GROUPS_NRCELLDU" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_NRCELLDU_USES_NRSECTORCARRIER" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "REL_metadata_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD COLUMN IF NOT EXISTS "metadata" jsonb;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ENODEBFUNCTION_PROVIDES_EUTRANCELL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_EUTRANCELL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_EUTRANCELL_USES_LTESECTORCARRIER" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_LTESECTORCARRIER_USES_ANTENNACAPABILITY" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "REL_RESP_id_SECTOR_GROUPS_NRCELLDU" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "REL_RESP_id_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD COLUMN IF NOT EXISTS "RESP_id" BYTEA;
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_7B930D529570AED19AABDFA950EED794D4EB53CE',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_7B930D529570AED19AABDFA950EED794D4EB53CE" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_ODUFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_2A809BABCCE0A947D420653EF4EBD4707DA73B9F',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_2A809BABCCE0A947D420653EF4EBD4707DA73B9F" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_Site',
+ 'FK_o-ran-smo-teiv-equipment_Site_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_AntennaCapability',
+ 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_F4EE618C98A1EB18212D9607E870E87B59690448',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_F4EE618C98A1EB18212D9607E870E87B59690448" FOREIGN KEY ("REL_RESP_id_ANTENNAMODULE_INSTALLED_AT_SITE") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_E2C830AB84CE31F71BBD0F91BBEFF66069A7E6B8',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_E2C830AB84CE31F71BBD0F91BBEFF66069A7E6B8" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_ANTENNAMODULE") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_A7A12166DB3EC34E10F93FDD942A5DA916CBCFA0',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_A7A12166DB3EC34E10F93FDD942A5DA916CBCFA0" FOREIGN KEY ("REL_RESP_id_ENODEBFUNCTION_PROVIDES_EUTRANCELL") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_6F467D3CDA985248AEB010A0EDB1343A9173593E',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_6F467D3CDA985248AEB010A0EDB1343A9173593E" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_EUTRANCELL") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_2C1B8D1ECA6B4E645EF162522E6A5169CE7D7E9C',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_2C1B8D1ECA6B4E645EF162522E6A5169CE7D7E9C" FOREIGN KEY ("REL_RESP_id_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_B1CBA7F54C85E77DC96CD6531DB073B0EDCFF6BC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_B1CBA7F54C85E77DC96CD6531DB073B0EDCFF6BC" FOREIGN KEY ("REL_RESP_id_EUTRANCELL_USES_LTESECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_B8F9FB1ADEBB9B35B6245684DE64775DE98442B4',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_B8F9FB1ADEBB9B35B6245684DE64775DE98442B4" FOREIGN KEY ("REL_RESP_id_LTESECTORCARRIER_USES_ANTENNACAPABILITY") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_323384A3617DC94F73FB225A3562EB93A05E976D',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_323384A3617DC94F73FB225A3562EB93A05E976D" FOREIGN KEY ("REL_RESP_id_OCUCPFUNCTION_PROVIDES_NRCELLCU") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-oam_ManagedElement',
+ 'FK_o-ran-smo-teiv-oam_ManagedElement_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" ADD CONSTRAINT "FK_o-ran-smo-teiv-oam_ManagedElement_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_3F79604542DA97B9338CF6A5610ABC05E17153B4',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_3F79604542DA97B9338CF6A5610ABC05E17153B4" FOREIGN KEY ("REL_RESP_id_ODUFUNCTION_PROVIDES_NRCELLDU") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_01FDDC88AFC28623B49266BFA3FE0D2078988E88',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_01FDDC88AFC28623B49266BFA3FE0D2078988E88" FOREIGN KEY ("REL_RESP_id_SECTOR_GROUPS_NRCELLDU") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'FK_1D23F428960B9279D29AC35A946D0C60CAFE638E',
+ 'ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_1D23F428960B9279D29AC35A946D0C60CAFE638E" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'FK_2356BAEED80FD88699DCCD85993162818C9BD0A1',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_2356BAEED80FD88699DCCD85993162818C9BD0A1" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU',
+ 'FK_09C96C0397884B6E28EEBE17565CE2DF7535E380',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" ADD CONSTRAINT "FK_09C96C0397884B6E28EEBE17565CE2DF7535E380" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_229725A1E5A342C3E7579273F54AD9B209CE0770',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_229725A1E5A342C3E7579273F54AD9B209CE0770" FOREIGN KEY ("REL_RESP_id_ODUFUNCTION_PROVIDES_NRSECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_CD383C61EDAA5A8E84DCB423E1378E3173D585E7',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_CD383C61EDAA5A8E84DCB423E1378E3173D585E7" FOREIGN KEY ("REL_RESP_id_NRCELLDU_USES_NRSECTORCARRIER") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_EEF72E2F5B0421B04A5129F44B6740CE35EB7D7B',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_EEF72E2F5B0421B04A5129F44B6740CE35EB7D7B" FOREIGN KEY ("REL_RESP_id_NRSECTORCARRIER_USES_ANTENNACAPABILITY") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'FK_8B083C6C2AF2BA35E20AE16A4D0702373C5B5D4D',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_8B083C6C2AF2BA35E20AE16A4D0702373C5B5D4D" FOREIGN KEY ("REL_RESP_id_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_Sector',
+ 'FK_o-ran-smo-teiv-ran_Sector_RESP_id',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_id" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '1D71FC3BAE50E72552EAAC17B3B0C959B403E822',
+ 'FK_3EB2B0A0A4405454550AED663948D4DD77AD3B77',
+ 'ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" ADD CONSTRAINT "FK_3EB2B0A0A4405454550AED663948D4DD77AD3B77" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" (hashed_id);'
+);
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_dUpLMNId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBDUId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_dUpLMNId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBDUId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBCUName" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RESP_pLMNId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBCUName" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD COLUMN IF NOT EXISTS "RI_pLMNId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RESP_name" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD COLUMN IF NOT EXISTS "RI_name" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_eUtranFqBands" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_geranFqBands" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RESP_nRFqBands" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_eUtranFqBands" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_geranFqBands" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD COLUMN IF NOT EXISTS "RI_nRFqBands" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_antennaBeamWidth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_antennaModelNumber" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_azimuth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_electricalAntennaTilt" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_horizontalBeamWidth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_mechanicalAntennaBearing" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_mechanicalAntennaTilt" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_positionWithinSector" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_totalTilt" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RESP_verticalBeamWidth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_antennaBeamWidth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_antennaModelNumber" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_azimuth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_electricalAntennaTilt" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_horizontalBeamWidth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_mechanicalAntennaBearing" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_mechanicalAntennaTilt" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_positionWithinSector" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_totalTilt" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD COLUMN IF NOT EXISTS "RI_verticalBeamWidth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_cellId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_channelBandwidth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_dlChannelBandwidth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_duplexType" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcn" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcndl" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_earfcnul" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RESP_tac" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_cellId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_channelBandwidth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_dlChannelBandwidth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_duplexType" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcn" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcndl" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_earfcnul" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD COLUMN IF NOT EXISTS "RI_tac" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_sectorCarrierType" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD COLUMN IF NOT EXISTS "RI_sectorCarrierType" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_cellLocalId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_nCI" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_nRTAC" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RESP_plmnId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_cellLocalId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_nCI" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_nRTAC" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD COLUMN IF NOT EXISTS "RI_plmnId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_cellLocalId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nCI" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nRPCI" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RESP_nRTAC" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_cellLocalId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nCI" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nRPCI" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD COLUMN IF NOT EXISTS "RI_nRTAC" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RESP_gNBIdLength" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD COLUMN IF NOT EXISTS "RI_gNBIdLength" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_arfcnDL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_arfcnUL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_bSChannelBwDL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_frequencyDL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RESP_frequencyUL" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_arfcnDL" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_arfcnUL" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_bSChannelBwDL" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_frequencyDL" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD COLUMN IF NOT EXISTS "RI_frequencyUL" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_eNBId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RESP_eNodeBPlmnId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RI_eNBId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD COLUMN IF NOT EXISTS "RI_eNodeBPlmnId" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_azimuth" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_geo-location" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RESP_sectorId" BYTEA;
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_azimuth" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_geo-location" teiv_data."Reliability";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD COLUMN IF NOT EXISTS "RI_sectorId" teiv_data."Reliability";
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_dUpLMNId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_dUpLMNId" FOREIGN KEY ("RESP_dUpLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBDUId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBDUId" FOREIGN KEY ("RESP_gNBDUId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ODUFunction',
+ 'FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBIdLength',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ODUFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBCUName',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBCUName" FOREIGN KEY ("RESP_gNBCUName") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBIdLength',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUCPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_pLMNId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUCPFunction_RESP_pLMNId" FOREIGN KEY ("RESP_pLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_Site',
+ 'FK_o-ran-smo-teiv-equipment_Site_RESP_geo-location',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_Site',
+ 'FK_o-ran-smo-teiv-equipment_Site_RESP_name',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_Site_RESP_name" FOREIGN KEY ("RESP_name") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_AntennaCapability',
+ 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_eUtranFqBands',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_eUtranFqBands" FOREIGN KEY ("RESP_eUtranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_AntennaCapability',
+ 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_geranFqBands',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_geranFqBands" FOREIGN KEY ("RESP_geranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_AntennaCapability',
+ 'FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_nRFqBands',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_AntennaCapability_RESP_nRFqBands" FOREIGN KEY ("RESP_nRFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_antennaBeamWidth',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_antennaBeamWidth" FOREIGN KEY ("RESP_antennaBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_9F8C83A98E46570C846E83D0F220A05357E2007B',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_9F8C83A98E46570C846E83D0F220A05357E2007B" FOREIGN KEY ("RESP_antennaModelNumber") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_azimuth',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_azimuth" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_4A737D290E8E8B656C1794065E9B16D0E536E1C8',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_4A737D290E8E8B656C1794065E9B16D0E536E1C8" FOREIGN KEY ("RESP_electricalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_geo-location',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_C4A0358503DD39D9CB99E3632B2E1E1C337A37CB',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_C4A0358503DD39D9CB99E3632B2E1E1C337A37CB" FOREIGN KEY ("RESP_horizontalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_1DC2D3CF0DE253BABBF39A6E95711C96AA6EF1DC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_1DC2D3CF0DE253BABBF39A6E95711C96AA6EF1DC" FOREIGN KEY ("RESP_mechanicalAntennaBearing") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_2B6558634445CBA8724FFE8D3E651761E260C91A',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_2B6558634445CBA8724FFE8D3E651761E260C91A" FOREIGN KEY ("RESP_mechanicalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_9E7F6B8B5829210351BD81048A305F97BF3E71E6',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_9E7F6B8B5829210351BD81048A305F97BF3E71E6" FOREIGN KEY ("RESP_positionWithinSector") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_totalTilt',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_o-ran-smo-teiv-equipment_AntennaModule_RESP_totalTilt" FOREIGN KEY ("RESP_totalTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-equipment_AntennaModule',
+ 'FK_DF761BBEA829AC0658C2D49D290E500CB71546B7',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "FK_DF761BBEA829AC0658C2D49D290E500CB71546B7" FOREIGN KEY ("RESP_verticalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_cellId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_cellId" FOREIGN KEY ("RESP_cellId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_channelBandwidth',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_channelBandwidth" FOREIGN KEY ("RESP_channelBandwidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_dlChannelBandwidth',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_dlChannelBandwidth" FOREIGN KEY ("RESP_dlChannelBandwidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_duplexType',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_duplexType" FOREIGN KEY ("RESP_duplexType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcn',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcn" FOREIGN KEY ("RESP_earfcn") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcndl',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcndl" FOREIGN KEY ("RESP_earfcndl") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcnul',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_earfcnul" FOREIGN KEY ("RESP_earfcnul") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_EUtranCell',
+ 'FK_o-ran-smo-teiv-ran_EUtranCell_RESP_tac',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_EUtranCell_RESP_tac" FOREIGN KEY ("RESP_tac") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_sectorCarrierType',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_LTESectorCarrier_RESP_sectorCarrierType" FOREIGN KEY ("RESP_sectorCarrierType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_cellLocalId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_cellLocalId" FOREIGN KEY ("RESP_cellLocalId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nCI',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nCI" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nRTAC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_nRTAC" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellCU',
+ 'FK_o-ran-smo-teiv-ran_NRCellCU_RESP_plmnId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellCU_RESP_plmnId" FOREIGN KEY ("RESP_plmnId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_cellLocalId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_cellLocalId" FOREIGN KEY ("RESP_cellLocalId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nCI',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nCI" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRPCI',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRPCI" FOREIGN KEY ("RESP_nRPCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRCellDU',
+ 'FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRTAC',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRCellDU_RESP_nRTAC" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBId" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_OCUUPFunction',
+ 'FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBIdLength',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_OCUUPFunction_RESP_gNBIdLength" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnDL',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnDL" FOREIGN KEY ("RESP_arfcnDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnUL',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_arfcnUL" FOREIGN KEY ("RESP_arfcnUL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_bSChannelBwDL',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_bSChannelBwDL" FOREIGN KEY ("RESP_bSChannelBwDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyDL',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyDL" FOREIGN KEY ("RESP_frequencyDL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_NRSectorCarrier',
+ 'FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyUL',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_NRSectorCarrier_RESP_frequencyUL" FOREIGN KEY ("RESP_frequencyUL") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNBId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNBId" FOREIGN KEY ("RESP_eNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNodeBPlmnId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_ENodeBFunction_RESP_eNodeBPlmnId" FOREIGN KEY ("RESP_eNodeBPlmnId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_Sector',
+ 'FK_o-ran-smo-teiv-ran_Sector_RESP_azimuth',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_azimuth" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_Sector',
+ 'FK_o-ran-smo-teiv-ran_Sector_RESP_geo-location',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_geo-location" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'o-ran-smo-teiv-ran_Sector',
+ 'FK_o-ran-smo-teiv-ran_Sector_RESP_sectorId',
+ 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" ADD CONSTRAINT "FK_o-ran-smo-teiv-ran_Sector_RESP_sectorId" FOREIGN KEY ("RESP_sectorId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+CREATE INDEX IF NOT EXISTS "IDX_A5A6D0F976F10334CBD2DEDBDB6894BF8720157B" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_E4D4598CF15FD8AF9AE91F3647A8D943E1A51E8C" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_Site_metadata" ON teiv_data."o-ran-smo-teiv-equipment_Site" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_metadata" ON teiv_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_B309F56A2389CE1A1CD82B4982F98F7F3B50570E" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE");
+
+CREATE INDEX IF NOT EXISTS "IDX_0B4648D289B22EAA16B21BE4505F49850AC018C9" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("REL_metadata_SECTOR_GROUPS_ANTENNAMODULE");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_metadata" ON teiv_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_82B09F9D6370B2F07855F70042BA1B0ED782167D" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_metadata_ENODEBFUNCTION_PROVIDES_EUTRANCELL");
+
+CREATE INDEX IF NOT EXISTS "IDX_C4728AE1A440E5C3670B4B691213C163D805CD84" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("REL_metadata_SECTOR_GROUPS_EUTRANCELL");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_EUtranCell_metadata" ON teiv_data."o-ran-smo-teiv-ran_EUtranCell" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_9966F4C45B258EBA701CE9C1564152885FE3251A" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_19ABF252C4E09016A6FA24AA27724311226C554D" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_EUTRANCELL_USES_LTESECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_5D51C73E247073756AE9185C219303E004250431" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_metadata_LTESECTORCARRIER_USES_ANTENNACAPABILITY");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_metadata" ON teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_9F6548916831A3F9771008367D58936D21C30423" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRCellCU" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_metadata" ON teiv_data."o-ran-smo-teiv-oam_ManagedElement" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_C731749DB013DA392D5010E566ACA0961D9A6535" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU");
+
+CREATE INDEX IF NOT EXISTS "IDX_BE5B953B9861DD77A9096198E375074251030653" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("REL_metadata_SECTOR_GROUPS_NRCELLDU");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRCellDU" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_FE8D81BC4BD1C54D860A934A4484326AAFF02726" ON teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_4E84A0C18434550C0096F1EE2695DF5952826EA4" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_E1F96D2B0519812654B5A3D95B8F0E90C0FBDA55" ON teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_5B3F8D2AA421A4F7084B428387F4BFABE236A936" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_21B2E5B5220DC3FDF12D6E481F0E672B5B034BCA" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_NRCELLDU_USES_NRSECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_20C83B7E7A4AFBA974AFBF99A0ED1A398F5C11D3" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_metadata" ON teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_943E4F35504A6F925ADA7C609CE639875C09C949" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("REL_metadata_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_metadata" ON teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_Sector_metadata" ON teiv_data."o-ran-smo-teiv-ran_Sector" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_24F125BEB2D7C718FA6F2634178AA92F7F71D95A" ON teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" USING GIN ("metadata");
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ODUFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_ODUFUNCTION";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_Site" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_AntennaCapability" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "REL_updated_time_ANTENNAMODULE_INSTALLED_AT_SITE";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-equipment_AntennaModule" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_ANTENNAMODULE";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "REL_updated_time_ENODEBFUNCTION_PROVIDES_EUTRANCELL";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_EUtranCell" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_EUTRANCELL";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_EUTRANCELL_USES_LTESECTORCARRIER";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_LTESECTORCARRIER_USES_ANTENNACAPABILITY";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellCU" DROP COLUMN IF EXISTS "REL_updated_time_OCUCPFUNCTION_PROVIDES_NRCELLCU";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-oam_ManagedElement" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "REL_updated_time_ODUFUNCTION_PROVIDES_NRCELLDU";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRCellDU" DROP COLUMN IF EXISTS "REL_updated_time_SECTOR_GROUPS_NRCELLDU";
+
+ALTER TABLE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_ODUFUNCTION_PROVIDES_NRSECTORCARRIER";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_NRCELLDU_USES_NRSECTORCARRIER";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier" DROP COLUMN IF EXISTS "REL_updated_time_NRSECTORCARRIER_USES_ANTENNACAPABILITY";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction" DROP COLUMN IF EXISTS "REL_updated_time_MANAGEDELEMENT_MANAGES_ENODEBFUNCTION";
+
+ALTER TABLE teiv_data."o-ran-smo-teiv-ran_Sector" DROP COLUMN IF EXISTS "updated_time";
+
+ALTER TABLE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822" DROP COLUMN IF EXISTS "updated_time";
+
+CREATE TABLE IF NOT EXISTS teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" (
+       "id"                    TEXT,
+       "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C"                        TEXT,
+       "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"                        TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" (
+       "id"                    TEXT,
+       "sectorCarrierType"                     TEXT,
+       "RI_sectorCarrierType"                  teiv_data."Reliability",
+       "RESP_sectorCarrierType"                        BYTEA,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA,
+       "REL_FK_used-antennaCapability"                 TEXT,
+       "REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64"                       TEXT,
+       "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5"                       jsonb,
+       "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5"                       jsonb,
+       "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC"                       jsonb,
+       "REL_metadata_F723867781098568079DD82E5D5E529374F97E98"                 jsonb,
+       "REL_RESP_id_927D105F3F1EA229D51FB9D2C90C6D5727FB3F7B"                  BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ALTER COLUMN "REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" (
+       "id"                    TEXT,
+       "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C"                        TEXT,
+       "bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E"                        TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" (
+       "id"                    TEXT,
+       "antennaBeamWidth"                      jsonb,
+       "antennaModelNumber"                    TEXT,
+       "azimuth"                       DECIMAL,
+       "electricalAntennaTilt"                 INTEGER,
+       "geo-location"                  geography,
+       "horizontalBeamWidth"                   DECIMAL,
+       "mechanicalAntennaBearing"                      INTEGER,
+       "mechanicalAntennaTilt"                 INTEGER,
+       "positionWithinSector"                  TEXT,
+       "totalTilt"                     INTEGER,
+       "verticalBeamWidth"                     DECIMAL,
+       "RI_antennaBeamWidth"                   teiv_data."Reliability",
+       "RESP_antennaBeamWidth"                 BYTEA,
+       "RI_antennaModelNumber"                 teiv_data."Reliability",
+       "RESP_antennaModelNumber"                       BYTEA,
+       "RI_azimuth"                    teiv_data."Reliability",
+       "RESP_azimuth"                  BYTEA,
+       "RI_electricalAntennaTilt"                      teiv_data."Reliability",
+       "RESP_electricalAntennaTilt"                    BYTEA,
+       "RI_geo-location"                       teiv_data."Reliability",
+       "RESP_geo-location"                     BYTEA,
+       "RI_horizontalBeamWidth"                        teiv_data."Reliability",
+       "RESP_horizontalBeamWidth"                      BYTEA,
+       "RI_mechanicalAntennaBearing"                   teiv_data."Reliability",
+       "RESP_mechanicalAntennaBearing"                 BYTEA,
+       "RI_mechanicalAntennaTilt"                      teiv_data."Reliability",
+       "RESP_mechanicalAntennaTilt"                    BYTEA,
+       "RI_positionWithinSector"                       teiv_data."Reliability",
+       "RESP_positionWithinSector"                     BYTEA,
+       "RI_totalTilt"                  teiv_data."Reliability",
+       "RESP_totalTilt"                        BYTEA,
+       "RI_verticalBeamWidth"                  teiv_data."Reliability",
+       "RESP_verticalBeamWidth"                        BYTEA,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" (
+       "id"                    TEXT,
+       "eUtranFqBands"                 jsonb,
+       "geranFqBands"                  jsonb,
+       "nRFqBands"                     jsonb,
+       "RI_eUtranFqBands"                      teiv_data."Reliability",
+       "RESP_eUtranFqBands"                    BYTEA,
+       "RI_geranFqBands"                       teiv_data."Reliability",
+       "RESP_geranFqBands"                     BYTEA,
+       "RI_nRFqBands"                  teiv_data."Reliability",
+       "RESP_nRFqBands"                        BYTEA,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" (
+       "id"                    TEXT,
+       "dUpLMNId"                      jsonb,
+       "gNBDUId"                       BIGINT,
+       "gNBId"                 BIGINT,
+       "gNBIdLength"                   INTEGER,
+       "RI_dUpLMNId"                   teiv_data."Reliability",
+       "RESP_dUpLMNId"                 BYTEA,
+       "RI_gNBDUId"                    teiv_data."Reliability",
+       "RESP_gNBDUId"                  BYTEA,
+       "RI_gNBId"                      teiv_data."Reliability",
+       "RESP_gNBId"                    BYTEA,
+       "RI_gNBIdLength"                        teiv_data."Reliability",
+       "RESP_gNBIdLength"                      BYTEA,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA,
+       "REL_FK_managed-by-managedElement"                      TEXT,
+       "REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B"                       TEXT,
+       "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD"                       jsonb,
+       "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6"                       jsonb,
+       "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B"                       jsonb,
+       "REL_metadata_72494257260B57223C09828D7C3B31D203B050B4"                 jsonb,
+       "REL_RESP_id_B327AD97E459B9904E24439FF4F9A442165DD1C0"                  BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ALTER COLUMN "REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" (
+       "id"                    TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA,
+       "REL_FK_used-nrCellDu"                  TEXT,
+       "REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU"                       TEXT,
+       "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4"                       jsonb,
+       "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD"                       jsonb,
+       "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92"                       jsonb,
+       "REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB"                 jsonb,
+       "REL_RESP_id_16BDFF7861A21C39988A1CE8BF89B1816C8754FC"                  BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ALTER COLUMN "REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" (
+       "id"                    TEXT,
+       "aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C"                        TEXT,
+       "bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC"                        TEXT,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" (
+       "id"                    TEXT,
+       "020335B0F627C169E24167748C38FE756FB34AE2"                      INTEGER,
+       "nCI"                   BIGINT,
+       "nRPCI"                 INTEGER,
+       "nRTAC"                 INTEGER,
+       "RI_6022A4C8771F6FCB03972F8966C1AD11DB9AD215"                   teiv_data."Reliability",
+       "RESP_958686CF1CBC168C2ED063F6645F06556C76DC3B"                 BYTEA,
+       "RI_nCI"                        teiv_data."Reliability",
+       "RESP_nCI"                      BYTEA,
+       "RI_nRPCI"                      teiv_data."Reliability",
+       "RESP_nRPCI"                    BYTEA,
+       "RI_nRTAC"                      teiv_data."Reliability",
+       "RESP_nRTAC"                    BYTEA,
+       "CD_sourceIds"                  jsonb,
+       "CD_classifiers"                        jsonb,
+       "CD_decorators"                 jsonb,
+       "metadata"                      jsonb,
+       "RESP_id"                       BYTEA,
+       "REL_FK_provided-by-oduFunction"                        TEXT,
+       "REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F"                       TEXT,
+       "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054"                       jsonb,
+       "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052"                       jsonb,
+       "REL_CD_0AC0D382E4274681870EC7319460192F4F603001"                       jsonb,
+       "REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A"                 jsonb,
+       "REL_RESP_id_3E560656C6590F0E2C4BAD9653CE371CF29D2D08"                  BYTEA
+);
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052" SET DEFAULT '[]';
+
+ALTER TABLE ONLY teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ALTER COLUMN "REL_CD_0AC0D382E4274681870EC7319460192F4F603001" SET DEFAULT '{}';
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '09D47DF128202AB535BC2056D7C0952F6EE7AF2D',
+ 'PK_8123C74A8D9A873F330C37E370DB951212243844',
+ 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "PK_8123C74A8D9A873F330C37E370DB951212243844" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '98D95275440120DC7A5FEF7E870FB6649F275AEC',
+ 'PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D',
+ 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AA68071F5A253FC68706DC4244B2EEEDCFA4F477',
+ 'PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0',
+ 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'C9475FE40C02BEB41F720B4284A856F2CF49E1F3',
+ 'PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92',
+ 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'E2D2B450D65F1FF241A983CBB43B54C040969908',
+ 'PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79',
+ 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E" PRIMARY KEY ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '09D47DF128202AB535BC2056D7C0952F6EE7AF2D',
+ 'FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A',
+ 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '09D47DF128202AB535BC2056D7C0952F6EE7AF2D',
+ 'FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327',
+ 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '09D47DF128202AB535BC2056D7C0952F6EE7AF2D',
+ 'FK_A5E880C59CF224776E30855EBDF62B6E98C5D127',
+ 'ALTER TABLE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" ADD CONSTRAINT "FK_A5E880C59CF224776E30855EBDF62B6E98C5D127" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'FK_53502FA0D6ADEA6C33D6DB99A53D6F3100E9E288',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_53502FA0D6ADEA6C33D6DB99A53D6F3100E9E288" FOREIGN KEY ("RESP_sectorCarrierType") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'FK_100298449AA5ACC1F08DB20BC65868C337E9C333',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_100298449AA5ACC1F08DB20BC65868C337E9C333" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'FK_778741F2AA29B57611EB06A903D58099245BB537',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_778741F2AA29B57611EB06A903D58099245BB537" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF" UNIQUE ("REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '8F1E5B0125750A5230DB73DB7816ECCFFC2D918B',
+ 'FK_CD80909E7C7B2A0958E7D96DD4AE1EEA9B85205C',
+ 'ALTER TABLE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" ADD CONSTRAINT "FK_CD80909E7C7B2A0958E7D96DD4AE1EEA9B85205C" FOREIGN KEY ("REL_RESP_id_927D105F3F1EA229D51FB9D2C90C6D5727FB3F7B") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '98D95275440120DC7A5FEF7E870FB6649F275AEC',
+ 'FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E',
+ 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '98D95275440120DC7A5FEF7E870FB6649F275AEC',
+ 'FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563',
+ 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563" FOREIGN KEY ("bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '98D95275440120DC7A5FEF7E870FB6649F275AEC',
+ 'FK_58D8B5F4AF4FC229F23B545470E43B8E7C69B75F',
+ 'ALTER TABLE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" ADD CONSTRAINT "FK_58D8B5F4AF4FC229F23B545470E43B8E7C69B75F" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_01962D77F25A6FD76223BE654784268BF60CD712',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_01962D77F25A6FD76223BE654784268BF60CD712" FOREIGN KEY ("RESP_antennaBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_F7844BAF6629C2103757E04A38C12A2F20500A15',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_F7844BAF6629C2103757E04A38C12A2F20500A15" FOREIGN KEY ("RESP_antennaModelNumber") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_5EB4306AB1BB07F1902717B5C845B689F479B0C8',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_5EB4306AB1BB07F1902717B5C845B689F479B0C8" FOREIGN KEY ("RESP_azimuth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_7D30EF0E91E5821108E28C244D8F200A9F6EF171',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_7D30EF0E91E5821108E28C244D8F200A9F6EF171" FOREIGN KEY ("RESP_electricalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_7BB08E9AF9BC6AA4AA3709504D5D9D859446E7EC',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_7BB08E9AF9BC6AA4AA3709504D5D9D859446E7EC" FOREIGN KEY ("RESP_geo-location") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_AA75893038D9D2DFC5276DD64C5B89545B59A85D',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_AA75893038D9D2DFC5276DD64C5B89545B59A85D" FOREIGN KEY ("RESP_horizontalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_F4A7E5AE0D0197F17A3BF498BFF708E04EA702FE',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_F4A7E5AE0D0197F17A3BF498BFF708E04EA702FE" FOREIGN KEY ("RESP_mechanicalAntennaBearing") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_1BBB2773C56AC17AF4F81E8CE86181C61F4E28D0',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_1BBB2773C56AC17AF4F81E8CE86181C61F4E28D0" FOREIGN KEY ("RESP_mechanicalAntennaTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_166C6D1792E0FCE19E3F6AA5705219094678406F',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_166C6D1792E0FCE19E3F6AA5705219094678406F" FOREIGN KEY ("RESP_positionWithinSector") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_E891C64DBCC7E495419938DBD17B967635EA9921',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_E891C64DBCC7E495419938DBD17B967635EA9921" FOREIGN KEY ("RESP_totalTilt") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_CC36D660526D1C767F26A3544B6B473417B0EE94',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_CC36D660526D1C767F26A3544B6B473417B0EE94" FOREIGN KEY ("RESP_verticalBeamWidth") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       '9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974',
+ 'FK_2B3186DA8B7B260F570B6482C815A75147876AAC',
+ 'ALTER TABLE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ADD CONSTRAINT "FK_2B3186DA8B7B260F570B6482C815A75147876AAC" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AA68071F5A253FC68706DC4244B2EEEDCFA4F477',
+ 'FK_369392B0C4A062C140E858C9400C0E744F0AC68B',
+ 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_369392B0C4A062C140E858C9400C0E744F0AC68B" FOREIGN KEY ("RESP_eUtranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AA68071F5A253FC68706DC4244B2EEEDCFA4F477',
+ 'FK_BDB6F82FFAC7E705C7D5D88643B77E36B2B9C4A7',
+ 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_BDB6F82FFAC7E705C7D5D88643B77E36B2B9C4A7" FOREIGN KEY ("RESP_geranFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AA68071F5A253FC68706DC4244B2EEEDCFA4F477',
+ 'FK_5ED96C3949F44E73C1F4EB9E8808FF79627A4E9D',
+ 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_5ED96C3949F44E73C1F4EB9E8808FF79627A4E9D" FOREIGN KEY ("RESP_nRFqBands") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AA68071F5A253FC68706DC4244B2EEEDCFA4F477',
+ 'FK_DD48083834253B9A506780AB5EC36078B571553C',
+ 'ALTER TABLE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ADD CONSTRAINT "FK_DD48083834253B9A506780AB5EC36078B571553C" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_7186222B8E58F2BA404053317F6B750832B7AEBB',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_7186222B8E58F2BA404053317F6B750832B7AEBB" FOREIGN KEY ("RESP_dUpLMNId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_F52167D7632035FBC133091B80F9DEE9E37ABD69',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_F52167D7632035FBC133091B80F9DEE9E37ABD69" FOREIGN KEY ("RESP_gNBDUId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_970FEC4332A2D5BBA9EB1398FE0F5FAD455D7EE3',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_970FEC4332A2D5BBA9EB1398FE0F5FAD455D7EE3" FOREIGN KEY ("RESP_gNBId") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_0AB6F974D9D18A47E4FDCEB6C4260AC2A62218BD',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_0AB6F974D9D18A47E4FDCEB6C4260AC2A62218BD" FOREIGN KEY ("RESP_gNBIdLength") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_71C5B9A055FF4C3CB37CB920A7442FC5411F7BCE',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_71C5B9A055FF4C3CB37CB920A7442FC5411F7BCE" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1" UNIQUE ("REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'AD6AA1B5E225BBC96B792246D095340747056399',
+ 'FK_419715A9297507DFE5165617FB4D8827AEBF3A9A',
+ 'ALTER TABLE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ADD CONSTRAINT "FK_419715A9297507DFE5165617FB4D8827AEBF3A9A" FOREIGN KEY ("REL_RESP_id_B327AD97E459B9904E24439FF4F9A442165DD1C0") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'C9475FE40C02BEB41F720B4284A856F2CF49E1F3',
+ 'FK_743B8A7D8779674BDBA042C099462FFE7BFFBDBB',
+ 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_743B8A7D8779674BDBA042C099462FFE7BFFBDBB" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'C9475FE40C02BEB41F720B4284A856F2CF49E1F3',
+ 'FK_15CBD840591824744326C05E2FC38C9ABE9A197E',
+ 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_15CBD840591824744326C05E2FC38C9ABE9A197E" FOREIGN KEY ("REL_FK_used-nrCellDu") REFERENCES teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'C9475FE40C02BEB41F720B4284A856F2CF49E1F3',
+ 'UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114',
+ 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114" UNIQUE ("REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'C9475FE40C02BEB41F720B4284A856F2CF49E1F3',
+ 'FK_B2748BFFCFCEE7C9AE54A3BACFF9052A7BE3E626',
+ 'ALTER TABLE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" ADD CONSTRAINT "FK_B2748BFFCFCEE7C9AE54A3BACFF9052A7BE3E626" FOREIGN KEY ("REL_RESP_id_16BDFF7861A21C39988A1CE8BF89B1816C8754FC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'E2D2B450D65F1FF241A983CBB43B54C040969908',
+ 'FK_8ABF058C19072591C1000BDDD52FF17F488DCF24',
+ 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_8ABF058C19072591C1000BDDD52FF17F488DCF24" FOREIGN KEY ("aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C") REFERENCES teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'E2D2B450D65F1FF241A983CBB43B54C040969908',
+ 'FK_37802898775B4197154F9DA54F8B7946A3C735BA',
+ 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_37802898775B4197154F9DA54F8B7946A3C735BA" FOREIGN KEY ("bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC") REFERENCES teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'E2D2B450D65F1FF241A983CBB43B54C040969908',
+ 'FK_A52435BCC8CAF93A5852E912203F3A76ACE9FA35',
+ 'ALTER TABLE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" ADD CONSTRAINT "FK_A52435BCC8CAF93A5852E912203F3A76ACE9FA35" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_E958432C9E761168561ACE1E78B21A7AF92580C6',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_E958432C9E761168561ACE1E78B21A7AF92580C6" FOREIGN KEY ("RESP_958686CF1CBC168C2ED063F6645F06556C76DC3B") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_8CB88A1C0F652B51FD9845C4F564A272A4F58422',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_8CB88A1C0F652B51FD9845C4F564A272A4F58422" FOREIGN KEY ("RESP_nCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_3C034AD8F98A5E741F962CFC406F48EECD096DB8',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_3C034AD8F98A5E741F962CFC406F48EECD096DB8" FOREIGN KEY ("RESP_nRPCI") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_74E499FB900CBFFBCB389A24AC99CD5CE92A5144',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_74E499FB900CBFFBCB389A24AC99CD5CE92A5144" FOREIGN KEY ("RESP_nRTAC") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_FA12E9B91FE138393C518269329D9262104DAD7A',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_FA12E9B91FE138393C518269329D9262104DAD7A" FOREIGN KEY ("RESP_id") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_500A088A217D3F8B505A8F408076BB5AD265AF63',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_500A088A217D3F8B505A8F408076BB5AD265AF63" FOREIGN KEY ("REL_FK_provided-by-oduFunction") REFERENCES teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" ("id");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418" UNIQUE ("REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F");'
+);
+
+SELECT teiv_data.create_constraint_if_not_exists(
+       'F93C2CA075353668A76B4718E07B741ACCD83641',
+ 'FK_0C3F721FF39EBC5118835710D0C088C8E3328FF1',
+ 'ALTER TABLE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" ADD CONSTRAINT "FK_0C3F721FF39EBC5118835710D0C088C8E3328FF1" FOREIGN KEY ("REL_RESP_id_3E560656C6590F0E2C4BAD9653CE371CF29D2D08") REFERENCES teiv_data."responsible_adapter" ("hashed_id");'
+);
+
+CREATE INDEX IF NOT EXISTS "IDX_8A2A0ABA5E6ACAA8EF991E5B983551524A679509" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_07C2D9F67E32FD07A927D1DF5F06734D7F89DBA0" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_58D33C1960633F6CAA5F7E0A9880FF85D5923BF7" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_EA883FE1AB208DC033513D76B1414014FE4D1397" ON teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_53A525F2FE3F291B4F2B234FE4EC799C778A8687" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_8F5A022153912D07D92FCE34FA9E754E0163F818" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_83EEB2F630BDBBF7BE7E8BBFA452D7F2AB69EB69" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_77A2303E82E9B9B4A9D61BE7C4F1B6088C40A04E" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_DBBF1D30DCD311E5D9D17524730BBF38DEB8BBF8" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_D8626C46F2134489869EC9F70A2F3960D37BA656" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN (("REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_97C1311E85CBA88A2048A17CC3A91406A13A162A" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC");
+
+CREATE INDEX IF NOT EXISTS "IDX_52840EAF2D41B89AC3CE825BC9B0D9AC35AEFC5C" ON teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B" USING GIN ("REL_metadata_F723867781098568079DD82E5D5E529374F97E98");
+
+CREATE INDEX IF NOT EXISTS "IDX_13E530F00B0D405F58CDA235146715762EF6DF91" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_B6911D7B07CE9E7CF692209760002ABD15DA8CD9" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4D253E190E8502C2DE0DC0E2A7A758EA8A5E5888" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_A04886514310E5B31E206923891CD213D9A5CEE6" ON teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_452AE5B87383D94C9B188FBA8BBDA09B8A7E73B4" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_52B1FEA89EC725EA6195DBD272ED9983E98B99CB" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_35E57E345ABB0D6A9CD6D8FBDBC620646C046669" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_8B5018C20A65AC6FFF6E9B4C099B8F18058B3533" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_54DC74991A70957B0CEBAA38200F3059ECCABDEC" ON teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_C9652A1BD1F6441ECBDB38922226AD08D7DDD60D" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_41A2CB8C648BE9B006CB04631C440F71DA6A61C3" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_49AB1B81ED859FE4A0F148617CB3E11454E05EAA" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_CD2038615C829FA3EC5520DEF04DEBAD87DB7B57" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_7470F8E4355FEDE440D3CEB831E05AF350B8144B" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_3D44AB1602F5AA87FAF39E6F596888419F723F47" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_9532CB2D7B71297C7279D2E824DBE655331B5220" ON teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_00624177EC65536001DDF0477A8F698B871C142D" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("dUpLMNId");
+
+CREATE INDEX IF NOT EXISTS "IDX_241D90708F29A60824E2A63C86D9AB84E611E505" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_98C227150239A7692514F1FDF5E3F49FC4439357" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_F308FB8D16B912769597B9678466ADB19BAA27B2" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_9EC8D13EBFB1E513FD4F18C284AD66FA6751E2BC" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_0B9A243313790591EFA74660F1863924EE8CCB6C" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_3FF5E0D439B273B25E65C4EC6E4682E5F8AE9D79" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN (("REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_DC5DA06087B85C01A975848202AC386694598D78" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B");
+
+CREATE INDEX IF NOT EXISTS "IDX_40D54F003F8A66E82DFC0BE377ADEFF1A8EAE78D" ON teiv_data."AD6AA1B5E225BBC96B792246D095340747056399" USING GIN ("REL_metadata_72494257260B57223C09828D7C3B31D203B050B4");
+
+CREATE INDEX IF NOT EXISTS "IDX_36D40805D5D41247C46C23AF06A399E7CDC46EDD" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_18D66A31B8B88551ADA98E4BC6362B71A504CE1B" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_245803DDE5BD5AB2780BB277649AE40CA8F4E145" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_CDD068E13765C799B6503561CB0FAC5638B22C70" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_3EEEE6049314C502989CA49A6050FC40898889D1" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_40A0F4A77264E4DD55EBA83EB2270B21E79F48FF" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN (("REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4520B8DC811185D63D0E415F4E0AED4DC9967219" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92");
+
+CREATE INDEX IF NOT EXISTS "IDX_6E7F02AC7C81800C688BB46D2639CBABFB376239" ON teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3" USING GIN ("REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB");
+
+CREATE INDEX IF NOT EXISTS "IDX_C4B686BC6CAF76EADC031DCCC15CBA7C3F81427C" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_44B101C83E01F881D34B98CFB68E980DF4AF9A96" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_7C35D9F162CB5D2DA8BF96C1F076C9C55EC7CA96" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_2905D52A1A6E49FD9E984F4AD978144B6309C86F" ON teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_E909484E1251C6944EE877CB737E07475884A1AE" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_14454BB7AC41220815C5885AD1B3DB72F8089315" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_3C1344FC931EF89522B673948D541FD73E375C4F" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_BBF662FB069D121A65DCE5A46DAC3185B9A6D9A4" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("metadata");
+
+CREATE INDEX IF NOT EXISTS "IDX_1161D2AF3E3B8B7503469AFF6E3DA87B4D66F852" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4F93EF555F8640ADA220F02F1434AF29A96F85F2" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN (("REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_17F56568BFFACD4F9F2E6372407CE7F8FA06AF17" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("REL_CD_0AC0D382E4274681870EC7319460192F4F603001");
+
+CREATE INDEX IF NOT EXISTS "IDX_6DDF32177944AAEDACB2123D05680F3B3B9BD4C7" ON teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641" USING GIN ("REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A");
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_ODUFunction";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction";
+
+ANALYZE teiv_data."o-ran-smo-teiv-equipment_Site";
+
+ANALYZE teiv_data."C9475FE40C02BEB41F720B4284A856F2CF49E1F3";
+
+ANALYZE teiv_data."98D95275440120DC7A5FEF7E870FB6649F275AEC";
+
+ANALYZE teiv_data."9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974";
+
+ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU";
+
+ANALYZE teiv_data."AD6AA1B5E225BBC96B792246D095340747056399";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction";
+
+ANALYZE teiv_data."o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU";
+
+ANALYZE teiv_data."8F1E5B0125750A5230DB73DB7816ECCFFC2D918B";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_AntennaCapability";
+
+ANALYZE teiv_data."o-ran-smo-teiv-equipment_AntennaModule";
+
+ANALYZE teiv_data."09D47DF128202AB535BC2056D7C0952F6EE7AF2D";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_EUtranCell";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_LTESectorCarrier";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellCU";
+
+ANALYZE teiv_data."F93C2CA075353668A76B4718E07B741ACCD83641";
+
+ANALYZE teiv_data."CFC235E0404703D1E4454647DF8AAE2C193DB402";
+
+ANALYZE teiv_data."AA68071F5A253FC68706DC4244B2EEEDCFA4F477";
+
+ANALYZE teiv_data."E2D2B450D65F1FF241A983CBB43B54C040969908";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_NRSectorCarrier";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_ENodeBFunction";
+
+ANALYZE teiv_data."o-ran-smo-teiv-ran_Sector";
+
+ANALYZE teiv_data."1D71FC3BAE50E72552EAAC17B3B0C959B403E822";
+
+COMMIT;
diff --git a/teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql b/teiv/src/test/resources/pgsqlschema/end-to-end-test-model.sql
new file mode 100644 (file)
index 0000000..f633b48
--- /dev/null
@@ -0,0 +1,667 @@
+--
+-- ============LICENSE_START=======================================================
+-- Copyright (C) 2024 Ericsson
+-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+-- ================================================================================
+-- 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.
+--
+-- SPDX-License-Identifier: Apache-2.0
+-- ============LICENSE_END=========================================================
+--
+
+BEGIN;
+
+DROP SCHEMA IF EXISTS teiv_model cascade;
+CREATE SCHEMA IF NOT EXISTS teiv_model;
+ALTER SCHEMA teiv_model OWNER TO :pguser;
+SET default_tablespace = '';
+SET default_table_access_method = heap;
+
+SET ROLE :pguser;
+
+CREATE TABLE IF NOT EXISTS teiv_model.hash_info (
+    "name"        TEXT PRIMARY KEY,
+    "hashedValue" VARCHAR(63) NOT NULL,
+    "type"        VARCHAR(511)
+);
+
+CREATE TABLE IF NOT EXISTS teiv_model.module_reference (
+    "name"            TEXT PRIMARY KEY,
+    "namespace"       TEXT,
+    "domain"          TEXT,
+    "includedModules" jsonb DEFAULT '[]'::jsonb,
+    "revision"        TEXT NOT NULL,
+    "content"         TEXT NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS teiv_model.entity_info (
+    "storedAt"            TEXT PRIMARY KEY,
+    "name"                TEXT NOT NULL,
+    "moduleReferenceName" TEXT NOT NULL,
+    "attributeNames"      jsonb DEFAULT '[]'::jsonb,
+    FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS teiv_model.relationship_info (
+    "name"                     TEXT NOT NULL,
+    "aSideAssociationName"     TEXT NOT NULL,
+    "aSideMOType"              TEXT NOT NULL,
+    "aSideModule"              TEXT NOT NULL,
+    "aSideMinCardinality"      BIGINT NOT NULL,
+    "aSideMaxCardinality"      BIGINT NOT NULL,
+    "bSideAssociationName"     TEXT NOT NULL,
+    "bSideMOType"              TEXT NOT NULL,
+    "bSideModule"              TEXT NOT NULL,
+    "bSideMinCardinality"      BIGINT NOT NULL,
+    "bSideMaxCardinality"      BIGINT NOT NULL,
+    "associationKind"          TEXT NOT NULL,
+    "relationshipDataLocation" TEXT NOT NULL,
+    "storedAt"                 TEXT NOT NULL,
+    "connectSameEntity"        BOOLEAN NOT NULL,
+    "moduleReferenceName"      TEXT NOT NULL,
+    PRIMARY KEY ("name", "moduleReferenceName"),
+    FOREIGN KEY ("aSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE,
+    FOREIGN KEY ("bSideModule") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE,
+    FOREIGN KEY ("moduleReferenceName") REFERENCES teiv_model.module_reference ("name") ON DELETE CASCADE
+);
+
+COPY teiv_model.hash_info("name", "hashedValue", "type") FROM stdin;
+CD_classifiers CD_classifiers  COLUMN
+CD_decorators  CD_decorators   COLUMN
+CD_sourceIds   CD_sourceIds    COLUMN
+FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee       FK_1A5303EF43A4407B0A47C80B9EF3DCA81FEA484A     CONSTRAINT
+FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee       FK_AAB4A7CE5DD41A0CAEFA20B7538F2B851529E327     CONSTRAINT
+FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee       FK_CF5ED6B6F3D98A44BCF9209A20D9C901F5C3C23E     CONSTRAINT
+FK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee       FK_FA290CAE2E1C24893F90877F0EDF7304CD6D4563     CONSTRAINT
+FK_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_FK_used-nrCellDu       FK_15CBD840591824744326C05E2FC38C9ABE9A197E     CONSTRAINT
+FK_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_FK_managed-by-managedElement     FK_4ADA30B48EB5107E0F730EB9684B5545524ADB42     CONSTRAINT
+FK_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_FK_used-antennaCapability        FK_778741F2AA29B57611EB06A903D58099245BB537     CONSTRAINT
+FK_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_FK_provided-by-oduFunction     FK_500A088A217D3F8B505A8F408076BB5AD265AF63     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee     FK_8ABF058C19072591C1000BDDD52FF17F488DCF24     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy   FK_37802898775B4197154F9DA54F8B7946A3C735BA     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_aSide_NFDeployment    FK_A08D274894ECB6799E56C2089A494AF0345B9B16     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_bSide_OCloudNamespace FK_D39953B79C8D39296B892FCF2C00B9C99AC7023F     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_comprised-by-cloudifiedNF  FK_127C21CB9B8871C3BCACA05A5400BE6B8E7FCAC0     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NFDeployment_REL_FK_serviced-managedElement    FK_AC1348E208C2E64F2EB1DECE2CCA5DB10B89CBD9     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_aSide_NodeCluster    FK_AE882D77CE8D21B8032B124E1822E0EEE5DAAD92     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_bSide_OCloudSite     FK_888BF6FF782916E61B3FE80643A549A1CFDB6117     CONSTRAINT
+FK_o-ran-smo-teiv-cloud_OCloudNamespace_REL_FK_deployed-on-nodeCluster FK_143EFC1953E68469572446EFB56BDEBBC83B8EBF     CONSTRAINT
+FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_grouped-by-sector     FK_078764B2F3D613D44CC6E3586F564C83164D2481     CONSTRAINT
+FK_o-ran-smo-teiv-equipment_AntennaModule_REL_FK_installed-at-site     FK_E3BAEF04443354C0FC1837CF7964E05BEF9FD6CC     CONSTRAINT
+FK_o-ran-smo-teiv-oam_ManagedElement_REL_FK_deployed-as-cloudifiedNF   FK_899B8130A861D1450FC49D3159D8B29C0628A717     CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction        FK_o-ran-smo-teiv-ran_NRCellCU_REL_FK_provided-by-ocucpFunction CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector        FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_grouped-by-sector CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction  FK_o-ran-smo-teiv-ran_NRCellDU_REL_FK_provided-by-oduFunction   CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_provided-by-oduFunction   FK_9B73B9E2DBA36736FB76606005C823A6D565A5CD     CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-antennaCapability    FK_65D538D54EB33081C808540235FEB28823428E64     CONSTRAINT
+FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu  FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu   CONSTRAINT
+FK_o-ran-smo-teiv-ran_NearRTRICFunction_REL_FK_managed-by-managedElement       FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203     CONSTRAINT
+FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_managed-by-managedElement   FK_122DD9709032528D161177B3624AD7AAF6589005     CONSTRAINT
+FK_o-ran-smo-teiv-ran_OCUUPFunction_REL_FK_managed-by-managedElement   FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D     CONSTRAINT
+FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_managed-by-managedElement     FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80     CONSTRAINT
+FK_o-ran-smo-teiv-ran_ORUFunction_REL_FK_managed-by-managedElement     FK_B497A8C3DC2D647938E6DB4C7E691509DD8C90DE     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_aSide_NFDeployment       FK_BE847E738902EA979AC709D5A3D0CCD3FD8911CA     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_bSide_NearRTRICFunction  FK_CCC0DEA6E4ABAB8614332070E83D953254D5A3A5     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_aSide_NFDeployment   FK_2B4B09AF7CC9C877B1140BB127B4CB4DA438195D     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_bSide_OCUCPFunction  FK_BCF2F9776761ABC19AE0BBD0244D7CD5785E7AC6     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_aSide_NFDeployment   FK_AC1393DCBA845EDA13DADCB5BD87DF4163CD1669     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_bSide_OCUUPFunction  FK_8585D545BC37A473A298E0F5F5942F897A7105B1     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_aSide_NFDeployment     FK_ABA5D0BEEB45E6A5B14DB24E880029CA38DF3F79     CONSTRAINT
+FK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_bSide_ODUFunction      FK_C7C12DB840FBCF4EA729B8C2BBCD8BFDE06F0F08     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability     FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_aSide_AntennaModule  FK_1AB1E0CC29DA2E122D43A6616EC60A3F73E68649     CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_bSide_NRCellDU       FK_8605800A4923C52258A8CE3989E18A7C93D22E8C     CONSTRAINT
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers        IDX_07C2D9F67E32FD07A927D1DF5F06734D7F89DBA0    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds  IDX_8A2A0ABA5E6ACAA8EF991E5B983551524A679509    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_classifiers        IDX_B6911D7B07CE9E7CF692209760002ABD15DA8CD9    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_sourceIds  IDX_13E530F00B0D405F58CDA235146715762EF6DF91    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_classifiers        IDX_35E57E345ABB0D6A9CD6D8FBDBC620646C046669    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_sourceIds  IDX_52B1FEA89EC725EA6195DBD272ED9983E98B99CB    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_antennaBeamWidth      IDX_452AE5B87383D94C9B188FBA8BBDA09B8A7E73B4    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_classifiers      IDX_18D66A31B8B88551ADA98E4BC6362B71A504CE1B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_sourceIds        IDX_36D40805D5D41247C46C23AF06A399E7CDC46EDD    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_40A0F4A77264E4DD55EBA83EB2270B21E79F48FF    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU   IDX_3EEEE6049314C502989CA49A6050FC40898889D1    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_classifiers    IDX_7470F8E4355FEDE440D3CEB831E05AF350B8144B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_sourceIds      IDX_CD2038615C829FA3EC5520DEF04DEBAD87DB7B57    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_eUtranFqBands     IDX_C9652A1BD1F6441ECBDB38922226AD08D7DDD60D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_geranFqBands      IDX_41A2CB8C648BE9B006CB04631C440F71DA6A61C3    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_nRFqBands IDX_49AB1B81ED859FE4A0F148617CB3E11454E05EAA    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_classifiers        IDX_98C227150239A7692514F1FDF5E3F49FC4439357    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_sourceIds  IDX_241D90708F29A60824E2A63C86D9AB84E611E505    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN     IDX_3FF5E0D439B273B25E65C4EC6E4682E5F8AE9D79    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN       IDX_0B9A243313790591EFA74660F1863924EE8CCB6C    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_classifiers        IDX_8F5A022153912D07D92FCE34FA9E754E0163F818    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_sourceIds  IDX_53A525F2FE3F291B4F2B234FE4EC799C778A8687    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY  IDX_D8626C46F2134489869EC9F70A2F3960D37BA656    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY    IDX_DBBF1D30DCD311E5D9D17524730BBF38DEB8BBF8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_classifiers      IDX_14454BB7AC41220815C5885AD1B3DB72F8089315    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_sourceIds        IDX_E909484E1251C6944EE877CB737E07475884A1AE    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU   IDX_4F93EF555F8640ADA220F02F1434AF29A96F85F2    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU     IDX_1161D2AF3E3B8B7503469AFF6E3DA87B4D66F852    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators   IDX_58D33C1960633F6CAA5F7E0A9880FF85D5923BF7    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_metadata        IDX_EA883FE1AB208DC033513D76B1414014FE4D1397    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_CD_decorators   IDX_4D253E190E8502C2DE0DC0E2A7A758EA8A5E5888    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_metadata        IDX_A04886514310E5B31E206923891CD213D9A5CEE6    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_CD_decorators   IDX_8B5018C20A65AC6FFF6E9B4C099B8F18058B3533    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_metadata        IDX_54DC74991A70957B0CEBAA38200F3059ECCABDEC    INDEX
+IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_CD_decorators IDX_245803DDE5BD5AB2780BB277649AE40CA8F4E145    INDEX
+IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU    IDX_4520B8DC811185D63D0E415F4E0AED4DC9967219    INDEX
+IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU IDX_6E7F02AC7C81800C688BB46D2639CBABFB376239    INDEX
+IDX_GIN_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_metadata      IDX_CDD068E13765C799B6503561CB0FAC5638B22C70    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_CD_decorators       IDX_3D44AB1602F5AA87FAF39E6F596888419F723F47    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_metadata    IDX_9532CB2D7B71297C7279D2E824DBE655331B5220    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_CD_decorators   IDX_F308FB8D16B912769597B9678466ADB19BAA27B2    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN        IDX_DC5DA06087B85C01A975848202AC386694598D78    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_metadata_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN     IDX_40D54F003F8A66E82DFC0BE377ADEFF1A8EAE78D    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_dUpLMNId        IDX_00624177EC65536001DDF0477A8F698B871C142D    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_metadata        IDX_9EC8D13EBFB1E513FD4F18C284AD66FA6751E2BC    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_CD_decorators   IDX_83EEB2F630BDBBF7BE7E8BBFA452D7F2AB69EB69    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY     IDX_97C1311E85CBA88A2048A17CC3A91406A13A162A    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY  IDX_52840EAF2D41B89AC3CE825BC9B0D9AC35AEFC5C    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_metadata        IDX_77A2303E82E9B9B4A9D61BE7C4F1B6088C40A04E    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_CD_decorators IDX_3C1344FC931EF89522B673948D541FD73E375C4F    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU      IDX_17F56568BFFACD4F9F2E6372407CE7F8FA06AF17    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_metadata_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU   IDX_6DDF32177944AAEDACB2123D05680F3B3B9BD4C7    INDEX
+IDX_GIN_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_metadata      IDX_BBF662FB069D121A65DCE5A46DAC3185B9A6D9A4    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_CD_decorators IDX_7C35D9F162CB5D2DA8BF96C1F076C9C55EC7CA96    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_metadata      IDX_2905D52A1A6E49FD9E984F4AD978144B6309C86F    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_classifiers     IDX_BD96130868B69147B2F87B0D15F5829690DEF454    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_CloudifiedNF_CD_sourceIds       IDX_9EDB5C47201FC82A4565BFED9EF369D6C6529B19    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_classifiers IDX_1BCFD9635C4FA089EDC2E18FFEF56DBF3C5E7A52    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_sourceIds   IDX_F97E398B17532BCD9923CE0CF98E73227D890037    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_classifiers     IDX_BED5B5FAA75FEE133E27581EAA611B89D20F24E1    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_CD_sourceIds       IDX_6433B9B7D69E51E828BDCFCAF59729EDCD10DA60    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT     IDX_31F185F0F700C0AE11C5A9B8D28DBF6E37538635    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT      IDX_1EE98ACCAE5537752BD51A3D5F6429585CC543F6    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT       IDX_072EB0C094138AB2D90F9CFBDA765B3B464EE86F    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT        IDX_4DD95BAED8503502101FEB9ECA25DDA8F371816C    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_classifiers        IDX_29702D5C8D0B9B20BFB534FA233B9D9FADC2E3A1    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_sourceIds  IDX_1D7F9BD4B5BBF73CC3D06D949731DC169DDED26D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_classifiers      IDX_CB29E8DDA990051B2A3DF193D8E4912F25D5FA0D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_NodeCluster_CD_sourceIds        IDX_DC1829E4241BA7C9B3E5281AC0DF00A766F9452E    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_classifiers  IDX_57EB74DEF745DE4BA9AAD8E735BACB71F2E8C417    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_CD_sourceIds    IDX_1B8DF6B061E229E5B6AC796911E6C8C23ECAD585    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER      IDX_6EE081E80342904B676496DA42DFAEC3EDA2CE27    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER        IDX_A7A50200F582AB86EF483F9BA74F999F17B7F653    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_classifiers       IDX_281A2DE604D25D6CFECB9B26D1FF70429FDB0FD0    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-cloud_OCloudSite_CD_sourceIds IDX_30C83E5F8447D28D8E2A73048DF751C886AF318B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_classifiers        IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_sourceIds  IDX_905011128A2C218B5352C19ED1FE9851F43EB911    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE    IDX_17E417F7EF56809674BE1D5F5154DCCE01E00A96    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE        IDX_83B6347C0C0A005D5E3D856D973D3322DFEDEA35    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE      IDX_F497DEC01DA066CB09DA2AA7EDE3F4410078491B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE  IDX_5ABDB19E55A6BDEF33855F14CB1B3B8CF457912C    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_antennaBeamWidth      IDX_21B0F1FE632B6CB185C49BA6F00224068F443215    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_Site_CD_classifiers IDX_EEBF1BC3344E97988232825777AB13FAB6C4F3F0    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_Site_CD_sourceIds   IDX_102A50584376DE25B6BBD7157594C607A5C957F2    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_classifiers     IDX_98AC4232BC02323E03416954215889CEE874A1E9    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_CD_sourceIds       IDX_DDD73D6F4004BF3A96AA118281EE3E565A922B47    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF IDX_634619CF7333EBC0AFDE990900B79220FC626EBA    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-oam_ManagedElement_REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF   IDX_8065626F3F48D4E5A4285654739D3B26499E4C4E    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_classifiers  IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_sourceIds    IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_eUtranFqBands   IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_geranFqBands    IDX_A94722FF7B95D8974B494793908B57B4E1A9743B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_nRFqBands       IDX_441B5C05448D63552C6414BD59C13641D8A4408D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_CD_classifiers   IDX_E5930226819982DC0CFC1FA64FB3600647222435    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_CD_sourceIds     IDX_0C443A16285D233F16966C2F0314CDC9D0F6D0B8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU       IDX_D366F952FD4A52645C45A19CBFD02B8897FC1F18    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellCU_REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU IDX_6891C1BB8EE214340A362906C08955E8ACC1C597    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_classifiers   IDX_C437D39632DC79BAB6AC4F0880826A05425F9C32    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_CD_sourceIds     IDX_FFD60DD99D80C276F402E66546F5DACB2D81EE26    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU IDX_A950BF337D5D820E5B39AC3F1B1AC09C062F30C9    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU        IDX_7CB4A7724F68D1CB2D12E8DE779BA9103F7DBE0A    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU   IDX_B48D188E92ACBE9A2CAF8CD730A5DDFD7E086705    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRCellDU_REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU  IDX_6325926B4D2FDD1FBBB34250DABEA5E7229FF9F5    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_classifiers    IDX_050A80BEEF775E4D3CE216F282F23DB99DA2D798    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_CD_sourceIds      IDX_8E34EC0B1DE7DDCE3B32ADD85B11E15F95C5644E    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER  IDX_ED50A5139F1449DBAD8DA10D45F5A5BF819EACBA    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY IDX_B975D24291849007D4AA6686C5D3983885D5C884    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER   IDX_FC70CCFDC1359B698BBBE5CA7AA158F0AF693461    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER    IDX_7BFD17A71AB1B7765FE6431DA4E66C2EDE88AC3B    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY   IDX_1F27C515A028616FAC422A02ABBEC402D5DBB2E5    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER     IDX_986B2223E72FF79237337329F4C3BB9DA9025A34    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_classifiers  IDX_8BCCF388DFC8652AD5CD0675C64F49D2D2EDC7A1    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_CD_sourceIds    IDX_E4E40B26C322AF63A662706AF8B0B36E1043B793    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION     IDX_0ECC814A408874C9F8E73EEE3968984A6345A606    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION       IDX_B608D8F6B8A79097EA61A1B4777A96CD3D2D1E98    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_classifiers      IDX_8D9862DBF6A721FABAEA4204E04B374692C1C5B8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_CD_sourceIds        IDX_84A29F8571860AC5A7BD1A99923485ECB6A3939D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION     IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION       IDX_4C6B5CB5CF018656DC8191CE6FE3B9DA2CD0C819    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_classifiers      IDX_25E4BCFBF8F5344DFC60BCB159FA873FFC8109E9    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_CD_sourceIds        IDX_6C81B2BBFCFE94C87598869A2099E04571202BA7    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION     IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION       IDX_50209F1FF59B49F79FF194887B631994F2B5148A    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFunction_pLMNIdList  IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_classifiers        IDX_5CE9EDE1F25AB2D880A41BC5D297FDBE668182E8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_CD_sourceIds  IDX_73790DA8FF6365B752DC8B399893AC6DE8CF26C4    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION IDX_5DD192861541E0EB2776C6BFE34B327FF27F93C3    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ODUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION   IDX_0E5C91A3252FBAFA72DB644D4E949A379F0CB910    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_classifiers        IDX_2A5AAAD13FDCFF7F2958005C22937366F6604A0D    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_CD_sourceIds  IDX_D0D11CFAA917F4FA12748A041A34D2B39A3AD707    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION IDX_DA79A3F946C1F4E8D05B4D6ADEF5E4C65E47635E    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ORUFunction_REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION   IDX_AF235FB2C9CCA99D94CC4038669EDD1BB6C7B2DF    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_classifiers     IDX_19C19556F9714850389595E0A16218FA229205FE    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_Sector_CD_sourceIds       IDX_E234B43A7CD7843672F08F2197AB46A2A50BECB0    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_classifiers    IDX_F52FEEDBAF1B04D2D22EBAE051BB5125DF6A6968    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_sourceIds      IDX_996D2C34C2458A6EFE8599C1A0E6942D3D288B7A    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_classifiers        IDX_03F9C6A2FA82614A788443AC6044BCED2401C465    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_sourceIds  IDX_10BCC6B44663A8D5431668BEE5DF80423420C616    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_classifiers        IDX_69152691D777DDB084C053915D4A4B15F7F8B3EB    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_sourceIds  IDX_64B7C127C01069009A3FB13592DAE249B0029283    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_classifiers  IDX_F4A1999634924C7E4D1CBD05E83996A5B1262A8A    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_sourceIds    IDX_5996D077978D38D0C1A951A262F1F7E1E339F052    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers       IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_classifiers        IDX_F93AD0AE5C6940EE73D0B661A2E2E5BB10B3772C    INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_sourceIds  IDX_0E1BE8724BEBB21C5AE3986BE150BEC8F8CD903E    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators        IDX_GIN_o-ran-smo-teiv-cloud_CloudifiedNF_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_CD_decorators    IDX_4055A796F223DD01411AFFB5AD97EEEAB6B2320C    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators        IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT        IDX_46CDB369134F042EC021F7496DF721B49A9D43C0    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NFDeployment_REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT IDX_39A292C3C42B34C2AD7C2A0FD087739C253B06FC    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_CD_decorators   IDX_98A32BE3A8C1FF8CDEC95561DE4A74852FE70322    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators IDX_GIN_o-ran-smo-teiv-cloud_NodeCluster_CD_decorators  INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators     IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_CD_decorators      INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_OCloudNamespace_REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER IDX_9AB8994DE0826F790D70614D4C52DD270AEF946B    INDEX
+IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators  IDX_GIN_o-ran-smo-teiv-cloud_OCloudSite_CD_decorators   INDEX
+IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators   IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE       IDX_2321BFA482AD2700F41E2BA359F6EB00F47601B9    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE   IDX_6C6FBD69F47F41970595A8775DC99CA0F5E894A1    INDEX
+IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators    IDX_GIN_o-ran-smo-teiv-equipment_Site_CD_decorators     INDEX
+IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators        IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-oam_ManagedElement_REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF    IDX_F15A070FC83B2E49223B4232E0BEB8931C2B7A4C    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators     IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators      INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators      IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_CD_decorators       INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU  IDX_5D761303176D3B9338784DFBEE0CEC51046ADC30    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId     IDX_GIN_o-ran-smo-teiv-ran_NRCellCU_plmnId      INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators      IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_CD_decorators       INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU    IDX_F494CB3BA4C726D4C45D53B1EF62E1E26811CCEF    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRCellDU_REL_CD_decorators_SECTOR_GROUPS_NRCELLDU   IDX_0A03C47C13AD3B5C84D3D8081493D670E9CBDCD1    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators       IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_CD_decorators        INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER     IDX_2ADB5C6DCAEE8811FB1CA8FD9EB53381F35FCB70    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY    IDX_902B73F741160B9D4FBF62406D3D9ABBECAD8BE7    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NRSectorCarrier_REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER      IDX_5AB1D780E57D940C42BAD29772E9E2B6C63498A0    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators     IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_CD_decorators      INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION        IDX_B10FD045A6C3E169953CCC38CC2D801FCE15A75F    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId    IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_pLMNId     INDEX
+IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_CD_decorators  INDEX
+IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION        IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId        IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_pLMNId INDEX
+IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_CD_decorators  INDEX
+IDX_GIN_o-ran-smo-teiv-ran_OCUUPFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION        IDX_ADD3393C27589066C4993A3491436C6FB57A539F    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators   IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_CD_decorators    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION    IDX_0B9AC962B1E07740CE43D912B5FBC54E0B39DD24    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId        IDX_GIN_o-ran-smo-teiv-ran_ODUFunction_dUpLMNId INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators   IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_CD_decorators    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ORUFunction_REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION    IDX_7B916E1753D2860DF434831CF1E9697ED9973C8F    INDEX
+IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators        IDX_GIN_o-ran-smo-teiv-ran_Sector_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_CD_decorators       IDX_D333FA5882890B7CD3599712FFFB2641B9E04C80    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_CD_decorators   IDX_0867A1E865A904F4BB513948DAEB60412BE67DF3    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_CD_decorators   IDX_3AB53A0DB6DC4B4C8BB6194D6D487EBDC3D0E88F    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_CD_decorators     IDX_5BAC6D2F05A63FDE27F082E8C8F4D766C145E835    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators  IDX_7BF09D0227840279556AD27ACECB068705893D28    INDEX
+IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_CD_decorators   IDX_319FDFF6C9E6BC1D922F0A2AFEAAC294E520F753    INDEX
+PK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE_id   PK_8123C74A8D9A873F330C37E370DB951212243844     CONSTRAINT
+PK_o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE_id   PK_48BAB21388EA2B1BE83EF5D3FC143807776A882D     CONSTRAINT
+PK_o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_id   PK_8EB1724D91D554E7771C8C5AE5AA752A604E025C     CONSTRAINT
+PK_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_id PK_AD1799D4203C08DE10524497B4997C2DCB4F6A92     CONSTRAINT
+PK_o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_id       PK_AE71D2F6E7DABC3C066CEB9E1F30286DE8AF12D0     CONSTRAINT
+PK_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_id   PK_BEBBD904815CB84D3D7D326B13A71BC786E8C2B6     CONSTRAINT
+PK_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_id   PK_61C7969B1B7C806E01CE3D9471CFF52FA37864C3     CONSTRAINT
+PK_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_id PK_94DB80CFD01964A5D56BC22F433BBAF282F5AB0E     CONSTRAINT
+PK_o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY_id PK_E078962EDFAEDBC93784222B0B7BDFC3929D4D79     CONSTRAINT
+PK_o-ran-smo-teiv-cloud_CloudifiedNF_id        PK_o-ran-smo-teiv-cloud_CloudifiedNF_id CONSTRAINT
+PK_o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE_id    PK_E4FDDE2DC433209F933C7F53C9F72C1D2EB04BC6     CONSTRAINT
+PK_o-ran-smo-teiv-cloud_NFDeployment_id        PK_o-ran-smo-teiv-cloud_NFDeployment_id CONSTRAINT
+PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id   PK_o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE_id    CONSTRAINT
+PK_o-ran-smo-teiv-cloud_NodeCluster_id PK_o-ran-smo-teiv-cloud_NodeCluster_id  CONSTRAINT
+PK_o-ran-smo-teiv-cloud_OCloudNamespace_id     PK_o-ran-smo-teiv-cloud_OCloudNamespace_id      CONSTRAINT
+PK_o-ran-smo-teiv-cloud_OCloudSite_id  PK_o-ran-smo-teiv-cloud_OCloudSite_id   CONSTRAINT
+PK_o-ran-smo-teiv-equipment_AntennaModule_id   PK_o-ran-smo-teiv-equipment_AntennaModule_id    CONSTRAINT
+PK_o-ran-smo-teiv-equipment_Site_id    PK_o-ran-smo-teiv-equipment_Site_id     CONSTRAINT
+PK_o-ran-smo-teiv-oam_ManagedElement_id        PK_o-ran-smo-teiv-oam_ManagedElement_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_AntennaCapability_id     PK_o-ran-smo-teiv-ran_AntennaCapability_id      CONSTRAINT
+PK_o-ran-smo-teiv-ran_NRCellCU_id      PK_o-ran-smo-teiv-ran_NRCellCU_id       CONSTRAINT
+PK_o-ran-smo-teiv-ran_NRCellDU_id      PK_o-ran-smo-teiv-ran_NRCellDU_id       CONSTRAINT
+PK_o-ran-smo-teiv-ran_NRSectorCarrier_id       PK_o-ran-smo-teiv-ran_NRSectorCarrier_id        CONSTRAINT
+PK_o-ran-smo-teiv-ran_NearRTRICFunction_id     PK_o-ran-smo-teiv-ran_NearRTRICFunction_id      CONSTRAINT
+PK_o-ran-smo-teiv-ran_OCUCPFunction_id PK_o-ran-smo-teiv-ran_OCUCPFunction_id  CONSTRAINT
+PK_o-ran-smo-teiv-ran_OCUUPFunction_id PK_o-ran-smo-teiv-ran_OCUUPFunction_id  CONSTRAINT
+PK_o-ran-smo-teiv-ran_ODUFunction_id   PK_o-ran-smo-teiv-ran_ODUFunction_id    CONSTRAINT
+PK_o-ran-smo-teiv-ran_ORUFunction_id   PK_o-ran-smo-teiv-ran_ORUFunction_id    CONSTRAINT
+PK_o-ran-smo-teiv-ran_Sector_id        PK_o-ran-smo-teiv-ran_Sector_id CONSTRAINT
+PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION_id       PK_82A1C5618438FF6DF7CDD48FD71E0A584E6D052A     CONSTRAINT
+PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION_id   PK_2D854968CB74C42C534D8E7C2A53E93F6B7F001F     CONSTRAINT
+PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION_id   PK_E551D02D14B3C04A565DC73A386BEB29627D3C08     CONSTRAINT
+PK_o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION_id     PK_A10CB552A0F126991DD325EC84DBFAC6F2BBE1A3     CONSTRAINT
+PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id  PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE     CONSTRAINT
+PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU_id   PK_F41873285F3BD831F63C6041B4356A063403406D     CONSTRAINT
+REL_CD_classifiers_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU      REL_CD_B614AAA814176BC7128CE9D72C0950C4D6DE8052 COLUMN
+REL_CD_classifiers_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY   REL_CD_68C234330FD6388836D0DAF9DFD0A40DE66DD8C5 COLUMN
+REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE     REL_CD_classifiers_ANTENNAMODULE_INSTALLED_AT_SITE      COLUMN
+REL_CD_classifiers_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN      REL_CD_7E9F11EFBF8974D7C7DAB02E181A0BE4148091C6 COLUMN
+REL_CD_classifiers_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU    REL_CD_E388983F3E6BFAD67CA100F0AFCF8CD3E9B89ADD COLUMN
+REL_CD_decorators_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU       REL_CD_0AC0D382E4274681870EC7319460192F4F603001 COLUMN
+REL_CD_decorators_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY    REL_CD_A14923FFF9D13FEB18087CE2A9C0BD264C572CFC COLUMN
+REL_CD_decorators_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN       REL_CD_FFF7E036187A7605BFC714483D2E60FD2FF6560B COLUMN
+REL_CD_decorators_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU     REL_CD_EF3979E9DAF31B7949C883654633E633B9D35B92 COLUMN
+REL_CD_sourceIds_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU        REL_CD_32FFD9EF85AB2342E652FA493C3BF34D9BAAF054 COLUMN
+REL_CD_sourceIds_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY     REL_CD_8D8BBB53FB18E8E9A5D241B66DA18CB5DDE9C1A5 COLUMN
+REL_CD_sourceIds_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN        REL_CD_45E8E8693B1B8928376EAA8995D08AA7B1E483BD COLUMN
+REL_CD_sourceIds_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU      REL_CD_1F61FA6DDAECE90540F9880F2A98037B1530A5A4 COLUMN
+REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT REL_CD_classifiers_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT  COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF     REL_CD_classifiers_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF      COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION    REL_CD_classifiers_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION     COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION        REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION        REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION  REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION   COLUMN
+REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION  REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ORUFUNCTION   COLUMN
+REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT  REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT   COLUMN
+REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER       REL_CD_classifiers_NRCELLDU_USES_NRSECTORCARRIER        COLUMN
+REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY      REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY       COLUMN
+REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER     REL_CD_classifiers_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER      COLUMN
+REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU     REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU      COLUMN
+REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU       REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRCELLDU        COLUMN
+REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER        REL_CD_classifiers_ODUFUNCTION_PROVIDES_NRSECTORCARRIER COLUMN
+REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE REL_CD_classifiers_SECTOR_GROUPS_ANTENNAMODULE  COLUMN
+REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU      REL_CD_classifiers_SECTOR_GROUPS_NRCELLDU       COLUMN
+REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE      REL_CD_decorators_ANTENNAMODULE_INSTALLED_AT_SITE       COLUMN
+REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT  REL_CD_decorators_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT   COLUMN
+REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF      REL_CD_decorators_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF       COLUMN
+REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION     REL_CD_decorators_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION      COLUMN
+REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION  COLUMN
+REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION  COLUMN
+REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION   REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION    COLUMN
+REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION   REL_CD_decorators_MANAGEDELEMENT_MANAGES_ORUFUNCTION    COLUMN
+REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT   REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT    COLUMN
+REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER        REL_CD_decorators_NRCELLDU_USES_NRSECTORCARRIER COLUMN
+REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY       REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY        COLUMN
+REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER      REL_CD_decorators_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER       COLUMN
+REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU      REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU       COLUMN
+REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU        REL_CD_decorators_ODUFUNCTION_PROVIDES_NRCELLDU COLUMN
+REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER REL_CD_decorators_ODUFUNCTION_PROVIDES_NRSECTORCARRIER  COLUMN
+REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE  REL_CD_decorators_SECTOR_GROUPS_ANTENNAMODULE   COLUMN
+REL_CD_decorators_SECTOR_GROUPS_NRCELLDU       REL_CD_decorators_SECTOR_GROUPS_NRCELLDU        COLUMN
+REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE       REL_CD_sourceIds_ANTENNAMODULE_INSTALLED_AT_SITE        COLUMN
+REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT   REL_CD_sourceIds_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT    COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF       REL_CD_sourceIds_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF        COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION      REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION       COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION  REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION   COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION  REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION   COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION    REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION     COLUMN
+REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION    REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ORUFUNCTION     COLUMN
+REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT    REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT     COLUMN
+REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER REL_CD_sourceIds_NRCELLDU_USES_NRSECTORCARRIER  COLUMN
+REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY        REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
+REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER       REL_CD_sourceIds_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER        COLUMN
+REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU       REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU        COLUMN
+REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRCELLDU  COLUMN
+REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER  REL_CD_sourceIds_ODUFUNCTION_PROVIDES_NRSECTORCARRIER   COLUMN
+REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE   REL_CD_sourceIds_SECTOR_GROUPS_ANTENNAMODULE    COLUMN
+REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU        REL_CD_sourceIds_SECTOR_GROUPS_NRCELLDU COLUMN
+REL_FK_used-nrCellDu   REL_FK_used-nrCellDu    COLUMN
+REL_FK_comprised-by-cloudifiedNF       REL_FK_comprised-by-cloudifiedNF        COLUMN
+REL_FK_deployed-as-cloudifiedNF        REL_FK_deployed-as-cloudifiedNF COLUMN
+REL_FK_deployed-on-nodeCluster REL_FK_deployed-on-nodeCluster  COLUMN
+REL_FK_grouped-by-sector       REL_FK_grouped-by-sector        COLUMN
+REL_FK_installed-at-site       REL_FK_installed-at-site        COLUMN
+REL_FK_managed-by-managedElement       REL_FK_managed-by-managedElement        COLUMN
+REL_FK_provided-by-ocucpFunction       REL_FK_provided-by-ocucpFunction        COLUMN
+REL_FK_provided-by-oduFunction REL_FK_provided-by-oduFunction  COLUMN
+REL_FK_serviced-managedElement REL_FK_serviced-managedElement  COLUMN
+REL_FK_used-antennaCapability  REL_FK_used-antennaCapability   COLUMN
+REL_FK_used-by-nrCellDu        REL_FK_used-by-nrCellDu COLUMN
+REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU  REL_ID_7899092EC8FBC674398C53965ADEFF940D17481F COLUMN
+REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY       REL_ID_1C61FC18067350DB393AFDB5270E9DE1F5151C64 COLUMN
+REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN  REL_ID_BDE0B6C74D14AC109D29A08D80E92D4D0DCAEB0B COLUMN
+REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU        REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU COLUMN
+REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE  COLUMN
+REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT     REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT      COLUMN
+REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF  COLUMN
+REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION        REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION COLUMN
+REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION    REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION     COLUMN
+REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION    REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION     COLUMN
+REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION      REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION       COLUMN
+REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION      REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION       COLUMN
+REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT      REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT       COLUMN
+REL_ID_NRCELLDU_USES_NRSECTORCARRIER   REL_ID_NRCELLDU_USES_NRSECTORCARRIER    COLUMN
+REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY  REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY   COLUMN
+REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER  COLUMN
+REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU  COLUMN
+REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU   REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU    COLUMN
+REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER    REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER     COLUMN
+REL_ID_SECTOR_GROUPS_ANTENNAMODULE     REL_ID_SECTOR_GROUPS_ANTENNAMODULE      COLUMN
+REL_ID_SECTOR_GROUPS_NRCELLDU  REL_ID_SECTOR_GROUPS_NRCELLDU   COLUMN
+REL_metadata_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU    REL_metadata_8B4FA813345B7F25ACF2E9635EAF6E6DE0FBBE8A   COLUMN
+REL_metadata_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY REL_metadata_F723867781098568079DD82E5D5E529374F97E98   COLUMN
+REL_metadata_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN    REL_metadata_72494257260B57223C09828D7C3B31D203B050B4   COLUMN
+REL_metadata_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU  REL_metadata_C9E09FBCCBA1F6A3252B71B869B269EF28AACDFB   COLUMN
+REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE   REL_metadata_ANTENNAMODULE_INSTALLED_AT_SITE    COLUMN
+REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT       REL_metadata_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT        COLUMN
+REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF   REL_metadata_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF    COLUMN
+REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION  REL_metadata_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION   COLUMN
+REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION      REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION       COLUMN
+REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION      REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION       COLUMN
+REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION        REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION COLUMN
+REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION        REL_metadata_MANAGEDELEMENT_MANAGES_ORUFUNCTION COLUMN
+REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT        REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT COLUMN
+REL_metadata_NRCELLDU_USES_NRSECTORCARRIER     REL_metadata_NRCELLDU_USES_NRSECTORCARRIER      COLUMN
+REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY    REL_metadata_NRSECTORCARRIER_USES_ANTENNACAPABILITY     COLUMN
+REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER   REL_metadata_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER    COLUMN
+REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU   REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU    COLUMN
+REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU     REL_metadata_ODUFUNCTION_PROVIDES_NRCELLDU      COLUMN
+REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER      REL_metadata_ODUFUNCTION_PROVIDES_NRSECTORCARRIER       COLUMN
+REL_metadata_SECTOR_GROUPS_ANTENNAMODULE       REL_metadata_SECTOR_GROUPS_ANTENNAMODULE        COLUMN
+REL_metadata_SECTOR_GROUPS_NRCELLDU    REL_metadata_SECTOR_GROUPS_NRCELLDU     COLUMN
+UNIQUE_o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt_REL_ID_ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU        UNIQUE_C40364D44BC6DFCB468EEE1A8FB42BDB71D94114 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_REL_ID_MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN    UNIQUE_EFB77EDE9661E3C6826E575AB125FD4F8FCD3BE1 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_REL_ID_LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY UNIQUE_523F8C2098EA2DE66650F9CCA7713124C14D63DF CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU_REL_ID_ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU  UNIQUE_6C7164EC5E639D7E0D833D3C4E0CAB85062EE418 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT    UNIQUE_A5A8418B6BE911F281E6E2AA640D7D9F777471DC CONSTRAINT
+UNIQUE_o-ran-smo-teiv-cloud_NFDeployment_REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT     UNIQUE_8AD46969905BEEB89F63D3F37FD82B14F34FDCBC CONSTRAINT
+UNIQUE_o-ran-smo-teiv-cloud_OCloudNamespace_REL_ID_OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER     UNIQUE_C4DE73BD7AA3DBFA2D32E577D4E0A534A7184AB0 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_ANTENNAMODULE_INSTALLED_AT_SITE   UNIQUE_9DF414C2F0CD7FA8BFCB3E9BF851784AC4BC49B1 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-equipment_AntennaModule_REL_ID_SECTOR_GROUPS_ANTENNAMODULE       UNIQUE_78B1D3DCD903AFFB1965D440D87B2D194CA028A0 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-oam_ManagedElement_REL_ID_MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF        UNIQUE_EC9B35192A31C6491E6566602720D1C26E3CB708 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRCellCU_REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU      UNIQUE_928074AEE57C9CB151F93FDC81BC59200D5F7497 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_ODUFUNCTION_PROVIDES_NRCELLDU        UNIQUE_B70F668E0E45FFFC5B7014489F6FD528EB15F192 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRCellDU_REL_ID_SECTOR_GROUPS_NRCELLDU       UNIQUE_AC1C114ABED77D6DEC3F3AE3F9EBE8231924AEF4 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRCELLDU_USES_NRSECTORCARRIER UNIQUE_1AB577E5AC207ED4C99A9A96BA1C9C35544AFD25 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY        UNIQUE_A799EC9DA6624651081E1DA21B5F0C2D38F6A192 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCARRIER  UNIQUE_D5D35955594A6EB48640425529F7DE44BED00B62 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_NearRTRICFunction_REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION    UNIQUE_E020461673334EB824643649B6B31670FB064EC8 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION    UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_OCUUPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION    UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION        UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4 CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_ORUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ORUFUNCTION        UNIQUE_4E6F008B82605A806EED04B2315A1FEE095A9241 CONSTRAINT
+aSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee aSide_2A2D3374BF907674FA1905478E30ACB8882DC03C  COLUMN
+aSide_AntennaModule    aSide_AntennaModule     COLUMN
+bSide_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy       bSide_E8A97B8133D74D3BE65119E868FAC0BE63C09FFC  COLUMN
+bSide_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee bSide_EE6DD4A2CFD743779BBCBFC18FC296EF6D72EB1E  COLUMN
+cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd       020335B0F627C169E24167748C38FE756FB34AE2        COLUMN
+aSide_NFDeployment     aSide_NFDeployment      COLUMN
+aSide_NodeCluster      aSide_NodeCluster       COLUMN
+antennaBeamWidth       antennaBeamWidth        COLUMN
+antennaModelNumber     antennaModelNumber      COLUMN
+arfcnDL        arfcnDL COLUMN
+arfcnUL        arfcnUL COLUMN
+azimuth        azimuth COLUMN
+bSChannelBwDL  bSChannelBwDL   COLUMN
+bSide_AntennaCapability        bSide_AntennaCapability COLUMN
+bSide_NRCellDU bSide_NRCellDU  COLUMN
+bSide_NearRTRICFunction        bSide_NearRTRICFunction COLUMN
+bSide_OCUCPFunction    bSide_OCUCPFunction     COLUMN
+bSide_OCUUPFunction    bSide_OCUUPFunction     COLUMN
+bSide_OCloudNamespace  bSide_OCloudNamespace   COLUMN
+bSide_OCloudSite       bSide_OCloudSite        COLUMN
+bSide_ODUFunction      bSide_ODUFunction       COLUMN
+cellLocalId    cellLocalId     COLUMN
+dUpLMNId       dUpLMNId        COLUMN
+eUtranFqBands  eUtranFqBands   COLUMN
+electricalAntennaTilt  electricalAntennaTilt   COLUMN
+frequencyDL    frequencyDL     COLUMN
+frequencyUL    frequencyUL     COLUMN
+gNBCUName      gNBCUName       COLUMN
+gNBDUId        gNBDUId COLUMN
+gNBId  gNBId   COLUMN
+gNBIdLength    gNBIdLength     COLUMN
+geo-location   geo-location    COLUMN
+geranFqBands   geranFqBands    COLUMN
+horizontalBeamWidth    horizontalBeamWidth     COLUMN
+id     id      COLUMN
+mechanicalAntennaBearing       mechanicalAntennaBearing        COLUMN
+mechanicalAntennaTilt  mechanicalAntennaTilt   COLUMN
+metadata       metadata        COLUMN
+nCI    nCI     COLUMN
+nRFqBands      nRFqBands       COLUMN
+nRPCI  nRPCI   COLUMN
+nRTAC  nRTAC   COLUMN
+name   name    COLUMN
+nearRtRicId    nearRtRicId     COLUMN
+o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE 09D47DF128202AB535BC2056D7C0952F6EE7AF2D        TABLE
+o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE 98D95275440120DC7A5FEF7E870FB6649F275AEC        TABLE
+o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 9AB5ED164AE73FC3AB14965C0B1F3E90A04CF974        TABLE
+o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt       C9475FE40C02BEB41F720B4284A856F2CF49E1F3        TABLE
+o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy     AA68071F5A253FC68706DC4244B2EEEDCFA4F477        TABLE
+o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn AD6AA1B5E225BBC96B792246D095340747056399        TABLE
+o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 8F1E5B0125750A5230DB73DB7816ECCFFC2D918B        TABLE
+o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU       F93C2CA075353668A76B4718E07B741ACCD83641        TABLE
+o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY       E2D2B450D65F1FF241A983CBB43B54C040969908        TABLE
+o-ran-smo-teiv-cloud_CloudifiedNF      o-ran-smo-teiv-cloud_CloudifiedNF       TABLE
+o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE  o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE   TABLE
+o-ran-smo-teiv-cloud_NFDeployment      o-ran-smo-teiv-cloud_NFDeployment       TABLE
+o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE  TABLE
+o-ran-smo-teiv-cloud_NodeCluster       o-ran-smo-teiv-cloud_NodeCluster        TABLE
+o-ran-smo-teiv-cloud_OCloudNamespace   o-ran-smo-teiv-cloud_OCloudNamespace    TABLE
+o-ran-smo-teiv-cloud_OCloudSite        o-ran-smo-teiv-cloud_OCloudSite TABLE
+o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule  TABLE
+o-ran-smo-teiv-equipment_Site  o-ran-smo-teiv-equipment_Site   TABLE
+o-ran-smo-teiv-oam_ManagedElement      o-ran-smo-teiv-oam_ManagedElement       TABLE
+o-ran-smo-teiv-ran_AntennaCapability   o-ran-smo-teiv-ran_AntennaCapability    TABLE
+o-ran-smo-teiv-ran_NRCellCU    o-ran-smo-teiv-ran_NRCellCU     TABLE
+o-ran-smo-teiv-ran_NRCellDU    o-ran-smo-teiv-ran_NRCellDU     TABLE
+o-ran-smo-teiv-ran_NRSectorCarrier     o-ran-smo-teiv-ran_NRSectorCarrier      TABLE
+o-ran-smo-teiv-ran_NearRTRICFunction   o-ran-smo-teiv-ran_NearRTRICFunction    TABLE
+o-ran-smo-teiv-ran_OCUCPFunction       o-ran-smo-teiv-ran_OCUCPFunction        TABLE
+o-ran-smo-teiv-ran_OCUUPFunction       o-ran-smo-teiv-ran_OCUUPFunction        TABLE
+o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran_ODUFunction  TABLE
+o-ran-smo-teiv-ran_ORUFunction o-ran-smo-teiv-ran_ORUFunction  TABLE
+o-ran-smo-teiv-ran_Sector      o-ran-smo-teiv-ran_Sector       TABLE
+o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION     3C2E2CE7BDF8321BC824B6318B190690F58DBB82        TABLE
+o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION  TABLE
+o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION  TABLE
+o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION   o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION    TABLE
+o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY        CFC235E0404703D1E4454647DF8AAE2C193DB402        TABLE
+o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU  TABLE
+oruId  oruId   COLUMN
+pLMNId pLMNId  COLUMN
+pLMNIdList     pLMNIdList      COLUMN
+plmnId plmnId  COLUMN
+positionWithinSector   positionWithinSector    COLUMN
+sectorId       sectorId        COLUMN
+totalTilt      totalTilt       COLUMN
+verticalBeamWidth      verticalBeamWidth       COLUMN
+\.
+
+COPY teiv_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin;
+_3gpp-common-yang-extensions   urn:3gpp:sa5:_3gpp-common-yang-extensions       \N      []      2023-09-18      bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogIHlhbmctdmVyc2lvbiAxLjE7CiAgbmFtZXNwYWNlIHVybjozZ3BwOnNhNTpfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIDsKICBwcmVmaXggeWV4dDNncHAgOwoKICBvcmdhbml6YXRpb24gIjNHUFAgU0E1IjsKICBjb250YWN0ICJodHRwczovL3d3dy4zZ3BwLm9yZy9EeW5hUmVwb3J0L1RTRy1XRy0tUzUtLW9mZmljaWFscy5odG0/SXRlbWlkPTQ2NCI7CgogIGRlc2NyaXB0aW9uICJUaGUgbW9kdWxlIGRlZmluZXMgWUFORyBleHRlbnNpb25zIG5lZWRlZCAKICAgIDNHUFAgWUFORyBtb2RlbGluZy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTkgM0dQUC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBFeHRlbnNpb25zIE1VU1QgYmUgZGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZQogICAgZGVzY3JpcHRpb24gc3RhdGVtZW50OgogICAgICAgIC0gV2hhdCBpcyB0aGlzIHN0YXRlbWVudC4KICAgICAgICAtIE5ld2xpbmUsCiAgICAgICAgLSBUaGlzIHN0YXRlbWVudCBjYW4gYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlIHh4eCBzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gVGhpcyBzdGF0ZW1lbnQgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBzdWJzdGF0ZW1lbnRzIHdpdGgKICAgICAgICBjYXJkaW5hbGl0eSB4Li55LgogICAgICAgIC0gTmV3bGluZQogICAgICAgIC0gSXMgY2hhbmdpbmcgdGhpcyBzdGF0ZW1lbnQgYW4gZWRpdG9yaWFsLCBCQyhiYWNrd2FyZHMgY29tcGF0aWJsZSkgCiAgICAgICAgb3IgTkJDKG5vbi1CQykgY2hhbmdlPwogICAgICAgIC0gTmV3bGluZS4KICAgICAgICAtIFRoZSBhcmd1bWVudCBpdHMgbWVhbmluZyBhbmQgdHlwZS4gUHJlZmVyYWJseSB1c2UgWUFORyB0eXBlcyBhbmQKICAgICAgICAgIGNvbnN0cmFpbnRzIHRvIGRlZmluZSB0aGUgYXJndW1lbnQncyB0eXBlLgoKICAgIEFueSBleHRlbnNpb24gc3RhdGVtZW50IGNhbiBiZSBhZGRlZCB3aXRoIGEKICAgIGRldmlhdGlvbi9kZXZpYXRlIGFkZCBzdGF0ZW1lbnQuIEluIHRoaXMgY2FzZSB0aGUgcmVzdHJpY3Rpb24gYWJvdXQKICAgIHRoZSBwYXJlbnQgc3RhdGVtZW50IG9mIHRoZSBleHRlbnNpb24gU0hBTEwgYmUgZXZhbHVhdGVkIGJhc2VkIG9uIHRoZQogICAgdGFyZ2V0IG9mIHRoZSBkZXZpYXRpb24gc3RhdGVtZW50LgoKICAgIFN1cHBvcnQgZm9yIHRoaXMgbW9kdWxlIGRvZXMgbm90IG1lYW4gdGhhdCBhIFlBTkcgc2VydmVyIGltcGxlbWVudHMKICAgIHN1cHBvcnQgZm9yIGVhY2ggb2YgdGhlc2UgZXh0ZW5zaW9ucy4KICAgIEltcGxlbWVudGVycyBvZiBlYWNoIHNwZWNpZmljIG1vZHVsZSB1c2luZyBhbiBleHRlbnNpb25zIE1VU1QgY2hlY2sKICAgIGlmIHRoZSBzZXJ2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgdXNlZCBleHRlbnNpb24uCiAgICBOb3RlOiBtb2R1bGVzIHVzZSBtYW55IGV4dGVuc2lvbnMgd2hpY2ggaW5kaXZpZHVhbAogICAgaW1wbGVtZW50YXRpb25zIE1BWSBvciBNQVkgTk9UIHN1cHBvcnQuCiAgICBJZiBzdXBwb3J0IGZvciBhbiBleHRlbnNpb24gaXMgbWlzc2luZyB0aGUgZXh0ZW5zaW9uIHN0YXRlbWVudCBuZWVkcwogICAgaW5kaXZpZHVhbCBoYW5kbGluZyBvciBpdCBTSE9VTEQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgdXNpbmcKICAgIHRoZSBleHRlbnNpb24gZS5nLiB3aXRoIGEgZGV2aWF0aW9uLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLCAKICAgIFRUQSwgVFRDKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4iOwogIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjMKICAgICAgR2VuZXJpYyBOZXR3b3JrIFJlc291cmNlIE1vZGVsIChOUk0pCiAgICAgIEludGVncmF0aW9uIFJlZmVyZW5jZSBQb2ludCAoSVJQKTsKICAgICAgU29sdXRpb24gU2V0IChTUykgZGVmaW5pdGlvbnMKICAgICAgM0dQUCBUUyAyOC42MjMiOwoKICByZXZpc2lvbiAyMDIzLTA5LTE4IHsgcmVmZXJlbmNlIENSLTAyNzEgOyB9IAogIHJldmlzaW9uIDIwMjItMTAtMjAgeyByZWZlcmVuY2UgQ1ItMDE5NjsgICB9CiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7IHJlZmVyZW5jZSAiSW5pdGlhbCB2ZXJzaW9uIjsgICB9CgogIGV4dGVuc2lvbiBub3ROb3RpZnlhYmxlIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJJbmRpY2F0ZXMgdGhhdCBkYXRhIGNoYW5nZSBub3RpZmljYXRpb25zIHNoYWxsIG5vdCBiZSBzZW50IAogICAgICBmb3IgdGhpcyBhdHRyaWJ1dGUuIElmIHRoZSBleHRlbnNpb24gaXMgbm90IHByZXNlbnQgYW5kIG90aGVyIAogICAgICBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQgZGF0YSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50LgogICAgICBJZiBhIGxpc3Qgb3IgY29udGFpbmVyIGFscmVhZHkgaGFzIHRoZSBub3ROb3RpZnlhYmxlIAogICAgICBleHRlbnNpb24sIHRoYXQgaXMgYWxzbyB2YWxpZCBmb3IgYWxsIGNvbnRhaW5lZCBkYXRhIG5vZGVzLgoKICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSBsZWFmLCBsZWFmLWxpc3QsIGxpc3QsCiAgICAgIGNvbnRhaW5lciBzdGF0ZW1lbnQgdGhhdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSAnYXR0cmlidXRlcycgCiAgICAgIGNvbnRhaW5lciBvZiBhbiBJT0MgYW5kIHRoYXQgcmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgb3Igc3ViLXBhcnRzIG9mIAogICAgICBhbiBhdHRyaWJ1dGUgLgogICAgICAKICAgICAgWmVybyBvciBvbmUgbm90Tm90aWZ5YWJsZSBzdGF0ZW1lbnQgaXMgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgIEFkZGluZyB0aGlzIHN0YXRlbWVudCBpcyBhbiBOQkMgY2hhbmdlLCByZW1vdmluZyBpdCBpcyBCQy4iOwogIH0KCiAgZXh0ZW5zaW9uIGluVmFyaWFudCB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgZGF0YSBub2RlIGNhbiBvbmx5IGJlIHNldCB3aGVuIHRoZSBsaXN0IAogICAgICBkYXRhIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjb250YWluaW5nIG9iamVjdChNT0kpIGlzIGNyZWF0ZWQuCiAgICAgIFRoZSBhYm92ZSBzdGF0ZW1lbnQgaW4gWUFORyB0ZXJtcyBtZWFucywgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSBkYXRhIAogICAgICBub2RlIGNhbiBvbmx5IGJlIHNldCB3aGVuIHRoZSBsaXN0IGVudHJ5IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGUgCiAgICAgIHJlc3RyaWN0ZWQgbm9kZSdzIGFuY2VzdG9yIGNvbnRhaW5lciBuYW1lZCAnYXR0cmlidXRlcycgaXMgYmVpbmcgY3JlYXRlZC4gCiAgICAgIFRvIGNoYW5nZSB0aGUgdmFsdWUgYWZ0ZXIgdGhhdCwgdGhlIG1lbnRpb25lZCAKICAgICAgbGlzdCBkYXRhIG5vZGUgbXVzdCBiZSBkZWxldGVkIGFuZCByZWNyZWF0ZWQgd2l0aCB0aGUgcmVzdHJpY3RlZCBkYXRhIG5vZGUKICAgICAgaGF2aW5nIHRoZSBuZXcgdmFsdWUuCgogICAgICBJZiBhIGxpc3Qgb3IgY29udGFpbmVyIGFscmVhZHkgaGFzIHRoZSBpblZhcmlhbnQgCiAgICAgIGV4dGVuc2lvbiwgdGhhdCBpcyBhbHNvIHZhbGlkIGZvciBhbGwgY29udGFpbmVkIGRhdGEgbm9kZXMuCgogICAgICBJdCBpcyB1bm5lY2Vzc2FyeSB0byB1c2UgYW5kIE1VU1QgTk9UIGJlIHVzZWQgZm9yIGtleSBsZWFmcy4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiwgbGVhZi1saXN0LCBsaXN0IAogICAgICBzdGF0ZW1lbnQgdGhhdCBpcyBjb25maWc9dHJ1ZS4KICAgICAgWmVybyBvciBvbmUgaW5WYXJpYW50IHN0YXRlbWVudCBpcyBhbGxvd2VkIHBlciBwYXJlbnQgc3RhdGVtZW50LgogICAgICBOTyBzdWJzdGF0ZW1lbnRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgQWRkaW5nIHRoaXMgc3RhdGVtZW50IGlzIGFuIE5CQyBjaGFuZ2UsIHJlbW92aW5nIGl0IGlzIEJDLiI7CiAgfQoKICBleHRlbnNpb24gaW5pdGlhbC12YWx1ZSB7CiAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIGEgdmFsdWUgdGhhdCB0aGUgc3lzdGVtIHdpbGwgc2V0IGZvciBhIGxlYWYKICAgICAgbGVhZi1saXN0IGlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBmb3IgaXQgd2hlbiBpdHMgcGFyZW50IGxpc3QKICAgICAgb3IgY29udGFpbmVyIGlzIGNyZWF0ZWQuIFRoZSB2YWx1ZSBoYXMgbm8gZWZmZWN0IGluIGFueSBvdGhlcgogICAgICBtb2RpZmljYXRpb24gZS5nLiBjaGFuZ2luZyBvciByZW1vdmluZyB0aGUgdmFsdWUuCgogICAgICBUaGUgZGVzY3JpcHRpb24gc3RhdGVtZW50IG9mIHRoZSBwYXJlbnQgc3RhdGVtZW50IFNIT1VMRCBjb250YWluCiAgICAgIHRoZSBsYWJlbCAnSW5pdGlhbC12YWx1ZTogJyBmb2xsb3dlZCBieSB0aGUgdGV4dCBmcm9tIHRoZSBhcmd1bWVudC4KCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBOT1QgYmUgcHJlc2VudCBpZiB0aGUgbGVhZiBvciB0aGUgbGVhZi1saXN0IAogICAgICBoYXMgYSBkZWZhdWx0IHN0YXRlbWVudCBvciB0aGUgdHlwZSB1c2VkIGZvciB0aGUgZGF0YSBub2RlIAogICAgICBoYXMgYSBkZWZhdWx0IHZhbHVlLgogICAgICBUaGUgc3RhdGVtZW50IE1VU1QgTk9UIGJlIHVzZWQgZm9yIGNvbmZpZz1mYWxzZSBkYXRhIG9yIGluIGFuIAogICAgICBhY3Rpb24sIHJwYyBvciBub3RpZmljYXRpb24uCiAgICAgIFplcm8gb3Igb25lIGluaXRpYWwtdmFsdWUgc3RhdGVtZW50cyBhcmUgYWxsb3dlZCBmb3IgYSBsZWFmIHBhcmVudAogICAgICBzdGF0ZW1lbnQuIFplcm8gb3IgbW9yZSBpbml0aWFsLXZhbHVlIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQgZm9yIGEKICAgICAgbGVhZi1saXN0IHBhcmVudCBzdGF0ZW1lbnQuIElmIHRoZSBsZWFmLWxpc3QgaXMgb3JkZXJlZC1ieSB1c2VyLCB0aGUKICAgICAgaW5pdGlhbCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFlBTkcgZGVmaW5pdGlvbi4KICAgICAgTk8gc3Vic3RhdGVtZW50cyBhcmUgYWxsb3dlZC4KCiAgICAgIEFsd2F5cyBjb25zaWRlciB1c2luZyBhIFlBTkctZGVmYXVsdCBzdGF0ZW1lbnQgaW5zdGVhZC4KCiAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgaW5pdGlhbC12YWx1ZSBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuCgogICAgICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIGluaXRpYWwgdmFsdWUgZm9yIGEgbGVhZiBvciBsZWFmLWxpc3QuCiAgICAgIFRoZSB2YWx1ZSBNVVNUIGJlIHBhcnQgb2YgdGhlIHZhbHVlc3BhY2Ugb2YgdGhlIGxlYWYvbGVhZi1saXN0LgogICAgICBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBhcmd1bWVudCBvZiB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQuIjsKCiAgICBhcmd1bWVudCAiaW5pdGlhbC12YWx1ZSI7CiAgfQp9
+_3gpp-common-yang-types        urn:3gpp:sa5:_3gpp-common-yang-types    \N      []      2023-11-06      bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CiAgCiAgaW1wb3J0IGlldGYtaW5ldC10eXBlcyB7IHByZWZpeCBpbmV0OyB9CiAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7IHByZWZpeCB5YW5nOyB9CiAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggeWV4dDNncHA7IH0KCiAgb3JnYW5pemF0aW9uICIzR1BQIFNBNSI7CiAgY29udGFjdCAiaHR0cHM6Ly93d3cuM2dwcC5vcmcvRHluYVJlcG9ydC9UU0ctV0ctLVM1LS1vZmZpY2lhbHMuaHRtP0l0ZW1pZD00NjQiOwogIGRlc2NyaXB0aW9uICJUaGUgbW9kZWwgZGVmaW5lcyBhIFlBTkcgbWFwcGluZyBvZiB0aGUgdG9wIGxldmVsIAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZCAKICAgIG5ldHdvcmsgc2xpY2luZy4KICAgIENvcHlyaWdodCAyMDIzLCAzR1BQIE9yZ2FuaXphdGlvbmFsIFBhcnRuZXJzIChBUklCLCBBVElTLCBDQ1NBLCBFVFNJLCBUU0RTSSwgCiAgICBUVEEsIFRUQykuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIjsKICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjIzIjsKCiAgcmV2aXNpb24gMjAyMy0xMS0wNiB7IHJlZmVyZW5jZSBDUi0wMzA1OyB9CiAgcmV2aXNpb24gMjAyMy0wOS0xOCB7IHJlZmVyZW5jZSBDUi0wMjcxIDsgfSAKICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CiAgCiAgcmV2aXNpb24gMjAyMS0wOS0zMCB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgTG9uZ2l0dWRlLCBMYXRpdHVkZSwgVGVudGhPZkRlZ3JlZXMsIE9uT2ZmLiI7CiAgICByZWZlcmVuY2UgIkNSLTAxMzgiOwogIH0KCiAgcmV2aXNpb24gMjAyMC0xMS0wNiB7CiAgICBkZXNjcmlwdGlvbiAiUmVtb3ZlZCBpbmNvcnJlY3QgUy1OU1NBSSBkZWZpbml0aW9ucy4iOwogICAgcmVmZXJlbmNlICJDUi0wMTE4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMDMtMTAgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgZmF1bHR5IHdoZW4gc3RhdGVtZW50cy4iOwogICAgcmVmZXJlbmNlICJTUC0yMDAyMjkiOwogIH0KIAogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CiAgCiAgZ3JvdXBpbmcgbmFtZVZhbHVlUGFpciB7CiAgICBsZWFmIG5hbWUgeyB0eXBlIHN0cmluZzsgfQogICAgbGVhZiB2YWx1ZSB7IHR5cGUgc3RyaW5nOyB9CiAgfQogIAogIGdyb3VwaW5nIFByb2Nlc3NNb25pdG9yR3JwIHsKICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBhdHRyaWJ1dGVzIHRvIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mIHByb2Nlc3NlcyAKICAgICAgd2l0aCBzcGVjaWZpYyBwdXJwb3NlIGFuZCBsaW1pdGVkIGxpZmV0aW1lIHJ1bm5pbmcgb24gTW5TIHByb2R1Y2Vycy4gCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcyAKICAgICAgd2hlbiBzcGVjaWZ5aW5nIHRoZSBtYW5hZ2VtZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIHByb2Nlc3Nlcy4gCiAgICAgIFRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgY2xhdXNlIGFyZSBkZWZpbmVkIGluIGEgZ2VuZXJpYyB3YXkuIAogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEgCiAgICAgIGNvbmNyZXRlIHByb2Nlc3MgcmVwcmVzZW50YXRpb24uCgogICAgICBJZiBhIG1hbmFnZW1lbnQgb3BlcmF0aW9uIG9uIHNvbWUgSU9DcyB0cmlnZ2VycyBhbiBhc3NvY2lhdGVkIAogICAgICBhc3luY2hyb25vdXMgcHJvY2VzcyAod2hvc2UgcHJvZ3Jlc3Mgc2hhbGwgYmUgbW9uaXRvcmVkKSwgdGhpcyBzaG91bGQgCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlIAogICAgICAnUHJvY2Vzc01vbml0b3InKSBpbiB0aGVzZSBJT0MocykuIFRoZSBwcm9jZXNzTW9uaXRvciBhdHRyaWJ1dGUgbWF5IGJlIAogICAgICBhY2NvbXBhbmllZCBieSB1c2UtY2FzZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGRhdGEgaXRlbXMuCgogICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHByb2Nlc3MgaXMgZGVzY3JpYmVkIGJ5IHRoZSAnc3RhdHVzJyBhbmQgCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IgCiAgICAgIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgbWF5IGJlIHByb3ZpZGVkIGJ5IHRoZSAncHJvZ3Jlc3NTdGF0ZUluZm8nIGFuZCAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlcy4KCiAgICAgIFdoZW4gdGhlIHByb2Nlc3MgaXMgaW5zdGFudGlhdGVkLCB0aGUgJ3N0YXR1cycgaXMgc2V0IHRvICdOT1RfUlVOTklORycgCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0byAKICAgICAgc3RhcnQgZXhlY3V0aW5nIHRoZSBwcm9jZXNzIGFuZCB0byB0cmFuc2l0aW9uIGludG8gdGhlICdSVU5OSU5HJyBzdGF0ZS4gCiAgICAgIFRoaXMgdGltZSBpcyBjYXB0dXJlZCBpbiB0aGUgJ3N0YXJ0VGltZScgYXR0cmlidXRlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lIAogICAgICBhbHRlcm5hdGl2ZSBtdXN0IGJlIHNlbGVjdGVkIHdoZW4gdXNpbmcgdGhpcyBkYXRhIHR5cGUuCgogICAgICBEdXJpbmcgdGhlICdSVU5OSU5HJyBzdGF0ZSB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgYXR0cmlidXRlIG1heSBiZSAKICAgICAgcmVwZWF0ZWRseSB1cGRhdGVkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgc3ViamVjdCB0byAKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byAKICAgICAgcHJvdmlkZSBhZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gaW4gdGhlICdOT1RfUlVOTklORycsICdDQU5DRUxMSU5HJyAKICAgICAgYW5kICdSVU5OSU5HJyBzdGF0ZXMuIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIAogICAgICB1c2VkLgoKICAgICAgVXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHByb2Nlc3MsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgc2V0IAogICAgICB0byAnRklOSVNIRUQnLCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gMTAwJS4gVGhlIHRpbWUgaXMgY2FwdHVyZWQgaW4gCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIAogICAgICBpbiB0aGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlLiBUaGUgdHlwZSBvZiAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgaW4gdGhpcyBkYXRhIHR5cGUgZGVmaW5pdGlvbiBpcyAnU3RyaW5nJy4gCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIAogICAgICB3aGVyZSB0aGlzIGRhdGEgdHlwZSBpcyB1c2VkLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBmYWlscyB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIHRoZSAnc3RhdHVzJyAKICAgICAgYXR0cmlidXRlIGlzIHNldCB0byAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcsIHRoZSBjdXJyZW50IHZhbHVlIG9mIAogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZSAKICAgICAgJ3Jlc3VsdFN0YXRlSW5mbycgc3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlLiAKICAgICAgU3BlY2lmaWMgZmFpbHVyZSByZWFzb25zIG1heSBiZSBzcGVjaWZpZWQgd2hlcmUgdGhlIGRhdGEgdHlwZSBkZWZpbmVkIGluIAogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IgCiAgICAgIGZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gYXMgd2VsbC4KCiAgICAgIEluIGNhc2UgdGhlIHByb2Nlc3MgaXMgY2FuY2VsbGVkLCB0aGUgJ3N0YXR1cycgYXR0cmlidXRlIGlzIGZpcnN0IHNldCB0byAKICAgICAgJ0NBTkNFTExJTkcnIGFuZCB3aGVuIHRoZSBwcm9jZXNzIGlzIHJlYWxseSBjYW5jZWxsZWQgdGhlbiB0byAnQ0FOQ0VMTEVEJy4gCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiAKICAgICAgVGhlIHZhbHVlIG9mICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGlzIGZyb3plbi4gQWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBpbmZvcm1hdGlvbiBtYXkgYmUgcHJvdmlkZWQgaW4gdGhlICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZS4KCiAgICAgIFRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgb25seSBmb3IgYWRkaXRpb25hbCB0ZXh0dWFsIAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvciAKICAgICAgJ0NBTkNFTExFRCcuIEl0IHNoYWxsIG5vdCBiZSB1c2VkIGZvciBtYWtpbmcgdGhlIG91dGNvbWUsIHRoYXQgdGhlIAogICAgICBwcm9jZXNzIG1heSBwcm9kdWNlIGluIGNhc2Ugb2Ygc3VjY2VzcywgYXZhaWxhYmxlLgoKICAgICAgVGhlIHByb2Nlc3MgbWF5IGhhdmUgdG8gYmUgY29tcGxldGVkIHdpdGhpbiBhIGNlcnRhaW4gdGltZSBhZnRlciBpdHMgCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55IAogICAgICBtb3JlIGFmdGVyIGEgY2VydGFpbiB0aW1lLCBvciB0aGUgcHJvY2VzcyBvdXRjb21lIGlzIG5lZWRlZCB1bnRpbCBhIAogICAgICBjZXJ0YWluIHRpbWUgYW5kIHdoZW4gbm90IHByb3ZpZGVkIGJ5IHRoaXMgdGltZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLiAKICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMgCiAgICAgIGluZGljYXRlZCBieSB0aGUgJ3RpbWVyJyBhdHRyaWJ1dGUuIjsKICAgICAgCiAgICBsZWFmIGlkIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiSWQgb2YgdGhlIHByb2Nlc3MuIEl0IGlzIHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgCiAgICAgICAgbXVsdGl2YWx1ZSBhdHRyaWJ1dGUgb2YgdHlwZSBQcm9jZXNzTW9uaXRvci4iOwogICAgfQogICAgCiAgICBsZWFmIHN0YXR1cyB7IAogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIE5PVF9TVEFSVEVEIDsKICAgICAgICBlbnVtIFJVTk5JTkcgOwogICAgICAgIGVudW0gQ0FOQ0VMTElORyA7CiAgICAgICAgZW51bSBGSU5JU0hFRCA7CiAgICAgICAgZW51bSBGQUlMRUQgOwogICAgICAgIGVudW0gUEFSVElBTExZX0ZBSUxFRCA7CiAgICAgICAgZW51bSBDQU5DRUxMRUQgOwogICAgICB9CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVmYXVsdCAgUlVOTklORzsKICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIHN0YXR1cyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzLCAKICAgICAgICB3aGV0aGVyIGl0IGZhaWxzLCBzdWNjZWVkcyBldGMuIAogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIAogICAgICAgIHByb2Nlc3MuICI7CiAgICB9CgogICAgbGVhZiBwcm9ncmVzc1BlcmNlbnRhZ2UgewogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAwLi4xMDA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiUHJvZ3Jlc3Mgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBhcyBwZXJjZW50YWdlIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgcHJvZ3Jlc3NTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnTk9UX1NUQVJURUQnLCAnQ0FOQ0VMTElORycgYW5kICdSVU5OSU5HJy4KCiAgICAgICAgRm9yIHNwZWNpZmljIHByb2Nlc3Nlcywgc3BlY2lmaWMgd2VsbC1kZWZpbmVkIHN0cmluZ3MgKGUuZy4gc3RyaW5nIAogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcyAKICAgICAgICAnRklOSVNIRUQnLCAnRkFJTEVEJywgJ1BBUlRJQUxMWV9GQUlMRUQgYW5kICdDQU5DRUxMRUQnLiAKICAgICAgICBGb3IgZXhhbXBsZSwgaW4gdGhlICdGQUlMRUQnIG9yICdQQVJUSUFMTFlfRkFJTEVEJyBzdGF0ZSB0aGlzIAogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MgCiAgICAgICAgYXZhaWxhYmxlIGZvciByZXRyaWV2YWwsIGlmIGFueS4gRm9yIHRoaXMgcHVycG9zZSwgZGVkaWNhdGVkIAogICAgICAgIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3BlY2lmaWVkIHdoZW4gc3BlY2lmeWluZyB0aGUgcmVwcmVzZW50YXRpb24gb2YgCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcgCiAgICAgICAgcGF0dGVybnMgb3IgZW51bXMpIG1heSBiZSBkZWZpbmVkIGFzIGEgc3BlY2lhbGlzYXRpb24uIjsKICAgIH0KCiAgICBsZWFmIHN0YXJ0VGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJTdGFydCB0aW1lIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsIGkuZS4gdGhlIHRpbWUgd2hlbiB0aGUgCiAgICAgICAgc3RhdHVzIGNoYW5nZWQgZnJvbSAnTk9UX1NUQVJURUQnIHRvICdSVU5OSU5HJy4iOwogICAgfQoKICAgIGxlYWYgZW5kVGltZSB7CiAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJEYXRlIGFuZCB0aW1lIHdoZW4gc3RhdHVzIGNoYW5nZWQgdG8gJ1NVQ0NFU1MnLCAnQ0FOQ0VMTEVEJywgCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLiAKCiAgICAgICAgSWYgdGhlIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZSwgaXQgaXMgdGhlIGVzdGltYXRlZCB0aW1lIAogICAgICAgIHRoZSBwcm9jZXNzIHdpbGwgZW5kLiI7CiAgICB9CgogICAgbGVhZiB0aW1lciB7CiAgICAgIHR5cGUgdWludDMyOwogICAgICB1bml0cyBtaW51dGVzOwogICAgICBkZXNjcmlwdGlvbiAiVGltZSB1bnRpbCB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgY2FuY2VsbGVkLgogICAgICAgIElmIHNldCwgdGhlIHN5c3RlbSBkZWNyZWFzZXMgdGhlIHRpbWVyIHdpdGggdGltZS4gV2hlbiBpdCByZWFjaGVzIHplcm8gCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUgCiAgICAgICAgTW5TX1Byb2R1Y2VyLiAKICAgICAgICBJZiBub3Qgc2V0LCB0aGVyZSBpcyBubyB0aW1lIGxpbWl0IGZvciB0aGUgcHJvY2Vzcy4KICAgICAgICAKICAgICAgICBPbmNlIHRoZSB0aW1lciBpcyBzZXQsIHRoZSBjb25zdW1lciBjYW4gbm90IGNoYW5nZSBpdCBhbnltb3JlLiAKICAgICAgICBJZiB0aGUgY29uc3VtZXIgaGFzIG5vdCBzZXQgdGhlIHRpbWVyIHRoZSBNblMgUHJvZHVjZXIgbWF5IHNldCBpdC4iOwogICAgICB5ZXh0M2dwcDpub3ROb3RpZnlhYmxlOwogICAgfQogIH0KICAKICB0eXBlZGVmIFRlbnRoT2ZEZWdyZWVzIHsgCiAgICB0eXBlIHVpbnQxNiB7IAogICAgICByYW5nZSAwLi4zNjAwOyAKICAgIH0KICAgIHVuaXRzICIwLjEgZGVncmVlcyI7CiAgICBkZXNjcmlwdGlvbiAiQSBzaW5nbGUgaW50ZWdyYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBhbmdsZSBpbiBkZWdyZWVzIAogICAgICBiZXR3ZWVuIDAgYW5kIDM2MCB3aXRoIGEgcmVzb2x1dGlvbiBvZiAwLjEgZGVncmVlcy4iOwogIH0KCiAgdHlwZWRlZiBMYXRpdHVkZSB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICByYW5nZSAiLTkwLjAwMDAuLis5MC4wMDAwIjsgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7IAogICAgfQogICAgZGVzY3JpcHRpb24gIkxvbmdpdHVkZSB2YWx1ZXMiOwogIH0KCiAgdHlwZWRlZiBBbHRpdHVkZSAgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgIH0KICAgIHVuaXRzICJtZXRlcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuIjsgIAogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKICAgIAogICAgbGVhZiBsYXRpdHVkZSB7CiAgICAgIHR5cGUgTGF0aXR1ZGU7CiAgICAgIG1hbmRhdG9yeSB0cnVlOyAKICAgIH0KICAgICAgCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgTG9uZ2l0dWRlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsgCiAgICB9CiAgICAKICAgIGxlYWYgYWx0aXR1ZGUgewogICAgICB0eXBlIEFsdGl0dWRlOwogICAgfQogICAgCiAgfQoKICB0eXBlZGVmIE9uT2ZmIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIE9OOwogICAgICBlbnVtIE9GRjsKICAgIH0KICB9CiAgCiAgLy8gZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXMgaXQgaXMgCiAgLy8gIGJlaW5nIG1vdmVkIHRvIF8zZ3BwLTVnYy1ucm0tbmZwcm9maWxlCiAgZ3JvdXBpbmcgTWFuYWdlZE5GUHJvZmlsZSB7CiAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GIjsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy41MDEiOwogICAgCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQogICAgCiAgICBsZWFmIG5mSW5zdGFuY2VJRCB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgeWFuZzp1dWlkIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORi4gCiAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgTkYgSW5zdGFuY2UgSUQgc2hhbGwgYmUgYSAKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LCAKICAgICAgICBhcyBkZXNjcmliZWQgaW4gSUVURiBSRkMgNDEyMiAiIDsKICAgICAgeWV4dDNncHA6aW5WYXJpYW50OwogICAgfQogICAgCiAgICBsZWFmLWxpc3QgbmZUeXBlIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgdHlwZSBOZlR5cGU7CiAgICAgIGRlc2NyaXB0aW9uICJUeXBlIG9mIHRoZSBOZXR3b3JrIEZ1bmN0aW9uIiA7CiAgICB9CiAgICAKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQogICAgCiAgICBsZWFmIGF1dGh6SW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgTkYgU3BlY2lmaWMgU2VydmljZSBhdXRob3JpemF0aW9uIAogICAgICAgIGluZm9ybWF0aW9uLiBJdCBzaGFsbCBpbmNsdWRlIHRoZSBORiB0eXBlIChzKSBhbmQgTkYgcmVhbG1zL29yaWdpbnMgCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KICAgIAogICAgbGVhZiBsb2NhdGlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIkluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgTkYgaW5zdGFuY2UgCiAgICAgICAgKGUuZy4gZ2VvZ3JhcGhpYyBsb2NhdGlvbiwgZGF0YSBjZW50ZXIpIGRlZmluZWQgYnkgb3BlcmF0b3IiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uIAogICAgICAgIGluIHRoZSByYW5nZSBvZiAwLTY1NTM1LCBleHByZXNzZWQgYXMgYSB3ZWlnaHQgcmVsYXRpdmUgdG8gb3RoZXIgCiAgICAgICAgTkYgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHR5cGU7IGlmIGNhcGFjaXR5IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgICAgCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMgCiAgICAgICAgc2VydmVkIGJ5IHRoZSBORiBpbnN0YW5jZS4KICAgICAgICBNYXkgYmUgY29uZmlnIGZhbHNlIG9yIHRydWUgZGVwZW5kaW5nIG9uIHRoZSBNYW5hZ2VkRnVuY3Rpb24uIAogICAgICAgIENvbmZpZz10cnVlIGZvciBVZHJpbmZvLiBDb25maWc9ZmFsc2UgZm9yIFVkbUluZm8gYW5kIEF1c2ZJbmZvLiAKICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KICAgIAogICAgbGVhZi1saXN0IHN1cHBvcnRlZERhdGFTZXRJZHMgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNVQlNDUklQVElPTjsKICAgICAgICBlbnVtIFBPTElDWTsKICAgICAgICBlbnVtIEVYUE9TVVJFOwogICAgICAgIGVudW0gQVBQTElDQVRJT047CiAgICAgIH0KICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2Ygc3VwcG9ydGVkIGRhdGEgc2V0cyBpbiB0aGUgVURSIGluc3RhbmNlLiAKICAgICAgICBNYXkgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVRFIiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4gCiAgICAgICAgU2hhbGwgYmUgcHJlc2VudCBpZiAuLi9uZlR5cGUgPSBVUEYiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogICAgCiAgICBsZWFmIHByaW9yaXR5IHsKICAgICAgdHlwZSB1aW50MTY7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHBhcmFtZXRlciBkZWZpbmVzIFByaW9yaXR5IChyZWxhdGl2ZSB0byBvdGhlciBORnMgCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsgCiAgICAgICAgbG93ZXIgdmFsdWVzIGluZGljYXRlIGEgaGlnaGVyIHByaW9yaXR5LiBJZiBwcmlvcml0eSBpcyBhbHNvIHByZXNlbnQgCiAgICAgICAgaW4gdGhlIG5mU2VydmljZUxpc3QgcGFyYW1ldGVycywgdGhvc2Ugd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciAKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KICAKICB0eXBlZGVmIHVzYWdlU3RhdGUgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gSURMRTsKICAgICAgZW51bSBBQ1RJVkU7CiAgICAgIGVudW0gQlVTWTsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJJdCBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIHJlc291cmNlIGlzIGFjdGl2ZWx5IGluIAogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZSAKICAgICAgY2FwYWNpdHkgZm9yIGFkZGl0aW9uYWwgdXNlcnMgYXQgdGhhdCBpbnN0YW50LiBUaGUgdmFsdWUgaXMgUkVBRC1PTkxZLiI7CiAgICByZWZlcmVuY2UgIklUVSBUIFJlY29tbWVuZGF0aW9uIFguNzMxIjsKICB9CiAgCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CiAgCiAgdHlwZWRlZiBNY2MgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGNvbnNpc3RzIG9mIHRocmVlIGRlY2ltYWwgZGlnaXRzLCAKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMgCiAgICAgIHJlZ2lvbiAodGhlIGRpZ2l0cyAxIGFuZCA4IGFyZSBub3QgdXNlZCk6IjsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAyLTc5XVswLTldWzAtOV0nOwogICAgfQogICAgcmVmZXJlbmNlICIzR1BQIFRTIDIzLjAwMyBzdWJjbGF1c2UgMi4yIGFuZCAxMi4xIjsKICB9CgogIHR5cGVkZWYgTW5jIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIG5ldHdvcmsgY29kZSBjb25zaXN0cyBvZiB0d28gb3IgdGhyZWUgCiAgICAgIGRlY2ltYWwgZGlnaXRzIChmb3IgZXhhbXBsZTogTU5DIG9mIDAwMSBpcyBub3QgdGhlIHNhbWUgYXMgTU5DIG9mIDAxKSI7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1swLTldWzAtOV1bMC05XXxbMC05XVswLTldJzsKICAgIH0KICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyMy4wMDMgc3ViY2xhdXNlIDIuMiBhbmQgMTIuMSI7CiAgfQoKICBncm91cGluZyBQTE1OSWQgewogICAgbGVhZiBtY2MgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNY2M7CiAgICB9CiAgICBsZWFmIG1uYyB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICB0eXBlIE1uYzsKICAgIH0KICAgIHJlZmVyZW5jZSAiVFMgMzguNDEzIGNsYXVzZSA5LjMuMy41IjsKICB9CiAgCiAgdHlwZWRlZiBOY2kgewogICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIFRoZSBOQ0kgc2hhbGwgYmUgb2YgZml4ZWQgbGVuZ3RoIG9mIDM2IGJpdHMgCiAgICAgIGFuZCBzaGFsbCBiZSBjb2RlZCB1c2luZyBmdWxsIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiAKICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQogICAgCiAgdHlwZWRlZiBPcGVyYXRpb25hbFN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIHsKICAgICAgICB2YWx1ZSAwOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgdG90YWxseSBpbm9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICAgIGVudW0gRU5BQkxFRCB7CiAgICAgICAgdmFsdWUgMTsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIHBhcnRpYWxseSBvciBmdWxseSBvcGVyYWJsZS4iOwogICAgICB9CgogICAgfQogIH0KICAKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgdHlwZWRlZiBBZG1pbmlzdHJhdGl2ZVN0YXRlIHsKICAgIHJlZmVyZW5jZSAiM0dQUCBUUyAyOC42MjUgYW5kIElUVS1UIFguNzMxIjsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIExPQ0tFRCB7CiAgICAgICAgdmFsdWUgMDsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCBmcm9tIHBlcmZvcm1pbmcKICAgICAgICAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiI7CiAgICAgIH0KCiAgICAgIGVudW0gVU5MT0NLRUQgewogICAgICAgIHZhbHVlIDE7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHBlcm1pdHRlZCB0byBwZXJmb3JtCiAgICAgICAgICBzZXJ2aWNlcyBmb3IgaXRzIHVzZXJzLiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGl0cyBpbmhlcmVudAogICAgICAgICAgb3BlcmFiaWxpdHkuIjsKICAgICAgfQoKICAgICAgZW51bSBTSFVUVElOR0RPV04gewogICAgICAgIHZhbHVlIDI7CiAgICAgICAgZGVzY3JpcHRpb24gIlVzZSBvZiB0aGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8KICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlcyBvZiB1c2Ugb25seS4gV2hpbGUgdGhlIHN5c3RlbSByZW1haW5zIGluCiAgICAgICAgICB0aGUgc2h1dHRpbmcgZG93biBzdGF0ZSB0aGUgbWFuYWdlciBvciB0aGUgbWFuYWdlZCBlbGVtZW50IAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZSAKICAgICAgICAgIGxvY2tlZCBzdGF0ZS4iOwogICAgICB9CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBPRkZfTElORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBlbnVtIERFR1JBREVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZW51bSBMT0dfRlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICB9CiAgCiAgdHlwZWRlZiBDZWxsU3RhdGUgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIElETEU7CiAgICAgICAgZW51bSBJTkFDVElWRTsgICAgICAgICAgICAgIAogICAgICAgIGVudW0gQUNUSVZFOyAgICAgICAgICAgICAgCiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKSAKICAgICAgYXMgc3BlY2lmaWVkIGluIGNsYXVzZSAyOC42IG9mIFRTIDIzLjAwMywgY2xhdXNlIDguMiBvZiBUUyAzOC4zMDAgCiAgICAgIGFuZCBjbGF1c2UgOS4zLjMuMTEgb2YgVFMgMzguNDEzLiBJdCBpcyBjb21wb3NlZCBvZiB0aGUgUExNTiAKICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQgCiAgICAgIHRoZSBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuICI7CiAgICBsaXN0IHBsbW5JZCB7CiAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElkZW50aXR5LiI7CiAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICBtYXgtZWxlbWVudHMgMTsKICAgICAga2V5ICJtY2MgbW5jIjsKICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgfQogICAgCiAgICBsZWFmIHRhYyB7IHR5cGUgVGFjOyB9CiAgfQogICAgICAgCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsgCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC05MC4uOTAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSAKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KICAgICAgICAKICAgIGxlYWYgbG9uZ2l0dWRlIHsKICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA0OwogICAgICAgIHJhbmdlIC0xODAuLjE4MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMb25naXR1ZGUgYmFzZWQgb24gV29ybGQgR2VvZGV0aWMgU3lzdGVtICgxOTg0IHZlcnNpb24pIAogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvIAogICAgICAgIGRlZ3JlZXMgZWFzdCBvZiAwIGRlZ3JlZXMgbG9uZ2l0dWRlLiI7CiAgICB9CiAgfQogICAKICBncm91cGluZyBHZW9BcmVhR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIGRhdGEgdHlwZSBkZWZpbmVzIGEgZ2VvZ3JhcGhpY2FsIGFyZWEuIAogICAgICBUaGUgZ2VvLWFyZWEgaXMgZGVmaW5lZCB1c2luZyBhIGNvbnZleCBwb2x5Z29uIGluIHRoZSBhdHRyaWJ1dGUgCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwogICAgCiAgICBsaXN0IGNvbnZleEdlb1BvbHlnb24gewogICAgICBkZXNjcmlwdGlvbiAiU3BlY2lmaWVzIHRoZSBnZW9ncmFwaGljYWwgYXJlYSB3aXRoIGEgY29udmV4IHBvbHlnb24uIAogICAgICAgIFRoZSBjb252ZXggcG9seWdvbiBpcyBzcGVjaWZpZWQgYnkgaXRzIGNvcm5lcnMuIjsKICAgICAgICBrZXkgImxhdGl0dWRlIGxvbmdpdHVkZSI7CiAgICAgIG1pbi1lbGVtZW50cyAzOwogICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICAgIAogICAgICB1c2VzIEdlb0Nvb3JkaW5hdGVHcnA7CiAgICB9CiAgfQogIAogIHR5cGVkZWYgQW1mUmVnaW9uSWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IDsKICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA4OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIHR5cGVkZWYgQW1mU2V0SWQgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7IAogICAgICB0eXBlIHVpbnQ4IHsKICAgICAgICByYW5nZSAnMC4uNjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggNjsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQogICAgICAgIAogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgeyAgICAgICAgCiAgICBsZWFmIGFtZlJlZ2lvbklkIHsKICAgICAgdHlwZSBBbWZSZWdpb25JZDsKICAgIH0KICAgIGxlYWYgYW1mU2V0SWQgewogICAgICB0eXBlIEFtZlNldElkOwogICAgfQogICAgbGVhZiBhbWZQb2ludGVyIHsKICAgICAgdHlwZSBBbWZQb2ludGVyOwogICAgfSAKICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsIAogICAgICBhbiBBTUYgU2V0IElEIGFuZCBhbiBBTUYgUG9pbnRlci4gCiAgICAgIFRoZSBBTUYgUmVnaW9uIElEIGlkZW50aWZpZXMgdGhlIHJlZ2lvbiwgCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQgCiAgICAgIHRoZSBBTUYgUG9pbnRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBBTUYgd2l0aGluIHRoZSBBTUYgU2V0LiAiOyAKICB9ICAgIAoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0gICAgICAgICAgCiAgfQogIAogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9ICAgICAgCiAgfQogIAogIHR5cGVkZWYgTG9hZCB7CiAgICBkZXNjcmlwdGlvbiAiTGF0ZXN0IGtub3duIGxvYWQgaW5mb3JtYXRpb24gb2YgdGhlIE5GLCBwZXJjZW50YWdlICI7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgMC4uMTAwOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMU1lc3NhZ2VDbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSA1R01NOwogICAgICBlbnVtIFNNOwogICAgICBlbnVtIExQUDsKICAgICAgZW51bSBTTVM7IAogICAgfSAgICAgIAogIH0KICAKICB0eXBlZGVmIE4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBOUlBQQTsKICAgICAgZW51bSBQV1M7CiAgICAgIGVudW0gUFdTX0JDQUw7CiAgICAgIGVudW0gUFdTX1JGOwogICAgfSAgICAgICAgICAgICAgCiAgfQogIAogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewogICAgCiAgICBsZWFmIG5vdGlmaWNhdGlvblR5cGUgewogICAgICB0eXBlIE5vdGlmaWNhdGlvblR5cGU7CiAgICB9CiAgICAKICAgIGxlYWYgY2FsbGJhY2tVcmkgewogICAgICB0eXBlIGluZXQ6dXJpOwogICAgfQogICAgCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KICAgIAogICAgbGVhZiBuMkluZm9ybWF0aW9uQ2xhc3MgewogICAgICB0eXBlIE4ySW5mb3JtYXRpb25DbGFzczsKICAgIH0gICAgCiAgfSAgCiAgICAgICAgCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9ICAgIAogIH0KICAgIAogIGdyb3VwaW5nIElwdjZQcmVmaXhSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgbGVhZiBlbmQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfSAgICAKICB9CiAgICAgCiAgdHlwZWRlZiBOc2lJZCB7CiAgICB0eXBlIHN0cmluZzsKICB9CiAgICAKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CiAgICAgIAogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CiAgICAgIAogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOyAgIAogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9ICAKICB9CgogIC8qIERpc3Rpbmd1aXNoZWROYW1lIHBhdHRlcm4gaXMgYnVpbHQgdXAgYmFzZWQgb24gdGhlIAogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KICAKICAgIGxlYWYgRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gIFNhbWUgcGF0dGVybiBhcyBMb2NhbEROCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBMb2NhbFJETiAsIHsgUkROU2VwYXJhdG9yICwgTG9jYWxSRE4gfSAgICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkICAgTWUubXlrZXk9MSBhbGxvd2VkCiAgICAgIC8vICAoZnVsbExvY2FsUkROKSgsKGZ1bGxMb2NhbFJETikpKgogICAgICBwYXR0ZXJuICcoKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSkoLCgoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSkqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBmdWxsTG9jYWxSRE4geyB0eXBlIHN0cmluZyB7ICAgLy8gc2FtZSBhcyBmdWxsTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsgICAgICAKICAgIH0gfQogIAogICAgbGVhZiBMb2NhbFJETiB7IHR5cGUgc3RyaW5nIHsgICAvLyBzYW1lIGFzIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8nOyAgICAgIAogICAgfSB9CiAgCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZSAKICAgICAgLy8gcGF0dGVybiBMb2NhbEROQXR0cmlidXRlVHlwZT1SZWd1bGFyQXR0cmlidXRlVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7ICAgICAgCiAgICB9IH0KICAgIAogICAgICAvLyBsaW1pdGF0aW9uOiBOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGVub3Qgc3VwcG9ydGVkIE1lLm15a2V5PTEKICAgIGxlYWYgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSB7IHR5cGUgc3RyaW5nIHsgCiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7ICAgICAgCiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOyAgICAgIAogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7IAogICAgfSB9CiAgICAKICAgIGxlYWYgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICB7IHR5cGUgc3RyaW5nIHsgIC8vIENsYXNzTmFtZSAsIENsYXNzTmFtaW5nQXR0cmlidXRlU2VwYXJhdG9yICwgTmFtaW5nQXR0cmlidXRlTmFtZQogICAgICAvLyBwYXR0ZXJuOiBDbGFzc05hbWVcLk5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKicgOyAKICAgIH0gfQogIAogICAgbGVhZiByZXN0cmljdGl2ZUNsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIAogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9CiAgCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7IAogICAgfSB9ICAgIAogICAgCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsgICAgCiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18JwogICAgICArICcoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPycKICAgICAgKyAnKCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSknCiAgICAgICsgJygoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqJwogICAgICArICcoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7ICAgICAgCiAgICB9CiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgM0dQUCBzdGFuZGFyZCBmb3IgRGlzdGluZ3Vpc2hlZE5hbWUuIAogICAgICAKICAgICAgTGltaXRhdGlvbnM6IAogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZCAKICAgICAgICAoZWcuIE1hbmFnZWRFbGVtZW50Lm15a2V5PTM0NTQzNikiOwogICAgcmVmZXJlbmNlICAiM0dQUCBUUyAzMi4zMDAiOwogIH0gCiAKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsgCiAgICAgIHJhbmdlICItMjQgfCAtMjIgfCAtMjAgfCAtMTggfCAtMTYgfCAtMTQgfCAtMTIgfCAtMTAgfCAtOCB8IC02IHwgIiArCiAgICAgICAgIiAtNSB8IC00IHwgLTMgfCAtMiB8IC0xIHwgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDggfCAxMCB8ICIgKwogICAgICAgICIgMTIgfCAxNCB8IDE2IHwgMTggfCAyMCB8IDIyIHwgMjQiOyAKICAgIH0KICAgIHVuaXRzIGRCOwogIH0KCiAgZ3JvdXBpbmcgUmVwb3J0aW5nQ3RybCB7CiAgICBjaG9pY2UgcmVwb3J0aW5nQ3RybCB7CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiCiAgICAgICAgVGhpcyBjaG9pY2UgZGVmaW5lcyB0aGUgbWV0aG9kIGZvciByZXBvcnRpbmcgY29sbGVjdGVkIHBlcmZvcm1hbmNlCiAgICAgICAgbWV0cmljcyB0byBNblMgY29uc3VtZXJzIGFzIHdlbGwgYXMgdGhlIHBhcmFtZXRlcnMgZm9yIGNvbmZpZ3VyaW5nIHRoZQogICAgICAgIHJlcG9ydGluZyBmdW5jdGlvbi4gSXQgaXMgYSBjaG9pY2UgYmV0d2VlbiB0aGUgY29udHJvbCBwYXJhbWV0ZXIKICAgICAgICByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydGluZyBtZXRob2RzLCB3aG9zZSBwcmVzZW5jZSBzZWxlY3RzIHRoZQogICAgICAgIHJlcG9ydGluZyBtZXRob2QgYXMgZm9sbG93czoKCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZSBNblMKICAgICAgICBwcm9kdWNlciBzaGFsbCBzdG9yZSBmaWxlcyBvbiB0aGUgTW5TIHByb2R1Y2VyIGF0IGEgbG9jYXRpb24gc2VsZWN0ZWQKICAgICAgICBieSB0aGUgTW5TIHByb2R1Y2VyIGFuZCwgb24gY29uZGl0aW9uIHRoYXQgYW4gYXBwcm9wcmlhdGUgc3Vic2NyaXB0aW9uCiAgICAgICAgaXMgaW4gcGxhY2UsIGluZm9ybSB0aGUgTW5TIGNvbnN1bWVyIGFib3V0IHRoZSBhdmFpbGFiaWxpdHkgb2YgbmV3CiAgICAgICAgZmlsZXMgYW5kIHRoZSBmaWxlIGxvY2F0aW9uIHVzaW5nIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLgogICAgICAgIEluIGNhc2UgdGhlIHByZXBhcmF0aW9uIG9mIGEgZmlsZSBmYWlscywgJ25vdGlmeUZpbGVQcmVwYXJhdGlvbkVycm9yJwogICAgICAgIHNoYWxsIGJlIHNlbnQgaW5zdGVhZC4KCiAgICAgICAgLSBXaGVuIHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgYW5kICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJwogICAgICAgIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQsIHRoZW4gdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBiZWhhdmUgbGlrZQogICAgICAgIGRlc2NyaWJlZCBmb3IgdGhlIGNhc2UgdGhhdCBvbmx5IHRoZSAnZmlsZVJlcG9ydGluZ1BlcmlvZCcgaXMgcHJlc2VudC4KICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIE1uUyBwcm9kdWNlciBzaGFsbCBjcmVhdGUgb24gYmVoYWxmIG9mIHRoZSBNblMKICAgICAgICBjb25zdW1lciBhIHN1YnNjcmlwdGlvbiwgdXNpbmcgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnLCBmb3IgdGhlCiAgICAgICAgbm90aWZpY2F0aW9uIHR5cGVzICdub3RpZnlNT0lDcmVhdGlvbicgYW5kICdub3RpZnlNT0lEZWxldGlvbicgcmVsYXRlZAogICAgICAgIHRvIHRoZSAnRmlsZScgaW5zdGFuY2VzIHRoYXQgd2lsbCBiZSBwcm9kdWNlZCBsYXRlci4gSW4gY2FzZSBhbiBleGlzdGluZwogICAgICAgIHN1YnNjcmlwdGlvbiBkb2VzIGFscmVhZHkgaW5jbHVkZSB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0byBiZSBwcm9kdWNlZCwKICAgICAgICBubyBuZXcgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGNyZWF0ZWQuIFRoZQogICAgICAgICdub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzJyBhdHRyaWJ1dGUgaW4gdGhlIGNyZWF0ZWQKICAgICAgICAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2Ugc2hhbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgaW4gdGhlIHJlbGF0ZWQgJ1BlcmZNZXRyaWNKb2InLiBUaGlzCiAgICAgICAgZmVhdHVyZSBpcyBjYWxsZWQgaW1wbGljaXQgbm90aWZpY2F0aW9uIHN1YnNjcmlwdGlvbiwgYXMgb3Bwb3NlZCB0byB0aGUKICAgICAgICBjYXNlIHdoZXJlIHRoZSBNblMgY29uc3VtZXIgY3JlYXRlcyB0aGUgc3Vic2NyaXB0aW9uIChleHBsaWNpdAogICAgICAgIG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24pLiBXaGVuIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJyBpcwogICAgICAgIGRlbGV0ZWQsIHRoZSAnTnRmU3Vic2NyaXB0aW9uQ29udHJvbCcgaW5zdGFuY2UgY3JlYXRlZCBkdWUgdG8gdGhlCiAgICAgICAgcmVxdWVzdCBmb3IgaW1wbGljaXQgc3Vic2NyaXB0aW9uIHNoYWxsIGJlIGRlbGV0ZWQgYXMgd2VsbC4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYW5kIGZpbGVMb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgIHByZXNlbnQsIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgc3RvcmUgdGhlIGZpbGVzIG9uIGEgTW5TIGNvbnN1bWVyLCB0aGF0CiAgICAgICAgY2FuIGJlIGFueSBlbnRpdHkgc3VjaCBhcyBhIGZpbGUgc2VydmVyLCBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5CiAgICAgICAgZmlsZUxvY2F0aW9uLiBObyBub3RpZmljYXRpb24gaXMgZW1pdHRlZCBieSB0aGUgTW5TIHByb2R1Y2VyLgoKICAgICAgICAtIFdoZW4gb25seSB0aGUgc3RyZWFtVGFyZ2V0IGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyCiAgICAgICAgc2hhbGwgc3RyZWFtIHRoZSBkYXRhIHRvIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgc3RyZWFtVGFyZ2V0LgoKICAgICAgICBGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZHMgdGhlIGZpbGVSZXBvcnRpbmdQZXJpb2QgYXR0cmlidXRlCiAgICAgICAgc3BlY2lmaWVzIHRoZSB0aW1lIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUKICAgICAgICBzdG9yZWQgaW50byB0aGUgc2FtZSBmaWxlIGJlZm9yZSB0aGUgZmlsZSBpcyBjbG9zZWQgYW5kIGEgbmV3IGZpbGUgaXMKICAgICAgICBvcGVuZWQuIjsKCiAgICAgIGNhc2UgZmlsZS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgZmlsZVJlcG9ydGluZ1BlcmlvZCB7CiAgICAgICAgICB0eXBlIHVpbnQzMiB7CiAgICAgICAgICAgIHJhbmdlIDEuLm1heDsKICAgICAgICAgIH0KICAgICAgICAgIHVuaXRzIG1pbnV0ZXM7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJGb3IgdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCB0aGlzIGlzIHRoZSB0aW1lCiAgICAgICAgICAgIHdpbmRvdyBkdXJpbmcgd2hpY2ggY29sbGVjdGVkIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkIGludG8gdGhlIHNhbWUKICAgICAgICAgICAgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzIG9wZW5lZC4KICAgICAgICAgICAgVGhlIHRpbWUtcGVyaW9kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZ3JhbnVsYXJpdHlQZXJpb2QuCgogICAgICAgICAgICBBcHBsaWNhYmxlIHdoZW4gdGhlIGZpbGUtYmFzZWQgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQuIjsKICAgICAgICB9CiAgICAgICAgY2hvaWNlIHJlcG9ydGluZy10YXJnZXQgewogICAgICAgICAgY2FzZSBmaWxlLXRhcmdldCB7CiAgICAgICAgICAgIGxlYWYgZmlsZUxvY2F0aW9uIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmcgOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSBhbmQgbXVzdCBiZSBwcmVzZW50IHdoZW4gdGhlIGZpbGUtYmFzZWQKICAgICAgICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSBmaWxlcyBhcmUgc3RvcmVkIG9uIHRoZSBNblMKICAgICAgICAgICAgICBjb25zdW1lci4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIG5vdGlmaWNhdGlvbi10YXJnZXQgewogICAgICAgICAgICBsZWFmIG5vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBub3RpZmljYXRpb24tYmFzZWQgcmVwb3J0aW5nCiAgICAgICAgICAgICAgbWV0aG9kIGlzIHN1cHBvcnRlZCwgYW5kIHRoZSB0aGUgZmlsZXMgYXJlIGF2YWlsYWJsZSBhcwogICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBNblMgY29uc3VtZXIgdG8gc3Vic2NyaWJlIHRvLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBkZXNjcmlwdGlvbiAiV2hlbiBuZXRpaGVyIGZpbGVMb2NhdGlvbiBvciBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzCiAgICAgICAgICBhcmUgcHJlc2VudCwgdGhlIGZpbGVzIGFyZSBzdG9yZWQgYW5kIGF2YWlsYWJsZSB0byB0aGUgTW5TIGNvbnN1bWVyCiAgICAgICAgICBpZiB0aGUgTW5TIHN1YnNjcmliZXMgdG8gdGhlIG5vdGlmeUZpbGVSZWFkeSBub3RpZmljYXRpb24uIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNhc2Ugc3RyZWFtLWJhc2VkLXJlcG9ydGluZyB7CiAgICAgICAgbGVhZiBzdHJlYW1UYXJnZXQgewogICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICAgIGRlc2NyaXB0aW9uICJBcHBsaWNhYmxlIHdoZW4gc3RyZWFtLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMKICAgICAgICAgICAgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9
+ietf-geo-location      urn:ietf:params:xml:ns:yang:ietf-geo-location   \N      []      2022-02-11      bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo=
+ietf-inet-types        urn:ietf:params:xml:ns:yang:ietf-inet-types     \N      []      2013-07-15      bW9kdWxlIGlldGYtaW5ldC10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtaW5ldC10eXBlcyI7CiAgcHJlZml4ICJpbmV0IjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcyBmb3IgSW50ZXJuZXQgYWRkcmVzc2VzIGFuZCByZWxhdGVkIHRoaW5ncy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSBpcC1hZGRyZXNzLW5vLXpvbmUKICAgICAgLSBpcHY0LWFkZHJlc3Mtbm8tem9uZQogICAgICAtIGlwdjYtYWRkcmVzcy1uby16b25lIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBwcm90b2NvbCBmaWVsZHMgKioqLwoKICB0eXBlZGVmIGlwLXZlcnNpb24gewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gdW5rbm93biB7CiAgICAgICAgdmFsdWUgIjAiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJBbiB1bmtub3duIG9yIHVuc3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlIEludGVybmV0CiAgICAgICAgICBwcm90b2NvbC4iOwogICAgICB9CiAgICAgIGVudW0gaXB2NCB7CiAgICAgICAgdmFsdWUgIjEiOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICJUaGUgSVB2NCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA3OTEuIjsKICAgICAgfQogICAgICBlbnVtIGlwdjYgewogICAgICAgIHZhbHVlICIyIjsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAiVGhlIElQdjYgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMgMjQ2MC4iOwogICAgICB9CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgdGhlIElQIHByb3RvY29sLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEluZXRWZXJzaW9uIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgIDc5MTogSW50ZXJuZXQgUHJvdG9jb2wKICAgICAgUkZDIDI0NjA6IEludGVybmV0IFByb3RvY29sLCBWZXJzaW9uIDYgKElQdjYpIFNwZWNpZmljYXRpb24KICAgICAgUkZDIDQwMDE6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIEludGVybmV0IE5ldHdvcmsgQWRkcmVzc2VzIjsKICB9CgogIHR5cGVkZWYgZHNjcCB7CiAgICB0eXBlIHVpbnQ4IHsKICAgICAgcmFuZ2UgIjAuLjYzIjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBkc2NwIHR5cGUgcmVwcmVzZW50cyBhIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIENvZGUgUG9pbnQKICAgICAgdGhhdCBtYXkgYmUgdXNlZCBmb3IgbWFya2luZyBwYWNrZXRzIGluIGEgdHJhZmZpYyBzdHJlYW0uCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBEc2NwIHRleHR1YWwgY29udmVudGlvbiBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzI4OTogTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBCYXNlIGZvciB0aGUgRGlmZmVyZW50aWF0ZWQKICAgICAgICAgICAgICAgIFNlcnZpY2VzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgMjQ3NDogRGVmaW5pdGlvbiBvZiB0aGUgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgRmllbGQKICAgICAgICAgICAgICAgIChEUyBGaWVsZCkgaW4gdGhlIElQdjQgYW5kIElQdjYgSGVhZGVycwogICAgICBSRkMgMjc4MDogSUFOQSBBbGxvY2F0aW9uIEd1aWRlbGluZXMgRm9yIFZhbHVlcyBJbgogICAgICAgICAgICAgICAgdGhlIEludGVybmV0IFByb3RvY29sIGFuZCBSZWxhdGVkIEhlYWRlcnMiOwogIH0KCiAgdHlwZWRlZiBpcHY2LWZsb3ctbGFiZWwgewogICAgdHlwZSB1aW50MzIgewogICAgICByYW5nZSAiMC4uMTA0ODU3NSI7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2Ni1mbG93LWxhYmVsIHR5cGUgcmVwcmVzZW50cyB0aGUgZmxvdyBpZGVudGlmaWVyIG9yIEZsb3cKICAgICAgTGFiZWwgaW4gYW4gSVB2NiBwYWNrZXQgaGVhZGVyIHRoYXQgbWF5IGJlIHVzZWQgdG8KICAgICAgZGlzY3JpbWluYXRlIHRyYWZmaWMgZmxvd3MuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSVB2NkZsb3dMYWJlbCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM1OTU6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIElQdjYgRmxvdyBMYWJlbAogICAgICBSRkMgMjQ2MDogSW50ZXJuZXQgUHJvdG9jb2wsIFZlcnNpb24gNiAoSVB2NikgU3BlY2lmaWNhdGlvbiI7CiAgfQoKICB0eXBlZGVmIHBvcnQtbnVtYmVyIHsKICAgIHR5cGUgdWludDE2IHsKICAgICAgcmFuZ2UgIjAuLjY1NTM1IjsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBwb3J0LW51bWJlciB0eXBlIHJlcHJlc2VudHMgYSAxNi1iaXQgcG9ydCBudW1iZXIgb2YgYW4KICAgICAgSW50ZXJuZXQgdHJhbnNwb3J0LWxheWVyIHByb3RvY29sIHN1Y2ggYXMgVURQLCBUQ1AsIERDQ1AsIG9yCiAgICAgIFNDVFAuICBQb3J0IG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IElBTkEuICBBIGN1cnJlbnQgbGlzdCBvZgogICAgICBhbGwgYXNzaWdubWVudHMgaXMgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuaWFuYS5vcmcvPi4KCiAgICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBudW1iZXIgdmFsdWUgemVybyBpcyByZXNlcnZlZCBieSBJQU5BLiAgSW4KICAgICAgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdmFsdWUgemVybyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4KICAgICAgYmUgZXhjbHVkZWQgYnkgc3VidHlwaW5nIHRoZSBwb3J0LW51bWJlciB0eXBlLgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgSW5ldFBvcnROdW1iZXIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgNzY4OiBVc2VyIERhdGFncmFtIFByb3RvY29sCiAgICAgIFJGQyAgNzkzOiBUcmFuc21pc3Npb24gQ29udHJvbCBQcm90b2NvbAogICAgICBSRkMgNDk2MDogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sCiAgICAgIFJGQyA0MzQwOiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKERDQ1ApCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgdHlwZXMgcmVsYXRlZCB0byBhdXRvbm9tb3VzIHN5c3RlbXMgKioqLwoKICB0eXBlZGVmIGFzLW51bWJlciB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBhcy1udW1iZXIgdHlwZSByZXByZXNlbnRzIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlcnMKICAgICAgd2hpY2ggaWRlbnRpZnkgYW4gQXV0b25vbW91cyBTeXN0ZW0gKEFTKS4gIEFuIEFTIGlzIGEgc2V0CiAgICAgIG9mIHJvdXRlcnMgdW5kZXIgYSBzaW5nbGUgdGVjaG5pY2FsIGFkbWluaXN0cmF0aW9uLCB1c2luZwogICAgICBhbiBpbnRlcmlvciBnYXRld2F5IHByb3RvY29sIGFuZCBjb21tb24gbWV0cmljcyB0byByb3V0ZQogICAgICBwYWNrZXRzIHdpdGhpbiB0aGUgQVMsIGFuZCB1c2luZyBhbiBleHRlcmlvciBnYXRld2F5CiAgICAgIHByb3RvY29sIHRvIHJvdXRlIHBhY2tldHMgdG8gb3RoZXIgQVNlcy4gIElBTkEgbWFpbnRhaW5zCiAgICAgIHRoZSBBUyBudW1iZXIgc3BhY2UgYW5kIGhhcyBkZWxlZ2F0ZWQgbGFyZ2UgcGFydHMgdG8gdGhlCiAgICAgIHJlZ2lvbmFsIHJlZ2lzdHJpZXMuCgogICAgICBBdXRvbm9tb3VzIHN5c3RlbSBudW1iZXJzIHdlcmUgb3JpZ2luYWxseSBsaW1pdGVkIHRvIDE2CiAgICAgIGJpdHMuICBCR1AgZXh0ZW5zaW9ucyBoYXZlIGVubGFyZ2VkIHRoZSBhdXRvbm9tb3VzIHN5c3RlbQogICAgICBudW1iZXIgc3BhY2UgdG8gMzIgYml0cy4gIFRoaXMgdHlwZSB0aGVyZWZvcmUgdXNlcyBhbiB1aW50MzIKICAgICAgYmFzZSB0eXBlIHdpdGhvdXQgYSByYW5nZSByZXN0cmljdGlvbiBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgIGEgbGFyZ2VyIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlciBzcGFjZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBJbmV0QXV0b25vbW91c1N5c3RlbU51bWJlciB0ZXh0dWFsIGNvbnZlbnRpb24gb2YKICAgICAgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDE5MzA6IEd1aWRlbGluZXMgZm9yIGNyZWF0aW9uLCBzZWxlY3Rpb24sIGFuZCByZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgIG9mIGFuIEF1dG9ub21vdXMgU3lzdGVtIChBUykKICAgICAgUkZDIDQyNzE6IEEgQm9yZGVyIEdhdGV3YXkgUHJvdG9jb2wgNCAoQkdQLTQpCiAgICAgIFJGQyA0MDAxOiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBJbnRlcm5ldCBOZXR3b3JrIEFkZHJlc3NlcwogICAgICBSRkMgNjc5MzogQkdQIFN1cHBvcnQgZm9yIEZvdXItT2N0ZXQgQXV0b25vbW91cyBTeXN0ZW0gKEFTKQogICAgICAgICAgICAgICAgTnVtYmVyIFNwYWNlIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIElQIGFkZHJlc3NlcyBhbmQgaG9zdG5hbWVzICoqKi8KCiAgdHlwZWRlZiBpcC1hZGRyZXNzIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgICB0eXBlIGluZXQ6aXB2Ni1hZGRyZXNzOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGlwLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBzdXBwb3J0cyBzY29wZWQgYWRkcmVzc2VzCiAgICAgIGJ5IGFsbG93aW5nIHpvbmUgaWRlbnRpZmllcnMgaW4gdGhlIGFkZHJlc3MgZm9ybWF0LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQwMDc6IElQdjYgU2NvcGVkIEFkZHJlc3MgQXJjaGl0ZWN0dXJlIjsKICB9CgogIHR5cGVkZWYgaXB2NC1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybgogICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICsgICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKScKICAgICAgKyAnKCVbXHB7Tn1ccHtMfV0rKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIlRoZSBpcHY0LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBpbgogICAgICAgZG90dGVkLXF1YWQgbm90YXRpb24uICBUaGUgSVB2NCBhZGRyZXNzIG1heSBpbmNsdWRlIGEgem9uZQogICAgICAgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgICBUaGUgem9uZSBpbmRleCBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBpZGVudGljYWwgYWRkcmVzcwogICAgICAgdmFsdWVzLiAgRm9yIGxpbmstbG9jYWwgYWRkcmVzc2VzLCB0aGUgem9uZSBpbmRleCB3aWxsCiAgICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgIGludGVyZmFjZS4gIElmIHRoZSB6b25lIGluZGV4IGlzIG5vdCBwcmVzZW50LCB0aGUgZGVmYXVsdAogICAgICAgem9uZSBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgdXNlZC4KCiAgICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgdGhlIHpvbmUgaW5kZXggaXMgdGhlIG51bWVyaWNhbAogICAgICAgZm9ybWF0IjsKICB9CgogIHR5cGVkZWYgaXB2Ni1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoJVtccHtOfVxwe0x9XSspPyc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKCUuKyk/JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzcyBpbiBmdWxsLAogICAgICBtaXhlZCwgc2hvcnRlbmVkLCBhbmQgc2hvcnRlbmVkLW1peGVkIG5vdGF0aW9uLiAgVGhlIElQdjYKICAgICAgYWRkcmVzcyBtYXkgaW5jbHVkZSBhIHpvbmUgaW5kZXgsIHNlcGFyYXRlZCBieSBhICUgc2lnbi4KCiAgICAgIFRoZSB6b25lIGluZGV4IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGlkZW50aWNhbCBhZGRyZXNzCiAgICAgIHZhbHVlcy4gIEZvciBsaW5rLWxvY2FsIGFkZHJlc3NlcywgdGhlIHpvbmUgaW5kZXggd2lsbAogICAgICB0eXBpY2FsbHkgYmUgdGhlIGludGVyZmFjZSBpbmRleCBudW1iZXIgb3IgdGhlIG5hbWUgb2YgYW4KICAgICAgaW50ZXJmYWNlLiAgSWYgdGhlIHpvbmUgaW5kZXggaXMgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0CiAgICAgIHpvbmUgb2YgdGhlIGRldmljZSB3aWxsIGJlIHVzZWQuCgogICAgICBUaGUgY2Fub25pY2FsIGZvcm1hdCBvZiBJUHY2IGFkZHJlc3NlcyB1c2VzIHRoZSB0ZXh0dWFsCiAgICAgIHJlcHJlc2VudGF0aW9uIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiAgVGhlCiAgICAgIGNhbm9uaWNhbCBmb3JtYXQgZm9yIHRoZSB6b25lIGluZGV4IGlzIHRoZSBudW1lcmljYWwKICAgICAgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDExLjIgb2YgUkZDIDQwMDcuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDI5MTogSVAgVmVyc2lvbiA2IEFkZHJlc3NpbmcgQXJjaGl0ZWN0dXJlCiAgICAgIFJGQyA0MDA3OiBJUHY2IFNjb3BlZCBBZGRyZXNzIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNTk1MjogQSBSZWNvbW1lbmRhdGlvbiBmb3IgSVB2NiBBZGRyZXNzIFRleHQKICAgICAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIjsKICB9CgogIHR5cGVkZWYgaXAtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzLW5vLXpvbmU7CiAgICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3Mtbm8tem9uZTsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcC1hZGRyZXNzLW5vLXpvbmUgdHlwZSByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgYW5kIGlzCiAgICAgIElQIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24KICAgICAgaW1wbGllcyB0aGUgSVAgdmVyc2lvbi4gIFRoaXMgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHNjb3BlZAogICAgICBhZGRyZXNzZXMgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgem9uZSBpZGVudGlmaWVycyBpbiB0aGUKICAgICAgYWRkcmVzcyBmb3JtYXQuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUiOwogIH0KCiAgdHlwZWRlZiBpcHY0LWFkZHJlc3Mtbm8tem9uZSB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzIHsKICAgICAgcGF0dGVybiAnWzAtOVwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjQgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY0LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtYWRkcmVzcy1uby16b25lIHsKICAgIHR5cGUgaW5ldDppcHY2LWFkZHJlc3MgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GOlwuXSonOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAgIkFuIElQdjYgYWRkcmVzcyB3aXRob3V0IGEgem9uZSBpbmRleC4gIFRoaXMgdHlwZSwgZGVyaXZlZCBmcm9tCiAgICAgICBpcHY2LWFkZHJlc3MsIG1heSBiZSB1c2VkIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHpvbmUgaXMKICAgICAgIGtub3duIGZyb20gdGhlIGNvbnRleHQgYW5kIGhlbmNlIG5vIHpvbmUgaW5kZXggaXMgbmVlZGVkLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDQyOTE6IElQIFZlcnNpb24gNiBBZGRyZXNzaW5nIEFyY2hpdGVjdHVyZQogICAgICBSRkMgNDAwNzogSVB2NiBTY29wZWQgQWRkcmVzcyBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICB0eXBlZGVmIGlwLXByZWZpeCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSBpbmV0OmlwdjQtcHJlZml4OwogICAgICB0eXBlIGluZXQ6aXB2Ni1wcmVmaXg7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXAtcHJlZml4IHR5cGUgcmVwcmVzZW50cyBhbiBJUCBwcmVmaXggYW5kIGlzIElQCiAgICAgIHZlcnNpb24gbmV1dHJhbC4gIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb25zCiAgICAgIGltcGxpZXMgdGhlIElQIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgaXB2NC1wcmVmaXggewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgICcoKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSlcLil7M30nCiAgICAgICArICAnKFswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSknCiAgICAgICArICcvKChbMC05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMl0pKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgaXB2NC1wcmVmaXggdHlwZSByZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXguCiAgICAgIFRoZSBwcmVmaXggbGVuZ3RoIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZQogICAgICBzbGFzaCBjaGFyYWN0ZXIgYW5kIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYW4gSVB2NCBwcmVmaXggaGFzIGFsbCBiaXRzIG9mCiAgICAgIHRoZSBJUHY0IGFkZHJlc3Mgc2V0IHRvIHplcm8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCiAgICAgIElQdjQgcHJlZml4LiI7CiAgfQoKICB0eXBlZGVmIGlwdjYtcHJlZml4IHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKCg6fFswLTlhLWZBLUZdezAsNH0pOikoWzAtOWEtZkEtRl17MCw0fTopezAsNX0nCiAgICAgICAgICAgICsgJygoKFswLTlhLWZBLUZdezAsNH06KT8oOnxbMC05YS1mQS1GXXswLDR9KSl8JwogICAgICAgICAgICArICcoKCgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV0/WzAtOV0pXC4pezN9JwogICAgICAgICAgICArICcoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldP1swLTldKSkpJwogICAgICAgICAgICArICcoLygoWzAtOV0pfChbMC05XXsyfSl8KDFbMC0xXVswLTldKXwoMTJbMC04XSkpKSc7CiAgICAgIHBhdHRlcm4gJygoW146XSs6KXs2fSgoW146XSs6W146XSspfCguKlwuLiopKSl8JwogICAgICAgICAgICArICcoKChbXjpdKzopKlteOl0rKT86OigoW146XSs6KSpbXjpdKyk/KScKICAgICAgICAgICAgKyAnKC8uKyknOwogICAgfQoKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBpcHY2LXByZWZpeCB0eXBlIHJlcHJlc2VudHMgYW4gSVB2NiBhZGRyZXNzIHByZWZpeC4KICAgICAgVGhlIHByZWZpeCBsZW5ndGggaXMgZ2l2ZW4gYnkgdGhlIG51bWJlciBmb2xsb3dpbmcgdGhlCiAgICAgIHNsYXNoIGNoYXJhY3RlciBhbmQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTI4LgoKICAgICAgQSBwcmVmaXggbGVuZ3RoIHZhbHVlIG9mIG4gY29ycmVzcG9uZHMgdG8gYW4gSVAgYWRkcmVzcwogICAgICBtYXNrIHRoYXQgaGFzIG4gY29udGlndW91cyAxLWJpdHMgZnJvbSB0aGUgbW9zdAogICAgICBzaWduaWZpY2FudCBiaXQgKE1TQikgYW5kIGFsbCBvdGhlciBiaXRzIHNldCB0byAwLgoKICAgICAgVGhlIElQdjYgYWRkcmVzcyBzaG91bGQgaGF2ZSBhbGwgYml0cyB0aGF0IGRvIG5vdCBiZWxvbmcKICAgICAgdG8gdGhlIHByZWZpeCBzZXQgdG8gemVyby4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGFuIElQdjYgcHJlZml4IGhhcyBhbGwgYml0cyBvZgogICAgICB0aGUgSVB2NiBhZGRyZXNzIHNldCB0byB6ZXJvIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZQogICAgICBJUHY2IHByZWZpeC4gIEZ1cnRoZXJtb3JlLCB0aGUgSVB2NiBhZGRyZXNzIGlzIHJlcHJlc2VudGVkCiAgICAgIGFzIGRlZmluZWQgaW4gU2VjdGlvbiA0IG9mIFJGQyA1OTUyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDU5NTI6IEEgUmVjb21tZW5kYXRpb24gZm9yIElQdjYgQWRkcmVzcyBUZXh0CiAgICAgICAgICAgICAgICBSZXByZXNlbnRhdGlvbiI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgZG9tYWluIG5hbWUgYW5kIFVSSSB0eXBlcyAqKiovCgogIHR5cGVkZWYgZG9tYWluLW5hbWUgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuCiAgICAgICAgJygoKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4pKicKICAgICAgKyAnKFthLXpBLVowLTlfXShbYS16QS1aMC05XC1fXSl7MCw2MX0pP1thLXpBLVowLTldXC4/KScKICAgICAgKyAnfFwuJzsKICAgICAgbGVuZ3RoICIxLi4yNTMiOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGRvbWFpbi1uYW1lIHR5cGUgcmVwcmVzZW50cyBhIEROUyBkb21haW4gbmFtZS4gIFRoZQogICAgICBuYW1lIFNIT1VMRCBiZSBmdWxseSBxdWFsaWZpZWQgd2hlbmV2ZXIgcG9zc2libGUuCgogICAgICBJbnRlcm5ldCBkb21haW4gbmFtZXMgYXJlIG9ubHkgbG9vc2VseSBzcGVjaWZpZWQuICBTZWN0aW9uCiAgICAgIDMuNSBvZiBSRkMgMTAzNCByZWNvbW1lbmRzIGEgc3ludGF4IChtb2RpZmllZCBpbiBTZWN0aW9uCiAgICAgIDIuMSBvZiBSRkMgMTEyMykuICBUaGUgcGF0dGVybiBhYm92ZSBpcyBpbnRlbmRlZCB0byBhbGxvdwogICAgICBmb3IgY3VycmVudCBwcmFjdGljZSBpbiBkb21haW4gbmFtZSB1c2UsIGFuZCBzb21lIHBvc3NpYmxlCiAgICAgIGZ1dHVyZSBleHBhbnNpb24uICBJdCBpcyBkZXNpZ25lZCB0byBob2xkIHZhcmlvdXMgdHlwZXMgb2YKICAgICAgZG9tYWluIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXMgdXNlZCBmb3IgQSBvciBBQUFBIHJlY29yZHMKICAgICAgKGhvc3QgbmFtZXMpIGFuZCBvdGhlciByZWNvcmRzLCBzdWNoIGFzIFNSViByZWNvcmRzLiAgTm90ZQogICAgICB0aGF0IEludGVybmV0IGhvc3QgbmFtZXMgaGF2ZSBhIHN0cmljdGVyIHN5bnRheCAoZGVzY3JpYmVkCiAgICAgIGluIFJGQyA5NTIpIHRoYW4gdGhlIEROUyByZWNvbW1lbmRhdGlvbnMgaW4gUkZDcyAxMDM0IGFuZAogICAgICAxMTIzLCBhbmQgdGhhdCBzeXN0ZW1zIHRoYXQgd2FudCB0byBzdG9yZSBob3N0IG5hbWVzIGluCiAgICAgIHNjaGVtYSBub2RlcyB1c2luZyB0aGUgZG9tYWluLW5hbWUgdHlwZSBhcmUgcmVjb21tZW5kZWQgdG8KICAgICAgYWRoZXJlIHRvIHRoaXMgc3RyaWN0ZXIgc3RhbmRhcmQgdG8gZW5zdXJlIGludGVyb3BlcmFiaWxpdHkuCgogICAgICBUaGUgZW5jb2Rpbmcgb2YgRE5TIG5hbWVzIGluIHRoZSBETlMgcHJvdG9jb2wgaXMgbGltaXRlZAogICAgICB0byAyNTUgY2hhcmFjdGVycy4gIFNpbmNlIHRoZSBlbmNvZGluZyBjb25zaXN0cyBvZiBsYWJlbHMKICAgICAgcHJlZml4ZWQgYnkgYSBsZW5ndGggYnl0ZXMgYW5kIHRoZXJlIGlzIGEgdHJhaWxpbmcgTlVMTAogICAgICBieXRlLCBvbmx5IDI1MyBjaGFyYWN0ZXJzIGNhbiBhcHBlYXIgaW4gdGhlIHRleHR1YWwgZG90dGVkCiAgICAgIG5vdGF0aW9uLgoKICAgICAgVGhlIGRlc2NyaXB0aW9uIGNsYXVzZSBvZiBzY2hlbWEgbm9kZXMgdXNpbmcgdGhlIGRvbWFpbi1uYW1lCiAgICAgIHR5cGUgTVVTVCBkZXNjcmliZSB3aGVuIGFuZCBob3cgdGhlc2UgbmFtZXMgYXJlIHJlc29sdmVkIHRvCiAgICAgIElQIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdCB0aGUgcmVzb2x1dGlvbiBvZiBhIGRvbWFpbi1uYW1lIHZhbHVlCiAgICAgIG1heSByZXF1aXJlIHRvIHF1ZXJ5IG11bHRpcGxlIEROUyByZWNvcmRzIChlLmcuLCBBIGZvciBJUHY0CiAgICAgIGFuZCBBQUFBIGZvciBJUHY2KS4gIFRoZSBvcmRlciBvZiB0aGUgcmVzb2x1dGlvbiBwcm9jZXNzIGFuZAogICAgICB3aGljaCBETlMgcmVjb3JkIHRha2VzIHByZWNlZGVuY2UgY2FuIGVpdGhlciBiZSBkZWZpbmVkCiAgICAgIGV4cGxpY2l0bHkgb3IgbWF5IGRlcGVuZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKICAgICAgcmVzb2x2ZXIuCgogICAgICBEb21haW4tbmFtZSB2YWx1ZXMgdXNlIHRoZSBVUy1BU0NJSSBlbmNvZGluZy4gIFRoZWlyIGNhbm9uaWNhbAogICAgICBmb3JtYXQgdXNlcyBsb3dlcmNhc2UgVVMtQVNDSUkgY2hhcmFjdGVycy4gIEludGVybmF0aW9uYWxpemVkCiAgICAgIGRvbWFpbiBuYW1lcyBNVVNUIGJlIEEtbGFiZWxzIGFzIHBlciBSRkMgNTg5MC4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAgOTUyOiBEb0QgSW50ZXJuZXQgSG9zdCBUYWJsZSBTcGVjaWZpY2F0aW9uCiAgICAgIFJGQyAxMDM0OiBEb21haW4gTmFtZXMgLSBDb25jZXB0cyBhbmQgRmFjaWxpdGllcwogICAgICBSRkMgMTEyMzogUmVxdWlyZW1lbnRzIGZvciBJbnRlcm5ldCBIb3N0cyAtLSBBcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgYW5kIFN1cHBvcnQKICAgICAgUkZDIDI3ODI6IEEgRE5TIFJSIGZvciBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiBzZXJ2aWNlcwogICAgICAgICAgICAgICAgKEROUyBTUlYpCiAgICAgIFJGQyA1ODkwOiBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgaW4gQXBwbGljYXRpb25zCiAgICAgICAgICAgICAgICAoSUROQSk6IERlZmluaXRpb25zIGFuZCBEb2N1bWVudCBGcmFtZXdvcmsiOwogIH0KCiAgdHlwZWRlZiBob3N0IHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIGluZXQ6aXAtYWRkcmVzczsKICAgICAgdHlwZSBpbmV0OmRvbWFpbi1uYW1lOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGhvc3QgdHlwZSByZXByZXNlbnRzIGVpdGhlciBhbiBJUCBhZGRyZXNzIG9yIGEgRE5TCiAgICAgIGRvbWFpbiBuYW1lLiI7CiAgfQoKICB0eXBlZGVmIHVyaSB7CiAgICB0eXBlIHN0cmluZzsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB1cmkgdHlwZSByZXByZXNlbnRzIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyCiAgICAgIChVUkkpIGFzIGRlZmluZWQgYnkgU1REIDY2LgoKICAgICAgT2JqZWN0cyB1c2luZyB0aGUgdXJpIHR5cGUgTVVTVCBiZSBpbiBVUy1BU0NJSSBlbmNvZGluZywKICAgICAgYW5kIE1VU1QgYmUgbm9ybWFsaXplZCBhcyBkZXNjcmliZWQgYnkgUkZDIDM5ODYgU2VjdGlvbnMKICAgICAgNi4yLjEsIDYuMi4yLjEsIGFuZCA2LjIuMi4yLiAgQWxsIHVubmVjZXNzYXJ5CiAgICAgIHBlcmNlbnQtZW5jb2RpbmcgaXMgcmVtb3ZlZCwgYW5kIGFsbCBjYXNlLWluc2Vuc2l0aXZlCiAgICAgIGNoYXJhY3RlcnMgYXJlIHNldCB0byBsb3dlcmNhc2UgZXhjZXB0IGZvciBoZXhhZGVjaW1hbAogICAgICBkaWdpdHMsIHdoaWNoIGFyZSBub3JtYWxpemVkIHRvIHVwcGVyY2FzZSBhcyBkZXNjcmliZWQgaW4KICAgICAgU2VjdGlvbiA2LjIuMi4xLgoKICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGhlbHAgcHJvdmlkZQogICAgICB1bmlxdWUgVVJJcy4gIE5vdGUgdGhhdCB0aGlzIG5vcm1hbGl6YXRpb24gaXMgbm90CiAgICAgIHN1ZmZpY2llbnQgdG8gcHJvdmlkZSB1bmlxdWVuZXNzLiAgVHdvIFVSSXMgdGhhdCBhcmUKICAgICAgdGV4dHVhbGx5IGRpc3RpbmN0IGFmdGVyIHRoaXMgbm9ybWFsaXphdGlvbiBtYXkgc3RpbGwgYmUKICAgICAgZXF1aXZhbGVudC4KCiAgICAgIE9iamVjdHMgdXNpbmcgdGhlIHVyaSB0eXBlIG1heSByZXN0cmljdCB0aGUgc2NoZW1lcyB0aGF0CiAgICAgIHRoZXkgcGVybWl0LiAgRm9yIGV4YW1wbGUsICdkYXRhOicgYW5kICd1cm46JyBzY2hlbWVzCiAgICAgIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZS4KCiAgICAgIEEgemVyby1sZW5ndGggVVJJIGlzIG5vdCBhIHZhbGlkIFVSSS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICAgZXhwcmVzcyAnVVJJIGFic2VudCcgd2hlcmUgcmVxdWlyZWQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgVXJpIFNNSXYyIHRleHR1YWwgY29udmVudGlvbiBkZWZpbmVkIGluIFJGQyA1MDE3LiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDM5ODY6IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKTogR2VuZXJpYyBTeW50YXgKICAgICAgUkZDIDMzMDU6IFJlcG9ydCBmcm9tIHRoZSBKb2ludCBXM0MvSUVURiBVUkkgUGxhbm5pbmcgSW50ZXJlc3QKICAgICAgICAgICAgICAgIEdyb3VwOiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUklzKSwgVVJMcywKICAgICAgICAgICAgICAgIGFuZCBVbmlmb3JtIFJlc291cmNlIE5hbWVzIChVUk5zKTogQ2xhcmlmaWNhdGlvbnMKICAgICAgICAgICAgICAgIGFuZCBSZWNvbW1lbmRhdGlvbnMKICAgICAgUkZDIDUwMTc6IE1JQiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBVbmlmb3JtIFJlc291cmNlCiAgICAgICAgICAgICAgICBJZGVudGlmaWVycyAoVVJJcykiOwogIH0KCn0K
+ietf-yang-types        urn:ietf:params:xml:ns:yang:ietf-yang-types     \N      []      2013-07-15      bW9kdWxlIGlldGYteWFuZy10eXBlcyB7CgogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYteWFuZy10eXBlcyI7CiAgcHJlZml4ICJ5YW5nIjsKCiAgb3JnYW5pemF0aW9uCiAgICJJRVRGIE5FVE1PRCAoTkVUQ09ORiBEYXRhIE1vZGVsaW5nIExhbmd1YWdlKSBXb3JraW5nIEdyb3VwIjsKCiAgY29udGFjdAogICAiV0cgV2ViOiAgIDxodHRwOi8vdG9vbHMuaWV0Zi5vcmcvd2cvbmV0bW9kLz4KICAgIFdHIExpc3Q6ICA8bWFpbHRvOm5ldG1vZEBpZXRmLm9yZz4KCiAgICBXRyBDaGFpcjogRGF2aWQgS2Vzc2VucwogICAgICAgICAgICAgIDxtYWlsdG86ZGF2aWQua2Vzc2Vuc0Buc24uY29tPgoKICAgIFdHIENoYWlyOiBKdWVyZ2VuIFNjaG9lbndhZWxkZXIKICAgICAgICAgICAgICA8bWFpbHRvOmouc2Nob2Vud2FlbGRlckBqYWNvYnMtdW5pdmVyc2l0eS5kZT4KCiAgICBFZGl0b3I6ICAgSnVlcmdlbiBTY2hvZW53YWVsZGVyCiAgICAgICAgICAgICAgPG1haWx0bzpqLnNjaG9lbndhZWxkZXJAamFjb2JzLXVuaXZlcnNpdHkuZGU+IjsKCiAgZGVzY3JpcHRpb24KICAgIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBnZW5lcmFsbHkgdXNlZnVsIGRlcml2ZWQKICAgIFlBTkcgZGF0YSB0eXBlcy4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMTMgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywgYW5kIHN1YmplY3QKICAgIHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICAgIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUgSUVURiBUcnVzdCdzIExlZ2FsIFByb3Zpc2lvbnMKICAgIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cDovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICBUaGlzIHZlcnNpb24gb2YgdGhpcyBZQU5HIG1vZHVsZSBpcyBwYXJ0IG9mIFJGQyA2OTkxOyBzZWUKICAgIHRoZSBSRkMgaXRzZWxmIGZvciBmdWxsIGxlZ2FsIG5vdGljZXMuIjsKCiAgcmV2aXNpb24gMjAxMy0wNy0xNSB7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGlzIHJldmlzaW9uIGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgZGF0YSB0eXBlczoKICAgICAgLSB5YW5nLWlkZW50aWZpZXIKICAgICAgLSBoZXgtc3RyaW5nCiAgICAgIC0gdXVpZAogICAgICAtIGRvdHRlZC1xdWFkIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjk5MTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICByZXZpc2lvbiAyMDEwLTA5LTI0IHsKICAgIGRlc2NyaXB0aW9uCiAgICAgIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNjAyMTogQ29tbW9uIFlBTkcgRGF0YSBUeXBlcyI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2YgY291bnRlciBhbmQgZ2F1Z2UgdHlwZXMgKioqLwoKICB0eXBlZGVmIGNvdW50ZXIzMiB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBjb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKICAgICAgdGhhdCBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyB1bnRpbCBpdCByZWFjaGVzIGEKICAgICAgbWF4aW11bSB2YWx1ZSBvZiAyXjMyLTEgKDQyOTQ5NjcyOTUgZGVjaW1hbCksIHdoZW4gaXQKICAgICAgd3JhcHMgYXJvdW5kIGFuZCBzdGFydHMgaW5jcmVhc2luZyBhZ2FpbiBmcm9tIHplcm8uCgogICAgICBDb3VudGVycyBoYXZlIG5vIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlLCBhbmQgdGh1cywgYQogICAgICBzaW5nbGUgdmFsdWUgb2YgYSBjb3VudGVyIGhhcyAoaW4gZ2VuZXJhbCkgbm8gaW5mb3JtYXRpb24KICAgICAgY29udGVudC4gIERpc2NvbnRpbnVpdGllcyBpbiB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCiAgICAgIHZhbHVlIG5vcm1hbGx5IG9jY3VyIGF0IHJlLWluaXRpYWxpemF0aW9uIG9mIHRoZQogICAgICBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIGF0IG90aGVyIHRpbWVzIGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgYSBzY2hlbWEgbm9kZSB1c2luZyB0aGlzIHR5cGUuICBJZiBzdWNoCiAgICAgIG90aGVyIHRpbWVzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIHRoZSBjcmVhdGlvbiBvZgogICAgICBhIHNjaGVtYSBub2RlIG9mIHR5cGUgY291bnRlcjMyIGF0IHRpbWVzIG90aGVyIHRoYW4KICAgICAgcmUtaW5pdGlhbGl6YXRpb24sIHRoZW4gYSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCiAgICAgIHNob3VsZCBiZSBkZWZpbmVkLCB3aXRoIGFuIGFwcHJvcHJpYXRlIHR5cGUsIHRvIGluZGljYXRlCiAgICAgIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkuCgogICAgICBUaGUgY291bnRlcjMyIHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uCiAgICAgIHNjaGVtYSBub2Rlcy4gIEEgZGVmYXVsdCBzdGF0ZW1lbnQgU0hPVUxEIE5PVCBiZSB1c2VkIGluCiAgICAgIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgY291bnRlcjMyLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXIzMiB0eXBlIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc4OiBTdHJ1Y3R1cmUgb2YgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiBWZXJzaW9uIDIKICAgICAgICAgICAgICAgIChTTUl2MikiOwogIH0KCiAgdHlwZWRlZiB6ZXJvLWJhc2VkLWNvdW50ZXIzMiB7CiAgICB0eXBlIHlhbmc6Y291bnRlcjMyOwogICAgZGVmYXVsdCAiMCI7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgemVyby1iYXNlZC1jb3VudGVyMzIgdHlwZSByZXByZXNlbnRzIGEgY291bnRlcjMyCiAgICAgIHRoYXQgaGFzIHRoZSBkZWZpbmVkICdpbml0aWFsJyB2YWx1ZSB6ZXJvLgoKICAgICAgQSBzY2hlbWEgbm9kZSBvZiB0aGlzIHR5cGUgd2lsbCBiZSBzZXQgdG8gemVybyAoMCkgb24gY3JlYXRpb24KICAgICAgYW5kIHdpbGwgdGhlcmVhZnRlciBpbmNyZWFzZSBtb25vdG9uaWNhbGx5IHVudGlsIGl0IHJlYWNoZXMKICAgICAgYSBtYXhpbXVtIHZhbHVlIG9mIDJeMzItMSAoNDI5NDk2NzI5NSBkZWNpbWFsKSwgd2hlbiBpdAogICAgICB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyMzIgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgNDUwMjogUmVtb3RlIE5ldHdvcmsgTW9uaXRvcmluZyBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgQmFzZSBWZXJzaW9uIDIiOwogIH0KCiAgdHlwZWRlZiBjb3VudGVyNjQgewogICAgdHlwZSB1aW50NjQ7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgY291bnRlcjY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCiAgICAgIHRoYXQgbW9ub3RvbmljYWxseSBpbmNyZWFzZXMgdW50aWwgaXQgcmVhY2hlcyBhCiAgICAgIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIENvdW50ZXJzIGhhdmUgbm8gZGVmaW5lZCAnaW5pdGlhbCcgdmFsdWUsIGFuZCB0aHVzLCBhCiAgICAgIHNpbmdsZSB2YWx1ZSBvZiBhIGNvdW50ZXIgaGFzIChpbiBnZW5lcmFsKSBubyBpbmZvcm1hdGlvbgogICAgICBjb250ZW50LiAgRGlzY29udGludWl0aWVzIGluIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKICAgICAgdmFsdWUgbm9ybWFsbHkgb2NjdXIgYXQgcmUtaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgICAgIG1hbmFnZW1lbnQgc3lzdGVtLCBhbmQgYXQgb3RoZXIgdGltZXMgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhIHNjaGVtYSBub2RlIHVzaW5nIHRoaXMgdHlwZS4gIElmIHN1Y2gKICAgICAgb3RoZXIgdGltZXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgdGhlIGNyZWF0aW9uIG9mCiAgICAgIGEgc2NoZW1hIG5vZGUgb2YgdHlwZSBjb3VudGVyNjQgYXQgdGltZXMgb3RoZXIgdGhhbgogICAgICByZS1pbml0aWFsaXphdGlvbiwgdGhlbiBhIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKICAgICAgc2hvdWxkIGJlIGRlZmluZWQsIHdpdGggYW4gYXBwcm9wcmlhdGUgdHlwZSwgdG8gaW5kaWNhdGUKICAgICAgdGhlIGxhc3QgZGlzY29udGludWl0eS4KCiAgICAgIFRoZSBjb3VudGVyNjQgdHlwZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24KICAgICAgc2NoZW1hIG5vZGVzLiAgQSBkZWZhdWx0IHN0YXRlbWVudCBTSE9VTEQgTk9UIGJlIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBjb3VudGVyNjQuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgQ291bnRlcjY0IHR5cGUgb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzg6IFN0cnVjdHVyZSBvZiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIFZlcnNpb24gMgogICAgICAgICAgICAgICAgKFNNSXYyKSI7CiAgfQoKICB0eXBlZGVmIHplcm8tYmFzZWQtY291bnRlcjY0IHsKICAgIHR5cGUgeWFuZzpjb3VudGVyNjQ7CiAgICBkZWZhdWx0ICIwIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB6ZXJvLWJhc2VkLWNvdW50ZXI2NCB0eXBlIHJlcHJlc2VudHMgYSBjb3VudGVyNjQgdGhhdAogICAgICBoYXMgdGhlIGRlZmluZWQgJ2luaXRpYWwnIHZhbHVlIHplcm8uCgogICAgICBBIHNjaGVtYSBub2RlIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHNldCB0byB6ZXJvICgwKSBvbiBjcmVhdGlvbgogICAgICBhbmQgd2lsbCB0aGVyZWFmdGVyIGluY3JlYXNlIG1vbm90b25pY2FsbHkgdW50aWwgaXQgcmVhY2hlcwogICAgICBhIG1heGltdW0gdmFsdWUgb2YgMl42NC0xICgxODQ0Njc0NDA3MzcwOTU1MTYxNSBkZWNpbWFsKSwKICAgICAgd2hlbiBpdCB3cmFwcyBhcm91bmQgYW5kIHN0YXJ0cyBpbmNyZWFzaW5nIGFnYWluIGZyb20gemVyby4KCiAgICAgIFByb3ZpZGVkIHRoYXQgYW4gYXBwbGljYXRpb24gZGlzY292ZXJzIGEgbmV3IHNjaGVtYSBub2RlCiAgICAgIG9mIHRoaXMgdHlwZSB3aXRoaW4gdGhlIG1pbmltdW0gdGltZSB0byB3cmFwLCBpdCBjYW4gdXNlIHRoZQogICAgICAnaW5pdGlhbCcgdmFsdWUgYXMgYSBkZWx0YS4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBtYW5hZ2VtZW50CiAgICAgIHN0YXRpb24gdG8gYmUgYXdhcmUgb2YgdGhpcyBtaW5pbXVtIHRpbWUgYW5kIHRoZSBhY3R1YWwgdGltZQogICAgICBiZXR3ZWVuIHBvbGxzLCBhbmQgdG8gZGlzY2FyZCBkYXRhIGlmIHRoZSBhY3R1YWwgdGltZSBpcyB0b28KICAgICAgbG9uZyBvciB0aGVyZSBpcyBubyBkZWZpbmVkIG1pbmltdW0gdGltZS4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBaZXJvQmFzZWRDb3VudGVyNjQgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgdHlwZWRlZiBnYXVnZTMyIHsKICAgIHR5cGUgdWludDMyOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhlIGdhdWdlMzIgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHdoaWNoCiAgICAgIG1heSBpbmNyZWFzZSBvciBkZWNyZWFzZSwgYnV0IHNoYWxsIG5ldmVyIGV4Y2VlZCBhIG1heGltdW0KICAgICAgdmFsdWUsIG5vciBmYWxsIGJlbG93IGEgbWluaW11bSB2YWx1ZS4gIFRoZSBtYXhpbXVtIHZhbHVlCiAgICAgIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMl4zMi0xICg0Mjk0OTY3Mjk1IGRlY2ltYWwpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2UzMiBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTMyIGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIEdhdWdlMzIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgZ2F1Z2U2NCB7CiAgICB0eXBlIHVpbnQ2NDsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSBnYXVnZTY0IHR5cGUgcmVwcmVzZW50cyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aGljaAogICAgICBtYXkgaW5jcmVhc2Ugb3IgZGVjcmVhc2UsIGJ1dCBzaGFsbCBuZXZlciBleGNlZWQgYSBtYXhpbXVtCiAgICAgIHZhbHVlLCBub3IgZmFsbCBiZWxvdyBhIG1pbmltdW0gdmFsdWUuICBUaGUgbWF4aW11bSB2YWx1ZQogICAgICBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDJeNjQtMSAoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCBhbmQKICAgICAgdGhlIG1pbmltdW0gdmFsdWUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAwLiAgVGhlIHZhbHVlIG9mCiAgICAgIGEgZ2F1Z2U2NCBoYXMgaXRzIG1heGltdW0gdmFsdWUgd2hlbmV2ZXIgdGhlIGluZm9ybWF0aW9uCiAgICAgIGJlaW5nIG1vZGVsZWQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyBtYXhpbXVtCiAgICAgIHZhbHVlLCBhbmQgaGFzIGl0cyBtaW5pbXVtIHZhbHVlIHdoZW5ldmVyIHRoZSBpbmZvcm1hdGlvbgogICAgICBiZWluZyBtb2RlbGVkIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAgSWYgdGhlIGluZm9ybWF0aW9uIGJlaW5nIG1vZGVsZWQgc3Vic2VxdWVudGx5IGRlY3JlYXNlcwogICAgICBiZWxvdyAoaW5jcmVhc2VzIGFib3ZlKSB0aGUgbWF4aW11bSAobWluaW11bSkgdmFsdWUsIHRoZQogICAgICBnYXVnZTY0IGFsc28gZGVjcmVhc2VzIChpbmNyZWFzZXMpLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIENvdW50ZXJCYXNlZEdhdWdlNjQgU01JdjIgdGV4dHVhbCBjb252ZW50aW9uIGRlZmluZWQKICAgICAgaW4gUkZDIDI4NTYiOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyODU2OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBBZGRpdGlvbmFsIEhpZ2ggQ2FwYWNpdHkKICAgICAgICAgICAgICAgIERhdGEgVHlwZXMiOwogIH0KCiAgLyoqKiBjb2xsZWN0aW9uIG9mIGlkZW50aWZpZXItcmVsYXRlZCB0eXBlcyAqKiovCgogIHR5cGVkZWYgb2JqZWN0LWlkZW50aWZpZXIgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICcoKFswLTFdKFwuWzEtM10/WzAtOV0pKXwoMlwuKDB8KFsxLTldXGQqKSkpKScKICAgICAgICAgICAgKyAnKFwuKDB8KFsxLTldXGQqKSkpKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgb2JqZWN0LWlkZW50aWZpZXIgdHlwZSByZXByZXNlbnRzIGFkbWluaXN0cmF0aXZlbHkKICAgICAgYXNzaWduZWQgbmFtZXMgaW4gYSByZWdpc3RyYXRpb24taGllcmFyY2hpY2FsLW5hbWUgdHJlZS4KCiAgICAgIFZhbHVlcyBvZiB0aGlzIHR5cGUgYXJlIGRlbm90ZWQgYXMgYSBzZXF1ZW5jZSBvZiBudW1lcmljYWwKICAgICAgbm9uLW5lZ2F0aXZlIHN1Yi1pZGVudGlmaWVyIHZhbHVlcy4gIEVhY2ggc3ViLWlkZW50aWZpZXIKICAgICAgdmFsdWUgTVVTVCBOT1QgZXhjZWVkIDJeMzItMSAoNDI5NDk2NzI5NSkuICBTdWItaWRlbnRpZmllcnMKICAgICAgYXJlIHNlcGFyYXRlZCBieSBzaW5nbGUgZG90cyBhbmQgd2l0aG91dCBhbnkgaW50ZXJtZWRpYXRlCiAgICAgIHdoaXRlc3BhY2UuCgogICAgICBUaGUgQVNOLjEgc3RhbmRhcmQgcmVzdHJpY3RzIHRoZSB2YWx1ZSBzcGFjZSBvZiB0aGUgZmlyc3QKICAgICAgc3ViLWlkZW50aWZpZXIgdG8gMCwgMSwgb3IgMi4gIEZ1cnRoZXJtb3JlLCB0aGUgdmFsdWUgc3BhY2UKICAgICAgb2YgdGhlIHNlY29uZCBzdWItaWRlbnRpZmllciBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQogICAgICAwIHRvIDM5IGlmIHRoZSBmaXJzdCBzdWItaWRlbnRpZmllciBpcyAwIG9yIDEuICBGaW5hbGx5LAogICAgICB0aGUgQVNOLjEgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBhbiBvYmplY3QgaWRlbnRpZmllcgogICAgICBoYXMgYWx3YXlzIGF0IGxlYXN0IHR3byBzdWItaWRlbnRpZmllcnMuICBUaGUgcGF0dGVybgogICAgICBjYXB0dXJlcyB0aGVzZSByZXN0cmljdGlvbnMuCgogICAgICBBbHRob3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1pZGVudGlmaWVycyBpcyBub3QgbGltaXRlZCwKICAgICAgbW9kdWxlIGRlc2lnbmVycyBzaG91bGQgcmVhbGl6ZSB0aGF0IHRoZXJlIG1heSBiZQogICAgICBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdGljayB3aXRoIHRoZSBTTUl2MiBsaW1pdCBvZiAxMjgKICAgICAgc3ViLWlkZW50aWZpZXJzLgoKICAgICAgVGhpcyB0eXBlIGlzIGEgc3VwZXJzZXQgb2YgdGhlIFNNSXYyIE9CSkVDVCBJREVOVElGSUVSIHR5cGUKICAgICAgc2luY2UgaXQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gMTI4IHN1Yi1pZGVudGlmaWVycy4gIEhlbmNlLAogICAgICB0aGlzIHR5cGUgU0hPVUxEIE5PVCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgU01JdjIgT0JKRUNUCiAgICAgIElERU5USUZJRVIgdHlwZTsgdGhlIG9iamVjdC1pZGVudGlmaWVyLTEyOCB0eXBlIFNIT1VMRCBiZQogICAgICB1c2VkIGluc3RlYWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJJU085ODM0LTE6IEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLS0gT3BlbiBTeXN0ZW1zCiAgICAgIEludGVyY29ubmVjdGlvbiAtLSBQcm9jZWR1cmVzIGZvciB0aGUgb3BlcmF0aW9uIG9mIE9TSQogICAgICBSZWdpc3RyYXRpb24gQXV0aG9yaXRpZXM6IEdlbmVyYWwgcHJvY2VkdXJlcyBhbmQgdG9wCiAgICAgIGFyY3Mgb2YgdGhlIEFTTi4xIE9iamVjdCBJZGVudGlmaWVyIHRyZWUiOwogIH0KCiAgdHlwZWRlZiBvYmplY3QtaWRlbnRpZmllci0xMjggewogICAgdHlwZSBvYmplY3QtaWRlbnRpZmllciB7CiAgICAgIHBhdHRlcm4gJ1xkKihcLlxkKil7MSwxMjd9JzsKICAgIH0KICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoaXMgdHlwZSByZXByZXNlbnRzIG9iamVjdC1pZGVudGlmaWVycyByZXN0cmljdGVkIHRvIDEyOAogICAgICBzdWItaWRlbnRpZmllcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgT0JKRUNUIElERU5USUZJRVIgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgeWFuZy1pZGVudGlmaWVyIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgbGVuZ3RoICIxLi5tYXgiOwogICAgICBwYXR0ZXJuICdbYS16QS1aX11bYS16QS1aMC05XC1fLl0qJzsKICAgICAgcGF0dGVybiAnLnwuLnxbXnhYXS4qfC5bXm1NXS4qfC4uW15sTF0uKic7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQSBZQU5HIGlkZW50aWZpZXIgc3RyaW5nIGFzIGRlZmluZWQgYnkgdGhlICdpZGVudGlmaWVyJwogICAgICAgcnVsZSBpbiBTZWN0aW9uIDEyIG9mIFJGQyA2MDIwLiAgQW4gaWRlbnRpZmllciBtdXN0CiAgICAgICBzdGFydCB3aXRoIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIG9yIGFuIHVuZGVyc2NvcmUKICAgICAgIGZvbGxvd2VkIGJ5IGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBhbHBoYWJldGljIG9yCiAgICAgICBudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBvciBkb3RzLgoKICAgICAgIEEgWUFORyBpZGVudGlmaWVyIE1VU1QgTk9UIHN0YXJ0IHdpdGggYW55IHBvc3NpYmxlCiAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgbG93ZXJjYXNlIG9yIHVwcGVyY2FzZSBjaGFyYWN0ZXIKICAgICAgIHNlcXVlbmNlICd4bWwnLiI7CiAgICByZWZlcmVuY2UKICAgICAgIlJGQyA2MDIwOiBZQU5HIC0gQSBEYXRhIE1vZGVsaW5nIExhbmd1YWdlIGZvciB0aGUgTmV0d29yawogICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gUHJvdG9jb2wgKE5FVENPTkYpIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiB0eXBlcyByZWxhdGVkIHRvIGRhdGUgYW5kIHRpbWUqKiovCgogIHR5cGVkZWYgZGF0ZS1hbmQtdGltZSB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJ1xkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT8nCiAgICAgICAgICAgICsgJyhafFtcK1wtXVxkezJ9OlxkezJ9KSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGEgcHJvZmlsZSBvZiB0aGUgSVNPIDg2MDEKICAgICAgc3RhbmRhcmQgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKICAgICAgR3JlZ29yaWFuIGNhbGVuZGFyLiAgVGhlIHByb2ZpbGUgaXMgZGVmaW5lZCBieSB0aGUKICAgICAgZGF0ZS10aW1lIHByb2R1Y3Rpb24gaW4gU2VjdGlvbiA1LjYgb2YgUkZDIDMzMzkuCgogICAgICBUaGUgZGF0ZS1hbmQtdGltZSB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGF0ZVRpbWUgWE1MCiAgICAgIHNjaGVtYSB0eXBlIHdpdGggdGhlIGZvbGxvd2luZyBub3RhYmxlIGV4Y2VwdGlvbnM6CgogICAgICAoYSkgVGhlIGRhdGUtYW5kLXRpbWUgdHlwZSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSB5ZWFycy4KCiAgICAgIChiKSBUaGUgZGF0ZS1hbmQtdGltZSB0aW1lLW9mZnNldCAtMDA6MDAgaW5kaWNhdGVzIGFuIHVua25vd24KICAgICAgICAgIHRpbWUgem9uZSAoc2VlIFJGQyAzMzM5KSB3aGlsZSAtMDA6MDAgYW5kICswMDowMCBhbmQgWgogICAgICAgICAgYWxsIHJlcHJlc2VudCB0aGUgc2FtZSB0aW1lIHpvbmUgaW4gZGF0ZVRpbWUuCgogICAgICAoYykgVGhlIGNhbm9uaWNhbCBmb3JtYXQgKHNlZSBiZWxvdykgb2YgZGF0YS1hbmQtdGltZSB2YWx1ZXMKICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgY2Fub25pY2FsIGZvcm1hdCB1c2VkIGJ5IHRoZSBkYXRlVGltZSBYTUwKICAgICAgICAgIHNjaGVtYSB0eXBlLCB3aGljaCByZXF1aXJlcyBhbGwgdGltZXMgdG8gYmUgaW4gVVRDIHVzaW5nCiAgICAgICAgICB0aGUgdGltZS1vZmZzZXQgJ1onLgoKICAgICAgVGhpcyB0eXBlIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBEYXRlQW5kVGltZSB0ZXh0dWFsCiAgICAgIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyIHNpbmNlIFJGQyAzMzM5IHVzZXMgYSBkaWZmZXJlbnQKICAgICAgc2VwYXJhdG9yIGJldHdlZW4gZnVsbC1kYXRlIGFuZCBmdWxsLXRpbWUgYW5kIHByb3ZpZGVzCiAgICAgIGhpZ2hlciByZXNvbHV0aW9uIG9mIHRpbWUtc2VjZnJhYy4KCiAgICAgIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBkYXRlLWFuZC10aW1lIHZhbHVlcyB3aXRoIGEga25vd24gdGltZQogICAgICB6b25lIHVzZXMgYSBudW1lcmljIHRpbWUgem9uZSBvZmZzZXQgdGhhdCBpcyBjYWxjdWxhdGVkIHVzaW5nCiAgICAgIHRoZSBkZXZpY2UncyBjb25maWd1cmVkIGtub3duIG9mZnNldCB0byBVVEMgdGltZS4gIEEgY2hhbmdlIG9mCiAgICAgIHRoZSBkZXZpY2UncyBvZmZzZXQgdG8gVVRDIHRpbWUgd2lsbCBjYXVzZSBkYXRlLWFuZC10aW1lIHZhbHVlcwogICAgICB0byBjaGFuZ2UgYWNjb3JkaW5nbHkuICBTdWNoIGNoYW5nZXMgbWlnaHQgaGFwcGVuIHBlcmlvZGljYWxseQogICAgICBpbiBjYXNlIGEgc2VydmVyIGZvbGxvd3MgYXV0b21hdGljYWxseSBkYXlsaWdodCBzYXZpbmcgdGltZQogICAgICAoRFNUKSB0aW1lIHpvbmUgb2Zmc2V0IGNoYW5nZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IKICAgICAgZGF0ZS1hbmQtdGltZSB2YWx1ZXMgd2l0aCBhbiB1bmtub3duIHRpbWUgem9uZSAodXN1YWxseQogICAgICByZWZlcnJpbmcgdG8gdGhlIG5vdGlvbiBvZiBsb2NhbCB0aW1lKSB1c2VzIHRoZSB0aW1lLW9mZnNldAogICAgICAtMDA6MDAuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMzMzOTogRGF0ZSBhbmQgVGltZSBvbiB0aGUgSW50ZXJuZXQ6IFRpbWVzdGFtcHMKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyCiAgICAgIFhTRC1UWVBFUzogWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbiI7CiAgfQoKICB0eXBlZGVmIHRpbWV0aWNrcyB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uCiAgICAgIlRoZSB0aW1ldGlja3MgdHlwZSByZXByZXNlbnRzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdAogICAgICByZXByZXNlbnRzIHRoZSB0aW1lLCBtb2R1bG8gMl4zMiAoNDI5NDk2NzI5NiBkZWNpbWFsKSwgaW4KICAgICAgaHVuZHJlZHRocyBvZiBhIHNlY29uZCBiZXR3ZWVuIHR3byBlcG9jaHMuICBXaGVuIGEgc2NoZW1hCiAgICAgIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUgZGVzY3JpcHRpb24gb2YKICAgICAgdGhlIHNjaGVtYSBub2RlIGlkZW50aWZpZXMgYm90aCBvZiB0aGUgcmVmZXJlbmNlIGVwb2Nocy4KCiAgICAgIEluIHRoZSB2YWx1ZSBzZXQgYW5kIGl0cyBzZW1hbnRpY3MsIHRoaXMgdHlwZSBpcyBlcXVpdmFsZW50CiAgICAgIHRvIHRoZSBUaW1lVGlja3MgdHlwZSBvZiB0aGUgU01JdjIuIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgMjU3ODogU3RydWN0dXJlIG9mIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gVmVyc2lvbiAyCiAgICAgICAgICAgICAgICAoU01JdjIpIjsKICB9CgogIHR5cGVkZWYgdGltZXN0YW1wIHsKICAgIHR5cGUgeWFuZzp0aW1ldGlja3M7CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgdGltZXN0YW1wIHR5cGUgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYW4gYXNzb2NpYXRlZAogICAgICB0aW1ldGlja3Mgc2NoZW1hIG5vZGUgYXQgd2hpY2ggYSBzcGVjaWZpYyBvY2N1cnJlbmNlCiAgICAgIGhhcHBlbmVkLiAgVGhlIHNwZWNpZmljIG9jY3VycmVuY2UgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgZGVmaW5lZCB1c2luZyB0aGlzIHR5cGUuICBXaGVuCiAgICAgIHRoZSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9jY3VycmVkIHByaW9yIHRvIHRoZSBsYXN0IHRpbWUgdGhlCiAgICAgIGFzc29jaWF0ZWQgdGltZXRpY2tzIGF0dHJpYnV0ZSB3YXMgemVybywgdGhlbiB0aGUgdGltZXN0YW1wCiAgICAgIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhbGwgdGltZXN0YW1wIHZhbHVlcwogICAgICB0byBiZSByZXNldCB0byB6ZXJvIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIHRpbWV0aWNrcwogICAgICBhdHRyaWJ1dGUgcmVhY2hlcyA0OTcrIGRheXMgYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvLgoKICAgICAgVGhlIGFzc29jaWF0ZWQgdGltZXRpY2tzIHNjaGVtYSBub2RlIG11c3QgYmUgc3BlY2lmaWVkCiAgICAgIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBhbnkgc2NoZW1hIG5vZGUgdXNpbmcgdGhpcyB0eXBlLgoKICAgICAgSW4gdGhlIHZhbHVlIHNldCBhbmQgaXRzIHNlbWFudGljcywgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQKICAgICAgdG8gdGhlIFRpbWVTdGFtcCB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBnZW5lcmljIGFkZHJlc3MgdHlwZXMgKioqLwoKICB0eXBlZGVmIHBoeXMtYWRkcmVzcyB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4gJyhbMC05YS1mQS1GXXsyfSg6WzAtOWEtZkEtRl17Mn0pKik/JzsKICAgIH0KCiAgICBkZXNjcmlwdGlvbgogICAgICJSZXByZXNlbnRzIG1lZGlhLSBvciBwaHlzaWNhbC1sZXZlbCBhZGRyZXNzZXMgcmVwcmVzZW50ZWQKICAgICAgYXMgYSBzZXF1ZW5jZSBvY3RldHMsIGVhY2ggb2N0ZXQgcmVwcmVzZW50ZWQgYnkgdHdvIGhleGFkZWNpbWFsCiAgICAgIG51bWJlcnMuICBPY3RldHMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGUgY2Fub25pY2FsCiAgICAgIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgUGh5c0FkZHJlc3MgdGV4dHVhbCBjb252ZW50aW9uIG9mIHRoZSBTTUl2Mi4iOwogICAgcmVmZXJlbmNlCiAgICAgIlJGQyAyNTc5OiBUZXh0dWFsIENvbnZlbnRpb25zIGZvciBTTUl2MiI7CiAgfQoKICB0eXBlZGVmIG1hYy1hZGRyZXNzIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnWzAtOWEtZkEtRl17Mn0oOlswLTlhLWZBLUZdezJ9KXs1fSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJUaGUgbWFjLWFkZHJlc3MgdHlwZSByZXByZXNlbnRzIGFuIElFRUUgODAyIE1BQyBhZGRyZXNzLgogICAgICBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVzZXMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuCgogICAgICBJbiB0aGUgdmFsdWUgc2V0IGFuZCBpdHMgc2VtYW50aWNzLCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAogICAgICB0byB0aGUgTWFjQWRkcmVzcyB0ZXh0dWFsIGNvbnZlbnRpb24gb2YgdGhlIFNNSXYyLiI7CiAgICByZWZlcmVuY2UKICAgICAiSUVFRSA4MDI6IElFRUUgU3RhbmRhcmQgZm9yIExvY2FsIGFuZCBNZXRyb3BvbGl0YW4gQXJlYQogICAgICAgICAgICAgICAgTmV0d29ya3M6IE92ZXJ2aWV3IGFuZCBBcmNoaXRlY3R1cmUKICAgICAgUkZDIDI1Nzk6IFRleHR1YWwgQ29udmVudGlvbnMgZm9yIFNNSXYyIjsKICB9CgogIC8qKiogY29sbGVjdGlvbiBvZiBYTUwtc3BlY2lmaWMgdHlwZXMgKioqLwoKICB0eXBlZGVmIHhwYXRoMS4wIHsKICAgIHR5cGUgc3RyaW5nOwogICAgZGVzY3JpcHRpb24KICAgICAiVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gWFBBVEggMS4wIGV4cHJlc3Npb24uCgogICAgICBXaGVuIGEgc2NoZW1hIG5vZGUgaXMgZGVmaW5lZCB0aGF0IHVzZXMgdGhpcyB0eXBlLCB0aGUKICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHNjaGVtYSBub2RlIE1VU1Qgc3BlY2lmeSB0aGUgWFBhdGgKICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgWFBhdGggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIjsKICAgIHJlZmVyZW5jZQogICAgICJYUEFUSDogWE1MIFBhdGggTGFuZ3VhZ2UgKFhQYXRoKSBWZXJzaW9uIDEuMCI7CiAgfQoKICAvKioqIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIHR5cGVzICoqKi8KCiAgdHlwZWRlZiBoZXgtc3RyaW5nIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnKFswLTlhLWZBLUZdezJ9KDpbMC05YS1mQS1GXXsyfSkqKT8nOwogICAgfQogICAgZGVzY3JpcHRpb24KICAgICAiQSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBvY3RldHMgcmVwcmVzZW50ZWQgYXMgaGV4IGRpZ2l0cwogICAgICBzZXBhcmF0ZWQgYnkgY29sb25zLiAgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzCiAgICAgIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLiI7CiAgfQoKICB0eXBlZGVmIHV1aWQgewogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS0nCiAgICAgICAgICAgICsgJ1swLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICJBIFVuaXZlcnNhbGx5IFVuaXF1ZSBJRGVudGlmaWVyIGluIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgZGVmaW5lZCBpbiBSRkMgNDEyMi4gIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdXNlcwogICAgICBsb3dlcmNhc2UgY2hhcmFjdGVycy4KCiAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIFVVSUQgaW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uOgogICAgICBmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYKICAgICAgIjsKICAgIHJlZmVyZW5jZQogICAgICJSRkMgNDEyMjogQSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOCiAgICAgICAgICAgICAgICBOYW1lc3BhY2UiOwogIH0KCiAgdHlwZWRlZiBkb3R0ZWQtcXVhZCB7CiAgICB0eXBlIHN0cmluZyB7CiAgICAgIHBhdHRlcm4KICAgICAgICAnKChbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pXC4pezN9JwogICAgICArICcoWzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSc7CiAgICB9CiAgICBkZXNjcmlwdGlvbgogICAgICAiQW4gdW5zaWduZWQgMzItYml0IG51bWJlciBleHByZXNzZWQgaW4gdGhlIGRvdHRlZC1xdWFkCiAgICAgICBub3RhdGlvbiwgaS5lLiwgZm91ciBvY3RldHMgd3JpdHRlbiBhcyBkZWNpbWFsIG51bWJlcnMKICAgICAgIGFuZCBzZXBhcmF0ZWQgd2l0aCB0aGUgJy4nIChmdWxsIHN0b3ApIGNoYXJhY3Rlci4iOwogIH0KfQo=
+o-ran-smo-teiv-cloud   urn:o-ran:smo-teiv-cloud        CLOUD   []      2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jbG91ZCI7CiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgICAgICBSQU4gQ0xPVUQgZG9tYWluLCB3aGljaCBjb21wcmlzZXMgY2xvdWQgaW5mcmFzdHJ1Y3R1cmUgYW5kCiAgICAgICAgZGVwbG95bWVudCBhc3BlY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgICAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5ncywgT3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycCBvciBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwCiAgICAgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdG9wb2xvZ3kgb2JqZWN0cy4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOwoKICAgIGxpc3QgQ2xvdWRpZmllZE5GIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBSQU4gTmV0d29yayBGdW5jdGlvbiBzb2Z0d2FyZSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBPLUNsb3VkIHZpYSBvbmUgb3IgbW9yZSBORiBEZXBsb3ltZW50cy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWRpZmllZCBORiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5GRGVwbG95bWVudCB7CiAgICAgICAgZGVzY3JpcHRpb24gIkEgc29mdHdhcmUgZGVwbG95bWVudCBvbiBPLUNsb3VkIHJlc291cmNlcyB0aGF0IHJlYWxpemVzLCBhbGwgb3IgcGFydCBvZiwgYSBDbG91ZGlmaWVkIE5GLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBORiBEZXBsb3ltZW50IjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkTmFtZXNwYWNlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiT0Nsb3VkTmFtZXNwYWNlIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGlzb2xhdGluZwogICAgICAgIGdyb3VwcyBvZiByZXNvdXJjZXMgd2l0aGluIGEgc2luZ2xlIGNsdXN0ZXIuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBuYW1lIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIE5hbWVzcGFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5vZGVDbHVzdGVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQSBOb2RlQ2x1c3RlciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBOb2Rlcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgTm9kZSBDbHVzdGVyIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT0Nsb3VkU2l0ZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgdGhlIGluZnJhc3RydWN0dXJlIHRoYXQKICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIG5hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgQ2xvdWQgU2l0ZSI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBDTE9VRElGSUVETkZfQ09NUFJJU0VTX05GREVQTE9ZTUVOVCB7IC8vIDEgdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGNvbXByaXNlZC1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBjb21wcmlzZXMgb2YgdGhlc2UgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQ2xvdWRpZmllZE5GOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1pbi1lbGVtZW50cyAxOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBjb21wcmlzZWQtYnktY2xvdWRpZmllZE5GIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgcGFydCBvZiBDbG91ZGlmaWVkIE5GLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX0RFUExPWUVEX09OX09DTE9VRE5BTUVTUEFDRSB7IC8vIDEuLm4gdG8gMS4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9uLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IGRlcGxveWVkIG9uIE8tQ2xvdWQgTmFtZXNwYWNlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgZGVwbG95ZWQtbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk9DbG91ZCBOYW1lc3BhY2UgZGVwbG95cyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBPQ2xvdWROYW1lc3BhY2U7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NMT1VETkFNRVNQQUNFX0RFUExPWUVEX09OX05PREVDTFVTVEVSIHsgLy8gMS4ubiB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLW9uLW5vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgTmFtZXNwYWNlIGRlcGxveWVkIG9uIE5vZGUgQ2x1c3Rlci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgT0Nsb3VkTmFtZXNwYWNlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGRlcGxveWVkLW9jbG91ZE5hbWVzcGFjZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb2RlIENsdXN0ZXIgZGVwbG95cyBPLUNsb3VkIE5hbWVzcGFjZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTk9ERUNMVVNURVJfTE9DQVRFRF9BVF9PQ0xPVURTSVRFIHsgLy8gMS4ubiB0byAxLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRlZC1hdC1vY2xvdWRTaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5vZGUgQ2x1c3RlciBsb2NhdGVkIGF0IE8tQ2xvdWQgU2l0ZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTm9kZUNsdXN0ZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgbG9jYXRpb24tb2Ytb25vZGVDbHVzdGVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ2xvdWQgU2l0ZSBpcyBsb2NhdGlvbiBvZiBOb2RlIENsdXN0ZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE9DbG91ZFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgICAgfQogICAgfQp9
+o-ran-smo-teiv-common-yang-extensions  urn:o-ran:smo-teiv-common-yang-extensions       \N      []      2025-02-14      bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsLgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcwoKICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNC0yMDI1IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjUtMDItMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVXBkYXRlcyBmb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwIjsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KICAgICAgICAgICAgQSBiaS1kaXJlY3Rpb25hbC1hc3NvY2lhdGlvbiAoQkRBKSBpcyBhIHJlbGF0aW9uc2hpcCBjb21wcmlzaW5nIG9mCiAgICAgICAgICAgIGFuIGFTaWRlIGFuZCBhIGJTaWRlLiBUaGUgYVNpZGUgaXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwOyB0aGUgYlNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgYVNpZGUgYW5kIGJTaWRlIGlzIG9mCiAgICAgICAgICAgIGltcG9ydGFuY2UgYW5kIE1VU1QgTk9UIGJlIGNoYW5nZWQgb25jZSBkZWZpbmVkLgoKICAgICAgICAgICAgQm90aCBhU2lkZSBhbmQgYlNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgYVNpZGUgYW5kIHRoZSBiU2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzCiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUKICAgICAgICAgICAgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aAogICAgICAgICAgICB0aGUgJ2FTaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiU2lkZScgZXh0ZW5zaW9uLiBPdGhlciBkYXRhIG5vZGVzIGRlZmluZSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgICAgICByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9uc2hpcCBuYW1lCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgbmFtZXNwYWNlIG9mIHRoZSBkZWNsYXJpbmcgbW9kdWxlIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLiI7CiAgICB9CgogICAgZXh0ZW5zaW9uIGFTaWRlIHsKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIGFTaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ2JpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lCiAgICAgICAgICAgIG9mIHRoZSByb2xlIG9mIHRoZSBhU2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIGFTaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZSB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBhU2lkZSByZXNpZGVzLgogICAgICAgICAgICBJZiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZQogICAgICAgICAgICBwcmVmaXhlZCwgYW5kIGEgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlCiAgICAgICAgICAgIHRoZSBwcmVmaXguIjsKICAgIH0KCiAgICBleHRlbnNpb24gYlNpZGUgewogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgYlNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAnYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIGJTaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgYlNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5CiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIGJTaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwogICAgfQoKICAgIGV4dGVuc2lvbiBkb21haW4gewogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgIH0KCiAgICBleHRlbnNpb24gbGFiZWwgewogICAgICAgIGFyZ3VtZW50IHNlbXZlcnNpb247CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYwogICAgICAgICAgICB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzICd4LnkueicgLSBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMKICAgICAgICAgICAgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwogICAgfQp9
+o-ran-smo-teiv-common-yang-types       urn:o-ran:smo-teiv-common-yang-types    \N      []      2025-03-20      bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgaWV0Zi15YW5nLXR5cGVzIHsgcHJlZml4IHlhbmc7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyByZS11c2FibGUgZGF0YSB0eXBlcyB0aGF0IHRvcG9sb2d5IGFuZCBpbnZlbnRvcnkgbW9kZWxzCiAgICB3aWxsIGZyZXF1ZW50bHkgdXNlIGFzIHBhcnQgb2YgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNC0yMDI1IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNS0wMy0yMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJQcm9wb3NlZCBtZXRhZGF0YSwgZGVjb3JhdG9ycyBhbmQgY2xhc3NpZmllcnMiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjEuMTsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNS0wMi0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJSZW5hbWVkIEFkYXB0ZXIgRW50aXR5IHRvIE9yaWdpbiBFbnRpdHkuIEFkZGVkIEdlby1JbmZvcm1hdGlvbiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwLjAwIjsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZSBFbnRpdHkgSW5zdGFuY2UgSWRlbnRpZmllci4iOwogICAgICAgIH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgZW50aXR5LiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUKICAgICAgICAgICAgICAgIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eSdzIGF0dHJpYnV0ZXMuIFRoaXMgaXMgZXhwb3NlZCB0byB0aGUKICAgICAgICAgICAgICAgIGNvbnN1bWVycyBhbmQgY2FuIG9ubHkgYmUgc2V0IGJ5IHRoZSByZXNwb25zaWJsZSBhZGFwdGVyLiBUaGlzCiAgICAgICAgICAgICAgICBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkCiAgICAgICAgICAgICAgICBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwogICAgICAgIH0KICAgIH0KCiAgICBncm91cGluZyBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgc291cmNlSWRzIG9uIGEgdG9wb2xvZ3kgcmVsYXRpb25zaGlwLiI7CgogICAgICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgICAgICB0eXBlIHNvdXJjZUlkOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMjsKICAgICAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlCiAgICAgICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgZGVjbGFyZWQgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgY29uc3VtZXJzIGFuZCBjYW4gb25seSBiZSBzZXQgYnkgdGhlIHJlc3BvbnNpYmxlIGFkYXB0ZXIuIFRoaXMKICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4KICAgICAgICAgICAgICAgIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CiAgICAgICAgfQogICAgfQoKICAgIHR5cGVkZWYgc291cmNlSWQgewogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIGRlc2NyaXB0aW9uICJBbiBpZGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBuYXRpdmUgaWRlbnRpZmllciBvZiBhIHRvcG9sb2d5IGVudGl0eS4iOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBhbiBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIG1ldGFkYXRhLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlycy4KCiAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLAogICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MKICAgICAgICAgICAgYXR0cmlidXRlcy4gVGhpcyBpcyBleHBvc2VkIHRvIHRoZSBjb25zdW1lcnMgYW5kIGNhbiBvbmx5IGJlIHNldCBieQogICAgICAgICAgICBUb3BvbG9neSBhbmQgSW52ZW50b3J5IEV4cG9zdXJlIEhhbmRsaW5nIGFuZCBEaXNjb3ZlcnkgYW5kIFJlY29uY2lsaWF0aW9uIEFkYXB0ZXIuCiAgICAgICAgICAgIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LAogICAgICAgICAgICB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS4iOwoKICAgICAgICBsZWFmIHJlbGlhYmlsaXR5SW5kaWNhdG9yIHsKICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICAgICAgICBlbnVtIE9LIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgaXMgaW4gYWxpZ25tZW50IHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aCwKICAgICAgICAgICAgICAgICAgICBhcyBmYXIgYXMgVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyBpcyBhd2FyZS4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbnVtIFJFU1RPUkVEIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGRhdGEgd2FzIHJlc3RvcmVkIGZyb20gYmFja3VwIGFuZCB0aGUgcmVzcG9uc2libGUKICAgICAgICAgICAgICAgICAgICBhZGFwdGVycyBhcmUgY2hlY2tpbmcgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGN1cnJlbnQuIjsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZW51bSBBRFZJU0VEIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRW50aXR5IGltcGxpY2l0bHkgY3JlYXRlZCBieSBUb3BvbG9neSBhbmQgSW52ZW50b3J5IEV4cG9zdXJlCiAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgYW5kIHBvdGVudGlhbGx5IG5vdCBhbGlnbmVkIHdpdGggdGhlIHNvdXJjZSBvZiB0cnV0aC4iOwogICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxlYWYgZmlyc3REaXNjb3ZlcmVkIHsKICAgICAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIGFuIGluc3RhbmNlIG9mIFRvcG9sb2d5IEVudGl0eSBvciBSZWxhdGlvbgogICAgICAgICAgICB3YXMgZmlyc3QgcmVwcmVzZW50ZWQgaW4gVG9wb2xvZ3kgYW5kIEludmVudG9yeSBFeHBvc3VyZSBIYW5kbGluZyB2aWEgZGlzY292ZXJ5LiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIGxhc3RNb2RpZmllZCB7CiAgICAgICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiBhbiBpbnN0YW5jZSBvZiBUb3BvbG9neSBFbnRpdHkgb3IgUmVsYXRpb24KICAgICAgICAgICAgd2FzIGxhc3QgdXBkYXRlZCAoZXhjbHVkaW5nIGNsYXNzaWZpZXJzIGFuZCBkZWNvcmF0b3JzKS4iOwogICAgICAgIH0KICAgIH0KCiAgICBjb250YWluZXIgZGVjb3JhdG9ycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgZm9yIGFwcGxpY2F0aW9ucyB3aXNoaW5nCiAgICAgICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gZGVjb3JhdG9ycy4gVGhpcyBpcyBkb25lIHZpYSBhdWdtZW50YXRpb25zLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJDb25zdW1lciBkZWZpbmVkIHRhZ3MgdG8gdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9uc2hpcHMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIGlkZW50aXR5cmVmIHsgYmFzZSBjbGFzc2lmaWVyOyB9CiAgICB9CgogICAgaWRlbnRpdHkgY2xhc3NpZmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ==
+o-ran-smo-teiv-equipment       urn:o-ran:smo-teiv-equipment    EQUIPMENT       []      2024-10-21      bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7CiAgICAgICAgcHJlZml4IGdlbzsKICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKICAgIH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJSQU4gRXF1aXBtZW50IHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IFNpdGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBIHNpdGUgaXMgYSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSBhbiBlcXVpcG1lbnQgY2FuIGJlCiAgICAgICAgaW5zdGFsbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgbmFtZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmFtZSBvZiBTaXRlIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9JTlNUQUxMRURfQVRfU0lURSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2l0ZSB0eXBlLgogICAgICAgICAgICBUaGUgU2l0ZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiB3aGVyZSB0aGUgQW50ZW5uYU1vZHVsZSBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIGF0IG9uZSBTaXRlLgogICAgICAgICAgICBBIFNpdGUgaW5zdGFuY2UgY2FuIGhhdmUgbWFueSBpbnN0YWxsZWQgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGluc3RhbGxlZC1hdC1zaXRlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSB3aGVyZSBBbnRlbm5hIE1vZHVsZSBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0=
+o-ran-smo-teiv-oam     urn:o-ran:smo-teiv-oam  OAM     []      2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbSB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtb2FtIjsKICAgIHByZWZpeCBvci10ZWl2LW9hbTsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gTyZNIHRvcG9sb2d5IG1vZGVsLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBSQU4gTyZNIGRvbWFpbiwgd2hpY2ggYXJlIGludGVuZGVkIHRvIHJlcHJlc2VudCBtYW5hZ2VtZW50IHN5c3RlbXMKICAgIGFuZCBtYW5hZ2VtZW50IGludGVyZmFjZXMuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gT0FNOwoKICAgIGxpc3QgTWFuYWdlZEVsZW1lbnQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9
+o-ran-smo-teiv-ran     urn:o-ran:smo-teiv-ran  RAN     []      2025-03-20      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAiUkFOIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICAgICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkKICAgICAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNSBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI1LTAzLTIwIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlByb3Bvc2VkIGVudGl0aWVzLCByZWxhdGlvbnNoaXBzIGFuZCBhdHRyaWJ1dGVzIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMS4xLjE7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjUtMDItMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiUmV2aXNpb24gdG8gcmVuYW1lIGFkYXB0ZXIgZ3JvdXAgdG8gb3JpZ2luIGdyb3VwLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAyLjAwIjsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0xMC0xMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICAgIHJlZmVyZW5jZSAiTy1SQU4uV0cxMC5URSZJVi1ETS4wLVIwMDQtdjAxLjAwIjsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgTy1EVSBpcyBhbiBPLVJBTiBORiBpbiB0aGUgTy1SQU4gQXJjaGl0ZWN0dXJlLiBBbiBPLURVLCBjb21iaW5lZCB3aXRoCiAgICAgICAgb25lIG9yIG1vcmUgTy1SVShzKSBjb25uZWN0ZWQgdG8gaXQsIHN1cHBvcnRzIGFuZCBpcyBmdWxseSBjb21wYXRpYmxlCiAgICAgICAgd2l0aCB0aGUgZnVuY3Rpb25zIG9mIGEgZ05CLURVIGFzIGRlZmluZWQgYnkgM0dQUCBUUyAzOC40MDEuCgogICAgICAgIFRoZSBPLURVIHRlcm1pbmF0ZXMgdGhlIEUyIGFuZCB0aGUgRjEgaW50ZXJmYWNlLCBhbmQgdGhlIE9wZW4gRnJvbnRoYXVsCiAgICAgICAgaW50ZXJmYWNlIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgdGhlIFJMQywgTUFDLCBhbmQKICAgICAgICBIaWdoLVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4KCiAgICAgICAgTm90ZTogTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLURVIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLURVIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAgIElPQyBHTkJEVUZ1bmN0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIE5SIE5STSBtb2RlbCwgYXMgcGVyIDNHUFAgVFMgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKSBhdHRyaWJ1dGVzIjsKCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWwgVW5pdCDigJMgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgTkctYywgWDItYywgWG4tYywgRjEtYywgYW5kIEUxIGludGVyZmFjZXMgYXMKICAgICAgICB3ZWxsIGFzIHRoZSBSUkMgYW5kIFBEQ1AgKGZvciBTUkIpIHByb3RvY29scyB0b3dhcmRzIHRoZSBVRSBhcyBkZWZpbmVkIGJ5CiAgICAgICAgM0dQUCBUUyAzOC40MDEuIFRoZSBPLUNVLUNQIHRlcm1pbmF0ZXMgRTIgaW50ZXJmYWNlIHRvIE5lYXItUlQgUklDIGFuZCBpcwogICAgICAgIG1hbmFnZWQgdmlhIE8xIGludGVyZmFjZSBieSB0aGUgU01PLgoKICAgICAgICBOb3RlOiBPLUNVLUNQIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBPUkFOTmV0d29ya0Z1bmN0aW9uCiAgICAgICAgYWJzdHJhY3QgY2xhc3MuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZQogICAgICAgIE8tQ1UtQ1Agb2JqZWN0LgogICAgICAgICAgICAKICAgICAgICBUaGUgbWFuYWdlbWVudCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIE8tQ1UtQ1AgTy1SQU4gTkYgaXMgcmVwcmVzZW50ZWQgYnkKICAgICAgICB0aGUgSU9DIEdOQkNVQ1BGdW5jdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBOUiBOUk0gbW9kZWwsIGFzIHBlciAzR1BQIFRTCiAgICAgICAgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBDZW50cmFsIFVuaXQg4oCTIENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApIGF0dHJpYnV0ZXMiOwogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTiBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24geyAgICAgICAgCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIFRoZSBPLUNVLVVQIHRlcm1pbmF0ZXMgdGhlIE5HLXUsIFgyLXUsIFhuLXUsIEYxLXUsIGFuZCBFMSBpbnRlcmZhY2VzIGFzCiAgICAgICAgd2VsbCBhcyB0aGUgUERDUCBhbmQgU0RBUCBwcm90b2NvbHMgdG93YXJkcyB0aGUgVUUgYXMgZGVmaW5lZCBieSAzR1BQIFRTCiAgICAgICAgMzguNDAxLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIEUyIGludGVyZmFjZSB0byBOZWFyLVJUIFJJQyBhbmQgaXMgbWFuYWdlZAogICAgICAgIHZpYSBPMSBpbnRlcmZhY2UgYnkgdGhlIFNNTy4KCiAgICAgICAgTm90ZTogTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLUNVLVVQIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLUNVLVVQIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5CiAgICAgICAgdGhlIElPQyBHTkJDVVVQRnVuY3Rpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgTlIgTlJNIG1vZGVsLCBhcyBwZXIgM0dQUCBUUwogICAgICAgIDI4LjU0MSI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gQ2VudHJhbCBVbml0IOKAkyBVc2VyIFBsYW5lIChPLUNVLVVQKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdCBwTE1OSWRMaXN0IHsKICAgICAgICAgICAgICAgIGtleSAibWNjIG1uYyI7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiB1bmlxdWUgaWRlbnRpdGllcyBmb3IgUExNTiI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJOZWFyLVJlYWwtVGltZSBSQU4gSW50ZWxsaWdlbnQgQ29udHJvbGxlciAoTmVhci1SVCBSSUMpLgoKICAgICAgICBOZWFyLVJUIFJJQyBpcyBhbiBPLVJBTiBORiB0aGF0IGVuYWJsZXMgbmVhciByZWFsLXRpbWUgY29udHJvbCBhbmQKICAgICAgICBvcHRpbWl6YXRpb24gb2Ygc2VydmljZXMgYW5kIHJlc291cmNlcyBvZiBFMiBOb2RlcyB2aWEgZmluZS1ncmFpbmVkIGRhdGEKICAgICAgICBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgdGhlIEUyIGludGVyZmFjZSB3aXRoIGNvbnRyb2wgbG9vcHMgaW4gdGhlCiAgICAgICAgb3JkZXIgb2YgMTAgbXMtMXMuIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5lYXJSdFJpY0lkIHsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGlmaWVyIG9mIE5lYXItUlQgUklDIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpCgogICAgICAgIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZSAoYWxzbyBrbm93biBhcyBMTFMKICAgICAgICBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIAogICAgICAgIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4KCiAgICAgICAgVGhlIE8tUlUgdGVybWluYXRlcyB0aGUgT3BlbiBGcm9udGhhdWwgTS1QbGFuZSBpbnRlcmZhY2UgdG93YXJkcyB0aGUgTy1EVQogICAgICAgIGFuZCBTTU8uIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gUmFkaW8gVW5pdCAoTy1SVSkgYXR0cmlidXRlcyI7CiAgICAgICAgICAgIGxlYWYgb3J1SWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiB0aGUgTy1SVSBhcyBkaXNjb3ZlcmVkIGZyb20gdGhlIHNvdXJjZSBkb21haW4gYmFzZWQgb24gTS1QbGFuZSBhcmNoaXRlY3R1cmUgbW9kZWwiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1DVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIFNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbgogICAgICAgIFNpZ25hbCAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kCiAgICAgICAgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItRFUuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBzaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24gc2lnbmFsCiAgICAgICAgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZCBwcm92aWRlCiAgICAgICAgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE5SIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgIGNlbGxzLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIkEgZ3JvdXAgb2YgY28tbG9jYXRlZCBDZWxscyB0aGF0IGhhdmUgYSBzaGFyZWQKICAgICAgICBjb3ZlcmFnZSBhcmVhLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTERVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJDZWxsRFUgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQSBPRFVGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBPRFVGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBEVSBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0RVRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUEZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTENVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxDVSB0eXBlLgogICAgICAgICAgICBUaGUgT0NVQ1BGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBDVS1DUCBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJDZWxsQ1UuCiAgICAgICAgICAgIEEgT0NVQ1BGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbENVLgogICAgICAgICAgICBBbiBOUkNlbGxDVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsQ3UgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBwcm92aWRlcyBOUiBDZWxsLUNVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9jdWNwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1DVSBwcm92aWRlZCBieSBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxDVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUkNFTExEVV9VU0VTX05SU0VDVE9SQ0FSUklFUiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgTlJDZWxsRFUgcmVwcmVzZW50cyB0aGUgY2VsbCB0aGF0IHVzZXMgdGhlIE5SU2VjdG9yQ2Fycmllci4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIHVzZSBtYW55IE5SU2VjdG9yQ2FycmllcnMuCiAgICAgICAgICAgIEFuIE5SU2VjdG9yQ2FycmllciBpbnN0YW5jZSBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSBOUkNlbGxEVS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SQ2VsbERVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlZCBieSBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eSB0eXBlLgogICAgICAgICAgICBUaGUgTlJTZWN0b3JDYXJyaWVyIHJlcHJlc2VudHMgdGhlIGNhcnJpZXIgdGhhdCB1c2VzIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiB1c2Ugb25seSBvbmUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSB1c2VkIGJ5IG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTZWN0b3IgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEEgU2VjdG9yIGluc3RhbmNlIGNhbiBncm91cCBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0=
+o-ran-smo-teiv-rel-cloud-ran   urn:o-ran:smo-teiv-rel-cloud-ran        REL_CLOUD_RAN   ["o-ran-smo-teiv-cloud", "o-ran-smo-teiv-ran"]  2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1jbG91ZC1yYW4gewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1jbG91ZC1yYW4iOwogICAgcHJlZml4IG9yLXRlaXYtY2xvdWR0b3JhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBDbG91ZCB0byBSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4KCiAgICAgICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIENsb3VkIHRvIFJBTiBMb2dpY2FsIHRvcG9sb2d5IHJlbGF0aW9ucy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7CiAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIjsKCiAgICByZXZpc2lvbiAiMjAyNC0xMC0wNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJBZGRlZCBncm91cGluZywgT3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycCB0byB0aGUgdG9wb2xvZ3kgb2JqZWN0LiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDctMTUiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyByZXZpc2lvbiBhbGlnbnMgTy1SQU4gV29yayBHcm91cCAxMCBTdGFnZSAyIFNwZWNpZmljYXRpb24gKE8tUkFOLldHMTAuVEUmSVYtQ0lNSS4wLVIwMDQudjAyLjAwKSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0NMT1VEX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfT0RVRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORkRFUExPWU1FTlRfU0VSVkVTX09DVUNQRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctbkZEZXBsb3ltZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5GIERlcGxveW1lbnQgdGhhdCBzZXJ2ZXMgdGhpcyBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19PQ1VVUEZVTkNUSU9OIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtb2N1dXBGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIHNlcnZpY2VkIGJ5IHRoaXMgTkYgRGVwbG95bWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1jbG91ZDpORkRlcGxveW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5GREVQTE9ZTUVOVF9TRVJWRVNfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyUlRSSUNGdW5jdGlvbiBzZXJ2aWNlZCBieSB0aGlzIE5GIERlcGxveW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtY2xvdWQ6TkZEZXBsb3ltZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1uRkRlcGxveW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTkYgRGVwbG95bWVudCB0aGF0IHNlcnZlcyB0aGlzIE5lYXJSVFJJQ0Z1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOZWFyUlRSSUNGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ==
+o-ran-smo-teiv-rel-equipment-ran       urn:o-ran:smo-teiv-rel-equipment-ran    REL_EQUIPMENT_RAN       ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"]      2024-10-08      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAKICAgICJSQU4gRXF1aXBtZW50IHRvIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgUkFOIEVxdWlwbWVudCB0byBMb2dpY2FsIHRvcG9sb2d5CiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgogICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFkZGVkIG5ldyByZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfTlJDRUxMRFUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYUNhcGFiaWxpdHkgdHlwZS4KICAgICAgICAgICAgVGhlIEFudGVubmFNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYW50ZW5uYSB0aGF0IHNlcnZlcyB0aGUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHNlcnZlIG1hbnkgQW50ZW5uYUNhcGFiaWxpdGllcy4KICAgICAgICAgICAgQW4gQW50ZW5uYUNhcGFiaWxpdHkgaW5zdGFuY2UgY2FuIGJlIHNlcnZlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwOkFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX05SQ0VMTERVIHsgLy8gMS4ubiB0byAwLi5tCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFudGVubmFNb2R1bGUgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgc2VydmVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQW4gQW50ZW5uYU1vZHVsZSBpbnN0YW5jZSBjYW4gc2VydmUgbWFueSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEFuIE5SQ2VsbERVIGluc3RhbmNlIGNhbiBiZSBzZXJ2ZWQgYnkgbWFueSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpOUkNlbGxEVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBTRUNUT1JfR1JPVVBTX0FOVEVOTkFNT0RVTEUgeyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU2VjdG9yIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBBbnRlbm5hTW9kdWxlcy4KICAgICAgICAgICAgQSBTZWN0b3IgaW5zdGFuY2UgY2FuIGdyb3VwIG1hbnkgQW50ZW5uYU1vZHVsZXMuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZWN0b3IgZ3JvdXBzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZ3JvdXBlZCBieSBTZWN0b3IuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ==
+o-ran-smo-teiv-rel-oam-cloud   urn:o-ran:smo-teiv-rel-oam-cloud        REL_OAM_CLOUD   ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-cloud"]  2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tY2xvdWQgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tY2xvdWQiOwogICAgcHJlZml4IG9yLXRlaXYtb2FtdG9jbG91ZDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtb2FtIHtwcmVmaXggb3ItdGVpdi1vYW07IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY2xvdWQge3ByZWZpeCBvci10ZWl2LWNsb3VkOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIFJBTiBPJk0gdG8gQ2xvdWQgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA3LTE1IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gYWxpZ25zIE8tUkFOIFdvcmsgR3JvdXAgMTAgU3RhZ2UgMiBTcGVjaWZpY2F0aW9uIChPLVJBTi5XRzEwLlRFJklWLUNJTUkuMC1SMDA0LnYwMi4wMCkiOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjQuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fQ0xPVUQ7CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9ERVBMT1lFRF9BU19DTE9VRElGSUVETkYgeyAgLy8gMC4uMSB0byAxCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGRlcGxveWVkLWFzLWNsb3VkaWZpZWRORiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgZGVwbG95ZWQgYXMgQ2xvdWRpZmllZCBORi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZGVwbG95ZWQtbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2xvdWRpZmllZCBORiBkZXBsb3lzIE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1jbG91ZDpDbG91ZGlmaWVkTkY7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTkZERVBMT1lNRU5UX1NFUlZFU19NQU5BR0VERUxFTUVOVCB7IC8vIDEuLm4gdG8gMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBzZXJ2aWNlZC1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgc2VydmljZWQgYnkgdGhpcyBORiBEZXBsb3ltZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWNsb3VkOk5GRGVwbG95bWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aW5nLW5GRGVwbG95bWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJORiBEZXBsb3ltZW50IHRoYXQgc2VydmVzIHRoaXMgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LW9hbTpNYW5hZ2VkRWxlbWVudDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtaW4tZWxlbWVudHMgMTsKICAgICAgICB9CiAgICB9Cn0=
+o-ran-smo-teiv-rel-oam-ran     urn:o-ran:smo-teiv-rel-oam-ran  REL_OAM_RAN     ["o-ran-smo-teiv-oam", "o-ran-smo-teiv-ran"]    2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtb2FtLXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtb2FtcmFuOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LW9hbSB7IHByZWZpeCBvci10ZWl2LW9hbTsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4geyBwcmVmaXggb3ItdGVpdi1yYW47IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiUkFOIE8mTSB0byBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgICAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTyZNIHRvIExvZ2ljYWwgdG9wb2xvZ3kgcmVsYXRpb25zCgogICAgICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOwogICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsCiAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKICAgICAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmcsIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAgdG8gdGhlIHRvcG9sb2d5IG9iamVjdC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjUuMDsKICAgIH0KCiAgICByZXZpc2lvbiAiMjAyNC0wNy0xNSIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIHJldmlzaW9uIGFsaWducyBPLVJBTiBXb3JrIEdyb3VwIDEwIFN0YWdlIDIgU3BlY2lmaWNhdGlvbiAoTy1SQU4uV0cxMC5URSZJVi1DSU1JLjAtUjAwNC52MDIuMDApIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PRFVGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0RVRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9EVUZ1bmN0aW9ucy4KICAgICAgICAgICAgQW4gT0RVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19PQ1VDUEZVTkNUSU9OIHsgICAgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE1hbmFnZWRFbGVtZW50IHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE9DVUNQRnVuY3Rpb25zLgogICAgICAgICAgICBBbiBPQ1VDUEZ1bmN0aW9uIGluc3RhbmNlIG11c3QgYmUgbWFuYWdlZCBieSBvbmUgTWFuYWdlZEVsZW1lbnQuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgbWFuYWdlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tQ1UtQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBNQU5BR0VERUxFTUVOVF9NQU5BR0VTX09DVVVQRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgT0NVVVBGdW5jdGlvbi4KICAgICAgICAgICAgQSBNYW5hZ2VkRWxlbWVudCBpbnN0YW5jZSBjYW4gbWFuYWdlIG1hbnkgT0NVVVBGdW5jdGlvbnMuCiAgICAgICAgICAgIEFuIE9DVVVQRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1vYW06TWFuYWdlZEVsZW1lbnQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgbWFuYWdlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIG1hbmFnZWQgYnkgTWFuYWdlZCBFbGVtZW50LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VVUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE1BTkFHRURFTEVNRU5UX01BTkFHRVNfT1JVRlVOQ1RJT04geyAgICAvLyAxIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTWFuYWdlZEVsZW1lbnQgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgTWFuYWdlZEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0IG1hbmFnZXMgdGhlIE9SVUZ1bmN0aW9uLgogICAgICAgICAgICBBIE1hbmFnZWRFbGVtZW50IGluc3RhbmNlIGNhbiBtYW5hZ2UgbWFueSBPUlVGdW5jdGlvbi4KICAgICAgICAgICAgQW4gT1JVRnVuY3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtYW5hZ2VkIGJ5IG9uZSBNYW5hZ2VkRWxlbWVudC4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBtYW5hZ2VkLW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZWQgRWxlbWVudCBtYW5hZ2VzIE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRfTUFOQUdFU19ORUFSUlRSSUNGVU5DVElPTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBNYW5hZ2VkRWxlbWVudCB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBNYW5hZ2VkRWxlbWVudCByZXByZXNlbnRzIHRoZSBub2RlIHRoYXQgbWFuYWdlcyB0aGUgTmVhclJUUklDRnVuY3Rpb24uCiAgICAgICAgICAgIEEgTWFuYWdlZEVsZW1lbnQgaW5zdGFuY2UgY2FuIG1hbmFnZSBtYW55IE5lYXJSVFJJQ0Z1bmN0aW9uLgogICAgICAgICAgICBBbiBOZWFyUlRSSUNGdW5jdGlvbiBpbnN0YW5jZSBtdXN0IGJlIG1hbmFnZWQgYnkgb25lIE1hbmFnZWRFbGVtZW50LgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlZCBFbGVtZW50IG1hbmFnZXMgTmVhciBSVCBSSUMgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtOk1hbmFnZWRFbGVtZW50OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIG1hbmFnZWQtYnktbWFuYWdlZEVsZW1lbnQgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbWFuYWdlZCBieSBNYW5hZ2VkIEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ==
+o-ran-smo-teiv-equipment-test  urn:o-ran:smo-teiv-equipment-test       EQUIPMENT       []      2024-10-21      bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1lcXVpcG1lbnQtdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1lcXVpcC10ZXN0OwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IEVxdWlwbWVudCB0b3BvbG9neSBtb2RlbCI7CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMjEiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiRGVwcmVjYXRlIEFudGVubmFNb2R1bGUgYXR0cmlidXRlIGFudGVubmFCZWFtV2lkdGguCiAgICAgICAgVG8gYmUgcmVwbGFjZWQgYnkgaG9yaXpvbnRhbEJlYW1XaWR0aCBhbmQgdmVydGljYWxCZWFtV2lkdGguIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC42LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDgiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXppbXV0aCBhdHRyaWJ1dGUgZm9yIEFudGVubmFNb2R1bGUuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3RzLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuNC4wOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgYW50ZW5uYS4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGFudGVubmFNb2RlbE51bWJlciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwgaWRlbnRpZmllci4gVGhpcwogICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgZml4ZWQgYW50ZW5uYSB0aWx0IG9mIHRoZSBpbnN0YWxsYXRpb24sIGRlZmluZWQKICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4gVGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5IHRoZSBSZW1vdGUgRWxlY3RyaWNhbAogICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgIGF4aXMgKHNlZSAzR1BQIFRTIDI1LjQ2NikuIFZhbHVlIGlzIHNpZ25lZDsgdGlsdCBkb3duIGlzCiAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICBkZWdyZWVzLgoKICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQ6IFNpbmNlIDI0LlE0LiBSZXBsYWNlZCBieSBBbnRlbm5hTW9kdWxlOjpob3Jpem9udGFsQmVhbVdpZHRoCiAgICAgICAgICAgICAgICBhbmQgQW50ZW5uYU1vZHVsZTo6dmVydGljYWxCZWFtV2lkdGguIFBsYW5uZWQgdG8gYmUgcmVtb3ZlZC4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgaG9yaXpvbnRhbEJlYW1XaWR0aCAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHZlcnRpY2FsQmVhbVdpZHRoICAgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIHZlcnRpY2FsIHBsYW5lLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhemltdXRoIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgdmFsdWUgb2YgdGhlIGF6aW11dGggb2YgdGhlIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgIjAuLjM2MCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXNlcyBnZW86Z2VvLWxvY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVFRUVFRUVFRUVFRV9SRUFMSVNFRF9CWV9BTlRFTk5BTU9EVUxFRUVFRUVFRUVFRUVFRUUgewoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgcmVhbGlzZWQgYnkgdGhlIEFudGVubmFNb2R1bGUuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIHJlYWxpc2VkIG9uZSBBbnRlbm5hTW9kdWxlLgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBiZSByZWFsaXNlZCBieSBtYW55IEFudGVubmFNb2R1bGVzLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZWQgYnkgbWFueSBBbnRlbm5hIE1vZHVsZXMuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXAtdGVzdDpBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzaW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzaW5nIHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtZXF1aXAtdGVzdDpBbnRlbm5hTW9kdWxlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRUVFRUVFRUVFRUVFX0RFUExPWUVEX09OX0FOVEVOTkFNT0RVTEVFRUVFRUVFRUVFRUVFRSB7IC8vIDEuLm4gdG8gMC4ubQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hTW9kdWxlIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQW50ZW5uYU1vZHVsZSB0eXBlLgogICAgICAgICAgICBUaGUgQW50ZW5uYU1vZHVsZSByZXByZXNlbnRzIHRoZSBwaHlzaWNhbCBhbnRlbm5hIHRoYXQgZGV2ZWxvcGVkIG9uIHRoZSBBbnRlbm5hTW9kdWxlLgogICAgICAgICAgICBBbiBBbnRlbm5hTW9kdWxlIGluc3RhbmNlIGNhbiBkZXZlbG9wZWQgb25lIEFudGVubmFNb2R1bGUuCiAgICAgICAgICAgIEFuIEFudGVubmFNb2R1bGUgaW5zdGFuY2UgY2FuIGJlIGRldmVsb3BlZCBvbiBvbmUgQW50ZW5uYU1vZHVsZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBkZXZlbG9wZWQtb24tYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBkZXZlbG9wZWQgb24gdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcC10ZXN0OkFudGVubmFNb2R1bGVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBkZXZlbG9waW5nLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgZGV2ZWxvcGluZyB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LWVxdWlwLXRlc3Q6QW50ZW5uYU1vZHVsZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ==
+o-ran-smo-teiv-oam-test        urn:o-ran:smo-teiv-oam-test     OAM     []      2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LW9hbS10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1vYW0tdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1vYW0tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IE8mTSB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5nLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIE9BTTsKCiAgICBsaXN0IE1hbmFnZWRFbGVtZW50dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQgewogICAgICAgIGRlc2NyaXB0aW9uICJBIE1hbmFnZWQgRWxlbWVudCAoTUUpIGlzIGEgbm9kZSBpbnRvIGEgdGVsZWNvbW11bmljYXRpb24KICAgICAgICBuZXR3b3JrIHByb3ZpZGluZyBzdXBwb3J0IGFuZC9vciBzZXJ2aWNlIHRvIHN1YnNjcmliZXJzLiBBbiBNRQogICAgICAgIGNvbW11bmljYXRlcyB3aXRoIGEgbWFuYWdlciBhcHBsaWNhdGlvbiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkKICAgICAgICBvdmVyIG9uZSBvciBtb3JlIGludGVyZmFjZXMgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIG1vbml0b3JlZAogICAgICAgIGFuZC9vciBjb250cm9sbGVkLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgfQp9
+o-ran-smo-teiv-ran-test        urn:o-ran:smo-teiv-ran-test     RAN     []      2024-10-08      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbi10ZXN0IHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yYW4tdGVzdCI7CiAgICBwcmVmaXggb3ItdGVpdi1yYW4tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJUaGVzZSBhcmUganVzdCB0ZXN0IFJBTiB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIHJhbmdlIGZvciBhemltdXRoIGF0dHJpYnV0ZSBvZiBTZWN0b3IuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC41LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMDQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQWRkZWQgZ3JvdXBpbmdzLCBPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwIG9yIE9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnAKICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IE9EVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCIERpc3RyaWJ1dGVkIFVuaXQgKGdOQi1EVSkuCgogICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQgKGdOQi1DVSkgYW5kIGEgZ05CLURVLgogICAgICAgIFRoZSBDVSBwcm9jZXNzZXMgbm9uLXJlYWwgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVCiAgICAgICAgcHJvY2Vzc2VzIFBIWSBsZXZlbCBwcm90b2NvbCBhbmQgcmVhbCB0aW1lIHNlcnZpY2VzLiBUaGUgZ05CLUNVIGFuZAogICAgICAgIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEgRjEgbG9naWNhbCBpbnRlcmZhY2UuCgogICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBmb3IgYSBnTkItRFU6CiAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQyBpbnRlcmZhY2UuIElzCiAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMKICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICBtdWx0aXBsZSBnTkItQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lIGdOQi1DVS1DUC4KCiAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4KICAgICAgICBub2RlIG9iamVjdC4gSW4gVG9wb2xvZ3ksIHlvdSBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUKICAgICAgICB0aGUgZ05CLURVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBjb250YWluZXIgZFVwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB1c2VkIGFzIHBhcnQgb2YgUE0gRXZlbnRzIGRhdGEiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQkRVSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIGxpc3QgTlJDZWxsRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSAgewogICAgICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIGFuIE5SIENlbGwgaW4gZ05vZGVCLURVLgoKICAgICAgICA1RyBOUiBpcyBhIG5ldyByYWRpbyBhY2Nlc3MgdGVjaG5vbG9neSAoUkFUKSBkZXZlbG9wZWQgYnkgM0dQUCBmb3IKICAgICAgICB0aGUgNUcgKGZpZnRoIGdlbmVyYXRpb24pIG1vYmlsZSBuZXR3b3JrLiBJdCBpcyBkZXNpZ25lZCB0byBiZSB0aGUKICAgICAgICBnbG9iYWwgc3RhbmRhcmQgZm9yIHRoZSBhaXIgaW50ZXJmYWNlIG9mIDVHIG5ldHdvcmtzLgoKICAgICAgICA1RyBOUiBoYXMgc3luY2hyb25pemF0aW9uIHNpZ25hbCB0aGF0IGlzIGtub3duIGFzIFByaW1hcnkKICAgICAgICBTeW5jaHJvbml6YXRpb24gc2lnbmFsIChQU1MpIGFuZCBTZWNvbmRhcnkgU3luY2hyb25pemF0aW9uIHNpZ25hbAogICAgICAgIChTU1MpLiBUaGVzZSBzaWduYWxzIGFyZSBzcGVjaWZpYyB0byBOUiBwaHlzaWNhbCBsYXllciBhbmQgcHJvdmlkZQogICAgICAgIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgVUUgZm9yIGRvd25saW5rCiAgICAgICAgc3luY2hyb25pemF0aW9uOiBQU1MgcHJvdmlkZXMgUmFkaW8gRnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mIDFzdAogICAgICAgIFN5bWJvbCBpbiBhIFJhZGlvIGZyYW1lKSBTU1MgcHJvdmlkZXMgU3ViZnJhbWUgQm91bmRhcnkgKFBvc2l0aW9uIG9mCiAgICAgICAgMXN0IFN5bWJvbCBpbiBhIFN1YmZyYW1lKSBQaHlzaWNhbCBMYXllciBDZWxsIElEIChQQ0kpIGluZm9ybWF0aW9uCiAgICAgICAgdXNpbmcgYm90aCBQU1MgYW5kIFNTUy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVzZWQgdG9nZXRoZXIgd2l0aCBnTm9kZUIgaWRlbnRpZmllciB0byBpZGVudGlmeSBOUgogICAgICAgICAgICAgICAgY2VsbCBpbiBQTE1OLiBVc2VkIHRvZ2V0aGVyIHdpdGggZ05CSWQgdG8gZm9ybSBOQ0kuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbkNJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsIElkZW50aXR5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SUENJIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgUGh5c2ljYWwgQ2VsbCBJZGVudGl0eSAoUENJKSBvZiB0aGUgTlIgY2VsbC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuUlRBQyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgVHJhY2tpbmcgQXJlYSBDb2RlIChUQUMpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICBlcXVpcG1lbnQgdXNlZCB0byBwcm92aWRlIGNvdmVyYWdlIGluIGEgY2VydGFpbiBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTFRFU2VjdG9yQ2FycmllcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIExURSBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbgogICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IKICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvckNhcnJpZXJUeXBlIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNlY3RvciBjYXJyaWVyCiAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsKICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgICAgIGVudW0gbm9ybWFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb3QgYSBkaWdpdGFsIHNlY3RvciI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIG1pZGRsZV9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OTk5OTk5OTk5OTk5OTk5OTl9QUk9WSURFU19OUkNFTExEVVVVVVVVVVVVVVVVVVVVVVVVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZ05vZGVCLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWduYmR1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBwcm92aWRlZCBieSBnTm9kZUItRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SQ2VsbERVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUlJSUlJSUlJSUlJSUlJSUlJSUlJSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFlZWVlZWVlZWVlZWVlZWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9
+o-ran-smo-teiv-rel-equipment-ran-test  urn:o-ran:smo-teiv-rel-equipment-ran    REL_EQUIPMENT_RAN       ["o-ran-smo-teiv-equipment-test", "o-ran-smo-teiv-ran-test"]    2024-05-24      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuLXRlc3QgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJlbC1lcXVpcHJhbi10ZXN0OwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10ZXN0IHsgcHJlZml4IG9yLXRlaXYtZXF1aXAtdGVzdDsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1yYW4tdGVzdCB7IHByZWZpeCBvci10ZWl2LXJhbi10ZXN0OyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIlRoZXNlIGFyZSBqdXN0IHRlc3QgRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkVMX0VRVUlQTUVOVF9SQU47CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFRUVFRUVFRUVFRUVFRUVFRUVFRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFlZWVlZWVlZWVlZWVlZWVlZWSB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LWVxdWlwLXRlc3Q6QW50ZW5uYU1vZHVsZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuLXRlc3Q6QW50ZW5uYUNhcGFiaWxpdHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9
+o-ran-smo-teiv-rel-oam-ran-test        urn:o-ran:smo-teiv-rel-oam-ran-test     REL_OAM_RAN     ["o-ran-smo-teiv-oam-test", "o-ran-smo-teiv-ran-test"]  2024-10-04      bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1vYW0tcmFuLXRlc3QgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXJlbC1vYW0tcmFuLXRlc3QiOwogICAgcHJlZml4IG9yLXRlaXYtcmVsLW9hbS1yYW4tdGVzdDsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1vYW0tdGVzdCB7IHByZWZpeCBvci10ZWl2LW9hbS10ZXN0OyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbi10ZXN0IHsgcHJlZml4IG9yLXRlaXYtcmFuLXRlc3Q7IH0KCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICAgICAiVGhlc2UgYXJlIGp1c3QgdGVzdCBPJk0gYW5kIFJBTiB0b3BvbG9neSByZWxhdGlvbiBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTEwLTA0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFkZGVkIGdyb3VwaW5nLCBPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwIHRvIHRoZSB0b3BvbG9neSBvYmplY3QuIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC40LjA7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9PQU1fUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTWFuYWdlZEVsZW1lbnR0dHR0dHR0dHR0dHR0dHR0dF9VU0VTX05SQ2VsbERVVVVVVVVVVVVVVVUgeyAvLyAxIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUItRFUgRnVuY3Rpb24gdXNlcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LW9hbS10ZXN0Ok1hbmFnZWRFbGVtZW50dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQ7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdXNlZC1ieS1tYW5hZ2VkRWxlbWVudCB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZWQgYnkgbWFuYWdlZEVsZW1lbnQuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuLXRlc3Q6TlJDZWxsRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CgogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTUFOQUdFREVMRU1FTlRUVFRUVFRUVFRUVFRUVF9NQU5BR0VTX0dOQkRVRlVOQ1RJT05OTk5OTk5OTk5OTk5OTiB7ICAgIC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IG1hbmFnZWQtZ25iZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VkIEVsZW1lbnQgbWFuYWdlcyBnTm9kZUItRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtb2FtLXRlc3Q6TWFuYWdlZEVsZW1lbnR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBtYW5hZ2VkLWJ5LW1hbmFnZWRFbGVtZW50IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQi1EVSBGdW5jdGlvbiBtYW5hZ2VkIGJ5IE1hbmFnZWQgRWxlbWVudC4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW4tdGVzdDpHTkJEVUZ1bmN0aW9ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KfQ==
+\.
+
+COPY teiv_model.entity_info("storedAt", "name", "moduleReferenceName", "attributeNames") FROM stdin;
+o-ran-smo-teiv-cloud_CloudifiedNF      CloudifiedNF    o-ran-smo-teiv-cloud    ["name"]
+o-ran-smo-teiv-cloud_NFDeployment      NFDeployment    o-ran-smo-teiv-cloud    ["name"]
+o-ran-smo-teiv-cloud_NodeCluster       NodeCluster     o-ran-smo-teiv-cloud    ["name"]
+o-ran-smo-teiv-cloud_OCloudNamespace   OCloudNamespace o-ran-smo-teiv-cloud    ["name"]
+o-ran-smo-teiv-cloud_OCloudSite        OCloudSite      o-ran-smo-teiv-cloud    ["geo-location", "name"]
+o-ran-smo-teiv-equipment_AntennaModule AntennaModule   o-ran-smo-teiv-equipment        ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"]
+o-ran-smo-teiv-equipment_Site  Site    o-ran-smo-teiv-equipment        ["geo-location", "name"]
+o-ran-smo-teiv-oam_ManagedElement      ManagedElement  o-ran-smo-teiv-oam      []
+o-ran-smo-teiv-ran_AntennaCapability   AntennaCapability       o-ran-smo-teiv-ran      ["eUtranFqBands", "geranFqBands", "nRFqBands"]
+o-ran-smo-teiv-ran_NRCellCU    NRCellCU        o-ran-smo-teiv-ran      ["cellLocalId", "nCI", "nRTAC", "plmnId"]
+o-ran-smo-teiv-ran_NRCellDU    NRCellDU        o-ran-smo-teiv-ran      ["cellLocalId", "nCI", "nRPCI", "nRTAC"]
+o-ran-smo-teiv-ran_NRSectorCarrier     NRSectorCarrier o-ran-smo-teiv-ran      ["arfcnDL", "arfcnUL", "bSChannelBwDL", "frequencyDL", "frequencyUL"]
+o-ran-smo-teiv-ran_NearRTRICFunction   NearRTRICFunction       o-ran-smo-teiv-ran      ["nearRtRicId", "pLMNId"]
+o-ran-smo-teiv-ran_OCUCPFunction       OCUCPFunction   o-ran-smo-teiv-ran      ["gNBCUName", "gNBId", "gNBIdLength", "pLMNId"]
+o-ran-smo-teiv-ran_OCUUPFunction       OCUUPFunction   o-ran-smo-teiv-ran      ["gNBId", "gNBIdLength", "pLMNIdList"]
+o-ran-smo-teiv-ran_ODUFunction ODUFunction     o-ran-smo-teiv-ran      ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"]
+o-ran-smo-teiv-ran_ORUFunction ORUFunction     o-ran-smo-teiv-ran      ["oruId"]
+o-ran-smo-teiv-ran_Sector      Sector  o-ran-smo-teiv-ran      ["azimuth", "geo-location", "sectorId"]
+o-ran-smo-teiv-equipment-test_AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   ["antennaBeamWidth", "antennaModelNumber", "azimuth", "electricalAntennaTilt", "geo-location", "horizontalBeamWidth", "mechanicalAntennaBearing", "mechanicalAntennaTilt", "positionWithinSector", "totalTilt", "verticalBeamWidth"]
+o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt       ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt        o-ran-smo-teiv-oam-test []
+o-ran-smo-teiv-ran-test_AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy     AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy      o-ran-smo-teiv-ran-test ["eUtranFqBands", "geranFqBands", "nRFqBands"]
+o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn  o-ran-smo-teiv-ran-test ["dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength"]
+o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr  o-ran-smo-teiv-ran-test ["sectorCarrierType"]
+o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU       NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        o-ran-smo-teiv-ran-test ["cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd", "nCI", "nRPCI", "nRTAC"]
+\.
+
+COPY teiv_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin;
+ANTENNAMODULE_INSTALLED_AT_SITE        installed-at-site       AntennaModule   o-ran-smo-teiv-equipment        0       9223372036854775807     installed-antennaModule Site    o-ran-smo-teiv-equipment        0       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-equipment_AntennaModule  o-ran-smo-teiv-equipment
+ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability      AntennaModule   o-ran-smo-teiv-equipment        0       9223372036854775807     serving-antennaModule   AntennaCapability       o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran
+ANTENNAMODULE_SERVES_NRCELLDU  serviced-nrCellDu       AntennaModule   o-ran-smo-teiv-equipment        1       9223372036854775807     serving-antennaModule   NRCellDU        o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_NRCELLDU  o-ran-smo-teiv-rel-equipment-ran
+CLOUDIFIEDNF_COMPRISES_NFDEPLOYMENT    comprised-nFDeployment  CloudifiedNF    o-ran-smo-teiv-cloud    1       1       comprised-by-cloudifiedNF       NFDeployment    o-ran-smo-teiv-cloud    1       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-cloud_NFDeployment       o-ran-smo-teiv-cloud
+MANAGEDELEMENT_DEPLOYED_AS_CLOUDIFIEDNF        deployed-as-cloudifiedNF        ManagedElement  o-ran-smo-teiv-oam      1       1       deployed-managedElement CloudifiedNF    o-ran-smo-teiv-cloud    0       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-oam_ManagedElement       o-ran-smo-teiv-rel-oam-cloud
+MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION       managed-nearRTRICFunction       ManagedElement  o-ran-smo-teiv-oam      1       1       managed-by-managedElement       NearRTRICFunction       o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NearRTRICFunction    o-ran-smo-teiv-rel-oam-ran
+MANAGEDELEMENT_MANAGES_OCUCPFUNCTION   managed-ocucpFunction   ManagedElement  o-ran-smo-teiv-oam      1       1       managed-by-managedElement       OCUCPFunction   o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_OCUCPFunction        o-ran-smo-teiv-rel-oam-ran
+MANAGEDELEMENT_MANAGES_OCUUPFUNCTION   managed-ocuupFunction   ManagedElement  o-ran-smo-teiv-oam      1       1       managed-by-managedElement       OCUUPFunction   o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_OCUUPFunction        o-ran-smo-teiv-rel-oam-ran
+MANAGEDELEMENT_MANAGES_ODUFUNCTION     managed-oduFunction     ManagedElement  o-ran-smo-teiv-oam      1       1       managed-by-managedElement       ODUFunction     o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_ODUFunction  o-ran-smo-teiv-rel-oam-ran
+MANAGEDELEMENT_MANAGES_ORUFUNCTION     managed-oruFunction     ManagedElement  o-ran-smo-teiv-oam      1       1       managed-by-managedElement       ORUFunction     o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_ORUFunction  o-ran-smo-teiv-rel-oam-ran
+NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE       deployed-on-ocloudNamespace     NFDeployment    o-ran-smo-teiv-cloud    1       9223372036854775807     deployed-nFDeployment   OCloudNamespace o-ran-smo-teiv-cloud    1       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-cloud_NFDEPLOYMENT_DEPLOYED_ON_OCLOUDNAMESPACE   o-ran-smo-teiv-cloud
+NFDEPLOYMENT_SERVES_MANAGEDELEMENT     serviced-managedElement NFDeployment    o-ran-smo-teiv-cloud    1       9223372036854775807     serving-nFDeployment    ManagedElement  o-ran-smo-teiv-oam      1       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-cloud_NFDeployment       o-ran-smo-teiv-rel-oam-cloud
+NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION  serviced-nearRTRICFunction      NFDeployment    o-ran-smo-teiv-cloud    0       9223372036854775807     serving-nFDeployment    NearRTRICFunction       o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_NEARRTRICFUNCTION      o-ran-smo-teiv-rel-cloud-ran
+NFDEPLOYMENT_SERVES_OCUCPFUNCTION      serviced-ocucpFunction  NFDeployment    o-ran-smo-teiv-cloud    0       9223372036854775807     serving-nFDeployment    OCUCPFunction   o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTION  o-ran-smo-teiv-rel-cloud-ran
+NFDEPLOYMENT_SERVES_OCUUPFUNCTION      serviced-ocuupFunction  NFDeployment    o-ran-smo-teiv-cloud    0       9223372036854775807     serving-nFDeployment    OCUUPFunction   o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUUPFUNCTION  o-ran-smo-teiv-rel-cloud-ran
+NFDEPLOYMENT_SERVES_ODUFUNCTION        serviced-oduFunction    NFDeployment    o-ran-smo-teiv-cloud    0       9223372036854775807     serving-nFDeployment    ODUFunction     o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_ODUFUNCTION    o-ran-smo-teiv-rel-cloud-ran
+NODECLUSTER_LOCATED_AT_OCLOUDSITE      located-at-ocloudSite   NodeCluster     o-ran-smo-teiv-cloud    1       9223372036854775807     location-of-onodeCluster        OCloudSite      o-ran-smo-teiv-cloud    1       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-cloud_NODECLUSTER_LOCATED_AT_OCLOUDSITE  o-ran-smo-teiv-cloud
+NRCELLDU_USES_NRSECTORCARRIER  used-nrSectorCarrier    NRCellDU        o-ran-smo-teiv-ran      0       1       used-by-nrCellDu        NRSectorCarrier o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NRSectorCarrier      o-ran-smo-teiv-ran
+NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability  NRSectorCarrier o-ran-smo-teiv-ran      0       9223372036854775807     used-by-nrSectorCarrier AntennaCapability       o-ran-smo-teiv-ran      0       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-ran_NRSectorCarrier      o-ran-smo-teiv-ran
+OCLOUDNAMESPACE_DEPLOYED_ON_NODECLUSTER        deployed-on-nodeCluster OCloudNamespace o-ran-smo-teiv-cloud    1       9223372036854775807     deployed-ocloudNamespace        NodeCluster     o-ran-smo-teiv-cloud    1       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-cloud_OCloudNamespace    o-ran-smo-teiv-cloud
+OCUCPFUNCTION_PROVIDES_NRCELLCU        provided-nrCellCu       OCUCPFunction   o-ran-smo-teiv-ran      1       1       provided-by-ocucpFunction       NRCellCU        o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NRCellCU     o-ran-smo-teiv-ran
+ODUFUNCTION_PROVIDES_NRCELLDU  provided-nrCellDu       ODUFunction     o-ran-smo-teiv-ran      1       1       provided-by-oduFunction NRCellDU        o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NRCellDU     o-ran-smo-teiv-ran
+ODUFUNCTION_PROVIDES_NRSECTORCARRIER   provided-nrSectorCarrier        ODUFunction     o-ran-smo-teiv-ran      1       1       provided-by-oduFunction NRSectorCarrier o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NRSectorCarrier      o-ran-smo-teiv-ran
+SECTOR_GROUPS_ANTENNAMODULE    grouped-antennaModule   Sector  o-ran-smo-teiv-ran      0       1       grouped-by-sector       AntennaModule   o-ran-smo-teiv-equipment        0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-equipment_AntennaModule  o-ran-smo-teiv-rel-equipment-ran
+SECTOR_GROUPS_NRCELLDU grouped-nrCellDu        Sector  o-ran-smo-teiv-ran      0       1       grouped-by-sector       NRCellDU        o-ran-smo-teiv-ran      0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran_NRCellDU     o-ran-smo-teiv-ran
+ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY     serviced-antennaCapability      AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   0       9223372036854775807     serving-antennaModule   AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy      o-ran-smo-teiv-ran-test 0       9223372036854775807     BI_DIRECTIONAL  false   RELATION        o-ran-smo-teiv-rel-equipment-ran-test_ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY        o-ran-smo-teiv-rel-equipment-ran-test
+ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE       developed-on-antennaModule      AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   0       9223372036854775807     developing-antennaModule        AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   0       9223372036854775807     BI_DIRECTIONAL  true    RELATION        o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE  o-ran-smo-teiv-equipment-test
+ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE       realised-antennaModule  AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   0       9223372036854775807     realising-antennaModule AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee        o-ran-smo-teiv-equipment-test   0       9223372036854775807     BI_DIRECTIONAL  true    RELATION        o-ran-smo-teiv-equipment-test_ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE  o-ran-smo-teiv-equipment-test
+ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU provided-nrCellDu       ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn  o-ran-smo-teiv-ran-test 1       1       provided-by-oduFunction NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        o-ran-smo-teiv-ran-test 0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran-test_NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        o-ran-smo-teiv-ran-test
+LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY      used-antennaCapability  LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr  o-ran-smo-teiv-ran-test 0       9223372036854775807     used-by-lteSectorCarrier        AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy      o-ran-smo-teiv-ran-test 0       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-ran-test_LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr  o-ran-smo-teiv-ran-test
+MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_ODUFUNCTIONNNNNNNNNNNNNNN managed-oduFunction     ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt        o-ran-smo-teiv-oam-test 1       1       managed-by-managedElement       ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn  o-ran-smo-teiv-ran-test 0       9223372036854775807     BI_DIRECTIONAL  false   B_SIDE  o-ran-smo-teiv-ran-test_ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn  o-ran-smo-teiv-rel-oam-ran-test
+ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU       used-nrCellDu   ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt        o-ran-smo-teiv-oam-test 1       1       used-by-managedElement  NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU        o-ran-smo-teiv-ran-test 0       1       BI_DIRECTIONAL  false   A_SIDE  o-ran-smo-teiv-oam-test_ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt        o-ran-smo-teiv-rel-oam-ran-test
+\.
+
+;
+
+COMMIT;
\ No newline at end of file
index 9207aa1..b1b03da 100644 (file)
 
 BEGIN;
 
+COPY teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id", "CD_sourceIds", "CD_classifiers", "CD_decorators", "metadata" ) FROM stdin;
+urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1  ["urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1","urn:cmHandle:C4388D6BB970EC663F88B46CC14F8620"]       []      {}      {"reliabilityIndicator":"RESTORED","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"}
+\.
+
+COPY teiv_data."o-ran-smo-teiv-ran_ODUFunction" ("id", "dUpLMNId", "gNBDUId", "gNBId", "gNBIdLength", "CD_sourceIds", "CD_classifiers", "CD_decorators", "REL_FK_managed-by-managedElement", "REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "REL_CD_decorators_MANAGEDELEMENT_MANAGES_ODUFUNCTION", "metadata", "REL_metadata_MANAGEDELEMENT_MANAGES_ODUFUNCTION" ) FROM stdin;
+urn:3gpp:dn:SubNetwork=ODUFunctionForDeletion,MeContext=1,ManagedElement=1,ODUFunction=1       {"mcc":"123","mnc":"82"}        \N      9       1       ["urn:3gpp:dn:SubNetwork=ODUFunctionForDeletion,MeContext=1,ManagedElement=1,ODUFunction=1","urn:cmHandle:C4388D6BB970EC663F88B46CC14F8619"]    ["test-app-module:Indoor","test-app-module:Weekend"]    {"test-app-module:textdata":"Ericsson"} urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1   urn:o-ran:smo:teiv:sha512:MANAGEDELEMENT_MANAGES_ODUFUNCTION=9243B48F7D6A6CF471226915C74CF5FE4BDA6FA3CF7D897473007B46DF7FC50230BD6B8B4256116A6AFBF4D822CF9379EB56DE9490C1C0B54238263F2574B345   ["urn:3gpp:dn:SubNetwork=ManagedElementForDeletion,MeContext=1,ManagedElement=1"]       ["test-app-module:Indoor","test-app-module:Weekend"]    {"test-app-module:textdata":"Ericsson"} {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"}      {"reliabilityIndicator":"ADVISED","firstDiscovered":"2025-01-09T10:40:36.461565Z","lastModified":"2025-01-09T10:40:36.461565Z"}
+\.
+
 COPY teiv_data."o-ran-smo-teiv-ran_NRCellDU" ("id", "metadata", "cellLocalId", "nCI", "nRPCI", "nRTAC") FROM stdin;
 myReliabilityCell_1    {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"}  51      61      \N      \N
 myReliabilityCell_2    {"reliabilityIndicator":"OK","firstDiscovered":"2025-01-08T10:40:36.46156500Z","lastModified":"2025-01-08T10:40:36.46156500Z"}  51      61      701     \N
diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-equipment-test.yang
new file mode 100644 (file)
index 0000000..512bfb4
--- /dev/null
@@ -0,0 +1,192 @@
+module o-ran-smo-teiv-equipment-test {
+    yang-version 1.1;
+    namespace "urn:o-ran:smo-teiv-equipment-test";
+    prefix or-teiv-equip-test;
+
+    import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }
+
+    import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }
+
+    import ietf-geo-location {
+        prefix geo;
+        reference "RFC 9179: A YANG Grouping for Geographic Locations";
+    }
+
+    organization "ORAN";
+    contact "The Authors";
+    description
+        "These are just test Equipment topology model";
+
+    revision "2024-10-21" {
+        description "Deprecate AntennaModule attribute antennaBeamWidth.
+        To be replaced by horizontalBeamWidth and verticalBeamWidth.";
+        or-teiv-yext:label 0.6.0;
+    }
+
+    revision "2024-10-08" {
+        description "Added azimuth attribute for AntennaModule.";
+        or-teiv-yext:label 0.5.0;
+    }
+
+    revision "2024-10-04" {
+        description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp
+        to the corresponding topology objects.";
+        or-teiv-yext:label 0.4.0;
+    }
+
+    revision "2024-05-24" {
+        description "Initial revision.";
+        or-teiv-yext:label 0.3.0;
+    }
+
+    or-teiv-yext:domain EQUIPMENT;
+
+    list AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee {
+        description "An Antenna Module represents the physical aspect of an
+        antenna.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        uses or-teiv-types:Origin_Entity_Mapping_Grp;
+        key id;
+
+        container attributes {
+            leaf antennaModelNumber {
+                description "Vendor-specific antenna model identifier. This
+                attribute is part of AISG v3 ADB Standard and has no
+                operational impact.";
+                type string;
+            }
+
+            leaf mechanicalAntennaBearing {
+                description "Antenna bearing on antenna subunit where antenna
+                unit is installed.";
+                type int32;
+            }
+
+            leaf mechanicalAntennaTilt {
+                description "The fixed antenna tilt of the installation, defined
+                as the inclination of the antenna element respect to the
+                vertical plane. It is a signed value. Positive indicates
+                downtilt, and negative indicates uptilt.";
+                type int32;
+            }
+
+            leaf positionWithinSector {
+                description "Antenna unit position within sector. This attribute
+                is part of AISG v3 ADB Standard and has no operational
+                impact.";
+                type string;
+            }
+
+            leaf totalTilt {
+                description "Total antenna elevation including the installed
+                tilt and the tilt applied by the Remote Electrical
+                Tilt (RET).";
+                type int32;
+            }
+
+            leaf electricalAntennaTilt {
+                description "Electrically-controlled tilt of main beam maximum
+                with respect to direction orthogonal to antenna element
+                axis (see 3GPP TS 25.466). Value is signed; tilt down is
+                positive, tilt up is negative.";
+                type int32;
+            }
+
+            leaf-list antennaBeamWidth {
+                description "The angular span of the main lobe of the antenna
+                radiation pattern in the horizontal plane. Measured in
+                degrees.
+
+                Deprecated: Since 24.Q4. Replaced by AntennaModule::horizontalBeamWidth
+                and AntennaModule::verticalBeamWidth. Planned to be removed.";
+                type uint32;
+            }
+
+            leaf horizontalBeamWidth  {
+                description "The angular span of the main lobe of the antenna
+                radiation pattern in the horizontal plane.";
+                type decimal64 {
+                    fraction-digits 1;
+                    range "0..360";
+                }
+                units "decimal degrees";
+            }
+
+            leaf verticalBeamWidth   {
+                description "The angular span of the main lobe of the antenna
+                radiation pattern in the vertical plane.";
+                type decimal64 {
+                    fraction-digits 1;
+                    range "0..360";
+                }
+                units "decimal degrees";
+            }
+
+            leaf azimuth {
+                description "The value of the azimuth of the Antenna Module.";
+                type decimal64 {
+                    fraction-digits 1;
+                    range "0..360";
+                }
+                units "decimal degrees";
+            }
+
+            uses geo:geo-location;
+        }
+    }
+
+    or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEE_REALISED_BY_ANTENNAMODULEEEEEEEEEEEEEEE {
+
+        description
+            "The aSide of this relationship is an instance of the AntennaModule type.
+            The bSide of this relationship is an instance of the AntennaModule type.
+            The AntennaModule represents the physical antenna that realised by the AntennaModule.
+            An AntennaModule instance can realised one AntennaModule.
+            An AntennaModule instance can be realised by many AntennaModules.
+            ";
+
+        uses or-teiv-types:Top_Grp_Type;
+        uses or-teiv-types:Origin_Relationship_Mapping_Grp;
+        key id;
+
+        leaf-list realised-antennaModule {
+            description "Antenna Module realised by many Antenna Modules.";
+            or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
+            type instance-identifier;
+        }
+
+        leaf-list realising-antennaModule {
+            description "Antenna Module realising this Antenna Module.";
+            or-teiv-yext:bSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
+            type instance-identifier;
+        }
+    }
+
+    or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEE_DEPLOYED_ON_ANTENNAMODULEEEEEEEEEEEEEEE { // 1..n to 0..m
+
+        description
+            "The aSide of this relationship is an instance of the AntennaModule type.
+            The bSide of this relationship is an instance of the AntennaModule type.
+            The AntennaModule represents the physical antenna that developed on the AntennaModule.
+            An AntennaModule instance can developed one AntennaModule.
+            An AntennaModule instance can be developed on one AntennaModule.
+            ";
+
+        uses or-teiv-types:Top_Grp_Type;
+        uses or-teiv-types:Origin_Relationship_Mapping_Grp;
+        key id;
+
+        leaf-list developed-on-antennaModule {
+            description "Antenna Module developed on this Antenna Module.";
+            or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
+            type instance-identifier;
+        }
+
+        leaf-list developing-antennaModule {
+            description "Antenna Module developing this Antenna Module.";
+            or-teiv-yext:bSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
+            type instance-identifier;
+        }
+    }
+}
\ No newline at end of file
diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-oam-test.yang
new file mode 100644 (file)
index 0000000..21ca695
--- /dev/null
@@ -0,0 +1,38 @@
+module o-ran-smo-teiv-oam-test {
+    yang-version 1.1;
+    namespace "urn:o-ran:smo-teiv-oam-test";
+    prefix or-teiv-oam-test;
+
+    import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }
+
+    import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }
+
+    organization "ORAN";
+    contact "The Authors";
+    description
+        "These are just test O&M topology model.";
+
+    revision "2024-10-04" {
+        description "Added grouping, Origin_Entity_Mapping_Grp to the topology object.";
+        or-teiv-yext:label 0.4.0;
+    }
+
+    revision "2024-05-24" {
+        description "Initial revision.";
+        or-teiv-yext:label 0.3.0;
+    }
+
+    or-teiv-yext:domain OAM;
+
+    list ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt {
+        description "A Managed Element (ME) is a node into a telecommunication
+        network providing support and/or service to subscribers. An ME
+        communicates with a manager application (directly or indirectly)
+        over one or more interfaces for the purpose of being monitored
+        and/or controlled.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        uses or-teiv-types:Origin_Entity_Mapping_Grp;
+        key id;
+    }
+}
\ No newline at end of file
diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-ran-test.yang
new file mode 100644 (file)
index 0000000..ff8c7c3
--- /dev/null
@@ -0,0 +1,240 @@
+module o-ran-smo-teiv-ran-test {
+    yang-version 1.1;
+    namespace "urn:o-ran:smo-teiv-ran-test";
+    prefix or-teiv-ran-test;
+
+    import o-ran-smo-teiv-common-yang-types {prefix or-teiv-types; }
+
+    import o-ran-smo-teiv-common-yang-extensions {prefix or-teiv-yext; }
+
+    import _3gpp-common-yang-types { prefix types3gpp; }
+
+    import ietf-geo-location {
+        prefix geo;
+        reference "RFC 9179: A YANG Grouping for Geographic Locations";
+    }
+
+    organization "ORAN";
+    contact "The Authors";
+    description
+        "These are just test RAN topology model.";
+
+    revision "2024-10-08" {
+        description "Added range for azimuth attribute of Sector.";
+        or-teiv-yext:label 0.5.0;
+    }
+
+    revision "2024-10-04" {
+        description "Added groupings, Origin_Entity_Mapping_Grp or Origin_Relationship_Mapping_Grp
+        to the corresponding topology object.";
+        or-teiv-yext:label 0.4.0;
+    }
+
+    revision "2024-05-24" {
+        description "Initial revision.";
+        or-teiv-yext:label 0.3.0;
+    }
+
+    or-teiv-yext:domain RAN;
+
+    list ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn {
+        description "gNodeB Distributed Unit (gNB-DU).
+
+        A gNB may consist of a gNB-Centralized Unit (gNB-CU) and a gNB-DU.
+        The CU processes non-real time protocols and services, and the DU
+        processes PHY level protocol and real time services. The gNB-CU and
+        the gNB-DU units are connected via F1 logical interface.
+
+        The following is true for a gNB-DU:
+        Is connected to the gNB-CU-CP through the F1-C interface. Is
+        connected to the gNB-CU-UP through the F1-U interface. One gNB-DU is
+        connected to only one gNB-CU-CP. One gNB-DU can be connected to
+        multiple gNB-CU-UPs under the control of the same gNB-CU-CP.
+
+        Note: A gNB may consist of a gNB-CU-CP, multiple gNB-CU-UPs and
+        multiple gNB-DUs. gNB-DU is a concrete class that extends the NG-RAN
+        node object. In Topology, you can create, read, update, and delete
+        the gNB-DU object.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        container attributes {
+            container dUpLMNId {
+                description "PLMN identifier used as part of PM Events data";
+                uses types3gpp:PLMNId;
+            }
+
+            leaf gNBDUId {
+                description "Unique identifier for the DU within a gNodeB";
+                type int64;
+            }
+
+            leaf gNBId {
+                description "Identity of gNodeB within a PLMN";
+                type int64;
+            }
+
+            leaf gNBIdLength {
+                description "Length of gNBId bit string representation";
+                type int32;
+            }
+        }
+    }
+
+
+    list NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU  {
+        description "Represents an NR Cell in gNodeB-DU.
+
+        5G NR is a new radio access technology (RAT) developed by 3GPP for
+        the 5G (fifth generation) mobile network. It is designed to be the
+        global standard for the air interface of 5G networks.
+
+        5G NR has synchronization signal that is known as Primary
+        Synchronization signal (PSS) and Secondary Synchronization signal
+        (SSS). These signals are specific to NR physical layer and provide
+        the following information required by UE for downlink
+        synchronization: PSS provides Radio Frame Boundary (Position of 1st
+        Symbol in a Radio frame) SSS provides Subframe Boundary (Position of
+        1st Symbol in a Subframe) Physical Layer Cell ID (PCI) information
+        using both PSS and SSS.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        container attributes {
+            leaf cellLocalIdddddddddddddddddddddddddddddddddddddddddddddddddddddd {
+                description "Used together with gNodeB identifier to identify NR
+                cell in PLMN. Used together with gNBId to form NCI.";
+                type int32;
+            }
+
+            leaf nCI {
+                description "NR Cell Identity.";
+                type int64;
+            }
+
+            leaf nRPCI {
+                description "The Physical Cell Identity (PCI) of the NR cell.";
+                type int32;
+            }
+
+            leaf nRTAC {
+                description "NR Tracking Area Code (TAC).";
+                type int32;
+            }
+        }
+    }
+
+    list AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy {
+        description "This MO serves as a mapping between the cell and the RBS
+        equipment used to provide coverage in a certain geographical area.
+        The MO also controls the maximum output power of the sector.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        container attributes {
+            leaf-list eUtranFqBands {
+                description "List of LTE frequency bands that associated
+                hardware supports";
+                type string;
+            }
+
+            leaf-list geranFqBands {
+                description "List of GERAN frequency bands that associated
+                hardware supports";
+                type string;
+            }
+
+            leaf-list nRFqBands {
+                description "List of NR frequency bands associated hardware
+                supports";
+                type string;
+            }
+        }
+    }
+
+    list LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr {
+        description "The LTE Sector Carrier object provides the attributes for
+        defining the logical characteristics of a carrier (cell) in a
+        sector. A sector is a coverage area associated with a base station
+        having its own antennas, radio ports, and control channels. The
+        concept of sectors was developed to improve co-channel interference
+        in cellular systems, and most wireless systems use three sector
+        cells.";
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        container attributes {
+            leaf sectorCarrierType {
+                description "Indicates whether or not the sector carrier
+                modelled by MO SectorCarrier is a digital sector.";
+                type enumeration {
+                    enum normal_sector {
+                        value 0;
+                        description "Not a digital sector";
+                    }
+                    enum left_digital_sector {
+                        value 1;
+                        description "Left digital sector for 2DS";
+                    }
+                    enum right_digital_sector {
+                        value 2;
+                        description "Right digital sector for 2DS";
+                    }
+                    enum left_digital_sector_3ds {
+                        value 3;
+                        description "Left digital sector for 3DS";
+                    }
+                    enum right_digital_sector_3ds {
+                        value 4;
+                        description "Right digital sector for 3DS";
+                    }
+                    enum middle_digital_sector_3ds {
+                        value 5;
+                        description "Middle digital sector for 3DS";
+                    }
+                }
+            }
+        }
+    }
+
+    or-teiv-yext:biDirectionalTopologyRelationship ODUFUNCTIONNNNNNNNNNNNNNNNN_PROVIDES_NRCELLDUUUUUUUUUUUUUUUUUU { // 1 to 0..n
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        leaf-list provided-nrCellDu {
+            description "gNodeB-DU Function provides NR Cell-DU.";
+            or-teiv-yext:aSide ODUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn;
+            type instance-identifier;
+        }
+
+        leaf provided-by-gnbduFunction {
+            description "NR Cell-DU provided by gNodeB-DU Function.";
+            or-teiv-yext:bSide NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU;
+            type instance-identifier;
+            mandatory true;
+        }
+    }
+
+    or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIERRRRRRRRRRRRRRRRRRRRR_USES_ANTENNACAPABILITYYYYYYYYYYYYYYY { // 0..n to 0..1
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        leaf used-antennaCapability {
+            description "LTE Sector Carrier uses Antenna Capability.";
+            or-teiv-yext:aSide LTESectorCarrierrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr;
+            type instance-identifier;
+        }
+
+        leaf-list used-by-lteSectorCarrier {
+            description "Antenna Capability used by LTE Sector Carrier.";
+            or-teiv-yext:bSide AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;
+            type instance-identifier;
+        }
+    }
+}
\ No newline at end of file
diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-equipment-ran-test.yang
new file mode 100644 (file)
index 0000000..d143ea2
--- /dev/null
@@ -0,0 +1,43 @@
+module o-ran-smo-teiv-rel-equipment-ran-test {
+    yang-version 1.1;
+    namespace "urn:o-ran:smo-teiv-rel-equipment-ran";
+    prefix or-teiv-rel-equipran-test;
+
+    import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }
+
+    import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }
+
+    import o-ran-smo-teiv-equipment-test { prefix or-teiv-equip-test; }
+
+    import o-ran-smo-teiv-ran-test { prefix or-teiv-ran-test; }
+
+    organization "ORAN";
+    contact "The Authors";
+    description
+        "These are just test Equipment and RAN topology relation model.";
+
+    revision "2024-05-24" {
+        description "Initial revision.";
+        or-teiv-yext:label 0.3.0;
+    }
+
+    or-teiv-yext:domain REL_EQUIPMENT_RAN;
+
+    or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULEEEEEEEEEEEEEEEEEEEE_SERVES_ANTENNACAPABILITYYYYYYYYYYYYYYYYYY { // 0..n to 0..m
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        leaf-list serviced-antennaCapability {
+            description "Antenna Capability serviced by this Antenna Module.";
+            or-teiv-yext:aSide or-teiv-equip-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
+            type instance-identifier;
+        }
+
+        leaf-list serving-antennaModule {
+            description "Antenna Module serves this Antenna Capability.";
+            or-teiv-yext:bSide or-teiv-ran-test:AntennaCapabilityyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;
+            type instance-identifier;
+        }
+    }
+}
\ No newline at end of file
diff --git a/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang b/teiv/src/test/resources/yang/models/o-ran-smo-teiv-rel-oam-ran-test.yang
new file mode 100644 (file)
index 0000000..161736c
--- /dev/null
@@ -0,0 +1,69 @@
+module o-ran-smo-teiv-rel-oam-ran-test {
+    yang-version 1.1;
+    namespace "urn:o-ran:smo-teiv-rel-oam-ran-test";
+    prefix or-teiv-rel-oam-ran-test;
+
+    import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }
+
+    import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }
+
+    import o-ran-smo-teiv-oam-test { prefix or-teiv-oam-test; }
+
+    import o-ran-smo-teiv-ran-test { prefix or-teiv-ran-test; }
+
+    organization "ORAN";
+    contact "The Authors";
+    description
+        "These are just test O&M and RAN topology relation model.";
+
+    revision "2024-10-04" {
+        description "Added grouping, Origin_Relationship_Mapping_Grp to the topology object.";
+        or-teiv-yext:label 0.4.0;
+    }
+
+    revision "2024-05-24" {
+        description "Initial revision.";
+        or-teiv-yext:label 0.3.0;
+    }
+
+    or-teiv-yext:domain REL_OAM_RAN;
+
+    or-teiv-yext:biDirectionalTopologyRelationship ManagedElementttttttttttttttttt_USES_NRCellDUUUUUUUUUUUU { // 1 to 0..1
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        leaf used-nrCellDu {
+            description "gNodeB-DU Function uses NR Cell-DU.";
+            or-teiv-yext:aSide or-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt;
+            type instance-identifier;
+        }
+
+        leaf used-by-managedElement {
+            description "NR Cell-DU used by managedElement.";
+            or-teiv-yext:bSide or-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU;
+            type instance-identifier;
+            mandatory true;
+        }
+
+    }
+
+    or-teiv-yext:biDirectionalTopologyRelationship MANAGEDELEMENTTTTTTTTTTTTTTT_MANAGES_GNBDUFUNCTIONNNNNNNNNNNNNNN {    // 1 to 0..n
+
+        uses or-teiv-types:Top_Grp_Type;
+        key id;
+
+        leaf-list managed-gnbduFunction {
+            description "Managed Element manages gNodeB-DU Function.";
+            or-teiv-yext:aSide or-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt;
+            type instance-identifier;
+        }
+
+        leaf managed-by-managedElement {
+            description "gNodeB-DU Function managed by Managed Element.";
+            or-teiv-yext:bSide or-teiv-ran-test:GNBDUFunctionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn;
+            type instance-identifier;
+            mandatory true;
+        }
+    }
+}
\ No newline at end of file