ng-cw-v12
Version:
Angular UI component library
153 lines • 23.2 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
export class BorderBeamDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncSize = 50; // 光条大小 单位px
this.ncDuration = 6000; // 动画时长,ms
this.ncStopTime = 0; // 停止动画时间,ms,0表示不停止
this.ncColorFrom = '#ffaa40'; // 渐变起始颜色
this.ncColorTo = '#9c40ff'; // 渐变结束颜色
this._reverse = false; // 是否反向动画
this.ncInitialOffset = 0; // 初始偏移位置 (0-100) 单位%
this.ncBorderWidth = 1; // 边框宽度 单位px
this.ncEnabled = true; // 是否启用动画
this.ncEnabledChange = new EventEmitter(); // 双向绑定输出事件
this.isInitialized = false;
// 为每个实例生成唯一的动画名称
this.animationName = `ncBorderBeam_${Math.random().toString(36).substring(2, 11)}`;
}
set ncReverse(val) {
this._reverse = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncReverse() {
return this._reverse;
}
ngOnInit() {
this.createBorderBeamContainer();
this.isInitialized = true;
if (this.ncEnabled) {
this.startAnimation();
}
}
ngOnChanges(changes) {
if (this.isInitialized && changes['ncEnabled']) {
if (this.ncEnabled) {
this.startAnimation();
}
else {
this.stopAnimation();
}
}
}
ngOnDestroy() {
if (this.stopTimer) {
clearTimeout(this.stopTimer);
}
}
createBorderBeamContainer() {
// 创建边框容器
this.borderContainer = this.renderer.createElement('div');
this.renderer.addClass(this.borderContainer, 'border-beam-container');
// 设置边框容器样式
this.renderer.setStyle(this.borderContainer, 'position', 'absolute');
this.renderer.setStyle(this.borderContainer, 'inset', '0');
this.renderer.setStyle(this.borderContainer, 'borderRadius', 'inherit');
this.renderer.setStyle(this.borderContainer, 'pointerEvents', 'none');
this.renderer.setStyle(this.borderContainer, 'border', `${this.ncBorderWidth}px solid transparent`);
this.renderer.setStyle(this.borderContainer, 'maskClip', 'padding-box, border-box');
this.renderer.setStyle(this.borderContainer, 'maskComposite', 'intersect');
this.renderer.setStyle(this.borderContainer, 'maskImage', 'linear-gradient(transparent, transparent), linear-gradient(#000, #000)');
// 创建光条元素
this.beamElement = this.renderer.createElement('div');
this.renderer.addClass(this.beamElement, 'border-beam');
// 设置光条样式
this.renderer.setStyle(this.beamElement, 'position', 'absolute');
this.renderer.setStyle(this.beamElement, 'width', `${this.ncSize}px`);
this.renderer.setStyle(this.beamElement, 'aspectRatio', '1');
this.renderer.setStyle(this.beamElement, 'background', `linear-gradient(to left, ${this.ncColorFrom}, ${this.ncColorTo}, transparent)`);
this.renderer.setStyle(this.beamElement, 'offsetPath', `rect(0 auto auto 0 round ${this.ncSize}px)`);
// 初始状态下隐藏光条
this.renderer.setStyle(this.beamElement, 'opacity', '0');
const elementPosition = this.el.nativeElement.style.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 添加关键帧动画样式
this.styleElement = this.renderer.createElement('style');
const startOffset = this.ncReverse ? `${100 - this.ncInitialOffset}%` : `${this.ncInitialOffset}%`;
const endOffset = this.ncReverse ? `${-this.ncInitialOffset}%` : `${100 + this.ncInitialOffset}%`;
const keyframes = `
${this.animationName} {
0% {
offset-distance: ${startOffset};
}
100% {
offset-distance: ${endOffset};
}
}
`;
this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.styleElement);
// 将光条添加到边框容器中
this.renderer.appendChild(this.borderContainer, this.beamElement);
// 将边框容器添加到宿主元素中
this.renderer.appendChild(this.el.nativeElement, this.borderContainer);
}
startAnimation() {
if (!this.beamElement)
return;
// 显示光条元素
this.renderer.setStyle(this.beamElement, 'opacity', '1');
this.renderer.setStyle(this.beamElement, 'animation', `${this.animationName} ${this.ncDuration}ms linear infinite`);
// 如果设置了停止时间,则在指定时间后标记需要停止
if (this.ncStopTime > 0) {
this.stopTimer = setTimeout(() => {
this.stopAnimation();
// 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件
this.ncEnabled = false;
this.ncEnabledChange.emit(false);
}, this.ncStopTime);
}
}
stopAnimation() {
if (!this.beamElement)
return;
if (this.stopTimer) {
clearTimeout(this.stopTimer);
this.stopTimer = null;
}
this.renderer.setStyle(this.beamElement, 'animation', 'none');
this.renderer.setStyle(this.beamElement, 'opacity', '0');
}
}
BorderBeamDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
BorderBeamDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: BorderBeamDirective, selector: "[ncBorderBeam]", inputs: { ncSize: "ncSize", ncDuration: "ncDuration", ncStopTime: "ncStopTime", ncColorFrom: "ncColorFrom", ncColorTo: "ncColorTo", ncReverse: "ncReverse", ncInitialOffset: "ncInitialOffset", ncBorderWidth: "ncBorderWidth", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: BorderBeamDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncBorderBeam]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncSize: [{
type: Input
}], ncDuration: [{
type: Input
}], ncStopTime: [{
type: Input
}], ncColorFrom: [{
type: Input
}], ncColorTo: [{
type: Input
}], ncReverse: [{
type: Input
}], ncInitialOffset: [{
type: Input
}], ncBorderWidth: [{
type: Input
}], ncEnabled: [{
type: Input
}], ncEnabledChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9yZGVyLWJlYW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9ib3JkZXItYmVhbS9ib3JkZXItYmVhbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sbUJBQW1CO0lBMEI5QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF6QnRELFdBQU0sR0FBVyxFQUFFLENBQUMsQ0FBQyxZQUFZO1FBQ2pDLGVBQVUsR0FBVyxJQUFJLENBQUMsQ0FBQyxVQUFVO1FBQ3JDLGVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7UUFDM0MsZ0JBQVcsR0FBVyxTQUFTLENBQUMsQ0FBQyxTQUFTO1FBQzFDLGNBQVMsR0FBVyxTQUFTLENBQUMsQ0FBQyxTQUFTO1FBQ3pDLGFBQVEsR0FBWSxLQUFLLENBQUMsQ0FBQSxTQUFTO1FBUWxDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1FBQ2xELGtCQUFhLEdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWTtRQUN2QyxjQUFTLEdBQVksSUFBSSxDQUFDLENBQUMsU0FBUztRQUNuQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUMsQ0FBQyxXQUFXO1FBTzVELGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRzVCLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNyRixDQUFDO0lB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QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmNCb3JkZXJCZWFtXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIEJvcmRlckJlYW1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDUwOyAvLyDlhYnmnaHlpKflsI8g5Y2V5L2NcHhcclxuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSA2MDAwOyAvLyDliqjnlLvml7bplb/vvIxtc1xyXG4gIEBJbnB1dCgpIG5jU3RvcFRpbWU6IG51bWJlciA9IDA7IC8vIOWBnOatouWKqOeUu+aXtumXtO+8jG1z77yMMOihqOekuuS4jeWBnOatolxyXG4gIEBJbnB1dCgpIG5jQ29sb3JGcm9tOiBzdHJpbmcgPSAnI2ZmYWE0MCc7IC8vIOa4kOWPmOi1t+Wni+minOiJslxyXG4gIEBJbnB1dCgpIG5jQ29sb3JUbzogc3RyaW5nID0gJyM5YzQwZmYnOyAvLyDmuJDlj5jnu5PmnZ/popzoibJcclxuICBwcml2YXRlIF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2U7Ly8g5piv5ZCm5Y+N5ZCR5Yqo55S7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNSZXZlcnNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmV2ZXJzZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jUmV2ZXJzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXZlcnNlO1xyXG4gIH1cclxuICBASW5wdXQoKSBuY0luaXRpYWxPZmZzZXQ6IG51bWJlciA9IDA7IC8vIOWIneWni+WBj+enu+S9jee9riAoMC0xMDApIOWNleS9jSVcclxuICBASW5wdXQoKSBuY0JvcmRlcldpZHRoOiBudW1iZXIgPSAxOyAvLyDovrnmoYblrr3luqYg5Y2V5L2NcHhcclxuICBASW5wdXQoKSBuY0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlOyAvLyDmmK/lkKblkK/nlKjliqjnlLtcclxuICBAT3V0cHV0KCkgbmNFbmFibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpOyAvLyDlj4zlkJHnu5HlrprovpPlh7rkuovku7ZcclxuXHJcbiAgcHJpdmF0ZSBib3JkZXJDb250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGJlYW1FbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25OYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdG9wVGltZXI6IGFueTtcclxuICBwcml2YXRlIHN0eWxlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgIC8vIOS4uuavj+S4quWunuS+i+eUn+aIkOWUr+S4gOeahOWKqOeUu+WQjeensFxyXG4gICAgdGhpcy5hbmltYXRpb25OYW1lID0gYG5jQm9yZGVyQmVhbV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgY2hhbmdlc1snbmNFbmFibGVkJ10pIHtcclxuICAgICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCb3JkZXJCZWFtQ29udGFpbmVyKCkge1xyXG4gICAgLy8g5Yib5bu66L655qGG5a655ZmoXHJcbiAgICB0aGlzLmJvcmRlckNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyLWJlYW0tY29udGFpbmVyJyk7XHJcblxyXG4gICAgLy8g6K6+572u6L655qGG5a655Zmo5qC35byPXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdpbnNldCcsICcwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnYm9yZGVyUmFkaXVzJywgJ2luaGVyaXQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdib3JkZXInLCBgJHt0aGlzLm5jQm9yZGVyV2lkdGh9cHggc29saWQgdHJhbnNwYXJlbnRgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5ib3JkZXJDb250YWluZXIsICdtYXNrQ2xpcCcsICdwYWRkaW5nLWJveCwgYm9yZGVyLWJveCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJvcmRlckNvbnRhaW5lciwgJ21hc2tDb21wb3NpdGUnLCAnaW50ZXJzZWN0Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYm9yZGVyQ29udGFpbmVyLCAnbWFza0ltYWdlJywgJ2xpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQpLCBsaW5lYXItZ3JhZGllbnQoIzAwMCwgIzAwMCknKTtcclxuXHJcbiAgICAvLyDliJvlu7rlhYnmnaHlhYPntKBcclxuICAgIHRoaXMuYmVhbUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJlYW1FbGVtZW50LCAnYm9yZGVyLWJlYW0nKTtcclxuXHJcbiAgICAvLyDorr7nva7lhYnmnaHmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMubmNTaXplfXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdhc3BlY3RSYXRpbycsICcxJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdiYWNrZ3JvdW5kJywgYGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCAke3RoaXMubmNDb2xvckZyb219LCAke3RoaXMubmNDb2xvclRvfSwgdHJhbnNwYXJlbnQpYCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdvZmZzZXRQYXRoJywgYHJlY3QoMCBhdXRvIGF1dG8gMCByb3VuZCAke3RoaXMubmNTaXplfXB4KWApO1xyXG4gICAgLy8g5Yid5aeL54q25oCB5LiL6ZqQ6JeP5YWJ5p2hXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcbiAgICBpZiAoIWVsZW1lbnRQb3NpdGlvbiB8fCBlbGVtZW50UG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDmt7vliqDlhbPplK7luKfliqjnlLvmoLflvI9cclxuICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB0aGlzLm5jUmV2ZXJzZSA/IGAkezEwMCAtIHRoaXMubmNJbml0aWFsT2Zmc2V0fSVgIDogYCR7dGhpcy5uY0luaXRpYWxPZmZzZXR9JWA7XHJcbiAgICBjb25zdCBlbmRPZmZzZXQgPSB0aGlzLm5jUmV2ZXJzZSA/IGAkey10aGlzLm5jSW5pdGlhbE9mZnNldH0lYCA6IGAkezEwMCArIHRoaXMubmNJbml0aWFsT2Zmc2V0fSVgO1xyXG5cclxuICAgIGNvbnN0IGtleWZyYW1lcyA9IGBcclxuICAgICAgQGtleWZyYW1lcyAke3RoaXMuYW5pbWF0aW9uTmFtZX0ge1xyXG4gICAgICAgIDAlIHtcclxuICAgICAgICAgIG9mZnNldC1kaXN0YW5jZTogJHtzdGFydE9mZnNldH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDEwMCUge1xyXG4gICAgICAgICAgb2Zmc2V0LWRpc3RhbmNlOiAke2VuZE9mZnNldH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBgO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGtleWZyYW1lcykpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3R5bGVFbGVtZW50KTtcclxuXHJcbiAgICAvLyDlsIblhYnmnaHmt7vliqDliLDovrnmoYblrrnlmajkuK1cclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5ib3JkZXJDb250YWluZXIsIHRoaXMuYmVhbUVsZW1lbnQpO1xyXG4gICAgLy8g5bCG6L655qGG5a655Zmo5re75Yqg5Yiw5a6/5Li75YWD57Sg5LitXHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5ib3JkZXJDb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5iZWFtRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIOaYvuekuuWFieadoeWFg+e0oFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJlYW1FbGVtZW50LCAnb3BhY2l0eScsICcxJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdhbmltYXRpb24nLFxyXG4gICAgICBgJHt0aGlzLmFuaW1hdGlvbk5hbWV9ICR7dGhpcy5uY0R1cmF0aW9ufW1zIGxpbmVhciBpbmZpbml0ZWApO1xyXG5cclxuICAgIC8vIOWmguaenOiuvue9ruS6huWBnOatouaXtumXtO+8jOWImeWcqOaMh+WumuaXtumXtOWQjuagh+iusOmcgOimgeWBnOatolxyXG4gICAgaWYgKHRoaXMubmNTdG9wVGltZSA+IDApIHtcclxuICAgICAgdGhpcy5zdG9wVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcclxuICAgICAgICAvLyDlvZPlm6DkuLogbmNTdG9wVGltZSDlgZzmraLliqjnlLvml7bvvIzmm7TmlrAgbmNFbmFibGVkIOWAvOW5tuWPkeWHuuS6i+S7tlxyXG4gICAgICAgIHRoaXMubmNFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5uY0VuYWJsZWRDaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICAgIH0sIHRoaXMubmNTdG9wVGltZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3BBbmltYXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuYmVhbUVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5zdG9wVGltZXIpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3RvcFRpbWVyKTtcclxuICAgICAgdGhpcy5zdG9wVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iZWFtRWxlbWVudCwgJ2FuaW1hdGlvbicsICdub25lJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmVhbUVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcclxuICB9XHJcbn0iXX0=