cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,319 lines • 133 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Odb = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [odb](https://docs.aws.amazon.com/service-authorization/latest/reference/list_odb.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Odb extends shared_1.PolicyStatement {
/**
* Grants permission to register the Amazon Web Services Marketplace token for your Amazon Web Services account to activate your Oracle Database@Amazon Web Services subscription
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_AcceptMarketplaceRegistration.html
*/
toAcceptMarketplaceRegistration() {
return this.to('AcceptMarketplaceRegistration');
}
/**
* Grants permission to associate an AWS Identity and Access Management (IAM) service role with a specified resource to enable AWS service integration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_AssociateIamRoleToResource.html
*/
toAssociateIamRoleToResource() {
return this.to('AssociateIamRoleToResource');
}
/**
* Grants permission to associate virtual machines to a specified Exadb VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_AssociateVirtualMachinesToExadbVmCluster.html
*/
toAssociateVirtualMachinesToExadbVmCluster() {
return this.to('AssociateVirtualMachinesToExadbVmCluster');
}
/**
* Grants permission to create an Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateAutonomousDatabase.html
*/
toCreateAutonomousDatabase() {
return this.to('CreateAutonomousDatabase');
}
/**
* Grants permission to create a backup of the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateAutonomousDatabaseBackup.html
*/
toCreateAutonomousDatabaseBackup() {
return this.to('CreateAutonomousDatabaseBackup');
}
/**
* Grants permission to create a wallet for the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateAutonomousDatabaseWallet.html
*/
toCreateAutonomousDatabaseWallet() {
return this.to('CreateAutonomousDatabaseWallet');
}
/**
* Grants permission to create an Autonomous VM cluster in the specified Exadata infrastructure
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateCloudAutonomousVmCluster.html
*/
toCreateCloudAutonomousVmCluster() {
return this.to('CreateCloudAutonomousVmCluster');
}
/**
* Grants permission to create an Exadata infrastructure
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateCloudExadataInfrastructure.html
*/
toCreateCloudExadataInfrastructure() {
return this.to('CreateCloudExadataInfrastructure');
}
/**
* Grants permission to create a VM cluster on the specified Exadata infrastructure
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateCloudVmCluster.html
*/
toCreateCloudVmCluster() {
return this.to('CreateCloudVmCluster');
}
/**
* Grants permission to create an Exadb VM cluster in the specified Exascale DB storage vault
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateExadbVmCluster.html
*/
toCreateExadbVmCluster() {
return this.to('CreateExadbVmCluster');
}
/**
* Grants permission to create an Exascale DB storage vault
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateExascaleDbStorageVault.html
*/
toCreateExascaleDbStorageVault() {
return this.to('CreateExascaleDbStorageVault');
}
/**
* Grants permission to create an ODB network
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateOdbNetwork.html
*/
toCreateOdbNetwork() {
return this.to('CreateOdbNetwork');
}
/**
* Grants permission to create an ODB Peering Connection
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CreateOdbPeeringConnection.html
*/
toCreateOdbPeeringConnection() {
return this.to('CreateOdbPeeringConnection');
}
/**
* Grants permission to delete the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteAutonomousDatabase.html
*/
toDeleteAutonomousDatabase() {
return this.to('DeleteAutonomousDatabase');
}
/**
* Grants permission to delete the specified Autonomous Database backup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteAutonomousDatabaseBackup.html
*/
toDeleteAutonomousDatabaseBackup() {
return this.to('DeleteAutonomousDatabaseBackup');
}
/**
* Grants permission to Deletes an Autonomous VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteCloudAutonomousVmCluster.html
*/
toDeleteCloudAutonomousVmCluster() {
return this.to('DeleteCloudAutonomousVmCluster');
}
/**
* Grants permission to delete a specified Exadata infrastructure. Before you use this operation, make sure to delete all of the VM clusters that are hosted on this Exadata infrastructure
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteCloudExadataInfrastructure.html
*/
toDeleteCloudExadataInfrastructure() {
return this.to('DeleteCloudExadataInfrastructure');
}
/**
* Grants permission to delete a specified VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteCloudVmCluster.html
*/
toDeleteCloudVmCluster() {
return this.to('DeleteCloudVmCluster');
}
/**
* Grants permission to delete a specified Exadb VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteExadbVmCluster.html
*/
toDeleteExadbVmCluster() {
return this.to('DeleteExadbVmCluster');
}
/**
* Grants permission to delete a specified Exascale DB storage vault
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteExascaleDbStorageVault.html
*/
toDeleteExascaleDbStorageVault() {
return this.to('DeleteExascaleDbStorageVault');
}
/**
* Grants permission to delete the specified ODB network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteOdbNetwork.html
*/
toDeleteOdbNetwork() {
return this.to('DeleteOdbNetwork');
}
/**
* Grants permission to delete the specified ODB Peering Connection. When you delete an ODB peering connection, the underlying VPC peering connection is also deleted
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DeleteOdbPeeringConnection.html
*/
toDeleteOdbPeeringConnection() {
return this.to('DeleteOdbPeeringConnection');
}
/**
* Grants permission to disassociate an AWS Identity and Access Management (IAM) service role from a specified resource to disable AWS service integration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DisassociateIamRoleFromResource.html
*/
toDisassociateIamRoleFromResource() {
return this.to('DisassociateIamRoleFromResource');
}
/**
* Grants permission to disassociate virtual machines from a specified Exadb VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DisassociateVirtualMachinesFromExadbVmCluster.html
*/
toDisassociateVirtualMachinesFromExadbVmCluster() {
return this.to('DisassociateVirtualMachinesFromExadbVmCluster');
}
/**
* Grants permission to fail over the specified Autonomous Database to a standby peer database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_FailoverAutonomousDatabase.html
*/
toFailoverAutonomousDatabase() {
return this.to('FailoverAutonomousDatabase');
}
/**
* Grants permission to get information about a specific Autonomous Database
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetAutonomousDatabase.html
*/
toGetAutonomousDatabase() {
return this.to('GetAutonomousDatabase');
}
/**
* Grants permission to get information about a specific Autonomous Database backup
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetAutonomousDatabaseBackup.html
*/
toGetAutonomousDatabaseBackup() {
return this.to('GetAutonomousDatabaseBackup');
}
/**
* Grants permission to get the wallet details for the specified Autonomous Database
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetAutonomousDatabaseWalletDetails.html
*/
toGetAutonomousDatabaseWalletDetails() {
return this.to('GetAutonomousDatabaseWalletDetails');
}
/**
* Grants permission to get information about a specific Autonomous VM cluster
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetCloudAutonomousVmCluster.html
*/
toGetCloudAutonomousVmCluster() {
return this.to('GetCloudAutonomousVmCluster');
}
/**
* Grants permission to get information about the specified Exadata infrastructure
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetCloudExadataInfrastructure.html
*/
toGetCloudExadataInfrastructure() {
return this.to('GetCloudExadataInfrastructure');
}
/**
* Grants permission to retrieve information about unallocated resources in a specified Cloud Exadata Infrastructure
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetCloudExadataInfrastructureUnallocatedResources.html
*/
toGetCloudExadataInfrastructureUnallocatedResources() {
return this.to('GetCloudExadataInfrastructureUnallocatedResources');
}
/**
* Grants permission to get information about the specified VM cluster
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetCloudVmCluster.html
*/
toGetCloudVmCluster() {
return this.to('GetCloudVmCluster');
}
/**
* Grants permission to get information about the specified DB node
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetDbNode.html
*/
toGetDbNode() {
return this.to('GetDbNode');
}
/**
* Grants permission to get information about the specified database server
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetDbServer.html
*/
toGetDbServer() {
return this.to('GetDbServer');
}
/**
* Grants permission to get information about a specified Exadb VM cluster
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetExadbVmCluster.html
*/
toGetExadbVmCluster() {
return this.to('GetExadbVmCluster');
}
/**
* Grants permission to get information about a specified Exascale DB storage vault
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetExascaleDbStorageVault.html
*/
toGetExascaleDbStorageVault() {
return this.to('GetExascaleDbStorageVault');
}
/**
* Grants permission to get the tenancy activation link and onboarding status for your Amazon Web Services account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetOciOnboardingStatus.html
*/
toGetOciOnboardingStatus() {
return this.to('GetOciOnboardingStatus');
}
/**
* Grants permission to get information about the specified ODB network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetOdbNetwork.html
*/
toGetOdbNetwork() {
return this.to('GetOdbNetwork');
}
/**
* Grants permission to get information about the specified ODB Peering connection
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_GetOdbPeeringConnection.html
*/
toGetOdbPeeringConnection() {
return this.to('GetOdbPeeringConnection');
}
/**
* Grants permission to initialize the ODB service for the first time in an account
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_InitializeService.html
*/
toInitializeService() {
return this.to('InitializeService');
}
/**
* Grants permission to list information about the backups of the specified Autonomous Database
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabaseBackups.html
*/
toListAutonomousDatabaseBackups() {
return this.to('ListAutonomousDatabaseBackups');
}
/**
* Grants permission to list information about the character sets that are available for Autonomous Databases
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabaseCharacterSets.html
*/
toListAutonomousDatabaseCharacterSets() {
return this.to('ListAutonomousDatabaseCharacterSets');
}
/**
* Grants permission to list all clones of the specified Autonomous Database
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabaseClones.html
*/
toListAutonomousDatabaseClones() {
return this.to('ListAutonomousDatabaseClones');
}
/**
* Grants permission to list all peer databases of the specified Autonomous Database
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabasePeers.html
*/
toListAutonomousDatabasePeers() {
return this.to('ListAutonomousDatabasePeers');
}
/**
* Grants permission to list information about the Oracle Database software versions that are available for Autonomous Databases
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabaseVersions.html
*/
toListAutonomousDatabaseVersions() {
return this.to('ListAutonomousDatabaseVersions');
}
/**
* Grants permission to list information about the Autonomous Databases owned by your Amazon Web Services account
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousDatabases.html
*/
toListAutonomousDatabases() {
return this.to('ListAutonomousDatabases');
}
/**
* Grants permission to list all Autonomous VMs in an Autonomous VM cluster
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListAutonomousVirtualMachines.html
*/
toListAutonomousVirtualMachines() {
return this.to('ListAutonomousVirtualMachines');
}
/**
* Grants permission to list all Autonomous VM clusters in a specified Cloud Exadata infrastructure
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListCloudAutonomousVmClusters.html
*/
toListCloudAutonomousVmClusters() {
return this.to('ListCloudAutonomousVmClusters');
}
/**
* Grants permission to list information about the Exadata infrastructures owned by your Amazon Web Services account
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListCloudExadataInfrastructures.html
*/
toListCloudExadataInfrastructures() {
return this.to('ListCloudExadataInfrastructures');
}
/**
* Grants permission to list information about the VM clusters owned by your Amazon Web Services account or only the ones on the specified Exadata infrastructure
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListCloudVmClusters.html
*/
toListCloudVmClusters() {
return this.to('ListCloudVmClusters');
}
/**
* Grants permission to list information about the DB nodes for the specified VM cluster
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListDbNodes.html
*/
toListDbNodes() {
return this.to('ListDbNodes');
}
/**
* Grants permission to list information about the database servers that belong to the specified Exadata infrastructure
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListDbServers.html
*/
toListDbServers() {
return this.to('ListDbServers');
}
/**
* Grants permission to list information about the shapes that are available for an Exadata infrastructure
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListDbSystemShapes.html
*/
toListDbSystemShapes() {
return this.to('ListDbSystemShapes');
}
/**
* Grants permission to list information about the Exadb VM clusters owned by your Amazon Web Services account or only the ones in the specified Exascale DB storage vault
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListExadbVmClusters.html
*/
toListExadbVmClusters() {
return this.to('ListExadbVmClusters');
}
/**
* Grants permission to list information about the Exascale DB storage vaults owned by your Amazon Web Services account
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListExascaleDbStorageVaults.html
*/
toListExascaleDbStorageVaults() {
return this.to('ListExascaleDbStorageVaults');
}
/**
* Grants permission to list information about the flex components that are available for a DB system shape
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListFlexComponents.html
*/
toListFlexComponents() {
return this.to('ListFlexComponents');
}
/**
* Grants permission to list information about the minor versions of Oracle Grid Infrastructure (GI) software that are available for a VM cluster for the specified GI version and shape
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListGiMinorVersions.html
*/
toListGiMinorVersions() {
return this.to('ListGiMinorVersions');
}
/**
* Grants permission to list information about Oracle Grid Infrastructure (GI) software versions that are available for a VM cluster for the specified shape
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListGiVersions.html
*/
toListGiVersions() {
return this.to('ListGiVersions');
}
/**
* Grants permission to list information about the ODB networks owned by your Amazon Web Services account
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListOdbNetworks.html
*/
toListOdbNetworks() {
return this.to('ListOdbNetworks');
}
/**
* Grants permission to list all ODB peering connections or those associated with a specific ODB network
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListOdbPeeringConnections.html
*/
toListOdbPeeringConnections() {
return this.to('ListOdbPeeringConnections');
}
/**
* Grants permission to list information about the system versions that are available for a VM cluster for the specified giVersion and shape
*
* Access Level: List
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListSystemVersions.html
*/
toListSystemVersions() {
return this.to('ListSystemVersions');
}
/**
* Grants permission to list information about the tags applied to this resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to reboot the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_RebootAutonomousDatabase.html
*/
toRebootAutonomousDatabase() {
return this.to('RebootAutonomousDatabase');
}
/**
* Grants permission to reboot the specified DB node in a VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_RebootDbNode.html
*/
toRebootDbNode() {
return this.to('RebootDbNode');
}
/**
* Grants permission to restore the specified Autonomous Database to a point in time
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_RestoreAutonomousDatabase.html
*/
toRestoreAutonomousDatabase() {
return this.to('RestoreAutonomousDatabase');
}
/**
* Grants permission to shrink the storage of the specified Autonomous Database to reclaim unused space
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ShrinkAutonomousDatabase.html
*/
toShrinkAutonomousDatabase() {
return this.to('ShrinkAutonomousDatabase');
}
/**
* Grants permission to start the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_StartAutonomousDatabase.html
*/
toStartAutonomousDatabase() {
return this.to('StartAutonomousDatabase');
}
/**
* Grants permission to start the specified DB node in a VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_StartDbNode.html
*/
toStartDbNode() {
return this.to('StartDbNode');
}
/**
* Grants permission to stop the specified Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_StopAutonomousDatabase.html
*/
toStopAutonomousDatabase() {
return this.to('StopAutonomousDatabase');
}
/**
* Grants permission to stop the specified DB node in a VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_StopDbNode.html
*/
toStopDbNode() {
return this.to('StopDbNode');
}
/**
* Grants permission to switch over the specified Autonomous Database to a standby peer database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_SwitchoverAutonomousDatabase.html
*/
toSwitchoverAutonomousDatabase() {
return this.to('SwitchoverAutonomousDatabase');
}
/**
* Grants permission to apply tags to the specified resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove tags from the specified resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update the properties of an Autonomous Database
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateAutonomousDatabase.html
*/
toUpdateAutonomousDatabase() {
return this.to('UpdateAutonomousDatabase');
}
/**
* Grants permission to update the properties of an Autonomous Database backup
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateAutonomousDatabaseBackup.html
*/
toUpdateAutonomousDatabaseBackup() {
return this.to('UpdateAutonomousDatabaseBackup');
}
/**
* Grants permission to update the properties of an Exadata infrastructure resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateCloudExadataInfrastructure.html
*/
toUpdateCloudExadataInfrastructure() {
return this.to('UpdateCloudExadataInfrastructure');
}
/**
* Grants permission to update properties of a specified Exadb VM cluster
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateExadbVmCluster.html
*/
toUpdateExadbVmCluster() {
return this.to('UpdateExadbVmCluster');
}
/**
* Grants permission to update properties of a specified Exascale DB storage vault
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateExascaleDbStorageVault.html
*/
toUpdateExascaleDbStorageVault() {
return this.to('UpdateExascaleDbStorageVault');
}
/**
* Grants permission to update properties of a specified ODB network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateOdbNetwork.html
*/
toUpdateOdbNetwork() {
return this.to('UpdateOdbNetwork');
}
/**
* Grants permission to update properties of a specified ODB Peering Connection
*
* Access Level: Write
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_UpdateOdbPeeringConnection.html
*/
toUpdateOdbPeeringConnection() {
return this.to('UpdateOdbPeeringConnection');
}
/**
* Grants permission to create a DB Node
*
* Access Level: Write
*/
toCreateDbNode() {
return this.to('CreateDbNode');
}
/**
* Grants permission to create an ODB Grant Share
*
* Access Level: Write
*/
toCreateGrantShare() {
return this.to('CreateGrantShare');
}
/**
* Grants permission to create an Outbound Integration
*
* Access Level: Write
*/
toCreateOutboundIntegration() {
return this.to('CreateOutboundIntegration');
}
/**
* Grants permission to delete a DB Node
*
* Access Level: Write
*/
toDeleteDbNode() {
return this.to('DeleteDbNode');
}
/**
* Grants permission to delete an ODB Grant Share
*
* Access Level: Write
*/
toDeleteGrantShare() {
return this.to('DeleteGrantShare');
}
/**
* Grants permission to delete a resource policy
*
* Access Level: Write
*/
toDeleteResourcePolicy() {
return this.to('DeleteResourcePolicy');
}
/**
* Grants permission to get a resource policy
*
* Access Level: Read
*/
toGetResourcePolicy() {
return this.to('GetResourcePolicy');
}
/**
* Grants permission to update a resource policy
*
* Access Level: Write
*/
toPutResourcePolicy() {
return this.to('PutResourcePolicy');
}
/**
* Grants permission to update an ODB Grant Share
*
* Access Level: Write
*/
toUpdateGrantShare() {
return this.to('UpdateGrantShare');
}
/**
* Grants permission to update an Outbound Integration
*
* Access Level: Write
*/
toUpdateOutboundIntegration() {
return this.to('UpdateOutboundIntegration');
}
/**
* Adds a resource of type autonomous-database to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_AutonomousDatabase.html
*
* @param autonomousDatabaseId - Identifier for the autonomousDatabaseId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onAutonomousDatabase(autonomousDatabaseId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:autonomous-database/${autonomousDatabaseId}`);
}
/**
* Adds a resource of type autonomous-database-backup to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_AutonomousDatabaseBackup.html
*
* @param autonomousDatabaseBackupId - Identifier for the autonomousDatabaseBackupId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onAutonomousDatabaseBackup(autonomousDatabaseBackupId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:autonomous-database-backup/${autonomousDatabaseBackupId}`);
}
/**
* Adds a resource of type cloud-autonomous-vm-cluster to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CloudAutonomousVmCluster.html
*
* @param cloudAutonomousVmClusterId - Identifier for the cloudAutonomousVmClusterId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onCloudAutonomousVmCluster(cloudAutonomousVmClusterId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:cloud-autonomous-vm-cluster/${cloudAutonomousVmClusterId}`);
}
/**
* Adds a resource of type cloud-exadata-infrastructure to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CloudExadataInfrastructure.html
*
* @param cloudExadataInfrastructureId - Identifier for the cloudExadataInfrastructureId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onCloudExadataInfrastructure(cloudExadataInfrastructureId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:cloud-exadata-infrastructure/${cloudExadataInfrastructureId}`);
}
/**
* Adds a resource of type cloud-vm-cluster to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_CloudVmCluster.html
*
* @param cloudVmClusterId - Identifier for the cloudVmClusterId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onCloudVmCluster(cloudVmClusterId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:cloud-vm-cluster/${cloudVmClusterId}`);
}
/**
* Adds a resource of type db-node to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_DbNode.html
*
* @param dbNodeId - Identifier for the dbNodeId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onDbNode(dbNodeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:db-node/${dbNodeId}`);
}
/**
* Adds a resource of type exadb-vm-cluster to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ExadbVmCluster.html
*
* @param exadbVmClusterId - Identifier for the exadbVmClusterId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onExadbVmCluster(exadbVmClusterId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:exadb-vm-cluster/${exadbVmClusterId}`);
}
/**
* Adds a resource of type exascale-db-storage-vault to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_ExascaleDbStorageVault.html
*
* @param exascaleDbStorageVaultId - Identifier for the exascaleDbStorageVaultId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onExascaleDbStorageVault(exascaleDbStorageVaultId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:exascale-db-storage-vault/${exascaleDbStorageVaultId}`);
}
/**
* Adds a resource of type odb-network to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_OdbNetwork.html
*
* @param odbNetworkId - Identifier for the odbNetworkId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onOdbNetwork(odbNetworkId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:odb-network/${odbNetworkId}`);
}
/**
* Adds a resource of type odb-peering-connection to the statement
*
* https://docs.aws.amazon.com/odb/latest/APIReference/API_OdbPeeringConnection.html
*
* @param odbPeeringConnectionId - Identifier for the odbPeeringConnectionId.
* @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
* @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
* @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
*
* Possible conditions:
* - .ifAwsResourceTag()
*/
onOdbPeeringConnection(odbPeeringConnectionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:odb:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:odb-peering-connection/${odbPeeringConnectionId}`);
}
/**
* Filters access by a tag key and value pair that is allowed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateAutonomousDatabase()
* - .toCreateAutonomousDatabaseBackup()
* - .toCreateCloudAutonomousVmCluster()
* - .toCreateCloudExadataInfrastructure()
* - .toCreateCloudVmCluster()
* - .toCreateExadbVmCluster()
* - .toCreateExascaleDbStorageVault()
* - .toCreateOdbNetwork()
* - .toCreateOdbPeeringConnection()
* - .toTagResource()
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsRequestTag(tagKey, value, operator) {
return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by a tag key and value pair of a resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toAssociateIamRoleToResource()
* - .toAssociateVirtualMachinesToExadbVmCluster()
* - .toCreateAutonomousDatabase()
* - .toCreateAutonomousDatabaseBackup()
* - .toCreateAutonomousDatabaseWallet()
* - .toCreateCloudAutonomousVmCluster()
* - .toCreateCloudVmCluster()
* - .toCreateExadbVmCluster()
* - .toCreateOdbPeeringConnection()
* - .toDeleteAutonomousDatabase()
* - .toDeleteAutonomousDatabaseBackup()
* - .toDeleteCloudAutonomousVmCluster()
* - .toDeleteCloudExadataInfrastructure()
* - .toDeleteCloudVmCluster()
* - .toDeleteExadbVmCluster()
* - .toDeleteExascaleDbStorageVault()
* - .toDeleteOdbNetwork()
* - .toDeleteOdbPeeringConnection()
* - .toDisassociateIamRoleFromResource()
* - .toDisassociateVirtualMachinesFromExadbVmCluster()
* - .toFailoverAutonomousDatabase()
* - .toGetAutonomousDatabase()
* - .toGetAutonomousDatabaseBackup()
* - .toGetAutonomousDatabaseWalletDetails()
* - .toGetCloudAutonomousVmCluster()
* - .toGetCloudExadataInfrastructure()
* - .toGetCloudExadataInfrastructureUnallocatedResources()
* - .toGetCloudVmCluster()
* - .toGetDbNode()
* - .toGetDbServer()
* - .toGetExadbVmCluster()
* - .toGetExascaleDbStorageVault()
* - .toGetOdbNetwork()
* - .toGetOdbPeeringConnection()
* - .toListAutonomousDatabaseBackups()
* - .toListAutonomousDatabaseClones()
* - .toListAutonomousDatabasePeers()
* - .toListAutonomousVirtualMachines()
* - .toListCloudAutonomousVmClusters()
* - .toListCloudVmClusters()
* - .toListDbNodes()
* - .toListDbServers()
* - .toListExadbVmClusters()
* - .toListOdbPeeringConnections()
* - .toListTagsForResource()
* - .toRebootAutonomousDatabase()
* - .toRebootDbNode()
* - .toRestoreAutonomousDatabase()
* - .toShrinkAutonomousDatabase()
* - .toStartAutonomousDatabase()
* - .toStartDbNode()
* - .toStopAutonomousDatabase()
* - .toStopDbNode()
* - .toSwitchoverAutonomousDatabase()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateAutonomousDatabase()
* - .toUpdateAutonomousDatabaseBackup()
* - .toUpdateCloudExadataInfrastructure()
* - .toUpdateExadbVmCluster()
* - .toUpdateExascaleDbStorageVault()
* - .toUpdateOdbNetwork()
* - .toUpdateOdbPeeringConnection()
* - .toCreateDbNode()
* - .toCreateOutboundIntegration()
* - .toDeleteDbNode()
* - .toDeleteResourcePolicy()
* - .toGetResourcePolicy()
* - .toPutResourcePolicy()
* - .toUpdateOutboundIntegration()
*
* Applies to resource types:
* - autonomous-database
* - autonomous-database-backup
* - cloud-autonomous-vm-cluster
* - cloud-exadata-infrastructure
* - cloud-vm-cluster
* - db-node
* - exadb-vm-cluster
* - exascale-db-storage-vault
* - odb-network
* - odb-peering-connection
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by a list of tag keys that are allowed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateAutonomousDatabase()
* - .toCreateAutonomousDatabaseBackup()
* - .toCreateCloudAutonomousVmCluster()
* - .toCreateCloudExadataInfrastructure()
* - .toCreateCloudVmCluster()
* - .toCreateExadbVmCluster()
* - .toCreateExascaleDbStorageVault()
* - .toCreateOdbNetwork()
* - .toCreateOdbPeeringConnection()
* - .toTagResource()
* - .toUntagResource()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [odb](https://docs.aws.amazon.com/service-authorization/latest/reference/list_odb.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'odb';
this.accessLevelList = {
Write: [
'AcceptMarketplaceRegistration',
'AssociateIamRoleToResource',
'AssociateVirtualMachinesToExadbVmCluster',
'CreateAutonomousDatabase',
'CreateAutonomousDatabaseBackup',
'CreateAutonomousDatabaseWallet',
'CreateCloudAutonomousVmCluster',
'CreateCloudExadataInfrastructure',
'CreateCloudVmCluster',
'CreateExadbVmCluster',
'CreateExascaleDbStorageVault',
'CreateOdbNetwork',
'CreateOdbPeeringConnection',
'DeleteAutonomousDatabase',
'DeleteAutonomousDatabaseBackup',
'DeleteCloudAutonomousVmCluster',
'DeleteCloudExadataInfrastructure',
'DeleteCloudVmCluster',
'DeleteExadbVmCluster',
'DeleteExascaleDbStorageVault',
'DeleteOdbNetwork',
'DeleteOdbPeeringConnection',
'DisassociateIamRoleFromResource',
'DisassociateVirtualMachinesFromExadbVmCluster',
'FailoverAutonomousDatabase',
'InitializeService',
'RebootAutonomousDatabase',
'RebootDbNode',
'RestoreAutonomousDatabase',
'ShrinkAutonomousDatabase',
'StartAutonomousDatabase',
'StartDbNode',
'StopAutonomousDatabase',
'StopDbNode',
'SwitchoverAutonomousDatabase',
'TagResource',
'UntagResource',
'UpdateAutonomousDatabase',
'UpdateAutonomousDatabaseBackup',
'UpdateCloudExadataInfrastructure',
'UpdateExadbVmCluster',
'UpdateExascaleDbStorageVault',
'UpdateOdbNetwork',
'UpdateOdbPeeringConnection',
'CreateDbNode',
'CreateGrantShare',
'CreateOutboundIntegration',
'DeleteDbNode',
'DeleteGrantShare',
'DeleteResourcePolicy',
'PutResourcePolicy',
'UpdateGrantShare',
'UpdateOutboundIntegration'
],
Read: [
'GetAutonomousDatabase',
'GetAutonomousDatabaseBackup',
'GetAutonomousDatabaseWalletDetails',
'GetCloudAutonomousVmCluster',
'GetCloudExadataInfrastructure',
'GetCloudExadataInfrastructureUnallocatedResources',
'GetCloudVmCluster',
'GetDbNode',
'GetDbServer',
'GetExadbVmCluster',
'GetExascaleDbStorageVault',
'GetOciOnboardingStatus',
'GetOdbNetwork',
'GetOdbPeeringConnection',
'ListTagsForResource',
'GetResourcePolicy'
],
List: [
'ListAutonomousDatabaseBackups',
'ListAutonomousDatabaseCharacterSets',
'ListAutonomousDatabaseClones',
'ListAutonomousDatabasePeers',
'ListAutonomousDatabaseVersions',
'ListAutonomousDatabases',
'ListAutonomousVirtualMachines',
'ListCloudAutonomousVmClusters',
'ListCloudExadataInfrastructures',
'ListCloudVmClusters',
'ListDbNodes',
'ListDbServers',
'ListDbSystemShapes',
'ListExadbVmClusters',
'ListExascaleDbStorageVaults',
'ListFlexComponents',
'ListGiMinorVersions',
'ListGiVersions',
'ListOdbNetworks',
'ListOdbPeeringConnections',
'ListSystemVersions'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Odb = Odb;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2RiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib2RiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsd0JBQWU7SUFHdEM7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDBDQUEwQztRQUMvQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdDQUFnQztRQUNyQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0NBQWdDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksa0NBQWtDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFz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QjtnQkFDN0IsK0JBQStCO2dCQUMvQixtREFBbUQ7Z0JBQ25ELG1CQUFtQjtnQkFDbkIsV0FBVztnQkFDWCxhQUFhO2dCQUNiLG1CQUFtQjtnQkFDbkIsMkJBQTJCO2dCQUMzQix3QkFBd0I7Z0JBQ3hCLGVBQWU7Z0JBQ2YseUJBQXlCO2dCQUN6QixxQkFBcUI7Z0JBQ3JCLG1CQUFtQjthQUNwQjtZQUNELElBQUksRUFBRTtnQkFDSiwrQkFBK0I7Z0JBQy9CLHFDQUFxQztnQkFDckMsOEJBQThCO2dCQUM5Qiw2QkFBNkI7Z0JBQzdCLGdDQUFnQztnQkFDaEMseUJBQXlCO2dCQUN6QiwrQkFBK0I7Z0JBQy9CLCtCQUErQjtnQkFDL0IsaUNBQWlDO2dCQUNqQyxxQkFBcUI7Z0JBQ3JCLGFBQWE7Z0JBQ2IsZUFBZTtnQkFDZixvQkFBb0I7Z0JBQ3BCLHFCQUFxQjtnQkFDckIsNkJBQTZCO2dCQUM3QixvQkFBb0I7Z0JBQ3BCLHFCQUFxQjtnQkFDckIsZ0JBQWdCO2dCQUNoQixpQkFBaUI7Z0JBQ2pCLDJCQUEyQjtnQkFDM0Isb0JBQW9CO2FBQ3JCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUFxVUYsQ0FBQztDQUNGO0FBcDRDRCxrQkFvNENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtvZGJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X29kYi5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE9kYiBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ29kYic7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIHRoZSBBbWF6b24gV2ViIFNlcnZpY2VzIE1hcmtldHBsYWNlIHRva2VuIGZvciB5b3VyIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudCB0byBhY3RpdmF0ZSB5b3VyIE9yYWNsZSBEYXRhYmFzZUBBbWF6b24gV2ViIFNlcnZpY2VzIHN1YnNjcmlwdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQWNjZXB0TWFya2V0cGxhY2VSZWdpc3RyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWNjZXB0TWFya2V0cGxhY2VSZWdpc3RyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FjY2VwdE1hcmtldHBsYWNlUmVnaXN0cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIGFuIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgKElBTSkgc2VydmljZSByb2xlIHdpdGggYSBzcGVjaWZpZWQgcmVzb3VyY2UgdG8gZW5hYmxlIEFXUyBzZXJ2aWNlIGludGVncmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVJYW1Sb2xlVG9SZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVJYW1Sb2xlVG9SZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlSWFtUm9sZVRvUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgdmlydHVhbCBtYWNoaW5lcyB0byBhIHNwZWNpZmllZCBFeGFkYiBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVWaXJ0dWFsTWFjaGluZXNUb0V4YWRiVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVZpcnR1YWxNYWNoaW5lc1RvRXhhZGJWbUNsdXN0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVZpcnR1YWxNYWNoaW5lc1RvRXhhZGJWbUNsdXN0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gQXV0b25vbW91cyBEYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgYmFja3VwIG9mIHRoZSBzcGVjaWZpZWQgQXV0b25vbW91cyBEYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlQmFja3VwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlQmFja3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgd2FsbGV0IGZvciB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZVdhbGxldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBdXRvbm9tb3VzRGF0YWJhc2VXYWxsZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZVdhbGxldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBBdXRvbm9tb3VzIFZNIGNsdXN0ZXIgaW4gdGhlIHNwZWNpZmllZCBFeGFkYXRhIGluZnJhc3RydWN0dXJlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gRXhhZGF0YSBpbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgVk0gY2x1c3RlciBvbiB0aGUgc3BlY2lmaWVkIEV4YWRhdGEgaW5mcmFzdHJ1Y3R1cmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUNsb3VkVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUNsb3VkVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDbG91ZFZtQ2x1c3RlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBFeGFkYiBWTSBjbHVzdGVyIGluIHRoZSBzcGVjaWZpZWQgRXhhc2NhbGUgREIgc3RvcmFnZSB2YXVsdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRXhhZGJWbUNsdXN0ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhhZGJWbUNsdXN0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUV4YWRiVm1DbHVzdGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIEV4YXNjYWxlIERCIHN0b3JhZ2UgdmF1bHRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUV4YXNjYWxlRGJTdG9yYWdlVmF1bHQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBPREIgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlT2RiTmV0d29yay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPZGJOZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPZGJOZXR3b3JrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIE9EQiBQZWVyaW5nIENvbm5lY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZU9kYlBlZXJpbmdDb25uZWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU9kYlBlZXJpbmdDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPZGJQZWVyaW5nQ29ubmVjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUF1dG9ub21vdXNEYXRhYmFzZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBdXRvbm9tb3VzRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUF1dG9ub21vdXNEYXRhYmFzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2UgYmFja3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQXV0b25vbW91c0RhdGFiYXNlQmFja3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBEZWxldGVzIGFuIEF1dG9ub21vdXMgVk0gY2x1c3RlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3BlY2lmaWVkIEV4YWRhdGEgaW5mcmFzdHJ1Y3R1cmUuIEJlZm9yZSB5b3UgdXNlIHRoaXMgb3BlcmF0aW9uLCBtYWtlIHN1cmUgdG8gZGVsZXRlIGFsbCBvZiB0aGUgVk0gY2x1c3RlcnMgdGhhdCBhcmUgaG9zdGVkIG9uIHRoaXMgRXhhZGF0YSBpbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc3BlY2lmaWVkIFZNIGNsdXN0ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNsb3VkVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNsb3VkVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDbG91ZFZtQ2x1c3RlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNwZWNpZmllZCBFeGFkYiBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVFeGFkYlZtQ2x1c3Rlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeGFkYlZtQ2x1c3RlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRXhhZGJWbUNsdXN0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBzcGVjaWZpZWQgRXhhc2NhbGUgREIgc3RvcmFnZSB2YXVsdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeGFzY2FsZURiU3RvcmFnZVZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeGFzY2FsZURiU3RvcmFnZVZhdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgT0RCIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZU9kYk5ldHdvcmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlT2RiTmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlT2RiTmV0d29yaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIE9EQiBQZWVyaW5nIENvbm5lY3Rpb24uIFdoZW4geW91IGRlbGV0ZSBhbiBPREIgcGVlcmluZyBjb25uZWN0aW9uLCB0aGUgdW5kZXJseWluZyBWUEMgcGVlcmluZyBjb25uZWN0aW9uIGlzIGFsc28gZGVsZXRlZFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU9kYlBlZXJpbmdDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGFuIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgKElBTSkgc2VydmljZSByb2xlIGZyb20gYSBzcGVjaWZpZWQgcmVzb3VyY2UgdG8gZGlzYWJsZSBBV1Mgc2VydmljZSBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGlzYXNzb2NpYXRlSWFtUm9sZUZyb21SZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVJYW1Sb2xlRnJvbVJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVJYW1Sb2xlRnJvbVJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIHZpcnR1YWwgbWFjaGluZXMgZnJvbSBhIHNwZWNpZmllZCBFeGFkYiBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVWaXJ0dWFsTWFjaGluZXNGcm9tRXhhZGJWbUNsdXN0ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlVmlydHVhbE1hY2hpbmVzRnJvbUV4YWRiVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhc3NvY2lhdGVWaXJ0dWFsTWFjaGluZXNGcm9tRXhhZGJWbUNsdXN0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBmYWlsIG92ZXIgdGhlIHNwZWNpZmllZCBBdXRvbm9tb3VzIERhdGFiYXNlIHRvIGEgc3RhbmRieSBwZWVyIGRhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9GYWlsb3ZlckF1dG9ub21vdXNEYXRhYmFzZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9GYWlsb3ZlckF1dG9ub21vdXNEYXRhYmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRmFpbG92ZXJBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBBdXRvbm9tb3VzIERhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEF1dG9ub21vdXNEYXRhYmFzZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBdXRvbm9tb3VzRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF1dG9ub21vdXNEYXRhYmFzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIEF1dG9ub21vdXMgRGF0YWJhc2UgYmFja3VwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgd2FsbGV0IGRldGFpbHMgZm9yIHRoZSBzcGVjaWZpZWQgQXV0b25vbW91cyBEYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBdXRvbm9tb3VzRGF0YWJhc2VXYWxsZXREZXRhaWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF1dG9ub21vdXNEYXRhYmFzZVdhbGxldERldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF1dG9ub21vdXNEYXRhYmFzZVdhbGxldERldGFpbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBBdXRvbm9tb3VzIFZNIGNsdXN0ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgRXhhZGF0YSBpbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB1bmFsbG9jYXRlZCByZXNvdXJjZXMgaW4gYSBzcGVjaWZpZWQgQ2xvdWQgRXhhZGF0YSBJbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZVVuYWxsb2NhdGVkUmVzb3VyY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlVW5hbGxvY2F0ZWRSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlVW5hbGxvY2F0ZWRSZXNvdXJjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENsb3VkVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENsb3VkVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDbG91ZFZtQ2x1c3RlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIERCIG5vZGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RGJOb2RlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERiTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGJOb2RlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugc2VydmVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldERiU2VydmVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERiU2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYlNlcnZlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmllZCBFeGFkYiBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEV4YWRiVm1DbHVzdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEV4YWRiVm1DbHVzdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFeGFkYlZtQ2x1c3RlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmllZCBFeGFzY2FsZSBEQiBzdG9yYWdlIHZhdWx0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldEV4YXNjYWxlRGJTdG9yYWdlVmF1bHQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0RXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgdGVuYW5jeSBhY3RpdmF0aW9uIGxpbmsgYW5kIG9uYm9hcmRpbmcgc3RhdHVzIGZvciB5b3VyIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRPY2lPbmJvYXJkaW5nU3RhdHVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9jaU9uYm9hcmRpbmdTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9jaU9uYm9hcmRpbmdTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBPREIgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRPZGJOZXR3b3JrLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9kYk5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9kYk5ldHdvcmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBPREIgUGVlcmluZyBjb25uZWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldE9kYlBlZXJpbmdDb25uZWN0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9kYlBlZXJpbmdDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRPZGJQZWVyaW5nQ29ubmVjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGluaXRpYWxpemUgdGhlIE9EQiBzZXJ2aWNlIGZvciB0aGUgZmlyc3QgdGltZSBpbiBhbiBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Jbml0aWFsaXplU2VydmljZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Jbml0aWFsaXplU2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW5pdGlhbGl6ZVNlcnZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWNrdXBzIG9mIHRoZSBzcGVjaWZpZWQgQXV0b25vbW91cyBEYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXV0b25vbW91c0RhdGFiYXNlQmFja3Vwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXV0b25vbW91c0RhdGFiYXNlQmFja3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIEF1dG9ub21vdXMgRGF0YWJhc2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VDaGFyYWN0ZXJTZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VDaGFyYWN0ZXJTZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXV0b25vbW91c0RhdGFiYXNlQ2hhcmFjdGVyU2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIGNsb25lcyBvZiB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEF1dG9ub21vdXNEYXRhYmFzZUNsb25lcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXV0b25vbW91c0RhdGFiYXNlQ2xvbmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXV0b25vbW91c0RhdGFiYXNlQ2xvbmVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgcGVlciBkYXRhYmFzZXMgb2YgdGhlIHNwZWNpZmllZCBBdXRvbm9tb3VzIERhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VQZWVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXV0b25vbW91c0RhdGFiYXNlUGVlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VQZWVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE9yYWNsZSBEYXRhYmFzZSBzb2Z0d2FyZSB2ZXJzaW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIEF1dG9ub21vdXMgRGF0YWJhc2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXV0b25vbW91c0RhdGFiYXNlVmVyc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF1dG9ub21vdXMgRGF0YWJhc2VzIG93bmVkIGJ5IHlvdXIgQW1hem9uIFdlYiBTZXJ2aWNlcyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXV0b25vbW91c0RhdGFiYXNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIEF1dG9ub21vdXMgVk1zIGluIGFuIEF1dG9ub21vdXMgVk0gY2x1c3RlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXV0b25vbW91c1ZpcnR1YWxNYWNoaW5lcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXV0b25vbW91c1ZpcnR1YWxNYWNoaW5lcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEF1dG9ub21vdXNWaXJ0dWFsTWFjaGluZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBBdXRvbm9tb3VzIFZNIGNsdXN0ZXJzIGluIGEgc3BlY2lmaWVkIENsb3VkIEV4YWRhdGEgaW5mcmFzdHJ1Y3R1cmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRXhhZGF0YSBpbmZyYXN0cnVjdHVyZXMgb3duZWQgYnkgeW91ciBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVk0gY2x1c3RlcnMgb3duZWQgYnkgeW91ciBBbWF6b24gV2ViIFNlcnZpY2VzIGFjY291bnQgb3Igb25seSB0aGUgb25lcyBvbiB0aGUgc3BlY2lmaWVkIEV4YWRhdGEgaW5mcmFzdHJ1Y3R1cmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENsb3VkVm1DbHVzdGVycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q2xvdWRWbUNsdXN0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q2xvdWRWbUNsdXN0ZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgREIgbm9kZXMgZm9yIHRoZSBzcGVjaWZpZWQgVk0gY2x1c3RlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RGJOb2Rlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RGJOb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERiTm9kZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhYmFzZSBzZXJ2ZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgRXhhZGF0YSBpbmZyYXN0cnVjdHVyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0RGJTZXJ2ZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REYlNlcnZlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3REYlNlcnZlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzaGFwZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBhbiBFeGFkYXRhIGluZnJhc3RydWN0dXJlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3REYlN5c3RlbVNoYXBlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RGJTeXN0ZW1TaGFwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3REYlN5c3RlbVNoYXBlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4YWRiIFZNIGNsdXN0ZXJzIG93bmVkIGJ5IHlvdXIgQW1hem9uIFdlYiBTZXJ2aWNlcyBhY2NvdW50IG9yIG9ubHkgdGhlIG9uZXMgaW4gdGhlIHNwZWNpZmllZCBFeGFzY2FsZSBEQiBzdG9yYWdlIHZhdWx0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RFeGFkYlZtQ2x1c3RlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEV4YWRiVm1DbHVzdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEV4YWRiVm1DbHVzdGVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4YXNjYWxlIERCIHN0b3JhZ2UgdmF1bHRzIG93bmVkIGJ5IHlvdXIgQW1hem9uIFdlYiBTZXJ2aWNlcyBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RFeGFzY2FsZURiU3RvcmFnZVZhdWx0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RXhhc2NhbGVEYlN0b3JhZ2VWYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFeGFzY2FsZURiU3RvcmFnZVZhdWx0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZsZXggY29tcG9uZW50cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGEgREIgc3lzdGVtIHNoYXBlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RGbGV4Q29tcG9uZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0RmxleENvbXBvbmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RGbGV4Q29tcG9uZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1pbm9yIHZlcnNpb25zIG9mIE9yYWNsZSBHcmlkIEluZnJhc3RydWN0dXJlIChHSSkgc29mdHdhcmUgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBhIFZNIGNsdXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgR0kgdmVyc2lvbiBhbmQgc2hhcGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEdpTWlub3JWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0R2lNaW5vclZlcnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0R2lNaW5vclZlcnNpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbmZvcm1hdGlvbiBhYm91dCBPcmFjbGUgR3JpZCBJbmZyYXN0cnVjdHVyZSAoR0kpIHNvZnR3YXJlIHZlcnNpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgYSBWTSBjbHVzdGVyIGZvciB0aGUgc3BlY2lmaWVkIHNoYXBlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RHaVZlcnNpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RHaVZlcnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0R2lWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE9EQiBuZXR3b3JrcyBvd25lZCBieSB5b3VyIEFtYXpvbiBXZWIgU2VydmljZXMgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0T2RiTmV0d29ya3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdE9kYk5ldHdvcmtzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0T2RiTmV0d29ya3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBPREIgcGVlcmluZyBjb25uZWN0aW9ucyBvciB0aG9zZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBPREIgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0T2RiUGVlcmluZ0Nvbm5lY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RPZGJQZWVyaW5nQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RPZGJQZWVyaW5nQ29ubmVjdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0gdmVyc2lvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBhIFZNIGNsdXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgZ2lWZXJzaW9uIGFuZCBzaGFwZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U3lzdGVtVmVyc2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFN5c3RlbVZlcnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U3lzdGVtVmVyc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGFwcGxpZWQgdG8gdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWJvb3QgdGhlIHNwZWNpZmllZCBBdXRvbm9tb3VzIERhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWJvb3RBdXRvbm9tb3VzRGF0YWJhc2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVib290QXV0b25vbW91c0RhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWJvb3RBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWJvb3QgdGhlIHNwZWNpZmllZCBEQiBub2RlIGluIGEgVk0gY2x1c3RlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVib290RGJOb2RlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlYm9vdERiTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVib290RGJOb2RlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2UgdG8gYSBwb2ludCBpbiB0aW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXN0b3JlQXV0b25vbW91c0RhdGFiYXNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3RvcmVBdXRvbm9tb3VzRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzaHJpbmsgdGhlIHN0b3JhZ2Ugb2YgdGhlIHNwZWNpZmllZCBBdXRvbm9tb3VzIERhdGFiYXNlIHRvIHJlY2xhaW0gdW51c2VkIHNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TaHJpbmtBdXRvbm9tb3VzRGF0YWJhc2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2hyaW5rQXV0b25vbW91c0RhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTaHJpbmtBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCB0aGUgc3BlY2lmaWVkIEF1dG9ub21vdXMgRGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0QXV0b25vbW91c0RhdGFiYXNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0QXV0b25vbW91c0RhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEF1dG9ub21vdXNEYXRhYmFzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IHRoZSBzcGVjaWZpZWQgREIgbm9kZSBpbiBhIFZNIGNsdXN0ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0RGJOb2RlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0RGJOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydERiTm9kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgdGhlIHNwZWNpZmllZCBBdXRvbm9tb3VzIERhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdG9wQXV0b25vbW91c0RhdGFiYXNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BBdXRvbm9tb3VzRGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0b3BBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdG9wIHRoZSBzcGVjaWZpZWQgREIgbm9kZSBpbiBhIFZNIGNsdXN0ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0b3BEYk5vZGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcERiTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcERiTm9kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN3aXRjaCBvdmVyIHRoZSBzcGVjaWZpZWQgQXV0b25vbW91cyBEYXRhYmFzZSB0byBhIHN0YW5kYnkgcGVlciBkYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3dpdGNob3ZlckF1dG9ub21vdXNEYXRhYmFzZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Td2l0Y2hvdmVyQXV0b25vbW91c0RhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTd2l0Y2hvdmVyQXV0b25vbW91c0RhdGFiYXNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXBwbHkgdGFncyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgdGFncyBmcm9tIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VudGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgcHJvcGVydGllcyBvZiBhbiBBdXRvbm9tb3VzIERhdGFiYXNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVBdXRvbm9tb3VzRGF0YWJhc2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQXV0b25vbW91c0RhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVBdXRvbm9tb3VzRGF0YWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYW4gQXV0b25vbW91cyBEYXRhYmFzZSBiYWNrdXBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgcHJvcGVydGllcyBvZiBhbiBFeGFkYXRhIGluZnJhc3RydWN0dXJlIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcHJvcGVydGllcyBvZiBhIHNwZWNpZmllZCBFeGFkYiBWTSBjbHVzdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVFeGFkYlZtQ2x1c3Rlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVFeGFkYlZtQ2x1c3RlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRXhhZGJWbUNsdXN0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcHJvcGVydGllcyBvZiBhIHNwZWNpZmllZCBFeGFzY2FsZSBEQiBzdG9yYWdlIHZhdWx0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVFeGFzY2FsZURiU3RvcmFnZVZhdWx0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUV4YXNjYWxlRGJTdG9yYWdlVmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUV4YXNjYWxlRGJTdG9yYWdlVmF1bHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcHJvcGVydGllcyBvZiBhIHNwZWNpZmllZCBPREIgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlT2RiTmV0d29yay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVPZGJOZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVPZGJOZXR3b3JrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHByb3BlcnRpZXMgb2YgYSBzcGVjaWZpZWQgT0RCIFBlZXJpbmcgQ29ubmVjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU9kYlBlZXJpbmdDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgREIgTm9kZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEYk5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURiTm9kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBPREIgR3JhbnQgU2hhcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlR3JhbnRTaGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlR3JhbnRTaGFyZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBPdXRib3VuZCBJbnRlZ3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPdXRib3VuZEludGVncmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPdXRib3VuZEludGVncmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgREIgTm9kZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVEYk5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZURiTm9kZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBPREIgR3JhbnQgU2hhcmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlR3JhbnRTaGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlR3JhbnRTaGFyZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHJlc291cmNlIHBvbGljeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSByZXNvdXJjZSBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSByZXNvdXJjZSBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvUHV0UmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFJlc291cmNlUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIE9EQiBHcmFudCBTaGFyZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVHcmFudFNoYXJlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVHcmFudFNoYXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIE91dGJvdW5kIEludGVncmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZU91dGJvdW5kSW50ZWdyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU91dGJvdW5kSW50ZWdyYXRpb24nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0FjY2VwdE1hcmtldHBsYWNlUmVnaXN0cmF0aW9uJyxcbiAgICAgICdBc3NvY2lhdGVJYW1Sb2xlVG9SZXNvdXJjZScsXG4gICAgICAnQXNzb2NpYXRlVmlydHVhbE1hY2hpbmVzVG9FeGFkYlZtQ2x1c3RlcicsXG4gICAgICAnQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlJyxcbiAgICAgICdDcmVhdGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAnLFxuICAgICAgJ0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZVdhbGxldCcsXG4gICAgICAnQ3JlYXRlQ2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyJyxcbiAgICAgICdDcmVhdGVDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZScsXG4gICAgICAnQ3JlYXRlQ2xvdWRWbUNsdXN0ZXInLFxuICAgICAgJ0NyZWF0ZUV4YWRiVm1DbHVzdGVyJyxcbiAgICAgICdDcmVhdGVFeGFzY2FsZURiU3RvcmFnZVZhdWx0JyxcbiAgICAgICdDcmVhdGVPZGJOZXR3b3JrJyxcbiAgICAgICdDcmVhdGVPZGJQZWVyaW5nQ29ubmVjdGlvbicsXG4gICAgICAnRGVsZXRlQXV0b25vbW91c0RhdGFiYXNlJyxcbiAgICAgICdEZWxldGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAnLFxuICAgICAgJ0RlbGV0ZUNsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcicsXG4gICAgICAnRGVsZXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUnLFxuICAgICAgJ0RlbGV0ZUNsb3VkVm1DbHVzdGVyJyxcbiAgICAgICdEZWxldGVFeGFkYlZtQ2x1c3RlcicsXG4gICAgICAnRGVsZXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCcsXG4gICAgICAnRGVsZXRlT2RiTmV0d29yaycsXG4gICAgICAnRGVsZXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24nLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZUlhbVJvbGVGcm9tUmVzb3VyY2UnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVZpcnR1YWxNYWNoaW5lc0Zyb21FeGFkYlZtQ2x1c3RlcicsXG4gICAgICAnRmFpbG92ZXJBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ0luaXRpYWxpemVTZXJ2aWNlJyxcbiAgICAgICdSZWJvb3RBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ1JlYm9vdERiTm9kZScsXG4gICAgICAnUmVzdG9yZUF1dG9ub21vdXNEYXRhYmFzZScsXG4gICAgICAnU2hyaW5rQXV0b25vbW91c0RhdGFiYXNlJyxcbiAgICAgICdTdGFydEF1dG9ub21vdXNEYXRhYmFzZScsXG4gICAgICAnU3RhcnREYk5vZGUnLFxuICAgICAgJ1N0b3BBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ1N0b3BEYk5vZGUnLFxuICAgICAgJ1N3aXRjaG92ZXJBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJyxcbiAgICAgICdVcGRhdGVBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ1VwZGF0ZUF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCcsXG4gICAgICAnVXBkYXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUnLFxuICAgICAgJ1VwZGF0ZUV4YWRiVm1DbHVzdGVyJyxcbiAgICAgICdVcGRhdGVFeGFzY2FsZURiU3RvcmFnZVZhdWx0JyxcbiAgICAgICdVcGRhdGVPZGJOZXR3b3JrJyxcbiAgICAgICdVcGRhdGVPZGJQZWVyaW5nQ29ubmVjdGlvbicsXG4gICAgICAnQ3JlYXRlRGJOb2RlJyxcbiAgICAgICdDcmVhdGVHcmFudFNoYXJlJyxcbiAgICAgICdDcmVhdGVPdXRib3VuZEludGVncmF0aW9uJyxcbiAgICAgICdEZWxldGVEYk5vZGUnLFxuICAgICAgJ0RlbGV0ZUdyYW50U2hhcmUnLFxuICAgICAgJ0RlbGV0ZVJlc291cmNlUG9saWN5JyxcbiAgICAgICdQdXRSZXNvdXJjZVBvbGljeScsXG4gICAgICAnVXBkYXRlR3JhbnRTaGFyZScsXG4gICAgICAnVXBkYXRlT3V0Ym91bmRJbnRlZ3JhdGlvbidcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdHZXRBdXRvbm9tb3VzRGF0YWJhc2UnLFxuICAgICAgJ0dldEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCcsXG4gICAgICAnR2V0QXV0b25vbW91c0RhdGFiYXNlV2FsbGV0RGV0YWlscycsXG4gICAgICAnR2V0Q2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyJyxcbiAgICAgICdHZXRDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZScsXG4gICAgICAnR2V0Q2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVVbmFsbG9jYXRlZFJlc291cmNlcycsXG4gICAgICAnR2V0Q2xvdWRWbUNsdXN0ZXInLFxuICAgICAgJ0dldERiTm9kZScsXG4gICAgICAnR2V0RGJTZXJ2ZXInLFxuICAgICAgJ0dldEV4YWRiVm1DbHVzdGVyJyxcbiAgICAgICdHZXRFeGFzY2FsZURiU3RvcmFnZVZhdWx0JyxcbiAgICAgICdHZXRPY2lPbmJvYXJkaW5nU3RhdHVzJyxcbiAgICAgICdHZXRPZGJOZXR3b3JrJyxcbiAgICAgICdHZXRPZGJQZWVyaW5nQ29ubmVjdGlvbicsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZScsXG4gICAgICAnR2V0UmVzb3VyY2VQb2xpY3knXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cHMnLFxuICAgICAgJ0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VDaGFyYWN0ZXJTZXRzJyxcbiAgICAgICdMaXN0QXV0b25vbW91c0RhdGFiYXNlQ2xvbmVzJyxcbiAgICAgICdMaXN0QXV0b25vbW91c0RhdGFiYXNlUGVlcnMnLFxuICAgICAgJ0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VWZXJzaW9ucycsXG4gICAgICAnTGlzdEF1dG9ub21vdXNEYXRhYmFzZXMnLFxuICAgICAgJ0xpc3RBdXRvbm9tb3VzVmlydHVhbE1hY2hpbmVzJyxcbiAgICAgICdMaXN0Q2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVycycsXG4gICAgICAnTGlzdENsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlcycsXG4gICAgICAnTGlzdENsb3VkVm1DbHVzdGVycycsXG4gICAgICAnTGlzdERiTm9kZXMnLFxuICAgICAgJ0xpc3REYlNlcnZlcnMnLFxuICAgICAgJ0xpc3REYlN5c3RlbVNoYXBlcycsXG4gICAgICAnTGlzdEV4YWRiVm1DbHVzdGVycycsXG4gICAgICAnTGlzdEV4YXNjYWxlRGJTdG9yYWdlVmF1bHRzJyxcbiAgICAgICdMaXN0RmxleENvbXBvbmVudHMnLFxuICAgICAgJ0xpc3RHaU1pbm9yVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RHaVZlcnNpb25zJyxcbiAgICAgICdMaXN0T2RiTmV0d29ya3MnLFxuICAgICAgJ0xpc3RPZGJQZWVyaW5nQ29ubmVjdGlvbnMnLFxuICAgICAgJ0xpc3RTeXN0ZW1WZXJzaW9ucydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGF1dG9ub21vdXMtZGF0YWJhc2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0F1dG9ub21vdXNEYXRhYmFzZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhdXRvbm9tb3VzRGF0YWJhc2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhdXRvbm9tb3VzRGF0YWJhc2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQXV0b25vbW91c0RhdGFiYXNlKGF1dG9ub21vdXNEYXRhYmFzZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06b2RiOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTphdXRvbm9tb3VzLWRhdGFiYXNlLyR7IGF1dG9ub21vdXNEYXRhYmFzZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBhdXRvbm9tb3VzLWRhdGFiYXNlLWJhY2t1cCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXV0b25vbW91c0RhdGFiYXNlQmFja3VwLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cElkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25BdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAoYXV0b25vbW91c0RhdGFiYXNlQmFja3VwSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpvZGI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmF1dG9ub21vdXMtZGF0YWJhc2UtYmFja3VwLyR7IGF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cElkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjbG91ZC1hdXRvbm9tb3VzLXZtLWNsdXN0ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Nsb3VkQXV0b25vbW91c1ZtQ2x1c3Rlci5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXJJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyKGNsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06b2RiOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjbG91ZC1hdXRvbm9tb3VzLXZtLWNsdXN0ZXIvJHsgY2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVySWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNsb3VkLWV4YWRhdGEtaW5mcmFzdHJ1Y3R1cmUgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Nsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgY2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUoY2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om9kYjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y2xvdWQtZXhhZGF0YS1pbmZyYXN0cnVjdHVyZS8keyBjbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjbG91ZC12bS1jbHVzdGVyIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DbG91ZFZtQ2x1c3Rlci5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBjbG91ZFZtQ2x1c3RlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIGNsb3VkVm1DbHVzdGVySWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkNsb3VkVm1DbHVzdGVyKGNsb3VkVm1DbHVzdGVySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpvZGI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNsb3VkLXZtLWNsdXN0ZXIvJHsgY2xvdWRWbUNsdXN0ZXJJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgZGItbm9kZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGJOb2RlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGRiTm9kZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGRiTm9kZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25EYk5vZGUoZGJOb2RlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpvZGI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmRiLW5vZGUvJHsgZGJOb2RlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGV4YWRiLXZtLWNsdXN0ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0V4YWRiVm1DbHVzdGVyLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGV4YWRiVm1DbHVzdGVySWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZXhhZGJWbUNsdXN0ZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uRXhhZGJWbUNsdXN0ZXIoZXhhZGJWbUNsdXN0ZXJJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om9kYjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06ZXhhZGItdm0tY2x1c3Rlci8keyBleGFkYlZtQ2x1c3RlcklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBleGFzY2FsZS1kYi1zdG9yYWdlLXZhdWx0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FeGFzY2FsZURiU3RvcmFnZVZhdWx0Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGV4YXNjYWxlRGJTdG9yYWdlVmF1bHRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBleGFzY2FsZURiU3RvcmFnZVZhdWx0SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkV4YXNjYWxlRGJTdG9yYWdlVmF1bHQoZXhhc2NhbGVEYlN0b3JhZ2VWYXVsdElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06b2RiOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpleGFzY2FsZS1kYi1zdG9yYWdlLXZhdWx0LyR7IGV4YXNjYWxlRGJTdG9yYWdlVmF1bHRJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgb2RiLW5ldHdvcmsgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vb2RiL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX09kYk5ldHdvcmsuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gb2RiTmV0d29ya0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIG9kYk5ldHdvcmtJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uT2RiTmV0d29yayhvZGJOZXR3b3JrSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpvZGI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om9kYi1uZXR3b3JrLyR7IG9kYk5ldHdvcmtJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgb2RiLXBlZXJpbmctY29ubmVjdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfT2RiUGVlcmluZ0Nvbm5lY3Rpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gb2RiUGVlcmluZ0Nvbm5lY3Rpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBvZGJQZWVyaW5nQ29ubmVjdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25PZGJQZWVyaW5nQ29ubmVjdGlvbihvZGJQZWVyaW5nQ29ubmVjdGlvbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06b2RiOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpvZGItcGVlcmluZy1jb25uZWN0aW9uLyR7IG9kYlBlZXJpbmdDb25uZWN0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGEgdGFnIGtleSBhbmQgdmFsdWUgcGFpciB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZSgpXG4gICAqIC0gLnRvQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlQmFja3VwKClcbiAgICogLSAudG9DcmVhdGVDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0NyZWF0ZUNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlKClcbiAgICogLSAudG9DcmVhdGVDbG91ZFZtQ2x1c3RlcigpXG4gICAqIC0gLnRvQ3JlYXRlRXhhZGJWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0NyZWF0ZUV4YXNjYWxlRGJTdG9yYWdlVmF1bHQoKVxuICAgKiAtIC50b0NyZWF0ZU9kYk5ldHdvcmsoKVxuICAgKiAtIC50b0NyZWF0ZU9kYlBlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXF1ZXN0VGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlcXVlc3RUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBhIHRhZyBrZXkgYW5kIHZhbHVlIHBhaXIgb2YgYSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZUlhbVJvbGVUb1Jlc291cmNlKClcbiAgICogLSAudG9Bc3NvY2lhdGVWaXJ0dWFsTWFjaGluZXNUb0V4YWRiVm1DbHVzdGVyKClcbiAgICogLSAudG9DcmVhdGVBdXRvbm9tb3VzRGF0YWJhc2UoKVxuICAgKiAtIC50b0NyZWF0ZUF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCgpXG4gICAqIC0gLnRvQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlV2FsbGV0KClcbiAgICogLSAudG9DcmVhdGVDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0NyZWF0ZUNsb3VkVm1DbHVzdGVyKClcbiAgICogLSAudG9DcmVhdGVFeGFkYlZtQ2x1c3RlcigpXG4gICAqIC0gLnRvQ3JlYXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0RlbGV0ZUF1dG9ub21vdXNEYXRhYmFzZSgpXG4gICAqIC0gLnRvRGVsZXRlQXV0b25vbW91c0RhdGFiYXNlQmFja3VwKClcbiAgICogLSAudG9EZWxldGVDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0RlbGV0ZUNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlKClcbiAgICogLSAudG9EZWxldGVDbG91ZFZtQ2x1c3RlcigpXG4gICAqIC0gLnRvRGVsZXRlRXhhZGJWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0RlbGV0ZUV4YXNjYWxlRGJTdG9yYWdlVmF1bHQoKVxuICAgKiAtIC50b0RlbGV0ZU9kYk5ldHdvcmsoKVxuICAgKiAtIC50b0RlbGV0ZU9kYlBlZXJpbmdDb25uZWN0aW9uKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVJYW1Sb2xlRnJvbVJlc291cmNlKClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVWaXJ0dWFsTWFjaGluZXNGcm9tRXhhZGJWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0ZhaWxvdmVyQXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9HZXRBdXRvbm9tb3VzRGF0YWJhc2UoKVxuICAgKiAtIC50b0dldEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cCgpXG4gICAqIC0gLnRvR2V0QXV0b25vbW91c0RhdGFiYXNlV2FsbGV0RGV0YWlscygpXG4gICAqIC0gLnRvR2V0Q2xvdWRBdXRvbm9tb3VzVm1DbHVzdGVyKClcbiAgICogLSAudG9HZXRDbG91ZEV4YWRhdGFJbmZyYXN0cnVjdHVyZSgpXG4gICAqIC0gLnRvR2V0Q2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmVVbmFsbG9jYXRlZFJlc291cmNlcygpXG4gICAqIC0gLnRvR2V0Q2xvdWRWbUNsdXN0ZXIoKVxuICAgKiAtIC50b0dldERiTm9kZSgpXG4gICAqIC0gLnRvR2V0RGJTZXJ2ZXIoKVxuICAgKiAtIC50b0dldEV4YWRiVm1DbHVzdGVyKClcbiAgICogLSAudG9HZXRFeGFzY2FsZURiU3RvcmFnZVZhdWx0KClcbiAgICogLSAudG9HZXRPZGJOZXR3b3JrKClcbiAgICogLSAudG9HZXRPZGJQZWVyaW5nQ29ubmVjdGlvbigpXG4gICAqIC0gLnRvTGlzdEF1dG9ub21vdXNEYXRhYmFzZUJhY2t1cHMoKVxuICAgKiAtIC50b0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VDbG9uZXMoKVxuICAgKiAtIC50b0xpc3RBdXRvbm9tb3VzRGF0YWJhc2VQZWVycygpXG4gICAqIC0gLnRvTGlzdEF1dG9ub21vdXNWaXJ0dWFsTWFjaGluZXMoKVxuICAgKiAtIC50b0xpc3RDbG91ZEF1dG9ub21vdXNWbUNsdXN0ZXJzKClcbiAgICogLSAudG9MaXN0Q2xvdWRWbUNsdXN0ZXJzKClcbiAgICogLSAudG9MaXN0RGJOb2RlcygpXG4gICAqIC0gLnRvTGlzdERiU2VydmVycygpXG4gICAqIC0gLnRvTGlzdEV4YWRiVm1DbHVzdGVycygpXG4gICAqIC0gLnRvTGlzdE9kYlBlZXJpbmdDb25uZWN0aW9ucygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUmVib290QXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9SZWJvb3REYk5vZGUoKVxuICAgKiAtIC50b1Jlc3RvcmVBdXRvbm9tb3VzRGF0YWJhc2UoKVxuICAgKiAtIC50b1Nocmlua0F1dG9ub21vdXNEYXRhYmFzZSgpXG4gICAqIC0gLnRvU3RhcnRBdXRvbm9tb3VzRGF0YWJhc2UoKVxuICAgKiAtIC50b1N0YXJ0RGJOb2RlKClcbiAgICogLSAudG9TdG9wQXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9TdG9wRGJOb2RlKClcbiAgICogLSAudG9Td2l0Y2hvdmVyQXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9VcGRhdGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAoKVxuICAgKiAtIC50b1VwZGF0ZUNsb3VkRXhhZGF0YUluZnJhc3RydWN0dXJlKClcbiAgICogLSAudG9VcGRhdGVFeGFkYlZtQ2x1c3RlcigpXG4gICAqIC0gLnRvVXBkYXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCgpXG4gICAqIC0gLnRvVXBkYXRlT2RiTmV0d29yaygpXG4gICAqIC0gLnRvVXBkYXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b0NyZWF0ZURiTm9kZSgpXG4gICAqIC0gLnRvQ3JlYXRlT3V0Ym91bmRJbnRlZ3JhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlRGJOb2RlKClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvR2V0UmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b1B1dFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9VcGRhdGVPdXRib3VuZEludGVncmF0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBhdXRvbm9tb3VzLWRhdGFiYXNlXG4gICAqIC0gYXV0b25vbW91cy1kYXRhYmFzZS1iYWNrdXBcbiAgICogLSBjbG91ZC1hdXRvbm9tb3VzLXZtLWNsdXN0ZXJcbiAgICogLSBjbG91ZC1leGFkYXRhLWluZnJhc3RydWN0dXJlXG4gICAqIC0gY2xvdWQtdm0tY2x1c3RlclxuICAgKiAtIGRiLW5vZGVcbiAgICogLSBleGFkYi12bS1jbHVzdGVyXG4gICAqIC0gZXhhc2NhbGUtZGItc3RvcmFnZS12YXVsdFxuICAgKiAtIG9kYi1uZXR3b3JrXG4gICAqIC0gb2RiLXBlZXJpbmctY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBhIGxpc3Qgb2YgdGFnIGtleXMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtdGFna2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlQXV0b25vbW91c0RhdGFiYXNlKClcbiAgICogLSAudG9DcmVhdGVBdXRvbm9tb3VzRGF0YWJhc2VCYWNrdXAoKVxuICAgKiAtIC50b0NyZWF0ZUNsb3VkQXV0b25vbW91c1ZtQ2x1c3RlcigpXG4gICAqIC0gLnRvQ3JlYXRlQ2xvdWRFeGFkYXRhSW5mcmFzdHJ1Y3R1cmUoKVxuICAgKiAtIC50b0NyZWF0ZUNsb3VkVm1DbHVzdGVyKClcbiAgICogLSAudG9DcmVhdGVFeGFkYlZtQ2x1c3RlcigpXG4gICAqIC0gLnRvQ3JlYXRlRXhhc2NhbGVEYlN0b3JhZ2VWYXVsdCgpXG4gICAqIC0gLnRvQ3JlYXRlT2RiTmV0d29yaygpXG4gICAqIC0gLnRvQ3JlYXRlT2RiUGVlcmluZ0Nvbm5lY3Rpb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbb2RiXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9vZGIuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19