theme-lib
Version:
This is a simple example Angular Library published to npm.
296 lines • 27.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { fromEvent as observableFromEvent, merge as observableMerge } from 'rxjs';
import { debounceTime, delay, filter, repeat, share, switchMap, takeUntil, takeWhile, map } from 'rxjs/operators';
/** @enum {string} */
const NbTrigger = {
CLICK: 'click',
HOVER: 'hover',
HINT: 'hint',
FOCUS: 'focus',
};
export { NbTrigger };
/*
* Provides entity with two event stream: show and hide.
* Each stream provides different events depends on implementation.
* We have three main trigger strategies: click, hint and hover.
* */
/*
* TODO maybe we have to use renderer.listen instead of observableFromEvent?
* Renderer provides capability use it in service worker, ssr and so on.
* */
/**
* @abstract
*/
export class NbTriggerStrategy {
/**
* @param {?} document
* @param {?} host
* @param {?} container
*/
constructor(document, host, container) {
this.document = document;
this.host = host;
this.container = container;
}
/**
* @protected
* @param {?} event
* @return {?}
*/
isNotOnHostOrContainer(event) {
return !this.isOnHost(event) && !this.isOnContainer(event);
}
/**
* @protected
* @param {?} event
* @return {?}
*/
isOnHostOrContainer(event) {
return this.isOnHost(event) || this.isOnContainer(event);
}
/**
* @protected
* @param {?} __0
* @return {?}
*/
isOnHost({ target }) {
return this.host.contains((/** @type {?} */ (target)));
}
/**
* @protected
* @param {?} __0
* @return {?}
*/
isOnContainer({ target }) {
return this.container() && this.container().location.nativeElement.contains(target);
}
}
if (false) {
/** @type {?} */
NbTriggerStrategy.prototype.show$;
/** @type {?} */
NbTriggerStrategy.prototype.hide$;
/**
* @type {?}
* @protected
*/
NbTriggerStrategy.prototype.document;
/**
* @type {?}
* @protected
*/
NbTriggerStrategy.prototype.host;
/**
* @type {?}
* @protected
*/
NbTriggerStrategy.prototype.container;
}
/*
* Creates show and hide event streams.
* Fires toggle event when the click was performed on the host element.
* Fires close event when the click was performed on the document but
* not on the host or container.
* */
export class NbClickTriggerStrategy extends NbTriggerStrategy {
constructor() {
super(...arguments);
// since we should track click for both SHOW and HIDE event we firstly need to track the click and the state
// of the container and then later on decide should we hide it or show
// if we track the click & state separately this will case a behavior when the container is getting shown
// and then hidden right away
this.click$ = observableFromEvent(this.document, 'click')
.pipe(map((event) => (/** @type {?} */ ([!this.container() && this.isOnHost(event), event]))), share());
this.show$ = this.click$
.pipe(filter(([shouldShow]) => shouldShow), map(([, event]) => event));
this.hide$ = this.click$
.pipe(filter(([shouldShow, event]) => !shouldShow && !this.isOnContainer(event)), map(([, event]) => event));
}
}
if (false) {
/**
* @type {?}
* @protected
*/
NbClickTriggerStrategy.prototype.click$;
/** @type {?} */
NbClickTriggerStrategy.prototype.show$;
/** @type {?} */
NbClickTriggerStrategy.prototype.hide$;
}
/*
* Creates show and hide event streams.
* Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds.
* Fires close event when the mouse leaves the host element and stops out of the host and popover container.
* */
export class NbHoverTriggerStrategy extends NbTriggerStrategy {
constructor() {
super(...arguments);
this.show$ = observableFromEvent(this.host, 'mouseenter')
.pipe(filter(() => !this.container()), delay(100), takeUntil(observableFromEvent(this.host, 'mouseleave')), repeat());
this.hide$ = observableFromEvent(this.host, 'mouseleave')
.pipe(switchMap(() => observableFromEvent(this.document, 'mousemove')
.pipe(debounceTime(100), takeWhile(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event)))));
}
}
if (false) {
/** @type {?} */
NbHoverTriggerStrategy.prototype.show$;
/** @type {?} */
NbHoverTriggerStrategy.prototype.hide$;
}
/*
* Creates show and hide event streams.
* Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds.
* Fires close event when the mouse leaves the host element.
* */
export class NbHintTriggerStrategy extends NbTriggerStrategy {
constructor() {
super(...arguments);
this.show$ = observableFromEvent(this.host, 'mouseenter')
.pipe(delay(100), takeUntil(observableFromEvent(this.host, 'mouseleave')),
// this `delay & takeUntil & repeat` operators combination is a synonym for `conditional debounce`
// meaning that if one event occurs in some time after the initial one we won't react to it
repeat());
this.hide$ = observableFromEvent(this.host, 'mouseleave');
}
}
if (false) {
/** @type {?} */
NbHintTriggerStrategy.prototype.show$;
/** @type {?} */
NbHintTriggerStrategy.prototype.hide$;
}
/*
* Creates show and hide event streams.
* Fires open event when a focus is on the host element and stay over at least 100 milliseconds.
* Fires close event when the focus leaves the host element.
* */
export class NbFocusTriggerStrategy extends NbTriggerStrategy {
constructor() {
super(...arguments);
this.focusOut$ = observableFromEvent(this.host, 'focusout')
.pipe(switchMap(() => observableFromEvent(this.document, 'focusin')
.pipe(takeWhile(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event)))));
this.clickIn$ = observableFromEvent(this.host, 'click')
.pipe(filter(() => !this.container()));
this.clickOut$ = observableFromEvent(this.document, 'click')
.pipe(filter(() => !!this.container()), filter(event => this.isNotOnHostOrContainer(event)));
this.tabKeyPress$ = observableFromEvent(this.document, 'keydown')
.pipe(filter((event) => event.keyCode === 9), filter(() => !!this.container()));
this.show$ = observableMerge(observableFromEvent(this.host, 'focusin'), this.clickIn$)
.pipe(filter(() => !this.container()), debounceTime(100), takeUntil(observableFromEvent(this.host, 'focusout')), repeat());
this.hide$ = observableMerge(this.focusOut$, this.tabKeyPress$, this.clickOut$);
}
}
if (false) {
/**
* @type {?}
* @protected
*/
NbFocusTriggerStrategy.prototype.focusOut$;
/**
* @type {?}
* @protected
*/
NbFocusTriggerStrategy.prototype.clickIn$;
/**
* @type {?}
* @protected
*/
NbFocusTriggerStrategy.prototype.clickOut$;
/**
* @type {?}
* @protected
*/
NbFocusTriggerStrategy.prototype.tabKeyPress$;
/** @type {?} */
NbFocusTriggerStrategy.prototype.show$;
/** @type {?} */
NbFocusTriggerStrategy.prototype.hide$;
}
export class NbTriggerStrategyBuilder {
/**
* @template THIS
* @this {THIS}
* @param {?} document
* @return {THIS}
*/
document(document) {
(/** @type {?} */ (this))._document = document;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} trigger
* @return {THIS}
*/
trigger(trigger) {
(/** @type {?} */ (this))._trigger = trigger;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} host
* @return {THIS}
*/
host(host) {
(/** @type {?} */ (this))._host = host;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} container
* @return {THIS}
*/
container(container) {
(/** @type {?} */ (this))._container = container;
return (/** @type {?} */ (this));
}
/**
* @return {?}
*/
build() {
switch (this._trigger) {
case NbTrigger.CLICK:
return new NbClickTriggerStrategy(this._document, this._host, this._container);
case NbTrigger.HINT:
return new NbHintTriggerStrategy(this._document, this._host, this._container);
case NbTrigger.HOVER:
return new NbHoverTriggerStrategy(this._document, this._host, this._container);
case NbTrigger.FOCUS:
return new NbFocusTriggerStrategy(this._document, this._host, this._container);
default:
throw new Error('Trigger have to be provided');
}
}
}
if (false) {
/**
* @type {?}
* @protected
*/
NbTriggerStrategyBuilder.prototype._host;
/**
* @type {?}
* @protected
*/
NbTriggerStrategyBuilder.prototype._container;
/**
* @type {?}
* @protected
*/
NbTriggerStrategyBuilder.prototype._trigger;
/**
* @type {?}
* @protected
*/
NbTriggerStrategyBuilder.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS10cmlnZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2RrL292ZXJsYXkvb3ZlcmxheS10cmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsU0FBUyxJQUFJLG1CQUFtQixFQUFFLEtBQUssSUFBSSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztJQUloSCxPQUFRLE9BQU87SUFDZixPQUFRLE9BQU87SUFDZixNQUFPLE1BQU07SUFDYixPQUFRLE9BQU87Ozs7Ozs7Ozs7Ozs7OztBQVlqQixNQUFNLE9BQWdCLGlCQUFpQjs7Ozs7O0lBcUJyQyxZQUFzQixRQUFrQixFQUFZLElBQWlCLEVBQVksU0FBa0M7UUFBN0YsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFZLFNBQUksR0FBSixJQUFJLENBQWE7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUF5QjtJQUNuSCxDQUFDOzs7Ozs7SUFwQlMsc0JBQXNCLENBQUMsS0FBWTtRQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7Ozs7O0lBRVMsbUJBQW1CLENBQUMsS0FBWTtRQUN4QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs7Ozs7SUFFUyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQVM7UUFDbEMsT0FBTyxJQUFJLENBQUMsSUFBSSxD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QU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7Q0FDRjs7Ozs7O0lBdkNDLHlDQUE2Qjs7Ozs7SUFDN0IsOENBQThDOzs7OztJQUM5Qyw0Q0FBOEI7Ozs7O0lBQzlCLDZDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgYXMgb2JzZXJ2YWJsZUZyb21FdmVudCwgbWVyZ2UgYXMgb2JzZXJ2YWJsZU1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgcmVwZWF0LCBzaGFyZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIE5iVHJpZ2dlciB7XHJcbiAgQ0xJQ0sgPSAnY2xpY2snLFxyXG4gIEhPVkVSID0gJ2hvdmVyJyxcclxuICBISU5UID0gJ2hpbnQnLFxyXG4gIEZPQ1VTID0gJ2ZvY3VzJyxcclxufVxyXG5cclxuLypcclxuICogUHJvdmlkZXMgZW50aXR5IHdpdGggdHdvIGV2ZW50IHN0cmVhbTogc2hvdyBhbmQgaGlkZS5cclxuICogRWFjaCBzdHJlYW0gcHJvdmlkZXMgZGlmZmVyZW50IGV2ZW50cyBkZXBlbmRzIG9uIGltcGxlbWVudGF0aW9uLlxyXG4gKiBXZSBoYXZlIHRocmVlIG1haW4gdHJpZ2dlciBzdHJhdGVnaWVzOiBjbGljaywgaGludCBhbmQgaG92ZXIuXHJcbiAqICovXHJcbi8qXHJcbiAqIFRPRE8gbWF5YmUgd2UgaGF2ZSB0byB1c2UgcmVuZGVyZXIubGlzdGVuIGluc3RlYWQgb2Ygb2JzZXJ2YWJsZUZyb21FdmVudD9cclxuICogUmVuZGVyZXIgcHJvdmlkZXMgY2FwYWJpbGl0eSB1c2UgaXQgaW4gc2VydmljZSB3b3JrZXIsIHNzciBhbmQgc28gb24uXHJcbiAqICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHByb3RlY3RlZCBpc05vdE9uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzT25Ib3N0KGV2ZW50KSAmJiAhdGhpcy5pc09uQ29udGFpbmVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc09uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNPbkhvc3QoZXZlbnQpIHx8IHRoaXMuaXNPbkNvbnRhaW5lcihldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaXNPbkhvc3QoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhvc3QuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzT25Db250YWluZXIoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcigpICYmIHRoaXMuY29udGFpbmVyKCkubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3Qgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIGFic3RyYWN0IGhpZGUkOiBPYnNlcnZhYmxlPEV2ZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGRvY3VtZW50OiBEb2N1bWVudCwgcHJvdGVjdGVkIGhvc3Q6IEhUTUxFbGVtZW50LCBwcm90ZWN0ZWQgY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pikge1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIHRvZ2dsZSBldmVudCB3aGVuIHRoZSBjbGljayB3YXMgcGVyZm9ybWVkIG9uIHRoZSBob3N0IGVsZW1lbnQuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGNsaWNrIHdhcyBwZXJmb3JtZWQgb24gdGhlIGRvY3VtZW50IGJ1dFxyXG4gKiBub3Qgb24gdGhlIGhvc3Qgb3IgY29udGFpbmVyLlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJDbGlja1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgLy8gc2luY2Ugd2Ugc2hvdWxkIHRyYWNrIGNsaWNrIGZvciBib3RoIFNIT1cgYW5kIEhJREUgZXZlbnQgd2UgZmlyc3RseSBuZWVkIHRvIHRyYWNrIHRoZSBjbGljayBhbmQgdGhlIHN0YXRlXHJcbiAgLy8gb2YgdGhlIGNvbnRhaW5lciBhbmQgdGhlbiBsYXRlciBvbiBkZWNpZGUgc2hvdWxkIHdlIGhpZGUgaXQgb3Igc2hvd1xyXG4gIC8vIGlmIHdlIHRyYWNrIHRoZSBjbGljayAmIHN0YXRlIHNlcGFyYXRlbHkgdGhpcyB3aWxsIGNhc2UgYSBiZWhhdmlvciB3aGVuIHRoZSBjb250YWluZXIgaXMgZ2V0dGluZyBzaG93blxyXG4gIC8vIGFuZCB0aGVuIGhpZGRlbiByaWdodCBhd2F5XHJcbiAgcHJvdGVjdGVkIGNsaWNrJDogT2JzZXJ2YWJsZTxbYm9vbGVhbiwgRXZlbnRdPiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChldmVudDogRXZlbnQpID0+IFshdGhpcy5jb250YWluZXIoKSAmJiB0aGlzLmlzT25Ib3N0KGV2ZW50KSwgZXZlbnRdIGFzIFtib29sZWFuLCBFdmVudF0pLFxyXG4gICAgICBzaGFyZSgpLFxyXG4gICAgKTtcclxuXHJcbiAgcmVhZG9ubHkgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gdGhpcy5jbGljayRcclxuICAgIC5waXBlKFxyXG4gICAgICBmaWx0ZXIoKFtzaG91bGRTaG93XSkgPT4gc2hvdWxkU2hvdyksXHJcbiAgICAgIG1hcCgoWywgZXZlbnRdKSA9PiBldmVudCksXHJcbiAgICApO1xyXG5cclxuICByZWFkb25seSBoaWRlJDogT2JzZXJ2YWJsZTxFdmVudD4gPSB0aGlzLmNsaWNrJFxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoW3Nob3VsZFNob3csIGV2ZW50XSkgPT4gIXNob3VsZFNob3cgJiYgIXRoaXMuaXNPbkNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICBtYXAoKFssIGV2ZW50XSkgPT4gZXZlbnQpLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RvcHMgb3V0IG9mIHRoZSBob3N0IGFuZCBwb3BvdmVyIGNvbnRhaW5lci5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kgZXh0ZW5kcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuaG9zdCwgJ21vdXNlZW50ZXInKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGRlbGF5KDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ21vdXNlbGVhdmUnKSksXHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnbW91c2VsZWF2ZScpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdtb3VzZW1vdmUnKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgICAgICB0YWtlV2hpbGUoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICApLFxyXG4gICAgICApLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudC5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSGludFRyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICBzaG93JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdtb3VzZWVudGVyJylcclxuICAgIC5waXBlKFxyXG4gICAgICBkZWxheSgxMDApLFxyXG4gICAgICB0YWtlVW50aWwob2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJykpLFxyXG4gICAgICAvLyB0aGlzIGBkZWxheSAmIHRha2VVbnRpbCAmIHJlcGVhdGAgb3BlcmF0b3JzIGNvbWJpbmF0aW9uIGlzIGEgc3lub255bSBmb3IgYGNvbmRpdGlvbmFsIGRlYm91bmNlYFxyXG4gICAgICAvLyBtZWFuaW5nIHRoYXQgaWYgb25lIGV2ZW50IG9jY3VycyBpbiBzb21lIHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgb25lIHdlIHdvbid0IHJlYWN0IHRvIGl0XHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJyk7XHJcbn1cclxuXHJcblxyXG4vKlxyXG4gKiBDcmVhdGVzIHNob3cgYW5kIGhpZGUgZXZlbnQgc3RyZWFtcy5cclxuICogRmlyZXMgb3BlbiBldmVudCB3aGVuIGEgZm9jdXMgaXMgb24gdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RheSBvdmVyIGF0IGxlYXN0IDEwMCBtaWxsaXNlY29uZHMuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGZvY3VzIGxlYXZlcyB0aGUgaG9zdCBlbGVtZW50LlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzT3V0JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c291dCcpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdmb2N1c2luJylcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VXaGlsZSgoKSA9PiAhIXRoaXMuY29udGFpbmVyKCkpLFxyXG4gICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHRoaXMuaXNOb3RPbkhvc3RPckNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICAgICksXHJcbiAgICAgICksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tJbiQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnY2xpY2snKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tPdXQkOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpKSxcclxuICAgICk7XHJcblxyXG4gIHByb3RlY3RlZCB0YWJLZXlQcmVzcyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5kb2N1bWVudCwgJ2tleWRvd24nKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmtleUNvZGUgPT09IDkpLFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICk7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVNZXJnZShvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c2luJyksIHRoaXMuY2xpY2tJbiQpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ2ZvY3Vzb3V0JykpLFxyXG4gICAgICByZXBlYXQoKSxcclxuICAgICk7XHJcblxyXG4gIGhpZGUkID0gb2JzZXJ2YWJsZU1lcmdlKHRoaXMuZm9jdXNPdXQkLCB0aGlzLnRhYktleVByZXNzJCwgdGhpcy5jbGlja091dCQpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBfY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55PjtcclxuICBwcm90ZWN0ZWQgX3RyaWdnZXI6IE5iVHJpZ2dlcjtcclxuICBwcm90ZWN0ZWQgX2RvY3VtZW50OiBEb2N1bWVudDtcclxuXHJcbiAgZG9jdW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogdGhpcyB7XHJcbiAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyKHRyaWdnZXI6IE5iVHJpZ2dlcik6IHRoaXMge1xyXG4gICAgdGhpcy5fdHJpZ2dlciA9IHRyaWdnZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGhvc3QoaG9zdDogSFRNTEVsZW1lbnQpOiB0aGlzIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjb250YWluZXIoY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pik6IHRoaXMge1xyXG4gICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBidWlsZCgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3RyaWdnZXIpIHtcclxuICAgICAgY2FzZSBOYlRyaWdnZXIuQ0xJQ0s6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYkNsaWNrVHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5ISU5UOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJIaW50VHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5IT1ZFUjpcclxuICAgICAgICByZXR1cm4gbmV3IE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kodGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hvc3QsIHRoaXMuX2NvbnRhaW5lcik7XHJcbiAgICAgIGNhc2UgTmJUcmlnZ2VyLkZPQ1VTOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSh0aGlzLl9kb2N1bWVudCwgdGhpcy5faG9zdCwgdGhpcy5fY29udGFpbmVyKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWdnZXIgaGF2ZSB0byBiZSBwcm92aWRlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=