UNPKG

sa-modals

Version:

Angular Modal Library: A versatile and accessible modal component for Angular applications, designed to enhance user experience with smooth animations and responsive design. This library leverages Angular's CDK to create dynamic overlays, ensuring seamles

138 lines 21.3 kB
import { trigger, transition, style, animate } from '@angular/animations'; import { Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core'; import { HeaderComponent } from './components/header/header.component'; import { OverlayConfig } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "./sa-modal.service"; import * as i3 from "@angular/cdk/a11y"; import * as i4 from "@angular/common"; const uReveal = trigger('uReveal', [ transition(':enter', [ style({ transform: 'translateY(-30%)', opacity: 0 }), animate('300ms ease', style({ transform: 'translateY(0%)', opacity: 1 })), ]), transition(':leave', [ style({ transform: 'translateY(0%)', opacity: 1 }), animate('300ms ease', style({ transform: 'translateY(-30%)', opacity: 0 })), ]), ]); export class SaModalComponent { onPopState(event) { if (this.visible) { event.preventDefault(); this.close(); } } constructor(overlay, viewContainerRef, cdr, service, focusTrapFactory) { this.overlay = overlay; this.viewContainerRef = viewContainerRef; this.cdr = cdr; this.service = service; this.focusTrapFactory = focusTrapFactory; this.center = false; this.extraClass = this.service.config.extraClass || ''; this.saWidth = this.service.config.saWidth || 600; this.hasBackdrop = this.service.config.hasBackdrop || true; this.staticBackdrop = false; this.closeWithESC = this.service.config.closeWithESC || true; this.onOpen = new EventEmitter(); this.onClose = new EventEmitter(); this.backdropClicked = new EventEmitter(); this.visible = false; this.subscriptions = []; } ngAfterViewInit() { this.subscriptions.push(this.header.status.subscribe((status) => { this.close(); })); } open() { const conf = new OverlayConfig({ hasBackdrop: this.hasBackdrop, backdropClass: 'sa-modal-backdrop', panelClass: 'sa-modal' + this.extraClass, scrollStrategy: this.overlay.scrollStrategies.block(), positionStrategy: this.overlay.position().global().centerHorizontally(), }); if (this.center) conf.positionStrategy = this.overlay .position() .global() .centerHorizontally() .centerVertically(); this.overlayRef = this.overlay.create(conf); const modalPortal = new TemplatePortal(this.overlayTemplate, this.viewContainerRef); this.visible = true; history.pushState({ modalOpen: true }, ''); this.overlayRef.attach(modalPortal); this.onOpen.emit(); this.cdr.detectChanges(); this.focusTrap = this.focusTrapFactory.create(this.contentRef.nativeElement); this.contentRef.nativeElement.focus(); this.subscriptions.push(this.overlayRef.backdropClick().subscribe(() => { this.backdropClicked.emit(); if (!this.staticBackdrop) { this.close(); } })); this.subscriptions.push(this.overlayRef.keydownEvents().subscribe((e) => { if (e.key == 'Escape' && this.closeWithESC) { this.close(); } })); document.body.classList.add('modal-opened'); } close() { this.visible = false; this.overlayRef.backdropElement?.classList.remove('cdk-overlay-backdrop-showing'); setTimeout(() => { this.overlayRef.dispose(); document.body.classList.remove('modal-opened'); this.onClose.emit(); }, 300); } ngOnDestroy() { this.subscriptions.forEach((e) => { e.unsubscribe(); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: SaModalComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i2.SaModalService }, { token: i3.FocusTrapFactory }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: SaModalComponent, selector: "sa-modal", inputs: { center: "center", extraClass: "extraClass", saWidth: "saWidth", hasBackdrop: "hasBackdrop", staticBackdrop: "staticBackdrop", closeWithESC: "closeWithESC" }, outputs: { onOpen: "onOpen", onClose: "onClose", backdropClicked: "backdropClicked" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, queries: [{ propertyName: "header", first: true, predicate: HeaderComponent, descendants: true }], viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true }, { propertyName: "overlayTemplate", first: true, predicate: ["overlayTemplate"], descendants: true }], ngImport: i0, template: "<ng-template #overlayTemplate>\r\n <div #content *ngIf=\"visible\" class=\"sa-modal-content\" [style]=\"'--sa-modal-width:'+saWidth+'px '\"\r\n [@uReveal]>\r\n <ng-content></ng-content>\r\n </div>\r\n</ng-template>", styles: [".sa-modal{--modal-bg-color: #fff;--modal-border-color: #e5e5e5;--neutral-50: #fafafa;--neutral-100: #f5f5f5;--modal-transition: .3s;--radius: 8px;height:fit-content;padding:0 8px}.sa-modal .sa-modal-content{background:var(--modal-bg-color);max-width:100%;width:var(--sa-modal-width);margin:16px auto;padding:0 16px;overflow:hidden;border-radius:var(--radius);overflow:auto}.sa-modal-backdrop{background-color:#00000040}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [uReveal], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: SaModalComponent, decorators: [{ type: Component, args: [{ selector: 'sa-modal', encapsulation: ViewEncapsulation.None, animations: [uReveal], template: "<ng-template #overlayTemplate>\r\n <div #content *ngIf=\"visible\" class=\"sa-modal-content\" [style]=\"'--sa-modal-width:'+saWidth+'px '\"\r\n [@uReveal]>\r\n <ng-content></ng-content>\r\n </div>\r\n</ng-template>", styles: [".sa-modal{--modal-bg-color: #fff;--modal-border-color: #e5e5e5;--neutral-50: #fafafa;--neutral-100: #f5f5f5;--modal-transition: .3s;--radius: 8px;height:fit-content;padding:0 8px}.sa-modal .sa-modal-content{background:var(--modal-bg-color);max-width:100%;width:var(--sa-modal-width);margin:16px auto;padding:0 16px;overflow:hidden;border-radius:var(--radius);overflow:auto}.sa-modal-backdrop{background-color:#00000040}\n"] }] }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i2.SaModalService }, { type: i3.FocusTrapFactory }], propDecorators: { onPopState: [{ type: HostListener, args: ['window:popstate', ['$event']] }], center: [{ type: Input }], extraClass: [{ type: Input }], saWidth: [{ type: Input }], hasBackdrop: [{ type: Input }], staticBackdrop: [{ type: Input }], closeWithESC: [{ type: Input }], onOpen: [{ type: Output }], onClose: [{ type: Output }], backdropClicked: [{ type: Output }], header: [{ type: ContentChild, args: [HeaderComponent] }], contentRef: [{ type: ViewChild, args: ['content', { static: false }] }], overlayTemplate: [{ type: ViewChild, args: ['overlayTemplate'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2EtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2EtbW9kYWwvc3JjL2xpYi9zYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zYS1tb2RhbC9zcmMvbGliL3NhLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUVULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBR3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUU7SUFDakMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUNuQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzFFLENBQUM7SUFDRixVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ25CLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbEQsT0FBTyxDQUFDLFlBQVksRUFBRSxL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RUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRXZDLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2FNb2RhbFNlcnZpY2UgfSBmcm9tICcuL3NhLW1vZGFsLnNlcnZpY2UnO1xyXG5jb25zdCB1UmV2ZWFsID0gdHJpZ2dlcigndVJldmVhbCcsIFtcclxuICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTMwJSknLCBvcGFjaXR5OiAwIH0pLFxyXG4gICAgYW5pbWF0ZSgnMzAwbXMgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknLCBvcGFjaXR5OiAxIH0pKSxcclxuICBdKSxcclxuICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJywgb3BhY2l0eTogMSB9KSxcclxuICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTMwJSknLCBvcGFjaXR5OiAwIH0pKSxcclxuICBdKSxcclxuXSk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2EtbW9kYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiBgLi9zYS1tb2RhbC5jb21wb25lbnQuaHRtbGAsXHJcbiAgc3R5bGVVcmxzOiBbYC4vc2EtbW9kYWwuY29tcG9uZW50LnNjc3NgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGFuaW1hdGlvbnM6IFt1UmV2ZWFsXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb3BzdGF0ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Qb3BTdGF0ZShldmVudDogUG9wU3RhdGVFdmVudCkge1xyXG4gICAgaWYgKHRoaXMudmlzaWJsZSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBjZW50ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBleHRyYUNsYXNzOiBzdHJpbmcgPSB0aGlzLnNlcnZpY2UuY29uZmlnLmV4dHJhQ2xhc3MgfHwgJyc7XHJcbiAgQElucHV0KCkgc2FXaWR0aDogbnVtYmVyID0gdGhpcy5zZXJ2aWNlLmNvbmZpZy5zYVdpZHRoIHx8IDYwMDtcclxuICBASW5wdXQoKSBoYXNCYWNrZHJvcDogYm9vbGVhbiA9IHRoaXMuc2VydmljZS5jb25maWcuaGFzQmFja2Ryb3AgfHwgdHJ1ZTtcclxuICBASW5wdXQoKSBzdGF0aWNCYWNrZHJvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsb3NlV2l0aEVTQzogYm9vbGVhbiA9IHRoaXMuc2VydmljZS5jb25maWcuY2xvc2VXaXRoRVNDIHx8IHRydWU7XHJcblxyXG4gIEBPdXRwdXQoKSBvbk9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xyXG4gIEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcclxuICBAT3V0cHV0KCkgYmFja2Ryb3BDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChIZWFkZXJDb21wb25lbnQpIGhlYWRlciE6IEhlYWRlckNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdjb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRlbnRSZWYhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlUZW1wbGF0ZScpXHJcbiAgb3ZlcmxheVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmITogT3ZlcmxheVJlZjtcclxuICBwcml2YXRlIGZvY3VzVHJhcCE6IEZvY3VzVHJhcDtcclxuICB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNhTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXBGYWN0b3J5OiBGb2N1c1RyYXBGYWN0b3J5XHJcbiAgKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5oZWFkZXIuc3RhdHVzLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9wZW4oKSB7XHJcbiAgICBjb25zdCBjb25mID0gbmV3IE92ZXJsYXlDb25maWcoe1xyXG4gICAgICBoYXNCYWNrZHJvcDogdGhpcy5oYXNCYWNrZHJvcCxcclxuICAgICAgYmFja2Ryb3BDbGFzczogJ3NhLW1vZGFsLWJhY2tkcm9wJyxcclxuICAgICAgcGFuZWxDbGFzczogJ3NhLW1vZGFsJyArIHRoaXMuZXh0cmFDbGFzcyxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLFxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5jZW50ZXIpXHJcbiAgICAgIGNvbmYucG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxyXG4gICAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgICAgLmdsb2JhbCgpXHJcbiAgICAgICAgLmNlbnRlckhvcml6b250YWxseSgpXHJcbiAgICAgICAgLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoY29uZik7XHJcbiAgICBjb25zdCBtb2RhbFBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcclxuICAgICAgdGhpcy5vdmVybGF5VGVtcGxhdGUsXHJcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZlxyXG4gICAgKTtcclxuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IG1vZGFsT3BlbjogdHJ1ZSB9LCAnJyk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG1vZGFsUG9ydGFsKTtcclxuICAgIHRoaXMub25PcGVuLmVtaXQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZShcclxuICAgICAgdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICk7XHJcbiAgICB0aGlzLmNvbnRlbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmJhY2tkcm9wQ2xpY2tlZC5lbWl0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0JhY2tkcm9wKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLmtleSA9PSAnRXNjYXBlJyAmJiB0aGlzLmNsb3NlV2l0aEVTQykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW5lZCcpO1xyXG4gIH1cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZShcclxuICAgICAgJ2Nkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcnXHJcbiAgICApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbmVkJyk7XHJcbiAgICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgIGUudW5zdWJzY3JpYmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bmctdGVtcGxhdGUgI292ZXJsYXlUZW1wbGF0ZT5cclxuICA8ZGl2ICNjb250ZW50ICpuZ0lmPVwidmlzaWJsZVwiIGNsYXNzPVwic2EtbW9kYWwtY29udGVudFwiICAgW3N0eWxlXT1cIictLXNhLW1vZGFsLXdpZHRoOicrc2FXaWR0aCsncHggJ1wiXHJcbiAgICBbQHVSZXZlYWxdPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==