theme-lib
Version:
This is a simple example Angular Library published to npm.
290 lines • 23.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ComponentFactoryResolver, Directive, ElementRef, Inject, Input, } from '@angular/core';
import { takeWhile } from 'rxjs/operators';
import { NbAdjustment, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, createContainer, } from '../cdk';
import { NB_DOCUMENT } from '../../theme.options';
import { NbPopoverComponent } from './popover.component';
/*
* Powerful popover directive, which provides the best UX for your users.
*
* @stacked-example(Showcase, popover/popover-showcase.component)
*
* Popover can accept different content such as:
* TemplateRef
*
* ```html
* <button [nbPopover]="templateRef"></button>
* <ng-template #templateRef>
* <span>Hello, Popover!</span>
* </ng-template>
* ```
* ### Installation
*
* Import `NbPopoverModule` to your feature module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbPopoverModule,
* ],
* })
* export class PageModule { }
* ```
* ### Usage
*
* Custom components
*
* ```html
* <button [nbPopover]="MyPopoverComponent"></button>
* ```
*
* Both custom components and templateRef popovers can receive *contentContext* property
* that will be passed to the content props.
*
* Primitive types
*
* ```html
* <button nbPopover="Hello, Popover!"></button>
* ```
*
* Popover has different placements, such as: top, bottom, left, right, start and end
* which can be used as following:
*
* @stacked-example(Placements, popover/popover-placements.component)
*
* By default popover will try to adjust itself to maximally fit viewport
* and provide the best user experience. It will try to change position of the popover container.
* If you wanna disable this behaviour just set it falsy value.
*
* ```html
* <button nbPopover="Hello, Popover!" [nbPopoverAdjust]="false"></button>
* ```
*
* Also popover has some different modes which provides capability show$ and hide$ popover in different ways:
*
* - Click mode popover shows when a user clicking on the host element and hides when the user clicks
* somewhere on the document except popover.
* - Hint mode provides capability show$ popover when the user hovers on the host element
* and hide$ popover when user hovers out of the host.
* - Hover mode works like hint mode with one exception - when the user moves mouse from host element to
* the container element popover will not be hidden.
*
* @stacked-example(Available Modes, popover/popover-modes.component.html)
*
* @additional-example(Template Ref, popover/popover-template-ref.component)
* @additional-example(Custom Component, popover/popover-custom-component.component)
* */
export class NbPopoverDirective {
/**
* @param {?} document
* @param {?} hostRef
* @param {?} positionBuilder
* @param {?} overlay
* @param {?} componentFactoryResolver
*/
constructor(document, hostRef, positionBuilder, overlay, componentFactoryResolver) {
this.document = document;
this.hostRef = hostRef;
this.positionBuilder = positionBuilder;
this.overlay = overlay;
this.componentFactoryResolver = componentFactoryResolver;
/*
* Container content context. Will be applied to the rendered component.
* */
this.context = {};
/*
* Position will be calculated relatively host element based on the position.
* Can be top, right, bottom, left, start or end.
* */
this.position = NbPosition.TOP;
/*
* Container position will be changes automatically based on this strategy if container can't fit view port.
* Set this property to any falsy value if you want to disable automatically adjustment.
* Available values: clockwise, counterclockwise.
* */
this.adjustment = NbAdjustment.CLOCKWISE;
/*
* Describes when the container will be shown.
* Available options: click, hover and hint
* */
this.mode = NbTrigger.CLICK;
this.alive = true;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.positionStrategy = this.createPositionStrategy();
this.ref = this.overlay.create({
positionStrategy: this.positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition(),
});
this.triggerStrategy = this.createTriggerStrategy();
this.subscribeOnTriggers();
this.subscribeOnPositionChange();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
this.hide();
}
/**
* @return {?}
*/
show() {
this.container = createContainer(this.ref, NbPopoverComponent, {
position: this.position,
content: this.content,
context: this.context,
cfr: this.componentFactoryResolver,
}, this.componentFactoryResolver);
}
/**
* @return {?}
*/
hide() {
this.ref.detach();
this.container = null;
}
/**
* @return {?}
*/
toggle() {
if (this.ref && this.ref.hasAttached()) {
this.hide();
}
else {
this.show();
}
}
/**
* @protected
* @return {?}
*/
createPositionStrategy() {
return this.positionBuilder
.connectedTo(this.hostRef)
.position(this.position)
.adjustment(this.adjustment);
}
/**
* @protected
* @return {?}
*/
createTriggerStrategy() {
return new NbTriggerStrategyBuilder()
.document(this.document)
.trigger(this.mode)
.host(this.hostRef.nativeElement)
.container(() => this.container)
.build();
}
/**
* @protected
* @return {?}
*/
subscribeOnPositionChange() {
this.positionStrategy.positionChange
.pipe(takeWhile(() => this.alive))
.subscribe((position) => patch(this.container, { position }));
}
/**
* @protected
* @return {?}
*/
subscribeOnTriggers() {
this.triggerStrategy.show$.pipe(takeWhile(() => this.alive)).subscribe(() => this.show());
this.triggerStrategy.hide$.pipe(takeWhile(() => this.alive)).subscribe(() => this.hide());
}
}
NbPopoverDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbPopover]' },] }
];
/** @nocollapse */
NbPopoverDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: ElementRef },
{ type: NbPositionBuilderService },
{ type: NbOverlayService },
{ type: ComponentFactoryResolver }
];
NbPopoverDirective.propDecorators = {
content: [{ type: Input, args: ['nbPopover',] }],
context: [{ type: Input, args: ['nbPopoverContext',] }],
position: [{ type: Input, args: ['nbPopoverPlacement',] }],
adjustment: [{ type: Input, args: ['nbPopoverAdjustment',] }],
mode: [{ type: Input, args: ['nbPopoverMode',] }]
};
if (false) {
/** @type {?} */
NbPopoverDirective.prototype.content;
/** @type {?} */
NbPopoverDirective.prototype.context;
/** @type {?} */
NbPopoverDirective.prototype.position;
/** @type {?} */
NbPopoverDirective.prototype.adjustment;
/** @type {?} */
NbPopoverDirective.prototype.mode;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.ref;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.container;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.positionStrategy;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.triggerStrategy;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.alive;
/**
* @type {?}
* @protected
*/
NbPopoverDirective.prototype.document;
/**
* @type {?}
* @private
*/
NbPopoverDirective.prototype.hostRef;
/**
* @type {?}
* @private
*/
NbPopoverDirective.prototype.positionBuilder;
/**
* @type {?}
* @private
*/
NbPopoverDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NbPopoverDirective.prototype.componentFactoryResolver;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBRUwsWUFBWSxFQUdaLGdCQUFnQixFQUNoQixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFNBQVMsRUFFVCx3QkFBd0IsRUFDeEIsS0FBSyxFQUNMLGVBQWUsR0FDaEIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBFekQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7Ozs7SUEyQzdCLFlBQTJDLFFBQVEsRUFDL0IsT0FBbUIsRUFDbkIsZUFBeUMsRUFDekMsT0FBeUIsRUFDekIsd0JBQWtEO1FBSjNCLGFBQVEsR0FBUixRQUFRLENBQUE7UUFDL0IsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDekIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjs7OztRQWxDdEUsWUFBTyxHQUFXLEVBQUUsQ0FBQzs7Ozs7UUFPckIsYUFBUSxHQUFlLFVBQVUsQ0FBQyxHQUFHLENBQUM7Ozs7OztRQVF0QyxlQUFVLEdBQWlCLFlB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QUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDOzs7WUFuSEYsU0FBUyxTQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTs7Ozs0Q0E0Q3ZCLE1BQU0sU0FBQyxXQUFXO1lBM0kvQixVQUFVO1lBY1Ysd0JBQXdCO1lBRnhCLGdCQUFnQjtZQWZoQix3QkFBd0I7OztzQkF5R3ZCLEtBQUssU0FBQyxXQUFXO3NCQU1qQixLQUFLLFNBQUMsa0JBQWtCO3VCQU94QixLQUFLLFNBQUMsb0JBQW9CO3lCQVExQixLQUFLLFNBQUMscUJBQXFCO21CQU8zQixLQUFLLFNBQUMsZUFBZTs7OztJQTVCdEIscUNBQzBCOztJQUsxQixxQ0FDcUI7O0lBTXJCLHNDQUNzQzs7SUFPdEMsd0NBQ2tEOztJQU1sRCxrQ0FDa0M7Ozs7O0lBRWxDLGlDQUE0Qjs7Ozs7SUFDNUIsdUNBQXVDOzs7OztJQUN2Qyw4Q0FBa0U7Ozs7O0lBQ2xFLDZDQUE2Qzs7Ozs7SUFDN0MsbUNBQWdDOzs7OztJQUVwQixzQ0FBdUM7Ozs7O0lBQ3ZDLHFDQUEyQjs7Ozs7SUFDM0IsNkNBQWlEOzs7OztJQUNqRCxxQ0FBaUM7Ozs7O0lBQ2pDLHNEQUEwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheUNvbnRlbnQsXHJcbiAgTmJPdmVybGF5UmVmLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbixcclxuICBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgTmJUcmlnZ2VyLFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcixcclxuICBwYXRjaCxcclxuICBjcmVhdGVDb250YWluZXIsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgTmJQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi9wb3BvdmVyLmNvbXBvbmVudCc7XHJcblxyXG5cclxuLypcclxuICogUG93ZXJmdWwgcG9wb3ZlciBkaXJlY3RpdmUsIHdoaWNoIHByb3ZpZGVzIHRoZSBiZXN0IFVYIGZvciB5b3VyIHVzZXJzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCBwb3BvdmVyL3BvcG92ZXItc2hvd2Nhc2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBQb3BvdmVyIGNhbiBhY2NlcHQgZGlmZmVyZW50IGNvbnRlbnQgc3VjaCBhczpcclxuICogVGVtcGxhdGVSZWZcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIFtuYlBvcG92ZXJdPVwidGVtcGxhdGVSZWZcIj48L2J1dHRvbj5cclxuICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj5cclxuICogICA8c3Bhbj5IZWxsbywgUG9wb3ZlciE8L3NwYW4+XHJcbiAqIDwvbmctdGVtcGxhdGU+XHJcbiAqIGBgYFxyXG4gKiAjIyMgSW5zdGFsbGF0aW9uXHJcbiAqXHJcbiAqIEltcG9ydCBgTmJQb3BvdmVyTW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJQb3BvdmVyTW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEN1c3RvbSBjb21wb25lbnRzXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJQb3BvdmVyXT1cIk15UG9wb3ZlckNvbXBvbmVudFwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogQm90aCBjdXN0b20gY29tcG9uZW50cyBhbmQgdGVtcGxhdGVSZWYgcG9wb3ZlcnMgY2FuIHJlY2VpdmUgKmNvbnRlbnRDb250ZXh0KiBwcm9wZXJ0eVxyXG4gKiB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb250ZW50IHByb3BzLlxyXG4gKlxyXG4gKiBQcmltaXRpdmUgdHlwZXNcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIG5iUG9wb3Zlcj1cIkhlbGxvLCBQb3BvdmVyIVwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogUG9wb3ZlciBoYXMgZGlmZmVyZW50IHBsYWNlbWVudHMsIHN1Y2ggYXM6IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgc3RhcnQgYW5kIGVuZFxyXG4gKiB3aGljaCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dpbmc6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoUGxhY2VtZW50cywgcG9wb3Zlci9wb3BvdmVyLXBsYWNlbWVudHMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IHBvcG92ZXIgd2lsbCB0cnkgdG8gYWRqdXN0IGl0c2VsZiB0byBtYXhpbWFsbHkgZml0IHZpZXdwb3J0XHJcbiAqIGFuZCBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZS4gSXQgd2lsbCB0cnkgdG8gY2hhbmdlIHBvc2l0aW9uIG9mIHRoZSBwb3BvdmVyIGNvbnRhaW5lci5cclxuICogSWYgeW91IHdhbm5hIGRpc2FibGUgdGhpcyBiZWhhdmlvdXIganVzdCBzZXQgaXQgZmFsc3kgdmFsdWUuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBuYlBvcG92ZXI9XCJIZWxsbywgUG9wb3ZlciFcIiBbbmJQb3BvdmVyQWRqdXN0XT1cImZhbHNlXCI+PC9idXR0b24+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBBbHNvIHBvcG92ZXIgaGFzIHNvbWUgZGlmZmVyZW50IG1vZGVzIHdoaWNoIHByb3ZpZGVzIGNhcGFiaWxpdHkgc2hvdyQgYW5kIGhpZGUkIHBvcG92ZXIgaW4gZGlmZmVyZW50IHdheXM6XHJcbiAqXHJcbiAqIC0gQ2xpY2sgbW9kZSBwb3BvdmVyIHNob3dzIHdoZW4gYSB1c2VyIGNsaWNraW5nIG9uIHRoZSBob3N0IGVsZW1lbnQgYW5kIGhpZGVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzXHJcbiAqIHNvbWV3aGVyZSBvbiB0aGUgZG9jdW1lbnQgZXhjZXB0IHBvcG92ZXIuXHJcbiAqIC0gSGludCBtb2RlIHByb3ZpZGVzIGNhcGFiaWxpdHkgc2hvdyQgcG9wb3ZlciB3aGVuIHRoZSB1c2VyIGhvdmVycyBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAqIGFuZCBoaWRlJCBwb3BvdmVyIHdoZW4gdXNlciBob3ZlcnMgb3V0IG9mIHRoZSBob3N0LlxyXG4gKiAtIEhvdmVyIG1vZGUgd29ya3MgbGlrZSBoaW50IG1vZGUgd2l0aCBvbmUgZXhjZXB0aW9uIC0gd2hlbiB0aGUgdXNlciBtb3ZlcyBtb3VzZSBmcm9tIGhvc3QgZWxlbWVudCB0b1xyXG4gKiB0aGUgY29udGFpbmVyIGVsZW1lbnQgcG9wb3ZlciB3aWxsIG5vdCBiZSBoaWRkZW4uXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQXZhaWxhYmxlIE1vZGVzLCBwb3BvdmVyL3BvcG92ZXItbW9kZXMuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIEBhZGRpdGlvbmFsLWV4YW1wbGUoVGVtcGxhdGUgUmVmLCBwb3BvdmVyL3BvcG92ZXItdGVtcGxhdGUtcmVmLmNvbXBvbmVudClcclxuICogQGFkZGl0aW9uYWwtZXhhbXBsZShDdXN0b20gQ29tcG9uZW50LCBwb3BvdmVyL3BvcG92ZXItY3VzdG9tLWNvbXBvbmVudC5jb21wb25lbnQpXHJcbiAqICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcG92ZXJdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLypcclxuICAgKiBQb3BvdmVyIGNvbnRlbnQgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCBpbiBOYkFycm93ZWRPdmVybGF5Q29udGFpbmVyQ29tcG9uZW50LlxyXG4gICAqIEF2YWlsYWJsZSBjb250ZW50OiB0ZW1wbGF0ZSByZWYsIGNvbXBvbmVudCBhbmQgYW55IHByaW1pdGl2ZS5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyJylcclxuICBjb250ZW50OiBOYk92ZXJsYXlDb250ZW50O1xyXG5cclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBjb250ZW50IGNvbnRleHQuIFdpbGwgYmUgYXBwbGllZCB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50LlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYlBvcG92ZXJDb250ZXh0JylcclxuICBjb250ZXh0OiBPYmplY3QgPSB7fTtcclxuXHJcbiAgLypcclxuICAgKiBQb3NpdGlvbiB3aWxsIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmVseSBob3N0IGVsZW1lbnQgYmFzZWQgb24gdGhlIHBvc2l0aW9uLlxyXG4gICAqIENhbiBiZSB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0IG9yIGVuZC5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyUGxhY2VtZW50JylcclxuICBwb3NpdGlvbjogTmJQb3NpdGlvbiA9IE5iUG9zaXRpb24uVE9QO1xyXG5cclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGlzIHN0cmF0ZWd5IGlmIGNvbnRhaW5lciBjYW4ndCBmaXQgdmlldyBwb3J0LlxyXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGFueSBmYWxzeSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGF1dG9tYXRpY2FsbHkgYWRqdXN0bWVudC5cclxuICAgKiBBdmFpbGFibGUgdmFsdWVzOiBjbG9ja3dpc2UsIGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ25iUG9wb3ZlckFkanVzdG1lbnQnKVxyXG4gIGFkanVzdG1lbnQ6IE5iQWRqdXN0bWVudCA9IE5iQWRqdXN0bWVudC5DTE9DS1dJU0U7XHJcblxyXG4gIC8qXHJcbiAgICogRGVzY3JpYmVzIHdoZW4gdGhlIGNvbnRhaW5lciB3aWxsIGJlIHNob3duLlxyXG4gICAqIEF2YWlsYWJsZSBvcHRpb25zOiBjbGljaywgaG92ZXIgYW5kIGhpbnRcclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyTW9kZScpXHJcbiAgbW9kZTogTmJUcmlnZ2VyID0gTmJUcmlnZ2VyLkNMSUNLO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVmOiBOYk92ZXJsYXlSZWY7XHJcbiAgcHJvdGVjdGVkIGNvbnRhaW5lcjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHJvdGVjdGVkIHBvc2l0aW9uU3RyYXRlZ3k6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIHRyaWdnZXJTdHJhdGVneTogTmJUcmlnZ2VyU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChOQl9ET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaG9zdFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHBvc2l0aW9uQnVpbGRlcjogTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgb3ZlcmxheTogTmJPdmVybGF5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTtcclxuICAgIHRoaXMucmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25UcmlnZ2VycygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY3JlYXRlQ29udGFpbmVyKHRoaXMucmVmLCBOYlBvcG92ZXJDb21wb25lbnQsIHtcclxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXHJcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCxcclxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxyXG4gICAgICBjZnI6IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgfSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMucmVmICYmIHRoaXMucmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5jb25uZWN0ZWRUbyh0aGlzLmhvc3RSZWYpXHJcbiAgICAgIC5wb3NpdGlvbih0aGlzLnBvc2l0aW9uKVxyXG4gICAgICAuYWRqdXN0bWVudCh0aGlzLmFkanVzdG1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcigpXHJcbiAgICAgIC5kb2N1bWVudCh0aGlzLmRvY3VtZW50KVxyXG4gICAgICAudHJpZ2dlcih0aGlzLm1vZGUpXHJcbiAgICAgIC5ob3N0KHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KVxyXG4gICAgICAuY29udGFpbmVyKCgpID0+IHRoaXMuY29udGFpbmVyKVxyXG4gICAgICAuYnVpbGQoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlXHJcbiAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSlcclxuICAgICAgLnN1YnNjcmliZSgocG9zaXRpb246IE5iUG9zaXRpb24pID0+IHBhdGNoKHRoaXMuY29udGFpbmVyLCB7IHBvc2l0aW9uIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblRyaWdnZXJzKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kuc2hvdyQucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneS5oaWRlJC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcbn1cclxuIl19