teiv, pgsql-schema-generator: add indexing to tables
Add indexing to the tables
Issue-ID: SMO-?????
Change-Id: I403b577af68f6255cc7e53c5464248fb286d42f1
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
diff --git a/docs/pgsql-schema-generator-guide.rst b/docs/pgsql-schema-generator-guide.rst
index 56b6697..d833874 100644
--- a/docs/pgsql-schema-generator-guide.rst
+++ b/docs/pgsql-schema-generator-guide.rst
@@ -58,8 +58,6 @@
- domain: domain of the module. Identified with the help of the statement 'domain' from the module 'o-ran-smo-teiv-common-yang-extensions'
- revision: module revision.
- content: content of the module.
-- ownerAppId: set to 'BUILT_IN_MODULE' for all modules.
-- status: set to 'IN_USAGE' for all modules.
- availableListElements: set to all the list elements defined in the module. Identified with the help of the statement with 'list' as the yang DOM element name.
- availableEntities: Initially constructed as empty list. This will be populated later with all the entities defined in the module.
- availableRelations: set to the list of all relationship names defined in the module. Identified with the help of the statement name 'or-teiv-yext:biDirectionalTopologyRelationship'
@@ -73,6 +71,8 @@
An entity type is constructed with the following details:
- entityName: name of the entity.
+- storedAt: where the entity information is stored i.e., table name. The table name is generated as
+ '<moduleName>_<entityName>'.
- moduleReferenceName: module to which the entity belongs. Identified by checking which of the identified modules has:
- the same namespace as the entity, and
@@ -143,6 +143,8 @@
- B_SIDE
- RELATION
+- storedAt: table name where the relationship instances is stored. The logic for determining the table name relies on the cardinality of the relationship.
+
+--------------------------------------------------+----------------------------+
| Case | Relationship instance info |
+==================================================+============================+
@@ -158,12 +160,12 @@
- moduleReferenceName: module to which the relationship belongs. The relationship module is identified by identifying the module that contains the relationship name in the availableRelations list.
- consumerData: sourceIds, classifiers, decorators.
+- aSideStoredAt: table name where aSide entity type instances are stored.
+- bSideStoredAt: table name where bSide entity type instances are stored.
Indexing Support
----------------
-**Note:** This feature is currently **NOT** supported
-
Indexing is supported for the identified column's based on the column's data type.
Currently, we support indexing on JSONB columns.
@@ -171,6 +173,8 @@
- GIN Index: used for columns storing object, eg, decorators.
- GIN TRIGRAM Index: used for columns storing list of entries, eg, classifiers, sourceIds.
+Refer IndexType.java "src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/IndexType.java" for types of index supported.
+
PG SQL Schema Generation
========================
@@ -308,40 +312,6 @@
| | | | to avoid data loss / corruption. |
+-----------------+-----------------------+------------------------------------------------+
-**decorators:** There will be the ability for Administrators to decorate topology entities and relationships. We will be storing the schemas for the decorators in this table.
-
-+------------------------------------------+--------------------------+-----------------------------------+
-| Column name | Type | Description |
-+==========================================+==========================+===================================+
-| name | VARCHAR(511) PRIMARY KEY | The key of the decorator. |
-+------------------------------------------+--------------------------+-----------------------------------+
-| dataType | VARCHAR(511) | | The data type of the decorator, |
-| | | | needed for parsing. |
-+------------------------------------------+--------------------------+-----------------------------------+
-| moduleReferenceName | VARCHAR(511) | | References the corresponding |
-| | | | module reference the decorator |
-| | | | belongs to. |
-+------------------------------------------+--------------------------+-----------------------------------+
-| | FOREIGN KEY ("moduleReferenceName") | FOREIGN KEY | Foreign key constraint |
-| | REFERENCES ties_model.module_reference | | |
-| | ("name") ON DELETE CASCADE | | |
-+------------------------------------------+--------------------------+-----------------------------------+
-
-**classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to topology entities and relationships. We will be storing the schemas for the classifiers in this table.
-
-+------------------------------------------+--------------------------+-----------------------------------------+
-| Column name | Type | Description |
-+==========================================+==========================+=========================================+
-| name | VARCHAR(511) PRIMARY KEY | The actual classifier. |
-+------------------------------------------+--------------------------+-----------------------------------------+
-| moduleReferenceName | VARCHAR(511) | | References the corresponding module |
-| | | | reference the classifier belongs to. |
-+------------------------------------------+--------------------------+-----------------------------------------+
-| | FOREIGN KEY ("moduleReferenceName") | FOREIGN KEY | Foreign key constraint |
-| | REFERENCES ties_model.module_reference | | |
-| | ("name") ON DELETE CASCADE | | |
-+------------------------------------------+--------------------------+-----------------------------------------+
-
**entity_info:** For the entity info generation SQL entries are created and stored which will be used for execution to populate entity_info table.
+------------------------------------------+------------------+-----------------------------------------+
@@ -409,6 +379,133 @@
Finally, these generated entries and structure are then used to modify the model SQL file.
+Consumer Data Schema
+^^^^^^^^^^^^^^^^^^^^
+
+Before classifying entities or relationships, a schema must be created and validated.
+It can be created, by using its own endpoint, with a Yang Module.
+The user must provide a unique module name, to avoid collision of multiple users access that are defining classifiers and decorators.
+The schema cannot be modified later on but only deleted and recreated, if needed.
+When a schema is successfully created and validated, the user can add the classifiers to the entities or relationships.
+
+Classifiers
+"""""""""""
+
+Classifiers support the following two types of 'operation', which must be identified in the body of the request:
+- merge: defined classifiers can be applied to entities and relationships within a single request.
+- delete: existing tagged classifiers can be removed.
+
+**Example:**
+In this example, user is classifying two given entity IDs and a single relationship ID with a single request.
+
+.. code-block:: json
+
+ {
+ "operation": "merge",
+ "classifiers": [
+ "module-x:Outdoor",
+ "module-y:Rural",
+ "module-z:Weekend"
+ ],
+ "entityIds": [
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1",
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+ ],
+ "relationshipIds": [
+ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
+ ]
+ }
+
+Decorators
+""""""""""
+
+Decorators support the following two types of 'operations', which must be identified in the body of the request:
+- merge: existing decorators can be updated or applied to entities and relationships within a single request.
+- delete: existing tagged decorators can be removed.
+
+**Example:**
+In this example, user is tagging decorators with two given entity IDs and a single relationship ID with a single request.
+
+.. code-block:: json
+
+ {
+ "operation": "merge",
+ "decorators": {
+ "module-x:location": "Stockholm",
+ "module-y:vendor": "Ericsson"
+ },
+ "entityIds": [
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1",
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+ ],
+ "relationshipIds": [
+ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
+ ]
+ }
+
+The SQL entries for consumer data include
+- **module_reference:** For the consumer module reference related module names from provided classifiers or decorators retrieved from the model service are extracted and stored which will be used for execution to module_reference table.
+
++-------------+-----------------------+-----------------------------------------------------------------+
+| Column name | Type | Description |
++=============+=======================+=================================================================+
+| name | TEXT PRIMARY KEY | The module name |
++-------------+-----------------------+-----------------------------------------------------------------+
+| namespace | TEXT | The namespace the module is located |
++-------------+-----------------------+-----------------------------------------------------------------+
+| revision | TEXT NOT NULL | The revision date of the file |
++-------------+-----------------------+-----------------------------------------------------------------+
+| content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. |
++-------------+-----------------------+-----------------------------------------------------------------+
+| ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. |
++-------------+-----------------------+-----------------------------------------------------------------+
+| status | VARCHAR(127) NOT NULL | | Current status of the consumer module reference to track |
+| | | | during the pod's life cycle. Needed to avoid data |
+| | | | loss / corruption. |
++-------------+-----------------------+-----------------------------------------------------------------+
+
+**decorators:** There will be the ability for Administrators to decorate topology entities and relationships. We will be storing the schemas for the decorators in this table.
+
++--------------------------------------------------+------------------+-----------------------------------+
+| Column name | Type | Description |
++==================================================+==================+===================================+
+| name | TEXT PRIMARY KEY | The key of the decorator. |
++--------------------------------------------------+------------------+-----------------------------------+
+| dataType | VARCHAR(511) | | The data type of the decorator, |
+| | | | needed for parsing. |
++--------------------------------------------------+------------------+-----------------------------------+
+| moduleReferenceName | TEXT | | References the corresponding |
+| | | | module reference the decorator |
+| | | | belongs to. |
++--------------------------------------------------+------------------+-----------------------------------+
+| | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint |
+| | ties_consumer_data.module_reference ("name") | | |
+| | ON DELETE CASCADE | | |
++--------------------------------------------------+------------------+-----------------------------------+
+
+**classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to topology entities and relationships. We will be storing the schemas for the classifiers in this table.
+
++--------------------------------------------------+------------------+-----------------------------------+
+| Column name | Type | Description |
++==================================================+==================+===================================+
+| name | TEXT PRIMARY KEY | The key of the classifier. |
++--------------------------------------------------+------------------+-----------------------------------+
+| moduleReferenceName | TEXT | | References the corresponding |
+| | | | module reference the classifier |
+| | | | belongs to. |
++--------------------------------------------------+------------------+-----------------------------------+
+| | FOREIGN KEY ("moduleReferenceName") REFERENCES | FOREIGN KEY | Foreign key constraint |
+| | ties_consumer_data.module_reference ("name") | | |
+| | ON DELETE CASCADE | | |
++--------------------------------------------------+------------------+-----------------------------------+
+
+How to use classifiers and decorators
+"""""""""""""""""""""""""""""""""""""
+
+1. Create a schema with the /schemas endpoint using Yang Module. After a successful schema creation, the topology objects are ready to be classified.
+2. Assign classifiers and/or decorators to the entities and/or relationships.
+3. Search classifiers and/or decorators by using queries.
+
Skeleton Data and Model SQL Files
=================================
diff --git a/pgsql-schema-generator/README.md b/pgsql-schema-generator/README.md
index 90085f6..b9d211e 100644
--- a/pgsql-schema-generator/README.md
+++ b/pgsql-schema-generator/README.md
@@ -50,8 +50,6 @@
'o-ran-smo-teiv-common-yang-extensions'
- revision: module revision.
- content: content of the module.
-- ownerAppId: set to 'BUILT_IN_MODULE' for all modules.
-- status: set to 'IN_USAGE' for all modules.
- availableListElements: set to all the list elements defined in the module. Identified with the help of the statement
with 'list' as the yang DOM element name.
- availableEntities: Initially constructed as empty list. This will be populated later with all the entities defined in
@@ -66,6 +64,8 @@
An entity type is constructed with the following details:
- entityName: name of the entity.
+- storedAt: where the entity information is stored i.e., table name. The table name is generated as
+ '<moduleName>_<entityName>'.
- moduleReferenceName: module to which the entity belongs. Identified by checking which of the identified modules has
- the same namespace as the entity, and
- the availableListElements contains the entity name
@@ -123,28 +123,32 @@
- A_SIDE
- B_SIDE
- RELATION
+- storedAt: table name where the relationship instances is stored. The logic for determining the table name relies on
+the cardinality of the relationship.
- | Case | Relationship instance info |
- |--------------------------------------------------------------------|----------------------------|
- | 1:1 | aSide |
- | 1:N / N:1 | N-side |
- | N:M | relation table |
- | Relations connecting same Entity Types 1 : 1 (or) 1 : n (or) m : n | relation table |
+ | Case | Relationship instance info and reference stored at? |
+ |--------------------------------------------------------------------|-----------------------------------------------------|
+ | 1:1 | aSide |
+ | 1:N / N:1 | N-side |
+ | N:M | relation table (<moduleName>_<relationName>) |
+ | Relations connecting same Entity Types 1 : 1 (or) 1 : n (or) m : n | relation table (<moduleName>_<relationName>) |
- moduleReferenceName: module to which the relationship belongs. The relationship module is identified by identifying
the module that contains the relationship name in the availableRelations list.
- consumerData: sourceIds, classifiers, decorators.
+- aSideStoredAt: table name where aSide entity type instances are stored.
+- bSideStoredAt: table name where bSide entity type instances are stored.
#### Indexing Support
-**Note:** This feature is currently **NOT** supported
-
Indexing is supported for the identified column's based on the column's data type.
Currently, we support indexing on JSONB columns.
- GIN Index: used for columns storing object, eg, decorators.
- GIN TRIGRAM Index: used for columns storing list of entries, eg, classifiers, sourceIds.
+Refer [IndexType.java](src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java) for types of index supported.
+
### PG SQL Schema Generation
#### Data schema
@@ -264,34 +268,13 @@
| includedModules | jsonb | aSideMO's and bSideMO's module reference name stored within the Module |
| revision | TEXT NOT NULL | The revision date of the file |
| content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. |
- | ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. |
- | status | VARCHAR(127) NOT NULL | Current status of the module reference to track during the pod's life cycle. Needed to avoid data loss / corruption. |
-
-- **decorators:** There will be the ability for Administrators to decorate topology entities and relationships.
- We will be storing the schemas for the decorators in this table.
-
- | Column name | Type | Description |
- |-------------------------------------------------------------------------------------------------------|--------------------------|-------------------------------------------------------------------------|
- | name | VARCHAR(511) PRIMARY KEY | The key of the decorator. |
- | dataType | VARCHAR(511) | The data type of the decorator, needed for parsing. |
- | moduleReferenceName | VARCHAR(511) | References the corresponding module reference the decorator belongs to. |
- | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
-
-- **classifier:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to
- topology entities and relationships.
- We will be storing the schemas for the classifiers in this table.
-
- | Column name | Type | Description |
- |-------------------------------------------------------------------------------------------------------|--------------------------|--------------------------------------------------------------------------|
- | name | VARCHAR(511) PRIMARY KEY | The actual classifier. |
- | moduleReferenceName | VARCHAR(511) | References the corresponding module reference the classifier belongs to. |
- | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
- **entity_info:** For the entity info generation SQL entries are created and stored which will be used for execution to
populate entity_info table.
| Column name | Type | Description |
|-------------------------------------------------------------------------------------------------------|------------------|-------------------------------------------------------------|
+ | storedAt | TEXT PRIMARY KEY | Un-hashed table name where entity type instances are stored |
| name | TEXT NOT NULL | The entity type name |
| moduleReferenceName | TEXT NOT NULL | A reference to an associated module |
| FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
@@ -315,6 +298,7 @@
| bSideMaxCardinality | BIGINT NOT NULL | The maximum cardinality of the B-side of the relationship |
| associationKind | TEXT NOT NULL | The kind of association between entities |
| relationshipDataLocation | TEXT NOT NULL | Indicates where associated relationship data is stored |
+ | storedAt | TEXT NOT NULL | The un-hashed table name where relation instance information is stored |
| connectSameEntity | BOOLEAN NOT NULL | Indicates whether the relationship connects the same entity |
| moduleReferenceName | TEXT PRIMARY KEY | The name of the module reference associated with the relationship |
| FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
@@ -326,6 +310,93 @@
Finally, These generated entries and structure are then used to modify the model SQL file.
+#### Consumer Data Schema
+Before classifying entities or relationships, a schema must be created and validated.
+It can be created, by using its own endpoint, with a Yang Module.
+The user must provide a unique module name, to avoid collision of multiple users access that are defining classifiers and decorators.
+The schema cannot be modified later on but only deleted and recreated, if needed.
+When a schema is successfully created and validated, the user can add the classifiers to the entities or relationships.
+
+##### Classifiers
+Classifiers support the following two types of 'operation', which must be identified in the body of the request:
+- merge: defined classifiers can be applied to entities and relationships within a single request.
+- delete: existing tagged classifiers can be removed.
+ **Example:**
+ In this example, user is classifying two given entity IDs and a single relationship ID with a single request.
+```
+{
+ "operation": "merge",
+ "classifiers": [
+ "module-x:Outdoor",
+ "module-y:Rural",
+ "module-z:Weekend"
+ ],
+ "entityIds": [
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1",
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+ ],
+ "relationshipIds": [
+ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
+ ]
+}
+```
+##### Decorators
+Decorators support the following two types of 'operations', which must be identified in the body of the request:
+- merge: existing decorators can be updated or applied to entities and relationships within a single request.
+- delete: existing tagged decorators can be removed.
+ **Example:**
+ In this example, user is tagging decorators with two given entity IDs and a single relationship ID with a single request.
+```
+ "operation": "merge",
+ "decorators": {
+ "module-x:location": "Stockholm",
+ "module-y:vendor": "Ericsson"
+ },
+ "entityIds": [
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=1",
+ "urn:3gpp:dn:ManagedElement=1,GNBDUFunction=1,NRCellDU=2"
+ ],
+ "relationshipIds": [
+ "urn:o-ran:smo:teiv:sha512:NRCELLDU_USES_NRSECTORCARRIER=CA576F4716C36A1BD1C506DCB58418FC731858D3D3F856F536813A8C4D3F1CC21292E506815410E04496D709D96066EBC0E4890DEFC3789EDC4BD9C28DA1D52B"
+ ]
+}
+```
+The SQL entries for consumer data include
+- **module_reference:** For the consumer module reference related module names from provided classifiers or decorators
+ retrieved from the model service are extracted and stored which will be used for
+ execution to module_reference table.
+ | Column name | Type | Description |
+ |-------------|-----------------------|-------------------------------------------------------------------------------------------------------------------------------|
+ | name | TEXT PRIMARY KEY | The module name |
+ | namespace | TEXT | The namespace the module is located |
+ | revision | TEXT NOT NULL | The revision date of the file |
+ | content | TEXT NOT NULL | The base64 encoded format of the corresponding schema. |
+ | ownerAppId | VARCHAR(511) NOT NULL | The identity of the owner App. |
+ | status | VARCHAR(127) NOT NULL | Current status of the consumer module reference to track during the pod's life cycle. Needed to avoid data loss / corruption. |
+
+- **decorators:** There will be the ability for Administrators to decorate topology entities and relationships.
+ We will be storing the schemas for the decorators in this table.
+ | Column name | Type | Description |
+ |---------------------------------------------------------------------------------------------------------------|------------------|----------------------------------------------------------------------------------|
+ | name | TEXT PRIMARY KEY | The key of the decorator. |
+ | dataType | VARCHAR(511) | The data type of the decorator, needed for parsing. |
+ | moduleReferenceName | TEXT | References the corresponding consumer module reference the decorator belongs to. |
+ | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
+
+- **classifiers:** There will be the ability for client applications to apply user-defined keywords/tags (classifiers) to
+ topology entities and relationships.
+ We will be storing the schemas for the classifiers in this table.
+ | Column name | Type | Description |
+ |---------------------------------------------------------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------|
+ | name | TEXT PRIMARY KEY | The actual classifier. |
+ | moduleReferenceName | TEXT | References the corresponding consumer module reference the classifier belongs to. |
+ | FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data.module_reference ("name") ON DELETE CASCADE | FOREIGN KEY | Foreign key constraint |
+
+##### How to use classifiers and decorators
+1. Create a schema with the /schemas endpoint using Yang Module. After a successful schema creation, the topology objects are ready to be classified.
+2. Assign classifiers and/or decorators to the entities and/or relationships.
+3. Search classifiers and/or decorators by using queries.
+
### Skeleton Data and Model SQL Files
- [00_init-oran-smo-teiv-data.sql](src/main/resources/scripts/00_init-oran-smo-teiv-data.sql)
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java
index 20280a5..72ce40b 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Attribute.java
@@ -25,6 +25,7 @@
import lombok.Builder;
import lombok.Getter;
+import lombok.Singular;
@Getter
@Builder
@@ -34,4 +35,6 @@
@Builder.Default
private Collection<Object> constraints = List.of();
private String defaultValue;
+ @Singular
+ private List<IndexType> indexTypes;
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java
index ff74f67..14c9c8a 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Column.java
@@ -34,4 +34,6 @@
@Builder.Default
private Collection<PostgresConstraint> postgresConstraints = List.of();
private String defaultValue;
+ @Builder.Default
+ private List<PostgresIndex> postgresIndexList = List.of();
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java
index ab0c590..b0678fd 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Constants.java
@@ -24,7 +24,6 @@
@UtilityClass
public class Constants {
-
public static final String NO_PREFIX = "";
public static final String CONSUMER_DATA = "CD_";
public static final String SOURCE_IDS = "sourceIds";
@@ -33,15 +32,14 @@
public static final String REL_CD = "REL_CD_";
public static final String FOREIGN_KEY = "FK_";
public static final String PRIMARY_KEY = "PK_";
- public static final String NOT_NULL = "NOT_NULL_";
public static final String UNIQUE = "UNIQUE_";
+ public static final String INDEX_PREFIX = "IDX_";
public static final String A_SIDE_PREFIX = "aSide_";
public static final String B_SIDE_PREFIX = "bSide_";
public static final String ID = "id";
public static final String COLUMN = "COLUMN";
public static final String TABLE = "TABLE";
public static final String CONSTRAINT = "CONSTRAINT";
- public static final String VARCHAR511 = "VARCHAR(511)";
public static final String TEXT = "TEXT";
public static final String DECIMAL = "DECIMAL";
public static final String BIGINT = "BIGINT";
@@ -50,12 +48,11 @@
public static final String CREATE = "CREATE";
public static final String ALTER = "ALTER";
public static final String DEFAULT = "DEFAULT";
+ public static final String INDEX = "INDEX";
public static final String ALTER_TABLE_TIES_DATA_S = "ALTER TABLE ties_data.\"%s\" ";
public static final String ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S = ALTER_TABLE_TIES_DATA_S + "ADD CONSTRAINT \"%s\" ";
public static final String CLASSIFIERS = "classifiers";
public static final String DECORATORS = "decorators";
- public static final String DEFAULT_MODULE_STATUS = "IN_USAGE";
- public static final String BUILT_IN_MODULE_ID = "BUILT_IN_MODULE";
public static final String A_SIDE = "A_SIDE";
public static final String B_SIDE = "B_SIDE";
public static final String RELATION = "RELATION";
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java
index fdfd5c8..e4e9fc5 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/ConsumerData.java
@@ -22,6 +22,9 @@
import lombok.Builder;
import lombok.Getter;
+import lombok.Singular;
+
+import java.util.List;
@Getter
@Builder
@@ -29,4 +32,6 @@
private String name;
private String dataType;
private String defaultValue;
+ @Singular
+ private List<IndexType> indexTypes;
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java
index a3da50a..3208c2d 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Entity.java
@@ -22,25 +22,28 @@
import java.util.List;
+import lombok.Value;
import org.oran.smo.teiv.pgsqlgenerator.schema.Table;
import lombok.Builder;
-import lombok.Getter;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.SOURCE_IDS;
-@Getter
+@Value
@Builder
public class Entity implements Table {
- private String entityName;
- private String moduleReferenceName;
- private List<Attribute> attributes;
+ String entityName;
+ String storedAt;
+ String moduleReferenceName;
+ List<Attribute> attributes;
@Builder.Default
- private List<ConsumerData> consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue(
- "[]").build(), ConsumerData.builder().name(CLASSIFIERS).dataType(JSONB).defaultValue("[]").build(), ConsumerData
- .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").build());
+ List<ConsumerData> consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue("[]")
+ .indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData.builder().name(CLASSIFIERS).dataType(
+ JSONB).defaultValue("[]").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData
+ .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").indexType(IndexType.GIN)
+ .build());
@Override
public String getTableName() {
@@ -49,11 +52,11 @@
@Override
public String getColumnsForCopyStatement() {
- return "(\"name\", \"moduleReferenceName\")";
+ return "(\"storedAt\", \"name\", \"moduleReferenceName\")";
}
@Override
public String getRecordForCopyStatement() {
- return this.getEntityName() + "\t" + this.getModuleReferenceName() + "\n";
+ return this.getStoredAt() + "\t" + this.getEntityName() + "\t" + this.getModuleReferenceName() + "\n";
}
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java
new file mode 100644
index 0000000..434d7cb
--- /dev/null
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/IndexType.java
@@ -0,0 +1,34 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 Ericsson
+ * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.pgsqlgenerator;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum IndexType {
+ GIN("CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN (\"%s\");"),
+ GIN_TRGM_OPS_ON_LIST_AS_JSONB(
+ "CREATE INDEX IF NOT EXISTS \"%s\" ON ties_data.\"%s\" USING GIN ((\"%s\"::TEXT) gin_trgm_ops);");
+
+ private final String createIndexStmt;
+}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java
index 1d6dc2a..6135d67 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Module.java
@@ -38,8 +38,11 @@
private String domain;
private String revision;
private String content;
- private String ownerAppId;
- private String status;
+ private List<String> availableListElements;
+ @Setter
+ private List<String> availableEntities;
+ @Builder.Default
+ private List<String> availableRelations = List.of();
@Setter
@Builder.Default
private Collection<String> includedModules = List.of();
@@ -51,7 +54,7 @@
@Override
public String getColumnsForCopyStatement() {
- return "(\"name\", \"namespace\", \"domain\", \"includedModules\", \"revision\", \"content\", \"ownerAppId\", \"status\")";
+ return "(\"name\", \"namespace\", \"domain\", \"includedModules\", \"revision\", \"content\")";
}
@Override
@@ -60,7 +63,6 @@
this.getDomain() :
"\\N") + "\t" + this.getIncludedModules().stream().map(moduleRef -> "\"" + moduleRef + "\"")
.toList() + "\t" + this.getRevision() + "\t" + Base64.getEncoder().encodeToString(this.getContent()
- .replaceAll("\\r\\n?", "\n").getBytes(StandardCharsets.UTF_8)) + "\t" + this
- .getOwnerAppId() + "\t" + this.getStatus() + "\n";
+ .replaceAll("\\r\\n?", "\n").getBytes(StandardCharsets.UTF_8)) + "\n";
}
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java
new file mode 100644
index 0000000..2418e18
--- /dev/null
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/PostgresIndex.java
@@ -0,0 +1,33 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 Ericsson
+ * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.pgsqlgenerator;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class PostgresIndex {
+ private String tableNameToAddIndexTo;
+ private String columnNameToAddIndexTo;
+ private String indexName;
+ private IndexType indexType;
+}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java
index 943a15e..4d24eee 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Processor.java
@@ -24,9 +24,11 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import org.oran.smo.teiv.pgsqlgenerator.grapghgenerator.EntityGraphGenerator;
+import org.oran.smo.teiv.pgsqlgenerator.schema.consumerdata.ConsumerDataSchemaGenerator;
import org.oran.smo.teiv.pgsqlgenerator.schema.data.DataSchemaGenerator;
import org.oran.smo.teiv.pgsqlgenerator.schema.model.ModelSchemaGenerator;
import org.oran.smo.teiv.pgsqlgenerator.grapghgenerator.RelationshipGraphGenerator;
@@ -44,6 +46,7 @@
private final YangModelProcessor yangModelProcessor;
private final DataSchemaGenerator dataSchemaGenerator;
private final ModelSchemaGenerator modelSchemaGenerator;
+ private final ConsumerDataSchemaGenerator consumerDataSchemaGenerator;
private final RelationshipGraphGenerator relationshipGraphGenerator;
private final EntityGraphGenerator entityGraphGenerator;
@Value("${yang-model.source}")
@@ -69,6 +72,7 @@
entityGraphGenerator.generate(entitiesFromModelService);
dataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService);
modelSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService);
+ consumerDataSchemaGenerator.generate(moduleReferences, entitiesFromModelService, relationshipsFromModelService);
}
/**
@@ -90,7 +94,7 @@
includedModules.removeIf(modelRef -> !moduleRefForAllEntities.contains(modelRef));
module.setIncludedModules(includedModules);
}
+ moduleRefFromYangParser.sort(Comparator.comparing(Module::getName));
return moduleRefFromYangParser;
-
}
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java
index a4285cc..82b2f1b 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/Relationship.java
@@ -22,39 +22,43 @@
import java.util.List;
+import lombok.Value;
import org.oran.smo.teiv.pgsqlgenerator.schema.Table;
import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.CLASSIFIERS;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECORATORS;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.SOURCE_IDS;
-@Getter
+@Value
@Builder
public class Relationship implements Table {
- private String name;
- private String aSideAssociationName;
- private String aSideMOType;
- private long aSideMinCardinality;
- private long aSideMaxCardinality;
- private String bSideAssociationName;
- private String bSideMOType;
- private long bSideMinCardinality;
- private long bSideMaxCardinality;
- private String associationKind;
- @Setter
- private String relationshipDataLocation;
- private boolean connectSameEntity;
- @Setter
- private String moduleReferenceName;
+ String name;
+ String aSideAssociationName;
+ String aSideMOType;
+ String aSideModule;
+ long aSideMinCardinality;
+ long aSideMaxCardinality;
+ String bSideAssociationName;
+ String bSideMOType;
+ String bSideModule;
+ long bSideMinCardinality;
+ long bSideMaxCardinality;
+ String associationKind;
+ boolean connectSameEntity;
+ String relationshipDataLocation;
+ String storedAt;
+ String moduleReferenceName;
@Builder.Default
- private List<ConsumerData> consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue(
- "[]").build(), ConsumerData.builder().name(CLASSIFIERS).dataType(JSONB).defaultValue("[]").build(), ConsumerData
- .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").build());
+ List<ConsumerData> consumerData = List.of(ConsumerData.builder().name(SOURCE_IDS).dataType(JSONB).defaultValue("[]")
+ .indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData.builder().name(CLASSIFIERS).dataType(
+ JSONB).defaultValue("[]").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build(), ConsumerData
+ .builder().name(DECORATORS).dataType(JSONB).defaultValue("{}").indexType(IndexType.GIN)
+ .build());
+ String aSideStoredAt;
+ String bSideStoredAt;
@Override
public String getTableName() {
@@ -63,16 +67,19 @@
@Override
public String getColumnsForCopyStatement() {
- return "(\"name\", \"aSideAssociationName\", \"aSideMOType\", \"aSideMinCardinality\", \"aSideMaxCardinality\", \"bSideAssociationName\", \"bSideMOType\", \"bSideMinCardinality\", \"bSideMaxCardinality\", \"associationKind\", \"relationshipDataLocation\", \"connectSameEntity\", \"moduleReferenceName\")";
+ return "(\"name\", \"aSideAssociationName\", \"aSideMOType\", \"aSideModule\", \"aSideMinCardinality\", \"aSideMaxCardinality\", \"bSideAssociationName\", \"bSideMOType\", \"bSideModule\", \"bSideMinCardinality\", \"bSideMaxCardinality\", \"associationKind\", \"connectSameEntity\", \"relationshipDataLocation\", \"storedAt\", \"moduleReferenceName\")";
}
@Override
public String getRecordForCopyStatement() {
return this.getName() + "\t" + this.getASideAssociationName() + "\t" + this.getASideMOType() + "\t" + this
- .getASideMinCardinality() + "\t" + this.getASideMaxCardinality() + "\t" + this
- .getBSideAssociationName() + "\t" + this.getBSideMOType() + "\t" + this
- .getBSideMinCardinality() + "\t" + this.getBSideMaxCardinality() + "\t" + this
- .getAssociationKind() + "\t" + this.getRelationshipDataLocation() + "\t" + this
- .isConnectSameEntity() + "\t" + this.getModuleReferenceName() + "\n";
+ .getASideModule() + "\t" + this.getASideMinCardinality() + "\t" + this
+ .getASideMaxCardinality() + "\t" + this.getBSideAssociationName() + "\t" + this
+ .getBSideMOType() + "\t" + this.getBSideModule() + "\t" + this
+ .getBSideMinCardinality() + "\t" + this.getBSideMaxCardinality() + "\t" + this
+ .getAssociationKind() + "\t" + this.isConnectSameEntity() + "\t" + this
+ .getRelationshipDataLocation() + "\t" + this
+ .getStoredAt() + "\t" + this
+ .getModuleReferenceName() + "\n";
}
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java
index 87caa91..ff4a9cf 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangModelProcessor.java
@@ -24,18 +24,21 @@
import static org.oran.smo.teiv.pgsqlgenerator.Constants.BIGINT;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.B_SIDE;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.DECIMAL;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.INT;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.JSONB;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.RELATION;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.TEXT;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.VARCHAR511;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
+import java.util.NoSuchElementException;
import java.util.Optional;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.oran.smo.yangtools.parser.ParserExecutionContext;
@@ -62,6 +65,8 @@
@Slf4j
public class YangModelProcessor {
private final HashMap<String, String> dataTypeMapping;
+ @Value("${exclusions.model-names}")
+ private List<String> excludedModelNames;
private final YangDeviceModel yangDeviceModel;
private final ModifyableFindingSeverityCalculator severityCalculator;
private final FindingsManager findingsManager;
@@ -92,7 +97,7 @@
{
put("string", TEXT);
put("uint32", BIGINT);
- put("int32", BIGINT);
+ put("int32", INT);
put("or-teiv-types:_3GPP_FDN_Type", TEXT);
put("enumeration", TEXT);
put("types3gpp:PLMNId", JSONB);
@@ -124,12 +129,13 @@
System.out.println("Module Name: " + yModule.getModuleName());
yModule.getLists().stream().forEach(yList -> {
+ final String tableName = getTableName(yModule.getModuleName(), yList.getListName());
System.out.printf("\tEntity Name: %s \n", yList.getListName());
List<Attribute> attributes = new ArrayList<>();
List constraint = List.of(PrimaryKeyConstraint.builder().constraintName("PK_" + yList.getListName() + "_id")
.tableName(yList.getListName()).columnToAddConstraintTo("id").build());
- attributes.add(Attribute.builder().name("id").dataType(VARCHAR511).constraints(constraint).build());
+ attributes.add(Attribute.builder().name("id").dataType(TEXT).constraints(constraint).build());
yList.getContainers().forEach(yContainer -> {
System.out.printf("\t\tContainer Name: %s \n", yContainer.getContainerName());
if (yContainer.getContainerName().equals("attributes")) {
@@ -158,8 +164,8 @@
System.out.printf("\t\t\t\tData Type: %s \n", dataTypeMapping.get(yLeafList.getType()
.getDataType()));
- attributes.add(Attribute.builder().name(yLeafList.getLeafListName()).dataType(JSONB)
- .constraints(new ArrayList()).build());
+ attributes.add(Attribute.builder().name(yLeafList.getLeafListName()).dataType(JSONB).indexType(
+ IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).constraints(new ArrayList()).build());
});
yContainer.getContainers().forEach(container -> {
@@ -168,8 +174,16 @@
System.out.printf("\t\t\t\tData Type: %s \n", dataTypeMapping.get(container.getUses()
.toString()));
- attributes.add(Attribute.builder().name(container.getContainerName()).dataType(dataTypeMapping
- .get(container.getUses().toString())).constraints(new ArrayList()).build());
+ String dataType = dataTypeMapping.get(container.getUses().toString());
+ Attribute.AttributeBuilder attributeBuilder = Attribute.builder().name(container
+ .getContainerName()).dataType(dataType).constraints(new ArrayList());
+ if (container.getContainerName().equals("geo-location")) {
+ dataType = dataTypeMapping.get("geo:geo-location");
+ }
+ if (dataType.equals(JSONB)) {
+ attributeBuilder.indexType(IndexType.GIN);
+ }
+ attributes.add(attributeBuilder.build());
});
yContainer.getUses().forEach(uses -> {
@@ -182,10 +196,12 @@
});
}
});
- entities.add(Entity.builder().entityName(yList.getListName()).moduleReferenceName(yangModel
- .getYangModelRoot().getModule().getModuleName()).attributes(attributes).build());
+ attributes.sort(Comparator.comparing(Attribute::getName));
+ entities.add(Entity.builder().entityName(yList.getListName()).storedAt(tableName).moduleReferenceName(
+ yangModel.getYangModelRoot().getModule().getModuleName()).attributes(attributes).build());
});
});
+ entities.sort(Comparator.comparing(Entity::getStoredAt));
return entities;
}
@@ -306,24 +322,50 @@
connectSameEntity = false;
}
+ String aSideModuleName = getSideModuleName(yangModels, aSideMoType);
+ String bSideModuleName = getSideModuleName(yangModels, bSideMoType);
+
+ String storedAt = "";
+ switch (relDataLocation) {
+ case A_SIDE -> storedAt = getTableName(aSideModuleName, aSideMoType);
+ case B_SIDE -> storedAt = getTableName(bSideModuleName, bSideMoType);
+ case RELATION -> storedAt = getTableName(yModule.getDomElement().getValue(),
+ yOranSmoTeivBiDirectionalTopologyRelationship.getRelationshipName());
+ }
+
Relationship relationship = Relationship.builder().name(
yOranSmoTeivBiDirectionalTopologyRelationship.getRelationshipName())
.aSideAssociationName(aSide.getParentStatement().getStatementIdentifier())
- .aSideMOType(aSideMoType).aSideMinCardinality(aSideMinCardinality)
- .aSideMaxCardinality(aSideMaxCardinality).bSideAssociationName(bSide
- .getParentStatement().getStatementIdentifier()).bSideMOType(bSideMoType)
- .bSideMinCardinality(bSideMinCardinality).bSideMaxCardinality(bSideMaxCardinality)
+ .aSideMOType(aSideMoType).aSideModule(aSideModuleName).aSideMinCardinality(
+ aSideMinCardinality).aSideMaxCardinality(aSideMaxCardinality)
+ .bSideAssociationName(bSide.getParentStatement().getStatementIdentifier())
+ .bSideMOType(bSideMoType).bSideModule(bSideModuleName).bSideMinCardinality(
+ bSideMinCardinality).bSideMaxCardinality(bSideMaxCardinality)
.relationshipDataLocation(relDataLocation).moduleReferenceName(yModule
- .getModuleName()).associationKind(("BI_DIRECTIONAL")) // Hard coded for now
- .connectSameEntity(connectSameEntity).build(); // Hard coded for now
+ .getModuleName()).associationKind(("BI_DIRECTIONAL")).connectSameEntity(
+ connectSameEntity).storedAt(storedAt).aSideStoredAt(getTableName(
+ aSideModuleName, aSideMoType)).bSideStoredAt(getTableName(
+ bSideModuleName, bSideMoType)).build(); // Hard coded for now
relationships.add(relationship);
});
});
+ relationships.sort(Comparator.comparing(Relationship::getName));
return relationships;
}
+ private String getSideModuleName(List<YangModel> yangModels, String aSideMoType) {
+ return yangModels.stream().flatMap(ym -> ym.getYangDomDocumentRoot().getChildren().stream()).flatMap(
+ children -> children.getChildren().stream()).filter(child -> child.getValue().equals(aSideMoType)).map(
+ child -> child.getParentElement().getValue()).findFirst().orElseThrow(
+ () -> new NoSuchElementException("No module name found for type: " + aSideMoType));
+ }
+
+ private String getTableName(String moduleName, String name) {
+ return moduleName + "_" + name;
+ }
+
/**
- * Identify where relationship data should be stored
+ * Identify the type of table in which relationship should be stored.
*/
private String getRelationshipDataLocation(long aSideMaxCardinality, long bSideMaxCardinality, String aSideMO,
String bSideMO, String relName) {
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java
index 1b773fc..fdc0d9d 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/YangParser.java
@@ -20,9 +20,6 @@
*/
package org.oran.smo.teiv.pgsqlgenerator;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.BUILT_IN_MODULE_ID;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT_MODULE_STATUS;
-
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -46,6 +43,7 @@
import org.oran.smo.yangtools.parser.model.YangModel;
import org.oran.smo.yangtools.parser.model.statements.AbstractStatement;
import org.oran.smo.yangtools.parser.model.statements.StatementModuleAndName;
+import org.oran.smo.yangtools.parser.model.yangdom.YangDomElement;
@Slf4j
@Component
@@ -68,14 +66,34 @@
String domain = getDomain(moduleOrSubmodule);
String namespace = getNamespace(moduleOrSubmodule);
List<String> includedModules = getIncludedModules(moduleOrSubmodule);
+ List<String> availableRelations = getAvailableRelations(moduleOrSubmodule);
+ List<String> availableListElements = getAvailableListElements(moduleOrSubmodule);
modules.add(Module.builder().name(moduleReferenceName).namespace(namespace).domain(domain).includedModules(
includedModules).revision(yangInput.getModuleIdentity().getRevision()).content(new String(yangInput
- .getYangInput().getInputStream().readAllBytes(), StandardCharsets.UTF_8)).ownerAppId(
- BUILT_IN_MODULE_ID).status(DEFAULT_MODULE_STATUS).build());
+ .getYangInput().getInputStream().readAllBytes(), StandardCharsets.UTF_8)).availableListElements(
+ availableListElements).availableRelations(availableRelations).availableEntities(
+ new ArrayList<>()).build());
}
return modules;
}
+ private List<String> getAvailableRelations(AbstractStatement statement) {
+ List<String> includedModules = new ArrayList<>();
+ statement.getChildStatements().forEach(childStatement -> {
+ String domStatement = childStatement.getDomElement().toString();
+ if (domStatement.contains("or-teiv-yext:biDirectionalTopologyRelationship")) {
+ includedModules.add(childStatement.getDomElement().getValue());
+ }
+ });
+ return includedModules;
+ }
+
+ private List<String> getAvailableListElements(AbstractStatement statement) {
+ return statement.getDomElement().getChildren().stream().filter(yangDomElement -> yangDomElement.getName().equals(
+ "list")).map(YangDomElement::getValue).toList();
+
+ }
+
private String getDomain(AbstractStatement moduleOrSubmodule) {
AbstractStatement domainStatement = moduleOrSubmodule.getChild(new StatementModuleAndName(
"o-ran-smo-teiv-common-yang-extensions", "domain"));
@@ -112,7 +130,7 @@
final List<YangModel> yangModelInputs = new ArrayList<>();
try {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(this.getClass().getClassLoader());
- Resource[] yangResources = resolver.getResources(yangModelDirectory + "/*.yang");
+ Resource[] yangResources = resolver.getResources(yangModelDirectory + "/**/*.yang");
for (Resource yangResource : yangResources) {
yangModelInputs.add(new YangModel(new ByteArrayYangInput(yangResource.getContentAsByteArray(), Objects
.requireNonNull(yangResource.getFilename())), ConformanceType.IMPORT));
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java
index 6b76cc1..bec8e3b 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/grapghgenerator/RelationshipGraphGenerator.java
@@ -64,7 +64,7 @@
private void generateGraph(String name, List<Relationship> relationships, List<Entity> entities) throws IOException {
MutableGraph g = prepareGraph(relationships, entities);
- File outputFile = new File(graphOutput, name);
+ File outputFile = new File(graphOutput, name + "-rel");
Graphviz.fromGraph(g).render(Format.SVG).toFile(outputFile);
log.info("Graph rendered to: {}", outputFile.getAbsolutePath());
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java
index 0b310bf..0fae2fc 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityChecker.java
@@ -24,6 +24,7 @@
import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint;
import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException;
import org.oran.smo.teiv.pgsqlgenerator.PostgresConstraint;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.oran.smo.teiv.pgsqlgenerator.Table;
import org.oran.smo.teiv.pgsqlgenerator.Relationship;
@@ -85,12 +86,24 @@
}
}
+ public void checkForNBCChangesInConsumerDataSchema(String baselineConsumerDataSchema,
+ String skeletonConsumerDataSchema) {
+ if (!isGreenFieldInstallation) {
+ final List<Table> baselineTables = SchemaParser.extractDataFromBaseline(baselineConsumerDataSchema);
+ final List<Table> skeletonTables = SchemaParser.extractDataFromBaseline(skeletonConsumerDataSchema);
+ checkForNBCChangesInData(baselineTables, skeletonTables);
+ } else {
+ log.info("No NBC checks done as green field installation is enabled");
+ }
+ }
+
private void verifyTableColumns(List<Column> columnsInBaseline, List<Column> columnsInModelSvc, String tableName) {
columnsInBaseline.forEach(baselineColumn -> {
Optional<Column> matchingColumn = columnsInModelSvc.stream().filter(modelColumn -> modelColumn.getName().equals(
baselineColumn.getName())).findFirst();
matchingColumn.ifPresentOrElse(modelColumn -> {
validateColumnConstraints(baselineColumn, modelColumn, tableName);
+ validateColumnIndexes(baselineColumn, modelColumn, tableName);
validateColumnDataType(baselineColumn, modelColumn, tableName);
}, () -> {
throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format(
@@ -127,6 +140,32 @@
}
}
+ private void validateColumnIndexes(Column baselineColumn, Column modelColumn, String tableName) {
+ for (PostgresIndex indexInBaseline : baselineColumn.getPostgresIndexList()) {
+ Optional<PostgresIndex> matchingIndex = modelColumn.getPostgresIndexList().stream().filter(
+ indexInGenerated -> indexInGenerated.getIndexName().equals(indexInBaseline.getIndexName())).findFirst();
+
+ matchingIndex.ifPresentOrElse(indexInGenerated -> {
+ String indexStatementInBaseline = String.format(indexInBaseline.getIndexType().getCreateIndexStmt(),
+ indexInBaseline.getIndexName(), indexInBaseline.getTableNameToAddIndexTo(), indexInBaseline
+ .getColumnNameToAddIndexTo());
+ String indexStatementInGenerated = String.format(indexInGenerated.getIndexType().getCreateIndexStmt(),
+ indexInGenerated.getIndexName(), indexInGenerated.getTableNameToAddIndexTo(), indexInGenerated
+ .getColumnNameToAddIndexTo());
+ if (!indexStatementInGenerated.equals(indexStatementInBaseline)) {
+ throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format(
+ "modified/removed index %s for column(%s.%s) present in baseline", indexInBaseline
+ .getIndexName(), tableName, baselineColumn.getName()),
+ new UnsupportedOperationException());
+ }
+ }, () -> {
+ throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format(
+ "modified/removed index %s for column(%s.%s) present in baseline", indexInBaseline.getIndexName(),
+ tableName, baselineColumn.getName()), new UnsupportedOperationException());
+ });
+ }
+ }
+
private void validateColumnDataType(Column baselineColumn, Column modelColumn, String tableName) {
if (!baselineColumn.getDataType().equals(modelColumn.getDataType())) {
throw PgSchemaGeneratorException.nbcChangeIdentifiedException(String.format(
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java
index a51fe1e..7dc1d4b 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParser.java
@@ -35,10 +35,12 @@
import org.apache.commons.lang3.StringUtils;
import org.oran.smo.teiv.pgsqlgenerator.Column;
+import org.oran.smo.teiv.pgsqlgenerator.IndexType;
import org.oran.smo.teiv.pgsqlgenerator.PostgresConstraint;
import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint;
import org.oran.smo.teiv.pgsqlgenerator.NotNullConstraint;
import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint;
import org.oran.smo.teiv.pgsqlgenerator.Table;
import org.oran.smo.teiv.pgsqlgenerator.UniqueConstraint;
@@ -74,12 +76,12 @@
line = br.readLine();
List<String> relData = Arrays.asList(line.replace("\"", "").split("\\s+"));
identifiedRelationships.add(Relationship.builder().name(relData.get(0)).aSideAssociationName(relData
- .get(1)).aSideMOType(relData.get(2)).aSideMinCardinality(Long.parseLong(relData.get(3)))
- .aSideMaxCardinality(Long.parseLong(relData.get(4))).bSideAssociationName(relData.get(5))
- .bSideMOType(relData.get(6)).bSideMinCardinality(Long.parseLong(relData.get(7)))
- .bSideMaxCardinality(Long.parseLong(relData.get(8))).associationKind(relData.get(9))
- .relationshipDataLocation(relData.get(10)).connectSameEntity(Boolean.parseBoolean(relData
- .get(11))).moduleReferenceName(relData.get(12)).build());
+ .get(1)).aSideMOType(relData.get(2)).aSideMinCardinality(Long.parseLong(relData.get(4)))
+ .aSideMaxCardinality(Long.parseLong(relData.get(5))).bSideAssociationName(relData.get(6))
+ .bSideMOType(relData.get(7)).bSideMinCardinality(Long.parseLong(relData.get(9)))
+ .bSideMaxCardinality(Long.parseLong(relData.get(10))).associationKind(relData.get(11))
+ .connectSameEntity(Boolean.parseBoolean(relData.get(12))).relationshipDataLocation(relData
+ .get(13)).moduleReferenceName(relData.get(15)).build());
}
}
} catch (IOException exception) {
@@ -109,6 +111,8 @@
extractTableColumns(line, identifiedTables, br);
} else if (line.contains("SELECT") && line.contains("ties_data.create_constraint_if_not_exists")) {
extractConstraints(identifiedTables, br);
+ } else if (line.startsWith("CREATE INDEX IF NOT EXISTS")) {
+ extractIndex(line, identifiedTables);
}
}
} catch (IOException exception) {
@@ -218,4 +222,32 @@
identifiedTables.add(Table.builder().name(entityName).columns(identifiedColumns).build());
}
+ private static void extractIndex(String line, List<org.oran.smo.teiv.pgsqlgenerator.Table> identifiedTables)
+ throws IOException {
+ String[] valuesInQuotes = StringUtils.substringsBetween(line, "\"", "\"");
+ String indexName = valuesInQuotes[0];
+ String tableToAddIndexTo = valuesInQuotes[1];
+ String columnToAddIndexTo = valuesInQuotes[2];
+
+ List<PostgresIndex> postgresIndexList = new ArrayList<>();
+
+ identifiedTables.stream().filter(table -> table.getName().equals(tableToAddIndexTo)).findFirst().flatMap(
+ table -> table.getColumns().stream().filter(column -> column.getName().equals(columnToAddIndexTo))
+ .findFirst()).ifPresent(column -> {
+ if (!column.getPostgresIndexList().isEmpty()) {
+ postgresIndexList.addAll(column.getPostgresIndexList());
+ }
+ String createIndexStmt = line.replace(indexName, "%s").replace(tableToAddIndexTo, "%s").replace(
+ columnToAddIndexTo, "%s");
+ for (IndexType indexType : IndexType.values()) {
+ if (indexType.getCreateIndexStmt().equals(createIndexStmt)) {
+ postgresIndexList.add(PostgresIndex.builder().tableNameToAddIndexTo(tableToAddIndexTo)
+ .columnNameToAddIndexTo(columnToAddIndexTo).indexName(indexName).indexType(
+ indexType).build());
+ }
+ }
+ column.setPostgresIndexList(postgresIndexList);
+ });
+ }
+
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java
new file mode 100644
index 0000000..4f9e185
--- /dev/null
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/consumerdata/ConsumerDataSchemaGenerator.java
@@ -0,0 +1,75 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 Ericsson
+ * Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.oran.smo.teiv.pgsqlgenerator.schema.consumerdata;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.oran.smo.teiv.pgsqlgenerator.Entity;
+import org.oran.smo.teiv.pgsqlgenerator.Module;
+import org.oran.smo.teiv.pgsqlgenerator.PgSchemaGeneratorException;
+import org.oran.smo.teiv.pgsqlgenerator.Relationship;
+import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker;
+import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaGenerator;
+import org.springframework.util.ResourceUtils;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class ConsumerDataSchemaGenerator extends SchemaGenerator {
+ private final BackwardCompatibilityChecker backwardCompatibilityChecker;
+
+ @Value("${schema.consumer-data.baseline}")
+ private String baselineConsumerDataSchema;
+ @Value("${schema.consumer-data.output}")
+ private String outputConsumerDataSchema;
+ @Value("${schema.consumer-data.skeleton}")
+ private String skeletonConsumerDataSchema;
+
+ @Override
+ protected void prepareSchema() {
+ try {
+ final File skeletonFile = ResourceUtils.getFile("classpath:" + skeletonConsumerDataSchema);
+ backwardCompatibilityChecker.checkForNBCChangesInConsumerDataSchema(baselineConsumerDataSchema, skeletonFile
+ .getAbsolutePath());
+
+ final Path destinationPath = Paths.get(outputConsumerDataSchema);
+ Files.copy(skeletonFile.toPath(), destinationPath, StandardCopyOption.REPLACE_EXISTING);
+ this.schema = destinationPath.toFile();
+ } catch (IOException exception) {
+ throw PgSchemaGeneratorException.prepareBaselineException("ties.consumer-data", exception);
+ }
+ }
+
+ @Override
+ protected void setSqlStatements(List<Module> modules, List<Entity> entities, List<Relationship> relationships) {
+ //DO-NOTHING
+ }
+}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java
index 81845ca..1a39705 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaGenerator.java
@@ -27,6 +27,7 @@
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -76,9 +77,15 @@
log.info("Baseline EXISTS!!");
Path sourcePath = baselineDataSchemaFile.toPath();
List<String> stmts = Files.readAllLines(sourcePath);
- List<String> commitExcludedStmts = stmts.stream().filter(line -> !line.equals("COMMIT;")).toList();
+ List<String> analyzeAndCommitExcludedStmts = new ArrayList<>();
+ for (String line : stmts) {
+ if (line.startsWith("ANALYZE") || line.equals("COMMIT;")) {
+ break;
+ }
+ analyzeAndCommitExcludedStmts.add(line);
+ }
- Files.write(Paths.get(dataSchemaFileName), commitExcludedStmts, StandardOpenOption.CREATE,
+ Files.write(Paths.get(dataSchemaFileName), analyzeAndCommitExcludedStmts, StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING);
}
this.schema = newDataSchema;
@@ -102,8 +109,16 @@
tablesFromBaselineSql);
// Generate schema from differences
StringBuilder generatedSchema = dataSchemaHelper.generateSchemaFromDifferences(differences);
- generatedSchema.append("\nCOMMIT;\n");
+ generatedSchema.append(generateAnalyzeTableStatement(tablesFromModelSvc));
+ generatedSchema.append("COMMIT;\n");
this.sqlStatements = generatedSchema.toString();
}
+ private StringBuilder generateAnalyzeTableStatement(List<Table> tablesFromModelSvc) {
+ StringBuilder analyzeTableStmt = new StringBuilder();
+ tablesFromModelSvc.forEach(table -> analyzeTableStmt.append(String.format("ANALYZE ties_data.\"%s\";%n%n", table
+ .getName())));
+ return analyzeTableStmt;
+ }
+
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java
index ca29e4c..84d4a57 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/DataSchemaHelper.java
@@ -23,6 +23,7 @@
import java.util.List;
import java.util.Map;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@@ -38,8 +39,12 @@
import static org.oran.smo.teiv.pgsqlgenerator.Constants.CREATE;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEOGRAPHY;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.GEO_LOCATION;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER_TABLE_TIES_DATA_S;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX;
@Slf4j
@Component
@@ -59,9 +64,10 @@
} else {
for (Map.Entry<String, List<Table>> entry : differences.entrySet()) {
switch (entry.getKey()) {
- case CREATE -> generatedSchema.append(generateCreateStatementsFromDifferences(entry.getValue()));
+ case DEFAULT -> generatedSchema.append(generateDefaultStatementsFromDifferences(entry.getValue()));
+ case INDEX -> generatedSchema.append(generateIndexStatementsFromDifferences(entry.getValue()));
case ALTER -> generatedSchema.append(generateAlterStatementsFromDifferences(entry.getValue()));
- default -> generatedSchema.append(generateDefaultStatementsFromDifferences(entry.getValue()));
+ case CREATE -> generatedSchema.append(generateCreateStatementsFromDifferences(entry.getValue()));
}
}
}
@@ -75,15 +81,17 @@
StringBuilder storeSchemaForCreateStatements = new StringBuilder();
StringBuilder storeAlterStatementsForPrimaryKeyConstraints = new StringBuilder();
StringBuilder storeAlterStatementsForAllOtherConstraints = new StringBuilder();
+ StringBuilder storeIndexStatements = new StringBuilder();
for (Table table : tables) {
storeAlterStatementsForPrimaryKeyConstraints.append(generateAlterStatementsForPrimaryKeyConstraints(table
.getColumns()));
storeAlterStatementsForAllOtherConstraints.append(generateAlterStatementsForAllOtherConstraints(table
.getColumns()));
+ storeIndexStatements.append(generateIndexStatementForColumns(table.getColumns()));
storeSchemaForCreateStatements.append(generateCreateTableStatements(table.getColumns(), table.getName()));
}
storeSchemaForCreateStatements.append(storeAlterStatementsForPrimaryKeyConstraints).append(
- storeAlterStatementsForAllOtherConstraints);
+ storeAlterStatementsForAllOtherConstraints).append(storeIndexStatements);
return storeSchemaForCreateStatements;
}
@@ -158,6 +166,16 @@
postgresConstraint.getTableToAddConstraintTo(), postgresConstraint.getConstraintName(), constraintSql);
}
+ private StringBuilder generateIndexStatementForColumns(List<Column> columns) {
+ StringBuilder indexStmt = new StringBuilder();
+ columns.forEach(column -> {
+ column.getPostgresIndexList().forEach(postgresIndex -> {
+ indexStmt.append(generateIndexStatement(postgresIndex));
+ });
+ });
+ return indexStmt;
+ }
+
private String generateConstraintSql(PostgresConstraint postgresConstraint) {
if (postgresConstraint instanceof PrimaryKeyConstraint) {
return String.format(ALTER_TABLE_TIES_DATA_S_ADD_CONSTRAINT_S + "PRIMARY KEY (\"%s\")", postgresConstraint
@@ -189,28 +207,32 @@
StringBuilder storeSchemaForAlterStatements = new StringBuilder();
StringBuilder storeAlterStatementsForPrimaryKeyConstraints = new StringBuilder();
StringBuilder storeAlterStatementsForAllOtherConstraints = new StringBuilder();
+ StringBuilder storeIndexStatements = new StringBuilder();
for (Table table : tables) {
storeSchemaForAlterStatements.append(generateAlterStatements(table.getColumns(), table.getName()));
storeAlterStatementsForPrimaryKeyConstraints.append(generateAlterStatementsForPrimaryKeyConstraints(table
.getColumns()));
storeAlterStatementsForAllOtherConstraints.append(generateAlterStatementsForAllOtherConstraints(table
.getColumns()));
+ storeIndexStatements.append(generateIndexStatementForColumns(table.getColumns()));
}
return storeSchemaForAlterStatements.append(storeAlterStatementsForPrimaryKeyConstraints).append(
- storeAlterStatementsForAllOtherConstraints);
+ storeAlterStatementsForAllOtherConstraints).append(storeIndexStatements);
}
/**
* Generates SQL statements for altering tables based on mapped entity attributes.
*/
private StringBuilder generateAlterStatements(List<Column> columns, String tableName) {
-
StringBuilder storeSchema = new StringBuilder();
for (Column newColumn : columns) {
- if (newColumn.getName().equals("geo-location")) {
- newColumn.setDataType("\"geography\"");
+ if (newColumn.getName().equals(GEO_LOCATION)) {
+ newColumn.setDataType(GEOGRAPHY);
}
storeSchema.append(generateAlterTableStatements(newColumn, tableName));
+ if (newColumn.getDefaultValue() != null) {
+ storeSchema.append(generateDefaultValueStatements(newColumn, tableName));
+ }
}
return storeSchema;
}
@@ -239,4 +261,25 @@
return new StringBuilder(String.format(ALTER_TABLE_TIES_DATA_S + "ADD COLUMN IF NOT EXISTS \"%s\" %s;%n%n",
tableName, newColumn.getName(), newColumn.getDataType()));
}
+
+ private StringBuilder generateIndexStatementsFromDifferences(List<Table> tables) {
+ StringBuilder storeSchemaForIndexStatements = new StringBuilder();
+ for (Table table : tables) {
+ StringBuilder storeSchema = new StringBuilder();
+ for (Column column : table.getColumns()) {
+ if (!column.getPostgresIndexList().isEmpty()) {
+ column.getPostgresIndexList().forEach(index -> {
+ storeSchema.append(generateIndexStatement(index));
+ });
+ }
+ }
+ storeSchemaForIndexStatements.append(storeSchema);
+ }
+ return storeSchemaForIndexStatements;
+ }
+
+ private String generateIndexStatement(PostgresIndex postgresIndex) {
+ return String.format(postgresIndex.getIndexType().getCreateIndexStmt(), postgresIndex.getIndexName(), postgresIndex
+ .getTableNameToAddIndexTo(), postgresIndex.getColumnNameToAddIndexTo()) + "\n\n";
+ }
}
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java
index fa0423d..2eb3281 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparator.java
@@ -23,15 +23,18 @@
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ALTER;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.CREATE;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.DEFAULT;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import org.oran.smo.teiv.pgsqlgenerator.IndexType;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.springframework.stereotype.Component;
import org.oran.smo.teiv.pgsqlgenerator.Column;
@@ -68,10 +71,11 @@
}
private Map<String, List<Table>> identifiedModelChangeMapping() {
- Map<String, List<Table>> storeIdentifiedChangesToModels = new HashMap<>();
- storeIdentifiedChangesToModels.put(CREATE, new ArrayList<>());
- storeIdentifiedChangesToModels.put(ALTER, new ArrayList<>());
+ Map<String, List<Table>> storeIdentifiedChangesToModels = new LinkedHashMap<>();
storeIdentifiedChangesToModels.put(DEFAULT, new ArrayList<>());
+ storeIdentifiedChangesToModels.put(INDEX, new ArrayList<>());
+ storeIdentifiedChangesToModels.put(ALTER, new ArrayList<>());
+ storeIdentifiedChangesToModels.put(CREATE, new ArrayList<>());
return storeIdentifiedChangesToModels;
}
@@ -108,6 +112,8 @@
}
detectAndStoreDefaultValueChanges(tableFromModelService.getName(), columnsInBaseline,
columnsFromModuleSvc);
+ detectAndStoreNewlyAddedIndex(tableFromModelService.getName(), columnsInBaseline,
+ columnsFromModuleSvc);
});
});
}
@@ -124,13 +130,8 @@
columnsInBaseline).contains(columnInGenerated.getName())).toList();
identifiedChangesToModels.get(ALTER).add(Table.builder().name(tableName).columns(newColumns.stream().map(
column -> Column.builder().name(column.getName()).dataType(column.getDataType()).postgresConstraints(column
- .getPostgresConstraints()).build()).toList()).build());
- List<Column> columnsWithDefaultValues = newColumns.stream().filter(columnIdentified -> columnIdentified
- .getDefaultValue() != null).toList();
- if (!columnsWithDefaultValues.isEmpty()) {
- identifiedChangesToModels.get(DEFAULT).add(Table.builder().name(tableName).columns(columnsWithDefaultValues)
- .build());
- }
+ .getPostgresConstraints()).defaultValue(column.getDefaultValue()).postgresIndexList(column
+ .getPostgresIndexList()).build()).toList()).build());
}
/**
@@ -153,6 +154,30 @@
}
}
+ private void detectAndStoreNewlyAddedIndex(String tableName, List<Column> columnsInBaseline,
+ List<Column> columnsFromModuleSvc) {
+ List<Column> columnList = new ArrayList<>();
+ columnsInBaseline.forEach(columnInBaseline -> columnsFromModuleSvc.forEach(columnInGenerated -> {
+ if (columnInGenerated.getName().equals(columnInBaseline.getName())) {
+ List<IndexType> indexInBaselineSchema = columnInBaseline.getPostgresIndexList().stream().map(
+ PostgresIndex::getIndexType).toList();
+ List<PostgresIndex> postgresIndexList = new ArrayList<>();
+ columnInGenerated.getPostgresIndexList().forEach(postgresIndex -> {
+ if (!indexInBaselineSchema.contains(postgresIndex.getIndexType())) {
+ postgresIndexList.add(postgresIndex);
+ }
+ });
+ if (!postgresIndexList.isEmpty()) {
+ columnInGenerated.setPostgresIndexList(postgresIndexList);
+ columnList.add(columnInGenerated);
+ }
+ }
+ }));
+ if (!columnList.isEmpty()) {
+ identifiedChangesToModels.get(INDEX).add(Table.builder().name(tableName).columns(columnList).build());
+ }
+ }
+
private List<String> getListOfAllColumns(List<Column> columns) {
List<String> allColumns = new ArrayList<>();
for (Column col : columns) {
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java
index ce3f579..d085339 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilder.java
@@ -27,16 +27,16 @@
import static org.oran.smo.teiv.pgsqlgenerator.Constants.CONSUMER_DATA;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.FOREIGN_KEY;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.ID;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.INDEX_PREFIX;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.NO_PREFIX;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.PRIMARY_KEY;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_CD;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_FK;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.REL_ID;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.TABLE;
+import static org.oran.smo.teiv.pgsqlgenerator.Constants.TEXT;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.UNIQUE;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.VARCHAR511;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.A_SIDE;
-import static org.oran.smo.teiv.pgsqlgenerator.Constants.B_SIDE;
import static org.oran.smo.teiv.pgsqlgenerator.Constants.RELATION;
import java.util.ArrayList;
@@ -48,6 +48,8 @@
import java.util.stream.Collectors;
import org.oran.smo.teiv.pgsqlgenerator.ForeignKeyConstraint;
+import org.oran.smo.teiv.pgsqlgenerator.IndexType;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint;
import org.springframework.stereotype.Component;
@@ -80,30 +82,23 @@
*/
public List<Table> getTables(List<Entity> entities, List<Relationship> relationships) {
// Create table from entities and relationships
- Map<String, List<Column>> tableFromMSvc = new HashMap<>();
+ Map<String, List<Column>> tablesFromModelSvc = new HashMap<>();
entities.forEach(entity -> {
- String tableName = entity.getEntityName();
+ String tableName = entity.getStoredAt();
String hashedTableName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, tableName, TABLE);
- tableFromMSvc.put(hashedTableName, getColumnsByEntity(entity, hashedTableName));
+ tablesFromModelSvc.put(hashedTableName, getColumnsByEntity(entity, hashedTableName));
});
relationships.forEach(relationship -> {
- String tableName = "";
- switch (relationship.getRelationshipDataLocation()) {
- case A_SIDE -> tableName = relationship.getASideMOType();
- case B_SIDE -> tableName = relationship.getBSideMOType();
- case RELATION -> tableName = relationship.getName();
- default -> log.error(String.format("Relationship with name %s cannot be mapped", relationship.getName()));
- }
+ String tableName = relationship.getStoredAt();
String hashedTableName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, tableName, TABLE);
-
- tableFromMSvc.computeIfAbsent(hashedTableName, k -> new ArrayList<>()).addAll(getColumnsByRelationship(
+ tablesFromModelSvc.computeIfAbsent(hashedTableName, k -> new ArrayList<>()).addAll(getColumnsByRelationship(
relationship, tableName, hashedTableName));
});
- return tableFromMSvc.entrySet().stream().map(entry -> Table.builder().name(entry.getKey()).columns(entry.getValue())
- .build()).collect(Collectors.toList());
+ return tablesFromModelSvc.entrySet().stream().map(entry -> Table.builder().name(entry.getKey()).columns(entry
+ .getValue()).build()).collect(Collectors.toList());
}
private List<Column> getColumnsByEntity(Entity entity, String hashedTableName) {
@@ -113,14 +108,18 @@
String hashedAttributeName = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, attributeName,
COLUMN);
return Column.builder().name(hashedAttributeName).dataType(attribute.getDataType()).postgresConstraints(
- getConstraintsForColumn(entity.getEntityName(), hashedTableName, attribute.getConstraints(),
- attributeName, hashedAttributeName)).defaultValue(attribute.getDefaultValue()).build();
+ getConstraintsForColumn(entity.getStoredAt(), hashedTableName, attribute.getConstraints(),
+ attributeName, hashedAttributeName)).defaultValue(attribute.getDefaultValue())
+ .postgresIndexList(getIndexesForColumn(entity.getStoredAt(), hashedTableName, attributeName,
+ hashedAttributeName, attribute.getIndexTypes())).build();
}).toList());
entityCols.addAll(entity.getConsumerData().stream().map(cd -> {
+ String attributeName = CONSUMER_DATA + cd.getName();
String hashedAttributeName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd.getName(),
COLUMN);
return Column.builder().name(hashedAttributeName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue())
- .build();
+ .postgresIndexList(getIndexesForColumn(entity.getStoredAt(), hashedTableName, attributeName,
+ hashedAttributeName, cd.getIndexTypes())).build();
}).toList());
return entityCols;
}
@@ -137,44 +136,46 @@
String hashedTableName) {
List<Column> relColumns = new ArrayList<>();
- final String associationEndpointName = tableName.equals(rel.getASideMOType()) ?
+ final String associationEndpointName = tableName.equals(rel.getASideStoredAt()) ?
rel.getASideAssociationName() :
rel.getBSideAssociationName();
final String relFk = REL_FK + associationEndpointName;
final String relId = REL_ID + rel.getName();
- String hashedTableNameASide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideMOType(),
- TABLE);
- String hashedTableNameBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideMOType(),
- TABLE);
- final String hashedReferenceTable = tableName.equals(hashedTableNameASide) ?
+ String hashedTableNameASide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel
+ .getASideStoredAt(), TABLE);
+ String hashedTableNameBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel
+ .getBSideStoredAt(), TABLE);
+ final String hashedReferenceTable = hashedTableName.equals(hashedTableNameASide) ?
hashedTableNameBSide :
hashedTableNameASide;
final String hashedRelId = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_ID, rel.getName(), COLUMN);
final String hashedRelFk = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_FK, associationEndpointName,
COLUMN);
- relColumns.add(Column.builder().name(hashedRelFk).dataType(VARCHAR511).postgresConstraints(new ArrayList<>(List.of(
+ relColumns.add(Column.builder().name(hashedRelFk).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of(
createForeignKeyConstraints(tableName, hashedTableName, hashedReferenceTable, relFk, hashedRelFk))))
.build());
- relColumns.add(Column.builder().name(hashedRelId).dataType(VARCHAR511).postgresConstraints(new ArrayList<>(List.of(
+ relColumns.add(Column.builder().name(hashedRelId).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of(
createUniqueConstraints(tableName, hashedTableName, relId, hashedRelId)))).build());
rel.getConsumerData().forEach(cd -> {
- final String cdColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_CD, cd
- .getName() + "_" + rel.getName(), COLUMN);
- relColumns.add(Column.builder().name(cdColumnName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue())
- .build());
+ final String columnNameWithoutPrefix = cd.getName() + "_" + rel.getName();
+ final String columnName = REL_CD + columnNameWithoutPrefix;
+ final String hashedColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(REL_CD,
+ columnNameWithoutPrefix, COLUMN);
+ relColumns.add(Column.builder().name(hashedColumnName).dataType(cd.getDataType()).defaultValue(cd
+ .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName,
+ hashedColumnName, cd.getIndexTypes())).build());
});
return relColumns;
}
private List<Column> createRelationshipColumnsForRelationTables(Relationship rel, String tableName,
String hashedTableName) {
-
- String hashedASideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideMOType(),
+ String hashedASideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getASideStoredAt(),
TABLE);
- String hashedBSideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideMOType(),
+ String hashedBSideMOType = hashInfoDataGenerator.generateHashAndRegisterTableRow(NO_PREFIX, rel.getBSideStoredAt(),
TABLE);
final String relASide = A_SIDE_PREFIX + rel.getASideMOType();
@@ -183,40 +184,55 @@
final String relBSide = B_SIDE_PREFIX + rel.getBSideMOType();
final String hashedRelBSide = hashInfoDataGenerator.generateHashAndRegisterTableRow(B_SIDE_PREFIX, rel
.getBSideMOType(), COLUMN);
- List<Column> relColumns = new ArrayList<>(Arrays.asList(Column.builder().name(ID).dataType(VARCHAR511)
+ List<Column> relColumns = new ArrayList<>(Arrays.asList(Column.builder().name(ID).dataType(TEXT)
.postgresConstraints(new ArrayList<>(List.of(createPrimaryKeyConstraints(tableName, hashedTableName, ID))))
- .build(), Column.builder().name(hashedRelASide).dataType(VARCHAR511).postgresConstraints(new ArrayList<>(
- List.of(createForeignKeyConstraints(tableName, hashedTableName, hashedASideMOType, relASide,
- hashedRelASide)))).build(), Column.builder().name(hashedRelBSide).dataType(VARCHAR511)
+ .build(), Column.builder().name(hashedRelASide).dataType(TEXT).postgresConstraints(new ArrayList<>(List.of(
+ createForeignKeyConstraints(tableName, hashedTableName, hashedASideMOType, relASide,
+ hashedRelASide)))).build(), Column.builder().name(hashedRelBSide).dataType(TEXT)
.postgresConstraints(new ArrayList<>(List.of(createForeignKeyConstraints(tableName,
hashedTableName, hashedBSideMOType, relBSide, hashedRelBSide)))).build()));
rel.getConsumerData().forEach(cd -> {
- final String columnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd.getName(),
- COLUMN);
- relColumns.add(Column.builder().name(columnName).dataType(cd.getDataType()).defaultValue(cd.getDefaultValue())
- .build());
+ final String columnName = CONSUMER_DATA + cd.getName();
+ final String hashedColumnName = hashInfoDataGenerator.generateHashAndRegisterTableRow(CONSUMER_DATA, cd
+ .getName(), COLUMN);
+ relColumns.add(Column.builder().name(hashedColumnName).dataType(cd.getDataType()).defaultValue(cd
+ .getDefaultValue()).postgresIndexList(getIndexesForColumn(tableName, hashedTableName, columnName,
+ hashedColumnName, cd.getIndexTypes())).build());
});
return relColumns;
}
private Collection<PostgresConstraint> getConstraintsForColumn(String tableName, String hashedTableName,
- Collection<Object> constraintsFromEModel, String attributeName, String hashedAttributeName) {
+ Collection<Object> constraintsFromModel, String attributeName, String hashedAttributeName) {
Collection<PostgresConstraint> postgresConstraintCollection = new ArrayList<>();
- if (constraintsFromEModel != null) {
- if (constraintsFromEModel.stream().anyMatch(PrimaryKeyConstraint.class::isInstance)) {
+ if (constraintsFromModel != null && !constraintsFromModel.isEmpty()) {
+ if (constraintsFromModel.stream().anyMatch(PrimaryKeyConstraint.class::isInstance)) {
if (attributeName.equals(ID)) {
postgresConstraintCollection.add(createPrimaryKeyConstraints(tableName, hashedTableName,
attributeName));
}
}
- // if (constraintsFromEModel.stream().anyMatch(<any-other-constraint>.class::isInstance)) {
+ // if (constraintsFromModel.stream().anyMatch(<any-other-constraint>.class::isInstance)) {
// postgresConstraintCollection.add(createUniqueConstraints(tableName, hashedTableName, attributeName,
- // hashedAttributeName));
+ // hashedAttributeName));
// }
}
return postgresConstraintCollection;
}
+ private List<PostgresIndex> getIndexesForColumn(String tableName, String hashedTableName, String attributeName,
+ String hashedAttributeName, List<IndexType> indexTypes) {
+ List<PostgresIndex> postgresIndexList = new ArrayList<>();
+ indexTypes.forEach(indexType -> {
+ //IndexName - IDX_<indexType>_<tableName>_<columnName>
+ final String hashedIndexName = hashInfoDataGenerator.generateHashAndRegisterTableRow(INDEX_PREFIX, String
+ .format("%s_%s_%s", indexType.name(), tableName, attributeName), INDEX);
+ postgresIndexList.add(PostgresIndex.builder().tableNameToAddIndexTo(hashedTableName).columnNameToAddIndexTo(
+ hashedAttributeName).indexName(hashedIndexName).indexType(indexType).build());
+ });
+ return postgresIndexList;
+ }
+
private PostgresConstraint createForeignKeyConstraints(String tableToAddForeignKeyTo,
String hashedTableToAddForeignKeyTo, String hashedReferenceTable, String columnName, String hashedColumnName) {
String constraintName = hashInfoDataGenerator.generateHashAndRegisterTableRow(FOREIGN_KEY,
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java
index 771baee..aaa5988 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/HashInfoDataGenerator.java
@@ -40,7 +40,7 @@
@Getter
@Slf4j
public class HashInfoDataGenerator {
-
+ private static final int POSTGRES_MAX_IDENTIFIER_LENGTH = 63;
private final Set<HashInfoEntity> hashInfoRowsList = new HashSet<>();
/**
@@ -56,7 +56,7 @@
*/
public String generateHashAndRegisterTableRow(String prefix, String name, String type) {
String hashedValue;
- if (prefix.length() + name.length() < 64) {
+ if (prefix.length() + name.length() <= POSTGRES_MAX_IDENTIFIER_LENGTH) {
hashInfoRowsList.add(HashInfoEntity.builder().name(prefix + name).hashedValue(prefix + name).type(type)
.build());
return prefix + name;
diff --git a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java
index 10eb426..34ad33e 100644
--- a/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java
+++ b/pgsql-schema-generator/src/main/java/org/oran/smo/teiv/pgsqlgenerator/schema/model/ModelSchemaGenerator.java
@@ -24,8 +24,11 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
+import org.oran.smo.teiv.pgsqlgenerator.HashInfoEntity;
import org.oran.smo.teiv.pgsqlgenerator.schema.BackwardCompatibilityChecker;
import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaParser;
import org.springframework.beans.factory.annotation.Value;
@@ -86,7 +89,11 @@
backwardCompatibilityChecker.checkForNBCChangesInModel(relFromBaselineSql, relationships);
}
StringBuilder tiesModelSql = new StringBuilder();
- tiesModelSql.append(prepareCopyStatement(hashInfoDataGenerator.getHashInfoRowsList().stream().toList()));
+
+ List<HashInfoEntity> hashInfoList = new ArrayList<>(hashInfoDataGenerator.getHashInfoRowsList().stream().toList());
+ hashInfoList.sort(Comparator.comparing(HashInfoEntity::getName));
+
+ tiesModelSql.append(prepareCopyStatement(hashInfoList));
tiesModelSql.append(prepareCopyStatement(modules));
tiesModelSql.append(prepareCopyStatement(entities));
tiesModelSql.append(prepareCopyStatement(relationships));
diff --git a/pgsql-schema-generator/src/main/resources/application.yaml b/pgsql-schema-generator/src/main/resources/application.yaml
index 1e3f11f..5d47560 100644
--- a/pgsql-schema-generator/src/main/resources/application.yaml
+++ b/pgsql-schema-generator/src/main/resources/application.yaml
@@ -32,6 +32,10 @@
baseline:
temp-baseline: target/01_init-oran-smo-teiv-model_baseline.sql
output: target/01_init-oran-smo-teiv-model.sql
+ consumer-data:
+ skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql
+ baseline:
+ output: target/02_init-oran-smo-teiv-consumer-data.sql
exclusions:
model-names: metadata, decorators
graphs:
diff --git a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql
index 9be0569..ab5963a 100644
--- a/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/main/resources/scripts/00_init-oran-smo-teiv-data.sql
@@ -23,6 +23,7 @@
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
GRANT USAGE ON SCHEMA topology to :pguser;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser;
diff --git a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql
index 9ea8054..6222f76 100644
--- a/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql
+++ b/pgsql-schema-generator/src/main/resources/scripts/01_init-oran-smo-teiv-model.sql
@@ -35,55 +35,47 @@
);
CREATE TABLE IF NOT EXISTS ties_model.hash_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "hashedValue" VARCHAR(511) NOT NULL,
+ "name" TEXT PRIMARY KEY,
+ "hashedValue" VARCHAR(63) NOT NULL,
"type" VARCHAR(511)
);
CREATE TABLE IF NOT EXISTS ties_model.module_reference (
- "name" VARCHAR(511) PRIMARY KEY,
- "namespace" VARCHAR(511),
- "domain" VARCHAR(511),
+ "name" TEXT PRIMARY KEY,
+ "namespace" TEXT,
+ "domain" TEXT,
"includedModules" jsonb DEFAULT '[]'::jsonb,
- "revision" VARCHAR(511) NOT NULL,
- "content" TEXT NOT NULL,
- "ownerAppId" VARCHAR(511) NOT NULL,
- "status" VARCHAR(127) NOT NULL
+ "revision" TEXT NOT NULL,
+ "content" TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS ties_model.entity_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511) NOT NULL,
+ "storedAt" TEXT PRIMARY KEY,
+ "name" TEXT NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS ties_model.relationship_info (
- "name" VARCHAR(511) PRIMARY KEY,
+ "name" TEXT NOT NULL,
"aSideAssociationName" TEXT NOT NULL,
"aSideMOType" TEXT NOT NULL,
+ "aSideModule" TEXT NOT NULL,
"aSideMinCardinality" BIGINT NOT NULL,
"aSideMaxCardinality" BIGINT NOT NULL,
"bSideAssociationName" TEXT NOT NULL,
"bSideMOType" TEXT NOT NULL,
+ "bSideModule" TEXT NOT NULL,
"bSideMinCardinality" BIGINT NOT NULL,
"bSideMaxCardinality" BIGINT NOT NULL,
"associationKind" TEXT NOT NULL,
"relationshipDataLocation" TEXT NOT NULL,
+ "storedAt" TEXT NOT NULL,
"connectSameEntity" BOOLEAN NOT NULL,
"moduleReferenceName" TEXT NOT NULL,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.decorators (
- "name" VARCHAR(511) PRIMARY KEY,
- "dataType" VARCHAR(511) NOT NULL,
- "moduleReferenceName" VARCHAR(511) NOT NULL,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.classifiers (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511) NOT NULL,
+ PRIMARY KEY ("name", "moduleReferenceName"),
+ FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE,
+ FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
diff --git a/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql
new file mode 100644
index 0000000..e393eb0
--- /dev/null
+++ b/pgsql-schema-generator/src/main/resources/scripts/02_init-oran-smo-teiv-consumer-data.sql
@@ -0,0 +1,53 @@
+--
+-- ============LICENSE_START=======================================================
+-- Copyright (C) 2024 Ericsson
+-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+-- ================================================================================
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- SPDX-License-Identifier: Apache-2.0
+-- ============LICENSE_END=========================================================
+--
+
+BEGIN;
+
+CREATE SCHEMA IF NOT EXISTS ties_consumer_data;
+ALTER SCHEMA ties_consumer_data OWNER TO :pguser;
+SET default_tablespace = '';
+SET default_table_access_method = heap;
+
+SET ROLE :'pguser';
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" (
+ "name" TEXT PRIMARY KEY,
+ "namespace" TEXT,
+ "revision" TEXT NOT NULL,
+ "content" TEXT NOT NULL,
+ "ownerAppId" VARCHAR(511) NOT NULL,
+ "status" VARCHAR(127) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" (
+ "name" TEXT PRIMARY KEY,
+ "dataType" VARCHAR(511) NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" (
+ "name" TEXT PRIMARY KEY,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+COMMIT;
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java
index fcd4dae..5895496 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/EndToEndTest.java
@@ -39,6 +39,9 @@
import org.oran.smo.teiv.pgsqlgenerator.schema.SchemaParser;
import lombok.extern.slf4j.Slf4j;
+import static org.oran.smo.teiv.pgsqlgenerator.Processor.storeRelatedModuleRefsFromIncludedModules;
+import static org.oran.smo.teiv.pgsqlgenerator.TestHelper.extractIndexName;
+
@Slf4j
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@@ -54,6 +57,10 @@
private String expectedModelSql;
@Value("${schema.model.output}")
private String actualModelSql;
+ @Value("${test-result.consumer-data}")
+ private String expectedConsumerDataSql;
+ @Value("${schema.consumer-data.output}")
+ private String actualConsumerDataSql;
@Value("${graphs.output}")
private String graphOutput;
@@ -66,11 +73,13 @@
processor.process();
File generatedDataSql = new File(actualDataSql);
File generatedModelSql = new File(actualModelSql);
+ File generatedConsumerDataSql = new File(actualConsumerDataSql);
File generatedGraphs = new File(graphOutput);
//then
Assertions.assertTrue(generatedDataSql.exists());
Assertions.assertTrue(generatedModelSql.exists());
+ Assertions.assertTrue(generatedConsumerDataSql.exists());
Assertions.assertTrue(generatedGraphs.exists() && generatedGraphs.isDirectory() && generatedGraphs
.listFiles().length > 0);
}
@@ -99,10 +108,10 @@
List<Column> columnsInExpected = expectedTable.getColumns();
List<Column> columnsInGenerated = generatedTable.getColumns();
- // Check if all columns for each table were added correctly
- Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size());
- List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated);
- List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected);
+ // Check if all columns for each table were added correctly
+ Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size());
+ List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated);
+ List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected);
// Check if generatedResult contains all columns for a table
Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult);
@@ -112,7 +121,7 @@
.findFirst().ifPresent(columnInGenerated -> {
if (columnInExpected.getName().equals("id")) {
- Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType());
+ Assertions.assertEquals("TEXT", columnInGenerated.getDataType());
Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints()));
}
@@ -151,6 +160,19 @@
});
});
}
+ // Check if generated index matches expected index.
+ if (!columnInExpected.getPostgresIndexList().isEmpty()) {
+ Assertions.assertEquals(columnInExpected.getPostgresIndexList().size(), columnInGenerated.getPostgresIndexList().size());
+ Assertions.assertEquals(extractIndexName(columnInExpected), extractIndexName(columnInGenerated));
+ columnInExpected.getPostgresIndexList().forEach(postgresIndexInExpected -> {
+ columnInGenerated.getPostgresIndexList().stream().filter(postgresIndexInGenerated ->
+ postgresIndexInGenerated.getIndexName().equals(postgresIndexInExpected.getIndexName())).findFirst().ifPresent(postgresIndexInGenerated -> {
+ Assertions.assertEquals(postgresIndexInExpected.getTableNameToAddIndexTo(), postgresIndexInGenerated.getTableNameToAddIndexTo());
+ Assertions.assertEquals(postgresIndexInExpected.getColumnNameToAddIndexTo(), postgresIndexInGenerated.getColumnNameToAddIndexTo());
+ Assertions.assertEquals(postgresIndexInExpected.getIndexType(), postgresIndexInGenerated.getIndexType());
+ });
+ });
+ }
});
});
});
@@ -202,18 +224,21 @@
@Test
void storeRelatedModuleRefsFromIncludedModulesTest() {
//spotless:off
- List<Module> mockModuleRefFromYangParser = List.of(
+ List<Module> mockModuleRefFromYangParser = new ArrayList<>();
+ mockModuleRefFromYangParser.add(
Module.builder().name("o-ran-smo-teiv-ran-equipment")
.namespace("urn:rdns:o-ran:smo:teiv:o-ran-smo-teiv-ran-equipment")
.domain("RAN_EQUIPMENT")
.includedModules(new ArrayList<>(List.of( "o-ran-smo-teiv-common-yang-types",
- "o-ran-smo-teiv-common-yang-extensions", "ietf-geo-location"))).build(),
+ "o-ran-smo-teiv-common-yang-extensions", "ietf-geo-location"))).build());
+ mockModuleRefFromYangParser.add(
Module.builder().name("o-ran-smo-teiv-ran-equipment-to-logical")
.namespace("urn:rdns:o-ran:smo:teiv:ericsson-topologyandinventory-ran-logical-to-equipment")
.domain("EQUIPMENT_TO_RAN_LOGICAL")
.includedModules(new ArrayList<>(List.of( "o-ran-smo-teiv-common-yang-types",
"o-ran-smo-teiv-common-yang-extensions", "o-ran-smo-teiv-ran-logical",
- "o-ran-smo-teiv-ran-equipment"))).build(),
+ "o-ran-smo-teiv-ran-equipment"))).build());
+ mockModuleRefFromYangParser.add(
Module.builder().name("o-ran-smo-teiv-ran-oam-to-cloud")
.namespace("urn:rdns:o-ran:smo:teiv:o-ran-smo-teiv-ran-oam-to-cloud")
.domain("RAN_OAM_TO_CLOUD")
@@ -254,7 +279,7 @@
);
//spotless:on
- List<Module> actualResult = Processor.storeRelatedModuleRefsFromIncludedModules(mockEntitiesFromModelSvc,
+ List<Module> actualResult = storeRelatedModuleRefsFromIncludedModules(mockEntitiesFromModelSvc,
mockModuleRefFromYangParser);
actualResult.forEach(actual -> {
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java
index f85353e..113ea24 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/TestHelper.java
@@ -31,8 +31,8 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -47,10 +47,18 @@
return tables.stream().map(Table::getName).sorted().toList();
}
+ public static List<String> extractColumnNames(List<Column> columns) {
+ return columns.stream().map(Column::getName).sorted().toList();
+ }
+
public static List<String> extractColumnNamesForATable(List<Column> columns) {
return columns.stream().map(Column::getName).sorted().toList();
}
+ public static List<String> extractIndexName(Column column) {
+ return column.getPostgresIndexList().stream().map(PostgresIndex::getIndexName).sorted().toList();
+ }
+
public static List<String> extractConstraintName(Collection<PostgresConstraint> postgresConstraints) {
return postgresConstraints.stream().map(PostgresConstraint::getConstraintName).map(String::toUpperCase).sorted()
.toList();
@@ -61,10 +69,10 @@
}
public static Map<String, List<Table>> identifiedModelChangeMapping() {
- Map<String, List<Table>> storeIdentifiedChangesToModels = new HashMap<>();
- storeIdentifiedChangesToModels.put("CREATE", new ArrayList<>());
- storeIdentifiedChangesToModels.put("ALTER", new ArrayList<>());
+ Map<String, List<Table>> storeIdentifiedChangesToModels = new LinkedHashMap<>();
storeIdentifiedChangesToModels.put("DEFAULT", new ArrayList<>());
+ storeIdentifiedChangesToModels.put("ALTER", new ArrayList<>());
+ storeIdentifiedChangesToModels.put("CREATE", new ArrayList<>());
return storeIdentifiedChangesToModels;
}
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java
index 138bf52..a053fae 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/YangParserTest.java
@@ -40,13 +40,13 @@
List<Module> moduleList = yangParser.returnAllModuleReferences();
- Assertions.assertEquals(5, moduleList.size());
+ Assertions.assertEquals(8, moduleList.size());
List<String> allModuleReferenceNames = moduleList.stream().map(Module::getName).sorted().toList();
- Assertions.assertEquals(allModuleReferenceNames, Stream.of("o-ran-smo-teiv-common-yang-extensions",
- "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment", "o-ran-smo-teiv-rel-equipment-ran",
- "o-ran-smo-teiv-ran").sorted().toList());
+ Assertions.assertEquals(allModuleReferenceNames, Stream.of("_3gpp-common-yang-types", "ietf-geo-location",
+ "o-ran-smo-teiv-common-yang-extensions", "o-ran-smo-teiv-common-yang-types", "o-ran-smo-teiv-equipment",
+ "o-ran-smo-teiv-rel-equipment-ran", "o-ran-smo-teiv-ran", "test-built-in-module").sorted().toList());
}
}
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java
index ce97ec6..f3867c0 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/BackwardCompatibilityCheckerTest.java
@@ -20,6 +20,8 @@
*/
package org.oran.smo.teiv.pgsqlgenerator.schema;
+import org.oran.smo.teiv.pgsqlgenerator.IndexType;
+import org.oran.smo.teiv.pgsqlgenerator.PostgresIndex;
import org.oran.smo.teiv.pgsqlgenerator.Table;
import org.oran.smo.teiv.pgsqlgenerator.Column;
import org.oran.smo.teiv.pgsqlgenerator.PrimaryKeyConstraint;
@@ -46,14 +48,14 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -67,20 +69,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -101,20 +103,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -124,19 +126,19 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -157,20 +159,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -180,20 +182,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId123").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -212,20 +214,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -235,7 +237,7 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
@@ -248,7 +250,7 @@
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -268,20 +270,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -291,18 +293,18 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").build(),
+ Column.builder().name("id").dataType("TEXT").build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -318,20 +320,20 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id_123")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("NRCellDU").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -344,6 +346,84 @@
}
+ @Test
+ void verifyExceptionThrownOnColumnIndexModifiedWhenGreenfieldDisabledTest() {
+ // Given baseline
+ List<Table> mockBaselineEntities = List.of(
+ Table.builder().name("Sector").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").build(),
+ Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
+ Column.builder().name("geo-location").dataType("geography").build())).build(),
+ Table.builder().name("Namespace").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build())).build(),
+ Table.builder().name("NRCellDU").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").postgresIndexList(List.of(
+ PostgresIndex.builder().tableNameToAddIndexTo("NRCellDU").columnNameToAddIndexTo("name")
+ .indexName("IDX_GIN_NRCellDU_name").indexType(IndexType.GIN).build())).build())).build());
+ // When - entities from Model svc with remove column index
+ mockModelServiceEntities = List.of(
+ Table.builder().name("Sector").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").build(),
+ Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
+ Column.builder().name("geo-location").dataType("geography").build())).build(),
+ Table.builder().name("Namespace").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build())).build(),
+ Table.builder().name("NRCellDU").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build())).build());
+ // Then
+ Assertions.assertEquals(
+ String.format("NBC change has been introduced: modified/removed index IDX_GIN_NRCellDU_name for column(NRCellDU.name) present in baseline, please make sure you've enabled green-field installation!!%nFor more info please refer to README"),
+ Assertions.assertThrowsExactly(PgSchemaGeneratorException.class, () -> nbcChecker.checkForNBCChangesInData(
+ mockBaselineEntities, mockModelServiceEntities)).getMessage());
+ // When - entities from Model svc with modified column index
+ mockModelServiceEntities = List.of(
+ Table.builder().name("Sector").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").build(),
+ Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
+ Column.builder().name("geo-location").dataType("geography").build())).build(),
+ Table.builder().name("Namespace").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build())).build(),
+ Table.builder().name("NRCellDU").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
+ PrimaryKeyConstraint.builder().tableName("NRCellDU").constraintName("PK_NRCellDU_id")
+ .columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").postgresIndexList(List.of(
+ PostgresIndex.builder().tableNameToAddIndexTo("NRCellDU").columnNameToAddIndexTo("name")
+ .indexName("IDX_GIN_NRCellDU_name").indexType(IndexType.GIN_TRGM_OPS_ON_LIST_AS_JSONB).build())).build())).build());
+ // Then
+ Assertions.assertEquals(
+ String.format("NBC change has been introduced: modified/removed index IDX_GIN_NRCellDU_name for column(NRCellDU.name) present in baseline, please make sure you've enabled green-field installation!!%nFor more info please refer to README"),
+ Assertions.assertThrowsExactly(PgSchemaGeneratorException.class, () -> nbcChecker.checkForNBCChangesInData(
+ mockBaselineEntities, mockModelServiceEntities)).getMessage());
+ }
+
//Data:Relationships
@Test
void verifyExceptionThrownOnModifiedRelationshipCardinalityWhenGreenfieldDisabledTest() {
@@ -353,18 +433,18 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("REL_FK_managed-Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(),
- Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("REL_FK_managed-Namespace").dataType("TEXT").postgresConstraints(List.of()).build(),
+ Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Sector")
.columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -375,19 +455,19 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("REL_FK_managed-by-Sector").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(),
- Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("REL_FK_managed-by-Sector").dataType("TEXT").postgresConstraints(List.of()).build(),
+ Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Namespace")
.columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build());
@@ -403,26 +483,26 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("SECTOR_MANAGES_NAMESPACE").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("SECTOR_MANAGES_NAMESPACE").constraintName("PK_SECTOR_MANAGES_NAMESPACE_id")
.columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("aSide_Sector").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("aSide_Sector").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("FK_SECTOR_MANAGES_NAMESPACE_aSide_Sector")
.tableName("SECTOR_MANAGES_NAMESPACE").columnToAddConstraintTo("aSide_Sector").build())).build(),
- Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("bSide_Namespace").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("FK_SECTOR_MANAGES_NAMESPACE_bSide_Namespace")
.tableName("SECTOR_MANAGES_NAMESPACE").columnToAddConstraintTo("bSide_Namespace").build())).build())).build());
@@ -439,19 +519,19 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("REL_FK_managed-by-Sector").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(),
- Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("REL_FK_managed-by-Sector").dataType("TEXT").postgresConstraints(List.of()).build(),
+ Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Namespace")
.columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build());
@@ -460,18 +540,18 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("REL_FK_managed-Namespace").dataType("VARCHAR(511)").postgresConstraints(List.of()).build(),
- Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("REL_FK_managed-Namespace").dataType("TEXT").postgresConstraints(List.of()).build(),
+ Column.builder().name("REL_ID_SECTOR_MANAGES_NAMESPACE").dataType("TEXT").postgresConstraints(List.of(
UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_SECTOR_MANAGES_NAMESPACE").tableName("Sector")
.columnToAddConstraintTo("REL_ID_SECTOR_MANAGES_NAMESPACE").build())).build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id")
.columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java
index 9fa8da9..5404182 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/SchemaParserTest.java
@@ -124,14 +124,14 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
// spotless:on
@@ -157,13 +157,13 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").defaultValue("hello-to-the-world").build())).build());
// spotless:on
@@ -204,13 +204,13 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build(),
Column.builder().name("namespaceId").dataType("DECIMAL").build())).build());
@@ -250,22 +250,22 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("REL_FK_serviced-sector").dataType("VARCHAR(511)")
+ Column.builder().name("REL_FK_serviced-sector").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_serviced-sector").tableName("Sector")
.referencedTable("Namespace").columnToAddConstraintTo("REL_FK_serviced-sector").build())).build(),
- Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)")
+ Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT")
.postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace")
.tableName("Sector").columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("REL_FK_serving-namespace").dataType("VARCHAR(511)")
+ Column.builder().name("REL_FK_serving-namespace").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_serving-namespace").tableName("Namespace")
.referencedTable("Sector").columnToAddConstraintTo("REL_FK_serving-namespace").build())).build())).build());
@@ -292,19 +292,19 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("REL_FK_serving-namespace").dataType("VARCHAR(511)")
+ Column.builder().name("REL_FK_serving-namespace").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_serving-namespace")
.tableName("Namespace").referencedTable("Sector").columnToAddConstraintTo("REL_FK_serving-namespace").build())).build(),
- Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)")
+ Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT")
.postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_serviced-sector_serving-namespace")
.tableName("Namespace").columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build());
@@ -331,19 +331,19 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("REL_FK_serviced-sector").dataType("VARCHAR(511)")
+ Column.builder().name("REL_FK_serviced-sector").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_serviced-sector").tableName("Sector").referencedTable("Namespace")
.columnToAddConstraintTo("REL_FK_serviced-sector").build())).build(),
- Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("VARCHAR(511)")
+ Column.builder().name("REL_ID_serviced-sector_serving-namespace").dataType("TEXT")
.postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_serviced-sector_serving-namespace").tableName("Sector")
.columnToAddConstraintTo("REL_ID_serviced-sector_serving-namespace").build())).build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
// spotless:on
@@ -369,23 +369,23 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build(),
Table.builder().name("REL_serviced-sector_serving-namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-namespace_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-namespace_id")
.tableName("REL_serviced-sector_serving-namespace").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
+ Column.builder().name("aSide_Sector").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-namespace_aSide_Sector")
.tableName("REL_serviced-sector_serving-namespace").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
- Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)")
+ Column.builder().name("bSide_Namespace").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-namespace_bSide_Namespace")
.tableName("REL_serviced-sector_serving-namespace").referencedTable("Namespace").columnToAddConstraintTo("bSide_Namespace").build())).build())).build());
// spotless:on
@@ -411,18 +411,18 @@
List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("REL_serviced-sector_serving-sector").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-sector_id")
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_REL_serviced-sector_serving-sector_id")
.tableName("REL_serviced-sector_serving-sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
+ Column.builder().name("aSide_Sector").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-sector_aSide_Sector")
.tableName("REL_serviced-sector_serving-sector").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
- Column.builder().name("bSide_Sector").dataType("VARCHAR(511)")
+ Column.builder().name("bSide_Sector").dataType("TEXT")
.postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_REL_serviced-sector_serving-sector_bSide_Sector")
.tableName("REL_serviced-sector_serving-sector").referencedTable("Sector").columnToAddConstraintTo("bSide_Sector").build())).build())).build());
// spotless:on
@@ -454,8 +454,8 @@
// Check if all columns for each table were added correctly
Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size());
- List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated);
- List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected);
+ List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated);
+ List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected);
// Check if generatedResult contains all columns for a table
Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult);
@@ -465,7 +465,7 @@
.findFirst().ifPresent(columnInGenerated -> {
if (columnInExpected.getName().equals("id")) {
- Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType());
+ Assertions.assertEquals("TEXT", columnInGenerated.getDataType());
Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints()));
}
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java
index 20c81bb..78b4add 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/GreenFieldInstallationTest.java
@@ -84,10 +84,10 @@
void verifyNoExceptionsThrownForNBCWhenGreenfieldEnabled() {
//Given
List<Table> mockModelServiceEntities = List.of(Table.builder().name("Sector").columns(List.of(Column.builder().name(
- "azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName(
- "PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name(
- "sectorId").dataType("jsonb").defaultValue("101").build(), Column.builder().name(
+ "azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT").postgresConstraints(
+ List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id")
+ .columnToAddConstraintTo("id").build())).build(), Column.builder().name("sectorId")
+ .dataType("jsonb").defaultValue("101").build(), Column.builder().name(
"geo-location").dataType("geography").build())).build());
// When
@@ -99,7 +99,7 @@
// When
List<Table> mockBaselineEntitiesColumnRenamed = List.of(Table.builder().name("Sector").columns(List.of(Column
- .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)")
+ .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT")
.postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName(
"PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name(
"sectorId123").dataType("jsonb").defaultValue("101").build(), Column.builder().name(
@@ -111,7 +111,7 @@
// When
List<Table> mockBaselineEntitiesColumnDeleted = List.of(Table.builder().name("Sector").columns(List.of(Column
- .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("VARCHAR(511)")
+ .builder().name("azimuth").dataType("DECIMAL").build(), Column.builder().name("id").dataType("TEXT")
.postgresConstraints(List.of(PrimaryKeyConstraint.builder().tableName("Sector").constraintName(
"PK_Source_id").columnToAddConstraintTo("id").build())).build(), Column.builder().name(
"geo-location").dataType("geography").build())).build());
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java
index b428154..16168a5 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/ModelComparatorTest.java
@@ -45,13 +45,13 @@
Table.builder().name("Sector").columns(
List.of(
Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build(),
Table.builder().name("Namespace").columns(
List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
//spotless:on
@@ -70,7 +70,7 @@
// Given baseline mock data
List<Table> baselineEntitiesTableMissing = List.of(Table.builder().name("Sector").columns(
List.of(Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build());
@@ -78,7 +78,7 @@
// Correct result of difference below
Map<String, List<Table>> correctMappedDifferences = TestHelper.identifiedModelChangeMapping();
correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns(
- List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
@@ -102,7 +102,7 @@
// Given baseline mock data
List<Table> baselineEntitiesWIthColumnAndTableMissing = List.of(Table.builder().name("Sector").columns(
- List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").defaultValue("101").build(),
Column.builder().name("geo-location").dataType("geography").build())).build());
@@ -110,7 +110,7 @@
// Correct result of difference below
Map<String, List<Table>> correctMappedDifferences = TestHelper.identifiedModelChangeMapping();
correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns(
- List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
correctMappedDifferences.get("ALTER")
@@ -136,7 +136,7 @@
// Given baseline mock data
List<Table> baselineEntitiesWIthColumnAndTableAndDefaultValueMissing = List.of(Table.builder().name("Sector").columns(
- List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Sector").constraintName("PK_Source_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("sectorId").dataType("jsonb").build(),
Column.builder().name("geo-location").dataType("geography").build())).build());
@@ -144,7 +144,7 @@
// Correct result of difference below
Map<String, List<Table>> correctMappedDifferences = TestHelper.identifiedModelChangeMapping();
correctMappedDifferences.get("CREATE").add(Table.builder().name("Namespace").columns(
- List.of(Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(
+ List.of(Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(
PrimaryKeyConstraint.builder().tableName("Namespace").constraintName("PK_Namespace_id").columnToAddConstraintTo("id").build())).build(),
Column.builder().name("name").dataType("TEXT").build())).build());
correctMappedDifferences.get("ALTER")
diff --git a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java
index 7e9041d..fc33adc 100644
--- a/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java
+++ b/pgsql-schema-generator/src/test/java/org/oran/smo/teiv/pgsqlgenerator/schema/data/TableBuilderTest.java
@@ -20,10 +20,6 @@
*/
package org.oran.smo.teiv.pgsqlgenerator.schema.data;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
import org.junit.jupiter.api.Assertions;
@@ -65,131 +61,172 @@
//spotless:off
List<Entity> entities = List.of(
- Entity.builder().entityName("Sector").attributes(
+ Entity.builder().entityName("EntityA").storedAt("module-a_EntityA").attributes(
List.of(
Attribute.builder().name("azimuth").dataType("DECIMAL").build(),
- Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
Attribute.builder().name("geo-location").dataType("geography").build(),
Attribute.builder().name("sectorId").dataType("jsonb").build()))
- .moduleReferenceName("").build(),
+ .moduleReferenceName("")
+ .build(),
- Entity.builder().entityName("Namespace").attributes(
+ Entity.builder().entityName("EntityB").storedAt("module-b_EntityB").attributes(
List.of(
- Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
+ Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
.tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
Attribute.builder().name("name").dataType("TEXT").build()))
- .moduleReferenceName("").build());
+ .build());
List<List<Relationship>> relationships = List.of(
- List.of(Relationship.builder().name("oneToOne")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(1)
- .bSideAssociationName("used-by-Namespace")
- .bSideMOType("Namespace")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(1)
- .relationshipDataLocation("A_SIDE")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(false)
- .moduleReferenceName("").build()),
- List.of(Relationship.builder().name("oneToMany")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(1)
- .bSideAssociationName("used-by-Namespace")
- .bSideMOType("Namespace")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(100)
- .relationshipDataLocation("B_SIDE")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(false)
- .moduleReferenceName("").build()),
- List.of(Relationship.builder().name("manyToOne")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(100)
- .bSideAssociationName("used-by-Namespace")
- .bSideMOType("Namespace")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(1)
- .relationshipDataLocation("A_SIDE")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(false)
- .moduleReferenceName("").build()),
- List.of(Relationship.builder().name("manyToMany")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(100)
- .bSideAssociationName("used-by-Namespace")
- .bSideMOType("Namespace")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(100)
- .relationshipDataLocation("RELATION")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(false)
- .moduleReferenceName("").build()),
- // Relationship connecting same entity 1:1
- List.of(Relationship.builder().name("relationshipConnectingSameEntity")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(1)
- .bSideAssociationName("used-by-Sector")
- .bSideMOType("Sector")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(1)
- .relationshipDataLocation("RELATION")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(true)
- .moduleReferenceName("").build()),
- // Relationship connecting same entity 1:N
- List.of(Relationship.builder().name("relationshipConnectingSameEntity")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(1)
- .bSideAssociationName("used-by-Sector")
- .bSideMOType("Sector")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(100)
- .relationshipDataLocation("RELATION")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(true)
- .moduleReferenceName("").build()),
- // Relationship connecting same entity N:1
- List.of(Relationship.builder().name("relationshipConnectingSameEntity")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(100)
- .bSideAssociationName("used-by-Sector")
- .bSideMOType("Sector")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(1)
- .relationshipDataLocation("RELATION")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(true)
- .moduleReferenceName("").build()),
- // Relationship connecting same entity N:M
- List.of(Relationship.builder().name("relationshipConnectingSameEntity")
- .aSideAssociationName("used-Sector")
- .aSideMOType("Sector")
- .aSideMinCardinality(0)
- .aSideMaxCardinality(100)
- .bSideAssociationName("used-by-Sector")
- .bSideMOType("Sector")
- .bSideMinCardinality(0)
- .bSideMaxCardinality(100)
- .relationshipDataLocation("RELATION")
- .associationKind("BI_DIRECTIONAL")
- .connectSameEntity(true)
- .moduleReferenceName("").build()));
+ List.of(Relationship.builder().name("oneToOne")
+ .aSideAssociationName("used-EntityB")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(1)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityB")
+ .bSideModule("module-b")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(1)
+ .relationshipDataLocation("A_SIDE")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_EntityA")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-b_EntityB")
+ .moduleReferenceName("").build()),
+ List.of(Relationship.builder().name("oneToMany")
+ .aSideAssociationName("used-EntityB")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(1)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityB")
+ .bSideModule("module-b")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(100)
+ .relationshipDataLocation("A_SIDE")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-b_EntityB")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-b_EntityB")
+ .moduleReferenceName("").build()),
+ List.of(Relationship.builder().name("ManyToOne")
+ .aSideAssociationName("used-EntityB")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(100)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityB")
+ .bSideModule("module-b")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(1)
+ .relationshipDataLocation("A_SIDE")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_EntityA")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-b_EntityB")
+ .moduleReferenceName("").build()),
+ List.of(Relationship.builder().name("ManyToMany")
+ .aSideAssociationName("used-EntityB")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(100)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityB")
+ .bSideModule("module-b")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(100)
+ .relationshipDataLocation("RELATION")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a-b_ManyToMany")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-b_EntityB")
+ .moduleReferenceName("module-a-b").build()),
+ // Relationship connecting same entity 1:1
+ List.of(Relationship.builder().name("relationshipConnectingSameEntity")
+ .aSideAssociationName("used-EntityA")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(1)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityA")
+ .bSideModule("module-a")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(1)
+ .relationshipDataLocation("RELATION")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_relationshipConnectingSameEntity")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-a_EntityA")
+ .moduleReferenceName("module-a").build()),
+ // Relationship connecting same entity 1:N
+ List.of(Relationship.builder().name("relationshipConnectingSameEntity")
+ .aSideAssociationName("used-EntityA")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(1)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityA")
+ .bSideModule("module-a")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(100)
+ .relationshipDataLocation("RELATION")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_relationshipConnectingSameEntity")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-a_EntityA")
+ .moduleReferenceName("module-a").build()),
+ // Relationship connecting same entity N:1
+ List.of(Relationship.builder().name("relationshipConnectingSameEntity")
+ .aSideAssociationName("used-EntityA")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(100)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityA")
+ .bSideModule("module-a")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(1)
+ .relationshipDataLocation("RELATION")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_relationshipConnectingSameEntity")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-a_EntityA")
+ .moduleReferenceName("module-a").build()),
+ // Relationship connecting same entity N:M
+ List.of(Relationship.builder().name("relationshipConnectingSameEntity")
+ .aSideAssociationName("used-EntityA")
+ .aSideMOType("EntityA")
+ .aSideModule("module-a")
+ .aSideMinCardinality(0)
+ .aSideMaxCardinality(100)
+ .bSideAssociationName("used-by-EntityA")
+ .bSideMOType("EntityA")
+ .bSideModule("module-a")
+ .bSideMinCardinality(0)
+ .bSideMaxCardinality(100)
+ .relationshipDataLocation("RELATION")
+ .associationKind("BI_DIRECTIONAL")
+ .connectSameEntity(false)
+ .storedAt("module-a_relationshipConnectingSameEntity")
+ .aSideStoredAt("module-a_EntityA")
+ .bSideStoredAt("module-a_EntityA")
+ .moduleReferenceName("module-a").build()));
//spotless:on
@Test
@@ -198,34 +235,34 @@
//spotless:off
// Given
- List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
- List.of(
- Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
- .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("sectorId").dataType("jsonb").build(),
- Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector")
- .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(),
- Column.builder().name("REL_ID_oneToOne").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_oneToOne").tableName("Sector")
- .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(),
- Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(),
+ List<Table> expectedResult = List.of(Table.builder().name("module-a_EntityA").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id")
+ .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("sectorId").dataType("jsonb").build(),
+ Column.builder().name("geo-location").dataType("geography").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name("REL_FK_used-EntityB").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA")
+ .referencedTable("module-b_EntityB").columnToAddConstraintTo("REL_FK_used-EntityB").build())).build(),
+ Column.builder().name("REL_ID_oneToOne").dataType("TEXT")
+ .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_ONETOONE").tableName("module-a_EntityA")
+ .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(),
+ Column.builder().name("REL_CD_sourceIds_oneToOne").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(),
Column.builder().name(String.format("REL_CD_%s_oneToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
Column.builder().name(String.format("REL_CD_%s_oneToOne", DECORATORS)).dataType(JSONB).defaultValue("{}").build())).build(),
- Table.builder().name("Namespace").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
- .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
+ Table.builder().name("module-b_EntityB").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id")
+ .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
//spotless:on
@@ -242,34 +279,34 @@
//spotless:off
// Given
- List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
- List.of(
- Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
- .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("sectorId").dataType("jsonb").build(),
- Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
+ List<Table> expectedResult = List.of(Table.builder().name("module-a_EntityA").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id")
+ .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("sectorId").dataType("jsonb").build(),
+ Column.builder().name("geo-location").dataType("geography").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
- Table.builder().name("Namespace").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
- .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name("REL_FK_used-by-Namespace").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Namespace_REL_FK_used-by-Namespace")
- .tableName("Namespace").referencedTable("Sector").columnToAddConstraintTo("REL_FK_used-by-Namespace").build())).build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(),
- Column.builder().name("REL_ID_oneToMany").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Namespace_REL_ID_oneToMany").tableName("Namespace")
- .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(),
- Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
+ Table.builder().name("module-b_EntityB").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id")
+ .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name("REL_FK_used-by-EntityA").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-b_EntityB_REL_FK_used-by-EntityA")
+ .tableName("module-b_EntityB").referencedTable("module-a_EntityA").columnToAddConstraintTo("REL_FK_used-by-EntityA").build())).build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(),
+ Column.builder().name("REL_ID_oneToMany").dataType("TEXT")
+ .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_module-b_EntityB_REL_ID_oneToMany").tableName("module-b_EntityB")
+ .columnToAddConstraintTo("REL_ID_oneToMany").build())).build(),
+ Column.builder().name("REL_CD_sourceIds_oneToMany").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("REL_CD_%s_oneToMany", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("REL_CD_%s_oneToMany", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
//spotless:on
// When
@@ -286,32 +323,33 @@
//spotless:off
// Given
- List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
- List.of(
- Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
- .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("sectorId").dataType("jsonb").build(),
- Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build(),
- Column.builder().name("REL_FK_used-Sector").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_Sector_REL_FK_used-Sector").tableName("Sector")
- .referencedTable("Namespace").columnToAddConstraintTo("REL_FK_used-sector").build())).build(),
- Column.builder().name("REL_ID_manyToOne").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_Sector_REL_ID_manyToOne").tableName("Sector")
- .columnToAddConstraintTo("REL_ID_oneToOne").build())).build(),
- Column.builder().name("REL_CD_sourceIds_manyToOne").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("REL_CD_%s_manyToOne", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("REL_CD_%s_manyToOne", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
+ List<Table> expectedResult = List.of(Table.builder().name("module-a_EntityA").columns(
- Table.builder().name("Namespace").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
- .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id")
+ .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("sectorId").dataType("jsonb").build(),
+ Column.builder().name("geo-location").dataType("geography").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name("REL_FK_used-EntityB").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_MODULE-A_ENTITYA_REL_FK_USED-ENTITYB").tableName("module-a_EntityA")
+ .referencedTable("module-b_EntityB").columnToAddConstraintTo("REL_FK_used-EntityB").build())).build(),
+ Column.builder().name("REL_ID_ManyToOne").dataType("TEXT")
+ .postgresConstraints(List.of(UniqueConstraint.builder().constraintName("UNIQUE_MODULE-A_ENTITYA_REL_ID_MANYTOONE").tableName("module-a_EntityA")
+ .columnToAddConstraintTo("REL_ID_ManyToOne").build())).build(),
+ Column.builder().name("REL_CD_sourceIds_ManyToOne").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType(JSONB).defaultValue("{}").build(),
+ Column.builder().name(String.format("REL_CD_%s_ManyToOne", CLASSIFIERS)).dataType(JSONB).defaultValue("[]").build(),
+ Column.builder().name(String.format("REL_CD_%s_ManyToOne", DECORATORS)).dataType(JSONB).defaultValue("{}").build())).build(),
+
+ Table.builder().name("module-b_EntityB").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id")
+ .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
//spotless:on
@@ -328,37 +366,37 @@
void checkManyToManyRelationshipMappingTest() {
//spotless:off
// Given
- List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
- List.of(
- Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
- .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("sectorId").dataType("jsonb").build(),
- Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ List<Table> expectedResult = List.of(Table.builder().name("module-a_EntityA").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id")
+ .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("sectorId").dataType("jsonb").build(),
+ Column.builder().name("geo-location").dataType("geography").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
- Table.builder().name("Namespace").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Namespace_id")
- .tableName("Namespace").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("name").dataType("TEXT").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Table.builder().name("module-b_EntityB").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-b_EntityB_id")
+ .tableName("module-b_EntityB").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("name").dataType("TEXT").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
- Table.builder().name("manyToMany").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_manyToMany_id")
- .tableName("manyToMany").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_aSide_Sector")
- .tableName("manyToMany").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
- Column.builder().name("bSide_Namespace").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_manyToMany_bSide_Namespace")
- .tableName("manyToMany").referencedTable("Namespace").columnToAddConstraintTo("bSide_Namespace").build())).build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Table.builder().name("module-a-b_ManyToMany").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a-b_ManyToMany_id")
+ .tableName("module-a-b_ManyToMany").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("aSide_EntityA").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a-b_ManyToMany_aSide_EntityA")
+ .tableName("module-a-b_ManyToMany").referencedTable("module-a_EntityA").columnToAddConstraintTo("aSide_EntityA").build())).build(),
+ Column.builder().name("bSide_EntityB").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a-b_manyToMany_bSide_EntityB")
+ .tableName("module-a-b_ManyToMany").referencedTable("module-b_EntityB").columnToAddConstraintTo("bSide_EntityB").build())).build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
//spotless:on
@@ -375,40 +413,42 @@
//spotless:off
List<Entity> sameEntities = List.of(
- Entity.builder().entityName("Sector").attributes(
- List.of(Attribute.builder().name("azimuth").dataType("DECIMAL").build(),
- Attribute.builder().name("id").dataType("VARCHAR(511)").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
+ Entity.builder().entityName("EntityA").storedAt("module-a_EntityA").attributes(
+ List.of(
+ Attribute.builder().name("azimuth").dataType("DECIMAL").build(),
+ Attribute.builder().name("id").dataType("TEXT").constraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
.tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Attribute.builder().name("sectorId").dataType("jsonb").build(),
- Attribute.builder().name("geo-location").dataType("geography").build()))
- .moduleReferenceName("").build());
+ Attribute.builder().name("geo-location").dataType("geography").build(),
+ Attribute.builder().name("sectorId").dataType("jsonb").build()))
+ .moduleReferenceName("")
+ .build());
// Given
- List<Table> expectedResult = List.of(Table.builder().name("Sector").columns(
- List.of(
- Column.builder().name("azimuth").dataType("DECIMAL").build(),
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_Sector_id")
- .tableName("Sector").columnToAddConstraintTo("id").build())).build(),
- Column.builder().name("sectorId").dataType("jsonb").build(),
- Column.builder().name("geo-location").dataType("geography").build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
+ List<Table> expectedResult = List.of(Table.builder().name("module-a_EntityA").columns(
+ List.of(
+ Column.builder().name("azimuth").dataType("DECIMAL").build(),
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder().constraintName("PK_module-a_EntityA_id")
+ .tableName("module-a_EntityA").columnToAddConstraintTo("id").build())).build(),
+ Column.builder().name("sectorId").dataType("jsonb").build(),
+ Column.builder().name("geo-location").dataType("geography").build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build(),
- Table.builder().name("relationshipConnectingSameEntity").columns(
- List.of(
- Column.builder().name("id").dataType("VARCHAR(511)").postgresConstraints(List.of(PrimaryKeyConstraint.builder()
- .constraintName("PK_relationshipConnectingSameEntity_id").tableName("relationshipConnectingSameEntity").columnToAddConstraintTo("id")
+ Table.builder().name("module-a_relationshipConnectingSameEntity").columns(
+ List.of(
+ Column.builder().name("id").dataType("TEXT").postgresConstraints(List.of(PrimaryKeyConstraint.builder()
+ .constraintName("PK_module-a_relationshipConnectingSameEntity_id").tableName("module-a_relationshipConnectingSameEntity").columnToAddConstraintTo("id")
.build())).build(),
- Column.builder().name("aSide_Sector").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_aSide_Sector")
- .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("aSide_Sector").build())).build(),
- Column.builder().name("bSide_Sector").dataType("VARCHAR(511)")
- .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_relationshipConnectingSameEntity_bSide_Sector")
- .tableName("relationshipConnectingSameEntity").referencedTable("Sector").columnToAddConstraintTo("bSide_Sector").build())).build(),
- Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
- Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
+ Column.builder().name("aSide_EntityA").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a_relationshipConnectingSameEntity_aSide_EntityA")
+ .tableName("module-a_relationshipConnectingSameEntity").referencedTable("module-a_EntityA").columnToAddConstraintTo("aSide_EntityA").build())).build(),
+ Column.builder().name("bSide_EntityA").dataType("TEXT")
+ .postgresConstraints(List.of(ForeignKeyConstraint.builder().constraintName("FK_module-a_relationshipConnectingSameEntity_bSide_EntityA")
+ .tableName("module-a_relationshipConnectingSameEntity").referencedTable("module-a_EntityA").columnToAddConstraintTo("bSide_EntityA").build())).build(),
+ Column.builder().name("CD_sourceIds").dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", CLASSIFIERS)).dataType("jsonb").defaultValue("[]").build(),
+ Column.builder().name(String.format("CD_%s", DECORATORS)).dataType("jsonb").defaultValue("{}").build())).build());
//spotless:on
// When
@@ -450,8 +490,8 @@
// Check if all columns for each table were added correctly
Assertions.assertEquals(columnsInExpected.size(), columnsInGenerated.size());
- List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNamesForATable(columnsInGenerated);
- List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNamesForATable(columnsInExpected);
+ List<String> allColumnNamesForATableInGeneratedResult = TestHelper.extractColumnNames(columnsInGenerated);
+ List<String> allColumnNamesForATableInExpectedResult = TestHelper.extractColumnNames(columnsInExpected);
// Check if generatedResult contains all columns for a table
Assertions.assertEquals(allColumnNamesForATableInExpectedResult, allColumnNamesForATableInGeneratedResult);
@@ -461,7 +501,7 @@
.findFirst().ifPresent(columnInGenerated -> {
if (columnInExpected.getName().equals("id")) {
- Assertions.assertEquals("VARCHAR(511)", columnInGenerated.getDataType());
+ Assertions.assertEquals("TEXT", columnInGenerated.getDataType());
Assertions.assertTrue(TestHelper.checkIfColumnIsPrimaryKey(columnInGenerated.getPostgresConstraints()));
}
@@ -487,10 +527,10 @@
.ifPresent(constraint1 -> {
// Check table name where constraint is to be added
- Assertions.assertEquals(constraint.getTableToAddConstraintTo(), constraint.getTableToAddConstraintTo());
+ Assertions.assertEquals(constraint.getTableToAddConstraintTo(), constraint1.getTableToAddConstraintTo());
// Check column where constraint is to be added
- Assertions.assertEquals(constraint.getColumnToAddConstraintTo(), constraint.getColumnToAddConstraintTo());
+ Assertions.assertEquals(constraint.getColumnToAddConstraintTo(), constraint1.getColumnToAddConstraintTo());
if (constraint instanceof ForeignKeyConstraint expectedFk) {
ForeignKeyConstraint actualFK = (ForeignKeyConstraint) constraint1;
@@ -506,16 +546,4 @@
});
//spotless:on
}
-
- Collection<Object> addEModelPrimaryKeyConstraint() {
- Collection<Object> eModelPrimaryKeyConstraint = new ArrayList<>();
- try {
- Constructor<PrimaryKeyConstraint> constructor = PrimaryKeyConstraint.class.getDeclaredConstructor();
- eModelPrimaryKeyConstraint.add(constructor.newInstance());
- } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
- log.error("Failure in tests --> Error while adding primary key constraint: " + e.getMessage());
- }
- return eModelPrimaryKeyConstraint;
- }
-
}
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql
index 89da1ee..b952ba2 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/entities/mock_00_init-oran-smo-teiv-data.sql
@@ -53,14 +53,14 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography"
);
CREATE TABLE IF NOT EXISTS ties_data."Namespace" (
- "id" VARCHAR(511),
+ "id" TEXT,
"name" TEXT
);
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql
index 91e2606..4150f94 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToMany/mock_00_init-oran-smo-teiv-data.sql
@@ -53,21 +53,21 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography"
);
CREATE TABLE IF NOT EXISTS ties_data."Namespace" (
- "id" VARCHAR(511),
+ "id" TEXT,
"name" TEXT
);
CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-namespace" (
- "id" VARCHAR(511),
- "aSide_Sector" VARCHAR(511),
- "bSide_Namespace" VARCHAR(511)
+ "id" TEXT,
+ "aSide_Sector" TEXT,
+ "bSide_Namespace" TEXT
);
SELECT ties_data.create_constraint_if_not_exists(
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql
index 6cae7ca..4be3ac9 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/manyToOne/mock_00_init-oran-smo-teiv-data.sql
@@ -53,16 +53,16 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography",
- "REL_FK_serviced-sector" VARCHAR(511),
- "REL_ID_serviced-sector_serving-namespace" VARCHAR(511)
+ "REL_FK_serviced-sector" TEXT,
+ "REL_ID_serviced-sector_serving-namespace" TEXT
);
CREATE TABLE IF NOT EXISTS ties_data."Namespace" (
- "id" VARCHAR(511),
+ "id" TEXT,
"name" TEXT
);
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql
index 34c5019..cf40e8c 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToMany/mock_00_init-oran-smo-teiv-data.sql
@@ -53,17 +53,17 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography"
);
CREATE TABLE IF NOT EXISTS ties_data."Namespace" (
- "id" VARCHAR(511),
+ "id" TEXT,
"name" TEXT,
- "REL_FK_serving-namespace" VARCHAR(511),
- "REL_ID_serviced-sector_serving-namespace" VARCHAR(511)
+ "REL_FK_serving-namespace" TEXT,
+ "REL_ID_serviced-sector_serving-namespace" TEXT
);
SELECT ties_data.create_constraint_if_not_exists(
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql
index c7057bc..6f1aea5 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/oneToOne/mock_00_init-oran-smo-teiv-data.sql
@@ -53,18 +53,18 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography",
- "REL_FK_serviced-sector" VARCHAR(511),
- "REL_ID_serviced-sector_serving-namespace" VARCHAR(511)
+ "REL_FK_serviced-sector" TEXT,
+ "REL_ID_serviced-sector_serving-namespace" TEXT
);
CREATE TABLE IF NOT EXISTS ties_data."Namespace" (
- "id" VARCHAR(511),
+ "id" TEXT,
"name" TEXT,
- "REL_FK_serving-namespace" VARCHAR(511)
+ "REL_FK_serving-namespace" TEXT
);
SELECT ties_data.create_constraint_if_not_exists(
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql
index 1bd776d..90c8237 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/data/relationships/sameEntities/mock_00_init-oran-smo-teiv-data.sql
@@ -53,16 +53,16 @@
INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
CREATE TABLE IF NOT EXISTS ties_data."Sector" (
- "id" VARCHAR(511),
+ "id" TEXT,
"azimuth" DECIMAL,
"sectorId" jsonb,
"geo-location" "geography"
);
CREATE TABLE IF NOT EXISTS ties_data."REL_serviced-sector_serving-sector" (
- "id" VARCHAR(511),
- "aSide_Sector" VARCHAR(511),
- "bSide_Sector" VARCHAR(511)
+ "id" TEXT,
+ "aSide_Sector" TEXT,
+ "bSide_Sector" TEXT
);
SELECT ties_data.create_constraint_if_not_exists(
diff --git a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql
index 6c71cc4..1f554a0 100644
--- a/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql
+++ b/pgsql-schema-generator/src/test/resources/SchemaParserTest/model/mock_01_init-oran-smo-teiv-model.sql
@@ -46,44 +46,34 @@
"domain" VARCHAR(511),
"includedModules" jsonb,
"revision" VARCHAR(511),
- "content" TEXT,
- "ownerAppId" VARCHAR(511),
- "status" VARCHAR(127)
+ "content" TEXT
);
CREATE TABLE IF NOT EXISTS ties_model.entity_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511),
+ "storedAt" VARCHAR(511) PRIMARY KEY,
+ "name" VARCHAR(511) NOT NULL,
+ "moduleReferenceName" VARCHAR(511) NOT NULL,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS ties_model.relationship_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "aSideAssociationName" TEXT,
- "aSideMOType" TEXT,
- "aSideMinCardinality" BIGINT,
- "aSideMaxCardinality" BIGINT,
- "bSideAssociationName" TEXT,
- "bSideMOType" TEXT,
- "bSideMinCardinality" BIGINT,
- "bSideMaxCardinality" BIGINT,
- "associationKind" TEXT,
- "relationshipDataLocation" TEXT,
- "connectSameEntity" BOOLEAN,
- "moduleReferenceName" TEXT,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.decorators (
- "name" VARCHAR(511) PRIMARY KEY,
- "dataType" VARCHAR(511),
- "moduleReferenceName" VARCHAR(511),
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.classifiers (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511),
+ "name" VARCHAR(511) NOT NULL,
+ "aSideAssociationName" TEXT NOT NULL,
+ "aSideMOType" TEXT NOT NULL,
+ "aSideModule" TEXT NOT NULL,
+ "aSideMinCardinality" BIGINT NOT NULL,
+ "aSideMaxCardinality" BIGINT NOT NULL,
+ "bSideAssociationName" TEXT NOT NULL,
+ "bSideMOType" TEXT NOT NULL,
+ "bSideModule" TEXT NOT NULL,
+ "bSideMinCardinality" BIGINT NOT NULL,
+ "bSideMaxCardinality" BIGINT NOT NULL,
+ "associationKind" TEXT NOT NULL,
+ "relationshipDataLocation" TEXT NOT NULL,
+ "connectSameEntity" BOOLEAN NOT NULL,
+ "storedAt" VARCHAR(511) NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
+ PRIMARY KEY ("name", "moduleReferenceName"),
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
@@ -93,15 +83,15 @@
COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin;
\.
-COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin;
+COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin;
\.
-COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin;
+COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin;
\.
-COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin;
-ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 100 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran
-LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier 0 1 used-by-lteSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran
+COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin;
+ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 100 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran
+LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran:LTESectorCarrier o-ran-smo-teiv-ran
\.
;
diff --git a/pgsql-schema-generator/src/test/resources/application.yaml b/pgsql-schema-generator/src/test/resources/application.yaml
index 82829f7..8ef6bda 100644
--- a/pgsql-schema-generator/src/test/resources/application.yaml
+++ b/pgsql-schema-generator/src/test/resources/application.yaml
@@ -32,9 +32,14 @@
baseline: src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql
temp-baseline: target/test-classes/01_init-oran-smo-teiv-model_baseline.sql
output: target/test-classes/TEST_01_init-oran-smo-teiv-model.sql
+ consumer-data:
+ skeleton: scripts/02_init-oran-smo-teiv-consumer-data.sql
+ baseline: src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql
+ output: target/test-classes/TEST_02_init-oran-smo-teiv-consumer-data.sql
test-result:
data: src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql
model: src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql
+ consumer-data: src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql
exclusions:
model-names: metadata, decorators
graphs:
diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql
index b356a1f..109f6e7 100644
--- a/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/baseline-schema/00_init-oran-smo-teiv-data.sql
@@ -23,6 +23,7 @@
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
GRANT USAGE ON SCHEMA topology to :pguser;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser;
@@ -51,90 +52,121 @@
-- Update data schema exec status
INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success');
---missing CD_sourceIds column and its default value
-CREATE TABLE IF NOT EXISTS ties_data."AntennaModule" (
- "id" VARCHAR(511),
+--missing consumer data columns, their default values and index
+--missing index for antennaBeamWidth
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" (
+ "id" TEXT,
"positionWithinSector" TEXT,
- "electricalAntennaTilt" BIGINT,
- "mechanicalAntennaBearing" BIGINT,
+ "electricalAntennaTilt" INTEGER,
+ "mechanicalAntennaBearing" INTEGER,
"antennaBeamWidth" jsonb,
- "mechanicalAntennaTilt" BIGINT,
+ "mechanicalAntennaTilt" INTEGER,
"antennaModelNumber" TEXT,
- "totalTilt" BIGINT,
+ "totalTilt" INTEGER,
"geo-location" geography
);
SELECT ties_data.create_constraint_if_not_exists(
- 'AntennaModule',
- 'PK_AntennaModule_id',
- 'ALTER TABLE ties_data."AntennaModule" ADD CONSTRAINT "PK_AntennaModule_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-equipment_AntennaModule',
+ 'PK_o-ran-smo-teiv-equipment_AntennaModule_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");'
);
---missing eNodeBPlmnId column
-CREATE TABLE IF NOT EXISTS ties_data."ENodeBFunction" (
- "id" VARCHAR(511),
- "eNBId" BIGINT,
+--missing eNodeBPlmnId, classifiers and decorator columns
+--missing default value for sourceIds column
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (
+ "id" TEXT,
+ "eNBId" INTEGER,
"CD_sourceIds" jsonb
);
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11';
-
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11';
SELECT ties_data.create_constraint_if_not_exists(
- 'ENodeBFunction',
- 'PK_ENodeBFunction_id',
- 'ALTER TABLE ties_data."ENodeBFunction" ADD CONSTRAINT "PK_ENodeBFunction_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");'
);
---missing "ANTENNACAPABILITY_USED_BY_LTESECTORCARRIER" relationship
-CREATE TABLE IF NOT EXISTS ties_data."AntennaCapability" (
- "id" VARCHAR(511),
+CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+--missing index on JSONB columns
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" (
+ "id" TEXT,
"geranFqBands" jsonb,
"nRFqBands" jsonb,
"eUtranFqBands" jsonb,
- "CD_sourceIds" jsonb
+ "CD_sourceIds" jsonb,
+ "CD_decorators" jsonb
+ "CD_classifiers" jsonb
);
-ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
SELECT ties_data.create_constraint_if_not_exists(
- 'AntennaCapability',
- 'PK_AntennaCapability_id',
- 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_AntennaCapability_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_AntennaCapability',
+ 'PK_o-ran-smo-teiv-ran_AntennaCapability_id',
+ 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");'
);
-CREATE TABLE IF NOT EXISTS ties_data."LTESectorCarrier" (
- "id" VARCHAR(511),
+--missing "ANTENNACAPABILITY_USED_BY_LTESECTORCARRIER" relationship
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" (
+ "id" TEXT,
"sectorCarrierType" TEXT,
"CD_sourceIds" jsonb,
- "REL_FK_provided-by-enodebFunction" VARCHAR(511),
- "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" VARCHAR(511),
- "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb
+ "CD_classifiers" jsonb,
+ "CD_decorators" jsonb,
+ "REL_FK_provided-by-enodebFunction" TEXT,
+ "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" TEXT,
+ "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
+ "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
+ "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
);
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}';
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'PK_LTESectorCarrier_id',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "PK_LTESectorCarrier_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."ENodeBFunction" (id) ON DELETE CASCADE;'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");'
);
+CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");
+
COMMIT;
-
-
diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql
index 089b788..fc61d6f 100644
--- a/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql
+++ b/pgsql-schema-generator/src/test/resources/baseline-schema/01_init-oran-smo-teiv-model.sql
@@ -19,7 +19,6 @@
-- ============LICENSE_END=========================================================
--
-
BEGIN;
DROP SCHEMA IF EXISTS ties_model cascade;
@@ -31,60 +30,52 @@
SET ROLE :'pguser';
CREATE TABLE IF NOT EXISTS ties_model.execution_status (
- "schema" VARCHAR(127) PRIMARY KEY,
- "status" VARCHAR(127)
+ "schema" VARCHAR(127) PRIMARY KEY,
+ "status" VARCHAR(127)
);
CREATE TABLE IF NOT EXISTS ties_model.hash_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "hashedValue" VARCHAR(511),
- "type" VARCHAR(511)
+ "name" TEXT PRIMARY KEY,
+ "hashedValue" VARCHAR(63) NOT NULL,
+ "type" VARCHAR(511)
);
CREATE TABLE IF NOT EXISTS ties_model.module_reference (
- "name" VARCHAR(511) PRIMARY KEY,
- "namespace" VARCHAR(511),
- "domain" VARCHAR(511),
- "includedModules" jsonb,
- "revision" VARCHAR(511),
- "content" TEXT,
- "ownerAppId" VARCHAR(511),
- "status" VARCHAR(127)
+ "name" TEXT PRIMARY KEY,
+ "namespace" TEXT,
+ "domain" TEXT,
+ "includedModules" jsonb DEFAULT '[]'::jsonb,
+ "revision" TEXT NOT NULL,
+ "content" TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS ties_model.entity_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511),
+ "storedAt" TEXT PRIMARY KEY,
+ "name" TEXT NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS ties_model.relationship_info (
- "name" VARCHAR(511) PRIMARY KEY,
- "aSideAssociationName" TEXT,
- "aSideMOType" TEXT,
- "aSideMinCardinality" BIGINT,
- "aSideMaxCardinality" BIGINT,
- "bSideAssociationName" TEXT,
- "bSideMOType" TEXT,
- "bSideMinCardinality" BIGINT,
- "bSideMaxCardinality" BIGINT,
- "associationKind" TEXT,
- "relationshipDataLocation" TEXT,
- "connectSameEntity" BOOLEAN,
- "moduleReferenceName" TEXT,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.decorators (
- "name" VARCHAR(511) PRIMARY KEY,
- "dataType" VARCHAR(511),
- "moduleReferenceName" VARCHAR(511),
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.classifiers (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511),
+ "name" TEXT NOT NULL,
+ "aSideAssociationName" TEXT NOT NULL,
+ "aSideMOType" TEXT NOT NULL,
+ "aSideModule" TEXT NOT NULL,
+ "aSideMinCardinality" BIGINT NOT NULL,
+ "aSideMaxCardinality" BIGINT NOT NULL,
+ "bSideAssociationName" TEXT NOT NULL,
+ "bSideMOType" TEXT NOT NULL,
+ "bSideModule" TEXT NOT NULL,
+ "bSideMinCardinality" BIGINT NOT NULL,
+ "bSideMaxCardinality" BIGINT NOT NULL,
+ "associationKind" TEXT NOT NULL,
+ "relationshipDataLocation" TEXT NOT NULL,
+ "storedAt" TEXT NOT NULL,
+ "connectSameEntity" BOOLEAN NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
+ PRIMARY KEY ("name", "moduleReferenceName"),
+ FOREIGN KEY ("aSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE,
+ FOREIGN KEY ("bSideModule") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
@@ -92,57 +83,64 @@
INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success');
COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin;
-AntennaModule AntennaModule TABLE
-positionWithinSector positionWithinSector COLUMN
-electricalAntennaTilt electricalAntennaTilt COLUMN
-mechanicalAntennaBearing mechanicalAntennaBearing COLUMN
-AntennaBeamWidth AntennaBeamWidth COLUMN
-mechanicalAntennaTilt mechanicalAntennaTilt COLUMN
-antennaModelNumber antennaModelNumber COLUMN
-totalTilt totalTilt COLUMN
-PK_AntennaModule_id PK_AntennaModule_id CONSTRAINT
-CloudSite CloudSite TABLE
-geo-location geo-location COLUMN
-CD_sourceIds CD_sourceIds COLUMN
-PK_CloudSite_id PK_CloudSite_id CONSTRAINT
-ENodeBFunction ENodeBFunction TABLE
-eNBId eNBId COLUMN
-eNodeBPlmnId eNodeBPlmnId COLUMN
-PK_ENodeBFunction_id PK_ENodeBFunction_id CONSTRAINT
-AntennaCapability AntennaCapability TABLE
-geranFqBands geranFqBands COLUMN
-nRFqBands nRFqBands COLUMN
-eUtranFqBands eUtranFqBands COLUMN
-PK_AntennaCapability_id PK_AntennaCapability_id CONSTRAINT
-LTESectorCarrier LTESectorCarrier TABLE
-sectorCarrierType sectorCarrierType COLUMN
+FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD CONSTRAINT
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_sourceIds IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_sourceIds IDX_6EC539C61EA7078DBA264C9877B87FC263605D42 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_1EBC7271CEA658156DE25286404CBC4593340F8E INDEX
+IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_44075E1D464599B61924196C20F2B88332520CD8 INDEX
+PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_ENodeBFunction_id PK_o-ran-smo-teiv-ran_ENodeBFunction_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_LTESectorCarrier_id PK_o-ran-smo-teiv-ran_LTESectorCarrier_id CONSTRAINT
+REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
+REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
+REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN
REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-PK_LTESectorCarrier_id PK_LTESectorCarrier_id CONSTRAINT
-UNIQUE_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9 CONSTRAINT
-FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A CONSTRAINT
+antennaBeamWidth antennaBeamWidth COLUMN
+antennaModelNumber antennaModelNumber COLUMN
+eNBId eNBId COLUMN
+eUtranFqBands eUtranFqBands COLUMN
+electricalAntennaTilt electricalAntennaTilt COLUMN
+geo-location geo-location COLUMN
+geranFqBands geranFqBands COLUMN
+id id COLUMN
+mechanicalAntennaBearing mechanicalAntennaBearing COLUMN
+mechanicalAntennaTilt mechanicalAntennaTilt COLUMN
+nRFqBands nRFqBands COLUMN
+o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE
+o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE
+o-ran-smo-teiv-ran_ENodeBFunction o-ran-smo-teiv-ran_ENodeBFunction TABLE
+o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran_LTESectorCarrier TABLE
+positionWithinSector positionWithinSector COLUMN
+sectorCarrierType sectorCarrierType COLUMN
+totalTilt totalTilt COLUMN
\.
-COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin;
-o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewoKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogIHByZWZpeCBvci10ZWl2LXlleHQ7CgogIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogIGRlc2NyaXB0aW9uCiAgIlRvcG9sb2d5IGFuZCBJbnZlbnRvcnkgWUFORyBleHRlbnNpb25zIG1vZGVsLgoKICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogIGludmVudG9yeSBtb2RlbHMgd2lsbCB1c2UgdG8gZGVmaW5lIGFuZCBhbm5vdGF0ZSB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgewogICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICB9CgogIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewoKICAgIGRlc2NyaXB0aW9uCiAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YgYW4KICAgICAgIEEtc2lkZSBhbmQgYSBCLXNpZGUuIFRoZSBBLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgb3JpZ2luYXRpbmcgc2lkZSBvZgogICAgICAgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZyBzaWRlIG9mIHRoZQogICAgICAgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YgaW1wb3J0YW5jZSBhbmQgTVVTVAogICAgICAgTk9UIGJlIGNoYW5nZWQgb25jZSBkZWZpbmVkLgoKICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4gQQogICAgICAgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgcmVsYXRpb25zaGlwLCBhbGwgZGlzdGluZ3Vpc2hlZCBieSByb2xlIG5hbWUuCgogICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQKICAgICAgIHBlciBwYXJlbnQgc3RhdGVtZW50LgoKICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZSB0aGUKICAgICAgIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgcmVsYXRpb25zaGlwLiBEYXRhIG5vZGVzIG9mIHR5cGVzICdsZWFmJyBhbmQgJ2xlYWYtbGlzdCcgYXJlIHVzZWQgZm9yCiAgICAgICB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYS1zaWRlJwogICAgICAgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYi1zaWRlJwogICAgICAgZXh0ZW5zaW9uLiBPdGhlciBkYXRhIG5vZGVzIGRlZmluZSBwcm9wZXJ0aWVzIG9mIHRoZSByZWxhdGlvbnNoaXAuCgogICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZSBpcwogICAgICAgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICB3aXRoaW4gdGhlIHNjb3BlLiI7CgogICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICB9CgogIGV4dGVuc2lvbiBhU2lkZSB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiRGVmaW5lcyB0aGUgQS1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUgb2YKICAgICAgIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMKICAgICAgIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5IG9mCiAgICAgICB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgcmVzaWRlcy4gSWYgdGhlCiAgICAgICB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlIHByZWZpeGVkLCBhbmQgYQogICAgICAgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBwcmVmaXguIjsKCiAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgfQoKICBleHRlbnNpb24gYlNpZGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lIG9mCiAgICAgICB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlIGlzCiAgICAgICBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlIHVuaXF1ZQogICAgICAgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eSBvZgogICAgICAgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZSB0eXBlLgoKICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuIElmIHRoZQogICAgICAgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZSBwcmVmaXhlZCwgYW5kIGEKICAgICAgIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgcHJlZml4LiI7CgogICAgYXJndW1lbnQgYlNpZGVUeXBlOwogIH0KCiAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgYXJndW1lbnQgZG9tYWluTmFtZTsKICB9CgogIGV4dGVuc2lvbiBsYWJlbCB7CiAgICBkZXNjcmlwdGlvbiAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcyBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuICBaZXJvIG9yIG9uZSByZXZpc2lvbiBsYWJlbCBzdGF0ZW1lbnRzCiAgICAgIHBlciBwYXJlbnQgc3RhdGVtZW50IGFyZSBhbGxvd2VkLgoKICAgICAgUmV2aXNpb24gbGFiZWxzIE1VU1QgYmUgdW5pcXVlIGFtb25nc3QgYWxsIHJldmlzaW9ucyBvZiBhIG1vZHVsZSBvciBzdWJtb2R1bGUuIjsKICAgICAgYXJndW1lbnQgc2VtdmVyc2lvbjsKICB9Cn0= BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKCiAgeWFuZy12ZXJzaW9uIDEuMTsKICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgcHJlZml4IG9yLXRlaXYtdHlwZXM7CgogIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgZGVzY3JpcHRpb24KICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgVGhpcyBtb2RlbCBjb250YWlucyByZS11c2FibGUgZGF0YSB0eXBlcyB0aGF0IHRvcG9sb2d5IGFuZCBpbnZlbnRvcnkgbW9kZWxzCiAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7CiAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogIH0KCiAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKCiAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLiBBbGwgdHlwZXMKICAgICAgICAgICAgICAgIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICBsZWFmIGlkIHsKICAgICAgdHlwZSBzdHJpbmc7CiAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIENNX0lEIHsKCiAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZXMgdG8gbWFrZQogICAgICAgICAgICAgICAgdXNlIG9mIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCAoQ00pLiI7CgogICAgbGVhZiBjbUhhbmRsZSB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIG5ldHdvcmsgZW50aXRpZXMgaW4gQ00uIjsKICAgIH0KCiAgICBsZWFmIHJlc291cmNlSWRlbnRpZmllciB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBkZXNjcmlwdGlvbiAiVGhlIHhwYXRoIGV4cHJlc3Npb24gaWRlbnRpZnlpbmcgdGhlIHJlc291cmNlIGluIHRoZSBOb2RlIG1vZGVsIHlhbmcgdHJlZS4iOwogICAgfQogIH0KCiAgdHlwZWRlZiBfM0dQUF9GRE5fVHlwZSB7CiAgICB0eXBlIHR5cGVzM2dwcDpEaXN0aW5ndWlzaGVkTmFtZTsKICB9CgogIGNvbnRhaW5lciBjb25zdW1lci1kYXRhIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBkZWZpbmVzIHRoZSBjb25zdW1lci1kYXRhLiBDb25zdW1lci1kYXRhIG1heSBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgIFRoaXMgY29udGFpbmVyIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLgogICAgICAgICAgICAgICAgICBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuIjsKICAgIH0KCiAgICBsZWFmLWxpc3QgY2xhc3NpZmllcnMgewogICAgICBkZXNjcmlwdGlvbiAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CiAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBsZWFmLWxpc3Qgc291cmNlSWRzIHsKICAgICAgZGVzY3JpcHRpb24gIkFuIG9yZGVyZWQgbGlzdCBvZiBpZGVudGl0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXQgb2YgbmF0aXZlIHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGFydGljaXBhdGluZwogICAgICAgICAgICAgICAgICBlbnRpdGllcy4iOwogICAgICB0eXBlIHN0cmluZzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUKICAgICAgICAgICAgICAgICAgcGFpci4iOwogICAgfQogIH0KCiAgaWRlbnRpdHkgY2xhc3NpZmllcnsKICAgIGRlc2NyaXB0aW9uICAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMgd2l0aCBpZGVudGl0eS4gIjsKICB9Cn0= BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7DQogICAgeWFuZy12ZXJzaW9uIDEuMTsNCiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yYW4iOw0KICAgIHByZWZpeCBvci10ZWl2LXJhbjsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gTG9naWNhbCB0b3BvbG9neSBtb2RlbC4NCg0KICAgIENvcHlyaWdodCAoYykgMjAyMyBFcmljc3NvbiBBQi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCg0KICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlDQogICAgUkFOIExvZ2ljYWwgZG9tYWluLCB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkNCiAgICBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlIHJlbGV2YW50IHRvIHJBcHBzIHVzZSBjYXNlcy4iOw0KDQogICAgcmV2aXNpb24gIjIwMjQtMDUtMDIiIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsNCiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOw0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOw0KDQogICAgbGlzdCBHTkJEVUZ1bmN0aW9uIHsNCiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLg0KDQogICAgICAgICAgICAgICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQNCiAgICAgICAgICAgICAgICAgICAgKGdOQi1DVSkgYW5kIGEgZ05CLURVLiBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsDQogICAgICAgICAgICAgICAgICAgIHRpbWUgcHJvdG9jb2xzIGFuZCBzZXJ2aWNlcywgYW5kIHRoZSBEVSBwcm9jZXNzZXMNCiAgICAgICAgICAgICAgICAgICAgUEhZIGxldmVsIHByb3RvY29sIGFuZCByZWFsIHRpbWUgc2VydmljZXMuIFRoZQ0KICAgICAgICAgICAgICAgICAgICBnTkItQ1UgYW5kIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWENCiAgICAgICAgICAgICAgICAgICAgRjEgbG9naWNhbCBpbnRlcmZhY2UuDQoNCiAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIGdOQi1EVToNCiAgICAgICAgICAgICAgICAgICAgSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtQ1AgdGhyb3VnaCB0aGUgRjEtQw0KICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuSXMgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaA0KICAgICAgICAgICAgICAgICAgICB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMgY29ubmVjdGVkIHRvIG9ubHkNCiAgICAgICAgICAgICAgICAgICAgb25lIGdOQi1DVS1DUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvDQogICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUNCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLUNQLg0KICAgICAgICAgICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUNCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLVVQcyBhbmQgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUNCiAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UNCiAgICAgICAgICAgICAgICAgICAgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlIHRoZSBnTkItRFUgb2JqZWN0LiI7DQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsNCg0KICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7DQogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGdOQkRVSWQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZ05CSWQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJZGVudGl0eSBvZiBnTm9kZUIgd2l0aGluIGEgUExNTiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZW5ndGggb2YgZ05CSWQgYml0IHN0cmluZyByZXByZXNlbnRhdGlvbiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEV2b2x2ZWQgTm9kZSBCIChlTm9kZUIpIGlzIHRoZSBvbmx5IG1hbmRhdG9yeQ0KICAgICAgICAgICAgICAgICAgICBub2RlIGluIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0NCiAgICAgICAgICAgICAgICAgICAgRXZvbHV0aW9uIChMVEUpLiBUaGUgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlDQogICAgICAgICAgICAgICAgICAgIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zDQogICAgICAgICAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZQ0KICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlciBkZWNpc2lvbnMuIFVubGlrZSAyLzNHDQogICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzIFJBTiwgdGhlcmUgaXMgbm8gY2VudHJhbGl6ZWQgcmFkaW8gbmV0d29yaw0KICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkDQogICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcw0KICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSB3aXRoIG1vYmlsZSBoYW5kc2V0cyAoVXNlciBFcXVpcG1lbnQpLCBsaWtlIGEgYmFzZQ0KICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzDQogICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlciByZXNwb25zZSB0aW1lcy4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGVOQklkIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBJRCB0aGF0IGZvcm1zIHBhcnQgb2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2VsbCBHbG9iYWwgSWRlbnRpdHksIGFuZCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFMxIGludGVyZmFjZSI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiBkdXBsZXhUeXBlIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdG9yIG9mIEVVdHJhbkNlbGwgdHlwZSwgRkREIG9yIFRERCI7DQogICAgICAgICAgICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7DQogICAgICAgICAgICAgICAgICAgIGVudW0gdGRkIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVEREIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgUHVibGljIExhbmQgTW9iaWxlIE5ldHdvcmsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUExNTikgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFMxIGludGVyZmFjZS4gTm90ZTogVGhlIHZhbHVlIChNQ0M9MDAxLCBNTkM9MDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgY2FuIG5vdCBiZSB1c2VkIGFzIGEgdmFsaWQgUExNTiBJZGVudGl0eS4iOw0KDQogICAgICAgICAgICAgICAgbGVhZiBtY2Mgew0KICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1DQyBwYXJ0IG9mIGEgUExNTiBpZGVudGl0eQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7DQogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMC4uOTk5Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGxlYWYgbW5jIHsNCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOw0KICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDAuLjk5OTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZWFmIG1uY0xlbmd0aCB7DQogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOw0KICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsDQogICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgUkJTIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UNCiAgICAgICAgICAgICAgICAgICAgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLiBUaGUgTU8gYWxzbw0KICAgICAgICAgICAgICAgICAgICBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7DQogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7DQogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYtbGlzdCBuUkZxQmFuZHMgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgaGFyZHdhcmUgc3VwcG9ydHMiOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgbGlzdCBMVEVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBMVEUgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzIHRoZQ0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3MNCiAgICAgICAgICAgICAgICAgICAgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZQ0KICAgICAgICAgICAgICAgICAgICBhcmVhIGFzc29jaWF0ZWQgd2l0aCBhIGJhc2Ugc3RhdGlvbiBoYXZpbmcNCiAgICAgICAgICAgICAgICAgICAgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLg0KICAgICAgICAgICAgICAgICAgICBUaGUgY29uY2VwdCBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsDQogICAgICAgICAgICAgICAgICAgIGludGVyZmVyZW5jZSBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcyBzeXN0ZW1zDQogICAgICAgICAgICAgICAgICAgIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgew0KICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdG9yIGNhcnJpZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsNCiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsNCiAgICAgICAgICAgICAgICAgICAgZW51bSBub3JtYWxfc2VjdG9yIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDJEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAyOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3Rvcl8zZHMgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmlnaHQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3Igew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNaWRkbGUgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7DQogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTlIgU2VjdG9yIENhcnJpZXIgb2JqZWN0IHByb3ZpZGVzDQogICAgICAgICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbA0KICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhDQogICAgICAgICAgICAgICAgICAgIHNlY3Rvci4gQSBzZWN0b3IgaXMgYSBjb3ZlcmFnZSBhcmVhIGFzc29jaWF0ZWQNCiAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGJhc2Ugc3RhdGlvbiBoYXZpbmcgaXRzIG93biBhbnRlbm5hcywNCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUgY29uY2VwdA0KICAgICAgICAgICAgICAgICAgICBvZiBzZWN0b3JzIHdhcyBkZXZlbG9wZWQgdG8gaW1wcm92ZSBjby1jaGFubmVsDQogICAgICAgICAgICAgICAgICAgIGludGVyZmVyZW5jZSBpbiBjZWxsdWxhciBzeXN0ZW1zLCBhbmQgbW9zdCB3aXJlbGVzcw0KICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgew0KICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgQWJzb2x1dGUgUmFkaW8gRnJlcXVlbmN5IENoYW5uZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgKE5SLUFSRkNOKSBmb3IgZG93bmxpbmsiOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGFyZmNuVUwgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBmcmVxdWVuY3kgQ2hhbm5lbCBOdW1iZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlItQVJGQ04pIGZvciB1cGxpbmsuIjsNCiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJGIFJlZmVyZW5jZSBGcmVxdWVuY3kgb2YgZG93bmxpbmsgY2hhbm5lbCI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZnJlcXVlbmN5VUwgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsNCiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4uMSB0byAwLi4xDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KDQogICAgICAgIGxlYWYgdXNlZC1ieS1sdGVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOw0KICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCBwcm92aWRlZC1sdGVTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRU5vZGVCRnVuY3Rpb247DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHByb3ZpZGVkLWJ5LWVub2RlYkZ1bmN0aW9uIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBOUlNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTlJTZWN0b3JDYXJyaWVyOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbnJTZWN0b3JDYXJyaWVyIHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBOUiBTZWN0b3IgQ2Fycmllci4iOw0KICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5Ow0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLjEgdG8gMC4uMSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHVzZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfUFJPVklERVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4uMSB0byAwLi5uKQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmIHByb3ZpZGVkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLm4gdG8gMC4uMSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmIHNlcnZpY2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFDQVBBQklMSVRZX1JFQUxJU0VEX0JZX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gU2FtZSBlbnRpdHkgKDAuLm4gdG8gMC4ubSkNCg0KICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOw0KICAgICAgICBrZXkgaWQ7DQoNCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsNCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgcmVhbGlzZWQgYnkgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCg0KICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQogICAgfQ0KfQ== BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7DQogICAgeWFuZy12ZXJzaW9uIDEuMTsNCiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1lcXVpcG1lbnQiOw0KICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOw0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHtwcmVmaXggb3ItdGVpdi10eXBlczsgfQ0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0NCg0KICAgIGltcG9ydCBpZXRmLWdlby1sb2NhdGlvbiB7DQogICAgICAgIHByZWZpeCBnZW87DQogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOw0KICAgIH0NCg0KICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOw0KICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOw0KICAgIGRlc2NyaXB0aW9uDQogICAgIlJBTiBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQ0KICAgIFJBTiBMb2dpY2FsIGRvbWFpbiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgZnVuY3Rpb25hbCBjYXBhYmlsaXR5DQogICAgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZSByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsNCg0KICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7DQogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7DQogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsNCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsNCg0KICAgIGxpc3QgQW50ZW5uYU1vZHVsZSB7DQogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZQ0KICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBhc3BlY3Qgb2YgYW4gYW50ZW5uYS4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIGZkbiB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgRnVsbCBEaXN0aW5ndWlzaGVkIE5hbWUgKEZETikgaWRlbnRpZmllcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluc3RhbmNlIG9mIHRoZSBBbnRlbm5hU3ViVW5pdCBNTy4gSXQgY29udGFpbnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVsbCBwYXRoIGZyb20gdGhlIFN1Ym5ldHdvcmsgdG8gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50ZW5uYVN1YlVuaXQuIjsNCiAgICAgICAgICAgICAgICB0eXBlIG9yLXRlaXYtdHlwZXM6XzNHUFBfRkROX1R5cGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVuZG9yLXNwZWNpZmljIGFudGVubmEgbW9kZWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG9wZXJhdGlvbmFsIGltcGFjdC4iOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hQmVhcmluZyB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBhbnRlbm5hIHVuaXQgaXMgaW5zdGFsbGVkLiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFUaWx0IHsNCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCByZXNwZWN0IHRvIHRoZSB2ZXJ0aWNhbCBwbGFuZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bnRpbHQsIGFuZCBuZWdhdGl2ZSBpbmRpY2F0ZXMgdXB0aWx0LiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3Igew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIEFJU0cgdjMgQURCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbCBpbXBhY3QuIjsNCiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb3RhbCBhbnRlbm5hIGVsZXZhdGlvbiBpbmNsdWRpbmcgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVtb3RlIEVsZWN0cmljYWwgVGlsdCAoUkVUKS4iOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbHQgZG93biBpcyBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOw0KICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZWFmLWxpc3QgQW50ZW5uYUJlYW1XaWR0aCB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYSByYWRpYXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLiBNZWFzdXJlZCBpbiBkZWdyZWVzLiI7DQogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGxlYWYgZHVwbGV4VHlwZSB7DQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRvciBvZiBFVXRyYW5DZWxsIHR5cGUsIEZERCBvciBUREQiOw0KICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gew0KICAgICAgICAgICAgICAgICAgICBlbnVtIHR5cGUxIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAidHlwZTEiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1VTRVNfQU5URU5OQU1PRFVMRSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLjEpDQoNCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsNCiAgICAgICAga2V5IGlkOw0KDQogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LWFudGVubmFNb2R1bGUgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHJlYWxpc2VkIGJ5IEFudGVubmEgTW9kdWxlLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgQW50ZW5uYU1vZHVsZTsNCiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsNCiAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYW50ZW5uYU1vZHVsZSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZXMgQW50ZW5uYSBNb2R1bGUuIjsNCiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hTW9kdWxlOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgIH0NCiAgICB9DQp9 BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-cloud urn:o-ran:smo-teiv-cloud CLOUD [] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNsb3VkIHsNCiAgICB5YW5nLXZlcnNpb24gMS4xOw0KICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNsb3VkIjsNCiAgICBwcmVmaXggb3ItdGVpdi1jbG91ZDsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gew0KICAgICAgICBwcmVmaXggZ2VvOw0KICAgICAgICByZWZlcmVuY2UgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsNCiAgICB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gQ2xvdWQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQ0KICAgIFJBTiBDTE9VRCBkb21haW4sIHdoaWNoIGNvbXByaXNlcyBjbG91ZCBpbmZyYXN0cnVjdHVyZSBhbmQNCiAgICBkZXBsb3ltZW50IGFzcGVjdHMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgdG9wb2xvZ3kgbW9kZWwuIjsNCg0KICAgIHJldmlzaW9uICIyMDI0LTA1LTAyIiB7DQogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7DQogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsNCiAgICB9DQoNCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIENMT1VEOw0KDQogICAgbGlzdCBDbG91ZFNpdGUgew0KICAgICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdGhhdA0KICAgICAgICAgICAgICAgICAgICBob3N0cyB0aGUgTkYgRGVwbG95bWVudC4iOw0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7DQogICAgICAgICAgICBsZWFmIG5hbWUgew0KICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOYW1lIG9mIENsb3VkIFNpdGUiOw0KICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247DQogICAgICAgIH0NCiAgICB9DQp9 BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-equipment-to-ran urn:o-ran:smo-teiv-equipment-to-ran EQUIPMENT_TO_RAN ["o-ran-smo-teiv-equipment", "o-ran-smo-teiv-ran"] 2024-05-02 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudC10by1yYW4gew0KICAgIHlhbmctdmVyc2lvbiAxLjE7DQogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50LXRvLXJhbiI7DQogICAgcHJlZml4IG9yLXRlaXYtZXF1aXB0b3JhbjsNCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7cHJlZml4IG9yLXRlaXYtdHlwZXM7IH0NCg0KICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHtwcmVmaXggb3ItdGVpdi15ZXh0OyB9DQoNCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHtwcmVmaXggb3ItdGVpdi1lcXVpcDsgfQ0KDQogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LXJhbiB7cHJlZml4IG9yLXRlaXYtcmFuOyB9DQoNCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsNCiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsNCiAgICBkZXNjcmlwdGlvbg0KICAgICJSQU4gTG9naWNhbCB0byBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuDQoNCiAgICBDb3B5cmlnaHQgKGMpIDIwMjMgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSBSQU4gTG9naWNhbCB0byBFcXVpcG1lbnQgdG9wb2xvZ3kNCiAgICBlbnRpdGllcyBhbmQgcmVsYXRpb25zLiI7DQoNCiAgICByZXZpc2lvbiAiMjAyNC0wNS0wMiIgew0KICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOw0KICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7DQogICAgfQ0KDQogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlRfVE9fUkFOOw0KDQogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1NFUlZFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4ubQ0KDQogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7DQogICAgICAgIGtleSBpZDsNCg0KICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgew0KICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSBzZXJ2aWNlZCBieSB0aGlzIEFudGVubmEgTW9kdWxlLiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOw0KICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOw0KICAgICAgICB9DQoNCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7DQogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgc2VydmVzIHRoaXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7DQogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7DQogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7DQogICAgICAgIH0NCiAgICB9DQp9DQo= BUILT_IN_MODULE IN_USAGE
+COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin;
+_3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CgogIGltcG9ydCBpZXRmLWluZXQtdHlwZXMgeyBwcmVmaXggaW5ldDsgfQogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgeyBwcmVmaXggeWFuZzsgfQogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IHlleHQzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZAogICAgbmV0d29yayBzbGljaW5nLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLAogICAgVFRBLCBUVEMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI7CiAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyMyI7CgogIHJldmlzaW9uIDIwMjMtMTEtMDYgeyByZWZlcmVuY2UgQ1ItMDMwNTsgfQogIHJldmlzaW9uIDIwMjMtMDktMTggeyByZWZlcmVuY2UgQ1ItMDI3MSA7IH0KICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CgogIHJldmlzaW9uIDIwMjEtMDktMzAgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIExvbmdpdHVkZSwgTGF0aXR1ZGUsIFRlbnRoT2ZEZWdyZWVzLCBPbk9mZi4iOwogICAgcmVmZXJlbmNlICJDUi0wMTM4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMTEtMDYgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgaW5jb3JyZWN0IFMtTlNTQUkgZGVmaW5pdGlvbnMuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDExOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTAzLTEwIHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGZhdWx0eSB3aGVuIHN0YXRlbWVudHMuIjsKICAgIHJlZmVyZW5jZSAiU1AtMjAwMjI5IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CgogIGdyb3VwaW5nIG5hbWVWYWx1ZVBhaXIgewogICAgbGVhZiBuYW1lIHsgdHlwZSBzdHJpbmc7IH0KICAgIGxlYWYgdmFsdWUgeyB0eXBlIHN0cmluZzsgfQogIH0KCiAgZ3JvdXBpbmcgUHJvY2Vzc01vbml0b3JHcnAgewogICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGF0dHJpYnV0ZXMgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgcHJvY2Vzc2VzCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcwogICAgICB3aGVuIHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgcHJvY2Vzc2VzLgogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LgogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEKICAgICAgY29uY3JldGUgcHJvY2VzcyByZXByZXNlbnRhdGlvbi4KCiAgICAgIElmIGEgbWFuYWdlbWVudCBvcGVyYXRpb24gb24gc29tZSBJT0NzIHRyaWdnZXJzIGFuIGFzc29jaWF0ZWQKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlCiAgICAgICdQcm9jZXNzTW9uaXRvcicpIGluIHRoZXNlIElPQyhzKS4gVGhlIHByb2Nlc3NNb25pdG9yIGF0dHJpYnV0ZSBtYXkgYmUKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IKICAgICAgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBtYXkgYmUgcHJvdmlkZWQgYnkgdGhlICdwcm9ncmVzc1N0YXRlSW5mbycgYW5kCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0bwogICAgICBzdGFydCBleGVjdXRpbmcgdGhlIHByb2Nlc3MgYW5kIHRvIHRyYW5zaXRpb24gaW50byB0aGUgJ1JVTk5JTkcnIHN0YXRlLgogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lCiAgICAgIGFsdGVybmF0aXZlIG11c3QgYmUgc2VsZWN0ZWQgd2hlbiB1c2luZyB0aGlzIGRhdGEgdHlwZS4KCiAgICAgIER1cmluZyB0aGUgJ1JVTk5JTkcnIHN0YXRlIHRoZSAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGUgbWF5IGJlCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8KICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0bwogICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiB0aGUgJ05PVF9SVU5OSU5HJywgJ0NBTkNFTExJTkcnCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzCiAgICAgIHVzZWQuCgogICAgICBVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJvY2VzcywgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBzZXQKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkCiAgICAgIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkCiAgICAgIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIHVzZWQuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgdGhlICdzdGF0dXMnCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZgogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZQogICAgICAncmVzdWx0U3RhdGVJbmZvJyBzcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbgogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbiBhcyB3ZWxsLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBpcyBjYW5jZWxsZWQsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgZmlyc3Qgc2V0IHRvCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLgogICAgICBUaGUgdmFsdWUgb2YgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLiBBZGRpdGlvbmFsIHRleHR1YWwKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvcgogICAgICAnQ0FOQ0VMTEVEJy4gSXQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIG1ha2luZyB0aGUgb3V0Y29tZSwgdGhhdCB0aGUKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55CiAgICAgIG1vcmUgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUsIG9yIHRoZSBwcm9jZXNzIG91dGNvbWUgaXMgbmVlZGVkIHVudGlsIGEKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMKICAgICAgaW5kaWNhdGVkIGJ5IHRoZSAndGltZXInIGF0dHJpYnV0ZS4iOwoKICAgIGxlYWYgaWQgewogICAgICB0eXBlIHN0cmluZzsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJJZCBvZiB0aGUgcHJvY2Vzcy4gSXQgaXMgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZQogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KCiAgICBsZWFmIHN0YXR1cyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gTk9UX1NUQVJURUQgOwogICAgICAgIGVudW0gUlVOTklORyA7CiAgICAgICAgZW51bSBDQU5DRUxMSU5HIDsKICAgICAgICBlbnVtIEZJTklTSEVEIDsKICAgICAgICBlbnVtIEZBSUxFRCA7CiAgICAgICAgZW51bSBQQVJUSUFMTFlfRkFJTEVEIDsKICAgICAgICBlbnVtIENBTkNFTExFRCA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZWZhdWx0ICBSVU5OSU5HOwogICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLgogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkCiAgICAgICAgcHJvY2Vzcy4gIjsKICAgIH0KCiAgICBsZWFmIHByb2dyZXNzUGVyY2VudGFnZSB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlIDAuLjEwMDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJQcm9ncmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGFzIHBlcmNlbnRhZ2UiOwogICAgfQoKICAgIGxlYWYtbGlzdCBwcm9ncmVzc1N0YXRlSW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZwogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcwogICAgICAgICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCBhbmQgJ0NBTkNFTExFRCcuCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcwogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MKICAgICAgICBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgYW55LiBGb3IgdGhpcyBwdXJwb3NlLCBkZWRpY2F0ZWQKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgc3RhcnRUaW1lIHsKICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlN0YXJ0IHRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgaS5lLiB0aGUgdGltZSB3aGVuIHRoZQogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLgoKICAgICAgICBJZiB0aGUgdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBpdCBpcyB0aGUgZXN0aW1hdGVkIHRpbWUKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUKICAgICAgICBNblNfUHJvZHVjZXIuCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCgogICAgICAgIE9uY2UgdGhlIHRpbWVyIGlzIHNldCwgdGhlIGNvbnN1bWVyIGNhbiBub3QgY2hhbmdlIGl0IGFueW1vcmUuCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgICAgeWV4dDNncHA6bm90Tm90aWZ5YWJsZTsKICAgIH0KICB9CgogIHR5cGVkZWYgVGVudGhPZkRlZ3JlZXMgewogICAgdHlwZSB1aW50MTYgewogICAgICByYW5nZSAwLi4zNjAwOwogICAgfQogICAgdW5pdHMgIjAuMSBkZWdyZWVzIjsKICAgIGRlc2NyaXB0aW9uICJBIHNpbmdsZSBpbnRlZ3JhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIEFsdGl0dWRlICB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgfQogICAgdW5pdHMgIm1ldGVycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4iOwogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBMYXRpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBsb25naXR1ZGUgewogICAgICB0eXBlIExvbmdpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBhbHRpdHVkZSB7CiAgICAgIHR5cGUgQWx0aXR1ZGU7CiAgICB9CgogIH0KCiAgdHlwZWRlZiBPbk9mZiB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBPTjsKICAgICAgZW51bSBPRkY7CiAgICB9CiAgfQoKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcwogIC8vICBiZWluZyBtb3ZlZCB0byBfM2dwcC01Z2MtbnJtLW5mcHJvZmlsZQogIGdyb3VwaW5nIE1hbmFnZWRORlByb2ZpbGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORiI7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuNTAxIjsKCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQoKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLgogICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIE5GIEluc3RhbmNlIElEIHNoYWxsIGJlIGEKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgICB5ZXh0M2dwcDppblZhcmlhbnQ7CiAgICB9CgogICAgbGVhZi1saXN0IG5mVHlwZSB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIHR5cGUgTmZUeXBlOwogICAgICBkZXNjcmlwdGlvbiAiVHlwZSBvZiB0aGUgTmV0d29yayBGdW5jdGlvbiIgOwogICAgfQoKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQoKICAgIGxlYWYgYXV0aHpJbmZvIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBORiBTcGVjaWZpYyBTZXJ2aWNlIGF1dGhvcml6YXRpb24KICAgICAgICBpbmZvcm1hdGlvbi4gSXQgc2hhbGwgaW5jbHVkZSB0aGUgTkYgdHlwZSAocykgYW5kIE5GIHJlYWxtcy9vcmlnaW5zCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KCiAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBORiBpbnN0YW5jZQogICAgICAgIChlLmcuIGdlb2dyYXBoaWMgbG9jYXRpb24sIGRhdGEgY2VudGVyKSBkZWZpbmVkIGJ5IG9wZXJhdG9yIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uCiAgICAgICAgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIGV4cHJlc3NlZCBhcyBhIHdlaWdodCByZWxhdGl2ZSB0byBvdGhlcgogICAgICAgIE5GIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyBpZiBjYXBhY2l0eSBpcyBhbHNvIHByZXNlbnQgaW4gdGhlCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMKICAgICAgICBzZXJ2ZWQgYnkgdGhlIE5GIGluc3RhbmNlLgogICAgICAgIE1heSBiZSBjb25maWcgZmFsc2Ugb3IgdHJ1ZSBkZXBlbmRpbmcgb24gdGhlIE1hbmFnZWRGdW5jdGlvbi4KICAgICAgICBDb25maWc9dHJ1ZSBmb3IgVWRyaW5mby4gQ29uZmlnPWZhbHNlIGZvciBVZG1JbmZvIGFuZCBBdXNmSW5mby4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc3VwcG9ydGVkRGF0YVNldElkcyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU1VCU0NSSVBUSU9OOwogICAgICAgIGVudW0gUE9MSUNZOwogICAgICAgIGVudW0gRVhQT1NVUkU7CiAgICAgICAgZW51bSBBUFBMSUNBVElPTjsKICAgICAgfQogICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBzdXBwb3J0ZWQgZGF0YSBzZXRzIGluIHRoZSBVRFIgaW5zdGFuY2UuCiAgICAgICAgTWF5IGJlIHByZXNlbnQgaWYgLi4vbmZUeXBlID0gVURSIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVQRiI7CiAgICAgIHJlZmVyZW5jZSAiVFMgMjkuNTEwIiA7CiAgICB9CgogICAgbGVhZiBwcmlvcml0eSB7CiAgICAgIHR5cGUgdWludDE2OwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBQcmlvcml0eSAocmVsYXRpdmUgdG8gb3RoZXIgTkZzCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsKICAgICAgICBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBoaWdoZXIgcHJpb3JpdHkuIElmIHByaW9yaXR5IGlzIGFsc28gcHJlc2VudAogICAgICAgIGluIHRoZSBuZlNlcnZpY2VMaXN0IHBhcmFtZXRlcnMsIHRob3NlIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KCiAgdHlwZWRlZiB1c2FnZVN0YXRlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIElETEU7CiAgICAgIGVudW0gQUNUSVZFOwogICAgICBlbnVtIEJVU1k7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiSXQgZGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZXNvdXJjZSBpcyBhY3RpdmVseSBpbgogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZQogICAgICBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCB1c2VycyBhdCB0aGF0IGluc3RhbnQuIFRoZSB2YWx1ZSBpcyBSRUFELU9OTFkuIjsKICAgIHJlZmVyZW5jZSAiSVRVIFQgUmVjb21tZW5kYXRpb24gWC43MzEiOwogIH0KCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CgogIHR5cGVkZWYgTWNjIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIGNvdW50cnkgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBkZWNpbWFsIGRpZ2l0cywKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMKICAgICAgcmVnaW9uICh0aGUgZGlnaXRzIDEgYW5kIDggYXJlIG5vdCB1c2VkKToiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMDItNzldWzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgdHlwZWRlZiBNbmMgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgbmV0d29yayBjb2RlIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQogICAgICBkZWNpbWFsIGRpZ2l0cyAoZm9yIGV4YW1wbGU6IE1OQyBvZiAwMDEgaXMgbm90IHRoZSBzYW1lIGFzIE1OQyBvZiAwMSkiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05XVswLTldWzAtOV18WzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgZ3JvdXBpbmcgUExNTklkIHsKICAgIGxlYWYgbWNjIHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgTWNjOwogICAgfQogICAgbGVhZiBtbmMgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNbmM7CiAgICB9CiAgICByZWZlcmVuY2UgIlRTIDM4LjQxMyBjbGF1c2UgOS4zLjMuNSI7CiAgfQoKICB0eXBlZGVmIE5jaSB7CiAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4gVGhlIE5DSSBzaGFsbCBiZSBvZiBmaXhlZCBsZW5ndGggb2YgMzYgYml0cwogICAgICBhbmQgc2hhbGwgYmUgY29kZWQgdXNpbmcgZnVsbCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQoKICB0eXBlZGVmIE9wZXJhdGlvbmFsU3RhdGUgewogICAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyNSBhbmQgSVRVLVQgWC43MzEiOwogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyB0b3RhbGx5IGlub3BlcmFibGUuIjsKICAgICAgfQoKICAgICAgZW51bSBFTkFCTEVEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICB9CiAgfQoKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KCiAgICAgIGVudW0gU0hVVFRJTkdET1dOIHsKICAgICAgICB2YWx1ZSAyOwogICAgICAgIGRlc2NyaXB0aW9uICJVc2Ugb2YgdGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcGVybWl0dGVkIHRvCiAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZXMgb2YgdXNlIG9ubHkuIFdoaWxlIHRoZSBzeXN0ZW0gcmVtYWlucyBpbgogICAgICAgICAgdGhlIHNodXR0aW5nIGRvd24gc3RhdGUgdGhlIG1hbmFnZXIgb3IgdGhlIG1hbmFnZWQgZWxlbWVudAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZQogICAgICAgICAgbG9ja2VkIHN0YXRlLiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOwogICAgICAgICAgZW51bSBPRkZfTElORTsKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7CiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7CiAgICAgICAgICBlbnVtIERFR1JBREVEOwogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOwogICAgICAgICAgZW51bSBMT0dfRlVMTDsKICAgICAgIH0KICB9CgogIHR5cGVkZWYgQ2VsbFN0YXRlIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBJRExFOwogICAgICAgIGVudW0gSU5BQ1RJVkU7CiAgICAgICAgZW51bSBBQ1RJVkU7CiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKQogICAgICBhcyBzcGVjaWZpZWQgaW4gY2xhdXNlIDI4LjYgb2YgVFMgMjMuMDAzLCBjbGF1c2UgOC4yIG9mIFRTIDM4LjMwMAogICAgICBhbmQgY2xhdXNlIDkuMy4zLjExIG9mIFRTIDM4LjQxMy4gSXQgaXMgY29tcG9zZWQgb2YgdGhlIFBMTU4KICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQKICAgICAgdGhlIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4gIjsKICAgIGxpc3QgcGxtbklkIHsKICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSWRlbnRpdHkuIjsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIG1heC1lbGVtZW50cyAxOwogICAgICBrZXkgIm1jYyBtbmMiOwogICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICB9CgogICAgbGVhZiB0YWMgeyB0eXBlIFRhYzsgfQogIH0KCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsKICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgICAgcmFuZ2UgLTkwLi45MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMYXRpdHVkZSBiYXNlZCBvbiBXb3JsZCBHZW9kZXRpYyBTeXN0ZW0gKDE5ODQgdmVyc2lvbikKICAgICAgICBnbG9iYWwgcmVmZXJlbmNlIGZyYW1lIChXR1MgODQpLiBQb3NpdGl2ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgICByYW5nZSAtMTgwLi4xODAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIGJhc2VkIG9uIFdvcmxkIEdlb2RldGljIFN5c3RlbSAoMTk4NCB2ZXJzaW9uKQogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvCiAgICAgICAgZGVncmVlcyBlYXN0IG9mIDAgZGVncmVlcyBsb25naXR1ZGUuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIEdlb0FyZWFHcnAgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YSB0eXBlIGRlZmluZXMgYSBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgVGhlIGdlby1hcmVhIGlzIGRlZmluZWQgdXNpbmcgYSBjb252ZXggcG9seWdvbiBpbiB0aGUgYXR0cmlidXRlCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwoKICAgIGxpc3QgY29udmV4R2VvUG9seWdvbiB7CiAgICAgIGRlc2NyaXB0aW9uICJTcGVjaWZpZXMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHdpdGggYSBjb252ZXggcG9seWdvbi4KICAgICAgICBUaGUgY29udmV4IHBvbHlnb24gaXMgc3BlY2lmaWVkIGJ5IGl0cyBjb3JuZXJzLiI7CiAgICAgICAga2V5ICJsYXRpdHVkZSBsb25naXR1ZGUiOwogICAgICBtaW4tZWxlbWVudHMgMzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwoKICAgICAgdXNlcyBHZW9Db29yZGluYXRlR3JwOwogICAgfQogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSB1aW50OCA7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlNldElkIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgewogICAgbGVhZiBhbWZSZWdpb25JZCB7CiAgICAgIHR5cGUgQW1mUmVnaW9uSWQ7CiAgICB9CiAgICBsZWFmIGFtZlNldElkIHsKICAgICAgdHlwZSBBbWZTZXRJZDsKICAgIH0KICAgIGxlYWYgYW1mUG9pbnRlciB7CiAgICAgIHR5cGUgQW1mUG9pbnRlcjsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLgogICAgICBUaGUgQU1GIFJlZ2lvbiBJRCBpZGVudGlmaWVzIHRoZSByZWdpb24sCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7CiAgfQoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0KICB9CgogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICB0eXBlZGVmIExvYWQgewogICAgZGVzY3JpcHRpb24gIkxhdGVzdCBrbm93biBsb2FkIGluZm9ybWF0aW9uIG9mIHRoZSBORiwgcGVyY2VudGFnZSAiOwogICAgdHlwZSB1aW50OCB7CiAgICAgIHJhbmdlIDAuLjEwMDsKICAgIH0KICB9CgogIHR5cGVkZWYgTjFNZXNzYWdlQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gNUdNTTsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBMUFA7CiAgICAgIGVudW0gU01TOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMkluZm9ybWF0aW9uQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTlJQUEE7CiAgICAgIGVudW0gUFdTOwogICAgICBlbnVtIFBXU19CQ0FMOwogICAgICBlbnVtIFBXU19SRjsKICAgIH0KICB9CgogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewoKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KCiAgICBsZWFmIGNhbGxiYWNrVXJpIHsKICAgICAgdHlwZSBpbmV0OnVyaTsKICAgIH0KCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfQogIH0KCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgfQoKICBncm91cGluZyBJcHY2UHJlZml4UmFuZ2UgewogIGxlYWYgc3RhcnQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICB9CgogIHR5cGVkZWYgTnNpSWQgewogICAgdHlwZSBzdHJpbmc7CiAgfQoKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CgogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CgogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CgogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9CiAgfQoKICAvKiBEaXN0aW5ndWlzaGVkTmFtZSBwYXR0ZXJuIGlzIGJ1aWx0IHVwIGJhc2VkIG9uIHRoZQogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KCiAgICBsZWFmIEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vICBTYW1lIHBhdHRlcm4gYXMgTG9jYWxETgogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPygsW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQgICBNZS5teWtleT0xIGFsbG93ZWQKICAgICAgLy8gIChmdWxsTG9jYWxSRE4pKCwoZnVsbExvY2FsUkROKSkqCiAgICAgIHBhdHRlcm4gJygoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSgsKChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qfChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qXC5bYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qKSk9KChbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykpKSonOwogICAgfSB9CgogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0gfQoKICAgIGxlYWYgZnVsbExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgZnVsbExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICAvLyBwYXR0ZXJuIExvY2FsRE5BdHRyaWJ1dGVUeXBlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsKICAgIH0gfQoKICAgICAgLy8gbGltaXRhdGlvbjogTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlbm90IHN1cHBvcnRlZCBNZS5teWtleT0xCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUgeyB0eXBlIHN0cmluZyB7CiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOwogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWVzT2ZDbGFzc0FuZE5hbWluZ0F0dHJpYnV0ZSAgeyB0eXBlIHN0cmluZyB7ICAvLyBDbGFzc05hbWUgLCBDbGFzc05hbWluZ0F0dHJpYnV0ZVNlcGFyYXRvciAsIE5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgLy8gcGF0dGVybjogQ2xhc3NOYW1lXC5OYW1pbmdBdHRyaWJ1dGVOYW1lCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSonIDsKICAgIH0gfQoKICAgIGxlYWYgcmVzdHJpY3RpdmVDbGFzc05hbWUgeyB0eXBlIHN0cmluZyB7ICAgICAvLwogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7CiAgICB9IH0KCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwnCiAgICAgICsgJyhcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKicKICAgICAgKyAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JwogICAgICArICcoLFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKScKICAgICAgKyAnKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSAzR1BQIHN0YW5kYXJkIGZvciBEaXN0aW5ndWlzaGVkTmFtZS4KCiAgICAgIExpbWl0YXRpb25zOgogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZAogICAgICAgIChlZy4gTWFuYWdlZEVsZW1lbnQubXlrZXk9MzQ1NDM2KSI7CiAgICByZWZlcmVuY2UgICIzR1BQIFRTIDMyLjMwMCI7CiAgfQoKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsKICAgICAgcmFuZ2UgIi0yNCB8IC0yMiB8IC0yMCB8IC0xOCB8IC0xNiB8IC0xNCB8IC0xMiB8IC0xMCB8IC04IHwgLTYgfCAiICsKICAgICAgICAiIC01IHwgLTQgfCAtMyB8IC0yIHwgLTEgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgOCB8IDEwIHwgIiArCiAgICAgICAgIiAxMiB8IDE0IHwgMTYgfCAxOCB8IDIwIHwgMjIgfCAyNCI7CiAgICB9CiAgICB1bml0cyBkQjsKICB9CgogIGdyb3VwaW5nIFJlcG9ydGluZ0N0cmwgewogICAgY2hvaWNlIHJlcG9ydGluZ0N0cmwgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIgogICAgICAgIFRoaXMgY2hvaWNlIGRlZmluZXMgdGhlIG1ldGhvZCBmb3IgcmVwb3J0aW5nIGNvbGxlY3RlZCBwZXJmb3JtYW5jZQogICAgICAgIG1ldHJpY3MgdG8gTW5TIGNvbnN1bWVycyBhcyB3ZWxsIGFzIHRoZSBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmluZyB0aGUKICAgICAgICByZXBvcnRpbmcgZnVuY3Rpb24uIEl0IGlzIGEgY2hvaWNlIGJldHdlZW4gdGhlIGNvbnRyb2wgcGFyYW1ldGVyCiAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnRpbmcgbWV0aG9kcywgd2hvc2UgcHJlc2VuY2Ugc2VsZWN0cyB0aGUKICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGFzIGZvbGxvd3M6CgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TCiAgICAgICAgcHJvZHVjZXIgc2hhbGwgc3RvcmUgZmlsZXMgb24gdGhlIE1uUyBwcm9kdWNlciBhdCBhIGxvY2F0aW9uIHNlbGVjdGVkCiAgICAgICAgYnkgdGhlIE1uUyBwcm9kdWNlciBhbmQsIG9uIGNvbmRpdGlvbiB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YnNjcmlwdGlvbgogICAgICAgIGlzIGluIHBsYWNlLCBpbmZvcm0gdGhlIE1uUyBjb25zdW1lciBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIG5ldwogICAgICAgIGZpbGVzIGFuZCB0aGUgZmlsZSBsb2NhdGlvbiB1c2luZyB0aGUgbm90aWZ5RmlsZVJlYWR5IG5vdGlmaWNhdGlvbi4KICAgICAgICBJbiBjYXNlIHRoZSBwcmVwYXJhdGlvbiBvZiBhIGZpbGUgZmFpbHMsICdub3RpZnlGaWxlUHJlcGFyYXRpb25FcnJvcicKICAgICAgICBzaGFsbCBiZSBzZW50IGluc3RlYWQuCgogICAgICAgIC0gV2hlbiB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGFuZCAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycKICAgICAgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LCB0aGVuIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgYmVoYXZlIGxpa2UKICAgICAgICBkZXNjcmliZWQgZm9yIHRoZSBjYXNlIHRoYXQgb25seSB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGlzIHByZXNlbnQuCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgY3JlYXRlIG9uIGJlaGFsZiBvZiB0aGUgTW5TCiAgICAgICAgY29uc3VtZXIgYSBzdWJzY3JpcHRpb24sIHVzaW5nICdOdGZTdWJzY3JpcHRpb25Db250cm9sJywgZm9yIHRoZQogICAgICAgIG5vdGlmaWNhdGlvbiB0eXBlcyAnbm90aWZ5TU9JQ3JlYXRpb24nIGFuZCAnbm90aWZ5TU9JRGVsZXRpb24nIHJlbGF0ZWQKICAgICAgICB0byB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgbGF0ZXIuIEluIGNhc2UgYW4gZXhpc3RpbmcKICAgICAgICBzdWJzY3JpcHRpb24gZG9lcyBhbHJlYWR5IGluY2x1ZGUgdGhlICdGaWxlJyBpbnN0YW5jZXMgdG8gYmUgcHJvZHVjZWQsCiAgICAgICAgbm8gbmV3IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBjcmVhdGVkLiBUaGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgYXR0cmlidXRlIGluIHRoZSBjcmVhdGVkCiAgICAgICAgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIHNoYWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgJ25vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MnIGluIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJy4gVGhpcwogICAgICAgIGZlYXR1cmUgaXMgY2FsbGVkIGltcGxpY2l0IG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24sIGFzIG9wcG9zZWQgdG8gdGhlCiAgICAgICAgY2FzZSB3aGVyZSB0aGUgTW5TIGNvbnN1bWVyIGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiAoZXhwbGljaXQKICAgICAgICBub3RpZmljYXRpb24gc3Vic2NyaXB0aW9uKS4gV2hlbiB0aGUgcmVsYXRlZCAnUGVyZk1ldHJpY0pvYicgaXMKICAgICAgICBkZWxldGVkLCB0aGUgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIGNyZWF0ZWQgZHVlIHRvIHRoZQogICAgICAgIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBkZWxldGVkIGFzIHdlbGwuCgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGFuZCBmaWxlTG9jYXRpb24gYXR0cmlidXRlcyBhcmUKICAgICAgICBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyIHNoYWxsIHN0b3JlIHRoZSBmaWxlcyBvbiBhIE1uUyBjb25zdW1lciwgdGhhdAogICAgICAgIGNhbiBiZSBhbnkgZW50aXR5IHN1Y2ggYXMgYSBmaWxlIHNlcnZlciwgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQogICAgICAgIGZpbGVMb2NhdGlvbi4gTm8gbm90aWZpY2F0aW9uIGlzIGVtaXR0ZWQgYnkgdGhlIE1uUyBwcm9kdWNlci4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIHN0cmVhbVRhcmdldCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIE1uUyBwcm9kdWNlcgogICAgICAgIHNoYWxsIHN0cmVhbSB0aGUgZGF0YSB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHN0cmVhbVRhcmdldC4KCiAgICAgICAgRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2RzIHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZQogICAgICAgIHNwZWNpZmllcyB0aGUgdGltZSB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlCiAgICAgICAgc3RvcmVkIGludG8gdGhlIHNhbWUgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzCiAgICAgICAgb3BlbmVkLiI7CgogICAgICBjYXNlIGZpbGUtYmFzZWQtcmVwb3J0aW5nIHsKICAgICAgICBsZWFmIGZpbGVSZXBvcnRpbmdQZXJpb2QgewogICAgICAgICAgdHlwZSB1aW50MzIgewogICAgICAgICAgICByYW5nZSAxLi5tYXg7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyBtaW51dGVzOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgdGhpcyBpcyB0aGUgdGltZQogICAgICAgICAgICB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCBpbnRvIHRoZSBzYW1lCiAgICAgICAgICAgIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBvcGVuZWQuCiAgICAgICAgICAgIFRoZSB0aW1lLXBlcmlvZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGdyYW51bGFyaXR5UGVyaW9kLgoKICAgICAgICAgICAgQXBwbGljYWJsZSB3aGVuIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICAgIGNob2ljZSByZXBvcnRpbmctdGFyZ2V0IHsKICAgICAgICAgIGNhc2UgZmlsZS10YXJnZXQgewogICAgICAgICAgICBsZWFmIGZpbGVMb2NhdGlvbiB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFwcGxpY2FibGUgYW5kIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBmaWxlLWJhc2VkCiAgICAgICAgICAgICAgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZXMgYXJlIHN0b3JlZCBvbiB0aGUgTW5TCiAgICAgICAgICAgICAgY29uc3VtZXIuIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY2FzZSBub3RpZmljYXRpb24tdGFyZ2V0IHsKICAgICAgICAgICAgbGVhZiBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNdXN0IGJlIHByZXNlbnQgd2hlbiB0aGUgbm90aWZpY2F0aW9uLWJhc2VkIHJlcG9ydGluZwogICAgICAgICAgICAgIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgdGhlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMKICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgTW5TIGNvbnN1bWVyIHRvIHN1YnNjcmliZSB0by4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gIldoZW4gbmV0aWhlciBmaWxlTG9jYXRpb24gb3Igbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcwogICAgICAgICAgYXJlIHByZXNlbnQsIHRoZSBmaWxlcyBhcmUgc3RvcmVkIGFuZCBhdmFpbGFibGUgdG8gdGhlIE1uUyBjb25zdW1lcgogICAgICAgICAgaWYgdGhlIE1uUyBzdWJzY3JpYmVzIHRvIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLiI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXNlIHN0cmVhbS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgc3RyZWFtVGFyZ2V0IHsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSB3aGVuIHN0cmVhbS1iYXNlZCByZXBvcnRpbmcgbWV0aG9kIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=
+ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjppZXRmOnBhcmFtczp4bWw6bnM6eWFuZzppZXRmLWdlby1sb2NhdGlvbiI7CiAgICBwcmVmaXggZ2VvOwogICAgaW1wb3J0IGlldGYteWFuZy10eXBlcyB7CiAgICBwcmVmaXggeWFuZzsKICAgIHJlZmVyZW5jZSAiUkZDIDY5OTE6IENvbW1vbiBZQU5HIERhdGEgVHlwZXMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogICAgY29udGFjdAogICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICAgIDxtYWlsdG86Y2hvcHBzQGNob3Bwcy5vcmc+IjsKCiAgICBkZXNjcmlwdGlvbgogICAgIlRoaXMgbW9kdWxlIGRlZmluZXMgYSBncm91cGluZyBvZiBhIGNvbnRhaW5lciBvYmplY3QgZm9yCiAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAnZWFydGgnKS4KCiAgICBUaGUga2V5IHdvcmRzICdNVVNUJywgJ01VU1QgTk9UJywgJ1JFUVVJUkVEJywgJ1NIQUxMJywgJ1NIQUxMCiAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICdNQVknLCBhbmQgJ09QVElPTkFMJyBpbiB0aGlzIGRvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcwogICAgZGVzY3JpYmVkIGluIEJDUCAxNCAoUkZDIDIxMTkpIChSRkMgODE3NCkgd2hlbiwgYW5kIG9ubHkgd2hlbiwKICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjIgSUVURiBUcnVzdCBhbmQgdGhlIHBlcnNvbnMgaWRlbnRpZmllZCBhcwogICAgYXV0aG9ycyBvZiB0aGUgY29kZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGlzIHBlcm1pdHRlZCBwdXJzdWFudCB0bywKICAgIGFuZCBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIHRlcm1zIGNvbnRhaW5lZCBpbiwgdGhlCiAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgIElFVEYgVHJ1c3QncyBMZWdhbCBQcm92aXNpb25zIFJlbGF0aW5nIHRvIElFVEYgRG9jdW1lbnRzCiAgICAoaHR0cHM6Ly90cnVzdGVlLmlldGYub3JnL2xpY2Vuc2UtaW5mbykuCgogICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2luZm8vcmZjOTE3OSk7IHNlZSB0aGUgUkZDIGl0c2VsZgogICAgZm9yIGZ1bGwgbGVnYWwgbm90aWNlcy4iOwoKICAgIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiSW5pdGlhbCBSZXZpc2lvbiI7CiAgICByZWZlcmVuY2UKICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIGZlYXR1cmUgYWx0ZXJuYXRlLXN5c3RlbXMgewogICAgZGVzY3JpcHRpb24KICAgICAgICAiVGhpcyBmZWF0dXJlIG1lYW5zIHRoZSBkZXZpY2Ugc3VwcG9ydHMgc3BlY2lmeWluZyBsb2NhdGlvbnMKICAgICAgICB1c2luZyBhbHRlcm5hdGUgc3lzdGVtcyBmb3IgcmVmZXJlbmNlIGZyYW1lcy4iOwogICAgfQoKICAgIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAgICJHcm91cGluZyB0byBpZGVudGlmeSBhIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBvYmplY3QuIjsKCiAgICBjb250YWluZXIgZ2VvLWxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICJBIGxvY2F0aW9uIG9uIGFuIGFzdHJvbm9taWNhbCBib2R5IChlLmcuLCAnZWFydGgnKQogICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICAgIGNvbnRhaW5lciByZWZlcmVuY2UtZnJhbWUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgRnJhbWUgb2YgUmVmZXJlbmNlIGZvciB0aGUgbG9jYXRpb24gdmFsdWVzLiI7CgogICAgICAgIGxlYWYgYWx0ZXJuYXRlLXN5c3RlbSB7CiAgICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgc3lzdGVtIGluIHdoaWNoIHRoZSBhc3Ryb25vbWljYWwgYm9keSBhbmQKICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICBwcmVzZW50IGFuZCB0aGUgc3lzdGVtIGlzIHRoZSBuYXR1cmFsIHVuaXZlcnNlOyBob3dldmVyLAogICAgICAgICAgICB3aGVuIHByZXNlbnQsIHRoaXMgdmFsdWUgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgIG1vZGlmaWVzIHRoZSBkZWZpbml0aW9uIChidXQgbm90IHRoZSB0eXBlKSBvZiB0aGUgb3RoZXIKICAgICAgICAgICAgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUuIjsKICAgICAgICB9CiAgICAgICAgbGVhZiBhc3Ryb25vbWljYWwtYm9keSB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQgImVhcnRoIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgIEFzdHJvbm9taWNhbCBVbmlvbiAoSUFVKSBvciBhY2NvcmRpbmcgdG8gdGhlIGFsdGVybmF0ZQogICAgICAgICAgICBzeXN0ZW0gaWYgc3BlY2lmaWVkLiAgRXhhbXBsZXMgaW5jbHVkZSAnc3VuJyAob3VyIHN0YXIpLAogICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgIG1vb24gb2YgU2F0dXJuKSwgJ2NlcmVzJyAoYW4gYXN0ZXJvaWQpLCBhbmQKICAgICAgICAgICAgJzY3cC9jaHVyeXVtb3YtZ2VyYXNpbWVua28gKGEgY29tZXQpLiAgVGhlIEFTQ0lJIHZhbHVlCiAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgaW5jbHVkZSBjb250cm9sIGNoYXJhY3RlcnMgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZAogICAgICAgICAgICA5MS4uMTI2KS4gIEFueSBwcmVjZWRpbmcgJ3RoZScgaW4gdGhlIG5hbWUgU0hPVUxEIE5PVCBiZQogICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmlhdS5vcmcvIjsKICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIGdlb2RldGljLXN5c3RlbSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgZ2VvZGV0aWMgc3lzdGVtIG9mIHRoZSBsb2NhdGlvbiBkYXRhLiI7CiAgICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuICdbIC1AXFstXF5fLX5dKic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJBIGdlb2RldGljLWRhdHVtIGRlZmluaW5nIHRoZSBtZWFuaW5nIG9mIGxhdGl0dWRlLAogICAgICAgICAgICAgICAgbG9uZ2l0dWRlLCBhbmQgaGVpZ2h0LiAgVGhlIGRlZmF1bHQgd2hlbiB0aGUKICAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBHbG9iYWwgUG9zaXRpb25pbmcgU3lzdGVtIChHUFMpLiAgVGhlCiAgICAgICAgICAgICAgICBBU0NJSSB2YWx1ZSBTSE9VTEQgaGF2ZSB1cHBlcmNhc2UgY29udmVydGVkIHRvCiAgICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgKGkuZS4sIHZhbHVlcyAzMi4uNjQsIGFuZCA5MS4uMTI2KS4gIFRoZSBJQU5BIHJlZ2lzdHJ5CiAgICAgICAgICAgICAgICBmdXJ0aGVyIHJlc3RyaWN0cyB0aGUgdmFsdWUgYnkgY29udmVydGluZyBhbGwgc3BhY2VzCiAgICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGdlb2RldGljLWRhdHVtIGluZGljYXRlcwogICAgICAgICAgICAgICAgaG93IGFjY3VyYXRlbHkgaXQgbW9kZWxzIHRoZSBhc3Ryb25vbWljYWwgYm9keSBpbgogICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgIGxhdGl0dWRlL2xvbmdpdHVkZSBjb29yZGluYXRlcyBhbmQgZm9yIGhlaWdodAogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuIjsKICAgICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMsCiAgICAgICAgICAgICAgICBTZWN0aW9uIDYuMSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBsYXRpdHVkZS9sb25naXR1ZGUgcGFpciBmb3IKICAgICAgICAgICAgICAgIGVsbGlwc29pZGFsIGNvb3JkaW5hdGVzLCBvciB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cwogICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgaXQgaW5kaWNhdGVzIGhvdyBwcmVjaXNlbHkgdGhlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgICAgICBpbiB0aGUgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4KICAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICAgZGVmaW5lZCBieSB0aGUgZ2VvZGV0aWMtZGF0dW0uICBGb3IgZXhhbXBsZSwgdGhlcmUKICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgICBsb2NhdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0LWFjY3VyYWN5IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgICBjb29yZGluYXRlczsgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCB3aXRoIENhcnRlc2lhbgogICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuICBXaGVuIGhlaWdodC1hY2N1cmFjeSBpcyBzcGVjaWZpZWQsIGl0CiAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuIGRldGVybWluZWQKICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gZGVmaW5lZCBieSB0aGUKICAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgICB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBtZWFzdXJlbWVudCB3YXMgbWFkZSB0byBkZXRlcm1pbmUgZWFjaAogICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxvY2F0aW9uIGRhdGEgZWl0aGVyIGluIGxhdGl0dWRlL2xvbmdpdHVkZSBvcgogICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBhbmQgcHJlY2lzaW9uIG9mIHRoaXMgbWVhc3VyZW1lbnQgaXMKICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgImRlY2ltYWwgZGVncmVlcyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiVGhlIGxvbmdpdHVkZSB2YWx1ZSBvbiB0aGUgYXN0cm9ub21pY2FsIGJvZHkuICBUaGUKICAgICAgICAgICAgICAgIGRlZmluaXRpb24gYW5kIHByZWNpc2lvbiBvZiB0aGlzIG1lYXN1cmVtZW50IGlzCiAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlYWYgaGVpZ2h0IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4gIFRoZSBwcmVjaXNpb24gYW5kCiAgICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FzZSBjYXJ0ZXNpYW4gewogICAgICAgICAgICBsZWFmIHggewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWCB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWFmIHogewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiSWYgdGhlIG9iamVjdCBpcyBpbiBtb3Rpb24sIHRoZSB2ZWxvY2l0eSB2ZWN0b3IgZGVzY3JpYmVzCiAgICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgICBmb3JtdWxhIHRvIGNvbnZlcnQgdGhlc2UgdmFsdWVzIHRvIHNwZWVkIGFuZCBoZWFkaW5nLCBzZWUKICAgICAgICAgICAgUkZDIDkxNzkuIjsKICAgICAgICByZWZlcmVuY2UKICAgICAgICAgICAgIlJGQyA5MTc5OiBBIFlBTkcgR3JvdXBpbmcgZm9yIEdlb2dyYXBoaWMgTG9jYXRpb25zIjsKCiAgICAgICAgbGVhZiB2LW5vcnRoIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICB0cnVlIG5vcnRoIGFzIGRlZmluZWQgYnkgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LWVhc3QgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi1lYXN0IGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIHBlcnBlbmRpY3VsYXIKICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgZ2VvZGV0aWMtc3lzdGVtLiI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHYtdXAgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAidi11cCBpcyB0aGUgcmF0ZSBvZiBjaGFuZ2UgKGkuZS4sIHNwZWVkKSBhd2F5IGZyb20gdGhlCiAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZWFmIHRpbWVzdGFtcCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgICAgfQogICAgICAgIGxlYWYgdmFsaWQtdW50aWwgewogICAgICAgIHR5cGUgeWFuZzpkYXRlLWFuZC10aW1lOwogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICAgSWYgdW5zcGVjaWZpZWQsIHRoZSBnZW8tbG9jYXRpb24gaGFzIG5vIHNwZWNpZmljCiAgICAgICAgICAgIGV4cGlyYXRpb24gdGltZS4iOwogICAgICAgIH0KICAgIH0KICAgIH0KfQo=
+o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIkVyaWNzc29uIEFCIjsKICAgIGNvbnRhY3QgIkVyaWNzc29uIGZpcnN0IGxpbmUgc3VwcG9ydCB2aWEgZW1haWwiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyBleHRlbnNpb25zIHRvIHRoZSBZQU5HIGxhbmd1YWdlIHRoYXQgdG9wb2xvZ3kgYW5kCiAgICBpbnZlbnRvcnkgbW9kZWxzIHdpbGwgdXNlIHRvIGRlZmluZSBhbmQgYW5ub3RhdGUgdHlwZXMgYW5kIHJlbGF0aW9uc2hpcHMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIGV4dGVuc2lvbiBiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIGEgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGluIHRoZSB0b3BvbG9neS4KCiAgICAgICAgICAgIEEgYmktZGlyZWN0aW9uYWwtYXNzb2NpYXRpb24gKEJEQSkgaXMgYSByZWxhdGlvbnNoaXAgY29tcHJpc2luZyBvZgogICAgICAgICAgICBhbiBBLXNpZGUgYW5kIGEgQi1zaWRlLiBUaGUgQS1zaWRlIGlzIGNvbnNpZGVyZWQgdGhlIG9yaWdpbmF0aW5nCiAgICAgICAgICAgIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcDsgdGhlIEItc2lkZSBpcyBjb25zaWRlcmVkIHRoZSB0ZXJtaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBvcmRlciBvZiBBLXNpZGUgYW5kIEItc2lkZSBpcyBvZgogICAgICAgICAgICBpbXBvcnRhbmNlIGFuZCBNVVNUIE5PVCBiZSBjaGFuZ2VkIG9uY2UgZGVmaW5lZC4KCiAgICAgICAgICAgIEJvdGggQS1zaWRlIGFuZCBCLXNpZGUgYXJlIGRlZmluZWQgb24gYSB0eXBlLCBhbmQgYXJlIGdpdmVuIGEgcm9sZS4KICAgICAgICAgICAgQSB0eXBlIG1heSBoYXZlIG11bHRpcGxlIG9yaWdpbmF0aW5nIGFuZC9vciB0ZXJtaW5hdGluZyBzaWRlcyBvZiBhCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCwgYWxsIGRpc3Rpbmd1aXNoZWQgYnkgcm9sZSBuYW1lLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlICdtb2R1bGUnIHN0YXRlbWVudC4KICAgICAgICAgICAgTXVsdGlwbGUgJ2JpLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50cyBhcmUKICAgICAgICAgICAgYWxsb3dlZCBwZXIgcGFyZW50IHN0YXRlbWVudC4KCiAgICAgICAgICAgIFN1YnN0YXRlbWVudHMgdG8gdGhlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIGRlZmluZQogICAgICAgICAgICB0aGUgQS1zaWRlIGFuZCB0aGUgQi1zaWRlLCByZXNwZWN0aXZlbHksIGFuZCBvcHRpb25hbGx5IHByb3BlcnRpZXMKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcC4gRGF0YSBub2RlcyBvZiB0eXBlcyAnbGVhZicgYW5kICdsZWFmLWxpc3QnIGFyZQogICAgICAgICAgICB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIE9uZSBvZiB0aGUgZGF0YSBub2RlcyBNVVNUIGJlIGFubm90YXRlZCB3aXRoCiAgICAgICAgICAgIHRoZSAnYS1zaWRlJyBleHRlbnNpb247IGFub3RoZXIgZGF0YSBub2RlIE1VU1QgYmUgYW5ub3RhdGVkIHdpdGggdGhlCiAgICAgICAgICAgICdiLXNpZGUnIGV4dGVuc2lvbi4gT3RoZXIgZGF0YSBub2RlcyBkZWZpbmUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSByZWxhdGlvbnNoaXAgbmFtZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVjbGFyaW5nIG1vZHVsZSBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4iOwoKICAgICAgICBhcmd1bWVudCByZWxhdGlvbnNoaXBOYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBhU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEEtc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEEtc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQS1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBhU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGJTaWRlIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyB0aGUgQi1zaWRlIG9mIGEgcmVsYXRpb25zaGlwLgoKICAgICAgICAgICAgVGhlIHN0YXRlbWVudCBNVVNUIG9ubHkgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgYSAnbGVhZicgb3IgJ2xlYWYtbGlzdCcKICAgICAgICAgICAgc3RhdGVtZW50LCB3aGljaCBpdHNlbGYgbXVzdCBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUKICAgICAgICAgICAgJ3VuaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudC4KCiAgICAgICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgTVVTVCBiZQogICAgICAgICAgICAnaW5zdGFuY2UtaWRlbnRpZmllcicuIENvbnN0cmFpbnRzIE1BWSBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHBhcmVudAogICAgICAgICAgICAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgdG8gZW5mb3JjZSBjYXJkaW5hbGl0eS4KCiAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGlzIHVzZWQgYXMgbmFtZQogICAgICAgICAgICBvZiB0aGUgcm9sZSBvZiB0aGUgQi1zaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBuYW1lIG9mIHRoZSByb2xlCiAgICAgICAgICAgIGlzIHNjb3BlZCB0byB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIGlzIGRlZmluZWQgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuCgogICAgICAgICAgICBXaGlsZSB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBkb2VzIG5vdCByZXN1bHQgaW4gYSBwcm9wZXJ0eQogICAgICAgICAgICBvZiB0aGUgcmVsYXRpb25zaGlwLCBpdCBpcyBSRUNPTU1FTkRFRCB0byBhdm9pZCB1c2luZyB0aGUgbmFtZSBvZiBhbgogICAgICAgICAgICBleGlzdGluZyB0eXBlIHByb3BlcnR5IGFzIHJvbGUgbmFtZSB0byBhdm9pZCBwb3RlbnRpYWwgYW1iaWd1aXRpZXMKICAgICAgICAgICAgYmV0d2VlbiBwcm9wZXJ0aWVzIG9mIGEgdHlwZSwgYW5kIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG9uIHRoZQogICAgICAgICAgICB0eXBlLgoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBCLXNpZGUgcmVzaWRlcy4KICAgICAgICAgICAgSWYgdGhlIHR5cGUgaXMgZGVjbGFyZWQgaW4gYW5vdGhlciBtb2R1bGUsIHRoZSB0eXBlIG11c3QgYmUKICAgICAgICAgICAgcHJlZml4ZWQsIGFuZCBhIGNvcnJlc3BvbmRpbmcgJ2ltcG9ydCcgc3RhdGVtZW50IGJlIHVzZWQgdG8gZGVjbGFyZQogICAgICAgICAgICB0aGUgcHJlZml4LiI7CgogICAgICAgIGFyZ3VtZW50IGJTaWRlVHlwZTsKICAgIH0KCiAgICBleHRlbnNpb24gZG9tYWluIHsKICAgICAgICBkZXNjcmlwdGlvbiAiS2V5d29yZCB1c2VkIHRvIGNhcnJ5IGRvbWFpbiBpbmZvcm1hdGlvbi4iOwogICAgICAgIGFyZ3VtZW50IGRvbWFpbk5hbWU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGxhYmVsIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhlIGxhYmVsIGNhbiBiZSB1c2VkIHRvIGdpdmUgbW9kdWxlcyBhbmQgc3VibW9kdWxlcyBhIHNlbWFudGljCiAgICAgICAgICAgIHZlcnNpb24sIGluIGFkZGl0aW9uIHRvIHRoZWlyIHJldmlzaW9uLgoKICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgbGFiZWwgaXMg4oCYeC55LnrigJkg4oCTIGV4cHJlc3NlZCBhcyBwYXR0ZXJuLCBpdCBpcwogICAgICAgICAgICBbMC05XStcXC5bMC05XStcXC5bMC05XSsKCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSByZXZpc2lvbiBzdGF0ZW1lbnQuCiAgICAgICAgICAgIFplcm8gb3Igb25lIHJldmlzaW9uIGxhYmVsIHN0YXRlbWVudHMgcGVyIHBhcmVudCBzdGF0ZW1lbnQgYXJlCiAgICAgICAgICAgIGFsbG93ZWQuCgogICAgICAgICAgICBSZXZpc2lvbiBsYWJlbHMgTVVTVCBiZSB1bmlxdWUgYW1vbmdzdCBhbGwgcmV2aXNpb25zIG9mIGEgbW9kdWxlIG9yCiAgICAgICAgICAgIHN1Ym1vZHVsZS4iOwoKICAgICAgICBhcmd1bWVudCBzZW12ZXJzaW9uOwogICAgfQp9
+o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogICAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuCiAgICAgICAgICAgIEFsbCB0eXBlcyBNVVNUIHVzZSB0aGlzIGdyb3VwaW5nLiI7CgogICAgICAgIGxlYWYgaWQgewogICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRvcG9sb2d5IGVudGl0aWVzLiBSZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgRW50aXR5IEluc3RhbmNlIElkZW50aWZpZXIuIjsKICAgICAgICB9CiAgICB9CgogICAgY29udGFpbmVyIGRlY29yYXRvcnMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IGZvciBhcHBsaWNhdGlvbnMgd2lzaGluZwogICAgICAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGRlY29yYXRvcnMuIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleQogICAgICAgICAgICBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZQogICAgICAgICAgICBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcgZW50aXRpZXMuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwoKICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICBvcmRlcmVkLWJ5IHVzZXI7CiAgICB9CgogICAgY29udGFpbmVyIG1ldGFkYXRhIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgbWV0YWRhdGEuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGlkZW50aXR5IGNsYXNzaWZpZXJ7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBjbGFzc2lmaWVyIGlzIHVzZWQgYXMgYSBiYXNlIHRvIHByb3ZpZGUgYWxsIGNsYXNzaWZpZXJzCiAgICAgICAgICAgIHdpdGggaWRlbnRpdHkuICI7CiAgICB9Cn0=
+o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgRXF1aXBtZW50CiAgICBkb21haW4sIHdoaWNoIGlzIG1vZGVsbGVkIHRvIHVuZGVyc3RhbmQgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGVxdWlwbWVudAogICAgc3VjaCBhcyBhbnRlbm5hcyBhc3NvY2lhdGVkIHdpdGggYSBjZWxsL2NhcnJpZXIgYW5kIHRoZWlyIHJlbGV2YW50CiAgICBwcm9wZXJ0aWVzIGUuZy4gdGlsdCwgbWF4IHBvd2VyIGV0Yy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBFUVVJUE1FTlQ7CgogICAgbGlzdCBBbnRlbm5hTW9kdWxlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gQW50ZW5uYSBNb2R1bGUgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgYXNwZWN0IG9mIGFuCiAgICAgICAgICAgIGFudGVubmEuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhbnRlbm5hTW9kZWxOdW1iZXIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlZlbmRvci1zcGVjaWZpYyBhbnRlbm5hIG1vZGVsIGlkZW50aWZpZXIuIFRoaXMKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQgd2hlcmUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHVuaXQgaXMgaW5zdGFsbGVkLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLCBkZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGluY2xpbmF0aW9uIG9mIHRoZSBhbnRlbm5hIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBwbGFuZS4gSXQgaXMgYSBzaWduZWQgdmFsdWUuIFBvc2l0aXZlIGluZGljYXRlcwogICAgICAgICAgICAgICAgICAgIGRvd250aWx0LCBhbmQgbmVnYXRpdmUgaW5kaWNhdGVzIHVwdGlsdC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBwb3NpdGlvbldpdGhpblNlY3RvciB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSB1bml0IHBvc2l0aW9uIHdpdGhpbiBzZWN0b3IuIFRoaXMgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgaXMgcGFydCBvZiBBSVNHIHYzIEFEQiBTdGFuZGFyZCBhbmQgaGFzIG5vIG9wZXJhdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgdGlsdCBhbmQgdGhlIHRpbHQgYXBwbGllZCBieSB0aGUgUmVtb3RlIEVsZWN0cmljYWwKICAgICAgICAgICAgICAgICAgICBUaWx0IChSRVQpLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGVsZWN0cmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRWxlY3RyaWNhbGx5LWNvbnRyb2xsZWQgdGlsdCBvZiBtYWluIGJlYW0gbWF4aW11bQogICAgICAgICAgICAgICAgICAgIHdpdGggcmVzcGVjdCB0byBkaXJlY3Rpb24gb3J0aG9nb25hbCB0byBhbnRlbm5hIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7IHRpbHQgZG93biBpcwogICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLCB0aWx0IHVwIGlzIG5lZ2F0aXZlLiI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hCiAgICAgICAgICAgICAgICAgICAgcmFkaWF0aW9uIHBhdHRlcm4gaW4gdGhlIGhvcml6b250YWwgcGxhbmUuIE1lYXN1cmVkIGluCiAgICAgICAgICAgICAgICAgICAgZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9Cn0=
+o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiRXJpY3Nzb24gQUIiOwogICAgY29udGFjdCAiRXJpY3Nzb24gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKGMpIDIwMjQgRXJpY3Nzb24gQUIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUgUkFOIGRvbWFpbiwKICAgIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eSBvZiB0aGUgZGVwbG95ZWQgUkFOIHRoYXQgYXJlCiAgICByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgR05CRFVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLgoKICAgICAgICAgICAgQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ2VudHJhbGl6ZWQgVW5pdCAoZ05CLUNVKSBhbmQgYSBnTkItRFUuCiAgICAgICAgICAgIFRoZSBDVSBwcm9jZXNzZXMgbm9uLXJlYWwgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVCiAgICAgICAgICAgIHByb2Nlc3NlcyBQSFkgbGV2ZWwgcHJvdG9jb2wgYW5kIHJlYWwgdGltZSBzZXJ2aWNlcy4gVGhlIGdOQi1DVSBhbmQKICAgICAgICAgICAgdGhlIGdOQi1EVSB1bml0cyBhcmUgY29ubmVjdGVkIHZpYSBGMSBsb2dpY2FsIGludGVyZmFjZS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBmb3IgYSBnTkItRFU6CiAgICAgICAgICAgIElzIGNvbm5lY3RlZCB0byB0aGUgZ05CLUNVLUNQIHRocm91Z2ggdGhlIEYxLUMgaW50ZXJmYWNlLiBJcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1VUCB0aHJvdWdoIHRoZSBGMS1VIGludGVyZmFjZS4gT25lIGdOQi1EVSBpcwogICAgICAgICAgICBjb25uZWN0ZWQgdG8gb25seSBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgbXVsdGlwbGUgZ05CLUNVLVVQcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2FtZSBnTkItQ1UtQ1AuCgogICAgICAgICAgICBOb3RlOiBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DVS1DUCwgbXVsdGlwbGUgZ05CLUNVLVVQcyBhbmQKICAgICAgICAgICAgbXVsdGlwbGUgZ05CLURVcy4gZ05CLURVIGlzIGEgY29uY3JldGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4KICAgICAgICAgICAgbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UgY2FuIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlCiAgICAgICAgICAgIHRoZSBnTkItRFUgb2JqZWN0LiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGNvbnRhaW5lciBkVXBMTU5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUExNTiBpZGVudGlmaWVyIHVzZWQgYXMgcGFydCBvZiBQTSBFdmVudHMgZGF0YSI7CiAgICAgICAgICAgICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CRFVJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBEVSB3aXRoaW4gYSBnTm9kZUIiOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQ2NDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZExlbmd0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVuZ3RoIG9mIGdOQklkIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEVOb2RlQkZ1bmN0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQW4gRXZvbHZlZCBOb2RlIEIgKGVOb2RlQikgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IG5vZGUgaW4KICAgICAgICAgICAgdGhlIHJhZGlvIGFjY2VzcyBuZXR3b3JrIChSQU4pIG9mIExvbmctVGVybSBFdm9sdXRpb24gKExURSkuIFRoZQogICAgICAgICAgICBlTm9kZUIgaXMgYSBjb21wbGV4IGJhc2Ugc3RhdGlvbiB0aGF0IGhhbmRsZXMgcmFkaW8gY29tbXVuaWNhdGlvbnMKICAgICAgICAgICAgaW4gdGhlIGNlbGwgYW5kIGNhcnJpZXMgb3V0IHJhZGlvIHJlc291cmNlIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyCiAgICAgICAgICAgIGRlY2lzaW9ucy4gVW5saWtlIDIvM0cgd2lyZWxlc3MgUkFOLCB0aGVyZSBpcyBubyBjZW50cmFsaXplZCByYWRpbwogICAgICAgICAgICBuZXR3b3JrIGNvbnRyb2xsZXIgaW4gTFRFLiBJdCBpcyB0aGUgaGFyZHdhcmUgdGhhdCBpcyBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzIGRpcmVjdGx5IHdpdGggbW9iaWxlCiAgICAgICAgICAgIGhhbmRzZXRzIChVc2VyIEVxdWlwbWVudCksIGxpa2UgYSBiYXNlIHRyYW5zY2VpdmVyIHN0YXRpb24gKEJUUykgaW4KICAgICAgICAgICAgR1NNIG5ldHdvcmtzLiBUaGlzIHNpbXBsaWZpZXMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIGxvd2VyCiAgICAgICAgICAgIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBDZWxsIEdsb2JhbAogICAgICAgICAgICAgICAgICAgIElkZW50aXR5LCBhbmQgaXMgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIgdGhlIFMxCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBlTm9kZUJQbG1uSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgUHVibGljIExhbmQgTW9iaWxlIE5ldHdvcmsgKFBMTU4pIElECiAgICAgICAgICAgICAgICAgICAgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIgR2xvYmFsIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgbm9kZSBvdmVyIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIChNQ0M9MDAxLCBNTkM9MDEpIGluZGljYXRlcyB0aGF0IHRoZSBQTE1OIGlzIG5vdCBpbml0aWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGNhbiBub3QgYmUgdXNlZCBhcyBhIHZhbGlkIFBMTU4gSWRlbnRpdHkuIjsKCiAgICAgICAgICAgICAgICBsZWFmIG1jYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNQ0MgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5IHVzZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMC4uOTk5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlYWYgbW5jTGVuZ3RoIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGxlbmd0aCBvZiB0aGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhlIHJhZGlvIG5ldHdvcmsuIjsKICAgICAgICAgICAgICAgICAgICB0eXBlIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgMi4uMzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBMVEVTZWN0b3JDYXJyaWVyIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIExURSBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMgdGhlIGF0dHJpYnV0ZXMgZm9yCiAgICAgICAgICAgIGRlZmluaW5nIHRoZSBsb2dpY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEKICAgICAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZCB3aXRoIGEgYmFzZSBzdGF0aW9uCiAgICAgICAgICAgIGhhdmluZyBpdHMgb3duIGFudGVubmFzLCByYWRpbyBwb3J0cywgYW5kIGNvbnRyb2wgY2hhbm5lbHMuIFRoZQogICAgICAgICAgICBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwgaW50ZXJmZXJlbmNlCiAgICAgICAgICAgIGluIGNlbGx1bGFyIHN5c3RlbXMsIGFuZCBtb3N0IHdpcmVsZXNzIHN5c3RlbXMgdXNlIHRocmVlIHNlY3RvcgogICAgICAgICAgICBjZWxscy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIHNlY3RvckNhcnJpZXJUeXBlIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNlY3RvciBjYXJyaWVyCiAgICAgICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1pZGRsZSBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBBbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoaXMgTU8gc2VydmVzIGFzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBjZWxsIGFuZCB0aGUgUkJTCiAgICAgICAgICAgIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UgaW4gYSBjZXJ0YWluIGdlb2dyYXBoaWNhbCBhcmVhLgogICAgICAgICAgICBUaGUgTU8gYWxzbyBjb250cm9scyB0aGUgbWF4aW11bSBvdXRwdXQgcG93ZXIgb2YgdGhlIHNlY3Rvci4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmLWxpc3QgZVV0cmFuRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBMVEUgZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgZ2VyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcyB0aGF0IGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IG5SRnFCYW5kcyB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBOUiBmcmVxdWVuY3kgYmFuZHMgYXNzb2NpYXRlZCBoYXJkd2FyZQogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5PREVCRlVOQ1RJT05fUFJPVklERVNfTFRFU0VDVE9SQ0FSUklFUiB7IC8vIDEgdG8gMC4ubgoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHByb3ZpZGVkLWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiZU5vZGVCIEZ1bmN0aW9uIHByb3ZpZGVzIExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRU5vZGVCRnVuY3Rpb247CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYgcHJvdmlkZWQtYnktZW5vZGViRnVuY3Rpb24gewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHByb3ZpZGVkIGJ5IGVOb2RlQiBGdW5jdGlvbi4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBMVEVTRUNUT1JDQVJSSUVSX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIExURVNlY3RvckNhcnJpZXI7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWJ5LWx0ZVNlY3RvckNhcnJpZXIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHVzZWQgYnkgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KfQ==
+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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJFcmljc3NvbiBBQiI7CiAgICBjb250YWN0ICJFcmljc3NvbiBmaXJzdCBsaW5lIHN1cHBvcnQgdmlhIGVtYWlsIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChjKSAyMDI0IEVyaWNzc29uIEFCLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IHJlbGF0aW9ucyBiZXR3ZWVuIEVxdWlwbWVudCBhbmQgUkFOLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJFTF9FUVVJUE1FTlRfUkFOOwoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQU1PRFVMRV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyAwLi5uIHRvIDAuLm0KCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYtbGlzdCBzZXJ2aWNlZC1hbnRlbm5hQ2FwYWJpbGl0eSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgc2VydmljZWQgYnkgdGhpcyBBbnRlbm5hIE1vZHVsZS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgb3ItdGVpdi1lcXVpcDpBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3Qgc2VydmluZy1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHNlcnZlcyB0aGlzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgb3ItdGVpdi1yYW46QW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9Cn0=
\.
-COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin;
-AntennaModule o-ran-smo-teiv-equipment
-CloudSite o-ran-smo-teiv-cloud
-ENodeBFunction o-ran-smo-teiv-ran
-AntennaCapability o-ran-smo-teiv-ran
-LTESectorCarrier o-ran-smo-teiv-ran
+COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin;
+o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment
+o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran
\.
-COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin;
-ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 9223372036854775807 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran
+COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin;
+ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran
\.
;
diff --git a/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql
new file mode 100644
index 0000000..e393eb0
--- /dev/null
+++ b/pgsql-schema-generator/src/test/resources/baseline-schema/02_init-oran-smo-teiv-consumer-data.sql
@@ -0,0 +1,53 @@
+--
+-- ============LICENSE_START=======================================================
+-- Copyright (C) 2024 Ericsson
+-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+-- ================================================================================
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- SPDX-License-Identifier: Apache-2.0
+-- ============LICENSE_END=========================================================
+--
+
+BEGIN;
+
+CREATE SCHEMA IF NOT EXISTS ties_consumer_data;
+ALTER SCHEMA ties_consumer_data OWNER TO :pguser;
+SET default_tablespace = '';
+SET default_table_access_method = heap;
+
+SET ROLE :'pguser';
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" (
+ "name" TEXT PRIMARY KEY,
+ "namespace" TEXT,
+ "revision" TEXT NOT NULL,
+ "content" TEXT NOT NULL,
+ "ownerAppId" VARCHAR(511) NOT NULL,
+ "status" VARCHAR(127) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" (
+ "name" TEXT PRIMARY KEY,
+ "dataType" VARCHAR(511) NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" (
+ "name" TEXT PRIMARY KEY,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+COMMIT;
diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql
index c3da7c1..4052755 100644
--- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql
+++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_00_init-oran-smo-teiv-data.sql
@@ -23,6 +23,7 @@
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
GRANT USAGE ON SCHEMA topology to :pguser;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA topology TO :pguser;
@@ -49,412 +50,506 @@
$$ language 'plpgsql';
-- Update data schema exec status
-INSERT INTO ties_model.entity_info("schema", "status") VALUES ('ties_data', 'success');
+INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_data', 'success');
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" (
- "id" VARCHAR(511),
- "aSide_AntennaCapability" VARCHAR(511),
- "bSide_AntennaCapability" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (
+ "id" TEXT,
+ "6446B2D4BE5E367FB0396383C4BDEF42D51CF74F" TEXT,
+ "F03B534AFF0872651FED60C54AB56BEDADAB94B5" BIGINT,
+ "333177AA699C0DE6399503171DCF48FB396322B0" INTEGER,
+ "027B1A8019C6DEF04558B90D9D8B52253B82FEC6" BIGINT,
+ "478D043D81678134EF1C8BFB073A70F882C4AF12" DECIMAL,
+ "8252D18D44F633831557076D827993C45278024D" jsonb,
+ "68C48305AB6C3A30DD927F5D38562379374A4B31" jsonb,
+ "CD_sourceIds" jsonb,
+ "CD_classifiers" jsonb,
+ "CD_decorators" jsonb,
+ "REL_FK_provided-by-entityTypeA" TEXT,
+ "REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0" TEXT,
+ "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" jsonb,
+ "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" jsonb,
+ "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" jsonb
+);
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ALTER COLUMN "REL_CD_92559ED73C761B860682582A040E745ECEC194D5" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" (
+ "id" TEXT,
+ "aSide_EntityTypeA" TEXT,
+ "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" (
- "id" VARCHAR(511),
- "aSide_AntennaModule" VARCHAR(511),
- "bSide_AntennaCapability" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" (
+ "id" TEXT,
+ "aSide_AntennaModule" TEXT,
+ "bSide_AntennaCapability" TEXT,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" (
- "id" VARCHAR(511),
- "aSide_AntennaModule" VARCHAR(511),
- "bSide_AntennaModule" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."FB1E124031A12CD85D3335194B39B193723A0490" (
+ "id" TEXT,
+ "aSide_C812C285BEFA4EC42026AB075D9C65200A00F815" TEXT,
+ "bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515" TEXT,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."AntennaCapability" (
- "id" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-equipment_AntennaModule" (
+ "id" TEXT,
+ "antennaBeamWidth" jsonb,
+ "antennaModelNumber" TEXT,
+ "electricalAntennaTilt" INTEGER,
+ "geo-location" geography,
+ "mechanicalAntennaBearing" INTEGER,
+ "mechanicalAntennaTilt" INTEGER,
+ "positionWithinSector" TEXT,
+ "totalTilt" INTEGER,
+ "CD_sourceIds" jsonb,
+ "CD_classifiers" jsonb,
+ "CD_decorators" jsonb
+);
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-equipment_AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_AntennaCapability" (
+ "id" TEXT,
+ "eUtranFqBands" jsonb,
"geranFqBands" jsonb,
"nRFqBands" jsonb,
- "eUtranFqBands" jsonb,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_AntennaCapability" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."AntennaModule" (
- "id" VARCHAR(511),
- "positionWithinSector" TEXT,
- "electricalAntennaTilt" BIGINT,
- "mechanicalAntennaBearing" BIGINT,
- "antennaBeamWidth" jsonb,
- "mechanicalAntennaTilt" BIGINT,
- "antennaModelNumber" TEXT,
- "totalTilt" BIGINT,
- "geo-location" geography,
- "CD_sourceIds" jsonb,
- "CD_classifiers" jsonb,
- "CD_decorators" jsonb
-);
-
-ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."AntennaModule" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-
-CREATE TABLE IF NOT EXISTS ties_data."ENodeBFunction" (
- "id" VARCHAR(511),
- "eNBId" BIGINT,
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (
+ "id" TEXT,
+ "eNBId" INTEGER,
"eNodeBPlmnId" jsonb,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "eNBId" SET DEFAULT '11';
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."GNBDUFunction" (
- "id" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_GNBDUFunction" (
+ "id" TEXT,
"dUpLMNId" jsonb,
"gNBDUId" BIGINT,
- "gNBIdLength" BIGINT,
"gNBId" BIGINT,
+ "gNBIdLength" INTEGER,
"CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
- "CD_decorators" jsonb,
+ "CD_decorators" jsonb
);
-ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-CREATE TABLE IF NOT EXISTS ties_data."LTESectorCarrier" (
- "id" VARCHAR(511),
+CREATE TABLE IF NOT EXISTS ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" (
+ "id" TEXT,
"sectorCarrierType" TEXT,
"CD_sourceIds" jsonb,
- "REL_FK_provided-by-enodebFunction" VARCHAR(511),
- "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" VARCHAR(511),
+ "CD_classifiers" jsonb,
+ "CD_decorators" jsonb,
+ "REL_FK_provided-by-enodebFunction" TEXT,
+ "REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" TEXT,
"REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
- "REL_FK_used-antennaCapability" VARCHAR(511),
- "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511),
+ "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
+ "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
+ "REL_FK_used-antennaCapability" TEXT,
+ "REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY" TEXT,
"REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb,
+ "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb,
+ "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb
+);
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+
+ALTER TABLE ONLY ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}';
+
+CREATE TABLE IF NOT EXISTS ties_data."test-built-in-module_EntityTypeA" (
+ "id" TEXT,
+ "CD_sourceIds" jsonb,
"CD_classifiers" jsonb,
"CD_decorators" jsonb,
- "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
- "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb,
- "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" jsonb,
- "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" jsonb
+ "REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5" TEXT,
+ "REL_ID_31A5B55158140557F09AE15589A8B8038416689B" TEXT,
+ "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" jsonb,
+ "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" jsonb,
+ "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" jsonb,
+ "REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA" TEXT,
+ "REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845" TEXT,
+ "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" jsonb,
+ "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" jsonb,
+ "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" jsonb
);
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54" SET DEFAULT '{}';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A" SET DEFAULT '[]';
-ALTER TABLE ONLY ties_data."LTESectorCarrier" ALTER COLUMN "REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}';
-
-CREATE TABLE IF NOT EXISTS ties_data."NRSectorCarrier" (
- "id" VARCHAR(511),
- "frequencyDL" BIGINT,
- "arfcnDL" BIGINT,
- "arfcnUL" BIGINT,
- "bSChannelBwDL" BIGINT,
- "frequencyUL" BIGINT,
- "CD_sourceIds" jsonb,
- "REL_FK_used-antennaCapability" VARCHAR(511),
- "REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY" VARCHAR(511),
- "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb,
- "CD_classifiers" jsonb,
- "CD_decorators" jsonb,
- "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb,
- "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" jsonb
-);
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."NRSectorCarrier" ALTER COLUMN "REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY" SET DEFAULT '{}';
-
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" (
- "id" VARCHAR(511),
- "aSide_AntennaCapability" VARCHAR(511),
- "bSide_AntennaCapability" VARCHAR(511),
- "CD_sourceIds" jsonb,
- "CD_classifiers" jsonb,
- "CD_decorators" jsonb
-);
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" (
- "id" VARCHAR(511),
- "aSide_AntennaCapability" VARCHAR(511),
- "bSide_AntennaCapability" VARCHAR(511),
- "CD_sourceIds" jsonb,
- "CD_classifiers" jsonb,
- "CD_decorators" jsonb
-);
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
-
-CREATE TABLE IF NOT EXISTS ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" (
- "id" VARCHAR(511),
- "aSide_AntennaCapability" VARCHAR(511),
- "bSide_AntennaCapability" VARCHAR(511),
- "CD_sourceIds" jsonb,
- "CD_classifiers" jsonb,
- "CD_decorators" jsonb
-);
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_sourceIds" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_classifiers" SET DEFAULT '[]';
-
-ALTER TABLE ONLY ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ALTER COLUMN "CD_decorators" SET DEFAULT '{}';
+ALTER TABLE ONLY ties_data."test-built-in-module_EntityTypeA" ALTER COLUMN "REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA" SET DEFAULT '{}';
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY',
- 'PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id" PRIMARY KEY ("id");'
+ '10B9F515756871D3EF6558FAF1F112BAE207945D',
+ 'PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB',
+ 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY',
- 'PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id',
- 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");'
+ '54110F8D085BBBA7BB6DE5CE71B511562090F7EE',
+ 'PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D',
+ 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_USES_ANTENNAMODULE',
- 'PK_ANTENNAMODULE_USES_ANTENNAMODULE_id',
- 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "PK_ANTENNAMODULE_USES_ANTENNAMODULE_id" PRIMARY KEY ("id");'
+ 'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE',
+ 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'AntennaCapability',
- 'PK_AntennaCapability_id',
- 'ALTER TABLE ties_data."AntennaCapability" ADD CONSTRAINT "PK_AntennaCapability_id" PRIMARY KEY ("id");'
+ 'FB1E124031A12CD85D3335194B39B193723A0490',
+ 'PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD',
+ 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'AntennaModule',
- 'PK_AntennaModule_id',
- 'ALTER TABLE ties_data."AntennaModule" ADD CONSTRAINT "PK_AntennaModule_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-equipment_AntennaModule',
+ 'PK_o-ran-smo-teiv-equipment_AntennaModule_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-equipment_AntennaModule" ADD CONSTRAINT "PK_o-ran-smo-teiv-equipment_AntennaModule_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ENodeBFunction',
- 'PK_ENodeBFunction_id',
- 'ALTER TABLE ties_data."ENodeBFunction" ADD CONSTRAINT "PK_ENodeBFunction_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_AntennaCapability',
+ 'PK_o-ran-smo-teiv-ran_AntennaCapability_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_AntennaCapability" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_AntennaCapability_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'GNBDUFunction',
- 'PK_GNBDUFunction_id',
- 'ALTER TABLE ties_data."GNBDUFunction" ADD CONSTRAINT "PK_GNBDUFunction_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_ENodeBFunction',
+ 'PK_o-ran-smo-teiv-ran_ENodeBFunction_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_ENodeBFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_ENodeBFunction_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'PK_LTESectorCarrier_id',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "PK_LTESectorCarrier_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_GNBDUFunction',
+ 'PK_o-ran-smo-teiv-ran_GNBDUFunction_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_GNBDUFunction" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_GNBDUFunction_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'NRSectorCarrier',
- 'PK_NRSectorCarrier_id',
- 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "PK_NRSectorCarrier_id" PRIMARY KEY ("id");'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'PK_o-ran-smo-teiv-ran_LTESectorCarrier_id',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "PK_o-ran-smo-teiv-ran_LTESectorCarrier_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY',
- 'PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");'
+ 'test-built-in-module_EntityTypeA',
+ 'PK_test-built-in-module_EntityTypeA_id',
+ 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "PK_test-built-in-module_EntityTypeA_id" PRIMARY KEY ("id");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY',
- 'PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");'
+ '10B9F515756871D3EF6558FAF1F112BAE207945D',
+ 'FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228',
+ 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228" FOREIGN KEY ("REL_FK_provided-by-entityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY',
- 'PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id" PRIMARY KEY ("id");'
+ '10B9F515756871D3EF6558FAF1F112BAE207945D',
+ 'UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14',
+ 'ALTER TABLE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" ADD CONSTRAINT "UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14" UNIQUE ("REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY',
- 'FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ '54110F8D085BBBA7BB6DE5CE71B511562090F7EE',
+ 'FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30',
+ 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30" FOREIGN KEY ("aSide_EntityTypeA") REFERENCES ties_data."test-built-in-module_EntityTypeA" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY',
- 'FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY" ADD CONSTRAINT "FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ '54110F8D085BBBA7BB6DE5CE71B511562090F7EE',
+ 'FK_33B5669A341584011D9A73FB491FF2242A158057',
+ 'ALTER TABLE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" ADD CONSTRAINT "FK_33B5669A341584011D9A73FB491FF2242A158057" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY',
- 'FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960',
+ 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."o-ran-smo-teiv-equipment_AntennaModule" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY',
- 'FK_73581B1E05EA3AC4C029F090C067BD88029F1195',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_73581B1E05EA3AC4C029F090C067BD88029F1195" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'CFC235E0404703D1E4454647DF8AAE2C193DB402',
+ 'FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06',
+ 'ALTER TABLE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" ADD CONSTRAINT "FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY',
- 'FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'FB1E124031A12CD85D3335194B39B193723A0490',
+ 'FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F',
+ 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F" FOREIGN KEY ("aSide_C812C285BEFA4EC42026AB075D9C65200A00F815") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY',
- 'FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'FB1E124031A12CD85D3335194B39B193723A0490',
+ 'FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5',
+ 'ALTER TABLE ties_data."FB1E124031A12CD85D3335194B39B193723A0490" ADD CONSTRAINT "FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5" FOREIGN KEY ("bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY',
- 'FK_0F27D391D210980029D4A879344BFC1DF7E56047',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_0F27D391D210980029D4A879344BFC1DF7E56047" FOREIGN KEY ("aSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."o-ran-smo-teiv-ran_ENodeBFunction" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNACAPABILITY_USES_ANTENNACAPABILITY',
- 'FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027',
- 'ALTER TABLE ties_data."ANTENNACAPABILITY_USES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY',
- 'FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule',
- 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."o-ran-smo-teiv-ran_AntennaCapability" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_SERVES_ANTENNACAPABILITY',
- 'FK_AB3CEA707D389B107F1D10BC724542418E02ABEC',
- 'ALTER TABLE ties_data."ANTENNAMODULE_SERVES_ANTENNACAPABILITY" ADD CONSTRAINT "FK_AB3CEA707D389B107F1D10BC724542418E02ABEC" FOREIGN KEY ("bSide_AntennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
+ 'o-ran-smo-teiv-ran_LTESectorCarrier',
+ 'UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF',
+ 'ALTER TABLE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" ADD CONSTRAINT "UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_USES_ANTENNAMODULE',
- 'FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule',
- 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule" FOREIGN KEY ("aSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;'
+ 'test-built-in-module_EntityTypeA',
+ 'FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0',
+ 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0" FOREIGN KEY ("REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'ANTENNAMODULE_USES_ANTENNAMODULE',
- 'FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule',
- 'ALTER TABLE ties_data."ANTENNAMODULE_USES_ANTENNAMODULE" ADD CONSTRAINT "FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule" FOREIGN KEY ("bSide_AntennaModule") REFERENCES ties_data."AntennaModule" (id) ON DELETE CASCADE;'
+ 'test-built-in-module_EntityTypeA',
+ 'UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD',
+ 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD" UNIQUE ("REL_ID_31A5B55158140557F09AE15589A8B8038416689B");'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction" FOREIGN KEY ("REL_FK_provided-by-enodebFunction") REFERENCES ties_data."ENodeBFunction" (id) ON DELETE CASCADE;'
+ 'test-built-in-module_EntityTypeA',
+ 'FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF',
+ 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF" FOREIGN KEY ("REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA") REFERENCES ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" (id) ON DELETE CASCADE;'
);
SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9" UNIQUE ("REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");'
+ 'test-built-in-module_EntityTypeA',
+ 'UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9',
+ 'ALTER TABLE ties_data."test-built-in-module_EntityTypeA" ADD CONSTRAINT "UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9" UNIQUE ("REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845");'
);
-SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'FK_LTESectorCarrier_REL_FK_used-antennaCapability',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "FK_LTESectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
-);
+CREATE INDEX IF NOT EXISTS "IDX_1B734406AE75EF103D3E0913637A741DB602A6E9" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("8252D18D44F633831557076D827993C45278024D"::TEXT) gin_trgm_ops);
-SELECT ties_data.create_constraint_if_not_exists(
- 'LTESectorCarrier',
- 'UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88',
- 'ALTER TABLE ties_data."LTESectorCarrier" ADD CONSTRAINT "UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88" UNIQUE ("REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY");'
-);
+CREATE INDEX IF NOT EXISTS "IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("68C48305AB6C3A30DD927F5D38562379374A4B31");
-SELECT ties_data.create_constraint_if_not_exists(
- 'NRSectorCarrier',
- 'FK_NRSectorCarrier_REL_FK_used-antennaCapability',
- 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "FK_NRSectorCarrier_REL_FK_used-antennaCapability" FOREIGN KEY ("REL_FK_used-antennaCapability") REFERENCES ties_data."AntennaCapability" (id) ON DELETE CASCADE;'
-);
+CREATE INDEX IF NOT EXISTS "IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
-SELECT ties_data.create_constraint_if_not_exists(
- 'NRSectorCarrier',
- 'UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991',
- 'ALTER TABLE ties_data."NRSectorCarrier" ADD CONSTRAINT "UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991" UNIQUE ("REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY");'
-);
+CREATE INDEX IF NOT EXISTS "IDX_371097F35C137586E6DD7526076CA322C72FAF79" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
-COMMIT;
\ No newline at end of file
+CREATE INDEX IF NOT EXISTS "IDX_06503CC4580E197BA869DF60207E5CC1778223F0" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN (("REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6" ON ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D" USING GIN ("REL_CD_92559ED73C761B860682582A040E745ECEC194D5");
+
+CREATE INDEX IF NOT EXISTS "IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645" ON ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_7BF09D0227840279556AD27ACECB068705893D28" ON ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_C212962DB49654BB1526341141D01AF2A3699B5D" ON ties_data."FB1E124031A12CD85D3335194B39B193723A0490" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_21B0F1FE632B6CB185C49BA6F00224068F443215" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("antennaBeamWidth"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_905011128A2C218B5352C19ED1FE9851F43EB911" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators" ON ties_data."o-ran-smo-teiv-equipment_AntennaModule" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("eUtranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_A94722FF7B95D8974B494793908B57B4E1A9743B" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("geranFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_441B5C05448D63552C6414BD59C13641D8A4408D" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("nRFqBands"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_AntennaCapability" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("eNodeBPlmnId");
+
+CREATE INDEX IF NOT EXISTS "IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_B598B74193845587BA03553CEDBA058D33956847" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_ENodeBFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("dUpLMNId");
+
+CREATE INDEX IF NOT EXISTS "IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_601A4514FFACA8985471531013AFC8F760361F09" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_GNBDUFunction" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_6EC539C61EA7078DBA264C9877B87FC263605D42" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_1EBC7271CEA658156DE25286404CBC4593340F8E" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_44075E1D464599B61924196C20F2B88332520CD8" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER");
+
+CREATE INDEX IF NOT EXISTS "IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN (("REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494" ON ties_data."o-ran-smo-teiv-ran_LTESectorCarrier" USING GIN ("REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY");
+
+CREATE INDEX IF NOT EXISTS "IDX_497353902DBA614467FFC457A40F39BF04CADC33" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_sourceIds"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("CD_classifiers"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("CD_decorators");
+
+CREATE INDEX IF NOT EXISTS "IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_E050A7DD176C8D18F3307D3851586C8124CA8268" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54");
+
+CREATE INDEX IF NOT EXISTS "IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224" ON ties_data."test-built-in-module_EntityTypeA" USING GIN (("REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A"::TEXT) gin_trgm_ops);
+
+CREATE INDEX IF NOT EXISTS "IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589" ON ties_data."test-built-in-module_EntityTypeA" USING GIN ("REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA");
+
+ANALYZE ties_data."o-ran-smo-teiv-ran_GNBDUFunction";
+
+ANALYZE ties_data."FB1E124031A12CD85D3335194B39B193723A0490";
+
+ANALYZE ties_data."10B9F515756871D3EF6558FAF1F112BAE207945D";
+
+ANALYZE ties_data."o-ran-smo-teiv-ran_LTESectorCarrier";
+
+ANALYZE ties_data."test-built-in-module_EntityTypeA";
+
+ANALYZE ties_data."CFC235E0404703D1E4454647DF8AAE2C193DB402";
+
+ANALYZE ties_data."o-ran-smo-teiv-ran_AntennaCapability";
+
+ANALYZE ties_data."o-ran-smo-teiv-equipment_AntennaModule";
+
+ANALYZE ties_data."o-ran-smo-teiv-ran_ENodeBFunction";
+
+ANALYZE ties_data."54110F8D085BBBA7BB6DE5CE71B511562090F7EE";
+
+COMMIT;
diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql
index bd3b338..2967b77 100644
--- a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql
+++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_01_init-oran-smo-teiv-model.sql
@@ -46,44 +46,34 @@
"domain" VARCHAR(511),
"includedModules" jsonb DEFAULT '[]'::jsonb,
"revision" VARCHAR(511) NOT NULL,
- "content" TEXT NOT NULL,
- "ownerAppId" VARCHAR(511) NOT NULL,
- "status" VARCHAR(127) NOT NULL
+ "content" TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS ties_model.entity_info (
- "name" VARCHAR(511) PRIMARY KEY,
+ "storedAt" VARCHAR(511) PRIMARY KEY,
+ "name" VARCHAR(511) NOT NULL,
"moduleReferenceName" VARCHAR(511) NOT NULL,
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS ties_model.relationship_info (
- "name" VARCHAR(511) PRIMARY KEY,
+ "name" VARCHAR(511) NOT NULL,
"aSideAssociationName" TEXT NOT NULL,
"aSideMOType" TEXT NOT NULL,
+ "aSideModule" TEXT NOT NULL,
"aSideMinCardinality" BIGINT NOT NULL,
"aSideMaxCardinality" BIGINT NOT NULL,
"bSideAssociationName" TEXT NOT NULL,
"bSideMOType" TEXT NOT NULL,
+ "bSideModule" TEXT NOT NULL,
"bSideMinCardinality" BIGINT NOT NULL,
"bSideMaxCardinality" BIGINT NOT NULL,
"associationKind" TEXT NOT NULL,
"relationshipDataLocation" TEXT NOT NULL,
"connectSameEntity" BOOLEAN NOT NULL,
+ "storedAt" VARCHAR(511) NOT NULL,
"moduleReferenceName" TEXT NOT NULL,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.decorators (
- "name" VARCHAR(511) PRIMARY KEY,
- "dataType" VARCHAR(511) NOT NULL,
- "moduleReferenceName" VARCHAR(511) NOT NULL,
- FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
-);
-
-CREATE TABLE IF NOT EXISTS ties_model.classifiers (
- "name" VARCHAR(511) PRIMARY KEY,
- "moduleReferenceName" VARCHAR(511) NOT NULL,
+ PRIMARY KEY ("name", "moduleReferenceName"),
FOREIGN KEY ("moduleReferenceName") REFERENCES ties_model.module_reference ("name") ON DELETE CASCADE
);
@@ -91,122 +81,186 @@
INSERT INTO ties_model.execution_status("schema", "status") VALUES ('ties_model', 'success');
COPY ties_model.hash_info("name", "hashedValue", "type") FROM stdin;
-eNodeBPlmnId eNodeBPlmnId COLUMN
-PK_NRSectorCarrier_id PK_NRSectorCarrier_id CONSTRAINT
-UNIQUE_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_B9770D6C26DDA0173DB9690F6E3B42C111AF26E9 CONSTRAINT
-PK_ENodeBFunction_id PK_ENodeBFunction_id CONSTRAINT
CD_classifiers CD_classifiers COLUMN
-mechanicalAntennaBearing mechanicalAntennaBearing COLUMN
-frequencyDL frequencyDL COLUMN
-AntennaModule AntennaModule TABLE
-ENodeBFunction ENodeBFunction TABLE
-LTESectorCarrier LTESectorCarrier TABLE
-antennaModelNumber antennaModelNumber COLUMN
-NRSectorCarrier NRSectorCarrier TABLE
-REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN
-FK_LTESectorCarrier_REL_FK_used-antennaCapability FK_LTESectorCarrier_REL_FK_used-antennaCapability CONSTRAINT
-aSide_AntennaModule aSide_AntennaModule COLUMN
-REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-dUpLMNId dUpLMNId COLUMN
-frequencyUL frequencyUL COLUMN
-bSChannelBwDL bSChannelBwDL COLUMN
-CD_sourceIds CD_sourceIds COLUMN
-REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-geranFqBands geranFqBands COLUMN
-PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_id CONSTRAINT
-arfcnUL arfcnUL COLUMN
-PK_LTESectorCarrier_id PK_LTESectorCarrier_id CONSTRAINT
-PK_GNBDUFunction_id PK_GNBDUFunction_id CONSTRAINT
-UNIQUE_NRSectorCarrier_REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_EDF7D5C78EF6505848B1679B714D7831F5863991 CONSTRAINT
-PK_AntennaCapability_id PK_AntennaCapability_id CONSTRAINT
-nRFqBands nRFqBands COLUMN
-ANTENNACAPABILITY_USES_ANTENNACAPABILITY ANTENNACAPABILITY_USES_ANTENNACAPABILITY TABLE
-FK_NRSectorCarrier_REL_FK_used-antennaCapability FK_NRSectorCarrier_REL_FK_used-antennaCapability CONSTRAINT
-geo-location geo-location COLUMN
-PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_id CONSTRAINT
-arfcnDL arfcnDL COLUMN
-FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_LTESectorCarrier_REL_FK_provided-by-enodebFunction CONSTRAINT
-id id COLUMN
-gNBId gNBId COLUMN
-REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-ANTENNAMODULE_USES_ANTENNAMODULE ANTENNAMODULE_USES_ANTENNAMODULE TABLE
-ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY TABLE
-bSide_AntennaModule bSide_AntennaModule COLUMN
-REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-eNBId eNBId COLUMN
-positionWithinSector positionWithinSector COLUMN
-aSide_AntennaCapability aSide_AntennaCapability COLUMN
-FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_AB3CEA707D389B107F1D10BC724542418E02ABEC CONSTRAINT
-REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_id CONSTRAINT
-FK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_aSide_AntennaCapability FK_3613A8C84275763DE5294B04DB6E6BF74E9412F4 CONSTRAINT
-PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id PK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_id CONSTRAINT
-FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule FK_ANTENNAMODULE_USES_ANTENNAMODULE_aSide_AntennaModule CONSTRAINT
CD_decorators CD_decorators COLUMN
-PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id CONSTRAINT
-totalTilt totalTilt COLUMN
-FK_ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_C21710428B73A144CC8DE4063CB24D4852D2EFE1 CONSTRAINT
-REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-gNBIdLength gNBIdLength COLUMN
-AntennaCapability AntennaCapability TABLE
-FK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_bSide_AntennaCapability FK_73581B1E05EA3AC4C029F090C067BD88029F1195 CONSTRAINT
-REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-bSide_AntennaCapability bSide_AntennaCapability COLUMN
-PK_ANTENNAMODULE_USES_ANTENNAMODULE_id PK_ANTENNAMODULE_USES_ANTENNAMODULE_id CONSTRAINT
-FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule FK_ANTENNAMODULE_USES_ANTENNAMODULE_bSide_AntennaModule CONSTRAINT
-FK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_bSide_AntennaCapability FK_8B87C4FA55D9F0A4164C35942D91E2E4E0B6140D CONSTRAINT
-REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-FK_ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY_aSide_AntennaCapability FK_F407B43F3D94FFE0CBDF7E2BFAEAD9A4047DF252 CONSTRAINT
-PK_AntennaModule_id PK_AntennaModule_id CONSTRAINT
-REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-antennaBeamWidth antennaBeamWidth COLUMN
-UNIQUE_LTESectorCarrier_REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_5D5FEB6B4B09D5D42A589753C684994CD0B96E88 CONSTRAINT
-sectorCarrierType sectorCarrierType COLUMN
+CD_sourceIds CD_sourceIds COLUMN
+FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_provided-by-enodebFunction FK_D0868FBC0BBE2754F4B765C4898C1A1700E2BEFD CONSTRAINT
+FK_o-ran-smo-teiv-ran_LTESectorCarrier_REL_FK_used-antennaCapability FK_3D8DF3FBD9C042A888CEB382688C1E8F39D85AFE CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_D80D1E6B26DF620B4DE659C600A3B7F709A41960 CONSTRAINT
+FK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_bSide_AntennaCapability FK_7148BEED02C0617DE1DEEB6639F34A9FA9251B06 CONSTRAINT
+FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_2A5C84A2226EE0FCAAA513CC5AF4CD78DDDAF49F CONSTRAINT
+FK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_FBFE10B6F165A8EC2086B8DEAFA238E0DD6643F5 CONSTRAINT
+FK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_aSide_EntityTypeA FK_2839E6FFDF7F3DF2687DAC3E57082AD6B22E9B30 CONSTRAINT
+FK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_33B5669A341584011D9A73FB491FF2242A158057 CONSTRAINT
+FK_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_FK_provided-by-entityTypeA FK_B0923C0CCED6CF47CFF759FFE1B810D6CA10D228 CONSTRAINT
+FK_test-built-in-module_EntityTypeA_REL_FK_grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_02592FFA6AFD7EAC7AFAD936E3CD50708E4533E0 CONSTRAINT
+FK_test-built-in-module_EntityTypeA_REL_FK_used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters FK_5CD9BCFA08278DA0BF902BAFBCFCDFCE4FF25FEF CONSTRAINT
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_classifiers IDX_1C0CAFD80FDD6444044E3F76C7C0A7BDC35F9BC8 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_CD_sourceIds IDX_905011128A2C218B5352C19ED1FE9851F43EB911 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-equipment_AntennaModule_antennaBeamWidth IDX_21B0F1FE632B6CB185C49BA6F00224068F443215 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_classifiers IDX_E7FFE8F4A166AA9A382A0659762FFEC313A9EB5C INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_CD_sourceIds IDX_CC3E208A4EE51D3B505416A599F36F3C99F466C8 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_eUtranFqBands IDX_5FB80647AE3E5C0443A792618D65B9090EE2A3FC INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_geranFqBands IDX_A94722FF7B95D8974B494793908B57B4E1A9743B INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_AntennaCapability_nRFqBands IDX_441B5C05448D63552C6414BD59C13641D8A4408D INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_classifiers IDX_B598B74193845587BA03553CEDBA058D33956847 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_ENodeBFunction_CD_sourceIds IDX_3F7D14B4CF2CA74F28BA1600606E82C6E8C447C0 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_GNBDUFunction_CD_classifiers IDX_601A4514FFACA8985471531013AFC8F760361F09 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_GNBDUFunction_CD_sourceIds IDX_2BEF269CED354C2454AC2B2EABB134AC267A0C62 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_classifiers IDX_E754EB8AD825DB3111B07B9E5DA3B30C38DB406B INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_CD_sourceIds IDX_6EC539C61EA7078DBA264C9877B87FC263605D42 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_846B7740E8AA756B8C1409CD909D2DF73A47ED4C INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_3D3EFECFB917DAC074F56334224B19F8FD6BF8A5 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_1EBC7271CEA658156DE25286404CBC4593340F8E INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_7D01A5D21C990ACCBE65035C062C7D881A05F1EE INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_classifiers IDX_DD0D676834B12CA2F7E8219310998376A08D7F5F INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_sourceIds IDX_E896A9EB22A3F9F96CE75A271475316A98B629C8 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_classifiers IDX_26EE0E66CE3AF1DE2E107F6A99712F2BEC1F47E3 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_sourceIds IDX_DCA3B27EBD61104A41BE23B1C864D67CBF3AA45E INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_classifiers IDX_73D270B07D89D7F4D54B82DB95E6168F6ED54AF1 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_sourceIds IDX_D16FC793292C549EEB2EDCA074EC9726CD0986B1 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_classifiers IDX_371097F35C137586E6DD7526076CA322C72FAF79 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_sourceIds IDX_EDE92A1D90AEC06F2C60361D36437D1A20691FDC INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_classifiers_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_F613D04BF286E43A7BBBE6C306F015D0A40BC451 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_sourceIds_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_2B6D6CECE23DAE6820ECA50ECC172FE6FCE673DF INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters IDX_1B734406AE75EF103D3E0913637A741DB602A6E9 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_CD_classifiers IDX_C4788824417A9F41E8CB948DAC0C2D1C0580FFD4 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_CD_sourceIds IDX_497353902DBA614467FFC457A40F39BF04CADC33 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_classifiers_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_E050A7DD176C8D18F3307D3851586C8124CA8268 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_classifiers_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_5345DBA457356CB29D1905DA4785B7FB2B27D224 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_sourceIds_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_86B531D9388F1780960FB5C3BA9D3EDEF14CCB48 INDEX
+IDX_GIN_TRGM_OPS_ON_LIST_AS_JSONB_test-built-in-module_EntityTypeA_REL_CD_sourceIds_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_41BEE4E46184F6F17D338D2F8691EF31D188C76D INDEX
+IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators IDX_GIN_o-ran-smo-teiv-equipment_AntennaModule_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_AntennaCapability_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId IDX_GIN_o-ran-smo-teiv-ran_ENodeBFunction_eNodeBPlmnId INDEX
+IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId IDX_GIN_o-ran-smo-teiv-ran_GNBDUFunction_dUpLMNId INDEX
+IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_CD_decorators INDEX
+IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER IDX_44075E1D464599B61924196C20F2B88332520CD8 INDEX
+IDX_GIN_o-ran-smo-teiv-ran_LTESectorCarrier_REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY IDX_4EE2AA643311DFCC13B6ED832EBE2FAB4CFDF494 INDEX
+IDX_GIN_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_CD_decorators IDX_7BF09D0227840279556AD27ACECB068705893D28 INDEX
+IDX_GIN_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_decorators IDX_C212962DB49654BB1526341141D01AF2A3699B5D INDEX
+IDX_GIN_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_CD_decorators IDX_786DFF3328DE8D28C54F9ACA126AF6ADB1D21645 INDEX
+IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_CD_decorators IDX_06503CC4580E197BA869DF60207E5CC1778223F0 INDEX
+IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_CD_decorators_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_15F7CCF328E4FA23EE20BE521E07C475825B38C6 INDEX
+IDX_GIN_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters IDX_93D8689B66D668B64409D69EB1AD4670419BE4F0 INDEX
+IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators IDX_GIN_test-built-in-module_EntityTypeA_CD_decorators INDEX
+IDX_GIN_test-built-in-module_EntityTypeA_REL_CD_decorators_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_CCBCF9A86E2AA678D2589DEB3A895076012F941D INDEX
+IDX_GIN_test-built-in-module_EntityTypeA_REL_CD_decorators_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS IDX_14EDC4DAF64B9A97E4788CFEA16A7F9AED195589 INDEX
+PK_o-ran-smo-teiv-equipment_AntennaModule_id PK_o-ran-smo-teiv-equipment_AntennaModule_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_AntennaCapability_id PK_o-ran-smo-teiv-ran_AntennaCapability_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_ENodeBFunction_id PK_o-ran-smo-teiv-ran_ENodeBFunction_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_GNBDUFunction_id PK_o-ran-smo-teiv-ran_GNBDUFunction_id CONSTRAINT
+PK_o-ran-smo-teiv-ran_LTESectorCarrier_id PK_o-ran-smo-teiv-ran_LTESectorCarrier_id CONSTRAINT
+PK_o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_id PK_63E61CB6802F21FE7A04A80A095F6AF8ABF067CE CONSTRAINT
+PK_test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_id PK_020B03AED5787D1B43ABBD9F2C26B494ADDBC7CD CONSTRAINT
+PK_test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_id PK_4C48AAFA2160D74F9D13364AA2BE4FDB8A60689D CONSTRAINT
+PK_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_id PK_7A421D526B36AA9EEF17964BC27011A12FF80DBB CONSTRAINT
+PK_test-built-in-module_EntityTypeA_id PK_test-built-in-module_EntityTypeA_id CONSTRAINT
REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_classifiers_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule FK_ANTENNAMODULE_SERVES_ANTENNACAPABILITY_aSide_AntennaModule CONSTRAINT
-GNBDUFunction GNBDUFunction TABLE
-mechanicalAntennaTilt mechanicalAntennaTilt COLUMN
-electricalAntennaTilt electricalAntennaTilt COLUMN
-ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY TABLE
+REL_CD_classifiers_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_75B161E740A96ADBAE6F08D4F85684ECC29049B9 COLUMN
+REL_CD_classifiers_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_E2C3D598A06EA38133E23C1756ED58A66FE21386 COLUMN
+REL_CD_classifiers_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_74A44B167FDF37D6C8E79B5033FEF8BC384C881A COLUMN
+REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_classifiers_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
+REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_decorators_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
+REL_CD_decorators_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_6F7211CAF505AECF9A565BC7A4AF56E7032CCC54 COLUMN
+REL_CD_decorators_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_92559ED73C761B860682582A040E745ECEC194D5 COLUMN
+REL_CD_decorators_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_F5B24D9A7273119D4D1519473D9EC88CB407E5CA COLUMN
+REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_decorators_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_CD_sourceIds_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
-FK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_aSide_AntennaCapability FK_0F27D391D210980029D4A879344BFC1DF7E56047 CONSTRAINT
-FK_ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY_aSide_AntennaCapability FK_59989F20BF725E08F0327C7C555B1CF7B4F8661C CONSTRAINT
+REL_CD_sourceIds_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_AB6BDADE3F6C750C9FDB6CAD6059C4CBCE67236C COLUMN
+REL_CD_sourceIds_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_F26C39EC1F710F3096BE0588F6783A03A378516A COLUMN
+REL_CD_sourceIds_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_CD_3B43F80D423BF8F96A2906643B7B4712604FC28B COLUMN
+REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_CD_sourceIds_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
+REL_FK_grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_B7E43411C5C5079D49856E74A9FA63BD20C522C5 COLUMN
REL_FK_provided-by-enodebFunction REL_FK_provided-by-enodebFunction COLUMN
-gNBDUId gNBDUId COLUMN
-ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY TABLE
-FK_ANTENNACAPABILITY_USES_ANTENNACAPABILITY_bSide_AntennaCapability FK_C66086ACCFA9455ED438AE9381A7E4B0668EA027 CONSTRAINT
+REL_FK_provided-by-entityTypeA REL_FK_provided-by-entityTypeA COLUMN
+REL_FK_used-antennaCapability REL_FK_used-antennaCapability COLUMN
+REL_FK_used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters REL_FK_A86937FEBD025CFDF6EE5BC386B4C569EB2652DA COLUMN
+REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER COLUMN
+REL_ID_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_31A5B55158140557F09AE15589A8B8038416689B COLUMN
+REL_ID_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_F64052A4F8BB3CC533EC15BBFB5E224F600735B0 COLUMN
+REL_ID_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS REL_ID_A974AD6DD8C4CA281D45693D3A61AE98FEE82845 COLUMN
+REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
+UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER UNIQUE_FD943EE596337B11E0C640E1176CADF9CD69E19A CONSTRAINT
+UNIQUE_o-ran-smo-teiv-ran_LTESectorCarrier_REL_ID_LTESECTORCARRIER_USES_ANTENNACAPABILITY UNIQUE_EA18F1D278EAFE834B8A80BCF8A7D8355CD013DF CONSTRAINT
+UNIQUE_test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters_REL_ID_ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_B1C2FC9A96300B2BE45785DE60E152D8E85FBE14 CONSTRAINT
+UNIQUE_test-built-in-module_EntityTypeA_REL_ID_ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_7715FF94E14F99CE4994ABBD8C2583CBA9EAE5BD CONSTRAINT
+UNIQUE_test-built-in-module_EntityTypeA_REL_ID_ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS UNIQUE_67DB5E4BC34AB83BDC069A5CAF73B57967D5C2D9 CONSTRAINT
+aSide_AntennaModule aSide_AntennaModule COLUMN
+aSide_EntityTypeA aSide_EntityTypeA COLUMN
+aSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters aSide_C812C285BEFA4EC42026AB075D9C65200A00F815 COLUMN
+antennaBeamWidth antennaBeamWidth COLUMN
+antennaModelNumber antennaModelNumber COLUMN
+attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters 6446B2D4BE5E367FB0396383C4BDEF42D51CF74F COLUMN
+attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters F03B534AFF0872651FED60C54AB56BEDADAB94B5 COLUMN
+attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters 333177AA699C0DE6399503171DCF48FB396322B0 COLUMN
+attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters 027B1A8019C6DEF04558B90D9D8B52253B82FEC6 COLUMN
+attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters 478D043D81678134EF1C8BFB073A70F882C4AF12 COLUMN
+attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters 8252D18D44F633831557076D827993C45278024D COLUMN
+attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters 68C48305AB6C3A30DD927F5D38562379374A4B31 COLUMN
+bSide_AntennaCapability bSide_AntennaCapability COLUMN
+bSide_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters bSide_A85CE100A012A71EF2ABA306BABE484AC2AAE515 COLUMN
+dUpLMNId dUpLMNId COLUMN
+eNBId eNBId COLUMN
+eNodeBPlmnId eNodeBPlmnId COLUMN
eUtranFqBands eUtranFqBands COLUMN
-REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY REL_ID_NRSECTORCARRIER_USES_ANTENNACAPABILITY COLUMN
-ANTENNAMODULE_SERVES_ANTENNACAPABILITY ANTENNAMODULE_SERVES_ANTENNACAPABILITY TABLE
+electricalAntennaTilt electricalAntennaTilt COLUMN
+gNBDUId gNBDUId COLUMN
+gNBId gNBId COLUMN
+gNBIdLength gNBIdLength COLUMN
+geo-location geo-location COLUMN
+geranFqBands geranFqBands COLUMN
+id id COLUMN
+mechanicalAntennaBearing mechanicalAntennaBearing COLUMN
+mechanicalAntennaTilt mechanicalAntennaTilt COLUMN
+nRFqBands nRFqBands COLUMN
+o-ran-smo-teiv-equipment_AntennaModule o-ran-smo-teiv-equipment_AntennaModule TABLE
+o-ran-smo-teiv-ran_AntennaCapability o-ran-smo-teiv-ran_AntennaCapability TABLE
+o-ran-smo-teiv-ran_ENodeBFunction o-ran-smo-teiv-ran_ENodeBFunction TABLE
+o-ran-smo-teiv-ran_GNBDUFunction o-ran-smo-teiv-ran_GNBDUFunction TABLE
+o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran_LTESectorCarrier TABLE
+o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY CFC235E0404703D1E4454647DF8AAE2C193DB402 TABLE
+positionWithinSector positionWithinSector COLUMN
+sectorCarrierType sectorCarrierType COLUMN
+test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS FB1E124031A12CD85D3335194B39B193723A0490 TABLE
+test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS 54110F8D085BBBA7BB6DE5CE71B511562090F7EE TABLE
+test-built-in-module_EntityTypeA test-built-in-module_EntityTypeA TABLE
+test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters 10B9F515756871D3EF6558FAF1F112BAE207945D TABLE
+totalTilt totalTilt COLUMN
\.
-COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content", "ownerAppId", "status") FROM stdin;
-o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogICAgaW52ZW50b3J5IG1vZGVscyB3aWxsIHVzZSB0byBkZWZpbmUgYW5kIGFubm90YXRlIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyBhIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wb2xvZ3kuCgogICAgICAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YgYW4KICAgICAgICAgICAgQS1zaWRlIGFuZCBhIEItc2lkZS4gVGhlIEEtc2lkZSBpcyBjb25zaWRlcmVkIHRoZSBvcmlnaW5hdGluZyBzaWRlIG9mCiAgICAgICAgICAgIHRoZSByZWxhdGlvbnNoaXA7IHRoZSBCLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcgc2lkZSBvZiB0aGUKICAgICAgICAgICAgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YgaW1wb3J0YW5jZSBhbmQgTVVTVAogICAgICAgICAgICBOT1QgYmUgY2hhbmdlZCBvbmNlIGRlZmluZWQuCgogICAgICAgICAgICBCb3RoIEEtc2lkZSBhbmQgQi1zaWRlIGFyZSBkZWZpbmVkIG9uIGEgdHlwZSwgYW5kIGFyZSBnaXZlbiBhIHJvbGUuIEEKICAgICAgICAgICAgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgICAgICByZWxhdGlvbnNoaXAsIGFsbCBkaXN0aW5ndWlzaGVkIGJ5IHJvbGUgbmFtZS4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSAnbW9kdWxlJyBzdGF0ZW1lbnQuCiAgICAgICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlIGFsbG93ZWQKICAgICAgICAgICAgcGVyIHBhcmVudCBzdGF0ZW1lbnQuCgogICAgICAgICAgICBTdWJzdGF0ZW1lbnRzIHRvIHRoZSAnYmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBkZWZpbmUgdGhlCiAgICAgICAgICAgIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzIG9mIHRoZQogICAgICAgICAgICByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUgdXNlZCBmb3IKICAgICAgICAgICAgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUgJ2Etc2lkZScKICAgICAgICAgICAgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZSAnYi1zaWRlJwogICAgICAgICAgICBleHRlbnNpb24uIE90aGVyIGRhdGEgbm9kZXMgZGVmaW5lIHByb3BlcnRpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgcmVsYXRpb25zaGlwIG5hbWUgaXMKICAgICAgICAgICAgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUgdW5pcXVlCiAgICAgICAgICAgIHdpdGhpbiB0aGUgc2NvcGUuIjsKCiAgICAgICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICAgIH0KCiAgICBleHRlbnNpb24gYVNpZGUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIHRoZSBBLXNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAndW5pLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lIG9mCiAgICAgICAgICAgIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMKICAgICAgICAgICAgc2NvcGVkIHRvIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZSB1bmlxdWUKICAgICAgICAgICAgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5IG9mCiAgICAgICAgICAgIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSByZXNpZGVzLiBJZiB0aGUKICAgICAgICAgICAgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZSBwcmVmaXhlZCwgYW5kIGEKICAgICAgICAgICAgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBwcmVmaXguIjsKCiAgICAgICAgYXJndW1lbnQgYVNpZGVUeXBlOwogICAgfQoKICAgIGV4dGVuc2lvbiBiU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUgb2YKICAgICAgICAgICAgdGhlIHJvbGUgb2YgdGhlIEItc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZSBpcwogICAgICAgICAgICBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlIHVuaXF1ZQogICAgICAgICAgICB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkgb2YKICAgICAgICAgICAgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuIElmIHRoZQogICAgICAgICAgICB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlIHByZWZpeGVkLCBhbmQgYQogICAgICAgICAgICBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBiU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgICAgICBhcmd1bWVudCBkb21haW5OYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBsYWJlbCB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYyB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzIOKAmHgueS564oCZIOKAkyBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUgcmV2aXNpb24gc3RhdGVtZW50LiAgWmVybyBvciBvbmUgcmV2aXNpb24gbGFiZWwgc3RhdGVtZW50cwogICAgICAgICAgICBwZXIgcGFyZW50IHN0YXRlbWVudCBhcmUgYWxsb3dlZC4KCiAgICAgICAgICAgIFJldmlzaW9uIGxhYmVscyBNVVNUIGJlIHVuaXF1ZSBhbW9uZ3N0IGFsbCByZXZpc2lvbnMgb2YgYSBtb2R1bGUgb3Igc3VibW9kdWxlLiI7CgogICAgICAgIGFyZ3VtZW50IHNlbXZlcnNpb247CiAgICB9Cn0= BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKCiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMiOwogICAgcHJlZml4IG9yLXRlaXYtdHlwZXM7CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IHR5cGVzM2dwcDsgfQoKICBvcmdhbml6YXRpb24gIk9SQU4iOwogIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgcmUtdXNhYmxlIGRhdGEgdHlwZXMgdGhhdCB0b3BvbG9neSBhbmQgaW52ZW50b3J5IG1vZGVscwogICAgd2lsbCBmcmVxdWVudGx5IHVzZSBhcyBwYXJ0IG9mIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBncm91cGluZyBUb3BfR3JwX1R5cGUgewogICAgICAgIGRlc2NyaXB0aW9uICJHcm91cGluZyBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlIGNvbW1vbiB0byBhbGwgdHlwZXMuIEFsbCB0eXBlcwogICAgICAgICAgICAgICAgICAgIE1VU1QgdXNlIHRoaXMgZ3JvdXBpbmcuIjsKCiAgICAgICAgbGVhZiBpZCB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdG9wb2xvZ3kgZW50aXRpZXMuIFJlcHJlc2VudHMgdGhlIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLgogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgZG9uZSB2aWEgYXVnbWVudGF0aW9ucy4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUgcGFpci4KCiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlCiAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CiAgICB9CgogICAgbGVhZi1saXN0IGNsYXNzaWZpZXJzIHsKICAgICAgICBkZXNjcmlwdGlvbiAiQ29uc3VtZXIgZGVmaW5lZCB0YWdzIHRvIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzLgoKICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBpZGVudGl0eXJlZiB7IGJhc2UgY2xhc3NpZmllcjsgfQogICAgfQoKICAgIGxlYWYtbGlzdCBzb3VyY2VJZHMgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBvcmRlcmVkIGxpc3Qgb2YgaWRlbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgc2V0IG9mIG5hdGl2ZSBzb3VyY2UgaWRlbnRpZmllcnMgZm9yIHBhcnRpY2lwYXRpbmcKICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy4KCiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5IG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlCiAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkLCBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgIG9yZGVyZWQtYnkgdXNlcjsKICAgIH0KCiAgICBjb250YWluZXIgbWV0YWRhdGEgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIGNvbnRhaW5lciBzZXJ2ZXMgYXMgZXh0ZW5zaW9uIHBvaW50IHRvIGRlZmluZSBtZXRhZGF0YS4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGluIG5hbWUgdmFsdWUKICAgICAgICAgICAgICAgICAgICBwYWlyLgoKICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvciBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUKICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZWQsIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyewogICAgICAgIGRlc2NyaXB0aW9uICAiVGhlIGNsYXNzaWZpZXIgaXMgdXNlZCBhcyBhIGJhc2UgdG8gcHJvdmlkZSBhbGwgY2xhc3NpZmllcnMgd2l0aCBpZGVudGl0eS4gIjsKICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIk9SQU4gZmlyc3QgbGluZSBzdXBwb3J0IHZpYSBlbWFpbCI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiBMb2dpY2FsIHRvcG9sb2d5IG1vZGVsLgoKICAgIENvcHlyaWdodCAoQykgMjAyNCBFcmljc3NvbgogICAgTW9kaWZpY2F0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMjQgT3BlbkluZnJhIEZvdW5kYXRpb24gRXVyb3BlCgogICAgVGhpcyBtb2RlbCBjb250YWlucyB0aGUgdG9wb2xvZ3kgZW50aXRpZXMgYW5kIHJlbGF0aW9ucyBpbiB0aGUKICAgIFJBTiBkb21haW4sIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9uYWwgY2FwYWJpbGl0eQogICAgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZSByZWxldmFudCB0byByQXBwcyB1c2UgY2FzZXMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0xNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gUkFOOwoKICAgIGxpc3QgR05CRFVGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gImdOb2RlQiBEaXN0cmlidXRlZCBVbml0IChnTkItRFUpLgoKICAgICAgICAgICAgICAgICAgICBBIGdOQiBtYXkgY29uc2lzdCBvZiBhIGdOQi1DZW50cmFsaXplZCBVbml0CiAgICAgICAgICAgICAgICAgICAgKGdOQi1DVSkgYW5kIGEgZ05CLURVLiBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsCiAgICAgICAgICAgICAgICAgICAgdGltZSBwcm90b2NvbHMgYW5kIHNlcnZpY2VzLCBhbmQgdGhlIERVIHByb2Nlc3NlcwogICAgICAgICAgICAgICAgICAgIFBIWSBsZXZlbCBwcm90b2NvbCBhbmQgcmVhbCB0aW1lIHNlcnZpY2VzLiBUaGUKICAgICAgICAgICAgICAgICAgICBnTkItQ1UgYW5kIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEKICAgICAgICAgICAgICAgICAgICBGMSBsb2dpY2FsIGludGVyZmFjZS4KCiAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0cnVlIGZvciBhIGdOQi1EVToKICAgICAgICAgICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1DUCB0aHJvdWdoIHRoZSBGMS1DCiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLklzIGNvbm5lY3RlZCB0byB0aGUgZ05CLUNVLVVQIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMgY29ubmVjdGVkIHRvIG9ubHkKICAgICAgICAgICAgICAgICAgICBvbmUgZ05CLUNVLUNQLiBPbmUgZ05CLURVIGNhbiBiZSBjb25uZWN0ZWQgdG8KICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBnTkItQ1UtVVBzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgZ05CLUNVLUNQLgogICAgICAgICAgICAgICAgICAgIE5vdGU6IEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNVLUNQLCBtdWx0aXBsZQogICAgICAgICAgICAgICAgICAgIGdOQi1DVS1VUHMgYW5kIG11bHRpcGxlIGdOQi1EVXMuIGdOQi1EVSBpcyBhIGNvbmNyZXRlCiAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBORy1SQU4gbm9kZSBvYmplY3QuIEluIFRvcG9sb2d5LCB5b3UKICAgICAgICAgICAgICAgICAgICBjYW4gY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgdGhlIGdOQi1EVSBvYmplY3QuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgY29udGFpbmVyIGRVcExNTklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQTE1OIGlkZW50aWZpZXIgdXNlZCBhcyBwYXJ0IG9mIFBNIEV2ZW50cyBkYXRhIjsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJEVUlkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIERVIHdpdGhpbiBhIGdOb2RlQiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBnTkJJZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSWRlbnRpdHkgb2YgZ05vZGVCIHdpdGhpbiBhIFBMTU4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgRU5vZGVCRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBFdm9sdmVkIE5vZGUgQiAoZU5vZGVCKSBpcyB0aGUgb25seSBtYW5kYXRvcnkKICAgICAgICAgICAgICAgICAgICBub2RlIGluIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0KICAgICAgICAgICAgICAgICAgICBFdm9sdXRpb24gKExURSkuIFRoZSBlTm9kZUIgaXMgYSBjb21wbGV4IGJhc2UKICAgICAgICAgICAgICAgICAgICBzdGF0aW9uIHRoYXQgaGFuZGxlcyByYWRpbyBjb21tdW5pY2F0aW9ucwogICAgICAgICAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZQogICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgYW5kIGhhbmRvdmVyIGRlY2lzaW9ucy4gVW5saWtlIDIvM0cKICAgICAgICAgICAgICAgICAgICB3aXJlbGVzcyBSQU4sIHRoZXJlIGlzIG5vIGNlbnRyYWxpemVkIHJhZGlvIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkCiAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG1vYmlsZSBwaG9uZSBuZXR3b3JrIHRoYXQgY29tbXVuaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgd2l0aCBtb2JpbGUgaGFuZHNldHMgKFVzZXIgRXF1aXBtZW50KSwgbGlrZSBhIGJhc2UKICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzCiAgICAgICAgICAgICAgICAgICAgdGhlIGFyY2hpdGVjdHVyZSBhbmQgYWxsb3dzIGxvd2VyIHJlc3BvbnNlIHRpbWVzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgZU5CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBFTm9kZUIgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ2VsbCBHbG9iYWwgSWRlbnRpdHksIGFuZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UiOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgICAgICBkZWZhdWx0IDExOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb250YWluZXIgZU5vZGVCUGxtbklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgRU5vZGVCIFB1YmxpYyBMYW5kIE1vYmlsZSBOZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUExNTikgSUQgdGhhdCBmb3JtcyBwYXJ0IG9mIHRoZSBFTm9kZUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlIG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTMSBpbnRlcmZhY2UuIE5vdGU6IFRoZSB2YWx1ZSAoTUNDPTAwMSwgTU5DPTAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBjYW4gbm90IGJlIHVzZWQgYXMgYSB2YWxpZCBQTE1OIElkZW50aXR5LiI7CgogICAgICAgICAgICAgICAgbGVhZiBtY2MgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTUNDIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmMgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTU5DIHBhcnQgb2YgYSBQTE1OIGlkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZSByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDIuLjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGxpc3QgQW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGlzIE1PIHNlcnZlcyBhcyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgY2VsbAogICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgUkJTIGVxdWlwbWVudCB1c2VkIHRvIHByb3ZpZGUgY292ZXJhZ2UKICAgICAgICAgICAgICAgICAgICBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuIFRoZSBNTyBhbHNvCiAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgdGhlIG1heGltdW0gb3V0cHV0IHBvd2VyIG9mIHRoZSBzZWN0b3IuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZi1saXN0IGVVdHJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgTFRFIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3NvY2lhdGVkIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgZ2VyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIEdFUkFOIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhc3NvY2lhdGVkIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBoYXJkd2FyZSBzdXBwb3J0cyI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IExURVNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTFRFIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIGZvciBkZWZpbmluZyB0aGUgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3MKICAgICAgICAgICAgICAgICAgICBvZiBhIGNhcnJpZXIgKGNlbGwpIGluIGEgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlCiAgICAgICAgICAgICAgICAgICAgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24gaGF2aW5nCiAgICAgICAgICAgICAgICAgICAgaXRzIG93biBhbnRlbm5hcywgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLgogICAgICAgICAgICAgICAgICAgIFRoZSBjb25jZXB0IG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwKICAgICAgICAgICAgICAgICAgICBpbnRlcmZlcmVuY2UgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcwogICAgICAgICAgICAgICAgICAgIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBzZWN0b3JDYXJyaWVyVHlwZSB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzZWN0b3IgY2FycmllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxsZWQgYnkgTU8gU2VjdG9yQ2FycmllciBpcyBhIGRpZ2l0YWwgc2VjdG9yLiI7CiAgICAgICAgICAgICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIG5vcm1hbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAwOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTm90IGEgZGlnaXRhbCBzZWN0b3IiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGVmdCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSByaWdodF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgMkRTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBsZWZ0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yXzNkcyB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSaWdodCBkaWdpdGFsIHNlY3RvciBmb3IgM0RTIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW51bSBtaWRkbGVfZGlnaXRhbF9zZWN0b3IgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IE5SU2VjdG9yQ2FycmllciB7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBOUiBTZWN0b3IgQ2FycmllciBvYmplY3QgcHJvdmlkZXMKICAgICAgICAgICAgICAgICAgICB0aGUgYXR0cmlidXRlcyBmb3IgZGVmaW5pbmcgdGhlIGxvZ2ljYWwKICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBjYXJyaWVyIChjZWxsKSBpbiBhCiAgICAgICAgICAgICAgICAgICAgc2VjdG9yLiBBIHNlY3RvciBpcyBhIGNvdmVyYWdlIGFyZWEgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIHdpdGggYSBiYXNlIHN0YXRpb24gaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsCiAgICAgICAgICAgICAgICAgICAgcmFkaW8gcG9ydHMsIGFuZCBjb250cm9sIGNoYW5uZWxzLiBUaGUgY29uY2VwdAogICAgICAgICAgICAgICAgICAgIG9mIHNlY3RvcnMgd2FzIGRldmVsb3BlZCB0byBpbXByb3ZlIGNvLWNoYW5uZWwKICAgICAgICAgICAgICAgICAgICBpbnRlcmZlcmVuY2UgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3MKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zIHVzZSB0aHJlZSBzZWN0b3IgY2VsbHMuIjsKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVzIHsKICAgICAgICAgICAgbGVhZiBhcmZjbkRMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOUiBBYnNvbHV0ZSBSYWRpbyBGcmVxdWVuY3kgQ2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIChOUi1BUkZDTikgZm9yIGRvd25saW5rIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGFyZmNuVUwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk5SIEFic29sdXRlIFJhZGlvIGZyZXF1ZW5jeSBDaGFubmVsIE51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5SLUFSRkNOKSBmb3IgdXBsaW5rLiI7CiAgICAgICAgICAgICAgICB0eXBlIHVpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBmcmVxdWVuY3lETCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUkYgUmVmZXJlbmNlIEZyZXF1ZW5jeSBvZiBkb3dubGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGZyZXF1ZW5jeVVMIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSRiBSZWZlcmVuY2UgRnJlcXVlbmN5IG9mIHVwbGluayBjaGFubmVsIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGJTQ2hhbm5lbEJ3REwgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkJTIENoYW5uZWwgYmFuZHdpZHRoIGluIE1IeiBmb3IgZG93bmxpbmsuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgTFRFU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTFRFIFNlY3RvciBDYXJyaWVyIHVzZXMgQW50ZW5uYSBDYXBhYmlsaXR5LiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENwYWJpbGl0eSB1c2VkIGJ5IExURSBTZWN0b3IgQ2Fycmllci4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIE5SU0VDVE9SQ0FSUklFUl9VU0VTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTlIgU2VjdG9yIENhcnJpZXIgdXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIE5SU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbnJTZWN0b3JDYXJyaWVyIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSB1c2VkIGJ5IE5SIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBBbnRlbm5hQ2FwYWJpbGl0eTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFDQVBBQklMSVRZX1VTRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4uMSB0byAwLi4xKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9QUk9WSURFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLm4pCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHByb3ZpZGVkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtYnktYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BQ0FQQUJJTElUWV9TRVJWRVNfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4ubiB0byAwLi4xKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHNlcnZpY2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmIHNlcnZpY2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgQU5URU5OQUNBUEFCSUxJVFlfUkVBTElTRURfQllfQU5URU5OQUNBUEFCSUxJVFkgeyAvLyBTYW1lIGVudGl0eSAoMC4ubiB0byAwLi5tKQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IHJlYWxpc2VkLWJ5LWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgQ2FwYWJpbGl0eSByZWFsaXNlZCBieSBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgcmVhbGlzZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHJlYWxpc2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgQW50ZW5uYUNhcGFiaWxpdHk7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE
-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-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTE0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9Cg== BUILT_IN_MODULE IN_USAGE
-o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-14 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiBFcXVpcG1lbnQgdG9wb2xvZ3kgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zIGluIHRoZQogICAgRXF1aXBtZW50IGRvbWFpbiwgd2hpY2ggaXMgbW9kZWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgcGh5c2ljYWwKICAgIGxvY2F0aW9uIG9mIGVxdWlwbWVudCBzdWNoIGFzIGFudGVubmFzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGwvY2FycmllcgogICAgYW5kIHRoZWlyIHJlbGV2YW50IHByb3BlcnRpZXMgZS5nLiB0aWx0LCBtYXggcG93ZXIgZXRjLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMTQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIEVRVUlQTUVOVDsKCiAgICBsaXN0IEFudGVubmFNb2R1bGUgewogICAgICAgIGRlc2NyaXB0aW9uICJBbiBBbnRlbm5hIE1vZHVsZSByZXByZXNlbnRzIHRoZQogICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGFzcGVjdCBvZiBhbiBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllci4gVGhpcyBhdHRyaWJ1dGUgaXMgcGFydCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYUJlYXJpbmcgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgYmVhcmluZyBvbiBhbnRlbm5hIHN1YnVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGFudGVubmEgdW5pdCBpcyBpbnN0YWxsZWQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIG1lY2hhbmljYWxBbnRlbm5hVGlsdCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGZpeGVkIGFudGVubmEgdGlsdCBvZiB0aGUgaW5zdGFsbGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBhcyB0aGUgaW5jbGluYXRpb24gb2YgdGhlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgcmVzcGVjdCB0byB0aGUgdmVydGljYWwgcGxhbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpZ25lZCB2YWx1ZS4gUG9zaXRpdmUgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIHBvc2l0aW9uV2l0aGluU2VjdG9yIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIHVuaXQgcG9zaXRpb24gd2l0aGluIHNlY3Rvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkIGFuZCBoYXMgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LiI7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiB0b3RhbFRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRvdGFsIGFudGVubmEgZWxldmF0aW9uIGluY2x1ZGluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCB0aWx0IGFuZCB0aGUgdGlsdCBhcHBsaWVkIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVtb3RlIEVsZWN0cmljYWwgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZWxlY3RyaWNhbEFudGVubmFUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFbGVjdHJpY2FsbHktY29udHJvbGxlZCB0aWx0IG9mIG1haW4gYmVhbSBtYXhpbXVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBheGlzIChzZWUgM0dQUCBUUyAyNS40NjYpLiBWYWx1ZSBpcyBzaWduZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWx0IGRvd24gaXMgcG9zaXRpdmUsIHRpbHQgdXAgaXMgbmVnYXRpdmUuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgYW50ZW5uYUJlYW1XaWR0aCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIGFuZ3VsYXIgc3BhbiBvZiB0aGUgbWFpbiBsb2JlIG9mIHRoZSBhbnRlbm5hIHJhZGlhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZS4gTWVhc3VyZWQgaW4gZGVncmVlcy4iOwogICAgICAgICAgICAgICAgdHlwZSB1aW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVzZXMgZ2VvOmdlby1sb2NhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBBTlRFTk5BTU9EVUxFX1VTRVNfQU5URU5OQU1PRFVMRSB7IC8vIFNhbWUgZW50aXR5ICgwLi4xIHRvIDAuLjEpCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgdXNlZC1ieS1hbnRlbm5hTW9kdWxlIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgTW9kdWxlIHJlYWxpc2VkIGJ5IEFudGVubmEgTW9kdWxlLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBBbnRlbm5hTW9kdWxlOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CgogICAgICAgIGxlYWYtbGlzdCB1c2VkLWFudGVubmFNb2R1bGUgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBNb2R1bGUgcmVhbGlzZXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFNb2R1bGU7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KfQ== BUILT_IN_MODULE IN_USAGE
+COPY ties_model.module_reference("name", "namespace", "domain", "includedModules", "revision", "content") FROM stdin;
+_3gpp-common-yang-types urn:3gpp:sa5:_3gpp-common-yang-types \N [] 2023-11-06 bW9kdWxlIF8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOjNncHA6c2E1Ol8zZ3BwLWNvbW1vbi15YW5nLXR5cGVzIjsKICBwcmVmaXggInR5cGVzM2dwcCI7CgogIGltcG9ydCBpZXRmLWluZXQtdHlwZXMgeyBwcmVmaXggaW5ldDsgfQogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgeyBwcmVmaXggeWFuZzsgfQogIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IHlleHQzZ3BwOyB9CgogIG9yZ2FuaXphdGlvbiAiM0dQUCBTQTUiOwogIGNvbnRhY3QgImh0dHBzOi8vd3d3LjNncHAub3JnL0R5bmFSZXBvcnQvVFNHLVdHLS1TNS0tb2ZmaWNpYWxzLmh0bT9JdGVtaWQ9NDY0IjsKICBkZXNjcmlwdGlvbiAiVGhlIG1vZGVsIGRlZmluZXMgYSBZQU5HIG1hcHBpbmcgb2YgdGhlIHRvcCBsZXZlbAogICAgaW5mb3JtYXRpb24gY2xhc3NlcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIDVHIG5ldHdvcmtzIGFuZAogICAgbmV0d29yayBzbGljaW5nLgogICAgQ29weXJpZ2h0IDIwMjMsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRTRFNJLAogICAgVFRBLCBUVEMpLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI7CiAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyMyI7CgogIHJldmlzaW9uIDIwMjMtMTEtMDYgeyByZWZlcmVuY2UgQ1ItMDMwNTsgfQogIHJldmlzaW9uIDIwMjMtMDktMTggeyByZWZlcmVuY2UgQ1ItMDI3MSA7IH0KICByZXZpc2lvbiAyMDIzLTA4LTA5IHsgcmVmZXJlbmNlIENSLTAyNjY7IH0KICByZXZpc2lvbiAyMDIzLTA1LTEwIHsgcmVmZXJlbmNlIENSLTAyNTA7IH0KICByZXZpc2lvbiAyMDIzLTAyLTE0IHsgcmVmZXJlbmNlIENSLTAyMzQ7IH0KICByZXZpc2lvbiAyMDIyLTExLTA0IHsgcmVmZXJlbmNlICJDUi0wMTk0IjsgfQogIHJldmlzaW9uIDIwMjItMTAtMjQgeyByZWZlcmVuY2UgQ1ItMDE5NjsgIH0KICByZXZpc2lvbiAyMDIyLTA3LTI2IHsgcmVmZXJlbmNlICJDUi0wMTgwIiA7IH0KICByZXZpc2lvbiAyMDIyLTAyLTA5IHsgcmVmZXJlbmNlICJDUi0wMTQ0IjsgfQogIHJldmlzaW9uIDIwMjEtMTEtMDEgeyByZWZlcmVuY2UgIkNSLTAxNDEiOyB9CgogIHJldmlzaW9uIDIwMjEtMDktMzAgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIExvbmdpdHVkZSwgTGF0aXR1ZGUsIFRlbnRoT2ZEZWdyZWVzLCBPbk9mZi4iOwogICAgcmVmZXJlbmNlICJDUi0wMTM4IjsKICB9CgogIHJldmlzaW9uIDIwMjAtMTEtMDYgewogICAgZGVzY3JpcHRpb24gIlJlbW92ZWQgaW5jb3JyZWN0IFMtTlNTQUkgZGVmaW5pdGlvbnMuIjsKICAgIHJlZmVyZW5jZSAiQ1ItMDExOCI7CiAgfQoKICByZXZpc2lvbiAyMDIwLTAzLTEwIHsKICAgIGRlc2NyaXB0aW9uICJSZW1vdmVkIGZhdWx0eSB3aGVuIHN0YXRlbWVudHMuIjsKICAgIHJlZmVyZW5jZSAiU1AtMjAwMjI5IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMjUgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIE1hbmFnZWRORlByb2ZpbGUuIjsKICAgIHJlZmVyZW5jZSAiUzUtMTk0NDU3IjsKICB9CgogIHJldmlzaW9uIDIwMTktMTAtMTYgewogICAgZGVzY3JpcHRpb24gIkFkZGVkIFNBUCBhbmQgdXNhZ2VTdGF0ZS4iOwogICAgcmVmZXJlbmNlICJTNS0xOTM1MTgiOwogIH0KCiAgcmV2aXNpb24gMjAxOS0wNi0yMyB7CiAgICByZWZlcmVuY2UgICJJbml0aWFsIHZlcnNpb24uIjsKICB9CgogIHR5cGVkZWYgRW5hYmxlZERpc2FibGVkIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIERJU0FCTEVEIDsKICAgICAgZW51bSBFTkFCTEVEIDsKICAgIH0KICB9CgogIGdyb3VwaW5nIG5hbWVWYWx1ZVBhaXIgewogICAgbGVhZiBuYW1lIHsgdHlwZSBzdHJpbmc7IH0KICAgIGxlYWYgdmFsdWUgeyB0eXBlIHN0cmluZzsgfQogIH0KCiAgZ3JvdXBpbmcgUHJvY2Vzc01vbml0b3JHcnAgewogICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGF0dHJpYnV0ZXMgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgcHJvY2Vzc2VzCiAgICAgIHdpdGggc3BlY2lmaWMgcHVycG9zZSBhbmQgbGltaXRlZCBsaWZldGltZSBydW5uaW5nIG9uIE1uUyBwcm9kdWNlcnMuCiAgICAgIEl0IG1heSBiZSB1c2VkIGFzIGRhdGEgdHlwZSBmb3IgZGVkaWNhdGVkIHByb2dyZXNzIG1vbml0b3IgYXR0cmlidXRlcwogICAgICB3aGVuIHNwZWNpZnlpbmcgdGhlIG1hbmFnZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgcHJvY2Vzc2VzLgogICAgICBUaGUgYXR0cmlidXRlcyBpbiB0aGlzIGNsYXVzZSBhcmUgZGVmaW5lZCBpbiBhIGdlbmVyaWMgd2F5LgogICAgICBGb3Igc29tZSBhdHRyaWJ1dGVzIHNwZWNpYWxpc2F0aW9ucyBtYXkgYmUgcHJvdmlkZWQgd2hlbiBzcGVjaWZ5aW5nIGEKICAgICAgY29uY3JldGUgcHJvY2VzcyByZXByZXNlbnRhdGlvbi4KCiAgICAgIElmIGEgbWFuYWdlbWVudCBvcGVyYXRpb24gb24gc29tZSBJT0NzIHRyaWdnZXJzIGFuIGFzc29jaWF0ZWQKICAgICAgYXN5bmNocm9ub3VzIHByb2Nlc3MgKHdob3NlIHByb2dyZXNzIHNoYWxsIGJlIG1vbml0b3JlZCksIHRoaXMgc2hvdWxkCiAgICAgIGFsc28gcmVzdWx0IGluIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZSBuYW1lZCAncHJvY2Vzc01vbml0b3InIChvZiB0eXBlCiAgICAgICdQcm9jZXNzTW9uaXRvcicpIGluIHRoZXNlIElPQyhzKS4gVGhlIHByb2Nlc3NNb25pdG9yIGF0dHJpYnV0ZSBtYXkgYmUKICAgICAgYWNjb21wYW5pZWQgYnkgdXNlLWNhc2Ugc3BlY2lmaWMgYWRkaXRpb25hbCBkYXRhIGl0ZW1zLgoKICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgJ3N0YXR1cycgYW5kCiAgICAgICdwcm9ncmVzc1BlcmNlbnRhZ2UnIGF0dHJpYnV0ZXMuIEFkZGl0aW9uYWwgdGV4dHVhbCBxdWFsaWZpY2F0aW9ucyBmb3IKICAgICAgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBtYXkgYmUgcHJvdmlkZWQgYnkgdGhlICdwcm9ncmVzc1N0YXRlSW5mbycgYW5kCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGF0dHJpYnV0ZXMuCgogICAgICBXaGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCwgdGhlICdzdGF0dXMnIGlzIHNldCB0byAnTk9UX1JVTk5JTkcnCiAgICAgIGFuZCB0aGUgJ3Byb2dyZXNzUGVyY2VudGFnZScgdG8gJzAnLiBUaGUgTW5TIHByb2R1Y2VyIGRlY2lkZXMgd2hlbiB0bwogICAgICBzdGFydCBleGVjdXRpbmcgdGhlIHByb2Nlc3MgYW5kIHRvIHRyYW5zaXRpb24gaW50byB0aGUgJ1JVTk5JTkcnIHN0YXRlLgogICAgICBUaGlzIHRpbWUgaXMgY2FwdHVyZWQgaW4gdGhlICdzdGFydFRpbWUnIGF0dHJpYnV0ZS4gQWx0ZXJuYXRpdmVseSwgdGhlCiAgICAgIHByb2Nlc3MgbWF5IHN0YXJ0IHRvIGV4ZWN1dGUgZGlyZWN0bHkgdXBvbiBpdHMgaW5zdGFudGlhdGlvbi4gT25lCiAgICAgIGFsdGVybmF0aXZlIG11c3QgYmUgc2VsZWN0ZWQgd2hlbiB1c2luZyB0aGlzIGRhdGEgdHlwZS4KCiAgICAgIER1cmluZyB0aGUgJ1JVTk5JTkcnIHN0YXRlIHRoZSAncHJvZ3Jlc3NQZXJjZW50YWdlJyBhdHRyaWJ1dGUgbWF5IGJlCiAgICAgIHJlcGVhdGVkbHkgdXBkYXRlZC4gVGhlIGV4YWN0IHNlbWFudGljIG9mIHRoaXMgYXR0cmlidXRlIGlzIHN1YmplY3QgdG8KICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbi4gVGhlICdwcm9ncmVzc0luZm8nIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0bwogICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiB0aGUgJ05PVF9SVU5OSU5HJywgJ0NBTkNFTExJTkcnCiAgICAgIGFuZCAnUlVOTklORycgc3RhdGVzLiBGdXJ0aGVyIHNwZWNpYWxpc2F0aW9uIG9mCiAgICAgICdwcm9ncmVzc1N0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzCiAgICAgIHVzZWQuCgogICAgICBVcG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgcHJvY2VzcywgdGhlICdzdGF0dXMnIGF0dHJpYnV0ZSBpcyBzZXQKICAgICAgdG8gJ0ZJTklTSEVEJywgdGhlICdwcm9ncmVzc1BlcmNlbnRhZ2UnIHRvIDEwMCUuIFRoZSB0aW1lIGlzIGNhcHR1cmVkIGluCiAgICAgIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLiBBZGRpdGlvbmFsIHRleHR1YWwgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkCiAgICAgIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mCiAgICAgICdyZXN1bHRTdGF0ZUluZm8nIGluIHRoaXMgZGF0YSB0eXBlIGRlZmluaXRpb24gaXMgJ1N0cmluZycuCiAgICAgIEZ1cnRoZXIgc3BlY2lhbGlzYXRpb24gb2YgJ3Jlc3VsdFN0YXRlSW5mbycgbWF5IGJlIHByb3ZpZGVkCiAgICAgIHdoZXJlIHRoaXMgZGF0YSB0eXBlIGlzIHVzZWQuCgogICAgICBJbiBjYXNlIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgdGhlICdzdGF0dXMnCiAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLCB0aGUgY3VycmVudCB2YWx1ZSBvZgogICAgICAncHJvZ3Jlc3NQZXJjZW50YWdlJyBpcyBmcm96ZW4sIGFuZCB0aGUgdGltZSBjYXB0dXJlZCBpbiAnZW5kVGltZScuIFRoZQogICAgICAncmVzdWx0U3RhdGVJbmZvJyBzcGVjaWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUuCiAgICAgIFNwZWNpZmljIGZhaWx1cmUgcmVhc29ucyBtYXkgYmUgc3BlY2lmaWVkIHdoZXJlIHRoZSBkYXRhIHR5cGUgZGVmaW5lZCBpbgogICAgICB0aGlzIGNsYXVzZSBpcyB1c2VkLiBUaGUgZXhhY3Qgc2VtYW50aWMgb2YgZmFpbHVyZSBtYXkgYmUgc3ViamVjdCBmb3IKICAgICAgZnVydGhlciBzcGVjaWFsaXNhdGlvbiBhcyB3ZWxsLgoKICAgICAgSW4gY2FzZSB0aGUgcHJvY2VzcyBpcyBjYW5jZWxsZWQsIHRoZSAnc3RhdHVzJyBhdHRyaWJ1dGUgaXMgZmlyc3Qgc2V0IHRvCiAgICAgICdDQU5DRUxMSU5HJyBhbmQgd2hlbiB0aGUgcHJvY2VzcyBpcyByZWFsbHkgY2FuY2VsbGVkIHRoZW4gdG8gJ0NBTkNFTExFRCcuCiAgICAgIFRoZSB0cmFuc2l0aW9uIHRvICdDQU5DRUxMRUQnIGlzIGNhcHR1cmVkIGluIHRoZSAnZW5kVGltZScgYXR0cmlidXRlLgogICAgICBUaGUgdmFsdWUgb2YgJ3Byb2dyZXNzUGVyY2VudGFnZScgaXMgZnJvemVuLiBBZGRpdGlvbmFsIHRleHR1YWwKICAgICAgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGluIHRoZSAncmVzdWx0U3RhdGVJbmZvJyBhdHRyaWJ1dGUuCgogICAgICBUaGUgJ3Jlc3VsdFN0YXRlSW5mbycgYXR0cmlidXRlIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGFkZGl0aW9uYWwgdGV4dHVhbAogICAgICBxdWFsaWZpY2F0aW9uIG9mIHRoZSBzdGF0ZXMgJ0ZJTklTSEVEJywgJ0ZBSUxFRCcsICdQQVJUSUFMTFlfRkFJTEVEJyBvcgogICAgICAnQ0FOQ0VMTEVEJy4gSXQgc2hhbGwgbm90IGJlIHVzZWQgZm9yIG1ha2luZyB0aGUgb3V0Y29tZSwgdGhhdCB0aGUKICAgICAgcHJvY2VzcyBtYXkgcHJvZHVjZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGF2YWlsYWJsZS4KCiAgICAgIFRoZSBwcm9jZXNzIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRlZCB3aXRoaW4gYSBjZXJ0YWluIHRpbWUgYWZ0ZXIgaXRzCiAgICAgIGNyZWF0aW9uLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHJlcXVpcmVkIGRhdGEgbWF5IG5vdCBiZSBhdmFpbGFibGUgYW55CiAgICAgIG1vcmUgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUsIG9yIHRoZSBwcm9jZXNzIG91dGNvbWUgaXMgbmVlZGVkIHVudGlsIGEKICAgICAgY2VydGFpbiB0aW1lIGFuZCB3aGVuIG5vdCBwcm92aWRlZCBieSB0aGlzIHRpbWUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZS4KICAgICAgVGhlIHRpbWUgdW50aWwgdGhlIE1uUyBwcm9kdWNlciBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHByb2Nlc3MgaXMKICAgICAgaW5kaWNhdGVkIGJ5IHRoZSAndGltZXInIGF0dHJpYnV0ZS4iOwoKICAgIGxlYWYgaWQgewogICAgICB0eXBlIHN0cmluZzsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJJZCBvZiB0aGUgcHJvY2Vzcy4gSXQgaXMgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZQogICAgICAgIG11bHRpdmFsdWUgYXR0cmlidXRlIG9mIHR5cGUgUHJvY2Vzc01vbml0b3IuIjsKICAgIH0KCiAgICBsZWFmIHN0YXR1cyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gTk9UX1NUQVJURUQgOwogICAgICAgIGVudW0gUlVOTklORyA7CiAgICAgICAgZW51bSBDQU5DRUxMSU5HIDsKICAgICAgICBlbnVtIEZJTklTSEVEIDsKICAgICAgICBlbnVtIEZBSUxFRCA7CiAgICAgICAgZW51bSBQQVJUSUFMTFlfRkFJTEVEIDsKICAgICAgICBlbnVtIENBTkNFTExFRCA7CiAgICAgIH0KICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZWZhdWx0ICBSVU5OSU5HOwogICAgICBkZXNjcmlwdGlvbiAiUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIHByb2Nlc3MsCiAgICAgICAgd2hldGhlciBpdCBmYWlscywgc3VjY2VlZHMgZXRjLgogICAgICAgIEl0IGRvZXMgbm90IHJlcHJlc2VudCB0aGUgcmV0dXJuZWQgdmFsdWVzIG9mIGEgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkCiAgICAgICAgcHJvY2Vzcy4gIjsKICAgIH0KCiAgICBsZWFmIHByb2dyZXNzUGVyY2VudGFnZSB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlIDAuLjEwMDsKICAgICAgfQogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJQcm9ncmVzcyBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGFzIHBlcmNlbnRhZ2UiOwogICAgfQoKICAgIGxlYWYtbGlzdCBwcm9ncmVzc1N0YXRlSW5mbyB7CiAgICAgIHR5cGUgc3RyaW5nOwogICAgICBjb25maWcgZmFsc2U7CiAgICAgIGRlc2NyaXB0aW9uICJBZGRpdGlvbmFsIHRleHR1YWwgcXVhbGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVzCiAgICAgICAgJ05PVF9TVEFSVEVEJywgJ0NBTkNFTExJTkcnIGFuZCAnUlVOTklORycuCgogICAgICAgIEZvciBzcGVjaWZpYyBwcm9jZXNzZXMsIHNwZWNpZmljIHdlbGwtZGVmaW5lZCBzdHJpbmdzIChlLmcuIHN0cmluZwogICAgICAgIHBhdHRlcm5zIG9yIGVudW1zKSBtYXkgYmUgZGVmaW5lZCBhcyBhIHNwZWNpYWxpc2F0aW9uLiI7CiAgICB9CgogICAgbGVhZiByZXN1bHRTdGF0ZUluZm8gewogICAgICB0eXBlIHN0cmluZzsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiQWRkaXRpb25hbCB0ZXh0dWFsIHF1YWxpZmljYXRpb24gb2YgdGhlIHN0YXRlcwogICAgICAgICdGSU5JU0hFRCcsICdGQUlMRUQnLCAnUEFSVElBTExZX0ZBSUxFRCBhbmQgJ0NBTkNFTExFRCcuCiAgICAgICAgRm9yIGV4YW1wbGUsIGluIHRoZSAnRkFJTEVEJyBvciAnUEFSVElBTExZX0ZBSUxFRCcgc3RhdGUgdGhpcwogICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGVycm9yIHJlYXNvbnMuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIG1ha2UgdGhlIG91dGNvbWUgb2YgdGhlIHByb2Nlc3MKICAgICAgICBhdmFpbGFibGUgZm9yIHJldHJpZXZhbCwgaWYgYW55LiBGb3IgdGhpcyBwdXJwb3NlLCBkZWRpY2F0ZWQKICAgICAgICBhdHRyaWJ1dGVzIHNoYWxsIGJlIHNwZWNpZmllZCB3aGVuIHNwZWNpZnlpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgYSBzcGVjaWZpYyBwcm9jZXNzLgoKICAgICAgICBGb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLCBzcGVjaWZpYyB3ZWxsLWRlZmluZWQgc3RyaW5ncyAoZS5nLiBzdHJpbmcKICAgICAgICBwYXR0ZXJucyBvciBlbnVtcykgbWF5IGJlIGRlZmluZWQgYXMgYSBzcGVjaWFsaXNhdGlvbi4iOwogICAgfQoKICAgIGxlYWYgc3RhcnRUaW1lIHsKICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgZGVzY3JpcHRpb24gIlN0YXJ0IHRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcywgaS5lLiB0aGUgdGltZSB3aGVuIHRoZQogICAgICAgIHN0YXR1cyBjaGFuZ2VkIGZyb20gJ05PVF9TVEFSVEVEJyB0byAnUlVOTklORycuIjsKICAgIH0KCiAgICBsZWFmIGVuZFRpbWUgewogICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBkZXNjcmlwdGlvbiAiRGF0ZSBhbmQgdGltZSB3aGVuIHN0YXR1cyBjaGFuZ2VkIHRvICdTVUNDRVNTJywgJ0NBTkNFTExFRCcsCiAgICAgICAgJ0ZBSUxFRCcgb3IgJ1BBUlRJQUxMWV9GQUlMRUQnLgoKICAgICAgICBJZiB0aGUgdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBpdCBpcyB0aGUgZXN0aW1hdGVkIHRpbWUKICAgICAgICB0aGUgcHJvY2VzcyB3aWxsIGVuZC4iOwogICAgfQoKICAgIGxlYWYgdGltZXIgewogICAgICB0eXBlIHVpbnQzMjsKICAgICAgdW5pdHMgbWludXRlczsKICAgICAgZGVzY3JpcHRpb24gIlRpbWUgdW50aWwgdGhlIGFzc29jaWF0ZWQgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGxlZC4KICAgICAgICBJZiBzZXQsIHRoZSBzeXN0ZW0gZGVjcmVhc2VzIHRoZSB0aW1lciB3aXRoIHRpbWUuIFdoZW4gaXQgcmVhY2hlcyB6ZXJvCiAgICAgICAgdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSB0aGUKICAgICAgICBNblNfUHJvZHVjZXIuCiAgICAgICAgSWYgbm90IHNldCwgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBmb3IgdGhlIHByb2Nlc3MuCgogICAgICAgIE9uY2UgdGhlIHRpbWVyIGlzIHNldCwgdGhlIGNvbnN1bWVyIGNhbiBub3QgY2hhbmdlIGl0IGFueW1vcmUuCiAgICAgICAgSWYgdGhlIGNvbnN1bWVyIGhhcyBub3Qgc2V0IHRoZSB0aW1lciB0aGUgTW5TIFByb2R1Y2VyIG1heSBzZXQgaXQuIjsKICAgICAgeWV4dDNncHA6bm90Tm90aWZ5YWJsZTsKICAgIH0KICB9CgogIHR5cGVkZWYgVGVudGhPZkRlZ3JlZXMgewogICAgdHlwZSB1aW50MTYgewogICAgICByYW5nZSAwLi4zNjAwOwogICAgfQogICAgdW5pdHMgIjAuMSBkZWdyZWVzIjsKICAgIGRlc2NyaXB0aW9uICJBIHNpbmdsZSBpbnRlZ3JhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgYmV0d2VlbiAwIGFuZCAzNjAgd2l0aCBhIHJlc29sdXRpb24gb2YgMC4xIGRlZ3JlZXMuIjsKICB9CgogIHR5cGVkZWYgTGF0aXR1ZGUgewogICAgdHlwZSBkZWNpbWFsNjQgewogICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgcmFuZ2UgIi05MC4wMDAwLi4rOTAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTGF0aXR1ZGUgdmFsdWVzIjsKICB9CgogIHR5cGVkZWYgTG9uZ2l0dWRlIHsKICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgIHJhbmdlICItMTgwLjAwMDAuLisxODAuMDAwMCI7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIHZhbHVlcyI7CiAgfQoKICB0eXBlZGVmIEFsdGl0dWRlICB7CiAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgfQogICAgdW5pdHMgIm1ldGVycyI7CiAgICBkZXNjcmlwdGlvbgogICAgICAiSGVpZ2h0IGZyb20gYSByZWZlcmVuY2UgMCB2YWx1ZS4iOwogIH0KCiAgZ3JvdXBpbmcgR2VvZ3JhcGhpY2FsQ29vcmRpbmF0ZXMgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YXR5cGUgcmVwcmVzZW50cyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIjsKICAgIHJlZmVyZW5jZSAiI0dQUCBUUyAyOC41NTggY2xhdXNlIDYuMy44IjsKCiAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgdHlwZSBMYXRpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBsb25naXR1ZGUgewogICAgICB0eXBlIExvbmdpdHVkZTsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CgogICAgbGVhZiBhbHRpdHVkZSB7CiAgICAgIHR5cGUgQWx0aXR1ZGU7CiAgICB9CgogIH0KCiAgdHlwZWRlZiBPbk9mZiB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBPTjsKICAgICAgZW51bSBPRkY7CiAgICB9CiAgfQoKICAvLyBncm91cGluZyBNYW5hZ2VkTkZQcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhcyBpdCBpcwogIC8vICBiZWluZyBtb3ZlZCB0byBfM2dwcC01Z2MtbnJtLW5mcHJvZmlsZQogIGdyb3VwaW5nIE1hbmFnZWRORlByb2ZpbGUgewogICAgZGVzY3JpcHRpb24gIkRlZmluZXMgcHJvZmlsZSBmb3IgbWFuYWdlZCBORiI7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuNTAxIjsKCiAgICBsZWFmIGlkeCB7IHR5cGUgdWludDMyIDsgfQoKICAgIGxlYWYgbmZJbnN0YW5jZUlEIHsKICAgICAgY29uZmlnIGZhbHNlOwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSB5YW5nOnV1aWQgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBwcm9maWxlIGZvciBtYW5hZ2VkIE5GLgogICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIE5GIEluc3RhbmNlIElEIHNoYWxsIGJlIGEKICAgICAgICBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgdmVyc2lvbiA0LAogICAgICAgIGFzIGRlc2NyaWJlZCBpbiBJRVRGIFJGQyA0MTIyICIgOwogICAgICB5ZXh0M2dwcDppblZhcmlhbnQ7CiAgICB9CgogICAgbGVhZi1saXN0IG5mVHlwZSB7CiAgICAgIGNvbmZpZyBmYWxzZTsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIHR5cGUgTmZUeXBlOwogICAgICBkZXNjcmlwdGlvbiAiVHlwZSBvZiB0aGUgTmV0d29yayBGdW5jdGlvbiIgOwogICAgfQoKICAgIGxlYWYgaG9zdEFkZHIgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBpbmV0Omhvc3QgOwogICAgICBkZXNjcmlwdGlvbiAiSG9zdCBhZGRyZXNzIG9mIGEgTkYiOwogICAgfQoKICAgIGxlYWYgYXV0aHpJbmZvIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBORiBTcGVjaWZpYyBTZXJ2aWNlIGF1dGhvcml6YXRpb24KICAgICAgICBpbmZvcm1hdGlvbi4gSXQgc2hhbGwgaW5jbHVkZSB0aGUgTkYgdHlwZSAocykgYW5kIE5GIHJlYWxtcy9vcmlnaW5zCiAgICAgICAgYWxsb3dlZCB0byBjb25zdW1lIE5GIFNlcnZpY2Uocykgb2YgTkYgU2VydmljZSBQcm9kdWNlci4iOwogICAgICByZWZlcmVuY2UgIlNlZSBUUyAyMy41MDEiIDsKICAgIH0KCiAgICBsZWFmIGxvY2F0aW9uIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBORiBpbnN0YW5jZQogICAgICAgIChlLmcuIGdlb2dyYXBoaWMgbG9jYXRpb24sIGRhdGEgY2VudGVyKSBkZWZpbmVkIGJ5IG9wZXJhdG9yIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIGNhcGFjaXR5IHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgdWludDE2IDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgc3RhdGljIGNhcGFjaXR5IGluZm9ybWF0aW9uCiAgICAgICAgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIGV4cHJlc3NlZCBhcyBhIHdlaWdodCByZWxhdGl2ZSB0byBvdGhlcgogICAgICAgIE5GIGluc3RhbmNlcyBvZiB0aGUgc2FtZSB0eXBlOyBpZiBjYXBhY2l0eSBpcyBhbHNvIHByZXNlbnQgaW4gdGhlCiAgICAgICAgbmZTZXJ2aWNlTGlzdCBwYXJhbWV0ZXJzLCB0aG9zZSB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmIG5GU3J2R3JvdXBJZCB7CiAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgZGVzY3JpcHRpb24gIlRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaWRlbnRpdHkgb2YgdGhlIGdyb3VwIHRoYXQgaXMKICAgICAgICBzZXJ2ZWQgYnkgdGhlIE5GIGluc3RhbmNlLgogICAgICAgIE1heSBiZSBjb25maWcgZmFsc2Ugb3IgdHJ1ZSBkZXBlbmRpbmcgb24gdGhlIE1hbmFnZWRGdW5jdGlvbi4KICAgICAgICBDb25maWc9dHJ1ZSBmb3IgVWRyaW5mby4gQ29uZmlnPWZhbHNlIGZvciBVZG1JbmZvIGFuZCBBdXNmSW5mby4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVETSBvciBBVVNGIG9yIFVEUi4gIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc3VwcG9ydGVkRGF0YVNldElkcyB7CiAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgIGVudW0gU1VCU0NSSVBUSU9OOwogICAgICAgIGVudW0gUE9MSUNZOwogICAgICAgIGVudW0gRVhQT1NVUkU7CiAgICAgICAgZW51bSBBUFBMSUNBVElPTjsKICAgICAgfQogICAgICBkZXNjcmlwdGlvbiAiTGlzdCBvZiBzdXBwb3J0ZWQgZGF0YSBzZXRzIGluIHRoZSBVRFIgaW5zdGFuY2UuCiAgICAgICAgTWF5IGJlIHByZXNlbnQgaWYgLi4vbmZUeXBlID0gVURSIjsKICAgICAgcmVmZXJlbmNlICJUUyAyOS41MTAiIDsKICAgIH0KCiAgICBsZWFmLWxpc3Qgc21mU2VydmluZ0FyZWFzIHsKICAgICAgdHlwZSBzdHJpbmcgOwogICAgICBkZXNjcmlwdGlvbiAiRGVmaW5lcyB0aGUgU01GIHNlcnZpY2UgYXJlYShzKSB0aGUgVVBGIGNhbiBzZXJ2ZS4KICAgICAgICBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IFVQRiI7CiAgICAgIHJlZmVyZW5jZSAiVFMgMjkuNTEwIiA7CiAgICB9CgogICAgbGVhZiBwcmlvcml0eSB7CiAgICAgIHR5cGUgdWludDE2OwogICAgICBkZXNjcmlwdGlvbiAiVGhpcyBwYXJhbWV0ZXIgZGVmaW5lcyBQcmlvcml0eSAocmVsYXRpdmUgdG8gb3RoZXIgTkZzCiAgICAgICAgb2YgdGhlIHNhbWUgdHlwZSkgaW4gdGhlIHJhbmdlIG9mIDAtNjU1MzUsIHRvIGJlIHVzZWQgZm9yIE5GIHNlbGVjdGlvbjsKICAgICAgICBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBoaWdoZXIgcHJpb3JpdHkuIElmIHByaW9yaXR5IGlzIGFsc28gcHJlc2VudAogICAgICAgIGluIHRoZSBuZlNlcnZpY2VMaXN0IHBhcmFtZXRlcnMsIHRob3NlIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIKICAgICAgICB0aGlzIHZhbHVlLiBTaGFsbCBiZSBwcmVzZW50IGlmIC4uL25mVHlwZSA9IEFNRiAiOwogICAgICByZWZlcmVuY2UgIlRTIDI5LjUxMCIgOwogICAgfQogIH0KCiAgdHlwZWRlZiB1c2FnZVN0YXRlIHsKICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICBlbnVtIElETEU7CiAgICAgIGVudW0gQUNUSVZFOwogICAgICBlbnVtIEJVU1k7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiSXQgZGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZXNvdXJjZSBpcyBhY3RpdmVseSBpbgogICAgICB1c2UgYXQgYSBzcGVjaWZpYyBpbnN0YW50LCBhbmQgaWYgc28sIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBzcGFyZQogICAgICBjYXBhY2l0eSBmb3IgYWRkaXRpb25hbCB1c2VycyBhdCB0aGF0IGluc3RhbnQuIFRoZSB2YWx1ZSBpcyBSRUFELU9OTFkuIjsKICAgIHJlZmVyZW5jZSAiSVRVIFQgUmVjb21tZW5kYXRpb24gWC43MzEiOwogIH0KCiAgZ3JvdXBpbmcgU0FQR3JwIHsKICAgIGxlYWYgaG9zdCB7CiAgICAgIHR5cGUgaW5ldDpob3N0OwogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgIH0KICAgIGxlYWYgcG9ydCB7CiAgICAgIHR5cGUgaW5ldDpwb3J0LW51bWJlcjsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICB9CiAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBhY2Nlc3MgcG9pbnQuIjsKICAgIHJlZmVyZW5jZSAiVFMgMjguNjIyIjsKICB9CgogIHR5cGVkZWYgTWNjIHsKICAgIGRlc2NyaXB0aW9uICJUaGUgbW9iaWxlIGNvdW50cnkgY29kZSBjb25zaXN0cyBvZiB0aHJlZSBkZWNpbWFsIGRpZ2l0cywKICAgICAgVGhlIGZpcnN0IGRpZ2l0IG9mIHRoZSBtb2JpbGUgY291bnRyeSBjb2RlIGlkZW50aWZpZXMgdGhlIGdlb2dyYXBoaWMKICAgICAgcmVnaW9uICh0aGUgZGlnaXRzIDEgYW5kIDggYXJlIG5vdCB1c2VkKToiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMDItNzldWzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgdHlwZWRlZiBNbmMgewogICAgZGVzY3JpcHRpb24gIlRoZSBtb2JpbGUgbmV0d29yayBjb2RlIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQogICAgICBkZWNpbWFsIGRpZ2l0cyAoZm9yIGV4YW1wbGU6IE1OQyBvZiAwMDEgaXMgbm90IHRoZSBzYW1lIGFzIE1OQyBvZiAwMSkiOwogICAgdHlwZSBzdHJpbmcgewogICAgICBwYXR0ZXJuICdbMC05XVswLTldWzAtOV18WzAtOV1bMC05XSc7CiAgICB9CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjMuMDAzIHN1YmNsYXVzZSAyLjIgYW5kIDEyLjEiOwogIH0KCiAgZ3JvdXBpbmcgUExNTklkIHsKICAgIGxlYWYgbWNjIHsKICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIHR5cGUgTWNjOwogICAgfQogICAgbGVhZiBtbmMgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgdHlwZSBNbmM7CiAgICB9CiAgICByZWZlcmVuY2UgIlRTIDM4LjQxMyBjbGF1c2UgOS4zLjMuNSI7CiAgfQoKICB0eXBlZGVmIE5jaSB7CiAgICBkZXNjcmlwdGlvbiAiTlIgQ2VsbCBJZGVudGl0eS4gVGhlIE5DSSBzaGFsbCBiZSBvZiBmaXhlZCBsZW5ndGggb2YgMzYgYml0cwogICAgICBhbmQgc2hhbGwgYmUgY29kZWQgdXNpbmcgZnVsbCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgICAgVGhlIGV4YWN0IGNvZGluZyBvZiB0aGUgTkNJIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIFBMTU4gb3BlcmF0b3IiOwogICAgcmVmZXJlbmNlICJUUyAyMy4wMDMiOwogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggMzY7CiAgICAgICAgcGF0dGVybiAnWzAxXSsnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggOTsKICAgICAgICBwYXR0ZXJuICdbYS1mQS1GMC05XSonOwogICAgICB9CiAgICB9CiAgfQoKICB0eXBlZGVmIE9wZXJhdGlvbmFsU3RhdGUgewogICAgcmVmZXJlbmNlICIzR1BQIFRTIDI4LjYyNSBhbmQgSVRVLVQgWC43MzEiOwogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gRElTQUJMRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyB0b3RhbGx5IGlub3BlcmFibGUuIjsKICAgICAgfQoKICAgICAgZW51bSBFTkFCTEVEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgcGFydGlhbGx5IG9yIGZ1bGx5IG9wZXJhYmxlLiI7CiAgICAgIH0KCiAgICB9CiAgfQoKICB0eXBlZGVmIEJhc2ljQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQWRtaW5pc3RyYXRpdmVTdGF0ZSB7CiAgICByZWZlcmVuY2UgIjNHUFAgVFMgMjguNjI1IGFuZCBJVFUtVCBYLjczMSI7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBMT0NLRUQgewogICAgICAgIHZhbHVlIDA7CiAgICAgICAgZGVzY3JpcHRpb24gIlRoZSByZXNvdXJjZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgZnJvbSBwZXJmb3JtaW5nCiAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4iOwogICAgICB9CgogICAgICBlbnVtIFVOTE9DS0VEIHsKICAgICAgICB2YWx1ZSAxOwogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgcmVzb3VyY2UgaXMgYWRtaW5pc3RyYXRpdmVseSBwZXJtaXR0ZWQgdG8gcGVyZm9ybQogICAgICAgICAgc2VydmljZXMgZm9yIGl0cyB1c2Vycy4gVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBpdHMgaW5oZXJlbnQKICAgICAgICAgIG9wZXJhYmlsaXR5LiI7CiAgICAgIH0KCiAgICAgIGVudW0gU0hVVFRJTkdET1dOIHsKICAgICAgICB2YWx1ZSAyOwogICAgICAgIGRlc2NyaXB0aW9uICJVc2Ugb2YgdGhlIHJlc291cmNlIGlzIGFkbWluaXN0cmF0aXZlbHkgcGVybWl0dGVkIHRvCiAgICAgICAgICBleGlzdGluZyBpbnN0YW5jZXMgb2YgdXNlIG9ubHkuIFdoaWxlIHRoZSBzeXN0ZW0gcmVtYWlucyBpbgogICAgICAgICAgdGhlIHNodXR0aW5nIGRvd24gc3RhdGUgdGhlIG1hbmFnZXIgb3IgdGhlIG1hbmFnZWQgZWxlbWVudAogICAgICAgICAgbWF5IGF0IGFueSB0aW1lIGNhdXNlIHRoZSByZXNvdXJjZSB0byB0cmFuc2l0aW9uIHRvIHRoZQogICAgICAgICAgbG9ja2VkIHN0YXRlLiI7CiAgICAgIH0KICAgIH0KICB9CgogIHR5cGVkZWYgQXZhaWxhYmlsaXR5U3RhdHVzIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgICBlbnVtIElOX1RFU1Q7CiAgICAgICAgICBlbnVtIEZBSUxFRDsKICAgICAgICAgIGVudW0gUE9XRVJfT0ZGOwogICAgICAgICAgZW51bSBPRkZfTElORTsKICAgICAgICAgIGVudW0gT0ZGX0RVVFk7CiAgICAgICAgICBlbnVtIERFUEVOREVOQ1k7CiAgICAgICAgICBlbnVtIERFR1JBREVEOwogICAgICAgICAgZW51bSBOT1RfSU5TVEFMTEVEOwogICAgICAgICAgZW51bSBMT0dfRlVMTDsKICAgICAgIH0KICB9CgogIHR5cGVkZWYgQ2VsbFN0YXRlIHsKICAgICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgICAgZW51bSBJRExFOwogICAgICAgIGVudW0gSU5BQ1RJVkU7CiAgICAgICAgZW51bSBBQ1RJVkU7CiAgICAgfQogIH0KCiAgdHlwZWRlZiBOcnBjaSB7CiAgICB0eXBlIHVpbnQzMjsKICAgIGRlc2NyaXB0aW9uICJQaHlzaWNhbCBDZWxsIElkZW50aXR5IChQQ0kpIG9mIHRoZSBOUiBjZWxsLiI7CiAgICByZWZlcmVuY2UgIlRTIDM2LjIxMSBzdWJjbGF1c2UgNi4xMSI7CiAgfQoKICB0eXBlZGVmIFRhYyB7CiAgICB0eXBlIGludDMyIHsKICAgICAgcmFuZ2UgMC4uMTY3NzcyMTUgOwogICAgfQogICAgZGVzY3JpcHRpb24gIlRyYWNraW5nIEFyZWEgQ29kZSI7CiAgICByZWZlcmVuY2UgIlRTIDIzLjAwMyBjbGF1c2UgMTkuNC4yLjMiOwogIH0KCiAgZ3JvdXBpbmcgVGFpR3JwIHsKICAgIGRlc2NyaXB0aW9uICJUaGlzIDw8ZGF0YVR5cGU+PiBkZWZpbmVzIGEgVHJhY2tpbmcgQXJlYSBJZGVudGl0eSAoVEFJKQogICAgICBhcyBzcGVjaWZpZWQgaW4gY2xhdXNlIDI4LjYgb2YgVFMgMjMuMDAzLCBjbGF1c2UgOC4yIG9mIFRTIDM4LjMwMAogICAgICBhbmQgY2xhdXNlIDkuMy4zLjExIG9mIFRTIDM4LjQxMy4gSXQgaXMgY29tcG9zZWQgb2YgdGhlIFBMTU4KICAgICAgaWRlbnRpZmllciAoUExNTi1JZCwgd2hpY2ggaXMgY29tcG9zZWQgb2YgdGhlIE1DQyBhbmQgTU5DKSBhbmQKICAgICAgdGhlIFRyYWNraW5nIEFyZWEgQ29kZSAoVEFDKS4gIjsKICAgIGxpc3QgcGxtbklkIHsKICAgICAgZGVzY3JpcHRpb24gIlBMTU4gSWRlbnRpdHkuIjsKICAgICAgbWluLWVsZW1lbnRzIDE7CiAgICAgIG1heC1lbGVtZW50cyAxOwogICAgICBrZXkgIm1jYyBtbmMiOwogICAgICB1c2VzIHR5cGVzM2dwcDpQTE1OSWQ7CiAgICB9CgogICAgbGVhZiB0YWMgeyB0eXBlIFRhYzsgfQogIH0KCiAgZ3JvdXBpbmcgR2VvQ29vcmRpbmF0ZUdycCB7CiAgICBkZXNjcmlwdGlvbiAiR2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9uIGVhcnRoIjsKICAgIGxlYWYgbGF0aXR1ZGUgewogICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDQ7CiAgICAgICAgcmFuZ2UgLTkwLi45MCA7CiAgICAgIH0KICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgIGRlc2NyaXB0aW9uICJMYXRpdHVkZSBiYXNlZCBvbiBXb3JsZCBHZW9kZXRpYyBTeXN0ZW0gKDE5ODQgdmVyc2lvbikKICAgICAgICBnbG9iYWwgcmVmZXJlbmNlIGZyYW1lIChXR1MgODQpLiBQb3NpdGl2ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICBub3J0aGVybiBoZW1pc3BoZXJlLiI7CiAgICAgIH0KCiAgICBsZWFmIGxvbmdpdHVkZSB7CiAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNDsKICAgICAgICByYW5nZSAtMTgwLi4xODAgOwogICAgICB9CiAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICBkZXNjcmlwdGlvbiAiTG9uZ2l0dWRlIGJhc2VkIG9uIFdvcmxkIEdlb2RldGljIFN5c3RlbSAoMTk4NCB2ZXJzaW9uKQogICAgICAgIGdsb2JhbCByZWZlcmVuY2UgZnJhbWUgKFdHUyA4NCkuIFBvc2l0aXZlIHZhbHVlcyBjb3JyZXNwb25kIHRvCiAgICAgICAgZGVncmVlcyBlYXN0IG9mIDAgZGVncmVlcyBsb25naXR1ZGUuIjsKICAgIH0KICB9CgogIGdyb3VwaW5nIEdlb0FyZWFHcnAgewogICAgZGVzY3JpcHRpb24gIlRoaXMgZGF0YSB0eXBlIGRlZmluZXMgYSBnZW9ncmFwaGljYWwgYXJlYS4KICAgICAgVGhlIGdlby1hcmVhIGlzIGRlZmluZWQgdXNpbmcgYSBjb252ZXggcG9seWdvbiBpbiB0aGUgYXR0cmlidXRlCiAgICAgICdjb252ZXhHZW9Qb2x5Z29uJy4iOwoKICAgIGxpc3QgY29udmV4R2VvUG9seWdvbiB7CiAgICAgIGRlc2NyaXB0aW9uICJTcGVjaWZpZXMgdGhlIGdlb2dyYXBoaWNhbCBhcmVhIHdpdGggYSBjb252ZXggcG9seWdvbi4KICAgICAgICBUaGUgY29udmV4IHBvbHlnb24gaXMgc3BlY2lmaWVkIGJ5IGl0cyBjb3JuZXJzLiI7CiAgICAgICAga2V5ICJsYXRpdHVkZSBsb25naXR1ZGUiOwogICAgICBtaW4tZWxlbWVudHMgMzsKICAgICAgb3JkZXJlZC1ieSB1c2VyOwoKICAgICAgdXNlcyBHZW9Db29yZGluYXRlR3JwOwogICAgfQogIH0KCiAgdHlwZWRlZiBBbWZSZWdpb25JZCB7CiAgICB0eXBlIHVuaW9uIHsKICAgICAgdHlwZSB1aW50OCA7CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlNldElkIHsKICAgIHR5cGUgdW5pb24gewogICAgICB0eXBlIHVpbnQxNiB7CiAgICAgICAgcmFuZ2UgJzAuLjEwMjMnOwogICAgICB9CiAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICBsZW5ndGggODsKICAgICAgICBwYXR0ZXJuICdbMDFdKic7CiAgICAgIH0KICAgIH0KICAgIHJlZmVyZW5jZSAiY2xhdXNlIDIuMTAuMSBvZiAzR1BQIFRTIDIzLjAwMyI7CiAgfQoKICB0eXBlZGVmIEFtZlBvaW50ZXIgewogICAgdHlwZSB1bmlvbiB7CiAgICAgIHR5cGUgdWludDggewogICAgICAgIHJhbmdlICcwLi42Myc7CiAgICAgIH0KICAgICAgdHlwZSBzdHJpbmcgewogICAgICAgIGxlbmd0aCA2OwogICAgICAgIHBhdHRlcm4gJ1swMV0qJzsKICAgICAgfQogICAgfQogICAgcmVmZXJlbmNlICJjbGF1c2UgMi4xMC4xIG9mIDNHUFAgVFMgMjMuMDAzIjsKICB9CgogIGdyb3VwaW5nIEFtZklkZW50aWZpZXIgewogICAgbGVhZiBhbWZSZWdpb25JZCB7CiAgICAgIHR5cGUgQW1mUmVnaW9uSWQ7CiAgICB9CiAgICBsZWFmIGFtZlNldElkIHsKICAgICAgdHlwZSBBbWZTZXRJZDsKICAgIH0KICAgIGxlYWYgYW1mUG9pbnRlciB7CiAgICAgIHR5cGUgQW1mUG9pbnRlcjsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJUaGUgQU1GSSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIEFNRiBSZWdpb24gSUQsCiAgICAgIGFuIEFNRiBTZXQgSUQgYW5kIGFuIEFNRiBQb2ludGVyLgogICAgICBUaGUgQU1GIFJlZ2lvbiBJRCBpZGVudGlmaWVzIHRoZSByZWdpb24sCiAgICAgIHRoZSBBTUYgU2V0IElEIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiBTZXQgd2l0aGluIHRoZSBBTUYgUmVnaW9uLCBhbmQKICAgICAgdGhlIEFNRiBQb2ludGVyIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEFNRiB3aXRoaW4gdGhlIEFNRiBTZXQuICI7CiAgfQoKLy8gdHlwZSBkZWZpbml0aW9ucyBlc3BlY2lhbGx5IGZvciBjb3JlIE5GcwoKICB0eXBlZGVmIE5mVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOUkY7CiAgICAgIGVudW0gVURNOwogICAgICBlbnVtIEFNRjsKICAgICAgZW51bSBTTUY7CiAgICAgIGVudW0gQVVTRjsKICAgICAgZW51bSBORUY7CiAgICAgIGVudW0gUENGOwogICAgICBlbnVtIFNNU0Y7CiAgICAgIGVudW0gTlNTRjsKICAgICAgZW51bSBVRFI7CiAgICAgIGVudW0gTE1GOwogICAgICBlbnVtIEdNTEM7CiAgICAgIGVudW0gNUdfRUlSOwogICAgICBlbnVtIFNFUFA7CiAgICAgIGVudW0gVVBGOwogICAgICBlbnVtIE4zSVdGOwogICAgICBlbnVtIEFGOwogICAgICBlbnVtIFVEU0Y7CiAgICAgIGVudW0gQlNGOwogICAgICBlbnVtIENIRjsKICAgIH0KICB9CgogIHR5cGVkZWYgTm90aWZpY2F0aW9uVHlwZSB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBOMV9NRVNTQUdFUzsKICAgICAgZW51bSBOMl9JTkZPUk1BVElPTjsKICAgICAgZW51bSBMT0NBVElPTl9OT1RJRklDQVRJT047CiAgICB9CiAgfQoKICB0eXBlZGVmIExvYWQgewogICAgZGVzY3JpcHRpb24gIkxhdGVzdCBrbm93biBsb2FkIGluZm9ybWF0aW9uIG9mIHRoZSBORiwgcGVyY2VudGFnZSAiOwogICAgdHlwZSB1aW50OCB7CiAgICAgIHJhbmdlIDAuLjEwMDsKICAgIH0KICB9CgogIHR5cGVkZWYgTjFNZXNzYWdlQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gNUdNTTsKICAgICAgZW51bSBTTTsKICAgICAgZW51bSBMUFA7CiAgICAgIGVudW0gU01TOwogICAgfQogIH0KCiAgdHlwZWRlZiBOMkluZm9ybWF0aW9uQ2xhc3MgewogICAgdHlwZSBlbnVtZXJhdGlvbiB7CiAgICAgIGVudW0gU007CiAgICAgIGVudW0gTlJQUEE7CiAgICAgIGVudW0gUFdTOwogICAgICBlbnVtIFBXU19CQ0FMOwogICAgICBlbnVtIFBXU19SRjsKICAgIH0KICB9CgogIGdyb3VwaW5nIERlZmF1bHROb3RpZmljYXRpb25TdWJzY3JpcHRpb24gewoKICAgIGxlYWYgbm90aWZpY2F0aW9uVHlwZSB7CiAgICAgIHR5cGUgTm90aWZpY2F0aW9uVHlwZTsKICAgIH0KCiAgICBsZWFmIGNhbGxiYWNrVXJpIHsKICAgICAgdHlwZSBpbmV0OnVyaTsKICAgIH0KCiAgICBsZWFmIG4xTWVzc2FnZUNsYXNzIHsKICAgICAgdHlwZSBOMU1lc3NhZ2VDbGFzczsKICAgIH0KCiAgICBsZWFmIG4ySW5mb3JtYXRpb25DbGFzcyB7CiAgICAgIHR5cGUgTjJJbmZvcm1hdGlvbkNsYXNzOwogICAgfQogIH0KCiAgZ3JvdXBpbmcgSXB2NEFkZHJlc3NSYW5nZSB7CiAgbGVhZiBzdGFydCB7CiAgICB0eXBlIGluZXQ6aXB2NC1hZGRyZXNzOwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY0LWFkZHJlc3M7CiAgICB9CiAgfQoKICBncm91cGluZyBJcHY2UHJlZml4UmFuZ2UgewogIGxlYWYgc3RhcnQgewogICAgdHlwZSBpbmV0OmlwdjYtcHJlZml4OwogICAgfQogIGxlYWYgZW5kIHsKICAgIHR5cGUgaW5ldDppcHY2LXByZWZpeDsKICAgIH0KICB9CgogIHR5cGVkZWYgTnNpSWQgewogICAgdHlwZSBzdHJpbmc7CiAgfQoKICB0eXBlZGVmIFVlTW9iaWxpdHlMZXZlbCB7CiAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgZW51bSBTVEFUSU9OQVJZOwogICAgICBlbnVtIE5PTUFESUM7CiAgICAgIGVudW0gUkVTVFJJQ1RFRF9NT0JJTElUWTsKICAgICAgZW51bSBGVUxMWV9NT0JJTElUWTsKICAgIH0KICB9CgogIHR5cGVkZWYgUmVzb3VyY2VTaGFyaW5nTGV2ZWwgewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIFNIQVJFRDsKICAgICAgICBlbnVtIE5PVF9TSEFSRUQ7CiAgICAgIH0KICB9CgogIHR5cGVkZWYgVHhEaXJlY3Rpb24gewogICAgICB0eXBlIGVudW1lcmF0aW9uIHsKICAgICAgICBlbnVtIERMOwogICAgICAgIGVudW0gVUw7CiAgICAgICAgZW51bSBETF9BTkRfVUw7CiAgICAgIH0KICB9CgogIGdyb3VwaW5nIEFkZHJlc3NXaXRoVmxhbiB7CiAgICBsZWFmIGlwQWRkcmVzcyB7CiAgICAgIHR5cGUgaW5ldDppcC1hZGRyZXNzOwogICAgfQogICAgbGVhZiB2bGFuSWQgewogICAgICAgdHlwZSB1aW50MTY7CiAgICB9CiAgfQoKICAvKiBEaXN0aW5ndWlzaGVkTmFtZSBwYXR0ZXJuIGlzIGJ1aWx0IHVwIGJhc2VkIG9uIHRoZQogICAgRUJORiBpbiAzMi4zMDAgY2xhdXNlIDcuMyAgRUJORiBvZiBETiBTdHJpbmcgUmVwcmVzZW50YXRpb24KCiAgICBsZWFmIEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vICBTYW1lIHBhdHRlcm4gYXMgTG9jYWxETgogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPygsW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKic7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQgICBNZS5teWtleT0xIGFsbG93ZWQKICAgICAgLy8gIChmdWxsTG9jYWxSRE4pKCwoZnVsbExvY2FsUkROKSkqCiAgICAgIHBhdHRlcm4gJygoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pKSgsKChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qfChbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qXC5bYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qKSk9KChbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykpKSonOwogICAgfSB9CgogICAgbGVhZiBMb2NhbEROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIExvY2FsUkROICwgeyBSRE5TZXBhcmF0b3IgLCBMb2NhbFJETiB9ICAgIFJETlNlcGFyYXRvciBpcyBhIHNpbmdsZSAsIG5vIHNwYWNlIG9yIFxSIGFsbG93ZWQKICAgICAgLy8gIExvY2FsUkROKCxMb2NhbFJETikqCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KCxbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0gfQoKICAgIGxlYWYgZnVsbExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgZnVsbExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUKICAgICAgcGF0dGVybiAnKFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSp8KFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSopKT0oKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/KSc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsUkROIHsgdHlwZSBzdHJpbmcgeyAgIC8vIHNhbWUgYXMgTG9jYWxETkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIGZ1bGxMb2NhbEROQXR0cmlidXRlVHlwZUFuZFZhbHVlIHsgdHlwZSBzdHJpbmcgeyAvLyBMb2NhbEROQXR0cmlidXRlVHlwZSAsIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZVNlcGFyYXRvciAsIFJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICAvLyBwYXR0ZXJuIExvY2FsRE5BdHRyaWJ1dGVUeXBlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICcoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKikpPSgoW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSooW14sPSs8PiM7XFwiXHJcbiogXXwoXFxbYS1mQS1GMC05XXsyfSkpKT8pJzsKICAgIH0gfQoKICAgICAgLy8gbGltaXRhdGlvbjogTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlbm90IHN1cHBvcnRlZCBNZS5teWtleT0xCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUgeyB0eXBlIHN0cmluZyB7CiAgICAgIC8vIGVibmYxICAgICAgICAgIExvY2FsRE5BdHRyaWJ1dGVUeXBlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIGVibmYyLWxpbWl0ZWQgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlICwgQXR0cmlidXRlVHlwZUFuZFZhbHVlU2VwYXJhdG9yICwgUmVndWxhckF0dHJpYnV0ZVZhbHVlCiAgICAgIC8vIHBhdHRlcm4gICAgICAgIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlPVJlZ3VsYXJBdHRyaWJ1dGVWYWx1ZQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qPShbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKihbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPyc7CiAgICB9IH0KCiAgICBsZWFmIExvY2FsRE5BdHRyaWJ1dGVUeXBlIHsgdHlwZSBzdHJpbmcgeyAgIC8vIE5hbWVPZkNsYXNzV2l0aElkQXR0cmlidXRlIHwgTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlICBSRE5TZXBhcmF0b3IgaXMgYSBzaW5nbGUgLCBubyBzcGFjZSBvciBcUiBhbGxvd2VkCiAgICAgIC8vICBOYW1lT2ZDbGFzc1dpdGhJZEF0dHJpYnV0ZXxOYW1lc09mQ2xhc3NBbmROYW1pbmdBdHRyaWJ1dGUKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKnwoW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKlwuW2Etel1bXiw9Kzw+IztcXCJcclxuKi5dKiknOwogICAgfSB9CgogICAgbGVhZiBSZWd1bGFyQXR0cmlidXRlVmFsdWUgeyB0eXBlIHN0cmluZyB7ICAgICAgIC8vICggQXR0cmlidXRlVmFsdWVDaGFyIC0gU3BhY2VDaGFyICkgLCBbIHsgQXR0cmlidXRlVmFsdWVDaGFyIH0gLCAoIEF0dHJpYnV0ZVZhbHVlQ2hhciAtIFNwYWNlQ2hhciApIF0KICAgICAgcGF0dGVybiAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSgoW14sPSs8PiM7XFwiXHJcbipdfChcXFthLWZBLUYwLTldezJ9KSkqKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWVzT2ZDbGFzc0FuZE5hbWluZ0F0dHJpYnV0ZSAgeyB0eXBlIHN0cmluZyB7ICAvLyBDbGFzc05hbWUgLCBDbGFzc05hbWluZ0F0dHJpYnV0ZVNlcGFyYXRvciAsIE5hbWluZ0F0dHJpYnV0ZU5hbWUKICAgICAgLy8gcGF0dGVybjogQ2xhc3NOYW1lXC5OYW1pbmdBdHRyaWJ1dGVOYW1lCiAgICAgIHBhdHRlcm4gJ1tBLVpdW14sPSs8PiM7XFwiXHJcbiouXSpcLlthLXpdW14sPSs8PiM7XFwiXHJcbiouXSonIDsKICAgIH0gfQoKICAgIGxlYWYgcmVzdHJpY3RpdmVDbGFzc05hbWUgeyB0eXBlIHN0cmluZyB7ICAgICAvLwogICAgICBwYXR0ZXJuICdbYS16QS1aXVthLXpBLVowLTktX10qJyA7CiAgICB9IH0KCiAgICBsZWFmIENsYXNzTmFtZSB7IHR5cGUgc3RyaW5nIHsgICAgIC8vIENhcGl0YWxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbQS1aXVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgICBsZWFmIE5hbWluZ0F0dHJpYnV0ZU5hbWUgeyB0eXBlIHN0cmluZyB7ICAgLy8gU21hbGxMZXR0ZXJDaGFyICwgeyBMb2NhbEROQXR0cmlidXRlVHlwZUNoYXIgfQogICAgICBwYXR0ZXJuICdbYS16XVteLD0rPD4jO1xcIlxyXG4qLl0qJyA7CiAgICB9IH0KCiAgKi8KICB0eXBlZGVmIERpc3Rpbmd1aXNoZWROYW1lIHsKICAgIHR5cGUgc3RyaW5nIHsKICAgICAgcGF0dGVybiAnW0EtWl1bXiw9Kzw+IztcXCJcclxuKi5dKj0oW14sPSs8PiM7XFwiXHJcbiogXXwnCiAgICAgICsgJyhcXFthLWZBLUYwLTldezJ9KSkoKFteLD0rPD4jO1xcIlxyXG4qXXwoXFxbYS1mQS1GMC05XXsyfSkpKicKICAgICAgKyAnKFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKSk/JwogICAgICArICcoLFtBLVpdW14sPSs8PiM7XFwiXHJcbiouXSo9KFteLD0rPD4jO1xcIlxyXG4qIF18KFxcW2EtZkEtRjAtOV17Mn0pKScKICAgICAgKyAnKChbXiw9Kzw+IztcXCJcclxuKl18KFxcW2EtZkEtRjAtOV17Mn0pKSonCiAgICAgICsgJyhbXiw9Kzw+IztcXCJcclxuKiBdfChcXFthLWZBLUYwLTldezJ9KSkpPykqJzsKICAgIH0KICAgIGRlc2NyaXB0aW9uICJSZXByZXNlbnRzIHRoZSAzR1BQIHN0YW5kYXJkIGZvciBEaXN0aW5ndWlzaGVkTmFtZS4KCiAgICAgIExpbWl0YXRpb25zOgogICAgICAtIFJETlNlcGFyYXRvcjogZG9uJ3QgYWxsb3cgU3BhY2VDaGFyIG9yIENhcnJpYWdlUmV0dXJuQ2hhcgogICAgICAtIE51bGxETjogRGlzYWxsb3cgbnVsbEROIHRoYXQgaXMgdGhlIHNhbWUgYXMgbm90IHByb3ZpZGluZyBhIEROCiAgICAgIC0gTmFtZXNPZkNsYXNzQW5kTmFtaW5nQXR0cmlidXRlIGZvcm1hdCBub3QgYWxsb3dlZAogICAgICAgIChlZy4gTWFuYWdlZEVsZW1lbnQubXlrZXk9MzQ1NDM2KSI7CiAgICByZWZlcmVuY2UgICIzR1BQIFRTIDMyLjMwMCI7CiAgfQoKICB0eXBlZGVmIFFPZmZzZXRSYW5nZSAgewogICAgdHlwZSBpbnQ4IHsKICAgICAgcmFuZ2UgIi0yNCB8IC0yMiB8IC0yMCB8IC0xOCB8IC0xNiB8IC0xNCB8IC0xMiB8IC0xMCB8IC04IHwgLTYgfCAiICsKICAgICAgICAiIC01IHwgLTQgfCAtMyB8IC0yIHwgLTEgfCAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgOCB8IDEwIHwgIiArCiAgICAgICAgIiAxMiB8IDE0IHwgMTYgfCAxOCB8IDIwIHwgMjIgfCAyNCI7CiAgICB9CiAgICB1bml0cyBkQjsKICB9CgogIGdyb3VwaW5nIFJlcG9ydGluZ0N0cmwgewogICAgY2hvaWNlIHJlcG9ydGluZ0N0cmwgewogICAgICBtYW5kYXRvcnkgdHJ1ZTsKICAgICAgZGVzY3JpcHRpb24gIgogICAgICAgIFRoaXMgY2hvaWNlIGRlZmluZXMgdGhlIG1ldGhvZCBmb3IgcmVwb3J0aW5nIGNvbGxlY3RlZCBwZXJmb3JtYW5jZQogICAgICAgIG1ldHJpY3MgdG8gTW5TIGNvbnN1bWVycyBhcyB3ZWxsIGFzIHRoZSBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmluZyB0aGUKICAgICAgICByZXBvcnRpbmcgZnVuY3Rpb24uIEl0IGlzIGEgY2hvaWNlIGJldHdlZW4gdGhlIGNvbnRyb2wgcGFyYW1ldGVyCiAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnRpbmcgbWV0aG9kcywgd2hvc2UgcHJlc2VuY2Ugc2VsZWN0cyB0aGUKICAgICAgICByZXBvcnRpbmcgbWV0aG9kIGFzIGZvbGxvd3M6CgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgTW5TCiAgICAgICAgcHJvZHVjZXIgc2hhbGwgc3RvcmUgZmlsZXMgb24gdGhlIE1uUyBwcm9kdWNlciBhdCBhIGxvY2F0aW9uIHNlbGVjdGVkCiAgICAgICAgYnkgdGhlIE1uUyBwcm9kdWNlciBhbmQsIG9uIGNvbmRpdGlvbiB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YnNjcmlwdGlvbgogICAgICAgIGlzIGluIHBsYWNlLCBpbmZvcm0gdGhlIE1uUyBjb25zdW1lciBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIG5ldwogICAgICAgIGZpbGVzIGFuZCB0aGUgZmlsZSBsb2NhdGlvbiB1c2luZyB0aGUgbm90aWZ5RmlsZVJlYWR5IG5vdGlmaWNhdGlvbi4KICAgICAgICBJbiBjYXNlIHRoZSBwcmVwYXJhdGlvbiBvZiBhIGZpbGUgZmFpbHMsICdub3RpZnlGaWxlUHJlcGFyYXRpb25FcnJvcicKICAgICAgICBzaGFsbCBiZSBzZW50IGluc3RlYWQuCgogICAgICAgIC0gV2hlbiB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGFuZCAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycKICAgICAgICBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LCB0aGVuIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgYmVoYXZlIGxpa2UKICAgICAgICBkZXNjcmliZWQgZm9yIHRoZSBjYXNlIHRoYXQgb25seSB0aGUgJ2ZpbGVSZXBvcnRpbmdQZXJpb2QnIGlzIHByZXNlbnQuCiAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBNblMgcHJvZHVjZXIgc2hhbGwgY3JlYXRlIG9uIGJlaGFsZiBvZiB0aGUgTW5TCiAgICAgICAgY29uc3VtZXIgYSBzdWJzY3JpcHRpb24sIHVzaW5nICdOdGZTdWJzY3JpcHRpb25Db250cm9sJywgZm9yIHRoZQogICAgICAgIG5vdGlmaWNhdGlvbiB0eXBlcyAnbm90aWZ5TU9JQ3JlYXRpb24nIGFuZCAnbm90aWZ5TU9JRGVsZXRpb24nIHJlbGF0ZWQKICAgICAgICB0byB0aGUgJ0ZpbGUnIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgcHJvZHVjZWQgbGF0ZXIuIEluIGNhc2UgYW4gZXhpc3RpbmcKICAgICAgICBzdWJzY3JpcHRpb24gZG9lcyBhbHJlYWR5IGluY2x1ZGUgdGhlICdGaWxlJyBpbnN0YW5jZXMgdG8gYmUgcHJvZHVjZWQsCiAgICAgICAgbm8gbmV3IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBjcmVhdGVkLiBUaGUKICAgICAgICAnbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcycgYXR0cmlidXRlIGluIHRoZSBjcmVhdGVkCiAgICAgICAgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIHNoYWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgJ25vdGlmaWNhdGlvblJlY2lwaWVudEFkZHJlc3MnIGluIHRoZSByZWxhdGVkICdQZXJmTWV0cmljSm9iJy4gVGhpcwogICAgICAgIGZlYXR1cmUgaXMgY2FsbGVkIGltcGxpY2l0IG5vdGlmaWNhdGlvbiBzdWJzY3JpcHRpb24sIGFzIG9wcG9zZWQgdG8gdGhlCiAgICAgICAgY2FzZSB3aGVyZSB0aGUgTW5TIGNvbnN1bWVyIGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiAoZXhwbGljaXQKICAgICAgICBub3RpZmljYXRpb24gc3Vic2NyaXB0aW9uKS4gV2hlbiB0aGUgcmVsYXRlZCAnUGVyZk1ldHJpY0pvYicgaXMKICAgICAgICBkZWxldGVkLCB0aGUgJ050ZlN1YnNjcmlwdGlvbkNvbnRyb2wnIGluc3RhbmNlIGNyZWF0ZWQgZHVlIHRvIHRoZQogICAgICAgIHJlcXVlc3QgZm9yIGltcGxpY2l0IHN1YnNjcmlwdGlvbiBzaGFsbCBiZSBkZWxldGVkIGFzIHdlbGwuCgogICAgICAgIC0gV2hlbiBvbmx5IHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGFuZCBmaWxlTG9jYXRpb24gYXR0cmlidXRlcyBhcmUKICAgICAgICBwcmVzZW50LCB0aGUgTW5TIHByb2R1Y2VyIHNoYWxsIHN0b3JlIHRoZSBmaWxlcyBvbiBhIE1uUyBjb25zdW1lciwgdGhhdAogICAgICAgIGNhbiBiZSBhbnkgZW50aXR5IHN1Y2ggYXMgYSBmaWxlIHNlcnZlciwgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQogICAgICAgIGZpbGVMb2NhdGlvbi4gTm8gbm90aWZpY2F0aW9uIGlzIGVtaXR0ZWQgYnkgdGhlIE1uUyBwcm9kdWNlci4KCiAgICAgICAgLSBXaGVuIG9ubHkgdGhlIHN0cmVhbVRhcmdldCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgdGhlIE1uUyBwcm9kdWNlcgogICAgICAgIHNoYWxsIHN0cmVhbSB0aGUgZGF0YSB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHN0cmVhbVRhcmdldC4KCiAgICAgICAgRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2RzIHRoZSBmaWxlUmVwb3J0aW5nUGVyaW9kIGF0dHJpYnV0ZQogICAgICAgIHNwZWNpZmllcyB0aGUgdGltZSB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlCiAgICAgICAgc3RvcmVkIGludG8gdGhlIHNhbWUgZmlsZSBiZWZvcmUgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBhIG5ldyBmaWxlIGlzCiAgICAgICAgb3BlbmVkLiI7CgogICAgICBjYXNlIGZpbGUtYmFzZWQtcmVwb3J0aW5nIHsKICAgICAgICBsZWFmIGZpbGVSZXBvcnRpbmdQZXJpb2QgewogICAgICAgICAgdHlwZSB1aW50MzIgewogICAgICAgICAgICByYW5nZSAxLi5tYXg7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyBtaW51dGVzOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiRm9yIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgdGhpcyBpcyB0aGUgdGltZQogICAgICAgICAgICB3aW5kb3cgZHVyaW5nIHdoaWNoIGNvbGxlY3RlZCBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCBpbnRvIHRoZSBzYW1lCiAgICAgICAgICAgIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCBhbmQgYSBuZXcgZmlsZSBpcyBvcGVuZWQuCiAgICAgICAgICAgIFRoZSB0aW1lLXBlcmlvZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGdyYW51bGFyaXR5UGVyaW9kLgoKICAgICAgICAgICAgQXBwbGljYWJsZSB3aGVuIHRoZSBmaWxlLWJhc2VkIHJlcG9ydGluZyBtZXRob2QgaXMgc3VwcG9ydGVkLiI7CiAgICAgICAgfQogICAgICAgIGNob2ljZSByZXBvcnRpbmctdGFyZ2V0IHsKICAgICAgICAgIGNhc2UgZmlsZS10YXJnZXQgewogICAgICAgICAgICBsZWFmIGZpbGVMb2NhdGlvbiB7CiAgICAgICAgICAgIHR5cGUgc3RyaW5nIDsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFwcGxpY2FibGUgYW5kIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBmaWxlLWJhc2VkCiAgICAgICAgICAgICAgcmVwb3J0aW5nIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgZmlsZXMgYXJlIHN0b3JlZCBvbiB0aGUgTW5TCiAgICAgICAgICAgICAgY29uc3VtZXIuIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY2FzZSBub3RpZmljYXRpb24tdGFyZ2V0IHsKICAgICAgICAgICAgbGVhZiBub3RpZmljYXRpb25SZWNpcGllbnRBZGRyZXNzIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNdXN0IGJlIHByZXNlbnQgd2hlbiB0aGUgbm90aWZpY2F0aW9uLWJhc2VkIHJlcG9ydGluZwogICAgICAgICAgICAgIG1ldGhvZCBpcyBzdXBwb3J0ZWQsIGFuZCB0aGUgdGhlIGZpbGVzIGFyZSBhdmFpbGFibGUgYXMKICAgICAgICAgICAgICBub3RpZmljYXRpb25zIGZvciB0aGUgTW5TIGNvbnN1bWVyIHRvIHN1YnNjcmliZSB0by4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gIldoZW4gbmV0aWhlciBmaWxlTG9jYXRpb24gb3Igbm90aWZpY2F0aW9uUmVjaXBpZW50QWRkcmVzcwogICAgICAgICAgYXJlIHByZXNlbnQsIHRoZSBmaWxlcyBhcmUgc3RvcmVkIGFuZCBhdmFpbGFibGUgdG8gdGhlIE1uUyBjb25zdW1lcgogICAgICAgICAgaWYgdGhlIE1uUyBzdWJzY3JpYmVzIHRvIHRoZSBub3RpZnlGaWxlUmVhZHkgbm90aWZpY2F0aW9uLiI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjYXNlIHN0cmVhbS1iYXNlZC1yZXBvcnRpbmcgewogICAgICAgIGxlYWYgc3RyZWFtVGFyZ2V0IHsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgbWFuZGF0b3J5IHRydWU7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQXBwbGljYWJsZSB3aGVuIHN0cmVhbS1iYXNlZCByZXBvcnRpbmcgbWV0aG9kIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo=
+ietf-geo-location urn:ietf:params:xml:ns:yang:ietf-geo-location \N [] 2022-02-11 bW9kdWxlIGlldGYtZ2VvLWxvY2F0aW9uIHsKICB5YW5nLXZlcnNpb24gMS4xOwogIG5hbWVzcGFjZSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczp5YW5nOmlldGYtZ2VvLWxvY2F0aW9uIjsKICBwcmVmaXggZ2VvOwogIGltcG9ydCBpZXRmLXlhbmctdHlwZXMgewogICAgcHJlZml4IHlhbmc7CiAgICByZWZlcmVuY2UgIlJGQyA2OTkxOiBDb21tb24gWUFORyBEYXRhIFR5cGVzIjsKICB9CgogIG9yZ2FuaXphdGlvbgogICAgIklFVEYgTkVUTU9EIFdvcmtpbmcgR3JvdXAgKE5FVE1PRCkiOwogIGNvbnRhY3QKICAgIldHIFdlYjogICA8aHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy93Zy9uZXRtb2QvPgogICAgV0cgTGlzdDogIDxtYWlsdG86bmV0bW9kQGlldGYub3JnPgoKICAgIEVkaXRvcjogICBDaHJpc3RpYW4gSG9wcHMKICAgICAgICAgICAgICA8bWFpbHRvOmNob3Bwc0BjaG9wcHMub3JnPiI7CgogIGRlc2NyaXB0aW9uCiAgICAiVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGdyb3VwaW5nIG9mIGEgY29udGFpbmVyIG9iamVjdCBmb3IKICAgICBzcGVjaWZ5aW5nIGEgbG9jYXRpb24gb24gb3IgYXJvdW5kIGFuIGFzdHJvbm9taWNhbCBvYmplY3QgKGUuZy4sCiAgICAgJ2VhcnRoJykuCgogICAgIFRoZSBrZXkgd29yZHMgJ01VU1QnLCAnTVVTVCBOT1QnLCAnUkVRVUlSRUQnLCAnU0hBTEwnLCAnU0hBTEwKICAgICBOT1QnLCAnU0hPVUxEJywgJ1NIT1VMRCBOT1QnLCAnUkVDT01NRU5ERUQnLCAnTk9UIFJFQ09NTUVOREVEJywKICAgICAnTUFZJywgYW5kICdPUFRJT05BTCcgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKICAgICBkZXNjcmliZWQgaW4gQkNQIDE0IChSRkMgMjExOSkgKFJGQyA4MTc0KSB3aGVuLCBhbmQgb25seSB3aGVuLAogICAgIHRoZXkgYXBwZWFyIGluIGFsbCBjYXBpdGFscywgYXMgc2hvd24gaGVyZS4KCiAgICAgQ29weXJpZ2h0IChjKSAyMDIyIElFVEYgVHJ1c3QgYW5kIHRoZSBwZXJzb25zIGlkZW50aWZpZWQgYXMKICAgICBhdXRob3JzIG9mIHRoZSBjb2RlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpcyBwZXJtaXR0ZWQgcHVyc3VhbnQgdG8sCiAgICAgYW5kIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2UgdGVybXMgY29udGFpbmVkIGluLCB0aGUKICAgICBSZXZpc2VkIEJTRCBMaWNlbnNlIHNldCBmb3J0aCBpbiBTZWN0aW9uIDQuYyBvZiB0aGUKICAgICBJRVRGIFRydXN0J3MgTGVnYWwgUHJvdmlzaW9ucyBSZWxhdGluZyB0byBJRVRGIERvY3VtZW50cwogICAgIChodHRwczovL3RydXN0ZWUuaWV0Zi5vcmcvbGljZW5zZS1pbmZvKS4KCiAgICAgVGhpcyB2ZXJzaW9uIG9mIHRoaXMgWUFORyBtb2R1bGUgaXMgcGFydCBvZiBSRkMgOTE3OQogICAgIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzkxNzkpOyBzZWUgdGhlIFJGQyBpdHNlbGYKICAgICBmb3IgZnVsbCBsZWdhbCBub3RpY2VzLiI7CgogIHJldmlzaW9uIDIwMjItMDItMTEgewogICAgZGVzY3JpcHRpb24KICAgICAgIkluaXRpYWwgUmV2aXNpb24iOwogICAgcmVmZXJlbmNlCiAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgfQoKICBmZWF0dXJlIGFsdGVybmF0ZS1zeXN0ZW1zIHsKICAgIGRlc2NyaXB0aW9uCiAgICAgICJUaGlzIGZlYXR1cmUgbWVhbnMgdGhlIGRldmljZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIGxvY2F0aW9ucwogICAgICAgdXNpbmcgYWx0ZXJuYXRlIHN5c3RlbXMgZm9yIHJlZmVyZW5jZSBmcmFtZXMuIjsKICB9CgogIGdyb3VwaW5nIGdlby1sb2NhdGlvbiB7CiAgICBkZXNjcmlwdGlvbgogICAgICAiR3JvdXBpbmcgdG8gaWRlbnRpZnkgYSBsb2NhdGlvbiBvbiBhbiBhc3Ryb25vbWljYWwgb2JqZWN0LiI7CgogICAgY29udGFpbmVyIGdlby1sb2NhdGlvbiB7CiAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgIkEgbG9jYXRpb24gb24gYW4gYXN0cm9ub21pY2FsIGJvZHkgKGUuZy4sICdlYXJ0aCcpCiAgICAgICAgIHNvbWV3aGVyZSBpbiBhIHVuaXZlcnNlLiI7CgogICAgICBjb250YWluZXIgcmVmZXJlbmNlLWZyYW1lIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBGcmFtZSBvZiBSZWZlcmVuY2UgZm9yIHRoZSBsb2NhdGlvbiB2YWx1ZXMuIjsKCiAgICAgICAgbGVhZiBhbHRlcm5hdGUtc3lzdGVtIHsKICAgICAgICAgIGlmLWZlYXR1cmUgImFsdGVybmF0ZS1zeXN0ZW1zIjsKICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGFzdHJvbm9taWNhbCBib2R5IGFuZAogICAgICAgICAgICAgZ2VvZGV0aWMtZGF0dW0gaXMgZGVmaW5lZC4gIE5vcm1hbGx5LCB0aGlzIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAgcHJlc2VudCBhbmQgdGhlIHN5c3RlbSBpcyB0aGUgbmF0dXJhbCB1bml2ZXJzZTsgaG93ZXZlciwKICAgICAgICAgICAgIHdoZW4gcHJlc2VudCwgdGhpcyB2YWx1ZSBhbGxvd3MgZm9yIHNwZWNpZnlpbmcgYWx0ZXJuYXRlCiAgICAgICAgICAgICBzeXN0ZW1zIChlLmcuLCB2aXJ0dWFsIHJlYWxpdGllcykuICBBbiBhbHRlcm5hdGUtc3lzdGVtCiAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZGVmaW5pdGlvbiAoYnV0IG5vdCB0aGUgdHlwZSkgb2YgdGhlIG90aGVyCiAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZS4iOwogICAgICAgIH0KICAgICAgICBsZWFmIGFzdHJvbm9taWNhbC1ib2R5IHsKICAgICAgICAgIHR5cGUgc3RyaW5nIHsKICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdCAiZWFydGgiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkFuIGFzdHJvbm9taWNhbCBib2R5IGFzIG5hbWVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsCiAgICAgICAgICAgICBBc3Ryb25vbWljYWwgVW5pb24gKElBVSkgb3IgYWNjb3JkaW5nIHRvIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgIHN5c3RlbSBpZiBzcGVjaWZpZWQuICBFeGFtcGxlcyBpbmNsdWRlICdzdW4nIChvdXIgc3RhciksCiAgICAgICAgICAgICAnZWFydGgnIChvdXIgcGxhbmV0KSwgJ21vb24nIChvdXIgbW9vbiksICdlbmNlbGFkdXMnIChhCiAgICAgICAgICAgICBtb29uIG9mIFNhdHVybiksICdjZXJlcycgKGFuIGFzdGVyb2lkKSwgYW5kCiAgICAgICAgICAgICAnNjdwL2NodXJ5dW1vdi1nZXJhc2ltZW5rbyAoYSBjb21ldCkuICBUaGUgQVNDSUkgdmFsdWUKICAgICAgICAgICAgIFNIT1VMRCBoYXZlIHVwcGVyY2FzZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCBub3QKICAgICAgICAgICAgIGluY2x1ZGUgY29udHJvbCBjaGFyYWN0ZXJzIChpLmUuLCB2YWx1ZXMgMzIuLjY0LCBhbmQKICAgICAgICAgICAgIDkxLi4xMjYpLiAgQW55IHByZWNlZGluZyAndGhlJyBpbiB0aGUgbmFtZSBTSE9VTEQgTk9UIGJlCiAgICAgICAgICAgICBpbmNsdWRlZC4iOwogICAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAgICJodHRwczovL3d3dy5pYXUub3JnLyI7CiAgICAgICAgfQogICAgICAgIGNvbnRhaW5lciBnZW9kZXRpYy1zeXN0ZW0gewogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBnZW9kZXRpYyBzeXN0ZW0gb2YgdGhlIGxvY2F0aW9uIGRhdGEuIjsKICAgICAgICAgIGxlYWYgZ2VvZGV0aWMtZGF0dW0gewogICAgICAgICAgICB0eXBlIHN0cmluZyB7CiAgICAgICAgICAgICAgcGF0dGVybiAnWyAtQFxbLVxeXy1+XSonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkEgZ2VvZGV0aWMtZGF0dW0gZGVmaW5pbmcgdGhlIG1lYW5pbmcgb2YgbGF0aXR1ZGUsCiAgICAgICAgICAgICAgIGxvbmdpdHVkZSwgYW5kIGhlaWdodC4gIFRoZSBkZWZhdWx0IHdoZW4gdGhlCiAgICAgICAgICAgICAgIGFzdHJvbm9taWNhbCBib2R5IGlzICdlYXJ0aCcgaXMgJ3dncy04NCcsIHdoaWNoIGlzCiAgICAgICAgICAgICAgIHVzZWQgYnkgdGhlIEdsb2JhbCBQb3NpdGlvbmluZyBTeXN0ZW0gKEdQUykuICBUaGUKICAgICAgICAgICAgICAgQVNDSUkgdmFsdWUgU0hPVUxEIGhhdmUgdXBwZXJjYXNlIGNvbnZlcnRlZCB0bwogICAgICAgICAgICAgICBsb3dlcmNhc2UgYW5kIG5vdCBpbmNsdWRlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICAgICAgICAgICAoaS5lLiwgdmFsdWVzIDMyLi42NCwgYW5kIDkxLi4xMjYpLiAgVGhlIElBTkEgcmVnaXN0cnkKICAgICAgICAgICAgICAgZnVydGhlciByZXN0cmljdHMgdGhlIHZhbHVlIGJ5IGNvbnZlcnRpbmcgYWxsIHNwYWNlcwogICAgICAgICAgICAgICAoJyAnKSB0byBkYXNoZXMgKCctJykuCiAgICAgICAgICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZ2VvZGV0aWMtZGF0dW0gaW5kaWNhdGVzCiAgICAgICAgICAgICAgIGhvdyBhY2N1cmF0ZWx5IGl0IG1vZGVscyB0aGUgYXN0cm9ub21pY2FsIGJvZHkgaW4KICAgICAgICAgICAgICAgcXVlc3Rpb24sIGJvdGggZm9yIHRoZSAnaG9yaXpvbnRhbCcKICAgICAgICAgICAgICAgbGF0aXR1ZGUvbG9uZ2l0dWRlIGNvb3JkaW5hdGVzIGFuZCBmb3IgaGVpZ2h0CiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiI7CiAgICAgICAgICAgIHJlZmVyZW5jZQogICAgICAgICAgICAgICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucywKICAgICAgICAgICAgICAgU2VjdGlvbiA2LjEiOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBjb29yZC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgYWNjdXJhY3kgb2YgdGhlIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyIGZvcgogICAgICAgICAgICAgICBlbGxpcHNvaWRhbCBjb29yZGluYXRlcywgb3IgdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMKICAgICAgICAgICAgICAgZm9yIENhcnRlc2lhbiBjb29yZGluYXRlcy4gIFdoZW4gY29vcmQtYWNjdXJhY3kgaXMKICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBpdCBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgaW4gdGhlIGFzc29jaWF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgIGRldGVybWluZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1kYXR1bS4gIEZvciBleGFtcGxlLCB0aGVyZQogICAgICAgICAgICAgICBtaWdodCBiZSB1bmNlcnRhaW50eSBkdWUgdG8gbWVhc3VyZW1lbnQgZXJyb3IgaWYgYW4KICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsIG1lYXN1cmVtZW50IHdhcyBtYWRlIHRvIGRldGVybWluZSBlYWNoCiAgICAgICAgICAgICAgIGxvY2F0aW9uLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIGhlaWdodC1hY2N1cmFjeSB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGFjY3VyYWN5IG9mIHRoZSBoZWlnaHQgdmFsdWUgZm9yIGVsbGlwc29pZGFsCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOyB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIHdpdGggQ2FydGVzaWFuCiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLiAgV2hlbiBoZWlnaHQtYWNjdXJhY3kgaXMgc3BlY2lmaWVkLCBpdAogICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IHByZWNpc2VseSB0aGUgaGVpZ2h0cyBpbiB0aGUKICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAogICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluZWQgYnkgdGhlCiAgICAgICAgICAgICAgIGdlb2RldGljLWRhdHVtLiAgRm9yIGV4YW1wbGUsIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgICAgICAgIHVuY2VydGFpbnR5IGR1ZSB0byBtZWFzdXJlbWVudCBlcnJvciBpZiBhbgogICAgICAgICAgICAgICBleHBlcmltZW50YWwgbWVhc3VyZW1lbnQgd2FzIG1hZGUgdG8gZGV0ZXJtaW5lIGVhY2gKICAgICAgICAgICAgICAgbG9jYXRpb24uIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hvaWNlIGxvY2F0aW9uIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlRoZSBsb2NhdGlvbiBkYXRhIGVpdGhlciBpbiBsYXRpdHVkZS9sb25naXR1ZGUgb3IKICAgICAgICAgICBDYXJ0ZXNpYW4gdmFsdWVzIjsKICAgICAgICBjYXNlIGVsbGlwc29pZCB7CiAgICAgICAgICBsZWFmIGxhdGl0dWRlIHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAiZGVjaW1hbCBkZWdyZWVzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIGxhdGl0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBsb25naXR1ZGUgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDE2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJkZWNpbWFsIGRlZ3JlZXMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgbG9uZ2l0dWRlIHZhbHVlIG9uIHRoZSBhc3Ryb25vbWljYWwgYm9keS4gIFRoZQogICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCBwcmVjaXNpb24gb2YgdGhpcyBtZWFzdXJlbWVudCBpcwogICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiBoZWlnaHQgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIkhlaWdodCBmcm9tIGEgcmVmZXJlbmNlIDAgdmFsdWUuICBUaGUgcHJlY2lzaW9uIGFuZAogICAgICAgICAgICAgICAnMCcgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhc2UgY2FydGVzaWFuIHsKICAgICAgICAgIGxlYWYgeCB7CiAgICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgfQogICAgICAgICAgICB1bml0cyAibWV0ZXJzIjsKICAgICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAiVGhlIFggdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgcmVmZXJlbmNlLWZyYW1lLiI7CiAgICAgICAgICB9CiAgICAgICAgICBsZWFmIHkgewogICAgICAgICAgICB0eXBlIGRlY2ltYWw2NCB7CiAgICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5pdHMgIm1ldGVycyI7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgIlRoZSBZIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIHJlZmVyZW5jZS1mcmFtZS4iOwogICAgICAgICAgfQogICAgICAgICAgbGVhZiB6IHsKICAgICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICAgIGZyYWN0aW9uLWRpZ2l0cyA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuaXRzICJtZXRlcnMiOwogICAgICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAgICJUaGUgWiB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSByZWZlcmVuY2UtZnJhbWUuIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29udGFpbmVyIHZlbG9jaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIklmIHRoZSBvYmplY3QgaXMgaW4gbW90aW9uLCB0aGUgdmVsb2NpdHkgdmVjdG9yIGRlc2NyaWJlcwogICAgICAgICAgIHRoaXMgbW90aW9uIGF0IHRoZSB0aW1lIGdpdmVuIGJ5IHRoZSB0aW1lc3RhbXAuICBGb3IgYQogICAgICAgICAgIGZvcm11bGEgdG8gY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gc3BlZWQgYW5kIGhlYWRpbmcsIHNlZQogICAgICAgICAgIFJGQyA5MTc5LiI7CiAgICAgICAgcmVmZXJlbmNlCiAgICAgICAgICAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwoKICAgICAgICBsZWFmIHYtbm9ydGggewogICAgICAgICAgdHlwZSBkZWNpbWFsNjQgewogICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgMTI7CiAgICAgICAgICB9CiAgICAgICAgICB1bml0cyAibWV0ZXJzIHBlciBzZWNvbmQiOwogICAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgInYtbm9ydGggaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgdG93YXJkcwogICAgICAgICAgICAgdHJ1ZSBub3J0aCBhcyBkZWZpbmVkIGJ5IHRoZSBnZW9kZXRpYy1zeXN0ZW0uIjsKICAgICAgICB9CgogICAgICAgIGxlYWYgdi1lYXN0IHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LWVhc3QgaXMgdGhlIHJhdGUgb2YgY2hhbmdlIChpLmUuLCBzcGVlZCkgcGVycGVuZGljdWxhcgogICAgICAgICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRydWUgbm9ydGggYXMgZGVmaW5lZCBieQogICAgICAgICAgICAgdGhlIGdlb2RldGljLXN5c3RlbS4iOwogICAgICAgIH0KCiAgICAgICAgbGVhZiB2LXVwIHsKICAgICAgICAgIHR5cGUgZGVjaW1hbDY0IHsKICAgICAgICAgICAgZnJhY3Rpb24tZGlnaXRzIDEyOwogICAgICAgICAgfQogICAgICAgICAgdW5pdHMgIm1ldGVycyBwZXIgc2Vjb25kIjsKICAgICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJ2LXVwIGlzIHRoZSByYXRlIG9mIGNoYW5nZSAoaS5lLiwgc3BlZWQpIGF3YXkgZnJvbSB0aGUKICAgICAgICAgICAgIGNlbnRlciBvZiBtYXNzLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxlYWYgdGltZXN0YW1wIHsKICAgICAgICB0eXBlIHlhbmc6ZGF0ZS1hbmQtdGltZTsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgIlJlZmVyZW5jZSB0aW1lIHdoZW4gbG9jYXRpb24gd2FzIHJlY29yZGVkLiI7CiAgICAgIH0KICAgICAgbGVhZiB2YWxpZC11bnRpbCB7CiAgICAgICAgdHlwZSB5YW5nOmRhdGUtYW5kLXRpbWU7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICJUaGUgdGltZXN0YW1wIGZvciB3aGljaCB0aGlzIGdlby1sb2NhdGlvbiBpcyB2YWxpZCB1bnRpbC4KICAgICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGdlby1sb2NhdGlvbiBoYXMgbm8gc3BlY2lmaWMKICAgICAgICAgICBleHBpcmF0aW9uIHRpbWUuIjsKICAgICAgfQogICAgfQogIH0KfQo=
+o-ran-smo-teiv-common-yang-extensions urn:o-ran:smo-teiv-common-yang-extensions \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgewogICAgeWFuZy12ZXJzaW9uIDEuMTsKICAgIG5hbWVzcGFjZSAidXJuOm8tcmFuOnNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMiOwogICAgcHJlZml4IG9yLXRlaXYteWV4dDsKCiAgICBvcmdhbml6YXRpb24gIk9SQU4iOwogICAgY29udGFjdCAiVGhlIEF1dGhvcnMiOwogICAgZGVzY3JpcHRpb24KICAgICJUb3BvbG9neSBhbmQgSW52ZW50b3J5IFlBTkcgZXh0ZW5zaW9ucyBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgZXh0ZW5zaW9ucyB0byB0aGUgWUFORyBsYW5ndWFnZSB0aGF0IHRvcG9sb2d5IGFuZAogICAgaW52ZW50b3J5IG1vZGVscyB3aWxsIHVzZSB0byBkZWZpbmUgYW5kIGFubm90YXRlIHR5cGVzIGFuZCByZWxhdGlvbnNoaXBzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBleHRlbnNpb24gYmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiRGVmaW5lcyBhIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBpbiB0aGUgdG9wb2xvZ3kuCgogICAgICAgICAgICBBIGJpLWRpcmVjdGlvbmFsLWFzc29jaWF0aW9uIChCREEpIGlzIGEgcmVsYXRpb25zaGlwIGNvbXByaXNpbmcgb2YKICAgICAgICAgICAgYW4gQS1zaWRlIGFuZCBhIEItc2lkZS4gVGhlIEEtc2lkZSBpcyBjb25zaWRlcmVkIHRoZSBvcmlnaW5hdGluZwogICAgICAgICAgICBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXA7IHRoZSBCLXNpZGUgaXMgY29uc2lkZXJlZCB0aGUgdGVybWluYXRpbmcKICAgICAgICAgICAgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgb3JkZXIgb2YgQS1zaWRlIGFuZCBCLXNpZGUgaXMgb2YKICAgICAgICAgICAgaW1wb3J0YW5jZSBhbmQgTVVTVCBOT1QgYmUgY2hhbmdlZCBvbmNlIGRlZmluZWQuCgogICAgICAgICAgICBCb3RoIEEtc2lkZSBhbmQgQi1zaWRlIGFyZSBkZWZpbmVkIG9uIGEgdHlwZSwgYW5kIGFyZSBnaXZlbiBhIHJvbGUuCiAgICAgICAgICAgIEEgdHlwZSBtYXkgaGF2ZSBtdWx0aXBsZSBvcmlnaW5hdGluZyBhbmQvb3IgdGVybWluYXRpbmcgc2lkZXMgb2YgYQogICAgICAgICAgICByZWxhdGlvbnNoaXAsIGFsbCBkaXN0aW5ndWlzaGVkIGJ5IHJvbGUgbmFtZS4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZSAnbW9kdWxlJyBzdGF0ZW1lbnQuCiAgICAgICAgICAgIE11bHRpcGxlICdiaS1kaXJlY3Rpb25hbC10b3BvbG9neS1yZWxhdGlvbnNoaXAnIHN0YXRlbWVudHMgYXJlCiAgICAgICAgICAgIGFsbG93ZWQgcGVyIHBhcmVudCBzdGF0ZW1lbnQuCgogICAgICAgICAgICBTdWJzdGF0ZW1lbnRzIHRvIHRoZSAnYmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBkZWZpbmUKICAgICAgICAgICAgdGhlIEEtc2lkZSBhbmQgdGhlIEItc2lkZSwgcmVzcGVjdGl2ZWx5LCBhbmQgb3B0aW9uYWxseSBwcm9wZXJ0aWVzCiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAuIERhdGEgbm9kZXMgb2YgdHlwZXMgJ2xlYWYnIGFuZCAnbGVhZi1saXN0JyBhcmUKICAgICAgICAgICAgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiBPbmUgb2YgdGhlIGRhdGEgbm9kZXMgTVVTVCBiZSBhbm5vdGF0ZWQgd2l0aAogICAgICAgICAgICB0aGUgJ2Etc2lkZScgZXh0ZW5zaW9uOyBhbm90aGVyIGRhdGEgbm9kZSBNVVNUIGJlIGFubm90YXRlZCB3aXRoIHRoZQogICAgICAgICAgICAnYi1zaWRlJyBleHRlbnNpb24uIE90aGVyIGRhdGEgbm9kZXMgZGVmaW5lIHByb3BlcnRpZXMgb2YgdGhlCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgcmVsYXRpb25zaGlwIG5hbWUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlY2xhcmluZyBtb2R1bGUgYW5kIE1VU1QgYmUKICAgICAgICAgICAgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUuIjsKCiAgICAgICAgYXJndW1lbnQgcmVsYXRpb25zaGlwTmFtZTsKICAgIH0KCiAgICBleHRlbnNpb24gYVNpZGUgewogICAgICAgIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICJEZWZpbmVzIHRoZSBBLXNpZGUgb2YgYSByZWxhdGlvbnNoaXAuCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiBhICdsZWFmJyBvciAnbGVhZi1saXN0JwogICAgICAgICAgICBzdGF0ZW1lbnQsIHdoaWNoIGl0c2VsZiBtdXN0IGJlIGEgc3Vic3RhdGVtZW50IG9mIHRoZQogICAgICAgICAgICAndW5pLWRpcmVjdGlvbmFsLXRvcG9sb2d5LXJlbGF0aW9uc2hpcCcgc3RhdGVtZW50LgoKICAgICAgICAgICAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBNVVNUIGJlCiAgICAgICAgICAgICdpbnN0YW5jZS1pZGVudGlmaWVyJy4gQ29uc3RyYWludHMgTUFZIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcGFyZW50CiAgICAgICAgICAgICdsZWFmJyBvciAnbGVhZi1saXN0JyB0byBlbmZvcmNlIGNhcmRpbmFsaXR5LgoKICAgICAgICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgaXMgdXNlZCBhcyBuYW1lCiAgICAgICAgICAgIG9mIHRoZSByb2xlIG9mIHRoZSBBLXNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIG5hbWUgb2YgdGhlIHJvbGUKICAgICAgICAgICAgaXMgc2NvcGVkIHRvIHRoZSB0eXBlIG9uIHdoaWNoIHRoZSBBLXNpZGUgaXMgZGVmaW5lZCBhbmQgTVVTVCBiZQogICAgICAgICAgICB1bmlxdWUgd2l0aGluIHRoZSBzY29wZS4KCiAgICAgICAgICAgIFdoaWxlIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIGRvZXMgbm90IHJlc3VsdCBpbiBhIHByb3BlcnR5CiAgICAgICAgICAgIG9mIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIFJFQ09NTUVOREVEIHRvIGF2b2lkIHVzaW5nIHRoZSBuYW1lIG9mIGFuCiAgICAgICAgICAgIGV4aXN0aW5nIHR5cGUgcHJvcGVydHkgYXMgcm9sZSBuYW1lIHRvIGF2b2lkIHBvdGVudGlhbCBhbWJpZ3VpdGllcwogICAgICAgICAgICBiZXR3ZWVuIHByb3BlcnRpZXMgb2YgYSB0eXBlLCBhbmQgcm9sZXMgb2YgYSByZWxhdGlvbnNoaXAgb24gdGhlCiAgICAgICAgICAgIHR5cGUuCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgb24gd2hpY2ggdGhlIEEtc2lkZSByZXNpZGVzLgogICAgICAgICAgICBJZiB0aGUgdHlwZSBpcyBkZWNsYXJlZCBpbiBhbm90aGVyIG1vZHVsZSwgdGhlIHR5cGUgbXVzdCBiZQogICAgICAgICAgICBwcmVmaXhlZCwgYW5kIGEgY29ycmVzcG9uZGluZyAnaW1wb3J0JyBzdGF0ZW1lbnQgYmUgdXNlZCB0byBkZWNsYXJlCiAgICAgICAgICAgIHRoZSBwcmVmaXguIjsKCiAgICAgICAgYXJndW1lbnQgYVNpZGVUeXBlOwogICAgfQoKICAgIGV4dGVuc2lvbiBiU2lkZSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkRlZmluZXMgdGhlIEItc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KCiAgICAgICAgICAgIFRoZSBzdGF0ZW1lbnQgTVVTVCBvbmx5IGJlIGEgc3Vic3RhdGVtZW50IG9mIGEgJ2xlYWYnIG9yICdsZWFmLWxpc3QnCiAgICAgICAgICAgIHN0YXRlbWVudCwgd2hpY2ggaXRzZWxmIG11c3QgYmUgYSBzdWJzdGF0ZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICd1bmktZGlyZWN0aW9uYWwtdG9wb2xvZ3ktcmVsYXRpb25zaGlwJyBzdGF0ZW1lbnQuCgogICAgICAgICAgICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBwYXJlbnQgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIE1VU1QgYmUKICAgICAgICAgICAgJ2luc3RhbmNlLWlkZW50aWZpZXInLiBDb25zdHJhaW50cyBNQVkgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQKICAgICAgICAgICAgJ2xlYWYnIG9yICdsZWFmLWxpc3QnIHRvIGVuZm9yY2UgY2FyZGluYWxpdHkuCgogICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50ICdsZWFmJyBvciAnbGVhZi1saXN0JyBpcyB1c2VkIGFzIG5hbWUKICAgICAgICAgICAgb2YgdGhlIHJvbGUgb2YgdGhlIEItc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLiBUaGUgbmFtZSBvZiB0aGUgcm9sZQogICAgICAgICAgICBpcyBzY29wZWQgdG8gdGhlIHR5cGUgb24gd2hpY2ggdGhlIEItc2lkZSBpcyBkZWZpbmVkIGFuZCBNVVNUIGJlCiAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlLgoKICAgICAgICAgICAgV2hpbGUgdGhlIHBhcmVudCAnbGVhZicgb3IgJ2xlYWYtbGlzdCcgZG9lcyBub3QgcmVzdWx0IGluIGEgcHJvcGVydHkKICAgICAgICAgICAgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgUkVDT01NRU5ERUQgdG8gYXZvaWQgdXNpbmcgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICAgZXhpc3RpbmcgdHlwZSBwcm9wZXJ0eSBhcyByb2xlIG5hbWUgdG8gYXZvaWQgcG90ZW50aWFsIGFtYmlndWl0aWVzCiAgICAgICAgICAgIGJldHdlZW4gcHJvcGVydGllcyBvZiBhIHR5cGUsIGFuZCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBvbiB0aGUKICAgICAgICAgICAgdHlwZS4KCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvbiB3aGljaCB0aGUgQi1zaWRlIHJlc2lkZXMuCiAgICAgICAgICAgIElmIHRoZSB0eXBlIGlzIGRlY2xhcmVkIGluIGFub3RoZXIgbW9kdWxlLCB0aGUgdHlwZSBtdXN0IGJlCiAgICAgICAgICAgIHByZWZpeGVkLCBhbmQgYSBjb3JyZXNwb25kaW5nICdpbXBvcnQnIHN0YXRlbWVudCBiZSB1c2VkIHRvIGRlY2xhcmUKICAgICAgICAgICAgdGhlIHByZWZpeC4iOwoKICAgICAgICBhcmd1bWVudCBiU2lkZVR5cGU7CiAgICB9CgogICAgZXh0ZW5zaW9uIGRvbWFpbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIktleXdvcmQgdXNlZCB0byBjYXJyeSBkb21haW4gaW5mb3JtYXRpb24uIjsKICAgICAgICBhcmd1bWVudCBkb21haW5OYW1lOwogICAgfQoKICAgIGV4dGVuc2lvbiBsYWJlbCB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoZSBsYWJlbCBjYW4gYmUgdXNlZCB0byBnaXZlIG1vZHVsZXMgYW5kIHN1Ym1vZHVsZXMgYSBzZW1hbnRpYwogICAgICAgICAgICB2ZXJzaW9uLCBpbiBhZGRpdGlvbiB0byB0aGVpciByZXZpc2lvbi4KCiAgICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGxhYmVsIGlzIOKAmHgueS564oCZIOKAkyBleHByZXNzZWQgYXMgcGF0dGVybiwgaXQgaXMKICAgICAgICAgICAgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rCgogICAgICAgICAgICBUaGUgc3RhdGVtZW50IE1VU1Qgb25seSBiZSBhIHN1YnN0YXRlbWVudCBvZiB0aGUgcmV2aXNpb24gc3RhdGVtZW50LgogICAgICAgICAgICBaZXJvIG9yIG9uZSByZXZpc2lvbiBsYWJlbCBzdGF0ZW1lbnRzIHBlciBwYXJlbnQgc3RhdGVtZW50IGFyZQogICAgICAgICAgICBhbGxvd2VkLgoKICAgICAgICAgICAgUmV2aXNpb24gbGFiZWxzIE1VU1QgYmUgdW5pcXVlIGFtb25nc3QgYWxsIHJldmlzaW9ucyBvZiBhIG1vZHVsZSBvcgogICAgICAgICAgICBzdWJtb2R1bGUuIjsKCiAgICAgICAgYXJndW1lbnQgc2VtdmVyc2lvbjsKICAgIH0KfQ==
+o-ran-smo-teiv-common-yang-types urn:o-ran:smo-teiv-common-yang-types \N [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyI7CiAgICBwcmVmaXggb3ItdGVpdi10eXBlczsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVG9wb2xvZ3kgYW5kIEludmVudG9yeSBjb21tb24gdHlwZXMgbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHJlLXVzYWJsZSBkYXRhIHR5cGVzIHRoYXQgdG9wb2xvZ3kgYW5kIGludmVudG9yeSBtb2RlbHMKICAgIHdpbGwgZnJlcXVlbnRseSB1c2UgYXMgcGFydCBvZiB0eXBlcyBhbmQgcmVsYXRpb25zaGlwcy4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgZ3JvdXBpbmcgVG9wX0dycF9UeXBlIHsKICAgICAgICBkZXNjcmlwdGlvbiAiR3JvdXBpbmcgY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZSBjb21tb24gdG8gYWxsIHR5cGVzLgogICAgICAgICAgICBBbGwgdHlwZXMgTVVTVCB1c2UgdGhpcyBncm91cGluZy4iOwoKICAgICAgICBsZWFmIGlkIHsKICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJVbmlxdWUgaWRlbnRpZmllciBvZiB0b3BvbG9neSBlbnRpdGllcy4gUmVwcmVzZW50cyB0aGUKICAgICAgICAgICAgICAgIEVudGl0eSBJbnN0YW5jZSBJZGVudGlmaWVyLiI7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRhaW5lciBkZWNvcmF0b3JzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiVGhpcyBjb250YWluZXIgc2VydmVzIGFzIGV4dGVuc2lvbiBwb2ludCBmb3IgYXBwbGljYXRpb25zIHdpc2hpbmcKICAgICAgICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBkZWNvcmF0b3JzLiBUaGlzIGlzIGRvbmUgdmlhIGF1Z21lbnRhdGlvbnMuIFRoZXkKICAgICAgICAgICAgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiBuYW1lIHZhbHVlIHBhaXIuCgogICAgICAgICAgICBUaGlzIGlzIGEgY29uc3VtZXIgZGF0YSBhbmQgY2FuIGJlIGF0dGFjaGVkIHRvIFRvcG9sb2d5IEVudGl0eSBvcgogICAgICAgICAgICBUb3BvbG9neSBSZWxhdGlvbiBpbnN0YW5jZSwgb3V0c2lkZSBvZiB0aGUgZGVjbGFyZWQgVG9wb2xvZ3kgRW50aXR5CiAgICAgICAgICAgIG9yIFRvcG9sb2d5IFJlbGF0aW9uc2hpcCdzIGF0dHJpYnV0ZXMuIFRoaXMgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwKICAgICAgICAgICAgYW5kIGl0IE1VU1QgTk9UIGJlIGF1Z21lbnRlZCBvciBkZXZpYXRlZCBpbiBhbnkgd2F5LCB1bmxlc3Mgc3RhdGVkCiAgICAgICAgICAgIG90aGVyd2lzZS4iOwogICAgfQoKICAgIGxlYWYtbGlzdCBjbGFzc2lmaWVycyB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIkNvbnN1bWVyIGRlZmluZWQgdGFncyB0byB0b3BvbG9neSBlbnRpdGllcyBhbmQgcmVsYXRpb25zaGlwcy4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb25zdW1lciBkYXRhIGFuZCBjYW4gYmUgYXR0YWNoZWQgdG8gVG9wb2xvZ3kgRW50aXR5IG9yCiAgICAgICAgICAgIFRvcG9sb2d5IFJlbGF0aW9uIGluc3RhbmNlLCBvdXRzaWRlIG9mIHRoZSBkZWNsYXJlZCBUb3BvbG9neSBFbnRpdHkKICAgICAgICAgICAgb3IgVG9wb2xvZ3kgUmVsYXRpb25zaGlwJ3MgYXR0cmlidXRlcy4gVGhpcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAogICAgICAgICAgICBhbmQgaXQgTVVTVCBOT1QgYmUgYXVnbWVudGVkIG9yIGRldmlhdGVkIGluIGFueSB3YXksIHVubGVzcyBzdGF0ZWQKICAgICAgICAgICAgb3RoZXJ3aXNlLiI7CgogICAgICAgIHR5cGUgaWRlbnRpdHlyZWYgeyBiYXNlIGNsYXNzaWZpZXI7IH0KICAgIH0KCiAgICBsZWFmLWxpc3Qgc291cmNlSWRzIHsKICAgICAgICBkZXNjcmlwdGlvbgogICAgICAgICAgICAiQW4gb3JkZXJlZCBsaXN0IG9mIGlkZW50aXRpZXMgdGhhdCByZXByZXNlbnQgdGhlIHNldCBvZiBuYXRpdmUKICAgICAgICAgICAgc291cmNlIGlkZW50aWZpZXJzIGZvciBwYXJ0aWNpcGF0aW5nIGVudGl0aWVzLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKCiAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgb3JkZXJlZC1ieSB1c2VyOwogICAgfQoKICAgIGNvbnRhaW5lciBtZXRhZGF0YSB7CiAgICAgICAgZGVzY3JpcHRpb24KICAgICAgICAgICAgIlRoaXMgY29udGFpbmVyIHNlcnZlcyBhcyBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIG1ldGFkYXRhLiBUaGV5CiAgICAgICAgICAgIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gbmFtZSB2YWx1ZSBwYWlyLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvbnN1bWVyIGRhdGEgYW5kIGNhbiBiZSBhdHRhY2hlZCB0byBUb3BvbG9neSBFbnRpdHkgb3IKICAgICAgICAgICAgVG9wb2xvZ3kgUmVsYXRpb24gaW5zdGFuY2UsIG91dHNpZGUgb2YgdGhlIGRlY2xhcmVkIFRvcG9sb2d5IEVudGl0eQogICAgICAgICAgICBvciBUb3BvbG9neSBSZWxhdGlvbnNoaXAncyBhdHRyaWJ1dGVzLiBUaGlzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQsCiAgICAgICAgICAgIGFuZCBpdCBNVVNUIE5PVCBiZSBhdWdtZW50ZWQgb3IgZGV2aWF0ZWQgaW4gYW55IHdheSwgdW5sZXNzIHN0YXRlZAogICAgICAgICAgICBvdGhlcndpc2UuIjsKICAgIH0KCiAgICBpZGVudGl0eSBjbGFzc2lmaWVyewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgY2xhc3NpZmllciBpcyB1c2VkIGFzIGEgYmFzZSB0byBwcm92aWRlIGFsbCBjbGFzc2lmaWVycwogICAgICAgICAgICB3aXRoIGlkZW50aXR5LiAiOwogICAgfQp9
+o-ran-smo-teiv-equipment urn:o-ran:smo-teiv-equipment EQUIPMENT [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LWVxdWlwbWVudCB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtZXF1aXBtZW50IjsKICAgIHByZWZpeCBvci10ZWl2LWVxdWlwOwoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMgeyBwcmVmaXggb3ItdGVpdi15ZXh0OyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIkVxdWlwbWVudCB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIEVxdWlwbWVudAogICAgZG9tYWluLCB3aGljaCBpcyBtb2RlbGxlZCB0byB1bmRlcnN0YW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiBlcXVpcG1lbnQKICAgIHN1Y2ggYXMgYW50ZW5uYXMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbC9jYXJyaWVyIGFuZCB0aGVpciByZWxldmFudAogICAgcHJvcGVydGllcyBlLmcuIHRpbHQsIG1heCBwb3dlciBldGMuIjsKCiAgICByZXZpc2lvbiAiMjAyNC0wNS0yNCIgewogICAgICAgIGRlc2NyaXB0aW9uICJJbml0aWFsIHJldmlzaW9uLiI7CiAgICAgICAgb3ItdGVpdi15ZXh0OmxhYmVsIDAuMy4wOwogICAgfQoKICAgIG9yLXRlaXYteWV4dDpkb21haW4gRVFVSVBNRU5UOwoKICAgIGxpc3QgQW50ZW5uYU1vZHVsZSB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEFudGVubmEgTW9kdWxlIHJlcHJlc2VudHMgdGhlIHBoeXNpY2FsIGFzcGVjdCBvZiBhbgogICAgICAgICAgICBhbnRlbm5hLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYW50ZW5uYU1vZGVsTnVtYmVyIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJWZW5kb3Itc3BlY2lmaWMgYW50ZW5uYSBtb2RlbCBpZGVudGlmaWVyLiBUaGlzCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubwogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgbWVjaGFuaWNhbEFudGVubmFCZWFyaW5nIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIGJlYXJpbmcgb24gYW50ZW5uYSBzdWJ1bml0IHdoZXJlIGFudGVubmEKICAgICAgICAgICAgICAgICAgICB1bml0IGlzIGluc3RhbGxlZC4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBtZWNoYW5pY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBmaXhlZCBhbnRlbm5hIHRpbHQgb2YgdGhlIGluc3RhbGxhdGlvbiwgZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBpbmNsaW5hdGlvbiBvZiB0aGUgYW50ZW5uYSBlbGVtZW50IHJlc3BlY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgcGxhbmUuIEl0IGlzIGEgc2lnbmVkIHZhbHVlLiBQb3NpdGl2ZSBpbmRpY2F0ZXMKICAgICAgICAgICAgICAgICAgICBkb3dudGlsdCwgYW5kIG5lZ2F0aXZlIGluZGljYXRlcyB1cHRpbHQuIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgcG9zaXRpb25XaXRoaW5TZWN0b3IgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFudGVubmEgdW5pdCBwb3NpdGlvbiB3aXRoaW4gc2VjdG9yLiBUaGlzIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgIGlzIHBhcnQgb2YgQUlTRyB2MyBBREIgU3RhbmRhcmQgYW5kIGhhcyBubyBvcGVyYXRpb25hbAogICAgICAgICAgICAgICAgICAgIGltcGFjdC4iOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgdG90YWxUaWx0IHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb3RhbCBhbnRlbm5hIGVsZXZhdGlvbiBpbmNsdWRpbmcgdGhlIGluc3RhbGxlZAogICAgICAgICAgICAgICAgICAgIHRpbHQgYW5kIHRoZSB0aWx0IGFwcGxpZWQgYnkgdGhlIFJlbW90ZSBFbGVjdHJpY2FsCiAgICAgICAgICAgICAgICAgICAgVGlsdCAoUkVUKS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBlbGVjdHJpY2FsQW50ZW5uYVRpbHQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVsZWN0cmljYWxseS1jb250cm9sbGVkIHRpbHQgb2YgbWFpbiBiZWFtIG1heGltdW0KICAgICAgICAgICAgICAgICAgICB3aXRoIHJlc3BlY3QgdG8gZGlyZWN0aW9uIG9ydGhvZ29uYWwgdG8gYW50ZW5uYSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgYXhpcyAoc2VlIDNHUFAgVFMgMjUuNDY2KS4gVmFsdWUgaXMgc2lnbmVkOyB0aWx0IGRvd24gaXMKICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgdGlsdCB1cCBpcyBuZWdhdGl2ZS4iOwogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGFudGVubmFCZWFtV2lkdGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBhbmd1bGFyIHNwYW4gb2YgdGhlIG1haW4gbG9iZSBvZiB0aGUgYW50ZW5uYQogICAgICAgICAgICAgICAgICAgIHJhZGlhdGlvbiBwYXR0ZXJuIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLiBNZWFzdXJlZCBpbgogICAgICAgICAgICAgICAgICAgIGRlZ3JlZXMuIjsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1c2VzIGdlbzpnZW8tbG9jYXRpb247CiAgICAgICAgfQogICAgfQp9
+o-ran-smo-teiv-ran urn:o-ran:smo-teiv-ran RAN [] 2024-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJhbiB7CiAgICB5YW5nLXZlcnNpb24gMS4xOwogICAgbmFtZXNwYWNlICJ1cm46by1yYW46c21vLXRlaXYtcmFuIjsKICAgIHByZWZpeCBvci10ZWl2LXJhbjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMge3ByZWZpeCBvci10ZWl2LXR5cGVzOyB9CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLWV4dGVuc2lvbnMge3ByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgXzNncHAtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggdHlwZXMzZ3BwOyB9CgogICAgaW1wb3J0IGlldGYtZ2VvLWxvY2F0aW9uIHsKICAgICAgICBwcmVmaXggZ2VvOwogICAgICAgIHJlZmVyZW5jZSAiUkZDIDkxNzk6IEEgWUFORyBHcm91cGluZyBmb3IgR2VvZ3JhcGhpYyBMb2NhdGlvbnMiOwogICAgfQoKICAgIG9yZ2FuaXphdGlvbiAiT1JBTiI7CiAgICBjb250YWN0ICJUaGUgQXV0aG9ycyI7CiAgICBkZXNjcmlwdGlvbgogICAgIlJBTiB0b3BvbG9neSBtb2RlbC4KCiAgICBDb3B5cmlnaHQgKEMpIDIwMjQgRXJpY3Nzb24KICAgIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAyMDI0IE9wZW5JbmZyYSBGb3VuZGF0aW9uIEV1cm9wZQoKICAgIFRoaXMgbW9kZWwgY29udGFpbnMgdGhlIHRvcG9sb2d5IGVudGl0aWVzIGFuZCByZWxhdGlvbnMgaW4gdGhlIFJBTiBkb21haW4sCiAgICB3aGljaCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbmFsIGNhcGFiaWxpdHkgb2YgdGhlIGRlcGxveWVkIFJBTiB0aGF0IGFyZQogICAgcmVsZXZhbnQgdG8gckFwcHMgdXNlIGNhc2VzLiI7CgogICAgcmV2aXNpb24gIjIwMjQtMDUtMjQiIHsKICAgICAgICBkZXNjcmlwdGlvbiAiSW5pdGlhbCByZXZpc2lvbi4iOwogICAgICAgIG9yLXRlaXYteWV4dDpsYWJlbCAwLjMuMDsKICAgIH0KCiAgICBvci10ZWl2LXlleHQ6ZG9tYWluIFJBTjsKCiAgICBsaXN0IEdOQkRVRnVuY3Rpb24gewogICAgICAgIGRlc2NyaXB0aW9uICJnTm9kZUIgRGlzdHJpYnV0ZWQgVW5pdCAoZ05CLURVKS4KCiAgICAgICAgICAgIEEgZ05CIG1heSBjb25zaXN0IG9mIGEgZ05CLUNlbnRyYWxpemVkIFVuaXQgKGdOQi1DVSkgYW5kIGEgZ05CLURVLgogICAgICAgICAgICBUaGUgQ1UgcHJvY2Vzc2VzIG5vbi1yZWFsIHRpbWUgcHJvdG9jb2xzIGFuZCBzZXJ2aWNlcywgYW5kIHRoZSBEVQogICAgICAgICAgICBwcm9jZXNzZXMgUEhZIGxldmVsIHByb3RvY29sIGFuZCByZWFsIHRpbWUgc2VydmljZXMuIFRoZSBnTkItQ1UgYW5kCiAgICAgICAgICAgIHRoZSBnTkItRFUgdW5pdHMgYXJlIGNvbm5lY3RlZCB2aWEgRjEgbG9naWNhbCBpbnRlcmZhY2UuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRydWUgZm9yIGEgZ05CLURVOgogICAgICAgICAgICBJcyBjb25uZWN0ZWQgdG8gdGhlIGdOQi1DVS1DUCB0aHJvdWdoIHRoZSBGMS1DIGludGVyZmFjZS4gSXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBnTkItQ1UtVVAgdGhyb3VnaCB0aGUgRjEtVSBpbnRlcmZhY2UuIE9uZSBnTkItRFUgaXMKICAgICAgICAgICAgY29ubmVjdGVkIHRvIG9ubHkgb25lIGdOQi1DVS1DUC4gT25lIGdOQi1EVSBjYW4gYmUgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1DVS1VUHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNhbWUgZ05CLUNVLUNQLgoKICAgICAgICAgICAgTm90ZTogQSBnTkIgbWF5IGNvbnNpc3Qgb2YgYSBnTkItQ1UtQ1AsIG11bHRpcGxlIGdOQi1DVS1VUHMgYW5kCiAgICAgICAgICAgIG11bHRpcGxlIGdOQi1EVXMuIGdOQi1EVSBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTkctUkFOCiAgICAgICAgICAgIG5vZGUgb2JqZWN0LiBJbiBUb3BvbG9neSwgeW91IGNhbiBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZQogICAgICAgICAgICB0aGUgZ05CLURVIG9iamVjdC4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBjb250YWluZXIgZFVwTE1OSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBMTU4gaWRlbnRpZmllciB1c2VkIGFzIHBhcnQgb2YgUE0gRXZlbnRzIGRhdGEiOwogICAgICAgICAgICAgICAgdXNlcyB0eXBlczNncHA6UExNTklkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGdOQkRVSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRFUgd2l0aGluIGEgZ05vZGVCIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWQgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIklkZW50aXR5IG9mIGdOb2RlQiB3aXRoaW4gYSBQTE1OIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgZ05CSWRMZW5ndGggewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlbmd0aCBvZiBnTkJJZCBiaXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIjsKICAgICAgICAgICAgICAgIHR5cGUgaW50MzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGlzdCBFTm9kZUJGdW5jdGlvbiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkFuIEV2b2x2ZWQgTm9kZSBCIChlTm9kZUIpIGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBub2RlIGluCiAgICAgICAgICAgIHRoZSByYWRpbyBhY2Nlc3MgbmV0d29yayAoUkFOKSBvZiBMb25nLVRlcm0gRXZvbHV0aW9uIChMVEUpLiBUaGUKICAgICAgICAgICAgZU5vZGVCIGlzIGEgY29tcGxleCBiYXNlIHN0YXRpb24gdGhhdCBoYW5kbGVzIHJhZGlvIGNvbW11bmljYXRpb25zCiAgICAgICAgICAgIGluIHRoZSBjZWxsIGFuZCBjYXJyaWVzIG91dCByYWRpbyByZXNvdXJjZSBtYW5hZ2VtZW50IGFuZCBoYW5kb3ZlcgogICAgICAgICAgICBkZWNpc2lvbnMuIFVubGlrZSAyLzNHIHdpcmVsZXNzIFJBTiwgdGhlcmUgaXMgbm8gY2VudHJhbGl6ZWQgcmFkaW8KICAgICAgICAgICAgbmV0d29yayBjb250cm9sbGVyIGluIExURS4gSXQgaXMgdGhlIGhhcmR3YXJlIHRoYXQgaXMgY29ubmVjdGVkIHRvCiAgICAgICAgICAgIHRoZSBtb2JpbGUgcGhvbmUgbmV0d29yayB0aGF0IGNvbW11bmljYXRlcyBkaXJlY3RseSB3aXRoIG1vYmlsZQogICAgICAgICAgICBoYW5kc2V0cyAoVXNlciBFcXVpcG1lbnQpLCBsaWtlIGEgYmFzZSB0cmFuc2NlaXZlciBzdGF0aW9uIChCVFMpIGluCiAgICAgICAgICAgIEdTTSBuZXR3b3Jrcy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGFsbG93cyBsb3dlcgogICAgICAgICAgICByZXNwb25zZSB0aW1lcy4iOwoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgY29udGFpbmVyIGF0dHJpYnV0ZXMgewogICAgICAgICAgICBsZWFmIGVOQklkIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgRU5vZGVCIElEIHRoYXQgZm9ybXMgcGFydCBvZiB0aGUgQ2VsbCBHbG9iYWwKICAgICAgICAgICAgICAgICAgICBJZGVudGl0eSwgYW5kIGlzIGFsc28gdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZSBvdmVyIHRoZSBTMQogICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSI7CiAgICAgICAgICAgICAgICB0eXBlIGludDMyOwogICAgICAgICAgICAgICAgZGVmYXVsdCAxMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyIGVOb2RlQlBsbW5JZCB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIEVOb2RlQiBQdWJsaWMgTGFuZCBNb2JpbGUgTmV0d29yayAoUExNTikgSUQKICAgICAgICAgICAgICAgICAgICB0aGF0IGZvcm1zIHBhcnQgb2YgdGhlIEVOb2RlQiBHbG9iYWwgSUQgdXNlZCB0byBpZGVudGlmeSB0aGUKICAgICAgICAgICAgICAgICAgICBub2RlIG92ZXIgdGhlIFMxIGludGVyZmFjZS4gTm90ZTogVGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgKE1DQz0wMDEsIE1OQz0wMSkgaW5kaWNhdGVzIHRoYXQgdGhlIFBMTU4gaXMgbm90IGluaXRpYXRlZC4KICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgY2FuIG5vdCBiZSB1c2VkIGFzIGEgdmFsaWQgUExNTiBJZGVudGl0eS4iOwoKICAgICAgICAgICAgICAgIGxlYWYgbWNjIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIE1DQyBwYXJ0IG9mIGEgUExNTiBpZGVudGl0eSB1c2VkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICByYWRpbyBuZXR3b3JrLiI7CiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIDAuLjk5OTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZWFmIG1uYyB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkgdXNlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAwLi45OTk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVhZiBtbmNMZW5ndGggewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUaGUgbGVuZ3RoIG9mIHRoZSBNTkMgcGFydCBvZiBhIFBMTU4gaWRlbnRpdHkKICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgcmFkaW8gbmV0d29yay4iOwogICAgICAgICAgICAgICAgICAgIHR5cGUgaW50MzIgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAyLi4zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IExURVNlY3RvckNhcnJpZXIgewogICAgICAgIGRlc2NyaXB0aW9uICJUaGUgTFRFIFNlY3RvciBDYXJyaWVyIG9iamVjdCBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBmb3IKICAgICAgICAgICAgZGVmaW5pbmcgdGhlIGxvZ2ljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgY2FycmllciAoY2VsbCkgaW4gYQogICAgICAgICAgICBzZWN0b3IuIEEgc2VjdG9yIGlzIGEgY292ZXJhZ2UgYXJlYSBhc3NvY2lhdGVkIHdpdGggYSBiYXNlIHN0YXRpb24KICAgICAgICAgICAgaGF2aW5nIGl0cyBvd24gYW50ZW5uYXMsIHJhZGlvIHBvcnRzLCBhbmQgY29udHJvbCBjaGFubmVscy4gVGhlCiAgICAgICAgICAgIGNvbmNlcHQgb2Ygc2VjdG9ycyB3YXMgZGV2ZWxvcGVkIHRvIGltcHJvdmUgY28tY2hhbm5lbCBpbnRlcmZlcmVuY2UKICAgICAgICAgICAgaW4gY2VsbHVsYXIgc3lzdGVtcywgYW5kIG1vc3Qgd2lyZWxlc3Mgc3lzdGVtcyB1c2UgdGhyZWUgc2VjdG9yCiAgICAgICAgICAgIGNlbGxzLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgc2VjdG9yQ2FycmllclR5cGUgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdG9yIGNhcnJpZXIKICAgICAgICAgICAgICAgICAgICBtb2RlbGxlZCBieSBNTyBTZWN0b3JDYXJyaWVyIGlzIGEgZGlnaXRhbCBzZWN0b3IuIjsKICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24gewogICAgICAgICAgICAgICAgICAgIGVudW0gbm9ybWFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJOb3QgYSBkaWdpdGFsIHNlY3RvciI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gbGVmdF9kaWdpdGFsX3NlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMZWZ0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIHJpZ2h0X2RpZ2l0YWxfc2VjdG9yIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAyRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIGxlZnRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxlZnQgZGlnaXRhbCBzZWN0b3IgZm9yIDNEUyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudW0gcmlnaHRfZGlnaXRhbF9zZWN0b3JfM2RzIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgNDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJpZ2h0IGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbnVtIG1pZGRsZV9kaWdpdGFsX3NlY3Rvcl8zZHMgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA1OwogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWlkZGxlIGRpZ2l0YWwgc2VjdG9yIGZvciAzRFMiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBsaXN0IEFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICBkZXNjcmlwdGlvbiAiVGhpcyBNTyBzZXJ2ZXMgYXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIGNlbGwgYW5kIHRoZSBSQlMKICAgICAgICAgICAgZXF1aXBtZW50IHVzZWQgdG8gcHJvdmlkZSBjb3ZlcmFnZSBpbiBhIGNlcnRhaW4gZ2VvZ3JhcGhpY2FsIGFyZWEuCiAgICAgICAgICAgIFRoZSBNTyBhbHNvIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG91dHB1dCBwb3dlciBvZiB0aGUgc2VjdG9yLiI7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYtbGlzdCBlVXRyYW5GcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIExURSBmcmVxdWVuY3kgYmFuZHMgdGhhdCBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYtbGlzdCBnZXJhbkZxQmFuZHMgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3Qgb2YgR0VSQU4gZnJlcXVlbmN5IGJhbmRzIHRoYXQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIHN1cHBvcnRzIjsKICAgICAgICAgICAgICAgIHR5cGUgc3RyaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmLWxpc3QgblJGcUJhbmRzIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0IG9mIE5SIGZyZXF1ZW5jeSBiYW5kcyBhc3NvY2lhdGVkIGhhcmR3YXJlCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMiOwogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTk9ERUJGVU5DVElPTl9QUk9WSURFU19MVEVTRUNUT1JDQVJSSUVSIHsgLy8gMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlTm9kZUIgRnVuY3Rpb24gcHJvdmlkZXMgTFRFIFNlY3RvciBDYXJyaWVyLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFTm9kZUJGdW5jdGlvbjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbm9kZWJGdW5jdGlvbiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMVEUgU2VjdG9yIENhcnJpZXIgcHJvdmlkZWQgYnkgZU5vZGVCIEZ1bmN0aW9uLiI7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBMVEVTZWN0b3JDYXJyaWVyOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgICAgIG1hbmRhdG9yeSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIExURVNFQ1RPUkNBUlJJRVJfVVNFU19BTlRFTk5BQ0FQQUJJTElUWSB7IC8vIDAuLm4gdG8gMC4uMQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZiB1c2VkLWFudGVubmFDYXBhYmlsaXR5IHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxURSBTZWN0b3IgQ2FycmllciB1c2VzIEFudGVubmEgQ2FwYWJpbGl0eS4iOwogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgTFRFU2VjdG9yQ2FycmllcjsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHVzZWQtYnktbHRlU2VjdG9yQ2FycmllciB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIENhcGFiaWxpdHkgdXNlZCBieSBMVEUgU2VjdG9yIENhcnJpZXIuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9
+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-05-24 bW9kdWxlIG8tcmFuLXNtby10ZWl2LXJlbC1lcXVpcG1lbnQtcmFuIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInVybjpvLXJhbjpzbW8tdGVpdi1yZWwtZXF1aXBtZW50LXJhbiI7CiAgICBwcmVmaXggb3ItdGVpdi1yZWwtZXF1aXByYW47CgogICAgaW1wb3J0IG8tcmFuLXNtby10ZWl2LWNvbW1vbi15YW5nLXR5cGVzIHsgcHJlZml4IG9yLXRlaXYtdHlwZXM7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctZXh0ZW5zaW9ucyB7IHByZWZpeCBvci10ZWl2LXlleHQ7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtZXF1aXBtZW50IHsgcHJlZml4IG9yLXRlaXYtZXF1aXA7IH0KCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtcmFuIHsgcHJlZml4IG9yLXRlaXYtcmFuOyB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiRXF1aXBtZW50IGFuZCBSQU4gdG9wb2xvZ3kgcmVsYXRpb24gbW9kZWwuCgogICAgQ29weXJpZ2h0IChDKSAyMDI0IEVyaWNzc29uCiAgICBNb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMjAyNCBPcGVuSW5mcmEgRm91bmRhdGlvbiBFdXJvcGUKCiAgICBUaGlzIG1vZGVsIGNvbnRhaW5zIHRoZSB0b3BvbG9neSByZWxhdGlvbnMgYmV0d2VlbiBFcXVpcG1lbnQgYW5kIFJBTi4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBSRUxfRVFVSVBNRU5UX1JBTjsKCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEFOVEVOTkFNT0RVTEVfU0VSVkVTX0FOVEVOTkFDQVBBQklMSVRZIHsgLy8gMC4ubiB0byAwLi5tCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3Qgc2VydmljZWQtYW50ZW5uYUNhcGFiaWxpdHkgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQW50ZW5uYSBDYXBhYmlsaXR5IHNlcnZpY2VkIGJ5IHRoaXMgQW50ZW5uYSBNb2R1bGUuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmFTaWRlIG9yLXRlaXYtZXF1aXA6QW50ZW5uYU1vZHVsZTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IHNlcnZpbmctYW50ZW5uYU1vZHVsZSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBbnRlbm5hIE1vZHVsZSBzZXJ2ZXMgdGhpcyBBbnRlbm5hIENhcGFiaWxpdHkuIjsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIG9yLXRlaXYtcmFuOkFudGVubmFDYXBhYmlsaXR5OwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICAgfQogICAgfQp9
+test-built-in-module test-built-in-namespace TEST [] 2024-05-24 bW9kdWxlIHRlc3QtYnVpbHQtaW4tbW9kdWxlIHsKICAgIHlhbmctdmVyc2lvbiAxLjE7CiAgICBuYW1lc3BhY2UgInRlc3QtYnVpbHQtaW4tbmFtZXNwYWNlIjsKCiAgICBpbXBvcnQgby1yYW4tc21vLXRlaXYtY29tbW9uLXlhbmctdHlwZXMgeyBwcmVmaXggb3ItdGVpdi10eXBlczsgfQoKICAgIGltcG9ydCBvLXJhbi1zbW8tdGVpdi1jb21tb24teWFuZy1leHRlbnNpb25zIHsgcHJlZml4IG9yLXRlaXYteWV4dDsgfQoKICAgIGltcG9ydCBfM2dwcC1jb21tb24teWFuZy10eXBlcyB7IHByZWZpeCB0eXBlczNncHA7IH0KCiAgICBpbXBvcnQgaWV0Zi1nZW8tbG9jYXRpb24gewogICAgICAgIHByZWZpeCBnZW87CiAgICAgICAgcmVmZXJlbmNlICJSRkMgOTE3OTogQSBZQU5HIEdyb3VwaW5nIGZvciBHZW9ncmFwaGljIExvY2F0aW9ucyI7CiAgICB9CgogICAgb3JnYW5pemF0aW9uICJPUkFOIjsKICAgIGNvbnRhY3QgIlRoZSBBdXRob3JzIjsKICAgIGRlc2NyaXB0aW9uCiAgICAiVGVzdCB0b3BvbG9neSBtb2RlbC4iOwoKICAgIHJldmlzaW9uICIyMDI0LTA1LTI0IiB7CiAgICAgICAgZGVzY3JpcHRpb24gIkluaXRpYWwgcmV2aXNpb24uIjsKICAgICAgICBvci10ZWl2LXlleHQ6bGFiZWwgMC4zLjA7CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmRvbWFpbiBURVNUOwoKICAgIGxpc3QgRW50aXR5VHlwZUEgewoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICB9CgogICAgbGlzdCBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBjb250YWluZXIgYXR0cmlidXRlcyB7CiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTFXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIHN0cmluZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBMldpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgdWludDMyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZWFmIGF0dHJpYnV0ZUEzV2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBpbnQzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZiBhdHRyaWJ1dGVBNFdpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHR5cGUgaW50NjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxlYWYgYXR0cmlidXRlQTVXaXRoQXR0cmlidXRlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgICAgICB0eXBlIGRlY2ltYWw2NHsKICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbi1kaWdpdHMgNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuaXRzICJkZWdyZWVzIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGVhZi1saXN0IGF0dHJpYnV0ZUE2V2l0aEF0dHJpYnV0ZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICAgICAgdHlwZSBzdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnRhaW5lciBhdHRyaWJ1dGVBN1dpdGhBdHRyaWJ1dGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgICAgIHVzZXMgdHlwZXMzZ3BwOlBMTU5JZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1VTRVNfRU5USVRZVFlQRUFXSVRIRU5USVRZVFlQRU5BTUVMRU5HVEhMT05HRVJUSEFOU0lYVFlUSFJFRUNIQVJBQ1RFUlMgeyAvLyAwLi4xIHRvIDAuLjEKCiAgICAgICAgdXNlcyBvci10ZWl2LXR5cGVzOlRvcF9HcnBfVHlwZTsKICAgICAgICBrZXkgaWQ7CgogICAgICAgIGxlYWYgdXNlZC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmIHVzZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX1BST1ZJREVTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi5uCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmLWxpc3QgcHJvdmlkZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiBwcm92aWRlZC1ieS1lbnRpdHlUeXBlQSB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDpiU2lkZSBFbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVyczsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQogICAgfQoKICAgIG9yLXRlaXYteWV4dDpiaURpcmVjdGlvbmFsVG9wb2xvZ3lSZWxhdGlvbnNoaXAgRU5USVRZVFlQRUFfR1JPVVBTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4ubiB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIGdyb3VwZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUE7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZi1saXN0IGdyb3VwZWQtYnktZW50aXR5VHlwZUEgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YlNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KICAgIH0KCiAgICBvci10ZWl2LXlleHQ6YmlEaXJlY3Rpb25hbFRvcG9sb2d5UmVsYXRpb25zaGlwIEVOVElUWVRZUEVBX0lOU1RBTExFRF9BVF9FTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSUyB7IC8vIDAuLm4gdG8gMC4ubQoKICAgICAgICB1c2VzIG9yLXRlaXYtdHlwZXM6VG9wX0dycF9UeXBlOwogICAgICAgIGtleSBpZDsKCiAgICAgICAgbGVhZi1saXN0IGluc3RhbGxlZC1hdC1lbnRpdHlUeXBlQVdpdGhFbnRpdHlUeXBlTmFtZUxlbmd0aExvbmdlclRoYW5TaXh0eVRocmVlQ2hhcmFjdGVycyB7CiAgICAgICAgICAgIG9yLXRlaXYteWV4dDphU2lkZSBFbnRpdHlUeXBlQTsKICAgICAgICAgICAgdHlwZSBpbnN0YW5jZS1pZGVudGlmaWVyOwogICAgICAgfQoKICAgICAgICBsZWFmLWxpc3QgaW5zdGFsbGVkLWVudGl0eVR5cGVBIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9CgogICAgb3ItdGVpdi15ZXh0OmJpRGlyZWN0aW9uYWxUb3BvbG9neVJlbGF0aW9uc2hpcCBFTlRJVFlUWVBFQVdJVEhFTlRJVFlUWVBFTkFNRUxFTkdUSExPTkdFUlRIQU5TSVhUWVRIUkVFQ0hBUkFDVEVSU19VU0VTX0VOVElUWVRZUEVBV0lUSEVOVElUWVRZUEVOQU1FTEVOR1RITE9OR0VSVEhBTlNJWFRZVEhSRUVDSEFSQUNURVJTIHsgLy8gMC4uMSB0byAwLi4xCgogICAgICAgIHVzZXMgb3ItdGVpdi10eXBlczpUb3BfR3JwX1R5cGU7CiAgICAgICAga2V5IGlkOwoKICAgICAgICBsZWFmIHVzZWQtZW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnMgewogICAgICAgICAgICBvci10ZWl2LXlleHQ6YVNpZGUgRW50aXR5VHlwZUFXaXRoRW50aXR5VHlwZU5hbWVMZW5ndGhMb25nZXJUaGFuU2l4dHlUaHJlZUNoYXJhY3RlcnM7CiAgICAgICAgICAgIHR5cGUgaW5zdGFuY2UtaWRlbnRpZmllcjsKICAgICAgIH0KCiAgICAgICAgbGVhZiB1c2VkLWJ5LWVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzIHsKICAgICAgICAgICAgb3ItdGVpdi15ZXh0OmJTaWRlIEVudGl0eVR5cGVBV2l0aEVudGl0eVR5cGVOYW1lTGVuZ3RoTG9uZ2VyVGhhblNpeHR5VGhyZWVDaGFyYWN0ZXJzOwogICAgICAgICAgICB0eXBlIGluc3RhbmNlLWlkZW50aWZpZXI7CiAgICAgICB9CiAgICB9Cn0=
\.
-COPY ties_model.entity_info("name", "moduleReferenceName") FROM stdin;
-GNBDUFunction o-ran-smo-teiv-ran
-ENodeBFunction o-ran-smo-teiv-ran
-AntennaCapability o-ran-smo-teiv-ran
-LTESectorCarrier o-ran-smo-teiv-ran
-NRSectorCarrier o-ran-smo-teiv-ran
-AntennaModule o-ran-smo-teiv-equipment
+COPY ties_model.entity_info("storedAt", "name", "moduleReferenceName") FROM stdin;
+o-ran-smo-teiv-equipment_AntennaModule AntennaModule o-ran-smo-teiv-equipment
+o-ran-smo-teiv-ran_AntennaCapability AntennaCapability o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_ENodeBFunction ENodeBFunction o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_GNBDUFunction GNBDUFunction o-ran-smo-teiv-ran
+o-ran-smo-teiv-ran_LTESectorCarrier LTESectorCarrier o-ran-smo-teiv-ran
+test-built-in-module_EntityTypeA EntityTypeA test-built-in-module
+test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module
\.
-COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "relationshipDataLocation", "connectSameEntity", "moduleReferenceName") FROM stdin;
-LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier 0 1 used-by-lteSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran
-ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction 1 1 provided-by-enodebFunction LTESectorCarrier 0 9223372036854775807 BI_DIRECTIONAL B_SIDE false o-ran-smo-teiv-ran
-NRSECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability NRSectorCarrier 0 9223372036854775807 used-by-nrSectorCarrier AntennaCapability 0 1 BI_DIRECTIONAL A_SIDE false o-ran-smo-teiv-ran
-ANTENNACAPABILITY_USES_ANTENNACAPABILITY used-antennaCapability AntennaCapability 0 1 used-by-antennaCapability AntennaCapability 0 1 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran
-ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY provided-antennaCapability AntennaCapability 0 9223372036854775807 provided-by-antennaCapability AntennaCapability 0 1 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran
-ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaCapability 0 1 serviced-by-antennaCapability AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran
-ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY realised-by-antennaCapability AntennaCapability 0 9223372036854775807 realised-antennaCapability AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-ran
-ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule 0 9223372036854775807 serving-antennaModule AntennaCapability 0 9223372036854775807 BI_DIRECTIONAL RELATION false o-ran-smo-teiv-rel-equipment-ran
-ANTENNAMODULE_USES_ANTENNAMODULE used-by-antennaModule AntennaModule 0 9223372036854775807 used-antennaModule AntennaModule 0 9223372036854775807 BI_DIRECTIONAL RELATION true o-ran-smo-teiv-equipment
+COPY ties_model.relationship_info("name", "aSideAssociationName", "aSideMOType", "aSideModule", "aSideMinCardinality", "aSideMaxCardinality", "bSideAssociationName", "bSideMOType", "bSideModule", "bSideMinCardinality", "bSideMaxCardinality", "associationKind", "connectSameEntity", "relationshipDataLocation", "storedAt", "moduleReferenceName") FROM stdin;
+ANTENNAMODULE_SERVES_ANTENNACAPABILITY serviced-antennaCapability AntennaModule o-ran-smo-teiv-equipment 0 9223372036854775807 serving-antennaModule AntennaCapability o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false RELATION o-ran-smo-teiv-rel-equipment-ran_ANTENNAMODULE_SERVES_ANTENNACAPABILITY o-ran-smo-teiv-rel-equipment-ran
+ENODEBFUNCTION_PROVIDES_LTESECTORCARRIER provided-lteSectorCarrier ENodeBFunction o-ran-smo-teiv-ran 1 1 provided-by-enodebFunction LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran
+ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL true RELATION test-built-in-module_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module
+ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 grouped-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL false A_SIDE test-built-in-module_EntityTypeA test-built-in-module
+ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS installed-at-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 9223372036854775807 installed-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 9223372036854775807 BI_DIRECTIONAL false RELATION test-built-in-module_ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS test-built-in-module
+ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS provided-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 1 provided-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 9223372036854775807 BI_DIRECTIONAL false B_SIDE test-built-in-module_EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module
+ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters EntityTypeA test-built-in-module 0 1 used-by-entityTypeA EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters test-built-in-module 0 1 BI_DIRECTIONAL false A_SIDE test-built-in-module_EntityTypeA test-built-in-module
+LTESECTORCARRIER_USES_ANTENNACAPABILITY used-antennaCapability LTESectorCarrier o-ran-smo-teiv-ran 0 9223372036854775807 used-by-lteSectorCarrier AntennaCapability o-ran-smo-teiv-ran 0 1 BI_DIRECTIONAL false A_SIDE o-ran-smo-teiv-ran_LTESectorCarrier o-ran-smo-teiv-ran
\.
;
diff --git a/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql
new file mode 100644
index 0000000..e393eb0
--- /dev/null
+++ b/pgsql-schema-generator/src/test/resources/expected-db-schema/result_02_init-oran-smo-teiv-consumer-data.sql
@@ -0,0 +1,53 @@
+--
+-- ============LICENSE_START=======================================================
+-- Copyright (C) 2024 Ericsson
+-- Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+-- ================================================================================
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- SPDX-License-Identifier: Apache-2.0
+-- ============LICENSE_END=========================================================
+--
+
+BEGIN;
+
+CREATE SCHEMA IF NOT EXISTS ties_consumer_data;
+ALTER SCHEMA ties_consumer_data OWNER TO :pguser;
+SET default_tablespace = '';
+SET default_table_access_method = heap;
+
+SET ROLE :'pguser';
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."module_reference" (
+ "name" TEXT PRIMARY KEY,
+ "namespace" TEXT,
+ "revision" TEXT NOT NULL,
+ "content" TEXT NOT NULL,
+ "ownerAppId" VARCHAR(511) NOT NULL,
+ "status" VARCHAR(127) NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."decorators" (
+ "name" TEXT PRIMARY KEY,
+ "dataType" VARCHAR(511) NOT NULL,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS ties_consumer_data."classifiers" (
+ "name" TEXT PRIMARY KEY,
+ "moduleReferenceName" TEXT NOT NULL,
+ FOREIGN KEY ("moduleReferenceName") REFERENCES ties_consumer_data."module_reference" ("name") ON DELETE CASCADE
+);
+
+COMMIT;
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang
index a8f4dc8..fba4d6e 100644
--- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-extensions.yang
@@ -14,7 +14,7 @@
This model contains extensions to the YANG language that topology and
inventory models will use to define and annotate types and relationships.";
- revision "2024-05-14" {
+ revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
@@ -23,30 +23,31 @@
description
"Defines a bi-directional relationship in the topology.
- A bi-directional-association (BDA) is a relationship comprising of an
- A-side and a B-side. The A-side is considered the originating side of
- the relationship; the B-side is considered the terminating side of the
- relationship. The order of A-side and B-side is of importance and MUST
- NOT be changed once defined.
+ A bi-directional-association (BDA) is a relationship comprising of
+ an A-side and a B-side. The A-side is considered the originating
+ side of the relationship; the B-side is considered the terminating
+ side of the relationship. The order of A-side and B-side is of
+ importance and MUST NOT be changed once defined.
- Both A-side and B-side are defined on a type, and are given a role. A
- type may have multiple originating and/or terminating sides of a
+ Both A-side and B-side are defined on a type, and are given a role.
+ A type may have multiple originating and/or terminating sides of a
relationship, all distinguished by role name.
The statement MUST only be a substatement of the 'module' statement.
- Multiple 'bi-directional-topology-relationship' statements are allowed
- per parent statement.
+ Multiple 'bi-directional-topology-relationship' statements are
+ allowed per parent statement.
- Substatements to the 'bi-directional-topology-relationship' define the
- A-side and the B-side, respectively, and optionally properties of the
- relationship. Data nodes of types 'leaf' and 'leaf-list' are used for
- this purpose. One of the data nodes MUST be annotated with the 'a-side'
- extension; another data node MUST be annotated with the 'b-side'
- extension. Other data nodes define properties of the relationship.
+ Substatements to the 'bi-directional-topology-relationship' define
+ the A-side and the B-side, respectively, and optionally properties
+ of the relationship. Data nodes of types 'leaf' and 'leaf-list' are
+ used for this purpose. One of the data nodes MUST be annotated with
+ the 'a-side' extension; another data node MUST be annotated with the
+ 'b-side' extension. Other data nodes define properties of the
+ relationship.
- The argument is the name of the relationship. The relationship name is
- scoped to the namespace of the declaring module and MUST be unique
- within the scope.";
+ The argument is the name of the relationship. The relationship name
+ is scoped to the namespace of the declaring module and MUST be
+ unique within the scope.";
argument relationshipName;
}
@@ -63,19 +64,21 @@
'instance-identifier'. Constraints MAY be used as part of the parent
'leaf' or 'leaf-list' to enforce cardinality.
- The identifier of the parent 'leaf' or 'leaf-list' is used as name of
- the role of the A-side of the relationship. The name of the role is
- scoped to the type on which the A-side is defined and MUST be unique
- within the scope.
+ The identifier of the parent 'leaf' or 'leaf-list' is used as name
+ of the role of the A-side of the relationship. The name of the role
+ is scoped to the type on which the A-side is defined and MUST be
+ unique within the scope.
- While the parent 'leaf' or 'leaf-list' does not result in a property of
- the relationship, it is RECOMMENDED to avoid using the name of an
+ While the parent 'leaf' or 'leaf-list' does not result in a property
+ of the relationship, it is RECOMMENDED to avoid using the name of an
existing type property as role name to avoid potential ambiguities
- between properties of a type, and roles of a relationship on the type.
+ between properties of a type, and roles of a relationship on the
+ type.
- The argument is the name of the type on which the A-side resides. If the
- type is declared in another module, the type must be prefixed, and a
- corresponding 'import' statement be used to declare the prefix.";
+ The argument is the name of the type on which the A-side resides.
+ If the type is declared in another module, the type must be
+ prefixed, and a corresponding 'import' statement be used to declare
+ the prefix.";
argument aSideType;
}
@@ -92,19 +95,21 @@
'instance-identifier'. Constraints MAY be used as part of the parent
'leaf' or 'leaf-list' to enforce cardinality.
- The identifier of the parent 'leaf' or 'leaf-list' is used as name of
- the role of the B-side of the relationship. The name of the role is
- scoped to the type on which the B-side is defined and MUST be unique
- within the scope.
+ The identifier of the parent 'leaf' or 'leaf-list' is used as name
+ of the role of the B-side of the relationship. The name of the role
+ is scoped to the type on which the B-side is defined and MUST be
+ unique within the scope.
- While the parent 'leaf' or 'leaf-list' does not result in a property of
- the relationship, it is RECOMMENDED to avoid using the name of an
+ While the parent 'leaf' or 'leaf-list' does not result in a property
+ of the relationship, it is RECOMMENDED to avoid using the name of an
existing type property as role name to avoid potential ambiguities
- between properties of a type, and roles of a relationship on the type.
+ between properties of a type, and roles of a relationship on the
+ type.
- The argument is the name of the type on which the B-side resides. If the
- type is declared in another module, the type must be prefixed, and a
- corresponding 'import' statement be used to declare the prefix.";
+ The argument is the name of the type on which the B-side resides.
+ If the type is declared in another module, the type must be
+ prefixed, and a corresponding 'import' statement be used to declare
+ the prefix.";
argument bSideType;
}
@@ -116,14 +121,18 @@
extension label {
description
- "The label can be used to give modules and submodules a semantic version, in addition to their revision.
+ "The label can be used to give modules and submodules a semantic
+ version, in addition to their revision.
- The format of the label is ‘x.y.z’ – expressed as pattern, it is [0-9]+\\.[0-9]+\\.[0-9]+
+ The format of the label is ‘x.y.z’ – expressed as pattern, it is
+ [0-9]+\\.[0-9]+\\.[0-9]+
- The statement MUST only be a substatement of the revision statement. Zero or one revision label statements
- per parent statement are allowed.
+ The statement MUST only be a substatement of the revision statement.
+ Zero or one revision label statements per parent statement are
+ allowed.
- Revision labels MUST be unique amongst all revisions of a module or submodule.";
+ Revision labels MUST be unique amongst all revisions of a module or
+ submodule.";
argument semversion;
}
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang
index 72c2820..4585747 100644
--- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-common-yang-types.yang
@@ -1,5 +1,4 @@
module o-ran-smo-teiv-common-yang-types {
-
yang-version 1.1;
namespace "urn:o-ran:smo-teiv-common-yang-types";
prefix or-teiv-types;
@@ -8,73 +7,88 @@
import _3gpp-common-yang-types { prefix types3gpp; }
- organization "ORAN";
- contact "The Authors";
+ organization "ORAN";
+ contact "The Authors";
description
"Topology and Inventory common types model.
- Copyright (C) 2024 Ericsson
- Modifications Copyright (C) 2024 OpenInfra Foundation Europe
+ Copyright (C) 2024 Ericsson
+ Modifications Copyright (C) 2024 OpenInfra Foundation Europe
This model contains re-usable data types that topology and inventory models
will frequently use as part of types and relationships.";
- revision "2024-05-14" {
+ revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
grouping Top_Grp_Type {
- description "Grouping containing the key attribute common to all types. All types
- MUST use this grouping.";
+ description "Grouping containing the key attribute common to all types.
+ All types MUST use this grouping.";
leaf id {
type string;
- description "Unique identifier of topology entities. Represents the Entity Instance Identifier.";
+ description "Unique identifier of topology entities. Represents the
+ Entity Instance Identifier.";
}
}
container decorators {
- description "This container serves as extension point for applications wishing to define their own decorators.
- This is done via augmentations. They can only be defined in name value pair.
+ description
+ "This container serves as extension point for applications wishing
+ to define their own decorators. This is done via augmentations. They
+ can only be defined in name value pair.
- This is a consumer data and can be attached to Topology Entity or Topology Relation instance,
- outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be
- instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise.";
+ This is a consumer data and can be attached to Topology Entity or
+ Topology Relation instance, outside of the declared Topology Entity
+ or Topology Relationship's attributes. This cannot be instantiated,
+ and it MUST NOT be augmented or deviated in any way, unless stated
+ otherwise.";
}
leaf-list classifiers {
- description "Consumer defined tags to topology entities and relationships.
+ description
+ "Consumer defined tags to topology entities and relationships.
- This is a consumer data and can be attached to Topology Entity or Topology Relation instance,
- outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be
- instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise.";
+ This is a consumer data and can be attached to Topology Entity or
+ Topology Relation instance, outside of the declared Topology Entity
+ or Topology Relationship's attributes. This cannot be instantiated,
+ and it MUST NOT be augmented or deviated in any way, unless stated
+ otherwise.";
type identityref { base classifier; }
}
leaf-list sourceIds {
- description "An ordered list of identities that represent the set of native source identifiers for participating
- entities.
+ description
+ "An ordered list of identities that represent the set of native
+ source identifiers for participating entities.
- This is a consumer data and can be attached to Topology Entity or Topology Relation instance,
- outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be
- instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise.";
+ This is a consumer data and can be attached to Topology Entity or
+ Topology Relation instance, outside of the declared Topology Entity
+ or Topology Relationship's attributes. This cannot be instantiated,
+ and it MUST NOT be augmented or deviated in any way, unless stated
+ otherwise.";
type string;
ordered-by user;
}
container metadata {
- description "This container serves as extension point to define metadata. They can only be defined in name value
- pair.
+ description
+ "This container serves as extension point to define metadata. They
+ can only be defined in name value pair.
- This is a consumer data and can be attached to Topology Entity or Topology Relation instance,
- outside of the declared Topology Entity or Topology Relationship's attributes. This cannot be
- instantiated, and it MUST NOT be augmented or deviated in any way, unless stated otherwise.";
+ This is a consumer data and can be attached to Topology Entity or
+ Topology Relation instance, outside of the declared Topology Entity
+ or Topology Relationship's attributes. This cannot be instantiated,
+ and it MUST NOT be augmented or deviated in any way, unless stated
+ otherwise.";
}
identity classifier{
- description "The classifier is used as a base to provide all classifiers with identity. ";
+ description "The classifier is used as a base to provide all classifiers
+ with identity. ";
}
}
\ No newline at end of file
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang
index 55e0071..d25ea98 100644
--- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-equipment.yang
@@ -15,17 +15,17 @@
organization "ORAN";
contact "The Authors";
description
- "RAN Equipment topology model.
+ "Equipment topology model.
Copyright (C) 2024 Ericsson
Modifications Copyright (C) 2024 OpenInfra Foundation Europe
- This model contains the topology entities and relations in the
- Equipment domain, which is modelled to understand the physical
- location of equipment such as antennas associated with a cell/carrier
- and their relevant properties e.g. tilt, max power etc.";
+ This model contains the topology entities and relations in the Equipment
+ domain, which is modelled to understand the physical location of equipment
+ such as antennas associated with a cell/carrier and their relevant
+ properties e.g. tilt, max power etc.";
- revision "2024-05-14" {
+ revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
@@ -33,83 +33,64 @@
or-teiv-yext:domain EQUIPMENT;
list AntennaModule {
- description "An Antenna Module represents the
- physical aspect of an antenna.";
+ description "An Antenna Module represents the physical aspect of an
+ antenna.";
uses or-teiv-types:Top_Grp_Type;
key id;
container attributes {
leaf antennaModelNumber {
- description "Vendor-specific antenna model
- identifier. This attribute is part of
- AISG v3 ADB Standard and has
- no operational impact.";
+ description "Vendor-specific antenna model identifier. This
+ attribute is part of AISG v3 ADB Standard and has no
+ operational impact.";
type string;
}
leaf mechanicalAntennaBearing {
- description "Antenna bearing on antenna subunit
- where antenna unit is installed.";
- type uint32;
+ description "Antenna bearing on antenna subunit where antenna
+ unit is installed.";
+ type int32;
}
leaf mechanicalAntennaTilt {
- description "The fixed antenna tilt of the installation,
- defined as the inclination of the antenna
- element respect to the vertical plane.
- It is a signed value. Positive indicates
- downtilt, and negative indicates uptilt.";
- type uint32;
+ description "The fixed antenna tilt of the installation, defined
+ as the inclination of the antenna element respect to the
+ vertical plane. It is a signed value. Positive indicates
+ downtilt, and negative indicates uptilt.";
+ type int32;
}
leaf positionWithinSector {
- description "Antenna unit position within sector.
- This attribute is part of AISG v3 ADB
- Standard and has no operational impact.";
+ description "Antenna unit position within sector. This attribute
+ is part of AISG v3 ADB Standard and has no operational
+ impact.";
type string;
}
leaf totalTilt {
- description "Total antenna elevation including the
- installed tilt and the tilt applied by
- the Remote Electrical Tilt (RET).";
- type uint32;
+ description "Total antenna elevation including the installed
+ tilt and the tilt applied by the Remote Electrical
+ Tilt (RET).";
+ type int32;
}
leaf electricalAntennaTilt {
description "Electrically-controlled tilt of main beam maximum
- with respect to direction orthogonal to antenna
- element axis (see 3GPP TS 25.466). Value is signed;
- tilt down is positive, tilt up is negative.";
- type uint32;
+ with respect to direction orthogonal to antenna element
+ axis (see 3GPP TS 25.466). Value is signed; tilt down is
+ positive, tilt up is negative.";
+ type int32;
}
leaf-list antennaBeamWidth {
- description "The angular span of the main lobe of the antenna radiation
- pattern in the horizontal plane. Measured in degrees.";
+ description "The angular span of the main lobe of the antenna
+ radiation pattern in the horizontal plane. Measured in
+ degrees.";
type uint32;
}
uses geo:geo-location;
}
}
-
- or-teiv-yext:biDirectionalTopologyRelationship ANTENNAMODULE_USES_ANTENNAMODULE { // Same entity (0..1 to 0..1)
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf-list used-by-antennaModule {
- description "Antenna Module realised by Antenna Module.";
- or-teiv-yext:aSide AntennaModule;
- type instance-identifier;
- }
-
- leaf-list used-antennaModule {
- description "Antenna Module realises Antenna Module.";
- or-teiv-yext:bSide AntennaModule;
- type instance-identifier;
- }
- }
}
\ No newline at end of file
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang
index 00fee0e..474b2af 100644
--- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-ran.yang
@@ -9,19 +9,24 @@
import _3gpp-common-yang-types { prefix types3gpp; }
+ import ietf-geo-location {
+ prefix geo;
+ reference "RFC 9179: A YANG Grouping for Geographic Locations";
+ }
+
organization "ORAN";
- contact "ORAN first line support via email";
+ contact "The Authors";
description
- "RAN Logical topology model.
+ "RAN topology model.
Copyright (C) 2024 Ericsson
Modifications Copyright (C) 2024 OpenInfra Foundation Europe
- This model contains the topology entities and relations in the
- RAN domain, which represents the functional capability
- of the deployed RAN that are relevant to rApps use cases.";
+ This model contains the topology entities and relations in the RAN domain,
+ which represents the functional capability of the deployed RAN that are
+ relevant to rApps use cases.";
- revision "2024-05-14" {
+ revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
@@ -31,24 +36,21 @@
list GNBDUFunction {
description "gNodeB Distributed Unit (gNB-DU).
- A gNB may consist of a gNB-Centralized Unit
- (gNB-CU) and a gNB-DU. The CU processes non-real
- time protocols and services, and the DU processes
- PHY level protocol and real time services. The
- gNB-CU and the gNB-DU units are connected via
- F1 logical interface.
+ A gNB may consist of a gNB-Centralized Unit (gNB-CU) and a gNB-DU.
+ The CU processes non-real time protocols and services, and the DU
+ processes PHY level protocol and real time services. The gNB-CU and
+ the gNB-DU units are connected via F1 logical interface.
- The following is true for a gNB-DU:
- Is connected to the gNB-CU-CP through the F1-C
- interface.Is connected to the gNB-CU-UP through
- the F1-U interface. One gNB-DU is connected to only
- one gNB-CU-CP. One gNB-DU can be connected to
- multiple gNB-CU-UPs under the control of the same
- gNB-CU-CP.
- Note: A gNB may consist of a gNB-CU-CP, multiple
- gNB-CU-UPs and multiple gNB-DUs. gNB-DU is a concrete
- class that extends the NG-RAN node object. In Topology, you
- can create, read, update, and delete the gNB-DU object.";
+ The following is true for a gNB-DU:
+ Is connected to the gNB-CU-CP through the F1-C interface. Is
+ connected to the gNB-CU-UP through the F1-U interface. One gNB-DU is
+ connected to only one gNB-CU-CP. One gNB-DU can be connected to
+ multiple gNB-CU-UPs under the control of the same gNB-CU-CP.
+
+ Note: A gNB may consist of a gNB-CU-CP, multiple gNB-CU-UPs and
+ multiple gNB-DUs. gNB-DU is a concrete class that extends the NG-RAN
+ node object. In Topology, you can create, read, update, and delete
+ the gNB-DU object.";
uses or-teiv-types:Top_Grp_Type;
key id;
@@ -61,73 +63,69 @@
leaf gNBDUId {
description "Unique identifier for the DU within a gNodeB";
- type uint32;
+ type int64;
}
leaf gNBId {
description "Identity of gNodeB within a PLMN";
- type uint32;
+ type int64;
}
leaf gNBIdLength {
description "Length of gNBId bit string representation";
- type uint32;
+ type int32;
}
}
}
list ENodeBFunction {
- description "An Evolved Node B (eNodeB) is the only mandatory
- node in the radio access network (RAN) of Long-Term
- Evolution (LTE). The eNodeB is a complex base
- station that handles radio communications
- in the cell and carries out radio resource
- management and handover decisions. Unlike 2/3G
- wireless RAN, there is no centralized radio network
- controller in LTE. It is the hardware that is connected
- to the mobile phone network that communicates
- directly with mobile handsets (User Equipment), like a base
- transceiver station (BTS) in GSM networks. This simplifies
- the architecture and allows lower response times.";
+ description "An Evolved Node B (eNodeB) is the only mandatory node in
+ the radio access network (RAN) of Long-Term Evolution (LTE). The
+ eNodeB is a complex base station that handles radio communications
+ in the cell and carries out radio resource management and handover
+ decisions. Unlike 2/3G wireless RAN, there is no centralized radio
+ network controller in LTE. It is the hardware that is connected to
+ the mobile phone network that communicates directly with mobile
+ handsets (User Equipment), like a base transceiver station (BTS) in
+ GSM networks. This simplifies the architecture and allows lower
+ response times.";
uses or-teiv-types:Top_Grp_Type;
key id;
container attributes {
leaf eNBId {
- description "The ENodeB ID that forms part of
- the Cell Global Identity, and is
- also used to identify the node over
- the S1 interface";
- type uint32;
+ description "The ENodeB ID that forms part of the Cell Global
+ Identity, and is also used to identify the node over the S1
+ interface";
+ type int32;
default 11;
}
container eNodeBPlmnId {
- description "The ENodeB Public Land Mobile Network
- (PLMN) ID that forms part of the ENodeB
- Global ID used to identify the node over
- the S1 interface. Note: The value (MCC=001, MNC=01)
- indicates that the PLMN is not initiated.
- The value can not be used as a valid PLMN Identity.";
+ description "The ENodeB Public Land Mobile Network (PLMN) ID
+ that forms part of the ENodeB Global ID used to identify the
+ node over the S1 interface. Note: The value
+ (MCC=001, MNC=01) indicates that the PLMN is not initiated.
+ The value can not be used as a valid PLMN Identity.";
leaf mcc {
- description "The MCC part of a PLMN identity
- used in the radio network.";
+ description "The MCC part of a PLMN identity used in the
+ radio network.";
type int32 {
range 0..999;
}
}
leaf mnc {
- description "The MNC part of a PLMN identity
- used in the radio network.";
+ description "The MNC part of a PLMN identity used in the
+ radio network.";
type int32 {
range 0..999;
}
}
leaf mncLength {
- description "The length of the MNC part of a
- PLMN identity used in the radio network.";
+ description "The length of the MNC part of a PLMN identity
+ used in the radio network.";
type int32 {
range 2..3;
}
@@ -136,45 +134,14 @@
}
}
- list AntennaCapability {
- description "This MO serves as a mapping between the cell
- and the RBS equipment used to provide coverage
- in a certain geographical area. The MO also
- controls the maximum output power of the sector.";
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- container attributes {
- leaf-list eUtranFqBands {
- description "List of LTE frequency bands
- that associated hardware supports";
- type string;
- }
-
- leaf-list geranFqBands {
- description "List of GERAN frequency bands
- that associated hardware supports";
- type string;
- }
-
- leaf-list nRFqBands {
- description "List of NR frequency bands
- associated hardware supports";
- type string;
- }
- }
- }
-
list LTESectorCarrier {
- description "The LTE Sector Carrier object provides the
- attributes for defining the logical characteristics
- of a carrier (cell) in a sector. A sector is a coverage
- area associated with a base station having
- its own antennas, radio ports, and control channels.
- The concept of sectors was developed to improve co-channel
- interference in cellular systems, and most wireless systems
- use three sector cells.";
+ description "The LTE Sector Carrier object provides the attributes for
+ defining the logical characteristics of a carrier (cell) in a
+ sector. A sector is a coverage area associated with a base station
+ having its own antennas, radio ports, and control channels. The
+ concept of sectors was developed to improve co-channel interference
+ in cellular systems, and most wireless systems use three sector
+ cells.";
uses or-teiv-types:Top_Grp_Type;
key id;
@@ -182,7 +149,7 @@
container attributes {
leaf sectorCarrierType {
description "Indicates whether or not the sector carrier
- modelled by MO SectorCarrier is a digital sector.";
+ modelled by MO SectorCarrier is a digital sector.";
type enumeration {
enum normal_sector {
value 0;
@@ -204,7 +171,7 @@
value 4;
description "Right digital sector for 3DS";
}
- enum middle_digital_sector {
+ enum middle_digital_sector_3ds {
value 5;
description "Middle digital sector for 3DS";
}
@@ -213,65 +180,32 @@
}
}
- list NRSectorCarrier {
- description "The NR Sector Carrier object provides
- the attributes for defining the logical
- characteristics of a carrier (cell) in a
- sector. A sector is a coverage area associated
- with a base station having its own antennas,
- radio ports, and control channels. The concept
- of sectors was developed to improve co-channel
- interference in cellular systems, and most wireless
- systems use three sector cells.";
+ list AntennaCapability {
+ description "This MO serves as a mapping between the cell and the RBS
+ equipment used to provide coverage in a certain geographical area.
+ The MO also controls the maximum output power of the sector.";
uses or-teiv-types:Top_Grp_Type;
key id;
container attributes {
- leaf arfcnDL {
- description "NR Absolute Radio Frequency Channel
- Number (NR-ARFCN) for downlink";
- type uint32;
+ leaf-list eUtranFqBands {
+ description "List of LTE frequency bands that associated
+ hardware supports";
+ type string;
}
- leaf arfcnUL {
- description "NR Absolute Radio frequency Channel Number
- (NR-ARFCN) for uplink.";
- type uint32;
+ leaf-list geranFqBands {
+ description "List of GERAN frequency bands that associated
+ hardware supports";
+ type string;
}
- leaf frequencyDL {
- description "RF Reference Frequency of downlink channel";
- type uint32;
+ leaf-list nRFqBands {
+ description "List of NR frequency bands associated hardware
+ supports";
+ type string;
}
-
- leaf frequencyUL {
- description "RF Reference Frequency of uplink channel";
- type uint32;
- }
-
- leaf bSChannelBwDL {
- description "BS Channel bandwidth in MHz for downlink.";
- type uint32;
- }
- }
- }
-
- or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIER_USES_ANTENNACAPABILITY { // 0..1 to 0..1
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf used-antennaCapability {
- description "LTE Sector Carrier uses Antenna Capability.";
- or-teiv-yext:aSide LTESectorCarrier;
- type instance-identifier;
- }
-
- leaf used-by-lteSectorCarrier {
- description "Antenna Cpability used by LTE Sector Carrier.";
- or-teiv-yext:bSide AntennaCapability;
- type instance-identifier;
}
}
@@ -294,93 +228,21 @@
}
}
- or-teiv-yext:biDirectionalTopologyRelationship NRSECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1
+ or-teiv-yext:biDirectionalTopologyRelationship LTESECTORCARRIER_USES_ANTENNACAPABILITY { // 0..n to 0..1
uses or-teiv-types:Top_Grp_Type;
key id;
leaf used-antennaCapability {
- description "NR Sector Carrier uses Antenna Capability.";
- or-teiv-yext:aSide NRSectorCarrier;
+ description "LTE Sector Carrier uses Antenna Capability.";
+ or-teiv-yext:aSide LTESectorCarrier;
type instance-identifier;
}
- leaf-list used-by-nrSectorCarrier {
- description "Antenna Capability used by NR Sector Carrier.";
+ leaf-list used-by-lteSectorCarrier {
+ description "Antenna Capability used by LTE Sector Carrier.";
or-teiv-yext:bSide AntennaCapability;
type instance-identifier;
}
}
-
- or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_USES_ANTENNACAPABILITY { // Same entity (0..1 to 0..1)
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf used-antennaCapability {
- description "Antenna Capability realised by Antenna Capability.";
- or-teiv-yext:aSide AntennaCapability;
- type instance-identifier;
- }
-
- leaf used-by-antennaCapability {
- description "Antenna Capability realises Antenna Capability.";
- or-teiv-yext:bSide AntennaCapability;
- type instance-identifier;
- }
- }
-
- or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_PROVIDES_ANTENNACAPABILITY { // Same entity (0..1 to 0..n)
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf provided-antennaCapability {
- description "Antenna Capability realised by Antenna Capability.";
- or-teiv-yext:aSide AntennaCapability;
- type instance-identifier;
- }
-
- leaf-list provided-by-antennaCapability {
- description "Antenna Capability realises Antenna Capability.";
- or-teiv-yext:bSide AntennaCapability;
- type instance-identifier;
- }
- }
-
- or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_SERVES_ANTENNACAPABILITY { // Same entity (0..n to 0..1)
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf-list serviced-antennaCapability {
- description "Antenna Capability realised by Antenna Capability.";
- or-teiv-yext:aSide AntennaCapability;
- type instance-identifier;
- }
-
- leaf serviced-by-antennaCapability {
- description "Antenna Capability realises Antenna Capability.";
- or-teiv-yext:bSide AntennaCapability;
- type instance-identifier;
- }
- }
-
- or-teiv-yext:biDirectionalTopologyRelationship ANTENNACAPABILITY_REALISED_BY_ANTENNACAPABILITY { // Same entity (0..n to 0..m)
-
- uses or-teiv-types:Top_Grp_Type;
- key id;
-
- leaf-list realised-by-antennaCapability {
- description "Antenna Capability realised by Antenna Capability.";
- or-teiv-yext:aSide AntennaCapability;
- type instance-identifier;
- }
-
- leaf-list realised-antennaCapability {
- description "Antenna Capability realises Antenna Capability.";
- or-teiv-yext:bSide AntennaCapability;
- type instance-identifier;
- }
- }
}
\ No newline at end of file
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang
index 4d30b10..a860ef1 100644
--- a/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/o-ran-smo-teiv-rel-equipment-ran.yang
@@ -21,7 +21,7 @@
This model contains the topology relations between Equipment and RAN.";
- revision "2024-05-14" {
+ revision "2024-05-24" {
description "Initial revision.";
or-teiv-yext:label 0.3.0;
}
@@ -45,4 +45,4 @@
type instance-identifier;
}
}
-}
+}
\ No newline at end of file
diff --git a/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang b/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang
new file mode 100644
index 0000000..349135b
--- /dev/null
+++ b/pgsql-schema-generator/src/test/resources/generate-defaults/test-built-in-module.yang
@@ -0,0 +1,153 @@
+module test-built-in-module {
+ yang-version 1.1;
+ namespace "test-built-in-namespace";
+
+ import o-ran-smo-teiv-common-yang-types { prefix or-teiv-types; }
+
+ import o-ran-smo-teiv-common-yang-extensions { prefix or-teiv-yext; }
+
+ import _3gpp-common-yang-types { prefix types3gpp; }
+
+ import ietf-geo-location {
+ prefix geo;
+ reference "RFC 9179: A YANG Grouping for Geographic Locations";
+ }
+
+ organization "ORAN";
+ contact "The Authors";
+ description
+ "Test topology model.";
+
+ revision "2024-05-24" {
+ description "Initial revision.";
+ or-teiv-yext:label 0.3.0;
+ }
+
+ or-teiv-yext:domain TEST;
+
+ list EntityTypeA {
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ }
+
+ list EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ container attributes {
+ leaf attributeA1WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type string;
+ }
+
+ leaf attributeA2WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type uint32;
+ }
+
+ leaf attributeA3WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type int32;
+ }
+
+ leaf attributeA4WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type int64;
+ }
+
+ leaf attributeA5WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type decimal64{
+ fraction-digits 6;
+ }
+ units "degrees";
+ }
+
+ leaf-list attributeA6WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ type string;
+ }
+
+ container attributeA7WithAttributeNameLengthLongerThanSixtyThreeCharacters {
+ uses types3gpp:PLMNId;
+ }
+ }
+ }
+
+ or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..1
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ leaf used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:aSide EntityTypeA;
+ type instance-identifier;
+ }
+
+ leaf used-by-entityTypeA {
+ or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+ }
+
+ or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_PROVIDES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..n
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ leaf-list provided-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:aSide EntityTypeA;
+ type instance-identifier;
+ }
+
+ leaf provided-by-entityTypeA {
+ or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+ }
+
+ or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_GROUPS_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..n to 0..1
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ leaf grouped-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:aSide EntityTypeA;
+ type instance-identifier;
+ }
+
+ leaf-list grouped-by-entityTypeA {
+ or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+ }
+
+ or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEA_INSTALLED_AT_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..n to 0..m
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ leaf-list installed-at-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:aSide EntityTypeA;
+ type instance-identifier;
+ }
+
+ leaf-list installed-entityTypeA {
+ or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+ }
+
+ or-teiv-yext:biDirectionalTopologyRelationship ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS_USES_ENTITYTYPEAWITHENTITYTYPENAMELENGTHLONGERTHANSIXTYTHREECHARACTERS { // 0..1 to 0..1
+
+ uses or-teiv-types:Top_Grp_Type;
+ key id;
+
+ leaf used-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:aSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+
+ leaf used-by-entityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters {
+ or-teiv-yext:bSide EntityTypeAWithEntityTypeNameLengthLongerThanSixtyThreeCharacters;
+ type instance-identifier;
+ }
+ }
+}
\ No newline at end of file