theme-lib
Version:
This is a simple example Angular Library published to npm.
548 lines • 34.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ComponentFactoryResolver, Inject, Injectable } from '@angular/core';
import { NbComponentPortal, NbOverlayService, NbPositionBuilderService, NbPositionHelper, patch, } from '../cdk';
import { NbToastrContainerComponent } from './toastr-container.component';
import { NB_TOASTR_CONFIG, NbToastrConfig } from './toastr-config';
import { NbToastStatus } from './model';
var NbToastContainer = /** @class */ (function () {
function NbToastContainer(position, containerRef, positionHelper) {
this.position = position;
this.containerRef = containerRef;
this.positionHelper = positionHelper;
this.toasts = [];
}
/**
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.attach = /**
* @param {?} toast
* @return {?}
*/
function (toast) {
if (toast.config.preventDuplicates && this.isDuplicate(toast)) {
return;
}
/** @type {?} */
var toastComponent = this.attachToast(toast);
if (toast.config.destroyByClick) {
this.subscribeOnClick(toastComponent, toast);
}
if (toast.config.duration) {
this.setDestroyTimeout(toast);
}
this.prevToast = toast;
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.isDuplicate = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
return this.prevToast
&& this.prevToast.message === toast.message
&& this.prevToast.title === toast.title;
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.attachToast = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
if (this.positionHelper.isTopPosition(toast.config.position)) {
return this.attachToTop(toast);
}
else {
return this.attachToBottom(toast);
}
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.attachToTop = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
this.toasts.unshift(toast);
this.updateContainer();
return this.containerRef.instance.toasts.first;
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.attachToBottom = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
this.toasts.push(toast);
this.updateContainer();
return this.containerRef.instance.toasts.last;
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.setDestroyTimeout = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
var _this = this;
setTimeout(function () { return _this.destroy(toast); }, toast.config.duration);
};
/**
* @protected
* @param {?} toastComponent
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.subscribeOnClick = /**
* @protected
* @param {?} toastComponent
* @param {?} toast
* @return {?}
*/
function (toastComponent, toast) {
var _this = this;
toastComponent.destroy.subscribe(function () { return _this.destroy(toast); });
};
/**
* @protected
* @param {?} toast
* @return {?}
*/
NbToastContainer.prototype.destroy = /**
* @protected
* @param {?} toast
* @return {?}
*/
function (toast) {
this.toasts = this.toasts.filter(function (t) { return t !== toast; });
this.updateContainer();
};
/**
* @protected
* @return {?}
*/
NbToastContainer.prototype.updateContainer = /**
* @protected
* @return {?}
*/
function () {
patch(this.containerRef, { content: this.toasts, position: this.position });
};
return NbToastContainer;
}());
export { NbToastContainer };
if (false) {
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.toasts;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.prevToast;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.position;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.containerRef;
/**
* @type {?}
* @protected
*/
NbToastContainer.prototype.positionHelper;
}
var NbToastrContainerRegistry = /** @class */ (function () {
function NbToastrContainerRegistry(overlay, positionBuilder, positionHelper, cfr) {
this.overlay = overlay;
this.positionBuilder = positionBuilder;
this.positionHelper = positionHelper;
this.cfr = cfr;
this.overlays = new Map();
}
/**
* @param {?} position
* @return {?}
*/
NbToastrContainerRegistry.prototype.get = /**
* @param {?} position
* @return {?}
*/
function (position) {
/** @type {?} */
var logicalPosition = this.positionHelper.toLogicalPosition(position);
if (!this.overlays.has(logicalPosition)) {
this.instantiateContainer(logicalPosition);
}
return this.overlays.get(logicalPosition);
};
/**
* @protected
* @param {?} position
* @return {?}
*/
NbToastrContainerRegistry.prototype.instantiateContainer = /**
* @protected
* @param {?} position
* @return {?}
*/
function (position) {
/** @type {?} */
var container = this.createContainer(position);
this.overlays.set(position, container);
};
/**
* @protected
* @param {?} position
* @return {?}
*/
NbToastrContainerRegistry.prototype.createContainer = /**
* @protected
* @param {?} position
* @return {?}
*/
function (position) {
/** @type {?} */
var positionStrategy = this.positionBuilder.global().position(position);
/** @type {?} */
var ref = this.overlay.create({ positionStrategy: positionStrategy });
/** @type {?} */
var containerRef = ref.attach(new NbComponentPortal(NbToastrContainerComponent, null, null, this.cfr));
return new NbToastContainer(position, containerRef, this.positionHelper);
};
NbToastrContainerRegistry.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbToastrContainerRegistry.ctorParameters = function () { return [
{ type: NbOverlayService },
{ type: NbPositionBuilderService },
{ type: NbPositionHelper },
{ type: ComponentFactoryResolver }
]; };
return NbToastrContainerRegistry;
}());
export { NbToastrContainerRegistry };
if (false) {
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.overlays;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.overlay;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.positionHelper;
/**
* @type {?}
* @protected
*/
NbToastrContainerRegistry.prototype.cfr;
}
/*
* The `NbToastrService` provides a capability to build toast notifications.
*
* @stacked-example(Showcase, toastr/toastr-showcase.component)
*
* `NbToastrService.show(message, title, config)` accepts three params, title and config are optional.
*
* ### Installation
*
* Import `NbToastrModule.forRoot()` to your app module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbToastrModule.forRoot(config),
* ],
* })
* export class AppModule { }
* ```
*
* ### Usage
*
* Config accepts following options:
*
* `position` - determines where on the screen toast will be rendered.
* Default is `top-end`.
*
* @stacked-example(Position, toastr/toastr-positions.component)
*
* `status` - coloring and icon of the toast.
* Default is `primary`
*
* @stacked-example(Status, toastr/toastr-statuses.component)
*
* `duration` - the time after which the toast will be destroyed.
* `0` means endless toast, that may be destroyed by click only.
* Default is 3000 ms.
*
* @stacked-example(Duration, toastr/toastr-duration.component)
*
* `destroyByClick` - provides a capability to destroy toast by click.
* Default is true.
*
* @stacked-example(Destroy by click, toastr/toastr-destroy-by-click.component)
*
* `preventDuplicates` - don't create new toast if it has the same title and the same message with previous one.
* Default is false.
*
* @stacked-example(Prevent duplicates, toastr/toastr-prevent-duplicates.component)
*
* `hasIcon` - if true then render toast icon.
* `icon` - you can pass icon class that will be applied into the toast.
*
* @stacked-example(Has icon, toastr/toastr-icon.component)
* */
var NbToastrService = /** @class */ (function () {
function NbToastrService(globalConfig, containerRegistry) {
this.globalConfig = globalConfig;
this.containerRegistry = containerRegistry;
}
/*
* Shows toast with message, title and user config.
* */
/*
* Shows toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} userConfig
* @return {?}
*/
NbToastrService.prototype.show = /*
* Shows toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} userConfig
* @return {?}
*/
function (message, title, userConfig) {
/** @type {?} */
var config = new NbToastrConfig(tslib_1.__assign({}, this.globalConfig, userConfig));
/** @type {?} */
var container = this.containerRegistry.get(config.position);
/** @type {?} */
var toast = { message: message, title: title, config: config };
container.attach(toast);
};
/*
* Shows success toast with message, title and user config.
* */
/*
* Shows success toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.success = /*
* Shows success toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.SUCCESS }));
};
/*
* Shows info toast with message, title and user config.
* */
/*
* Shows info toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.info = /*
* Shows info toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.INFO }));
};
/*
* Shows warning toast with message, title and user config.
* */
/*
* Shows warning toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.warning = /*
* Shows warning toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.WARNING }));
};
/*
* Shows primary toast with message, title and user config.
* */
/*
* Shows primary toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.primary = /*
* Shows primary toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.PRIMARY }));
};
/*
* Shows danger toast with message, title and user config.
* */
/*
* Shows danger toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.danger = /*
* Shows danger toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.DANGER }));
};
/*
* Shows default toast with message, title and user config.
* */
/*
* Shows default toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
NbToastrService.prototype.default = /*
* Shows default toast with message, title and user config.
* */
/**
* @param {?} message
* @param {?=} title
* @param {?=} config
* @return {?}
*/
function (message, title, config) {
return this.show(message, title, tslib_1.__assign({}, config, { status: NbToastStatus.DEFAULT }));
};
NbToastrService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbToastrService.ctorParameters = function () { return [
{ type: NbToastrConfig, decorators: [{ type: Inject, args: [NB_TOASTR_CONFIG,] }] },
{ type: NbToastrContainerRegistry }
]; };
return NbToastrService;
}());
export { NbToastrService };
if (false) {
/**
* @type {?}
* @protected
*/
NbToastrService.prototype.globalConfig;
/**
* @type {?}
* @protected
*/
NbToastrService.prototype.containerRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy90b2FzdHIvdG9hc3RyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSx3QkFBd0IsRUFBZ0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRixPQUFPLEVBQ0wsaUJBQWlCLEVBR2pCLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLEtBQUssR0FDTixNQUFNLFFBQVEsQ0FBQztBQUNoQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkUsT0FBTyxFQUFXLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUlqRDtJQUlFLDBCQUFzQixRQUEwQixFQUMxQixZQUFzRCxFQUN0RCxjQUFnQztRQUZoQyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBMEM7UUFDdEQsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBTDVDLFdBQU0sR0FBYyxFQUFFLENBQUM7SUFNakMsQ0FBQzs7Ozs7SUFFRCxpQ0FBTTs7OztJQUFOLFVBQU8sS0FBYztRQUNuQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3RCxPQUFPO1NBQ1I7O1lBRUssY0FBYyxHQUFxQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVoRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDOUM7UUFF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QUFFLGFBQWEsQ0FBQyxPQUFPLElBQUcsQ0FBQztJQUNqRixDQUFDOztnQkF4REYsVUFBVTs7OztnQkFyS2dCLGNBQWMsdUJBdUsxQixNQUFNLFNBQUMsZ0JBQWdCO2dCQUNLLHlCQUF5Qjs7SUFzRHBFLHNCQUFDO0NBQUEsQUF6REQsSUF5REM7U0F4RFksZUFBZTs7Ozs7O0lBQ2QsdUNBQWdFOzs7OztJQUNoRSw0Q0FBc0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBOYkNvbXBvbmVudFBvcnRhbCxcclxuICBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbixcclxuICBOYkdsb2JhbFBvc2l0aW9uLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gIE5iUG9zaXRpb25IZWxwZXIsXHJcbiAgcGF0Y2gsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTmJUb2FzdHJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0ci1jb250YWluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTkJfVE9BU1RSX0NPTkZJRywgTmJUb2FzdHJDb25maWcgfSBmcm9tICcuL3RvYXN0ci1jb25maWcnO1xyXG5pbXBvcnQgeyBOYlRvYXN0LCBOYlRvYXN0U3RhdHVzIH0gZnJvbSAnLi9tb2RlbCc7XHJcbmltcG9ydCB7IE5iVG9hc3RDb21wb25lbnQgfSBmcm9tICcuL3RvYXN0LmNvbXBvbmVudCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE5iVG9hc3RDb250YWluZXIge1xyXG4gIHByb3RlY3RlZCB0b2FzdHM6IE5iVG9hc3RbXSA9IFtdO1xyXG4gIHByb3RlY3RlZCBwcmV2VG9hc3Q6IE5iVG9hc3Q7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwb3NpdGlvbjogTmJHbG9iYWxQb3NpdGlvbixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8TmJUb2FzdHJDb250YWluZXJDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwb3NpdGlvbkhlbHBlcjogTmJQb3NpdGlvbkhlbHBlcikge1xyXG4gIH1cclxuXHJcbiAgYXR0YWNoKHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICBpZiAodG9hc3QuY29uZmlnLnByZXZlbnREdXBsaWNhdGVzICYmIHRoaXMuaXNEdXBsaWNhdGUodG9hc3QpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b2FzdENvbXBvbmVudDogTmJUb2FzdENvbXBvbmVudCA9IHRoaXMuYXR0YWNoVG9hc3QodG9hc3QpO1xyXG5cclxuICAgIGlmICh0b2FzdC5jb25maWcuZGVzdHJveUJ5Q2xpY2spIHtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVPbkNsaWNrKHRvYXN0Q29tcG9uZW50LCB0b2FzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRvYXN0LmNvbmZpZy5kdXJhdGlvbikge1xyXG4gICAgICB0aGlzLnNldERlc3Ryb3lUaW1lb3V0KHRvYXN0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXZUb2FzdCA9IHRvYXN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHVwbGljYXRlKHRvYXN0OiBOYlRvYXN0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmV2VG9hc3RcclxuICAgICAgJiYgdGhpcy5wcmV2VG9hc3QubWVzc2FnZSA9PT0gdG9hc3QubWVzc2FnZVxyXG4gICAgICAmJiB0aGlzLnByZXZUb2FzdC50aXRsZSA9PT0gdG9hc3QudGl0bGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9hc3QodG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIGlmICh0aGlzLnBvc2l0aW9uSGVscGVyLmlzVG9wUG9zaXRpb24odG9hc3QuY29uZmlnLnBvc2l0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb1RvcCh0b2FzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb0JvdHRvbSh0b2FzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9Ub3AodG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIHRoaXMudG9hc3RzLnVuc2hpZnQodG9hc3QpO1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXIoKTtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS50b2FzdHMuZmlyc3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoVG9Cb3R0b20odG9hc3Q6IE5iVG9hc3QpOiBOYlRvYXN0Q29tcG9uZW50IHtcclxuICAgIHRoaXMudG9hc3RzLnB1c2godG9hc3QpO1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXIoKTtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS50b2FzdHMubGFzdDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZXREZXN0cm95VGltZW91dCh0b2FzdDogTmJUb2FzdCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRlc3Ryb3kodG9hc3QpLCB0b2FzdC5jb25maWcuZHVyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uQ2xpY2sodG9hc3RDb21wb25lbnQ6IE5iVG9hc3RDb21wb25lbnQsIHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICB0b2FzdENvbXBvbmVudC5kZXN0cm95LnN1YnNjcmliZSgoKSA9PiB0aGlzLmRlc3Ryb3kodG9hc3QpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZXN0cm95KHRvYXN0OiBOYlRvYXN0KSB7XHJcbiAgICB0aGlzLnRvYXN0cyA9IHRoaXMudG9hc3RzLmZpbHRlcih0ID0+IHQgIT09IHRvYXN0KTtcclxuICAgIHRoaXMudXBkYXRlQ29udGFpbmVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ29udGFpbmVyKCkge1xyXG4gICAgcGF0Y2godGhpcy5jb250YWluZXJSZWYsIHsgY29udGVudDogdGhpcy50b2FzdHMsIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5iVG9hc3RyQ29udGFpbmVyUmVnaXN0cnkge1xyXG4gIHByb3RlY3RlZCBvdmVybGF5czogTWFwPE5iR2xvYmFsUG9zaXRpb24sIE5iVG9hc3RDb250YWluZXI+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3ZlcmxheTogTmJPdmVybGF5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcG9zaXRpb25CdWlsZGVyOiBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uSGVscGVyOiBOYlBvc2l0aW9uSGVscGVyLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBvc2l0aW9uOiBOYkdsb2JhbFBvc2l0aW9uKTogTmJUb2FzdENvbnRhaW5lciB7XHJcbiAgICBjb25zdCBsb2dpY2FsUG9zaXRpb246IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbkhlbHBlci50b0xvZ2ljYWxQb3NpdGlvbihwb3NpdGlvbik7XHJcblxyXG4gICAgaWYgKCF0aGlzLm92ZXJsYXlzLmhhcyhsb2dpY2FsUG9zaXRpb24pKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFudGlhdGVDb250YWluZXIobG9naWNhbFBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5cy5nZXQobG9naWNhbFBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnN0YW50aWF0ZUNvbnRhaW5lcihwb3NpdGlvbjogTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24pIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlQ29udGFpbmVyKHBvc2l0aW9uKTtcclxuICAgIHRoaXMub3ZlcmxheXMuc2V0KHBvc2l0aW9uLCBjb250YWluZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbnRhaW5lcihwb3NpdGlvbjogTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24pOiBOYlRvYXN0Q29udGFpbmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLnBvc2l0aW9uQnVpbGRlci5nbG9iYWwoKS5wb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICBjb25zdCByZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHsgcG9zaXRpb25TdHJhdGVneSB9KTtcclxuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IHJlZi5hdHRhY2gobmV3IE5iQ29tcG9uZW50UG9ydGFsKE5iVG9hc3RyQ29udGFpbmVyQ29tcG9uZW50LCBudWxsLCBudWxsLCB0aGlzLmNmcikpO1xyXG4gICAgcmV0dXJuIG5ldyBOYlRvYXN0Q29udGFpbmVyKHBvc2l0aW9uLCBjb250YWluZXJSZWYsIHRoaXMucG9zaXRpb25IZWxwZXIpO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVGhlIGBOYlRvYXN0clNlcnZpY2VgIHByb3ZpZGVzIGEgY2FwYWJpbGl0eSB0byBidWlsZCB0b2FzdCBub3RpZmljYXRpb25zLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB0b2FzdHIvdG9hc3RyLXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogYE5iVG9hc3RyU2VydmljZS5zaG93KG1lc3NhZ2UsIHRpdGxlLCBjb25maWcpYCBhY2NlcHRzIHRocmVlIHBhcmFtcywgdGl0bGUgYW5kIGNvbmZpZyBhcmUgb3B0aW9uYWwuXHJcbiAqXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYlRvYXN0ck1vZHVsZS5mb3JSb290KClgIHRvIHlvdXIgYXBwIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iVG9hc3RyTW9kdWxlLmZvclJvb3QoY29uZmlnKSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICpcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIENvbmZpZyBhY2NlcHRzIGZvbGxvd2luZyBvcHRpb25zOlxyXG4gKlxyXG4gKiBgcG9zaXRpb25gIC0gZGV0ZXJtaW5lcyB3aGVyZSBvbiB0aGUgc2NyZWVuIHRvYXN0IHdpbGwgYmUgcmVuZGVyZWQuXHJcbiAqIERlZmF1bHQgaXMgYHRvcC1lbmRgLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFBvc2l0aW9uLCB0b2FzdHIvdG9hc3RyLXBvc2l0aW9ucy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBzdGF0dXNgIC0gY29sb3JpbmcgYW5kIGljb24gb2YgdGhlIHRvYXN0LlxyXG4gKiBEZWZhdWx0IGlzIGBwcmltYXJ5YFxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFN0YXR1cywgdG9hc3RyL3RvYXN0ci1zdGF0dXNlcy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBkdXJhdGlvbmAgLSB0aGUgdGltZSBhZnRlciB3aGljaCB0aGUgdG9hc3Qgd2lsbCBiZSBkZXN0cm95ZWQuXHJcbiAqIGAwYCBtZWFucyBlbmRsZXNzIHRvYXN0LCB0aGF0IG1heSBiZSBkZXN0cm95ZWQgYnkgY2xpY2sgb25seS5cclxuICogRGVmYXVsdCBpcyAzMDAwIG1zLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKER1cmF0aW9uLCB0b2FzdHIvdG9hc3RyLWR1cmF0aW9uLmNvbXBvbmVudClcclxuICpcclxuICogYGRlc3Ryb3lCeUNsaWNrYCAtIHByb3ZpZGVzIGEgY2FwYWJpbGl0eSB0byBkZXN0cm95IHRvYXN0IGJ5IGNsaWNrLlxyXG4gKiBEZWZhdWx0IGlzIHRydWUuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRGVzdHJveSBieSBjbGljaywgdG9hc3RyL3RvYXN0ci1kZXN0cm95LWJ5LWNsaWNrLmNvbXBvbmVudClcclxuICpcclxuICogYHByZXZlbnREdXBsaWNhdGVzYCAtIGRvbid0IGNyZWF0ZSBuZXcgdG9hc3QgaWYgaXQgaGFzIHRoZSBzYW1lIHRpdGxlIGFuZCB0aGUgc2FtZSBtZXNzYWdlIHdpdGggcHJldmlvdXMgb25lLlxyXG4gKiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFByZXZlbnQgZHVwbGljYXRlcywgdG9hc3RyL3RvYXN0ci1wcmV2ZW50LWR1cGxpY2F0ZXMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBgaGFzSWNvbmAgLSBpZiB0cnVlIHRoZW4gcmVuZGVyIHRvYXN0IGljb24uXHJcbiAqIGBpY29uYCAtIHlvdSBjYW4gcGFzcyBpY29uIGNsYXNzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIGludG8gdGhlIHRvYXN0LlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEhhcyBpY29uLCB0b2FzdHIvdG9hc3RyLWljb24uY29tcG9uZW50KVxyXG4gKiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlRvYXN0clNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkJfVE9BU1RSX0NPTkZJRykgcHJvdGVjdGVkIGdsb2JhbENvbmZpZzogTmJUb2FzdHJDb25maWcsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNvbnRhaW5lclJlZ2lzdHJ5OiBOYlRvYXN0ckNvbnRhaW5lclJlZ2lzdHJ5KSB7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgc2hvdyhtZXNzYWdlLCB0aXRsZT8sIHVzZXJDb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgY29uc3QgY29uZmlnID0gbmV3IE5iVG9hc3RyQ29uZmlnKHsgLi4udGhpcy5nbG9iYWxDb25maWcsIC4uLnVzZXJDb25maWcgfSk7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZ2lzdHJ5LmdldChjb25maWcucG9zaXRpb24pO1xyXG4gICAgY29uc3QgdG9hc3QgPSB7IG1lc3NhZ2UsIHRpdGxlLCBjb25maWcgfTtcclxuICAgIGNvbnRhaW5lci5hdHRhY2godG9hc3QpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTaG93cyBzdWNjZXNzIHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgc3VjY2VzcyhtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLlNVQ0NFU1MgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIGluZm8gdG9hc3Qgd2l0aCBtZXNzYWdlLCB0aXRsZSBhbmQgdXNlciBjb25maWcuXHJcbiAgICogKi9cclxuICBpbmZvKG1lc3NhZ2UsIHRpdGxlPywgY29uZmlnPzogUGFydGlhbDxOYlRvYXN0ckNvbmZpZz4pIHtcclxuICAgIHJldHVybiB0aGlzLnNob3cobWVzc2FnZSwgdGl0bGUsIHsgLi4uY29uZmlnLCBzdGF0dXM6IE5iVG9hc3RTdGF0dXMuSU5GTyB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU2hvd3Mgd2FybmluZyB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIHdhcm5pbmcobWVzc2FnZSwgdGl0bGU/LCBjb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyhtZXNzYWdlLCB0aXRsZSwgeyAuLi5jb25maWcsIHN0YXR1czogTmJUb2FzdFN0YXR1cy5XQVJOSU5HIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTaG93cyBwcmltYXJ5IHRvYXN0IHdpdGggbWVzc2FnZSwgdGl0bGUgYW5kIHVzZXIgY29uZmlnLlxyXG4gICAqICovXHJcbiAgcHJpbWFyeShtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLlBSSU1BUlkgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIFNob3dzIGRhbmdlciB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIGRhbmdlcihtZXNzYWdlLCB0aXRsZT8sIGNvbmZpZz86IFBhcnRpYWw8TmJUb2FzdHJDb25maWc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KG1lc3NhZ2UsIHRpdGxlLCB7IC4uLmNvbmZpZywgc3RhdHVzOiBOYlRvYXN0U3RhdHVzLkRBTkdFUiB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU2hvd3MgZGVmYXVsdCB0b2FzdCB3aXRoIG1lc3NhZ2UsIHRpdGxlIGFuZCB1c2VyIGNvbmZpZy5cclxuICAgKiAqL1xyXG4gIGRlZmF1bHQobWVzc2FnZSwgdGl0bGU/LCBjb25maWc/OiBQYXJ0aWFsPE5iVG9hc3RyQ29uZmlnPikge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyhtZXNzYWdlLCB0aXRsZSwgeyAuLi5jb25maWcsIHN0YXR1czogTmJUb2FzdFN0YXR1cy5ERUZBVUxUIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=