/*
* ============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);
}
}
* 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;
--- /dev/null
+/*
+ * ============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;
+ }
+}
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);
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");
+ }
}
/*
* ============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() + "\"}";
}
}
--- /dev/null
+/*
+ * ============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);
+ }
+ }
+}
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;
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)
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;
+ }
}
--- /dev/null
+/*
+ * ============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);
+ }
+ }
+
+}
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;
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 {
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;
+ }
}
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 {
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
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());
}
}
@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();
}
}
* 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);
}
}
@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))));
}
}
@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;
}
return Collections.emptySet();
}
- public Set<Pair<String, Field>> getJoinCondition() {
+ public Set<Pair<String, Field>> getWhereExistsConditions() {
return Collections.emptySet();
}
}
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() {
public abstract Set<Table> getTables();
- public abstract Set<Pair<String, Field>> getJoinCondition();
+ public abstract Set<Pair<String, Field>> getWhereExistsConditions();
}
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;
@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
}
@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) {
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);
}
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 {
}
}
- 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 {
}
}
- 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);
}
*/
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;
}
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;
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,
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);
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;
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();
- }
}
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;
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 {
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) {
}
@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;
}
@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();
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;
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;
}
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);
}
}
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;
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
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();
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
}
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();
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
}
} 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;
}
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;
}
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;
}
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)
*/
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;
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
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));
}
}
*/
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;
}
/**
- * 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;
}
/**
}
/**
- * 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;
}
/**
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
}
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;
}
.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();
}
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(
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,
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();
}
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);
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);
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());
}
}
}
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);
}
import java.util.Set;
import java.util.concurrent.ExecutionException;
-import io.cloudevents.CloudEvent;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
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;
@Getter
private final KafkaConfig kafkaConfig;
- @Qualifier("topologyAuditKafkaTemplate")
- private final KafkaTemplate<String, CloudEvent> topologyAuditkafkaTemplate;
-
public boolean checkTopologyIngestionTopic() {
return checkTopicCreated(kafkaConfig.getTopologyIngestion().getTopicName());
}
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;
@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;
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";
* unaffected by retries.
*/
@Async
- @Order(value = 20)
+ @Order(value = 25)
@EventListener(value = ApplicationReadyEvent.class)
public void startUpHandler() {
if (dependentServiceAvailabilityKafka.checkService()) {
--- /dev/null
+/*
+ * ============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();
+ }
+}
--- /dev/null
+/*
+ * ============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;
+ }
+}
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");
}));
}
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;
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<>();
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();
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) {
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;
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 {
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);
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;
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) {
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()) {
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
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
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"
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:
"/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"),
}
}
+ 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",
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;
@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 {
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);
+
+ }
}
}
@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);
}
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
}
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
}
.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
}
.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
}
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
}
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
}
}
@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());
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());
}
}
*/
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;
expectedScopeObject.setDataType(DataType.PRIMITIVE);
expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY);
expectedTargets.get(0).setAllParamQueried(true);
- Assertions.assertEquals(expectedFilterCriteria, filterCriteria);
+ assertEquals(expectedFilterCriteria, filterCriteria);
}
@Test
expectedScopeObject.setDataType(DataType.PRIMITIVE);
expectedTargets.get(0).setTopologyObjectType(TopologyObjectType.ENTITY);
expectedTargets.get(0).setAllParamQueried(false);
- Assertions.assertEquals(expectedFilterCriteria, filterCriteria);
+ assertEquals(expectedFilterCriteria, filterCriteria);
}
@Test
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");
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
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"));
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
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
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
resultTargetObjects4_1.add(targetObjectResult4_2);
basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
FilterCriteria.ResolvingTopologyObjectType.ENTITY);
- Assertions.assertEquals(resultTargetObjects4_1, filterCriteria.getTargets());
+ assertEquals(resultTargetObjects4_1, filterCriteria.getTargets());
}
@Test
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
"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
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
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
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
.of(filterCriteria)).build());
basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
FilterCriteria.ResolvingTopologyObjectType.ENTITY);
- Assertions.assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
+ assertEquals(resultTargetObjects9_1, filterCriteria.getTargets());
}
@Test
.of(filterCriteria)).build());
basePathRefinement.resolveWildCardObjectsInScopeAndTarget(filterCriteria, "RAN",
FilterCriteria.ResolvingTopologyObjectType.RELATIONSHIP);
- Assertions.assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope());
+ assertEquals(new ScopeLogicalBlock(scopeObject), filterCriteria.getScope());
}
@Test
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
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
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());
}
}
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());
}
}
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()));
.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(
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()));
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()));
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
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();
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
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());
}
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))')]");
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)]");
basePathRefinement.refine(filterCriteria3);
- Assertions.assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject());
+ assertEquals(expectedScopeObject3, ((ScopeLogicalBlock) logicalBlock3).getScopeObject());
LogicalBlock logicalBlock4 = scopeResolver.resolve("NRCellDU",
"/serving-antennaModule/attributes[@antennaModelNumber='5']");
basePathRefinement.refine(filterCriteria4);
- Assertions.assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
+ assertEquals(expectedScopeObject4, ((ScopeLogicalBlock) logicalBlock4).getScopeObject());
LogicalBlock logicalBlock5 = scopeResolver.resolve(null,
"/serving-antennaModule/attributes[@antennaModelNumber='5']");
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());
}
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')]");
basePathRefinement.refine(filterCriteria2);
- Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+ assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
}
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')]");
basePathRefinement.refine(filterCriteria2);
- Assertions.assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
+ assertEquals(expectedScopeObject2, ((ScopeLogicalBlock) logicalBlock2).getScopeObject());
}
@Test
basePathRefinement.refine(filterCriteria);
- Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+ assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
}
basePathRefinement.refine(filterCriteria);
- Assertions.assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
+ assertEquals(expectedScopeObject, ((ScopeLogicalBlock) logicalBlock).getScopeObject());
}
}
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;
private ApplicationContext context;
@Autowired
private MockMvc mockMvc;
- @MockBean
+ @Autowired
+ private ObjectMapper objectMapper;
+ @Autowired
private LoggerHandler loggerHandler;
@BeforeAll
@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();
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;
import jakarta.annotation.PostConstruct;
@Configuration
+@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@SpringBootTest
@ActiveProfiles({ "test", "ingestion" })
class IngestionOperationValidatorTest {
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());
}
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());
}
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());
}
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());
}
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
}
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());
}
}
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());
}
}
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());
}
}
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) {
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;
@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());
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
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"));
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;
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;
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
@Autowired
private DSLContext writeDataDslContext;
+ @MockitoSpyBean
+ IngestionAuditLogger auditLogger;
+
@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.read.jdbc-url", () -> postgresqlContainer.getJdbcUrl());
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();
new StringSerializer(), new CloudEventSerializer());
producer = factory.createProducer();
testStartTime = OffsetDateTime.now(ZoneOffset.UTC);
+ YangModelValidationTestUtil.mockLoadAndValidateModels();
}
@AfterEach
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);
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);
}
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) {
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.stream.Collectors;
import javax.sql.DataSource;
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;
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
@Autowired
CloudEventParser cloudEventParser;
- @MockBean
+ @MockitoBean
private SchemaHandler schemaHandler;
@BeforeAll
teivDbOperations = new TeivDbOperations(teivDbService, new IngestionOperationValidatorFactory(),
new RelationshipMergeValidator(), new TeivMetadataResolver());
TestPostgresqlContainer.loadIngestionTestData();
+ TestPostgresqlContainer.loadEndToEndTestData();
PostgresSchemaLoader postgresSchemaLoader = new PostgresSchemaLoader(dslContext, new ObjectMapper());
postgresSchemaLoader.loadSchemaRegistry();
}
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",
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);
}
.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
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);
// 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"));
"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,
// 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'");
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,
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'");
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)
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,
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)
"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'");
// 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());
}
// 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");
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(),
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
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());
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
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(
"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
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())));
+ }
}
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() {
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);
-/*
- * ============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<>() {
+// });
+// }
+//
+//}
@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);
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;
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",
--- /dev/null
+/*
+ * ============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();
+ }
+}
{
"id": "id1",
"attributes": {
- "gNBId": -1.0
+ "gNBId": "abba"
},
"sourceIds": [
"source1",
{
"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",
"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"
+ ]
}
]
},
{
"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",
"o-ran-smo-teiv-oam:ManagedElement": [
{
"id": "ManagedElement_1",
- "attributes": {
-
- },
"sourceIds": [
"urn:3gpp:dn:fdn1",
"urn:cmHandle:1234"
"o-ran-smo-teiv-oam:ManagedElement": [
{
"id": "ManagedElement_1",
- "attributes": {
-
- },
"sourceIds": [
"urn:3gpp:dn:fdn1",
"urn:cmHandle:12345"
},
{
"id": "ManagedElement_2",
- "attributes": {
-
- },
"sourceIds": [
"urn:3gpp:dn:fdn1",
"urn:cmHandle:12345"
"id": "ODU_1",
"attributes": {
"dUpLMNId": {
- "mcc": 110,
- "mnc": 210
+ "mcc": "250",
+ "mnc": "210"
},
"gNBDUId": 111,
"gNBId": 123,
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_21",
- "attributes": {
-
- },
"sourceIds": [
"source1",
"source2"
},
{
"id": "ManagedElement_41",
- "attributes": {
-
- },
"sourceIds": [
"source1",
"source2"
]
},
{
- "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+ "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
{
"id": "NRCellDU_21",
"attributes": {
],
"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",
]
},
{
- "o-ran-smo-teiv-equipment:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
+ "o-ran-smo-teiv-equipment-test:AntennaModuleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee": [
{
"id": "AntennaModule_3",
"attributes": {
],
"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",
]
},
{
- "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",
"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"
+ ]
}
}
]
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_21"
}
],
"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"
}
],
"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"
}
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_1",
"attributes": {
]
},
{
- "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,
"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",
{
"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",
"id": "ODU_1",
"attributes": {
"dUpLMNId": {
- "mcc": "110",
+ "mcc": "250",
"mnc": "210"
},
"gNBDUId": 12,
"o-ran-smo-teiv-oam:ManagedElement": [
{
"id": "ManagedElement_1",
- "attributes": {
-
- },
"sourceIds": [
"urn:3gpp:dn:fdn1",
"urn:cmHandle:1234"
},
{
"id": "ManagedElement_2",
- "attributes": {
-
- },
"sourceIds": [
"urn:3gpp:dn:fdn1",
"urn:cmHandle:1234"
"id": "ODU_1",
"attributes": {
"dUpLMNId": {
- "mcc": 110,
- "mnc": 210
+ "mcc": "250",
+ "mnc": "210"
},
"gNBDUId": 111,
"gNBId": 123,
{
- "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",
"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>",
{
- "84E676149362F50C55FE1E004B98D4891916BBF3": [
+ "F93C2CA075353668A76B4718E07B741ACCD83641": [
{
"id": "NRCellDU_21"
},
"id": "NRCellDU_31"
}
],
- "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+ "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
{
"id": "ManagedElement_21",
"REL_FK_used-nrCellDu": "NRCellDU_21",
"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": {
{
- "84E676149362F50C55FE1E004B98D4891916BBF3": [
+ "F93C2CA075353668A76B4718E07B741ACCD83641": [
{
"id": "NRCellDU_21"
},
"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": {
+
+ }
}
]
}
"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": [
{
"id": "ODU_1",
"dUpLMNId": {
- "mcc": "110",
+ "mcc": "250",
"mnc": "210"
},
"gNBDUId": 12,
{
- "28C9A375E800E82308EBE7DA2932EF2C0AF13C38": [
+ "C9475FE40C02BEB41F720B4284A856F2CF49E1F3": [
"ManagedElement_21",
"relation_11",
"relation_12"
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_1",
"attributes": {
]
},
{
- "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+ "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
{
"id": "NRCellDU_1",
"attributes": {
],
"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",
],
"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",
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_2",
"attributes": {
],
"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",
"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",
"data": {
"entities": [
{
- "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+ "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
{
"id": "NRCellDU_1",
"attributes": {
],
"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",
"data": {
"entities": [
{
- "o-ran-smo-teiv-oam:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
+ "o-ran-smo-teiv-oam-test:ManagedElementtttttttttttttttttttttttttttttttttttttttttttttttttt": [
{
"id": "ManagedElement_1",
"attributes": {
],
"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",
"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",
"data": {
"entities": [
{
- "o-ran-smo-teiv-ran:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
+ "o-ran-smo-teiv-ran-test:NRCellDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU": [
{
"id": "NRCellDU_2",
"attributes": {
],
"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",
}
},
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')]"
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
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())
+ }
+ }
}
]
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
}''')
}
},
+ 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 {
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
}
}
},
+ 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 {
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
}
},
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"
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
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())
}
}
},
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())
}
}
},
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())
+ }
+ }
}
]
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
"details": "Invalid schema name: invalid"
}''')
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
}
}
' leaf weekend { ' +
' type uint32; ' +
' } ' +
+ ' leaf decimal { ' +
+ ' type decimal64; ' +
+ ' } ' +
' } ' +
' ' +
' identity geo-classifier { ' +
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid schema name",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid schema name",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid schema name",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid file input",
}
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'."
+ }''')
+ }
}
]
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid schema name",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid schema name",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "getAllGroups.limit: must be less than or equal to 500"
}
response {
status INTERNAL_SERVER_ERROR()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "INTERNAL_SERVER_ERROR",
"message": "Criteria deserialization exception",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
}
response {
status NOT_FOUND()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "NOT_FOUND",
"message": "Resource Not Found",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
}
}
]
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
}
response {
status NOT_FOUND()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "NOT_FOUND",
"message": "Resource Not Found",
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body ('''{
"status": "NOT_FOUND",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Grammar error",
}
response {
status NOT_FOUND()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "NOT_FOUND",
"message": "Resource Not Found",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Filter Error",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid target filter, only relationship conditions can be provided",
}
response {
status BAD_REQUEST()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "BAD_REQUEST",
"message": "Invalid status",
}
response {
status NOT_FOUND()
+ headers {
+ contentType('application/problem+json')
+ }
body('''{
"status": "NOT_FOUND",
"message": "Resource Not Found",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
response {
status NOT_FOUND()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "NOT_FOUND",
response {
status BAD_REQUEST()
headers {
- contentType('application/json')
+ contentType('application/problem+json')
}
body('''{
"status": "BAD_REQUEST",
--- /dev/null
+-- ============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;
--- /dev/null
+--
+-- ============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
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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