@developer-partners/ngx-modal-dialog
Version:
1. Install the libary
88 lines • 27.7 kB
JavaScript
import { Component, ViewChild, ViewContainerRef, ViewEncapsulation, EnvironmentInjector } from "@angular/core";
import { ModalSize } from './modal-config';
import * as i0 from "@angular/core";
import * as i1 from "./modal-reference";
import * as i2 from "@angular/common";
export class ModalComponent {
constructor(changeDetectorRef, modalRefernce) {
this.modalSize = ModalSize;
this._changeDetectorRef = changeDetectorRef;
this.modalReference = modalRefernce;
}
createModalContent(componentType) {
this.contentContainer.clear();
return this.contentContainer.createComponent(componentType, {
injector: this.elementInjector ?? this.contentContainer.injector,
environmentInjector: this.envInjector ?? this.contentContainer.injector.get(EnvironmentInjector)
});
}
ngAfterViewInit() {
this.componentRef = this.createModalContent(this.contentComponentType);
// To update the view.
this._changeDetectorRef.detectChanges();
// To take focus from a button clicked behind the modal;
this.bodyElement.nativeElement.focus();
}
ngOnDestroy() {
if (this.componentRef) {
this.componentRef.destroy();
}
}
isBackdropElement(target) {
let targetElement = target;
if (targetElement.classList.contains('dp-backdrop')) {
return true;
}
if (targetElement.classList.contains('dp-close-modal')) {
return true;
}
return false;
}
mouseDownEvent(event, backdropCliecked) {
// The backdropCliecked will be false if the event is just bubbled up from a child element.
if (backdropCliecked && !this.isBackdropElement(event.target)) {
return;
}
// Mark the mouse button pressed to check on the mouseUp event.
this._mouseDownPressed = !this._mouseDownPressed;
}
mouseUpEvent(event) {
// Check if the mouse was clicked on the backdrop.
if (this._mouseDownPressed) {
// Check if the mouse button was released on the backdrop
if (this.isBackdropElement(event.target)) {
// If mouse button was released on the backdrop, close the modal.
event.stopPropagation();
this.modalReference.cancel();
}
}
}
keyUpEvent(event) {
// Close on the Esc key press.
if (event.which === 27) {
this.modalReference.cancel();
}
}
maximize() {
this.modalReference.config.mode = 'fullScreen';
}
restoreWindow() {
this.modalReference.config.mode = 'default';
}
close() {
this.modalReference.cancel();
}
}
ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ModalComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ModalReference }], target: i0.ɵɵFactoryTarget.Component });
ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: ModalComponent, selector: "dp-modal", viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "bodyElement", first: true, predicate: ["bodyElement"], descendants: true }], ngImport: i0, template: "<div class=\"dp-backdrop dp-modal-backdrop\"\r\n (mousedown)=\"mouseDownEvent($event, true)\"\r\n (mouseup)=\"mouseUpEvent($event)\"\r\n (keyup)=\"keyUpEvent($event)\">\r\n <div class=\"dp-modal\"\r\n [class.dp-large]=\"modalReference.config?.size === modalSize.large\"\r\n [class.dp-extra-large]=\"modalReference.config?.size === modalSize.extraLarge\"\r\n [class.dp-medium]=\"modalReference.config?.size === modalSize.medium\"\r\n [class.dp-full-screen-modal]=\"modalReference.config?.mode === 'fullScreen'\"\r\n [class.dp-disable-full-screen]=\"modalReference.config?.mode === 'disableFullScreen'\"\r\n [class.dp-modal-position-top]=\"modalReference.config?.position === 'top'\"\r\n [class.dp-modal-position-bottom]=\"modalReference.config?.position === 'bottom'\"\r\n [class.dp-modal-position-left]=\"modalReference.config?.position === 'left'\"\r\n [class.dp-modal-position-right]=\"modalReference.config?.position === 'right'\">\r\n\r\n <div class=\"dp-modal-header\"\r\n [class.dp-warning]=\"modalReference.config?.type === 'warning'\"\r\n [class.dp-error]=\"modalReference.config?.type === 'error'\"\r\n [class.dp-success]=\"modalReference.config?.type === 'success'\">\r\n <h2 class=\"dp-title\">\r\n {{modalReference.config?.title}}\r\n </h2>\r\n\r\n <ng-container *ngIf=\"modalReference.config?.mode != 'disableFullScreen'\">\r\n <button *ngIf=\"modalReference.config?.mode != 'fullScreen'\"\r\n (click)=\"maximize()\"\r\n title=\"Maximize\"\r\n aria-label=\"Maximize\">\r\n <span class=\"material-icons\">\r\n fullscreen\r\n </span>\r\n </button>\r\n\r\n <button *ngIf=\"modalReference.config?.mode == 'fullScreen'\"\r\n (click)=\"restoreWindow()\"\r\n title=\"Restore Window Size\"\r\n aria-label=\"Restore Window Size\">\r\n <span class=\"material-icons\">\r\n fullscreen_exit\r\n </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"dp-close-modal\"\r\n (click)=\"close()\"\r\n title=\"Close\"\r\n aria-label=\"Close\">\r\n <span class=\"material-icons\">\r\n close\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div #bodyElement class=\"dp-modal-body\" tabindex=\"-1\">\r\n <ng-template #contentContainer></ng-template>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.dp-modal-backdrop{display:flex;align-items:center;justify-content:center}.dp-backdrop{position:fixed;width:100%;height:100%;inset:0;z-index:49;background-color:#313a4259}.dp-modal{display:flex;flex-direction:column;min-width:280px;min-height:100px;max-width:800px;transition:all .4s cubic-bezier(.65,.07,.35,.92);opacity:0;filter:alpha(opacity=0);transform:scale(.3);background-color:#fff;border-radius:5px;overflow:auto;max-height:95%;position:absolute}.dp-modal.dp-modal-position-top{top:-100%}.dp-modal.dp-modal-position-bottom{bottom:-100%}.dp-modal.dp-modal-position-left{left:-100%}.dp-modal.dp-modal-position-right{right:-100%}.dp-modal.dp-modal-position-top,.dp-modal.dp-modal-position-bottom{width:100%;min-width:100%;height:50%}.dp-modal.dp-modal-position-left,.dp-modal.dp-modal-position-right{height:100%;min-height:100%;width:0}.dp-modal.dp-modal-position-top,.dp-modal.dp-modal-position-bottom,.dp-modal.dp-modal-position-left,.dp-modal.dp-modal-position-right{transition:all .4s ease-in-out;transform:scale(1);border-radius:0}.dp-modal.dp-modal-position-top .dp-modal-header,.dp-modal.dp-modal-position-bottom .dp-modal-header,.dp-modal.dp-modal-position-left .dp-modal-header,.dp-modal.dp-modal-position-right .dp-modal-header{border-radius:0}.dp-visible .dp-modal{transform:scale(1);opacity:1;filter:alpha(opacity=100)}.dp-visible .dp-modal.dp-modal-position-top{top:0}.dp-visible .dp-modal.dp-modal-position-bottom{bottom:0}.dp-visible .dp-modal.dp-modal-position-left{left:0}.dp-visible .dp-modal.dp-modal-position-right{right:0}.dp-modal-header{display:flex;background-color:#244b8c;border-radius:5px 5px 0 0;color:#e2dfdf;padding:1px 1px 1px 14px}.dp-modal-header button{border:0;background-color:transparent;color:#e2dfdf;padding:8px}.dp-modal-header .dp-title{font-size:20px;margin:.7rem 0;width:calc(100% - 35px)}.dp-modal-body{padding:20px;overflow:auto;outline:none;height:100%}.dp-modal.dp-large{min-width:40%}.dp-modal.dp-extra-large{min-width:70%}@media screen and (max-width: 1400px){.dp-modal.dp-large{min-width:40%}}@media screen and (max-width: 1200px){.dp-modal,.dp-modal.dp-large{max-width:80%;min-width:60%}.dp-modal.dp-extra-large{max-width:80%;min-width:80%}}.dp-modal.dp-full-screen-modal,.dp-modal.dp-large.dp-full-screen-modal,.dp-modal.dp-extra-large.dp-full-screen-modal{width:100%;min-width:100%;height:100%;min-height:100%;max-height:100%;max-width:none}.dp-modal.dp-full-screen-modal,.dp-modal.dp-full-screen-modal .dp-modal-header,.dp-modal.dp-large.dp-full-screen-modal,.dp-modal.dp-large.dp-full-screen-modal .dp-modal-header,.dp-modal.dp-extra-large.dp-full-screen-modal,.dp-modal.dp-extra-large.dp-full-screen-modal .dp-modal-header{border-radius:0}@media screen and (max-width: 960px){.dp-modal:not(.dp-disable-full-screen),.dp-modal.dp-large:not(.dp-disable-full-screen),.dp-modal.dp-extra-large:not(.dp-disable-full-screen){width:100%;min-width:100%;height:100%;min-height:95%;max-height:100%;max-width:none}.dp-modal,.dp-modal-header{border-radius:0}}.dp-warning{background-color:#df9308}.dp-success{background-color:#0e940e}.dp-error{background-color:#c41111}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: ModalComponent, decorators: [{
type: Component,
args: [{ selector: 'dp-modal', encapsulation: ViewEncapsulation.None, template: "<div class=\"dp-backdrop dp-modal-backdrop\"\r\n (mousedown)=\"mouseDownEvent($event, true)\"\r\n (mouseup)=\"mouseUpEvent($event)\"\r\n (keyup)=\"keyUpEvent($event)\">\r\n <div class=\"dp-modal\"\r\n [class.dp-large]=\"modalReference.config?.size === modalSize.large\"\r\n [class.dp-extra-large]=\"modalReference.config?.size === modalSize.extraLarge\"\r\n [class.dp-medium]=\"modalReference.config?.size === modalSize.medium\"\r\n [class.dp-full-screen-modal]=\"modalReference.config?.mode === 'fullScreen'\"\r\n [class.dp-disable-full-screen]=\"modalReference.config?.mode === 'disableFullScreen'\"\r\n [class.dp-modal-position-top]=\"modalReference.config?.position === 'top'\"\r\n [class.dp-modal-position-bottom]=\"modalReference.config?.position === 'bottom'\"\r\n [class.dp-modal-position-left]=\"modalReference.config?.position === 'left'\"\r\n [class.dp-modal-position-right]=\"modalReference.config?.position === 'right'\">\r\n\r\n <div class=\"dp-modal-header\"\r\n [class.dp-warning]=\"modalReference.config?.type === 'warning'\"\r\n [class.dp-error]=\"modalReference.config?.type === 'error'\"\r\n [class.dp-success]=\"modalReference.config?.type === 'success'\">\r\n <h2 class=\"dp-title\">\r\n {{modalReference.config?.title}}\r\n </h2>\r\n\r\n <ng-container *ngIf=\"modalReference.config?.mode != 'disableFullScreen'\">\r\n <button *ngIf=\"modalReference.config?.mode != 'fullScreen'\"\r\n (click)=\"maximize()\"\r\n title=\"Maximize\"\r\n aria-label=\"Maximize\">\r\n <span class=\"material-icons\">\r\n fullscreen\r\n </span>\r\n </button>\r\n\r\n <button *ngIf=\"modalReference.config?.mode == 'fullScreen'\"\r\n (click)=\"restoreWindow()\"\r\n title=\"Restore Window Size\"\r\n aria-label=\"Restore Window Size\">\r\n <span class=\"material-icons\">\r\n fullscreen_exit\r\n </span>\r\n </button>\r\n </ng-container>\r\n <button class=\"dp-close-modal\"\r\n (click)=\"close()\"\r\n title=\"Close\"\r\n aria-label=\"Close\">\r\n <span class=\"material-icons\">\r\n close\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div #bodyElement class=\"dp-modal-body\" tabindex=\"-1\">\r\n <ng-template #contentContainer></ng-template>\r\n </div>\r\n </div>\r\n</div>", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.dp-modal-backdrop{display:flex;align-items:center;justify-content:center}.dp-backdrop{position:fixed;width:100%;height:100%;inset:0;z-index:49;background-color:#313a4259}.dp-modal{display:flex;flex-direction:column;min-width:280px;min-height:100px;max-width:800px;transition:all .4s cubic-bezier(.65,.07,.35,.92);opacity:0;filter:alpha(opacity=0);transform:scale(.3);background-color:#fff;border-radius:5px;overflow:auto;max-height:95%;position:absolute}.dp-modal.dp-modal-position-top{top:-100%}.dp-modal.dp-modal-position-bottom{bottom:-100%}.dp-modal.dp-modal-position-left{left:-100%}.dp-modal.dp-modal-position-right{right:-100%}.dp-modal.dp-modal-position-top,.dp-modal.dp-modal-position-bottom{width:100%;min-width:100%;height:50%}.dp-modal.dp-modal-position-left,.dp-modal.dp-modal-position-right{height:100%;min-height:100%;width:0}.dp-modal.dp-modal-position-top,.dp-modal.dp-modal-position-bottom,.dp-modal.dp-modal-position-left,.dp-modal.dp-modal-position-right{transition:all .4s ease-in-out;transform:scale(1);border-radius:0}.dp-modal.dp-modal-position-top .dp-modal-header,.dp-modal.dp-modal-position-bottom .dp-modal-header,.dp-modal.dp-modal-position-left .dp-modal-header,.dp-modal.dp-modal-position-right .dp-modal-header{border-radius:0}.dp-visible .dp-modal{transform:scale(1);opacity:1;filter:alpha(opacity=100)}.dp-visible .dp-modal.dp-modal-position-top{top:0}.dp-visible .dp-modal.dp-modal-position-bottom{bottom:0}.dp-visible .dp-modal.dp-modal-position-left{left:0}.dp-visible .dp-modal.dp-modal-position-right{right:0}.dp-modal-header{display:flex;background-color:#244b8c;border-radius:5px 5px 0 0;color:#e2dfdf;padding:1px 1px 1px 14px}.dp-modal-header button{border:0;background-color:transparent;color:#e2dfdf;padding:8px}.dp-modal-header .dp-title{font-size:20px;margin:.7rem 0;width:calc(100% - 35px)}.dp-modal-body{padding:20px;overflow:auto;outline:none;height:100%}.dp-modal.dp-large{min-width:40%}.dp-modal.dp-extra-large{min-width:70%}@media screen and (max-width: 1400px){.dp-modal.dp-large{min-width:40%}}@media screen and (max-width: 1200px){.dp-modal,.dp-modal.dp-large{max-width:80%;min-width:60%}.dp-modal.dp-extra-large{max-width:80%;min-width:80%}}.dp-modal.dp-full-screen-modal,.dp-modal.dp-large.dp-full-screen-modal,.dp-modal.dp-extra-large.dp-full-screen-modal{width:100%;min-width:100%;height:100%;min-height:100%;max-height:100%;max-width:none}.dp-modal.dp-full-screen-modal,.dp-modal.dp-full-screen-modal .dp-modal-header,.dp-modal.dp-large.dp-full-screen-modal,.dp-modal.dp-large.dp-full-screen-modal .dp-modal-header,.dp-modal.dp-extra-large.dp-full-screen-modal,.dp-modal.dp-extra-large.dp-full-screen-modal .dp-modal-header{border-radius:0}@media screen and (max-width: 960px){.dp-modal:not(.dp-disable-full-screen),.dp-modal.dp-large:not(.dp-disable-full-screen),.dp-modal.dp-extra-large:not(.dp-disable-full-screen){width:100%;min-width:100%;height:100%;min-height:95%;max-height:100%;max-width:none}.dp-modal,.dp-modal-header{border-radius:0}}.dp-warning{background-color:#df9308}.dp-success{background-color:#0e940e}.dp-error{background-color:#c41111}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.ModalReference }]; }, propDecorators: { contentContainer: [{
type: ViewChild,
args: ['contentContainer', { read: ViewContainerRef }]
}], bodyElement: [{
type: ViewChild,
args: ['bodyElement']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1vZGFsLWRpYWxvZy9zcmMvbGliL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tb2RhbC1kaWFsb2cvc3JjL2xpYi9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFnQixTQUFTLEVBQUUsZ0JBQWdCLEVBQWlFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUU3TSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFVM0MsTUFBTSxPQUFPLGNBQWM7SUFvQnpCLFlBQ0UsaUJBQW9DLEVBQ3BDLGFBQXVDO1FBZGxDLGNBQVMsR0FBRyxTQUFTLENBQUM7UUFnQjNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUN0QyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsYUFBd0I7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUU7WUFDMUQsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVE7WUFDaEUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztTQUNqRyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV2RSxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXhDLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFtQjtRQUMzQyxJQUFJLGFBQWEsR0FBZ0IsTUFBTSxDQUFDO1FBRXhDLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDbkQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQWlCLEVBQUUsZ0JBQXlCO1FBQ2hFLDJGQUEyRjtRQUMzRixJQUFJLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3RCxPQUFNO1NBQ1A7UUFFRCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFTSxZQUFZLENBQUMsS0FBaUI7UUFDbkMsa0RBQWtEO1FBQ2xELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLHlEQUF5RDtZQUN6RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hDLGlFQUFpRTtnQkFDakUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQW9CO1FBQ3BDLDhCQUE4QjtRQUM5QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7SUFDakQsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0IsQ0FBQzs7MkdBekdVLGNBQWM7K0ZBQWQsY0FBYyxpSkFjYyxnQkFBZ0IsMEhDMUJ6RCxpZ0ZBd0RNOzJGRDVDTyxjQUFjO2tCQVIxQixTQUFTOytCQUNFLFVBQVUsaUJBS0wsaUJBQWlCLENBQUMsSUFBSTtxSUFpQjlCLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFJbEQsV0FBVztzQkFEakIsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgQWZ0ZXJWaWV3SW5pdCwgVHlwZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgVmlld0VuY2Fwc3VsYXRpb24sIEVudmlyb25tZW50SW5qZWN0b3IsIEluamVjdG9yLCBJbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE1vZGFsUmVmZXJlbmNlIH0gZnJvbSAnLi9tb2RhbC1yZWZlcmVuY2UnO1xyXG5pbXBvcnQgeyBNb2RhbFNpemUgfSBmcm9tICcuL21vZGFsLWNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RwLW1vZGFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vbW9kYWwuY29tcG9uZW50LnNjc3MnXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmO1xyXG5cclxuICBwcml2YXRlIF9tb3VzZURvd25QcmVzc2VkOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgbW9kYWxSZWZlcmVuY2U6IE1vZGFsUmVmZXJlbmNlPGFueT47XHJcbiAgcHVibGljIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHVibGljIGNvbnRlbnRDb21wb25lbnRUeXBlOiBUeXBlPGFueT47XHJcbiAgcHVibGljIG1vZGFsU2l6ZSA9IE1vZGFsU2l6ZTtcclxuICBwdWJsaWMgY2xhc3NDb25maWc6IGFueTtcclxuXHJcbiAgcHVibGljIGVudkluamVjdG9yPzogRW52aXJvbm1lbnRJbmplY3RvcjtcclxuICBwdWJsaWMgZWxlbWVudEluamVjdG9yPzogSW5qZWN0b3I7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuICBwdWJsaWMgY29udGVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYm9keUVsZW1lbnQnKVxyXG4gIHB1YmxpYyBib2R5RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgbW9kYWxSZWZlcm5jZTogTW9kYWxSZWZlcmVuY2U8YW55LCBhbnk+XHJcbiAgKSB7XHJcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IGNoYW5nZURldGVjdG9yUmVmO1xyXG4gICAgdGhpcy5tb2RhbFJlZmVyZW5jZSA9IG1vZGFsUmVmZXJuY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1vZGFsQ29udGVudChjb21wb25lbnRUeXBlOiBUeXBlPGFueT4pOiBDb21wb25lbnRSZWY8YW55PiB7XHJcbiAgICB0aGlzLmNvbnRlbnRDb250YWluZXIuY2xlYXIoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XHJcbiAgICAgIGluamVjdG9yOiB0aGlzLmVsZW1lbnRJbmplY3RvciA/PyB0aGlzLmNvbnRlbnRDb250YWluZXIuaW5qZWN0b3IsXHJcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IgPz8gdGhpcy5jb250ZW50Q29udGFpbmVyLmluamVjdG9yLmdldChFbnZpcm9ubWVudEluamVjdG9yKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmNyZWF0ZU1vZGFsQ29udGVudCh0aGlzLmNvbnRlbnRDb21wb25lbnRUeXBlKTtcclxuXHJcbiAgICAvLyBUbyB1cGRhdGUgdGhlIHZpZXcuXHJcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgLy8gVG8gdGFrZSBmb2N1cyBmcm9tIGEgYnV0dG9uIGNsaWNrZWQgYmVoaW5kIHRoZSBtb2RhbDtcclxuICAgIHRoaXMuYm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNCYWNrZHJvcEVsZW1lbnQodGFyZ2V0OiBFdmVudFRhcmdldCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRhcmdldEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+dGFyZ2V0O1xyXG5cclxuICAgIGlmICh0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZHAtYmFja2Ryb3AnKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZHAtY2xvc2UtbW9kYWwnKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VEb3duRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGJhY2tkcm9wQ2xpZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIC8vIFRoZSBiYWNrZHJvcENsaWVja2VkIHdpbGwgYmUgZmFsc2UgaWYgdGhlIGV2ZW50IGlzIGp1c3QgYnViYmxlZCB1cCBmcm9tIGEgY2hpbGQgZWxlbWVudC5cclxuICAgIGlmIChiYWNrZHJvcENsaWVja2VkICYmICF0aGlzLmlzQmFja2Ryb3BFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWFyayB0aGUgbW91c2UgYnV0dG9uIHByZXNzZWQgdG8gY2hlY2sgb24gdGhlIG1vdXNlVXAgZXZlbnQuXHJcbiAgICB0aGlzLl9tb3VzZURvd25QcmVzc2VkID0gIXRoaXMuX21vdXNlRG93blByZXNzZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW91c2VVcEV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgbW91c2Ugd2FzIGNsaWNrZWQgb24gdGhlIGJhY2tkcm9wLlxyXG4gICAgaWYgKHRoaXMuX21vdXNlRG93blByZXNzZWQpIHtcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdXNlIGJ1dHRvbiB3YXMgcmVsZWFzZWQgb24gdGhlIGJhY2tkcm9wXHJcbiAgICAgIGlmICh0aGlzLmlzQmFja2Ryb3BFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAvLyBJZiBtb3VzZSBidXR0b24gd2FzIHJlbGVhc2VkIG9uIHRoZSBiYWNrZHJvcCwgY2xvc2UgdGhlIG1vZGFsLlxyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIHRoaXMubW9kYWxSZWZlcmVuY2UuY2FuY2VsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBrZXlVcEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBDbG9zZSBvbiB0aGUgRXNjIGtleSBwcmVzcy5cclxuICAgIGlmIChldmVudC53aGljaCA9PT0gMjcpIHtcclxuICAgICAgdGhpcy5tb2RhbFJlZmVyZW5jZS5jYW5jZWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBtYXhpbWl6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kYWxSZWZlcmVuY2UuY29uZmlnLm1vZGUgPSAnZnVsbFNjcmVlbic7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzdG9yZVdpbmRvdygpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kYWxSZWZlcmVuY2UuY29uZmlnLm1vZGUgPSAnZGVmYXVsdCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKSB7XHJcbiAgICB0aGlzLm1vZGFsUmVmZXJlbmNlLmNhbmNlbCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZHAtYmFja2Ryb3AgZHAtbW9kYWwtYmFja2Ryb3BcIlxyXG4gICAgIChtb3VzZWRvd24pPVwibW91c2VEb3duRXZlbnQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgKG1vdXNldXApPVwibW91c2VVcEV2ZW50KCRldmVudClcIlxyXG4gICAgIChrZXl1cCk9XCJrZXlVcEV2ZW50KCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiZHAtbW9kYWxcIlxyXG4gICAgICAgW2NsYXNzLmRwLWxhcmdlXT1cIm1vZGFsUmVmZXJlbmNlLmNvbmZpZz8uc2l6ZSA9PT0gbW9kYWxTaXplLmxhcmdlXCJcclxuICAgICAgIFtjbGFzcy5kcC1leHRyYS1sYXJnZV09XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/LnNpemUgPT09IG1vZGFsU2l6ZS5leHRyYUxhcmdlXCJcclxuICAgICAgIFtjbGFzcy5kcC1tZWRpdW1dPVwibW9kYWxSZWZlcmVuY2UuY29uZmlnPy5zaXplID09PSBtb2RhbFNpemUubWVkaXVtXCJcclxuICAgICAgIFtjbGFzcy5kcC1mdWxsLXNjcmVlbi1tb2RhbF09XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/Lm1vZGUgPT09ICdmdWxsU2NyZWVuJ1wiXHJcbiAgICAgICBbY2xhc3MuZHAtZGlzYWJsZS1mdWxsLXNjcmVlbl09XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/Lm1vZGUgPT09ICdkaXNhYmxlRnVsbFNjcmVlbidcIlxyXG4gICAgICAgW2NsYXNzLmRwLW1vZGFsLXBvc2l0aW9uLXRvcF09XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/LnBvc2l0aW9uID09PSAndG9wJ1wiXHJcbiAgICAgICBbY2xhc3MuZHAtbW9kYWwtcG9zaXRpb24tYm90dG9tXT1cIm1vZGFsUmVmZXJlbmNlLmNvbmZpZz8ucG9zaXRpb24gPT09ICdib3R0b20nXCJcclxuICAgICAgIFtjbGFzcy5kcC1tb2RhbC1wb3NpdGlvbi1sZWZ0XT1cIm1vZGFsUmVmZXJlbmNlLmNvbmZpZz8ucG9zaXRpb24gPT09ICdsZWZ0J1wiXHJcbiAgICAgICBbY2xhc3MuZHAtbW9kYWwtcG9zaXRpb24tcmlnaHRdPVwibW9kYWxSZWZlcmVuY2UuY29uZmlnPy5wb3NpdGlvbiA9PT0gJ3JpZ2h0J1wiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcC1tb2RhbC1oZWFkZXJcIlxyXG4gICAgICAgICBbY2xhc3MuZHAtd2FybmluZ109XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/LnR5cGUgPT09ICd3YXJuaW5nJ1wiXHJcbiAgICAgICAgIFtjbGFzcy5kcC1lcnJvcl09XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/LnR5cGUgPT09ICdlcnJvcidcIlxyXG4gICAgICAgICBbY2xhc3MuZHAtc3VjY2Vzc109XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/LnR5cGUgPT09ICdzdWNjZXNzJ1wiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJkcC10aXRsZVwiPlxyXG4gICAgICAgIHt7bW9kYWxSZWZlcmVuY2UuY29uZmlnPy50aXRsZX19XHJcbiAgICAgIDwvaDI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kYWxSZWZlcmVuY2UuY29uZmlnPy5tb2RlICE9ICdkaXNhYmxlRnVsbFNjcmVlbidcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwibW9kYWxSZWZlcmVuY2UuY29uZmlnPy5tb2RlICE9ICdmdWxsU2NyZWVuJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWF4aW1pemUoKVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIk1heGltaXplXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNYXhpbWl6ZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxyXG4gICAgICAgICAgICBmdWxsc2NyZWVuXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJtb2RhbFJlZmVyZW5jZS5jb25maWc/Lm1vZGUgPT0gJ2Z1bGxTY3JlZW4nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXN0b3JlV2luZG93KClcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJSZXN0b3JlIFdpbmRvdyBTaXplXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZXN0b3JlIFdpbmRvdyBTaXplXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XHJcbiAgICAgICAgICAgIGZ1bGxzY3JlZW5fZXhpdFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImRwLWNsb3NlLW1vZGFsXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZVwiXHJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxyXG4gICAgICAgICAgY2xvc2VcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAjYm9keUVsZW1lbnQgY2xhc3M9XCJkcC1tb2RhbC1ib2R5XCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRDb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=