UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

469 lines 40.1 kB
/** * @fileoverview added by tsickle * Generated from: modal-container.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Alibaba.com All Rights Reserved. * * 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 { BasePortalOutlet } from '@angular/cdk/portal'; import { EventEmitter } from '@angular/core'; import { getElementOffset } from 'ng-zorro-antd/core/util'; import { FADE_CLASS_NAME_MAP, MODAL_MASK_CLASS_NAME, ZOOM_CLASS_NAME_MAP } from './modal-config'; /** * @return {?} */ export function throwNzModalContentAlreadyAttachedError() { throw Error('Attempting to attach modal content after content is already attached'); } export class BaseModalContainer extends BasePortalOutlet { /** * @param {?} elementRef * @param {?} focusTrapFactory * @param {?} cdr * @param {?} render * @param {?} zone * @param {?} overlayRef * @param {?} config * @param {?=} document * @param {?=} animationType */ constructor(elementRef, focusTrapFactory, cdr, render, zone, overlayRef, config, document, animationType) { super(); this.elementRef = elementRef; this.focusTrapFactory = focusTrapFactory; this.cdr = cdr; this.render = render; this.zone = zone; this.overlayRef = overlayRef; this.config = config; this.animationType = animationType; this.animationStateChanged = new EventEmitter(); this.containerClick = new EventEmitter(); this.cancelTriggered = new EventEmitter(); this.okTriggered = new EventEmitter(); this.state = 'enter'; this.isStringContent = false; this.elementFocusedBeforeModalWasOpened = null; this.latestMousedownTarget = null; this.oldMaskStyle = null; this.document = document; this.isStringContent = typeof config.nzContent === 'string'; this.setContainer(); } /** * @param {?} e * @return {?} */ onMousedown(e) { this.latestMousedownTarget = ((/** @type {?} */ (e.target))) || null; } /** * @param {?} e * @return {?} */ onMouseup(e) { if (e.target === this.latestMousedownTarget && e.target === this.elementRef.nativeElement) { this.containerClick.emit(); } this.latestMousedownTarget = null; } /** * @return {?} */ onCloseClick() { this.cancelTriggered.emit(); } /** * @return {?} */ onOkClick() { this.okTriggered.emit(); } /** * @template T * @param {?} portal * @return {?} */ attachComponentPortal(portal) { if (this.portalOutlet.hasAttached()) { throwNzModalContentAlreadyAttachedError(); } this.savePreviouslyFocusedElement(); this.setModalTransformOrigin(); return this.portalOutlet.attachComponentPortal(portal); } /** * @template C * @param {?} portal * @return {?} */ attachTemplatePortal(portal) { if (this.portalOutlet.hasAttached()) { throwNzModalContentAlreadyAttachedError(); } this.savePreviouslyFocusedElement(); return this.portalOutlet.attachTemplatePortal(portal); } /** * @return {?} */ getNativeElement() { return this.elementRef.nativeElement; } /** * @private * @return {?} */ animationDisabled() { return this.config.nzNoAnimation || this.animationType === 'NoopAnimations'; } /** * @private * @return {?} */ setModalTransformOrigin() { /** @type {?} */ const modalElement = this.modalElementRef.nativeElement; if ((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened))) { /** @type {?} */ const previouslyDOMRect = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)).getBoundingClientRect(); /** @type {?} */ const lastPosition = getElementOffset((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened))); /** @type {?} */ const x = lastPosition.left + previouslyDOMRect.width / 2; /** @type {?} */ const y = lastPosition.top + previouslyDOMRect.height / 2; /** @type {?} */ const transformOrigin = `${x - modalElement.offsetLeft}px ${y - modalElement.offsetTop}px 0px`; this.render.setStyle(modalElement, 'transform-origin', transformOrigin); } } /** * @private * @return {?} */ savePreviouslyFocusedElement() { if (this.document) { this.elementFocusedBeforeModalWasOpened = (/** @type {?} */ (this.document.activeElement)); if (this.elementRef.nativeElement.focus) { Promise.resolve().then((/** * @return {?} */ () => this.elementRef.nativeElement.focus())); } } } /** * @private * @return {?} */ trapFocus() { /** @type {?} */ const element = this.elementRef.nativeElement; if (!this.focusTrap) { this.focusTrap = this.focusTrapFactory.create(element); } if (this.config.nzAutofocus) { this.focusTrap.focusInitialElementWhenReady().then(); } else { /** @type {?} */ const activeElement = this.document.activeElement; if (activeElement !== element && !element.contains(activeElement)) { element.focus(); } } } /** * @private * @return {?} */ restoreFocus() { /** @type {?} */ const toFocus = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)); // We need the extra check, because IE can set the `activeElement` to null in some cases. if (toFocus && typeof toFocus.focus === 'function') { /** @type {?} */ const activeElement = (/** @type {?} */ (this.document.activeElement)); /** @type {?} */ const element = this.elementRef.nativeElement; if (!activeElement || activeElement === this.document.body || activeElement === element || element.contains(activeElement)) { toFocus.focus(); } } if (this.focusTrap) { this.focusTrap.destroy(); } } /** * @private * @return {?} */ setEnterAnimationClass() { if (this.animationDisabled()) { return; } this.zone.runOutsideAngular((/** * @return {?} */ () => { // Make sure to set the `TransformOrigin` style before set the modelElement's class names this.setModalTransformOrigin(); /** @type {?} */ const modalElement = this.modalElementRef.nativeElement; /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enter); this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive); this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enter); this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive); })); } /** * @private * @return {?} */ setExitAnimationClass() { this.zone.runOutsideAngular((/** * @return {?} */ () => { /** @type {?} */ const modalElement = this.modalElementRef.nativeElement; /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; if (this.animationDisabled()) { // https://github.com/angular/components/issues/18645 this.render.removeClass(backdropElement, MODAL_MASK_CLASS_NAME); return; } this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leave); this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive); this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leave); this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leaveActive); })); } /** * @private * @return {?} */ cleanAnimationClass() { if (this.animationDisabled()) { return; } this.zone.runOutsideAngular((/** * @return {?} */ () => { /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; /** @type {?} */ const modalElement = this.modalElementRef.nativeElement; this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enter); this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive); this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leave); this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive); this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enter); this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive); })); } /** * @private * @return {?} */ bindBackdropStyle() { this.zone.runOutsideAngular((/** * @return {?} */ () => { if (this.oldMaskStyle) { /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; /** @type {?} */ const styles = (/** @type {?} */ (this.oldMaskStyle)); Object.keys(styles).forEach((/** * @param {?} key * @return {?} */ key => { this.render.removeStyle(backdropElement, key); })); this.oldMaskStyle = null; } if (typeof this.config.nzMaskStyle === 'object' && Object.keys(this.config.nzMaskStyle).length) { /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; /** @type {?} */ const styles = Object.assign({}, this.config.nzMaskStyle); Object.keys(styles).forEach((/** * @param {?} key * @return {?} */ key => { this.render.setStyle(backdropElement, key, styles[key]); })); this.oldMaskStyle = styles; } })); } /** * Set the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ setContainer() { /** @type {?} */ const container = this.getContainer(); if (container) { this.render.appendChild(container, this.elementRef.nativeElement); } } /** * Reset the container element. * @deprecated Not supported. * \@breaking-change 10.0.0 * @private * @return {?} */ resetContainer() { /** @type {?} */ const container = this.getContainer(); if (container) { this.render.appendChild(this.overlayRef.overlayElement, this.elementRef.nativeElement); } } /** * @private * @return {?} */ getContainer() { const { nzGetContainer } = this.config; /** @type {?} */ const container = typeof nzGetContainer === 'function' ? nzGetContainer() : nzGetContainer; return container instanceof HTMLElement ? container : null; } /** * @param {?} event * @return {?} */ onAnimationDone(event) { if (event.toState === 'void') { return; } if (event.toState === 'enter') { this.setContainer(); this.trapFocus(); } else if (event.toState === 'exit') { this.restoreFocus(); } this.cleanAnimationClass(); this.animationStateChanged.emit(event); } /** * @param {?} event * @return {?} */ onAnimationStart(event) { if (event.toState === 'enter') { this.setEnterAnimationClass(); this.bindBackdropStyle(); } else if (event.toState === 'exit') { this.resetContainer(); this.setExitAnimationClass(); } this.animationStateChanged.emit(event); } /** * @return {?} */ startExitAnimation() { this.state = 'exit'; this.cdr.markForCheck(); } } if (false) { /** @type {?} */ BaseModalContainer.prototype.portalOutlet; /** @type {?} */ BaseModalContainer.prototype.modalElementRef; /** @type {?} */ BaseModalContainer.prototype.animationStateChanged; /** @type {?} */ BaseModalContainer.prototype.containerClick; /** @type {?} */ BaseModalContainer.prototype.cancelTriggered; /** @type {?} */ BaseModalContainer.prototype.okTriggered; /** @type {?} */ BaseModalContainer.prototype.state; /** @type {?} */ BaseModalContainer.prototype.document; /** @type {?} */ BaseModalContainer.prototype.modalRef; /** @type {?} */ BaseModalContainer.prototype.isStringContent; /** * @type {?} * @private */ BaseModalContainer.prototype.elementFocusedBeforeModalWasOpened; /** * @type {?} * @private */ BaseModalContainer.prototype.focusTrap; /** * @type {?} * @private */ BaseModalContainer.prototype.latestMousedownTarget; /** * @type {?} * @private */ BaseModalContainer.prototype.oldMaskStyle; /** * @type {?} * @protected */ BaseModalContainer.prototype.elementRef; /** * @type {?} * @protected */ BaseModalContainer.prototype.focusTrapFactory; /** @type {?} */ BaseModalContainer.prototype.cdr; /** * @type {?} * @protected */ BaseModalContainer.prototype.render; /** * @type {?} * @protected */ BaseModalContainer.prototype.zone; /** * @type {?} * @protected */ BaseModalContainer.prototype.overlayRef; /** @type {?} */ BaseModalContainer.prototype.config; /** * @type {?} * @protected */ BaseModalContainer.prototype.animationType; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsLWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFXQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQW9ELE1BQU0scUJBQXFCLENBQUM7QUFDekcsT0FBTyxFQUFnRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBS2pHLE1BQU0sVUFBVSx1Q0FBdUM7SUFDckQsTUFBTSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGdCQUFnQjs7Ozs7Ozs7Ozs7O0lBa0J0RCxZQUNZLFVBQXNCLEVBQ3RCLGdCQUFrQyxFQUNyQyxHQUFzQixFQUNuQixNQUFpQixFQUNqQixJQUFZLEVBQ1osVUFBc0IsRUFDekIsTUFBb0IsRUFDM0IsUUFBb0IsRUFDVixhQUFzQjtRQUVoQyxLQUFLLEVBQUUsQ0FBQztRQVZFLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNyQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFFakIsa0JBQWEsR0FBYixhQUFhLENBQVM7UUF2QmxDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBQzNELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMx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QyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7OztJQXpRQywwQ0FBOEI7O0lBQzlCLDZDQUE0Qzs7SUFFNUMsbURBQTJEOztJQUMzRCw0Q0FBMEM7O0lBQzFDLDZDQUEyQzs7SUFDM0MseUNBQXVDOztJQUV2QyxtQ0FBMkM7O0lBQzNDLHNDQUFtQjs7SUFDbkIsc0NBQXFCOztJQUNyQiw2Q0FBaUM7Ozs7O0lBQ2pDLGdFQUFzRTs7Ozs7SUFDdEUsdUNBQTZCOzs7OztJQUM3QixtREFBeUQ7Ozs7O0lBQ3pELDBDQUE4RDs7Ozs7SUFHNUQsd0NBQWdDOzs7OztJQUNoQyw4Q0FBNEM7O0lBQzVDLGlDQUE2Qjs7Ozs7SUFDN0Isb0NBQTJCOzs7OztJQUMzQixrQ0FBc0I7Ozs7O0lBQ3RCLHdDQUFnQzs7SUFDaEMsb0NBQTJCOzs7OztJQUUzQiwyQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IEZvY3VzVHJhcCwgRm9jdXNUcmFwRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBCYXNlUG9ydGFsT3V0bGV0LCBDZGtQb3J0YWxPdXRsZXQsIENvbXBvbmVudFBvcnRhbCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEVtYmVkZGVkVmlld1JlZiwgRXZlbnRFbWl0dGVyLCBOZ1pvbmUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldEVsZW1lbnRPZmZzZXQgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBGQURFX0NMQVNTX05BTUVfTUFQLCBNT0RBTF9NQVNLX0NMQVNTX05BTUUsIFpPT01fQ0xBU1NfTkFNRV9NQVAgfSBmcm9tICcuL21vZGFsLWNvbmZpZyc7XG5cbmltcG9ydCB7IE56TW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZic7XG5pbXBvcnQgeyBNb2RhbE9wdGlvbnMgfSBmcm9tICcuL21vZGFsLXR5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpOiBuZXZlciB7XG4gIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBtb2RhbCBjb250ZW50IGFmdGVyIGNvbnRlbnQgaXMgYWxyZWFkeSBhdHRhY2hlZCcpO1xufVxuXG5leHBvcnQgY2xhc3MgQmFzZU1vZGFsQ29udGFpbmVyIGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCB7XG4gIHBvcnRhbE91dGxldDogQ2RrUG9ydGFsT3V0bGV0O1xuICBtb2RhbEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGFuaW1hdGlvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5pbWF0aW9uRXZlbnQ+KCk7XG4gIGNvbnRhaW5lckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBjYW5jZWxUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIG9rVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHN0YXRlOiAndm9pZCcgfCAnZW50ZXInIHwgJ2V4aXQnID0gJ2VudGVyJztcbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBtb2RhbFJlZjogTnpNb2RhbFJlZjtcbiAgaXNTdHJpbmdDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcDtcbiAgcHJpdmF0ZSBsYXRlc3RNb3VzZWRvd25UYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb2xkTWFza1N0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGZvY3VzVHJhcEZhY3Rvcnk6IEZvY3VzVHJhcEZhY3RvcnksXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgcHVibGljIGNvbmZpZzogTW9kYWxPcHRpb25zLFxuICAgIGRvY3VtZW50PzogTnpTYWZlQW55LFxuICAgIHByb3RlY3RlZCBhbmltYXRpb25UeXBlPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMuaXNTdHJpbmdDb250ZW50ID0gdHlwZW9mIGNvbmZpZy5uekNvbnRlbnQgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gIH1cblxuICBvbk1vdXNlZG93bihlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpIHx8IG51bGw7XG4gIH1cblxuICBvbk1vdXNldXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgJiYgZS50YXJnZXQgPT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckNsaWNrLmVtaXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgPSBudWxsO1xuICB9XG5cbiAgb25DbG9zZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uT2tDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9rVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIGF0dGFjaENvbXBvbmVudFBvcnRhbDxUPihwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICB0aGlzLnNldE1vZGFsVHJhbnNmb3JtT3JpZ2luKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpO1xuICB9XG5cbiAgYXR0YWNoVGVtcGxhdGVQb3J0YWw8Qz4ocG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDxDPik6IEVtYmVkZGVkVmlld1JlZjxDPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIGdldE5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0aW9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm56Tm9BbmltYXRpb24gfHwgdGhpcy5hbmltYXRpb25UeXBlID09PSAnTm9vcEFuaW1hdGlvbnMnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNb2RhbFRyYW5zZm9ybU9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlET01SZWN0ID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IGdldEVsZW1lbnRPZmZzZXQodGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkISk7XG4gICAgICBjb25zdCB4ID0gbGFzdFBvc2l0aW9uLmxlZnQgKyBwcmV2aW91c2x5RE9NUmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gbGFzdFBvc2l0aW9uLnRvcCArIHByZXZpb3VzbHlET01SZWN0LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1PcmlnaW4gPSBgJHt4IC0gbW9kYWxFbGVtZW50Lm9mZnNldExlZnR9cHggJHt5IC0gbW9kYWxFbGVtZW50Lm9mZnNldFRvcH1weCAwcHhgO1xuICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUobW9kYWxFbGVtZW50LCAndHJhbnNmb3JtLW9yaWdpbicsIHRyYW5zZm9ybU9yaWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgPSB0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYXBGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm56QXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkudGhlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGVsZW1lbnQgJiYgIWVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBXZSBuZWVkIHRoZSBleHRyYSBjaGVjaywgYmVjYXVzZSBJRSBjYW4gc2V0IHRoZSBgYWN0aXZlRWxlbWVudGAgdG8gbnVsbCBpbiBzb21lIGNhc2VzLlxuICAgIGlmICh0b0ZvY3VzICYmIHR5cGVvZiB0b0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSB0aGlzLmRvY3VtZW50LmJvZHkgfHwgYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudCB8fCBlbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRvRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVudGVyQW5pbWF0aW9uQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHNldCB0aGUgYFRyYW5zZm9ybU9yaWdpbmAgc3R5bGUgYmVmb3JlIHNldCB0aGUgbW9kZWxFbGVtZW50J3MgY2xhc3MgbmFtZXNcbiAgICAgIHRoaXMuc2V0TW9kYWxUcmFuc2Zvcm1PcmlnaW4oKTtcbiAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmVudGVyKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlckFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXhpdEFuaW1hdGlvbkNsYXNzKCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcblxuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xODY0NVxuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIE1PREFMX01BU0tfQ0xBU1NfTkFNRSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAubGVhdmUpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmxlYXZlQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5BbmltYXRpb25DbGFzcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25EaXNhYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgY29uc3QgbW9kYWxFbGVtZW50ID0gdGhpcy5tb2RhbEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlcik7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAuZW50ZXJBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZEJhY2tkcm9wU3R5bGUoKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9sZE1hc2tTdHlsZSkge1xuICAgICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLm9sZE1hc2tTdHlsZSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9sZE1hc2tTdHlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcubnpNYXNrU3R5bGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLm56TWFza1N0eWxlKS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi50aGlzLmNvbmZpZy5uek1hc2tTdHlsZSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSwgc3R5bGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbGRNYXNrU3R5bGUgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgc2V0Q29udGFpbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgcmVzZXRDb250YWluZXIoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlbmRlci5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHsgbnpHZXRDb250YWluZXIgfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHR5cGVvZiBuekdldENvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJyA/IG56R2V0Q29udGFpbmVyKCkgOiBuekdldENvbnRhaW5lcjtcbiAgICByZXR1cm4gY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBjb250YWluZXIgOiBudWxsO1xuICB9XG5cbiAgb25BbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b1N0YXRlID09PSAndm9pZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdlbnRlcicpIHtcbiAgICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLnRyYXBGb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2V4aXQnKSB7XG4gICAgICB0aGlzLnJlc3RvcmVGb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFuQW5pbWF0aW9uQ2xhc3MoKTtcbiAgICB0aGlzLmFuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQW5pbWF0aW9uU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdlbnRlcicpIHtcbiAgICAgIHRoaXMuc2V0RW50ZXJBbmltYXRpb25DbGFzcygpO1xuICAgICAgdGhpcy5iaW5kQmFja2Ryb3BTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2V4aXQnKSB7XG4gICAgICB0aGlzLnJlc2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLnNldEV4aXRBbmltYXRpb25DbGFzcygpO1xuICAgIH1cbiAgICB0aGlzLmFuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHN0YXJ0RXhpdEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2V4aXQnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=