UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

144 lines 24.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.KinesisAlarmFactory = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); class KinesisAlarmFactory { constructor(alarmFactory) { this.alarmFactory = alarmFactory; } addIteratorMaxAgeAlarm(metric, props, disambiguator) { return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.MISSING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold: props.maxAgeInMillis, alarmNameSuffix: "Iterator-Age-Max", alarmDescription: `Iterator Max Age is too high.`, // we will dedupe any kind of message count issue to the same ticket alarmDedupeStringSuffix: "AnyDataStreamIteratorMaxAge", }); } addPutRecordsThrottledAlarm(metric, props, disambiguator) { const threshold = props.maxRecordsThrottledThreshold; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold: threshold, alarmNameSuffix: "PutRecordsThrottled", alarmDescription: `Number of throttled PutRecords exceeded threshold of ${threshold}`, // we will dedupe any kind of message count issue to the same ticket alarmDedupeStringSuffix: "PutRecordsThrottled", }); } addPutRecordsFailedAlarm(metric, props, disambiguator) { const threshold = props.maxRecordsFailedThreshold; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: "PutRecordsFailed", alarmDescription: `Number of failed PutRecords exceeded threshold of ${threshold}`, // we will dedupe any kind of message count issue to the same ticket alarmDedupeStringSuffix: "PutRecordsFailed", }); } addFirehoseStreamExceedSafetyThresholdAlarm(metric, metricName, quotaName, props, disambiguator) { const threshold = props.safetyThresholdLimit; if (threshold < 0 || threshold >= 1) { throw new Error(`safetyThresholdLimit must be in range [0.0, 1.0) for ${metricName}ExceedThresholdAlarm.`); } return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: metricName, alarmDescription: `${metricName} exceeded ${quotaName} alarming threshold of ${threshold}`, // we will dedupe any kind of message count issue to the same ticket alarmDedupeStringSuffix: `${metricName}ExceedThresholdLimit`, }); } addProvisionedReadThroughputExceededAlarm(metric, props, disambiguator) { const threshold = props.maxRecordsThrottledThreshold; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: "ReadThroughputExceeded", alarmDescription: `Number of records resulting in read throughput capacity throttling reached the threshold of ${threshold}.`, }); } addProvisionedWriteThroughputExceededAlarm(metric, props, disambiguator) { const threshold = props.maxRecordsThrottledThreshold; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: "WriteThroughputExceeded", alarmDescription: `Number of records resulting in write throughput capacity throttling reached the threshold of ${threshold}.`, }); } addConsumerIteratorMaxAgeAlarm(metric, props, disambiguator) { return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.MISSING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold: props.maxAgeInMillis, alarmNameSuffix: "ConsumerIteratorMaxAge", alarmDescription: `Consumer SubscribeToShardEvent MillisBehindLatest is too high.`, alarmDedupeStringSuffix: "AnyConsumerIteratorMaxAge", }); } addConsumerSubscribeToShardRateExceededAlarm(metric, props, disambiguator) { const threshold = props.maxRateExceeded; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: "ConsumerSubscribeToShardRateExceeded", alarmDescription: `Consumer SubscribeToShard rate exceeded threshold of ${threshold}.`, alarmDedupeStringSuffix: "ConsumerSubscribeToShardRateExceeded", }); } addConsumerSubscribeToShardSuccessAlarm(metric, props, disambiguator) { const threshold = props.minSuccessRate; return this.alarmFactory.addAlarm(metric, { treatMissingData: props.treatMissingDataOverride ?? aws_cloudwatch_1.TreatMissingData.NOT_BREACHING, comparisonOperator: props.comparisonOperatorOverride ?? aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD, ...props, disambiguator, threshold, alarmNameSuffix: "ConsumerSubscribeToShardSuccess", alarmDescription: `Consumer SubscribeToShard success rate fell below threshold of ${threshold}.`, alarmDedupeStringSuffix: "ConsumerSubscribeToShardSuccess", }); } } exports.KinesisAlarmFactory = KinesisAlarmFactory; _a = JSII_RTTI_SYMBOL_1; KinesisAlarmFactory[_a] = { fqn: "cdk-monitoring-constructs.KinesisAlarmFactory", version: "10.2.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0FsYXJtRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIktpbmVzaXNBbGFybUZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFHb0M7QUFtQ3BDLE1BQWEsbUJBQW1CO0lBRzlCLFlBQVksWUFBMEI7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELHNCQUFzQixDQUNwQixNQUE4QixFQUM5QixLQUE4QixFQUM5QixhQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QyxnQkFBZ0IsRUFDZCxLQUFLLENBQUMsd0JBQXdCLElBQUksaUNBQWdCLENBQUMsT0FBTztZQUM1RCxrQkFBa0IsRUFDaEIsS0FBSyxDQUFDLDBCQUEwQjtnQkFDaEMsbUNBQWtCLENBQUMsc0JBQXNCO1lBQzNDLEdBQUcsS0FBSztZQUNSLGFBQWE7WUFDYixTQUFTLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDL0IsZUFBZSxFQUFFLGtCQUFrQjtZQUNuQyxnQkFBZ0IsRUFBRSwrQkFBK0I7WUFDakQsb0VBQW9FO1lBQ3BFLHVCQUF1QixFQUFFLDZCQUE2QjtTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLE1BQThCLEVBQzlCLEtBQWdDLEVBQ2hDLGFBQXNCO1FBRXRCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QyxnQkFBZ0IsRUFDZCxLQUFLLENBQUMsd0JBQXdCLElBQUksaUNBQWdCLENBQUMsYUFBYTtZQUNsRSxrQkFBa0IsRUFDaEIsS0FBSyxDQUFDLDBCQUEwQjtnQkFDaEMsbUNBQWtCLENBQUMsc0JBQXNCO1lBQzNDLEdBQUcsS0FBSztZQUNSLGFBQWE7WUFDYixT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QUE4QixFQUM5QixLQUFrRCxFQUNsRCxhQUFzQjtRQUV0QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3hDLGdCQUFnQixFQUNkLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxpQ0FBZ0IsQ0FBQyxhQUFhO1lBQ2xFLGtCQUFrQixFQUNoQixLQUFLLENBQUMsMEJBQTBCO2dCQUNoQyxtQ0FBa0IsQ0FBQyxtQkFBbUI7WUFDeEMsR0FBRyxLQUFLO1lBQ1IsYUFBYTtZQUNiLFNBQVM7WUFDVCxlQUFlLEVBQUUsaUNBQWlDO1lBQ2xELGdCQUFnQixFQUFFLGtFQUFrRSxTQUFTLEdBQUc7WUFDaEcsdUJBQXVCLEVBQUUsaUNBQWlDO1NBQzNELENBQUMsQ0FBQztJQUNMLENBQUM7O0FBMU1ILGtEQTJNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBhcmlzb25PcGVyYXRvcixcbiAgVHJlYXRNaXNzaW5nRGF0YSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7IEFsYXJtRmFjdG9yeSwgQ3VzdG9tQWxhcm1UaHJlc2hvbGQgfSBmcm9tIFwiLi4vLi4vYWxhcm1cIjtcbmltcG9ydCB7IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQgfSBmcm9tIFwiLi4vLi4vbWV0cmljXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQgZXh0ZW5kcyBDdXN0b21BbGFybVRocmVzaG9sZCB7XG4gIHJlYWRvbmx5IG1heEFnZUluTWlsbGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3Jkc1Rocm90dGxlZFRocmVzaG9sZCBleHRlbmRzIEN1c3RvbUFsYXJtVGhyZXNob2xkIHtcbiAgcmVhZG9ubHkgbWF4UmVjb3Jkc1Rocm90dGxlZFRocmVzaG9sZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpcmVob3NlU3RyZWFtTGltaXRUaHJlc2hvbGQgZXh0ZW5kcyBDdXN0b21BbGFybVRocmVzaG9sZCB7XG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgdmFsdWUgYmV0d2VlbiBbMC4wLCAxLjApIGZvciB3aGVuIHRoZSBhbGFybSBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2FmZXR5VGhyZXNob2xkTGltaXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRzRmFpbGVkVGhyZXNob2xkIGV4dGVuZHMgQ3VzdG9tQWxhcm1UaHJlc2hvbGQge1xuICByZWFkb25seSBtYXhSZWNvcmRzRmFpbGVkVGhyZXNob2xkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtZXJSYXRlRXhjZWVkZWRUaHJlc2hvbGQgZXh0ZW5kcyBDdXN0b21BbGFybVRocmVzaG9sZCB7XG4gIC8qKiBUaHJlc2hvbGQgZm9yIFN1YnNjcmliZVRvU2hhcmQuUmF0ZUV4Y2VlZGVkIGF2ZXJhZ2UgKDAuMOKAkzEuMCkuICovXG4gIHJlYWRvbmx5IG1heFJhdGVFeGNlZWRlZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pbkNvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NUaHJlc2hvbGRcbiAgZXh0ZW5kcyBDdXN0b21BbGFybVRocmVzaG9sZCB7XG4gIC8qKiBNaW5pbXVtIGFjY2VwdGFibGUgU3Vic2NyaWJlVG9TaGFyZC5TdWNjZXNzIGF2ZXJhZ2UgKDAuMOKAkzEuMCkuICovXG4gIHJlYWRvbmx5IG1pblN1Y2Nlc3NSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBLaW5lc2lzQWxhcm1GYWN0b3J5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5O1xuXG4gIGNvbnN0cnVjdG9yKGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5KSB7XG4gICAgdGhpcy5hbGFybUZhY3RvcnkgPSBhbGFybUZhY3Rvcnk7XG4gIH1cblxuICBhZGRJdGVyYXRvck1heEFnZUFsYXJtKFxuICAgIG1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgICBwcm9wczogTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQsXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxhcm1GYWN0b3J5LmFkZEFsYXJtKG1ldHJpYywge1xuICAgICAgdHJlYXRNaXNzaW5nRGF0YTpcbiAgICAgICAgcHJvcHMudHJlYXRNaXNzaW5nRGF0YU92ZXJyaWRlID8/IFRyZWF0TWlzc2luZ0RhdGEuTUlTU0lORyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yT3ZlcnJpZGUgPz9cbiAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLm1heEFnZUluTWlsbGlzLFxuICAgICAgYWxhcm1OYW1lU3VmZml4OiBcIkl0ZXJhdG9yLUFnZS1NYXhcIixcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBJdGVyYXRvciBNYXggQWdlIGlzIHRvbyBoaWdoLmAsXG4gICAgICAvLyB3ZSB3aWxsIGRlZHVwZSBhbnkga2luZCBvZiBtZXNzYWdlIGNvdW50IGlzc3VlIHRvIHRoZSBzYW1lIHRpY2tldFxuICAgICAgYWxhcm1EZWR1cGVTdHJpbmdTdWZmaXg6IFwiQW55RGF0YVN0cmVhbUl0ZXJhdG9yTWF4QWdlXCIsXG4gICAgfSk7XG4gIH1cblxuICBhZGRQdXRSZWNvcmRzVGhyb3R0bGVkQWxhcm0oXG4gICAgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICAgIHByb3BzOiBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkLFxuICAgIGRpc2FtYmlndWF0b3I/OiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHByb3BzLm1heFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGQ7XG4gICAgcmV0dXJuIHRoaXMuYWxhcm1GYWN0b3J5LmFkZEFsYXJtKG1ldHJpYywge1xuICAgICAgdHJlYXRNaXNzaW5nRGF0YTpcbiAgICAgICAgcHJvcHMudHJlYXRNaXNzaW5nRGF0YU92ZXJyaWRlID8/IFRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yT3ZlcnJpZGUgPz9cbiAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICB0aHJlc2hvbGQ6IHRocmVzaG9sZCxcbiAgICAgIGFsYXJtTmFtZVN1ZmZpeDogXCJQdXRSZWNvcmRzVGhyb3R0bGVkXCIsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgTnVtYmVyIG9mIHRocm90dGxlZCBQdXRSZWNvcmRzIGV4Y2VlZGVkIHRocmVzaG9sZCBvZiAke3RocmVzaG9sZH1gLFxuICAgICAgLy8gd2Ugd2lsbCBkZWR1cGUgYW55IGtpbmQgb2YgbWVzc2FnZSBjb3VudCBpc3N1ZSB0byB0aGUgc2FtZSB0aWNrZXRcbiAgICAgIGFsYXJtRGVkdXBlU3RyaW5nU3VmZml4OiBcIlB1dFJlY29yZHNUaHJvdHRsZWRcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFB1dFJlY29yZHNGYWlsZWRBbGFybShcbiAgICBtZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gICAgcHJvcHM6IFJlY29yZHNGYWlsZWRUaHJlc2hvbGQsXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMubWF4UmVjb3Jkc0ZhaWxlZFRocmVzaG9sZDtcbiAgICByZXR1cm4gdGhpcy5hbGFybUZhY3RvcnkuYWRkQWxhcm0obWV0cmljLCB7XG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOlxuICAgICAgICBwcm9wcy50cmVhdE1pc3NpbmdEYXRhT3ZlcnJpZGUgPz8gVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOlxuICAgICAgICBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3JPdmVycmlkZSA/P1xuICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGFsYXJtTmFtZVN1ZmZpeDogXCJQdXRSZWNvcmRzRmFpbGVkXCIsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgTnVtYmVyIG9mIGZhaWxlZCBQdXRSZWNvcmRzIGV4Y2VlZGVkIHRocmVzaG9sZCBvZiAke3RocmVzaG9sZH1gLFxuICAgICAgLy8gd2Ugd2lsbCBkZWR1cGUgYW55IGtpbmQgb2YgbWVzc2FnZSBjb3VudCBpc3N1ZSB0byB0aGUgc2FtZSB0aWNrZXRcbiAgICAgIGFsYXJtRGVkdXBlU3RyaW5nU3VmZml4OiBcIlB1dFJlY29yZHNGYWlsZWRcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEZpcmVob3NlU3RyZWFtRXhjZWVkU2FmZXR5VGhyZXNob2xkQWxhcm0oXG4gICAgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBxdW90YU5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogRmlyZWhvc2VTdHJlYW1MaW1pdFRocmVzaG9sZCxcbiAgICBkaXNhbWJpZ3VhdG9yPzogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBwcm9wcy5zYWZldHlUaHJlc2hvbGRMaW1pdDtcbiAgICBpZiAodGhyZXNob2xkIDwgMCB8fCB0aHJlc2hvbGQgPj0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgc2FmZXR5VGhyZXNob2xkTGltaXQgbXVzdCBiZSBpbiByYW5nZSBbMC4wLCAxLjApIGZvciAke21ldHJpY05hbWV9RXhjZWVkVGhyZXNob2xkQWxhcm0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWxhcm1GYWN0b3J5LmFkZEFsYXJtKG1ldHJpYywge1xuICAgICAgdHJlYXRNaXNzaW5nRGF0YTpcbiAgICAgICAgcHJvcHMudHJlYXRNaXNzaW5nRGF0YU92ZXJyaWRlID8/IFRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yT3ZlcnJpZGUgPz9cbiAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICBhbGFybU5hbWVTdWZmaXg6IG1ldHJpY05hbWUsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgJHttZXRyaWNOYW1lfSBleGNlZWRlZCAke3F1b3RhTmFtZX0gYWxhcm1pbmcgdGhyZXNob2xkIG9mICR7dGhyZXNob2xkfWAsXG4gICAgICAvLyB3ZSB3aWxsIGRlZHVwZSBhbnkga2luZCBvZiBtZXNzYWdlIGNvdW50IGlzc3VlIHRvIHRoZSBzYW1lIHRpY2tldFxuICAgICAgYWxhcm1EZWR1cGVTdHJpbmdTdWZmaXg6IGAke21ldHJpY05hbWV9RXhjZWVkVGhyZXNob2xkTGltaXRgLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkUHJvdmlzaW9uZWRSZWFkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0oXG4gICAgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICAgIHByb3BzOiBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkLFxuICAgIGRpc2FtYmlndWF0b3I6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMubWF4UmVjb3Jkc1Rocm90dGxlZFRocmVzaG9sZDtcbiAgICByZXR1cm4gdGhpcy5hbGFybUZhY3RvcnkuYWRkQWxhcm0obWV0cmljLCB7XG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOlxuICAgICAgICBwcm9wcy50cmVhdE1pc3NpbmdEYXRhT3ZlcnJpZGUgPz8gVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOlxuICAgICAgICBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3JPdmVycmlkZSA/P1xuICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGFsYXJtTmFtZVN1ZmZpeDogXCJSZWFkVGhyb3VnaHB1dEV4Y2VlZGVkXCIsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgTnVtYmVyIG9mIHJlY29yZHMgcmVzdWx0aW5nIGluIHJlYWQgdGhyb3VnaHB1dCBjYXBhY2l0eSB0aHJvdHRsaW5nIHJlYWNoZWQgdGhlIHRocmVzaG9sZCBvZiAke3RocmVzaG9sZH0uYCxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFByb3Zpc2lvbmVkV3JpdGVUaHJvdWdocHV0RXhjZWVkZWRBbGFybShcbiAgICBtZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gICAgcHJvcHM6IFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGQsXG4gICAgZGlzYW1iaWd1YXRvcjogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBwcm9wcy5tYXhSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkO1xuICAgIHJldHVybiB0aGlzLmFsYXJtRmFjdG9yeS5hZGRBbGFybShtZXRyaWMsIHtcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6XG4gICAgICAgIHByb3BzLnRyZWF0TWlzc2luZ0RhdGFPdmVycmlkZSA/PyBUcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6XG4gICAgICAgIHByb3BzLmNvbXBhcmlzb25PcGVyYXRvck92ZXJyaWRlID8/XG4gICAgICAgIENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgYWxhcm1OYW1lU3VmZml4OiBcIldyaXRlVGhyb3VnaHB1dEV4Y2VlZGVkXCIsXG4gICAgICBhbGFybURlc2NyaXB0aW9uOiBgTnVtYmVyIG9mIHJlY29yZHMgcmVzdWx0aW5nIGluIHdyaXRlIHRocm91Z2hwdXQgY2FwYWNpdHkgdGhyb3R0bGluZyByZWFjaGVkIHRoZSB0aHJlc2hvbGQgb2YgJHt0aHJlc2hvbGR9LmAsXG4gICAgfSk7XG4gIH1cblxuICBhZGRDb25zdW1lckl0ZXJhdG9yTWF4QWdlQWxhcm0oXG4gICAgbWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICAgIHByb3BzOiBNYXhJdGVyYXRvckFnZVRocmVzaG9sZCxcbiAgICBkaXNhbWJpZ3VhdG9yPzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5hbGFybUZhY3RvcnkuYWRkQWxhcm0obWV0cmljLCB7XG4gICAgICB0cmVhdE1pc3NpbmdEYXRhOlxuICAgICAgICBwcm9wcy50cmVhdE1pc3NpbmdEYXRhT3ZlcnJpZGUgPz8gVHJlYXRNaXNzaW5nRGF0YS5NSVNTSU5HLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOlxuICAgICAgICBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3JPdmVycmlkZSA/P1xuICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgIHRocmVzaG9sZDogcHJvcHMubWF4QWdlSW5NaWxsaXMsXG4gICAgICBhbGFybU5hbWVTdWZmaXg6IFwiQ29uc3VtZXJJdGVyYXRvck1heEFnZVwiLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYENvbnN1bWVyIFN1YnNjcmliZVRvU2hhcmRFdmVudCBNaWxsaXNCZWhpbmRMYXRlc3QgaXMgdG9vIGhpZ2guYCxcbiAgICAgIGFsYXJtRGVkdXBlU3RyaW5nU3VmZml4OiBcIkFueUNvbnN1bWVySXRlcmF0b3JNYXhBZ2VcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFkZENvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFJhdGVFeGNlZWRlZEFsYXJtKFxuICAgIG1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgICBwcm9wczogQ29uc3VtZXJSYXRlRXhjZWVkZWRUaHJlc2hvbGQsXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMubWF4UmF0ZUV4Y2VlZGVkO1xuICAgIHJldHVybiB0aGlzLmFsYXJtRmFjdG9yeS5hZGRBbGFybShtZXRyaWMsIHtcbiAgICAgIHRyZWF0TWlzc2luZ0RhdGE6XG4gICAgICAgIHByb3BzLnRyZWF0TWlzc2luZ0RhdGFPdmVycmlkZSA/PyBUcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICBjb21wYXJpc29uT3BlcmF0b3I6XG4gICAgICAgIHByb3BzLmNvbXBhcmlzb25PcGVyYXRvck92ZXJyaWRlID8/XG4gICAgICAgIENvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgYWxhcm1OYW1lU3VmZml4OiBcIkNvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFJhdGVFeGNlZWRlZFwiLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYENvbnN1bWVyIFN1YnNjcmliZVRvU2hhcmQgcmF0ZSBleGNlZWRlZCB0aHJlc2hvbGQgb2YgJHt0aHJlc2hvbGR9LmAsXG4gICAgICBhbGFybURlZHVwZVN0cmluZ1N1ZmZpeDogXCJDb25zdW1lclN1YnNjcmliZVRvU2hhcmRSYXRlRXhjZWVkZWRcIixcbiAgICB9KTtcbiAgfVxuXG4gIGFkZENvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NBbGFybShcbiAgICBtZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gICAgcHJvcHM6IE1pbkNvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NUaHJlc2hvbGQsXG4gICAgZGlzYW1iaWd1YXRvcj86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gcHJvcHMubWluU3VjY2Vzc1JhdGU7XG4gICAgcmV0dXJuIHRoaXMuYWxhcm1GYWN0b3J5LmFkZEFsYXJtKG1ldHJpYywge1xuICAgICAgdHJlYXRNaXNzaW5nRGF0YTpcbiAgICAgICAgcHJvcHMudHJlYXRNaXNzaW5nRGF0YU92ZXJyaWRlID8/IFRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgcHJvcHMuY29tcGFyaXNvbk9wZXJhdG9yT3ZlcnJpZGUgPz9cbiAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkxFU1NfVEhBTl9USFJFU0hPTEQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICBhbGFybU5hbWVTdWZmaXg6IFwiQ29uc3VtZXJTdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc1wiLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYENvbnN1bWVyIFN1YnNjcmliZVRvU2hhcmQgc3VjY2VzcyByYXRlIGZlbGwgYmVsb3cgdGhyZXNob2xkIG9mICR7dGhyZXNob2xkfS5gLFxuICAgICAgYWxhcm1EZWR1cGVTdHJpbmdTdWZmaXg6IFwiQ29uc3VtZXJTdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc1wiLFxuICAgIH0pO1xuICB9XG59XG4iXX0=