UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

365 lines (364 loc) 37.7 kB
/** * @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