cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
145 lines • 21.5 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EC2MetricFactory = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const common_1 = require("../../common");
const EC2Namespace = "AWS/EC2";
/**
* Creates a single metric for the whole ASG.
*/
class AutoScalingGroupStrategy {
constructor(autoScalingGroup) {
this.autoScalingGroup = autoScalingGroup;
}
createMetrics(metricFactory, metricName, statistic, region, account) {
return [
metricFactory.createMetric(metricName, statistic, undefined, resolveDimensions(this.autoScalingGroup, undefined), undefined, EC2Namespace, undefined, region, account),
];
}
}
/**
* Creates multiple metrics (one for each instance) with an optional ASG filter.
*/
class SelectedInstancesStrategy {
constructor(instanceIds, autoScalingGroup) {
this.instanceIds = instanceIds;
this.autoScalingGroup = autoScalingGroup;
}
createMetrics(metricFactory, metricName, statistic, region, account) {
return this.instanceIds.map((instanceId) => {
return metricFactory.createMetric(metricName, statistic, `${metricName} (${instanceId})`, resolveDimensions(this.autoScalingGroup, instanceId), undefined, EC2Namespace, undefined, region, account);
});
}
}
/**
* Creates a single metric search expression for all instances.
*/
class AllInstancesStrategy {
createMetrics(metricFactory, metricName, statistic, region, account) {
return [
metricFactory.createMetricSearch(`MetricName="${metricName}"`, { InstanceId: undefined }, statistic, EC2Namespace, undefined, undefined, region, account),
];
}
}
function resolveDimensions(autoScalingGroup, instanceId) {
const dimensions = {};
if (autoScalingGroup) {
dimensions.AutoScalingGroupName = autoScalingGroup.autoScalingGroupName;
}
if (instanceId) {
dimensions.InstanceId = instanceId;
}
return dimensions;
}
function resolveStrategy(props) {
if (props.instanceIds) {
// instance filter + optional ASG
return new SelectedInstancesStrategy(props.instanceIds, props.autoScalingGroup);
}
else if (props.autoScalingGroup) {
// ASG only
return new AutoScalingGroupStrategy(props.autoScalingGroup);
}
else {
// all instances
return new AllInstancesStrategy();
}
}
class EC2MetricFactory extends common_1.BaseMetricFactory {
constructor(metricFactory, props) {
super(metricFactory, props);
this.strategy = resolveStrategy(props);
}
/**
* The percentage of allocated EC2 compute units that are currently in use on the instance.
* This metric identifies the processing power required to run an application on a selected instance.
* Depending on the instance type, tools in your operating system can show a lower percentage than
* CloudWatch when the instance is not allocated a full processor core.
*/
metricAverageCpuUtilisationPercent() {
return this.metric("CPUUtilization", common_1.MetricStatistic.AVERAGE);
}
/**
* Bytes read from all instance store volumes available to the instance.
* This metric is used to determine the volume of the data the application reads from the hard disk of the instance.
* This can be used to determine the speed of the application.
*/
metricAverageDiskReadBytes() {
return this.createDiskMetrics("ReadBytes", common_1.MetricStatistic.AVERAGE);
}
/**
* Bytes written to all instance store volumes available to the instance.
* This metric is used to determine the volume of the data the application writes onto the hard disk of the instance.
* This can be used to determine the speed of the application.
*/
metricAverageDiskWriteBytes() {
return this.createDiskMetrics("WriteBytes", common_1.MetricStatistic.AVERAGE);
}
/**
* Completed read operations from all instance store volumes available to the instance in a specified period of time.
*/
metricAverageDiskReadOps() {
return this.createDiskMetrics("ReadOps", common_1.MetricStatistic.AVERAGE);
}
/**
* Completed write operations to all instance store volumes available to the instance in a specified period of time.
*/
metricAverageDiskWriteOps() {
return this.createDiskMetrics("WriteOps", common_1.MetricStatistic.AVERAGE);
}
/**
* The number of bytes received on all network interfaces by the instance.
* This metric identifies the volume of incoming network traffic to a single instance.
*/
metricAverageNetworkInRateBytes() {
return this.metric("NetworkIn", common_1.MetricStatistic.AVERAGE);
}
/**
* The number of bytes sent out on all network interfaces by the instance.
* This metric identifies the volume of outgoing network traffic from a single instance.
*/
metricAverageNetworkOutRateBytes() {
return this.metric("NetworkOut", common_1.MetricStatistic.AVERAGE);
}
createDiskMetrics(metricName, statistic) {
const classicMetrics = this.strategy.createMetrics(this.metricFactory, `Disk${metricName}`, statistic);
const ebsMetrics = this.strategy.createMetrics(this.metricFactory, `EBS${metricName}`, statistic);
return classicMetrics.map((classic, i) => {
const ebs = ebsMetrics[i];
const usingMetrics = {};
const classicId = `${metricName.toLowerCase()}_classic_${i}`;
const ebsId = `${metricName.toLowerCase()}_ebs_${i}`;
usingMetrics[classicId] = classic;
usingMetrics[ebsId] = ebs;
return this.metricFactory.createMetricMath(`AVG(REMOVE_EMPTY([${classicId}, ${ebsId}]))`, usingMetrics, `Disk${metricName}`);
});
}
metric(metricName, statistic) {
return this.strategy.createMetrics(this.metricFactory, metricName, statistic);
}
}
exports.EC2MetricFactory = EC2MetricFactory;
_a = JSII_RTTI_SYMBOL_1;
EC2MetricFactory[_a] = { fqn: "cdk-monitoring-constructs.EC2MetricFactory", version: "9.7.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUMyTWV0cmljRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVDMk1ldHJpY0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSx5Q0FLc0I7QUFFdEIsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBWS9COztHQUVHO0FBQ0gsTUFBTSx3QkFBd0I7SUFHNUIsWUFBWSxnQkFBbUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQ1gsYUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsU0FBMEIsRUFDMUIsTUFBZSxFQUNmLE9BQWdCO1FBRWhCLE9BQU87WUFDTCxhQUFhLENBQUMsWUFBWSxDQUN4QixVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLEVBQ25ELFNBQVMsRUFDVCxZQUFZLEVBQ1osU0FBUyxFQUNULE1BQU0sRUFDTixPQUFPLENBQ1I7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLHlCQUF5QjtJQUk3QixZQUFZLFdBQXFCLEVBQUUsZ0JBQW9DO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQsYUFBYSxDQUNYLGFBQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLFNBQTBCLEVBQzFCLE1BQWUsRUFDZixPQUFnQjtRQUVoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDekMsT0FBTyxhQUFhLENBQUMsWUFBWSxDQUMvQixVQUFVLEVBQ1YsU0FBUyxFQUNULEdBQUcsVUFBVSxLQUFLLFVBQVUsR0FBRyxFQUMvQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JB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Q0FDVixDQUFDO0lBQ0osQ0FBQzs7QUFwR0gsNENBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUF1dG9TY2FsaW5nR3JvdXAgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBEaW1lbnNpb25zTWFwLCBJTWV0cmljIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIEJhc2VNZXRyaWNGYWN0b3J5LFxuICBCYXNlTWV0cmljRmFjdG9yeVByb3BzLFxuICBNZXRyaWNGYWN0b3J5LFxuICBNZXRyaWNTdGF0aXN0aWMsXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgRUMyTmFtZXNwYWNlID0gXCJBV1MvRUMyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIGNyZWF0ZU1ldHJpY3MoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGFjY291bnQ/OiBzdHJpbmcsXG4gICk6IElNZXRyaWNbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIG1ldHJpYyBmb3IgdGhlIHdob2xlIEFTRy5cbiAqL1xuY2xhc3MgQXV0b1NjYWxpbmdHcm91cFN0cmF0ZWd5IGltcGxlbWVudHMgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIHByb3RlY3RlZCBhdXRvU2NhbGluZ0dyb3VwOiBJQXV0b1NjYWxpbmdHcm91cDtcblxuICBjb25zdHJ1Y3RvcihhdXRvU2NhbGluZ0dyb3VwOiBJQXV0b1NjYWxpbmdHcm91cCkge1xuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IGF1dG9TY2FsaW5nR3JvdXA7XG4gIH1cblxuICBjcmVhdGVNZXRyaWNzKFxuICAgIG1ldHJpY0ZhY3Rvcnk6IE1ldHJpY0ZhY3RvcnksXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIHJlZ2lvbj86IHN0cmluZyxcbiAgICBhY2NvdW50Pzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWMoXG4gICAgICAgIG1ldHJpY05hbWUsXG4gICAgICAgIHN0YXRpc3RpYyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZXNvbHZlRGltZW5zaW9ucyh0aGlzLmF1dG9TY2FsaW5nR3JvdXAsIHVuZGVmaW5lZCksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgRUMyTmFtZXNwYWNlLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICksXG4gICAgXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgbXVsdGlwbGUgbWV0cmljcyAob25lIGZvciBlYWNoIGluc3RhbmNlKSB3aXRoIGFuIG9wdGlvbmFsIEFTRyBmaWx0ZXIuXG4gKi9cbmNsYXNzIFNlbGVjdGVkSW5zdGFuY2VzU3RyYXRlZ3kgaW1wbGVtZW50cyBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIGluc3RhbmNlSWRzOiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIGF1dG9TY2FsaW5nR3JvdXA/OiBJQXV0b1NjYWxpbmdHcm91cDtcblxuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUlkczogc3RyaW5nW10sIGF1dG9TY2FsaW5nR3JvdXA/OiBJQXV0b1NjYWxpbmdHcm91cCkge1xuICAgIHRoaXMuaW5zdGFuY2VJZHMgPSBpbnN0YW5jZUlkcztcbiAgICB0aGlzLmF1dG9TY2FsaW5nR3JvdXAgPSBhdXRvU2NhbGluZ0dyb3VwO1xuICB9XG5cbiAgY3JlYXRlTWV0cmljcyhcbiAgICBtZXRyaWNGYWN0b3J5OiBNZXRyaWNGYWN0b3J5LFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYyxcbiAgICByZWdpb24/OiBzdHJpbmcsXG4gICAgYWNjb3VudD86IHN0cmluZyxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VJZHMubWFwKChpbnN0YW5jZUlkKSA9PiB7XG4gICAgICByZXR1cm4gbWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWMoXG4gICAgICAgIG1ldHJpY05hbWUsXG4gICAgICAgIHN0YXRpc3RpYyxcbiAgICAgICAgYCR7bWV0cmljTmFtZX0gKCR7aW5zdGFuY2VJZH0pYCxcbiAgICAgICAgcmVzb2x2ZURpbWVuc2lvbnModGhpcy5hdXRvU2NhbGluZ0dyb3VwLCBpbnN0YW5jZUlkKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBFQzJOYW1lc3BhY2UsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBhY2NvdW50LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgbWV0cmljIHNlYXJjaCBleHByZXNzaW9uIGZvciBhbGwgaW5zdGFuY2VzLlxuICovXG5jbGFzcyBBbGxJbnN0YW5jZXNTdHJhdGVneSBpbXBsZW1lbnRzIElFQzJNZXRyaWNGYWN0b3J5U3RyYXRlZ3kge1xuICBjcmVhdGVNZXRyaWNzKFxuICAgIG1ldHJpY0ZhY3Rvcnk6IE1ldHJpY0ZhY3RvcnksXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIHJlZ2lvbj86IHN0cmluZyxcbiAgICBhY2NvdW50Pzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWNTZWFyY2goXG4gICAgICAgIGBNZXRyaWNOYW1lPVwiJHttZXRyaWNOYW1lfVwiYCxcbiAgICAgICAgeyBJbnN0YW5jZUlkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmcgfSxcbiAgICAgICAgc3RhdGlzdGljLFxuICAgICAgICBFQzJOYW1lc3BhY2UsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIGFjY291bnQsXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpbWVuc2lvbnMoXG4gIGF1dG9TY2FsaW5nR3JvdXA/OiBJQXV0b1NjYWxpbmdHcm91cCxcbiAgaW5zdGFuY2VJZD86IHN0cmluZyxcbik6IERpbWVuc2lvbnNNYXAge1xuICBjb25zdCBkaW1lbnNpb25zOiBEaW1lbnNpb25zTWFwID0ge307XG4gIGlmIChhdXRvU2NhbGluZ0dyb3VwKSB7XG4gICAgZGltZW5zaW9ucy5BdXRvU2NhbGluZ0dyb3VwTmFtZSA9IGF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWU7XG4gIH1cbiAgaWYgKGluc3RhbmNlSWQpIHtcbiAgICBkaW1lbnNpb25zLkluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICB9XG4gIHJldHVybiBkaW1lbnNpb25zO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3RyYXRlZ3koXG4gIHByb3BzOiBFQzJNZXRyaWNGYWN0b3J5UHJvcHMsXG4pOiBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgaWYgKHByb3BzLmluc3RhbmNlSWRzKSB7XG4gICAgLy8gaW5zdGFuY2UgZmlsdGVyICsgb3B0aW9uYWwgQVNHXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RlZEluc3RhbmNlc1N0cmF0ZWd5KFxuICAgICAgcHJvcHMuaW5zdGFuY2VJZHMsXG4gICAgICBwcm9wcy5hdXRvU2NhbGluZ0dyb3VwLFxuICAgICk7XG4gIH0gZWxzZSBpZiAocHJvcHMuYXV0b1NjYWxpbmdHcm91cCkge1xuICAgIC8vIEFTRyBvbmx5XG4gICAgcmV0dXJuIG5ldyBBdXRvU2NhbGluZ0dyb3VwU3RyYXRlZ3kocHJvcHMuYXV0b1NjYWxpbmdHcm91cCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYWxsIGluc3RhbmNlc1xuICAgIHJldHVybiBuZXcgQWxsSW5zdGFuY2VzU3RyYXRlZ3koKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVDMk1ldHJpY0ZhY3RvcnlQcm9wcyBleHRlbmRzIEJhc2VNZXRyaWNGYWN0b3J5UHJvcHMge1xuICAvKipcbiAgICogQXV0by1TY2FsaW5nIEdyb3VwIHRvIG1vbml0b3IuXG4gICAqIEBkZWZhdWx0IC0gbm8gQXV0by1TY2FsaW5nIEdyb3VwIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b1NjYWxpbmdHcm91cD86IElBdXRvU2NhbGluZ0dyb3VwO1xuICAvKipcbiAgICogU2VsZWN0ZWQgSURzIG9mIEVDMiBpbnN0YW5jZXMgdG8gbW9uaXRvci5cbiAgICogQGRlZmF1bHQgLSBubyBpbnN0YW5jZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlSWRzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBFQzJNZXRyaWNGYWN0b3J5IGV4dGVuZHMgQmFzZU1ldHJpY0ZhY3Rvcnk8RUMyTWV0cmljRmFjdG9yeVByb3BzPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdHJhdGVneTogSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihtZXRyaWNGYWN0b3J5OiBNZXRyaWNGYWN0b3J5LCBwcm9wczogRUMyTWV0cmljRmFjdG9yeVByb3BzKSB7XG4gICAgc3VwZXIobWV0cmljRmFjdG9yeSwgcHJvcHMpO1xuXG4gICAgdGhpcy5zdHJhdGVneSA9IHJlc29sdmVTdHJhdGVneShwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgYWxsb2NhdGVkIEVDMiBjb21wdXRlIHVuaXRzIHRoYXQgYXJlIGN1cnJlbnRseSBpbiB1c2Ugb24gdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBwcm9jZXNzaW5nIHBvd2VyIHJlcXVpcmVkIHRvIHJ1biBhbiBhcHBsaWNhdGlvbiBvbiBhIHNlbGVjdGVkIGluc3RhbmNlLlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIGluc3RhbmNlIHR5cGUsIHRvb2xzIGluIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBjYW4gc2hvdyBhIGxvd2VyIHBlcmNlbnRhZ2UgdGhhblxuICAgKiBDbG91ZFdhdGNoIHdoZW4gdGhlIGluc3RhbmNlIGlzIG5vdCBhbGxvY2F0ZWQgYSBmdWxsIHByb2Nlc3NvciBjb3JlLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZUNwdVV0aWxpc2F0aW9uUGVyY2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDUFVVdGlsaXphdGlvblwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogQnl0ZXMgcmVhZCBmcm9tIGFsbCBpbnN0YW5jZSBzdG9yZSB2b2x1bWVzIGF2YWlsYWJsZSB0byB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgbWV0cmljIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2b2x1bWUgb2YgdGhlIGRhdGEgdGhlIGFwcGxpY2F0aW9uIHJlYWRzIGZyb20gdGhlIGhhcmQgZGlzayBvZiB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzcGVlZCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlRGlza1JlYWRCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVEaXNrTWV0cmljcyhcIlJlYWRCeXRlc1wiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogQnl0ZXMgd3JpdHRlbiB0byBhbGwgaW5zdGFuY2Ugc3RvcmUgdm9sdW1lcyBhdmFpbGFibGUgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIG1ldHJpYyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdm9sdW1lIG9mIHRoZSBkYXRhIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXMgb250byB0aGUgaGFyZCBkaXNrIG9mIHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNwZWVkIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VEaXNrV3JpdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVEaXNrTWV0cmljcyhcIldyaXRlQnl0ZXNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlZCByZWFkIG9wZXJhdGlvbnMgZnJvbSBhbGwgaW5zdGFuY2Ugc3RvcmUgdm9sdW1lcyBhdmFpbGFibGUgdG8gdGhlIGluc3RhbmNlIGluIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZURpc2tSZWFkT3BzKCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZURpc2tNZXRyaWNzKFwiUmVhZE9wc1wiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGVkIHdyaXRlIG9wZXJhdGlvbnMgdG8gYWxsIGluc3RhbmNlIHN0b3JlIHZvbHVtZXMgYXZhaWxhYmxlIHRvIHRoZSBpbnN0YW5jZSBpbiBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VEaXNrV3JpdGVPcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGlza01ldHJpY3MoXCJXcml0ZU9wc1wiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIGluY29taW5nIG5ldHdvcmsgdHJhZmZpYyB0byBhIHNpbmdsZSBpbnN0YW5jZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VOZXR3b3JrSW5SYXRlQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTmV0d29ya0luXCIsIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgb3V0IG9uIGFsbCBuZXR3b3JrIGludGVyZmFjZXMgYnkgdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIG1ldHJpYyBpZGVudGlmaWVzIHRoZSB2b2x1bWUgb2Ygb3V0Z29pbmcgbmV0d29yayB0cmFmZmljIGZyb20gYSBzaW5nbGUgaW5zdGFuY2UuXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlTmV0d29ya091dFJhdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrT3V0XCIsIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGlza01ldHJpY3MobWV0cmljTmFtZTogc3RyaW5nLCBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYykge1xuICAgIGNvbnN0IGNsYXNzaWNNZXRyaWNzID0gdGhpcy5zdHJhdGVneS5jcmVhdGVNZXRyaWNzKFxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5LFxuICAgICAgYERpc2ske21ldHJpY05hbWV9YCxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICApO1xuICAgIGNvbnN0IGVic01ldHJpY3MgPSB0aGlzLnN0cmF0ZWd5LmNyZWF0ZU1ldHJpY3MoXG4gICAgICB0aGlzLm1ldHJpY0ZhY3RvcnksXG4gICAgICBgRUJTJHttZXRyaWNOYW1lfWAsXG4gICAgICBzdGF0aXN0aWMsXG4gICAgKTtcblxuICAgIHJldHVybiBjbGFzc2ljTWV0cmljcy5tYXAoKGNsYXNzaWMsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVicyA9IGVic01ldHJpY3NbaV07XG4gICAgICBjb25zdCB1c2luZ01ldHJpY3M6IFJlY29yZDxzdHJpbmcsIElNZXRyaWM+ID0ge307XG4gICAgICBjb25zdCBjbGFzc2ljSWQgPSBgJHttZXRyaWNOYW1lLnRvTG93ZXJDYXNlKCl9X2NsYXNzaWNfJHtpfWA7XG4gICAgICBjb25zdCBlYnNJZCA9IGAke21ldHJpY05hbWUudG9Mb3dlckNhc2UoKX1fZWJzXyR7aX1gO1xuICAgICAgdXNpbmdNZXRyaWNzW2NsYXNzaWNJZF0gPSBjbGFzc2ljO1xuICAgICAgdXNpbmdNZXRyaWNzW2Vic0lkXSA9IGVicztcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgICAgYEFWRyhSRU1PVkVfRU1QVFkoWyR7Y2xhc3NpY0lkfSwgJHtlYnNJZH1dKSlgLFxuICAgICAgICB1c2luZ01ldHJpY3MsXG4gICAgICAgIGBEaXNrJHttZXRyaWNOYW1lfWAsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYykge1xuICAgIHJldHVybiB0aGlzLnN0cmF0ZWd5LmNyZWF0ZU1ldHJpY3MoXG4gICAgICB0aGlzLm1ldHJpY0ZhY3RvcnksXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgc3RhdGlzdGljLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==