UNPKG

ng-zorro-antd

Version:

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

534 lines 45.9 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 { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { FADE_CLASS_NAME_MAP, MODAL_MASK_CLASS_NAME, NZ_CONFIG_COMPONENT_NAME, ZOOM_CLASS_NAME_MAP } from './modal-config'; import { getValueWithConfig } from './utils'; /** * @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 {?} nzConfigService * @param {?} config * @param {?=} document * @param {?=} animationType */ constructor(elementRef, focusTrapFactory, cdr, render, zone, overlayRef, nzConfigService, config, document, animationType) { super(); this.elementRef = elementRef; this.focusTrapFactory = focusTrapFactory; this.cdr = cdr; this.render = render; this.zone = zone; this.overlayRef = overlayRef; this.nzConfigService = nzConfigService; this.config = config; this.animationType = animationType; this.animationStateChanged = new EventEmitter(); this.containerClick = new EventEmitter(); this.cancelTriggered = new EventEmitter(); this.okTriggered = new EventEmitter(); this.onDestroy = new EventEmitter(); this.state = 'enter'; this.isStringContent = false; this.elementFocusedBeforeModalWasOpened = null; this.latestMousedownTarget = null; this.oldMaskStyle = null; this.destroy$ = new Subject(); this.document = document; this.isStringContent = typeof config.nzContent === 'string'; this.setContainer(); this.nzConfigService .getConfigChangeEventForComponent(NZ_CONFIG_COMPONENT_NAME) .pipe(takeUntil(this.destroy$)) .subscribe((/** * @return {?} */ () => { this.updateMaskClassname(); })); } /** * @return {?} */ get showMask() { /** @type {?} */ const defaultConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_COMPONENT_NAME) || {}; return !!getValueWithConfig(this.config.nzMask, defaultConfig.nzMask, true); } /** * @return {?} */ get maskClosable() { /** @type {?} */ const defaultConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_COMPONENT_NAME) || {}; return !!getValueWithConfig(this.config.nzMaskClosable, defaultConfig.nzMaskClosable, true); } /** * @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.showMask && this.maskClosable) { 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; } /** * @return {?} */ updateMaskClassname() { /** @type {?} */ const backdropElement = this.overlayRef.backdropElement; if (this.showMask) { this.render.addClass(backdropElement, MODAL_MASK_CLASS_NAME); } else { this.render.removeClass(backdropElement, MODAL_MASK_CLASS_NAME); } } /** * @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(); } /** * @return {?} */ ngOnDestroy() { this.onDestroy.emit(); this.destroy$.next(); this.destroy$.complete(); } } 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.onDestroy; /** @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.destroy$; /** * @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 {?} * @protected */ BaseModalContainer.prototype.nzConfigService; /** @type {?} */ BaseModalContainer.prototype.config; /** * @type {?} * @protected */ BaseModalContainer.prototype.animationType; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsLWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFXQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQW9ELE1BQU0scUJBQXFCLENBQUM7QUFDekcsT0FBTyxFQUFnRSxZQUFZLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBR3pJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7OztBQUU3QyxNQUFNLFVBQVUsdUNBQXVDO0lBQ3JELE1BQU0sS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7SUFnQ3RELFlBQ1ksVUFBc0IsRUFDdEIsZ0JBQWtDLEVBQ3JDLEdBQXNCLEVBQ25CLE1BQWlCLEVBQ2pCLElBQVksRUFDWixVQUFzQixFQUN0QixlQUFnQyxFQUNuQyxNQUFvQixFQUMzQixRQUFvQixFQUNWLGFBQXNCO1FBRWhDLEtBQUssRUFBRSxDQUFDO1FBWEUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3JDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVB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RTtZQUNuQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRjs7O0lBN1NDLDBDQUErQjs7SUFDL0IsNkNBQTZDOztJQUU3QyxtREFBMkQ7O0lBQzNELDRDQUEwQzs7SUFDMUMsNkNBQTJDOztJQUMzQyx5Q0FBdUM7O0lBQ3ZDLHVDQUFxQzs7SUFFckMsbUNBQTJDOztJQUMzQyxzQ0FBbUI7O0lBQ25CLHNDQUFzQjs7SUFDdEIsNkNBQWlDOzs7OztJQUNqQyxnRUFBc0U7Ozs7O0lBQ3RFLHVDQUE4Qjs7Ozs7SUFDOUIsbURBQXlEOzs7OztJQUN6RCwwQ0FBOEQ7Ozs7O0lBQzlELHNDQUFtQzs7Ozs7SUFlakMsd0NBQWdDOzs7OztJQUNoQyw4Q0FBNEM7O0lBQzVDLGlDQUE2Qjs7Ozs7SUFDN0Isb0NBQTJCOzs7OztJQUMzQixrQ0FBc0I7Ozs7O0lBQ3RCLHdDQUFnQzs7Ozs7SUFDaEMsNkNBQTBDOztJQUMxQyxvQ0FBMkI7Ozs7O0lBRTNCLDJDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgRm9jdXNUcmFwLCBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IEJhc2VQb3J0YWxPdXRsZXQsIENka1BvcnRhbE91dGxldCwgQ29tcG9uZW50UG9ydGFsLCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgRW1iZWRkZWRWaWV3UmVmLCBFdmVudEVtaXR0ZXIsIE5nWm9uZSwgT25EZXN0cm95LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE56Q29uZmlnU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldEVsZW1lbnRPZmZzZXQgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGQURFX0NMQVNTX05BTUVfTUFQLCBNT0RBTF9NQVNLX0NMQVNTX05BTUUsIE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSwgWk9PTV9DTEFTU19OQU1FX01BUCB9IGZyb20gJy4vbW9kYWwtY29uZmlnJztcblxuaW1wb3J0IHsgTnpNb2RhbFJlZiB9IGZyb20gJy4vbW9kYWwtcmVmJztcbmltcG9ydCB7IE1vZGFsT3B0aW9ucyB9IGZyb20gJy4vbW9kYWwtdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VmFsdWVXaXRoQ29uZmlnIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd056TW9kYWxDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTogbmV2ZXIge1xuICB0aHJvdyBFcnJvcignQXR0ZW1wdGluZyB0byBhdHRhY2ggbW9kYWwgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQnKTtcbn1cblxuZXhwb3J0IGNsYXNzIEJhc2VNb2RhbENvbnRhaW5lciBleHRlbmRzIEJhc2VQb3J0YWxPdXRsZXQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwb3J0YWxPdXRsZXQhOiBDZGtQb3J0YWxPdXRsZXQ7XG4gIG1vZGFsRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGFuaW1hdGlvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5pbWF0aW9uRXZlbnQ+KCk7XG4gIGNvbnRhaW5lckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBjYW5jZWxUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIG9rVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBvbkRlc3Ryb3kgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgc3RhdGU6ICd2b2lkJyB8ICdlbnRlcicgfCAnZXhpdCcgPSAnZW50ZXInO1xuICBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIG1vZGFsUmVmITogTnpNb2RhbFJlZjtcbiAgaXNTdHJpbmdDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmb2N1c1RyYXAhOiBGb2N1c1RyYXA7XG4gIHByaXZhdGUgbGF0ZXN0TW91c2Vkb3duVGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9sZE1hc2tTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGdldCBzaG93TWFzaygpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gdGhpcy5uekNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnRm9yQ29tcG9uZW50KE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSkgfHwge307XG5cbiAgICByZXR1cm4gISFnZXRWYWx1ZVdpdGhDb25maWc8Ym9vbGVhbj4odGhpcy5jb25maWcubnpNYXNrLCBkZWZhdWx0Q29uZmlnLm56TWFzaywgdHJ1ZSk7XG4gIH1cblxuICBnZXQgbWFza0Nsb3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSB8fCB7fTtcblxuICAgIHJldHVybiAhIWdldFZhbHVlV2l0aENvbmZpZzxib29sZWFuPih0aGlzLmNvbmZpZy5uek1hc2tDbG9zYWJsZSwgZGVmYXVsdENvbmZpZy5uek1hc2tDbG9zYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgZm9jdXNUcmFwRmFjdG9yeTogRm9jdXNUcmFwRmFjdG9yeSxcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyOiBSZW5kZXJlcjIsXG4gICAgcHJvdGVjdGVkIHpvbmU6IE5nWm9uZSxcbiAgICBwcm90ZWN0ZWQgb3ZlcmxheVJlZjogT3ZlcmxheVJlZixcbiAgICBwcm90ZWN0ZWQgbnpDb25maWdTZXJ2aWNlOiBOekNvbmZpZ1NlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZzogTW9kYWxPcHRpb25zLFxuICAgIGRvY3VtZW50PzogTnpTYWZlQW55LFxuICAgIHByb3RlY3RlZCBhbmltYXRpb25UeXBlPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMuaXNTdHJpbmdDb250ZW50ID0gdHlwZW9mIGNvbmZpZy5uekNvbnRlbnQgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5uekNvbmZpZ1NlcnZpY2VcbiAgICAgIC5nZXRDb25maWdDaGFuZ2VFdmVudEZvckNvbXBvbmVudChOWl9DT05GSUdfQ09NUE9ORU5UX05BTUUpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXNrQ2xhc3NuYW1lKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uTW91c2Vkb3duKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxhdGVzdE1vdXNlZG93blRhcmdldCA9IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkgfHwgbnVsbDtcbiAgfVxuXG4gIG9uTW91c2V1cChlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzLmxhdGVzdE1vdXNlZG93blRhcmdldCAmJiBlLnRhcmdldCA9PT0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5zaG93TWFzayAmJiB0aGlzLm1hc2tDbG9zYWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXJDbGljay5lbWl0KCk7XG4gICAgfVxuICAgIHRoaXMubGF0ZXN0TW91c2Vkb3duVGFyZ2V0ID0gbnVsbDtcbiAgfVxuXG4gIG9uQ2xvc2VDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbFRyaWdnZXJlZC5lbWl0KCk7XG4gIH1cblxuICBvbk9rQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5va1RyaWdnZXJlZC5lbWl0KCk7XG4gIH1cblxuICBhdHRhY2hDb21wb25lbnRQb3J0YWw8VD4ocG9ydGFsOiBDb21wb25lbnRQb3J0YWw8VD4pOiBDb21wb25lbnRSZWY8VD4ge1xuICAgIGlmICh0aGlzLnBvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aHJvd056TW9kYWxDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XG4gICAgdGhpcy5zZXRNb2RhbFRyYW5zZm9ybU9yaWdpbigpO1xuICAgIHJldHVybiB0aGlzLnBvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIGF0dGFjaFRlbXBsYXRlUG9ydGFsPEM+KHBvcnRhbDogVGVtcGxhdGVQb3J0YWw8Qz4pOiBFbWJlZGRlZFZpZXdSZWY8Qz4ge1xuICAgIGlmICh0aGlzLnBvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aHJvd056TW9kYWxDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCk7XG4gIH1cblxuICBnZXROYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGlvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uek5vQW5pbWF0aW9uIHx8IHRoaXMuYW5pbWF0aW9uVHlwZSA9PT0gJ05vb3BBbmltYXRpb25zJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0TW9kYWxUcmFuc2Zvcm1PcmlnaW4oKTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxFbGVtZW50ID0gdGhpcy5tb2RhbEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIGFzIEhUTUxFbGVtZW50KSB7XG4gICAgICBjb25zdCBwcmV2aW91c2x5RE9NUmVjdCA9IHRoaXMuZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBsYXN0UG9zaXRpb24gPSBnZXRFbGVtZW50T2Zmc2V0KHRoaXMuZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZCEpO1xuICAgICAgY29uc3QgeCA9IGxhc3RQb3NpdGlvbi5sZWZ0ICsgcHJldmlvdXNseURPTVJlY3Qud2lkdGggLyAyO1xuICAgICAgY29uc3QgeSA9IGxhc3RQb3NpdGlvbi50b3AgKyBwcmV2aW91c2x5RE9NUmVjdC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgdHJhbnNmb3JtT3JpZ2luID0gYCR7eCAtIG1vZGFsRWxlbWVudC5vZmZzZXRMZWZ0fXB4ICR7eSAtIG1vZGFsRWxlbWVudC5vZmZzZXRUb3B9cHggMHB4YDtcbiAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKG1vZGFsRWxlbWVudCwgJ3RyYW5zZm9ybS1vcmlnaW4nLCB0cmFuc2Zvcm1PcmlnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb2N1bWVudCkge1xuICAgICAgdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFwRm9jdXMoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKCF0aGlzLmZvY3VzVHJhcCkge1xuICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLmZvY3VzVHJhcEZhY3RvcnkuY3JlYXRlKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5uekF1dG9mb2N1cykge1xuICAgICAgdGhpcy5mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpLnRoZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICE9PSBlbGVtZW50ICYmICFlbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCB0b0ZvY3VzID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgLy8gV2UgbmVlZCB0aGUgZXh0cmEgY2hlY2ssIGJlY2F1c2UgSUUgY2FuIHNldCB0aGUgYGFjdGl2ZUVsZW1lbnRgIHRvIG51bGwgaW4gc29tZSBjYXNlcy5cbiAgICBpZiAodG9Gb2N1cyAmJiB0eXBlb2YgdG9Gb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5kb2N1bWVudC5ib2R5IHx8IGFjdGl2ZUVsZW1lbnQgPT09IGVsZW1lbnQgfHwgZWxlbWVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0b0ZvY3VzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcC5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbnRlckFuaW1hdGlvbkNsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkRpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byBzZXQgdGhlIGBUcmFuc2Zvcm1PcmlnaW5gIHN0eWxlIGJlZm9yZSBzZXQgdGhlIG1vZGVsRWxlbWVudCdzIGNsYXNzIG5hbWVzXG4gICAgICB0aGlzLnNldE1vZGFsVHJhbnNmb3JtT3JpZ2luKCk7XG4gICAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlcik7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAuZW50ZXJBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKGJhY2tkcm9wRWxlbWVudCwgRkFERV9DTEFTU19OQU1FX01BUC5lbnRlckFjdGl2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEV4aXRBbmltYXRpb25DbGFzcygpOiB2b2lkIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW9kYWxFbGVtZW50ID0gdGhpcy5tb2RhbEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGJhY2tkcm9wRWxlbWVudCA9IHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcEVsZW1lbnQ7XG5cbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbkRpc2FibGVkKCkpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTg2NDVcbiAgICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBNT0RBTF9NQVNLX0NMQVNTX05BTUUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAubGVhdmVBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKGJhY2tkcm9wRWxlbWVudCwgRkFERV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuQW5pbWF0aW9uQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAubGVhdmVBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyKTtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKGJhY2tkcm9wRWxlbWVudCwgRkFERV9DTEFTU19OQU1FX01BUC5lbnRlckFjdGl2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRCYWNrZHJvcFN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vbGRNYXNrU3R5bGUpIHtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5vbGRNYXNrU3R5bGUgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlU3R5bGUoYmFja2Ryb3BFbGVtZW50LCBrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbGRNYXNrU3R5bGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLm56TWFza1N0eWxlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5uek1hc2tTdHlsZSkubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wRWxlbWVudCA9IHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgLi4udGhpcy5jb25maWcubnpNYXNrU3R5bGUgfTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoYmFja2Ryb3BFbGVtZW50LCBrZXksIHN0eWxlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub2xkTWFza1N0eWxlID0gc3R5bGVzO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqIEBkZXByZWNhdGVkIE5vdCBzdXBwb3J0ZWQuXG4gICAqIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wXG4gICAqL1xuICBwcml2YXRlIHNldENvbnRhaW5lcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqIEBkZXByZWNhdGVkIE5vdCBzdXBwb3J0ZWQuXG4gICAqIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wXG4gICAqL1xuICBwcml2YXRlIHJlc2V0Q29udGFpbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXIuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB7IG56R2V0Q29udGFpbmVyIH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb250YWluZXIgPSB0eXBlb2YgbnpHZXRDb250YWluZXIgPT09ICdmdW5jdGlvbicgPyBuekdldENvbnRhaW5lcigpIDogbnpHZXRDb250YWluZXI7XG4gICAgcmV0dXJuIGNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29udGFpbmVyIDogbnVsbDtcbiAgfVxuXG4gIHVwZGF0ZU1hc2tDbGFzc25hbWUoKTogdm9pZCB7XG4gICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICBpZiAodGhpcy5zaG93TWFzaykge1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBNT0RBTF9NQVNLX0NMQVNTX05BTUUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIE1PREFMX01BU0tfQ0xBU1NfTkFNRSk7XG4gICAgfVxuICB9XG5cbiAgb25BbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b1N0YXRlID09PSAndm9pZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdlbnRlcicpIHtcbiAgICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLnRyYXBGb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2V4aXQnKSB7XG4gICAgICB0aGlzLnJlc3RvcmVGb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFuQW5pbWF0aW9uQ2xhc3MoKTtcbiAgICB0aGlzLmFuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQW5pbWF0aW9uU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdlbnRlcicpIHtcbiAgICAgIHRoaXMuc2V0RW50ZXJBbmltYXRpb25DbGFzcygpO1xuICAgICAgdGhpcy5iaW5kQmFja2Ryb3BTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2V4aXQnKSB7XG4gICAgICB0aGlzLnJlc2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLnNldEV4aXRBbmltYXRpb25DbGFzcygpO1xuICAgIH1cbiAgICB0aGlzLmFuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHN0YXJ0RXhpdEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2V4aXQnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kuZW1pdCgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19