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

122 lines 18.4 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.LogMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const CloudWatchLogsMetricFactory_1 = require("./CloudWatchLogsMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); const DefaultLimit = 10; /** * Monitors a CloudWatch log group for various patterns. */ class LogMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope); this.logGroupName = props.logGroupName; this.logGroupUrl = scope .createAwsConsoleUrlFactory() .getCloudWatchLogGroupUrl(props.logGroupName); this.title = props.title; this.pattern = props.pattern; this.filterExpressions = props.filterExpressions; this.limit = props.limit ?? DefaultLimit; const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: this.logGroupName, }); this.alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory); this.usageAnnotations = []; const metricFactory = new CloudWatchLogsMetricFactory_1.CloudWatchLogsMetricFactory(scope.createMetricFactory(), props); this.incomingLogEventsMetric = metricFactory.metricIncomingLogEvents(); for (const disambiguator in props.addMinIncomingLogsAlarm) { const alarmProps = props.addMinIncomingLogsAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMinUsageCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator); this.usageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMaxIncomingLogsAlarm) { const alarmProps = props.addMaxIncomingLogsAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMaxCountAlarm(this.incomingLogEventsMetric, alarmProps, disambiguator); this.usageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return [ this.createTitleWidget(), this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultSummaryWidgetHeight), ]; } widgets() { const filterStatements = []; if (this.pattern) { filterStatements.push(`filter @message like /${this.pattern}/`); } if (this.filterExpressions) { for (const expression of this.filterExpressions) { if (expression) { filterStatements.push(`filter ${expression}`); } } } if (filterStatements.length > 0) { const height = this.resolveRecommendedHeight(this.limit); return [ this.createTitleWidget(), // Log Query Results new aws_cloudwatch_1.LogQueryWidget({ logGroupNames: [this.logGroupName], height, width: common_1.ThreeQuartersWidth, title: this.title ?? `Find ${this.pattern} (limit = ${this.limit})`, /** * https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html */ queryLines: [ "fields @timestamp, @logStream, @message", ...filterStatements, "sort @timestamp desc", `limit ${this.limit}`, ], }), this.createIncomingLogsWidget(common_1.QuarterWidth, height), ]; } else { return [ this.createTitleWidget(), this.createIncomingLogsWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight), ]; } } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Log Group", title: this.logGroupName, goToLinkUrl: this.logGroupUrl, }); } createIncomingLogsWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Incoming logs", left: [this.incomingLogEventsMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.usageAnnotations, }); } resolveRecommendedHeight(numRows) { const heightPerLine = 1; const recommendedHeight = heightPerLine * numRows; return Math.max(recommendedHeight, common_1.DefaultLogWidgetHeight); } } exports.LogMonitoring = LogMonitoring; _a = JSII_RTTI_SYMBOL_1; LogMonitoring[_a] = { fqn: "cdk-monitoring-constructs.LogMonitoring", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nTW9uaXRvcmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkxvZ01vbml0b3JpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFLb0M7QUFFcEMsK0VBR3VDO0FBQ3ZDLHlDQWdCc0I7QUFDdEIsK0NBR3lCO0FBRXpCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQXNDeEI7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxtQkFBVTtJQWdCM0MsWUFBWSxLQUFzQixFQUFFLEtBQXlCO1FBQzNELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7YUFDckIsMEJBQTBCLEVBQUU7YUFDNUIsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDbEQsR0FBRyxLQUFLO1lBQ1IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3pDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxn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U0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFO3FCQUN0QjtpQkFDRixDQUFDO2dCQUVGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBWSxFQUFFLE1BQU0sQ0FBQzthQUNwRCxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO2dCQUNMLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFTLEVBQUUsaUNBQXdCLENBQUM7YUFDbkUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLGtDQUFzQixDQUFDO1lBQ2hDLE1BQU0sRUFBRSxXQUFXO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3BELE9BQU8sSUFBSSw0QkFBVyxDQUFDO1lBQ3JCLEtBQUs7WUFDTCxNQUFNO1lBQ04sS0FBSyxFQUFFLGVBQWU7WUFDdEIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3BDLFNBQVMsRUFBRSwwQkFBaUI7WUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLHdCQUF3QixDQUFDLE9BQWU7UUFDaEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsK0JBQXNCLENBQUMsQ0FBQztJQUM3RCxDQUFDOztBQXRKSCxzQ0F1SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG4gIExvZ1F1ZXJ5V2lkZ2V0LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcblxuaW1wb3J0IHtcbiAgQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5LFxuICBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vQ2xvdWRXYXRjaExvZ3NNZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBbGFybUZhY3RvcnksXG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRMb2dXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBGdWxsV2lkdGgsXG4gIE1heFVzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1pblVzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVhcnRlcldpZHRoLFxuICBUaHJlZVF1YXJ0ZXJzV2lkdGgsXG4gIFVzYWdlQWxhcm1GYWN0b3J5LFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuY29uc3QgRGVmYXVsdExpbWl0ID0gMTA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgICBDbG91ZFdhdGNoTG9nc01ldHJpY0ZhY3RvcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBXaWRnZXQgdGl0bGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZCB0aXRsZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBhbmQgbGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXR0ZXJuIHRvIGZpbHRlciBgQG1lc3NhZ2VgIGZpZWxkLCBlLmcuIFwiRVJST1JcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGV4cHJlc3Npb25zIHRvIGFkZC5cbiAgICogQGV4YW1wbGVcbiAgICogZmlsdGVyRXhwcmVzc2lvbnMgPSBbYGxldmVsID0gXCJFUlJPUlwiYF1cbiAgICogLy8gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcXVlcnkgYXNcbiAgICogfCBmaWx0ZXIgbGV2ZWwgPSBcIkVSUk9SXCJcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbG9ncy9DV0xfUXVlcnlTeW50YXgtRmlsdGVyLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlckV4cHJlc3Npb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGxvZyBtZXNzYWdlcyB0byBzZWFyY2ggZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDEwXG4gICAqL1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcblxuICByZWFkb25seSBhZGRNaW5JbmNvbWluZ0xvZ3NBbGFybT86IFJlY29yZDxzdHJpbmcsIE1pblVzYWdlQ291bnRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRNYXhJbmNvbWluZ0xvZ3NBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heFVzYWdlQ291bnRUaHJlc2hvbGQ+O1xufVxuXG4vKipcbiAqIE1vbml0b3JzIGEgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgZm9yIHZhcmlvdXMgcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2dHcm91cFVybD86IHN0cmluZztcblxuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICByZWFkb25seSBwYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSBmaWx0ZXJFeHByZXNzaW9ucz86IHN0cmluZ1tdO1xuICByZWFkb25seSBsaW1pdDogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGFsYXJtRmFjdG9yeTogQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSB1c2FnZUFsYXJtRmFjdG9yeTogVXNhZ2VBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IGluY29taW5nTG9nRXZlbnRzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIHJlYWRvbmx5IHVzYWdlQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IExvZ01vbml0b3JpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIHRoaXMubG9nR3JvdXBOYW1lID0gcHJvcHMubG9nR3JvdXBOYW1lO1xuICAgIHRoaXMubG9nR3JvdXBVcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRDbG91ZFdhdGNoTG9nR3JvdXBVcmwocHJvcHMubG9nR3JvdXBOYW1lKTtcblxuICAgIHRoaXMudGl0bGUgPSBwcm9wcy50aXRsZTtcblxuICAgIHRoaXMucGF0dGVybiA9IHByb3BzLnBhdHRlcm47XG4gICAgdGhpcy5maWx0ZXJFeHByZXNzaW9ucyA9IHByb3BzLmZpbHRlckV4cHJlc3Npb25zO1xuICAgIHRoaXMubGltaXQgPSBwcm9wcy5saW1pdCA/PyBEZWZhdWx0TGltaXQ7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IHRoaXMubG9nR3JvdXBOYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIHRoaXMudXNhZ2VBbGFybUZhY3RvcnkgPSBuZXcgVXNhZ2VBbGFybUZhY3RvcnkodGhpcy5hbGFybUZhY3RvcnkpO1xuXG4gICAgdGhpcy51c2FnZUFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IENsb3VkV2F0Y2hMb2dzTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG4gICAgdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdMb2dFdmVudHMoKTtcblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRNaW5JbmNvbWluZ0xvZ3NBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1pbkluY29taW5nTG9nc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNaW5Vc2FnZUNvdW50QWxhcm0oXG4gICAgICAgIHRoaXMuaW5jb21pbmdMb2dFdmVudHNNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy51c2FnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRNYXhJbmNvbWluZ0xvZ3NBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZE1heEluY29taW5nTG9nc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy51c2FnZUFsYXJtRmFjdG9yeS5hZGRNYXhDb3VudEFsYXJtKFxuICAgICAgICB0aGlzLmluY29taW5nTG9nRXZlbnRzTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMudXNhZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIHRoaXMuY3JlYXRlSW5jb21pbmdMb2dzV2lkZ2V0KEZ1bGxXaWR0aCwgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQpLFxuICAgIF07XG4gIH1cblxuICB3aWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgY29uc3QgZmlsdGVyU3RhdGVtZW50czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm4pIHtcbiAgICAgIGZpbHRlclN0YXRlbWVudHMucHVzaChgZmlsdGVyIEBtZXNzYWdlIGxpa2UgLyR7dGhpcy5wYXR0ZXJufS9gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJFeHByZXNzaW9ucykge1xuICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMuZmlsdGVyRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmaWx0ZXJTdGF0ZW1lbnRzLnB1c2goYGZpbHRlciAke2V4cHJlc3Npb259YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnJlc29sdmVSZWNvbW1lbmRlZEhlaWdodCh0aGlzLmxpbWl0KTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuXG4gICAgICAgIC8vIExvZyBRdWVyeSBSZXN1bHRzXG4gICAgICAgIG5ldyBMb2dRdWVyeVdpZGdldCh7XG4gICAgICAgICAgbG9nR3JvdXBOYW1lczogW3RoaXMubG9nR3JvdXBOYW1lXSxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IFRocmVlUXVhcnRlcnNXaWR0aCxcbiAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSA/PyBgRmluZCAke3RoaXMucGF0dGVybn0gKGxpbWl0ID0gJHt0aGlzLmxpbWl0fSlgLFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9sb2dzL0NXTF9RdWVyeVN5bnRheC5odG1sXG4gICAgICAgICAgICovXG4gICAgICAgICAgcXVlcnlMaW5lczogW1xuICAgICAgICAgICAgXCJmaWVsZHMgQHRpbWVzdGFtcCwgQGxvZ1N0cmVhbSwgQG1lc3NhZ2VcIixcbiAgICAgICAgICAgIC4uLmZpbHRlclN0YXRlbWVudHMsXG4gICAgICAgICAgICBcInNvcnQgQHRpbWVzdGFtcCBkZXNjXCIsXG4gICAgICAgICAgICBgbGltaXQgJHt0aGlzLmxpbWl0fWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0xvZ3NXaWRnZXQoUXVhcnRlcldpZHRoLCBoZWlnaHQpLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgICB0aGlzLmNyZWF0ZUluY29taW5nTG9nc1dpZGdldChGdWxsV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiTG9nIEdyb3VwXCIsXG4gICAgICB0aXRsZTogdGhpcy5sb2dHcm91cE5hbWUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5sb2dHcm91cFVybCxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUluY29taW5nTG9nc1dpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJbmNvbWluZyBsb2dzXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5pbmNvbWluZ0xvZ0V2ZW50c01ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnVzYWdlQW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVJlY29tbWVuZGVkSGVpZ2h0KG51bVJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IGhlaWdodFBlckxpbmUgPSAxO1xuICAgIGNvbnN0IHJlY29tbWVuZGVkSGVpZ2h0ID0gaGVpZ2h0UGVyTGluZSAqIG51bVJvd3M7XG4gICAgcmV0dXJuIE1hdGgubWF4KHJlY29tbWVuZGVkSGVpZ2h0LCBEZWZhdWx0TG9nV2lkZ2V0SGVpZ2h0KTtcbiAgfVxufVxuIl19