UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

733 lines 64.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Lakeformation = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [lakeformation](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslakeformation.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Lakeformation extends shared_1.PolicyStatement { /** * Grants permission to attach Lake Formation tags to catalog resources * * Access Level: Tagging * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_AddLFTagsToResource.html */ toAddLFTagsToResource() { return this.to('AddLFTagsToResource'); } /** * Grants permission to data lake permissions to one or more principals in a batch * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_BatchGrantPermissions.html */ toBatchGrantPermissions() { return this.to('BatchGrantPermissions'); } /** * Grants permission to revoke data lake permissions from one or more principals in a batch * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_BatchRevokePermissions.html */ toBatchRevokePermissions() { return this.to('BatchRevokePermissions'); } /** * Grants permission to cancel the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CancelTransaction.html */ toCancelTransaction() { return this.to('CancelTransaction'); } /** * Grants permission to commit the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CommitTransaction.html */ toCommitTransaction() { return this.to('CommitTransaction'); } /** * Grants permission to create a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CreateDataCellsFilter.html */ toCreateDataCellsFilter() { return this.to('CreateDataCellsFilter'); } /** * Grants permission to create a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CreateLFTag.html */ toCreateLFTag() { return this.to('CreateLFTag'); } /** * Grants permission to create a Lake Formation tag expression * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CreateLFTagExpression.html */ toCreateLFTagExpression() { return this.to('CreateLFTagExpression'); } /** * Grants permission to create an IAM Identity Center connection with Lake Formation to allow IAM Identity Center users and groups to access Data Catalog resources * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CreateLakeFormationIdentityCenterConfiguration.html */ toCreateLakeFormationIdentityCenterConfiguration() { return this.to('CreateLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to enforce Lake Formation permissions for the given databases, tables, and principals * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_CreateLakeFormationOptIn.html */ toCreateLakeFormationOptIn() { return this.to('CreateLakeFormationOptIn'); } /** * Grants permission to delete a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteDataCellsFilter.html */ toDeleteDataCellsFilter() { return this.to('DeleteDataCellsFilter'); } /** * Grants permission to delete a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteLFTag.html */ toDeleteLFTag() { return this.to('DeleteLFTag'); } /** * Grants permission to delete a Lake Formation expression * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteLFTagExpression.html */ toDeleteLFTagExpression() { return this.to('DeleteLFTagExpression'); } /** * Grants permission to delete an IAM Identity Center connection with Lake Formation * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteLakeFormationIdentityCenterConfiguration.html */ toDeleteLakeFormationIdentityCenterConfiguration() { return this.to('DeleteLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to remove the Lake Formation permissions enforcement of the given databases, tables, and principals * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteLakeFormationOptIn.html */ toDeleteLakeFormationOptIn() { return this.to('DeleteLakeFormationOptIn'); } /** * Grants permission to delete the specified objects if the transaction is canceled * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeleteObjectsOnCancel.html */ toDeleteObjectsOnCancel() { return this.to('DeleteObjectsOnCancel'); } /** * Grants permission to deregister a registered location * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DeregisterResource.html */ toDeregisterResource() { return this.to('DeregisterResource'); } /** * Grants permission to describe the IAM Identity Center connection with Lake Formation * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DescribeLakeFormationIdentityCenterConfiguration.html */ toDescribeLakeFormationIdentityCenterConfiguration() { return this.to('DescribeLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to describe a registered location * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DescribeResource.html */ toDescribeResource() { return this.to('DescribeResource'); } /** * Grants permission to get status of the given transaction * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_DescribeTransaction.html */ toDescribeTransaction() { return this.to('DescribeTransaction'); } /** * Grants permission to extend the timeout of the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ExtendTransaction.html */ toExtendTransaction() { return this.to('ExtendTransaction'); } /** * Grants permission to virtual data lake access * * Access Level: Write * * Possible conditions: * - .ifEnabledOnlyForMetaDataAccess() * * https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html */ toGetDataAccess() { return this.to('GetDataAccess'); } /** * Grants permission to retrieve a Lake Formation data cell filter * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetDataCellsFilter.html */ toGetDataCellsFilter() { return this.to('GetDataCellsFilter'); } /** * Grants permission to retrieve the identity of the invoking principal * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetDataLakePrincipal.html */ toGetDataLakePrincipal() { return this.to('GetDataLakePrincipal'); } /** * Grants permission to retrieve data lake settings such as the list of data lake administrators and database and table default permissions * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetDataLakeSettings.html */ toGetDataLakeSettings() { return this.to('GetDataLakeSettings'); } /** * Grants permission to retrieve permissions attached to resources in the given path * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetEffectivePermissionsForPath.html */ toGetEffectivePermissionsForPath() { return this.to('GetEffectivePermissionsForPath'); } /** * Grants permission to retrieve a Lake Formation tag * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetLFTag.html */ toGetLFTag() { return this.to('GetLFTag'); } /** * Grants permission to retrieve a Lake Formation tag expression * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetLFTagExpression.html */ toGetLFTagExpression() { return this.to('GetLFTagExpression'); } /** * Grants permission to retrieve the state of the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetQueryState.html */ toGetQueryState() { return this.to('GetQueryState'); } /** * Grants permission to retrieve the statistics for the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetQueryStatistics.html */ toGetQueryStatistics() { return this.to('GetQueryStatistics'); } /** * Grants permission to retrieve lakeformation tags on a catalog resource * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetResourceLFTags.html */ toGetResourceLFTags() { return this.to('GetResourceLFTags'); } /** * Grants permission to retrieve objects from a table * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetTableObjects.html */ toGetTableObjects() { return this.to('GetTableObjects'); } /** * Grants permission to get temporary credentials to access Glue partition data through Lake Formation * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetTemporaryGluePartitionCredentials.html */ toGetTemporaryGluePartitionCredentials() { return this.to('GetTemporaryGluePartitionCredentials'); } /** * Grants permission to get temporary credentials to access Glue table data through Lake Formation * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetTemporaryGlueTableCredentials.html */ toGetTemporaryGlueTableCredentials() { return this.to('GetTemporaryGlueTableCredentials'); } /** * Grants permission to retrieve the results for the given work units * * Access Level: Read * * Dependent actions: * - lakeformation:GetWorkUnits * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetWorkUnitResults.html */ toGetWorkUnitResults() { return this.to('GetWorkUnitResults'); } /** * Grants permission to retrieve the work units for the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GetWorkUnits.html */ toGetWorkUnits() { return this.to('GetWorkUnits'); } /** * Grants permission to data lake permissions to a principal * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_GrantPermissions.html */ toGrantPermissions() { return this.to('GrantPermissions'); } /** * Grants permission to list cell filters * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListDataCellsFilter.html */ toListDataCellsFilter() { return this.to('ListDataCellsFilter'); } /** * Grants permission to list Lake Foramtion tag expressions * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListLFTagExpressions.html */ toListLFTagExpressions() { return this.to('ListLFTagExpressions'); } /** * Grants permission to list Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListLFTags.html */ toListLFTags() { return this.to('ListLFTags'); } /** * Grants permission to retrieve the current list of resources and principals that are opt in to enforce Lake Formation permissions * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListLakeFormationOptIns.html */ toListLakeFormationOptIns() { return this.to('ListLakeFormationOptIns'); } /** * Grants permission to list permissions filtered by principal or resource * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListPermissions.html */ toListPermissions() { return this.to('ListPermissions'); } /** * Grants permission to List registered locations * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListResources.html */ toListResources() { return this.to('ListResources'); } /** * Grants permission to list all the storage optimizers for the Governed table * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListTableStorageOptimizers.html */ toListTableStorageOptimizers() { return this.to('ListTableStorageOptimizers'); } /** * Grants permission to list all transactions in the system * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_ListTransactions.html */ toListTransactions() { return this.to('ListTransactions'); } /** * Grants permission to overwrite data lake settings such as the list of data lake administrators and database and table default permissions * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_PutDataLakeSettings.html */ toPutDataLakeSettings() { return this.to('PutDataLakeSettings'); } /** * Grants permission to register a new location to be managed by Lake Formation * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_RegisterResource.html */ toRegisterResource() { return this.to('RegisterResource'); } /** * Grants permission to register a new location to be managed by Lake Formation, with privileged access * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_RegisterResource.html */ toRegisterResourceWithPrivilegedAccess() { return this.to('RegisterResourceWithPrivilegedAccess'); } /** * Grants permission to remove lakeformation tags from catalog resources * * Access Level: Tagging * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_RemoveLFTagsFromResource.html */ toRemoveLFTagsFromResource() { return this.to('RemoveLFTagsFromResource'); } /** * Grants permission to revoke data lake permissions from a principal * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_RevokePermissions.html */ toRevokePermissions() { return this.to('RevokePermissions'); } /** * Grants permission to list catalog databases with Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_SearchTablesByLFTags.html */ toSearchDatabasesByLFTags() { return this.to('SearchDatabasesByLFTags'); } /** * Grants permission to list catalog tables with Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_SearchTablesByLFTags.html */ toSearchTablesByLFTags() { return this.to('SearchTablesByLFTags'); } /** * Grants permission to initiate the planning of the given query * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_StartQueryPlanning.html */ toStartQueryPlanning() { return this.to('StartQueryPlanning'); } /** * Grants permission to start a new transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_StartTransaction.html */ toStartTransaction() { return this.to('StartTransaction'); } /** * Grants permission to update a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateDataCellsFilter.html */ toUpdateDataCellsFilter() { return this.to('UpdateDataCellsFilter'); } /** * Grants permission to update a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateLFTag.html */ toUpdateLFTag() { return this.to('UpdateLFTag'); } /** * Grants permission to update a Lake Formation expression * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateLFTagExpression.html */ toUpdateLFTagExpression() { return this.to('UpdateLFTagExpression'); } /** * Grants permission to update the IAM Identity Center connection parameters * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateLakeFormationIdentityCenterConfiguration.html */ toUpdateLakeFormationIdentityCenterConfiguration() { return this.to('UpdateLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to update a registered location * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateResource.html */ toUpdateResource() { return this.to('UpdateResource'); } /** * Grants permission to add or delete the specified objects to or from a table * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateTableObjects.html */ toUpdateTableObjects() { return this.to('UpdateTableObjects'); } /** * Grants permission to update the configuration of the storage optimizer for the Governed table * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/APIReference/API_UpdateTableStorageOptimizer.html */ toUpdateTableStorageOptimizer() { return this.to('UpdateTableStorageOptimizer'); } /** * Filters access by the presence of the key configured for role's identity-based policy * * https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslakeformation.html#awslakeformation-policy-keys * * Applies to actions: * - .toGetDataAccess() * * @param value `true` or `false`. **Default:** `true` */ ifEnabledOnlyForMetaDataAccess(value) { return this.if(`EnabledOnlyForMetaDataAccess`, (typeof value !== 'undefined' ? value : true), 'Bool'); } /** * Statement provider for service [lakeformation](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslakeformation.html). * */ constructor(props) { super(props); this.servicePrefix = 'lakeformation'; this.accessLevelList = { Tagging: [ 'AddLFTagsToResource', 'RemoveLFTagsFromResource' ], 'Permissions management': [ 'BatchGrantPermissions', 'BatchRevokePermissions', 'GrantPermissions', 'PutDataLakeSettings', 'RevokePermissions' ], Write: [ 'CancelTransaction', 'CommitTransaction', 'CreateDataCellsFilter', 'CreateLFTag', 'CreateLFTagExpression', 'CreateLakeFormationIdentityCenterConfiguration', 'CreateLakeFormationOptIn', 'DeleteDataCellsFilter', 'DeleteLFTag', 'DeleteLFTagExpression', 'DeleteLakeFormationIdentityCenterConfiguration', 'DeleteLakeFormationOptIn', 'DeleteObjectsOnCancel', 'DeregisterResource', 'ExtendTransaction', 'GetDataAccess', 'RegisterResource', 'RegisterResourceWithPrivilegedAccess', 'StartQueryPlanning', 'StartTransaction', 'UpdateDataCellsFilter', 'UpdateLFTag', 'UpdateLFTagExpression', 'UpdateLakeFormationIdentityCenterConfiguration', 'UpdateResource', 'UpdateTableObjects', 'UpdateTableStorageOptimizer' ], Read: [ 'DescribeLakeFormationIdentityCenterConfiguration', 'DescribeResource', 'DescribeTransaction', 'GetDataCellsFilter', 'GetDataLakePrincipal', 'GetDataLakeSettings', 'GetEffectivePermissionsForPath', 'GetLFTag', 'GetLFTagExpression', 'GetQueryState', 'GetQueryStatistics', 'GetResourceLFTags', 'GetTableObjects', 'GetTemporaryGluePartitionCredentials', 'GetTemporaryGlueTableCredentials', 'GetWorkUnitResults', 'GetWorkUnits', 'ListLFTagExpressions', 'ListLFTags', 'SearchDatabasesByLFTags', 'SearchTablesByLFTags' ], List: [ 'ListDataCellsFilter', 'ListLakeFormationOptIns', 'ListPermissions', 'ListResources', 'ListTableStorageOptimizers', 'ListTransactions' ] }; } } exports.Lakeformation = Lakeformation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWZvcm1hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxha2Vmb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQStDO0FBRy9DOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWMsU0FBUSx3QkFBZTtJQUdoRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnREFBZ0Q7UUFDckQsT0FBTyxJQUFJLENBQUMsRUFB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LHFCQUFxQjtnQkFDckIsZ0NBQWdDO2dCQUNoQyxVQUFVO2dCQUNWLG9CQUFvQjtnQkFDcEIsZUFBZTtnQkFDZixvQkFBb0I7Z0JBQ3BCLG1CQUFtQjtnQkFDbkIsaUJBQWlCO2dCQUNqQixzQ0FBc0M7Z0JBQ3RDLGtDQUFrQztnQkFDbEMsb0JBQW9CO2dCQUNwQixjQUFjO2dCQUNkLHNCQUFzQjtnQkFDdEIsWUFBWTtnQkFDWix5QkFBeUI7Z0JBQ3pCLHNCQUFzQjthQUN2QjtZQUNELElBQUksRUFBRTtnQkFDSixxQkFBcUI7Z0JBQ3JCLHlCQUF5QjtnQkFDekIsaUJBQWlCO2dCQUNqQixlQUFlO2dCQUNmLDRCQUE0QjtnQkFDNUIsa0JBQWtCO2FBQ25CO1NBQ0YsQ0FBQztJQXNCRixDQUFDO0NBQ0Y7QUFqeEJELHNDQWl4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbbGFrZWZvcm1hdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYXdzbGFrZWZvcm1hdGlvbi5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIExha2Vmb3JtYXRpb24gZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdsYWtlZm9ybWF0aW9uJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXR0YWNoIExha2UgRm9ybWF0aW9uIHRhZ3MgdG8gY2F0YWxvZyByZXNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BZGRMRlRhZ3NUb1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0FkZExGVGFnc1RvUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FkZExGVGFnc1RvUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkYXRhIGxha2UgcGVybWlzc2lvbnMgdG8gb25lIG9yIG1vcmUgcHJpbmNpcGFscyBpbiBhIGJhdGNoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQmF0Y2hHcmFudFBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR3JhbnRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHcmFudFBlcm1pc3Npb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV2b2tlIGRhdGEgbGFrZSBwZXJtaXNzaW9ucyBmcm9tIG9uZSBvciBtb3JlIHByaW5jaXBhbHMgaW4gYSBiYXRjaFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFBlcm1pc3Npb25zIG1hbmFnZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0JhdGNoUmV2b2tlUGVybWlzc2lvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hSZXZva2VQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hSZXZva2VQZXJtaXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2FuY2VsVHJhbnNhY3Rpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsVHJhbnNhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY29tbWl0IHRoZSBnaXZlbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Db21taXRUcmFuc2FjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Db21taXRUcmFuc2FjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ29tbWl0VHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBMYWtlIEZvcm1hdGlvbiBkYXRhIGNlbGwgZmlsdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZURhdGFDZWxsc0ZpbHRlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEYXRhQ2VsbHNGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURhdGFDZWxsc0ZpbHRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIExha2UgRm9ybWF0aW9uIHRhZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMRlRhZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMRlRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTEZUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBMYWtlIEZvcm1hdGlvbiB0YWcgZXhwcmVzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVMRlRhZ0V4cHJlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTEZUYWdFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMRlRhZ0V4cHJlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gSUFNIElkZW50aXR5IENlbnRlciBjb25uZWN0aW9uIHdpdGggTGFrZSBGb3JtYXRpb24gdG8gYWxsb3cgSUFNIElkZW50aXR5IENlbnRlciB1c2VycyBhbmQgZ3JvdXBzIHRvIGFjY2VzcyBEYXRhIENhdGFsb2cgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxha2VGb3JtYXRpb25JZGVudGl0eUNlbnRlckNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuZm9yY2UgTGFrZSBGb3JtYXRpb24gcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiBkYXRhYmFzZXMsIHRhYmxlcywgYW5kIHByaW5jaXBhbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTGFrZUZvcm1hdGlvbk9wdEluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxha2VGb3JtYXRpb25PcHRJbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGFrZUZvcm1hdGlvbk9wdEluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgTGFrZSBGb3JtYXRpb24gZGF0YSBjZWxsIGZpbHRlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVEYXRhQ2VsbHNGaWx0ZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGF0YUNlbGxzRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVEYXRhQ2VsbHNGaWx0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBMYWtlIEZvcm1hdGlvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTEZUYWcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTEZUYWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxGVGFnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgTGFrZSBGb3JtYXRpb24gZXhwcmVzc2lvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVMRlRhZ0V4cHJlc3Npb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTEZUYWdFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMRlRhZ0V4cHJlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gSUFNIElkZW50aXR5IENlbnRlciBjb25uZWN0aW9uIHdpdGggTGFrZSBGb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYWtlRm9ybWF0aW9uSWRlbnRpdHlDZW50ZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMYWtlRm9ybWF0aW9uSWRlbnRpdHlDZW50ZXJDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIHRoZSBMYWtlIEZvcm1hdGlvbiBwZXJtaXNzaW9ucyBlbmZvcmNlbWVudCBvZiB0aGUgZ2l2ZW4gZGF0YWJhc2VzLCB0YWJsZXMsIGFuZCBwcmluY2lwYWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUxha2VGb3JtYXRpb25PcHRJbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMYWtlRm9ybWF0aW9uT3B0SW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxha2VGb3JtYXRpb25PcHRJbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGNhbmNlbGVkXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZU9iamVjdHNPbkNhbmNlbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVPYmplY3RzT25DYW5jZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZU9iamVjdHNPbkNhbmNlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcmVnaXN0ZXIgYSByZWdpc3RlcmVkIGxvY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlcmVnaXN0ZXJSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXJlZ2lzdGVyUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlcmVnaXN0ZXJSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHRoZSBJQU0gSWRlbnRpdHkgQ2VudGVyIGNvbm5lY3Rpb24gd2l0aCBMYWtlIEZvcm1hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxha2VGb3JtYXRpb25JZGVudGl0eUNlbnRlckNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgcmVnaXN0ZXJlZCBsb2NhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBzdGF0dXMgb2YgdGhlIGdpdmVuIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVUcmFuc2FjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZXh0ZW5kIHRoZSB0aW1lb3V0IG9mIHRoZSBnaXZlbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9FeHRlbmRUcmFuc2FjdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRXh0ZW5kVHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2aXJ0dWFsIGRhdGEgbGFrZSBhY2Nlc3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkVuYWJsZWRPbmx5Rm9yTWV0YURhdGFBY2Nlc3MoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2FjY2Vzcy1jb250cm9sLXVuZGVybHlpbmctZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBMYWtlIEZvcm1hdGlvbiBkYXRhIGNlbGwgZmlsdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RGF0YUNlbGxzRmlsdGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldERhdGFDZWxsc0ZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGF0YUNlbGxzRmlsdGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIGlkZW50aXR5IG9mIHRoZSBpbnZva2luZyBwcmluY2lwYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXREYXRhTGFrZVByaW5jaXBhbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhTGFrZVByaW5jaXBhbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RGF0YUxha2VQcmluY2lwYWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkYXRhIGxha2Ugc2V0dGluZ3Mgc3VjaCBhcyB0aGUgbGlzdCBvZiBkYXRhIGxha2UgYWRtaW5pc3RyYXRvcnMgYW5kIGRhdGFiYXNlIGFuZCB0YWJsZSBkZWZhdWx0IHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RGF0YUxha2VTZXR0aW5ncy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhTGFrZVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhTGFrZVNldHRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgcGVybWlzc2lvbnMgYXR0YWNoZWQgdG8gcmVzb3VyY2VzIGluIHRoZSBnaXZlbiBwYXRoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JQYXRoLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JQYXRoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBMYWtlIEZvcm1hdGlvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRMRlRhZy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMRlRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TEZUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIExha2UgRm9ybWF0aW9uIHRhZyBleHByZXNzaW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TEZUYWdFeHByZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExGVGFnRXhwcmVzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TEZUYWdFeHByZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBxdWVyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gbGFrZWZvcm1hdGlvbjpTdGFydFF1ZXJ5UGxhbm5pbmdcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXJ5U3RhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlTdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgZ2l2ZW4gcXVlcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGxha2Vmb3JtYXRpb246U3RhcnRRdWVyeVBsYW5uaW5nXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRRdWVyeVN0YXRpc3RpY3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0aXN0aWNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRdWVyeVN0YXRpc3RpY3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBsYWtlZm9ybWF0aW9uIHRhZ3Mgb24gYSBjYXRhbG9nIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UmVzb3VyY2VMRlRhZ3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVzb3VyY2VMRlRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJlc291cmNlTEZUYWdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgb2JqZWN0cyBmcm9tIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUYWJsZU9iamVjdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVPYmplY3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZU9iamVjdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGVtcG9yYXJ5IGNyZWRlbnRpYWxzIHRvIGFjY2VzcyBHbHVlIHBhcnRpdGlvbiBkYXRhIHRocm91Z2ggTGFrZSBGb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRUZW1wb3JhcnlHbHVlUGFydGl0aW9uQ3JlZGVudGlhbHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGVtcG9yYXJ5R2x1ZVBhcnRpdGlvbkNyZWRlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUZW1wb3JhcnlHbHVlUGFydGl0aW9uQ3JlZGVudGlhbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGVtcG9yYXJ5IGNyZWRlbnRpYWxzIHRvIGFjY2VzcyBHbHVlIHRhYmxlIGRhdGEgdGhyb3VnaCBMYWtlIEZvcm1hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFRlbXBvcmFyeUdsdWVUYWJsZUNyZWRlbnRpYWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRlbXBvcmFyeUdsdWVUYWJsZUNyZWRlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUZW1wb3JhcnlHbHVlVGFibGVDcmVkZW50aWFscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gd29yayB1bml0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gbGFrZWZvcm1hdGlvbjpHZXRXb3JrVW5pdHNcbiAgICogLSBsYWtlZm9ybWF0aW9uOlN0YXJ0UXVlcnlQbGFubmluZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0V29ya1VuaXRSZXN1bHRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFdvcmtVbml0UmVzdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V29ya1VuaXRSZXN1bHRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIHdvcmsgdW5pdHMgZm9yIHRoZSBnaXZlbiBxdWVyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gbGFrZWZvcm1hdGlvbjpTdGFydFF1ZXJ5UGxhbm5pbmdcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFdvcmtVbml0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXb3JrVW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdvcmtVbml0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRv