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

211 lines 35.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.KinesisDataStreamMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const KinesisDataStreamMetricFactory_1 = require("./KinesisDataStreamMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class KinesisDataStreamMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: props.streamName, }); this.title = namingStrategy.resolveHumanReadableName(); this.streamUrl = scope .createAwsConsoleUrlFactory() .getKinesisDataStreamUrl(props.streamName); const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.kinesisAlarmFactory = new common_1.KinesisAlarmFactory(alarmFactory); this.provisionedCapacityAnnotations = []; this.ageAnnotations = []; this.recordCountAnnotations = []; const metricFactory = new KinesisDataStreamMetricFactory_1.KinesisDataStreamMetricFactory(scope.createMetricFactory(), props); this.metricGetRecordSumBytes = metricFactory.metricGetRecordsSumBytes(); this.metricGetRecordsIteratorAge = metricFactory.metricGetRecordsIteratorAgeMaxMs(); this.metricGetRecordsLatencyAverage = metricFactory.metricGetRecordsLatencyAverageMs(); this.metricGetRecordsSumCount = metricFactory.metricGetRecordsSumCount(); this.metricGetRecordsSuccessCount = metricFactory.metricGetRecordsSuccessCount(); this.incomingDataSumBytesMetric = metricFactory.metricIncomingDataSumBytes(); this.incomingDataSumCountMetric = metricFactory.metricIncomingDataSumCount(); this.putRecordSumBytesMetric = metricFactory.metricPutRecordSumBytes(); this.putRecordLatencyAverageMetric = metricFactory.metricPutRecordLatencyAverageMs(); this.putRecordSuccessCountMetric = metricFactory.metricPutRecordSuccessCount(); this.putRecordsSumBytesMetric = metricFactory.metricPutRecordsSumBytes(); this.putRecordsLatencyAverageMetric = metricFactory.metricPutRecordsLatencyAverageMs(); this.putRecordsSuccessCountMetric = metricFactory.metricPutRecordsSuccessCount(); this.putRecordsTotalRecordsCountMetric = metricFactory.metricPutRecordsTotalRecordsCount(); this.putRecordsSuccessfulRecordsCountMetric = metricFactory.metricPutRecordsSuccessfulRecordsCount(); this.putRecordsThrottledRecordsCountMetric = metricFactory.metricPutRecordsThrottledRecordsCount(); this.putRecordsFailedRecordsCountMetric = metricFactory.metricPutRecordsFailedRecordsCount(); this.readProvisionedThroughputExceededMetric = metricFactory.metricReadProvisionedThroughputExceeded(); this.writeProvisionedThroughputExceededMetric = metricFactory.metricWriteProvisionedThroughputExceeded(); for (const disambiguator in props.addIteratorMaxAgeAlarm) { const alarmProps = props.addIteratorMaxAgeAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addIteratorMaxAgeAlarm(this.metricGetRecordsIteratorAge, alarmProps, disambiguator); this.ageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addPutRecordsThrottledAlarm) { const alarmProps = props.addPutRecordsThrottledAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addPutRecordsThrottledAlarm(this.putRecordsThrottledRecordsCountMetric, alarmProps, disambiguator); this.recordCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addPutRecordsFailedAlarm) { const alarmProps = props.addPutRecordsFailedAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addPutRecordsFailedAlarm(this.putRecordsFailedRecordsCountMetric, alarmProps, disambiguator); this.recordCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addReadProvisionedThroughputExceededAlarm) { const alarmProps = props.addReadProvisionedThroughputExceededAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm(this.readProvisionedThroughputExceededMetric, alarmProps, disambiguator); this.provisionedCapacityAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addWriteProvisionedThroughputExceededAlarm) { const alarmProps = props.addWriteProvisionedThroughputExceededAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm(this.writeProvisionedThroughputExceededMetric, alarmProps, disambiguator); this.provisionedCapacityAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight)), ]; } widgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)), this.createFirstAdditionalRow(), this.createSecondAdditionalRow(), ]; } createFirstAdditionalRow() { return new aws_cloudwatch_1.Row(this.createRecordSizeWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createOperationWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight)); } createSecondAdditionalRow() { return new aws_cloudwatch_1.Row(this.createRecordNumberWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight)); } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Kinesis Data Stream", title: this.title, goToLinkUrl: this.streamUrl, }); } createIncomingDataWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Incoming", left: [this.incomingDataSumCountMetric], leftYAxis: common_1.CountAxisFromZero, }); } createIteratorAgeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Iterator", left: [this.metricGetRecordsIteratorAge], leftAnnotations: this.ageAnnotations, leftYAxis: common_1.TimeAxisMillisFromZero, }); } createLatencyWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Latency (Average)", left: [ this.metricGetRecordsLatencyAverage, this.putRecordLatencyAverageMetric, this.putRecordsLatencyAverageMetric, ], leftYAxis: common_1.TimeAxisMillisFromZero, }); } createCapacityWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Provisioned Capacity Exceeded", left: [ this.readProvisionedThroughputExceededMetric, this.writeProvisionedThroughputExceededMetric, ], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.provisionedCapacityAnnotations, }); } createRecordSizeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Bytes", left: [ this.metricGetRecordSumBytes, this.putRecordSumBytesMetric, this.putRecordsSumBytesMetric, ], leftYAxis: common_1.SizeAxisBytesFromZero, }); } createOperationWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Successful Operations", left: [ this.metricGetRecordsSuccessCount, this.putRecordSuccessCountMetric, this.putRecordsSuccessCountMetric, ], leftYAxis: common_1.CountAxisFromZero, }); } createRecordNumberWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Records", left: [ this.metricGetRecordsSumCount, this.putRecordsTotalRecordsCountMetric, this.putRecordsSuccessfulRecordsCountMetric, this.putRecordsFailedRecordsCountMetric, this.putRecordsThrottledRecordsCountMetric, ], leftAnnotations: this.recordCountAnnotations, leftYAxis: common_1.CountAxisFromZero, }); } } exports.KinesisDataStreamMonitoring = KinesisDataStreamMonitoring; _a = JSII_RTTI_SYMBOL_1; KinesisDataStreamMonitoring[_a] = { fqn: "cdk-monitoring-constructs.KinesisDataStreamMonitoring", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBS29DO0FBRXBDLHFGQUcwQztBQUMxQyx5Q0FpQnNCO0FBQ3RCLCtDQUd5QjtBQXlCekIsTUFBYSwyQkFBNEIsU0FBUSxtQkFBVTtJQTZCekQsWUFBWSxLQUFzQixFQUFFLEtBQXVDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUIsRUFBRSxLQUFLLENBQUMsVUFBVTtTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSzthQUNuQiwwQkFBMEIsRUFBRTthQUM1Qix1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLDRCQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLCtEQUE4QixDQUN0RCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFB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QUFrQztnQkFDdkMsSUFBSSxDQUFDLHFDQUFxQzthQUMzQztZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQzVDLFNBQVMsRUFBRSwwQkFBaUI7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3Ukgsa0VBOFJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJV2lkZ2V0LFxuICBSb3csXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuXG5pbXBvcnQge1xuICBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnksXG4gIEtpbmVzaXNEYXRhU3RyZWFtTWV0cmljRmFjdG9yeVByb3BzLFxufSBmcm9tIFwiLi9LaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBGdWxsV2lkdGgsXG4gIEhhbGZXaWR0aCxcbiAgS2luZXNpc0FsYXJtRmFjdG9yeSxcbiAgTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVhcnRlcldpZHRoLFxuICBSZWNvcmRzRmFpbGVkVGhyZXNob2xkLFxuICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkSXRlcmF0b3JNYXhBZ2VBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heEl0ZXJhdG9yQWdlVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUHV0UmVjb3Jkc1Rocm90dGxlZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZFB1dFJlY29yZHNGYWlsZWRBbGFybT86IFJlY29yZDxzdHJpbmcsIFJlY29yZHNGYWlsZWRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRUaHJvdHRsZWRSZWNvcmRzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkV3JpdGVQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBLaW5lc2lzRGF0YVN0cmVhbU1vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBLaW5lc2lzRGF0YVN0cmVhbU1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RyZWFtVXJsPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGtpbmVzaXNBbGFybUZhY3Rvcnk6IEtpbmVzaXNBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IGFnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBwcm92aXNpb25lZENhcGFjaXR5QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IHJlY29yZENvdW50QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgcmVhZG9ubHkgbWV0cmljR2V0UmVjb3JkU3VtQnl0ZXM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1ldHJpY0dldFJlY29yZHNJdGVyYXRvckFnZTogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljR2V0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGluY29taW5nRGF0YVN1bUJ5dGVzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBpbmNvbWluZ0RhdGFTdW1Db3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgcHV0UmVjb3JkU3VtQnl0ZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZExhdGVuY3lBdmVyYWdlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRTdWNjZXNzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZHNTdW1CeXRlc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgcHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzU3VjY2Vzc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzVG90YWxSZWNvcmRzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZHNTdWNjZXNzZnVsUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzVGhyb3R0bGVkUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSByZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogcHJvcHMuc3RyZWFtTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5zdHJlYW1VcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRLaW5lc2lzRGF0YVN0cmVhbVVybChwcm9wcy5zdHJlYW1OYW1lKTtcblxuICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkgPSBuZXcgS2luZXNpc0FsYXJtRmFjdG9yeShhbGFybUZhY3RvcnkpO1xuICAgIHRoaXMucHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5hZ2VBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMucmVjb3JkQ291bnRBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3JkU3VtQnl0ZXMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdW1CeXRlcygpO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlTWF4TXMoKTtcbiAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNMYXRlbmN5QXZlcmFnZSA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNMYXRlbmN5QXZlcmFnZU1zKCk7XG4gICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdW1Db3VudCgpO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc1N1Y2Nlc3NDb3VudCA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLmluY29taW5nRGF0YVN1bUJ5dGVzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdEYXRhU3VtQnl0ZXMoKTtcbiAgICB0aGlzLmluY29taW5nRGF0YVN1bUNvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdEYXRhU3VtQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZFN1bUJ5dGVzTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRTdW1CeXRlcygpO1xuICAgIHRoaXMucHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRMYXRlbmN5QXZlcmFnZU1zKCk7XG4gICAgdGhpcy5wdXRSZWNvcmRTdWNjZXNzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNTdW1CeXRlc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3Jkc1N1bUJ5dGVzKCk7XG4gICAgdGhpcy5wdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNcygpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1N1Y2Nlc3NDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudCgpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1N1Y2Nlc3NmdWxSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzU3VjY2Vzc2Z1bFJlY29yZHNDb3VudCgpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNUaHJvdHRsZWRSZWNvcmRzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNGYWlsZWRSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50KCk7XG4gICAgdGhpcy5yZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWQoKTtcbiAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNXcml0ZVByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZEl0ZXJhdG9yTWF4QWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybShcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzSXRlcmF0b3JBZ2UsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5hZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFB1dFJlY29yZHNUaHJvdHRsZWRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZFB1dFJlY29yZHNUaHJvdHRsZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQdXRSZWNvcmRzVGhyb3R0bGVkQWxhcm0oXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnJlY29yZENvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRQdXRSZWNvcmRzRmFpbGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRQdXRSZWNvcmRzRmFpbGVkQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkuYWRkUHV0UmVjb3Jkc0ZhaWxlZEFsYXJtKFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNGYWlsZWRSZWNvcmRzQ291bnRNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWNvcmRDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQcm92aXNpb25lZFJlYWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybShcbiAgICAgICAgICB0aGlzLnJlYWRQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZE1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnByb3Zpc2lvbmVkQ2FwYWNpdHlBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgIHByb3BzLmFkZFdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQcm92aXNpb25lZFdyaXRlVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0oXG4gICAgICAgICAgdGhpcy53cml0ZVByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljLFxuICAgICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgIHRoaXMucHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlSXRlcmF0b3JBZ2VXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlTGF0ZW5jeVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVDYXBhY2l0eVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUl0ZXJhdG9yQWdlV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVMYXRlbmN5V2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVDYXBhY2l0eVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgICAgdGhpcy5jcmVhdGVGaXJzdEFkZGl0aW9uYWxSb3coKSxcbiAgICAgIHRoaXMuY3JlYXRlU2Vjb25kQWRkaXRpb25hbFJvdygpLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpcnN0QWRkaXRpb25hbFJvdygpIHtcbiAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgIHRoaXMuY3JlYXRlUmVjb3JkU2l6ZVdpZGdldChIYWxmV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZU9wZXJhdGlvbldpZGdldChIYWxmV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVNlY29uZEFkZGl0aW9uYWxSb3coKSB7XG4gICAgcmV0dXJuIG5ldyBSb3coXG4gICAgICB0aGlzLmNyZWF0ZVJlY29yZE51bWJlcldpZGdldChGdWxsV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiS2luZXNpcyBEYXRhIFN0cmVhbVwiLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5zdHJlYW1VcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSW5jb21pbmdcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmluY29taW5nRGF0YVN1bUNvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJdGVyYXRvckFnZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJdGVyYXRvclwiLFxuICAgICAgbGVmdDogW3RoaXMubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlXSxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5hZ2VBbm5vdGF0aW9ucyxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhdGVuY3lXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTGF0ZW5jeSAoQXZlcmFnZSlcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2UsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUNhcGFjaXR5V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlByb3Zpc2lvbmVkIENhcGFjaXR5IEV4Y2VlZGVkXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMucmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljLFxuICAgICAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5wcm92aXNpb25lZENhcGFjaXR5QW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVSZWNvcmRTaXplV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkJ5dGVzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljR2V0UmVjb3JkU3VtQnl0ZXMsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkU3VtQnl0ZXNNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1N1bUJ5dGVzTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlT3BlcmF0aW9uV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlN1Y2Nlc3NmdWwgT3BlcmF0aW9uc1wiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkU3VjY2Vzc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNTdWNjZXNzQ291bnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVJlY29yZE51bWJlcldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJSZWNvcmRzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc1N1bUNvdW50LFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzU3VjY2Vzc2Z1bFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNUaHJvdHRsZWRSZWNvcmRzQ291bnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnJlY29yZENvdW50QW5ub3RhdGlvbnMsXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG59XG4iXX0=