{"configuration":{},"description":"Description","documentation":{},"id":2,"lastModifiedAgent":"structurizr-onpremises/diagrams/4f2b419c-d52d-4761-9a3e-399cafbbc4de","lastModifiedDate":"2025-03-23T08:32:52Z","lastModifiedUser":"janis.kampars","model":{"people":[{"description":"A person who owns the digital asset","id":"1","location":"Unspecified","name":"Asset owner","properties":{"structurizr.dsl.identifier":"assetowner"},"relationships":[{"description":"Publishes assets and manages access","destinationId":"7","id":"244","sourceId":"1","tags":"Relationship,asset_ownner_lvl1"},{"description":"Publishes assets and manages access","destinationId":"6","id":"245","linkedRelationshipId":"244","sourceId":"1"},{"description":"Publishes assets","destinationId":"35","id":"246","sourceId":"1","tags":"Relationship,asset_ownner_lvl2"},{"description":"Manages access to assets","destinationId":"33","id":"247","sourceId":"1","tags":"Relationship,asset_ownner_lvl2"}],"tags":"Element,Person"},{"description":"A person who views the digital asset","id":"2","location":"Unspecified","name":"Asset viewer","properties":{"structurizr.dsl.identifier":"assetviewer"},"relationships":[{"description":"Views assets","destinationId":"8","id":"248","sourceId":"2","tags":"Relationship"},{"description":"Views assets","destinationId":"7","id":"249","linkedRelationshipId":"248","sourceId":"2"},{"description":"Views assets","destinationId":"6","id":"250","linkedRelationshipId":"248","sourceId":"2"}],"tags":"Element,Person"},{"description":"Responsible for data governance","id":"3","location":"Unspecified","name":"Data Governance Officer","properties":{"structurizr.dsl.identifier":"dgo"},"relationships":[{"description":"Sets up access rules, accepts/denies access grants","destinationId":"84","id":"251","sourceId":"3","tags":"Relationship"},{"description":"Sets up access rules, accepts/denies access grants","destinationId":"82","id":"252","linkedRelationshipId":"251","sourceId":"3"},{"description":"Sets up access rules, accepts/denies access grants","destinationId":"80","id":"253","linkedRelationshipId":"251","sourceId":"3"}],"tags":"Element,Person"},{"description":"Administrator of the central DKMP node","id":"4","location":"Unspecified","name":"Platform Administrator","properties":{"structurizr.dsl.identifier":"platformadmin"},"relationships":[{"description":"Manages users and roles","destinationId":"73","id":"241","sourceId":"4","tags":"Relationship"},{"description":"Manages users and roles","destinationId":"6","id":"242","linkedRelationshipId":"241","sourceId":"4"},{"description":"Updates ontology","destinationId":"66","id":"243","sourceId":"4","tags":"Relationship"}],"tags":"Element,Person"}],"properties":{"structurizr.groupSeparator":"."},"softwareSystems":[{"description":"Repository for storing digital assets","documentation":{},"id":"5","location":"Unspecified","name":"Open Research Repository","properties":{"structurizr.dsl.identifier":"open_research_repo","hints":"This is an external system like Zenodo, that will not be modelled in detail. This should be mentioned in your description."},"tags":"Element,Software System,external"},{"containers":[{"components":[{"description":"Drupal core functionality","documentation":{},"id":"8","name":"Drupal Core","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.drupal_core","fr":"6.3"},"tags":"Element,Component,core_extend","technology":"Drupal 10"},{"description":"Service for visualising digital assets","documentation":{},"id":"9","name":"Asset Visualisation Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.asset_visualisation_module","fr":"5.2"},"relationships":[{"description":"Displays digital asset metadata","destinationId":"8","id":"10","sourceId":"9","tags":"Relationship,core_extend"},{"description":"Load additional data from ontology for visualization","destinationId":"64","id":"140","sourceId":"9","tags":"Relationship"},{"description":"Load additional data from ontology for visualization","destinationId":"63","id":"141","linkedRelationshipId":"140","sourceId":"9"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Service for managing metadata for digital assets","documentation":{},"id":"11","name":"Metadata Authoring Service","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.metadata_authoring_module","fr":"1.1,1.2,1.4,2.2,3.1,3.4,3.5,4.3,7.1"},"relationships":[{"description":"Manages metadata for digital assets","destinationId":"8","id":"12","sourceId":"11","tags":"Relationship,core_extend"},{"description":"Retrieves metadata for a digital asset","destinationId":"47","id":"125","sourceId":"11","tags":"Relationship"},{"description":"Retrieves metadata for a digital asset","destinationId":"46","id":"126","linkedRelationshipId":"125","sourceId":"11"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Service for enriching digital assets with additional data","documentation":{},"id":"13","name":"Data Enrichment Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.data_enrichment_module","fr":"1.3"},"relationships":[{"description":"Enriches digital assets with additional data","destinationId":"8","id":"14","sourceId":"13","tags":"Relationship,core_extend"},{"description":"Enriches data with additional information","destinationId":"54","id":"160","sourceId":"13","tags":"Relationship"},{"description":"Enriches data with additional information","destinationId":"51","id":"161","linkedRelationshipId":"160","sourceId":"13"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Service for harmonizing data for interporability between different simulation tools and model types","documentation":{},"id":"15","name":"ModularMMM Interopability Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.data_harmonization_module","fr":"4.3"},"relationships":[{"description":"Harmonizes data for interporability between different simulation tools and model types","destinationId":"8","id":"16","sourceId":"15","tags":"Relationship,core_extend"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Provides integration with the lifecycle assesment tool","documentation":{},"id":"17","name":"Lifecycle Assessment Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.lca_module","fr":"5.4,7.4"},"relationships":[{"description":"Provides data from LCA tool for visualisation","destinationId":"8","id":"18","sourceId":"17","tags":"Relationship,core_extend"},{"description":"Requests lifecycle assessments","destinationId":"68","id":"145","sourceId":"17","tags":"Relationship"},{"description":"Requests lifecycle assessments","destinationId":"67","id":"146","linkedRelationshipId":"145","sourceId":"17"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Provides support for uploading large files directly to S3 storage","documentation":{},"id":"19","name":"Large File Upload Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.large_file_upload_module","fr":"1.5"},"relationships":[{"description":"Extends forms with large file upload capabilities","destinationId":"8","id":"20","sourceId":"19","tags":"Relationship,core_extend"},{"description":"Uploads large files directly to storage in a centralised node","destinationId":"71","id":"111","sourceId":"19","tags":"Relationship"},{"description":"Uploads large files to storage in a distributed node or uses temporary storage for exchange","destinationId":"79","id":"113","sourceId":"19","tags":"Relationship"},{"description":"Uploads large files to storage in a distributed node or uses temporary storage for exchange","destinationId":"76","id":"114","linkedRelationshipId":"113","sourceId":"19"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Provides a widget for selecting units of measurement with automated conversion","documentation":{},"id":"21","name":"Unit Widget Module","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.unit_widget_module","fr":"3.5"},"relationships":[{"description":"Provides unit conversion functionality in forms","destinationId":"8","id":"22","sourceId":"21","tags":"Relationship,core_extend"},{"description":"Retrieves unit conversion data from ontology","destinationId":"64","id":"117","sourceId":"21","tags":"Relationship"},{"description":"Retrieves unit conversion data from ontology","destinationId":"63","id":"118","linkedRelationshipId":"117","sourceId":"21"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Manager forms for digital assets with accordance to the ontology","documentation":{},"id":"23","name":"Asset Form Manager","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.asset_entity_manager_module","fr":"3.2,4.3"},"relationships":[{"description":"Mantains entities for experiments and simulations","destinationId":"8","id":"24","sourceId":"23","tags":"Relationship,core_extend"},{"description":"Retrieves ontology constraints for form validation","destinationId":"64","id":"106","sourceId":"23","tags":"Relationship"},{"description":"Retrieves ontology constraints for form validation","destinationId":"63","id":"107","linkedRelationshipId":"106","sourceId":"23"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Provides indexing,expliration and search functionality for digital assets","documentation":{},"id":"25","name":"Asset Indexing and Discovery","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.asset_indexing_discovery_module","fr":"3.2,5.3"},"relationships":[{"description":"Extends search functionality","destinationId":"8","id":"26","sourceId":"25","tags":"Relationship,core_extend"},{"description":"Performs asset indexing and search","destinationId":"74","id":"138","sourceId":"25","tags":"Relationship"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Process editor for CHADA MODA models with export functionality","documentation":{},"id":"27","name":"CHADA MODA Exporter","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.chada_moda_module","fr":"3.3,5.1"},"relationships":[{"description":"Provides CHADA MODA document generation capabilties","destinationId":"8","id":"28","sourceId":"27","tags":"Relationship,core_extend"},{"description":"Requests rendering of CHADA MODA models","destinationId":"60","id":"151","sourceId":"27","tags":"Relationship"},{"description":"Requests rendering of CHADA MODA models","destinationId":"59","id":"152","linkedRelationshipId":"151","sourceId":"27"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Manages Git repositories and source code for digital assets in Git repositories","documentation":{},"id":"29","name":"Software Artefact Manager","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.software_artefact_manager_module","fr":"4.1,6.3"},"relationships":[{"description":"Manages source code for digital assets using GIT","destinationId":"8","id":"30","sourceId":"29","tags":"Relationship,core_extend"},{"description":"Manages source code for digital assets","destinationId":"75","id":"157","sourceId":"29","tags":"Relationship"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Temporary storage for digital assets","documentation":{},"id":"31","name":"Temporary File Storage","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.temporary_file_storage_module","fr":"2.1,6.5"},"relationships":[{"description":"Manages temporary storage for digital assets","destinationId":"8","id":"32","sourceId":"31","tags":"Relationship"},{"description":"Deletes files from storage if time elapsed","destinationId":"71","id":"119","sourceId":"31","tags":"Relationship"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Manages access to digital assets","documentation":{},"id":"33","name":"Access Management","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.access_management_module","fr":"6.1,6.2,6.4"},"relationships":[{"description":"Manages access to digital assets","destinationId":"8","id":"34","sourceId":"33","tags":"Relationship,core_extend"},{"description":"Manages users and roles","destinationId":"73","id":"102","sourceId":"33","tags":"Relationship"},{"description":"Adds access grants to the message queue","destinationId":"42","id":"104","sourceId":"33","tags":"Relationship"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Publishes digital assets in established repositories like Zenodo","documentation":{},"id":"35","name":"Asset publisher","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.asset_publishing_module","fr":"7.3"},"relationships":[{"description":"Publishes digital assets","destinationId":"8","id":"36","sourceId":"35","tags":"Relationship,core_extend"},{"description":"Publishes digital assets","destinationId":"56","id":"168","sourceId":"35","tags":"Relationship"},{"description":"Publishes digital assets","destinationId":"55","id":"169","linkedRelationshipId":"168","sourceId":"35"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"API for managing digital assets","documentation":{},"id":"37","name":"DKMP API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.dkmp_api_module","fr":"3.4,3.5,7.1,7.2,7.3"},"relationships":[{"description":"Provides API for managing digital assets","destinationId":"8","id":"38","sourceId":"37","tags":"Relationship,core_extend"}],"tags":"Element,Component,core_extend","technology":"PHP"},{"description":"Manages events and queue related to digital assets in RabbitMQ","documentation":{},"id":"39","name":"Event Management","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework.event_management_module","fr":"6.4"},"relationships":[{"description":"Provides integration with RabbitMQ for event management","destinationId":"8","id":"40","sourceId":"39","tags":"Relationship,core_extend"},{"description":"Manages queues for asynchronous communication","destinationId":"42","id":"110","sourceId":"39","tags":"Relationship"}],"tags":"Element,Component,core_extend","technology":"PHP"}],"description":"Drupal with custom extensions","documentation":{},"id":"7","name":"Drupal","properties":{"structurizr.dsl.identifier":"dkmp_central_node.drupal_framework"},"relationships":[{"description":"Manages users and roles","destinationId":"73","id":"103","linkedRelationshipId":"102","sourceId":"7"},{"description":"Adds access grants to the message queue","destinationId":"42","id":"105","linkedRelationshipId":"104","sourceId":"7"},{"description":"Retrieves ontology constraints for form validation","destinationId":"64","id":"108","linkedRelationshipId":"106","sourceId":"7"},{"description":"Retrieves ontology constraints for form validation","destinationId":"63","id":"109","linkedRelationshipId":"106","sourceId":"7"},{"description":"Uploads large files directly to storage in a centralised node","destinationId":"71","id":"112","linkedRelationshipId":"111","sourceId":"7"},{"description":"Uploads large files to storage in a distributed node or uses temporary storage for exchange","destinationId":"79","id":"115","linkedRelationshipId":"113","sourceId":"7"},{"description":"Uploads large files to storage in a distributed node or uses temporary storage for exchange","destinationId":"76","id":"116","linkedRelationshipId":"113","sourceId":"7"},{"description":"Retrieves metadata for a digital asset","destinationId":"47","id":"127","linkedRelationshipId":"125","sourceId":"7"},{"description":"Retrieves metadata for a digital asset","destinationId":"46","id":"128","linkedRelationshipId":"125","sourceId":"7"},{"description":"Performs asset indexing and search","destinationId":"74","id":"139","linkedRelationshipId":"138","sourceId":"7"},{"description":"Requests lifecycle assessments","destinationId":"68","id":"147","linkedRelationshipId":"145","sourceId":"7"},{"description":"Requests lifecycle assessments","destinationId":"67","id":"148","linkedRelationshipId":"145","sourceId":"7"},{"description":"Requests rendering of CHADA MODA models","destinationId":"60","id":"153","linkedRelationshipId":"151","sourceId":"7"},{"description":"Requests rendering of CHADA MODA models","destinationId":"59","id":"154","linkedRelationshipId":"151","sourceId":"7"},{"description":"Manages source code for digital assets","destinationId":"75","id":"158","linkedRelationshipId":"157","sourceId":"7"},{"description":"Enriches data with additional information","destinationId":"54","id":"162","linkedRelationshipId":"160","sourceId":"7"},{"description":"Enriches data with additional information","destinationId":"51","id":"163","linkedRelationshipId":"160","sourceId":"7"},{"description":"Publishes digital assets","destinationId":"56","id":"170","linkedRelationshipId":"168","sourceId":"7"},{"description":"Publishes digital assets","destinationId":"55","id":"171","linkedRelationshipId":"168","sourceId":"7"},{"description":"Stores data for the Drupal framework","destinationId":"72","id":"254","sourceId":"7","tags":"Relationship"}],"tags":"Element,Container,core_extend","technology":"Drupal 10, PHP 8, JavaScript"},{"description":"Reverse proxy for routing requests to the appropriate services","documentation":{},"id":"41","name":"Reverse Proxy","properties":{"structurizr.dsl.identifier":"dkmp_central_node.reverse_proxy","fr":"6.4"},"tags":"Element,Container,extend","technology":"Nginx"},{"components":[{"description":"Service for consuming events","documentation":{},"id":"43","name":"Event Consumer","properties":{"structurizr.dsl.identifier":"dkmp_central_node.event_subsystem.event_consumer"},"relationships":[{"description":"Consumes messages from the message broker","destinationId":"44","id":"120","sourceId":"43","tags":"Relationship"},{"description":"Triggers message processing via API","destinationId":"37","id":"121","sourceId":"43","tags":"Relationship"},{"description":"Triggers message processing via API","destinationId":"7","id":"122","linkedRelationshipId":"121","sourceId":"43"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for consuming events","documentation":{},"id":"44","name":"Message broker for asynchronous communication","properties":{"structurizr.dsl.identifier":"dkmp_central_node.event_subsystem.rabbitmq"},"tags":"Element,Component","technology":"RabbitMQ"}],"description":"Event subsystem for asynchronous communication","documentation":{},"id":"42","name":"Event Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.event_subsystem","fr":"6.4,7.2"},"relationships":[{"description":"Triggers message processing via API","destinationId":"37","id":"123","linkedRelationshipId":"121","sourceId":"42"},{"description":"Triggers message processing via API","destinationId":"7","id":"124","linkedRelationshipId":"121","sourceId":"42"},{"description":"Transmits a messagee about new files or access grants","destinationId":"90","id":"185","sourceId":"42","tags":"Relationship"},{"description":"Transmits a messagee about new files or access grants","destinationId":"86","id":"186","linkedRelationshipId":"185","sourceId":"42"},{"description":"Transmits a messagee about new files or access grants","destinationId":"80","id":"187","linkedRelationshipId":"185","sourceId":"42"}],"tags":"Element,Container,integration"},{"description":"Service for logging events","documentation":{},"id":"45","name":"Logging Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.logging_subsystem","fr":"6.3,6.4"},"tags":"Element,Container,extend","technology":"Grafana, Loki, Fluent Bit"},{"components":[{"description":"API for parsing metadata from digital assets","documentation":{},"id":"47","name":"Metadata Parser API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.metadata_parsing_subsystem.metadata_parser_api"},"relationships":[{"description":"Locates a suitable metadata parser","destinationId":"49","id":"129","sourceId":"47","tags":"Relationship"},{"description":"Initialised metadata parser","destinationId":"48","id":"130","sourceId":"47","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for for running metadata parsers from registry","documentation":{},"id":"48","name":"Metadata Parser Engine","properties":{"structurizr.dsl.identifier":"dkmp_central_node.metadata_parsing_subsystem.metadata_parser_engine"},"relationships":[{"description":"Loads the file for metadata parsing","destinationId":"71","id":"131","sourceId":"48","tags":"Relationship"},{"description":"Validates metadata against ontology constraints","destinationId":"50","id":"133","sourceId":"48","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for metadata parsers","documentation":{},"id":"49","name":"Metadata Parser Registry","properties":{"structurizr.dsl.identifier":"dkmp_central_node.metadata_parsing_subsystem.metadata_parser_registry"},"tags":"Element,Component","technology":"Python"},{"description":"Service for validating metadata","documentation":{},"id":"50","name":"Metadata Validator","properties":{"structurizr.dsl.identifier":"dkmp_central_node.metadata_parsing_subsystem.metadata_validator"},"relationships":[{"description":"Retrieves ontology constraints for metadata validation","destinationId":"64","id":"134","sourceId":"50","tags":"Relationship"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"63","id":"135","linkedRelationshipId":"134","sourceId":"50"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for parsing metadata from digital assets","documentation":{},"id":"46","name":"Metadata Parsing Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.metadata_parsing_subsystem","fr":"1.1,1.2,1.4,3.1,3.5"},"relationships":[{"description":"Loads the file for metadata parsing","destinationId":"71","id":"132","linkedRelationshipId":"131","sourceId":"46"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"64","id":"136","linkedRelationshipId":"134","sourceId":"46"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"63","id":"137","linkedRelationshipId":"134","sourceId":"46"}],"tags":"Element,Container,extend","technology":"Python"},{"components":[{"description":"Service for enriching digital assets with additional data using a data enrichment service from registry","documentation":{},"id":"52","name":"Data Enrichment Engine","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_enrichment_subsystem.data_enrichment_engine"},"relationships":[{"description":"Loads the file for enrichment","destinationId":"71","id":"166","sourceId":"52","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for data enrichment services","documentation":{},"id":"53","name":"Data Enrichment Registry","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_enrichment_subsystem.data_enrichment_registry"},"tags":"Element,Component","technology":"Python"},{"description":"API for enriching digital assets with additional data","documentation":{},"id":"54","name":"Data Enrichment API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_enrichment_subsystem.data_enrichment_api"},"relationships":[{"description":"Locates a suitable data enrichment service","destinationId":"53","id":"164","sourceId":"54","tags":"Relationship"},{"description":"Initialised data enrichment service","destinationId":"52","id":"165","sourceId":"54","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for enriching digital assets with additional data","documentation":{},"id":"51","name":"Data Enrichment Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_enrichment_subsystem","fr":"1.3"},"relationships":[{"description":"Loads the file for enrichment","destinationId":"71","id":"167","linkedRelationshipId":"166","sourceId":"51"}],"tags":"Element,Container,extend","technology":"Python"},{"components":[{"description":"API for publishing digital assets","documentation":{},"id":"56","name":"Publisher API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.asset_publishing_subsystem.publisher_api"},"relationships":[{"description":"Locates a suitable publisher","destinationId":"57","id":"172","sourceId":"56","tags":"Relationship"},{"description":"Initialised asset publisher","destinationId":"58","id":"173","sourceId":"56","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for publishers","documentation":{},"id":"57","name":"Publisher Registry","properties":{"structurizr.dsl.identifier":"dkmp_central_node.asset_publishing_subsystem.publisher_registry"},"tags":"Element,Component","technology":"Python"},{"description":"Service for publishing digital assets using a publisher from registry","documentation":{},"id":"58","name":"Asset Publisher Engine","properties":{"structurizr.dsl.identifier":"dkmp_central_node.asset_publishing_subsystem.asset_publisher_engine"},"relationships":[{"description":"Publishes assets to the Open Research Repository","destinationId":"5","id":"174","sourceId":"58","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for publishing digital assets","documentation":{},"id":"55","name":"Asset Publishing Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.asset_publishing_subsystem","fr":"7.3"},"relationships":[{"description":"Publishes assets to the Open Research Repository","destinationId":"5","id":"175","linkedRelationshipId":"174","sourceId":"55"}],"tags":"Element,Container,extend","technology":"Python"},{"components":[{"description":"API for rendering CHADA MODA models","documentation":{},"id":"60","name":"Chada Moda Renderer API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.chada_moda_subsystem.chada_moda_renderer_api"},"relationships":[{"description":"Renders CHADA MODA models","destinationId":"61","id":"155","sourceId":"60","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for rendering CHADA MODA models","documentation":{},"id":"61","name":"Chada Moda Renderer","properties":{"structurizr.dsl.identifier":"dkmp_central_node.chada_moda_subsystem.chada_moda_renderer"},"relationships":[{"description":"Renders PlantUML diagrams","destinationId":"62","id":"156","sourceId":"61","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"PlantUML engine for rendering diagrams","documentation":{},"id":"62","name":"PlantUML","properties":{"structurizr.dsl.identifier":"dkmp_central_node.chada_moda_subsystem.plantuml_renderer"},"tags":"Element,Component","technology":"PlantUML, Java"}],"description":"Service for rendering CHADA MODA models","documentation":{},"id":"59","name":"CHADA MODA Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.chada_moda_subsystem","fr":"3.3"},"tags":"Element,Container,extend","technology":"Python"},{"components":[{"description":"API for ontology operations","documentation":{},"id":"64","name":"Ontology API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.ontology_subsystem.ontology_api"},"relationships":[{"description":"Performs operations on the ontology","destinationId":"65","id":"142","sourceId":"64","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for managing ontologies and performing operations on them like retrieving constraints or unit conversion","documentation":{},"id":"65","name":"Ontology Manager","properties":{"structurizr.dsl.identifier":"dkmp_central_node.ontology_subsystem.ontology_manager"},"relationships":[{"description":"Queries the SPARQL server for constraints, ontology data and unit conversion","destinationId":"66","id":"143","sourceId":"65","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Ontology management microservice, generation of SHACL constraints and SPARQL queries","documentation":{},"id":"63","name":"Ontology Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.ontology_subsystem","fr":"3.2,3.5,4.3,5.3"},"relationships":[{"description":"Queries the SPARQL server for constraints, ontology data and unit conversion","destinationId":"66","id":"144","linkedRelationshipId":"143","sourceId":"63"}],"tags":"Element,Container,extend","technology":"Python"},{"description":"SPARQL server for querying ontologies","documentation":{},"id":"66","name":"SPAQRL Server","properties":{"structurizr.dsl.identifier":"dkmp_central_node.sparql_server","fr":"3.2,4.3,3.5,5.3"},"tags":"Element,Container,extend","technology":"Apache Jena Fuseki"},{"components":[{"description":"API for lifecycle assessment operations","documentation":{},"id":"68","name":"LCA API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.lca_subsystem.lca_api"},"relationships":[{"description":"Requests parsing of lifecycle assessment results","destinationId":"69","id":"149","sourceId":"68","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for parsing LCA results","documentation":{},"id":"69","name":"LCA Parser","properties":{"structurizr.dsl.identifier":"dkmp_central_node.lca_subsystem.lca_parser"},"relationships":[{"description":"Parses lifecycle assessment results","destinationId":"70","id":"150","sourceId":"69","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"LCA dataset for environmental impact assessment","documentation":{},"id":"70","name":"LCA Dataset","properties":{"structurizr.dsl.identifier":"dkmp_central_node.lca_subsystem.lca_dataset"},"tags":"Element,Component","technology":"Excel"}],"description":"Tool for parsing LCA results for providing visual representation of environmental impact","documentation":{},"id":"67","name":"Lifecycle Assessment Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.lca_subsystem","fr":"5.4,7.4"},"tags":"Element,Container,extend","technology":"Python"},{"description":"Centralized storage for digital assets","documentation":{},"id":"71","name":"Centralized Asset Storage","properties":{"structurizr.dsl.identifier":"dkmp_central_node.object_storage","fr":"2.1,6.1,6.2,6.5,7.4"},"tags":"Element,Container","technology":"S3"},{"description":"Database for storing structured data","documentation":{},"id":"72","name":"Relational Database","properties":{"structurizr.dsl.identifier":"dkmp_central_node.relational_database","fr":"2.1"},"tags":"Element,Container,extend","technology":"PostgreSQL"},{"description":"Centralized authentication and authorization service","documentation":{},"id":"73","name":"Authentication and Authorization","properties":{"structurizr.dsl.identifier":"dkmp_central_node.authentication_authorization","fr":"6.1,6.2"},"relationships":[{"description":"Manages user authentication and access control for Drupal","destinationId":"7","id":"159","sourceId":"73","tags":"Relationship"},{"description":"Stores user data","destinationId":"72","id":"255","sourceId":"73","tags":"Relationship"}],"tags":"Element,Container,extend","technology":"Keycloak"},{"description":"Search engine for indexing and searching digital assets","documentation":{},"id":"74","name":"Search Engine","properties":{"structurizr.dsl.identifier":"dkmp_central_node.search_engine","fr":"5.3"},"tags":"Element,Container,extend","technology":"Apache Solr"},{"description":"Version control system for managing code","documentation":{},"id":"75","name":"Git","properties":{"structurizr.dsl.identifier":"dkmp_central_node.git","fr":"4.1,6.3"},"tags":"Element,Container,extend","technology":"Gitea"},{"components":[{"description":"Service for integrating data from external sources","documentation":{},"id":"77","name":"Data Integration Service","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_integration_subsystem.data_integration_service"},"relationships":[{"description":"Stores files temporarily for exchange","destinationId":"31","id":"179","sourceId":"77","tags":"Relationship"},{"description":"Stores files temporarily for exchange","destinationId":"7","id":"180","linkedRelationshipId":"179","sourceId":"77"},{"description":"Sends message for the distributed node about new files","destinationId":"42","id":"183","sourceId":"77","tags":"Relationship"},{"description":"Stores files temporarily for exchange","destinationId":"100","id":"201","sourceId":"77","tags":"Relationship"},{"description":"Stores files temporarily for exchange","destinationId":"80","id":"202","linkedRelationshipId":"201","sourceId":"77"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for distributed DKMP nodes","documentation":{},"id":"78","name":"Node Registry","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_integration_subsystem.data_integration_registry"},"tags":"Element,Component","technology":"Python"},{"description":"API for integrating data from external sources","documentation":{},"id":"79","name":"Data Integration API","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_integration_subsystem.data_integration_api"},"relationships":[{"description":"Locates metadata for the distributed node","destinationId":"78","id":"177","sourceId":"79","tags":"Relationship"},{"description":"Initialised data integration service","destinationId":"77","id":"178","sourceId":"79","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for integrating data from distributed nodes","documentation":{},"id":"76","name":"Data Integration Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_central_node.data_integration_subsystem","fr":"6.4,7.1,7.2"},"relationships":[{"description":"Stores files temporarily for exchange","destinationId":"31","id":"181","linkedRelationshipId":"179","sourceId":"76"},{"description":"Stores files temporarily for exchange","destinationId":"7","id":"182","linkedRelationshipId":"179","sourceId":"76"},{"description":"Sends message for the distributed node about new files","destinationId":"42","id":"184","linkedRelationshipId":"183","sourceId":"76"},{"description":"Stores files temporarily for exchange","destinationId":"100","id":"203","linkedRelationshipId":"201","sourceId":"76"},{"description":"Stores files temporarily for exchange","destinationId":"80","id":"204","linkedRelationshipId":"201","sourceId":"76"}],"tags":"Element,Container,integration","technology":"Python"}],"description":"Centralised node for data and knowledge management","documentation":{},"id":"6","location":"Unspecified","name":"DKMP central node","properties":{"structurizr.dsl.identifier":"dkmp_central_node","hints":"DKMP stands for Data and Knowledge Management Platform. It is used as the central repository to store digital assets and manage access to them."},"relationships":[{"description":"Publishes assets to the Open Research Repository","destinationId":"5","id":"176","linkedRelationshipId":"174","sourceId":"6"},{"description":"Transmits a messagee about new files or access grants","destinationId":"90","id":"188","linkedRelationshipId":"185","sourceId":"6"},{"description":"Transmits a messagee about new files or access grants","destinationId":"86","id":"189","linkedRelationshipId":"185","sourceId":"6"},{"description":"Transmits a messagee about new files or access grants","destinationId":"80","id":"190","linkedRelationshipId":"185","sourceId":"6"},{"description":"Stores files temporarily for exchange","destinationId":"100","id":"205","linkedRelationshipId":"201","sourceId":"6"}],"tags":"Element,Software System,core_extend,internal"},{"containers":[{"description":"Reverse proxy for routing requests to the appropriate services","documentation":{},"id":"81","name":"Reverse Proxy","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.reverse_proxy"},"tags":"Element,Container","technology":"Nginx"},{"components":[{"description":"Drupal core functionality","documentation":{},"id":"83","name":"Drupal Core","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.drupal_framework.drupal_core","fr":"6.3"},"tags":"Element,Component,core_extend","technology":"Drupal 10"},{"description":"Manages access to digital assets","documentation":{},"id":"84","name":"Access Management","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.drupal_framework.access_management_module","fr":"6.1,6.2,6.4"},"relationships":[{"description":"Manages access to digital assets","destinationId":"83","id":"85","sourceId":"84","tags":"Relationship,core_extend"},{"description":"Access grant confirmed or rejected","destinationId":"89","id":"210","sourceId":"84","tags":"Relationship"},{"description":"Access grant confirmed or rejected","destinationId":"86","id":"211","linkedRelationshipId":"210","sourceId":"84"}],"tags":"Element,Component","technology":"PHP"}],"description":"Drupal with custom extensions","documentation":{},"id":"82","name":"Drupal","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.drupal_framework"},"relationships":[{"description":"Access grant confirmed or rejected","destinationId":"89","id":"212","linkedRelationshipId":"210","sourceId":"82"},{"description":"Access grant confirmed or rejected","destinationId":"86","id":"213","linkedRelationshipId":"210","sourceId":"82"},{"description":"Stores data for the Drupal framework","destinationId":"101","id":"256","sourceId":"82","tags":"Relationship"}],"tags":"Element,Container","technology":"Drupal 10, PHP 8, JavaScript"},{"components":[{"description":"Service for integrating data with centralised nodes","documentation":{},"id":"87","name":"Data Integration Service","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_integration_subsystem.data_integration_service"},"relationships":[{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"71","id":"193","sourceId":"87","tags":"Relationship"},{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"6","id":"194","linkedRelationshipId":"193","sourceId":"87"},{"description":"Stores digital assets locally permanently","destinationId":"100","id":"199","sourceId":"87","tags":"Relationship"},{"description":"Adds a new access grant for reviewal","destinationId":"84","id":"206","sourceId":"87","tags":"Relationship"},{"description":"Adds a new access grant for reviewal","destinationId":"82","id":"207","linkedRelationshipId":"206","sourceId":"87"},{"description":"Requests data enrichment","destinationId":"99","id":"216","sourceId":"87","tags":"Relationship"},{"description":"Requests data enrichment","destinationId":"96","id":"217","linkedRelationshipId":"216","sourceId":"87"},{"description":"Requests metadata parsing","destinationId":"92","id":"224","sourceId":"87","tags":"Relationship"},{"description":"Requests metadata parsing","destinationId":"91","id":"225","linkedRelationshipId":"224","sourceId":"87"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for centralised DKMP nodes","documentation":{},"id":"88","name":"Node Registry","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_integration_subsystem.data_integration_registry"},"tags":"Element,Component","technology":"Python"},{"description":"Data integration API for interaction with the central node","documentation":{},"id":"89","name":"Data Integration API","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_integration_subsystem.data_integration_api"},"relationships":[{"description":"Locates information about the central node","destinationId":"88","id":"214","sourceId":"89","tags":"Relationship"},{"description":"Initialised data integration service","destinationId":"87","id":"215","sourceId":"89","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Event consumer for integrating data with centralised node","documentation":{},"id":"90","name":"Data Integration Event Consumer","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_integration_subsystem.data_integration_event_consumer"},"relationships":[{"description":"Locates information about the central node","destinationId":"88","id":"191","sourceId":"90","tags":"Relationship"},{"description":"Initialised data integration service","destinationId":"87","id":"192","sourceId":"90","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for integrating data with centralised nodes","documentation":{},"id":"86","name":"Data Integration Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_integration_subsystem","fr":"6.4,7.1,7.2"},"relationships":[{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"71","id":"195","linkedRelationshipId":"193","sourceId":"86"},{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"6","id":"196","linkedRelationshipId":"193","sourceId":"86"},{"description":"Stores digital assets locally permanently","destinationId":"100","id":"200","linkedRelationshipId":"199","sourceId":"86"},{"description":"Adds a new access grant for reviewal","destinationId":"84","id":"208","linkedRelationshipId":"206","sourceId":"86"},{"description":"Adds a new access grant for reviewal","destinationId":"82","id":"209","linkedRelationshipId":"206","sourceId":"86"},{"description":"Requests data enrichment","destinationId":"99","id":"218","linkedRelationshipId":"216","sourceId":"86"},{"description":"Requests data enrichment","destinationId":"96","id":"219","linkedRelationshipId":"216","sourceId":"86"},{"description":"Requests metadata parsing","destinationId":"92","id":"226","linkedRelationshipId":"224","sourceId":"86"},{"description":"Requests metadata parsing","destinationId":"91","id":"227","linkedRelationshipId":"224","sourceId":"86"}],"tags":"Element,Container,integration","technology":"Python"},{"components":[{"description":"API for parsing metadata from digital assets","documentation":{},"id":"92","name":"Metadata Parser API","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.metadata_parsing_subsystem.metadata_parser_api"},"relationships":[{"description":"Locates a suitable metadata parser","destinationId":"94","id":"228","sourceId":"92","tags":"Relationship"},{"description":"Initialised metadata parser","destinationId":"93","id":"229","sourceId":"92","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Service for for running metadata parsers from registry","documentation":{},"id":"93","name":"Metadata Parser Engine","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.metadata_parsing_subsystem.metadata_parser_engine"},"relationships":[{"description":"Loads the file for metadata parsing","destinationId":"100","id":"230","sourceId":"93","tags":"Relationship"},{"description":"Validates metadata against ontology constraints","destinationId":"95","id":"232","sourceId":"93","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for metadata parsers","documentation":{},"id":"94","name":"Metadata Parser Registry","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.metadata_parsing_subsystem.metadata_parser_registry"},"tags":"Element,Component","technology":"Python"},{"description":"Service for validating metadata","documentation":{},"id":"95","name":"Metadata Validator","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.metadata_parsing_subsystem.metadata_validator"},"relationships":[{"description":"Retrieves ontology constraints for metadata validation","destinationId":"37","id":"233","sourceId":"95","tags":"Relationship"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"7","id":"234","linkedRelationshipId":"233","sourceId":"95"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"6","id":"235","linkedRelationshipId":"233","sourceId":"95"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for parsing metadata from digital assets","documentation":{},"id":"91","name":"Metadata Parsing Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.metadata_parsing_subsystem","fr":"1.1,1.2,1.4,3.1,3.5"},"relationships":[{"description":"Loads the file for metadata parsing","destinationId":"100","id":"231","linkedRelationshipId":"230","sourceId":"91"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"37","id":"236","linkedRelationshipId":"233","sourceId":"91"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"7","id":"237","linkedRelationshipId":"233","sourceId":"91"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"6","id":"238","linkedRelationshipId":"233","sourceId":"91"}],"tags":"Element,Container","technology":"Python"},{"components":[{"description":"Engine for enriching digital assets with additional data","documentation":{},"id":"97","name":"Data Enrichment Engine","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_enrichment_subsystem.data_enrichment_engine"},"relationships":[{"description":"Loads the file for enrichment","destinationId":"100","id":"222","sourceId":"97","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"},{"description":"Registry for data enrichment services","documentation":{},"id":"98","name":"Data Enrichment Registry","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_enrichment_subsystem.data_enrichment_registry"},"tags":"Element,Component","technology":"Python"},{"description":"API for enriching digital assets with additional data","documentation":{},"id":"99","name":"Data Enrichment API","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_enrichment_subsystem.data_enrichment_api"},"relationships":[{"description":"Locates a suitable data enrichment service","destinationId":"98","id":"220","sourceId":"99","tags":"Relationship"},{"description":"Initialised data enrichment service","destinationId":"97","id":"221","sourceId":"99","tags":"Relationship"}],"tags":"Element,Component","technology":"Python"}],"description":"Service for enriching digital assets with additional data","documentation":{},"id":"96","name":"Data Enrichment Subsystem","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.data_enrichment_subsystem","fr":"1.3"},"relationships":[{"description":"Loads the file for enrichment","destinationId":"100","id":"223","linkedRelationshipId":"222","sourceId":"96"}],"tags":"Element,Container","technology":"Python"},{"description":"Distributed storage for private digital assets","documentation":{},"id":"100","name":"Distributed Asset Storage","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.object_storage","fr":"2.1,6.3"},"tags":"Element,Container","technology":"S3"},{"description":"Database for storing structured data","documentation":{},"id":"101","name":"Relational Database","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node.relational_database","fr":"2.1"},"tags":"Element,Container","technology":"PostgreSQL"}],"description":"Decentralised node for private data management","documentation":{},"id":"80","location":"Unspecified","name":"DKMP decentralised node","properties":{"structurizr.dsl.identifier":"dkmp_distributed_node","hints":"DKMP stands for Data and Knowledge Management Platform. The decentralised node is used for storing private assets withing the organisation infrastructure."},"relationships":[{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"71","id":"197","linkedRelationshipId":"193","sourceId":"80"},{"description":"Retrieves files from the central node, uploads files for exchange, access grant results","destinationId":"6","id":"198","linkedRelationshipId":"193","sourceId":"80"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"37","id":"239","linkedRelationshipId":"233","sourceId":"80"},{"description":"Retrieves ontology constraints for metadata validation","destinationId":"7","id":"240","linkedRelationshipId":"233","sourceId":"80"}],"tags":"Element,Software System,integration,internal"}]},"name":"Data and knowledge management platform","properties":{"structurizr.dsl":"d29ya3NwYWNlIHsKICAgIG5hbWUgIkRhdGEgYW5kIGtub3dsZWRnZSBtYW5hZ2VtZW50IHBsYXRmb3JtIgoKICAgICFpZGVudGlmaWVycyBoaWVyYXJjaGljYWwKCiAgICBjb25maWd1cmF0aW9uIHsKICAgICAgICB2aXNpYmlsaXR5IHByaXZhdGUgIAogICAgfQoKICAgIG1vZGVsIHsKICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgInN0cnVjdHVyaXpyLmdyb3VwU2VwYXJhdG9yIiAiLiIKICAgICAgICB9CgogICAgICAgIGFzc2V0T3duZXIgPSBwZXJzb24gIkFzc2V0IG93bmVyIiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBIHBlcnNvbiB3aG8gb3ducyB0aGUgZGlnaXRhbCBhc3NldCIKICAgICAgICB9CgogICAgICAgIGFzc2V0Vmlld2VyID0gcGVyc29uICJBc3NldCB2aWV3ZXIiIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkEgcGVyc29uIHdobyB2aWV3cyB0aGUgZGlnaXRhbCBhc3NldCIKICAgICAgICB9CgogICAgICAgIGRnbyA9IHBlcnNvbiAiRGF0YSBHb3Zlcm5hbmNlIE9mZmljZXIiIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlc3BvbnNpYmxlIGZvciBkYXRhIGdvdmVybmFuY2UiCiAgICAgICAgfQoKICAgICAgICAvLyBvcmdfYWRtaW4gPSBwZXJzb24gIk9yZ2FuaXNhdGlvbiBhZG1pbmlzdHJhdG9yIiB7CiAgICAgICAgLy8gICAgIGRlc2NyaXB0aW9uICJBZG1pbmlzdGVycyBhY2Nlc3Mgd2l0aGluIHRoZSBvcmdhbmlzYXRpb24iCiAgICAgICAgLy8gfQoKICAgICAgICBwbGF0Zm9ybUFkbWluID0gcGVyc29uICJQbGF0Zm9ybSBBZG1pbmlzdHJhdG9yIiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBZG1pbmlzdHJhdG9yIG9mIHRoZSBjZW50cmFsIERLTVAgbm9kZSIKICAgICAgICB9CgoKICAgICAgICBvcGVuX3Jlc2VhcmNoX3JlcG8gPSBzb2Z0d2FyZVN5c3RlbSAiT3BlbiBSZXNlYXJjaCBSZXBvc2l0b3J5IiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSZXBvc2l0b3J5IGZvciBzdG9yaW5nIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICB0YWdzICJleHRlcm5hbCIKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAiaGludHMiICJUaGlzIGlzIGFuIGV4dGVybmFsIHN5c3RlbSBsaWtlIFplbm9kbywgdGhhdCB3aWxsIG5vdCBiZSBtb2RlbGxlZCBpbiBkZXRhaWwuIFRoaXMgc2hvdWxkIGJlIG1lbnRpb25lZCBpbiB5b3VyIGRlc2NyaXB0aW9uLiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZSA9IHNvZnR3YXJlU3lzdGVtICJES01QIGNlbnRyYWwgbm9kZSIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2VudHJhbGlzZWQgbm9kZSBmb3IgZGF0YSBhbmQga25vd2xlZGdlIG1hbmFnZW1lbnQiCiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgImhpbnRzIiAiREtNUCBzdGFuZHMgZm9yIERhdGEgYW5kIEtub3dsZWRnZSBNYW5hZ2VtZW50IFBsYXRmb3JtLiBJdCBpcyB1c2VkIGFzIHRoZSBjZW50cmFsIHJlcG9zaXRvcnkgdG8gc3RvcmUgZGlnaXRhbCBhc3NldHMgYW5kIG1hbmFnZSBhY2Nlc3MgdG8gdGhlbS4iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiICJpbnRlcm5hbCIKCiAgICAgICAgICAgIGRydXBhbF9mcmFtZXdvcmsgPSBjb250YWluZXIgIkRydXBhbCIgewogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiRHJ1cGFsIDEwLCBQSFAgOCwgSmF2YVNjcmlwdCIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJEcnVwYWwgd2l0aCBjdXN0b20gZXh0ZW5zaW9ucyIKCiAgICAgICAgICAgICAgICB0YWdzICJjb3JlX2V4dGVuZCIKCiAgICAgICAgCiAgICAgICAgICAgICAgICBkcnVwYWxfY29yZSA9IGNvbXBvbmVudCAiRHJ1cGFsIENvcmUiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJEcnVwYWwgMTAiCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjYuMyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkRydXBhbCBjb3JlIGZ1bmN0aW9uYWxpdHkiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXNzZXRfdmlzdWFsaXNhdGlvbl9tb2R1bGUgPSBjb21wb25lbnQgIkFzc2V0IFZpc3VhbGlzYXRpb24gTW9kdWxlIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjUuMiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUEhQIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciB2aXN1YWxpc2luZyBkaWdpdGFsIGFzc2V0cyIgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJEaXNwbGF5cyBkaWdpdGFsIGFzc2V0IG1ldGFkYXRhIiAiIiAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWV0YWRhdGFfYXV0aG9yaW5nX21vZHVsZSA9IGNvbXBvbmVudCAiTWV0YWRhdGEgQXV0aG9yaW5nIFNlcnZpY2UiIHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZyIiAiMS4xLDEuMiwxLjQsMi4yLDMuMSwzLjQsMy41LDQuMyw3LjEiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgbWFuYWdpbmcgbWV0YWRhdGEgZm9yIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJNYW5hZ2VzIG1ldGFkYXRhIGZvciBkaWdpdGFsIGFzc2V0cyIgIiIgImNvcmVfZXh0ZW5kIiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGF0YV9lbnJpY2htZW50X21vZHVsZSA9IGNvbXBvbmVudCAiRGF0YSBFbnJpY2htZW50IE1vZHVsZSIgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICAgICAiZnIiICIxLjMiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgZW5yaWNoaW5nIGRpZ2l0YWwgYXNzZXRzIHdpdGggYWRkaXRpb25hbCBkYXRhIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJFbnJpY2hlcyBkaWdpdGFsIGFzc2V0cyB3aXRoIGFkZGl0aW9uYWwgZGF0YSIiIiAiY29yZV9leHRlbmQiICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRhdGFfaGFybW9uaXphdGlvbl9tb2R1bGUgPSBjb21wb25lbnQgIk1vZHVsYXJNTU0gSW50ZXJvcGFiaWxpdHkgTW9kdWxlIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjQuMyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUEhQIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBoYXJtb25pemluZyBkYXRhIGZvciBpbnRlcnBvcmFiaWxpdHkgYmV0d2VlbiBkaWZmZXJlbnQgc2ltdWxhdGlvbiB0b29scyBhbmQgbW9kZWwgdHlwZXMiCiAgICAgICAgICAgICAgICAgICAgLT4gZHJ1cGFsX2NvcmUgIkhhcm1vbml6ZXMgZGF0YSBmb3IgaW50ZXJwb3JhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IHNpbXVsYXRpb24gdG9vbHMgYW5kIG1vZGVsIHR5cGVzIiAiIiAiY29yZV9leHRlbmQiICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0YWdzICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbGNhX21vZHVsZSA9IGNvbXBvbmVudCAiTGlmZWN5Y2xlIEFzc2Vzc21lbnQgTW9kdWxlIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjUuNCw3LjQiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgaW50ZWdyYXRpb24gd2l0aCB0aGUgbGlmZWN5Y2xlIGFzc2VzbWVudCB0b29sIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJQcm92aWRlcyBkYXRhIGZyb20gTENBIHRvb2wgZm9yIHZpc3VhbGlzYXRpb24iIiIgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhcmdlX2ZpbGVfdXBsb2FkX21vZHVsZSA9IGNvbXBvbmVudCAiTGFyZ2UgRmlsZSBVcGxvYWQgTW9kdWxlIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjEuNSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUEhQIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBzdXBwb3J0IGZvciB1cGxvYWRpbmcgbGFyZ2UgZmlsZXMgZGlyZWN0bHkgdG8gUzMgc3RvcmFnZSIKICAgICAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiRXh0ZW5kcyBmb3JtcyB3aXRoIGxhcmdlIGZpbGUgdXBsb2FkIGNhcGFiaWxpdGllcyIiIiAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdW5pdF93aWRnZXRfbW9kdWxlID0gY29tcG9uZW50ICJVbml0IFdpZGdldCBNb2R1bGUiIHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZyIiAiMy41IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQSFAiCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGEgd2lkZ2V0IGZvciBzZWxlY3RpbmcgdW5pdHMgb2YgbWVhc3VyZW1lbnQgd2l0aCBhdXRvbWF0ZWQgY29udmVyc2lvbiIKICAgICAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiUHJvdmlkZXMgdW5pdCBjb252ZXJzaW9uIGZ1bmN0aW9uYWxpdHkgaW4gZm9ybXMiIiIgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGFzc2V0X2VudGl0eV9tYW5hZ2VyX21vZHVsZSA9IGNvbXBvbmVudCAiQXNzZXQgRm9ybSBNYW5hZ2VyIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjMuMiw0LjMiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTWFuYWdlciBmb3JtcyBmb3IgZGlnaXRhbCBhc3NldHMgd2l0aCBhY2NvcmRhbmNlIHRvIHRoZSBvbnRvbG9neSIKICAgICAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiTWFudGFpbnMgZW50aXRpZXMgZm9yIGV4cGVyaW1lbnRzIGFuZCBzaW11bGF0aW9ucyIgIiIgImNvcmVfZXh0ZW5kIiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXNzZXRfaW5kZXhpbmdfZGlzY292ZXJ5X21vZHVsZSA9IGNvbXBvbmVudCAiQXNzZXQgSW5kZXhpbmcgYW5kIERpc2NvdmVyeSIgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICAgICAiZnIiICIzLjIsNS4zIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQSFAiCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIGluZGV4aW5nLGV4cGxpcmF0aW9uIGFuZCBzZWFyY2ggZnVuY3Rpb25hbGl0eSBmb3IgZGlnaXRhbCBhc3NldHMiICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiRXh0ZW5kcyBzZWFyY2ggZnVuY3Rpb25hbGl0eSIgIiIgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoYWRhX21vZGFfbW9kdWxlID0gY29tcG9uZW50ICJDSEFEQSBNT0RBIEV4cG9ydGVyIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjMuMyw1LjEiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvY2VzcyBlZGl0b3IgZm9yIENIQURBIE1PREEgbW9kZWxzIHdpdGggZXhwb3J0IGZ1bmN0aW9uYWxpdHkiCiAgICAgICAgICAgICAgICAgICAgLT4gZHJ1cGFsX2NvcmUgIlByb3ZpZGVzIENIQURBIE1PREEgZG9jdW1lbnQgZ2VuZXJhdGlvbiBjYXBhYmlsdGllcyIgIiIgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgc29mdHdhcmVfYXJ0ZWZhY3RfbWFuYWdlcl9tb2R1bGUgPSBjb21wb25lbnQgIlNvZnR3YXJlIEFydGVmYWN0IE1hbmFnZXIiIHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZyIiAiNC4xLDYuMyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUEhQIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VzIEdpdCByZXBvc2l0b3JpZXMgYW5kIHNvdXJjZSBjb2RlIGZvciBkaWdpdGFsIGFzc2V0cyBpbiBHaXQgcmVwb3NpdG9yaWVzIiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLT4gZHJ1cGFsX2NvcmUgIk1hbmFnZXMgc291cmNlIGNvZGUgZm9yIGRpZ2l0YWwgYXNzZXRzIHVzaW5nIEdJVCIgIiIgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgImNvcmVfZXh0ZW5kIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXBvcmFyeV9maWxlX3N0b3JhZ2VfbW9kdWxlID0gY29tcG9uZW50ICJUZW1wb3JhcnkgRmlsZSBTdG9yYWdlIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjIuMSw2LjUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJNYW5hZ2VzIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBkaWdpdGFsIGFzc2V0cyIKICAgICAgICAgICAgICAgICAgICB0YWdzICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhY2Nlc3NfbWFuYWdlbWVudF9tb2R1bGUgPSBjb21wb25lbnQgIkFjY2VzcyBNYW5hZ2VtZW50IiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjYuMSw2LjIsNi40IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQSFAiCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZXMgYWNjZXNzIHRvIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJNYW5hZ2VzIGFjY2VzcyB0byBkaWdpdGFsIGFzc2V0cyIiIiAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXNzZXRfcHVibGlzaGluZ19tb2R1bGUgPSBjb21wb25lbnQgIkFzc2V0IHB1Ymxpc2hlciIgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICAgICAiZnIiICI3LjMiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHVibGlzaGVzIGRpZ2l0YWwgYXNzZXRzIGluIGVzdGFibGlzaGVkIHJlcG9zaXRvcmllcyBsaWtlIFplbm9kbyIKICAgICAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiUHVibGlzaGVzIGRpZ2l0YWwgYXNzZXRzIiIiICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgICAgICB0YWdzICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBka21wX2FwaV9tb2R1bGUgPSBjb21wb25lbnQgIkRLTVAgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjMuNCwzLjUsNy4xLDcuMiw3LjMiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQVBJIGZvciBtYW5hZ2luZyBkaWdpdGFsIGFzc2V0cyIgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJQcm92aWRlcyBBUEkgZm9yIG1hbmFnaW5nIGRpZ2l0YWwgYXNzZXRzIiAiIiAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZXZlbnRfbWFuYWdlbWVudF9tb2R1bGUgPSBjb21wb25lbnQgIkV2ZW50IE1hbmFnZW1lbnQiIHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZyIiAiNi40IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQSFAiCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1hbmFnZXMgZXZlbnRzIGFuZCBxdWV1ZSByZWxhdGVkIHRvIGRpZ2l0YWwgYXNzZXRzIGluIFJhYmJpdE1RIgogICAgICAgICAgICAgICAgICAgIC0+IGRydXBhbF9jb3JlICJQcm92aWRlcyBpbnRlZ3JhdGlvbiB3aXRoIFJhYmJpdE1RIGZvciBldmVudCBtYW5hZ2VtZW50IiIiICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgICAgICB0YWdzICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldmVyc2VfcHJveHkgPSBjb250YWluZXIgIlJldmVyc2UgUHJveHkiIHsKICAgICAgICAgICAgICAgIHRhZ3MgImV4dGVuZCIKICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIk5naW54IgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiNi40IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJldmVyc2UgcHJveHkgZm9yIHJvdXRpbmcgcmVxdWVzdHMgdG8gdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2VzIgogICAgICAgICAgICB9CgogICAgICAgICAgICBldmVudF9zdWJzeXN0ZW0gPSBjb250YWluZXIgIkV2ZW50IFN1YnN5c3RlbSIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgdGFncyAiaW50ZWdyYXRpb24iCiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAiZnIiICI2LjQsNy4yIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRXZlbnQgc3Vic3lzdGVtIGZvciBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiIKCiAgICAgICAgICAgICAgICBldmVudF9jb25zdW1lciA9IGNvbXBvbmVudCAiRXZlbnQgQ29uc3VtZXIiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGNvbnN1bWluZyBldmVudHMiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmFiYml0bXEgPSBjb21wb25lbnQgIk1lc3NhZ2UgYnJva2VyIGZvciBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlJhYmJpdE1RIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBjb25zdW1pbmcgZXZlbnRzIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9nZ2luZ19zdWJzeXN0ZW0gPSBjb250YWluZXIgIkxvZ2dpbmcgU3Vic3lzdGVtIiB7CiAgICAgICAgICAgICAgICB0YWdzICJleHRlbmQiCiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJHcmFmYW5hLCBMb2tpLCBGbHVlbnQgQml0IgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGxvZ2dpbmcgZXZlbnRzIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiNi4zLDYuNCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0gPSBjb250YWluZXIgIk1ldGFkYXRhIFBhcnNpbmcgU3Vic3lzdGVtIiB7CiAgICAgICAgICAgICAgICB0YWdzICJleHRlbmQiCiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgcGFyc2luZyBtZXRhZGF0YSBmcm9tIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiMS4xLDEuMiwxLjQsMy4xLDMuNSIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9wYXJzZXJfYXBpID0gY29tcG9uZW50ICJNZXRhZGF0YSBQYXJzZXIgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgZm9yIHBhcnNpbmcgbWV0YWRhdGEgZnJvbSBkaWdpdGFsIGFzc2V0cyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9wYXJzZXJfZW5naW5lID0gY29tcG9uZW50ICJNZXRhZGF0YSBQYXJzZXIgRW5naW5lIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBmb3IgcnVubmluZyBtZXRhZGF0YSBwYXJzZXJzIGZyb20gcmVnaXN0cnkiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWV0YWRhdGFfcGFyc2VyX3JlZ2lzdHJ5ID0gY29tcG9uZW50ICJNZXRhZGF0YSBQYXJzZXIgUmVnaXN0cnkiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlZ2lzdHJ5IGZvciBtZXRhZGF0YSBwYXJzZXJzIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1ldGFkYXRhX3ZhbGlkYXRvciA9IGNvbXBvbmVudCAiTWV0YWRhdGEgVmFsaWRhdG9yIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciB2YWxpZGF0aW5nIG1ldGFkYXRhIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhX2VucmljaG1lbnRfc3Vic3lzdGVtID0gY29udGFpbmVyICJEYXRhIEVucmljaG1lbnQgU3Vic3lzdGVtIiB7CiAgICAgICAgICAgICAgICB0YWdzICJleHRlbmQiCiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgZW5yaWNoaW5nIGRpZ2l0YWwgYXNzZXRzIHdpdGggYWRkaXRpb25hbCBkYXRhIgoKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICAgICAiZnIiICIxLjMiCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRhdGFfZW5yaWNobWVudF9lbmdpbmUgPSBjb21wb25lbnQgIkRhdGEgRW5yaWNobWVudCBFbmdpbmUiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGVucmljaGluZyBkaWdpdGFsIGFzc2V0cyB3aXRoIGFkZGl0aW9uYWwgZGF0YSB1c2luZyBhIGRhdGEgZW5yaWNobWVudCBzZXJ2aWNlIGZyb20gcmVnaXN0cnkiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGF0YV9lbnJpY2htZW50X3JlZ2lzdHJ5ID0gY29tcG9uZW50ICJEYXRhIEVucmljaG1lbnQgUmVnaXN0cnkiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlZ2lzdHJ5IGZvciBkYXRhIGVucmljaG1lbnQgc2VydmljZXMiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGF0YV9lbnJpY2htZW50X2FwaSA9IGNvbXBvbmVudCAiRGF0YSBFbnJpY2htZW50IEFQSSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQVBJIGZvciBlbnJpY2hpbmcgZGlnaXRhbCBhc3NldHMgd2l0aCBhZGRpdGlvbmFsIGRhdGEiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFzc2V0X3B1Ymxpc2hpbmdfc3Vic3lzdGVtID0gY29udGFpbmVyICJBc3NldCBQdWJsaXNoaW5nIFN1YnN5c3RlbSIgewogICAgICAgICAgICAgICAgdGFncyAiZXh0ZW5kIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiNy4zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIHB1Ymxpc2hpbmcgZGlnaXRhbCBhc3NldHMiCgogICAgICAgICAgICAgICAgcHVibGlzaGVyX2FwaSA9IGNvbXBvbmVudCAiUHVibGlzaGVyIEFQSSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQVBJIGZvciBwdWJsaXNoaW5nIGRpZ2l0YWwgYXNzZXRzIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1Ymxpc2hlcl9yZWdpc3RyeSA9IGNvbXBvbmVudCAiUHVibGlzaGVyIFJlZ2lzdHJ5IiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSZWdpc3RyeSBmb3IgcHVibGlzaGVycyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhc3NldF9wdWJsaXNoZXJfZW5naW5lID0gY29tcG9uZW50ICJBc3NldCBQdWJsaXNoZXIgRW5naW5lIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBwdWJsaXNoaW5nIGRpZ2l0YWwgYXNzZXRzIHVzaW5nIGEgcHVibGlzaGVyIGZyb20gcmVnaXN0cnkiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGFkYV9tb2RhX3N1YnN5c3RlbSA9IGNvbnRhaW5lciAiQ0hBREEgTU9EQSBTdWJzeXN0ZW0iIHsKICAgICAgICAgICAgICAgIHRhZ3MgImV4dGVuZCIKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICJmciIgIjMuMyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciByZW5kZXJpbmcgQ0hBREEgTU9EQSBtb2RlbHMiCgogICAgICAgICAgICAgICAgY2hhZGFfbW9kYV9yZW5kZXJlcl9hcGkgPSBjb21wb25lbnQgIkNoYWRhIE1vZGEgUmVuZGVyZXIgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgZm9yIHJlbmRlcmluZyBDSEFEQSBNT0RBIG1vZGVscyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaGFkYV9tb2RhX3JlbmRlcmVyID0gY29tcG9uZW50ICJDaGFkYSBNb2RhIFJlbmRlcmVyIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciByZW5kZXJpbmcgQ0hBREEgTU9EQSBtb2RlbHMiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcGxhbnR1bWxfcmVuZGVyZXIgPSBjb21wb25lbnQgIlBsYW50VU1MIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUGxhbnRVTUwsIEphdmEiCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlBsYW50VU1MIGVuZ2luZSBmb3IgcmVuZGVyaW5nIGRpYWdyYW1zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBvbnRvbG9neV9zdWJzeXN0ZW0gPSBjb250YWluZXIgIk9udG9sb2d5IFN1YnN5c3RlbSIgewogICAgICAgICAgICAgICAgdGFncyAiZXh0ZW5kIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiMy4yLDMuNSw0LjMsNS4zIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJPbnRvbG9neSBtYW5hZ2VtZW50IG1pY3Jvc2VydmljZSwgZ2VuZXJhdGlvbiBvZiBTSEFDTCBjb25zdHJhaW50cyBhbmQgU1BBUlFMIHF1ZXJpZXMiCgogICAgICAgICAgICAgICAgb250b2xvZ3lfYXBpID0gY29tcG9uZW50ICJPbnRvbG9neSBBUEkiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFQSSBmb3Igb250b2xvZ3kgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvbnRvbG9neV9tYW5hZ2VyID0gY29tcG9uZW50ICJPbnRvbG9neSBNYW5hZ2VyIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBtYW5hZ2luZyBvbnRvbG9naWVzIGFuZCBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gdGhlbSBsaWtlIHJldHJpZXZpbmcgY29uc3RyYWludHMgb3IgdW5pdCBjb252ZXJzaW9uIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3BhcnFsX3NlcnZlciA9IGNvbnRhaW5lciAiU1BBUVJMIFNlcnZlciIgewogICAgICAgICAgICAgICAgdGFncyAiZXh0ZW5kIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiMy4yLDQuMywzLjUsNS4zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXBhY2hlIEplbmEgRnVzZWtpIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNQQVJRTCBzZXJ2ZXIgZm9yIHF1ZXJ5aW5nIG9udG9sb2dpZXMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxjYV9zdWJzeXN0ZW0gPSBjb250YWluZXIgIkxpZmVjeWNsZSBBc3Nlc3NtZW50IFN1YnN5c3RlbSIgewogICAgICAgICAgICAgICAgdGFncyAiZXh0ZW5kIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiNS40LDcuNCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJUb29sIGZvciBwYXJzaW5nIExDQSByZXN1bHRzIGZvciBwcm92aWRpbmcgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIGVudmlyb25tZW50YWwgaW1wYWN0IgoKICAgICAgICAgICAgICAgIGxjYV9hcGkgPSBjb21wb25lbnQgIkxDQSBBUEkiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFQSSBmb3IgbGlmZWN5Y2xlIGFzc2Vzc21lbnQgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsY2FfcGFyc2VyID0gY29tcG9uZW50ICJMQ0EgUGFyc2VyIiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTZXJ2aWNlIGZvciBwYXJzaW5nIExDQSByZXN1bHRzIgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxjYV9kYXRhc2V0ID0gY29tcG9uZW50ICJMQ0EgRGF0YXNldCIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkV4Y2VsIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMQ0EgZGF0YXNldCBmb3IgZW52aXJvbm1lbnRhbCBpbXBhY3QgYXNzZXNzbWVudCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICBvYmplY3Rfc3RvcmFnZSA9IGNvbnRhaW5lciAiQ2VudHJhbGl6ZWQgQXNzZXQgU3RvcmFnZSIgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICJmciIgIjIuMSw2LjEsNi4yLDYuNSw3LjQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJTMyIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDZW50cmFsaXplZCBzdG9yYWdlIGZvciBkaWdpdGFsIGFzc2V0cyIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICByZWxhdGlvbmFsX2RhdGFiYXNlID0gY29udGFpbmVyICJSZWxhdGlvbmFsIERhdGFiYXNlIiB7CiAgICAgICAgICAgICAgICB0YWdzICJleHRlbmQiCiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAiZnIiICIyLjEiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQb3N0Z3JlU1FMIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkRhdGFiYXNlIGZvciBzdG9yaW5nIHN0cnVjdHVyZWQgZGF0YSIgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX2F1dGhvcml6YXRpb24gPSBjb250YWluZXIgIkF1dGhlbnRpY2F0aW9uIGFuZCBBdXRob3JpemF0aW9uIiB7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGFncyAiZXh0ZW5kIgogICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgImZyIiAiNi4xLDYuMiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIktleWNsb2FrIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNlbnRyYWxpemVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIHNlcnZpY2UiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlYXJjaF9lbmdpbmUgPSBjb250YWluZXIgIlNlYXJjaCBFbmdpbmUiIHsKICAgICAgICAgICAgICAgIHRhZ3MgImV4dGVuZCIKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICJmciIgIjUuMyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkFwYWNoZSBTb2xyIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlYXJjaCBlbmdpbmUgZm9yIGluZGV4aW5nIGFuZCBzZWFyY2hpbmcgZGlnaXRhbCBhc3NldHMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdpdCA9IGNvbnRhaW5lciAiR2l0IiB7CiAgICAgICAgICAgICAgICB0YWdzICJleHRlbmQiCiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAiZnIiICI0LjEsNi4zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiR2l0ZWEiCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiVmVyc2lvbiBjb250cm9sIHN5c3RlbSBmb3IgbWFuYWdpbmcgY29kZSIgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbSA9IGNvbnRhaW5lciAiRGF0YSBJbnRlZ3JhdGlvbiBTdWJzeXN0ZW0iIHsKICAgICAgICAgICAgICAgIHRhZ3MgImludGVncmF0aW9uIgogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGludGVncmF0aW5nIGRhdGEgZnJvbSBkaXN0cmlidXRlZCBub2RlcyIKCiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAiZnIiICI2LjQsNy4xLDcuMiIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX3NlcnZpY2UgPSBjb21wb25lbnQgIkRhdGEgSW50ZWdyYXRpb24gU2VydmljZSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgaW50ZWdyYXRpbmcgZGF0YSBmcm9tIGV4dGVybmFsIHNvdXJjZXMiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGF0YV9pbnRlZ3JhdGlvbl9yZWdpc3RyeSA9IGNvbXBvbmVudCAiTm9kZSBSZWdpc3RyeSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmVnaXN0cnkgZm9yIGRpc3RyaWJ1dGVkIERLTVAgbm9kZXMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX2FwaSA9IGNvbXBvbmVudCAiRGF0YSBJbnRlZ3JhdGlvbiBBUEkiIHsKCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgZm9yIGludGVncmF0aW5nIGRhdGEgZnJvbSBleHRlcm5hbCBzb3VyY2VzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICB9CgoKICAgICAgICAvL2RrbXAgZGlzdHJpYnV0ZWQgbm9kZQogICAgICAgIGRrbXBfZGlzdHJpYnV0ZWRfbm9kZSA9IHNvZnR3YXJlU3lzdGVtICJES01QIGRlY2VudHJhbGlzZWQgbm9kZSIgewogICAgICAgIHRhZ3MgImludGVncmF0aW9uIiAiaW50ZXJuYWwiICAgCiAgICAgICAgZGVzY3JpcHRpb24gIkRlY2VudHJhbGlzZWQgbm9kZSBmb3IgcHJpdmF0ZSBkYXRhIG1hbmFnZW1lbnQiCiAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAiaGludHMiICJES01QIHN0YW5kcyBmb3IgRGF0YSBhbmQgS25vd2xlZGdlIE1hbmFnZW1lbnQgUGxhdGZvcm0uIFRoZSBkZWNlbnRyYWxpc2VkIG5vZGUgaXMgdXNlZCBmb3Igc3RvcmluZyBwcml2YXRlIGFzc2V0cyB3aXRoaW5nIHRoZSBvcmdhbmlzYXRpb24gaW5mcmFzdHJ1Y3R1cmUuIgogICAgICAgICAgICB9CgogICAgICAgIHJldmVyc2VfcHJveHkgPSBjb250YWluZXIgIlJldmVyc2UgUHJveHkiIHsKICAgICAgICAgICAgdGVjaG5vbG9neSAiTmdpbngiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSZXZlcnNlIHByb3h5IGZvciByb3V0aW5nIHJlcXVlc3RzIHRvIHRoZSBhcHByb3ByaWF0ZSBzZXJ2aWNlcyIKICAgICAgICB9CgogICAgICAgIGRydXBhbF9mcmFtZXdvcmsgPSBjb250YWluZXIgIkRydXBhbCIgewogICAgICAgICAgICB0ZWNobm9sb2d5ICJEcnVwYWwgMTAsIFBIUCA4LCBKYXZhU2NyaXB0IgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiRHJ1cGFsIHdpdGggY3VzdG9tIGV4dGVuc2lvbnMiCgogICAgICAgICAgICBkcnVwYWxfY29yZSA9IGNvbXBvbmVudCAiRHJ1cGFsIENvcmUiIHsKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJEcnVwYWwgMTAiCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmciIgIjYuMyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkRydXBhbCBjb3JlIGZ1bmN0aW9uYWxpdHkiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiY29yZV9leHRlbmQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBhY2Nlc3NfbWFuYWdlbWVudF9tb2R1bGUgPSBjb21wb25lbnQgIkFjY2VzcyBNYW5hZ2VtZW50IiB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICAgICAiZnIiICI2LjEsNi4yLDYuNCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlBIUCIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJNYW5hZ2VzIGFjY2VzcyB0byBkaWdpdGFsIGFzc2V0cyIKCiAgICAgICAgICAgICAgICAtPiBkcnVwYWxfY29yZSAiTWFuYWdlcyBhY2Nlc3MgdG8gZGlnaXRhbCBhc3NldHMiICIiICJjb3JlX2V4dGVuZCIKICAgICAgICAgICAgfSAgICAgICAgICAgIAoKICAgICAgICB9CgogICAgICAgIGRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtID0gY29udGFpbmVyICJEYXRhIEludGVncmF0aW9uIFN1YnN5c3RlbSIgewoKICAgICAgICAgICAgdGFncyAiaW50ZWdyYXRpb24iCiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgImZyIiAiNi40LDcuMSw3LjIiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGludGVncmF0aW5nIGRhdGEgd2l0aCBjZW50cmFsaXNlZCBub2RlcyIKICAgICAgICAgICAgCgogICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX3NlcnZpY2UgPSBjb21wb25lbnQgIkRhdGEgSW50ZWdyYXRpb24gU2VydmljZSIgewogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIGludGVncmF0aW5nIGRhdGEgd2l0aCBjZW50cmFsaXNlZCBub2RlcyIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGF0YV9pbnRlZ3JhdGlvbl9yZWdpc3RyeSA9IGNvbXBvbmVudCAiTm9kZSBSZWdpc3RyeSIgewogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlZ2lzdHJ5IGZvciBjZW50cmFsaXNlZCBES01QIG5vZGVzIgogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX2FwaSA9IGNvbXBvbmVudCAiRGF0YSBJbnRlZ3JhdGlvbiBBUEkiIHsKICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJEYXRhIGludGVncmF0aW9uIEFQSSBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgY2VudHJhbCBub2RlIgogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhX2ludGVncmF0aW9uX2V2ZW50X2NvbnN1bWVyID0gY29tcG9uZW50ICJEYXRhIEludGVncmF0aW9uIEV2ZW50IENvbnN1bWVyIiB7CiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJQeXRob24iCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRXZlbnQgY29uc3VtZXIgZm9yIGludGVncmF0aW5nIGRhdGEgd2l0aCBjZW50cmFsaXNlZCBub2RlIgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAKCiAgICAgICAgbWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0gPSBjb250YWluZXIgIk1ldGFkYXRhIFBhcnNpbmcgU3Vic3lzdGVtIiB7CiAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNlcnZpY2UgZm9yIHBhcnNpbmcgbWV0YWRhdGEgZnJvbSBkaWdpdGFsIGFzc2V0cyIKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICAgICAgICAgICJmciIgIjEuMSwxLjIsMS40LDMuMSwzLjUiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWV0YWRhdGFfcGFyc2VyX2FwaSA9IGNvbXBvbmVudCAiTWV0YWRhdGEgUGFyc2VyIEFQSSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQVBJIGZvciBwYXJzaW5nIG1ldGFkYXRhIGZyb20gZGlnaXRhbCBhc3NldHMiCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWV0YWRhdGFfcGFyc2VyX2VuZ2luZSA9IGNvbXBvbmVudCAiTWV0YWRhdGEgUGFyc2VyIEVuZ2luZSIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgZm9yIHJ1bm5pbmcgbWV0YWRhdGEgcGFyc2VycyBmcm9tIHJlZ2lzdHJ5IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1ldGFkYXRhX3BhcnNlcl9yZWdpc3RyeSA9IGNvbXBvbmVudCAiTWV0YWRhdGEgUGFyc2VyIFJlZ2lzdHJ5IiB7CiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJSZWdpc3RyeSBmb3IgbWV0YWRhdGEgcGFyc2VycyIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtZXRhZGF0YV92YWxpZGF0b3IgPSBjb21wb25lbnQgIk1ldGFkYXRhIFZhbGlkYXRvciIgewogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgdmFsaWRhdGluZyBtZXRhZGF0YSIKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRhdGFfZW5yaWNobWVudF9zdWJzeXN0ZW0gPSBjb250YWluZXIgIkRhdGEgRW5yaWNobWVudCBTdWJzeXN0ZW0iIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAiZnIiICIxLjMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiU2VydmljZSBmb3IgZW5yaWNoaW5nIGRpZ2l0YWwgYXNzZXRzIHdpdGggYWRkaXRpb25hbCBkYXRhIiAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgZGF0YV9lbnJpY2htZW50X2VuZ2luZSA9IGNvbXBvbmVudCAiRGF0YSBFbnJpY2htZW50IEVuZ2luZSIgewogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkVuZ2luZSBmb3IgZW5yaWNoaW5nIGRpZ2l0YWwgYXNzZXRzIHdpdGggYWRkaXRpb25hbCBkYXRhIgogICAgICAgICAgICB9CgogICAgICAgICAgICBkYXRhX2VucmljaG1lbnRfcmVnaXN0cnkgPSBjb21wb25lbnQgIkRhdGEgRW5yaWNobWVudCBSZWdpc3RyeSIgewogICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiUHl0aG9uIgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlZ2lzdHJ5IGZvciBkYXRhIGVucmljaG1lbnQgc2VydmljZXMiCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRhdGFfZW5yaWNobWVudF9hcGkgPSBjb21wb25lbnQgIkRhdGEgRW5yaWNobWVudCBBUEkiIHsKICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlB5dGhvbiIKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgZm9yIGVucmljaGluZyBkaWdpdGFsIGFzc2V0cyB3aXRoIGFkZGl0aW9uYWwgZGF0YSIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgb2JqZWN0X3N0b3JhZ2UgPSBjb250YWluZXIgIkRpc3RyaWJ1dGVkIEFzc2V0IFN0b3JhZ2UiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICAgICAiZnIiICIyLjEsNi4zIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHRlY2hub2xvZ3kgIlMzIgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiRGlzdHJpYnV0ZWQgc3RvcmFnZSBmb3IgcHJpdmF0ZSBkaWdpdGFsIGFzc2V0cyIgICAgICAgICAgICAgICAgCiAgICAgICAgfQoKCiAgICAgICAgcmVsYXRpb25hbF9kYXRhYmFzZSA9IGNvbnRhaW5lciAiUmVsYXRpb25hbCBEYXRhYmFzZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgICAgICJmciIgIjIuMSIKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZWNobm9sb2d5ICJQb3N0Z3JlU1FMIgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiRGF0YWJhc2UgZm9yIHN0b3Jpbmcgc3RydWN0dXJlZCBkYXRhIiAgICAgICAgICAgICAgICAKICAgICAgICB9CiAgICAgCiAgICB9CgogICAgICAgIC8vIFJlbGF0aW9ucyBmb3IgdGhlIGNlbnRyYWwgbm9kZQoKCiAgICAgICAgLy9NYW5hZ2VzIGFjY2VzcwoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFjY2Vzc19tYW5hZ2VtZW50X21vZHVsZSAtPiBka21wX2NlbnRyYWxfbm9kZS5hdXRoZW50aWNhdGlvbl9hdXRob3JpemF0aW9uICJNYW5hZ2VzIHVzZXJzIGFuZCByb2xlcyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsuYWNjZXNzX21hbmFnZW1lbnRfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLmV2ZW50X3N1YnN5c3RlbSAiQWRkcyBhY2Nlc3MgZ3JhbnRzIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCiAgICAgICAgLy9NYW5hZ2UgZm9ybXMKCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5hc3NldF9lbnRpdHlfbWFuYWdlcl9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUub250b2xvZ3lfc3Vic3lzdGVtLm9udG9sb2d5X2FwaSAiUmV0cmlldmVzIG9udG9sb2d5IGNvbnN0cmFpbnRzIGZvciBmb3JtIHZhbGlkYXRpb24iIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL01hbmFnZXMgcmFiYml0CiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5ldmVudF9tYW5hZ2VtZW50X21vZHVsZSAtPiBka21wX2NlbnRyYWxfbm9kZS5ldmVudF9zdWJzeXN0ZW0gIk1hbmFnZXMgcXVldWVzIGZvciBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vCiAgICAgICAgLy9VcGxvYWQgbGFyZ2UgZmlsZXMgdG8gb2JqZWN0IHN0b3JhZ2UKICAgICAgICAvLwogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsubGFyZ2VfZmlsZV91cGxvYWRfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLm9iamVjdF9zdG9yYWdlICJVcGxvYWRzIGxhcmdlIGZpbGVzIGRpcmVjdGx5IHRvIHN0b3JhZ2UgaW4gYSBjZW50cmFsaXNlZCBub2RlIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5sYXJnZV9maWxlX3VwbG9hZF9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9hcGkgIlVwbG9hZHMgbGFyZ2UgZmlsZXMgdG8gc3RvcmFnZSBpbiBhIGRpc3RyaWJ1dGVkIG5vZGUgb3IgdXNlcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZXhjaGFuZ2UiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vCiAgICAgICAgLy8KICAgICAgICAvLwoKICAgICAgICAvL1VuaXQgY29udmVydGVyCgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsudW5pdF93aWRnZXRfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLm9udG9sb2d5X3N1YnN5c3RlbS5vbnRvbG9neV9hcGkgIlJldHJpZXZlcyB1bml0IGNvbnZlcnNpb24gZGF0YSBmcm9tIG9udG9sb2d5IiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9EZWxldGUgZmlsZSBmcm9tIG9iamVjdCBzdG9yYWdlIGlmIHRpbWUgZWxhcHNlZAogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsudGVtcG9yYXJ5X2ZpbGVfc3RvcmFnZV9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUub2JqZWN0X3N0b3JhZ2UgIkRlbGV0ZXMgZmlsZXMgZnJvbSBzdG9yYWdlIGlmIHRpbWUgZWxhcHNlZCIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIAogICAgICAgIC8vRXZlbnQgY29uc3VtZXIKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5ldmVudF9zdWJzeXN0ZW0uZXZlbnRfY29uc3VtZXIgLT4gZGttcF9jZW50cmFsX25vZGUuZXZlbnRfc3Vic3lzdGVtLnJhYmJpdG1xICJDb25zdW1lcyBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIGJyb2tlciIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmV2ZW50X3N1YnN5c3RlbS5ldmVudF9jb25zdW1lciAgLT4gZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5ka21wX2FwaV9tb2R1bGUgIlRyaWdnZXJzIG1lc3NhZ2UgcHJvY2Vzc2luZyB2aWEgQVBJIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gCiAgICAgICAgLy9NZXRhZGF0YSBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIHRocm91Z2ggYXV0aG9yaW5nIG1vZHVsZQogICAgICAgIC8vCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5tZXRhZGF0YV9hdXRob3JpbmdfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9hcGkgIlJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBkaWdpdGFsIGFzc2V0IiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbS5tZXRhZGF0YV9wYXJzZXJfYXBpIC0+IGRrbXBfY2VudHJhbF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9yZWdpc3RyeSAiTG9jYXRlcyBhIHN1aXRhYmxlIG1ldGFkYXRhIHBhcnNlciIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9hcGkgLT4gZGttcF9jZW50cmFsX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfcGFyc2VyX2VuZ2luZSAiSW5pdGlhbGlzZWQgbWV0YWRhdGEgcGFyc2VyIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfcGFyc2VyX2VuZ2luZSAtPiBka21wX2NlbnRyYWxfbm9kZS5vYmplY3Rfc3RvcmFnZSAiTG9hZHMgdGhlIGZpbGUgZm9yIG1ldGFkYXRhIHBhcnNpbmciIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9lbmdpbmUgLT4gZGttcF9jZW50cmFsX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfdmFsaWRhdG9yICJWYWxpZGF0ZXMgbWV0YWRhdGEgYWdhaW5zdCBvbnRvbG9neSBjb25zdHJhaW50cyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfdmFsaWRhdG9yIC0+IGRrbXBfY2VudHJhbF9ub2RlLm9udG9sb2d5X3N1YnN5c3RlbS5vbnRvbG9neV9hcGkgIlJldHJpZXZlcyBvbnRvbG9neSBjb25zdHJhaW50cyBmb3IgbWV0YWRhdGEgdmFsaWRhdGlvbiIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAKICAgICAgICAvLwogICAgICAgIC8vCgogICAgICAgIC8vRW5zdXJlIEFzc2V0IEluZGV4aW5nIGludGVyYWN0cyB3aXRoIFNlYXJjaCBFbmdpbmUKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFzc2V0X2luZGV4aW5nX2Rpc2NvdmVyeV9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUuc2VhcmNoX2VuZ2luZSAiUGVyZm9ybXMgYXNzZXQgaW5kZXhpbmcgYW5kIHNlYXJjaCIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAKCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5hc3NldF92aXN1YWxpc2F0aW9uX21vZHVsZSAtPiBka21wX2NlbnRyYWxfbm9kZS5vbnRvbG9neV9zdWJzeXN0ZW0ub250b2xvZ3lfYXBpICJMb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIG9udG9sb2d5IGZvciB2aXN1YWxpemF0aW9uIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vCiAgICAgICAgLy8KICAgICAgICAvLwoKICAgICAgICAvLwogICAgICAgIC8vT250b2xvZ3kgc3Vic3lzdGVtIGludGVyYWN0aW9ucwogICAgICAgIC8vCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUub250b2xvZ3lfc3Vic3lzdGVtLm9udG9sb2d5X2FwaSAtPiBka21wX2NlbnRyYWxfbm9kZS5vbnRvbG9neV9zdWJzeXN0ZW0ub250b2xvZ3lfbWFuYWdlciAiUGVyZm9ybXMgb3BlcmF0aW9ucyBvbiB0aGUgb250b2xvZ3kiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLm9udG9sb2d5X3N1YnN5c3RlbS5vbnRvbG9neV9tYW5hZ2VyIC0+IGRrbXBfY2VudHJhbF9ub2RlLnNwYXJxbF9zZXJ2ZXIgIlF1ZXJpZXMgdGhlIFNQQVJRTCBzZXJ2ZXIgZm9yIGNvbnN0cmFpbnRzLCBvbnRvbG9neSBkYXRhIGFuZCB1bml0IGNvbnZlcnNpb24iIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8KICAgICAgICAvLwogICAgICAgIC8vCgogICAgCiAgICAgICAgLy8gCiAgICAgICAgLy9MQ0EgbW9kdWxlIGludGVyYWN0aW9uIHdpdGggc3Vic3lzdGVtCiAgICAgICAgLy8KICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmxjYV9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUubGNhX3N1YnN5c3RlbS5sY2FfYXBpICJSZXF1ZXN0cyBsaWZlY3ljbGUgYXNzZXNzbWVudHMiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmxjYV9zdWJzeXN0ZW0ubGNhX2FwaSAtPiBka21wX2NlbnRyYWxfbm9kZS5sY2Ffc3Vic3lzdGVtLmxjYV9wYXJzZXIgIlJlcXVlc3RzIHBhcnNpbmcgb2YgbGlmZWN5Y2xlIGFzc2Vzc21lbnQgcmVzdWx0cyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUubGNhX3N1YnN5c3RlbS5sY2FfcGFyc2VyIC0+IGRrbXBfY2VudHJhbF9ub2RlLmxjYV9zdWJzeXN0ZW0ubGNhX2RhdGFzZXQgIlBhcnNlcyBsaWZlY3ljbGUgYXNzZXNzbWVudCByZXN1bHRzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIAogICAgICAgIC8vCiAgICAgICAgLy8KCiAgICAgICAgLy8KICAgICAgICAvL01vZGEgQ2hhZGEgZnVuY3Rpb25hbGl0eQogICAgICAgIC8vCgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsuY2hhZGFfbW9kYV9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUuY2hhZGFfbW9kYV9zdWJzeXN0ZW0uY2hhZGFfbW9kYV9yZW5kZXJlcl9hcGkgIlJlcXVlc3RzIHJlbmRlcmluZyBvZiBDSEFEQSBNT0RBIG1vZGVscyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuY2hhZGFfbW9kYV9zdWJzeXN0ZW0uY2hhZGFfbW9kYV9yZW5kZXJlcl9hcGkgLT4gZGttcF9jZW50cmFsX25vZGUuY2hhZGFfbW9kYV9zdWJzeXN0ZW0uY2hhZGFfbW9kYV9yZW5kZXJlciAiUmVuZGVycyBDSEFEQSBNT0RBIG1vZGVscyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuY2hhZGFfbW9kYV9zdWJzeXN0ZW0uY2hhZGFfbW9kYV9yZW5kZXJlciAtPiBka21wX2NlbnRyYWxfbm9kZS5jaGFkYV9tb2RhX3N1YnN5c3RlbS5wbGFudHVtbF9yZW5kZXJlciAiUmVuZGVycyBQbGFudFVNTCBkaWFncmFtcyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIAogICAgICAgIC8vIAogICAgICAgIC8vR0l0IGZ1bmN0aW9uYWxpdHkKICAgICAgICAvLwoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLnNvZnR3YXJlX2FydGVmYWN0X21hbmFnZXJfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLmdpdCAiTWFuYWdlcyBzb3VyY2UgY29kZSBmb3IgZGlnaXRhbCBhc3NldHMiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICAvLwogICAgICAgIC8vLy8vQXV0aGVudGljYXRpb24gYW5kIEF1dGhvcml6YXRpb24KICAgICAgICAvLwogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmF1dGhlbnRpY2F0aW9uX2F1dGhvcml6YXRpb24gLT4gZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yayAiTWFuYWdlcyB1c2VyIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2Nlc3MgY29udHJvbCBmb3IgRHJ1cGFsIiB7CiAgICAgICAgfQogICAgICAgIC8vCiAgICAgICAgLy8KICAgICAgICAvLwoKICAgICAgICAvLwogICAgICAgIC8vRGF0YSBlbnJpY2htZW50CiAgICAgICAgLy8KICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmRhdGFfZW5yaWNobWVudF9tb2R1bGUgLT4gZGttcF9jZW50cmFsX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbS5kYXRhX2VucmljaG1lbnRfYXBpICJFbnJpY2hlcyBkYXRhIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbS5kYXRhX2VucmljaG1lbnRfYXBpIC0+IGRrbXBfY2VudHJhbF9ub2RlLmRhdGFfZW5yaWNobWVudF9zdWJzeXN0ZW0uZGF0YV9lbnJpY2htZW50X3JlZ2lzdHJ5ICJMb2NhdGVzIGEgc3VpdGFibGUgZGF0YSBlbnJpY2htZW50IHNlcnZpY2UiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRhdGFfZW5yaWNobWVudF9zdWJzeXN0ZW0uZGF0YV9lbnJpY2htZW50X2FwaSAtPiBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2VucmljaG1lbnRfc3Vic3lzdGVtLmRhdGFfZW5yaWNobWVudF9lbmdpbmUgIkluaXRpYWxpc2VkIGRhdGEgZW5yaWNobWVudCBzZXJ2aWNlIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2VucmljaG1lbnRfc3Vic3lzdGVtLmRhdGFfZW5yaWNobWVudF9lbmdpbmUgLT4gZGttcF9jZW50cmFsX25vZGUub2JqZWN0X3N0b3JhZ2UgIkxvYWRzIHRoZSBmaWxlIGZvciBlbnJpY2htZW50IiB7CiAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8KICAgICAgICAvLwogICAgICAgIC8vCgogICAgICAgIC8vCiAgICAgICAgLy9Bc3NldCBwdWJsaXNoaW5nCiAgICAgICAgLy8KICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFzc2V0X3B1Ymxpc2hpbmdfbW9kdWxlIC0+IGRrbXBfY2VudHJhbF9ub2RlLmFzc2V0X3B1Ymxpc2hpbmdfc3Vic3lzdGVtLnB1Ymxpc2hlcl9hcGkgIlB1Ymxpc2hlcyBkaWdpdGFsIGFzc2V0cyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5hc3NldF9wdWJsaXNoaW5nX3N1YnN5c3RlbS5wdWJsaXNoZXJfYXBpIC0+IGRrbXBfY2VudHJhbF9ub2RlLmFzc2V0X3B1Ymxpc2hpbmdfc3Vic3lzdGVtLnB1Ymxpc2hlcl9yZWdpc3RyeSAiTG9jYXRlcyBhIHN1aXRhYmxlIHB1Ymxpc2hlciIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5hc3NldF9wdWJsaXNoaW5nX3N1YnN5c3RlbS5wdWJsaXNoZXJfYXBpIC0+IGRrbXBfY2VudHJhbF9ub2RlLmFzc2V0X3B1Ymxpc2hpbmdfc3Vic3lzdGVtLmFzc2V0X3B1Ymxpc2hlcl9lbmdpbmUgIkluaXRpYWxpc2VkIGFzc2V0IHB1Ymxpc2hlciIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuYXNzZXRfcHVibGlzaGluZ19zdWJzeXN0ZW0uYXNzZXRfcHVibGlzaGVyX2VuZ2luZSAtPiBvcGVuX3Jlc2VhcmNoX3JlcG8gIlB1Ymxpc2hlcyBhc3NldHMgdG8gdGhlIE9wZW4gUmVzZWFyY2ggUmVwb3NpdG9yeSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLwogICAgICAgIC8vCiAgICAgICAgLy8KCiAgICAgICAgLy8KICAgICAgICAvL0RhdGEgaW50ZWdyYXRpb24gY2FzZXMKICAgICAgICAvLwoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX2FwaSAtPiBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX3JlZ2lzdHJ5ICJMb2NhdGVzIG1ldGFkYXRhIGZvciB0aGUgZGlzdHJpYnV0ZWQgbm9kZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0gIAoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX2FwaSAtPiBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX3NlcnZpY2UgIkluaXRpYWxpc2VkIGRhdGEgaW50ZWdyYXRpb24gc2VydmljZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL0Nhc2Ugd2l0aCB0ZW1wb3Jhcnkgc3RvcmFnZQoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX3NlcnZpY2UgLT4gZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay50ZW1wb3JhcnlfZmlsZV9zdG9yYWdlX21vZHVsZSAiU3RvcmVzIGZpbGVzIHRlbXBvcmFyaWx5IGZvciBleGNoYW5nZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfY2VudHJhbF9ub2RlLmV2ZW50X3N1YnN5c3RlbSAiU2VuZHMgbWVzc2FnZSBmb3IgdGhlIGRpc3RyaWJ1dGVkIG5vZGUgYWJvdXQgbmV3IGZpbGVzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2NlbnRyYWxfbm9kZS5ldmVudF9zdWJzeXN0ZW0gLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fZXZlbnRfY29uc3VtZXIgIlRyYW5zbWl0cyBhIG1lc3NhZ2VlIGFib3V0IG5ldyBmaWxlcyBvciBhY2Nlc3MgZ3JhbnRzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9ldmVudF9jb25zdW1lciAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9yZWdpc3RyeSAiTG9jYXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2VudHJhbCBub2RlIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9ldmVudF9jb25zdW1lciAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlICJJbml0aWFsaXNlZCBkYXRhIGludGVncmF0aW9uIHNlcnZpY2UiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fc2VydmljZSAtPiBka21wX2NlbnRyYWxfbm9kZS5vYmplY3Rfc3RvcmFnZSAiUmV0cmlldmVzIGZpbGVzIGZyb20gdGhlIGNlbnRyYWwgbm9kZSwgdXBsb2FkcyBmaWxlcyBmb3IgZXhjaGFuZ2UsIGFjY2VzcyBncmFudCByZXN1bHRzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5yZWxhdGlvbmFsX2RhdGFiYXNlICJTdG9yZXMgYXNzZXQgbWV0YWRhdGEgbG9jYWxseSIgewogICAgICAgIC8vICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAvLyAgICAgfQogICAgICAgIC8vIH0KCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fc2VydmljZSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUub2JqZWN0X3N0b3JhZ2UgIlN0b3JlcyBkaWdpdGFsIGFzc2V0cyBsb2NhbGx5IHBlcm1hbmVudGx5IiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYXNlIHdpdGggYWNjZXNzIHRvIGRpc3RyaWJ1dGVkIG5vZGUKCiAgICAgICAgZGttcF9jZW50cmFsX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5vYmplY3Rfc3RvcmFnZSAiU3RvcmVzIGZpbGVzIHRlbXBvcmFyaWx5IGZvciBleGNoYW5nZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9DYXNlIHdpdGggYWNjZXNzIGdyYW50IHRvIGRpc3RyaWJ1dGVkIG5vZGUKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFjY2Vzc19tYW5hZ2VtZW50X21vZHVsZSAiQWRkcyBhIG5ldyBhY2Nlc3MgZ3JhbnQgZm9yIHJldmlld2FsIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5hY2Nlc3NfbWFuYWdlbWVudF9tb2R1bGUgLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fYXBpICJBY2Nlc3MgZ3JhbnQgY29uZmlybWVkIG9yIHJlamVjdGVkIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9hcGkgLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fcmVnaXN0cnkgIkxvY2F0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNlbnRyYWwgbm9kZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtLmRhdGFfaW50ZWdyYXRpb25fYXBpIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbS5kYXRhX2ludGVncmF0aW9uX3NlcnZpY2UgIkluaXRpYWxpc2VkIGRhdGEgaW50ZWdyYXRpb24gc2VydmljZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIC8vCiAgICAgICAgLy9EaXN0cmlidXRlZCBub2RlIHRyaWdnZXIgZGF0YSBlbnJpY2htZW50CiAgICAgICAgLy8KICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5kYXRhX2VucmljaG1lbnRfc3Vic3lzdGVtLmRhdGFfZW5yaWNobWVudF9hcGkgIlJlcXVlc3RzIGRhdGEgZW5yaWNobWVudCIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfZW5yaWNobWVudF9zdWJzeXN0ZW0uZGF0YV9lbnJpY2htZW50X2FwaSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbS5kYXRhX2VucmljaG1lbnRfcmVnaXN0cnkgIkxvY2F0ZXMgYSBzdWl0YWJsZSBkYXRhIGVucmljaG1lbnQgc2VydmljZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfZW5yaWNobWVudF9zdWJzeXN0ZW0uZGF0YV9lbnJpY2htZW50X2FwaSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbS5kYXRhX2VucmljaG1lbnRfZW5naW5lICJJbml0aWFsaXNlZCBkYXRhIGVucmljaG1lbnQgc2VydmljZSIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbS5kYXRhX2VucmljaG1lbnRfZW5naW5lIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5vYmplY3Rfc3RvcmFnZSAiTG9hZHMgdGhlIGZpbGUgZm9yIGVucmljaG1lbnQiIHsKICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgCgogICAgICAgIC8vCiAgICAgICAgLy8KICAgICAgICAvLwoKICAgICAgICAvLwogICAgICAgIC8vRGlzdHJpYnV0ZWQgbm9kZSB0cmlnZ2VycyBtZXRhZGF0YSBwYXJzaW5nCiAgICAgICAgLy8KICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9pbnRlZ3JhdGlvbl9zdWJzeXN0ZW0uZGF0YV9pbnRlZ3JhdGlvbl9zZXJ2aWNlIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbS5tZXRhZGF0YV9wYXJzZXJfYXBpICJSZXF1ZXN0cyBtZXRhZGF0YSBwYXJzaW5nIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfcGFyc2VyX2FwaSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfcGFyc2VyX3JlZ2lzdHJ5ICJMb2NhdGVzIGEgc3VpdGFibGUgbWV0YWRhdGEgcGFyc2VyIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgeyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9hcGkgLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtLm1ldGFkYXRhX3BhcnNlcl9lbmdpbmUgIkluaXRpYWxpc2VkIG1ldGFkYXRhIHBhcnNlciIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbS5tZXRhZGF0YV9wYXJzZXJfZW5naW5lIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5vYmplY3Rfc3RvcmFnZSAiTG9hZHMgdGhlIGZpbGUgZm9yIG1ldGFkYXRhIHBhcnNpbmciIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbS5tZXRhZGF0YV9wYXJzZXJfZW5naW5lIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbS5tZXRhZGF0YV92YWxpZGF0b3IgIlZhbGlkYXRlcyBtZXRhZGF0YSBhZ2FpbnN0IG9udG9sb2d5IGNvbnN0cmFpbnRzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBka21wX2Rpc3RyaWJ1dGVkX25vZGUubWV0YWRhdGFfcGFyc2luZ19zdWJzeXN0ZW0ubWV0YWRhdGFfdmFsaWRhdG9yIC0+IGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsuZGttcF9hcGlfbW9kdWxlICJSZXRyaWV2ZXMgb250b2xvZ3kgY29uc3RyYWludHMgZm9yIG1ldGFkYXRhIHZhbGlkYXRpb24iIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICAvLwogICAgICAgIC8vVXNlciByZWxhdGlvbnMKICAgICAgICAvLwoKICAgICAgICBwbGF0Zm9ybUFkbWluIC0+IGRrbXBfY2VudHJhbF9ub2RlLmF1dGhlbnRpY2F0aW9uX2F1dGhvcml6YXRpb24gIk1hbmFnZXMgdXNlcnMgYW5kIHJvbGVzIiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwbGF0Zm9ybUFkbWluIC0+IGRrbXBfY2VudHJhbF9ub2RlLnNwYXJxbF9zZXJ2ZXIgIlVwZGF0ZXMgb250b2xvZ3kiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzc2V0T3duZXIgLT4gZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yayAiUHVibGlzaGVzIGFzc2V0cyBhbmQgbWFuYWdlcyBhY2Nlc3MiIHsKICAgICAgICAgICAgdGFncyAiYXNzZXRfb3dubmVyX2x2bDEiCiAgICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAoKCiAgICAgICAgYXNzZXRPd25lciAtPiBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFzc2V0X3B1Ymxpc2hpbmdfbW9kdWxlICJQdWJsaXNoZXMgYXNzZXRzIiB7CiAgICAgICAgICAgIHRhZ3MgImFzc2V0X293bm5lcl9sdmwyIgoKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzc2V0T3duZXIgLT4gZGttcF9jZW50cmFsX25vZGUuZHJ1cGFsX2ZyYW1ld29yay5hY2Nlc3NfbWFuYWdlbWVudF9tb2R1bGUgIk1hbmFnZXMgYWNjZXNzIHRvIGFzc2V0cyIgewogICAgICAgICAgICB0YWdzICJhc3NldF9vd25uZXJfbHZsMiIKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGFzc2V0Vmlld2VyIC0+IGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsuZHJ1cGFsX2NvcmUgIlZpZXdzIGFzc2V0cyIgewogICAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGdvIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5kcnVwYWxfZnJhbWV3b3JrLmFjY2Vzc19tYW5hZ2VtZW50X21vZHVsZSAiU2V0cyB1cCBhY2Nlc3MgcnVsZXMsIGFjY2VwdHMvZGVuaWVzIGFjY2VzcyBncmFudHMiIHsKICAgICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAKICAgICAgLy8KICAgICAgLy8gUmVsYXRpb25hbCBkYXRhYmFzZQogICAgICAvLyAKCiAgICAgIGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsgLT4gZGttcF9jZW50cmFsX25vZGUucmVsYXRpb25hbF9kYXRhYmFzZSAiU3RvcmVzIGRhdGEgZm9yIHRoZSBEcnVwYWwgZnJhbWV3b3JrIiB7CiAgICAgICAgICBwcm9wZXJ0aWVzIHsKICAgICAgICAgIH0KICAgICAgfQoKICAgIGRrbXBfY2VudHJhbF9ub2RlLmF1dGhlbnRpY2F0aW9uX2F1dGhvcml6YXRpb24gLT4gZGttcF9jZW50cmFsX25vZGUucmVsYXRpb25hbF9kYXRhYmFzZSAiU3RvcmVzIHVzZXIgZGF0YSIgewogICAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5kcnVwYWxfZnJhbWV3b3JrIC0+IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5yZWxhdGlvbmFsX2RhdGFiYXNlICJTdG9yZXMgZGF0YSBmb3IgdGhlIERydXBhbCBmcmFtZXdvcmsiIHsKICAgICAgICAgIHByb3BlcnRpZXMgewogICAgICAgICAgfQogICAgICB9CgoKCiAgICAKICAgICAgICAKCiAgICB9CgogICAgdmlld3MgewogICAgICAgIAogICAgICAgIHN0eWxlcyB7CiAgICAgICAgICAgCiAgICAgICAgICAgIGVsZW1lbnQgZXh0ZXJuYWwgewogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjQ0NCRTAwCiAgICAgICAgICAgICAgICBjb2xvciAjZmZmZmZmCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCBpbnRlcm5hbCB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICMwMEFDNEQKICAgICAgICAgICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICAgICAgfQogICAgICAgICAgICByZWxhdGlvbnNoaXAgIlZpcnR1YWxSZWxhdGlvbiIgewogICAgICAgICAgICAgICAgdGhpY2tuZXNzIDEKICAgICAgICAgICAgICAgIGNvbG9yICMyMmNjMjIKICAgICAgICAgICAgICAgIHN0eWxlIGRvdHRlZAogICAgICAgICAgICAgICAgcm91dGluZyBDdXJ2ZWQKICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtZW50ICJQZXJzb24iIHsKICAgICAgICAgICAgICAgIHNoYXBlIFBlcnNvbgogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjMTE2OGJkCiAgICAgICAgICAgICAgICBjb2xvciAjZmZmZmZmCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCBDb21wb25lbnQgewogICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGggMwogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjQzlGMUY1CiAgICAgICAgICAgICAgICBzdHJva2UgIzAwMDAwMAogICAgICAgICAgICAgICAgYm9yZGVyIHNvbGlkCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCBDb250YWluZXIgewogICAgICAgICAgICAgICAgc3Ryb2tlICMwMDAwMDAKICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoIDQKICAgICAgICAgICAgICAgIGJhY2tncm91bmQgIzUxQkVENAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIkV4aXN0aW5nIFN5c3RlbSIgewogICAgICAgICAgICAgICAgY29sb3IgI2ZmZmZmZgogICAgICAgICAgICAgICAgYmFja2dyb3VuZCAjOTk5OTk5CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiU29mdHdhcmUgU3lzdGVtIiB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICMxMTY4YmQKICAgICAgICAgICAgICAgIGNvbG9yICNmZmZmZmYKICAgICAgICAgICAgICAgIHN0cm9rZSAjMDAwMDAwCiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aCA0CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRlcm1pbm9sb2d5IHsKICAgICAgICAgICAgcGVyc29uICJVc2VyIgogICAgICAgICAgICBzb2Z0d2FyZVN5c3RlbSAiU29mdHdhcmUgU3lzdGVtIgogICAgICAgICAgICBjb250YWluZXIgIkNvbnRhaW5lciIKICAgICAgICAgICAgY29tcG9uZW50ICJDb21wb25lbnQiCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCAiUmVsYXRpb25zaGlwIgogICAgICAgIH0KCiAgICAgICAgcHJvcGVydGllcyB7CiAgICAgICAgICAgICJzdHJ1Y3R1cml6ci50aW1lem9uZSIgIkV1cm9wZS9SaWdhIgogICAgICAgIH0KCiAgICAgIHN5c3RlbUxhbmRzY2FwZSBTTDAxIHsKICAgICAgICB0aXRsZSAiU3lzdGVtIExhbmRzY2FwZSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICB9CgogICAgc3lzdGVtQ29udGV4dCBka21wX2NlbnRyYWxfbm9kZSB7CiAgICAgICAgdGl0bGUgIkRLTVAgY2VudHJhbCBub2RlIENvbnRleHQgRGlhZ3JhbSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICBhdXRvTGF5b3V0CiAgICB9CgogICAgY29udGFpbmVyIGRrbXBfY2VudHJhbF9ub2RlIHsKICAgICAgICB0aXRsZSAiREtNUCBjZW50cmFsIG5vZGUgQ29udGFpbmVyIERpYWdyYW0iCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgZXhjbHVkZSAiZWxlbWVudC50YWc9PWFzc2V0X293bmVyX2x2bDIiCiAgICAgICAgLy8gYXV0b0xheW91dAogICAgfQoKICAgIHN5c3RlbUNvbnRleHQgZGttcF9kaXN0cmlidXRlZF9ub2RlIHsKICAgICAgICB0aXRsZSAiREtNUCBkZWNlbnRyYWxpc2VkIG5vZGUgQ29udGV4dCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIGF1dG9MYXlvdXQKICAgIH0KCiAgICBjb250YWluZXIgZGttcF9kaXN0cmlidXRlZF9ub2RlIHsKICAgICAgICB0aXRsZSAiREtNUCBkZWNlbnRyYWxpc2VkIG5vZGUgQ29udGFpbmVyIERpYWdyYW0iCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgLy8gYXV0b0xheW91dAogICAgfQoKICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrIHsKICAgICAgICB0aXRsZSAiRHJ1cGFsIENlbnRyYWwgTm9kZSBDb21wb25lbnQgRGlhZ3JhbSBXaXRob3V0IEludGVncmF0aW9uIgogICAgICAgIC8vIGRlc2NyaXB0aW9uICJUaGUgZGlhZ3JhbSBpbGx1c3RyYXRlcyBleHRlbnNpb24gb2YgdGhlIERydXBhbCBjb3JlIHdpdGggY3VzdG9tIiAgICAKICAgICAgICAvLyBpbmNsdWRlICJlbGVtZW50LnRhZz09Y29yZV9leHRlbmQiCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgZXhjbHVkZSAiZWxlbWVudC50YWc9PWludGVncmF0aW9uIgogICAgfQoKICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5kcnVwYWxfZnJhbWV3b3JrIHsKICAgICAgICB0aXRsZSAiRHJ1cGFsIENlbnRyYWwgTm9kZSBDb21wb25lbnQgRGlhZ3JhbSBJbnRlZ3JhdGlvbiBWaWV3IgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIGV4Y2x1ZGUgImVsZW1lbnQudGFnPT1leHRlbmQiCiAgICB9CgogICAgLy8gY29tcG9uZW50IGRrbXBfY2VudHJhbF9ub2RlLmRydXBhbF9mcmFtZXdvcmsgewogICAgLy8gICAgIHRpdGxlICJEcnVwYWwgQ29tcG9uZW50IERpYWdyYW0iCiAgICAvLyAgICAgaW5jbHVkZSAqCiAgICAvLyAgICAgLy8gZXhjbHVkZSBlbGVtZW50LnRhZyE9ImNvcmVfZXh0ZW5kIgogICAgLy8gICAgIGF1dG9MYXlvdXQKICAgIC8vIH0KCiAgICAKCiAgICBjb21wb25lbnQgZGttcF9jZW50cmFsX25vZGUuZXZlbnRfc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiRXZlbnQgU3Vic3lzdGVtIENvbXBvbmVudCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIGF1dG9MYXlvdXQKICAgIH0KCgogICAgY29tcG9uZW50IGRrbXBfY2VudHJhbF9ub2RlLm1ldGFkYXRhX3BhcnNpbmdfc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiTWV0YWRhdGEgUGFyc2luZyBTdWJzeXN0ZW0gQ29tcG9uZW50IERpYWdyYW0iCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgLy8gYXV0b0xheW91dAogICAgfQoKICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2VucmljaG1lbnRfc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiRGF0YSBFbnJpY2htZW50IFN1YnN5c3RlbSBDb21wb25lbnQgRGlhZ3JhbSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICB9CgogICAgY29tcG9uZW50IGRrbXBfY2VudHJhbF9ub2RlLmFzc2V0X3B1Ymxpc2hpbmdfc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiQXNzZXQgUHVibGlzaGluZyBTdWJzeXN0ZW0gQ29tcG9uZW50IERpYWdyYW0iCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgLy8gYXV0b0xheW91dAogICAgfQoKICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5jaGFkYV9tb2RhX3N1YnN5c3RlbSB7CiAgICAgICAgdGl0bGUgIkNIQURBIE1PREEgU3Vic3lzdGVtIENvbXBvbmVudCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIC8vIGF1dG9MYXlvdXQKICAgIH0KCiAgICBjb21wb25lbnQgZGttcF9jZW50cmFsX25vZGUub250b2xvZ3lfc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiT250b2xvZ3kgU3Vic3lzdGVtIENvbXBvbmVudCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIC8vIGF1dG9MYXlvdXQKICAgIH0KICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5sY2Ffc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiTGlmZWN5Y2xlIEFzc2Vzc21lbnQgU3Vic3lzdGVtIENvbXBvbmVudCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIC8vIGF1dG9MYXlvdXQKICAgIH0KCiAKICAgIGNvbXBvbmVudCBka21wX2NlbnRyYWxfbm9kZS5kYXRhX2ludGVncmF0aW9uX3N1YnN5c3RlbSB7CiAgICAgICAgdGl0bGUgIkNlbnRyYWwgTm9kZSBEYXRhIEludGVncmF0aW9uIFN1YnN5c3RlbSBDb21wb25lbnQgRGlhZ3JhbSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICB9CgoKICAgIGNvbXBvbmVudCBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZHJ1cGFsX2ZyYW1ld29yayB7CiAgICAgICAgdGl0bGUgIkRpc3RyaWJ1dGVkIE5vZGUgRHJ1cGFsIENvbXBvbmVudCBEaWFncmFtIgogICAgICAgIGluY2x1ZGUgKgogICAgICAgIC8vIGF1dG9MYXlvdXQKICAgIH0KCiAgICBjb21wb25lbnQgZGttcF9kaXN0cmlidXRlZF9ub2RlLmRhdGFfaW50ZWdyYXRpb25fc3Vic3lzdGVtIHsKICAgICAgICB0aXRsZSAiRGlzdHJpYnV0ZWQgTm9kZSBEYXRhIEludGVncmF0aW9uIFN1YnN5c3RlbSBDb21wb25lbnQgRGlhZ3JhbSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICB9CgogICAgY29tcG9uZW50IGRrbXBfZGlzdHJpYnV0ZWRfbm9kZS5tZXRhZGF0YV9wYXJzaW5nX3N1YnN5c3RlbSB7CiAgICAgICAgdGl0bGUgIkRpc3RyaWJ1dGVkIE5vZGUgTWV0YWRhdGEgUGFyc2luZyBTdWJzeXN0ZW0gQ29tcG9uZW50IERpYWdyYW0iCiAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgLy8gYXV0b0xheW91dAogICAgfQoKICAgIGNvbXBvbmVudCBka21wX2Rpc3RyaWJ1dGVkX25vZGUuZGF0YV9lbnJpY2htZW50X3N1YnN5c3RlbSB7CiAgICAgICAgdGl0bGUgIkRpc3RyaWJ1dGVkIE5vZGUgRGF0YSBFbnJpY2htZW50IFN1YnN5c3RlbSBDb21wb25lbnQgRGlhZ3JhbSIKICAgICAgICBpbmNsdWRlICoKICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICB9CgogICAKCiAgICAgICAgZHluYW1pYyAqIHsKICAgICAgICAgICAgdGl0bGUgIkdyYW50IGFjY2VzcyB0byBhIGRpc3RyaWJ1dGVkIG5vZGUgcmVzb3VyY2UgdmlhIHRlbXBvcmFyeSBzdG9yYWdlIgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHVzZXIgZ3JhbnRzIGFjY2VzcyB0byBhIHJlc291cmNlIHRvIGEgZGlzdHJpYnV0ZWQgbm9kZS4gVGhlIGRpc3RyaWJ1dGVkIG5vZGUgdXBsb2FkcyB0aGUgcmVzb3VyY2UgdG8gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBpbiB0aGUgY2VudHJhbCBub2RlLiIKICAgICAgICAgICAgYXNzZXRPd25lciAtPiBka21wX2NlbnRyYWxfbm9kZSAiU2hhcmVzIHJlc291cmNlIGZyb20gYSBkaXN0cmlidXRlZCBub2RlIgogICAgICAgICAgICBka21wX2NlbnRyYWxfbm9kZSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUgIlJlZ2lzdGVyIGFjY2VzIGdyYW50IGluIHRoZSBkaXN0cmlidXRlZCBub2RlIgogICAgICAgICAgICBkZ28gLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlICJBY2NlcHRzIGFjY2VzcyBncmFudCIKICAgICAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlIC0+IGRrbXBfY2VudHJhbF9ub2RlICJVcGxvYWRzIHJlc291cmNlIHRvIHRlbXBvcmFyeSBzdG9yYWdlIgogICAgICAgICAgICBhc3NldFZpZXdlciAtPiBka21wX2NlbnRyYWxfbm9kZSAiVmlld3MgYXNzZXQgZnJvbSB0ZW1wb3Jhcnkgc3RvcmFnZSIKICAgICAgICAgICAgLy8gYXV0b0xheW91dAogICAgICAgIH0KCiAgICAgICAgZHluYW1pYyAqIHsKICAgICAgICAgICAgdGl0bGUgIkdyYW50IGFjY2VzcyB0byBhIGRpc3RyaWJ1dGVkIG5vZGUgcmVzb3VyY2UgdmlhIHByb3h5IgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiVGhlIHVzZXIgZ3JhbnRzIGFjY2VzcyB0byBhIHJlc291cmNlIHRvIGEgZGlzdHJpYnV0ZWQgbm9kZS4gVGhlIGRpc3RyaWJ1dGVkIG5vZGUgc2hhcmVzIGFjY2VzcyB1cmwgd2l0aCB0aGUgY2VudHJhbCBub2RlLiIKICAgICAgICAgICAgYXNzZXRPd25lciAtPiBka21wX2NlbnRyYWxfbm9kZSAiU2hhcmVzIHJlc291cmNlIGZyb20gYSBkaXN0cmlidXRlZCBub2RlIgogICAgICAgICAgICBka21wX2NlbnRyYWxfbm9kZSAtPiBka21wX2Rpc3RyaWJ1dGVkX25vZGUgIlJlZ2lzdGVyIGFjY2VzIGdyYW50IGluIHRoZSBkaXN0cmlidXRlZCBub2RlIgogICAgICAgICAgICBkZ28gLT4gZGttcF9kaXN0cmlidXRlZF9ub2RlICJBY2NlcHRzIGFjY2VzcyBncmFudCIKICAgICAgICAgICAgZGttcF9kaXN0cmlidXRlZF9ub2RlIC0+IGRrbXBfY2VudHJhbF9ub2RlICJTZW5kcyBhY2Nlc3MgVVJMIgogICAgICAgICAgICBhc3NldFZpZXdlciAtPiBka21wX2NlbnRyYWxfbm9kZSAiVmlld3MgYXNzZXQgdmlhIGNlbnRyYWwgbm9kZSBhcyBhIHByb3h5IgogICAgICAgICAgICAvLyBhdXRvTGF5b3V0CiAgICAgICAgfQogICAgfQoKfQ=="},"views":{"componentViews":[{"containerId":"7","dimensions":{"height":3245,"width":3895},"elements":[{"id":"1","x":1740,"y":2490},{"id":"2","x":1935,"y":175},{"id":"8","x":1630,"y":1422},{"id":"9","x":1170,"y":820},{"id":"11","x":695,"y":815},{"id":"13","x":690,"y":2025},{"id":"15","x":2140,"y":815},{"id":"17","x":2590,"y":1720},{"id":"19","x":695,"y":1115},{"id":"21","x":2590,"y":815},{"id":"23","x":2590,"y":1120},{"id":"25","x":2590,"y":2035},{"id":"27","x":2115,"y":2035},{"id":"29","x":2590,"y":1420},{"id":"31","x":695,"y":1715},{"id":"33","x":1165,"y":2030},{"id":"35","x":1635,"y":2035},{"id":"37","x":1625,"y":820},{"id":"39","x":695,"y":1415},{"id":"46","x":985,"y":450},{"id":"51","x":695,"y":2475},{"id":"55","x":2265,"y":2500},{"id":"59","x":2735,"y":2495},{"id":"63","x":3235,"y":955},{"id":"67","x":3205,"y":2045},{"id":"71","x":200,"y":1405},{"id":"73","x":1160,"y":2475},{"id":"74","x":3205,"y":2500},{"id":"75","x":3230,"y":1535}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-001","order":6,"relationships":[{"id":"10"},{"id":"102"},{"id":"107","vertices":[{"x":3195,"y":1340}]},{"id":"111","vertices":[{"x":540,"y":1250}]},{"id":"118","vertices":[{"x":3200,"y":850}]},{"id":"119","vertices":[{"x":540,"y":1875}]},{"id":"12","vertices":[{"x":1381,"y":1263}]},{"id":"126","vertices":[{"x":845,"y":801},{"x":850,"y":660}]},{"id":"132","vertices":[{"x":420,"y":590}]},{"id":"137","vertices":[{"x":3420,"y":605}]},{"id":"138"},{"id":"14"},{"id":"141","vertices":[{"x":1475,"y":801},{"x":1475,"y":715},{"x":3320,"y":710}]},{"id":"146","vertices":[{"x":3435,"y":1885}]},{"id":"152"},{"id":"157","vertices":[{"x":3360,"y":1455}]},{"id":"16"},{"id":"161"},{"id":"167","vertices":[{"x":430,"y":2625}]},{"id":"169"},{"id":"18","vertices":[{"x":2380,"y":1735}]},{"id":"20"},{"id":"22","vertices":[{"x":2535,"y":1160}]},{"id":"24"},{"id":"246"},{"id":"247"},{"id":"248","vertices":[{"x":2120,"y":435},{"x":2110,"y":1140},{"x":1975,"y":1170}]},{"id":"26"},{"id":"28"},{"id":"30"},{"id":"32"},{"id":"34"},{"id":"36"},{"id":"38"},{"id":"40"}],"title":"Drupal Central Node Component Diagram Without Integration"},{"containerId":"7","dimensions":{"height":5700,"width":4050},"elements":[{"id":"1","x":2545,"y":985},{"id":"2","x":2345,"y":3065},{"id":"8","x":2495,"y":2080},{"id":"9","x":3450,"y":2345},{"id":"11","x":2995,"y":1435},{"id":"13","x":2540,"y":1435},{"id":"15","x":2085,"y":1435},{"id":"17","x":3450,"y":2045},{"id":"19","x":1635,"y":2345},{"id":"21","x":3020,"y":2665},{"id":"23","x":3475,"y":2665},{"id":"25","x":2090,"y":2660},{"id":"27","x":3450,"y":1740},{"id":"29","x":2565,"y":2665},{"id":"31","x":1635,"y":2655},{"id":"33","x":1630,"y":1435},{"id":"35","x":3450,"y":1435},{"id":"37","x":1635,"y":2040},{"id":"39","x":1635,"y":1745},{"id":"42","x":430,"y":1505},{"id":"71","x":950,"y":2895},{"id":"76","x":500,"y":2440},{"id":"80","x":945,"y":2035}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-002","order":7,"relationships":[{"id":"10"},{"id":"104"},{"id":"110"},{"id":"111","vertices":[{"x":1510,"y":2655},{"x":1165,"y":2695}]},{"id":"114","vertices":[{"x":1185,"y":2495}]},{"id":"119","vertices":[{"x":1860,"y":3125},{"x":1505,"y":3115},{"x":1409,"y":3065}]},{"id":"12"},{"id":"123"},{"id":"14"},{"id":"16"},{"id":"18"},{"id":"181","vertices":[{"x":1065,"y":2800}]},{"id":"184","vertices":[{"x":620,"y":2000}]},{"id":"187"},{"id":"197","vertices":[{"x":355,"y":2220},{"x":350,"y":3040}]},{"id":"20"},{"id":"204","vertices":[{"x":770,"y":2300}]},{"id":"22"},{"id":"239"},{"id":"24"},{"id":"246","vertices":[{"x":3665,"y":1180}]},{"id":"247","vertices":[{"x":1855,"y":1195}]},{"id":"248","vertices":[{"x":2560,"y":2585}]},{"id":"26","vertices":[{"x":2410,"y":2615}]},{"id":"28"},{"id":"30"},{"id":"32"},{"id":"34"},{"id":"36"},{"id":"38"},{"id":"40"}],"title":"Drupal Central Node Component Diagram Integration View"},{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"containerId":"42","elements":[{"id":"7","x":0,"y":0},{"id":"43","x":0,"y":0},{"id":"44","x":0,"y":0}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-003","order":8,"relationships":[{"id":"120"},{"id":"122"}],"title":"Event Subsystem Component Diagram"},{"containerId":"46","dimensions":{"height":1821,"width":2220},"elements":[{"id":"7","x":1570,"y":700},{"id":"47","x":914,"y":524},{"id":"48","x":220,"y":525},{"id":"49","x":910,"y":980},{"id":"50","x":220,"y":1195},{"id":"63","x":1565,"y":1210},{"id":"71","x":1570,"y":165}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-004","order":9,"relationships":[{"id":"109"},{"id":"112"},{"id":"127"},{"id":"129"},{"id":"130"},{"id":"131","vertices":[{"x":445,"y":305}]},{"id":"133"},{"id":"135"}],"title":"Metadata Parsing Subsystem Component Diagram"},{"containerId":"51","dimensions":{"height":2516,"width":2091},"elements":[{"id":"7","x":1120,"y":320},{"id":"52","x":461,"y":802},{"id":"53","x":1110,"y":1240},{"id":"54","x":1115,"y":805},{"id":"71","x":455,"y":330}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-005","order":10,"paperSize":"A4_Portrait","relationships":[{"id":"112"},{"id":"162"},{"id":"164"},{"id":"165"},{"id":"166"}],"title":"Data Enrichment Subsystem Component Diagram"},{"containerId":"55","dimensions":{"height":2020,"width":1858},"elements":[{"id":"5","x":1025,"y":85},{"id":"7","x":295,"y":85},{"id":"56","x":629,"y":473},{"id":"57","x":325,"y":890},{"id":"58","x":940,"y":895}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-006","order":11,"paperSize":"A4_Portrait","relationships":[{"id":"170"},{"id":"172"},{"id":"173"},{"id":"174"}],"title":"Asset Publishing Subsystem Component Diagram"},{"containerId":"59","dimensions":{"height":2480,"width":3508},"elements":[{"id":"7","x":1045,"y":430},{"id":"60","x":329,"y":808},{"id":"61","x":1030,"y":810},{"id":"62","x":1690,"y":805}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-007","order":12,"paperSize":"A4_Landscape","relationships":[{"id":"153","vertices":[{"x":555,"y":580}]},{"id":"155"},{"id":"156"}],"title":"CHADA MODA Subsystem Component Diagram"},{"containerId":"63","dimensions":{"height":1336,"width":2299},"elements":[{"id":"7","x":1644,"y":165},{"id":"46","x":234,"y":165},{"id":"64","x":220,"y":708},{"id":"65","x":939,"y":710},{"id":"66","x":1649,"y":705}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-008","order":13,"relationships":[{"id":"108","vertices":[{"x":1174,"y":540}]},{"id":"128"},{"id":"136"},{"id":"142"},{"id":"143"}],"title":"Ontology Subsystem Component Diagram"},{"containerId":"67","dimensions":{"height":1176,"width":2262},"elements":[{"id":"7","x":937,"y":165},{"id":"68","x":220,"y":540},{"id":"69","x":937,"y":540},{"id":"70","x":1592,"y":550}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-009","order":14,"relationships":[{"id":"147","vertices":[{"x":442,"y":325}]},{"id":"149"},{"id":"150"}],"title":"Lifecycle Assessment Subsystem Component Diagram"},{"containerId":"76","dimensions":{"height":3000,"width":1867},"elements":[{"id":"7","x":1368,"y":702},{"id":"42","x":618,"y":937},{"id":"77","x":628,"y":1427},{"id":"78","x":1303,"y":1837},{"id":"79","x":1315,"y":1392},{"id":"80","x":48,"y":702}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-010","order":15,"relationships":[{"id":"105","vertices":[{"x":1173,"y":826}]},{"id":"115","vertices":[{"x":1628,"y":1222}]},{"id":"124","vertices":[{"x":1262,"y":1112}]},{"id":"177"},{"id":"178"},{"id":"180"},{"id":"183"},{"id":"187","vertices":[{"x":478,"y":1127}]},{"id":"202","vertices":[{"x":273,"y":1577}]},{"id":"240"}],"title":"Central Node Data Integration Subsystem Component Diagram"},{"containerId":"82","dimensions":{"height":1216,"width":2330},"elements":[{"id":"3","x":1730,"y":490},{"id":"83","x":220,"y":585},{"id":"84","x":940,"y":590},{"id":"86","x":940,"y":165}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-011","order":16,"relationships":[{"id":"208","vertices":[{"x":790,"y":570}]},{"id":"211","vertices":[{"x":1520,"y":555}]},{"id":"251"},{"id":"85"}],"title":"Distributed Node Drupal Component Diagram"},{"containerId":"86","dimensions":{"height":2654,"width":3875},"elements":[{"id":"6","x":1020,"y":1445},{"id":"82","x":2785,"y":285},{"id":"87","x":2000,"y":730},{"id":"88","x":2775,"y":1370},{"id":"89","x":2705,"y":725},{"id":"90","x":1765,"y":1435},{"id":"91","x":1130,"y":750},{"id":"96","x":1810,"y":280},{"id":"100","x":1055,"y":250}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-012","order":17,"paperSize":"A3_Landscape","relationships":[{"id":"188"},{"id":"191"},{"id":"192"},{"id":"194"},{"id":"199"},{"id":"205","vertices":[{"x":955,"y":840}]},{"id":"207","vertices":[{"x":2645,"y":635}]},{"id":"212"},{"id":"214"},{"id":"215"},{"id":"217"},{"id":"223"},{"id":"225"},{"id":"231"},{"id":"238"}],"title":"Distributed Node Data Integration Subsystem Component Diagram"},{"containerId":"91","dimensions":{"height":2158,"width":3154},"elements":[{"id":"6","x":900,"y":385},{"id":"86","x":1240,"y":905},{"id":"92","x":1835,"y":1375},{"id":"93","x":1835,"y":930},{"id":"94","x":2300,"y":930},{"id":"95","x":1820,"y":395},{"id":"100","x":985,"y":1415}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-013","order":18,"paperSize":"A4_Landscape","relationships":[{"id":"189"},{"id":"196","vertices":[{"x":1635,"y":740}]},{"id":"200"},{"id":"205","vertices":[{"x":1115,"y":1275}]},{"id":"226","vertices":[{"x":1505,"y":1315}]},{"id":"228","vertices":[{"x":2530,"y":1535}]},{"id":"229"},{"id":"230","vertices":[{"x":1630,"y":1555}]},{"id":"232"},{"id":"235"}],"title":"Distributed Node Metadata Parsing Subsystem Component Diagram"},{"containerId":"96","dimensions":{"height":2516,"width":2091},"elements":[{"id":"86","x":1390,"y":750},{"id":"97","x":695,"y":1155},{"id":"98","x":20,"y":720},{"id":"99","x":709,"y":718},{"id":"100","x":1380,"y":1210}],"externalContainerBoundariesVisible":false,"generatedKey":true,"key":"Component-014","order":19,"paperSize":"A4_Portrait","relationships":[{"id":"200"},{"id":"218"},{"id":"220"},{"id":"221"},{"id":"222"}],"title":"Distributed Node Data Enrichment Subsystem Component Diagram"}],"configuration":{"branding":{},"lastSavedView":"Dynamic-001","metadataSymbols":"SquareBrackets","properties":{"structurizr.timezone":"Europe/Riga"},"styles":{"elements":[{"background":"#ccbe00","color":"#ffffff","tag":"external"},{"background":"#00ac4d","color":"#ffffff","tag":"internal"},{"background":"#1168bd","color":"#ffffff","shape":"Person","tag":"Person"},{"background":"#c9f1f5","border":"Solid","stroke":"#000000","strokeWidth":3,"tag":"Component"},{"background":"#51bed4","stroke":"#000000","strokeWidth":4,"tag":"Container"},{"background":"#999999","color":"#ffffff","tag":"Existing System"},{"background":"#1168bd","color":"#ffffff","stroke":"#000000","strokeWidth":4,"tag":"Software System"}],"relationships":[{"color":"#22cc22","routing":"Curved","style":"Dotted","tag":"VirtualRelation","thickness":1}]},"terminology":{"component":"Component","container":"Container","person":"User","relationship":"Relationship","softwareSystem":"Software System"}},"containerViews":[{"dimensions":{"height":3221,"width":3130},"elements":[{"id":"1","x":104,"y":395},{"id":"2","x":99,"y":795},{"id":"4","x":1823,"y":2685},{"id":"5","x":2418,"y":2730},{"id":"7","x":1503,"y":1215},{"id":"41","x":1472,"y":2277},{"id":"42","x":1658,"y":455},{"id":"45","x":562,"y":2277},{"id":"46","x":1018,"y":2277},{"id":"51","x":2252,"y":1407},{"id":"55","x":2208,"y":2265},{"id":"59","x":558,"y":445},{"id":"63","x":1563,"y":1870},{"id":"66","x":2243,"y":1860},{"id":"67","x":562,"y":1367},{"id":"71","x":2403,"y":925},{"id":"72","x":568,"y":1060},{"id":"73","x":558,"y":1970},{"id":"74","x":1018,"y":445},{"id":"75","x":558,"y":1665},{"id":"76","x":2343,"y":455},{"id":"80","x":1378,"y":75}],"externalSoftwareSystemBoundariesVisible":false,"generatedKey":true,"key":"Container-001","order":3,"relationships":[{"id":"103","vertices":[{"x":1218,"y":1650}]},{"id":"105","vertices":[{"x":1947,"y":787}]},{"id":"109"},{"id":"112"},{"id":"116","vertices":[{"x":2388,"y":907}]},{"id":"124","vertices":[{"x":1762,"y":662}]},{"id":"128","vertices":[{"x":1403,"y":1925},{"x":1228,"y":2085}]},{"id":"132","vertices":[{"x":1408,"y":2205},{"x":2762,"y":2197},{"x":2762,"y":1442}]},{"id":"137","vertices":[{"x":1368,"y":2090}]},{"id":"139"},{"id":"144","vertices":[{"x":1997,"y":1687}]},{"id":"148","vertices":[{"x":1188,"y":1400}]},{"id":"154","vertices":[{"x":1138,"y":895}]},{"id":"158","vertices":[{"x":1238,"y":1505},{"x":1148,"y":1590},{"x":1043,"y":1715}]},{"id":"159","vertices":[{"x":1178,"y":1940},{"x":1298,"y":1810}]},{"id":"163"},{"id":"167"},{"id":"171","vertices":[{"x":2938,"y":1360},{"x":2943,"y":2420}]},{"id":"175"},{"id":"182","vertices":[{"x":2113,"y":852}]},{"id":"184"},{"id":"187","vertices":[{"x":1942,"y":272}]},{"id":"197","vertices":[{"x":1813,"y":150},{"x":2828,"y":155},{"x":2828,"y":805},{"x":2671,"y":912}]},{"id":"204","vertices":[{"x":2532,"y":222}]},{"id":"240","vertices":[{"x":1482,"y":397},{"x":1657,"y":1192}]},{"id":"241","vertices":[{"x":443,"y":2885},{"x":443,"y":2115}]},{"id":"243","vertices":[{"x":2148,"y":1990}]},{"id":"244"},{"id":"249","vertices":[{"x":789,"y":995},{"x":1054,"y":1010}]},{"id":"254"},{"id":"255","vertices":[{"x":415,"y":2045},{"x":425,"y":1230}]}],"softwareSystemId":"6","title":"DKMP central node Container Diagram"},{"dimensions":{"height":2470,"width":2655},"elements":[{"id":"3","x":764,"y":1835},{"id":"6","x":1869,"y":165},{"id":"81","x":219,"y":1270},{"id":"82","x":729,"y":1275},{"id":"86","x":794,"y":775},{"id":"91","x":1804,"y":655},{"id":"96","x":1524,"y":990},{"id":"100","x":1984,"y":1420},{"id":"101","x":224,"y":770}],"externalSoftwareSystemBoundariesVisible":false,"generatedKey":true,"key":"Container-002","order":5,"relationships":[{"id":"189","vertices":[{"x":1029,"y":330}]},{"id":"196","vertices":[{"x":1164,"y":555}]},{"id":"200","vertices":[{"x":1549,"y":1415}]},{"id":"205","vertices":[{"x":2354,"y":560},{"x":2364,"y":1325}]},{"id":"209","vertices":[{"x":1134,"y":1200}]},{"id":"213","vertices":[{"x":909,"y":1165}]},{"id":"219"},{"id":"223"},{"id":"227"},{"id":"231"},{"id":"238"},{"id":"252"},{"id":"256"}],"softwareSystemId":"80","title":"DKMP decentralised node Container Diagram"}],"dynamicViews":[{"description":"The user grants access to a resource to a distributed node. The distributed node uploads the resource to a temporary storage in the central node.","dimensions":{"height":1240,"width":1914},"elements":[{"id":"1","x":342,"y":155},{"id":"2","x":774,"y":152},{"id":"3","x":1199,"y":152},{"id":"6","x":314,"y":692},{"id":"80","x":1149,"y":692}],"externalBoundariesVisible":false,"generatedKey":true,"key":"Dynamic-001","order":20,"relationships":[{"description":"Shares resource from a distributed node","id":"245","order":"1","response":false},{"description":"Register acces grant in the distributed node","id":"190","order":"2","response":false,"vertices":[{"x":954,"y":717}]},{"description":"Accepts access grant","id":"253","order":"3","response":false},{"description":"Uploads resource to temporary storage","id":"198","order":"4","response":false,"vertices":[{"x":969,"y":927}]},{"description":"Views asset from temporary storage","id":"250","order":"5","response":false}],"title":"Grant access to a distributed node resource via temporary storage"},{"description":"The user grants access to a resource to a distributed node. The distributed node shares access url with the central node.","dimensions":{"height":1270,"width":1662},"elements":[{"id":"1","x":199,"y":165},{"id":"2","x":631,"y":157},{"id":"3","x":1061,"y":152},{"id":"6","x":215,"y":695},{"id":"80","x":1011,"y":695}],"externalBoundariesVisible":false,"generatedKey":true,"key":"Dynamic-002","order":21,"relationships":[{"description":"Shares resource from a distributed node","id":"245","order":"1","response":false},{"description":"Register acces grant in the distributed node","id":"190","order":"2","response":false,"vertices":[{"x":871,"y":682}]},{"description":"Accepts access grant","id":"253","order":"3","response":false},{"description":"Sends access URL","id":"198","order":"4","response":false,"vertices":[{"x":836,"y":932}]},{"description":"Views asset via central node as a proxy","id":"250","order":"5","response":false}],"title":"Grant access to a distributed node resource via proxy"}],"systemContextViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"6","x":0,"y":0},{"id":"80","x":0,"y":0}],"enterpriseBoundaryVisible":true,"generatedKey":true,"key":"SystemContext-001","order":2,"relationships":[{"id":"176"},{"id":"190"},{"id":"198"},{"id":"242"},{"id":"245"},{"id":"250"}],"softwareSystemId":"6","title":"DKMP central node Context Diagram"},{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"TopBottom","rankSeparation":300,"vertices":false},"elements":[{"id":"3","x":0,"y":0},{"id":"6","x":0,"y":0},{"id":"80","x":0,"y":0}],"enterpriseBoundaryVisible":true,"generatedKey":true,"key":"SystemContext-002","order":4,"relationships":[{"id":"190"},{"id":"198"},{"id":"253"}],"softwareSystemId":"80","title":"DKMP decentralised node Context Diagram"}],"systemLandscapeViews":[{"dimensions":{"height":2116,"width":2241},"elements":[{"id":"1","x":160,"y":695},{"id":"2","x":475,"y":415},{"id":"3","x":1585,"y":405},{"id":"4","x":885,"y":420},{"id":"5","x":170,"y":1120},{"id":"6","x":855,"y":935},{"id":"80","x":1530,"y":950}],"enterpriseBoundaryVisible":true,"key":"SL01","order":1,"paperSize":"A4_Landscape","relationships":[{"id":"176"},{"id":"190","vertices":[{"x":1420,"y":1395}]},{"id":"198","vertices":[{"x":1420,"y":755}]},{"id":"242"},{"id":"245"},{"id":"250"},{"id":"253"}],"title":"System Landscape"}]}}