cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,566 lines • 133 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LexV2 = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [lex-v2](https://docs.aws.amazon.com/service-authorization/latest/reference/list_lex-v2.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class LexV2 extends shared_1.PolicyStatement {
/**
* Grants permission to create new items in an existing custom vocabulary
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_BatchCreateCustomVocabularyItem.html
*/
toBatchCreateCustomVocabularyItem() {
return this.to('BatchCreateCustomVocabularyItem');
}
/**
* Grants permission to delete existing items in an existing custom vocabulary
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_BatchDeleteCustomVocabularyItem.html
*/
toBatchDeleteCustomVocabularyItem() {
return this.to('BatchDeleteCustomVocabularyItem');
}
/**
* Grants permission to update existing items in an existing custom vocabulary
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_BatchUpdateCustomVocabularyItem.html
*/
toBatchUpdateCustomVocabularyItem() {
return this.to('BatchUpdateCustomVocabularyItem');
}
/**
* Grants permission to build an existing bot locale in a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_BuildBotLocale.html
*/
toBuildBotLocale() {
return this.to('BuildBotLocale');
}
/**
* Grants permission to create a new bot and a test bot alias pointing to the DRAFT bot version
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBot.html
*/
toCreateBot() {
return this.to('CreateBot');
}
/**
* Grants permission to create a new bot alias in a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotAlias.html
*/
toCreateBotAlias() {
return this.to('CreateBotAlias');
}
/**
* Grants permission to create a new bot locale in an existing bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotLocale.html
*/
toCreateBotLocale() {
return this.to('CreateBotLocale');
}
/**
* Grants permission to create bot replica for a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotReplica.html
*/
toCreateBotReplica() {
return this.to('CreateBotReplica');
}
/**
* Grants permission to create a new version of an existing bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotVersion.html
*/
toCreateBotVersion() {
return this.to('CreateBotVersion');
}
/**
* Grants permission to create an export for an existing resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateExport.html
*/
toCreateExport() {
return this.to('CreateExport');
}
/**
* Grants permission to create a new intent in an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html
*/
toCreateIntent() {
return this.to('CreateIntent');
}
/**
* Grants permission to create a new resource policy for a Lex resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateResourcePolicy.html
*/
toCreateResourcePolicy() {
return this.to('CreateResourcePolicy');
}
/**
* Grants permission to create a new resource policy statement for a Lex resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateResourcePolicyStatement.html
*/
toCreateResourcePolicyStatement() {
return this.to('CreateResourcePolicyStatement');
}
/**
* Grants permission to create a new slot in an intent
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateSlot.html
*/
toCreateSlot() {
return this.to('CreateSlot');
}
/**
* Grants permission to create a new slot type in an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateSlotType.html
*/
toCreateSlotType() {
return this.to('CreateSlotType');
}
/**
* Grants permission to create a test set discrepancy report
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateTestSetDiscrepancyReport.html
*/
toCreateTestSetDiscrepancyReport() {
return this.to('CreateTestSetDiscrepancyReport');
}
/**
* Grants permission to create an upload url for import file
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateUploadUrl.html
*/
toCreateUploadUrl() {
return this.to('CreateUploadUrl');
}
/**
* Grants permission to delete an existing bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBot.html
*/
toDeleteBot() {
return this.to('DeleteBot');
}
/**
* Grants permission to delete an existing bot alias in a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBotAlias.html
*/
toDeleteBotAlias() {
return this.to('DeleteBotAlias');
}
/**
* Grants permission to delete a bot analyzer recommendation
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBotAnalyzerRecommendation.html
*/
toDeleteBotAnalyzerRecommendation() {
return this.to('DeleteBotAnalyzerRecommendation');
}
/**
* Grants permission to delete an existing bot locale in a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBotLocale.html
*/
toDeleteBotLocale() {
return this.to('DeleteBotLocale');
}
/**
* Grants permission to delete an existing bot replica
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBotReplica.html
*/
toDeleteBotReplica() {
return this.to('DeleteBotReplica');
}
/**
* Grants permission to delete an existing bot version
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteBotVersion.html
*/
toDeleteBotVersion() {
return this.to('DeleteBotVersion');
}
/**
* Grants permission to delete an existing custom vocabulary in a bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteCustomVocabulary.html
*/
toDeleteCustomVocabulary() {
return this.to('DeleteCustomVocabulary');
}
/**
* Grants permission to delete an existing export
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteExport.html
*/
toDeleteExport() {
return this.to('DeleteExport');
}
/**
* Grants permission to delete an existing import
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteImport.html
*/
toDeleteImport() {
return this.to('DeleteImport');
}
/**
* Grants permission to delete an existing intent in a bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteIntent.html
*/
toDeleteIntent() {
return this.to('DeleteIntent');
}
/**
* Grants permission to delete an existing resource policy for a Lex resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteResourcePolicy.html
*/
toDeleteResourcePolicy() {
return this.to('DeleteResourcePolicy');
}
/**
* Grants permission to delete an existing resource policy statement for a Lex resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteResourcePolicyStatement.html
*/
toDeleteResourcePolicyStatement() {
return this.to('DeleteResourcePolicyStatement');
}
/**
* Grants permission to delete session information for a bot alias and user ID
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_DeleteSession.html
*/
toDeleteSession() {
return this.to('DeleteSession');
}
/**
* Grants permission to delete an existing slot in an intent
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteSlot.html
*/
toDeleteSlot() {
return this.to('DeleteSlot');
}
/**
* Grants permission to delete an existing slot type in a bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteSlotType.html
*/
toDeleteSlotType() {
return this.to('DeleteSlotType');
}
/**
* Grants permission to delete an existing test set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteTestSet.html
*/
toDeleteTestSet() {
return this.to('DeleteTestSet');
}
/**
* Grants permission to delete utterance data for a bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DeleteUtterances.html
*/
toDeleteUtterances() {
return this.to('DeleteUtterances');
}
/**
* Grants permission to retrieve an existing bot
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBot.html
*/
toDescribeBot() {
return this.to('DescribeBot');
}
/**
* Grants permission to retrieve an existing bot alias
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotAlias.html
*/
toDescribeBotAlias() {
return this.to('DescribeBotAlias');
}
/**
* Grants permission to describe a bot analyzer recommendation
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotAnalyzerRecommendation.html
*/
toDescribeBotAnalyzerRecommendation() {
return this.to('DescribeBotAnalyzerRecommendation');
}
/**
* Grants permission to retrieve an existing bot locale
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotLocale.html
*/
toDescribeBotLocale() {
return this.to('DescribeBotLocale');
}
/**
* Grants permission to retrieve metadata information about a bot recommendation
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotRecommendation.html
*/
toDescribeBotRecommendation() {
return this.to('DescribeBotRecommendation');
}
/**
* Grants permission to retrieve an existing bot replica
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotReplica.html
*/
toDescribeBotReplica() {
return this.to('DescribeBotReplica');
}
/**
* Grants permission to retrieve metadata information for a bot resource generation
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotResourceGeneration.html
*/
toDescribeBotResourceGeneration() {
return this.to('DescribeBotResourceGeneration');
}
/**
* Grants permission to retrieve an existing bot version
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeBotVersion.html
*/
toDescribeBotVersion() {
return this.to('DescribeBotVersion');
}
/**
* Grants permission to retrieve metadata of an existing custom vocabulary
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeCustomVocabularyMetadata.html
*/
toDescribeCustomVocabularyMetadata() {
return this.to('DescribeCustomVocabularyMetadata');
}
/**
* Grants permission to retrieve an existing export
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeExport.html
*/
toDescribeExport() {
return this.to('DescribeExport');
}
/**
* Grants permission to retrieve an existing import
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeImport.html
*/
toDescribeImport() {
return this.to('DescribeImport');
}
/**
* Grants permission to retrieve an existing intent
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeIntent.html
*/
toDescribeIntent() {
return this.to('DescribeIntent');
}
/**
* Grants permission to retrieve an existing resource policy for a Lex resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeResourcePolicy.html
*/
toDescribeResourcePolicy() {
return this.to('DescribeResourcePolicy');
}
/**
* Grants permission to retrieve an existing slot
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeSlot.html
*/
toDescribeSlot() {
return this.to('DescribeSlot');
}
/**
* Grants permission to retrieve an existing slot type
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeSlotType.html
*/
toDescribeSlotType() {
return this.to('DescribeSlotType');
}
/**
* Grants permission to retrieve test execution metadata
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeTestExecution.html
*/
toDescribeTestExecution() {
return this.to('DescribeTestExecution');
}
/**
* Grants permission to retrieve an existing test set
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeTestSet.html
*/
toDescribeTestSet() {
return this.to('DescribeTestSet');
}
/**
* Grants permission to retrieve test set discrepancy report metadata
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeTestSetDiscrepancyReport.html
*/
toDescribeTestSetDiscrepancyReport() {
return this.to('DescribeTestSetDiscrepancyReport');
}
/**
* Grants permission to retrieve test set generation metadata
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_DescribeTestSetGeneration.html
*/
toDescribeTestSetGeneration() {
return this.to('DescribeTestSetGeneration');
}
/**
* Grants permission to generate supported fields or elements for a bot
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_GenerateBotElement.html
*/
toGenerateBotElement() {
return this.to('GenerateBotElement');
}
/**
* Grants permission to retrieve session information for a bot alias and user ID
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_GetSession.html
*/
toGetSession() {
return this.to('GetSession');
}
/**
* Grants permission to retrieve artifacts URL for a test execution
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_GetTestExecutionArtifactsUrl.html
*/
toGetTestExecutionArtifactsUrl() {
return this.to('GetTestExecutionArtifactsUrl');
}
/**
* Grants permission to list utterances and statistics for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListAggregatedUtterances.html
*/
toListAggregatedUtterances() {
return this.to('ListAggregatedUtterances');
}
/**
* Grants permission to list alias replicas in a bot replica
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotAliasReplicas.html
*/
toListBotAliasReplicas() {
return this.to('ListBotAliasReplicas');
}
/**
* Grants permission to list bot aliases in an bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotAliases.html
*/
toListBotAliases() {
return this.to('ListBotAliases');
}
/**
* Grants permission to list bot analyzer recommendations
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotAnalyzerRecommendations.html
*/
toListBotAnalyzerRecommendations() {
return this.to('ListBotAnalyzerRecommendations');
}
/**
* Grants permission to list bot locales in a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotLocales.html
*/
toListBotLocales() {
return this.to('ListBotLocales');
}
/**
* Grants permission to get a list of bot recommendations that meet the specified criteria
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotRecommendations.html
*/
toListBotRecommendations() {
return this.to('ListBotRecommendations');
}
/**
* Grants permission to list replicas of a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotReplicas.html
*/
toListBotReplicas() {
return this.to('ListBotReplicas');
}
/**
* Grants permission to list the resource generations for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotResourceGenerations.html
*/
toListBotResourceGenerations() {
return this.to('ListBotResourceGenerations');
}
/**
* Grants permission to list version replicas in a bot replica
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotVersionReplicas.html
*/
toListBotVersionReplicas() {
return this.to('ListBotVersionReplicas');
}
/**
* Grants permission to list existing bot versions
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBotVersions.html
*/
toListBotVersions() {
return this.to('ListBotVersions');
}
/**
* Grants permission to list existing bots
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBots.html
*/
toListBots() {
return this.to('ListBots');
}
/**
* Grants permission to list built-in intents
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBuiltInIntents.html
*/
toListBuiltInIntents() {
return this.to('ListBuiltInIntents');
}
/**
* Grants permission to list built-in slot types
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListBuiltInSlotTypes.html
*/
toListBuiltInSlotTypes() {
return this.to('ListBuiltInSlotTypes');
}
/**
* Grants permission to list items of an existing custom vocabulary
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListCustomVocabularyItems.html
*/
toListCustomVocabularyItems() {
return this.to('ListCustomVocabularyItems');
}
/**
* Grants permission to list existing exports
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListExports.html
*/
toListExports() {
return this.to('ListExports');
}
/**
* Grants permission to list existing imports
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListImports.html
*/
toListImports() {
return this.to('ListImports');
}
/**
* Grants permission to list intent analytics metrics for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListIntentMetrics.html
*/
toListIntentMetrics() {
return this.to('ListIntentMetrics');
}
/**
* Grants permission to list intent path analytics for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListIntentPaths.html
*/
toListIntentPaths() {
return this.to('ListIntentPaths');
}
/**
* Grants permission to list intentStage analytics metrics for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListIntentStageMetrics.html
*/
toListIntentStageMetrics() {
return this.to('ListIntentStageMetrics');
}
/**
* Grants permission to list intents in a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListIntents.html
*/
toListIntents() {
return this.to('ListIntents');
}
/**
* Grants permission to get a list of recommended intents provided by the bot recommendation
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListRecommendedIntents.html
*/
toListRecommendedIntents() {
return this.to('ListRecommendedIntents');
}
/**
* Grants permission to list session analytics data for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListSessionAnalyticsData.html
*/
toListSessionAnalyticsData() {
return this.to('ListSessionAnalyticsData');
}
/**
* Grants permission to list session analytics metrics for a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListSessionMetrics.html
*/
toListSessionMetrics() {
return this.to('ListSessionMetrics');
}
/**
* Grants permission to list slot types in a bot
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListSlotTypes.html
*/
toListSlotTypes() {
return this.to('ListSlotTypes');
}
/**
* Grants permission to list slots in an intent
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListSlots.html
*/
toListSlots() {
return this.to('ListSlots');
}
/**
* Grants permission to lists tags for a Lex resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to retrieve test results data for a test execution
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListTestExecutionResultItems.html
*/
toListTestExecutionResultItems() {
return this.to('ListTestExecutionResultItems');
}
/**
* Grants permission to list test executions
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListTestExecutions.html
*/
toListTestExecutions() {
return this.to('ListTestExecutions');
}
/**
* Grants permission to retrieve records inside an existing test set
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListTestSetRecords.html
*/
toListTestSetRecords() {
return this.to('ListTestSetRecords');
}
/**
* Grants permission to list test sets
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_ListTestSets.html
*/
toListTestSets() {
return this.to('ListTestSets');
}
/**
* Grants permission to create a new session or modify an existing session for a bot alias and user ID
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html
*/
toPutSession() {
return this.to('PutSession');
}
/**
* Grants permission to send user input (text-only) to an bot alias
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html
*/
toRecognizeText() {
return this.to('RecognizeText');
}
/**
* Grants permission to send user input (text or speech) to an bot alias
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html
*/
toRecognizeUtterance() {
return this.to('RecognizeUtterance');
}
/**
* Grants permission to search for associated transcripts that meet the specified criteria
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_SearchAssociatedTranscripts.html
*/
toSearchAssociatedTranscripts() {
return this.to('SearchAssociatedTranscripts');
}
/**
* Grants permission to start a bot analyzer for an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartBotAnalyzer.html
*/
toStartBotAnalyzer() {
return this.to('StartBotAnalyzer');
}
/**
* Grants permission to start a bot recommendation for an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartBotRecommendation.html
*/
toStartBotRecommendation() {
return this.to('StartBotRecommendation');
}
/**
* Grants permission to start a resource generation for an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartBotResourceGeneration.html
*/
toStartBotResourceGeneration() {
return this.to('StartBotResourceGeneration');
}
/**
* Grants permission to stream user input (speech/text/DTMF) to a bot alias
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_StartConversation.html
*/
toStartConversation() {
return this.to('StartConversation');
}
/**
* Grants permission to start a new import with the uploaded import file
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartImport.html
*/
toStartImport() {
return this.to('StartImport');
}
/**
* Grants permission to start a test execution using a test set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartTestExecution.html
*/
toStartTestExecution() {
return this.to('StartTestExecution');
}
/**
* Grants permission to generate a test set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StartTestSetGeneration.html
*/
toStartTestSetGeneration() {
return this.to('StartTestSetGeneration');
}
/**
* Grants permission to stop a bot analyzer for an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StopBotAnalyzer.html
*/
toStopBotAnalyzer() {
return this.to('StopBotAnalyzer');
}
/**
* Grants permission to stop a bot recommendation for an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_StopBotRecommendation.html
*/
toStopBotRecommendation() {
return this.to('StopBotRecommendation');
}
/**
* Grants permission to add or overwrite tags of a Lex resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove tags from a Lex resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update an existing bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBot.html
*/
toUpdateBot() {
return this.to('UpdateBot');
}
/**
* Grants permission to update an existing bot alias
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotAlias.html
*/
toUpdateBotAlias() {
return this.to('UpdateBotAlias');
}
/**
* Grants permission to update an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotLocale.html
*/
toUpdateBotLocale() {
return this.to('UpdateBotLocale');
}
/**
* Grants permission to update an existing bot recommendation request
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotRecommendation.html
*/
toUpdateBotRecommendation() {
return this.to('UpdateBotRecommendation');
}
/**
* Grants permission to update an existing export
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateExport.html
*/
toUpdateExport() {
return this.to('UpdateExport');
}
/**
* Grants permission to update an existing intent
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateIntent.html
*/
toUpdateIntent() {
return this.to('UpdateIntent');
}
/**
* Grants permission to update an existing resource policy for a Lex resource
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateResourcePolicy.html
*/
toUpdateResourcePolicy() {
return this.to('UpdateResourcePolicy');
}
/**
* Grants permission to update an existing slot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateSlot.html
*/
toUpdateSlot() {
return this.to('UpdateSlot');
}
/**
* Grants permission to update an existing slot type
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateSlotType.html
*/
toUpdateSlotType() {
return this.to('UpdateSlotType');
}
/**
* Grants permission to update an existing test set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateTestSet.html
*/
toUpdateTestSet() {
return this.to('UpdateTestSet');
}
/**
* Grants permission to create a bot channel in an existing bot
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/dg/deploying-messaging-platform.html
*/
toCreateBotChannel() {
return this.to('CreateBotChannel');
}
/**
* Grants permission to create a new custom vocabulary in an existing bot locale
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/dg/vocab.html
*/
toCreateCustomVocabulary() {
return this.to('CreateCustomVocabulary');
}
/**
* Grants permission to import a new test-set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/dg/create-test-set-from-CSV.html
*/
toCreateTestSet() {
return this.to('CreateTestSet');
}
/**
* Grants permission to delete an existing bot channel
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/dg/deploying-messaging-platform.html
*/
toDeleteBotChannel() {
return this.to('DeleteBotChannel');
}
/**
* Grants permission to retrieve an existing bot channel
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/dg/deploying-messaging-platform.html
*/
toDescribeBotChannel() {
return this.to('DescribeBotChannel');
}
/**
* Grants permission to retrieve an existing custom vocabulary
*
* Access Level: Read
*
* https://docs.aws.amazon.com/lexv2/latest/dg/vocab.html
*/
toDescribeCustomVocabulary() {
return this.to('DescribeCustomVocabulary');
}
/**
* Grants permission to list bot channels
*
* Access Level: List
*
* https://docs.aws.amazon.com/lexv2/latest/dg/deploying-messaging-platform.html
*/
toListBotChannels() {
return this.to('ListBotChannels');
}
/**
* Grants permission to update an existing custom vocabulary
*
* Access Level: Write
*
* https://docs.aws.amazon.com/lexv2/latest/dg/vocab.html
*/
toUpdateCustomVocabulary() {
return this.to('UpdateCustomVocabulary');
}
/**
* Adds a resource of type bot to the statement
*
* https://docs.aws.amazon.com/lexv2/latest/dg/how-it-works.html
*
* @param botId - Identifier for the botId.
* @param partition2 - Identifier for the partition2.
* @param region2 - Identifier for the region2.
* @param account2 - Identifier for the account2.
* @param botName - Identifier for the botName.
* @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()
*/
onBot(botId, partition2, region2, account2, botName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:lex:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:bot/${botId}, arn:${partition2}:lex:${region2}:${account2}:bot:${botName}`);
}
/**
* Adds a resource of type bot alias to the statement
*
* https://docs.aws.amazon.com/lexv2/latest/dg/how-it-works.html
*
* @param botId - Identifier for the botId.
* @param botAliasId - Identifier for the botAliasId.
* @param partition2 - Identifier for the partition2.
* @param region2 - Identifier for the region2.
* @param account2 - Identifier for the account2.
* @param botName - Identifier for the botName.
* @param botAlias - Identifier for the botAlias.
* @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()
*/
onBotAlias(botId, botAliasId, partition2, region2, account2, botName, botAlias, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:lex:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:bot-alias/${botId}/${botAliasId}, arn:${partition2}:lex:${region2}:${account2}:bot:${botName}:${botAlias}`);
}
/**
* Adds a resource of type test set to the statement
*
* https://docs.aws.amazon.com/lexv2/latest/dg/test-workbench.html
*
* @param testSetId - Identifier for the testSetId.
* @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()
*/
onTestSet(testSetId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:lex:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:test-set/${testSetId}`);
}
/**
* Filters access by the tags in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateBot()
* - .toCreateBotAlias()
* - .toStartImport()
* - .toTagResource()
* - .toUntagResource()
*
* @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 the tags attached to a Lex resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toBatchCreateCustomVocabularyItem()
* - .toBatchDeleteCustomVocabularyItem()
* - .toBatchUpdateCustomVocabularyItem()
* - .toBuildBotLocale()
* - .toCreateBot()
* - .toCreateBotAlias()
* - .toCreateBotLocale()
* - .toCreateBotReplica()
* - .toCreateBotVersion()
* - .toCreateExport()
* - .toCreateIntent()
* - .toCreateResourcePolicy()
* - .toCreateResourcePolicyStatement()
* - .toCreateSlot()
* - .toCreateSlotType()
* - .toCreateTestSetDiscrepancyReport()
* - .toDeleteBot()
* - .toDeleteBotAlias()
* - .toDeleteBotAnalyzerRecommendation()
* - .toDeleteBotLocale()
* - .toDeleteBotReplica()
* - .toDeleteBotVersion()
* - .toDeleteCustomVocabulary()
* - .toDeleteExport()
* - .toDeleteImport()
* - .toDeleteIntent()
* - .toDeleteResourcePolicy()
* - .toDeleteResourcePolicyStatement()
* - .toDeleteSession()
* - .toDeleteSlot()
* - .toDeleteSlotType()
* - .toDeleteTestSet()
* - .toDeleteUtterances()
* - .toDescribeBot()
* - .toDescribeBotAlias()
* - .toDescribeBotAnalyzerRecommendation()
* - .toDescribeBotLocale()
* - .toDescribeBotRecommendation()
* - .toDescribeBotReplica()
* - .toDescribeBotResourceGeneration()
* - .toDescribeBotVersion()
* - .toDescribeCustomVocabularyMetadata()
* - .toDescribeExport()
* - .toDescribeImport()
* - .toDescribeIntent()
* - .toDescribeResourcePolicy()
* - .toDescribeSlot()
* - .toDescribeSlotType()
* - .toDescribeTestExecution()
* - .toDescribeTestSet()
* - .toDescribeTestSetDiscrepancyReport()
* - .toDescribeTestSetGeneration()
* - .toGenerateBotElement()
* - .toGetSession()
* - .toGetTestExecutionArtifactsUrl()
* - .toListAggregatedUtterances()
* - .toListBotAliasReplicas()
* - .toListBotAliases()
* - .toListBotAnalyzerRecommendations()
* - .toListBotLocales()
* - .toListBotRecommendations()
* - .toListBotReplicas()
* - .toListBotResourceGenerations()
* - .toListBotVersionReplicas()
* - .toListBotVersions()
* - .toListCustomVocabularyItems()
* - .toListIntentMetrics()
* - .toListIntentPaths()
* - .toListIntentStageMetrics()
* - .toListIntents()
* - .toListRecommendedIntents()
* - .toListSessionAnalyticsData()
* - .toListSessionMetrics()
* - .toListSlotTypes()
* - .toListSlots()
* - .toListTagsForResource()
* - .toListTestExecutionResultItems()
* - .toListTestSetRecords()
* - .toPutSession()
* - .toRecognizeText()
* - .toRecognizeUtterance()
* - .toSearchAssociatedTranscripts()
* - .toStartBotAnalyzer()
* - .toStartBotRecommendation()
* - .toStartBotResourceGeneration()
* - .toStartConversation()
* - .toStartImport()
* - .toStartTestExecution()
* - .toStartTestSetGeneration()
* - .toStopBotAnalyzer()
* - .toStopBotRecommendation()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateBot()
* - .toUpdateBotAlias()
* - .toUpdateBotLocale()
* - .toUpdateBotRecommendation()
* - .toUpdateExport()
* - .toUpdateIntent()
* - .toUpdateResourcePolicy()
* - .toUpdateSlot()
* - .toUpdateSlotType()
* - .toUpdateTestSet()
* - .toCreateBotChannel()
* - .toCreateCustomVocabulary()
* - .toDeleteBotChannel()
* - .toDescribeBotChannel()
* - .toDescribeCustomVocabulary()
* - .toListBotChannels()
* - .toUpdateCustomVocabulary()
*
* Applies to resource types:
* - bot
* - bot alias
* - test set
*
* @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 the set of tag keys in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateBot()
* - .toCreateBotAlias()
* - .toStartImport()
* - .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 [lex-v2](https://docs.aws.amazon.com/service-authorization/latest/reference/list_lex-v2.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'lex';
this.accessLevelList = {
Write: [
'BatchCreateCustomVocabularyItem',
'BatchDeleteCustomVocabularyItem',
'BatchUpdateCustomVocabularyItem',
'BuildBotLocale',
'CreateBot',
'CreateBotAlias',
'CreateBotLocale',
'CreateBotReplica',
'CreateBotVersion',
'CreateExport',
'CreateIntent',
'CreateResourcePolicy',
'CreateResourcePolicyStatement',
'CreateSlot',
'CreateSlotType',
'CreateTestSetDiscrepancyReport',
'CreateUploadUrl',
'DeleteBot',
'DeleteBotAlias',
'DeleteBotAnalyzerRecommendation',
'DeleteBotLocale',
'DeleteBotReplica',
'DeleteBotVersion',
'DeleteCustomVocabulary',
'DeleteExport',
'DeleteImport',
'DeleteIntent',
'DeleteResourcePolicy',
'DeleteResourcePolicyStatement',
'DeleteSession',
'DeleteSlot',
'DeleteSlotType',
'DeleteTestSet',
'DeleteUtterances',
'PutSession',
'RecognizeText',
'RecognizeUtterance',
'StartBotAnalyzer',
'StartBotRecommendation',
'StartBotResourceGeneration',
'StartConversation',
'StartImport',
'StartTestExecution',
'StartTestSetGeneration',
'StopBotAnalyzer',
'StopBotRecommendation',
'TagResource',
'UntagResource',
'UpdateBot',
'UpdateBotAlias',
'UpdateBotLocale',
'UpdateBotRecommendation',
'UpdateExport',
'UpdateIntent',
'UpdateResourcePolicy',
'UpdateSlot',
'UpdateSlotType',
'UpdateTestSet',
'CreateBotChannel',
'CreateCustomVocabulary',
'CreateTestSet',
'DeleteBotChannel',
'UpdateCustomVocabulary'
],
Read: [
'DescribeBot',
'DescribeBotAlias',
'DescribeBotAnalyzerRecommendation',
'DescribeBotLocale',
'DescribeBotRecommendation',
'DescribeBotReplica',
'DescribeBotResourceGeneration',
'DescribeBotVersion',
'DescribeCustomVocabularyMetadata',
'DescribeExport',
'DescribeImport',
'DescribeIntent',
'DescribeResourcePolicy',
'DescribeSlot',
'DescribeSlotType',
'DescribeTestExecution',
'DescribeTestSet',
'DescribeTestSetDiscrepancyReport',
'DescribeTestSetGeneration',
'GenerateBotElement',
'GetSession',
'GetTestExecutionArtifactsUrl',
'ListTagsForResource',
'ListTestExecutionResultItems',
'ListTestSetRecords',
'DescribeBotChannel',
'DescribeCustomVocabulary'
],
List: [
'ListAggregatedUtterances',
'ListBotAliasReplicas',
'ListBotAliases',
'ListBotAnalyzerRecommendations',
'ListBotLocales',
'ListBotRecommendations',
'ListBotReplicas',
'ListBotResourceGenerations',
'ListBotVersionReplicas',
'ListBotVersions',
'ListBots',
'ListBuiltInIntents',
'ListBuiltInSlotTypes',
'ListCustomVocabularyItems',
'ListExports',
'ListImports',
'ListIntentMetrics',
'ListIntentPaths',
'ListIntentStageMetrics',
'ListIntents',
'ListRecommendedIntents',
'ListSessionAnalyticsData',
'ListSessionMetrics',
'ListSlotTypes',
'ListSlots',
'ListTestExecutions',
'ListTestSets',
'SearchAssociatedTranscripts',
'ListBotChannels'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.LexV2 = LexV2;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGV4LXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxLQUFNLFNBQVEsd0JBQWU7SUFHeEM7Ozs7OztPQU1HO0lBQ0ksaUNBQWlDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQ0FBaUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlDQUFpQztRQUN0QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUNBQWlDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUNBQW1DO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwrQkFBK0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0NBQWtDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQ0FBa0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksOEJBQThCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDZCQUE2QjtRQUNsQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUJBQXlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDBCQUEwQjtRQUMvQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQXNJRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNJLEtBQUssQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxPQUFlLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDdkosT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIsUUFBUyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsUUFBUyxLQUFNLFNBQVUsVUFBVyxRQUFTLE9BQVEsSUFBSyxRQUFTLFFBQVMsT0FBUSxFQUFFLENBQUMsQ0FBQztJQUM5TixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNJLFVBQVUsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ2xNLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLFFBQVMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFjLElBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFlLGNBQWUsS0FBTSxJQUFLLFVBQVcsU0FBVSxVQUFXLFFBQVMsT0FBUSxJQUFLLFFBQVMsUUFBUyxPQUFRLElBQUssUUFBUyxFQUFFLENBQUMsQ0FBQztJQUNsUSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksU0FBUyxDQUFDLFNBQWlCLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDdkYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIsUUFBUyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsYUFBYyxTQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2xLLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSSxlQUFlLENBQUMsTUFBYyxFQUFFLEtBQXdCLEVBQUUsUUFBNEI7UUFDM0YsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFtQixNQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2SEc7SUFDSSxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsS0FBd0IsRUFBRSxRQUE0QjtRQUM1RixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW9CLE1BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksWUFBWSxDQUFDLEtBQXdCLEVBQUUsUUFBNEI7UUFDeEUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLEtBQWdDO1FBQzFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQTlvRFIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUEreENuQixvQkFBZSxHQUFvQjtZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsaUNBQWlDO2dCQUNqQyxpQ0FBaUM7Z0JBQ2pDLGlDQUFpQztnQkFDakMsZ0JBQWdCO2dCQUNoQixXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIsaUJBQWlCO2dCQUNqQixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsY0FBYztnQkFDZCxjQUFjO2dCQUNkLHNCQUFzQjtnQkFDdEIsK0JBQStCO2dCQUMvQixZQUFZO2dCQUNaLGdCQUFnQjtnQkFDaEIsZ0NBQWdDO2dCQUNoQyxpQkFBaUI7Z0JBQ2pCLFdBQVc7Z0JBQ1gsZ0JBQWdCO2dCQUNoQixpQ0FBaUM7Z0JBQ2pDLGlCQUFpQjtnQkFDakIsa0JBQWtCO2dCQUNsQixrQkFBa0I7Z0JBQ2xCLHdCQUF3QjtnQkFDeEIsY0FBYztnQkFDZCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2Qsc0JBQXNCO2dCQUN0QiwrQkFBK0I7Z0JBQy9CLGVBQWU7Z0JBQ2YsWUFBWTtnQkFDWixnQkFBZ0I7Z0JBQ2hCLGVBQWU7Z0JBQ2Ysa0JBQWtCO2dCQUNsQixZQUFZO2dCQUNaLGVBQWU7Z0JBQ2Ysb0JBQW9CO2dCQUNwQixrQkFBa0I7Z0JBQ2xCLHdCQUF3QjtnQkFDeEIsNEJBQTRCO2dCQUM1QixtQkFBbUI7Z0JBQ25CLGFBQWE7Z0JBQ2Isb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsdUJBQXVCO2dCQUN2QixhQUFhO2dCQUNiLGVBQWU7Z0JBQ2YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLGlCQUFpQjtnQkFDakIseUJBQXlCO2dCQUN6QixjQUFjO2dCQUNkLGNBQWM7Z0JBQ2Qsc0JBQXNCO2dCQUN0QixZQUFZO2dCQUNaLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZixrQkFBa0I7Z0JBQ2xCLHdCQUF3QjtnQkFDeEIsZUFBZTtnQkFDZixrQkFBa0I7Z0JBQ2xCLHdCQUF3QjthQUN6QjtZQUNELElBQUksRUFBRTtnQkFDSixhQUFhO2dCQUNiLGtCQUFrQjtnQkFDbEIsbUNBQW1DO2dCQUNuQyxtQkFBbUI7Z0JBQ25CLDJCQUEyQjtnQkFDM0Isb0JBQW9CO2dCQUNwQiwrQkFBK0I7Z0JBQy9CLG9CQUFvQjtnQkFDcEIsa0NBQWtDO2dCQUNsQyxnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsZ0JBQWdCO2dCQUNoQix3QkFBd0I7Z0JBQ3hCLGNBQWM7Z0JBQ2Qsa0JBQWtCO2dCQUNsQix1QkFBdUI7Z0JBQ3ZCLGlCQUFpQjtnQkFDakIsa0NBQWtDO2dCQUNsQywyQkFBMkI7Z0JBQzNCLG9CQUFvQjtnQkFDcEIsWUFBWTtnQkFDWiw4QkFBOEI7Z0JBQzlCLHFCQUFxQjtnQkFDckIsOEJBQThCO2dCQUM5QixvQkFBb0I7Z0JBQ3BCLG9CQUFvQjtnQkFDcEIsMEJBQTBCO2FBQzNCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLDBCQUEwQjtnQkFDMUIsc0JBQXNCO2dCQUN0QixnQkFBZ0I7Z0JBQ2hCLGdDQUFnQztnQkFDaEMsZ0JBQWdCO2dCQUNoQix3QkFBd0I7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsNEJBQTRCO2dCQUM1Qix3QkFBd0I7Z0JBQ3hCLGlCQUFpQjtnQkFDakIsVUFBVTtnQkFDVixvQkFBb0I7Z0JBQ3BCLHNCQUFzQjtnQkFDdEIsMkJBQTJCO2dCQUMzQixhQUFhO2dCQUNiLGFBQWE7Z0JBQ2IsbUJBQW1CO2dCQUNuQixpQkFBaUI7Z0JBQ2pCLHdCQUF3QjtnQkFDeEIsYUFBYTtnQkFDYix3QkFBd0I7Z0JBQ3hCLDBCQUEwQjtnQkFDMUIsb0JBQW9CO2dCQUNwQixlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsb0JBQW9CO2dCQUNwQixjQUFjO2dCQUNkLDZCQUE2QjtnQkFDN0IsaUJBQWlCO2FBQ2xCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUE4T0YsQ0FBQztDQUNGO0FBanBERCxzQkFpcERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtsZXgtdjJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2xleC12Mi5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIExleFYyIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnbGV4JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIG5ldyBpdGVtcyBpbiBhbiBleGlzdGluZyBjdXN0b20gdm9jYWJ1bGFyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9CYXRjaENyZWF0ZUN1c3RvbVZvY2FidWxhcnlJdGVtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoQ3JlYXRlQ3VzdG9tVm9jYWJ1bGFyeUl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoQ3JlYXRlQ3VzdG9tVm9jYWJ1bGFyeUl0ZW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgZXhpc3RpbmcgaXRlbXMgaW4gYW4gZXhpc3RpbmcgY3VzdG9tIHZvY2FidWxhcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQmF0Y2hEZWxldGVDdXN0b21Wb2NhYnVsYXJ5SXRlbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaERlbGV0ZUN1c3RvbVZvY2FidWxhcnlJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZUN1c3RvbVZvY2FidWxhcnlJdGVtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGV4aXN0aW5nIGl0ZW1zIGluIGFuIGV4aXN0aW5nIGN1c3RvbSB2b2NhYnVsYXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0JhdGNoVXBkYXRlQ3VzdG9tVm9jYWJ1bGFyeUl0ZW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hVcGRhdGVDdXN0b21Wb2NhYnVsYXJ5SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hVcGRhdGVDdXN0b21Wb2NhYnVsYXJ5SXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJ1aWxkIGFuIGV4aXN0aW5nIGJvdCBsb2NhbGUgaW4gYSBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQnVpbGRCb3RMb2NhbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQnVpbGRCb3RMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0J1aWxkQm90TG9jYWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IGJvdCBhbmQgYSB0ZXN0IGJvdCBhbGlhcyBwb2ludGluZyB0byB0aGUgRFJBRlQgYm90IHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQm90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUJvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQm90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IGJvdCBhbGlhcyBpbiBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVCb3RBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCb3RBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQm90QWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgYm90IGxvY2FsZSBpbiBhbiBleGlzdGluZyBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQm90TG9jYWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUJvdExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQm90TG9jYWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGJvdCByZXBsaWNhIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVCb3RSZXBsaWNhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUJvdFJlcGxpY2EoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJvdFJlcGxpY2EnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgdmVyc2lvbiBvZiBhbiBleGlzdGluZyBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQm90VmVyc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCb3RWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVCb3RWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIGV4cG9ydCBmb3IgYW4gZXhpc3RpbmcgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlRXhwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUV4cG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhwb3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IGludGVudCBpbiBhbiBleGlzdGluZyBib3QgbG9jYWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUludGVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVJbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUludGVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBwb2xpY3kgZm9yIGEgTGV4IHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50IGZvciBhIExleCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUmVzb3VyY2VQb2xpY3lTdGF0ZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgc2xvdCBpbiBhbiBpbnRlbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlU2xvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTbG90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTbG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbmV3IHNsb3QgdHlwZSBpbiBhbiBleGlzdGluZyBib3QgbG9jYWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVNsb3RUeXBlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVNsb3RUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTbG90VHlwZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHRlc3Qgc2V0IGRpc2NyZXBhbmN5IHJlcG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUZXN0U2V0RGlzY3JlcGFuY3lSZXBvcnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVGVzdFNldERpc2NyZXBhbmN5UmVwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUZXN0U2V0RGlzY3JlcGFuY3lSZXBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gdXBsb2FkIHVybCBmb3IgaW1wb3J0IGZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVXBsb2FkVXJsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVVwbG9hZFVybCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVXBsb2FkVXJsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVCb3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVCb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gZXhpc3RpbmcgYm90IGFsaWFzIGluIGEgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUJvdEFsaWFzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUJvdEFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVCb3RBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGJvdCBhbmFseXplciByZWNvbW1lbmRhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVCb3RBbmFseXplclJlY29tbWVuZGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUJvdEFuYWx5emVyUmVjb21tZW5kYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUJvdEFuYWx5emVyUmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gZXhpc3RpbmcgYm90IGxvY2FsZSBpbiBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVCb3RMb2NhbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQm90TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVCb3RMb2NhbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gZXhpc3RpbmcgYm90IHJlcGxpY2FcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQm90UmVwbGljYS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCb3RSZXBsaWNhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVCb3RSZXBsaWNhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGJvdCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUJvdFZlcnNpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQm90VmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQm90VmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBjdXN0b20gdm9jYWJ1bGFyeSBpbiBhIGJvdCBsb2NhbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ3VzdG9tVm9jYWJ1bGFyeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDdXN0b21Wb2NhYnVsYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDdXN0b21Wb2NhYnVsYXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGV4cG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVFeHBvcnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRXhwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeHBvcnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gZXhpc3RpbmcgaW1wb3J0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUltcG9ydC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbXBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUltcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBpbnRlbnQgaW4gYSBib3QgbG9jYWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUludGVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUludGVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBleGlzdGluZyByZXNvdXJjZSBwb2xpY3kgZm9yIGEgTGV4IHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBleGlzdGluZyByZXNvdXJjZSBwb2xpY3kgc3RhdGVtZW50IGZvciBhIExleCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVzb3VyY2VQb2xpY3lTdGF0ZW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBmb3IgYSBib3QgYWxpYXMgYW5kIHVzZXIgSURcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcnVudGltZV9EZWxldGVTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gZXhpc3Rpbmcgc2xvdCBpbiBhbiBpbnRlbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU2xvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTbG90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTbG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHNsb3QgdHlwZSBpbiBhIGJvdCBsb2NhbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU2xvdFR5cGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU2xvdFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVNsb3RUeXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHRlc3Qgc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRlc3RTZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVGVzdFNldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGVzdFNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB1dHRlcmFuY2UgZGF0YSBmb3IgYSBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVXR0ZXJhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVVdHRlcmFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVVdHRlcmFuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gZXhpc3RpbmcgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCb3QuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gZXhpc3RpbmcgYm90IGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCb3RBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUJvdEFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUJvdEFsaWFzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBib3QgYW5hbHl6ZXIgcmVjb21tZW5kYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUJvdEFuYWx5emVyUmVjb21tZW5kYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVCb3RBbmFseXplclJlY29tbWVuZGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUJvdEFuYWx5emVyUmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbiBleGlzdGluZyBib3QgbG9jYWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCb3RMb2NhbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVCb3RMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90TG9jYWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgbWV0YWRhdGEgaW5mb3JtYXRpb24gYWJvdXQgYSBib3QgcmVjb21tZW5kYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUJvdFJlY29tbWVuZGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQm90UmVjb21tZW5kYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90UmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbiBleGlzdGluZyBib3QgcmVwbGljYVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQm90UmVwbGljYS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUJvdFJlcGxpY2EoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90UmVwbGljYScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIG1ldGFkYXRhIGluZm9ybWF0aW9uIGZvciBhIGJvdCByZXNvdXJjZSBnZW5lcmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVCb3RSZXNvdXJjZUdlbmVyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVCb3RSZXNvdXJjZUdlbmVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90UmVzb3VyY2VHZW5lcmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gZXhpc3RpbmcgYm90IHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUJvdFZlcnNpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVCb3RWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUJvdFZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBtZXRhZGF0YSBvZiBhbiBleGlzdGluZyBjdXN0b20gdm9jYWJ1bGFyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlQ3VzdG9tVm9jYWJ1bGFyeU1ldGFkYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ3VzdG9tVm9jYWJ1bGFyeU1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUN1c3RvbVZvY2FidWxhcnlNZXRhZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIGV4cG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlRXhwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlRXhwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUV4cG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIGltcG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW1wb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW1wb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUltcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIGludGVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlSW50ZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlSW50ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUludGVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIHJlc291cmNlIHBvbGljeSBmb3IgYSBMZXggcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbiBleGlzdGluZyBzbG90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTbG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU2xvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVTbG90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gZXhpc3Rpbmcgc2xvdCB0eXBlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTbG90VHlwZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNsb3RUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNsb3RUeXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGVzdCBleGVjdXRpb24gbWV0YWRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRlc3RFeGVjdXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUZXN0RXhlY3V0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRlc3RFeGVjdXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhbiBleGlzdGluZyB0ZXN0IHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGVzdFNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRlc3RTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVGVzdFNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRlc3Qgc2V0IGRpc2NyZXBhbmN5IHJlcG9ydCBtZXRhZGF0YVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlVGVzdFNldERpc2NyZXBhbmN5UmVwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVGVzdFNldERpc2NyZXBhbmN5UmVwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRlc3RTZXREaXNjcmVwYW5jeVJlcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRlc3Qgc2V0IGdlbmVyYXRpb24gbWV0YWRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVRlc3RTZXRHZW5lcmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlVGVzdFNldEdlbmVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlVGVzdFNldEdlbmVyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBzdXBwb3J0ZWQgZmllbGRzIG9yIGVsZW1lbnRzIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dlbmVyYXRlQm90RWxlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZUJvdEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlQm90RWxlbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHNlc3Npb24gaW5mb3JtYXRpb24gZm9yIGEgYm90IGFsaWFzIGFuZCB1c2VyIElEXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcnVudGltZV9HZXRTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhcnRpZmFjdHMgVVJMIGZvciBhIHRlc3QgZXhlY3V0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VGVzdEV4ZWN1dGlvbkFydGlmYWN0c1VybC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUZXN0RXhlY3V0aW9uQXJ0aWZhY3RzVXJsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUZXN0RXhlY3V0aW9uQXJ0aWZhY3RzVXJsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB1dHRlcmFuY2VzIGFuZCBzdGF0aXN0aWNzIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBZ2dyZWdhdGVkVXR0ZXJhbmNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWdncmVnYXRlZFV0dGVyYW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBZ2dyZWdhdGVkVXR0ZXJhbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxpYXMgcmVwbGljYXMgaW4gYSBib3QgcmVwbGljYVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RCb3RBbGlhc1JlcGxpY2FzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCb3RBbGlhc1JlcGxpY2FzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Qm90QWxpYXNSZXBsaWNhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYm90IGFsaWFzZXMgaW4gYW4gYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJvdEFsaWFzZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdEFsaWFzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCb3RBbGlhc2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBib3QgYW5hbHl6ZXIgcmVjb21tZW5kYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJvdEFuYWx5emVyUmVjb21tZW5kYXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCb3RBbmFseXplclJlY29tbWVuZGF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJvdEFuYWx5emVyUmVjb21tZW5kYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBib3QgbG9jYWxlcyBpbiBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RCb3RMb2NhbGVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCb3RMb2NhbGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Qm90TG9jYWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxpc3Qgb2YgYm90IHJlY29tbWVuZGF0aW9ucyB0aGF0IG1lZXQgdGhlIHNwZWNpZmllZCBjcml0ZXJpYVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RCb3RSZWNvbW1lbmRhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdFJlY29tbWVuZGF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJvdFJlY29tbWVuZGF0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcmVwbGljYXMgb2YgYSBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Qm90UmVwbGljYXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdFJlcGxpY2FzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Qm90UmVwbGljYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRoZSByZXNvdXJjZSBnZW5lcmF0aW9ucyBmb3IgYSBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Qm90UmVzb3VyY2VHZW5lcmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Qm90UmVzb3VyY2VHZW5lcmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJvdFJlc291cmNlR2VuZXJhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHZlcnNpb24gcmVwbGljYXMgaW4gYSBib3QgcmVwbGljYVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RCb3RWZXJzaW9uUmVwbGljYXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdFZlcnNpb25SZXBsaWNhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJvdFZlcnNpb25SZXBsaWNhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZXhpc3RpbmcgYm90IHZlcnNpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJvdFZlcnNpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCb3RWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJvdFZlcnNpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBleGlzdGluZyBib3RzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJvdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCb3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBidWlsdC1pbiBpbnRlbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJ1aWx0SW5JbnRlbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RCdWlsdEluSW50ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEJ1aWx0SW5JbnRlbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBidWlsdC1pbiBzbG90IHR5cGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEJ1aWx0SW5TbG90VHlwZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJ1aWx0SW5TbG90VHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCdWlsdEluU2xvdFR5cGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpdGVtcyBvZiBhbiBleGlzdGluZyBjdXN0b20gdm9jYWJ1bGFyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RDdXN0b21Wb2NhYnVsYXJ5SXRlbXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEN1c3RvbVZvY2FidWxhcnlJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEN1c3RvbVZvY2FidWxhcnlJdGVtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZXhpc3RpbmcgZXhwb3J0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RFeHBvcnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFeHBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0RXhwb3J0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZXhpc3RpbmcgaW1wb3J0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RJbXBvcnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RJbXBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0SW1wb3J0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW50ZW50IGFuYWx5dGljcyBtZXRyaWNzIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RJbnRlbnRNZXRyaWNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RJbnRlbnRNZXRyaWNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0SW50ZW50TWV0cmljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW50ZW50IHBhdGggYW5hbHl0aWNzIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RJbnRlbnRQYXRocy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0SW50ZW50UGF0aHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJbnRlbnRQYXRocycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgaW50ZW50U3RhZ2UgYW5hbHl0aWNzIG1ldHJpY3MgZm9yIGEgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEludGVudFN0YWdlTWV0cmljcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0SW50ZW50U3RhZ2VNZXRyaWNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0SW50ZW50U3RhZ2VNZXRyaWNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBpbnRlbnRzIGluIGEgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEludGVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEludGVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJbnRlbnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgbGlzdCBvZiByZWNvbW1lbmRlZCBpbnRlbnRzIHByb3ZpZGVkIGJ5IHRoZSBib3QgcmVjb21tZW5kYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UmVjb21tZW5kZWRJbnRlbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZWNvbW1lbmRlZEludGVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZWNvbW1lbmRlZEludGVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHNlc3Npb24gYW5hbHl0aWNzIGRhdGEgZm9yIGEgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFNlc3Npb25BbmFseXRpY3NEYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTZXNzaW9uQW5hbHl0aWNzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlc3Npb25BbmFseXRpY3NEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBzZXNzaW9uIGFuYWx5dGljcyBtZXRyaWNzIGZvciBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTZXNzaW9uTWV0cmljcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2Vzc2lvbk1ldHJpY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZXNzaW9uTWV0cmljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc2xvdCB0eXBlcyBpbiBhIGJvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTbG90VHlwZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNsb3RUeXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNsb3RUeXBlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc2xvdHMgaW4gYW4gaW50ZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFNsb3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RTbG90cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNsb3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdHMgdGFncyBmb3IgYSBMZXggcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0ZXN0IHJlc3VsdHMgZGF0YSBmb3IgYSB0ZXN0IGV4ZWN1dGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUZXN0RXhlY3V0aW9uUmVzdWx0SXRlbXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRlc3RFeGVjdXRpb25SZXN1bHRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRlc3RFeGVjdXRpb25SZXN1bHRJdGVtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGVzdCBleGVjdXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFRlc3RFeGVjdXRpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUZXN0RXhlY3V0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRlc3RFeGVjdXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcmVjb3JkcyBpbnNpZGUgYW4gZXhpc3RpbmcgdGVzdCBzZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGVzdFNldFJlY29yZHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRlc3RTZXRSZWNvcmRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGVzdFNldFJlY29yZHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRlc3Qgc2V0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUZXN0U2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGVzdFNldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUZXN0U2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uIG9yIG1vZGlmeSBhbiBleGlzdGluZyBzZXNzaW9uIGZvciBhIGJvdCBhbGlhcyBhbmQgdXNlciBJRFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9ydW50aW1lX1B1dFNlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0U2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0U2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlbmQgdXNlciBpbnB1dCAodGV4dC1vbmx5KSB0byBhbiBib3QgYWxpYXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcnVudGltZV9SZWNvZ25pemVUZXh0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlY29nbml6ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlY29nbml6ZVRleHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZW5kIHVzZXIgaW5wdXQgKHRleHQgb3Igc3BlZWNoKSB0byBhbiBib3QgYWxpYXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfcnVudGltZV9SZWNvZ25pemVVdHRlcmFuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVjb2duaXplVXR0ZXJhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWNvZ25pemVVdHRlcmFuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggZm9yIGFzc29jaWF0ZWQgdHJhbnNjcmlwdHMgdGhhdCBtZWV0IHRoZSBzcGVjaWZpZWQgY3JpdGVyaWFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TZWFyY2hBc3NvY2lhdGVkVHJhbnNjcmlwdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoQXNzb2NpYXRlZFRyYW5zY3JpcHRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hBc3NvY2lhdGVkVHJhbnNjcmlwdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIGJvdCBhbmFseXplciBmb3IgYW4gZXhpc3RpbmcgYm90IGxvY2FsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEJvdEFuYWx5emVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0Qm90QW5hbHl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Qm90QW5hbHl6ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIGJvdCByZWNvbW1lbmRhdGlvbiBmb3IgYW4gZXhpc3RpbmcgYm90IGxvY2FsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEJvdFJlY29tbWVuZGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0Qm90UmVjb21tZW5kYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Qm90UmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHJlc291cmNlIGdlbmVyYXRpb24gZm9yIGFuIGV4aXN0aW5nIGJvdCBsb2NhbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRCb3RSZXNvdXJjZUdlbmVyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRCb3RSZXNvdXJjZUdlbmVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Qm90UmVzb3VyY2VHZW5lcmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RyZWFtIHVzZXIgaW5wdXQgKHNwZWVjaC90ZXh0L0RUTUYpIHRvIGEgYm90IGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX3J1bnRpbWVfU3RhcnRDb252ZXJzYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRDb252ZXJzYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Q29udmVyc2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBuZXcgaW1wb3J0IHdpdGggdGhlIHVwbG9hZGVkIGltcG9ydCBmaWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0SW1wb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0SW1wb3J0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEltcG9ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgdGVzdCBleGVjdXRpb24gdXNpbmcgYSB0ZXN0IHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydFRlc3RFeGVjdXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRUZXN0RXhlY3V0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRlc3RFeGVjdXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBhIHRlc3Qgc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0VGVzdFNldEdlbmVyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRUZXN0U2V0R2VuZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRUZXN0U2V0R2VuZXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYSBib3QgYW5hbHl6ZXIgZm9yIGFuIGV4aXN0aW5nIGJvdCBsb2NhbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RvcEJvdEFuYWx5emVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0b3BCb3RBbmFseXplcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcEJvdEFuYWx5emVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcCBhIGJvdCByZWNvbW1lbmRhdGlvbiBmb3IgYW4gZXhpc3RpbmcgYm90IGxvY2FsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdG9wQm90UmVjb21tZW5kYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcEJvdFJlY29tbWVuZGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wQm90UmVjb21tZW5kYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgb3Igb3ZlcndyaXRlIHRhZ3Mgb2YgYSBMZXggcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRhZ3MgZnJvbSBhIExleCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gZXhpc3RpbmcgYm90XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUJvdC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyBib3QgYWxpYXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlQm90QWxpYXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQm90QWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUJvdEFsaWFzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIGV4aXN0aW5nIGJvdCBsb2NhbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlQm90TG9jYWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJvdExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQm90TG9jYWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIGV4aXN0aW5nIGJvdCByZWNvbW1lbmRhdGlvbiByZXF1ZXN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZUJvdFJlY29tbWVuZGF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUJvdFJlY29tbWVuZGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVCb3RSZWNvbW1lbmRhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyBleHBvcnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlRXhwb3J0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUV4cG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRXhwb3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIGV4aXN0aW5nIGludGVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVJbnRlbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlSW50ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVJbnRlbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gZXhpc3RpbmcgcmVzb3VyY2UgcG9saWN5IGZvciBhIExleCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVSZXNvdXJjZVBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gZXhpc3Rpbmcgc2xvdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVTbG90Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVNsb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNsb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW4gZXhpc3Rpbmcgc2xvdCB0eXBlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VwZGF0ZVNsb3RUeXBlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVNsb3RUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTbG90VHlwZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyB0ZXN0IHNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVUZXN0U2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVRlc3RTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVRlc3RTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBib3QgY2hhbm5lbCBpbiBhbiBleGlzdGluZyBib3RcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L2RnL2RlcGxveWluZy1tZXNzYWdpbmctcGxhdGZvcm0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQm90Q2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQm90Q2hhbm5lbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBjdXN0b20gdm9jYWJ1bGFyeSBpbiBhbiBleGlzdGluZyBib3QgbG9jYWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9kZy92b2NhYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDdXN0b21Wb2NhYnVsYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVDdXN0b21Wb2NhYnVsYXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW1wb3J0IGEgbmV3IHRlc3Qtc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xleHYyL2xhdGVzdC9kZy9jcmVhdGUtdGVzdC1zZXQtZnJvbS1DU1YuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVGVzdFNldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVGVzdFNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBib3QgY2hhbm5lbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvZGcvZGVwbG95aW5nLW1lc3NhZ2luZy1wbGF0Zm9ybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCb3RDaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVCb3RDaGFubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYW4gZXhpc3RpbmcgYm90IGNoYW5uZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvZGcvZGVwbG95aW5nLW1lc3NhZ2luZy1wbGF0Zm9ybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUJvdENoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlQm90Q2hhbm5lbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIGN1c3RvbSB2b2NhYnVsYXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L2RnL3ZvY2FiLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQ3VzdG9tVm9jYWJ1bGFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDdXN0b21Wb2NhYnVsYXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBib3QgY2hhbm5lbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvZGcvZGVwbG95aW5nLW1lc3NhZ2luZy1wbGF0Zm9ybS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Qm90Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCb3RDaGFubmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBleGlzdGluZyBjdXN0b20gdm9jYWJ1bGFyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvZGcvdm9jYWIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ3VzdG9tVm9jYWJ1bGFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ3VzdG9tVm9jYWJ1bGFyeScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQmF0Y2hDcmVhdGVDdXN0b21Wb2NhYnVsYXJ5SXRlbScsXG4gICAgICAnQmF0Y2hEZWxldGVDdXN0b21Wb2NhYnVsYXJ5SXRlbScsXG4gICAgICAnQmF0Y2hVcGRhdGVDdXN0b21Wb2NhYnVsYXJ5SXRlbScsXG4gICAgICAnQnVpbGRCb3RMb2NhbGUnLFxuICAgICAgJ0NyZWF0ZUJvdCcsXG4gICAgICAnQ3JlYXRlQm90QWxpYXMnLFxuICAgICAgJ0NyZWF0ZUJvdExvY2FsZScsXG4gICAgICAnQ3JlYXRlQm90UmVwbGljYScsXG4gICAgICAnQ3JlYXRlQm90VmVyc2lvbicsXG4gICAgICAnQ3JlYXRlRXhwb3J0JyxcbiAgICAgICdDcmVhdGVJbnRlbnQnLFxuICAgICAgJ0NyZWF0ZVJlc291cmNlUG9saWN5JyxcbiAgICAgICdDcmVhdGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudCcsXG4gICAgICAnQ3JlYXRlU2xvdCcsXG4gICAgICAnQ3JlYXRlU2xvdFR5cGUnLFxuICAgICAgJ0NyZWF0ZVRlc3RTZXREaXNjcmVwYW5jeVJlcG9ydCcsXG4gICAgICAnQ3JlYXRlVXBsb2FkVXJsJyxcbiAgICAgICdEZWxldGVCb3QnLFxuICAgICAgJ0RlbGV0ZUJvdEFsaWFzJyxcbiAgICAgICdEZWxldGVCb3RBbmFseXplclJlY29tbWVuZGF0aW9uJyxcbiAgICAgICdEZWxldGVCb3RMb2NhbGUnLFxuICAgICAgJ0RlbGV0ZUJvdFJlcGxpY2EnLFxuICAgICAgJ0RlbGV0ZUJvdFZlcnNpb24nLFxuICAgICAgJ0RlbGV0ZUN1c3RvbVZvY2FidWxhcnknLFxuICAgICAgJ0RlbGV0ZUV4cG9ydCcsXG4gICAgICAnRGVsZXRlSW1wb3J0JyxcbiAgICAgICdEZWxldGVJbnRlbnQnLFxuICAgICAgJ0RlbGV0ZVJlc291cmNlUG9saWN5JyxcbiAgICAgICdEZWxldGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudCcsXG4gICAgICAnRGVsZXRlU2Vzc2lvbicsXG4gICAgICAnRGVsZXRlU2xvdCcsXG4gICAgICAnRGVsZXRlU2xvdFR5cGUnLFxuICAgICAgJ0RlbGV0ZVRlc3RTZXQnLFxuICAgICAgJ0RlbGV0ZVV0dGVyYW5jZXMnLFxuICAgICAgJ1B1dFNlc3Npb24nLFxuICAgICAgJ1JlY29nbml6ZVRleHQnLFxuICAgICAgJ1JlY29nbml6ZVV0dGVyYW5jZScsXG4gICAgICAnU3RhcnRCb3RBbmFseXplcicsXG4gICAgICAnU3RhcnRCb3RSZWNvbW1lbmRhdGlvbicsXG4gICAgICAnU3RhcnRCb3RSZXNvdXJjZUdlbmVyYXRpb24nLFxuICAgICAgJ1N0YXJ0Q29udmVyc2F0aW9uJyxcbiAgICAgICdTdGFydEltcG9ydCcsXG4gICAgICAnU3RhcnRUZXN0RXhlY3V0aW9uJyxcbiAgICAgICdTdGFydFRlc3RTZXRHZW5lcmF0aW9uJyxcbiAgICAgICdTdG9wQm90QW5hbHl6ZXInLFxuICAgICAgJ1N0b3BCb3RSZWNvbW1lbmRhdGlvbicsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUJvdCcsXG4gICAgICAnVXBkYXRlQm90QWxpYXMnLFxuICAgICAgJ1VwZGF0ZUJvdExvY2FsZScsXG4gICAgICAnVXBkYXRlQm90UmVjb21tZW5kYXRpb24nLFxuICAgICAgJ1VwZGF0ZUV4cG9ydCcsXG4gICAgICAnVXBkYXRlSW50ZW50JyxcbiAgICAgICdVcGRhdGVSZXNvdXJjZVBvbGljeScsXG4gICAgICAnVXBkYXRlU2xvdCcsXG4gICAgICAnVXBkYXRlU2xvdFR5cGUnLFxuICAgICAgJ1VwZGF0ZVRlc3RTZXQnLFxuICAgICAgJ0NyZWF0ZUJvdENoYW5uZWwnLFxuICAgICAgJ0NyZWF0ZUN1c3RvbVZvY2FidWxhcnknLFxuICAgICAgJ0NyZWF0ZVRlc3RTZXQnLFxuICAgICAgJ0RlbGV0ZUJvdENoYW5uZWwnLFxuICAgICAgJ1VwZGF0ZUN1c3RvbVZvY2FidWxhcnknXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnRGVzY3JpYmVCb3QnLFxuICAgICAgJ0Rlc2NyaWJlQm90QWxpYXMnLFxuICAgICAgJ0Rlc2NyaWJlQm90QW5hbHl6ZXJSZWNvbW1lbmRhdGlvbicsXG4gICAgICAnRGVzY3JpYmVCb3RMb2NhbGUnLFxuICAgICAgJ0Rlc2NyaWJlQm90UmVjb21tZW5kYXRpb24nLFxuICAgICAgJ0Rlc2NyaWJlQm90UmVwbGljYScsXG4gICAgICAnRGVzY3JpYmVCb3RSZXNvdXJjZUdlbmVyYXRpb24nLFxuICAgICAgJ0Rlc2NyaWJlQm90VmVyc2lvbicsXG4gICAgICAnRGVzY3JpYmVDdXN0b21Wb2NhYnVsYXJ5TWV0YWRhdGEnLFxuICAgICAgJ0Rlc2NyaWJlRXhwb3J0JyxcbiAgICAgICdEZXNjcmliZUltcG9ydCcsXG4gICAgICAnRGVzY3JpYmVJbnRlbnQnLFxuICAgICAgJ0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3knLFxuICAgICAgJ0Rlc2NyaWJlU2xvdCcsXG4gICAgICAnRGVzY3JpYmVTbG90VHlwZScsXG4gICAgICAnRGVzY3JpYmVUZXN0RXhlY3V0aW9uJyxcbiAgICAgICdEZXNjcmliZVRlc3RTZXQnLFxuICAgICAgJ0Rlc2NyaWJlVGVzdFNldERpc2NyZXBhbmN5UmVwb3J0JyxcbiAgICAgICdEZXNjcmliZVRlc3RTZXRHZW5lcmF0aW9uJyxcbiAgICAgICdHZW5lcmF0ZUJvdEVsZW1lbnQnLFxuICAgICAgJ0dldFNlc3Npb24nLFxuICAgICAgJ0dldFRlc3RFeGVjdXRpb25BcnRpZmFjdHNVcmwnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0xpc3RUZXN0RXhlY3V0aW9uUmVzdWx0SXRlbXMnLFxuICAgICAgJ0xpc3RUZXN0U2V0UmVjb3JkcycsXG4gICAgICAnRGVzY3JpYmVCb3RDaGFubmVsJyxcbiAgICAgICdEZXNjcmliZUN1c3RvbVZvY2FidWxhcnknXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEFnZ3JlZ2F0ZWRVdHRlcmFuY2VzJyxcbiAgICAgICdMaXN0Qm90QWxpYXNSZXBsaWNhcycsXG4gICAgICAnTGlzdEJvdEFsaWFzZXMnLFxuICAgICAgJ0xpc3RCb3RBbmFseXplclJlY29tbWVuZGF0aW9ucycsXG4gICAgICAnTGlzdEJvdExvY2FsZXMnLFxuICAgICAgJ0xpc3RCb3RSZWNvbW1lbmRhdGlvbnMnLFxuICAgICAgJ0xpc3RCb3RSZXBsaWNhcycsXG4gICAgICAnTGlzdEJvdFJlc291cmNlR2VuZXJhdGlvbnMnLFxuICAgICAgJ0xpc3RCb3RWZXJzaW9uUmVwbGljYXMnLFxuICAgICAgJ0xpc3RCb3RWZXJzaW9ucycsXG4gICAgICAnTGlzdEJvdHMnLFxuICAgICAgJ0xpc3RCdWlsdEluSW50ZW50cycsXG4gICAgICAnTGlzdEJ1aWx0SW5TbG90VHlwZXMnLFxuICAgICAgJ0xpc3RDdXN0b21Wb2NhYnVsYXJ5SXRlbXMnLFxuICAgICAgJ0xpc3RFeHBvcnRzJyxcbiAgICAgICdMaXN0SW1wb3J0cycsXG4gICAgICAnTGlzdEludGVudE1ldHJpY3MnLFxuICAgICAgJ0xpc3RJbnRlbnRQYXRocycsXG4gICAgICAnTGlzdEludGVudFN0YWdlTWV0cmljcycsXG4gICAgICAnTGlzdEludGVudHMnLFxuICAgICAgJ0xpc3RSZWNvbW1lbmRlZEludGVudHMnLFxuICAgICAgJ0xpc3RTZXNzaW9uQW5hbHl0aWNzRGF0YScsXG4gICAgICAnTGlzdFNlc3Npb25NZXRyaWNzJyxcbiAgICAgICdMaXN0U2xvdFR5cGVzJyxcbiAgICAgICdMaXN0U2xvdHMnLFxuICAgICAgJ0xpc3RUZXN0RXhlY3V0aW9ucycsXG4gICAgICAnTGlzdFRlc3RTZXRzJyxcbiAgICAgICdTZWFyY2hBc3NvY2lhdGVkVHJhbnNjcmlwdHMnLFxuICAgICAgJ0xpc3RCb3RDaGFubmVscydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGJvdCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sZXh2Mi9sYXRlc3QvZGcvaG93LWl0LXdvcmtzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGJvdElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGJvdElkLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uMiAtIElkZW50aWZpZXIgZm9yIHRoZSBwYXJ0aXRpb24yLlxuICAgKiBAcGFyYW0gcmVnaW9uMiAtIElkZW50aWZpZXIgZm9yIHRoZSByZWdpb24yLlxuICAgKiBAcGFyYW0gYWNjb3VudDIgLSBJZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudDIuXG4gICAqIEBwYXJhbSBib3ROYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIGJvdE5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkJvdChib3RJZDogc3RyaW5nLCBwYXJ0aXRpb24yOiBzdHJpbmcsIHJlZ2lvbjI6IHN0cmluZywgYWNjb3VudDI6IHN0cmluZywgYm90TmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmxleDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Ym90LyR7IGJvdElkIH0sIGFybjokeyBwYXJ0aXRpb24yIH06bGV4OiR7IHJlZ2lvbjIgfTokeyBhY2NvdW50MiB9OmJvdDokeyBib3ROYW1lIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBib3QgYWxpYXMgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L2RnL2hvdy1pdC13b3Jrcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBib3RJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBib3RJZC5cbiAgICogQHBhcmFtIGJvdEFsaWFzSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYm90QWxpYXNJZC5cbiAgICogQHBhcmFtIHBhcnRpdGlvbjIgLSBJZGVudGlmaWVyIGZvciB0aGUgcGFydGl0aW9uMi5cbiAgICogQHBhcmFtIHJlZ2lvbjIgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVnaW9uMi5cbiAgICogQHBhcmFtIGFjY291bnQyIC0gSWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQyLlxuICAgKiBAcGFyYW0gYm90TmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBib3ROYW1lLlxuICAgKiBAcGFyYW0gYm90QWxpYXMgLSBJZGVudGlmaWVyIGZvciB0aGUgYm90QWxpYXMuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkJvdEFsaWFzKGJvdElkOiBzdHJpbmcsIGJvdEFsaWFzSWQ6IHN0cmluZywgcGFydGl0aW9uMjogc3RyaW5nLCByZWdpb24yOiBzdHJpbmcsIGFjY291bnQyOiBzdHJpbmcsIGJvdE5hbWU6IHN0cmluZywgYm90QWxpYXM6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpsZXg6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmJvdC1hbGlhcy8keyBib3RJZCB9LyR7IGJvdEFsaWFzSWQgfSwgYXJuOiR7IHBhcnRpdGlvbjIgfTpsZXg6JHsgcmVnaW9uMiB9OiR7IGFjY291bnQyIH06Ym90OiR7IGJvdE5hbWUgfTokeyBib3RBbGlhcyB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgdGVzdCBzZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGV4djIvbGF0ZXN0L2RnL3Rlc3Qtd29ya2JlbmNoLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHRlc3RTZXRJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB0ZXN0U2V0SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRlc3RTZXQodGVzdFNldElkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bGV4OiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp0ZXN0LXNldC8keyB0ZXN0U2V0SWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVCb3QoKVxuICAgKiAtIC50b0NyZWF0ZUJvdEFsaWFzKClcbiAgICogLSAudG9TdGFydEltcG9ydCgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgYXR0YWNoZWQgdG8gYSBMZXggcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9CYXRjaENyZWF0ZUN1c3RvbVZvY2FidWxhcnlJdGVtKClcbiAgICogLSAudG9CYXRjaERlbGV0ZUN1c3RvbVZvY2FidWxhcnlJdGVtKClcbiAgICogLSAudG9CYXRjaFVwZGF0ZUN1c3RvbVZvY2FidWxhcnlJdGVtKClcbiAgICogLSAudG9CdWlsZEJvdExvY2FsZSgpXG4gICAqIC0gLnRvQ3JlYXRlQm90KClcbiAgICogLSAudG9DcmVhdGVCb3RBbGlhcygpXG4gICAqIC0gLnRvQ3JlYXRlQm90TG9jYWxlKClcbiAgICogLSAudG9DcmVhdGVCb3RSZXBsaWNhKClcbiAgICogLSAudG9DcmVhdGVCb3RWZXJzaW9uKClcbiAgICogLSAudG9DcmVhdGVFeHBvcnQoKVxuICAgKiAtIC50b0NyZWF0ZUludGVudCgpXG4gICAqIC0gLnRvQ3JlYXRlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0NyZWF0ZVJlc291cmNlUG9saWN5U3RhdGVtZW50KClcbiAgICogLSAudG9DcmVhdGVTbG90KClcbiAgICogLSAudG9DcmVhdGVTbG90VHlwZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGVzdFNldERpc2NyZXBhbmN5UmVwb3J0KClcbiAgICogLSAudG9EZWxldGVCb3QoKVxuICAgKiAtIC50b0RlbGV0ZUJvdEFsaWFzKClcbiAgICogLSAudG9EZWxldGVCb3RBbmFseXplclJlY29tbWVuZGF0aW9uKClcbiAgICogLSAudG9EZWxldGVCb3RMb2NhbGUoKVxuICAgKiAtIC50b0RlbGV0ZUJvdFJlcGxpY2EoKVxuICAgKiAtIC50b0RlbGV0ZUJvdFZlcnNpb24oKVxuICAgKiAtIC50b0RlbGV0ZUN1c3RvbVZvY2FidWxhcnkoKVxuICAgKiAtIC50b0RlbGV0ZUV4cG9ydCgpXG4gICAqIC0gLnRvRGVsZXRlSW1wb3J0KClcbiAgICogLSAudG9EZWxldGVJbnRlbnQoKVxuICAgKiAtIC50b0RlbGV0ZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVSZXNvdXJjZVBvbGljeVN0YXRlbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlU2Vzc2lvbigpXG4gICAqIC0gLnRvRGVsZXRlU2xvdCgpXG4gICAqIC0gLnRvRGVsZXRlU2xvdFR5cGUoKVxuICAgKiAtIC50b0RlbGV0ZVRlc3RTZXQoKVxuICAgKiAtIC50b0RlbGV0ZVV0dGVyYW5jZXMoKVxuICAgKiAtIC50b0Rlc2NyaWJlQm90KClcbiAgICogLSAudG9EZXNjcmliZUJvdEFsaWFzKClcbiAgICogLSAudG9EZXNjcmliZUJvdEFuYWx5emVyUmVjb21tZW5kYXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlQm90TG9jYWxlKClcbiAgICogLSAudG9EZXNjcmliZUJvdFJlY29tbWVuZGF0aW9uKClcbiAgICogLSAudG9EZXNjcmliZUJvdFJlcGxpY2EoKVxuICAgKiAtIC50b0Rlc2NyaWJlQm90UmVzb3VyY2VHZW5lcmF0aW9uKClcbiAgICogLSAudG9EZXNjcmliZUJvdFZlcnNpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlQ3VzdG9tVm9jYWJ1bGFyeU1ldGFkYXRhKClcbiAgICogLSAudG9EZXNjcmliZUV4cG9ydCgpXG4gICAqIC0gLnRvRGVzY3JpYmVJbXBvcnQoKVxuICAgKiAtIC50b0Rlc2NyaWJlSW50ZW50KClcbiAgICogLSAudG9EZXNjcmliZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZXNjcmliZVNsb3QoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2xvdFR5cGUoKVxuICAgKiAtIC50b0Rlc2NyaWJlVGVzdEV4ZWN1dGlvbigpXG4gICAqIC0gLnRvRGVzY3JpYmVUZXN0U2V0KClcbiAgICogLSAudG9EZXNjcmliZVRlc3RTZXREaXNjcmVwYW5jeVJlcG9ydCgpXG4gICAqIC0gLnRvRGVzY3JpYmVUZXN0U2V0R2VuZXJhdGlvbigpXG4gICAqIC0gLnRvR2VuZXJhdGVCb3RFbGVtZW50KClcbiAgICogLSAudG9HZXRTZXNzaW9uKClcbiAgICogLSAudG9HZXRUZXN0RXhlY3V0aW9uQXJ0aWZhY3RzVXJsKClcbiAgICogLSAudG9MaXN0QWdncmVnYXRlZFV0dGVyYW5jZXMoKVxuICAgKiAtIC50b0xpc3RCb3RBbGlhc1JlcGxpY2FzKClcbiAgICogLSAudG9MaXN0Qm90QWxpYXNlcygpXG4gICAqIC0gLnRvTGlzdEJvdEFuYWx5emVyUmVjb21tZW5kYXRpb25zKClcbiAgICogLSAudG9MaXN0Qm90TG9jYWxlcygpXG4gICAqIC0gLnRvTGlzdEJvdFJlY29tbWVuZGF0aW9ucygpXG4gICAqIC0gLnRvTGlzdEJvdFJlcGxpY2FzKClcbiAgICogLSAudG9MaXN0Qm90UmVzb3VyY2VHZW5lcmF0aW9ucygpXG4gICAqIC0gLnRvTGlzdEJvdFZlcnNpb25SZXBsaWNhcygpXG4gICAqIC0gLnRvTGlzdEJvdFZlcnNpb25zKClcbiAgICogLSAudG9MaXN0Q3VzdG9tVm9jYWJ1bGFyeUl0ZW1zKClcbiAgICogLSAudG9MaXN0SW50ZW50TWV0cmljcygpXG4gICAqIC0gLnRvTGlzdEludGVudFBhdGhzKClcbiAgICogLSAudG9MaXN0SW50ZW50U3RhZ2VNZXRyaWNzKClcbiAgICogLSAudG9MaXN0SW50ZW50cygpXG4gICAqIC0gLnRvTGlzdFJlY29tbWVuZGVkSW50ZW50cygpXG4gICAqIC0gLnRvTGlzdFNlc3Npb25BbmFseXRpY3NEYXRhKClcbiAgICogLSAudG9MaXN0U2Vzc2lvbk1ldHJpY3MoKVxuICAgKiAtIC50b0xpc3RTbG90VHlwZXMoKVxuICAgKiAtIC50b0xpc3RTbG90cygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFRlc3RFeGVjdXRpb25SZXN1bHRJdGVtcygpXG4gICAqIC0gLnRvTGlzdFRlc3RTZXRSZWNvcmRzKClcbiAgICogLSAudG9QdXRTZXNzaW9uKClcbiAgICogLSAudG9SZWNvZ25pemVUZXh0KClcbiAgICogLSAudG9SZWNvZ25pemVVdHRlcmFuY2UoKVxuICAgKiAtIC50b1NlYXJjaEFzc29jaWF0ZWRUcmFuc2NyaXB0cygpXG4gICAqIC0gLnRvU3RhcnRCb3RBbmFseXplcigpXG4gICAqIC0gLnRvU3RhcnRCb3RSZWNvbW1lbmRhdGlvbigpXG4gICAqIC0gLnRvU3RhcnRCb3RSZXNvdXJjZUdlbmVyYXRpb24oKVxuICAgKiAtIC50b1N0YXJ0Q29udmVyc2F0aW9uKClcbiAgICogLSAudG9TdGFydEltcG9ydCgpXG4gICAqIC0gLnRvU3RhcnRUZXN0RXhlY3V0aW9uKClcbiAgICogLSAudG9TdGFydFRlc3RTZXRHZW5lcmF0aW9uKClcbiAgICogLSAudG9TdG9wQm90QW5hbHl6ZXIoKVxuICAgKiAtIC50b1N0b3BCb3RSZWNvbW1lbmRhdGlvbigpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUJvdCgpXG4gICAqIC0gLnRvVXBkYXRlQm90QWxpYXMoKVxuICAgKiAtIC50b1VwZGF0ZUJvdExvY2FsZSgpXG4gICAqIC0gLnRvVXBkYXRlQm90UmVjb21tZW5kYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZUV4cG9ydCgpXG4gICAqIC0gLnRvVXBkYXRlSW50ZW50KClcbiAgICogLSAudG9VcGRhdGVSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvVXBkYXRlU2xvdCgpXG4gICAqIC0gLnRvVXBkYXRlU2xvdFR5cGUoKVxuICAgKiAtIC50b1VwZGF0ZVRlc3RTZXQoKVxuICAgKiAtIC50b0NyZWF0ZUJvdENoYW5uZWwoKVxuICAgKiAtIC50b0NyZWF0ZUN1c3RvbVZvY2FidWxhcnkoKVxuICAgKiAtIC50b0RlbGV0ZUJvdENoYW5uZWwoKVxuICAgKiAtIC50b0Rlc2NyaWJlQm90Q2hhbm5lbCgpXG4gICAqIC0gLnRvRGVzY3JpYmVDdXN0b21Wb2NhYnVsYXJ5KClcbiAgICogLSAudG9MaXN0Qm90Q2hhbm5lbHMoKVxuICAgKiAtIC50b1VwZGF0ZUN1c3RvbVZvY2FidWxhcnkoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGJvdFxuICAgKiAtIGJvdCBhbGlhc1xuICAgKiAtIHRlc3Qgc2V0XG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXNvdXJjZVRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXNvdXJjZVRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBzZXQgb2YgdGFnIGtleXMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUJvdCgpXG4gICAqIC0gLnRvQ3JlYXRlQm90QWxpYXMoKVxuICAgKiAtIC50b1N0YXJ0SW1wb3J0KClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2xleC12Ml0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfbGV4LXYyLmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==