UNPKG

biplab-notifier

Version:

This is a notification npm package, it can be use as simple notification or modal dialog, a lot of customization option are available as well, checkout the github repo and examples

672 lines 46.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { BehaviorSubject, Subject } from 'rxjs'; import { take } from 'rxjs/operators'; import { Message } from './message/notifer'; import { NotifcationLayout, SingleNotifier, MultiNotifier } from './layout/notifier'; /** * @record */ export function Timer() { } if (false) { /** @type {?} */ Timer.prototype.duration; } var Notification = /** @class */ (function (_super) { tslib_1.__extends(Notification, _super); function Notification(layoutType, displayAs, status, data, css, actionButtons) { if (displayAs === void 0) { displayAs = 'notification'; } if (css === void 0) { css = { shadow: true, position: 'default', background: undefined, color: undefined, width: undefined, height: undefined }; } if (actionButtons === void 0) { actionButtons = []; } var _this = _super.call(this) || this; _this.status = status; _this.data = data; _this.css = css; _this.actionButtons = actionButtons; _this._afterOpened = new Subject(); _this._afterClosed = new Subject(); _this._event = new BehaviorSubject(false); _this.status = 'deactivate'; if (layoutType) { _this.layoutType = layoutType; } if (_this.actionButtons) { _this.defaultButtons(); } if (displayAs === 'notification') { _this.isNotification = true; } else if (displayAs === 'dialog') { _this.isDialog = true; } else if (displayAs === 'snack-bar') { _this.isSnack = true; } return _this; } Object.defineProperty(Notification.prototype, "message", { set: /** * @param {?} msg * @return {?} */ function (msg) { if (this.layoutType === 'single') { this.data = new Message(msg); } }, enumerable: true, configurable: true }); /** * @param {?=} actionButtons * @return {?} */ Notification.prototype.defaultButtons = /** * @param {?=} actionButtons * @return {?} */ function (actionButtons) { this.actionButtons = actionButtons || [ { text: 'Yes', disabled: false, type: 'button', emitValue: true, css: { color: '#3f51b5', background: 'transparent', shadow: true } }, { text: 'Cancel', disabled: false, type: 'button', emitValue: false, css: { color: '#f44336', background: 'transparent', shadow: true } } ]; }; /** * @return {?} */ Notification.prototype.applyThemeColorInTrueButtons = /** * @return {?} */ function () { var _this = this; this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { if (typeof (button.emitValue) === 'boolean' && button.emitValue) { button.css.color = _this.css.color; button.css.background = _this.css.background; } })); }; Object.defineProperty(Notification.prototype, "trueActionButtonStatus", { set: /** * @param {?} status * @return {?} */ function (status) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { if (typeof (button.emitValue) === 'boolean' && button.emitValue) { button.disabled = status === 'disable' ? true : false; } })); }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "currentStatus", { get: /** * @return {?} */ function () { return this.status === 'activate' ? 'show' : 'hide'; }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "trueActionButton", { get: /** * @return {?} */ function () { return this.actionButtons.filter((/** * @param {?} button * @return {?} */ function (button) { return typeof (button.emitValue) === 'boolean' && button.emitValue; }))[0] || undefined; }, enumerable: true, configurable: true }); /** * @param {?} label * @param {?} callBackFunctions * @param {?=} disabled * @param {?=} type * @param {?=} emitValue * @param {?=} css * @return {?} */ Notification.prototype.addNewButton = /** * @param {?} label * @param {?} callBackFunctions * @param {?=} disabled * @param {?=} type * @param {?=} emitValue * @param {?=} css * @return {?} */ function (label, callBackFunctions, disabled, type, emitValue, css) { if (disabled === void 0) { disabled = false; } if (type === void 0) { type = 'button'; } if (css === void 0) { css = { color: 'black', background: 'transparent', shadow: true }; } /** @type {?} */ var button = { text: label, disabled: disabled, type: type, emitValue: emitValue, css: css || { color: '#3f51b5', background: 'transparent', shadow: true }, callBackFunctions: callBackFunctions || undefined }; if (this.actionButtons.length > 0) { /** @type {?} */ var findIndex = this.actionButtons .find((/** * @param {?} btn * @return {?} */ function (btn) { return (btn.type === type) && (typeof (emitValue) === 'boolean') && (typeof (emitValue) === typeof (btn.emitValue)) && (emitValue === btn.emitValue); })); if (!findIndex) { this.actionButtons.splice(1, 0, button); } } else { this.actionButtons.push(button); } }; /** * @return {?} */ Notification.prototype.buttonColorReverse = /** * @return {?} */ function () { var _this = this; this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { /** @type {?} */ var background = button.css.color; /** @type {?} */ var color = _this._handleTransparentColor(button.css.background); button.css.color = color; button.css.background = background; })); }; /** * @private * @param {?} original * @return {?} */ Notification.prototype._handleTransparentColor = /** * @private * @param {?} original * @return {?} */ function (original) { return original === 'transparent' ? 'white' : original === 'white' ? 'transparent' : original; }; /** * @param {?} status * @return {?} */ Notification.prototype.buttonShadow = /** * @param {?} status * @return {?} */ function (status) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { button.css.shadow = status === 'show' ? true : false; })); }; Object.defineProperty(Notification.prototype, "messages", { set: /** * @param {?} msgs * @return {?} */ function (msgs) { if (this.layoutType === 'multi') { this.data = msgs.map((/** * @param {?} msg * @return {?} */ function (msg) { return new Message(msg); })); } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "layoutType", { get: /** * @return {?} */ function () { if (this.layout instanceof MultiNotifier) { return 'multi'; } else if (this.layout instanceof SingleNotifier) { return 'single'; } }, set: /** * @param {?} type * @return {?} */ function (type) { if (type === 'multi') { this.layout = new MultiNotifier(); } else { this.layout = new SingleNotifier(); } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "timer", { get: /** * @return {?} */ function () { return this._timer; }, set: /** * @param {?} _timer * @return {?} */ function (_timer) { clearTimeout(this.cancelTimer); this._timer = _timer; }, enumerable: true, configurable: true }); /** * @return {?} */ Notification.prototype.show = /** * @return {?} */ function () { var _this = this; this._event.next(true); if (this.timer) { this.cancelTimer = setTimeout((/** * @return {?} */ function () { return _this.hide(false); }), this.timer.duration); } }; /** * @param {?=} why * @return {?} */ Notification.prototype.hide = /** * @param {?=} why * @return {?} */ function (why) { this._event.next(why); }; Object.defineProperty(Notification.prototype, "titleText", { set: /** * @param {?} title * @return {?} */ function (title) { if (this.layoutType === 'multi') { /** @type {?} */ var layout = (/** @type {?} */ (this.layout)); layout.titleText = title; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "action", { get: /** * @return {?} */ function () { return this._event; }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "header", { set: /** * @param {?} msg * @return {?} */ function (msg) { if (this.layoutType === 'multi') { /** @type {?} */ var layout = (/** @type {?} */ (this.layout)); layout.head = msg; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "isDialog", { set: /** * @param {?} status * @return {?} */ function (status) { if (status) { this.layout.displayAs = 'dialog'; this.css.position = 'center'; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "isSnack", { set: /** * @param {?} status * @return {?} */ function (status) { if (status) { this.layout.displayAs = 'snack-bar'; this.css.position = 'bottom'; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "isNotification", { set: /** * @param {?} status * @return {?} */ function (status) { if (status) { this.layout.displayAs = 'notification'; this.css.position = 'default'; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "disableOutsideClick", { set: /** * @param {?} status * @return {?} */ function (status) { if (this.layoutType === 'multi') { /** @type {?} */ var layout = (/** @type {?} */ (this.layout)); layout.disableOutsideClick = status; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "body", { set: /** * @param {?} status * @return {?} */ function (status) { if (this.layoutType === 'multi') { /** @type {?} */ var layout = (/** @type {?} */ (this.layout)); layout.body.status = status; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "actionRow", { set: /** * @param {?} status * @return {?} */ function (status) { if (this.layoutType === 'multi') { /** @type {?} */ var layout = (/** @type {?} */ (this.layout)); layout.actionRow.status = status; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "closeButton", { set: /** * @param {?} status * @return {?} */ function (status) { this.layout.closeButton.status = status; }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "title", { set: /** * @param {?} status * @return {?} */ function (status) { this.layout.title.status = status; }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "trueButton", { set: /** * @param {?} text * @return {?} */ function (text) { if (!!this.actionButtons && this.actionButtons.length > 0) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { if (typeof (button.emitValue) === 'boolean' && button.emitValue === true) { button.text = text; return; } })); } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "falseButton", { set: /** * @param {?} text * @return {?} */ function (text) { if (!!this.actionButtons && this.actionButtons.length > 0) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ function (button) { if (typeof (button.emitValue) === 'boolean' && button.emitValue === false) { button.text = text; return; } })); } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "type", { get: /** * @return {?} */ function () { return this.notificationType; }, set: /** * @param {?} _type * @return {?} */ function (_type) { this.notificationType = _type; /** default css setup */ if (_type === 'success') { this.css.background = '#4CAF50'; this.css.color = 'white'; } else if (_type === 'error') { this.css.background = '#cc0000'; this.css.color = 'white'; } else if (_type === 'warn') { this.css.background = '#ff9800'; this.css.color = 'white'; } else if (_type === 'note') { this.css.background = '#2196F3'; this.css.color = 'white'; } else if (_type === 'help') { this.css.background = 'rgb(2, 64, 114)'; this.css.color = 'white'; } else if (_type === 'other') { this.css.background = '#3f51b5'; this.css.color = 'white'; } }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "afterOpened", { get: /** * @return {?} */ function () { return this._afterOpened.asObservable() .pipe(take(1)); }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "afterClosed", { get: /** * @return {?} */ function () { return this._afterClosed.asObservable() .pipe(take(1)); }, enumerable: true, configurable: true }); Object.defineProperty(Notification.prototype, "close", { set: /** * @param {?} status * @return {?} */ function (status) { this._afterClosed.next(status); }, enumerable: true, configurable: true }); /** * @return {?} */ Notification.prototype.opened = /** * @return {?} */ function () { this._afterOpened.next(); }; return Notification; }(NotifcationLayout)); export { Notification }; if (false) { /** * @type {?} * @protected */ Notification.prototype._afterOpened; /** * @type {?} * @protected */ Notification.prototype._afterClosed; /** * @type {?} * @private */ Notification.prototype._event; /** * @type {?} * @private */ Notification.prototype.notificationType; /** * @type {?} * @private */ Notification.prototype._timer; /** * @type {?} * @private */ Notification.prototype.cancelTimer; /** @type {?} */ Notification.prototype.status; /** @type {?} */ Notification.prototype.data; /** @type {?} */ Notification.prototype.css; /** @type {?} */ Notification.prototype.actionButtons; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYmlwbGFiLW5vdGlmaWVyLyIsInNvdXJjZXMiOlsibGliL25vdGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQTJCLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFOUcsMkJBRUM7OztJQURHLHlCQUFpQjs7QUFHckI7SUFBa0Msd0NBQWlCO0lBUS9DLHNCQUNJLFVBQStCLEVBQy9CLFNBQW1FLEVBQzVELE1BQW1DLEVBQ25DLElBQTBCLEVBQzFCLEdBTWdCLEVBQ2hCLGFBQXdDO1FBVi9DLDBCQUFBLEVBQUEsMEJBQW1FO1FBRzVELG9CQUFBLEVBQUE7WUFDSCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1NBQUU7UUFDaEIsOEJBQUEsRUFBQSxrQkFBd0M7UUFabkQsWUFhSSxpQkFBTyxTQWdCVjtRQTFCVSxZQUFNLEdBQU4sTUFBTSxDQUE2QjtRQUNuQyxVQUFJLEdBQUosSUFBSSxDQUFzQjtRQUMxQixTQUFHLEdBQUgsR0FBRyxDQU1hO1FBQ2hCLG1CQUFhLEdBQWIsYUFBYSxDQUEyQjtRQW5CaEMsa0JBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ25DLGtCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFDOUMsWUFBTSxHQUFJLElBQUksZUFBZSxDQUFVLEtB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Q2hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQzthQUM1QjtRQUNMLENBQUM7OztPQXhCQTtJQStCRCxzQkFBSSxxQ0FBVzs7OztRQUFmO1lBQ0ksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRTtpQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7OztPQUFBO0lBRUQsc0JBQUkscUNBQVc7Ozs7UUFBZjtZQUNJLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUU7aUJBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLCtCQUFLOzs7OztRQUFULFVBQVUsTUFBVztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTs7OztJQUVELDZCQUFNOzs7SUFBTjtRQUNJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVMLG1CQUFDO0FBQUQsQ0FBQyxBQTlURCxDQUFrQyxpQkFBaUIsR0E4VGxEOzs7Ozs7O0lBN1RHLG9DQUFzRDs7Ozs7SUFDdEQsb0NBQStEOzs7OztJQUMvRCw4QkFBK0Q7Ozs7O0lBQy9ELHdDQUFtRjs7Ozs7SUFDbkYsOEJBQXVCOzs7OztJQUN2QixtQ0FBeUI7O0lBS3JCLDhCQUEwQzs7SUFDMUMsNEJBQWlDOztJQUNqQywyQkFNdUI7O0lBQ3ZCLHFDQUErQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21lc3NhZ2Uvbm90aWZlcic7XG5pbXBvcnQgeyBOb3RpZmNhdGlvbkxheW91dCwgU2luZ2xlTm90aWZpZXIsIE11bHRpTm90aWZpZXIsIENzcywgTm90aWZpY2F0aW9uQnV0dG9uIH0gZnJvbSAnLi9sYXlvdXQvbm90aWZpZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVyIHtcbiAgICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZjYXRpb25MYXlvdXQgIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FmdGVyT3BlbmVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FmdGVyQ2xvc2VkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbiB8IGFueT4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ldmVudCA9ICBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblR5cGU6ICd3YXJuJyB8ICdlcnJvcicgfCAnbm90ZScgfCAnc3VjY2VzcycgfCAnaGVscCcgfCAnb3RoZXInO1xuICAgIHByaXZhdGUgX3RpbWVyPzogVGltZXI7XG4gICAgcHJpdmF0ZSBjYW5jZWxUaW1lcjogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGxheW91dFR5cGU/OiAnc2luZ2xlJyB8ICdtdWx0aScsXG4gICAgICAgIGRpc3BsYXlBczogJ2RpYWxvZycgfCAnc25hY2stYmFyJyB8ICdub3RpZmljYXRpb24nID0gJ25vdGlmaWNhdGlvbicsXG4gICAgICAgIHB1YmxpYyBzdGF0dXM/OiAgJ2FjdGl2YXRlJyB8ICdkZWFjdGl2YXRlJyxcbiAgICAgICAgcHVibGljIGRhdGE/OiBNZXNzYWdlIHwgTWVzc2FnZVtdLFxuICAgICAgICBwdWJsaWMgY3NzOiBDc3MgPSB7XG4gICAgICAgICAgICBzaGFkb3c6IHRydWUsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHdpZHRoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBoZWlnaHQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICBwdWJsaWMgYWN0aW9uQnV0dG9uczogTm90aWZpY2F0aW9uQnV0dG9uW10gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdkZWFjdGl2YXRlJztcbiAgICAgICAgaWYgKGxheW91dFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VHlwZSA9IGxheW91dFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uQnV0dG9ucykge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnV0dG9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3BsYXlBcyA9PT0gJ25vdGlmaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuaXNOb3RpZmljYXRpb24gPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlBcyA9PT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICAgIHRoaXMuaXNEaWFsb2cgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlBcyA9PT0gJ3NuYWNrLWJhcicpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTbmFjayA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgbWVzc2FnZShtc2c6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5sYXlvdXRUeXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IE1lc3NhZ2UobXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlZmF1bHRCdXR0b25zKGFjdGlvbkJ1dHRvbnM/OiBOb3RpZmljYXRpb25CdXR0b25bXSk6ICB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zID0gYWN0aW9uQnV0dG9ucyB8fCBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ1llcycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgIGVtaXRWYWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjc3M6IHsgY29sb3I6ICcjM2Y1MWI1JywgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50Jywgc2hhZG93OiB0cnVlIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgIGVtaXRWYWx1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY3NzOiB7IGNvbG9yOiAnI2Y0NDMzNicsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsIHNoYWRvdzogdHJ1ZSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgYXBwbHlUaGVtZUNvbG9ySW5UcnVlQnV0dG9ucygpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmIGJ1dHRvbi5lbWl0VmFsdWUgKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNzcy5jb2xvciA9IHRoaXMuY3NzLmNvbG9yO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5jc3MuYmFja2dyb3VuZCA9IHRoaXMuY3NzLmJhY2tncm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCB0cnVlQWN0aW9uQnV0dG9uU3RhdHVzKHN0YXR1czogJ2VuYWJsZScgfCAnZGlzYWJsZScpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmICBidXR0b24uZW1pdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gc3RhdHVzID09PSAnZGlzYWJsZScgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50U3RhdHVzKCk6ICdoaWRlJyB8ICdzaG93JyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ2FjdGl2YXRlJyA/ICdzaG93JyA6ICdoaWRlJztcbiAgICB9XG5cbiAgICBnZXQgdHJ1ZUFjdGlvbkJ1dHRvbigpOiBOb3RpZmljYXRpb25CdXR0b24ge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25CdXR0b25zLmZpbHRlcigoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+XG4gICAgICAgIHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmICBidXR0b24uZW1pdFZhbHVlKVswXSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYWRkTmV3QnV0dG9uKFxuICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICBjYWxsQmFja0Z1bmN0aW9uczogeyBmdW5jOiBGdW5jdGlvbiwgcGFyYW06IGFueSB9W10sXG4gICAgICAgIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHR5cGU6ICdzdWJtaXQnfCAnYnV0dG9uJyA9ICdidXR0b24nLFxuICAgICAgICBlbWl0VmFsdWU6IGFueSxcbiAgICAgICAgY3NzOiBDc3MgPSB7IGNvbG9yOiAnYmxhY2snLCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLCBzaGFkb3c6IHRydWUgfSxcbiAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uID0ge1xuICAgICAgICAgICAgdGV4dCA6IGxhYmVsLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGVtaXRWYWx1ZTogZW1pdFZhbHVlLFxuICAgICAgICAgICAgY3NzOiBjc3MgfHwgeyBjb2xvcjogJyMzZjUxYjUnLCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLCBzaGFkb3c6IHRydWUgfSxcbiAgICAgICAgICAgIGNhbGxCYWNrRnVuY3Rpb25zOiBjYWxsQmFja0Z1bmN0aW9ucyB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmFjdGlvbkJ1dHRvbnNcbiAgICAgICAgICAgIC5maW5kKChidG46IE5vdGlmaWNhdGlvbkJ1dHRvbikgPT5cbiAgICAgICAgICAgICAgICAoYnRuLnR5cGUgPT09IHR5cGUpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZihlbWl0VmFsdWUpID09PSAnYm9vbGVhbicpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZihlbWl0VmFsdWUpID09PSB0eXBlb2YoYnRuLmVtaXRWYWx1ZSkpICYmXG4gICAgICAgICAgICAgICAgKGVtaXRWYWx1ZSA9PT0gIGJ0bi5lbWl0VmFsdWUpKTtcbiAgICAgICAgICAgIGlmICghZmluZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLnNwbGljZSgxLCAwLCBidXR0b24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLnB1c2goYnV0dG9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1dHRvbkNvbG9yUmV2ZXJzZSgpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gYnV0dG9uLmNzcy5jb2xvcjtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5faGFuZGxlVHJhbnNwYXJlbnRDb2xvcihidXR0b24uY3NzLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgYnV0dG9uLmNzcy5jb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgYnV0dG9uLmNzcy5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlVHJhbnNwYXJlbnRDb2xvcihvcmlnaW5hbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsID09PSAndHJhbnNwYXJlbnQnID8gJ3doaXRlJyA6IG9yaWdpbmFsID09PSAnd2hpdGUnID8gJ3RyYW5zcGFyZW50JyA6IG9yaWdpbmFsO1xuICAgIH1cblxuICAgIGJ1dHRvblNoYWRvdyhzdGF0dXM6ICdzaG93J3wnaGlkZScpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b24uY3NzLnNoYWRvdyA9IHN0YXR1cyA9PT0gJ3Nob3cnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgbWVzc2FnZXMobXNnczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG1zZ3MubWFwKChtc2c6IHN0cmluZykgPT4gbmV3IE1lc3NhZ2UobXNnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgbGF5b3V0VHlwZSh0eXBlOiAnc2luZ2xlJyB8ICdtdWx0aScpIHtcbiAgICAgICAgaWYgKCB0eXBlID09PSAnbXVsdGknICkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQgPSBuZXcgTXVsdGlOb3RpZmllcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQgPSBuZXcgU2luZ2xlTm90aWZpZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBsYXlvdXRUeXBlKCk6ICdzaW5nbGUnIHwgJ211bHRpJyB7XG4gICAgICAgIGlmICggdGhpcy5sYXlvdXQgaW5zdGFuY2VvZiBNdWx0aU5vdGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ211bHRpJztcbiAgICAgICAgfSBlbHNlIGlmICggdGhpcy5sYXlvdXQgaW5zdGFuY2VvZiBTaW5nbGVOb3RpZmllciApIHtcbiAgICAgICAgICAgIHJldHVybiAnc2luZ2xlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCB0aW1lcigpOiBUaW1lciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGltZXI7XG4gICAgfVxuXG4gICAgc2hvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnQubmV4dCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZShmYWxzZSksIHRoaXMudGltZXIuZHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZSh3aHk/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50Lm5leHQod2h5KTtcbiAgICB9XG5cbiAgICBzZXQgdGl0bGVUZXh0KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0IGFzIE11bHRpTm90aWZpZXI7XG4gICAgICAgICAgICBsYXlvdXQudGl0bGVUZXh0ID0gdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYWN0aW9uKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQ7XG4gICAgfVxuXG4gICAgc2V0IGhlYWRlcihtc2c6IHN0cmluZykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC5oZWFkID0gbXNnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGlzRGlhbG9nKHN0YXR1czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5kaXNwbGF5QXMgPSAnZGlhbG9nJztcbiAgICAgICAgICAgIHRoaXMuY3NzLnBvc2l0aW9uID0gJ2NlbnRlcic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgaXNTbmFjayhzdGF0dXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuZGlzcGxheUFzID0gJ3NuYWNrLWJhcic7XG4gICAgICAgICAgICB0aGlzLmNzcy5wb3NpdGlvbiA9ICdib3R0b20nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGlzTm90aWZpY2F0aW9uKHN0YXR1czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5kaXNwbGF5QXMgPSAnbm90aWZpY2F0aW9uJztcbiAgICAgICAgICAgIHRoaXMuY3NzLnBvc2l0aW9uID0gJ2RlZmF1bHQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVPdXRzaWRlQ2xpY2soc3RhdHVzOiBib29sZWFuKSB7XG4gICAgICAgIGlmICggdGhpcy5sYXlvdXRUeXBlID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dCBhcyBNdWx0aU5vdGlmaWVyO1xuICAgICAgICAgICAgbGF5b3V0LmRpc2FibGVPdXRzaWRlQ2xpY2sgPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgYm9keShzdGF0dXM6ICAnc2hvdycgfCAnaGlkZScpIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0IGFzIE11bHRpTm90aWZpZXI7XG4gICAgICAgICAgICBsYXlvdXQuYm9keS5zdGF0dXMgPSBzdGF0dXMgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGFjdGlvblJvdyhzdGF0dXM6ICAnc2hvdycgfCAnaGlkZScpIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0IGFzIE11bHRpTm90aWZpZXI7XG4gICAgICAgICAgICBsYXlvdXQuYWN0aW9uUm93LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBjbG9zZUJ1dHRvbihzdGF0dXM6ICAnc2hvdycgfCAnaGlkZScpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQuY2xvc2VCdXR0b24uc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cblxuICAgIHNldCB0aXRsZShzdGF0dXM6ICAnc2hvdycgfCAnaGlkZScpIHtcbiAgICAgICAgdGhpcy5sYXlvdXQudGl0bGUuc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cblxuICAgIHNldCB0cnVlQnV0dG9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoISF0aGlzLmFjdGlvbkJ1dHRvbnMgJiYgdGhpcy5hY3Rpb25CdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9ucy5mb3JFYWNoKChidXR0b246IE5vdGlmaWNhdGlvbkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYnV0dG9uLmVtaXRWYWx1ZSkgPT09ICdib29sZWFuJyAmJiBidXR0b24uZW1pdFZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi50ZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGZhbHNlQnV0dG9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoISF0aGlzLmFjdGlvbkJ1dHRvbnMgJiYgdGhpcy5hY3Rpb25CdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9ucy5mb3JFYWNoKChidXR0b246IE5vdGlmaWNhdGlvbkJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYnV0dG9uLmVtaXRWYWx1ZSkgPT09ICdib29sZWFuJyAmJiBidXR0b24uZW1pdFZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24udGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCB0eXBlKCk6ICd3YXJuJyB8ICdlcnJvcicgfCAnbm90ZScgfCAnc3VjY2VzcycgfCAnaGVscCcgfCAnb3RoZXInIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uVHlwZTtcbiAgICB9XG5cbiAgICBzZXQgdHlwZShfdHlwZTogJ3dhcm4nIHwgJ2Vycm9yJyB8ICdub3RlJyB8ICdzdWNjZXNzJyB8ICdoZWxwJyB8ICdvdGhlcicpIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25UeXBlID0gX3R5cGU7XG4gICAgICAgIC8qKiBkZWZhdWx0IGNzcyBzZXR1cCAqL1xuICAgICAgICBpZiAoIF90eXBlID09PSAnc3VjY2VzcycgKSB7XG4gICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gJyM0Q0FGNTAnO1xuICAgICAgICAgICAgdGhpcy5jc3MuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICB9IGVsc2UgaWYgKCBfdHlwZSA9PT0gJ2Vycm9yJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnI2NjMDAwMCc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoIF90eXBlID09PSAnd2FybicgKSB7XG4gICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gJyNmZjk4MDAnO1xuICAgICAgICAgICAgdGhpcy5jc3MuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICB9ICBlbHNlIGlmICggX3R5cGUgPT09ICdub3RlJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnIzIxOTZGMyc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gIGVsc2UgaWYgKCBfdHlwZSA9PT0gJ2hlbHAnICkge1xuICAgICAgICAgICAgdGhpcy5jc3MuYmFja2dyb3VuZCA9ICdyZ2IoMiwgNjQsIDExNCknO1xuICAgICAgICAgICAgdGhpcy5jc3MuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICB9ICBlbHNlIGlmICggX3R5cGUgPT09ICdvdGhlcicgKSB7XG4gICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gJyMzZjUxYjUnO1xuICAgICAgICAgICAgdGhpcy5jc3MuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IHRpbWVyKF90aW1lcjogVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FuY2VsVGltZXIpO1xuICAgICAgICB0aGlzLl90aW1lciA9IF90aW1lcjtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJPcGVuZWQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZnRlck9wZW5lZC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZSh0YWtlKDEpKTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgYW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZnRlckNsb3NlZC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZSh0YWtlKDEpKTtcbiAgICB9XG5cbiAgICBzZXQgY2xvc2Uoc3RhdHVzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQubmV4dChzdGF0dXMpO1xuICAgIH1cblxuICAgIG9wZW5lZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWQubmV4dCgpO1xuICAgIH1cblxufVxuIl19