iam-floyd
Version:
AWS IAM policy statement generator with fluent interface
631 lines • 55.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Aidevops = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [aidevops](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsdevopsagentservice.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Aidevops extends shared_1.PolicyStatement {
/**
* Statement provider for service [aidevops](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsdevopsagentservice.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
constructor(sid) {
super(sid);
this.servicePrefix = 'aidevops';
this.accessLevelList = {
Write: [
'AssociateService',
'CreateAgentSpace',
'CreateBacklogTask',
'CreateKnowledgeItem',
'CreateOneTimeLoginSession',
'DeleteAgentSpace',
'DeleteKnowledgeItem',
'DeregisterService',
'DescribeSupportLevel',
'DisableOperatorApp',
'DisassociateService',
'DiscoverTopology',
'EnableOperatorApp',
'EndChatForCase',
'InitiateChatForCase',
'RegisterService',
'SendChatMessage',
'UpdateAgentSpace',
'UpdateAssociation',
'UpdateBacklogTask',
'UpdateKnowledgeItem',
'UpdateOperatorAppTeams',
'UpdateRecommendation'
],
Read: [
'GetAccountUsage',
'GetAgentSpace',
'GetAssociation',
'GetBacklogTask',
'GetKnowledgeItem',
'GetOperatorAppTeams',
'GetRecommendation',
'GetService',
'HandleServiceRegistrationCallback',
'InitiateServiceRegistration',
'SearchServiceAccessibleResource'
],
List: [
'ListAgentSpaces',
'ListAssociations',
'ListBacklogTasks',
'ListExecutions',
'ListGoals',
'ListJournalRecords',
'ListKnowledgeItems',
'ListPendingMessages',
'ListRecommendations',
'ListServices',
'ListWebhooks'
]
};
}
/**
* Grants permission to associate service
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toAssociateService() {
return this.to('AssociateService');
}
/**
* Grants permission to create agentspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toCreateAgentSpace() {
return this.to('CreateAgentSpace');
}
/**
* Grants permission to create a new backlog task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toCreateBacklogTask() {
return this.to('CreateBacklogTask');
}
/**
* Grants permission to create a new knowledge item
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toCreateKnowledgeItem() {
return this.to('CreateKnowledgeItem');
}
/**
* Grants permission to generate secure one-time session for initiating off-console Application login
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toCreateOneTimeLoginSession() {
return this.to('CreateOneTimeLoginSession');
}
/**
* Grants permission to delete agentspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDeleteAgentSpace() {
return this.to('DeleteAgentSpace');
}
/**
* Grants permission to delete a knowledge item
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDeleteKnowledgeItem() {
return this.to('DeleteKnowledgeItem');
}
/**
* Grants permission to deregister a service
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDeregisterService() {
return this.to('DeregisterService');
}
/**
* Grants permission to describe a chat for a case
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDescribeSupportLevel() {
return this.to('DescribeSupportLevel');
}
/**
* Grants permission to disable the Operator App access to the given AgentSpace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDisableOperatorApp() {
return this.to('DisableOperatorApp');
}
/**
* Grants permission to disassociate service
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDisassociateService() {
return this.to('DisassociateService');
}
/**
* Grants permission to discover topology information
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toDiscoverTopology() {
return this.to('DiscoverTopology');
}
/**
* Grants permission to enable the Operator App to access the given AgentSpace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toEnableOperatorApp() {
return this.to('EnableOperatorApp');
}
/**
* Grants permission to end a chat for a case
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toEndChatForCase() {
return this.to('EndChatForCase');
}
/**
* Grants permission to get account usage
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetAccountUsage() {
return this.to('GetAccountUsage');
}
/**
* Grants permission to get agentspace
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetAgentSpace() {
return this.to('GetAgentSpace');
}
/**
* Grants permission to get association
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetAssociation() {
return this.to('GetAssociation');
}
/**
* Grants permission to get a backlog task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetBacklogTask() {
return this.to('GetBacklogTask');
}
/**
* Grants permission to get a knowledge item
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetKnowledgeItem() {
return this.to('GetKnowledgeItem');
}
/**
* Grants permission to enable operator auth config for any enabled auth flow
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetOperatorAppTeams() {
return this.to('GetOperatorAppTeams');
}
/**
* Grants permission to get a recommendation
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetRecommendation() {
return this.to('GetRecommendation');
}
/**
* Grants permission to get services
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toGetService() {
return this.to('GetService');
}
/**
* Grants permission to handle OAuth callback from external service
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toHandleServiceRegistrationCallback() {
return this.to('HandleServiceRegistrationCallback');
}
/**
* Grants permission to initiate a chat for a case
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toInitiateChatForCase() {
return this.to('InitiateChatForCase');
}
/**
* Grants permission to initiate OAuth flow
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toInitiateServiceRegistration() {
return this.to('InitiateServiceRegistration');
}
/**
* Grants permission to list agentspace
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListAgentSpaces() {
return this.to('ListAgentSpaces');
}
/**
* Grants permission to list associations
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListAssociations() {
return this.to('ListAssociations');
}
/**
* Grants permission to list backlog tasks
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListBacklogTasks() {
return this.to('ListBacklogTasks');
}
/**
* Grants permission to list executions
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListExecutions() {
return this.to('ListExecutions');
}
/**
* Grants permission to list goals
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListGoals() {
return this.to('ListGoals');
}
/**
* Grants permission to list journal records
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListJournalRecords() {
return this.to('ListJournalRecords');
}
/**
* Grants permission to list knowledge items
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListKnowledgeItems() {
return this.to('ListKnowledgeItems');
}
/**
* Grants permission to list pending messages
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListPendingMessages() {
return this.to('ListPendingMessages');
}
/**
* Grants permission to list recommendations
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListRecommendations() {
return this.to('ListRecommendations');
}
/**
* Grants permission to list services
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListServices() {
return this.to('ListServices');
}
/**
* Grants permission to list webhooks for association
*
* Access Level: List
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toListWebhooks() {
return this.to('ListWebhooks');
}
/**
* Grants permission to register specific service
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toRegisterService() {
return this.to('RegisterService');
}
/**
* Grants permission to look up a registered service accessible resources
*
* Access Level: Read
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toSearchServiceAccessibleResource() {
return this.to('SearchServiceAccessibleResource');
}
/**
* Grants permission to invoke an agent
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toSendChatMessage() {
return this.to('SendChatMessage');
}
/**
* Grants permission to update agentspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateAgentSpace() {
return this.to('UpdateAgentSpace');
}
/**
* Grants permission to update association
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateAssociation() {
return this.to('UpdateAssociation');
}
/**
* Grants permission to update a task
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateBacklogTask() {
return this.to('UpdateBacklogTask');
}
/**
* Grants permission to update a knowledge item
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateKnowledgeItem() {
return this.to('UpdateKnowledgeItem');
}
/**
* Grants permission to update the list of teams that the Operator App is enabled for
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateOperatorAppTeams() {
return this.to('UpdateOperatorAppTeams');
}
/**
* Grants permission to update a recommendation
*
* Access Level: Write
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/what-is.html
*/
toUpdateRecommendation() {
return this.to('UpdateRecommendation');
}
/**
* Adds a resource of type AgentSpaceResource to the statement
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* @param agentSpaceId - Identifier for the agentSpaceId.
* @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:
* - .ifAgentSpaceResourceAgentSpaceId()
*/
onAgentSpaceResource(agentSpaceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aidevops:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agentspace/${agentSpaceId}`);
}
/**
* Adds a resource of type AssociationResource to the statement
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* @param agentSpaceId - Identifier for the agentSpaceId.
* @param associationId - Identifier for the associationId.
* @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:
* - .ifAssociationResourceAgentSpaceId()
* - .ifAssociationResourceAssociationId()
*/
onAssociationResource(agentSpaceId, associationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aidevops:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:agentspace/${agentSpaceId}/associations/${associationId}`);
}
/**
* Adds a resource of type ServiceResource to the statement
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* @param serviceId - Identifier for the serviceId.
* @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:
* - .ifServiceResourceServiceId()
*/
onServiceResource(serviceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aidevops:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:service/${serviceId}`);
}
/**
* Filters access by unique identifier for an AgentSpace
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* Applies to resource types:
* - AgentSpaceResource
*
* @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`
*/
ifAgentSpaceResourceAgentSpaceId(value, operator) {
return this.if(`AgentSpaceResourceAgentSpaceId`, value, operator ?? 'StringLike');
}
/**
* Filters access by unique identifier for an AgentSpace
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* Applies to resource types:
* - AssociationResource
*
* @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`
*/
ifAssociationResourceAgentSpaceId(value, operator) {
return this.if(`AssociationResourceAgentSpaceId`, value, operator ?? 'StringLike');
}
/**
* Filters access by unique identifier for a service association within an AgentSpace
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* Applies to resource types:
* - AssociationResource
*
* @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`
*/
ifAssociationResourceAssociationId(value, operator) {
return this.if(`AssociationResourceAssociationId`, value, operator ?? 'StringLike');
}
/**
* Filters access by unique identifier for a registered service
*
* https://docs.aws.amazon.com/devopsagent/latest/userguide/
*
* Applies to resource types:
* - ServiceResource
*
* @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`
*/
ifServiceResourceServiceId(value, operator) {
return this.if(`ServiceResourceServiceId`, value, operator ?? 'StringLike');
}
}
exports.Aidevops = Aidevops;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzYWdlbnRzZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGV2b3BzYWdlbnRzZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUV6RDs7OztHQUlHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsd0JBQWU7SUFHM0M7Ozs7T0FJRztJQUNILFlBQVksR0FBWTtRQUN0QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFSTixrQkFBYSxHQUFHLFVBQVUsQ0FBQztRQTBmeEIsb0JBQWUsR0FBb0I7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLGtCQUFrQjtnQkFDbEIsa0JBQWtCO2dCQUNsQixtQkFBbUI7Z0JBQ25CLHFCQUFxQjtnQkFDckIsMkJBQTJCO2dCQUMzQixrQkFBa0I7Z0JBQ2xCLHFCQUFxQjtnQkFDckIsbUJBQW1CO2dCQUNuQixzQkFBc0I7Z0JBQ3RCLG9CQUFvQjtnQkFDcEIscUJBQXFCO2dCQUNyQixrQkFBa0I7Z0JBQ2xCLG1CQUFtQjtnQkFDbkIsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLGlCQUFpQjtnQkFDakIsaUJBQWlCO2dCQUNqQixrQkFBa0I7Z0JBQ2xCLG1CQUFtQjtnQkFDbkIsbUJBQW1CO2dCQUNuQixxQkFBcUI7Z0JBQ3JCLHdCQUF3QjtnQkFDeEIsc0JBQXNCO2FBQ3ZCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLGlCQUFpQjtnQkFDakIsZUFBZTtnQkFDZixnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsa0JBQWtCO2dCQUNsQixxQkFBcUI7Z0JBQ3JCLG1CQUFtQjtnQkFDbkIsWUFBWTtnQkFDWixtQ0FBbUM7Z0JBQ25DLDZCQUE2QjtnQkFDN0IsaUNBQWlDO2FBQ2xDO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLGlCQUFpQjtnQkFDakIsa0JBQWtCO2dCQUNsQixrQkFBa0I7Z0JBQ2xCLGdCQUFnQjtnQkFDaEIsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLG9CQUFvQjtn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O1FBQy9GLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLGFBQWMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFjLElBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFlLFlBQWEsU0FBVSxFQUFFLENBQUMsQ0FBQztJQUN0SyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGdDQUFnQyxDQUFDLEtBQXdCLEVBQUUsUUFBNEI7UUFDNUYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxpQ0FBaUMsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQzdGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksa0NBQWtDLENBQUMsS0FBd0IsRUFBRSxRQUE0QjtRQUM5RixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLDBCQUEwQixDQUFDLEtBQXdCLEVBQUUsUUFBNEI7UUFDdEYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDBCQUEwQixFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGO0FBanFCRCw0QkFpcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2FpZGV2b3BzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NkZXZvcHNhZ2VudHNlcnZpY2UuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBaWRldm9wcyBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ2FpZGV2b3BzJztcblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFthaWRldm9wc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzZGV2b3BzYWdlbnRzZXJ2aWNlLmh0bWwpLlxuICAgKlxuICAgKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZD86IHN0cmluZykge1xuICAgIHN1cGVyKHNpZCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVNlcnZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYWdlbnRzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBiYWNrbG9nIHRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUJhY2tsb2dUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVCYWNrbG9nVGFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBrbm93bGVkZ2UgaXRlbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlS25vd2xlZGdlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlS25vd2xlZGdlSXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIHNlY3VyZSBvbmUtdGltZSBzZXNzaW9uIGZvciBpbml0aWF0aW5nIG9mZi1jb25zb2xlIEFwcGxpY2F0aW9uIGxvZ2luXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPbmVUaW1lTG9naW5TZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPbmVUaW1lTG9naW5TZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFnZW50c3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUFnZW50U3BhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUFnZW50U3BhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBrbm93bGVkZ2UgaXRlbVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlS25vd2xlZGdlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlS25vd2xlZGdlSXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgYSBzZXJ2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXJlZ2lzdGVyU2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVyZWdpc3RlclNlcnZpY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIGNoYXQgZm9yIGEgY2FzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVTdXBwb3J0TGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU3VwcG9ydExldmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSB0aGUgT3BlcmF0b3IgQXBwIGFjY2VzcyB0byB0aGUgZ2l2ZW4gQWdlbnRTcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYWJsZU9wZXJhdG9yQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNhYmxlT3BlcmF0b3JBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgc2VydmljZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlU2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlU2VydmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2NvdmVyIHRvcG9sb2d5IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNjb3ZlclRvcG9sb2d5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEaXNjb3ZlclRvcG9sb2d5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZW5hYmxlIHRoZSBPcGVyYXRvciBBcHAgdG8gYWNjZXNzIHRoZSBnaXZlbiBBZ2VudFNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FbmFibGVPcGVyYXRvckFwcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5hYmxlT3BlcmF0b3JBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBlbmQgYSBjaGF0IGZvciBhIGNhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0VuZENoYXRGb3JDYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFbmRDaGF0Rm9yQ2FzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhY2NvdW50IHVzYWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEFjY291bnRVc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWNjb3VudFVzYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGFnZW50c3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBc3NvY2lhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBiYWNrbG9nIHRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QmFja2xvZ1Rhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEJhY2tsb2dUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEga25vd2xlZGdlIGl0ZW1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0S25vd2xlZGdlSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0S25vd2xlZGdlSXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBvcGVyYXRvciBhdXRoIGNvbmZpZyBmb3IgYW55IGVuYWJsZWQgYXV0aCBmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9wZXJhdG9yQXBwVGVhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9wZXJhdG9yQXBwVGVhbXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSByZWNvbW1lbmRhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZWNvbW1lbmRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc2VydmljZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0U2VydmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGhhbmRsZSBPQXV0aCBjYWxsYmFjayBmcm9tIGV4dGVybmFsIHNlcnZpY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSGFuZGxlU2VydmljZVJlZ2lzdHJhdGlvbkNhbGxiYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdIYW5kbGVTZXJ2aWNlUmVnaXN0cmF0aW9uQ2FsbGJhY2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbml0aWF0ZSBhIGNoYXQgZm9yIGEgY2FzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW5pdGlhdGVDaGF0Rm9yQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW5pdGlhdGVDaGF0Rm9yQ2FzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGluaXRpYXRlIE9BdXRoIGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW5pdGlhdGVTZXJ2aWNlUmVnaXN0cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdJbml0aWF0ZVNlcnZpY2VSZWdpc3RyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFnZW50c3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFnZW50U3BhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QWdlbnRTcGFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFzc29jaWF0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBiYWNrbG9nIHRhc2tzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCYWNrbG9nVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCYWNrbG9nVGFza3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGV4ZWN1dGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEV4ZWN1dGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RFeGVjdXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBnb2Fsc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0R29hbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RHb2FscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgam91cm5hbCByZWNvcmRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RKb3VybmFsUmVjb3JkcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEpvdXJuYWxSZWNvcmRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBrbm93bGVkZ2UgaXRlbXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEtub3dsZWRnZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0S25vd2xlZGdlSXRlbXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHBlbmRpbmcgbWVzc2FnZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFBlbmRpbmdNZXNzYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFBlbmRpbmdNZXNzYWdlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcmVjb21tZW5kYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZWNvbW1lbmRhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHNlcnZpY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTZXJ2aWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlcnZpY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB3ZWJob29rcyBmb3IgYXNzb2NpYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFdlYmhvb2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V2ViaG9va3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWdpc3RlciBzcGVjaWZpYyBzZXJ2aWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWdpc3RlclNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyU2VydmljZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvb2sgdXAgYSByZWdpc3RlcmVkIHNlcnZpY2UgYWNjZXNzaWJsZSByZXNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoU2VydmljZUFjY2Vzc2libGVSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoU2VydmljZUFjY2Vzc2libGVSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSBhbiBhZ2VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VuZENoYXRNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZW5kQ2hhdE1lc3NhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYWdlbnRzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQWdlbnRTcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQWdlbnRTcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhc3NvY2lhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9kZXZvcHNhZ2VudC9sYXRlc3QvdXNlcmd1aWRlL3doYXQtaXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQmFja2xvZ1Rhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUJhY2tsb2dUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEga25vd2xlZGdlIGl0ZW1cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUtub3dsZWRnZUl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUtub3dsZWRnZUl0ZW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgdGVhbXMgdGhhdCB0aGUgT3BlcmF0b3IgQXBwIGlzIGVuYWJsZWQgZm9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvd2hhdC1pcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVPcGVyYXRvckFwcFRlYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVPcGVyYXRvckFwcFRlYW1zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgcmVjb21tZW5kYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS93aGF0LWlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJlY29tbWVuZGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZWNvbW1lbmRhdGlvbicpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQXNzb2NpYXRlU2VydmljZScsXG4gICAgICAnQ3JlYXRlQWdlbnRTcGFjZScsXG4gICAgICAnQ3JlYXRlQmFja2xvZ1Rhc2snLFxuICAgICAgJ0NyZWF0ZUtub3dsZWRnZUl0ZW0nLFxuICAgICAgJ0NyZWF0ZU9uZVRpbWVMb2dpblNlc3Npb24nLFxuICAgICAgJ0RlbGV0ZUFnZW50U3BhY2UnLFxuICAgICAgJ0RlbGV0ZUtub3dsZWRnZUl0ZW0nLFxuICAgICAgJ0RlcmVnaXN0ZXJTZXJ2aWNlJyxcbiAgICAgICdEZXNjcmliZVN1cHBvcnRMZXZlbCcsXG4gICAgICAnRGlzYWJsZU9wZXJhdG9yQXBwJyxcbiAgICAgICdEaXNhc3NvY2lhdGVTZXJ2aWNlJyxcbiAgICAgICdEaXNjb3ZlclRvcG9sb2d5JyxcbiAgICAgICdFbmFibGVPcGVyYXRvckFwcCcsXG4gICAgICAnRW5kQ2hhdEZvckNhc2UnLFxuICAgICAgJ0luaXRpYXRlQ2hhdEZvckNhc2UnLFxuICAgICAgJ1JlZ2lzdGVyU2VydmljZScsXG4gICAgICAnU2VuZENoYXRNZXNzYWdlJyxcbiAgICAgICdVcGRhdGVBZ2VudFNwYWNlJyxcbiAgICAgICdVcGRhdGVBc3NvY2lhdGlvbicsXG4gICAgICAnVXBkYXRlQmFja2xvZ1Rhc2snLFxuICAgICAgJ1VwZGF0ZUtub3dsZWRnZUl0ZW0nLFxuICAgICAgJ1VwZGF0ZU9wZXJhdG9yQXBwVGVhbXMnLFxuICAgICAgJ1VwZGF0ZVJlY29tbWVuZGF0aW9uJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldEFjY291bnRVc2FnZScsXG4gICAgICAnR2V0QWdlbnRTcGFjZScsXG4gICAgICAnR2V0QXNzb2NpYXRpb24nLFxuICAgICAgJ0dldEJhY2tsb2dUYXNrJyxcbiAgICAgICdHZXRLbm93bGVkZ2VJdGVtJyxcbiAgICAgICdHZXRPcGVyYXRvckFwcFRlYW1zJyxcbiAgICAgICdHZXRSZWNvbW1lbmRhdGlvbicsXG4gICAgICAnR2V0U2VydmljZScsXG4gICAgICAnSGFuZGxlU2VydmljZVJlZ2lzdHJhdGlvbkNhbGxiYWNrJyxcbiAgICAgICdJbml0aWF0ZVNlcnZpY2VSZWdpc3RyYXRpb24nLFxuICAgICAgJ1NlYXJjaFNlcnZpY2VBY2Nlc3NpYmxlUmVzb3VyY2UnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEFnZW50U3BhY2VzJyxcbiAgICAgICdMaXN0QXNzb2NpYXRpb25zJyxcbiAgICAgICdMaXN0QmFja2xvZ1Rhc2tzJyxcbiAgICAgICdMaXN0RXhlY3V0aW9ucycsXG4gICAgICAnTGlzdEdvYWxzJyxcbiAgICAgICdMaXN0Sm91cm5hbFJlY29yZHMnLFxuICAgICAgJ0xpc3RLbm93bGVkZ2VJdGVtcycsXG4gICAgICAnTGlzdFBlbmRpbmdNZXNzYWdlcycsXG4gICAgICAnTGlzdFJlY29tbWVuZGF0aW9ucycsXG4gICAgICAnTGlzdFNlcnZpY2VzJyxcbiAgICAgICdMaXN0V2ViaG9va3MnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBBZ2VudFNwYWNlUmVzb3VyY2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZGV2b3BzYWdlbnQvbGF0ZXN0L3VzZXJndWlkZS9cbiAgICpcbiAgICogQHBhcmFtIGFnZW50U3BhY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhZ2VudFNwYWNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkFnZW50U3BhY2VSZXNvdXJjZUFnZW50U3BhY2VJZCgpXG4gICAqL1xuICBwdWJsaWMgb25BZ2VudFNwYWNlUmVzb3VyY2UoYWdlbnRTcGFjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06YWlkZXZvcHM6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmFnZW50c3BhY2UvJHsgYWdlbnRTcGFjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBBc3NvY2lhdGlvblJlc291cmNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Rldm9wc2FnZW50L2xhdGVzdC91c2VyZ3VpZGUvXG4gICAqXG4gICAqIEBwYXJhbSBhZ2VudFNwYWNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYWdlbnRTcGFjZUlkLlxuICAgKiBAcGFyYW0gYXNzb2NpYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhc3NvY2lhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBc3NvY2lhdGlvblJlc291cmNlQWdlbnRTcGFjZUlkKClcbiAgICogLSAuaWZ