From: JvD_Ericsson Date: Mon, 14 Apr 2025 11:24:22 +0000 (+0100) Subject: TEIV - Create adapter from NCMP to TEIV X-Git-Tag: 0.2.0~5 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=46b9227797bd0dd9487e5b5683a5956617be7af3;p=smo%2Fteiv.git TEIV - Create adapter from NCMP to TEIV Issue-ID: SMO-187 Change-Id: I385f9863d4d28ca5f316b8d7c1570b1c388cafbe Signed-off-by: JvD_Ericsson --- diff --git a/adapters/ncmp-to-teiv-adapter/Dockerfile b/adapters/ncmp-to-teiv-adapter/Dockerfile new file mode 100644 index 0000000..c2f075d --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/Dockerfile @@ -0,0 +1,32 @@ +# ============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========================================================= + +FROM debian:bullseye-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + openjdk-17-jdk-headless && \ + rm -rf /var/lib/apt/lists/* + +ARG JAR +WORKDIR /opt/app/teiv + +ADD src/main/resources/application.properties /opt/app/teiv/config/application.properties +ADD target/${JAR} /opt/app/teiv/ncmp-to-teiv-adapter.jar + +CMD ["/bin/sh", "-c", "java -jar ncmp-to-teiv-adapter.jar"] diff --git a/adapters/ncmp-to-teiv-adapter/pom.xml b/adapters/ncmp-to-teiv-adapter/pom.xml new file mode 100644 index 0000000..76e0e8c --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/pom.xml @@ -0,0 +1,159 @@ + + + + + + 4.0.0 + + + org.oran.smo + adapters + 0.2.0-SNAPSHOT + + org.oran.smo + ncmp-to-teiv-adapter + 0.0.1-SNAPSHOT + jar + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + + io.cloudevents + cloudevents-core + 3.0.0 + + + io.cloudevents + cloudevents-kafka + 3.0.0 + + + org.springframework.boot + spring-boot-starter + + + org.springframework.kafka + spring-kafka + 3.3.4 + + + org.projectlombok + lombok + true + + + com.fasterxml.jackson.core + jackson-databind + + + com.squareup.okhttp3 + okhttp + 4.9.3 + + + + + + + org.apache.rat + apache-rat-plugin + 0.15 + + + + check + + + + + + io.fabric8 + docker-maven-plugin + ${docker-maven-plugin} + false + + + build-ncmp-to-teiv-adapter-image + + build + push + + + ${env.CONTAINER_PULL_REGISTRY} + ${env.CONTAINER_PUSH_REGISTRY} + + + + o-ran-sc/smo-ncmp-to-teiv-adapter:${project.version} + + + ${project.basedir} + Dockerfile + + ${project.build.finalName}.jar + + + ${project.version} + latest + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/Application.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/Application.java new file mode 100644 index 0000000..c126bc7 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/Application.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.ncmp_to_teiv_adapter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/CloudEventFactory.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/CloudEventFactory.java new file mode 100644 index 0000000..154b5be --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/CloudEventFactory.java @@ -0,0 +1,38 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import io.cloudevents.CloudEvent; +import io.cloudevents.core.builder.CloudEventBuilder; + +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.time.OffsetDateTime; +import java.util.UUID; + +public class CloudEventFactory { + + public static CloudEvent createEvent(String data, String type) { + return CloudEventBuilder.v1().withId(UUID.randomUUID().toString()).withSource(URI.create("ncmp-dmi-plugin:nm-1")) + .withType("topology-inventory-ingestion." + type).withDataSchema(URI.create( + "https://teiv:8080/schemas/v1/r1-topology")).withTime(OffsetDateTime.now()).withData( + "application/yang-data+json", data.getBytes(StandardCharsets.UTF_8)).build(); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaEventProducer.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaEventProducer.java new file mode 100644 index 0000000..e9fdf68 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaEventProducer.java @@ -0,0 +1,42 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import io.cloudevents.CloudEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class KafkaEventProducer { + private final KafkaTemplate kafkaTemplate; + + @Value("${kafka.topic}") + private String topic; + + public void sendCloudEvent(final CloudEvent event) { + kafkaTemplate.send(topic, event); + log.debug("CloudEvent sent"); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaProducerConfig.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaProducerConfig.java new file mode 100644 index 0000000..8547cf9 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/KafkaProducerConfig.java @@ -0,0 +1,56 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import io.cloudevents.CloudEvent; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import io.cloudevents.kafka.CloudEventSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaProducerConfig { + + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServer; + + @Bean + public ProducerFactory producerFactory() { + Map configProps = new HashMap<>(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, CloudEventSerializer.class); + + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpPollingClient.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpPollingClient.java new file mode 100644 index 0000000..f065998 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpPollingClient.java @@ -0,0 +1,102 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.oran.smo.ncmp_to_teiv_adapter.models.ManagedElementWrapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +public class NcmpPollingClient { + + @Value("${polling.base-url}") + private String baseUrl; + + @Value("${polling.searches-url}") + private String searchesUrl; + + @Value("${polling.data-store-url}") + private String dataStoreUrl; + + @Value("${polling.include-descendants}") + private String includeDescendants; + + private static final OkHttpClient client = new OkHttpClient(); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public List getAllCmHandlesFromNcmp() { + try { + HttpUrl url = HttpUrl.parse(baseUrl + searchesUrl).newBuilder().build(); + String requestBody = "{\"conditions\": [{\"name\": \"hasAllModules\"}]}"; + RequestBody body = RequestBody.create(requestBody, MediaType.parse("application/json")); + + Request request = new Request.Builder().url(url).post(body).addHeader("Content-Type", "application/json") + .build(); + log.info("Polling {}", url); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = response.body().string(); + List cmHandles = objectMapper.readValue(responseBody, new TypeReference<>() { + }); + log.info("Parsed List: {}", cmHandles); + return cmHandles; + } else { + log.error("Request failed for: {}, {}", url, response.code()); + } + } + } catch (Exception e) { + log.error("Error polling API: {}", e.getMessage()); + } + return List.of(); + } + + public ManagedElementWrapper getAllManagedElementsFromNcmp(String cmHandle) { + try { + HttpUrl url = HttpUrl.parse(baseUrl + "/" + cmHandle + dataStoreUrl).newBuilder().addQueryParameter( + "resourceIdentifier", "/").addQueryParameter("include-descendants", includeDescendants) + .addQueryParameter("options", "(fields=_3gpp-common-managed-element:ManagedElement)").build(); + Request request = new Request.Builder().url(url).get().addHeader("Content-Type", "application/json").build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = response.body().string(); + log.info("Raw Response for: {}, {}", url, responseBody); + return objectMapper.readValue(responseBody, ManagedElementWrapper.class); + } else { + log.error("Request failed for: {}, {}", url, response.code()); + } + } + } catch (Exception e) { + log.error("Error polling API: {}", e.getMessage()); + } + return new ManagedElementWrapper(); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java new file mode 100644 index 0000000..59ec39a --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/NcmpToTeivIngestion.java @@ -0,0 +1,120 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.cloudevents.CloudEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.oran.smo.ncmp_to_teiv_adapter.models.ManagedElementWrapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.oran.smo.ncmp_to_teiv_adapter.ResourceReader.readResourceFile; + +@Slf4j +@Component +@RequiredArgsConstructor +public class NcmpToTeivIngestion { + + @Value("${send-sample-ocucp-event}") + private boolean sendSampleOCUCPEvent; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private final KafkaEventProducer kafkaEventProducer; + private final NcmpPollingClient ncmpPollingClient; + + private Map addedCmHandles = new HashMap<>(); + + @Scheduled(fixedRateString = "${polling.interval}") + public void pollExternalApi() throws IOException { + List cmHandlesToAdd = ncmpPollingClient.getAllCmHandlesFromNcmp(); + List cmHandlesToDelete = addedCmHandles.keySet().stream().filter(v -> !cmHandlesToAdd.contains(v)).toList(); + addSmo(); + + for (String cmHandle : cmHandlesToAdd) { + addCmHandle(cmHandle); + } + for (String cmHandle : cmHandlesToDelete) { + removeCmHandle(cmHandle); + } + if (sendSampleOCUCPEvent) { + sendSampleOCUCPEvent(); + } + } + + private void addSmo() { + String payload = SmoPayloadBuilder.build(); + CloudEvent event = CloudEventFactory.createEvent(payload, "merge"); + log.info("Sending CloudEvent with payload: {}", payload); + kafkaEventProducer.sendCloudEvent(event); + } + + private void addCmHandle(String cmHandle) { + ManagedElementWrapper wrapper = ncmpPollingClient.getAllManagedElementsFromNcmp(cmHandle); + Map json = wrapper.toTeivCloudEventPayload(); + try { + String payload = objectMapper.writeValueAsString(json); + CloudEvent event = CloudEventFactory.createEvent(payload, "merge"); + log.info("Sending CloudEvent with payload: {}", payload); + kafkaEventProducer.sendCloudEvent(event); + addedCmHandles.put(cmHandle, json); + } catch (JsonProcessingException e) { + log.error("Error processing data from cmHandle {}. Event not sent. Error message: {}", cmHandle, e + .getMessage()); + } + } + + private void removeCmHandle(String cmHandle) { + try { + Object json = addedCmHandles.get(cmHandle); + String payload = objectMapper.writeValueAsString(json); + CloudEvent event = CloudEventFactory.createEvent(payload, "delete"); + log.info("Sending CloudEvent with payload: {}", payload); + kafkaEventProducer.sendCloudEvent(event); + addedCmHandles.remove(cmHandle); + } catch (JsonProcessingException e) { + log.error("Error processing data from cmHandle {}. Event not sent. Error message: {}", cmHandle, e + .getMessage()); + } + } + + private void sendSampleOCUCPEvent() throws IOException { + String content = readResourceFile("sample-responses/_3gpp-common-managed-element-ocucp.json"); + ManagedElementWrapper wrapper = objectMapper.readValue(content, ManagedElementWrapper.class); + Map toJson = wrapper.toTeivCloudEventPayload(); + try { + String payload = objectMapper.writeValueAsString(toJson); + CloudEvent event = CloudEventFactory.createEvent(payload, "merge"); + log.info("Sending CloudEvent with payload: {}", payload); + kafkaEventProducer.sendCloudEvent(event); + addedCmHandles.put("pynts-o-cu-cp-1", toJson); + } catch (JsonProcessingException e) { + log.error("Error processing ocucp data. Event not sent. Error message: {}", e.getMessage()); + } + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/ResourceReader.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/ResourceReader.java new file mode 100644 index 0000000..fbdedc4 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/ResourceReader.java @@ -0,0 +1,55 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class ResourceReader { + + public static String readResourceFile(String resourcePath) throws IOException { + try { + URL resource = ResourceReader.class.getClassLoader().getResource(resourcePath); + if (resource == null) { + throw new IllegalArgumentException("Resource not found: " + resourcePath); + } + + if (resource.getProtocol().equals("jar")) { + try (var inputStream = ResourceReader.class.getClassLoader().getResourceAsStream(resourcePath)) { + if (inputStream == null) { + throw new IllegalArgumentException("Could not open resource as stream: " + resourcePath); + } + return new String(inputStream.readAllBytes()); + } + } else { + Path path = Paths.get(resource.toURI()); + return Files.readString(path); + } + } catch (URISyntaxException e) { + throw new RuntimeException("Failed to read resource: " + resourcePath, e); + } + } + +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/SmoPayloadBuilder.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/SmoPayloadBuilder.java new file mode 100644 index 0000000..576267a --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/SmoPayloadBuilder.java @@ -0,0 +1,60 @@ +/* + * ============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.ncmp_to_teiv_adapter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class SmoPayloadBuilder { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public static String build() { + ArrayNode sourceIds = objectMapper.createArrayNode(); + sourceIds.add("urn:oran:smo:teiv:SMO"); + sourceIds.add("http://smo.o-ran-sc.org"); + sourceIds.add("http://gateway.smo.o-ran-sc.org"); + sourceIds.add("http://dentity.smo.o-ran-sc.org"); + sourceIds.add("http://messages.smo.o-ran-sc.org"); + sourceIds.add("http://kafka-bridge.smo.o-ran-sc.org"); + sourceIds.add("http://kafka-ui.smo.o-ran-sc.org"); + sourceIds.add("http://odlux.oam.smo.o-ran-sc.org"); + sourceIds.add("http://flows.oam.smo.o-ran-sc.org"); + sourceIds.add("http://tests.oam.smo.o-ran-sc.org"); + sourceIds.add("http://ves-collector.dcn.smo.o-ran-sc.org"); + sourceIds.add("http://controller.dcn.smo.o-ran-sc.org"); + sourceIds.add("http://nginx-loadbalancer:80/ncmp/v1/ch"); + ObjectNode attributes = objectMapper.createObjectNode(); + attributes.put("smoName", "SMO"); + ObjectNode smo = objectMapper.createObjectNode(); + smo.put("id", "urn:oran:smo:teiv:SMO"); + smo.set("sourceIds", sourceIds); + smo.set("attributes", attributes); + ArrayNode smoArray = objectMapper.createArrayNode(); + smoArray.add(smo); + ObjectNode entity = objectMapper.createObjectNode(); + entity.set("o-ran-smo-teiv-ran:SMO", smoArray); + ArrayNode entitiesArray = objectMapper.createArrayNode(); + entitiesArray.add(entity); + ObjectNode root = objectMapper.createObjectNode(); + root.set("entities", entitiesArray); + return root.toString(); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractEntity.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractEntity.java new file mode 100644 index 0000000..5adeb14 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractEntity.java @@ -0,0 +1,54 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public abstract class AbstractEntity { + + @Getter + @JsonProperty("id") + private String id; + @JsonIgnore + private Map additionalProperties = new LinkedHashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public abstract Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parentId); + + public abstract String getTeivEntityType(); +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractFunction.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractFunction.java new file mode 100644 index 0000000..480978f --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/AbstractFunction.java @@ -0,0 +1,32 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import java.util.List; +import java.util.Map; + +public abstract class AbstractFunction extends AbstractEntity { + + public abstract Map createRelationshipWithManagedElement(String managedElementId); + + public abstract String getTeivRelationshipWithManagedElement(); + + public abstract void createRelationshipWithSmo(Map> relationshipMap); +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Attributes.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Attributes.java new file mode 100644 index 0000000..bf8bd46 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Attributes.java @@ -0,0 +1,45 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.util.LinkedHashMap; +import java.util.Map; + +public abstract class Attributes { + + @JsonIgnore + private Map additionalProperties = new LinkedHashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public abstract Map createEntityAttributes(); +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPAttributes.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPAttributes.java new file mode 100644 index 0000000..460c579 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPAttributes.java @@ -0,0 +1,60 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +public class GNBCUCPAttributes extends Attributes { + + @Getter + @JsonProperty("pLMNId") + private Plmnid pLMNId; + @Getter + @JsonProperty("gNBCUName") + private String gNBCUName; + @Getter + @JsonProperty("gNBId") + private String gNBId; + @Getter + @JsonProperty("gNBIdLength") + private Integer gNBIdLength; + + @Override + public Map createEntityAttributes() { + Map attributes = new HashMap<>(); + if (this.pLMNId != null) { + attributes.put("pLMNId", this.pLMNId); + } + if (this.gNBCUName != null) { + attributes.put("gNBCUName", this.gNBCUName); + } + if (this.gNBId != null) { + attributes.put("gNBId", this.gNBId); + } + if (this.gNBIdLength != null) { + attributes.put("gNBIdLength", this.gNBIdLength); + } + return attributes; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java new file mode 100644 index 0000000..6c3b9fe --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBCUCPFunction.java @@ -0,0 +1,101 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class GNBCUCPFunction extends AbstractFunction { + + @Getter + @JsonProperty("attributes") + private GNBCUCPAttributes attributes; + @Getter + @JsonProperty("_3gpp-nr-nrm-nrcellcu:NRCellCU") + private List nrCellCUs; + + @Override + public Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parentId) { + createRelationshipWithSmo(relationshipMap); + String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + getId(); + + for (NRCellCU nrCellCU : getNrCellCUs()) { + addNrcellcuEntitiesAndRelationships(nrCellCU, entityMap, relationshipMap); + addRelationshipWithNrcellcu(nrCellCU, relationshipMap); + } + + return Map.of("id", gnbcucpFunctionFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of( + gnbcucpFunctionFdn, "urn:oran:smo:teiv:" + parentId)); + } + + private void addNrcellcuEntitiesAndRelationships(NRCellCU nrCellCU, Map> entityMap, + Map> relationshipMap) { + String type = "o-ran-smo-teiv-ran:NRCellCU"; + if (!entityMap.containsKey(type)) { + entityMap.put(type, new ArrayList<>()); + } + entityMap.get(type).add(nrCellCU.addTeivEntitiesAndRelationships(entityMap, relationshipMap, getId())); + } + + private void addRelationshipWithNrcellcu(NRCellCU nrCellCU, Map> relationshipMap) { + String relType = "o-ran-smo-teiv-ran:OCUCPFUNCTION_PROVIDES_NRCELLCU"; + if (!relationshipMap.containsKey(relType)) { + relationshipMap.put(relType, new ArrayList<>()); + } + relationshipMap.get(relType).add(nrCellCU.createRelationshipWithGnbcucpFunction(getId())); + } + + @Override + public Map createRelationshipWithManagedElement(String managedElementId) { + String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + getId(); + String managedElementFdn = "urn:oran:smo:teiv:" + managedElementId; + return Map.of("id", String.format("urn:oran:smo:teiv:%s_MANAGES_%s", managedElementId, getId()), "aSide", + managedElementFdn, "bSide", gnbcucpFunctionFdn, "sourceIds", List.of(managedElementFdn, gnbcucpFunctionFdn)); + } + + @Override + public String getTeivEntityType() { + return "o-ran-smo-teiv-ran:OCUCPFunction"; + } + + @Override + public String getTeivRelationshipWithManagedElement() { + return "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"; + } + + @Override + public void createRelationshipWithSmo(Map> relationshipMap) { + String ranFunctionRelType = "o-ran-smo-teiv-ran:OCUCPFUNCTION_O1LINK_SMO"; + if (!relationshipMap.containsKey(ranFunctionRelType)) { + relationshipMap.put(ranFunctionRelType, new ArrayList<>()); + } + String gnbcucpFunctionId = getId(); + String smoId = "SMO"; + Map test = Map.of("id", String.format("urn:oran:smo:teiv:%s_O1LINK_%s", gnbcucpFunctionId, smoId), + "bSide", "urn:oran:smo:teiv:" + smoId, "aSide", "urn:oran:smo:teiv:" + gnbcucpFunctionId, "sourceIds", List + .of(smoId, gnbcucpFunctionId)); + relationshipMap.get(ranFunctionRelType).add(test); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUAttributes.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUAttributes.java new file mode 100644 index 0000000..91a90eb --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUAttributes.java @@ -0,0 +1,60 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +public class GNBDUAttributes extends Attributes { + + @Getter + @JsonProperty("pLMNId") + private Plmnid pLMNId; + @Getter + @JsonProperty("gNBDUId") + private String gNBDUId; + @Getter + @JsonProperty("gNBId") + private String gNBId; + @Getter + @JsonProperty("gNBIdLength") + private Integer gNBIdLength; + + @Override + public Map createEntityAttributes() { + Map attributes = new HashMap<>(); + if (this.pLMNId != null) { + attributes.put("dUpLMNId", this.pLMNId); + } + if (this.gNBDUId != null) { + attributes.put("gNBDUId", this.gNBDUId); + } + if (this.gNBId != null) { + attributes.put("gNBId", this.gNBId); + } + if (this.gNBIdLength != null) { + attributes.put("gNBIdLength", this.gNBIdLength); + } + return attributes; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUFunction.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUFunction.java new file mode 100644 index 0000000..d80cc9d --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/GNBDUFunction.java @@ -0,0 +1,101 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class GNBDUFunction extends AbstractFunction { + + @Getter + @JsonProperty("attributes") + private GNBDUAttributes attributes; + @Getter + @JsonProperty("_3gpp-nr-nrm-nrcelldu:NRCellDU") + private List nrCellDUs; + + @Override + public Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parentId) { + createRelationshipWithSmo(relationshipMap); + String gnbduFunctionFdn = "urn:oran:smo:teiv:" + getId(); + + for (NRCellDU nrCellDU : getNrCellDUs()) { + addNrcellduEntitiesAndRelationships(nrCellDU, entityMap, relationshipMap); + addRelationshipWithNrcelldu(nrCellDU, relationshipMap); + } + + return Map.of("id", gnbduFunctionFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of( + gnbduFunctionFdn, "urn:oran:smo:teiv:" + parentId)); + } + + private void addNrcellduEntitiesAndRelationships(NRCellDU nrCellDU, Map> entityMap, + Map> relationshipMap) { + String type = "o-ran-smo-teiv-ran:NRCellDU"; + if (!entityMap.containsKey(type)) { + entityMap.put(type, new ArrayList<>()); + } + entityMap.get(type).add(nrCellDU.addTeivEntitiesAndRelationships(entityMap, relationshipMap, getId())); + } + + private void addRelationshipWithNrcelldu(NRCellDU nrCellDU, Map> relationshipMap) { + String relType = "o-ran-smo-teiv-ran:ODUFUNCTION_PROVIDES_NRCELLDU"; + if (!relationshipMap.containsKey(relType)) { + relationshipMap.put(relType, new ArrayList<>()); + } + relationshipMap.get(relType).add(nrCellDU.createRelationshipWithGnbduFunction(getId())); + } + + @Override + public Map createRelationshipWithManagedElement(String managedElementId) { + String gnbduFunctionFdn = "urn:oran:smo:teiv:" + getId(); + String managedElementFdn = "urn:oran:smo:teiv:" + managedElementId; + return Map.of("id", String.format("urn:oran:smo:teiv:%s_MANAGES_%s", managedElementId, getId()), "aSide", + managedElementFdn, "bSide", gnbduFunctionFdn, "sourceIds", List.of(managedElementFdn, gnbduFunctionFdn)); + } + + @Override + public String getTeivEntityType() { + return "o-ran-smo-teiv-ran:ODUFunction"; + } + + @Override + public String getTeivRelationshipWithManagedElement() { + return "o-ran-smo-teiv-rel-oam-ran:MANAGEDELEMENT_MANAGES_ODUFUNCTION"; + } + + @Override + public void createRelationshipWithSmo(Map> relationshipMap) { + String ranFunctionRelType = "o-ran-smo-teiv-ran:ODUFUNCTION_O1LINK_SMO"; + if (!relationshipMap.containsKey(ranFunctionRelType)) { + relationshipMap.put(ranFunctionRelType, new ArrayList<>()); + } + String gnbduFunctionId = getId(); + String smoId = "SMO"; + Map test = Map.of("id", String.format("urn:oran:smo:teiv:%s_O1LINK_%s", gnbduFunctionId, smoId), + "bSide", "urn:oran:smo:teiv:" + smoId, "aSide", "urn:oran:smo:teiv:" + gnbduFunctionId, "sourceIds", List + .of(smoId, gnbduFunctionId)); + relationshipMap.get(ranFunctionRelType).add(test); + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java new file mode 100644 index 0000000..a3c552b --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElement.java @@ -0,0 +1,95 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +public class ManagedElement extends AbstractEntity { + + @Getter + private List ranFunctions = new ArrayList<>(); + + @Override + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + ObjectMapper mapper = new ObjectMapper(); + + try { + if ("_3gpp-nr-nrm-gnbdufunction:GNBDUFunction".equals(name)) { + List list = (List) value; + for (Object item : list) { + GNBDUFunction du = mapper.convertValue(item, GNBDUFunction.class); + ranFunctions.add(du); + } + } else if ("_3gpp-nr-nrm-gnbcucpfunction:GNBCUCPFunction".equals(name)) { + List list = (List) value; + for (Object item : list) { + GNBCUCPFunction cu = mapper.convertValue(item, GNBCUCPFunction.class); + ranFunctions.add(cu); + } + } else { + getAdditionalProperties().put(name, value); + } + } catch (Exception e) { + log.error("{}", e); + } + } + + @Override + public Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parenId) { + for (AbstractFunction ranFunction : getRanFunctions()) { + addRanFunctionEntitiesAndRelationships(ranFunction, entityMap, relationshipMap); + addRelationshipWithRanFunction(ranFunction, relationshipMap); + } + String managedElementId = "urn:oran:smo:teiv:" + getId(); + return Map.of("id", managedElementId, "sourceIds", List.of(managedElementId)); + } + + private void addRanFunctionEntitiesAndRelationships(AbstractFunction ranFunction, Map> entityMap, + Map> relationshipMap) { + String ranFunctionType = ranFunction.getTeivEntityType(); + if (!entityMap.containsKey(ranFunctionType)) { + entityMap.put(ranFunctionType, new ArrayList<>()); + } + entityMap.get(ranFunctionType).add(ranFunction.addTeivEntitiesAndRelationships(entityMap, relationshipMap, getId())); + } + + private void addRelationshipWithRanFunction(AbstractFunction ranFunction, Map> relationshipMap) { + String ranFunctionRelType = ranFunction.getTeivRelationshipWithManagedElement(); + if (!relationshipMap.containsKey(ranFunctionRelType)) { + relationshipMap.put(ranFunctionRelType, new ArrayList<>()); + } + relationshipMap.get(ranFunctionRelType).add(ranFunction.createRelationshipWithManagedElement(getId())); + } + + @Override + public String getTeivEntityType() { + return "o-ran-smo-teiv-oam:ManagedElement"; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElementWrapper.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElementWrapper.java new file mode 100644 index 0000000..9d62e09 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/ManagedElementWrapper.java @@ -0,0 +1,47 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ManagedElementWrapper { + + @Getter + @JsonProperty("_3gpp-common-managed-element:ManagedElement") + private List managedElements; + + public Map toTeivCloudEventPayload() { + Map> entityMap = new HashMap<>(); + Map> relationshipMap = new HashMap<>(); + List> managedElements = new ArrayList<>(); + for (ManagedElement managedElement : this.managedElements) { + managedElements.add(managedElement.addTeivEntitiesAndRelationships(entityMap, relationshipMap, "")); + } + entityMap.put("o-ran-smo-teiv-oam:ManagedElement", new ArrayList<>(managedElements)); + Map finalJson = Map.of("relationships", List.of(relationshipMap), "entities", List.of(entityMap)); + return finalJson; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCU.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCU.java new file mode 100644 index 0000000..3baca75 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCU.java @@ -0,0 +1,53 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.List; +import java.util.Map; + +public class NRCellCU extends AbstractEntity { + + @Getter + @JsonProperty("attributes") + private NRCellCUAttributes attributes; + + @Override + public Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parentId) { + String nrcellcucpFdn = "urn:oran:smo:teiv:" + getId(); + return Map.of("id", nrcellcucpFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of( + nrcellcucpFdn, "urn:oran:smo:teiv:" + parentId)); + } + + public Map createRelationshipWithGnbcucpFunction(String gnbcucpFunctionId) { + String gnbcucpFunctionFdn = "urn:oran:smo:teiv:" + gnbcucpFunctionId; + String nrcellCuFdn = "urn:oran:smo:teiv:" + getId(); + return Map.of("id", String.format("urn:oran:smo:teiv:%s_PROVIDES_%s", gnbcucpFunctionId, getId()), "aSide", + gnbcucpFunctionFdn, "bSide", nrcellCuFdn, "sourceIds", List.of(gnbcucpFunctionFdn, nrcellCuFdn)); + } + + @Override + public String getTeivEntityType() { + return "o-ran-smo-teiv-ran:NRCellCU"; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCUAttributes.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCUAttributes.java new file mode 100644 index 0000000..57e764f --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellCUAttributes.java @@ -0,0 +1,59 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +public class NRCellCUAttributes extends Attributes { + + @Getter + @JsonProperty("cellLocalId") + private Integer cellLocalId; + @Getter + @JsonProperty("nCI") + private Integer nCI; + @Getter + @JsonProperty("primaryPLMNId") + private Plmnid primaryPLMNId; + @Getter + @JsonProperty("nRTAC") + private Integer nRTAC; + + public Map createEntityAttributes() { + Map attributes = new HashMap<>(); + if (this.cellLocalId != null) { + attributes.put("cellLocalId", this.cellLocalId); + } + if (this.nCI != null) { + attributes.put("nCI", this.nCI); + } + if (this.nRTAC != null) { + attributes.put("nRTAC", this.nRTAC); + } + if (this.primaryPLMNId != null) { + attributes.put("plmnId", this.primaryPLMNId); + } + return attributes; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDU.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDU.java new file mode 100644 index 0000000..247ac59 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDU.java @@ -0,0 +1,53 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.List; +import java.util.Map; + +public class NRCellDU extends AbstractEntity { + + @Getter + @JsonProperty("attributes") + private NRCellDUAttributes attributes; + + @Override + public Map addTeivEntitiesAndRelationships(Map> entityMap, + Map> relationshipMap, String parentId) { + String nrcellduFdn = "urn:oran:smo:teiv:" + getId(); + return Map.of("id", nrcellduFdn, "attributes", attributes.createEntityAttributes(), "sourceIds", List.of( + nrcellduFdn, "urn:oran:smo:teiv:" + parentId)); + } + + public Map createRelationshipWithGnbduFunction(String gnbduFunctionId) { + String gnbduFunctionFdn = "urn:oran:smo:teiv:" + gnbduFunctionId; + String nrcellduFdn = "urn:oran:smo:teiv:" + getId(); + return Map.of("id", String.format("urn:oran:smo:teiv:%s_PROVIDES_%s", gnbduFunctionId, getId()), "aSide", + gnbduFunctionFdn, "bSide", nrcellduFdn, "sourceIds", List.of(gnbduFunctionFdn, nrcellduFdn)); + } + + @Override + public String getTeivEntityType() { + return "o-ran-smo-teiv-ran:NRCellDU"; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDUAttributes.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDUAttributes.java new file mode 100644 index 0000000..0272a76 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/NRCellDUAttributes.java @@ -0,0 +1,59 @@ +/* + * ============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.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +public class NRCellDUAttributes extends Attributes { + + @Getter + @JsonProperty("cellLocalId") + private Integer cellLocalId; + @Getter + @JsonProperty("nCI") + private Integer nCI; + @Getter + @JsonProperty("nRPCI") + private Integer nRPCI; + @Getter + @JsonProperty("nRTAC") + private Integer nRTAC; + + public Map createEntityAttributes() { + Map attributes = new HashMap<>(); + if (this.cellLocalId != null) { + attributes.put("cellLocalId", this.cellLocalId); + } + if (this.nCI != null) { + attributes.put("nCI", this.nCI); + } + if (this.nRTAC != null) { + attributes.put("nRTAC", this.nRTAC); + } + if (this.nRPCI != null) { + attributes.put("nRPCI", this.nRPCI); + } + return attributes; + } +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Plmnid.java b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Plmnid.java new file mode 100644 index 0000000..bad2104 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/java/org/oran/smo/ncmp_to_teiv_adapter/models/Plmnid.java @@ -0,0 +1,34 @@ +/* + * ============LICENSE_START======================================================= + * Modifications Copyright (C) 2025 OpenInfra Foundation Europe + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.oran.smo.ncmp_to_teiv_adapter.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +public class Plmnid { + + @Getter + @JsonProperty("mcc") + private String mcc; + @Getter + @JsonProperty("mnc") + private String mnc; + +} diff --git a/adapters/ncmp-to-teiv-adapter/src/main/resources/application.properties b/adapters/ncmp-to-teiv-adapter/src/main/resources/application.properties new file mode 100644 index 0000000..5295984 --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/resources/application.properties @@ -0,0 +1,32 @@ +# ============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========================================================= + +spring.application.name=ncmp-to-teiv-adapter + +spring.kafka.bootstrap-servers=localhost:9093 +spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer +spring.kafka.producer.value-serializer=io.cloudevents.kafka.CloudEventSerializer +kafka.topic=topology-inventory-ingestion + +send-sample-ocucp-event=false + +polling.base-url=http://localhost:8883/ncmp/v1/ch +polling.data-store-url=/data/ds/ncmp-datastore:passthrough-running +polling.searches-url=/id-searches +polling.include-descendants=false +polling.interval=60000 diff --git a/adapters/ncmp-to-teiv-adapter/src/main/resources/sample-responses/_3gpp-common-managed-element-ocucp.json b/adapters/ncmp-to-teiv-adapter/src/main/resources/sample-responses/_3gpp-common-managed-element-ocucp.json new file mode 100644 index 0000000..4442a3d --- /dev/null +++ b/adapters/ncmp-to-teiv-adapter/src/main/resources/sample-responses/_3gpp-common-managed-element-ocucp.json @@ -0,0 +1,89 @@ +{ + "_3gpp-common-managed-element:ManagedElement": [ + { + "id": "ManagedElement-004", + "attributes": { + "dnPrefix": "SubNetwork=Europe,SubNetwork=Ireland,MeContext=NR004", + "priorityLabel": 1 + }, + "_3gpp-nr-nrm-gnbcucpfunction:GNBCUCPFunction": [ + { + "id": "GNBCUCPFunction-003", + "attributes": { + "gNBCUName": "gnbcucp003", + "gNBId": "3", + "pLMNId": { + "mcc": "01", + "mnc": "234" + }, + "gNBIdLength": "23" + }, + "_3gpp-nr-nrm-nrcellcu:NRCellCU": [ + { + "id": "NRCellCU-003", + "attributes": { + "cellLocalId": 3, + "nRTAC": 50, + "nCI": 500, + "primaryPLMNId": { + "mcc": "03", + "mnc": "345" + } + } + }, + { + "id": "NRCellCU-004", + "attributes": { + "cellLocalId": 4, + "nRTAC": 60, + "nCI": 600, + "primaryPLMNId": { + "mcc": "04", + "mnc": "456" + } + } + } + ] + }, + { + "id": "GNBCUCPFunction-004", + "attributes": { + "gNBCUName": "gnbcucp004", + "gNBId": "4", + "pLMNId": { + "mcc": "01", + "mnc": "234" + }, + "gNBIdLength": "23" + }, + "_3gpp-nr-nrm-nrcellcu:NRCellCU": [ + { + "id": "NRCellCU-005", + "attributes": { + "cellLocalId": 5, + "nRTAC": 50, + "nCI": 500, + "primaryPLMNId": { + "mcc": "05", + "mnc": "567" + } + } + }, + { + "id": "NRCellCU-006", + "attributes": { + "cellLocalId": 6, + "nRTAC": 60, + "nCI": 600, + "primaryPLMNId": { + "mcc": "06", + "mnc": "678" + } + } + } + ] + } + ] + } + ] +} diff --git a/adapters/pom.xml b/adapters/pom.xml new file mode 100644 index 0000000..3cde48b --- /dev/null +++ b/adapters/pom.xml @@ -0,0 +1,54 @@ + + + + + + 4.0.0 + + org.oran.smo + topology-exposure-inventory + 0.2.0-SNAPSHOT + + + org.oran.smo + adapters + 0.2.0-SNAPSHOT + pom + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + ncmp-to-teiv-adapter + + + + 17 + 17 + UTF-8 + + diff --git a/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql b/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql index cf4ed15..dc1f2dc 100644 --- a/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql +++ b/docker-compose/sql_scripts/00_init-teiv-exposure-model.sql @@ -100,11 +100,11 @@ FK_o-ran-smo-teiv-ran_NRSectorCarrier_REL_FK_used-by-nrCellDu FK_o-ran-smo-teiv- FK_o-ran-smo-teiv-ran_NearRTRICFunction_REL_FK_managed-by-managedElement FK_32BDE0334EA6AD74ABB3958A2B163F63A3F05203 CONSTRAINT FK_o-ran-smo-teiv-ran_NearRTRICFunction_REL_FK_nearRTRICFunction-o1-linked-smo FK_38EF935E0C374C18F1865F231A3EA230FD743A91 CONSTRAINT FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_managed-by-managedElement FK_122DD9709032528D161177B3624AD7AAF6589005 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_ocucpFunction-e2-linked-nearRTRICFunction FK_92C27CC7666DB694835211BBAB9639C4FECAA639 CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_ocucpFunction-e2-linked-ocuupFunction FK_03B281BB0D7DB0CBC38DA02B76F4C5E8664040F0 CONSTRAINT FK_o-ran-smo-teiv-ran_OCUCPFunction_REL_FK_ocucpFunction-o1-linked-smo FK_E31B73DB925367F14AEC0DA6EBD7C9BAD8C7A275 CONSTRAINT -FK_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_FK_ocucpFunction-e2-linked-nearRTRICFunction FK_C51E9052970F82631E1BF28C495852340A9858F9 CONSTRAINT -FK_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_FK_ocucpFunction-e2-linked-ocuupFunction FK_C4055161A630A4BEA3C222DE6F04A8FF722351F4 CONSTRAINT -FK_o-ran-smo-teiv-ran_OCUUPFUNCTION_REL_FK_ocuupFunction-e2-linked-nearRTRICFunction FK_8452075F28AAA821F6FC74E6BFED35C1FBFC64C7 CONSTRAINT FK_o-ran-smo-teiv-ran_OCUUPFunction_REL_FK_managed-by-managedElement FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D CONSTRAINT +FK_o-ran-smo-teiv-ran_OCUUPFunction_REL_FK_ocuupFunction-e2-linked-nearRTRICFunction FK_E8131DF616156B9C91CA7C5A68AE261FA00A89BA CONSTRAINT FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_managed-by-managedElement FK_B6F0A4F9024FB47DA39C9A4F1DFFF78330222A80 CONSTRAINT FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_oduFunction-e2-linked-nearRTRICFunction FK_24F4D92B40E989ED842E75CBCDA1CFC16424FE87 CONSTRAINT FK_o-ran-smo-teiv-ran_ODUFunction_REL_FK_oduFunction-f1-c-linked-ocucpFunction FK_8BC456F756C1DA4C4D8571A9A39030157AECD1DE CONSTRAINT @@ -208,19 +208,19 @@ IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_so 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_classifiers_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION IDX_4D7E42AC9DF388919712322B7C0169A370E56ADF INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_090E0962B4064F2ECF7C3256325BF2A30BCE85B8 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO IDX_D9ADFBBC5360F5D511E0E67A0D13622A4BBD78E1 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_OCUCPFunction_REL_CD_sourceIds_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION IDX_13597F9B767DD22A86305D13FF5B050BFE06B14D INDEX +IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_48341F480087D5BD4C2A19DCA0083184B7178A43 INDEX IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO IDX_2F4FCB18A717B38224F5BAA484D2EFE26A458CC7 INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION IDX_1B7127FBB6523636F1D81D9235301D1410A10240 INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_826BB0F20D5BFEAB9BD1B5106046276A6FF7CE5D INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION IDX_8EADD4E436B442260444BBD678577B36B384627A INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_24BDE57AED3B1259709D84A10FC7C5580B8D4AAC INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFUNCTION_REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_E21209AD4691E3A76CC6E58EAC507B59C565F801 INDEX -IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_OCUUPFUNCTION_REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_EF1B4A1F55350A7F49B75FBFBB28BD1B5B4FB9E2 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_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_5E92F3864ACD360810BD006484337B25B5C64004 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_REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_7B8C47A1FD2FCA75DED85825317147EE0831A1C7 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 @@ -311,13 +311,13 @@ IDX_GIN_o-ran-smo-teiv-ran_NearRTRICFunction_REL_CD_decorators_NEARRTRICFUNCTION 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_REL_CD_decorators_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION IDX_7F7A8AE3E6B3F57A5D1273A1243A79CABA4753C0 INDEX +IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_C470E73FA66AEA37FBC2C25AEFB2B959BEA0FBB2 INDEX IDX_GIN_o-ran-smo-teiv-ran_OCUCPFunction_REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO IDX_FC018070572BA39A4683CBDDCAAA16D3A9129DB8 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_OCUCPUFUNCTION_REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION IDX_306486F1958CB0682AAD7DBBF83E6EBBE8159313 INDEX -IDX_GIN_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_7B3604DB1DE3AD5D0CC8A6425BC75E31F9FE3973 INDEX -IDX_GIN_o-ran-smo-teiv-ran_OCUUPFUNCTION_REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_E21F84EB03AE1F94DD674A63E89BE81662FB3B93 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_OCUUPFunction_REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_CEFE5F65D4553C67E4494FCDE9E0E44549171577 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_REL_CD_decorators_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION IDX_714284D19884BC9E2A594B6B5010D429E12F5AE7 INDEX @@ -392,10 +392,10 @@ REL_CD_classifiers_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_classifiers_NFDEPLO 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_E1LINK_OCUUPFUNCTION REL_CD_classifiers_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION COLUMN +REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO COLUMN REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_classifiers_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION COLUMN -REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_classifiers_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_classifiers_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_classifiers_ODUFUNCTION_F1CLINK_OCUCPFUNCTION REL_CD_classifiers_ODUFUNCTION_F1CLINK_OCUCPFUNCTION COLUMN @@ -424,10 +424,10 @@ REL_CD_decorators_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_decorators_NFDEPLOYM 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_E1LINK_OCUUPFUNCTION REL_CD_decorators_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION COLUMN +REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO COLUMN REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_decorators_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION COLUMN -REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_decorators_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_decorators_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_decorators_ODUFUNCTION_F1CLINK_OCUCPFUNCTION REL_CD_decorators_ODUFUNCTION_F1CLINK_OCUCPFUNCTION COLUMN @@ -456,10 +456,10 @@ REL_CD_sourceIds_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_CD_sourceIds_NFDEPLOYMEN 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_E1LINK_OCUUPFUNCTION REL_CD_sourceIds_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION COLUMN +REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO COLUMN REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_CD_sourceIds_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION COLUMN -REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_sourceIds_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_CD_sourceIds_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_CD_sourceIds_ODUFUNCTION_F1CLINK_OCUCPFUNCTION REL_CD_sourceIds_ODUFUNCTION_F1CLINK_OCUCPFUNCTION COLUMN @@ -514,10 +514,10 @@ REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_ID_NFDEPLOYMENT_SERVES_MANAGEDELEM 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_E1LINK_OCUUPFUNCTION REL_ID_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION COLUMN +REL_ID_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_ID_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_ID_OCUCPFUNCTION_O1LINK_SMO REL_ID_OCUCPFUNCTION_O1LINK_SMO COLUMN REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_ID_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_ID_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION REL_ID_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION COLUMN -REL_ID_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_ID_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_ID_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_ID_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_ID_ODUFUNCTION_F1CLINK_OCUCPFUNCTION REL_ID_ODUFUNCTION_F1CLINK_OCUCPFUNCTION COLUMN @@ -546,10 +546,10 @@ REL_metadata_NFDEPLOYMENT_SERVES_MANAGEDELEMENT REL_metadata_NFDEPLOYMENT_SERVES 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_E1LINK_OCUUPFUNCTION REL_metadata_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION COLUMN +REL_metadata_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_metadata_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_metadata_OCUCPFUNCTION_O1LINK_SMO REL_metadata_OCUCPFUNCTION_O1LINK_SMO COLUMN REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU REL_metadata_OCUCPFUNCTION_PROVIDES_NRCELLCU COLUMN -REL_metadata_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION REL_metadata_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION COLUMN -REL_metadata_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_metadata_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_metadata_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION REL_metadata_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_metadata_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION REL_metadata_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION COLUMN REL_metadata_ODUFUNCTION_F1CLINK_OCUCPFUNCTION REL_metadata_ODUFUNCTION_F1CLINK_OCUCPFUNCTION COLUMN @@ -580,11 +580,11 @@ UNIQUE_o-ran-smo-teiv-ran_NRSectorCarrier_REL_ID_ODUFUNCTION_PROVIDES_NRSECTORCA UNIQUE_o-ran-smo-teiv-ran_NearRTRICFunction_REL_ID_MANAGEDELEMENT_MANAGES_NEARRTRICFUNCTION UNIQUE_E020461673334EB824643649B6B31670FB064EC8 CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_NearRTRICFunction_REL_ID_NEARRTRICFUNCTION_O1LINK_SMO UNIQUE_7F0B99D35476B0D3DB489400BA4456E1A31D24E0 CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION UNIQUE_2B7D3D49C1072E660047DE56843413CE628BF94A CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION UNIQUE_FB6281E267F316F3D288BFEF96319FFD5FF2E9CF CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION UNIQUE_636E8949BC041514E4F592F7B65FC701773C6067 CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_OCUCPFunction_REL_ID_OCUCPFUNCTION_O1LINK_SMO UNIQUE_368AE553B3A5941070CAB09A7864BA7E9E08087B CONSTRAINT -UNIQUE_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_ID_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION UNIQUE_7CAC79DC2584327FB2FE54F7D4E28B6FD7130AAD CONSTRAINT -UNIQUE_o-ran-smo-teiv-ran_OCUCPUFUNCTION_REL_ID_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION UNIQUE_F018C4A0E671663AF48B7ED051E9CBD4A5CFB4FE CONSTRAINT -UNIQUE_o-ran-smo-teiv-ran_OCUUPFUNCTION_REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION UNIQUE_DAA54343AD0BC202A93C9EFD22989A1F2F6D21ED CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_OCUUPFunction_REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214 CONSTRAINT +UNIQUE_o-ran-smo-teiv-ran_OCUUPFunction_REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION UNIQUE_90EB740B5632402F115555B7387BC0A218B9A19F CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_MANAGEDELEMENT_MANAGES_ODUFUNCTION UNIQUE_D570291C9E28A2AF73387B7A8B0F4C70130EEDB4 CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_ODUFUNCTION_E2LINK_NEARRTRICFUNCTION UNIQUE_F504808C587D183EA569C353BDCB7923AB1DDFE9 CONSTRAINT UNIQUE_o-ran-smo-teiv-ran_ODUFunction_REL_ID_ODUFUNCTION_F1CLINK_OCUCPFUNCTION UNIQUE_B3D6249002011DDAB474A440BEA6BDF00E1391CB CONSTRAINT @@ -659,10 +659,7 @@ 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_OCUCPUFUNCTION o-ran-smo-teiv-ran_OCUCPUFUNCTION TABLE -o-ran-smo-teiv-ran_OCUUPFUNCTION o-ran-smo-teiv-ran_OCUUPFUNCTION TABLE o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-ran_OCUUPFunction TABLE -o-ran-smo-teiv-ran_OCUUPUFUNCTION o-ran-smo-teiv-ran_OCUUPUFUNCTION 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_SMO o-ran-smo-teiv-ran_SMO TABLE @@ -703,7 +700,7 @@ o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2025 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-physical urn:o-ran:smo-teiv-physical PHYSICAL [] 2025-04-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXBoeXNpY2FsIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LXBoeXNpY2FsIjsKICBwcmVmaXggb3ItdGVpdi1waHlzaWNhbDsKCiAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7cHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICBvcmdhbml6YXRpb24gIk8tUkFOIEFsbGlhbmNlIjsKCiAgY29udGFjdAogICAgInd3dy5vLXJhbi5vcmciOwoKICBkZXNjcmlwdGlvbgogICAgIlBoeXNpY2FsIGRvbWFpbiB0b3BvbG9neSBtb2RlbC4KICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICBQaHlzaWNhbCBkb21haW4uCgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjUgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCiAgICBDb3B5cmlnaHQgMjAyNSB0aGUgTy1SQU4gQWxsaWFuY2UuCgogICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnQVMgSVMnCiAgICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAgICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQogICAgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICAgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICAgIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCiAgICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgYWJvdmUgZGlzY2xhaW1lci4KICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBhYm92ZSBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgTWVtYmVycyBvZiB0aGUgTy1SQU4gQWxsaWFuY2Ugbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiI7CgogIHJldmlzaW9uICIyMDI1LTA0LTE0IiB7CiAgICBkZXNjcmlwdGlvbiAiQWRkZWQgYXR0cmlidXRlcyBjb250YWluZXIgdG8gU2l0ZSI7CiAgICBvci10ZWl2LXlleHQ6bGFiZWwgMS4xLjA7CiAgfQoKICByZXZpc2lvbiAiMjAyNS0wMi0xMCIgewogICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMC4wOwogICAgICByZWZlcmVuY2UgIk8tUkFOLldHMTAuVEUmSVYtRE0uMC1SMDA0LXYwMi4wMCI7CiAgfQoKICBvci10ZWl2LXlleHQ6ZG9tYWluIFBIWVNJQ0FMOwoKICBsaXN0IFBoeXNpY2FsQXBwbGlhbmNlIHsKICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgIGtleSBpZDsKCiAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgUGh5c2ljYWwgQXBwbGlhbmNlIGluIHRoZSBQaHlzaWNhbCBkb21haW4iOwoKICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgUGh5c2ljYWwgQXBwbGlhbmNlIGF0dHJpYnV0ZXMiOwogICAgICBsZWFmIHZlbmRvck5hbWUgewogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIHRoZSBwaHlzaWNhbCBhcHBsaWFuY2UgdmVuZG9yIjsKICAgICAgfQoKICAgICAgbGVhZiBtb2RlbE5hbWUgewogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIHRoZSBwaHlzaWNhbCBhcHBsaWFuY2UgbW9kZWwiOwogICAgICB9CiAgICB9CiAgfQoKICBsaXN0IFNpdGUgewogICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAga2V5IGlkOwoKICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSBTaXRlIGluIHRoZSBQaHlzaWNhbCBkb21haW4iOwoKICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgY29udGFpbmVyIHNpdGVMb2NhdGlvbiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50YXRpb24gb2YgcGh5c2ljYWwgc2l0ZSBsb2NhdGlvbiI7CiAgICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6R2VvSW5mb3JtYXRpb247CiAgICAgIH0KICAgICAgbGVhZiBzaXRlTmFtZSB7CiAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgZGVzY3JpcHRpb24gIkh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhlIHBoeXNpY2FsIHNpdGUgYXMgaWRlbnRpZmllZCBieSB0aGUgbW9iaWxlIG5ldHdvcmsgb3BlcmF0b3IiOwogICAgICB9CiAgICB9CiAgfQoKICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIFBIWVNJQ0FMQVBQTElBTkNFX0lOU1RBTExFREFUX1NJVEUgeyAvLyAxLi5uIHRvIDEuLm0KICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgIGtleSBpZDsKICAgIGRlc2NyaXB0aW9uICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBoeXNpY2FsQXBwbGlhbmNlIHR5cGUuCiAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNpdGUgdHlwZS4iOwoKICAgIGxlYWYtbGlzdCBpbnN0YWxsaW5nLXNpdGUgewogICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICBkZXNjcmlwdGlvbiAiU2l0ZSBpbnN0YWxsaW5nIFBoeXNpY2FsQXBwbGlhbmNlLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIFBoeXNpY2FsQXBwbGlhbmNlOyAKICAgIH0KCiAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLXBoeXNpY2FsQXBwbGlhbmNlIHsKICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgZGVzY3JpcHRpb24gIlBoeXNpY2FsQXBwbGlhbmNlIGluc3RhbGxlZCBhdCBTaXRlLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIFNpdGU7ICAKICAgIH0KICB9Cn0K -o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2025-04-01 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAiUkFOIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICAgICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkKICAgICAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNSBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI1LTA0LTAxIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gaW50cm9kdWNlcyBTTU8gYW5kIE8xIGludGVyZmFjZSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4zOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI1LTAzLTI4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gaW50cm9kdWNlcyBFMiBhbmQgT3BlbiBGcm9udGhhdWwgaW50ZXJmYWNlcyI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4yOwogICAgfQogICAgCiAgICByZXZpc2lvbiAiMjAyNS0wMy0yMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJQcm9wb3NlZCBlbnRpdGllcywgcmVsYXRpb25zaGlwcyBhbmQgYXR0cmlidXRlcyI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4xOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI1LTAyLTE0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJldmlzaW9uIHRvIHJlbmFtZSBhZGFwdGVyIGdyb3VwIHRvIG9yaWdpbiBncm91cC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjEuMDsKICAgICAgICByZWZlcmVuY2UgIk8tUkFOLldHMTAuVEUmSVYtRE0uMC1SMDA0LXYwMi4wMCI7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMTAiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjAuMDsKICAgICAgICByZWZlcmVuY2UgIk8tUkFOLldHMTAuVEUmSVYtRE0uMC1SMDA0LXYwMS4wMCI7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBTTU8gewogICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIE1hbmFnZW1lbnQgYW5kIE9yY2hlc3RyYXRpb24gKFNNTykuCgogICAgICAgIEEgY2VudHJhbGl6ZWQgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciB0aGUgbWFuYWdlbWVudCwgb3JjaGVzdHJhdGlvbiwKICAgICAgICBhbmQgYXV0b21hdGlvbiBvZiB0aGUgZW50aXJlIFJBTiBpbmZyYXN0cnVjdHVyZS4gU01PIGVuYWJsZXMgZmxleGlibGUsCiAgICAgICAgc29mdHdhcmUtZHJpdmVuIG5ldHdvcmsgY29udHJvbCBhbmQgaXMgY3JpdGljYWwgZm9yIGVuYWJsaW5nIHRoZSBvcGVuLAogICAgICAgIGludGVyb3BlcmFibGUsIGFuZCBkaXNhZ2dyZWdhdGVkIGFwcHJvYWNoIHRoYXQgZGVmaW5lcyBPLVJBTi4KCiAgICAgICAgSW4gdGhlIE8tUkFOIGFyY2hpdGVjdHVyZSwgdGhlIFNNTyBpcyBwYXJ0IG9mIHRoZSBtYW5hZ2VtZW50IGFuZAogICAgICAgIG9yY2hlc3RyYXRpb24gbGF5ZXIsIHNpdHRpbmcgYWJvdmUgdGhlIFJBTiBlbGVtZW50cyBsaWtlIHRoZSBSVSwgRFUsCiAgICAgICAgYW5kIENVLiBJdCBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgUkFOIHVzaW5nIG9wZW4gaW50ZXJmYWNlcywKICAgICAgICBwYXJ0aWN1bGFybHkgTzEgYW5kIEExIGludGVyZmFjZXMiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNtb05hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgdGhlIFNNTyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgTy1EVSBpcyBhbiBPLVJBTiBORiBpbiB0aGUgTy1SQU4gQXJjaGl0ZWN0dXJlLiBBbiBPLURVLCBjb21iaW5lZCB3aXRoCiAgICAgICAgb25lIG9yIG1vcmUgTy1SVShzKSBjb25uZWN0ZWQgdG8gaXQsIHN1cHBvcnRzIGFuZCBpcyBmdWxseSBjb21wYXRpYmxlCiAgICAgICAgd2l0aCB0aGUgZnVuY3Rpb25zIG9mIGEgZ05CLURVIGFzIGRlZmluZWQgYnkgM0dQUCBUUyAzOC40MDEuCgogICAgICAgIFRoZSBPLURVIHRlcm1pbmF0ZXMgdGhlIEUyIGFuZCB0aGUgRjEgaW50ZXJmYWNlLCBhbmQgdGhlIE9wZW4gRnJvbnRoYXVsCiAgICAgICAgaW50ZXJmYWNlIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgdGhlIFJMQywgTUFDLCBhbmQKICAgICAgICBIaWdoLVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4KCiAgICAgICAgTm90ZTogTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLURVIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLURVIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAgIElPQyBHTkJEVUZ1bmN0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIE5SIE5STSBtb2RlbCwgYXMgcGVyIDNHUFAgVFMgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKSBhdHRyaWJ1dGVzIjsKCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWwgVW5pdCDigJMgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgTkctYywgWDItYywgWG4tYywgRjEtYywgYW5kIEUxIGludGVyZmFjZXMgYXMKICAgICAgICB3ZWxsIGFzIHRoZSBSUkMgYW5kIFBEQ1AgKGZvciBTUkIpIHByb3RvY29scyB0b3dhcmRzIHRoZSBVRSBhcyBkZWZpbmVkIGJ5CiAgICAgICAgM0dQUCBUUyAzOC40MDEuIFRoZSBPLUNVLUNQIHRlcm1pbmF0ZXMgRTIgaW50ZXJmYWNlIHRvIE5lYXItUlQgUklDIGFuZCBpcwogICAgICAgIG1hbmFnZWQgdmlhIE8xIGludGVyZmFjZSBieSB0aGUgU01PLgoKICAgICAgICBOb3RlOiBPLUNVLUNQIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBPUkFOTmV0d29ya0Z1bmN0aW9uCiAgICAgICAgYWJzdHJhY3QgY2xhc3MuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZQogICAgICAgIE8tQ1UtQ1Agb2JqZWN0LgogICAgICAgICAgICAKICAgICAgICBUaGUgbWFuYWdlbWVudCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIE8tQ1UtQ1AgTy1SQU4gTkYgaXMgcmVwcmVzZW50ZWQgYnkKICAgICAgICB0aGUgSU9DIEdOQkNVQ1BGdW5jdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBOUiBOUk0gbW9kZWwsIGFzIHBlciAzR1BQIFRTCiAgICAgICAgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBDZW50cmFsIFVuaXQg4oCTIENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApIGF0dHJpYnV0ZXMiOwogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTiBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24geyAgICAgICAgCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIFRoZSBPLUNVLVVQIHRlcm1pbmF0ZXMgdGhlIE5HLXUsIFgyLXUsIFhuLXUsIEYxLXUsIGFuZCBFMSBpbnRlcmZhY2VzIGFzCiAgICAgICAgd2VsbCBhcyB0aGUgUERDUCBhbmQgU0RBUCBwcm90b2NvbHMgdG93YXJkcyB0aGUgVUUgYXMgZGVmaW5lZCBieSAzR1BQIFRTCiAgICAgICAgMzguNDAxLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIEUyIGludGVyZmFjZSB0byBOZWFyLVJUIFJJQyBhbmQgaXMgbWFuYWdlZAogICAgICAgIHZpYSBPMSBpbnRlcmZhY2UgYnkgdGhlIFNNTy4KCiAgICAgICAgTm90ZTogTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLUNVLVVQIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLUNVLVVQIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5CiAgICAgICAgdGhlIElPQyBHTkJDVVVQRnVuY3Rpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgTlIgTlJNIG1vZGVsLCBhcyBwZXIgM0dQUCBUUwogICAgICAgIDI4LjU0MSI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gQ2VudHJhbCBVbml0IOKAkyBVc2VyIFBsYW5lIChPLUNVLVVQKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdCBwTE1OSWRMaXN0IHsKICAgICAgICAgICAgICAgIGtleSAibWNjIG1uYyI7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiB1bmlxdWUgaWRlbnRpdGllcyBmb3IgUExNTiI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJOZWFyLVJlYWwtVGltZSBSQU4gSW50ZWxsaWdlbnQgQ29udHJvbGxlciAoTmVhci1SVCBSSUMpLgoKICAgICAgICBOZWFyLVJUIFJJQyBpcyBhbiBPLVJBTiBORiB0aGF0IGVuYWJsZXMgbmVhciByZWFsLXRpbWUgY29udHJvbCBhbmQKICAgICAgICBvcHRpbWl6YXRpb24gb2Ygc2VydmljZXMgYW5kIHJlc291cmNlcyBvZiBFMiBOb2RlcyB2aWEgZmluZS1ncmFpbmVkIGRhdGEKICAgICAgICBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgdGhlIEUyIGludGVyZmFjZSB3aXRoIGNvbnRyb2wgbG9vcHMgaW4gdGhlCiAgICAgICAgb3JkZXIgb2YgMTAgbXMtMXMuIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5lYXJSdFJpY0lkIHsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGlmaWVyIG9mIE5lYXItUlQgUklDIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpCgogICAgICAgIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZSAoYWxzbyBrbm93biBhcyBMTFMKICAgICAgICBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIAogICAgICAgIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4KCiAgICAgICAgVGhlIE8tUlUgdGVybWluYXRlcyB0aGUgT3BlbiBGcm9udGhhdWwgTS1QbGFuZSBpbnRlcmZhY2UgdG93YXJkcyB0aGUgTy1EVQogICAgICAgIGFuZCBTTU8uIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gUmFkaW8gVW5pdCAoTy1SVSkgYXR0cmlidXRlcyI7CiAgICAgICAgICAgIGxlYWYgb3J1SWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiB0aGUgTy1SVSBhcyBkaXNjb3ZlcmVkIGZyb20gdGhlIHNvdXJjZSBkb21haW4gYmFzZWQgb24gTS1QbGFuZSBhcmNoaXRlY3R1cmUgbW9kZWwiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1DVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIFNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbgogICAgICAgIFNpZ25hbCAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kCiAgICAgICAgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItRFUuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBzaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24gc2lnbmFsCiAgICAgICAgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZCBwcm92aWRlCiAgICAgICAgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE5SIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgIGNlbGxzLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIkEgZ3JvdXAgb2YgY28tbG9jYXRlZCBDZWxscyB0aGF0IGhhdmUgYSBzaGFyZWQKICAgICAgICBjb3ZlcmFnZSBhcmVhLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTERVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJDZWxsRFUgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQSBPRFVGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBPRFVGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBEVSBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0RVRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUEZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTENVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxDVSB0eXBlLgogICAgICAgICAgICBUaGUgT0NVQ1BGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBDVS1DUCBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJDZWxsQ1UuCiAgICAgICAgICAgIEEgT0NVQ1BGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbENVLgogICAgICAgICAgICBBbiBOUkNlbGxDVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsQ3UgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBwcm92aWRlcyBOUiBDZWxsLUNVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9jdWNwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1DVSBwcm92aWRlZCBieSBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxDVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUkNFTExEVV9VU0VTX05SU0VDVE9SQ0FSUklFUiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgTlJDZWxsRFUgcmVwcmVzZW50cyB0aGUgY2VsbCB0aGF0IHVzZXMgdGhlIE5SU2VjdG9yQ2Fycmllci4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIHVzZSBtYW55IE5SU2VjdG9yQ2FycmllcnMuCiAgICAgICAgICAgIEFuIE5SU2VjdG9yQ2FycmllciBpbnN0YW5jZSBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSBOUkNlbGxEVS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SQ2VsbERVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlZCBieSBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eSB0eXBlLgogICAgICAgICAgICBUaGUgTlJTZWN0b3JDYXJyaWVyIHJlcHJlc2VudHMgdGhlIGNhcnJpZXIgdGhhdCB1c2VzIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiB1c2Ugb25seSBvbmUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSB1c2VkIGJ5IG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTZWN0b3IgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEEgU2VjdG9yIGluc3RhbmNlIGNhbiBncm91cCBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUFVGVU5DVElPTl9FMUxJTktfT0NVVVBVRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BVRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUFVGVU5DVElPTiB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIEUxIGxpbmsgYmV0d2VlbiB0aGUKICAgICAgICAgICAgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvY3VjcEZ1bmN0aW9uLWUyLWxpbmtlZC1vY3V1cEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1VDUCBGdW5jdGlvbiBsaW5rcyBPLUNVVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk9DVUNQVUZVTkNUSU9OOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgb2N1dXBGdW5jdGlvbi1lMi1saW5rZWQtYnktb2N1Y3BGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVVVAgRnVuY3Rpb24gbGlua2VkIGJ5IE8tQ1VDUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0NVVVBVRlVOQ1RJT047CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9FMkxJTktfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOZWFyUlRSSUNGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIEUyIGxpbmsgYmV0d2VlbiB0aGUKICAgICAgICAgICAgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1lMi1saW5rZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rcyBOZWFyIFJUIFJJQyBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBuZWFyUlRSSUNGdW5jdGlvbi1lMi1saW5rZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NVQ1BVRlVOQ1RJT05fRTJMSU5LX05FQVJSVFJJQ0ZVTkNUSU9OIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQVUZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTmVhclJUUklDRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lcyBhbiBFMiBsaW5rIGJldHdlZW4gdGhlCiAgICAgICAgICAgIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb2N1Y3BGdW5jdGlvbi1lMi1saW5rZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVUNQIEZ1bmN0aW9uIGxpbmtzIE5lYXIgUlQgUklDIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPQ1VDUFVGVU5DVElPTjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG5lYXJSVFJJQ0Z1bmN0aW9uLWUyLWxpbmtlZC1ieS1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5lYXIgUlQgUklDIEZ1bmN0aW9uIGxpbmtlZCBieSBPLUNVQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NVVVBGVU5DVElPTl9FMkxJTktfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVVVBGVU5DVElPTiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRTIgbGluayBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9jdXVwRnVuY3Rpb24tZTItbGlua2VkLW5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1VVUCBGdW5jdGlvbiBsaW5rcyBOZWFyIFJUIFJJQyBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0NVVVBGVU5DVElPTjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG5lYXJSVFJJQ0Z1bmN0aW9uLWUyLWxpbmtlZC1ieS1vY3V1cEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5lYXIgUlQgUklDIEZ1bmN0aW9uIGxpbmtlZCBieSBPLUNVVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT1JVRlVOQ1RJT05fT0ZITUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBNLVBsYW5lIEludGVyZmFjZSBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9ydUZ1bmN0aW9uLW9maG0tbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIFNNTy4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzbW8tb2ZobS1saW5rZWQtYnktb3J1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU01PIGxpbmtlZCBieSBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PRkhNTElOS19PRFVGVU5DVElPTiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBNLVBsYW5lIEludGVyZmFjZSBiZXR3ZWVuCiAgICAgICAgICAgIHRoZSBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9ydUZ1bmN0aW9uLW9maG0tbGlua2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tUlUgRnVuY3Rpb24gbGlua3MgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBvZHVGdW5jdGlvbi1vZmhtLWxpbmtlZC1ieS1vcnVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIGxpbmtlZCBieSBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPRFVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9SVUZVTkNUSU9OX09GSENMSU5LX09EVUZVTkNUSU9OIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lcyBhbiBPcGVuIEZIIChGcm9udGhhdWwpIENvbnRyb2wgSW50ZXJmYWNlIGJldHdlZW4KICAgICAgICAgICAgdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tb2ZoYy1saW5rZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBsaW5rcyBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPUlVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG9kdUZ1bmN0aW9uLW9maGMtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua2VkIGJ5IE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT1JVRlVOQ1RJT05fT0ZIVUxJTktfT0RVRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT1JVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPRFVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIE9wZW4gRkggKEZyb250aGF1bCkgVXNlciBJbnRlcmZhY2UgYmV0d2VlbgogICAgICAgICAgICB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvcnVGdW5jdGlvbi1vZmh1LWxpbmtlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk9SVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgb2R1RnVuY3Rpb24tb2ZodS1saW5rZWQtYnktb3J1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rZWQgYnkgTy1SVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PRkhTTElOS19PRFVGVU5DVElPTiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBTeW5jaHJvbml6YXRpb24gSW50ZXJmYWNlCiAgICAgICAgICAgIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tb2Zocy1saW5rZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBsaW5rcyBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPUlVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG9kdUZ1bmN0aW9uLW9maHMtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua2VkIGJ5IE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fTzFMSU5LX1NNTyB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPRFVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNNTyB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIE8xIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9kdUZ1bmN0aW9uLW8xLWxpbmtlZC1zbW8gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rcyBTTU8uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTTU8gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOlNNTzsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fTzFMSU5LX1NNTyB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VDUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb2N1Y3BGdW5jdGlvbi1vMS1saW5rZWQtc21vIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gbGlua3MgU01PLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNNTyBsaW5rZWQgYnkgTmVhciBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PMUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tbzEtbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIFNNTy4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzbW8tbzEtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNNTyBsaW5rcyBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORUFSUlRSSUNGVU5DVElPTl9PMUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgbmVhclJUUklDRnVuY3Rpb24tbzEtbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyIFJUIFJJQyBGdW5jdGlvbiBsaW5rcyBTTU8uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTTU8gbGlua2VkIGJ5IE5lYXIgUlQgUklDIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9GMVVMSU5LX09DVVVQRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRjEtdSBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1mMS11LWxpbmtlZC1vY3V1cEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua3MgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBvY3V1cEZ1bmN0aW9uLWYxLXUtbGlua2VkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtVVAgRnVuY3Rpb24gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9DVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9GMUNMSU5LX09DVUNQRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VDUEZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRjEtYyBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1mMS1jLWxpbmtlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua3MgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgb2N1Y3BGdW5jdGlvbi1mMS1jLWxpbmtlZC1ieS1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIGxpbmtlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 +o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2025-04-01 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbiAiUkFOIExvZ2ljYWwgdG9wb2xvZ3kgbW9kZWwuCgogICAgICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlCiAgICAgICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkKICAgICAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4KCiAgICAgICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICAgICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQtMjAyNSBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsKICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLAogICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiAgICAgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAiOwoKICAgIHJldmlzaW9uICIyMDI1LTA0LTAxIiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gaW50cm9kdWNlcyBTTU8gYW5kIE8xIGludGVyZmFjZSI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4zOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI1LTAzLTI4IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcmV2aXNpb24gaW50cm9kdWNlcyBFMiBhbmQgT3BlbiBGcm9udGhhdWwgaW50ZXJmYWNlcyI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4yOwogICAgfQogICAgCiAgICByZXZpc2lvbiAiMjAyNS0wMy0yMCIgewogICAgICAgIGRlc2NyaXB0aW9uICJQcm9wb3NlZCBlbnRpdGllcywgcmVsYXRpb25zaGlwcyBhbmQgYXR0cmlidXRlcyI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDEuMS4xOwogICAgfQoKICAgIHJldmlzaW9uICIyMDI1LTAyLTE0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIlJldmlzaW9uIHRvIHJlbmFtZSBhZGFwdGVyIGdyb3VwIHRvIG9yaWdpbiBncm91cC4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjEuMDsKICAgICAgICByZWZlcmVuY2UgIk8tUkFOLldHMTAuVEUmSVYtRE0uMC1SMDA0LXYwMi4wMCI7CiAgICB9CgogICAgcmV2aXNpb24gIjIwMjQtMTAtMTAiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAxLjAuMDsKICAgICAgICByZWZlcmVuY2UgIk8tUkFOLldHMTAuVEUmSVYtRE0uMC1SMDA0LXYwMS4wMCI7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSQU47CgogICAgbGlzdCBTTU8gewogICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIE1hbmFnZW1lbnQgYW5kIE9yY2hlc3RyYXRpb24gKFNNTykuCgogICAgICAgIEEgY2VudHJhbGl6ZWQgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciB0aGUgbWFuYWdlbWVudCwgb3JjaGVzdHJhdGlvbiwKICAgICAgICBhbmQgYXV0b21hdGlvbiBvZiB0aGUgZW50aXJlIFJBTiBpbmZyYXN0cnVjdHVyZS4gU01PIGVuYWJsZXMgZmxleGlibGUsCiAgICAgICAgc29mdHdhcmUtZHJpdmVuIG5ldHdvcmsgY29udHJvbCBhbmQgaXMgY3JpdGljYWwgZm9yIGVuYWJsaW5nIHRoZSBvcGVuLAogICAgICAgIGludGVyb3BlcmFibGUsIGFuZCBkaXNhZ2dyZWdhdGVkIGFwcHJvYWNoIHRoYXQgZGVmaW5lcyBPLVJBTi4KCiAgICAgICAgSW4gdGhlIE8tUkFOIGFyY2hpdGVjdHVyZSwgdGhlIFNNTyBpcyBwYXJ0IG9mIHRoZSBtYW5hZ2VtZW50IGFuZAogICAgICAgIG9yY2hlc3RyYXRpb24gbGF5ZXIsIHNpdHRpbmcgYWJvdmUgdGhlIFJBTiBlbGVtZW50cyBsaWtlIHRoZSBSVSwgRFUsCiAgICAgICAgYW5kIENVLiBJdCBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgUkFOIHVzaW5nIG9wZW4gaW50ZXJmYWNlcywKICAgICAgICBwYXJ0aWN1bGFybHkgTzEgYW5kIEExIGludGVyZmFjZXMiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNtb05hbWUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5hbWUgb2YgdGhlIFNNTyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9EVUZ1bmN0aW9uIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIERpc3RyaWJ1dGVkIFVuaXQgKE8tRFUpLgoKICAgICAgICBUaGUgTy1EVSBpcyBhbiBPLVJBTiBORiBpbiB0aGUgTy1SQU4gQXJjaGl0ZWN0dXJlLiBBbiBPLURVLCBjb21iaW5lZCB3aXRoCiAgICAgICAgb25lIG9yIG1vcmUgTy1SVShzKSBjb25uZWN0ZWQgdG8gaXQsIHN1cHBvcnRzIGFuZCBpcyBmdWxseSBjb21wYXRpYmxlCiAgICAgICAgd2l0aCB0aGUgZnVuY3Rpb25zIG9mIGEgZ05CLURVIGFzIGRlZmluZWQgYnkgM0dQUCBUUyAzOC40MDEuCgogICAgICAgIFRoZSBPLURVIHRlcm1pbmF0ZXMgdGhlIEUyIGFuZCB0aGUgRjEgaW50ZXJmYWNlLCBhbmQgdGhlIE9wZW4gRnJvbnRoYXVsCiAgICAgICAgaW50ZXJmYWNlIChhbHNvIGtub3duIGFzIExMUyBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgdGhlIFJMQywgTUFDLCBhbmQKICAgICAgICBIaWdoLVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIHRoZSBVRS4KCiAgICAgICAgTm90ZTogTy1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLURVIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLURVIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5IHRoZQogICAgICAgIElPQyBHTkJEVUZ1bmN0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIE5SIE5STSBtb2RlbCwgYXMgcGVyIDNHUFAgVFMgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBEaXN0cmlidXRlZCBVbml0IChPLURVKSBhdHRyaWJ1dGVzIjsKCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVUNQRnVuY3Rpb24gewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwogICAgCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIENlbnRyYWwgVW5pdCDigJMgQ29udHJvbCBQbGFuZSAoTy1DVS1DUCkKCiAgICAgICAgVGhlIE8tQ1UtQ1AgdGVybWluYXRlcyB0aGUgTkctYywgWDItYywgWG4tYywgRjEtYywgYW5kIEUxIGludGVyZmFjZXMgYXMKICAgICAgICB3ZWxsIGFzIHRoZSBSUkMgYW5kIFBEQ1AgKGZvciBTUkIpIHByb3RvY29scyB0b3dhcmRzIHRoZSBVRSBhcyBkZWZpbmVkIGJ5CiAgICAgICAgM0dQUCBUUyAzOC40MDEuIFRoZSBPLUNVLUNQIHRlcm1pbmF0ZXMgRTIgaW50ZXJmYWNlIHRvIE5lYXItUlQgUklDIGFuZCBpcwogICAgICAgIG1hbmFnZWQgdmlhIE8xIGludGVyZmFjZSBieSB0aGUgU01PLgoKICAgICAgICBOb3RlOiBPLUNVLUNQIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBPUkFOTmV0d29ya0Z1bmN0aW9uCiAgICAgICAgYWJzdHJhY3QgY2xhc3MuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZQogICAgICAgIE8tQ1UtQ1Agb2JqZWN0LgogICAgICAgICAgICAKICAgICAgICBUaGUgbWFuYWdlbWVudCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIE8tQ1UtQ1AgTy1SQU4gTkYgaXMgcmVwcmVzZW50ZWQgYnkKICAgICAgICB0aGUgSU9DIEdOQkNVQ1BGdW5jdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBOUiBOUk0gbW9kZWwsIGFzIHBlciAzR1BQIFRTCiAgICAgICAgMjguNTQxIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ29udGFpbmVyIGZvciBPLVJBTiBDZW50cmFsIFVuaXQg4oCTIENvbnRyb2wgUGxhbmUgKE8tQ1UtQ1ApIGF0dHJpYnV0ZXMiOwogICAgICAgICAgICBsZWFmIGdOQkNVTmFtZSB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIGdOb2RlQi1DVSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBwTE1OSWQgewogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB0byBiZSB1c2VkIGFzIHBhcnQgb2YgZ2xvYmFsIFJBTiBub2RlIGlkZW50aXR5IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE9DVVVQRnVuY3Rpb24geyAgICAgICAgCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJPLVJBTiBDZW50cmFsaXplZCBVbml0IFVzZXIgUGxhbmUgKE8tQ1UtVVApCgogICAgICAgIFRoZSBPLUNVLVVQIHRlcm1pbmF0ZXMgdGhlIE5HLXUsIFgyLXUsIFhuLXUsIEYxLXUsIGFuZCBFMSBpbnRlcmZhY2VzIGFzCiAgICAgICAgd2VsbCBhcyB0aGUgUERDUCBhbmQgU0RBUCBwcm90b2NvbHMgdG93YXJkcyB0aGUgVUUgYXMgZGVmaW5lZCBieSAzR1BQIFRTCiAgICAgICAgMzguNDAxLiBUaGUgTy1DVS1VUCB0ZXJtaW5hdGVzIEUyIGludGVyZmFjZSB0byBOZWFyLVJUIFJJQyBhbmQgaXMgbWFuYWdlZAogICAgICAgIHZpYSBPMSBpbnRlcmZhY2UgYnkgdGhlIFNNTy4KCiAgICAgICAgTm90ZTogTy1DVS1VUCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgT1JBTk5ldHdvcmtGdW5jdGlvbgogICAgICAgIGFic3RyYWN0IGNsYXNzLiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB0aGUKICAgICAgICBPLUNVLVVQIG9iamVjdC4KCiAgICAgICAgVGhlIG1hbmFnZW1lbnQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPLUNVLVVQIE8tUkFOIE5GIGlzIHJlcHJlc2VudGVkIGJ5CiAgICAgICAgdGhlIElPQyBHTkJDVVVQRnVuY3Rpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgTlIgTlJNIG1vZGVsLCBhcyBwZXIgM0dQUCBUUwogICAgICAgIDI4LjU0MSI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gQ2VudHJhbCBVbml0IOKAkyBVc2VyIFBsYW5lIChPLUNVLVVQKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdCBwTE1OSWRMaXN0IHsKICAgICAgICAgICAgICAgIGtleSAibWNjIG1uYyI7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiB1bmlxdWUgaWRlbnRpdGllcyBmb3IgUExNTiI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX0VudGl0eV9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGRlc2NyaXB0aW9uICJOZWFyLVJlYWwtVGltZSBSQU4gSW50ZWxsaWdlbnQgQ29udHJvbGxlciAoTmVhci1SVCBSSUMpLgoKICAgICAgICBOZWFyLVJUIFJJQyBpcyBhbiBPLVJBTiBORiB0aGF0IGVuYWJsZXMgbmVhciByZWFsLXRpbWUgY29udHJvbCBhbmQKICAgICAgICBvcHRpbWl6YXRpb24gb2Ygc2VydmljZXMgYW5kIHJlc291cmNlcyBvZiBFMiBOb2RlcyB2aWEgZmluZS1ncmFpbmVkIGRhdGEKICAgICAgICBjb2xsZWN0aW9uIGFuZCBhY3Rpb25zIG92ZXIgdGhlIEUyIGludGVyZmFjZSB3aXRoIGNvbnRyb2wgbG9vcHMgaW4gdGhlCiAgICAgICAgb3JkZXIgb2YgMTAgbXMtMXMuIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTmVhci1SZWFsLVRpbWUgUkFOIEludGVsbGlnZW50IENvbnRyb2xsZXIgKE5lYXItUlQgUklDKSBhdHRyaWJ1dGVzIjsKICAgICAgICAgICAgY29udGFpbmVyIHBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBnbG9iYWwgUkFOIG5vZGUgaWRlbnRpdHkiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5lYXJSdFJpY0lkIHsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGlmaWVyIG9mIE5lYXItUlQgUklDIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgfQoKICAgIGxpc3QgT1JVRnVuY3Rpb24gewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIk8tUkFOIFJhZGlvIFVuaXQgKE8tUlUpCgogICAgICAgIFRoZSBPLVJVIHRlcm1pbmF0ZXMgdGhlIE9wZW4gRnJvbnRoYXVsIGludGVyZmFjZSAoYWxzbyBrbm93biBhcyBMTFMKICAgICAgICBpbnRlcmZhY2UpIGFzIHdlbGwgYXMgTG93LVBIWSBmdW5jdGlvbnMgb2YgdGhlIHJhZGlvIGludGVyZmFjZSB0b3dhcmRzIAogICAgICAgIHRoZSBVRS4gVGhpcyBpcyBkZXBsb3llZCBhcyBhIFBORi4KCiAgICAgICAgVGhlIE8tUlUgdGVybWluYXRlcyB0aGUgT3BlbiBGcm9udGhhdWwgTS1QbGFuZSBpbnRlcmZhY2UgdG93YXJkcyB0aGUgTy1EVQogICAgICAgIGFuZCBTTU8uIjsKCgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNvbnRhaW5lciBmb3IgTy1SQU4gUmFkaW8gVW5pdCAoTy1SVSkgYXR0cmlidXRlcyI7CiAgICAgICAgICAgIGxlYWYgb3J1SWQgewogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiB0aGUgTy1SVSBhcyBkaXNjb3ZlcmVkIGZyb20gdGhlIHNvdXJjZSBkb21haW4gYmFzZWQgb24gTS1QbGFuZSBhcmNoaXRlY3R1cmUgbW9kZWwiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgTlJDZWxsQ1UgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyBhbiBOUiBDZWxsIGluIGdOb2RlQi1DVS4KCiAgICAgICAgNUcgTlIgaXMgYSBuZXcgcmFkaW8gYWNjZXNzIHRlY2hub2xvZ3kgKFJBVCkgZGV2ZWxvcGVkIGJ5IDNHUFAgZm9yCiAgICAgICAgdGhlIDVHIChmaWZ0aCBnZW5lcmF0aW9uKSBtb2JpbGUgbmV0d29yay4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdGhlCiAgICAgICAgZ2xvYmFsIHN0YW5kYXJkIGZvciB0aGUgYWlyIGludGVyZmFjZSBvZiA1RyBuZXR3b3Jrcy4KCiAgICAgICAgNUcgTlIgaGFzIHN5bmNocm9uaXphdGlvbiBzaWduYWwgdGhhdCBpcyBrbm93biBhcyBQcmltYXJ5CiAgICAgICAgU3luY2hyb25pemF0aW9uIFNpZ25hbCAoUFNTKSBhbmQgU2Vjb25kYXJ5IFN5bmNocm9uaXphdGlvbgogICAgICAgIFNpZ25hbCAoU1NTKS4gVGhlc2Ugc2lnbmFscyBhcmUgc3BlY2lmaWMgdG8gTlIgcGh5c2ljYWwgbGF5ZXIgYW5kCiAgICAgICAgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFVFIGZvciBkb3dubGluawogICAgICAgIHN5bmNocm9uaXphdGlvbjogUFNTIHByb3ZpZGVzIFJhZGlvIEZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZiAxc3QKICAgICAgICBTeW1ib2wgaW4gYSBSYWRpbyBmcmFtZSkgU1NTIHByb3ZpZGVzIFN1YmZyYW1lIEJvdW5kYXJ5IChQb3NpdGlvbiBvZgogICAgICAgIDFzdCBTeW1ib2wgaW4gYSBTdWJmcmFtZSkgUGh5c2ljYWwgTGF5ZXIgQ2VsbCBJRCAoUENJKSBpbmZvcm1hdGlvbgogICAgICAgIHVzaW5nIGJvdGggUFNTIGFuZCBTU1MuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGNlbGxMb2NhbElkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVc2VkIHRvZ2V0aGVyIHdpdGggZ05vZGVCIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgTlIKICAgICAgICAgICAgICAgIGNlbGwgaW4gUExNTi4gVXNlZCB0b2dldGhlciB3aXRoIGdOQklkIHRvIGZvcm0gTkNJLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgcGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIElEIGZvciBOUiBDR0kuIElmIGVtcHR5LAogICAgICAgICAgICAgICAgR05CQ1VDUEZ1bmN0aW9uOjpwTE1OSWQgaXMgdXNlZCBmb3IgUExNTiBJRCBpbiBOUiBDR0kiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5DSSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SQ2VsbERVIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlJlcHJlc2VudHMgYW4gTlIgQ2VsbCBpbiBnTm9kZUItRFUuCgogICAgICAgIDVHIE5SIGlzIGEgbmV3IHJhZGlvIGFjY2VzcyB0ZWNobm9sb2d5IChSQVQpIGRldmVsb3BlZCBieSAzR1BQIGZvcgogICAgICAgIHRoZSA1RyAoZmlmdGggZ2VuZXJhdGlvbikgbW9iaWxlIG5ldHdvcmsuIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHRoZQogICAgICAgIGdsb2JhbCBzdGFuZGFyZCBmb3IgdGhlIGFpciBpbnRlcmZhY2Ugb2YgNUcgbmV0d29ya3MuCgogICAgICAgIDVHIE5SIGhhcyBzeW5jaHJvbml6YXRpb24gc2lnbmFsIHRoYXQgaXMga25vd24gYXMgUHJpbWFyeQogICAgICAgIFN5bmNocm9uaXphdGlvbiBzaWduYWwgKFBTUykgYW5kIFNlY29uZGFyeSBTeW5jaHJvbml6YXRpb24gc2lnbmFsCiAgICAgICAgKFNTUykuIFRoZXNlIHNpZ25hbHMgYXJlIHNwZWNpZmljIHRvIE5SIHBoeXNpY2FsIGxheWVyIGFuZCBwcm92aWRlCiAgICAgICAgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSBVRSBmb3IgZG93bmxpbmsKICAgICAgICBzeW5jaHJvbml6YXRpb246IFBTUyBwcm92aWRlcyBSYWRpbyBGcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YgMXN0CiAgICAgICAgU3ltYm9sIGluIGEgUmFkaW8gZnJhbWUpIFNTUyBwcm92aWRlcyBTdWJmcmFtZSBCb3VuZGFyeSAoUG9zaXRpb24gb2YKICAgICAgICAxc3QgU3ltYm9sIGluIGEgU3ViZnJhbWUpIFBoeXNpY2FsIExheWVyIENlbGwgSUQgKFBDSSkgaW5mb3JtYXRpb24KICAgICAgICB1c2luZyBib3RoIFBTUyBhbmQgU1NTLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBjZWxsTG9jYWxJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVXNlZCB0b2dldGhlciB3aXRoIGdOb2RlQiBpZGVudGlmaWVyIHRvIGlkZW50aWZ5IE5SCiAgICAgICAgICAgICAgICBjZWxsIGluIFBMTU4uIFVzZWQgdG9nZXRoZXIgd2l0aCBnTkJJZCB0byBmb3JtIE5DSS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBuQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwgSWRlbnRpdHkuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgblJQQ0kgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG5SVEFDIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBUcmFja2luZyBBcmVhIENvZGUgKFRBQykuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBOUlNlY3RvckNhcnJpZXIgewogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9FbnRpdHlfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE5SIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsIGludGVyZmVyZW5jZQogICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgIGNlbGxzLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXIKICAgICAgICAgICAgICAgIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXJmY25VTCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gZnJlcXVlbmN5IENoYW5uZWwgTnVtYmVyCiAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYlNDaGFubmVsQndETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQlMgQ2hhbm5lbCBiYW5kd2lkdGggaW4gTUh6IGZvciBkb3dubGluay4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgVGhlIE1PIGFsc28gY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTlIgZnJlcXVlbmN5IGJhbmRzIGFzc29jaWF0ZWQgaGFyZHdhcmUKICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgU2VjdG9yIHsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fRW50aXR5X01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgZGVzY3JpcHRpb24gIkEgZ3JvdXAgb2YgY28tbG9jYXRlZCBDZWxscyB0aGF0IGhhdmUgYSBzaGFyZWQKICAgICAgICBjb3ZlcmFnZSBhcmVhLiI7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pdmVyc2FsbHkgdW5pcXVlIElEIGdlbmVyYXRlZCBieSB0aGUgc2VjdG9yJ3MKICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBtZWNoYW5pc20uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDY0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CgogICAgICAgICAgICBsZWFmIGF6aW11dGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGF6aW11dGhzIG9mIHRoZSBjZWxscwogICAgICAgICAgICAgICAgY29tcHJpc2luZyB0aGUgc2VjdG9yLCBkZXRlcm1pbmVkIGR1cmluZyBzZWN0b3IgZGlzY292ZXJ5LiI7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTsKICAgICAgICAgICAgICAgICAgICByYW5nZSAiMC4uMzYwIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9EVUZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTERVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJDZWxsRFUgdHlwZS4KICAgICAgICAgICAgVGhlIE9EVUZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIERVIGNvbXBvbmVudCBvZiBhIGdOQiB0aGF0IHByb3ZpZGVzIHRoZSBOUkNlbGxEVS4KICAgICAgICAgICAgQSBPRFVGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgbXVzdCBiZSBwcm92aWRlZCBieSBhbiBPRFVGdW5jdGlvbi4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1uckNlbGxEdSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIHByb3ZpZGVzIE5SIENlbGwtRFUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIENlbGwtRFUgcHJvdmlkZWQgYnkgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fUFJPVklERVNfTlJTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgTlJTZWN0b3JDYXJyaWVyIHR5cGUuCiAgICAgICAgICAgIFRoZSBPRFVGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBEVSBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJTZWN0b3JDYXJyaWVyLgogICAgICAgICAgICBBIE9EVUZ1bmN0aW9uIGluc3RhbmNlIGNhbiBwcm92aWRlIG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIG11c3QgYmUgcHJvdmlkZWQgYnkgYW4gT0RVRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gcHJvdmlkZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUEZVTkNUSU9OX1BST1ZJREVTX05SQ0VMTENVIHsgLy8gMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxDVSB0eXBlLgogICAgICAgICAgICBUaGUgT0NVQ1BGdW5jdGlvbiByZXByZXNlbnRzIHRoZSBDVS1DUCBjb21wb25lbnQgb2YgYSBnTkIgdGhhdCBwcm92aWRlcyB0aGUgTlJDZWxsQ1UuCiAgICAgICAgICAgIEEgT0NVQ1BGdW5jdGlvbiBpbnN0YW5jZSBjYW4gcHJvdmlkZSBtYW55IE5SQ2VsbENVLgogICAgICAgICAgICBBbiBOUkNlbGxDVSBpbnN0YW5jZSBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFuIE9DVUNQRnVuY3Rpb24uCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbnJDZWxsQ3UgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVS1DUCBGdW5jdGlvbiBwcm92aWRlcyBOUiBDZWxsLUNVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LW9jdWNwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1DVSBwcm92aWRlZCBieSBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUkNlbGxDVTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUkNFTExEVV9VU0VTX05SU0VDVE9SQ0FSUklFUiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5SU2VjdG9yQ2FycmllciB0eXBlLgogICAgICAgICAgICBUaGUgTlJDZWxsRFUgcmVwcmVzZW50cyB0aGUgY2VsbCB0aGF0IHVzZXMgdGhlIE5SU2VjdG9yQ2Fycmllci4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIHVzZSBtYW55IE5SU2VjdG9yQ2FycmllcnMuCiAgICAgICAgICAgIEFuIE5SU2VjdG9yQ2FycmllciBpbnN0YW5jZSBjYW4gb25seSBiZSB1c2VkIGJ5IG9uZSBOUkNlbGxEVS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLW5yU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBDZWxsLURVIHVzZXMgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SQ2VsbERVOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlZCBieSBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBOUlNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUlNlY3RvckNhcnJpZXIgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eSB0eXBlLgogICAgICAgICAgICBUaGUgTlJTZWN0b3JDYXJyaWVyIHJlcHJlc2VudHMgdGhlIGNhcnJpZXIgdGhhdCB1c2VzIHRoZSBBbnRlbm5hQ2FwYWJpbGl0eS4KICAgICAgICAgICAgQW4gTlJTZWN0b3JDYXJyaWVyIGluc3RhbmNlIGNhbiB1c2Ugb25seSBvbmUgQW50ZW5uYUNhcGFiaWxpdHkuCiAgICAgICAgICAgIEFuIEFudGVubmFDYXBhYmlsaXR5IGluc3RhbmNlIGNhbiBiZSB1c2VkIGJ5IG1hbnkgTlJTZWN0b3JDYXJyaWVycy4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1uclNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTlIgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgU0VDVE9SX0dST1VQU19OUkNFTExEVSB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTZWN0b3IgdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOUkNlbGxEVSB0eXBlLgogICAgICAgICAgICBUaGUgU2VjdG9yIHJlcHJlc2VudHMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHRoYXQgZ3JvdXBzIHRoZSBOUkNlbGxEVXMuCiAgICAgICAgICAgIEEgU2VjdG9yIGluc3RhbmNlIGNhbiBncm91cCBtYW55IE5SQ2VsbERVcy4KICAgICAgICAgICAgQW4gTlJDZWxsRFUgaW5zdGFuY2UgY2FuIG9ubHkgYmUgZ3JvdXBlZCBieSBvbmUgU2VjdG9yLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtbnJDZWxsRHUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VjdG9yIGdyb3VwcyBOUiBDZWxsLURVLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBTZWN0b3I7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgZ3JvdXBlZC1ieS1zZWN0b3IgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbC1EVSBncm91cGVkIGJ5IFNlY3Rvci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTlJDZWxsRFU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPQ1VDUEZVTkNUSU9OX0UxTElOS19PQ1VVUEZVTkNUSU9OIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9DVUNQRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRTEgbGluayBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9jdWNwRnVuY3Rpb24tZTItbGlua2VkLW9jdXVwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVUNQIEZ1bmN0aW9uIGxpbmtzIE8tQ1VVUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG9jdXVwRnVuY3Rpb24tZTItbGlua2VkLWJ5LW9jdWNwRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1DVVVQIEZ1bmN0aW9uIGxpbmtlZCBieSBPLUNVQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9DVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9FMkxJTktfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBOZWFyUlRSSUNGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIEUyIGxpbmsgYmV0d2VlbiB0aGUKICAgICAgICAgICAgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1lMi1saW5rZWQtbmVhclJUUklDRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rcyBOZWFyIFJUIFJJQyBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBuZWFyUlRSSUNGdW5jdGlvbi1lMi1saW5rZWQtYnktb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTmVhciBSVCBSSUMgRnVuY3Rpb24gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NVQ1BGVU5DVElPTl9FMkxJTktfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVQ1BGVU5DVElPTiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRTIgbGluayBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9jdWNwRnVuY3Rpb24tZTItbGlua2VkLW5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1VDUCBGdW5jdGlvbiBsaW5rcyBOZWFyIFJUIFJJQyBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0NVQ1BGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG5lYXJSVFJJQ0Z1bmN0aW9uLWUyLWxpbmtlZC1ieS1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5lYXIgUlQgUklDIEZ1bmN0aW9uIGxpbmtlZCBieSBPLUNVQ1AgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0NVVVBGVU5DVElPTl9FMkxJTktfTkVBUlJUUklDRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0NVVVBGVU5DVElPTiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRTIgbGluayBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9jdXVwRnVuY3Rpb24tZTItbGlua2VkLW5lYXJSVFJJQ0Z1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1VVUCBGdW5jdGlvbiBsaW5rcyBOZWFyIFJUIFJJQyBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0NVVVBGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG5lYXJSVFJJQ0Z1bmN0aW9uLWUyLWxpbmtlZC1ieS1vY3V1cEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5lYXIgUlQgUklDIEZ1bmN0aW9uIGxpbmtlZCBieSBPLUNVVVAgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT1JVRlVOQ1RJT05fT0ZITUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBNLVBsYW5lIEludGVyZmFjZSBiZXR3ZWVuIHRoZQogICAgICAgICAgICBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9ydUZ1bmN0aW9uLW9maG0tbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIFNNTy4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzbW8tb2ZobS1saW5rZWQtYnktb3J1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU01PIGxpbmtlZCBieSBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PRkhNTElOS19PRFVGVU5DVElPTiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBNLVBsYW5lIEludGVyZmFjZSBiZXR3ZWVuCiAgICAgICAgICAgIHRoZSBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9ydUZ1bmN0aW9uLW9maG0tbGlua2VkLW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tUlUgRnVuY3Rpb24gbGlua3MgTy1EVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBvZHVGdW5jdGlvbi1vZmhtLWxpbmtlZC1ieS1vcnVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLURVIEZ1bmN0aW9uIGxpbmtlZCBieSBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPRFVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9SVUZVTkNUSU9OX09GSENMSU5LX09EVUZVTkNUSU9OIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lcyBhbiBPcGVuIEZIIChGcm9udGhhdWwpIENvbnRyb2wgSW50ZXJmYWNlIGJldHdlZW4KICAgICAgICAgICAgdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tb2ZoYy1saW5rZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBsaW5rcyBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPUlVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG9kdUZ1bmN0aW9uLW9maGMtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua2VkIGJ5IE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT1JVRlVOQ1RJT05fT0ZIVUxJTktfT0RVRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT1JVRnVuY3Rpb24gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPRFVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIE9wZW4gRkggKEZyb250aGF1bCkgVXNlciBJbnRlcmZhY2UgYmV0d2VlbgogICAgICAgICAgICB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvcnVGdW5jdGlvbi1vZmh1LWxpbmtlZC1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk9SVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgb2R1RnVuY3Rpb24tb2ZodS1saW5rZWQtYnktb3J1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rZWQgYnkgTy1SVSBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PRkhTTElOS19PRFVGVU5DVElPTiB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPUlVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9EVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gT3BlbiBGSCAoRnJvbnRoYXVsKSBTeW5jaHJvbml6YXRpb24gSW50ZXJmYWNlCiAgICAgICAgICAgIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tb2Zocy1saW5rZWQtb2R1RnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1SVSBGdW5jdGlvbiBsaW5rcyBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPUlVGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IG9kdUZ1bmN0aW9uLW9maHMtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua2VkIGJ5IE8tUlUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgT0RVRlVOQ1RJT05fTzFMSU5LX1NNTyB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPRFVGdW5jdGlvbiB0eXBlLgogICAgICAgICAgICBUaGUgYlNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFNNTyB0eXBlLgogICAgICAgICAgICBUaGUgcmVsYXRpb25zaGlwcyBkZWZpbmVzIGFuIE8xIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBhU2lkZSBhbmQgYlNpZGUuCiAgICAgICAgICAgICI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOk9yaWdpbl9SZWxhdGlvbnNoaXBfTWFwcGluZ19HcnA7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIG9kdUZ1bmN0aW9uLW8xLWxpbmtlZC1zbW8gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTy1EVSBGdW5jdGlvbiBsaW5rcyBTTU8uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk9EVUZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTTU8gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOlNNTzsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE9DVUNQRlVOQ1RJT05fTzFMSU5LX1NNTyB7IC8vIDAuLjEgdG8gMC4ubgoKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGFTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VDUEZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb2N1Y3BGdW5jdGlvbi1vMS1saW5rZWQtc21vIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtQ1AgRnVuY3Rpb24gbGlua3MgU01PLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNNTyBsaW5rZWQgYnkgTmVhciBPLUNVLUNQIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPUlVGVU5DVElPTl9PMUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE9SVUZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgb3J1RnVuY3Rpb24tbzEtbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLVJVIEZ1bmN0aW9uIGxpbmtzIFNNTy4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T1JVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBzbW8tbzEtbGlua2VkLWJ5LW9ydUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNNTyBsaW5rcyBPLVJVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBORUFSUlRSSUNGVU5DVElPTl9PMUxJTktfU01PIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgYVNpZGUgb2YgdGhpcyByZWxhdGlvbnNoaXAgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIE5lYXJSVFJJQ0Z1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgIFRoZSBiU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgU01PIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gTzEgSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFTaWRlIGFuZCBiU2lkZS4KICAgICAgICAgICAgIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6T3JpZ2luX1JlbGF0aW9uc2hpcF9NYXBwaW5nX0dycDsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgbmVhclJUUklDRnVuY3Rpb24tbzEtbGlua2VkLXNtbyB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOZWFyIFJUIFJJQyBGdW5jdGlvbiBsaW5rcyBTTU8uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtcmFuOk5lYXJSVFJJQ0Z1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc21vLW8xLWxpbmtlZC1ieS1uZWFyUlRSSUNGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTTU8gbGlua2VkIGJ5IE5lYXIgUlQgUklDIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpTTU87CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9GMVVMSU5LX09DVVVQRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLm4KCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VVUEZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRjEtdSBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1mMS11LWxpbmtlZC1vY3V1cEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua3MgTy1DVS1VUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCBvY3V1cEZ1bmN0aW9uLWYxLXUtbGlua2VkLWJ5LW9kdUZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tQ1UtVVAgRnVuY3Rpb24gbGlua2VkIGJ5IE8tRFUgRnVuY3Rpb24uIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOk9DVVVQRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBPRFVGVU5DVElPTl9GMUNMSU5LX09DVUNQRlVOQ1RJT04geyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBhU2lkZSBvZiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgT0RVRlVOQ1RJT04gdHlwZS4KICAgICAgICAgICAgVGhlIGJTaWRlIG9mIHRoaXMgcmVsYXRpb25zaGlwIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBPQ1VDUEZVTkNUSU9OIHR5cGUuCiAgICAgICAgICAgIFRoZSByZWxhdGlvbnNoaXBzIGRlZmluZXMgYW4gRjEtYyBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgYVNpZGUgYW5kIGJTaWRlLgogICAgICAgICAgICAiOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpPcmlnaW5fUmVsYXRpb25zaGlwX01hcHBpbmdfR3JwOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiBvZHVGdW5jdGlvbi1mMS1jLWxpbmtlZC1vY3VjcEZ1bmN0aW9uIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk8tRFUgRnVuY3Rpb24gbGlua3MgTy1DVS1DUCBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1yYW46T0RVRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgb2N1Y3BGdW5jdGlvbi1mMS1jLWxpbmtlZC1ieS1vZHVGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPLUNVLVVQIEZ1bmN0aW9uIGxpbmtlZCBieSBPLURVIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBvci10ZWl2LXJhbjpPQ1VDUEZ1bmN0aW9uOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9 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= @@ -757,11 +754,11 @@ NODECLUSTER_LOCATED_AT_OCLOUDSITE located-at-ocloudSite NodeCluster o-ran-smo-te 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_E1LINK_OCUUPFUNCTION ocucpFunction-e2-linked-ocuupFunction OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 ocuupFunction-e2-linked-by-ocucpFunction OCUUPFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-ran +OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION ocucpFunction-e2-linked-nearRTRICFunction OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 nearRTRICFunction-e2-linked-by-ocucpFunction NearRTRICFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-ran OCUCPFUNCTION_O1LINK_SMO ocucpFunction-o1-linked-smo OCUCPFunction o-ran-smo-teiv-ran 0 9223372036854775807 smo-o1-linked-by-ocucpFunction SMO o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUCPFunction o-ran-smo-teiv-ran 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 -OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION ocucpFunction-e2-linked-ocuupFunction OCUCPUFUNCTION o-ran-smo-teiv-ran 0 9223372036854775807 ocuupFunction-e2-linked-by-ocucpFunction OCUUPUFUNCTION o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUCPUFUNCTION o-ran-smo-teiv-ran -OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION ocucpFunction-e2-linked-nearRTRICFunction OCUCPUFUNCTION o-ran-smo-teiv-ran 0 9223372036854775807 nearRTRICFunction-e2-linked-by-ocucpFunction NearRTRICFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUCPUFUNCTION o-ran-smo-teiv-ran -OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION ocuupFunction-e2-linked-nearRTRICFunction OCUUPFUNCTION o-ran-smo-teiv-ran 0 9223372036854775807 nearRTRICFunction-e2-linked-by-ocuupFunction NearRTRICFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUUPFUNCTION o-ran-smo-teiv-ran +OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION ocuupFunction-e2-linked-nearRTRICFunction OCUUPFunction o-ran-smo-teiv-ran 0 9223372036854775807 nearRTRICFunction-e2-linked-by-ocuupFunction NearRTRICFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_OCUUPFunction o-ran-smo-teiv-ran ODUFUNCTION_E2LINK_NEARRTRICFUNCTION oduFunction-e2-linked-nearRTRICFunction ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 nearRTRICFunction-e2-linked-by-oduFunction NearRTRICFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran ODUFUNCTION_F1CLINK_OCUCPFUNCTION oduFunction-f1-c-linked-ocucpFunction ODUFunction o-ran-smo-teiv-ran 0 1 ocucpFunction-f1-c-linked-by-oduFunction OCUCPFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran ODUFUNCTION_F1ULINK_OCUUPFUNCTION oduFunction-f1-u-linked-ocuupFunction ODUFunction o-ran-smo-teiv-ran 0 9223372036854775807 ocuupFunction-f1-u-linked-by-oduFunction OCUUPFunction o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_ODUFunction o-ran-smo-teiv-ran diff --git a/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql b/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql index 051f19a..4fb1fd8 100644 --- a/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql +++ b/docker-compose/sql_scripts/01_init-teiv-exposure-data.sql @@ -655,6 +655,18 @@ CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ( "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, "REL_metadata_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" jsonb, + "REL_FK_ocucpFunction-e2-linked-ocuupFunction" TEXT, + "REL_ID_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" TEXT, + "REL_CD_sourceIds_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" jsonb, + "REL_CD_classifiers_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" jsonb, + "REL_CD_decorators_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" jsonb, + "REL_metadata_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" jsonb, + "REL_FK_ocucpFunction-e2-linked-nearRTRICFunction" TEXT, + "REL_ID_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" TEXT, + "REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_metadata_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, "REL_FK_ocucpFunction-o1-linked-smo" TEXT, "REL_ID_OCUCPFUNCTION_O1LINK_SMO" TEXT, "REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO" jsonb, @@ -675,53 +687,23 @@ ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_ ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION" SET DEFAULT '{}'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ( - "REL_FK_ocucpFunction-e2-linked-ocuupFunction" TEXT, - "REL_ID_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" TEXT, - "REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" jsonb, - "REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" jsonb, - "REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" jsonb, - "REL_metadata_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" jsonb, - "REL_FK_ocucpFunction-e2-linked-nearRTRICFunction" TEXT, - "REL_ID_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" TEXT, - "REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_metadata_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb -); +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION" SET DEFAULT '{}'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION" SET DEFAULT '{}'; - -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; - -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; - -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ALTER COLUMN "REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '{}'; - -CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ( - "REL_FK_ocuupFunction-e2-linked-nearRTRICFunction" TEXT, - "REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" TEXT, - "REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, - "REL_metadata_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb -); +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '{}'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ALTER COLUMN "REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ALTER COLUMN "REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '[]'; -ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ALTER COLUMN "REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ALTER COLUMN "REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO" SET DEFAULT '{}'; CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "id" TEXT, @@ -737,7 +719,13 @@ CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ( "REL_CD_sourceIds_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, "REL_CD_classifiers_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, - "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb + "REL_metadata_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" jsonb, + "REL_FK_ocuupFunction-e2-linked-nearRTRICFunction" TEXT, + "REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" TEXT, + "REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb, + "REL_metadata_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" jsonb ); ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]'; @@ -752,6 +740,12 @@ ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_ ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION" SET DEFAULT '{}'; +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '[]'; + +ALTER TABLE ONLY teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ALTER COLUMN "REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION" SET DEFAULT '{}'; + CREATE TABLE IF NOT EXISTS teiv_data."o-ran-smo-teiv-ran_ODUFunction" ( "id" TEXT, "dUpLMNId" jsonb, @@ -1519,62 +1513,62 @@ SELECT teiv_data.create_constraint_if_not_exists( SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', - 'FK_E31B73DB925367F14AEC0DA6EBD7C9BAD8C7A275', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_E31B73DB925367F14AEC0DA6EBD7C9BAD8C7A275" FOREIGN KEY ("REL_FK_ocucpFunction-o1-linked-smo") REFERENCES teiv_data."o-ran-smo-teiv-ran_SMO" ("id");' + 'FK_03B281BB0D7DB0CBC38DA02B76F4C5E8664040F0', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_03B281BB0D7DB0CBC38DA02B76F4C5E8664040F0" FOREIGN KEY ("REL_FK_ocucpFunction-e2-linked-ocuupFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ("id");' ); SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUCPFunction', - 'UNIQUE_368AE553B3A5941070CAB09A7864BA7E9E08087B', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_368AE553B3A5941070CAB09A7864BA7E9E08087B" UNIQUE ("REL_ID_OCUCPFUNCTION_O1LINK_SMO");' + 'UNIQUE_FB6281E267F316F3D288BFEF96319FFD5FF2E9CF', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_FB6281E267F316F3D288BFEF96319FFD5FF2E9CF" UNIQUE ("REL_ID_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUCPUFUNCTION', - 'FK_C4055161A630A4BEA3C222DE6F04A8FF722351F4', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ADD CONSTRAINT "FK_C4055161A630A4BEA3C222DE6F04A8FF722351F4" FOREIGN KEY ("REL_FK_ocucpFunction-e2-linked-ocuupFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_OCUUPUFUNCTION" ("id");' + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_92C27CC7666DB694835211BBAB9639C4FECAA639', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_92C27CC7666DB694835211BBAB9639C4FECAA639" FOREIGN KEY ("REL_FK_ocucpFunction-e2-linked-nearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUCPUFUNCTION', - 'UNIQUE_7CAC79DC2584327FB2FE54F7D4E28B6FD7130AAD', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ADD CONSTRAINT "UNIQUE_7CAC79DC2584327FB2FE54F7D4E28B6FD7130AAD" UNIQUE ("REL_ID_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION");' + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'UNIQUE_636E8949BC041514E4F592F7B65FC701773C6067', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_636E8949BC041514E4F592F7B65FC701773C6067" UNIQUE ("REL_ID_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUCPUFUNCTION', - 'FK_C51E9052970F82631E1BF28C495852340A9858F9', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ADD CONSTRAINT "FK_C51E9052970F82631E1BF28C495852340A9858F9" FOREIGN KEY ("REL_FK_ocucpFunction-e2-linked-nearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'FK_E31B73DB925367F14AEC0DA6EBD7C9BAD8C7A275', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "FK_E31B73DB925367F14AEC0DA6EBD7C9BAD8C7A275" FOREIGN KEY ("REL_FK_ocucpFunction-o1-linked-smo") REFERENCES teiv_data."o-ran-smo-teiv-ran_SMO" ("id");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUCPUFUNCTION', - 'UNIQUE_F018C4A0E671663AF48B7ED051E9CBD4A5CFB4FE', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" ADD CONSTRAINT "UNIQUE_F018C4A0E671663AF48B7ED051E9CBD4A5CFB4FE" UNIQUE ("REL_ID_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION");' + 'o-ran-smo-teiv-ran_OCUCPFunction', + 'UNIQUE_368AE553B3A5941070CAB09A7864BA7E9E08087B', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" ADD CONSTRAINT "UNIQUE_368AE553B3A5941070CAB09A7864BA7E9E08087B" UNIQUE ("REL_ID_OCUCPFUNCTION_O1LINK_SMO");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUUPFUNCTION', - 'FK_8452075F28AAA821F6FC74E6BFED35C1FBFC64C7', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ADD CONSTRAINT "FK_8452075F28AAA821F6FC74E6BFED35C1FBFC64C7" FOREIGN KEY ("REL_FK_ocuupFunction-e2-linked-nearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' ); SELECT teiv_data.create_constraint_if_not_exists( - 'o-ran-smo-teiv-ran_OCUUPFUNCTION', - 'UNIQUE_DAA54343AD0BC202A93C9EFD22989A1F2F6D21ED', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" ADD CONSTRAINT "UNIQUE_DAA54343AD0BC202A93C9EFD22989A1F2F6D21ED" UNIQUE ("REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION");' + 'o-ran-smo-teiv-ran_OCUUPFunction', + 'UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' ); SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', - 'FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_8062AF50E5EE5543FBCC68D66FDFF673E31E081D" FOREIGN KEY ("REL_FK_managed-by-managedElement") REFERENCES teiv_data."o-ran-smo-teiv-oam_ManagedElement" ("id");' + 'FK_E8131DF616156B9C91CA7C5A68AE261FA00A89BA', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "FK_E8131DF616156B9C91CA7C5A68AE261FA00A89BA" FOREIGN KEY ("REL_FK_ocuupFunction-e2-linked-nearRTRICFunction") REFERENCES teiv_data."o-ran-smo-teiv-ran_NearRTRICFunction" ("id");' ); SELECT teiv_data.create_constraint_if_not_exists( 'o-ran-smo-teiv-ran_OCUUPFunction', - 'UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214', - 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_DF85FE7809B5527CB4A6028DD1A599DBBD5AF214" UNIQUE ("REL_ID_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION");' + 'UNIQUE_90EB740B5632402F115555B7387BC0A218B9A19F', + 'ALTER TABLE teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" ADD CONSTRAINT "UNIQUE_90EB740B5632402F115555B7387BC0A218B9A19F" UNIQUE ("REL_ID_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION");' ); SELECT teiv_data.create_constraint_if_not_exists( @@ -2025,29 +2019,23 @@ CREATE INDEX IF NOT EXISTS "IDX_21F2560C8330A795E8AFB54C6D31CDCF6CCD3070" ON tei CREATE INDEX IF NOT EXISTS "IDX_D856E84F300B6711E81931AE1CBC8AD905FA384F" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUCPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_2F4FCB18A717B38224F5BAA484D2EFE26A458CC7" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO"::TEXT) gin_trgm_ops); - -CREATE INDEX IF NOT EXISTS "IDX_D9ADFBBC5360F5D511E0E67A0D13622A4BBD78E1" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO"::TEXT) gin_trgm_ops); - -CREATE INDEX IF NOT EXISTS "IDX_FC018070572BA39A4683CBDDCAAA16D3A9129DB8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO"); - -CREATE INDEX IF NOT EXISTS "IDX_8EADD4E436B442260444BBD678577B36B384627A" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN (("REL_CD_sourceIds_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_13597F9B767DD22A86305D13FF5B050BFE06B14D" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_1B7127FBB6523636F1D81D9235301D1410A10240" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN (("REL_CD_classifiers_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_4D7E42AC9DF388919712322B7C0169A370E56ADF" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_306486F1958CB0682AAD7DBBF83E6EBBE8159313" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN ("REL_CD_decorators_OCUCPUFUNCTION_E1LINK_OCUUPUFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_7F7A8AE3E6B3F57A5D1273A1243A79CABA4753C0" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_E1LINK_OCUUPFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_24BDE57AED3B1259709D84A10FC7C5580B8D4AAC" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN (("REL_CD_sourceIds_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_48341F480087D5BD4C2A19DCA0083184B7178A43" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_826BB0F20D5BFEAB9BD1B5106046276A6FF7CE5D" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN (("REL_CD_classifiers_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_090E0962B4064F2ECF7C3256325BF2A30BCE85B8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_7B3604DB1DE3AD5D0CC8A6425BC75E31F9FE3973" ON teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION" USING GIN ("REL_CD_decorators_OCUCPUFUNCTION_E2LINK_NEARRTRICFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_C470E73FA66AEA37FBC2C25AEFB2B959BEA0FBB2" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_E2LINK_NEARRTRICFUNCTION"); -CREATE INDEX IF NOT EXISTS "IDX_EF1B4A1F55350A7F49B75FBFBB28BD1B5B4FB9E2" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" USING GIN (("REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_2F4FCB18A717B38224F5BAA484D2EFE26A458CC7" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_sourceIds_OCUCPFUNCTION_O1LINK_SMO"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E21209AD4691E3A76CC6E58EAC507B59C565F801" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" USING GIN (("REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); +CREATE INDEX IF NOT EXISTS "IDX_D9ADFBBC5360F5D511E0E67A0D13622A4BBD78E1" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN (("REL_CD_classifiers_OCUCPFUNCTION_O1LINK_SMO"::TEXT) gin_trgm_ops); -CREATE INDEX IF NOT EXISTS "IDX_E21F84EB03AE1F94DD674A63E89BE81662FB3B93" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFUNCTION" USING GIN ("REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_FC018070572BA39A4683CBDDCAAA16D3A9129DB8" ON teiv_data."o-ran-smo-teiv-ran_OCUCPFunction" USING GIN ("REL_CD_decorators_OCUCPFUNCTION_O1LINK_SMO"); CREATE INDEX IF NOT EXISTS "IDX_9122DAA7A60DB585BE5ECA68A2EDB9ABF1E7156A" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("pLMNIdList"::TEXT) gin_trgm_ops); @@ -2063,6 +2051,12 @@ CREATE INDEX IF NOT EXISTS "IDX_3346DFB8C2B7D6EEA12B7C1DE4A84B058C24A657" ON tei CREATE INDEX IF NOT EXISTS "IDX_ADD3393C27589066C4993A3491436C6FB57A539F" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_MANAGEDELEMENT_MANAGES_OCUUPFUNCTION"); +CREATE INDEX IF NOT EXISTS "IDX_7B8C47A1FD2FCA75DED85825317147EE0831A1C7" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_sourceIds_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_5E92F3864ACD360810BD006484337B25B5C64004" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN (("REL_CD_classifiers_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"::TEXT) gin_trgm_ops); + +CREATE INDEX IF NOT EXISTS "IDX_CEFE5F65D4553C67E4494FCDE9E0E44549171577" ON teiv_data."o-ran-smo-teiv-ran_OCUUPFunction" USING GIN ("REL_CD_decorators_OCUUPFUNCTION_E2LINK_NEARRTRICFUNCTION"); + 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_73790DA8FF6365B752DC8B399893AC6DE8CF26C4" ON teiv_data."o-ran-smo-teiv-ran_ODUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops); @@ -2207,14 +2201,10 @@ ANALYZE teiv_data."o-ran-smo-teiv-rel-cloud-ran_NFDEPLOYMENT_SERVES_OCUCPFUNCTIO ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPFunction"; -ANALYZE teiv_data."o-ran-smo-teiv-ran_OCUCPUFUNCTION"; - ANALYZE teiv_data."o-ran-smo-teiv-oam_ManagedElement"; ANALYZE teiv_data."o-ran-smo-teiv-ran_NRCellDU"; -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."o-ran-smo-teiv-ran_SMO"; diff --git a/pom.xml b/pom.xml index ff59ddf..90eed1d 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,7 @@ yang-parser pgsql-schema-generator teiv + adapters