@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
191 lines • 25 kB
JavaScript
import { Pipe } from '@angular/core';
import { aggregationType as AggregationTypeEnum } from '@c8y/client';
import * as i0 from "@angular/core";
/**
* A pipe that adjusts the aggregated time range based on the aggregation type.
*
* ```html
* '9:00' | adjustAggregatedTimeRange: config.aggregation (e.g.:HOURLY)
* ```
* The output will be '9:00-10:00'.
*/
export class AdjustAggregatedTimeRangePipe {
/**
* Transforms the input time based on the aggregation type.
* @param inputTime The input time string.
* @param aggregationType The type of aggregation (optional).
* @returns The transformed time string.
*/
transform(inputTime, aggregationType) {
if (!aggregationType) {
return inputTime;
}
if (aggregationType === AggregationTypeEnum.DAILY) {
return '';
}
const date = this.createDateFromInput(inputTime);
const isTwelveHoursFormat = this.isTwelveHoursFormat(inputTime);
switch (aggregationType) {
case AggregationTypeEnum.HOURLY:
return this.getHourlyTimeRange(date, isTwelveHoursFormat);
case AggregationTypeEnum.MINUTELY:
return this.getMinutelyTimeRange(date, isTwelveHoursFormat);
default:
throw new Error('Unsupported aggregation type');
}
}
/**
* Creates a date object from the input time string.
* @param inputTime The input time string.
* @returns The created Date object.
*/
createDateFromInput(inputTime) {
const defaultDate = '1970-01-01 ';
const isPM = /PM/i.test(inputTime);
const cleanedTime = inputTime.replace(/AM|PM/i, '').trim();
this.validateTimeFormat(cleanedTime, inputTime);
const dateTimeString = `${defaultDate}${cleanedTime}`;
const date = new Date(dateTimeString);
if (isNaN(date.getTime())) {
throw new Error('Invalid input time');
}
return this.adjustForPMTime(date, isPM);
}
/**
* Validates if the time string matches the required format and has valid values.
* @param time The time string to validate.
* @param originalInput The original input string (including AM/PM if present).
* @throws Error if the time format is invalid or values are out of range.
*/
validateTimeFormat(time, originalInput) {
const parts = time.split(':');
this.validateTimeParts(parts);
const [hoursStr, minutesStr, secondsStr] = parts;
this.validateTimeDigits(hoursStr, minutesStr, secondsStr);
const { hours, minutes, seconds } = this.parseTimeComponents(hoursStr, minutesStr, secondsStr);
this.validateTimeRanges(hours, minutes, seconds);
this.validateTimeFormat24Hour(hours, originalInput);
}
validateTimeParts(parts) {
if (parts.length < 2 || parts.length > 3) {
throw new Error('Invalid input time');
}
}
validateTimeDigits(hoursStr, minutesStr, secondsStr) {
if (!this.isValidNumberString(hoursStr) ||
!this.isValidNumberString(minutesStr) ||
(secondsStr !== undefined && !this.isValidNumberString(secondsStr))) {
throw new Error('Invalid input time');
}
}
parseTimeComponents(hoursStr, minutesStr, secondsStr) {
return {
hours: Number(hoursStr),
minutes: Number(minutesStr),
seconds: secondsStr ? Number(secondsStr) : 0
};
}
validateTimeRanges(hours, minutes, seconds) {
if (hours > 23 || hours < 0 || minutes > 59 || minutes < 0 || seconds > 59 || seconds < 0) {
throw new Error('Invalid input time');
}
}
validateTimeFormat24Hour(hours, originalInput) {
if (hours > 12 && this.hasAmPm(originalInput)) {
throw new Error('Invalid input time');
}
}
/**
* Checks if string contains only digits and is 1-2 characters long.
* @param value String to check
* @returns boolean indicating if string is valid
*/
isValidNumberString(value) {
return (value.length > 0 &&
value.length <= 2 &&
value.split('').every(char => char >= '0' && char <= '9'));
}
/**
* Checks if the input time has AM/PM markers.
* @param input The input time string to check.
* @returns boolean indicating if the input contains AM/PM.
*/
hasAmPm(input) {
return /AM|PM/i.test(input);
}
/**
* Adjusts the date for PM times by adding 12 hours when necessary.
* @param date The date object to adjust.
* @param isPM Boolean indicating if the time is PM.
* @returns The adjusted Date object.
*/
adjustForPMTime(date, isPM) {
const hours = date.getHours();
if (isPM && hours < 12) {
date.setHours(hours + 12);
}
else if (!isPM && hours === 12) {
date.setHours(0);
}
return date;
}
/**
* Checks if the input time is in twelve hours format.
* @param inputTime The input time string.
* @returns True if the input time is in twelve hours format, false otherwise.
*/
isTwelveHoursFormat(inputTime) {
return /AM|PM/i.test(inputTime);
}
/**
* Gets the hourly time range for the given date.
* @param date The date object.
* @param twelveHoursFormat Indicates whether to use twelve hours format.
* @returns The hourly time range string.
*/
getHourlyTimeRange(date, twelveHoursFormat) {
const nextHour = new Date(date.getTime());
nextHour.setHours(date.getHours() + 1);
return `${this.formatTime(date, twelveHoursFormat, true)}-${this.formatTime(nextHour, twelveHoursFormat, true)}`;
}
/**
* Gets the minutely time range for the given date.
* @param date The date object.
* @param twelveHoursFormat Indicates whether to use twelve hours format.
* @returns The minutely time range string.
*/
getMinutelyTimeRange(date, twelveHoursFormat) {
const nextMinute = new Date(date.getTime());
nextMinute.setMinutes(date.getMinutes() + 1);
return `${this.formatTime(date, twelveHoursFormat, false)}-${this.formatTime(nextMinute, twelveHoursFormat, false)}`;
}
/**
* Formats the given date into a time string.
* @param date The date to format.
* @param usePeriod Indicates whether to include the period (AM/PM) in the formatted time.
* @param useHourOnly Indicates whether to include only the hour part in the formatted time.
* @returns The formatted time string.
*/
formatTime(date, usePeriod, useHourOnly) {
const hours = date.getHours();
const minutes = date.getMinutes().toString().padStart(2, '0');
if (usePeriod) {
const period = hours >= 12 ? 'PM' : 'AM';
const formattedHours = hours % 12 === 0 ? 12 : hours % 12;
return `${formattedHours}:${useHourOnly ? '00' : minutes} ${period}`;
}
else {
return `${hours.toString().padStart(2, '0')}:${useHourOnly ? '00' : minutes}`;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, isStandalone: true, name: "adjustAggregatedTimeRange" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AdjustAggregatedTimeRangePipe, decorators: [{
type: Pipe,
args: [{
name: 'adjustAggregatedTimeRange',
standalone: true
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLElBQUksbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBR3JFOzs7Ozs7O0dBT0c7QUFLSCxNQUFNLE9BQU8sNkJBQTZCO0lBQ3hDOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCLEVBQUUsZUFBbUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLGVBQWUsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEUsUUFBUSxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLG1CQUFtQixDQUFDLE1BQU07Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzVELEtBQUssbUJBQW1CLENBQUMsUUFBUTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDOUQ7Z0JBQ0UsTUFBTSxJQUFJLEtBQUss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LEVBQUUsU0FBa0IsRUFBRSxXQUFvQjtRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE1BQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUQsT0FBTyxHQUFHLGNBQWMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRixDQUFDO0lBQ0gsQ0FBQzsrR0FqTVUsNkJBQTZCOzZHQUE3Qiw2QkFBNkI7OzRGQUE3Qiw2QkFBNkI7a0JBSnpDLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIGFzIEFnZ3JlZ2F0aW9uVHlwZUVudW0gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbk9wdGlvbiB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG4vKipcbiAqIEEgcGlwZSB0aGF0IGFkanVzdHMgdGhlIGFnZ3JlZ2F0ZWQgdGltZSByYW5nZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAqXG4gKiBgYGBodG1sXG4gKiAnOTowMCcgfCBhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlOiBjb25maWcuYWdncmVnYXRpb24gKGUuZy46SE9VUkxZKVxuICogYGBgXG4gKiBUaGUgb3V0cHV0IHdpbGwgYmUgJzk6MDAtMTA6MDAnLlxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICdhZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBBZGp1c3RBZ2dyZWdhdGVkVGltZVJhbmdlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgaW5wdXQgdGltZSBiYXNlZCBvbiB0aGUgYWdncmVnYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBhZ2dyZWdhdGlvblR5cGUgVGhlIHR5cGUgb2YgYWdncmVnYXRpb24gKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgdHJhbnNmb3JtKGlucHV0VGltZTogc3RyaW5nLCBhZ2dyZWdhdGlvblR5cGU/OiBBZ2dyZWdhdGlvbk9wdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCFhZ2dyZWdhdGlvblR5cGUpIHtcbiAgICAgIHJldHVybiBpbnB1dFRpbWU7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSA9PT0gQWdncmVnYXRpb25UeXBlRW51bS5EQUlMWSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNyZWF0ZURhdGVGcm9tSW5wdXQoaW5wdXRUaW1lKTtcbiAgICBjb25zdCBpc1R3ZWx2ZUhvdXJzRm9ybWF0ID0gdGhpcy5pc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZSk7XG5cbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLkhPVVJMWTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG91cmx5VGltZVJhbmdlKGRhdGUsIGlzVHdlbHZlSG91cnNGb3JtYXQpO1xuICAgICAgY2FzZSBBZ2dyZWdhdGlvblR5cGVFbnVtLk1JTlVURUxZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNaW51dGVseVRpbWVSYW5nZShkYXRlLCBpc1R3ZWx2ZUhvdXJzRm9ybWF0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWdncmVnYXRpb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGF0ZSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSBpbnB1dFRpbWUgVGhlIGlucHV0IHRpbWUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGF0ZUZyb21JbnB1dChpbnB1dFRpbWU6IHN0cmluZyk6IERhdGUge1xuICAgIGNvbnN0IGRlZmF1bHREYXRlID0gJzE5NzAtMDEtMDEgJztcbiAgICBjb25zdCBpc1BNID0gL1BNL2kudGVzdChpbnB1dFRpbWUpO1xuICAgIGNvbnN0IGNsZWFuZWRUaW1lID0gaW5wdXRUaW1lLnJlcGxhY2UoL0FNfFBNL2ksICcnKS50cmltKCk7XG5cbiAgICB0aGlzLnZhbGlkYXRlVGltZUZvcm1hdChjbGVhbmVkVGltZSwgaW5wdXRUaW1lKTtcblxuICAgIGNvbnN0IGRhdGVUaW1lU3RyaW5nID0gYCR7ZGVmYXVsdERhdGV9JHtjbGVhbmVkVGltZX1gO1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlVGltZVN0cmluZyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgdGltZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkanVzdEZvclBNVGltZShkYXRlLCBpc1BNKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIHRpbWUgc3RyaW5nIG1hdGNoZXMgdGhlIHJlcXVpcmVkIGZvcm1hdCBhbmQgaGFzIHZhbGlkIHZhbHVlcy5cbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgc3RyaW5nIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0gb3JpZ2luYWxJbnB1dCBUaGUgb3JpZ2luYWwgaW5wdXQgc3RyaW5nIChpbmNsdWRpbmcgQU0vUE0gaWYgcHJlc2VudCkuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRpbWUgZm9ybWF0IGlzIGludmFsaWQgb3IgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdCh0aW1lOiBzdHJpbmcsIG9yaWdpbmFsSW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnRzID0gdGltZS5zcGxpdCgnOicpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lUGFydHMocGFydHMpO1xuXG4gICAgY29uc3QgW2hvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyXSA9IHBhcnRzO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRGlnaXRzKGhvdXJzU3RyLCBtaW51dGVzU3RyLCBzZWNvbmRzU3RyKTtcblxuICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgfSA9IHRoaXMucGFyc2VUaW1lQ29tcG9uZW50cyhob3Vyc1N0ciwgbWludXRlc1N0ciwgc2Vjb25kc1N0cik7XG4gICAgdGhpcy52YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xuICAgIHRoaXMudmFsaWRhdGVUaW1lRm9ybWF0MjRIb3VyKGhvdXJzLCBvcmlnaW5hbElucHV0KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVUaW1lUGFydHMocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZURpZ2l0cyhob3Vyc1N0cjogc3RyaW5nLCBtaW51dGVzU3RyOiBzdHJpbmcsIHNlY29uZHNTdHI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKGhvdXJzU3RyKSB8fFxuICAgICAgIXRoaXMuaXNWYWxpZE51bWJlclN0cmluZyhtaW51dGVzU3RyKSB8fFxuICAgICAgKHNlY29uZHNTdHIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1ZhbGlkTnVtYmVyU3RyaW5nKHNlY29uZHNTdHIpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVGltZUNvbXBvbmVudHMoaG91cnNTdHI6IHN0cmluZywgbWludXRlc1N0cjogc3RyaW5nLCBzZWNvbmRzU3RyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdXJzOiBOdW1iZXIoaG91cnNTdHIpLFxuICAgICAgbWludXRlczogTnVtYmVyKG1pbnV0ZXNTdHIpLFxuICAgICAgc2Vjb25kczogc2Vjb25kc1N0ciA/IE51bWJlcihzZWNvbmRzU3RyKSA6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRpbWVSYW5nZXMoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBob3VycyA8IDAgfHwgbWludXRlcyA+IDU5IHx8IG1pbnV0ZXMgPCAwIHx8IHNlY29uZHMgPiA1OSB8fCBzZWNvbmRzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHRpbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlVGltZUZvcm1hdDI0SG91cihob3VyczogbnVtYmVyLCBvcmlnaW5hbElucHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaG91cnMgPiAxMiAmJiB0aGlzLmhhc0FtUG0ob3JpZ2luYWxJbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0aW1lJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBzdHJpbmcgY29udGFpbnMgb25seSBkaWdpdHMgYW5kIGlzIDEtMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHN0cmluZyBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTnVtYmVyU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUubGVuZ3RoID4gMCAmJlxuICAgICAgdmFsdWUubGVuZ3RoIDw9IDIgJiZcbiAgICAgIHZhbHVlLnNwbGl0KCcnKS5ldmVyeShjaGFyID0+IGNoYXIgPj0gJzAnICYmIGNoYXIgPD0gJzknKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB0aW1lIGhhcyBBTS9QTSBtYXJrZXJzLlxuICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRpbWUgc3RyaW5nIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGlucHV0IGNvbnRhaW5zIEFNL1BNLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBbVBtKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL0FNfFBNL2kudGVzdChpbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyB0aGUgZGF0ZSBmb3IgUE0gdGltZXMgYnkgYWRkaW5nIDEyIGhvdXJzIHdoZW4gbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSBvYmplY3QgdG8gYWRqdXN0LlxuICAgKiBAcGFyYW0gaXNQTSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRpbWUgaXMgUE0uXG4gICAqIEByZXR1cm5zIFRoZSBhZGp1c3RlZCBEYXRlIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgYWRqdXN0Rm9yUE1UaW1lKGRhdGU6IERhdGUsIGlzUE06IGJvb2xlYW4pOiBEYXRlIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaXNQTSAmJiBob3VycyA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKGhvdXJzICsgMTIpO1xuICAgIH0gZWxzZSBpZiAoIWlzUE0gJiYgaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKDApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdC5cbiAgICogQHBhcmFtIGlucHV0VGltZSBUaGUgaW5wdXQgdGltZSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGlucHV0IHRpbWUgaXMgaW4gdHdlbHZlIGhvdXJzIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1R3ZWx2ZUhvdXJzRm9ybWF0KGlucHV0VGltZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9BTXxQTS9pLnRlc3QoaW5wdXRUaW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBob3VybHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgaG91cmx5IHRpbWUgcmFuZ2Ugc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIb3VybHlUaW1lUmFuZ2UoZGF0ZTogRGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRIb3VyID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRIb3VyLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfS0ke3RoaXMuZm9ybWF0VGltZShuZXh0SG91ciwgdHdlbHZlSG91cnNGb3JtYXQsIHRydWUpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWludXRlbHkgdGltZSByYW5nZSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIG9iamVjdC5cbiAgICogQHBhcmFtIHR3ZWx2ZUhvdXJzRm9ybWF0IEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSB0d2VsdmUgaG91cnMgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBUaGUgbWludXRlbHkgdGltZSByYW5nZSBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIGdldE1pbnV0ZWx5VGltZVJhbmdlKGRhdGU6IERhdGUsIHR3ZWx2ZUhvdXJzRm9ybWF0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0TWludXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICAgIG5leHRNaW51dGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIDEpO1xuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdFRpbWUoZGF0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX0tJHt0aGlzLmZvcm1hdFRpbWUobmV4dE1pbnV0ZSwgdHdlbHZlSG91cnNGb3JtYXQsIGZhbHNlKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIGdpdmVuIGRhdGUgaW50byBhIHRpbWUgc3RyaW5nLlxuICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gICAqIEBwYXJhbSB1c2VQZXJpb2QgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcGVyaW9kIChBTS9QTSkgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcGFyYW0gdXNlSG91ck9ubHkgSW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHRoZSBob3VyIHBhcnQgaW4gdGhlIGZvcm1hdHRlZCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGRhdGU6IERhdGUsIHVzZVBlcmlvZDogYm9vbGVhbiwgdXNlSG91ck9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgaWYgKHVzZVBlcmlvZCkge1xuICAgICAgY29uc3QgcGVyaW9kID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEhvdXJzID0gaG91cnMgJSAxMiA9PT0gMCA/IDEyIDogaG91cnMgJSAxMjtcbiAgICAgIHJldHVybiBgJHtmb3JtYXR0ZWRIb3Vyc306JHt1c2VIb3VyT25seSA/ICcwMCcgOiBtaW51dGVzfSAke3BlcmlvZH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3VzZUhvdXJPbmx5ID8gJzAwJyA6IG1pbnV0ZXN9YDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==