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

135 lines 22.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeBuildProjectMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const CodeBuildProjectMetricFactory_1 = require("./CodeBuildProjectMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class CodeBuildProjectMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.project, fallbackConstructName: this.resolveProjectName(props.project), }); this.title = namingStrategy.resolveHumanReadableName(); this.projectUrl = scope .createAwsConsoleUrlFactory() .getCodeBuildProjectUrl(props.project.projectName); const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.durationAlarmFactory = new common_1.LatencyAlarmFactory(alarmFactory); this.errorAlarmFactory = new common_1.ErrorAlarmFactory(alarmFactory); this.durationAnnotations = []; this.errorCountAnnotations = []; this.errorRateAnnotations = []; const metricFactory = new CodeBuildProjectMetricFactory_1.CodeBuildProjectMetricFactory(scope.createMetricFactory(), props); this.buildCountMetric = metricFactory.metricBuildCount(); this.succeededBuildCountMetric = metricFactory.metricSucceededBuildCount(); this.failedBuildCountMetric = metricFactory.metricFailedBuildCount(); this.failedBuildRateMetric = metricFactory.metricFailedBuildRate(); this.durationP99InSecondsMetric = metricFactory.metricDurationP99InSeconds(); this.durationP90InSecondsMetric = metricFactory.metricDurationP90InSeconds(); this.durationP50InSecondsMetric = metricFactory.metricDurationP50InSeconds(); for (const disambiguator in props.addDurationP99Alarm) { const alarmProps = props.addDurationP99Alarm[disambiguator]; const createdAlarm = this.durationAlarmFactory.addDurationAlarm(this.durationP99InSecondsMetric, common_1.LatencyType.P99, alarmProps, disambiguator); this.durationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addDurationP90Alarm) { const alarmProps = props.addDurationP90Alarm[disambiguator]; const createdAlarm = this.durationAlarmFactory.addDurationAlarm(this.durationP90InSecondsMetric, common_1.LatencyType.P90, alarmProps, disambiguator); this.durationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addDurationP50Alarm) { const alarmProps = props.addDurationP50Alarm[disambiguator]; const createdAlarm = this.durationAlarmFactory.addDurationAlarm(this.durationP50InSecondsMetric, common_1.LatencyType.P50, alarmProps, disambiguator); this.durationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addFailedBuildCountAlarm) { const alarmProps = props.addFailedBuildCountAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.failedBuildCountMetric, common_1.ErrorType.FAILURE, alarmProps, disambiguator); this.errorCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addFailedBuildRateAlarm) { const alarmProps = props.addFailedBuildRateAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.failedBuildRateMetric, common_1.ErrorType.FAILURE, alarmProps, disambiguator); this.errorRateAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } widgets() { return [ this.createTitleWidget(), this.createBuildCountsWidget(), this.createDurationWidget(), this.createFailedBuildRateWidget(), ]; } summaryWidgets() { // TODO: verify sizes, mainly heights return this.widgets(); } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "CodeBuild Project", title: this.title, goToLinkUrl: this.projectUrl, }); } createBuildCountsWidget() { return new aws_cloudwatch_1.GraphWidget({ width: common_1.ThirdWidth, height: common_1.DefaultGraphWidgetHeight, title: "Builds", left: [ this.buildCountMetric, this.succeededBuildCountMetric, this.failedBuildCountMetric, ], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.errorCountAnnotations, }); } createDurationWidget() { return new aws_cloudwatch_1.GraphWidget({ width: common_1.ThirdWidth, height: common_1.DefaultGraphWidgetHeight, title: "Duration", left: [ this.durationP50InSecondsMetric, this.durationP90InSecondsMetric, this.durationP99InSecondsMetric, ], leftYAxis: common_1.TimeAxisSecondsFromZero, leftAnnotations: this.durationAnnotations, }); } createFailedBuildRateWidget() { return new aws_cloudwatch_1.GraphWidget({ width: common_1.ThirdWidth, height: common_1.DefaultGraphWidgetHeight, title: "Failed Builds (rate)", left: [this.failedBuildRateMetric], leftYAxis: common_1.RateAxisFromZero, leftAnnotations: this.errorRateAnnotations, }); } resolveProjectName(project) { return project.node.defaultChild?.name; } } exports.CodeBuildProjectMonitoring = CodeBuildProjectMonitoring; _a = JSII_RTTI_SYMBOL_1; CodeBuildProjectMonitoring[_a] = { fqn: "cdk-monitoring-constructs.CodeBuildProjectMonitoring", version: "9.7.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUJ1aWxkUHJvamVjdE1vbml0b3JpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtEQUlvQztBQUdwQyxtRkFHeUM7QUFDekMseUNBaUJzQjtBQUN0QiwrQ0FHeUI7QUFrQnpCLE1BQWEsMEJBQTJCLFNBQVEsbUJBQVU7SUFrQnhELFlBQVksS0FBc0IsRUFBRSxLQUFzQztRQUN4RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsT0FBTztZQUM3QixxQkFBcUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztTQUM5RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSzthQUNwQiwwQkFBMEIsRUFBRTthQUM1QixzQkFBc0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDMUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw0QkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwwQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUs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QUF3QjtZQUNoQyxLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRTtnQkFDSixJQUFJLENBQUMsZ0JBQWdCO2dCQUNyQixJQUFJLENBQUMseUJBQXlCO2dCQUM5QixJQUFJLENBQUMsc0JBQXNCO2FBQzVCO1lBQ0QsU0FBUyxFQUFFLDBCQUFpQjtZQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtTQUM1QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSw0QkFBVyxDQUFDO1lBQ3JCLEtBQUssRUFBRSxtQkFBVTtZQUNqQixNQUFNLEVBQUUsaUNBQXdCO1lBQ2hDLEtBQUssRUFBRSxVQUFVO1lBQ2pCLElBQUksRUFBRTtnQkFDSixJQUFJLENBQUMsMEJBQTBCO2dCQUMvQixJQUFJLENBQUMsMEJBQTBCO2dCQUMvQixJQUFJLENBQUMsMEJBQTBCO2FBQ2hDO1lBQ0QsU0FBUyxFQUFFLGdDQUF1QjtZQUNsQyxlQUFlLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSw0QkFBVyxDQUFDO1lBQ3JCLEtBQUssRUFBRSxtQkFBVTtZQUNqQixNQUFNLEVBQUUsaUNBQXdCO1lBQ2hDLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ2xDLFNBQVMsRUFBRSx5QkFBZ0I7WUFDM0IsZUFBZSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7U0FDM0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGtCQUFrQixDQUFDLE9BQWlCO1FBQzVDLE9BQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUEyQixFQUFFLElBQUksQ0FBQztJQUN6RCxDQUFDOztBQTlMSCxnRUErTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgQ2ZuUHJvamVjdCwgSVByb2plY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZFwiO1xuXG5pbXBvcnQge1xuICBDb2RlQnVpbGRQcm9qZWN0TWV0cmljRmFjdG9yeSxcbiAgQ29kZUJ1aWxkUHJvamVjdE1ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vQ29kZUJ1aWxkUHJvamVjdE1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIER1cmF0aW9uVGhyZXNob2xkLFxuICBFcnJvckFsYXJtRmFjdG9yeSxcbiAgRXJyb3JDb3VudFRocmVzaG9sZCxcbiAgRXJyb3JSYXRlVGhyZXNob2xkLFxuICBFcnJvclR5cGUsXG4gIExhdGVuY3lBbGFybUZhY3RvcnksXG4gIExhdGVuY3lUeXBlLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFJhdGVBeGlzRnJvbVplcm8sXG4gIFRoaXJkV2lkdGgsXG4gIFRpbWVBeGlzU2Vjb25kc0Zyb21aZXJvLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZ09wdGlvbnMgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkRHVyYXRpb25QOTlBbGFybT86IFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkRHVyYXRpb25QOTBBbGFybT86IFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkRHVyYXRpb25QNTBBbGFybT86IFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRGYWlsZWRCdWlsZENvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkRmFpbGVkQnVpbGRSYXRlQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBFcnJvclJhdGVUaHJlc2hvbGQ+O1xufVxuXG4vKipcbiAqIE1vbml0b3JpbmcgcHJvcHMgZm9yIENvZGVCdWlsZCBwcm9qZWN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgQ29kZUJ1aWxkUHJvamVjdE1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZ09wdGlvbnMge31cblxuZXhwb3J0IGNsYXNzIENvZGVCdWlsZFByb2plY3RNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb2plY3RVcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgZXJyb3JBbGFybUZhY3Rvcnk6IEVycm9yQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBkdXJhdGlvbkFsYXJtRmFjdG9yeTogTGF0ZW5jeUFsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgZHVyYXRpb25Bbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgZXJyb3JDb3VudEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBlcnJvclJhdGVBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICByZWFkb25seSBidWlsZENvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBzdWNjZWVkZWRCdWlsZENvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBmYWlsZWRCdWlsZENvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBmYWlsZWRCdWlsZFJhdGVNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGR1cmF0aW9uUDk5SW5TZWNvbmRzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBkdXJhdGlvblA5MEluU2Vjb25kc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgZHVyYXRpb25QNTBJblNlY29uZHNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IENvZGVCdWlsZFByb2plY3RNb25pdG9yaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSk7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBuYW1lZENvbnN0cnVjdDogcHJvcHMucHJvamVjdCxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogdGhpcy5yZXNvbHZlUHJvamVjdE5hbWUocHJvcHMucHJvamVjdCksXG4gICAgfSk7XG5cbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5wcm9qZWN0VXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0Q29kZUJ1aWxkUHJvamVjdFVybChwcm9wcy5wcm9qZWN0LnByb2plY3ROYW1lKTtcblxuICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLmR1cmF0aW9uQWxhcm1GYWN0b3J5ID0gbmV3IExhdGVuY3lBbGFybUZhY3RvcnkoYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLmVycm9yQWxhcm1GYWN0b3J5ID0gbmV3IEVycm9yQWxhcm1GYWN0b3J5KGFsYXJtRmFjdG9yeSk7XG5cbiAgICB0aGlzLmR1cmF0aW9uQW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmVycm9yQ291bnRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuZXJyb3JSYXRlQW5ub3RhdGlvbnMgPSBbXTtcblxuICAgIGNvbnN0IG1ldHJpY0ZhY3RvcnkgPSBuZXcgQ29kZUJ1aWxkUHJvamVjdE1ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMuYnVpbGRDb3VudE1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQnVpbGRDb3VudCgpO1xuICAgIHRoaXMuc3VjY2VlZGVkQnVpbGRDb3VudE1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljU3VjY2VlZGVkQnVpbGRDb3VudCgpO1xuICAgIHRoaXMuZmFpbGVkQnVpbGRDb3VudE1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljRmFpbGVkQnVpbGRDb3VudCgpO1xuICAgIHRoaXMuZmFpbGVkQnVpbGRSYXRlTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNGYWlsZWRCdWlsZFJhdGUoKTtcbiAgICB0aGlzLmR1cmF0aW9uUDk5SW5TZWNvbmRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljRHVyYXRpb25QOTlJblNlY29uZHMoKTtcbiAgICB0aGlzLmR1cmF0aW9uUDkwSW5TZWNvbmRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljRHVyYXRpb25QOTBJblNlY29uZHMoKTtcbiAgICB0aGlzLmR1cmF0aW9uUDUwSW5TZWNvbmRzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljRHVyYXRpb25QNTBJblNlY29uZHMoKTtcblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREdXJhdGlvblA5OUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkRHVyYXRpb25QOTlBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZHVyYXRpb25BbGFybUZhY3RvcnkuYWRkRHVyYXRpb25BbGFybShcbiAgICAgICAgdGhpcy5kdXJhdGlvblA5OUluU2Vjb25kc01ldHJpYyxcbiAgICAgICAgTGF0ZW5jeVR5cGUuUDk5LFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5kdXJhdGlvbkFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREdXJhdGlvblA5MEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkRHVyYXRpb25QOTBBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZHVyYXRpb25BbGFybUZhY3RvcnkuYWRkRHVyYXRpb25BbGFybShcbiAgICAgICAgdGhpcy5kdXJhdGlvblA5MEluU2Vjb25kc01ldHJpYyxcbiAgICAgICAgTGF0ZW5jeVR5cGUuUDkwLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5kdXJhdGlvbkFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREdXJhdGlvblA1MEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkRHVyYXRpb25QNTBBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMuZHVyYXRpb25BbGFybUZhY3RvcnkuYWRkRHVyYXRpb25BbGFybShcbiAgICAgICAgdGhpcy5kdXJhdGlvblA1MEluU2Vjb25kc01ldHJpYyxcbiAgICAgICAgTGF0ZW5jeVR5cGUuUDUwLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5kdXJhdGlvbkFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRGYWlsZWRCdWlsZENvdW50QWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRGYWlsZWRCdWlsZENvdW50QWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmVycm9yQWxhcm1GYWN0b3J5LmFkZEVycm9yQ291bnRBbGFybShcbiAgICAgICAgdGhpcy5mYWlsZWRCdWlsZENvdW50TWV0cmljLFxuICAgICAgICBFcnJvclR5cGUuRkFJTFVSRSxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZXJyb3JDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRGYWlsZWRCdWlsZFJhdGVBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZEZhaWxlZEJ1aWxkUmF0ZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5lcnJvckFsYXJtRmFjdG9yeS5hZGRFcnJvclJhdGVBbGFybShcbiAgICAgICAgdGhpcy5mYWlsZWRCdWlsZFJhdGVNZXRyaWMsXG4gICAgICAgIEVycm9yVHlwZS5GQUlMVVJFLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5lcnJvclJhdGVBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgdGhpcy5jcmVhdGVCdWlsZENvdW50c1dpZGdldCgpLFxuICAgICAgdGhpcy5jcmVhdGVEdXJhdGlvbldpZGdldCgpLFxuICAgICAgdGhpcy5jcmVhdGVGYWlsZWRCdWlsZFJhdGVXaWRnZXQoKSxcbiAgICBdO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICAvLyBUT0RPOiB2ZXJpZnkgc2l6ZXMsIG1haW5seSBoZWlnaHRzXG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0cygpO1xuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJDb2RlQnVpbGQgUHJvamVjdFwiLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5wcm9qZWN0VXJsLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQnVpbGRDb3VudHNXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aDogVGhpcmRXaWR0aCxcbiAgICAgIGhlaWdodDogRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiQnVpbGRzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMuYnVpbGRDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5zdWNjZWVkZWRCdWlsZENvdW50TWV0cmljLFxuICAgICAgICB0aGlzLmZhaWxlZEJ1aWxkQ291bnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5lcnJvckNvdW50QW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVEdXJhdGlvbldpZGdldCgpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoOiBUaGlyZFdpZHRoLFxuICAgICAgaGVpZ2h0OiBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICB0aXRsZTogXCJEdXJhdGlvblwiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLmR1cmF0aW9uUDUwSW5TZWNvbmRzTWV0cmljLFxuICAgICAgICB0aGlzLmR1cmF0aW9uUDkwSW5TZWNvbmRzTWV0cmljLFxuICAgICAgICB0aGlzLmR1cmF0aW9uUDk5SW5TZWNvbmRzTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNTZWNvbmRzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZHVyYXRpb25Bbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUZhaWxlZEJ1aWxkUmF0ZVdpZGdldCgpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoOiBUaGlyZFdpZHRoLFxuICAgICAgaGVpZ2h0OiBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICB0aXRsZTogXCJGYWlsZWQgQnVpbGRzIChyYXRlKVwiLFxuICAgICAgbGVmdDogW3RoaXMuZmFpbGVkQnVpbGRSYXRlTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogUmF0ZUF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5lcnJvclJhdGVBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUHJvamVjdE5hbWUocHJvamVjdDogSVByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiAocHJvamVjdC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Qcm9qZWN0KT8ubmFtZTtcbiAgfVxufVxuIl19