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
528 lines • 39.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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;
}
export class Notification extends NotifcationLayout {
/**
* @param {?=} layoutType
* @param {?=} displayAs
* @param {?=} status
* @param {?=} data
* @param {?=} css
* @param {?=} actionButtons
*/
constructor(layoutType, displayAs = 'notification', status, data, css = {
shadow: true,
position: 'default',
background: undefined,
color: undefined,
width: undefined,
height: undefined
}, actionButtons = []) {
super();
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;
}
}
/**
* @param {?} msg
* @return {?}
*/
set message(msg) {
if (this.layoutType === 'single') {
this.data = new Message(msg);
}
}
/**
* @param {?=} actionButtons
* @return {?}
*/
defaultButtons(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 {?}
*/
applyThemeColorInTrueButtons() {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
if (typeof (button.emitValue) === 'boolean' && button.emitValue) {
button.css.color = this.css.color;
button.css.background = this.css.background;
}
}));
}
/**
* @param {?} status
* @return {?}
*/
set trueActionButtonStatus(status) {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
if (typeof (button.emitValue) === 'boolean' && button.emitValue) {
button.disabled = status === 'disable' ? true : false;
}
}));
}
/**
* @return {?}
*/
get currentStatus() {
return this.status === 'activate' ? 'show' : 'hide';
}
/**
* @return {?}
*/
get trueActionButton() {
return this.actionButtons.filter((/**
* @param {?} button
* @return {?}
*/
(button) => typeof (button.emitValue) === 'boolean' && button.emitValue))[0] || undefined;
}
/**
* @param {?} label
* @param {?} callBackFunctions
* @param {?=} disabled
* @param {?=} type
* @param {?=} emitValue
* @param {?=} css
* @return {?}
*/
addNewButton(label, callBackFunctions, disabled = false, type = 'button', emitValue, css = { color: 'black', background: 'transparent', shadow: true }) {
/** @type {?} */
const 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 {?} */
const findIndex = this.actionButtons
.find((/**
* @param {?} btn
* @return {?}
*/
(btn) => (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 {?}
*/
buttonColorReverse() {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
/** @type {?} */
const background = button.css.color;
/** @type {?} */
const color = this._handleTransparentColor(button.css.background);
button.css.color = color;
button.css.background = background;
}));
}
/**
* @private
* @param {?} original
* @return {?}
*/
_handleTransparentColor(original) {
return original === 'transparent' ? 'white' : original === 'white' ? 'transparent' : original;
}
/**
* @param {?} status
* @return {?}
*/
buttonShadow(status) {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
button.css.shadow = status === 'show' ? true : false;
}));
}
/**
* @param {?} msgs
* @return {?}
*/
set messages(msgs) {
if (this.layoutType === 'multi') {
this.data = msgs.map((/**
* @param {?} msg
* @return {?}
*/
(msg) => new Message(msg)));
}
}
/**
* @param {?} type
* @return {?}
*/
set layoutType(type) {
if (type === 'multi') {
this.layout = new MultiNotifier();
}
else {
this.layout = new SingleNotifier();
}
}
/**
* @return {?}
*/
get layoutType() {
if (this.layout instanceof MultiNotifier) {
return 'multi';
}
else if (this.layout instanceof SingleNotifier) {
return 'single';
}
}
/**
* @return {?}
*/
get timer() {
return this._timer;
}
/**
* @return {?}
*/
show() {
this._event.next(true);
if (this.timer) {
this.cancelTimer = setTimeout((/**
* @return {?}
*/
() => this.hide(false)), this.timer.duration);
}
}
/**
* @param {?=} why
* @return {?}
*/
hide(why) {
this._event.next(why);
}
/**
* @param {?} title
* @return {?}
*/
set titleText(title) {
if (this.layoutType === 'multi') {
/** @type {?} */
const layout = (/** @type {?} */ (this.layout));
layout.titleText = title;
}
}
/**
* @return {?}
*/
get action() {
return this._event;
}
/**
* @param {?} msg
* @return {?}
*/
set header(msg) {
if (this.layoutType === 'multi') {
/** @type {?} */
const layout = (/** @type {?} */ (this.layout));
layout.head = msg;
}
}
/**
* @param {?} status
* @return {?}
*/
set isDialog(status) {
if (status) {
this.layout.displayAs = 'dialog';
this.css.position = 'center';
}
}
/**
* @param {?} status
* @return {?}
*/
set isSnack(status) {
if (status) {
this.layout.displayAs = 'snack-bar';
this.css.position = 'bottom';
}
}
/**
* @param {?} status
* @return {?}
*/
set isNotification(status) {
if (status) {
this.layout.displayAs = 'notification';
this.css.position = 'default';
}
}
/**
* @param {?} status
* @return {?}
*/
set disableOutsideClick(status) {
if (this.layoutType === 'multi') {
/** @type {?} */
const layout = (/** @type {?} */ (this.layout));
layout.disableOutsideClick = status;
}
}
/**
* @param {?} status
* @return {?}
*/
set body(status) {
if (this.layoutType === 'multi') {
/** @type {?} */
const layout = (/** @type {?} */ (this.layout));
layout.body.status = status;
}
}
/**
* @param {?} status
* @return {?}
*/
set actionRow(status) {
if (this.layoutType === 'multi') {
/** @type {?} */
const layout = (/** @type {?} */ (this.layout));
layout.actionRow.status = status;
}
}
/**
* @param {?} status
* @return {?}
*/
set closeButton(status) {
this.layout.closeButton.status = status;
}
/**
* @param {?} status
* @return {?}
*/
set title(status) {
this.layout.title.status = status;
}
/**
* @param {?} text
* @return {?}
*/
set trueButton(text) {
if (!!this.actionButtons && this.actionButtons.length > 0) {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
if (typeof (button.emitValue) === 'boolean' && button.emitValue === true) {
button.text = text;
return;
}
}));
}
}
/**
* @param {?} text
* @return {?}
*/
set falseButton(text) {
if (!!this.actionButtons && this.actionButtons.length > 0) {
this.actionButtons.forEach((/**
* @param {?} button
* @return {?}
*/
(button) => {
if (typeof (button.emitValue) === 'boolean' && button.emitValue === false) {
button.text = text;
return;
}
}));
}
}
/**
* @return {?}
*/
get type() {
return this.notificationType;
}
/**
* @param {?} _type
* @return {?}
*/
set type(_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';
}
}
/**
* @param {?} _timer
* @return {?}
*/
set timer(_timer) {
clearTimeout(this.cancelTimer);
this._timer = _timer;
}
/**
* @return {?}
*/
get afterOpened() {
return this._afterOpened.asObservable()
.pipe(take(1));
}
/**
* @return {?}
*/
get afterClosed() {
return this._afterClosed.asObservable()
.pipe(take(1));
}
/**
* @param {?} status
* @return {?}
*/
set close(status) {
this._afterClosed.next(status);
}
/**
* @return {?}
*/
opened() {
this._afterOpened.next();
}
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYmlwbGFiLW5vdGlmaWVyLyIsInNvdXJjZXMiOlsibGliL25vdGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBMkIsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQUU5RywyQkFFQzs7O0lBREcseUJBQWlCOztBQUdyQixNQUFNLE9BQU8sWUFBYSxTQUFRLGlCQUFpQjs7Ozs7Ozs7O0lBUS9DLFlBQ0ksVUFBK0IsRUFDL0IsWUFBcUQsY0FBYyxFQUM1RCxNQUFtQyxFQUNuQyxJQUEwQixFQUMxQixNQUFXO1FBQ2QsTUFBTSxFQUFFLElBQUk7UUFDWixRQUFRLEVBQUUsU0FBUztRQUNuQixVQUFVLEVBQUUsU0FBUztRQUNyQixLQUFLLEVBQUUsU0FBUztRQUNoQixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsU0FBUztLQUFFLEVBQ2hCLGdCQUFzQyxFQUFFO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBVkQsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7UUFDbkMsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFDMUIsUUFBRyxHQUFILEdBQUcsQ0FNYTtRQUNoQixrQkFBYSxHQUFiLGFBQWEsQ0FBMkI7UUFuQmhDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuQyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFpQixDQUFDO1FBQzlDLFdBQU0sR0FBSSxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQW1CM0QsSUFBSSxDQUFDLE1BQU0sR0FB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K0Q7Ozs7O0lBQy9ELDhCQUErRDs7Ozs7SUFDL0Qsd0NBQW1GOzs7OztJQUNuRiw4QkFBdUI7Ozs7O0lBQ3ZCLG1DQUF5Qjs7SUFLckIsOEJBQTBDOztJQUMxQyw0QkFBaUM7O0lBQ2pDLDJCQU11Qjs7SUFDdkIscUNBQStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZS9ub3RpZmVyJztcbmltcG9ydCB7IE5vdGlmY2F0aW9uTGF5b3V0LCBTaW5nbGVOb3RpZmllciwgTXVsdGlOb3RpZmllciwgQ3NzLCBOb3RpZmljYXRpb25CdXR0b24gfSBmcm9tICcuL2xheW91dC9ub3RpZmllcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXIge1xuICAgIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmNhdGlvbkxheW91dCAge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWZ0ZXJPcGVuZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWZ0ZXJDbG9zZWQgPSBuZXcgU3ViamVjdDxib29sZWFuIHwgYW55PigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50ID0gIG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uVHlwZTogJ3dhcm4nIHwgJ2Vycm9yJyB8ICdub3RlJyB8ICdzdWNjZXNzJyB8ICdoZWxwJyB8ICdvdGhlcic7XG4gICAgcHJpdmF0ZSBfdGltZXI/OiBUaW1lcjtcbiAgICBwcml2YXRlIGNhbmNlbFRpbWVyOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbGF5b3V0VHlwZT86ICdzaW5nbGUnIHwgJ211bHRpJyxcbiAgICAgICAgZGlzcGxheUFzOiAnZGlhbG9nJyB8ICdzbmFjay1iYXInIHwgJ25vdGlmaWNhdGlvbicgPSAnbm90aWZpY2F0aW9uJyxcbiAgICAgICAgcHVibGljIHN0YXR1cz86ICAnYWN0aXZhdGUnIHwgJ2RlYWN0aXZhdGUnLFxuICAgICAgICBwdWJsaWMgZGF0YT86IE1lc3NhZ2UgfCBNZXNzYWdlW10sXG4gICAgICAgIHB1YmxpYyBjc3M6IENzcyA9IHtcbiAgICAgICAgICAgIHNoYWRvdzogdHJ1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGhlaWdodDogdW5kZWZpbmVkIH0sXG4gICAgICAgIHB1YmxpYyBhY3Rpb25CdXR0b25zOiBOb3RpZmljYXRpb25CdXR0b25bXSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2RlYWN0aXZhdGUnO1xuICAgICAgICBpZiAobGF5b3V0VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRUeXBlID0gbGF5b3V0VHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b25zKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRCdXR0b25zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheUFzID09PSAnbm90aWZpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5pc05vdGlmaWNhdGlvbiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheUFzID09PSAnZGlhbG9nJykge1xuICAgICAgICAgICAgdGhpcy5pc0RpYWxvZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheUFzID09PSAnc25hY2stYmFyJykge1xuICAgICAgICAgICAgdGhpcy5pc1NuYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBtZXNzYWdlKG1zZzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmxheW91dFR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWVzc2FnZShtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdEJ1dHRvbnMoYWN0aW9uQnV0dG9ucz86IE5vdGlmaWNhdGlvbkJ1dHRvbltdKTogIHZvaWQge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMgPSBhY3Rpb25CdXR0b25zIHx8IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAnWWVzJyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgZW1pdFZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNzczogeyBjb2xvcjogJyMzZjUxYjUnLCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLCBzaGFkb3c6IHRydWUgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgZW1pdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjc3M6IHsgY29sb3I6ICcjZjQ0MzM2JywgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50Jywgc2hhZG93OiB0cnVlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhcHBseVRoZW1lQ29sb3JJblRydWVCdXR0b25zKCkge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgYnV0dG9uLmVtaXRWYWx1ZSApIHtcbiAgICAgICAgICAgICAgICBidXR0b24uY3NzLmNvbG9yID0gdGhpcy5jc3MuY29sb3I7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNzcy5iYWNrZ3JvdW5kID0gdGhpcy5jc3MuYmFja2dyb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IHRydWVBY3Rpb25CdXR0b25TdGF0dXMoc3RhdHVzOiAnZW5hYmxlJyB8ICdkaXNhYmxlJykge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgIGJ1dHRvbi5lbWl0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBzdGF0dXMgPT09ICdkaXNhYmxlJyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRTdGF0dXMoKTogJ2hpZGUnIHwgJ3Nob3cnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnYWN0aXZhdGUnID8gJ3Nob3cnIDogJ2hpZGUnO1xuICAgIH1cblxuICAgIGdldCB0cnVlQWN0aW9uQnV0dG9uKCk6IE5vdGlmaWNhdGlvbkJ1dHRvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbkJ1dHRvbnMuZmlsdGVyKChidXR0b246IE5vdGlmaWNhdGlvbkJ1dHRvbikgPT5cbiAgICAgICAgdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgIGJ1dHRvbi5lbWl0VmFsdWUpWzBdIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBhZGROZXdCdXR0b24oXG4gICAgICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgICAgIGNhbGxCYWNrRnVuY3Rpb25zOiB7IGZ1bmM6IEZ1bmN0aW9uLCBwYXJhbTogYW55IH1bXSxcbiAgICAgICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3N1Ym1pdCd8ICdidXR0b24nID0gJ2J1dHRvbicsXG4gICAgICAgIGVtaXRWYWx1ZTogYW55LFxuICAgICAgICBjc3M6IENzcyA9IHsgY29sb3I6ICdibGFjaycsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsIHNoYWRvdzogdHJ1ZSB9LFxuICAgICAgICApIHtcbiAgICAgICAgY29uc3QgYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24gPSB7XG4gICAgICAgICAgICB0ZXh0IDogbGFiZWwsXG4gICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgZW1pdFZhbHVlOiBlbWl0VmFsdWUsXG4gICAgICAgICAgICBjc3M6IGNzcyB8fCB7IGNvbG9yOiAnIzNmNTFiNScsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsIHNoYWRvdzogdHJ1ZSB9LFxuICAgICAgICAgICAgY2FsbEJhY2tGdW5jdGlvbnM6IGNhbGxCYWNrRnVuY3Rpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuYWN0aW9uQnV0dG9uc1xuICAgICAgICAgICAgLmZpbmQoKGJ0bjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PlxuICAgICAgICAgICAgICAgIChidG4udHlwZSA9PT0gdHlwZSkgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mKGVtaXRWYWx1ZSkgPT09ICdib29sZWFuJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mKGVtaXRWYWx1ZSkgPT09IHR5cGVvZihidG4uZW1pdFZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgICAoZW1pdFZhbHVlID09PSAgYnRuLmVtaXRWYWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFmaW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuc3BsaWNlKDEsIDAsIGJ1dHRvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMucHVzaChidXR0b24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnV0dG9uQ29sb3JSZXZlcnNlKCkge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBidXR0b24uY3NzLmNvbG9yO1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLl9oYW5kbGVUcmFuc3BhcmVudENvbG9yKGJ1dHRvbi5jc3MuYmFja2dyb3VuZCk7XG4gICAgICAgICAgICBidXR0b24uY3NzLmNvbG9yID0gY29sb3I7XG4gICAgICAgICAgICBidXR0b24uY3NzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVUcmFuc3BhcmVudENvbG9yKG9yaWdpbmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWwgPT09ICd0cmFuc3BhcmVudCcgPyAnd2hpdGUnIDogb3JpZ2luYWwgPT09ICd3aGl0ZScgPyAndHJhbnNwYXJlbnQnIDogb3JpZ2luYWw7XG4gICAgfVxuXG4gICAgYnV0dG9uU2hhZG93KHN0YXR1czogJ3Nob3cnfCdoaWRlJykge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbi5jc3Muc2hhZG93ID0gc3RhdHVzID09PSAnc2hvdycgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBtZXNzYWdlcyhtc2dzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbXNncy5tYXAoKG1zZzogc3RyaW5nKSA9PiBuZXcgTWVzc2FnZShtc2cpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBsYXlvdXRUeXBlKHR5cGU6ICdzaW5nbGUnIHwgJ211bHRpJykge1xuICAgICAgICBpZiAoIHR5cGUgPT09ICdtdWx0aScgKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBNdWx0aU5vdGlmaWVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBTaW5nbGVOb3RpZmllcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGxheW91dFR5cGUoKTogJ3NpbmdsZScgfCAnbXVsdGknIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIE11bHRpTm90aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnbXVsdGknO1xuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIFNpbmdsZU5vdGlmaWVyICkge1xuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHRpbWVyKCk6IFRpbWVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lcjtcbiAgICB9XG5cbiAgICBzaG93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ldmVudC5uZXh0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlKGZhbHNlKSwgdGhpcy50aW1lci5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlKHdoeT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnQubmV4dCh3aHkpO1xuICAgIH1cblxuICAgIHNldCB0aXRsZVRleHQodGl0bGU6IHN0cmluZykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC50aXRsZVRleHQgPSB0aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBhY3Rpb24oKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG5cbiAgICBzZXQgaGVhZGVyKG1zZzogc3RyaW5nKSB7XG4gICAgICAgIGlmICggdGhpcy5sYXlvdXRUeXBlID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dCBhcyBNdWx0aU5vdGlmaWVyO1xuICAgICAgICAgICAgbGF5b3V0LmhlYWQgPSBtc2c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgaXNEaWFsb2coc3RhdHVzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0LmRpc3BsYXlBcyA9ICdkaWFsb2cnO1xuICAgICAgICAgICAgdGhpcy5jc3MucG9zaXRpb24gPSAnY2VudGVyJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBpc1NuYWNrKHN0YXR1czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5kaXNwbGF5QXMgPSAnc25hY2stYmFyJztcbiAgICAgICAgICAgIHRoaXMuY3NzLnBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgaXNOb3RpZmljYXRpb24oc3RhdHVzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0LmRpc3BsYXlBcyA9ICdub3RpZmljYXRpb24nO1xuICAgICAgICAgICAgdGhpcy5jc3MucG9zaXRpb24gPSAnZGVmYXVsdCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZU91dHNpZGVDbGljayhzdGF0dXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0IGFzIE11bHRpTm90aWZpZXI7XG4gICAgICAgICAgICBsYXlvdXQuZGlzYWJsZU91dHNpZGVDbGljayA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBib2R5KHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC5ib2R5LnN0YXR1cyA9IHN0YXR1cyA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgYWN0aW9uUm93KHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC5hY3Rpb25Sb3cuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGNsb3NlQnV0dG9uKHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICB0aGlzLmxheW91dC5jbG9zZUJ1dHRvbi5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuXG4gICAgc2V0IHRpdGxlKHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICB0aGlzLmxheW91dC50aXRsZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuXG4gICAgc2V0IHRydWVCdXR0b24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghIXRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmIGJ1dHRvbi5lbWl0VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgZmFsc2VCdXR0b24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghIXRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmIGJ1dHRvbi5lbWl0VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi50ZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHR5cGUoKTogJ3dhcm4nIHwgJ2Vycm9yJyB8ICdub3RlJyB8ICdzdWNjZXNzJyB8ICdoZWxwJyB8ICdvdGhlcicge1xuICAgICAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25UeXBlO1xuICAgIH1cblxuICAgIHNldCB0eXBlKF90eXBlOiAnd2FybicgfCAnZXJyb3InIHwgJ25vdGUnIHwgJ3N1Y2Nlc3MnIHwgJ2hlbHAnIHwgJ290aGVyJykge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblR5cGUgPSBfdHlwZTtcbiAgICAgICAgLyoqIGRlZmF1bHQgY3NzIHNldHVwICovXG4gICAgICAgIGlmICggX3R5cGUgPT09ICdzdWNjZXNzJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnIzRDQUY1MCc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoIF90eXBlID09PSAnZXJyb3InICkge1xuICAgICAgICAgICAgdGhpcy5jc3MuYmFja2dyb3VuZCA9ICcjY2MwMDAwJztcbiAgICAgICAgICAgIHRoaXMuY3NzLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgfSBlbHNlIGlmICggX3R5cGUgPT09ICd3YXJuJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnI2ZmOTgwMCc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gIGVsc2UgaWYgKCBfdHlwZSA9PT0gJ25vdGUnICkge1xuICAgICAgICAgICAgdGhpcy5jc3MuYmFja2dyb3VuZCA9ICcjMjE5NkYzJztcbiAgICAgICAgICAgIHRoaXMuY3NzLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgfSAgZWxzZSBpZiAoIF90eXBlID09PSAnaGVscCcgKSB7XG4gICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gJ3JnYigyLCA2NCwgMTE0KSc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gIGVsc2UgaWYgKCBfdHlwZSA9PT0gJ290aGVyJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnIzNmNTFiNSc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgdGltZXIoX3RpbWVyOiBUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYW5jZWxUaW1lcik7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gX3RpbWVyO1xuICAgIH1cblxuICAgIGdldCBhZnRlck9wZW5lZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyT3BlbmVkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xuICAgIH1cblxuICAgIGdldCBhZnRlckNsb3NlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xuICAgIH1cblxuICAgIHNldCBjbG9zZShzdGF0dXM6IGFueSkge1xuICAgICAgICB0aGlzLl9hZnRlckNsb3NlZC5uZXh0KHN0YXR1cyk7XG4gICAgfVxuXG4gICAgb3BlbmVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCk7XG4gICAgfVxuXG59XG4iXX0=