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
JavaScript
/**
* @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