UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

1,102 lines 114 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CleanroomsMl = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [cleanrooms-ml](https://docs.aws.amazon.com/service-authorization/latest/reference/list_cleanroomsml.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class CleanroomsMl extends shared_1.PolicyStatement {
    /**
     * Grants permission to cancel a trained model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CancelTrainedModel.html
     */
    toCancelTrainedModel() {
        return this.to('CancelTrainedModel');
    }
    /**
     * Grants permission to cancel a trained model inference job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CancelTrainedModelInferenceJob.html
     */
    toCancelTrainedModelInferenceJob() {
        return this.to('CancelTrainedModelInferenceJob');
    }
    /**
     * Grants permission to create an audience model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateAudienceModel.html
     */
    toCreateAudienceModel() {
        return this.to('CreateAudienceModel');
    }
    /**
     * Grants permission to create a configured audience model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredAudienceModel.html
     */
    toCreateConfiguredAudienceModel() {
        return this.to('CreateConfiguredAudienceModel');
    }
    /**
     * Grants permission to create a configured model algorithm
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredModelAlgorithm.html
     */
    toCreateConfiguredModelAlgorithm() {
        return this.to('CreateConfiguredModelAlgorithm');
    }
    /**
     * Grants permission to create a configured model algorithm association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateConfiguredModelAlgorithmAssociation.html
     */
    toCreateConfiguredModelAlgorithmAssociation() {
        return this.to('CreateConfiguredModelAlgorithmAssociation');
    }
    /**
     * Grants permission to create an ML input channel
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateMLInputChannel.html
     */
    toCreateMLInputChannel() {
        return this.to('CreateMLInputChannel');
    }
    /**
     * Grants permission to create a trained model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateTrainedModel.html
     */
    toCreateTrainedModel() {
        return this.to('CreateTrainedModel');
    }
    /**
     * Grants permission to create a training dataset, or seed audience. In Clean Rooms ML, the TrainingDataset is metadata that points to a Glue table, which is read only during AudienceModel creation
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_CreateTrainingDataset.html
     */
    toCreateTrainingDataset() {
        return this.to('CreateTrainingDataset');
    }
    /**
     * Grants permission to delete the specified audience generation job, and removes all data associated with the job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteAudienceGenerationJob.html
     */
    toDeleteAudienceGenerationJob() {
        return this.to('DeleteAudienceGenerationJob');
    }
    /**
     * Grants permission to delete the specified audience generation job, and removes all data associated with the job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteAudienceModel.html
     */
    toDeleteAudienceModel() {
        return this.to('DeleteAudienceModel');
    }
    /**
     * Grants permission to delete the specified configured audience model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredAudienceModel.html
     */
    toDeleteConfiguredAudienceModel() {
        return this.to('DeleteConfiguredAudienceModel');
    }
    /**
     * Grants permission to delete the specified configured audience model policy
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredAudienceModelPolicy.html
     */
    toDeleteConfiguredAudienceModelPolicy() {
        return this.to('DeleteConfiguredAudienceModelPolicy');
    }
    /**
     * Grants permission to delete a configured model algorithm
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredModelAlgorithm.html
     */
    toDeleteConfiguredModelAlgorithm() {
        return this.to('DeleteConfiguredModelAlgorithm');
    }
    /**
     * Grants permission to delete a configured model algorithm association
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteConfiguredModelAlgorithmAssociation.html
     */
    toDeleteConfiguredModelAlgorithmAssociation() {
        return this.to('DeleteConfiguredModelAlgorithmAssociation');
    }
    /**
     * Grants permission to delete an ML configuration
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteMLConfiguration.html
     */
    toDeleteMLConfiguration() {
        return this.to('DeleteMLConfiguration');
    }
    /**
     * Grants permission to delete all data associated with the ML input channel
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteMLInputChannelData.html
     */
    toDeleteMLInputChannelData() {
        return this.to('DeleteMLInputChannelData');
    }
    /**
     * Grants permission to delete all output associated with the trained model
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteTrainedModelOutput.html
     */
    toDeleteTrainedModelOutput() {
        return this.to('DeleteTrainedModelOutput');
    }
    /**
     * Grants permission to delete a training dataset
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_DeleteTrainingDataset.html
     */
    toDeleteTrainingDataset() {
        return this.to('DeleteTrainingDataset');
    }
    /**
     * Grants permission to return information about an audience generation job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetAudienceGenerationJob.html
     */
    toGetAudienceGenerationJob() {
        return this.to('GetAudienceGenerationJob');
    }
    /**
     * Grants permission to return information about an audience model
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetAudienceModel.html
     */
    toGetAudienceModel() {
        return this.to('GetAudienceModel');
    }
    /**
     * Grants permission to return information about a configured model algorithm association created by any member in the collaboration
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationConfiguredModelAlgorithmAssociation.html
     */
    toGetCollaborationConfiguredModelAlgorithmAssociation() {
        return this.to('GetCollaborationConfiguredModelAlgorithmAssociation');
    }
    /**
     * Grants permission to return information about an ML input channel created by any member in the collaboration
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationMLInputChannel.html
     */
    toGetCollaborationMLInputChannel() {
        return this.to('GetCollaborationMLInputChannel');
    }
    /**
     * Grants permission to return information about a trained model created by any member in the collaboration
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetCollaborationTrainedModel.html
     */
    toGetCollaborationTrainedModel() {
        return this.to('GetCollaborationTrainedModel');
    }
    /**
     * Grants permission to return information about a configured audience model
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredAudienceModel.html
     */
    toGetConfiguredAudienceModel() {
        return this.to('GetConfiguredAudienceModel');
    }
    /**
     * Grants permission to return information about a configured audience model policy
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredAudienceModelPolicy.html
     */
    toGetConfiguredAudienceModelPolicy() {
        return this.to('GetConfiguredAudienceModelPolicy');
    }
    /**
     * Grants permission to return information about a configured model algorithm
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredModelAlgorithm.html
     */
    toGetConfiguredModelAlgorithm() {
        return this.to('GetConfiguredModelAlgorithm');
    }
    /**
     * Grants permission to return information about a configured model algorithm association
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetConfiguredModelAlgorithmAssociation.html
     */
    toGetConfiguredModelAlgorithmAssociation() {
        return this.to('GetConfiguredModelAlgorithmAssociation');
    }
    /**
     * Grants permission to return information about an ML configuration
     *
     * Access Level: Read
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetMLConfiguration.html
     */
    toGetMLConfiguration() {
        return this.to('GetMLConfiguration');
    }
    /**
     * Grants permission to return information about an ML input channel
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetMLInputChannel.html
     */
    toGetMLInputChannel() {
        return this.to('GetMLInputChannel');
    }
    /**
     * Grants permission to return information about a trained model
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainedModel.html
     */
    toGetTrainedModel() {
        return this.to('GetTrainedModel');
    }
    /**
     * Grants permission to return information about a trained model inference job
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainedModelInferenceJob.html
     */
    toGetTrainedModelInferenceJob() {
        return this.to('GetTrainedModelInferenceJob');
    }
    /**
     * Grants permission to return information about a training dataset
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_GetTrainingDataset.html
     */
    toGetTrainingDataset() {
        return this.to('GetTrainingDataset');
    }
    /**
     * Grants permission to return a list of the audience export jobs
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceExportJobs.html
     */
    toListAudienceExportJobs() {
        return this.to('ListAudienceExportJobs');
    }
    /**
     * Grants permission to return a list of audience generation jobs
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceGenerationJobs.html
     */
    toListAudienceGenerationJobs() {
        return this.to('ListAudienceGenerationJobs');
    }
    /**
     * Grants permission to return a list of audience models
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListAudienceModels.html
     */
    toListAudienceModels() {
        return this.to('ListAudienceModels');
    }
    /**
     * Grants permission to return a list of configured model algorithms created by any member in the collaboration
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCollaborationId()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationConfiguredModelAlgorithmAssociations.html
     */
    toListCollaborationConfiguredModelAlgorithmAssociations() {
        return this.to('ListCollaborationConfiguredModelAlgorithmAssociations');
    }
    /**
     * Grants permission to return a list of ML input channels created by any member in the collaboration
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCollaborationId()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationMLInputChannels.html
     */
    toListCollaborationMLInputChannels() {
        return this.to('ListCollaborationMLInputChannels');
    }
    /**
     * Grants permission to return a list of trained model export jobs started by any member in the collaboration
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModelExportJobs.html
     */
    toListCollaborationTrainedModelExportJobs() {
        return this.to('ListCollaborationTrainedModelExportJobs');
    }
    /**
     * Grants permission to return a list of trained model inference jobs started by any member in the collaboration
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCollaborationId()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModelInferenceJobs.html
     */
    toListCollaborationTrainedModelInferenceJobs() {
        return this.to('ListCollaborationTrainedModelInferenceJobs');
    }
    /**
     * Grants permission to return a list of trained models created by any member in the collaboration
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     * - .ifCollaborationId()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListCollaborationTrainedModels.html
     */
    toListCollaborationTrainedModels() {
        return this.to('ListCollaborationTrainedModels');
    }
    /**
     * Grants permission to return a list of configured audience models
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredAudienceModels.html
     */
    toListConfiguredAudienceModels() {
        return this.to('ListConfiguredAudienceModels');
    }
    /**
     * Grants permission to return a list of configured model algorithm associations
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredModelAlgorithmAssociations.html
     */
    toListConfiguredModelAlgorithmAssociations() {
        return this.to('ListConfiguredModelAlgorithmAssociations');
    }
    /**
     * Grants permission to return a list of configured model algorithms
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListConfiguredModelAlgorithms.html
     */
    toListConfiguredModelAlgorithms() {
        return this.to('ListConfiguredModelAlgorithms');
    }
    /**
     * Grants permission to return a list of ML input channels
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListMLInputChannels.html
     */
    toListMLInputChannels() {
        return this.to('ListMLInputChannels');
    }
    /**
     * Grants permission to return a list of tags for a provided resource
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to return a list of trained model inference jobs
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModelInferenceJobs.html
     */
    toListTrainedModelInferenceJobs() {
        return this.to('ListTrainedModelInferenceJobs');
    }
    /**
     * Grants permission to return a list of trained model versions
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModelVersions.html
     */
    toListTrainedModelVersions() {
        return this.to('ListTrainedModelVersions');
    }
    /**
     * Grants permission to return a list of trained models
     *
     * Access Level: List
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainedModels.html
     */
    toListTrainedModels() {
        return this.to('ListTrainedModels');
    }
    /**
     * Grants permission to return a list of training datasets
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_ListTrainingDatasets.html
     */
    toListTrainingDatasets() {
        return this.to('ListTrainingDatasets');
    }
    /**
     * Grants permission to create or update the resource policy for a configured audience model
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_PutConfiguredAudienceModelPolicy.html
     */
    toPutConfiguredAudienceModelPolicy() {
        return this.to('PutConfiguredAudienceModelPolicy');
    }
    /**
     * Grants permission to put an ML configuration
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_PutMLConfiguration.html
     */
    toPutMLConfiguration() {
        return this.to('PutMLConfiguration');
    }
    /**
     * Grants permission to export an audience of a specified size after you have generated an audience
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartAudienceExportJob.html
     */
    toStartAudienceExportJob() {
        return this.to('StartAudienceExportJob');
    }
    /**
     * Grants permission to start the audience generation job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartAudienceGenerationJob.html
     */
    toStartAudienceGenerationJob() {
        return this.to('StartAudienceGenerationJob');
    }
    /**
     * Grants permission to start a trained model export job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartTrainedModelExportJob.html
     */
    toStartTrainedModelExportJob() {
        return this.to('StartTrainedModelExportJob');
    }
    /**
     * Grants permission to start a trained model inference job
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_StartTrainedModelInferenceJob.html
     */
    toStartTrainedModelInferenceJob() {
        return this.to('StartTrainedModelInferenceJob');
    }
    /**
     * Grants permission to tag a specific resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to untag a specific resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_UntagResource.html
     */
    toUnTagResource() {
        return this.to('UnTagResource');
    }
    /**
     * Grants permission to update a configured audience model.
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/cleanrooms-ml/latest/APIReference/API_UpdateConfiguredAudienceModel.html
     */
    toUpdateConfiguredAudienceModel() {
        return this.to('UpdateConfiguredAudienceModel');
    }
    /**
     * Adds a resource of type ConfiguredModelAlgorithm to the statement
     *
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onConfiguredModelAlgorithm(resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:configured-model-algorithm/${resourceId}`);
    }
    /**
     * Adds a resource of type ConfiguredModelAlgorithmAssociation to the statement
     *
     * @param membershipId - Identifier for the membershipId.
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onConfiguredModelAlgorithmAssociation(membershipId, resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/configured-model-algorithm-association/${resourceId}`);
    }
    /**
     * Adds a resource of type MLInputChannel to the statement
     *
     * @param membershipId - Identifier for the membershipId.
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onMLInputChannel(membershipId, resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/ml-input-channel/${resourceId}`);
    }
    /**
     * Adds a resource of type TrainedModel to the statement
     *
     * @param membershipId - Identifier for the membershipId.
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onTrainedModel(membershipId, resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/trained-model/${resourceId}`);
    }
    /**
     * Adds a resource of type TrainedModelInferenceJob to the statement
     *
     * @param membershipId - Identifier for the membershipId.
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onTrainedModelInferenceJob(membershipId, resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:membership/${membershipId}/trained-model-inference-job/${resourceId}`);
    }
    /**
     * Adds a resource of type audiencegenerationjob to the statement
     *
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onAudiencegenerationjob(resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:audience-generation-job/${resourceId}`);
    }
    /**
     * Adds a resource of type audiencemodel to the statement
     *
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onAudiencemodel(resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:audience-model/${resourceId}`);
    }
    /**
     * Adds a resource of type configuredaudiencemodel to the statement
     *
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onConfiguredaudiencemodel(resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:configured-audience-model/${resourceId}`);
    }
    /**
     * Adds a resource of type trainingdataset to the statement
     *
     * @param resourceId - Identifier for the resourceId.
     * @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()
     */
    onTrainingdataset(resourceId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:cleanrooms-ml:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:training-dataset/${resourceId}`);
    }
    /**
     * Filters access by the presence of tag key-value pairs in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCancelTrainedModel()
     * - .toCancelTrainedModelInferenceJob()
     * - .toCreateAudienceModel()
     * - .toCreateConfiguredAudienceModel()
     * - .toCreateConfiguredModelAlgorithm()
     * - .toCreateConfiguredModelAlgorithmAssociation()
     * - .toCreateMLInputChannel()
     * - .toCreateTrainedModel()
     * - .toCreateTrainingDataset()
     * - .toDeleteAudienceGenerationJob()
     * - .toDeleteAudienceModel()
     * - .toDeleteConfiguredAudienceModel()
     * - .toDeleteConfiguredAudienceModelPolicy()
     * - .toDeleteConfiguredModelAlgorithm()
     * - .toDeleteConfiguredModelAlgorithmAssociation()
     * - .toDeleteMLConfiguration()
     * - .toDeleteMLInputChannelData()
     * - .toDeleteTrainedModelOutput()
     * - .toDeleteTrainingDataset()
     * - .toGetAudienceGenerationJob()
     * - .toGetAudienceModel()
     * - .toGetCollaborationConfiguredModelAlgorithmAssociation()
     * - .toGetCollaborationMLInputChannel()
     * - .toGetCollaborationTrainedModel()
     * - .toGetConfiguredAudienceModel()
     * - .toGetConfiguredAudienceModelPolicy()
     * - .toGetConfiguredModelAlgorithm()
     * - .toGetConfiguredModelAlgorithmAssociation()
     * - .toGetMLConfiguration()
     * - .toGetMLInputChannel()
     * - .toGetTrainedModel()
     * - .toGetTrainedModelInferenceJob()
     * - .toGetTrainingDataset()
     * - .toListAudienceExportJobs()
     * - .toListAudienceGenerationJobs()
     * - .toListCollaborationConfiguredModelAlgorithmAssociations()
     * - .toListCollaborationMLInputChannels()
     * - .toListCollaborationTrainedModelExportJobs()
     * - .toListCollaborationTrainedModelInferenceJobs()
     * - .toListCollaborationTrainedModels()
     * - .toListConfiguredModelAlgorithmAssociations()
     * - .toListConfiguredModelAlgorithms()
     * - .toListMLInputChannels()
     * - .toListTrainedModelInferenceJobs()
     * - .toListTrainedModelVersions()
     * - .toListTrainedModels()
     * - .toPutMLConfiguration()
     * - .toStartAudienceExportJob()
     * - .toStartAudienceGenerationJob()
     * - .toStartTrainedModelExportJob()
     * - .toStartTrainedModelInferenceJob()
     * - .toTagResource()
     * - .toUpdateConfiguredAudienceModel()
     *
     * @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 tag key-value pairs attached to the resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toCancelTrainedModel()
     * - .toCancelTrainedModelInferenceJob()
     * - .toCreateAudienceModel()
     * - .toCreateConfiguredAudienceModel()
     * - .toCreateConfiguredModelAlgorithmAssociation()
     * - .toCreateMLInputChannel()
     * - .toCreateTrainedModel()
     * - .toDeleteAudienceGenerationJob()
     * - .toDeleteAudienceModel()
     * - .toDeleteConfiguredAudienceModel()
     * - .toDeleteConfiguredAudienceModelPolicy()
     * - .toDeleteConfiguredModelAlgorithm()
     * - .toDeleteConfiguredModelAlgorithmAssociation()
     * - .toDeleteMLInputChannelData()
     * - .toDeleteTrainedModelOutput()
     * - .toDeleteTrainingDataset()
     * - .toGetAudienceGenerationJob()
     * - .toGetAudienceModel()
     * - .toGetCollaborationConfiguredModelAlgorithmAssociation()
     * - .toGetCollaborationMLInputChannel()
     * - .toGetCollaborationTrainedModel()
     * - .toGetConfiguredAudienceModel()
     * - .toGetConfiguredAudienceModelPolicy()
     * - .toGetConfiguredModelAlgorithm()
     * - .toGetConfiguredModelAlgorithmAssociation()
     * - .toGetMLInputChannel()
     * - .toGetTrainedModel()
     * - .toGetTrainedModelInferenceJob()
     * - .toGetTrainingDataset()
     * - .toListAudienceExportJobs()
     * - .toListAudienceGenerationJobs()
     * - .toListCollaborationTrainedModelExportJobs()
     * - .toListTagsForResource()
     * - .toPutConfiguredAudienceModelPolicy()
     * - .toStartAudienceExportJob()
     * - .toStartAudienceGenerationJob()
     * - .toStartTrainedModelExportJob()
     * - .toStartTrainedModelInferenceJob()
     * - .toTagResource()
     * - .toUnTagResource()
     * - .toUpdateConfiguredAudienceModel()
     *
     * Applies to resource types:
     * - ConfiguredModelAlgorithm
     * - ConfiguredModelAlgorithmAssociation
     * - MLInputChannel
     * - TrainedModel
     * - TrainedModelInferenceJob
     * - audiencegenerationjob
     * - audiencemodel
     * - configuredaudiencemodel
     * - trainingdataset
     *
     * @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 presence 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:
     * - .toCancelTrainedModel()
     * - .toCancelTrainedModelInferenceJob()
     * - .toCreateAudienceModel()
     * - .toCreateConfiguredAudienceModel()
     * - .toCreateConfiguredModelAlgorithm()
     * - .toCreateConfiguredModelAlgorithmAssociation()
     * - .toCreateMLInputChannel()
     * - .toCreateTrainedModel()
     * - .toCreateTrainingDataset()
     * - .toDeleteAudienceGenerationJob()
     * - .toDeleteAudienceModel()
     * - .toDeleteConfiguredAudienceModel()
     * - .toDeleteConfiguredAudienceModelPolicy()
     * - .toDeleteConfiguredModelAlgorithm()
     * - .toDeleteConfiguredModelAlgorithmAssociation()
     * - .toDeleteMLConfiguration()
     * - .toDeleteMLInputChannelData()
     * - .toDeleteTrainedModelOutput()
     * - .toDeleteTrainingDataset()
     * - .toGetAudienceGenerationJob()
     * - .toGetAudienceModel()
     * - .toGetCollaborationConfiguredModelAlgorithmAssociation()
     * - .toGetCollaborationMLInputChannel()
     * - .toGetCollaborationTrainedModel()
     * - .toGetConfiguredAudienceModel()
     * - .toGetConfiguredAudienceModelPolicy()
     * - .toGetConfiguredModelAlgorithm()
     * - .toGetConfiguredModelAlgorithmAssociation()
     * - .toGetMLConfiguration()
     * - .toGetMLInputChannel()
     * - .toGetTrainedModel()
     * - .toGetTrainedModelInferenceJob()
     * - .toGetTrainingDataset()
     * - .toListAudienceExportJobs()
     * - .toListAudienceGenerationJobs()
     * - .toListCollaborationConfiguredModelAlgorithmAssociations()
     * - .toListCollaborationMLInputChannels()
     * - .toListCollaborationTrainedModelExportJobs()
     * - .toListCollaborationTrainedModelInferenceJobs()
     * - .toListCollaborationTrainedModels()
     * - .toListConfiguredModelAlgorithmAssociations()
     * - .toListConfiguredModelAlgorithms()
     * - .toListMLInputChannels()
     * - .toListTagsForResource()
     * - .toListTrainedModelInferenceJobs()
     * - .toListTrainedModelVersions()
     * - .toListTrainedModels()
     * - .toPutMLConfiguration()
     * - .toStartAudienceExportJob()
     * - .toStartAudienceGenerationJob()
     * - .toStartTrainedModelExportJob()
     * - .toStartTrainedModelInferenceJob()
     * - .toTagResource()
     * - .toUnTagResource()
     * - .toUpdateConfiguredAudienceModel()
     *
     * @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');
    }
    /**
     * Filters access by Clean rooms collaboration id
     *
     * https://docs.aws.amazon.com/TBD
     *
     * Applies to actions:
     * - .toGetCollaborationConfiguredModelAlgorithmAssociation()
     * - .toGetCollaborationMLInputChannel()
     * - .toGetCollaborationTrainedModel()
     * - .toListCollaborationConfiguredModelAlgorithmAssociations()
     * - .toListCollaborationMLInputChannels()
     * - .toListCollaborationTrainedModelExportJobs()
     * - .toListCollaborationTrainedModelInferenceJobs()
     * - .toListCollaborationTrainedModels()
     * - .toStartAudienceGenerationJob()
     *
     * @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`
     */
    ifCollaborationId(value, operator) {
        return this.if(`CollaborationId`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [cleanrooms-ml](https://docs.aws.amazon.com/service-authorization/latest/reference/list_cleanroomsml.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'cleanrooms-ml';
        this.accessLevelList = {
            Write: [
                'CancelTrainedModel',
                'CancelTrainedModelInferenceJob',
                'CreateAudienceModel',
                'CreateConfiguredAudienceModel',
                'CreateConfiguredModelAlgorithm',
                'CreateConfiguredModelAlgorithmAssociation',
                'CreateMLInputChannel',
                'CreateTrainedModel',
                'CreateTrainingDataset',
                'DeleteAudienceGenerationJob',
                'DeleteAudienceModel',
                'DeleteConfiguredAudienceModel',
                'DeleteConfiguredAudienceModelPolicy',
                'DeleteConfiguredModelAlgorithm',
                'DeleteConfiguredModelAlgorithmAssociation',
                'DeleteMLConfiguration',
                'DeleteMLInputChannelData',
                'DeleteTrainedModelOutput',
                'DeleteTrainingDataset',
                'PutConfiguredAudienceModelPolicy',
                'PutMLConfiguration',
                'StartAudienceExportJob',
                'StartAudienceGenerationJob',
                'StartTrainedModelExportJob',
                'StartTrainedModelInferenceJob',
                'TagResource',
                'UnTagResource',
                'UpdateConfiguredAudienceModel'
            ],
            Read: [
                'GetAudienceGenerationJob',
                'GetAudienceModel',
                'GetCollaborationConfiguredModelAlgorithmAssociation',
                'GetCollaborationMLInputChannel',
                'GetCollaborationTrainedModel',
                'GetConfiguredAudienceModel',
                'GetConfiguredAudienceModelPolicy',
                'GetConfiguredModelAlgorithm',
                'GetConfiguredModelAlgorithmAssociation',
                'GetMLConfiguration',
                'GetMLInputChannel',
                'GetTrainedModel',
                'GetTrainedModelInferenceJob',
                'GetTrainingDataset'
            ],
            List: [
                'ListAudienceExportJobs',
                'ListAudienceGenerationJobs',
                'ListAudienceModels',
                'ListCollaborationConfiguredModelAlgorithmAssociations',
                'ListCollaborationMLInputChannels',
                'ListCollaborationTrainedModelExportJobs',
                'ListCollaborationTrainedModelInferenceJobs',
                'ListCollaborationTrainedModels',
                'ListConfiguredAudienceModels',
                'ListConfiguredModelAlgorithmAssociations',
                'ListConfiguredModelAlgorithms',
                'ListMLInputChannels',
                'ListTagsForResource',
                'ListTrainedModelInferenceJobs',
                'ListTrainedModelVersions',
                'ListTrainedModels',
                'ListTrainingDatasets'
            ],
            'Permissions management': [
                'PutConfiguredAudienceModelPolicy'
            ],
            Tagging: [
                'TagResource',
                'UnTagResource'
            ]
        };
    }
}
exports.CleanroomsMl = CleanroomsMl;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW5yb29tc21sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xlYW5yb29tc21sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsd0JBQWU7SUFHL0M7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQ0FBZ0M7UUFDckMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksZ0NBQWdDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQ0FBMkM7UUFDaEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFB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QUM3QixvQkFBb0I7YUFDckI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osd0JBQXdCO2dCQUN4Qiw0QkFBNEI7Z0JBQzVCLG9CQUFvQjtnQkFDcEIsdURBQXVEO2dCQUN2RCxrQ0FBa0M7Z0JBQ2xDLHlDQUF5QztnQkFDekMsNENBQTRDO2dCQUM1QyxnQ0FBZ0M7Z0JBQ2hDLDhCQUE4QjtnQkFDOUIsMENBQTBDO2dCQUMxQywrQkFBK0I7Z0JBQy9CLHFCQUFxQjtnQkFDckIscUJBQXFCO2dCQUNyQiwrQkFBK0I7Z0JBQy9CLDBCQUEwQjtnQkFDMUIsbUJBQW1CO2dCQUNuQixzQkFBc0I7YUFDdkI7WUFDRCx3QkFBd0IsRUFBRTtnQkFDeEIsa0NBQWtDO2FBQ25DO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUFzWEYsQ0FBQztDQUNGO0FBNW9DRCxvQ0E0b0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtjbGVhbnJvb21zLW1sXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9jbGVhbnJvb21zbWwuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbnJvb21zTWwgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdjbGVhbnJvb21zLW1sJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGEgdHJhaW5lZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhbmNlbFRyYWluZWRNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxUcmFpbmVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFRyYWluZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhIHRyYWluZWQgbW9kZWwgaW5mZXJlbmNlIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBhdWRpZW5jZSBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUF1ZGllbmNlTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXVkaWVuY2VNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIE1MIGlucHV0IGNoYW5uZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVNTElucHV0Q2hhbm5lbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNTElucHV0Q2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTUxJbnB1dENoYW5uZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0cmFpbmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJhaW5lZE1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVHJhaW5lZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdHJhaW5pbmcgZGF0YXNldCwgb3Igc2VlZCBhdWRpZW5jZS4gSW4gQ2xlYW4gUm9vbXMgTUwsIHRoZSBUcmFpbmluZ0RhdGFzZXQgaXMgbWV0YWRhdGEgdGhhdCBwb2ludHMgdG8gYSBHbHVlIHRhYmxlLCB3aGljaCBpcyByZWFkIG9ubHkgZHVyaW5nIEF1ZGllbmNlTW9kZWwgY3JlYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUcmFpbmluZ0RhdGFzZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUcmFpbmluZ0RhdGFzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYiwgYW5kIHJlbW92ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQXVkaWVuY2VHZW5lcmF0aW9uSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYiwgYW5kIHJlbW92ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCBjb25maWd1cmVkIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgY29uZmlndXJlZCBhdWRpZW5jZSBtb2RlbCBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFuIE1MIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTCBpbnB1dCBjaGFubmVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1MSW5wdXRDaGFubmVsRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFsbCBvdXRwdXQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpbmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlVHJhaW5lZE1vZGVsT3V0cHV0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhaW5lZE1vZGVsT3V0cHV0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhaW5pbmcgZGF0YXNldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVRyYWluaW5nRGF0YXNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFpbmluZ0RhdGFzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWluaW5nRGF0YXNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGFuIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEF1ZGllbmNlTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobSBhc3NvY2lhdGlvbiBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBNTCBpbnB1dCBjaGFubmVsIGNyZWF0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbCBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWwgcG9saWN5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgY29uZmlndXJlZCBtb2RlbCBhbGdvcml0aG0gYXNzb2NpYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhbiBNTCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYW4gTUwgaW5wdXQgY2hhbm5lbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TUxJbnB1dENoYW5uZWwuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TUxJbnB1dENoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1MSW5wdXRDaGFubmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0VHJhaW5lZE1vZGVsLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRyYWluZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VHJhaW5lZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhaW5lZCBtb2RlbCBpbmZlcmVuY2Ugam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFpbmluZyBkYXRhc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUcmFpbmluZ0RhdGFzZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhaW5pbmdEYXRhc2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFpbmluZ0RhdGFzZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRoZSBhdWRpZW5jZSBleHBvcnQgam9ic1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEF1ZGllbmNlRXhwb3J0Sm9icy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXVkaWVuY2VFeHBvcnRKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VFeHBvcnRKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBhdWRpZW5jZSBnZW5lcmF0aW9uIGpvYnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VHZW5lcmF0aW9uSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgYXVkaWVuY2UgbW9kZWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0QXVkaWVuY2VNb2RlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEF1ZGllbmNlTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXVkaWVuY2VNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtcyBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQ29sbGFib3JhdGlvbklkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBNTCBpbnB1dCBjaGFubmVscyBjcmVhdGVkIGJ5IGFueSBtZW1iZXIgaW4gdGhlIGNvbGxhYm9yYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqIC0gLmlmQ29sbGFib3JhdGlvbklkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb2xsYWJvcmF0aW9uTUxJbnB1dENoYW5uZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGV4cG9ydCBqb2JzIHN0YXJ0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGluZmVyZW5jZSBqb2JzIHN0YXJ0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDb2xsYWJvcmF0aW9uSWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRyYWluZWQgbW9kZWxzIGNyZWF0ZWQgYnkgYW55IG1lbWJlciBpbiB0aGUgY29sbGFib3JhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZDb2xsYWJvcmF0aW9uSWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgYXVkaWVuY2UgbW9kZWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25maWd1cmVkQXVkaWVuY2VNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb25maWd1cmVkQXVkaWVuY2VNb2RlbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbW9kZWwgYWxnb3JpdGhtIGFzc29jaWF0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiBjb25maWd1cmVkIG1vZGVsIGFsZ29yaXRobXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgTUwgaW5wdXQgY2hhbm5lbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RNTElucHV0Q2hhbm5lbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdE1MSW5wdXRDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE1MSW5wdXRDaGFubmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdGFncyBmb3IgYSBwcm92aWRlZCByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIGEgbGlzdCBvZiB0cmFpbmVkIG1vZGVsIGluZmVyZW5jZSBqb2JzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gYSBsaXN0IG9mIHRyYWluZWQgbW9kZWwgdmVyc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmVkTW9kZWxWZXJzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VHJhaW5lZE1vZGVsVmVyc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUcmFpbmVkTW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdHJhaW5lZCBtb2RlbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmVkTW9kZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUcmFpbmVkTW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VHJhaW5lZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiBhIGxpc3Qgb2YgdHJhaW5pbmcgZGF0YXNldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcmFpbmluZ0RhdGFzZXRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUcmFpbmluZ0RhdGFzZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VHJhaW5pbmdEYXRhc2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBjb25maWd1cmVkIGF1ZGllbmNlIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHV0IGFuIE1MIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXRNTENvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0TUxDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRNTENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBleHBvcnQgYW4gYXVkaWVuY2Ugb2YgYSBzcGVjaWZpZWQgc2l6ZSBhZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgYW4gYXVkaWVuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCB0aGUgYXVkaWVuY2UgZ2VuZXJhdGlvbiBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRBdWRpZW5jZUdlbmVyYXRpb25Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRyYWluZWQgbW9kZWwgZXhwb3J0IGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGVhbnJvb21zLW1sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1N0YXJ0VHJhaW5lZE1vZGVsRXhwb3J0Sm9iLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0VHJhaW5lZE1vZGVsRXhwb3J0Sm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRyYWluZWRNb2RlbEV4cG9ydEpvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgdHJhaW5lZCBtb2RlbCBpbmZlcmVuY2Ugam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdGFnIGEgc3BlY2lmaWMgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bnRhZyBhIHNwZWNpZmljIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsZWFucm9vbXMtbWwvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVW50YWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VblRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVblRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgY29uZmlndXJlZCBhdWRpZW5jZSBtb2RlbC5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xlYW5yb29tcy1tbC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0NhbmNlbFRyYWluZWRNb2RlbCcsXG4gICAgICAnQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyxcbiAgICAgICdDcmVhdGVBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdDcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCcsXG4gICAgICAnQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyxcbiAgICAgICdDcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicsXG4gICAgICAnQ3JlYXRlTUxJbnB1dENoYW5uZWwnLFxuICAgICAgJ0NyZWF0ZVRyYWluZWRNb2RlbCcsXG4gICAgICAnQ3JlYXRlVHJhaW5pbmdEYXRhc2V0JyxcbiAgICAgICdEZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2InLFxuICAgICAgJ0RlbGV0ZUF1ZGllbmNlTW9kZWwnLFxuICAgICAgJ0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdEZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeScsXG4gICAgICAnRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtJyxcbiAgICAgICdEZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbicsXG4gICAgICAnRGVsZXRlTUxDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVNTElucHV0Q2hhbm5lbERhdGEnLFxuICAgICAgJ0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCcsXG4gICAgICAnRGVsZXRlVHJhaW5pbmdEYXRhc2V0JyxcbiAgICAgICdQdXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeScsXG4gICAgICAnUHV0TUxDb25maWd1cmF0aW9uJyxcbiAgICAgICdTdGFydEF1ZGllbmNlRXhwb3J0Sm9iJyxcbiAgICAgICdTdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYicsXG4gICAgICAnU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2InLFxuICAgICAgJ1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW5UYWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iJyxcbiAgICAgICdHZXRBdWRpZW5jZU1vZGVsJyxcbiAgICAgICdHZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24nLFxuICAgICAgJ0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCcsXG4gICAgICAnR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCcsXG4gICAgICAnR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWwnLFxuICAgICAgJ0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5JyxcbiAgICAgICdHZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG0nLFxuICAgICAgJ0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uJyxcbiAgICAgICdHZXRNTENvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldE1MSW5wdXRDaGFubmVsJyxcbiAgICAgICdHZXRUcmFpbmVkTW9kZWwnLFxuICAgICAgJ0dldFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYicsXG4gICAgICAnR2V0VHJhaW5pbmdEYXRhc2V0J1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMnLFxuICAgICAgJ0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzJyxcbiAgICAgICdMaXN0QXVkaWVuY2VNb2RlbHMnLFxuICAgICAgJ0xpc3RDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25zJyxcbiAgICAgICdMaXN0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVscycsXG4gICAgICAnTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxFeHBvcnRKb2JzJyxcbiAgICAgICdMaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEluZmVyZW5jZUpvYnMnLFxuICAgICAgJ0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVscycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVscycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucycsXG4gICAgICAnTGlzdENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobXMnLFxuICAgICAgJ0xpc3RNTElucHV0Q2hhbm5lbHMnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0xpc3RUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzJyxcbiAgICAgICdMaXN0VHJhaW5lZE1vZGVsVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RUcmFpbmVkTW9kZWxzJyxcbiAgICAgICdMaXN0VHJhaW5pbmdEYXRhc2V0cydcbiAgICBdLFxuICAgICdQZXJtaXNzaW9ucyBtYW5hZ2VtZW50JzogW1xuICAgICAgJ1B1dENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5J1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVblRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpjb25maWd1cmVkLW1vZGVsLWFsZ29yaXRobS8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBtZW1iZXJzaGlwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbWVtYmVyc2hpcElkLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbihtZW1iZXJzaGlwSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om1lbWJlcnNoaXAvJHsgbWVtYmVyc2hpcElkIH0vY29uZmlndXJlZC1tb2RlbC1hbGdvcml0aG0tYXNzb2NpYXRpb24vJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgTUxJbnB1dENoYW5uZWwgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gbWVtYmVyc2hpcElkIC0gSWRlbnRpZmllciBmb3IgdGhlIG1lbWJlcnNoaXBJZC5cbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uTUxJbnB1dENoYW5uZWwobWVtYmVyc2hpcElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptZW1iZXJzaGlwLyR7IG1lbWJlcnNoaXBJZCB9L21sLWlucHV0LWNoYW5uZWwvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgVHJhaW5lZE1vZGVsIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIG1lbWJlcnNoaXBJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBtZW1iZXJzaGlwSWQuXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblRyYWluZWRNb2RlbChtZW1iZXJzaGlwSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9Om1lbWJlcnNoaXAvJHsgbWVtYmVyc2hpcElkIH0vdHJhaW5lZC1tb2RlbC8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gbWVtYmVyc2hpcElkIC0gSWRlbnRpZmllciBmb3IgdGhlIG1lbWJlcnNoaXBJZC5cbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKG1lbWJlcnNoaXBJZDogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06bWVtYmVyc2hpcC8keyBtZW1iZXJzaGlwSWQgfS90cmFpbmVkLW1vZGVsLWluZmVyZW5jZS1qb2IvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYXVkaWVuY2VnZW5lcmF0aW9uam9iIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQXVkaWVuY2VnZW5lcmF0aW9uam9iKHJlc291cmNlSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpjbGVhbnJvb21zLW1sOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTphdWRpZW5jZS1nZW5lcmF0aW9uLWpvYi8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBhdWRpZW5jZW1vZGVsIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uQXVkaWVuY2Vtb2RlbChyZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YXVkaWVuY2UtbW9kZWwvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgY29uZmlndXJlZGF1ZGllbmNlbW9kZWwgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Db25maWd1cmVkYXVkaWVuY2Vtb2RlbChyZXNvdXJjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y2xlYW5yb29tcy1tbDokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Y29uZmlndXJlZC1hdWRpZW5jZS1tb2RlbC8keyByZXNvdXJjZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB0cmFpbmluZ2RhdGFzZXQgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25UcmFpbmluZ2RhdGFzZXQocmVzb3VyY2VJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmNsZWFucm9vbXMtbWw6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnRyYWluaW5nLWRhdGFzZXQvJHsgcmVzb3VyY2VJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHByZXNlbmNlIG9mIHRhZyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9DcmVhdGVBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVNTElucHV0Q2hhbm5lbERhdGEoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9HZXRBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0dldEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldE1MQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0TUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0dldFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9HZXRUcmFpbmluZ0RhdGFzZXQoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvbkNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKClcbiAgICogLSAudG9MaXN0TUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdFRyYWluZWRNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVscygpXG4gICAqIC0gLnRvUHV0TUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGFnIGtleS12YWx1ZSBwYWlycyBhdHRhY2hlZCB0byB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DYW5jZWxUcmFpbmVkTW9kZWwoKVxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYigpXG4gICAqIC0gLnRvQ3JlYXRlQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0NyZWF0ZUNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKClcbiAgICogLSAudG9DcmVhdGVNTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxJbnB1dENoYW5uZWxEYXRhKClcbiAgICogLSAudG9EZWxldGVUcmFpbmVkTW9kZWxPdXRwdXQoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluaW5nRGF0YXNldCgpXG4gICAqIC0gLnRvR2V0QXVkaWVuY2VHZW5lcmF0aW9uSm9iKClcbiAgICogLSAudG9HZXRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsUG9saWN5KClcbiAgICogLSAudG9HZXRDb25maWd1cmVkTW9kZWxBbGdvcml0aG0oKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9uKClcbiAgICogLSAudG9HZXRNTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKVxuICAgKiAtIC50b0dldFRyYWluaW5nRGF0YXNldCgpXG4gICAqIC0gLnRvTGlzdEF1ZGllbmNlRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdEF1ZGllbmNlR2VuZXJhdGlvbkpvYnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b1N0YXJ0QXVkaWVuY2VFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0QXVkaWVuY2VHZW5lcmF0aW9uSm9iKClcbiAgICogLSAudG9TdGFydFRyYWluZWRNb2RlbEV4cG9ydEpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2IoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VblRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtXG4gICAqIC0gQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb25cbiAgICogLSBNTElucHV0Q2hhbm5lbFxuICAgKiAtIFRyYWluZWRNb2RlbFxuICAgKiAtIFRyYWluZWRNb2RlbEluZmVyZW5jZUpvYlxuICAgKiAtIGF1ZGllbmNlZ2VuZXJhdGlvbmpvYlxuICAgKiAtIGF1ZGllbmNlbW9kZWxcbiAgICogLSBjb25maWd1cmVkYXVkaWVuY2Vtb2RlbFxuICAgKiAtIHRyYWluaW5nZGF0YXNldFxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGFnIGtleXMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NhbmNlbFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ2FuY2VsVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9DcmVhdGVBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9DcmVhdGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlTUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0NyZWF0ZVRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvQ3JlYXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9EZWxldGVBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0RlbGV0ZUF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUNvbmZpZ3VyZWRBdWRpZW5jZU1vZGVsKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkQXVkaWVuY2VNb2RlbFBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtKClcbiAgICogLSAudG9EZWxldGVDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlTUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZWxldGVNTElucHV0Q2hhbm5lbERhdGEoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWluZWRNb2RlbE91dHB1dCgpXG4gICAqIC0gLnRvRGVsZXRlVHJhaW5pbmdEYXRhc2V0KClcbiAgICogLSAudG9HZXRBdWRpZW5jZUdlbmVyYXRpb25Kb2IoKVxuICAgKiAtIC50b0dldEF1ZGllbmNlTW9kZWwoKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvbk1MSW5wdXRDaGFubmVsKClcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsKClcbiAgICogLSAudG9HZXRDb25maWd1cmVkQXVkaWVuY2VNb2RlbCgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZEF1ZGllbmNlTW9kZWxQb2xpY3koKVxuICAgKiAtIC50b0dldENvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobSgpXG4gICAqIC0gLnRvR2V0Q29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldE1MQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0TUxJbnB1dENoYW5uZWwoKVxuICAgKiAtIC50b0dldFRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9HZXRUcmFpbmluZ0RhdGFzZXQoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RBdWRpZW5jZUdlbmVyYXRpb25Kb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvbkNvbmZpZ3VyZWRNb2RlbEFsZ29yaXRobUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbHMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsRXhwb3J0Sm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxJbmZlcmVuY2VKb2JzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbHMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb25maWd1cmVkTW9kZWxBbGdvcml0aG1zKClcbiAgICogLSAudG9MaXN0TUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdFRyYWluZWRNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9MaXN0VHJhaW5lZE1vZGVscygpXG4gICAqIC0gLnRvUHV0TUxDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlRXhwb3J0Sm9iKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqIC0gLnRvU3RhcnRUcmFpbmVkTW9kZWxFeHBvcnRKb2IoKVxuICAgKiAtIC50b1N0YXJ0VHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9iKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW5UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlQ29uZmlndXJlZEF1ZGllbmNlTW9kZWwoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgQ2xlYW4gcm9vbXMgY29sbGFib3JhdGlvbiBpZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vVEJEXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9HZXRDb2xsYWJvcmF0aW9uQ29uZmlndXJlZE1vZGVsQWxnb3JpdGhtQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldENvbGxhYm9yYXRpb25NTElucHV0Q2hhbm5lbCgpXG4gICAqIC0gLnRvR2V0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbCgpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25Db25maWd1cmVkTW9kZWxBbGdvcml0aG1Bc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uTUxJbnB1dENoYW5uZWxzKClcbiAgICogLSAudG9MaXN0Q29sbGFib3JhdGlvblRyYWluZWRNb2RlbEV4cG9ydEpvYnMoKVxuICAgKiAtIC50b0xpc3RDb2xsYWJvcmF0aW9uVHJhaW5lZE1vZGVsSW5mZXJlbmNlSm9icygpXG4gICAqIC0gLnRvTGlzdENvbGxhYm9yYXRpb25UcmFpbmVkTW9kZWxzKClcbiAgICogLSAudG9TdGFydEF1ZGllbmNlR2VuZXJhdGlvbkpvYigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQ29sbGFib3JhdGlvbklkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBDb2xsYWJvcmF0aW9uSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2NsZWFucm9vbXMtbWxdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2NsZWFucm9vbXNtbC5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=