cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
156 lines • 28.6 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SqsQueueMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const SqsQueueMetricFactory_1 = require("./SqsQueueMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
class SqsQueueMonitoring extends common_1.Monitoring {
constructor(scope, props, invokedFromSuper) {
super(scope, props);
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
namedConstruct: props.queue,
fallbackConstructName: this.resolveQueueName(props.queue),
});
this.title = namingStrategy.resolveHumanReadableName();
this.queueUrl = scope
.createAwsConsoleUrlFactory()
.getSqsQueueUrl(props.queue.queueUrl);
const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.queueAlarmFactory = new common_1.QueueAlarmFactory(alarmFactory);
this.countAnnotations = [];
this.ageAnnotations = [];
this.timeToDrainAnnotations = [];
const metricFactory = new SqsQueueMetricFactory_1.SqsQueueMetricFactory(scope.createMetricFactory(), props);
this.visibleMessagesMetric =
metricFactory.metricApproximateVisibleMessageCount();
this.incomingMessagesMetric = metricFactory.metricIncomingMessageCount();
this.deletedMessagesMetric = metricFactory.metricDeletedMessageCount();
this.oldestMessageAgeMetric =
metricFactory.metricApproximateAgeOfOldestMessageInSeconds();
this.messageSizeMetric = metricFactory.metricAverageMessageSizeInBytes();
this.productionRateMetric = metricFactory.metricProductionRate();
this.consumptionRateMetric = metricFactory.metricConsumptionRate();
this.timeToDrainMetric = metricFactory.metricTimeToDrain();
for (const disambiguator in props.addQueueMinSizeAlarm) {
const alarmProps = props.addQueueMinSizeAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMinQueueMessageCountAlarm(this.visibleMessagesMetric, alarmProps, disambiguator);
this.countAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addQueueMaxSizeAlarm) {
const alarmProps = props.addQueueMaxSizeAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMaxQueueMessageCountAlarm(this.visibleMessagesMetric, alarmProps, disambiguator);
this.countAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addQueueMaxMessageAgeAlarm) {
const alarmProps = props.addQueueMaxMessageAgeAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMaxQueueMessageAgeAlarm(this.oldestMessageAgeMetric, alarmProps, disambiguator);
this.ageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addQueueMaxTimeToDrainMessagesAlarm) {
const alarmProps = props.addQueueMaxTimeToDrainMessagesAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMaxQueueTimeToDrainMessagesAlarm(this.timeToDrainMetric, alarmProps, disambiguator);
this.timeToDrainAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addQueueMinIncomingMessagesAlarm) {
const alarmProps = props.addQueueMinIncomingMessagesAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMinQueueIncomingMessagesCountAlarm(this.incomingMessagesMetric, alarmProps, disambiguator);
this.countAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addQueueMaxIncomingMessagesAlarm) {
const alarmProps = props.addQueueMaxIncomingMessagesAlarm[disambiguator];
const createdAlarm = this.queueAlarmFactory.addMaxQueueIncomingMessagesCountAlarm(this.incomingMessagesMetric, alarmProps, disambiguator);
this.countAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
if (!(invokedFromSuper ?? false)) {
// invoke only when not called from super class, so it is not called twice
// TODO: find a more elegant solution for this
props.useCreatedAlarms?.consume(this.createdAlarms());
}
}
summaryWidgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createProducerAndConsumerRateWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), this.createTimeToDrainWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight)),
new aws_cloudwatch_1.Row(this.createMessageCountWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), this.createMessageAgeWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight)),
];
}
widgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createMessageCountWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createMessageAgeWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createMessageSizeWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight)),
new aws_cloudwatch_1.Row(this.createProducerAndConsumerRateWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createTimeToDrainWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight)),
];
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "SQS Queue",
title: this.title,
goToLinkUrl: this.queueUrl,
});
}
createMessageCountWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Message Count",
left: [this.visibleMessagesMetric, this.incomingMessagesMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.countAnnotations,
});
}
createMessageAgeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Oldest Message Age",
left: [this.oldestMessageAgeMetric],
leftYAxis: common_1.TimeAxisSecondsFromZero,
leftAnnotations: this.ageAnnotations,
});
}
createMessageSizeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Message Size",
left: [this.messageSizeMetric],
leftYAxis: common_1.SizeAxisBytesFromZero,
});
}
createProducerAndConsumerRateWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Producer vs Consumer (rate)",
left: [this.productionRateMetric, this.consumptionRateMetric],
leftYAxis: common_1.RateAxisFromZero,
});
}
createTimeToDrainWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Time to drain",
left: [this.timeToDrainMetric],
leftYAxis: common_1.TimeAxisSecondsFromZero,
});
}
resolveQueueName(queue) {
// try to take the name (if specified) instead of token
return queue.node.defaultChild?.queueName;
}
}
exports.SqsQueueMonitoring = SqsQueueMonitoring;
_a = JSII_RTTI_SYMBOL_1;
SqsQueueMonitoring[_a] = { fqn: "cdk-monitoring-constructs.SqsQueueMonitoring", version: "10.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzUXVldWVNb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiU3FzUXVldWVNb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBS29DO0FBR3BDLG1FQUdpQztBQUNqQyx5Q0FvQnNCO0FBQ3RCLCtDQUd5QjtBQTRCekIsTUFBYSxrQkFBbUIsU0FBUSxtQkFBVTtJQWtCaEQsWUFDRSxLQUFzQixFQUN0QixLQUE4QixFQUM5QixnQkFBMEI7UUFFMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsS0FBSztZQUMzQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUMxRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSzthQUNsQiwwQkFBMEIsRUFBRTthQUM1QixjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBRWpDLE1BQU0sYUFBYSxHQUFHLElBQUksNkNBQXFCLENBQzdDLEtBQUssQ0FBQyxt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O0lBQ0wsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQWE7UUFDdEMsdURBQXVEO1FBQ3ZELE9BQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUF5QixFQUFFLFNBQVMsQ0FBQztJQUMxRCxDQUFDOztBQXBPSCxnREFxT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG4gIFJvdyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBDZm5RdWV1ZSwgSVF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcblxuaW1wb3J0IHtcbiAgU3FzUXVldWVNZXRyaWNGYWN0b3J5LFxuICBTcXNRdWV1ZU1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vU3FzUXVldWVNZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbiAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCxcbiAgSGFsZldpZHRoLFxuICBNYXhJbmNvbWluZ01lc3NhZ2VzQ291bnRUaHJlc2hvbGQsXG4gIE1heE1lc3NhZ2VBZ2VUaHJlc2hvbGQsXG4gIE1heE1lc3NhZ2VDb3VudFRocmVzaG9sZCxcbiAgTWF4VGltZVRvRHJhaW5UaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1pbkluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZCxcbiAgTWluTWVzc2FnZUNvdW50VGhyZXNob2xkLFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFF1ZXVlQWxhcm1GYWN0b3J5LFxuICBSYXRlQXhpc0Zyb21aZXJvLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRoaXJkV2lkdGgsXG4gIFRpbWVBeGlzU2Vjb25kc0Zyb21aZXJvLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlU3FzUXVldWVBbGFybXMge1xuICByZWFkb25seSBhZGRRdWV1ZU1pblNpemVBbGFybT86IFJlY29yZDxzdHJpbmcsIE1pbk1lc3NhZ2VDb3VudFRocmVzaG9sZD47XG4gIHJlYWRvbmx5IGFkZFF1ZXVlTWF4U2l6ZUFsYXJtPzogUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUXVldWVNYXhNZXNzYWdlQWdlQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBNYXhNZXNzYWdlQWdlVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUXVldWVNYXhUaW1lVG9EcmFpbk1lc3NhZ2VzQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1heFRpbWVUb0RyYWluVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZFF1ZXVlTWluSW5jb21pbmdNZXNzYWdlc0FsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBNaW5JbmNvbWluZ01lc3NhZ2VzQ291bnRUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1heEluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZFxuICA+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNxc1F1ZXVlTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlU3FzUXVldWVBbGFybXMsXG4gICAgQmFzZU1vbml0b3JpbmdQcm9wcyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgU3FzUXVldWVNZXRyaWNGYWN0b3J5UHJvcHMsXG4gICAgU3FzUXVldWVNb25pdG9yaW5nT3B0aW9ucyB7fVxuXG5leHBvcnQgY2xhc3MgU3FzUXVldWVNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1ZXVlVXJsPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHF1ZXVlQWxhcm1GYWN0b3J5OiBRdWV1ZUFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgY291bnRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgYWdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWVUb0RyYWluQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgcmVhZG9ubHkgdmlzaWJsZU1lc3NhZ2VzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBpbmNvbWluZ01lc3NhZ2VzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBkZWxldGVkTWVzc2FnZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1lc3NhZ2VTaXplTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwcm9kdWN0aW9uUmF0ZU1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgY29uc3VtcHRpb25SYXRlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSB0aW1lVG9EcmFpbk1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogTW9uaXRvcmluZ1Njb3BlLFxuICAgIHByb3BzOiBTcXNRdWV1ZU1vbml0b3JpbmdQcm9wcyxcbiAgICBpbnZva2VkRnJvbVN1cGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5hbWVkQ29uc3RydWN0OiBwcm9wcy5xdWV1ZSxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogdGhpcy5yZXNvbHZlUXVldWVOYW1lKHByb3BzLnF1ZXVlKSxcbiAgICB9KTtcblxuICAgIHRoaXMudGl0bGUgPSBuYW1pbmdTdHJhdGVneS5yZXNvbHZlSHVtYW5SZWFkYWJsZU5hbWUoKTtcbiAgICB0aGlzLnF1ZXVlVXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0U3FzUXVldWVVcmwocHJvcHMucXVldWUucXVldWVVcmwpO1xuXG4gICAgY29uc3QgYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIHRoaXMucXVldWVBbGFybUZhY3RvcnkgPSBuZXcgUXVldWVBbGFybUZhY3RvcnkoYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLmNvdW50QW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFnZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy50aW1lVG9EcmFpbkFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IFNxc1F1ZXVlTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gICAgdGhpcy52aXNpYmxlTWVzc2FnZXNNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNBcHByb3hpbWF0ZVZpc2libGVNZXNzYWdlQ291bnQoKTtcbiAgICB0aGlzLmluY29taW5nTWVzc2FnZXNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0luY29taW5nTWVzc2FnZUNvdW50KCk7XG4gICAgdGhpcy5kZWxldGVkTWVzc2FnZXNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0RlbGV0ZWRNZXNzYWdlQ291bnQoKTtcbiAgICB0aGlzLm9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZUluU2Vjb25kcygpO1xuICAgIHRoaXMubWVzc2FnZVNpemVNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0F2ZXJhZ2VNZXNzYWdlU2l6ZUluQnl0ZXMoKTtcbiAgICB0aGlzLnByb2R1Y3Rpb25SYXRlTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNQcm9kdWN0aW9uUmF0ZSgpO1xuICAgIHRoaXMuY29uc3VtcHRpb25SYXRlTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNDb25zdW1wdGlvblJhdGUoKTtcbiAgICB0aGlzLnRpbWVUb0RyYWluTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNUaW1lVG9EcmFpbigpO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFF1ZXVlTWluU2l6ZUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUXVldWVNaW5TaXplQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnF1ZXVlQWxhcm1GYWN0b3J5LmFkZE1pblF1ZXVlTWVzc2FnZUNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY291bnRBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFF1ZXVlTWF4U2l6ZUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUXVldWVNYXhTaXplQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnF1ZXVlQWxhcm1GYWN0b3J5LmFkZE1heFF1ZXVlTWVzc2FnZUNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMudmlzaWJsZU1lc3NhZ2VzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY291bnRBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFF1ZXVlTWF4TWVzc2FnZUFnZUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkUXVldWVNYXhNZXNzYWdlQWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLnF1ZXVlQWxhcm1GYWN0b3J5LmFkZE1heFF1ZXVlTWVzc2FnZUFnZUFsYXJtKFxuICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5hZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFF1ZXVlTWF4VGltZVRvRHJhaW5NZXNzYWdlc0FsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgcHJvcHMuYWRkUXVldWVNYXhUaW1lVG9EcmFpbk1lc3NhZ2VzQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPVxuICAgICAgICB0aGlzLnF1ZXVlQWxhcm1GYWN0b3J5LmFkZE1heFF1ZXVlVGltZVRvRHJhaW5NZXNzYWdlc0FsYXJtKFxuICAgICAgICAgIHRoaXMudGltZVRvRHJhaW5NZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgdGhpcy50aW1lVG9EcmFpbkFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNaW5JbmNvbWluZ01lc3NhZ2VzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRRdWV1ZU1pbkluY29taW5nTWVzc2FnZXNBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWluUXVldWVJbmNvbWluZ01lc3NhZ2VzQ291bnRBbGFybShcbiAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZXNNZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgdGhpcy5jb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRRdWV1ZU1heEluY29taW5nTWVzc2FnZXNBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWF4UXVldWVJbmNvbWluZ01lc3NhZ2VzQ291bnRBbGFybShcbiAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZXNNZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgdGhpcy5jb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBpZiAoIShpbnZva2VkRnJvbVN1cGVyID8/IGZhbHNlKSkge1xuICAgICAgLy8gaW52b2tlIG9ubHkgd2hlbiBub3QgY2FsbGVkIGZyb20gc3VwZXIgY2xhc3MsIHNvIGl0IGlzIG5vdCBjYWxsZWQgdHdpY2VcbiAgICAgIC8vIFRPRE86IGZpbmQgYSBtb3JlIGVsZWdhbnQgc29sdXRpb24gZm9yIHRoaXNcbiAgICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICAgIH1cbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIG5ldyBSb3coXG4gICAgICAgIHRoaXMuY3JlYXRlUHJvZHVjZXJBbmRDb25zdW1lclJhdGVXaWRnZXQoXG4gICAgICAgICAgSGFsZldpZHRoLFxuICAgICAgICAgIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNyZWF0ZVRpbWVUb0RyYWluV2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgKSxcbiAgICAgIG5ldyBSb3coXG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZUNvdW50V2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VBZ2VXaWRnZXQoSGFsZldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICB3aWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIG5ldyBSb3coXG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZUNvdW50V2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZUFnZVdpZGdldChUaGlyZFdpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZU1lc3NhZ2VTaXplV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVQcm9kdWNlckFuZENvbnN1bWVyUmF0ZVdpZGdldChcbiAgICAgICAgICBIYWxmV2lkdGgsXG4gICAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNyZWF0ZVRpbWVUb0RyYWluV2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiU1FTIFF1ZXVlXCIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGdvVG9MaW5rVXJsOiB0aGlzLnF1ZXVlVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTWVzc2FnZUNvdW50V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIk1lc3NhZ2UgQ291bnRcIixcbiAgICAgIGxlZnQ6IFt0aGlzLnZpc2libGVNZXNzYWdlc01ldHJpYywgdGhpcy5pbmNvbWluZ01lc3NhZ2VzTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuY291bnRBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZU1lc3NhZ2VBZ2VXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiT2xkZXN0IE1lc3NhZ2UgQWdlXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5vbGRlc3RNZXNzYWdlQWdlTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNTZWNvbmRzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuYWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVNZXNzYWdlU2l6ZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJNZXNzYWdlIFNpemVcIixcbiAgICAgIGxlZnQ6IFt0aGlzLm1lc3NhZ2VTaXplTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlUHJvZHVjZXJBbmRDb25zdW1lclJhdGVXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiUHJvZHVjZXIgdnMgQ29uc3VtZXIgKHJhdGUpXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5wcm9kdWN0aW9uUmF0ZU1ldHJpYywgdGhpcy5jb25zdW1wdGlvblJhdGVNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBSYXRlQXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVGltZVRvRHJhaW5XaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiVGltZSB0byBkcmFpblwiLFxuICAgICAgbGVmdDogW3RoaXMudGltZVRvRHJhaW5NZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc1NlY29uZHNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUXVldWVOYW1lKHF1ZXVlOiBJUXVldWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIHRyeSB0byB0YWtlIHRoZSBuYW1lIChpZiBzcGVjaWZpZWQpIGluc3RlYWQgb2YgdG9rZW5cbiAgICByZXR1cm4gKHF1ZXVlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblF1ZXVlKT8ucXVldWVOYW1lO1xuICB9XG59XG4iXX0=