UNPKG

iam-floyd

Version:

AWS IAM policy statement generator with fluent interface

440 lines 38.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NeptuneDb = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [neptune-db](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonneptune.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class NeptuneDb extends shared_1.PolicyStatement { /** * Statement provider for service [neptune-db](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonneptune.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ constructor(sid) { super(sid); this.servicePrefix = 'neptune-db'; this.accessLevelList = { Write: [ 'CancelLoaderJob', 'CancelMLDataProcessingJob', 'CancelMLModelTrainingJob', 'CancelMLModelTransformJob', 'CancelQuery', 'CreateMLEndpoint', 'DeleteDataViaQuery', 'DeleteMLEndpoint', 'DeleteStatistics', 'ManageStatistics', 'ResetDatabase', 'StartLoaderJob', 'StartMLDataProcessingJob', 'StartMLModelTrainingJob', 'StartMLModelTransformJob', 'WriteDataViaQuery', 'connect' ], Read: [ 'GetEngineStatus', 'GetGraphSummary', 'GetLoaderJobStatus', 'GetMLDataProcessingJobStatus', 'GetMLEndpointStatus', 'GetMLModelTrainingJobStatus', 'GetMLModelTransformJobStatus', 'GetQueryStatus', 'GetStatisticsStatus', 'GetStreamRecords', 'ReadDataViaQuery' ], List: [ 'ListLoaderJobs', 'ListMLDataProcessingJobs', 'ListMLEndpoints', 'ListMLModelTrainingJobs', 'ListMLModelTransformJobs' ] }; } /** * Grants permission to cancel a loader job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#cancelloaderjob */ toCancelLoaderJob() { return this.to('CancelLoaderJob'); } /** * Grants permission to cancel an ML data processing job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#cancelmldataprocessingjob */ toCancelMLDataProcessingJob() { return this.to('CancelMLDataProcessingJob'); } /** * Grants permission to cancel an ML model training job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#cancelmlmodeltrainingjob */ toCancelMLModelTrainingJob() { return this.to('CancelMLModelTrainingJob'); } /** * Grants permission to cancel an ML model transform job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#cancelmlmodeltransformjob */ toCancelMLModelTransformJob() { return this.to('CancelMLModelTransformJob'); } /** * Grants permission to cancel a query * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#cancelquery */ toCancelQuery() { return this.to('CancelQuery'); } /** * Grants permission to create an ML endpoint * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#createmlendpoint */ toCreateMLEndpoint() { return this.to('CreateMLEndpoint'); } /** * Grants permission to run delete data via query APIs on database * * Access Level: Write * * Possible conditions: * - .ifQueryLanguage() * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#deletedataviaquery */ toDeleteDataViaQuery() { return this.to('DeleteDataViaQuery'); } /** * Grants permission to delete an ML endpoint * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#deletemlendpoint */ toDeleteMLEndpoint() { return this.to('DeleteMLEndpoint'); } /** * Grants permission to delete all the statistics in the database * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#deletestatistics */ toDeleteStatistics() { return this.to('DeleteStatistics'); } /** * Grants permission to check the status of the Neptune engine * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getenginestatus */ toGetEngineStatus() { return this.to('GetEngineStatus'); } /** * Grants permission to get the graph summary from the database * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getgraphsummary */ toGetGraphSummary() { return this.to('GetGraphSummary'); } /** * Grants permission to check the status of a loader job * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getloaderjobstatus */ toGetLoaderJobStatus() { return this.to('GetLoaderJobStatus'); } /** * Grants permission to check the status of an ML data processing job * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getmldataprocessingjobstatus */ toGetMLDataProcessingJobStatus() { return this.to('GetMLDataProcessingJobStatus'); } /** * Grants permission to check the status of an ML endpoint * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getmlendpointstatus */ toGetMLEndpointStatus() { return this.to('GetMLEndpointStatus'); } /** * Grants permission to check the status of an ML model training job * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getmlmodeltrainingjobstatus */ toGetMLModelTrainingJobStatus() { return this.to('GetMLModelTrainingJobStatus'); } /** * Grants permission to check the status of an ML model transform job * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getmlmodeltransformjobstatus */ toGetMLModelTransformJobStatus() { return this.to('GetMLModelTransformJobStatus'); } /** * Grants permission to check the status of all active queries * * Access Level: Read * * Possible conditions: * - .ifQueryLanguage() * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getquerystatus */ toGetQueryStatus() { return this.to('GetQueryStatus'); } /** * Grants permission to check the status of statistics of the database * * Access Level: Read * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getstatisticsstatus */ toGetStatisticsStatus() { return this.to('GetStatisticsStatus'); } /** * Grants permission to fetch stream records from Neptune * * Access Level: Read * * Possible conditions: * - .ifQueryLanguage() * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#getstreamrecords */ toGetStreamRecords() { return this.to('GetStreamRecords'); } /** * Grants permission to list all the loader jobs * * Access Level: List * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#listloaderjobs */ toListLoaderJobs() { return this.to('ListLoaderJobs'); } /** * Grants permission to list all the ML data processing jobs * * Access Level: List * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#listmldataprocessingjobs */ toListMLDataProcessingJobs() { return this.to('ListMLDataProcessingJobs'); } /** * Grants permission to list all the ML endpoints * * Access Level: List * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#listmlendpoints */ toListMLEndpoints() { return this.to('ListMLEndpoints'); } /** * Grants permission to list all the ML model training jobs * * Access Level: List * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#listmlmodeltrainingjobs */ toListMLModelTrainingJobs() { return this.to('ListMLModelTrainingJobs'); } /** * Grants permission to list all the ML model transform jobs * * Access Level: List * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#listmlmodeltransformjobs */ toListMLModelTransformJobs() { return this.to('ListMLModelTransformJobs'); } /** * Grants permission to manage statistics in the database * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#managestatistics */ toManageStatistics() { return this.to('ManageStatistics'); } /** * Grants permission to run read data via query APIs on database * * Access Level: Read * * Possible conditions: * - .ifQueryLanguage() * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#readdataviaquery */ toReadDataViaQuery() { return this.to('ReadDataViaQuery'); } /** * Grants permission to get the token needed for reset and resets the Neptune database * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#resetdatabase */ toResetDatabase() { return this.to('ResetDatabase'); } /** * Grants permission to start a loader job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#startloaderjob */ toStartLoaderJob() { return this.to('StartLoaderJob'); } /** * Grants permission to start an ML data processing job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#startmldataprocessingjob */ toStartMLDataProcessingJob() { return this.to('StartMLDataProcessingJob'); } /** * Grants permission to start an ML model training job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#startmlmodeltrainingjob */ toStartMLModelTrainingJob() { return this.to('StartMLModelTrainingJob'); } /** * Grants permission to start an ML model transform job * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#startmlmodeltransformjob */ toStartMLModelTransformJob() { return this.to('StartMLModelTransformJob'); } /** * Grants permission to run write data via query APIs on database * * Access Level: Write * * Possible conditions: * - .ifQueryLanguage() * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html#writedataviaquery */ toWriteDataViaQuery() { return this.to('WriteDataViaQuery'); } /** * Grants permission to all data-access actions in engine versions prior to 1.2.0.0 * * Access Level: Write * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-dp-actions.html */ toConnect() { return this.to('connect'); } /** * Adds a resource of type database to the statement * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-data-resources.html * * @param cluster - Identifier for the cluster. * @param database - Identifier for the database. * @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. */ onDatabase(cluster, database, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:neptune-db:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:${cluster}/${database}`); } /** * Filters access by graph model * * https://docs.aws.amazon.com/neptune/latest/userguide/iam-data-condition-keys.html#iam-neptune-condition-keys * * Applies to actions: * - .toDeleteDataViaQuery() * - .toGetQueryStatus() * - .toGetStreamRecords() * - .toReadDataViaQuery() * - .toWriteDataViaQuery() * * @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` */ ifQueryLanguage(value, operator) { return this.if(`QueryLanguage`, value, operator ?? 'StringLike'); } } exports.NeptuneDb = NeptuneDb; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVwdHVuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lcHR1bmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBRXpEOzs7O0dBSUc7QUFDSCxNQUFhLFNBQVUsU0FBUSx3QkFBZTtJQUc1Qzs7OztPQUlHO0lBQ0gsWUFBWSxHQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQVJOLGtCQUFhLEdBQUcsWUFBWSxDQUFDO1FBcVkxQixvQkFBZSxHQUFvQjtZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsaUJBQWlCO2dCQUNqQiwyQkFBMkI7Z0JBQzNCLDBCQUEwQjtnQkFDMUIsMkJBQTJCO2dCQUMzQixhQUFhO2dCQUNiLGtCQUFrQjtnQkFDbEIsb0JBQW9CO2dCQUNwQixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsa0JBQWtCO2dCQUNsQixlQUFlO2dCQUNmLGdCQUFnQjtnQkFDaEIsMEJBQTBCO2dCQUMxQix5QkFBeUI7Z0JBQ3pCLDBCQUEwQjtnQkFDMUIsbUJBQW1CO2dCQUNuQixTQUFTO2FBQ1Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osaUJBQWlCO2dCQUNqQixpQkFBaUI7Z0JBQ2pCLG9CQUFvQjtnQkFDcEIsOEJBQThCO2dCQUM5QixxQkFBcUI7Z0JBQ3JCLDZCQUE2QjtnQkFDN0IsOEJBQThCO2dCQUM5QixnQkFBZ0I7Z0JBQ2hCLHFCQUFxQjtnQkFDckIsa0JBQWtCO2dCQUNsQixrQkFBa0I7YUFDbkI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osZ0JBQWdCO2dCQUNoQiwwQkFBMEI7Z0JBQzFCLGlCQUFpQjtnQkFDakIseUJBQXlCO2dCQUN6QiwwQkFBMEI7YUFDM0I7U0FDRixDQUFDO0lBcGFGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJC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LENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQTRDRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksVUFBVSxDQUFDLE9BQWUsRUFBRSxRQUFnQixFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ3hHLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLGVBQWdCLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxJQUFLLE9BQVEsSUFBSyxRQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzVLLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLGVBQWUsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQzNFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUFqZEQsOEJBaWRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW25lcHR1bmUtZGJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2FtYXpvbm5lcHR1bmUuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXB0dW5lRGIgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICduZXB0dW5lLWRiJztcblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtuZXB0dW5lLWRiXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hbWF6b25uZXB0dW5lLmh0bWwpLlxuICAgKlxuICAgKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZD86IHN0cmluZykge1xuICAgIHN1cGVyKHNpZCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGEgbG9hZGVyIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNjYW5jZWxsb2FkZXJqb2JcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbExvYWRlckpvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsTG9hZGVySm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGFuIE1MIGRhdGEgcHJvY2Vzc2luZyBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjY2FuY2VsbWxkYXRhcHJvY2Vzc2luZ2pvYlxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsTUxEYXRhUHJvY2Vzc2luZ0pvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ2FuY2VsTUxEYXRhUHJvY2Vzc2luZ0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBNTCBtb2RlbCB0cmFpbmluZyBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjY2FuY2VsbWxtb2RlbHRyYWluaW5nam9iXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxNTE1vZGVsVHJhaW5pbmdKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbE1MTW9kZWxUcmFpbmluZ0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhbiBNTCBtb2RlbCB0cmFuc2Zvcm0gam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2NhbmNlbG1sbW9kZWx0cmFuc2Zvcm1qb2JcbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbE1MTW9kZWxUcmFuc2Zvcm1Kb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbE1MTW9kZWxUcmFuc2Zvcm1Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgYSBxdWVyeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNjYW5jZWxxdWVyeVxuICAgKi9cbiAgcHVibGljIHRvQ2FuY2VsUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbFF1ZXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIE1MIGVuZHBvaW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2NyZWF0ZW1sZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU1MRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU1MRW5kcG9pbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBydW4gZGVsZXRlIGRhdGEgdmlhIHF1ZXJ5IEFQSXMgb24gZGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlF1ZXJ5TGFuZ3VhZ2UoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjZGVsZXRlZGF0YXZpYXF1ZXJ5XG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVEYXRhVmlhUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZURhdGFWaWFRdWVyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBNTCBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNkZWxldGVtbGVuZHBvaW50XG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVNTEVuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVNTEVuZHBvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFsbCB0aGUgc3RhdGlzdGljcyBpbiB0aGUgZGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjZGVsZXRlc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU3RhdGlzdGljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIE5lcHR1bmUgZW5naW5lXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjZ2V0ZW5naW5lc3RhdHVzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFbmdpbmVTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEVuZ2luZVN0YXR1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgZ3JhcGggc3VtbWFyeSBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2dldGdyYXBoc3VtbWFyeVxuICAgKi9cbiAgcHVibGljIHRvR2V0R3JhcGhTdW1tYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRHcmFwaFN1bW1hcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgbG9hZGVyIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2dldGxvYWRlcmpvYnN0YXR1c1xuICAgKi9cbiAgcHVibGljIHRvR2V0TG9hZGVySm9iU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMb2FkZXJKb2JTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGFuIE1MIGRhdGEgcHJvY2Vzc2luZyBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNnZXRtbGRhdGFwcm9jZXNzaW5nam9ic3RhdHVzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNTERhdGFQcm9jZXNzaW5nSm9iU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRNTERhdGFQcm9jZXNzaW5nSm9iU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhbiBNTCBlbmRwb2ludFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2dldG1sZW5kcG9pbnRzdGF0dXNcbiAgICovXG4gIHB1YmxpYyB0b0dldE1MRW5kcG9pbnRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE1MRW5kcG9pbnRTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGFuIE1MIG1vZGVsIHRyYWluaW5nIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2dldG1sbW9kZWx0cmFpbmluZ2pvYnN0YXR1c1xuICAgKi9cbiAgcHVibGljIHRvR2V0TUxNb2RlbFRyYWluaW5nSm9iU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRNTE1vZGVsVHJhaW5pbmdKb2JTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGFuIE1MIG1vZGVsIHRyYW5zZm9ybSBqb2JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNnZXRtbG1vZGVsdHJhbnNmb3Jtam9ic3RhdHVzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNTE1vZGVsVHJhbnNmb3JtSm9iU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRNTE1vZGVsVHJhbnNmb3JtSm9iU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhbGwgYWN0aXZlIHF1ZXJpZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUXVlcnlMYW5ndWFnZSgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNnZXRxdWVyeXN0YXR1c1xuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXJ5U3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBzdGF0aXN0aWNzIG9mIHRoZSBkYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2dldHN0YXRpc3RpY3NzdGF0dXNcbiAgICovXG4gIHB1YmxpYyB0b0dldFN0YXRpc3RpY3NTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFN0YXRpc3RpY3NTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBmZXRjaCBzdHJlYW0gcmVjb3JkcyBmcm9tIE5lcHR1bmVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUXVlcnlMYW5ndWFnZSgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNnZXRzdHJlYW1yZWNvcmRzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRTdHJlYW1SZWNvcmRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTdHJlYW1SZWNvcmRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbGwgdGhlIGxvYWRlciBqb2JzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjbGlzdGxvYWRlcmpvYnNcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMb2FkZXJKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TG9hZGVySm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRoZSBNTCBkYXRhIHByb2Nlc3Npbmcgam9ic1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2xpc3RtbGRhdGFwcm9jZXNzaW5nam9ic1xuICAgKi9cbiAgcHVibGljIHRvTGlzdE1MRGF0YVByb2Nlc3NpbmdKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TUxEYXRhUHJvY2Vzc2luZ0pvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCB0aGUgTUwgZW5kcG9pbnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjbGlzdG1sZW5kcG9pbnRzXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TUxFbmRwb2ludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNTEVuZHBvaW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRoZSBNTCBtb2RlbCB0cmFpbmluZyBqb2JzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjbGlzdG1sbW9kZWx0cmFpbmluZ2pvYnNcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RNTE1vZGVsVHJhaW5pbmdKb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TUxNb2RlbFRyYWluaW5nSm9icycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHRoZSBNTCBtb2RlbCB0cmFuc2Zvcm0gam9ic1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI2xpc3RtbG1vZGVsdHJhbnNmb3Jtam9ic1xuICAgKi9cbiAgcHVibGljIHRvTGlzdE1MTW9kZWxUcmFuc2Zvcm1Kb2JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TUxNb2RlbFRyYW5zZm9ybUpvYnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtYW5hZ2Ugc3RhdGlzdGljcyBpbiB0aGUgZGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjbWFuYWdlc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIHRvTWFuYWdlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTWFuYWdlU3RhdGlzdGljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJ1biByZWFkIGRhdGEgdmlhIHF1ZXJ5IEFQSXMgb24gZGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUXVlcnlMYW5ndWFnZSgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNyZWFkZGF0YXZpYXF1ZXJ5XG4gICAqL1xuICBwdWJsaWMgdG9SZWFkRGF0YVZpYVF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWFkRGF0YVZpYVF1ZXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSB0b2tlbiBuZWVkZWQgZm9yIHJlc2V0IGFuZCByZXNldHMgdGhlIE5lcHR1bmUgZGF0YWJhc2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWwjcmVzZXRkYXRhYmFzZVxuICAgKi9cbiAgcHVibGljIHRvUmVzZXREYXRhYmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVzZXREYXRhYmFzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgbG9hZGVyIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNzdGFydGxvYWRlcmpvYlxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRMb2FkZXJKb2IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0TG9hZGVySm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYW4gTUwgZGF0YSBwcm9jZXNzaW5nIGpvYlxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCNzdGFydG1sZGF0YXByb2Nlc3Npbmdqb2JcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0TUxEYXRhUHJvY2Vzc2luZ0pvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRNTERhdGFQcm9jZXNzaW5nSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYW4gTUwgbW9kZWwgdHJhaW5pbmcgam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI3N0YXJ0bWxtb2RlbHRyYWluaW5nam9iXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydE1MTW9kZWxUcmFpbmluZ0pvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRNTE1vZGVsVHJhaW5pbmdKb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhbiBNTCBtb2RlbCB0cmFuc2Zvcm0gam9iXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZHAtYWN0aW9ucy5odG1sI3N0YXJ0bWxtb2RlbHRyYW5zZm9ybWpvYlxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRNTE1vZGVsVHJhbnNmb3JtSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydE1MTW9kZWxUcmFuc2Zvcm1Kb2InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBydW4gd3JpdGUgZGF0YSB2aWEgcXVlcnkgQVBJcyBvbiBkYXRhYmFzZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmUXVlcnlMYW5ndWFnZSgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXB0dW5lL2xhdGVzdC91c2VyZ3VpZGUvaWFtLWRwLWFjdGlvbnMuaHRtbCN3cml0ZWRhdGF2aWFxdWVyeVxuICAgKi9cbiAgcHVibGljIHRvV3JpdGVEYXRhVmlhUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1dyaXRlRGF0YVZpYVF1ZXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYWxsIGRhdGEtYWNjZXNzIGFjdGlvbnMgaW4gZW5naW5lIHZlcnNpb25zIHByaW9yIHRvIDEuMi4wLjBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmVwdHVuZS9sYXRlc3QvdXNlcmd1aWRlL2lhbS1kcC1hY3Rpb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Nvbm5lY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0NhbmNlbExvYWRlckpvYicsXG4gICAgICAnQ2FuY2VsTUxEYXRhUHJvY2Vzc2luZ0pvYicsXG4gICAgICAnQ2FuY2VsTUxNb2RlbFRyYWluaW5nSm9iJyxcbiAgICAgICdDYW5jZWxNTE1vZGVsVHJhbnNmb3JtSm9iJyxcbiAgICAgICdDYW5jZWxRdWVyeScsXG4gICAgICAnQ3JlYXRlTUxFbmRwb2ludCcsXG4gICAgICAnRGVsZXRlRGF0YVZpYVF1ZXJ5JyxcbiAgICAgICdEZWxldGVNTEVuZHBvaW50JyxcbiAgICAgICdEZWxldGVTdGF0aXN0aWNzJyxcbiAgICAgICdNYW5hZ2VTdGF0aXN0aWNzJyxcbiAgICAgICdSZXNldERhdGFiYXNlJyxcbiAgICAgICdTdGFydExvYWRlckpvYicsXG4gICAgICAnU3RhcnRNTERhdGFQcm9jZXNzaW5nSm9iJyxcbiAgICAgICdTdGFydE1MTW9kZWxUcmFpbmluZ0pvYicsXG4gICAgICAnU3RhcnRNTE1vZGVsVHJhbnNmb3JtSm9iJyxcbiAgICAgICdXcml0ZURhdGFWaWFRdWVyeScsXG4gICAgICAnY29ubmVjdCdcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdHZXRFbmdpbmVTdGF0dXMnLFxuICAgICAgJ0dldEdyYXBoU3VtbWFyeScsXG4gICAgICAnR2V0TG9hZGVySm9iU3RhdHVzJyxcbiAgICAgICdHZXRNTERhdGFQcm9jZXNzaW5nSm9iU3RhdHVzJyxcbiAgICAgICdHZXRNTEVuZHBvaW50U3RhdHVzJyxcbiAgICAgICdHZXRNTE1vZGVsVHJhaW5pbmdKb2JTdGF0dXMnLFxuICAgICAgJ0dldE1MTW9kZWxUcmFuc2Zvcm1Kb2JTdGF0dXMnLFxuICAgICAgJ0dldFF1ZXJ5U3RhdHVzJyxcbiAgICAgICdHZXRTdGF0aXN0aWNzU3RhdHVzJyxcbiAgICAgICdHZXRTdHJlYW1SZWNvcmRzJyxcbiAgICAgICdSZWFkRGF0YVZpYVF1ZXJ5J1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RMb2FkZXJKb2JzJyxcbiAgICAgICdMaXN0TUxEYXRhUHJvY2Vzc2luZ0pvYnMnLFxuICAgICAgJ0xpc3RNTEVuZHBvaW50cycsXG4gICAgICAnTGlzdE1MTW9kZWxUcmFpbmluZ0pvYnMnLFxuICAgICAgJ0xpc3RNTE1vZGVsVHJhbnNmb3JtSm9icydcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGRhdGFiYXNlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZGF0YS1yZXNvdXJjZXMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2x1c3RlciAtIElkZW50aWZpZXIgZm9yIHRoZSBjbHVzdGVyLlxuICAgKiBAcGFyYW0gZGF0YWJhc2UgLSBJZGVudGlmaWVyIGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uRGF0YWJhc2UoY2x1c3Rlcjogc3RyaW5nLCBkYXRhYmFzZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9Om5lcHR1bmUtZGI6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OiR7IGNsdXN0ZXIgfS8keyBkYXRhYmFzZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgZ3JhcGggbW9kZWxcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25lcHR1bmUvbGF0ZXN0L3VzZXJndWlkZS9pYW0tZGF0YS1jb25kaXRpb24ta2V5cy5odG1sI2lhbS1uZXB0dW5lLWNvbmRpdGlvbi1rZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9EZWxldGVEYXRhVmlhUXVlcnkoKVxuICAgKiAtIC50b0dldFF1ZXJ5U3RhdHVzKClcbiAgICogLSAudG9HZXRTdHJlYW1SZWNvcmRzKClcbiAgICogLSAudG9SZWFkRGF0YVZpYVF1ZXJ5KClcbiAgICogLSAudG9Xcml0ZURhdGFWaWFRdWVyeSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUXVlcnlMYW5ndWFnZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUXVlcnlMYW5ndWFnZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG59XG4iXX0=