ng-cw-v12
Version:
Angular UI component library
93 lines • 18.8 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./local.service";
import * as i2 from "@angular/common";
export class TimelineComponent {
constructor(ls) {
this.ls = ls;
this.ncMode = 'horizontal';
this.ncSelected = -1;
this.ncSelectedChange = new EventEmitter();
this.ncClick = new EventEmitter();
this.dateArr = [];
this.scaleArr = [];
this.dateObjectArr = [];
this.scaleObjectArr = [];
}
set ncDate(value) {
this.dateArr = value;
setTimeout(() => {
//加延迟,防止其他传入参数未获取到
this.init();
});
}
;
ngOnInit() {
}
init() {
//时间值
this.dateObjectArr = this.setLeftValue(this.dateArr);
//刻度值
this.scaleArr = [this.dateArr[0], this.dateArr[this.dateArr.length - 1]]; //['2022-03-01', '2024-05-11']
this.scaleArr = this.scaleArr.map(date => new Date(date));
let minYear = Math.min(...this.scaleArr.map(date => date.getFullYear())); //2022
let maxYear = Math.max(...this.scaleArr.map(date => date.getFullYear())); //2024
//插入year-01-01,'2023-01-01', '2024-01-01'
for (let year = minYear + 1; year <= maxYear; year++) {
let newYearDate = new Date(`${year}-01-01`);
this.scaleArr.push(newYearDate);
}
//排序
this.scaleArr.sort((a, b) => a - b);
//转化为字符串
this.scaleArr = this.scaleArr.map(date => this.ls.formatDate('yyyy-MM-dd', date)); //['2022-03-01','2023-01-01', '2024-01-01', '2024-05-11']
//获取left值
this.scaleObjectArr = this.setLeftValue(this.scaleArr);
//截取年份
for (let item of this.scaleObjectArr) {
item.date = item.date.substring(0, 4);
}
//删除用于计算的首尾值
this.scaleObjectArr.splice(0, 1);
this.scaleObjectArr.splice(this.scaleObjectArr.length - 1, 1);
}
//获取定位left值
setLeftValue(arr) {
let all = this.ls.getRangeDate(new Date(arr[0]), new Date(arr[arr.length - 1])).length;
let leftArr = [];
for (let i = 0; i < arr.length; i++) {
let value = i == 0 ? 0 : this.ls.getRangeDate(new Date(arr[0]), new Date(arr[i])).length;
leftArr.push({
date: arr[i],
left: this.ls.retainPercentDecimal(value / all, 2)
});
}
return leftArr;
}
itemClick(date, index) {
this.ncClick.emit({ date, index });
this.ncSelected = index;
this.ncSelectedChange.emit(this.ncSelected);
}
}
TimelineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimelineComponent, deps: [{ token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component });
TimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TimelineComponent, selector: "nc-timeline", inputs: { ncDate: "ncDate", ncMode: "ncMode", ncSelected: "ncSelected" }, outputs: { ncSelectedChange: "ncSelectedChange", ncClick: "ncClick" }, ngImport: i0, template: "<div class=\"timeline-container-horizontal\" *ngIf=\"ncMode == 'horizontal'\">\r\n <div class=\"timeline\">\r\n <div class=\"timeline-item\" [class.timeline-item-selected]=\"ncSelected == i\"\r\n *ngFor=\"let item of dateObjectArr;let i = index;\" (click)=\"itemClick(dateArr[i], i)\"\r\n [ngStyle]=\"{'left': i == 0 ? '0' : 'calc(' + item.left + '%' + ' - 2px)'}\" [title]=\"dateArr[i]\">\r\n </div>\r\n <div class=\"scale\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'left': 'calc(' + item.left + '%' + ' - 2px)'}\">\r\n </div>\r\n <div class=\"scale-value\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'left': 'calc(' + item.left + '%' + ' - 16px)'}\">\r\n {{item.date}}\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"timeline-container-vertical\" *ngIf=\"ncMode == 'vertical'\">\r\n <div class=\"timeline\">\r\n <div class=\"timeline-item\" [class.timeline-item-selected]=\"ncSelected == i\"\r\n *ngFor=\"let item of dateObjectArr;let i = index;\" (click)=\"itemClick(dateArr[i], i)\"\r\n [ngStyle]=\"{'top': i == 0 ? '0' : 'calc(' + item.left + '%' + ' - 2px)'}\" [title]=\"dateArr[i]\">\r\n </div>\r\n <div class=\"scale\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'top': 'calc(' + item.left + '%' + ' - 2px)'}\">\r\n </div>\r\n <div class=\"scale-value\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'top': 'calc(' + item.left + '%' + ' - 12px)'}\">\r\n {{item.date}}\r\n </div>\r\n </div>\r\n</div>", styles: [".timeline-container-horizontal{width:100%;height:100%;padding:20px}.timeline-container-horizontal .timeline{width:100%;height:100%;border-bottom:2px solid #969696;display:flex;position:relative}.timeline-container-horizontal .timeline .timeline-item{position:absolute;bottom:0;width:2px;height:100%;background-color:#969696;cursor:pointer}.timeline-container-horizontal .timeline .timeline-item:hover{background-color:#ffbc02}.timeline-container-horizontal .timeline .timeline-item-selected{background-color:#ff3918}.timeline-container-horizontal .timeline .scale{position:absolute;bottom:-6px;width:2px;height:6px;background-color:#969696}.timeline-container-horizontal .timeline .scale-value{position:absolute;bottom:-24px;color:#8e8e8e}.timeline-container-vertical{width:100%;height:100%;padding:20px 20px 20px 40px}.timeline-container-vertical .timeline{width:100%;height:100%;border-left:2px solid #969696;display:flex;position:relative}.timeline-container-vertical .timeline .timeline-item{position:absolute;left:0;height:2px;width:100%;background-color:#969696;cursor:pointer}.timeline-container-vertical .timeline .timeline-item:hover{background-color:#ffbc02}.timeline-container-vertical .timeline .timeline-item-selected{background-color:#ff3918}.timeline-container-vertical .timeline .scale{position:absolute;left:-6px;height:2px;width:6px;background-color:#969696}.timeline-container-vertical .timeline .scale-value{position:absolute;left:-38px;color:#8e8e8e}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimelineComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-timeline',
templateUrl: './timeline.component.html',
styleUrls: ['./timeline.component.less']
}]
}], ctorParameters: function () { return [{ type: i1.LocalService }]; }, propDecorators: { ncDate: [{
type: Input
}], ncMode: [{
type: Input
}], ncSelected: [{
type: Input
}], ncSelectedChange: [{
type: Output
}], ncClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy90aW1lbGluZS90aW1lbGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3RpbWVsaW5lL3RpbWVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRL0UsTUFBTSxPQUFPLGlCQUFpQjtJQWlCNUIsWUFBb0IsRUFBZ0I7UUFBaEIsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQVQzQixXQUFNLEdBQThCLFlBQVksQ0FBQztRQUNqRCxlQUFVLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkIscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxZQUFPLEdBQWUsRUFBRSxDQUFDO1FBQ3pCLGFBQVEsR0FBZSxFQUFFLENBQUM7UUFDMUIsa0JBQWEsR0FBZSxFQUFFLENBQUM7UUFDL0IsbUJBQWMsR0FBZSxFQUFFLENBQUM7SUFFUSxDQUFDO0lBaEJ6QyxJQUFhLE1BQU0sQ0FBQyxLQUFZO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUEsQ0FBQztJQVlGLFFBQVE7SUFFUixDQUFDO0lBRUQsSUFBSTtRQUNGLEtBQUs7UUFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FB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QUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDekYsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUNuRCxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs4R0F0RVUsaUJBQWlCO2tHQUFqQixpQkFBaUIsb01DUjlCLDZyREE4Qk07MkZEdEJPLGlCQUFpQjtrQkFMN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsU0FBUyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3pDO21HQUVjLE1BQU07c0JBQWxCLEtBQUs7Z0JBT0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2FsU2VydmljZSB9IGZyb20gJy4vbG9jYWwuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLXRpbWVsaW5lJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGltZWxpbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RpbWVsaW5lLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbWVsaW5lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBzZXQgbmNEYXRlKHZhbHVlOiBhbnlbXSkgey8vWycyMDIyLTAzLTAxJywgJzIwMjItMDYtMTEnLCAnMjAyMy0wNC0xMCcsICcyMDIzLTEyLTIyJywgJzIwMjQtMDItMjcnLCAnMjAyNC0wNS0xMSddXHJcbiAgICB0aGlzLmRhdGVBcnIgPSB2YWx1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvL+WKoOW7tui/n++8jOmYsuatouWFtuS7luS8oOWFpeWPguaVsOacquiOt+WPluWIsFxyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH0pXHJcbiAgfTtcclxuICBASW5wdXQoKSBuY01vZGU6ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgPSAnaG9yaXpvbnRhbCc7XHJcbiAgQElucHV0KCkgbmNTZWxlY3RlZDogbnVtYmVyID0gLTE7XHJcbiAgQE91dHB1dCgpIG5jU2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG5jQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgZGF0ZUFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNjYWxlQXJyOiBBcnJheTxhbnk+ID0gW107XHJcbiAgZGF0ZU9iamVjdEFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNjYWxlT2JqZWN0QXJyOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbHM6IExvY2FsU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIGluaXQoKSB7XHJcbiAgICAvL+aXtumXtOWAvFxyXG4gICAgdGhpcy5kYXRlT2JqZWN0QXJyID0gdGhpcy5zZXRMZWZ0VmFsdWUodGhpcy5kYXRlQXJyKTtcclxuXHJcbiAgICAvL+WIu+W6puWAvFxyXG4gICAgdGhpcy5zY2FsZUFyciA9IFt0aGlzLmRhdGVBcnJbMF0sIHRoaXMuZGF0ZUFyclt0aGlzLmRhdGVBcnIubGVuZ3RoIC0gMV1dOy8vWycyMDIyLTAzLTAxJywgJzIwMjQtMDUtMTEnXVxyXG4gICAgdGhpcy5zY2FsZUFyciA9IHRoaXMuc2NhbGVBcnIubWFwKGRhdGUgPT4gbmV3IERhdGUoZGF0ZSkpO1xyXG4gICAgbGV0IG1pblllYXIgPSBNYXRoLm1pbiguLi50aGlzLnNjYWxlQXJyLm1hcChkYXRlID0+IGRhdGUuZ2V0RnVsbFllYXIoKSkpOy8vMjAyMlxyXG4gICAgbGV0IG1heFllYXIgPSBNYXRoLm1heCguLi50aGlzLnNjYWxlQXJyLm1hcChkYXRlID0+IGRhdGUuZ2V0RnVsbFllYXIoKSkpOy8vMjAyNFxyXG4gICAgLy/mj5LlhaV5ZWFyLTAxLTAx77yMJzIwMjMtMDEtMDEnLCAnMjAyNC0wMS0wMSdcclxuICAgIGZvciAobGV0IHllYXIgPSBtaW5ZZWFyICsgMTsgeWVhciA8PSBtYXhZZWFyOyB5ZWFyKyspIHtcclxuICAgICAgbGV0IG5ld1llYXJEYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tMDEtMDFgKTtcclxuICAgICAgdGhpcy5zY2FsZUFyci5wdXNoKG5ld1llYXJEYXRlKTtcclxuICAgIH1cclxuICAgIC8v5o6S5bqPXHJcbiAgICB0aGlzLnNjYWxlQXJyLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgIC8v6L2s5YyW5Li65a2X56ym5LiyXHJcbiAgICB0aGlzLnNjYWxlQXJyID0gdGhpcy5zY2FsZUFyci5tYXAoZGF0ZSA9PiB0aGlzLmxzLmZvcm1hdERhdGUoJ3l5eXktTU0tZGQnLCBkYXRlKSk7Ly9bJzIwMjItMDMtMDEnLCcyMDIzLTAxLTAxJywgJzIwMjQtMDEtMDEnLCAnMjAyNC0wNS0xMSddXHJcbiAgICAvL+iOt+WPlmxlZnTlgLxcclxuICAgIHRoaXMuc2NhbGVPYmplY3RBcnIgPSB0aGlzLnNldExlZnRWYWx1ZSh0aGlzLnNjYWxlQXJyKTtcclxuICAgIC8v5oiq5Y+W5bm05Lu9XHJcbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuc2NhbGVPYmplY3RBcnIpIHtcclxuICAgICAgaXRlbS5kYXRlID0gaXRlbS5kYXRlLnN1YnN0cmluZygwLCA0KTtcclxuICAgIH1cclxuICAgIC8v5Yig6Zmk55So5LqO6K6h566X55qE6aaW5bC+5YC8XHJcbiAgICB0aGlzLnNjYWxlT2JqZWN0QXJyLnNwbGljZSgwLCAxKTtcclxuICAgIHRoaXMuc2NhbGVPYmplY3RBcnIuc3BsaWNlKHRoaXMuc2NhbGVPYmplY3RBcnIubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluWumuS9jWxlZnTlgLxcclxuICBzZXRMZWZ0VmFsdWUoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICBsZXQgYWxsID0gdGhpcy5scy5nZXRSYW5nZURhdGUobmV3IERhdGUoYXJyWzBdKSwgbmV3IERhdGUoYXJyW2Fyci5sZW5ndGggLSAxXSkpLmxlbmd0aDtcclxuICAgIGxldCBsZWZ0QXJyOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdmFsdWUgPSBpID09IDAgPyAwIDogdGhpcy5scy5nZXRSYW5nZURhdGUobmV3IERhdGUoYXJyWzBdKSwgbmV3IERhdGUoYXJyW2ldKSkubGVuZ3RoO1xyXG4gICAgICBsZWZ0QXJyLnB1c2goe1xyXG4gICAgICAgIGRhdGU6IGFycltpXSxcclxuICAgICAgICBsZWZ0OiB0aGlzLmxzLnJldGFpblBlcmNlbnREZWNpbWFsKHZhbHVlIC8gYWxsLCAyKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBsZWZ0QXJyO1xyXG4gIH1cclxuXHJcbiAgaXRlbUNsaWNrKGRhdGU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5uY0NsaWNrLmVtaXQoeyBkYXRlLCBpbmRleCB9KTtcclxuICAgIHRoaXMubmNTZWxlY3RlZCA9IGluZGV4O1xyXG4gICAgdGhpcy5uY1NlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5uY1NlbGVjdGVkKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRpbWVsaW5lLWNvbnRhaW5lci1ob3Jpem9udGFsXCIgKm5nSWY9XCJuY01vZGUgPT0gJ2hvcml6b250YWwnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmUtaXRlbVwiIFtjbGFzcy50aW1lbGluZS1pdGVtLXNlbGVjdGVkXT1cIm5jU2VsZWN0ZWQgPT0gaVwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGVPYmplY3RBcnI7bGV0IGkgPSBpbmRleDtcIiAoY2xpY2spPVwiaXRlbUNsaWNrKGRhdGVBcnJbaV0sIGkpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieydsZWZ0JzogaSA9PSAwID8gJzAnIDogJ2NhbGMoJyArIGl0ZW0ubGVmdCArICclJyArICcgLSAycHgpJ31cIiBbdGl0bGVdPVwiZGF0ZUFycltpXVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY2FsZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjYWxlT2JqZWN0QXJyO2xldCBpID0gaW5kZXg7XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieydsZWZ0JzogJ2NhbGMoJyArIGl0ZW0ubGVmdCArICclJyArICcgLSAycHgpJ31cIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NhbGUtdmFsdWVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzY2FsZU9iamVjdEFycjtsZXQgaSA9IGluZGV4O1wiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbGVmdCc6ICdjYWxjKCcgKyBpdGVtLmxlZnQgKyAnJScgKyAnIC0gMTZweCknfVwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0uZGF0ZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwidGltZWxpbmUtY29udGFpbmVyLXZlcnRpY2FsXCIgKm5nSWY9XCJuY01vZGUgPT0gJ3ZlcnRpY2FsJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lLWl0ZW1cIiBbY2xhc3MudGltZWxpbmUtaXRlbS1zZWxlY3RlZF09XCJuY1NlbGVjdGVkID09IGlcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRlT2JqZWN0QXJyO2xldCBpID0gaW5kZXg7XCIgKGNsaWNrKT1cIml0ZW1DbGljayhkYXRlQXJyW2ldLCBpKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsndG9wJzogaSA9PSAwID8gJzAnIDogJ2NhbGMoJyArIGl0ZW0ubGVmdCArICclJyArICcgLSAycHgpJ31cIiBbdGl0bGVdPVwiZGF0ZUFycltpXVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY2FsZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjYWxlT2JqZWN0QXJyO2xldCBpID0gaW5kZXg7XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyd0b3AnOiAnY2FsYygnICsgaXRlbS5sZWZ0ICsgJyUnICsgJyAtIDJweCknfVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY2FsZS12YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjYWxlT2JqZWN0QXJyO2xldCBpID0gaW5kZXg7XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyd0b3AnOiAnY2FsYygnICsgaXRlbS5sZWZ0ICsgJyUnICsgJyAtIDEycHgpJ31cIj5cclxuICAgICAgICAgICAge3tpdGVtLmRhdGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==