cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
665 lines • 50.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SagemakerMlflow = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [sagemaker-mlflow](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemakerwithmlflow.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class SagemakerMlflow extends shared_1.PolicyStatement {
/**
* Grants permission to access the MLflow UI
*
* Access Level: Read
*/
toAccessUI() {
return this.to('AccessUI');
}
/**
* Grants permission to create an MLflow experiment
*
* Access Level: Write
*/
toCreateExperiment() {
return this.to('CreateExperiment');
}
/**
* Grants permission to create a new model version
*
* Access Level: Write
*/
toCreateModelVersion() {
return this.to('CreateModelVersion');
}
/**
* Grants permission to create a registered model
*
* Access Level: Write
*/
toCreateRegisteredModel() {
return this.to('CreateRegisteredModel');
}
/**
* Grants permission to create a new run within an experiment
*
* Access Level: Write
*/
toCreateRun() {
return this.to('CreateRun');
}
/**
* Grants permission to mark an MLflow experiment for deletion
*
* Access Level: Write
*/
toDeleteExperiment() {
return this.to('DeleteExperiment');
}
/**
* Grants permission to delete a logged model in MLflow
*
* Access Level: Write
*/
toDeleteLoggedModel() {
return this.to('DeleteLoggedModel');
}
/**
* Grants permission to delete a tag for a logged model in MLflow
*
* Access Level: Write
*/
toDeleteLoggedModelTag() {
return this.to('DeleteLoggedModelTag');
}
/**
* Grants permission to delete a model version
*
* Access Level: Write
*/
toDeleteModelVersion() {
return this.to('DeleteModelVersion');
}
/**
* Grants permission to delete a model version tag
*
* Access Level: Write
*/
toDeleteModelVersionTag() {
return this.to('DeleteModelVersionTag');
}
/**
* Grants permission to delete a registered model
*
* Access Level: Write
*/
toDeleteRegisteredModel() {
return this.to('DeleteRegisteredModel');
}
/**
* Grants permission to delete a registered model alias
*
* Access Level: Write
*/
toDeleteRegisteredModelAlias() {
return this.to('DeleteRegisteredModelAlias');
}
/**
* Grants permission to delete a registered model tag
*
* Access Level: Write
*/
toDeleteRegisteredModelTag() {
return this.to('DeleteRegisteredModelTag');
}
/**
* Grants permission to mark a run for deletion
*
* Access Level: Write
*/
toDeleteRun() {
return this.to('DeleteRun');
}
/**
* Grants permission to delete a tag on a run
*
* Access Level: Write
*/
toDeleteTag() {
return this.to('DeleteTag');
}
/**
* Grants permission to delete a trace tag in MLflow
*
* Access Level: Write
*/
toDeleteTraceTag() {
return this.to('DeleteTraceTag');
}
/**
* Grants permission to delete traces in MLflow
*
* Access Level: Write
*/
toDeleteTraces() {
return this.to('DeleteTraces');
}
/**
* Grants permission to end a trace in MLflow
*
* Access Level: Write
*/
toEndTrace() {
return this.to('EndTrace');
}
/**
* Grants permission to set status for a logged model in MLflow
*
* Access Level: Write
*/
toFinalizeLoggedModel() {
return this.to('FinalizeLoggedModel');
}
/**
* Grants permission to get a URI to download model artifacts for a specific model version
*
* Access Level: Read
*/
toGetDownloadURIForModelVersionArtifacts() {
return this.to('GetDownloadURIForModelVersionArtifacts');
}
/**
* Grants permission to get metadata for an MLflow experiment
*
* Access Level: Read
*/
toGetExperiment() {
return this.to('GetExperiment');
}
/**
* Grants permission to get metadata for an MLflow experiment by name
*
* Access Level: Read
*/
toGetExperimentByName() {
return this.to('GetExperimentByName');
}
/**
* Grants permission to get the latest model versions
*
* Access Level: List
*/
toGetLatestModelVersions() {
return this.to('GetLatestModelVersions');
}
/**
* Grants permission to get a logged model in MLflow
*
* Access Level: Read
*/
toGetLoggedModel() {
return this.to('GetLoggedModel');
}
/**
* Grants permission to get a list of all values for the specified metric for a given run
*
* Access Level: Read
*/
toGetMetricHistory() {
return this.to('GetMetricHistory');
}
/**
* Grants permission to get a model version by model name and version
*
* Access Level: Read
*/
toGetModelVersion() {
return this.to('GetModelVersion');
}
/**
* Grants permission to get model version by alias in MLflow
*
* Access Level: Read
*/
toGetModelVersionByAlias() {
return this.to('GetModelVersionByAlias');
}
/**
* Grants permission to get a registered model
*
* Access Level: Read
*/
toGetRegisteredModel() {
return this.to('GetRegisteredModel');
}
/**
* Grants permission to get metadata, metrics, parameters, and tags for a run
*
* Access Level: Read
*/
toGetRun() {
return this.to('GetRun');
}
/**
* Grants permission to get information about a trace in MLflow
*
* Access Level: Read
*/
toGetTraceInfo() {
return this.to('GetTraceInfo');
}
/**
* Grants permission to list artifacts for a run
*
* Access Level: List
*/
toListArtifacts() {
return this.to('ListArtifacts');
}
/**
* Grants permission to list artifacts for a logged model in MLflow
*
* Access Level: List
*/
toListLoggedModelArtifacts() {
return this.to('ListLoggedModelArtifacts');
}
/**
* Grants permission to log a batch of metrics, parameters, and tags for a run
*
* Access Level: Write
*/
toLogBatch() {
return this.to('LogBatch');
}
/**
* Grants permission to log inputs for a run
*
* Access Level: Write
*/
toLogInputs() {
return this.to('LogInputs');
}
/**
* Grants permission to log params for a logged model in MLflow
*
* Access Level: Write
*/
toLogLoggedModelParams() {
return this.to('LogLoggedModelParams');
}
/**
* Grants permission to log a metric for a run
*
* Access Level: Write
*/
toLogMetric() {
return this.to('LogMetric');
}
/**
* Grants permission to log the model associated with a run
*
* Access Level: Write
*/
toLogModel() {
return this.to('LogModel');
}
/**
* Grants permission to log outputs, such as models, for a run in MLflow
*
* Access Level: Write
*/
toLogOutputs() {
return this.to('LogOutputs');
}
/**
* Grants permission to log a parameter tracked during a run
*
* Access Level: Write
*/
toLogParam() {
return this.to('LogParam');
}
/**
* Grants permission to rename a registered model
*
* Access Level: Write
*/
toRenameRegisteredModel() {
return this.to('RenameRegisteredModel');
}
/**
* Grants permission to restore an experiment marked for deletion
*
* Access Level: Write
*/
toRestoreExperiment() {
return this.to('RestoreExperiment');
}
/**
* Grants permission to restore a deleted run
*
* Access Level: Write
*/
toRestoreRun() {
return this.to('RestoreRun');
}
/**
* Grants permission to search for MLflow experiments
*
* Access Level: Read
*/
toSearchExperiments() {
return this.to('SearchExperiments');
}
/**
* Grants permission to search for logged models in MLflow
*
* Access Level: Read
*/
toSearchLoggedModels() {
return this.to('SearchLoggedModels');
}
/**
* Grants permission to search for a model version
*
* Access Level: Read
*/
toSearchModelVersions() {
return this.to('SearchModelVersions');
}
/**
* Grants permission to search for registered models in MLflow
*
* Access Level: Read
*/
toSearchRegisteredModels() {
return this.to('SearchRegisteredModels');
}
/**
* Grants permission to search for runs that satisfy expressions
*
* Access Level: Read
*/
toSearchRuns() {
return this.to('SearchRuns');
}
/**
* Grants permission to search for traces in MLflow
*
* Access Level: Read
*/
toSearchTraces() {
return this.to('SearchTraces');
}
/**
* Grants permission to set a tag on an experiment
*
* Access Level: Write
*/
toSetExperimentTag() {
return this.to('SetExperimentTag');
}
/**
* Grants permission to set tags for a logged model in MLflow
*
* Access Level: Write
*/
toSetLoggedModelTags() {
return this.to('SetLoggedModelTags');
}
/**
* Grants permission to set a tag for the model version
*
* Access Level: Write
*/
toSetModelVersionTag() {
return this.to('SetModelVersionTag');
}
/**
* Grants permission to set a registered model alias
*
* Access Level: Write
*/
toSetRegisteredModelAlias() {
return this.to('SetRegisteredModelAlias');
}
/**
* Grants permission to set a tag for a registered model
*
* Access Level: Write
*/
toSetRegisteredModelTag() {
return this.to('SetRegisteredModelTag');
}
/**
* Grants permission to set a tag on a run
*
* Access Level: Write
*/
toSetTag() {
return this.to('SetTag');
}
/**
* Grants permission to set a trace tag in MLflow
*
* Access Level: Write
*/
toSetTraceTag() {
return this.to('SetTraceTag');
}
/**
* Grants permission to start a trace in MLflow
*
* Access Level: Write
*/
toStartTrace() {
return this.to('StartTrace');
}
/**
* Grants permission to transition a model version to a particular stage
*
* Access Level: Write
*/
toTransitionModelVersionStage() {
return this.to('TransitionModelVersionStage');
}
/**
* Grants permission to update the metadata for an MLflow experiment
*
* Access Level: Write
*/
toUpdateExperiment() {
return this.to('UpdateExperiment');
}
/**
* Grants permission to update the model version
*
* Access Level: Write
*/
toUpdateModelVersion() {
return this.to('UpdateModelVersion');
}
/**
* Grants permission to update a registered model
*
* Access Level: Write
*/
toUpdateRegisteredModel() {
return this.to('UpdateRegisteredModel');
}
/**
* Grants permission to update run metadata
*
* Access Level: Write
*/
toUpdateRun() {
return this.to('UpdateRun');
}
/**
* Adds a resource of type mlflow-tracking-server to the statement
*
* https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MlflowTrackingServer.html
*
* @param mlflowTrackingServerName - Identifier for the mlflowTrackingServerName.
* @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.
*/
onMlflowTrackingServer(mlflowTrackingServerName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:sagemaker:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:mlflow-tracking-server/${mlflowTrackingServerName}`);
}
/**
* Filters access by a tag key and value pair
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsagemaker.html#amazonsagemaker-policy-keys
*
* Applies to actions:
* - .toCreateExperiment()
* - .toCreateModelVersion()
* - .toCreateRegisteredModel()
* - .toCreateRun()
* - .toDeleteExperiment()
* - .toDeleteLoggedModel()
* - .toDeleteLoggedModelTag()
* - .toDeleteModelVersion()
* - .toDeleteModelVersionTag()
* - .toDeleteRegisteredModel()
* - .toDeleteRegisteredModelAlias()
* - .toDeleteRegisteredModelTag()
* - .toDeleteRun()
* - .toDeleteTag()
* - .toDeleteTraceTag()
* - .toDeleteTraces()
* - .toEndTrace()
* - .toFinalizeLoggedModel()
* - .toGetDownloadURIForModelVersionArtifacts()
* - .toGetExperiment()
* - .toGetExperimentByName()
* - .toGetLatestModelVersions()
* - .toGetLoggedModel()
* - .toGetMetricHistory()
* - .toGetModelVersion()
* - .toGetModelVersionByAlias()
* - .toGetRegisteredModel()
* - .toGetRun()
* - .toGetTraceInfo()
* - .toListArtifacts()
* - .toListLoggedModelArtifacts()
* - .toLogBatch()
* - .toLogInputs()
* - .toLogLoggedModelParams()
* - .toLogMetric()
* - .toLogModel()
* - .toLogOutputs()
* - .toLogParam()
* - .toRenameRegisteredModel()
* - .toRestoreExperiment()
* - .toRestoreRun()
* - .toSearchExperiments()
* - .toSearchLoggedModels()
* - .toSearchModelVersions()
* - .toSearchRegisteredModels()
* - .toSearchRuns()
* - .toSearchTraces()
* - .toSetExperimentTag()
* - .toSetLoggedModelTags()
* - .toSetModelVersionTag()
* - .toSetRegisteredModelAlias()
* - .toSetRegisteredModelTag()
* - .toSetTag()
* - .toSetTraceTag()
* - .toStartTrace()
* - .toTransitionModelVersionStage()
* - .toUpdateExperiment()
* - .toUpdateModelVersion()
* - .toUpdateRegisteredModel()
* - .toUpdateRun()
*
* @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');
}
/**
* Statement provider for service [sagemaker-mlflow](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemakerwithmlflow.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'sagemaker-mlflow';
this.accessLevelList = {
Read: [
'AccessUI',
'GetDownloadURIForModelVersionArtifacts',
'GetExperiment',
'GetExperimentByName',
'GetLoggedModel',
'GetMetricHistory',
'GetModelVersion',
'GetModelVersionByAlias',
'GetRegisteredModel',
'GetRun',
'GetTraceInfo',
'SearchExperiments',
'SearchLoggedModels',
'SearchModelVersions',
'SearchRegisteredModels',
'SearchRuns',
'SearchTraces'
],
Write: [
'CreateExperiment',
'CreateModelVersion',
'CreateRegisteredModel',
'CreateRun',
'DeleteExperiment',
'DeleteLoggedModel',
'DeleteLoggedModelTag',
'DeleteModelVersion',
'DeleteModelVersionTag',
'DeleteRegisteredModel',
'DeleteRegisteredModelAlias',
'DeleteRegisteredModelTag',
'DeleteRun',
'DeleteTag',
'DeleteTraceTag',
'DeleteTraces',
'EndTrace',
'FinalizeLoggedModel',
'LogBatch',
'LogInputs',
'LogLoggedModelParams',
'LogMetric',
'LogModel',
'LogOutputs',
'LogParam',
'RenameRegisteredModel',
'RestoreExperiment',
'RestoreRun',
'SetExperimentTag',
'SetLoggedModelTags',
'SetModelVersionTag',
'SetRegisteredModelAlias',
'SetRegisteredModelTag',
'SetTag',
'SetTraceTag',
'StartTrace',
'TransitionModelVersionStage',
'UpdateExperiment',
'UpdateModelVersion',
'UpdateRegisteredModel',
'UpdateRun'
],
List: [
'GetLatestModelVersions',
'ListArtifacts',
'ListLoggedModelArtifacts'
]
};
}
}
exports.SagemakerMlflow = SagemakerMlflow;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FnZW1ha2Vyd2l0aG1sZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNhZ2VtYWtlcndpdGhtbGZsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsd0JBQWU7SUFHbEQ7Ozs7T0FJRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JB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O2dCQUN0QixXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixVQUFVO2dCQUNWLHVCQUF1QjtnQkFDdkIsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQixvQkFBb0I7Z0JBQ3BCLHlCQUF5QjtnQkFDekIsdUJBQXVCO2dCQUN2QixRQUFRO2dCQUNSLGFBQWE7Z0JBQ2IsWUFBWTtnQkFDWiw2QkFBNkI7Z0JBQzdCLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQix1QkFBdUI7Z0JBQ3ZCLFdBQVc7YUFDWjtZQUNELElBQUksRUFBRTtnQkFDSix3QkFBd0I7Z0JBQ3hCLGVBQWU7Z0JBQ2YsMEJBQTBCO2FBQzNCO1NBQ0YsQ0FBQztJQWlHRixDQUFDO0NBQ0Y7QUE5c0JELDBDQThzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NhZ2VtYWtlci1tbGZsb3ddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2FtYXpvbnNhZ2VtYWtlcndpdGhtbGZsb3cuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBTYWdlbWFrZXJNbGZsb3cgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdzYWdlbWFrZXItbWxmbG93JztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBNTGZsb3cgVUlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9BY2Nlc3NVSSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXNzVUknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcmVnaXN0ZXJlZCBtb2RlbFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBydW4gd2l0aGluIGFuIGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUnVuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtYXJrIGFuIE1MZmxvdyBleHBlcmltZW50IGZvciBkZWxldGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB0YWcgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMb2dnZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU1vZGVsVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTW9kZWxWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbW9kZWwgdmVyc2lvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcmVnaXN0ZXJlZCBtb2RlbCBhbGlhc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVnaXN0ZXJlZE1vZGVsQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByZWdpc3RlcmVkIG1vZGVsIHRhZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbFRhZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIG1hcmsgYSBydW4gZm9yIGRlbGV0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdHJhY2VzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUcmFjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRyYWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuZCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9FbmRUcmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRW5kVHJhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgc3RhdHVzIGZvciBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvRmluYWxpemVMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRmluYWxpemVMb2dnZWRNb2RlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIFVSSSB0byBkb3dubG9hZCBtb2RlbCBhcnRpZmFjdHMgZm9yIGEgc3BlY2lmaWMgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFeHBlcmltZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IG1ldGFkYXRhIGZvciBhbiBNTGZsb3cgZXhwZXJpbWVudCBieSBuYW1lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0RXhwZXJpbWVudEJ5TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RXhwZXJpbWVudEJ5TmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgbGF0ZXN0IG1vZGVsIHZlcnNpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGF0ZXN0TW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxvZ2dlZCBtb2RlbCBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMb2dnZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TG9nZ2VkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaXN0IG9mIGFsbCB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0cmljIGZvciBhIGdpdmVuIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1ldHJpY0hpc3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1ldHJpY0hpc3RvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBtb2RlbCB2ZXJzaW9uIGJ5IG1vZGVsIG5hbWUgYW5kIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBtb2RlbCB2ZXJzaW9uIGJ5IGFsaWFzIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1vZGVsVmVyc2lvbkJ5QWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbWV0YWRhdGEsIG1ldHJpY3MsIHBhcmFtZXRlcnMsIGFuZCB0YWdzIGZvciBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b0dldFJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UnVuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdHJhY2UgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvR2V0VHJhY2VJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUcmFjZUluZm8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFydGlmYWN0cyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXJ0aWZhY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhcnRpZmFjdHMgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExvZ2dlZE1vZGVsQXJ0aWZhY3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIGEgYmF0Y2ggb2YgbWV0cmljcywgcGFyYW1ldGVycywgYW5kIHRhZ3MgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0JhdGNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dCYXRjaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBpbnB1dHMgZm9yIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0lucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nSW5wdXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbG9nIHBhcmFtcyBmb3IgYSBsb2dnZWQgbW9kZWwgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dMb2dnZWRNb2RlbFBhcmFtcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIG1ldHJpYyBmb3IgYSBydW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nTWV0cmljKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMb2dNZXRyaWMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsb2cgb3V0cHV0cywgc3VjaCBhcyBtb2RlbHMsIGZvciBhIHJ1biBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvTG9nT3V0cHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nT3V0cHV0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxvZyBhIHBhcmFtZXRlciB0cmFja2VkIGR1cmluZyBhIHJ1blxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9Mb2dQYXJhbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTG9nUGFyYW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW5hbWUgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1JlbmFtZVJlZ2lzdGVyZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVuYW1lUmVnaXN0ZXJlZE1vZGVsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhbiBleHBlcmltZW50IG1hcmtlZCBmb3IgZGVsZXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvUmVzdG9yZUV4cGVyaW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVFeHBlcmltZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdG9yZSBhIGRlbGV0ZWQgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3RvcmVSdW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1Jlc3RvcmVSdW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZWFyY2ggZm9yIE1MZmxvdyBleHBlcmltZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICovXG4gIHB1YmxpYyB0b1NlYXJjaEV4cGVyaW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hFeHBlcmltZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgbG9nZ2VkIG1vZGVscyBpbiBNTGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hMb2dnZWRNb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NlYXJjaExvZ2dlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgYSBtb2RlbCB2ZXJzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoTW9kZWxWZXJzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoTW9kZWxWZXJzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcmVnaXN0ZXJlZCBtb2RlbHMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNlYXJjaCBmb3IgcnVucyB0aGF0IHNhdGlzZnkgZXhwcmVzc2lvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqL1xuICBwdWJsaWMgdG9TZWFyY2hSdW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hSdW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VhcmNoIGZvciB0cmFjZXMgaW4gTUxmbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKi9cbiAgcHVibGljIHRvU2VhcmNoVHJhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZWFyY2hUcmFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSB0YWcgb24gYW4gZXhwZXJpbWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRFeHBlcmltZW50VGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRFeHBlcmltZW50VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IHRhZ3MgZm9yIGEgbG9nZ2VkIG1vZGVsIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRMb2dnZWRNb2RlbFRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1NldExvZ2dlZE1vZGVsVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgdGhlIG1vZGVsIHZlcnNpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvU2V0TW9kZWxWZXJzaW9uVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRNb2RlbFZlcnNpb25UYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgYSByZWdpc3RlcmVkIG1vZGVsIGFsaWFzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbEFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTZXRSZWdpc3RlcmVkTW9kZWxBbGlhcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBhIHRhZyBmb3IgYSByZWdpc3RlcmVkIG1vZGVsXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0UmVnaXN0ZXJlZE1vZGVsVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdGFnIG9uIGEgcnVuXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1NldFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2V0IGEgdHJhY2UgdGFnIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TZXRUcmFjZVRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2V0VHJhY2VUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHRyYWNlIGluIE1MZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFRyYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFRyYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdHJhbnNpdGlvbiBhIG1vZGVsIHZlcnNpb24gdG8gYSBwYXJ0aWN1bGFyIHN0YWdlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1RyYW5zaXRpb25Nb2RlbFZlcnNpb25TdGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBmb3IgYW4gTUxmbG93IGV4cGVyaW1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlRXhwZXJpbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlRXhwZXJpbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbW9kZWwgdmVyc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVNb2RlbFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vZGVsVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHJlZ2lzdGVyZWQgbW9kZWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUmVnaXN0ZXJlZE1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZWdpc3RlcmVkTW9kZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgcnVuIG1ldGFkYXRhXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJ1bigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUnVuJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgUmVhZDogW1xuICAgICAgJ0FjY2Vzc1VJJyxcbiAgICAgICdHZXREb3dubG9hZFVSSUZvck1vZGVsVmVyc2lvbkFydGlmYWN0cycsXG4gICAgICAnR2V0RXhwZXJpbWVudCcsXG4gICAgICAnR2V0RXhwZXJpbWVudEJ5TmFtZScsXG4gICAgICAnR2V0TG9nZ2VkTW9kZWwnLFxuICAgICAgJ0dldE1ldHJpY0hpc3RvcnknLFxuICAgICAgJ0dldE1vZGVsVmVyc2lvbicsXG4gICAgICAnR2V0TW9kZWxWZXJzaW9uQnlBbGlhcycsXG4gICAgICAnR2V0UmVnaXN0ZXJlZE1vZGVsJyxcbiAgICAgICdHZXRSdW4nLFxuICAgICAgJ0dldFRyYWNlSW5mbycsXG4gICAgICAnU2VhcmNoRXhwZXJpbWVudHMnLFxuICAgICAgJ1NlYXJjaExvZ2dlZE1vZGVscycsXG4gICAgICAnU2VhcmNoTW9kZWxWZXJzaW9ucycsXG4gICAgICAnU2VhcmNoUmVnaXN0ZXJlZE1vZGVscycsXG4gICAgICAnU2VhcmNoUnVucycsXG4gICAgICAnU2VhcmNoVHJhY2VzJ1xuICAgIF0sXG4gICAgV3JpdGU6IFtcbiAgICAgICdDcmVhdGVFeHBlcmltZW50JyxcbiAgICAgICdDcmVhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ0NyZWF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnQ3JlYXRlUnVuJyxcbiAgICAgICdEZWxldGVFeHBlcmltZW50JyxcbiAgICAgICdEZWxldGVMb2dnZWRNb2RlbCcsXG4gICAgICAnRGVsZXRlTG9nZ2VkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZU1vZGVsVmVyc2lvbicsXG4gICAgICAnRGVsZXRlTW9kZWxWZXJzaW9uVGFnJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ0RlbGV0ZVJlZ2lzdGVyZWRNb2RlbEFsaWFzJyxcbiAgICAgICdEZWxldGVSZWdpc3RlcmVkTW9kZWxUYWcnLFxuICAgICAgJ0RlbGV0ZVJ1bicsXG4gICAgICAnRGVsZXRlVGFnJyxcbiAgICAgICdEZWxldGVUcmFjZVRhZycsXG4gICAgICAnRGVsZXRlVHJhY2VzJyxcbiAgICAgICdFbmRUcmFjZScsXG4gICAgICAnRmluYWxpemVMb2dnZWRNb2RlbCcsXG4gICAgICAnTG9nQmF0Y2gnLFxuICAgICAgJ0xvZ0lucHV0cycsXG4gICAgICAnTG9nTG9nZ2VkTW9kZWxQYXJhbXMnLFxuICAgICAgJ0xvZ01ldHJpYycsXG4gICAgICAnTG9nTW9kZWwnLFxuICAgICAgJ0xvZ091dHB1dHMnLFxuICAgICAgJ0xvZ1BhcmFtJyxcbiAgICAgICdSZW5hbWVSZWdpc3RlcmVkTW9kZWwnLFxuICAgICAgJ1Jlc3RvcmVFeHBlcmltZW50JyxcbiAgICAgICdSZXN0b3JlUnVuJyxcbiAgICAgICdTZXRFeHBlcmltZW50VGFnJyxcbiAgICAgICdTZXRMb2dnZWRNb2RlbFRhZ3MnLFxuICAgICAgJ1NldE1vZGVsVmVyc2lvblRhZycsXG4gICAgICAnU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMnLFxuICAgICAgJ1NldFJlZ2lzdGVyZWRNb2RlbFRhZycsXG4gICAgICAnU2V0VGFnJyxcbiAgICAgICdTZXRUcmFjZVRhZycsXG4gICAgICAnU3RhcnRUcmFjZScsXG4gICAgICAnVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlJyxcbiAgICAgICdVcGRhdGVFeHBlcmltZW50JyxcbiAgICAgICdVcGRhdGVNb2RlbFZlcnNpb24nLFxuICAgICAgJ1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCcsXG4gICAgICAnVXBkYXRlUnVuJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0dldExhdGVzdE1vZGVsVmVyc2lvbnMnLFxuICAgICAgJ0xpc3RBcnRpZmFjdHMnLFxuICAgICAgJ0xpc3RMb2dnZWRNb2RlbEFydGlmYWN0cydcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG1sZmxvdy10cmFja2luZy1zZXJ2ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2FnZW1ha2VyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01sZmxvd1RyYWNraW5nU2VydmVyLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBtbGZsb3dUcmFja2luZ1NlcnZlck5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uTWxmbG93VHJhY2tpbmdTZXJ2ZXIobWxmbG93VHJhY2tpbmdTZXJ2ZXJOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2FnZW1ha2VyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptbGZsb3ctdHJhY2tpbmctc2VydmVyLyR7IG1sZmxvd1RyYWNraW5nU2VydmVyTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9saXN0X2FtYXpvbnNhZ2VtYWtlci5odG1sI2FtYXpvbnNhZ2VtYWtlci1wb2xpY3kta2V5c1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvQ3JlYXRlTW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9DcmVhdGVSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0NyZWF0ZVJ1bigpXG4gICAqIC0gLnRvRGVsZXRlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvRGVsZXRlTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0RlbGV0ZUxvZ2dlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b0RlbGV0ZU1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9EZWxldGVSZWdpc3RlcmVkTW9kZWxBbGlhcygpXG4gICAqIC0gLnRvRGVsZXRlUmVnaXN0ZXJlZE1vZGVsVGFnKClcbiAgICogLSAudG9EZWxldGVSdW4oKVxuICAgKiAtIC50b0RlbGV0ZVRhZygpXG4gICAqIC0gLnRvRGVsZXRlVHJhY2VUYWcoKVxuICAgKiAtIC50b0RlbGV0ZVRyYWNlcygpXG4gICAqIC0gLnRvRW5kVHJhY2UoKVxuICAgKiAtIC50b0ZpbmFsaXplTG9nZ2VkTW9kZWwoKVxuICAgKiAtIC50b0dldERvd25sb2FkVVJJRm9yTW9kZWxWZXJzaW9uQXJ0aWZhY3RzKClcbiAgICogLSAudG9HZXRFeHBlcmltZW50KClcbiAgICogLSAudG9HZXRFeHBlcmltZW50QnlOYW1lKClcbiAgICogLSAudG9HZXRMYXRlc3RNb2RlbFZlcnNpb25zKClcbiAgICogLSAudG9HZXRMb2dnZWRNb2RlbCgpXG4gICAqIC0gLnRvR2V0TWV0cmljSGlzdG9yeSgpXG4gICAqIC0gLnRvR2V0TW9kZWxWZXJzaW9uKClcbiAgICogLSAudG9HZXRNb2RlbFZlcnNpb25CeUFsaWFzKClcbiAgICogLSAudG9HZXRSZWdpc3RlcmVkTW9kZWwoKVxuICAgKiAtIC50b0dldFJ1bigpXG4gICAqIC0gLnRvR2V0VHJhY2VJbmZvKClcbiAgICogLSAudG9MaXN0QXJ0aWZhY3RzKClcbiAgICogLSAudG9MaXN0TG9nZ2VkTW9kZWxBcnRpZmFjdHMoKVxuICAgKiAtIC50b0xvZ0JhdGNoKClcbiAgICogLSAudG9Mb2dJbnB1dHMoKVxuICAgKiAtIC50b0xvZ0xvZ2dlZE1vZGVsUGFyYW1zKClcbiAgICogLSAudG9Mb2dNZXRyaWMoKVxuICAgKiAtIC50b0xvZ01vZGVsKClcbiAgICogLSAudG9Mb2dPdXRwdXRzKClcbiAgICogLSAudG9Mb2dQYXJhbSgpXG4gICAqIC0gLnRvUmVuYW1lUmVnaXN0ZXJlZE1vZGVsKClcbiAgICogLSAudG9SZXN0b3JlRXhwZXJpbWVudCgpXG4gICAqIC0gLnRvUmVzdG9yZVJ1bigpXG4gICAqIC0gLnRvU2VhcmNoRXhwZXJpbWVudHMoKVxuICAgKiAtIC50b1NlYXJjaExvZ2dlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoTW9kZWxWZXJzaW9ucygpXG4gICAqIC0gLnRvU2VhcmNoUmVnaXN0ZXJlZE1vZGVscygpXG4gICAqIC0gLnRvU2VhcmNoUnVucygpXG4gICAqIC0gLnRvU2VhcmNoVHJhY2VzKClcbiAgICogLSAudG9TZXRFeHBlcmltZW50VGFnKClcbiAgICogLSAudG9TZXRMb2dnZWRNb2RlbFRhZ3MoKVxuICAgKiAtIC50b1NldE1vZGVsVmVyc2lvblRhZygpXG4gICAqIC0gLnRvU2V0UmVnaXN0ZXJlZE1vZGVsQWxpYXMoKVxuICAgKiAtIC50b1NldFJlZ2lzdGVyZWRNb2RlbFRhZygpXG4gICAqIC0gLnRvU2V0VGFnKClcbiAgICogLSAudG9TZXRUcmFjZVRhZygpXG4gICAqIC0gLnRvU3RhcnRUcmFjZSgpXG4gICAqIC0gLnRvVHJhbnNpdGlvbk1vZGVsVmVyc2lvblN0YWdlKClcbiAgICogLSAudG9VcGRhdGVFeHBlcmltZW50KClcbiAgICogLSAudG9VcGRhdGVNb2RlbFZlcnNpb24oKVxuICAgKiAtIC50b1VwZGF0ZVJlZ2lzdGVyZWRNb2RlbCgpXG4gICAqIC0gLnRvVXBkYXRlUnVuKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhd