UNPKG

ngx-input-color

Version:

Angular color input component and color picker (with HSL, HSV, RGB, CMYK, HEX, alpha, eye-dropper, etc)

156 lines 20.2 kB
import { Directive, HostListener, Inject, Input, forwardRef, } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms'; import { DOCUMENT } from '@angular/common'; import { NgxBoxShadowComponent } from '../lib/ngx-box-shadow/ngx-box-shadow.component'; import * as i0 from "@angular/core"; export class NgxInputBoxShadowDirective { constructor(_doc, el, renderer, viewContainerRef) { this._doc = _doc; this.el = el; this.renderer = renderer; this.viewContainerRef = viewContainerRef; this.setInputBackground = true; this.isDisabled = false; this.value = ''; this._onChange = (value) => { }; this._onTouched = () => { }; this._onValidateChange = () => { }; } onClick(ev) { ev.stopPropagation(); ev.preventDefault(); this.toggleColorPicker(); } registerOnChange(fn) { this._onChange = fn; } registerOnTouched(fn) { this._onTouched = fn; } setDisabledState(disabled) { this.isDisabled = disabled; } registerOnValidatorChange(fn) { this._onValidateChange = fn; } validate(control) { return null; } ngOnDestroy() { this.destroyPicker(); } writeValue(value) { this.value = value; } toggleColorPicker() { if (this.pickerComponentRef) { this.destroyPicker(); return; } // ایجاد کامپوننت this.pickerComponentRef = this.viewContainerRef.createComponent(NgxBoxShadowComponent); const instance = this.pickerComponentRef.instance; instance.writeValue(this.value); // بک‌دراپ this.backdrop = this.renderer.createElement('div'); if (this.backdrop) { this.backdrop.style.cssText = ` background: #5e5e5e1e; position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow: auto; transition: all 300ms; z-index: 1000; `; this.backdrop.onclick = () => this.destroyPicker(); } // گرفتن المنت کامپوننت واقعی this.pickerEl = this.pickerComponentRef.hostView.rootNodes[0]; this.renderer.appendChild(this.backdrop, this.pickerEl); this.renderer.appendChild(this._doc.body, this.backdrop); this.setPosition(); } setPosition() { setTimeout(() => { if (!this.pickerEl || !this.pickerComponentRef) return; const hostRect = this.el.nativeElement.getBoundingClientRect(); const pickerEl = this.pickerEl; // اعمال موقتی برای گرفتن سایز دقیق this.renderer.setStyle(pickerEl, 'position', 'absolute'); this.renderer.setStyle(pickerEl, 'z-index', '9999'); this._doc.body.appendChild(pickerEl); // لازم برای محاسبه دقیق اندازه const pickerRect = pickerEl.getBoundingClientRect(); // وسط‌چین کردن افقی let left = hostRect.left + hostRect.width / 2 - pickerRect.width / 2; let top = hostRect.bottom; // جلوگیری از بیرون زدن از راست if (left + pickerRect.width > window.innerWidth) { left = window.innerWidth - pickerRect.width - 8; } // جلوگیری از بیرون زدن از چپ if (left < 8) { left = 8; } // اگر از پایین بیرون زد، ببر بالا if (top + pickerRect.height > window.innerHeight) { top = hostRect.top - pickerRect.height; } // جلوگیری از بیرون زدن از بالا if (top < 8) { top = 8; } this.renderer.setStyle(pickerEl, 'top', `${top}px`); this.renderer.setStyle(pickerEl, 'left', `${left}px`); }); } destroyPicker() { if (this.pickerComponentRef) { this.pickerComponentRef.destroy(); this.pickerComponentRef = undefined; } if (this.backdrop && this.backdrop.parentNode) { this.renderer.removeChild(this._doc.body, this.backdrop); this.backdrop = undefined; } this.pickerEl = undefined; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputBoxShadowDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: NgxInputBoxShadowDirective, selector: "[ngxInputBoxShadow]", inputs: { setInputBackground: "setInputBackground" }, host: { listeners: { "click": "onClick($event)", "window:resize": "setPosition($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputBoxShadowDirective), multi: true }, { provide: NG_VALIDATORS, multi: true, useExisting: NgxInputBoxShadowDirective, }, ], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputBoxShadowDirective, decorators: [{ type: Directive, args: [{ selector: '[ngxInputBoxShadow]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputBoxShadowDirective), multi: true }, { provide: NG_VALIDATORS, multi: true, useExisting: NgxInputBoxShadowDirective, }, ], }] }], ctorParameters: () => [{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }], propDecorators: { setInputBackground: [{ type: Input }], onClick: [{ type: HostListener, args: ['click', ['$event']] }], setPosition: [{ type: HostListener, args: ['window:resize', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlucHV0LWJveC1zaGFkb3cuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWlucHV0LWNvbG9yL3NyYy9kaXJlY3RpdmVzL25neC1pbnB1dC1ib3gtc2hhZG93LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7QUFhdkYsTUFBTSxPQUFPLDBCQUEwQjtJQWFyQyxZQUM0QixJQUFjLEVBQ2hDLEVBQWMsRUFDZCxRQUFtQixFQUNuQixnQkFBa0M7UUFIaEIsU0FBSSxHQUFKLElBQUksQ0FBVTtRQUNoQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBaEJuQyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFLbkMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsY0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDbEMsZUFBVSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUN0QixzQkFBaUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFNMUIsQ0FBQztJQUUrQixPQUFPLENBQUMsRUFBUztRQUNsRCxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsRUFBRSxDQUFDLGNB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QjtzQkFBMUIsS0FBSztnQkFtQjZCLE9BQU87c0JBQXpDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1FakMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIE5HX1ZBTElEQVRPUlMsXHJcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgVmFsaWRhdGlvbkVycm9ycyxcclxuICBWYWxpZGF0b3IsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb2xvckluc3BlY3RvciB9IGZyb20gJy4uL21vZGVscy9Db2xvckluc3BlY3Rvci5lbnVtJzsgXHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJzsgXHJcbmltcG9ydCB7IE5neEJveFNoYWRvd0NvbXBvbmVudCB9IGZyb20gJy4uL2xpYi9uZ3gtYm94LXNoYWRvdy9uZ3gtYm94LXNoYWRvdy5jb21wb25lbnQnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmd4SW5wdXRCb3hTaGFkb3ddJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neElucHV0Qm94U2hhZG93RGlyZWN0aXZlKSwgbXVsdGk6IHRydWUgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBOZ3hJbnB1dEJveFNoYWRvd0RpcmVjdGl2ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neElucHV0Qm94U2hhZG93RGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcclxuICBASW5wdXQoKSBzZXRJbnB1dEJhY2tncm91bmQgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHBpY2tlckNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxOZ3hCb3hTaGFkb3dDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgYmFja2Ryb3A/OiBIVE1MRGl2RWxlbWVudDtcclxuICBwcml2YXRlIHBpY2tlckVsPzogSFRNTEVsZW1lbnQ7XHJcbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICB2YWx1ZSA9ICcnO1xyXG5cclxuICBfb25DaGFuZ2UgPSAodmFsdWU6IHN0cmluZykgPT4ge307XHJcbiAgX29uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG4gIF9vblZhbGlkYXRlQ2hhbmdlID0gKCkgPT4ge307XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2M6IERvY3VtZW50LFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxyXG4gICkge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKSBvbkNsaWNrKGV2OiBFdmVudCkge1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy50b2dnbGVDb2xvclBpY2tlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Rpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMuX29uVmFsaWRhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveVBpY2tlcigpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgIFxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sb3JQaWNrZXIoKSB7XHJcbiAgICBpZiAodGhpcy5waWNrZXJDb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5kZXN0cm95UGlja2VyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDYp9uM2KzYp9ivINqp2KfZhdm+2YjZhtmG2KpcclxuICAgIHRoaXMucGlja2VyQ29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChOZ3hCb3hTaGFkb3dDb21wb25lbnQpO1xyXG5cclxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5waWNrZXJDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICBpbnN0YW5jZS53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xyXG5cclxuICAgIC8vINio2qnigIzYr9ix2KfZvlxyXG4gICAgdGhpcy5iYWNrZHJvcCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBpZiAodGhpcy5iYWNrZHJvcCkge1xyXG4gICAgICB0aGlzLmJhY2tkcm9wLnN0eWxlLmNzc1RleHQgPSBgXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAjNWU1ZTVlMWU7XHJcbiAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgICAgICBib3R0b206IDA7XHJcbiAgICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAzMDBtcztcclxuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XHJcbiAgICAgICAgYDtcclxuICAgICAgdGhpcy5iYWNrZHJvcC5vbmNsaWNrID0gKCkgPT4gdGhpcy5kZXN0cm95UGlja2VyKCk7XHJcbiAgICB9XHJcbiAgICAvLyDar9ix2YHYqtmGINin2YTZhdmG2Kog2qnYp9mF2b7ZiNmG2YbYqiDZiNin2YLYuduMXHJcbiAgICB0aGlzLnBpY2tlckVsID0gKHRoaXMucGlja2VyQ29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIGFueSkucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJhY2tkcm9wLCB0aGlzLnBpY2tlckVsKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZG9jLmJvZHksIHRoaXMuYmFja2Ryb3ApO1xyXG4gICAgdGhpcy5zZXRQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgc2V0UG9zaXRpb24oKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnBpY2tlckVsIHx8ICF0aGlzLnBpY2tlckNvbXBvbmVudFJlZikgcmV0dXJuO1xyXG4gICAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcGlja2VyRWwgPSB0aGlzLnBpY2tlckVsO1xyXG5cclxuICAgICAgLy8g2KfYudmF2KfZhCDZhdmI2YLYqtuMINio2LHYp9uMINqv2LHZgdiq2YYg2LPYp9uM2LIg2K/ZgtuM2YJcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwaWNrZXJFbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGlja2VyRWwsICd6LWluZGV4JywgJzk5OTknKTtcclxuXHJcbiAgICAgIHRoaXMuX2RvYy5ib2R5LmFwcGVuZENoaWxkKHBpY2tlckVsKTsgLy8g2YTYp9iy2YUg2KjYsdin24wg2YXYrdin2LPYqNmHINiv2YLbjNmCINin2YbYr9in2LLZh1xyXG5cclxuICAgICAgY29uc3QgcGlja2VyUmVjdCA9IHBpY2tlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgLy8g2YjYs9i34oCM2obbjNmGINqp2LHYr9mGINin2YHZgtuMXHJcbiAgICAgIGxldCBsZWZ0ID0gaG9zdFJlY3QubGVmdCArIGhvc3RSZWN0LndpZHRoIC8gMiAtIHBpY2tlclJlY3Qud2lkdGggLyAyO1xyXG4gICAgICBsZXQgdG9wID0gaG9zdFJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgLy8g2KzZhNmI2q/bjNix24wg2KfYsiDYqNuM2LHZiNmGINiy2K/ZhiDYp9iyINix2KfYs9iqXHJcbiAgICAgIGlmIChsZWZ0ICsgcGlja2VyUmVjdC53aWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgbGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcGlja2VyUmVjdC53aWR0aCAtIDg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vINis2YTZiNqv24zYsduMINin2LIg2KjbjNix2YjZhiDYstiv2YYg2KfYsiDahtm+XHJcbiAgICAgIGlmIChsZWZ0IDwgOCkge1xyXG4gICAgICAgIGxlZnQgPSA4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDYp9qv2LEg2KfYsiDZvtin24zbjNmGINio24zYsdmI2YYg2LLYr9iMINio2KjYsSDYqNin2YTYp1xyXG4gICAgICBpZiAodG9wICsgcGlja2VyUmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcclxuICAgICAgICB0b3AgPSBob3N0UmVjdC50b3AgLSBwaWNrZXJSZWN0LmhlaWdodDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g2KzZhNmI2q/bjNix24wg2KfYsiDYqNuM2LHZiNmGINiy2K/ZhiDYp9iyINio2KfZhNinXHJcbiAgICAgIGlmICh0b3AgPCA4KSB7XHJcbiAgICAgICAgdG9wID0gODtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwaWNrZXJFbCwgJ3RvcCcsIGAke3RvcH1weGApO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBpY2tlckVsLCAnbGVmdCcsIGAke2xlZnR9cHhgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveVBpY2tlcigpIHtcclxuICAgIGlmICh0aGlzLnBpY2tlckNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLnBpY2tlckNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucGlja2VyQ29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgdGhpcy5iYWNrZHJvcC5wYXJlbnROb2RlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5fZG9jLmJvZHksIHRoaXMuYmFja2Ryb3ApO1xyXG4gICAgICB0aGlzLmJhY2tkcm9wID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5waWNrZXJFbCA9IHVuZGVmaW5lZDtcclxuICB9XHJcbn1cclxuIl19