ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
271 lines • 31.1 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, booleanAttribute, numberAttribute } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NzModalContentDirective } from './modal-content.directive';
import { NzModalFooterDirective } from './modal-footer.directive';
import { NzModalTitleDirective } from './modal-title.directive';
import { getConfigFromComponent } from './utils';
import * as i0 from "@angular/core";
import * as i1 from "./modal.service";
export class NzModalComponent {
set modalTitle(value) {
if (value) {
this.setTitleWithTemplate(value);
}
}
set modalFooter(value) {
if (value) {
this.setFooterWithTemplate(value);
}
}
get afterOpen() {
// Observable alias for nzAfterOpen
return this.nzAfterOpen.asObservable();
}
get afterClose() {
// Observable alias for nzAfterClose
return this.nzAfterClose.asObservable();
}
constructor(cdr, modal, viewContainerRef) {
this.cdr = cdr;
this.modal = modal;
this.viewContainerRef = viewContainerRef;
this.nzVisible = false;
this.nzClosable = true;
this.nzOkLoading = false;
this.nzOkDisabled = false;
this.nzCancelDisabled = false;
this.nzCancelLoading = false;
this.nzKeyboard = true;
this.nzNoAnimation = false;
this.nzCentered = false;
this.nzDraggable = false;
this.nzZIndex = 1000;
this.nzWidth = 520;
this.nzCloseIcon = 'close';
this.nzOkType = 'primary';
this.nzOkDanger = false;
this.nzIconType = 'question-circle'; // Confirm Modal ONLY
this.nzModalType = 'default';
this.nzAutofocus = 'auto';
// TODO(@hsuanxyz) Input will not be supported
this.nzOnOk = new EventEmitter();
// TODO(@hsuanxyz) Input will not be supported
this.nzOnCancel = new EventEmitter();
this.nzAfterOpen = new EventEmitter();
this.nzAfterClose = new EventEmitter();
this.nzVisibleChange = new EventEmitter();
this.modalRef = null;
this.destroy$ = new Subject();
}
open() {
if (!this.nzVisible) {
this.nzVisible = true;
this.nzVisibleChange.emit(true);
}
if (!this.modalRef) {
const config = this.getConfig();
this.modalRef = this.modal.create(config);
// When the modal is implicitly closed (e.g. closeAll) the nzVisible needs to be set to the correct value and emit.
this.modalRef.afterClose
.asObservable()
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.close();
});
}
}
close(result) {
if (this.nzVisible) {
this.nzVisible = false;
this.nzVisibleChange.emit(false);
}
if (this.modalRef) {
this.modalRef.close(result);
this.modalRef = null;
}
}
destroy(result) {
this.close(result);
}
triggerOk() {
this.modalRef?.triggerOk();
}
triggerCancel() {
this.modalRef?.triggerCancel();
}
getContentComponent() {
return this.modalRef?.getContentComponent();
}
getElement() {
return this.modalRef?.getElement();
}
getModalRef() {
return this.modalRef;
}
setTitleWithTemplate(templateRef) {
this.nzTitle = templateRef;
if (this.modalRef) {
// If modalRef already created, set the title in next tick
Promise.resolve().then(() => {
this.modalRef.updateConfig({
nzTitle: this.nzTitle
});
});
}
}
setFooterWithTemplate(templateRef) {
this.nzFooter = templateRef;
if (this.modalRef) {
// If modalRef already created, set the footer in next tick
Promise.resolve().then(() => {
this.modalRef.updateConfig({
nzFooter: this.nzFooter
});
});
}
this.cdr.markForCheck();
}
getConfig() {
const componentConfig = getConfigFromComponent(this);
componentConfig.nzViewContainerRef = this.viewContainerRef;
componentConfig.nzContent = this.nzContent || this.contentFromContentChild;
return componentConfig;
}
ngOnChanges(changes) {
const { nzVisible, ...otherChanges } = changes;
if (Object.keys(otherChanges).length && this.modalRef) {
this.modalRef.updateConfig(getConfigFromComponent(this));
}
if (nzVisible) {
if (this.nzVisible) {
this.open();
}
else {
this.close();
}
}
}
ngOnDestroy() {
this.modalRef?._finishDialogClose();
this.destroy$.next();
this.destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzModalComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NzModalService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.1.2", type: NzModalComponent, isStandalone: true, selector: "nz-modal", inputs: { nzMask: ["nzMask", "nzMask", booleanAttribute], nzMaskClosable: ["nzMaskClosable", "nzMaskClosable", booleanAttribute], nzCloseOnNavigation: ["nzCloseOnNavigation", "nzCloseOnNavigation", booleanAttribute], nzVisible: ["nzVisible", "nzVisible", booleanAttribute], nzClosable: ["nzClosable", "nzClosable", booleanAttribute], nzOkLoading: ["nzOkLoading", "nzOkLoading", booleanAttribute], nzOkDisabled: ["nzOkDisabled", "nzOkDisabled", booleanAttribute], nzCancelDisabled: ["nzCancelDisabled", "nzCancelDisabled", booleanAttribute], nzCancelLoading: ["nzCancelLoading", "nzCancelLoading", booleanAttribute], nzKeyboard: ["nzKeyboard", "nzKeyboard", booleanAttribute], nzNoAnimation: ["nzNoAnimation", "nzNoAnimation", booleanAttribute], nzCentered: ["nzCentered", "nzCentered", booleanAttribute], nzDraggable: ["nzDraggable", "nzDraggable", booleanAttribute], nzContent: "nzContent", nzFooter: "nzFooter", nzZIndex: ["nzZIndex", "nzZIndex", numberAttribute], nzWidth: "nzWidth", nzWrapClassName: "nzWrapClassName", nzClassName: "nzClassName", nzStyle: "nzStyle", nzTitle: "nzTitle", nzCloseIcon: "nzCloseIcon", nzMaskStyle: "nzMaskStyle", nzBodyStyle: "nzBodyStyle", nzOkText: "nzOkText", nzCancelText: "nzCancelText", nzOkType: "nzOkType", nzOkDanger: ["nzOkDanger", "nzOkDanger", booleanAttribute], nzIconType: "nzIconType", nzModalType: "nzModalType", nzAutofocus: "nzAutofocus", nzOnOk: "nzOnOk", nzOnCancel: "nzOnCancel" }, outputs: { nzOnOk: "nzOnOk", nzOnCancel: "nzOnCancel", nzAfterOpen: "nzAfterOpen", nzAfterClose: "nzAfterClose", nzVisibleChange: "nzVisibleChange" }, queries: [{ propertyName: "modalTitle", first: true, predicate: NzModalTitleDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "contentFromContentChild", first: true, predicate: NzModalContentDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "modalFooter", first: true, predicate: NzModalFooterDirective, descendants: true, read: TemplateRef, static: true }], exportAs: ["nzModal"], usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzModalComponent, decorators: [{
type: Component,
args: [{
selector: 'nz-modal',
exportAs: 'nzModal',
template: ``,
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true
}]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NzModalService }, { type: i0.ViewContainerRef }], propDecorators: { nzMask: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzMaskClosable: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzCloseOnNavigation: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzVisible: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzClosable: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzOkLoading: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzOkDisabled: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzCancelDisabled: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzCancelLoading: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzKeyboard: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzNoAnimation: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzCentered: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzDraggable: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzContent: [{
type: Input
}], nzFooter: [{
type: Input
}], nzZIndex: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzWidth: [{
type: Input
}], nzWrapClassName: [{
type: Input
}], nzClassName: [{
type: Input
}], nzStyle: [{
type: Input
}], nzTitle: [{
type: Input
}], nzCloseIcon: [{
type: Input
}], nzMaskStyle: [{
type: Input
}], nzBodyStyle: [{
type: Input
}], nzOkText: [{
type: Input
}], nzCancelText: [{
type: Input
}], nzOkType: [{
type: Input
}], nzOkDanger: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzIconType: [{
type: Input
}], nzModalType: [{
type: Input
}], nzAutofocus: [{
type: Input
}], nzOnOk: [{
type: Input
}, {
type: Output
}], nzOnCancel: [{
type: Input
}, {
type: Output
}], nzAfterOpen: [{
type: Output
}], nzAfterClose: [{
type: Output
}], nzVisibleChange: [{
type: Output
}], modalTitle: [{
type: ContentChild,
args: [NzModalTitleDirective, { static: true, read: TemplateRef }]
}], contentFromContentChild: [{
type: ContentChild,
args: [NzModalContentDirective, { static: true, read: TemplateRef }]
}], modalFooter: [{
type: ContentChild,
args: [NzModalFooterDirective, { static: true, read: TemplateRef }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFdBQVcsRUFHWCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUszQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQVNqRCxNQUFNLE9BQU8sZ0JBQWdCO0lBaUQzQixJQUNJLFVBQVUsQ0FBQyxLQUE2QjtRQUMxQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBS0QsSUFDSSxXQUFXLENBQUMsS0FBNkI7UUFDM0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUtELElBQUksU0FBUztRQUNYLG1DQUFtQztRQUNuQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNa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QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFReEUsdUJBQXVCO3NCQUR0QixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUl0RSxXQUFXO3NCQURkLFlBQVk7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgbnVtYmVyQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOekJ1dHRvblR5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5pbXBvcnQgeyBOek1vZGFsQ29udGVudERpcmVjdGl2ZSB9IGZyb20gJy4vbW9kYWwtY29udGVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnpNb2RhbEZvb3RlckRpcmVjdGl2ZSB9IGZyb20gJy4vbW9kYWwtZm9vdGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOek1vZGFsTGVnYWN5QVBJIH0gZnJvbSAnLi9tb2RhbC1sZWdhY3ktYXBpJztcbmltcG9ydCB7IE56TW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZic7XG5pbXBvcnQgeyBOek1vZGFsVGl0bGVEaXJlY3RpdmUgfSBmcm9tICcuL21vZGFsLXRpdGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNb2RhbEJ1dHRvbk9wdGlvbnMsIE1vZGFsT3B0aW9ucywgTW9kYWxUeXBlcywgT25DbGlja0NhbGxiYWNrLCBTdHlsZU9iamVjdExpa2UgfSBmcm9tICcuL21vZGFsLXR5cGVzJztcbmltcG9ydCB7IE56TW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldENvbmZpZ0Zyb21Db21wb25lbnQgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotbW9kYWwnLFxuICBleHBvcnRBczogJ256TW9kYWwnLFxuICB0ZW1wbGF0ZTogYGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56TW9kYWxDb21wb25lbnQ8VCBleHRlbmRzIE1vZGFsT3B0aW9ucyA9IE56U2FmZUFueSwgUiA9IE56U2FmZUFueT5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE56TW9kYWxMZWdhY3lBUEk8VCwgUj4sIE9uRGVzdHJveVxue1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpNYXNrPzogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56TWFza0Nsb3NhYmxlPzogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56Q2xvc2VPbk5hdmlnYXRpb24/OiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekNsb3NhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56T2tMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuek9rRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56Q2FuY2VsRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56Q2FuY2VsTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpLZXlib2FyZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuek5vQW5pbWF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekNlbnRlcmVkID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekRyYWdnYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBuekNvbnRlbnQ/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx7fT4gfCBUeXBlPFQ+O1xuICBASW5wdXQoKSBuekZvb3Rlcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHt9PiB8IEFycmF5PE1vZGFsQnV0dG9uT3B0aW9uczxUPj4gfCBudWxsO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBuelpJbmRleDogbnVtYmVyID0gMTAwMDtcbiAgQElucHV0KCkgbnpXaWR0aDogbnVtYmVyIHwgc3RyaW5nID0gNTIwO1xuICBASW5wdXQoKSBueldyYXBDbGFzc05hbWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56Q2xhc3NOYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKSBuelN0eWxlPzogb2JqZWN0O1xuICBASW5wdXQoKSBuelRpdGxlPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8e30+O1xuICBASW5wdXQoKSBuekNsb3NlSWNvbjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gPSAnY2xvc2UnO1xuICBASW5wdXQoKSBuek1hc2tTdHlsZT86IFN0eWxlT2JqZWN0TGlrZTtcbiAgQElucHV0KCkgbnpCb2R5U3R5bGU/OiBTdHlsZU9iamVjdExpa2U7XG4gIEBJbnB1dCgpIG56T2tUZXh0Pzogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgbnpDYW5jZWxUZXh0Pzogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KCkgbnpPa1R5cGU6IE56QnV0dG9uVHlwZSA9ICdwcmltYXJ5JztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56T2tEYW5nZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbnpJY29uVHlwZTogc3RyaW5nID0gJ3F1ZXN0aW9uLWNpcmNsZSc7IC8vIENvbmZpcm0gTW9kYWwgT05MWVxuICBASW5wdXQoKSBuek1vZGFsVHlwZTogTW9kYWxUeXBlcyA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgbnpBdXRvZm9jdXM6ICdvaycgfCAnY2FuY2VsJyB8ICdhdXRvJyB8IG51bGwgPSAnYXV0byc7XG5cbiAgLy8gVE9ETyhAaHN1YW54eXopIElucHV0IHdpbGwgbm90IGJlIHN1cHBvcnRlZFxuICBASW5wdXQoKVxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgbnpPbk9rOiBFdmVudEVtaXR0ZXI8VD4gfCBPbkNsaWNrQ2FsbGJhY2s8VD4gfCBOelNhZmVBbnkgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLy8gVE9ETyhAaHN1YW54eXopIElucHV0IHdpbGwgbm90IGJlIHN1cHBvcnRlZFxuICBASW5wdXQoKVxuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgbnpPbkNhbmNlbDogRXZlbnRFbWl0dGVyPFQ+IHwgT25DbGlja0NhbGxiYWNrPFQ+IHwgTnpTYWZlQW55ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBuekFmdGVyT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56QWZ0ZXJDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8Uj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56VmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAQ29udGVudENoaWxkKE56TW9kYWxUaXRsZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHNldCBtb2RhbFRpdGxlKHZhbHVlOiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+KSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldFRpdGxlV2l0aFRlbXBsYXRlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBAQ29udGVudENoaWxkKE56TW9kYWxDb250ZW50RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgY29udGVudEZyb21Db250ZW50Q2hpbGQhOiBUZW1wbGF0ZVJlZjxOelNhZmVBbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoTnpNb2RhbEZvb3RlckRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHNldCBtb2RhbEZvb3Rlcih2YWx1ZTogVGVtcGxhdGVSZWY8TnpTYWZlQW55Pikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRGb290ZXJXaXRoVGVtcGxhdGUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW9kYWxSZWY6IE56TW9kYWxSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ2V0IGFmdGVyT3BlbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAvLyBPYnNlcnZhYmxlIGFsaWFzIGZvciBuekFmdGVyT3BlblxuICAgIHJldHVybiB0aGlzLm56QWZ0ZXJPcGVuLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGFmdGVyQ2xvc2UoKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgLy8gT2JzZXJ2YWJsZSBhbGlhcyBmb3IgbnpBZnRlckNsb3NlXG4gICAgcmV0dXJuIHRoaXMubnpBZnRlckNsb3NlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbW9kYWw6IE56TW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHt9XG5cbiAgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpWaXNpYmxlKSB7XG4gICAgICB0aGlzLm56VmlzaWJsZSA9IHRydWU7XG4gICAgICB0aGlzLm56VmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5tb2RhbFJlZikge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsLmNyZWF0ZShjb25maWcpO1xuXG4gICAgICAvLyBXaGVuIHRoZSBtb2RhbCBpcyBpbXBsaWNpdGx5IGNsb3NlZCAoZS5nLiBjbG9zZUFsbCkgdGhlIG56VmlzaWJsZSBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUgYW5kIGVtaXQuXG4gICAgICB0aGlzLm1vZGFsUmVmLmFmdGVyQ2xvc2VcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyZXN1bHQ/OiBSKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpWaXNpYmxlKSB7XG4gICAgICB0aGlzLm56VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5uelZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UocmVzdWx0KTtcbiAgICAgIHRoaXMubW9kYWxSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kocmVzdWx0PzogUik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVzdWx0KTtcbiAgfVxuXG4gIHRyaWdnZXJPaygpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsUmVmPy50cmlnZ2VyT2soKTtcbiAgfVxuXG4gIHRyaWdnZXJDYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFJlZj8udHJpZ2dlckNhbmNlbCgpO1xuICB9XG5cbiAgZ2V0Q29udGVudENvbXBvbmVudCgpOiBUIHwgdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kYWxSZWY/LmdldENvbnRlbnRDb21wb25lbnQoKTtcbiAgfVxuXG4gIGdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFJlZj8uZ2V0RWxlbWVudCgpO1xuICB9XG5cbiAgZ2V0TW9kYWxSZWYoKTogTnpNb2RhbFJlZiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm1vZGFsUmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUaXRsZVdpdGhUZW1wbGF0ZSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8e30+KTogdm9pZCB7XG4gICAgdGhpcy5uelRpdGxlID0gdGVtcGxhdGVSZWY7XG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgIC8vIElmIG1vZGFsUmVmIGFscmVhZHkgY3JlYXRlZCwgc2V0IHRoZSB0aXRsZSBpbiBuZXh0IHRpY2tcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1vZGFsUmVmIS51cGRhdGVDb25maWcoe1xuICAgICAgICAgIG56VGl0bGU6IHRoaXMubnpUaXRsZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9vdGVyV2l0aFRlbXBsYXRlKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx7fT4pOiB2b2lkIHtcbiAgICB0aGlzLm56Rm9vdGVyID0gdGVtcGxhdGVSZWY7XG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgIC8vIElmIG1vZGFsUmVmIGFscmVhZHkgY3JlYXRlZCwgc2V0IHRoZSBmb290ZXIgaW4gbmV4dCB0aWNrXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiEudXBkYXRlQ29uZmlnKHtcbiAgICAgICAgICBuekZvb3RlcjogdGhpcy5uekZvb3RlclxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogTW9kYWxPcHRpb25zIHtcbiAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBnZXRDb25maWdGcm9tQ29tcG9uZW50KHRoaXMpO1xuICAgIGNvbXBvbmVudENvbmZpZy5uelZpZXdDb250YWluZXJSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWY7XG4gICAgY29tcG9uZW50Q29uZmlnLm56Q29udGVudCA9IHRoaXMubnpDb250ZW50IHx8IHRoaXMuY29udGVudEZyb21Db250ZW50Q2hpbGQ7XG4gICAgcmV0dXJuIGNvbXBvbmVudENvbmZpZztcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56VmlzaWJsZSwgLi4ub3RoZXJDaGFuZ2VzIH0gPSBjaGFuZ2VzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKG90aGVyQ2hhbmdlcykubGVuZ3RoICYmIHRoaXMubW9kYWxSZWYpIHtcbiAgICAgIHRoaXMubW9kYWxSZWYudXBkYXRlQ29uZmlnKGdldENvbmZpZ0Zyb21Db21wb25lbnQodGhpcykpO1xuICAgIH1cblxuICAgIGlmIChuelZpc2libGUpIHtcbiAgICAgIGlmICh0aGlzLm56VmlzaWJsZSkge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsUmVmPy5fZmluaXNoRGlhbG9nQ2xvc2UoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==