com.phloxui
Version:
PhloxUI Ng2+ Framework
365 lines (364 loc) • 37.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
import { UISystemClock } from './UISystemClock.service';
/**
* <p style="text-indent: 2em;">
* A <code>ng</code> service class which is an implementation of [[INotificationManager]] service interface. For more information,
* please see [[INotificationManager]].
* </p>
*
* @author shiorin, tee4cute
* @see [[INotificationManager]]
*/
export class NotificationManager {
/**
* @param {?} uiSystemClock
*/
constructor(uiSystemClock) {
this.notifications = [];
this.pinNotifications = [];
this.readNotifications = [];
this.uiSystemClock = uiSystemClock;
}
/**
* @param {?} notification
* @return {?}
*/
isPinedNotification(notification) {
if (notification === null || typeof notification === 'undefined') {
return false;
}
return this.pinNotifications.indexOf(notification) >= 0;
}
/**
* @param {?} notification
* @return {?}
*/
isReadNotification(notification) {
if (notification === null || typeof notification === 'undefined') {
return false;
}
return this.readNotifications.indexOf(notification) >= 0;
}
/**
* @param {?} notification
* @return {?}
*/
notify(notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
this.notifications.push(notification);
}
/**
* @param {?} notification
* @return {?}
*/
clear(notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
let /** @type {?} */ index = this.notifications.indexOf(notification);
if (index >= 0) {
this.notifications.splice(index, 1);
}
let /** @type {?} */ pinIndex = this.pinNotifications.indexOf(notification);
if (pinIndex >= 0) {
this.pinNotifications.splice(pinIndex, 1);
}
let /** @type {?} */ readIndex = this.readNotifications.indexOf(notification);
if (readIndex >= 0) {
this.readNotifications.splice(readIndex, 1);
}
}
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
clearBy(notificationType, name) {
if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) {
this.clearAll();
return;
}
let /** @type {?} */ cancelNotifyArray = [];
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ nameCheck = notify.name;
let /** @type {?} */ typeName = notify.type;
let /** @type {?} */ notifyPass = true;
let /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
cancelNotifyArray.push(notify);
}
}
// remove from Array
for (let /** @type {?} */ notify of cancelNotifyArray) {
this.clear(notify);
}
}
/**
* @return {?}
*/
clearAll() {
let /** @type {?} */ cloneList = this.notifications.slice(0);
for (let /** @type {?} */ notify of cloneList) {
this.clear(notify);
}
}
/**
* @return {?}
*/
getNotifications() {
return this.notifications;
}
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
getNotificationsBy(notificationType, name) {
let /** @type {?} */ result = [];
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ nameCheck = notify.name;
let /** @type {?} */ typeName = notify.type;
let /** @type {?} */ notifyPass = true;
let /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
result.push(notify);
}
}
return result;
}
/**
* @return {?}
*/
getShowingNotifications() {
return this.getShowingNotificationsBy(null, null);
}
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
getShowingNotificationsBy(notificationType, name) {
let /** @type {?} */ result = [];
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ nameCheck = notify.name;
let /** @type {?} */ typeName = notify.type;
let /** @type {?} */ isShow = notify.show;
let /** @type {?} */ notifyPass = true;
let /** @type {?} */ namePass = true;
let /** @type {?} */ timePass = false;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
let /** @type {?} */ createdTime = notify.createdTime;
let /** @type {?} */ timeOut = notify.timeout;
if (createdTime === null || typeof createdTime === 'undefined') {
continue;
}
if (timeOut === null || typeof timeOut !== 'number') {
timeOut = null;
}
let /** @type {?} */ finalTime = new Date(createdTime);
if (timeOut !== null) {
finalTime.addMilliseconds(timeOut);
}
let /** @type {?} */ curDate = this.uiSystemClock.getCurrentClockDateTime();
if (curDate !== null && finalTime.isAfter(curDate)) {
timePass = true;
}
if (notifyPass && namePass && isShow) {
if (timePass) {
result.push(notify);
}
else {
if (this.isPinedNotification(notify)) {
result.push(notify);
}
}
}
}
return result;
}
/**
* @return {?}
*/
getUnreadNotifications() {
return this.getUnreadNotificationsBy(null, null);
}
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
getUnreadNotificationsBy(notificationType, name) {
let /** @type {?} */ result = [];
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ nameCheck = notify.name;
let /** @type {?} */ typeName = notify.type;
let /** @type {?} */ notifyPass = true;
let /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
if (!this.isReadNotification(notify)) {
result.push(notify);
}
}
}
return result;
}
/**
* @param {?} notification
* @return {?}
*/
markAsRead(notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
let /** @type {?} */ isRead = this.isReadNotification(notification);
if (isRead) {
return;
}
this.readNotifications.push(notification);
}
/**
* @param {?} notificationType
* @param {?} name
* @return {?}
*/
markAsReadBy(notificationType, name) {
if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) {
this.markAsReadAll();
return;
}
let /** @type {?} */ readNotifyArray = [];
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ nameCheck = notify.name;
let /** @type {?} */ typeName = notify.type;
let /** @type {?} */ notifyPass = true;
let /** @type {?} */ namePass = true;
if (notificationType !== null && typeof notificationType !== 'undefined') {
if (typeName !== notificationType) {
notifyPass = false;
}
}
if (name !== null && typeof name !== 'undefined') {
if (nameCheck !== name) {
namePass = false;
}
}
if (notifyPass && namePass) {
readNotifyArray.push(notify);
}
}
// set mark read from Array
for (let /** @type {?} */ notify of readNotifyArray) {
this.markAsRead(notify);
}
}
/**
* @return {?}
*/
markAsReadAll() {
for (let /** @type {?} */ notify of this.notifications) {
let /** @type {?} */ isRead = this.isReadNotification(notify);
if (!isRead) {
this.readNotifications.push(notify);
}
}
}
/**
* @param {?} notification
* @return {?}
*/
pinNotification(notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
let /** @type {?} */ isPined = this.isPinedNotification(notification);
if (isPined) {
return;
}
this.pinNotifications.push(notification);
}
/**
* @param {?} notification
* @return {?}
*/
unpinNotification(notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
let /** @type {?} */ index = this.pinNotifications.indexOf(notification);
if (index >= 0) {
this.pinNotifications.splice(index, 1);
}
}
}
NotificationManager.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NotificationManager.ctorParameters = () => [
{ type: UISystemClock, },
];
function NotificationManager_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
NotificationManager.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
NotificationManager.ctorParameters;
/** @type {?} */
NotificationManager.prototype.notifications;
/** @type {?} */
NotificationManager.prototype.pinNotifications;
/** @type {?} */
NotificationManager.prototype.readNotifications;
/** @type {?} */
NotificationManager.prototype.showDelayTimer;
/** @type {?} */
NotificationManager.prototype.uiSystemClock;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90aWZpY2F0aW9uTWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZS9Ob3RpZmljYXRpb25NYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7O0FBWXhELE1BQU07Ozs7SUFRRixZQUFZLGFBQTRCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztLQUN0Qzs7Ozs7SUFFTyxtQkFBbUIsQ0FBQyxZQUEwQjtRQUNsRCxFQUFFLENBQUEsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7O0lBR3BELGtCQUFrQixDQUFDLFlBQTBCO1FBQ2pELEVBQUUsQ0FBQSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM3RCxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7SUFHdEQsTUFBTSxDQUFDLFlBQTBCO1FBQ3BDLEVBQUUs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QVksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELEVBQUUsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUM7WUFDUixNQUFNLENBQUM7U0FDVjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Ozs7OztJQUd0QyxpQkFBaUIsQ0FBQyxZQUEwQjtRQUMvQyxFQUFFLENBQUMsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxDQUFDO1NBQ1Y7UUFDRCxxQkFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFDOzs7O1lBeFRSLFVBQVU7Ozs7WUFYRixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9zaGFyZS9JTm90aWZpY2F0aW9uTWFuYWdlcic7XG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuLi9jb21wb25lbnQvbW9kZWwvTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFVJU3lzdGVtQ2xvY2sgfSBmcm9tICcuL1VJU3lzdGVtQ2xvY2suc2VydmljZSc7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQSA8Y29kZT5uZzwvY29kZT4gc2VydmljZSBjbGFzcyB3aGljaCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0gc2VydmljZSBpbnRlcmZhY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogcGxlYXNlIHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0uXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJTm90aWZpY2F0aW9uTWFuYWdlciB7XG5cbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdO1xuICAgIHByaXZhdGUgcGluTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSByZWFkTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSBzaG93RGVsYXlUaW1lcjogYW55O1xuICAgIHByaXZhdGUgdWlTeXN0ZW1DbG9jazogVUlTeXN0ZW1DbG9jaztcblxuICAgIGNvbnN0cnVjdG9yKHVpU3lzdGVtQ2xvY2s6IFVJU3lzdGVtQ2xvY2spIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnJlYWROb3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMudWlTeXN0ZW1DbG9jayA9IHVpU3lzdGVtQ2xvY2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpbmVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGluTm90aWZpY2F0aW9ucy5pbmRleE9mKG5vdGlmaWNhdGlvbikgPj0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZihub3RpZmljYXRpb24gPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKSA+PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGluSW5kZXggPSB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuaW5kZXhPZihub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGlmIChwaW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuc3BsaWNlKHBpbkluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWFkSW5kZXggPSB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAocmVhZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMuc3BsaWNlKHJlYWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJCeShub3RpZmljYXRpb25UeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoKG5vdGlmaWNhdGlvblR5cGUgPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgPT09ICd1bmRlZmluZWQnKSAmJiAobmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuY2VsTm90aWZ5QXJyYXk6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsTm90aWZ5QXJyYXkucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIGNhbmNlbE5vdGlmeUFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGxldCBjbG9uZUxpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbnMuc2xpY2UoMCk7XG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiBjbG9uZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIobm90aWZ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm90aWZpY2F0aW9uc0J5KG5vdGlmaWNhdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogTm90aWZpY2F0aW9uW10ge1xuICAgICAgICBsZXQgcmVzdWx0OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaG93aW5nTm90aWZpY2F0aW9ucygpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuICAgICAgICAgICAgbGV0IGlzU2hvdzogYm9vbGVhbiA9IG5vdGlmeS5zaG93O1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHRpbWVQYXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25UeXBlICE9PSBudWxsICYmIHR5cGVvZiBub3RpZmljYXRpb25UeXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZSAhPT0gbm90aWZpY2F0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBub3RpZnlQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVDaGVjayAhPT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lUGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNyZWF0ZWRUaW1lOiBEYXRlID0gbm90aWZ5LmNyZWF0ZWRUaW1lO1xuICAgICAgICAgICAgbGV0IHRpbWVPdXQ6IG51bWJlciA9IG5vdGlmeS50aW1lb3V0O1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWRUaW1lID09PSBudWxsIHx8IHR5cGVvZiBjcmVhdGVkVGltZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aW1lT3V0ID09PSBudWxsIHx8IHR5cGVvZiB0aW1lT3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRpbWVPdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmluYWxUaW1lID0gbmV3IERhdGUoY3JlYXRlZFRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWVPdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaW5hbFRpbWUuYWRkTWlsbGlzZWNvbmRzKHRpbWVPdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VyRGF0ZTogRGF0ZSA9IHRoaXMudWlTeXN0ZW1DbG9jay5nZXRDdXJyZW50Q2xvY2tEYXRlVGltZSgpO1xuICAgICAgICAgICAgaWYgKGN1ckRhdGUgIT09IG51bGwgJiYgZmluYWxUaW1lLmlzQWZ0ZXIoY3VyRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lUGFzcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzICYmIGlzU2hvdykge1xuICAgICAgICAgICAgICAgIGlmICh0aW1lUGFzcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNQaW5lZE5vdGlmaWNhdGlvbihub3RpZnkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5yZWFkTm90aWZpY2F0aW9uc0J5KG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE5vdGlmaWNhdGlvbihub3RpZnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNSZWFkID0gdGhpcy5pc1JlYWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNSZWFkKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXJrQXNSZWFkQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKChub3RpZmljYXRpb25UeXBlID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb25UeXBlID09PSAndW5kZWZpbmVkJykgJiYgKG5hbWUgPT09IG51bGwgfHwgdHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVhZE5vdGlmeUFycmF5OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlYWROb3RpZnlBcnJheS5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgbWFyayByZWFkIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHJlYWROb3RpZnlBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZEFsbCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IGlzUmVhZCA9IHRoaXMuaXNSZWFkTm90aWZpY2F0aW9uKG5vdGlmeSk7XG4gICAgICAgICAgICBpZiAoIWlzUmVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzUGluZWQ6IGJvb2xlYW4gPSB0aGlzLmlzUGluZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNQaW5lZCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5waW5Ob3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19