UNPKG

ng-devui

Version:

DevUI components based on Angular

147 lines 20.3 kB
import { Directive, ElementRef, HostListener, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class MovableDirective { constructor(el) { this.el = el; this.topStart = 0; this.leftStart = 0; this._allowDrag = false; this.checkHandleTarget = function (target, element) { if (!element) { return false; } // Checks if the target is the element clicked, then checks each child element of element as well // Ignores button clicks // Ignore elements of type button if (element.tagName === 'BUTTON') { return false; } // If the target was found, return true (handle was found) if (element === target) { return true; } // Recursively iterate this elements children for (const /** @type {?} */ child in element.children) { if (Object.prototype.hasOwnProperty.call(element.children, child)) { if (this.checkHandleTarget(target, element.children[child])) { return true; } } } // Handle was not found in this lineage // Note: return false is ignore unless it is the parent element return false; }; } ngOnInit() { this.element = this.moveEl || this.el.nativeElement; // css changes if (this._allowDrag) { this.element.style.position = 'relative'; } } ngOnChanges(changes) { const { moveEl, handle } = changes; if (moveEl) { this.element = this.moveEl || this.el.nativeElement; } if (handle) { this.allowDrag = this._allowDrag; } } onMouseDown(event) { if (event.button === 2 || !this.checkHandleTarget(event.target, this.handle)) { return; // prevents right click drag, remove his if you don't want it } this.md = true; this.topStart = event.clientY - this.element.style.top.replace('px', ''); this.leftStart = event.clientX - this.element.style.left.replace('px', ''); } onMouseUp(event) { this.md = false; } onMouseMove(event) { if (typeof window !== 'undefined' && this.md && this._allowDrag) { // 阻止拖动过程中文字被选中 event.stopPropagation(); event.preventDefault(); // 判断边界条件 const modalRect = this.element.getBoundingClientRect(); const parentRect = this.element.parentNode.getBoundingClientRect(); const [translateX, translateY] = this.element.style.transform.match(/\d+/g)?.map((item) => Number(item)) || [0, 0]; // 当前偏移量 let currentTop = event.clientY - this.topStart; let currentLeft = event.clientX - this.leftStart; // 计算上下距离,按照parentNode的位置计算偏移量,后续parentNode存在偏移量,需要考虑偏移量 const maxTop = window.innerHeight - parentRect.top - modalRect.height; currentTop = (parentRect.top + currentTop + translateY <= 0 && -parentRect.top - translateY) || (maxTop - currentTop - translateY <= 0 && maxTop - translateY) || currentTop; const halfWidth = (window.innerWidth - modalRect.width) / 2; // 计算左右距离,默认居中,后续parentNode存在偏移量,需要考虑偏移量 currentLeft = (currentLeft + halfWidth + translateX <= 0 && -halfWidth - translateX) || (halfWidth - currentLeft - translateX <= 0 && halfWidth - translateX) || currentLeft; this.element.style.top = currentTop + 'px'; this.element.style.left = currentLeft + 'px'; } } onTouchStart(event) { this.md = true; this.topStart = event.changedTouches[0].clientY - this.element.style.top.replace('px', ''); this.leftStart = event.changedTouches[0].clientX - this.element.style.left.replace('px', ''); event.stopPropagation(); } onTouchEnd() { this.md = false; } onTouchMove(event) { if (this.md && this._allowDrag) { this.element.style.top = `${event.changedTouches[0].clientY - this.topStart}px`; this.element.style.left = `${event.changedTouches[0].clientX - this.leftStart}px`; } event.stopPropagation(); } set allowDrag(value) { this._allowDrag = value; if (this._allowDrag && this.handle) { this.handle.style.cursor = 'move'; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MovableDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: MovableDirective, selector: "[dMovable]", inputs: { handle: "handle", moveEl: "moveEl", allowDrag: ["dMovable", "allowDrag"] }, host: { listeners: { "mousedown": "onMouseDown($event)", "document:mouseup": "onMouseUp($event)", "document:mousemove": "onMouseMove($event)", "touchstart": "onTouchStart($event)", "document:touchend": "onTouchEnd()", "document:touchmove": "onTouchMove($event)" } }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MovableDirective, decorators: [{ type: Directive, args: [{ selector: '[dMovable]', }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { handle: [{ type: Input }], moveEl: [{ type: Input }], onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event']] }], onMouseUp: [{ type: HostListener, args: ['document:mouseup', ['$event']] }], onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event']] }], onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event']] }], onTouchEnd: [{ type: HostListener, args: ['document:touchend'] }], onTouchMove: [{ type: HostListener, args: ['document:touchmove', ['$event']] }], allowDrag: [{ type: Input, args: ['dMovable'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9tb2RhbC9tb3ZhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7QUFLN0csTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFtQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQVJqQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUM7UUE2Rm5CLHNCQUFpQixHQUFHLFVBQVUsTUFBTSxFQUFFLE9BQU87WUFDM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELGlHQUFpRztZQUNqRyx3QkFBd0I7WUFDeEIsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsMERBQTBEO1lBQzFELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCw2Q0FBNkM7WUFDN0MsS0FBSyxNQUFNLGdCQUFnQixDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxD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VSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQXdCTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVdyQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTTVDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkErQjlDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3RDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBTWpDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFxQzFDLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZE1vdmFibGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vdmFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgdG9wU3RhcnQgPSAwO1xyXG4gIGxlZnRTdGFydCA9IDA7XHJcbiAgX2FsbG93RHJhZyA9IGZhbHNlO1xyXG4gIG1kOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGhhbmRsZTogSFRNTEVsZW1lbnQ7XHJcbiAgQElucHV0KCkgbW92ZUVsOiBIVE1MRWxlbWVudDtcclxuICBwdWJsaWMgZWxlbWVudDogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5tb3ZlRWwgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgLy8gY3NzIGNoYW5nZXNcclxuICAgIGlmICh0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IHsgbW92ZUVsLCBoYW5kbGUgfSA9IGNoYW5nZXM7XHJcbiAgICBpZiAobW92ZUVsKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMubW92ZUVsIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgdGhpcy5hbGxvd0RyYWcgPSB0aGlzLl9hbGxvd0RyYWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyIHx8ICF0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KGV2ZW50LnRhcmdldCwgdGhpcy5oYW5kbGUpKSB7XHJcbiAgICAgIHJldHVybjsgLy8gcHJldmVudHMgcmlnaHQgY2xpY2sgZHJhZywgcmVtb3ZlIGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCBpdFxyXG4gICAgfVxyXG4gICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICB0aGlzLnRvcFN0YXJ0ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuZWxlbWVudC5zdHlsZS50b3AucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB0aGlzLmxlZnRTdGFydCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdC5yZXBsYWNlKCdweCcsICcnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5tZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWQgJiYgdGhpcy5fYWxsb3dEcmFnKSB7XHJcbiAgICAgIC8vIOmYu+atouaLluWKqOi/h+eoi+S4reaWh+Wtl+iiq+mAieS4rVxyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgLy8g5Yik5pat6L6555WM5p2h5Lu2XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcGFyZW50UmVjdCA9IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCBbdHJhbnNsYXRlWCwgdHJhbnNsYXRlWV0gPSB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtLm1hdGNoKC9cXGQrL2cpPy5tYXAoKGl0ZW0pID0+IE51bWJlcihpdGVtKSkgfHwgWzAsIDBdO1xyXG4gICAgICAvLyDlvZPliY3lgY/np7vph49cclxuICAgICAgbGV0IGN1cnJlbnRUb3AgPSBldmVudC5jbGllbnRZIC0gdGhpcy50b3BTdGFydDtcclxuICAgICAgbGV0IGN1cnJlbnRMZWZ0ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMubGVmdFN0YXJ0O1xyXG4gICAgICAvLyDorqHnrpfkuIrkuIvot53nprvvvIzmjInnhadwYXJlbnROb2Rl55qE5L2N572u6K6h566X5YGP56e76YeP77yM5ZCO57utcGFyZW50Tm9kZeWtmOWcqOWBj+enu+mHj++8jOmcgOimgeiAg+iZkeWBj+enu+mHj1xyXG4gICAgICBjb25zdCBtYXhUb3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYXJlbnRSZWN0LnRvcCAtIG1vZGFsUmVjdC5oZWlnaHQ7XHJcbiAgICAgIGN1cnJlbnRUb3AgPVxyXG4gICAgICAgIChwYXJlbnRSZWN0LnRvcCArIGN1cnJlbnRUb3AgKyB0cmFuc2xhdGVZIDw9IDAgJiYgLXBhcmVudFJlY3QudG9wIC0gdHJhbnNsYXRlWSkgfHxcclxuICAgICAgICAobWF4VG9wIC0gY3VycmVudFRvcCAtIHRyYW5zbGF0ZVkgPD0gMCAmJiBtYXhUb3AgLSB0cmFuc2xhdGVZKSB8fFxyXG4gICAgICAgIGN1cnJlbnRUb3A7XHJcbiAgICAgIGNvbnN0IGhhbGZXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIG1vZGFsUmVjdC53aWR0aCkgLyAyO1xyXG4gICAgICAvLyDorqHnrpflt6blj7Pot53nprvvvIzpu5jorqTlsYXkuK3vvIzlkI7nu61wYXJlbnROb2Rl5a2Y5Zyo5YGP56e76YeP77yM6ZyA6KaB6ICD6JmR5YGP56e76YePXHJcbiAgICAgIGN1cnJlbnRMZWZ0ID1cclxuICAgICAgICAoY3VycmVudExlZnQgKyBoYWxmV2lkdGggKyB0cmFuc2xhdGVYIDw9IDAgJiYgLWhhbGZXaWR0aCAtIHRyYW5zbGF0ZVgpIHx8XHJcbiAgICAgICAgKGhhbGZXaWR0aCAtIGN1cnJlbnRMZWZ0IC0gdHJhbnNsYXRlWCA8PSAwICYmIGhhbGZXaWR0aCAtIHRyYW5zbGF0ZVgpIHx8XHJcbiAgICAgICAgY3VycmVudExlZnQ7XHJcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50b3AgPSBjdXJyZW50VG9wICsgJ3B4JztcclxuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQgPSBjdXJyZW50TGVmdCArICdweCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcclxuICBvblRvdWNoU3RhcnQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICB0aGlzLnRvcFN0YXJ0ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuZWxlbWVudC5zdHlsZS50b3AucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB0aGlzLmxlZnRTdGFydCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hlbmQnKVxyXG4gIG9uVG91Y2hFbmQoKSB7XHJcbiAgICB0aGlzLm1kID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hNb3ZlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm1kICYmIHRoaXMuX2FsbG93RHJhZykge1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gYCR7ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMudG9wU3RhcnR9cHhgO1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2V2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmxlZnRTdGFydH1weGA7XHJcbiAgICB9XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGNoZWNrSGFuZGxlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgZWxlbWVudCkge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIENoZWNrcyBpZiB0aGUgdGFyZ2V0IGlzIHRoZSBlbGVtZW50IGNsaWNrZWQsIHRoZW4gY2hlY2tzIGVhY2ggY2hpbGQgZWxlbWVudCBvZiBlbGVtZW50IGFzIHdlbGxcclxuICAgIC8vIElnbm9yZXMgYnV0dG9uIGNsaWNrc1xyXG4gICAgLy8gSWdub3JlIGVsZW1lbnRzIG9mIHR5cGUgYnV0dG9uXHJcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdGFyZ2V0IHdhcyBmb3VuZCwgcmV0dXJuIHRydWUgKGhhbmRsZSB3YXMgZm91bmQpXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gUmVjdXJzaXZlbHkgaXRlcmF0ZSB0aGlzIGVsZW1lbnRzIGNoaWxkcmVuXHJcbiAgICBmb3IgKGNvbnN0IC8qKiBAdHlwZSB7P30gKi8gY2hpbGQgaW4gZWxlbWVudC5jaGlsZHJlbikge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVsZW1lbnQuY2hpbGRyZW4sIGNoaWxkKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgZWxlbWVudC5jaGlsZHJlbltjaGlsZF0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSB3YXMgbm90IGZvdW5kIGluIHRoaXMgbGluZWFnZVxyXG4gICAgLy8gTm90ZTogcmV0dXJuIGZhbHNlIGlzIGlnbm9yZSB1bmxlc3MgaXQgaXMgdGhlIHBhcmVudCBlbGVtZW50XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgQElucHV0KCdkTW92YWJsZScpXHJcbiAgc2V0IGFsbG93RHJhZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fYWxsb3dEcmFnID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dEcmFnICYmIHRoaXMuaGFuZGxlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlLnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19