UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

234 lines 23.5 kB
import { BehaviorSubject } from 'rxjs'; import { Injectable } from '@angular/core'; import { StateService } from '../common/state-service.abstract'; import { gettext } from '../i18n/gettext'; import { isEqual } from 'lodash-es'; import * as i0 from "@angular/core"; /** * A service which allows to display alerts. */ export class AlertService extends StateService { constructor() { super(...arguments); /** * @ignore */ this.state$ = new BehaviorSubject([]); this.MAX_ALERTS = 3; this.ALERT_TIMEOUT = 3000; } /** * Returns all alerts. * @readonly */ get state() { return this.state$.value; } /** * Adds a new alert to the current state. */ add(alert) { this.addAlert(alert); } /** * Adds a alert by text. */ addByText(type, txt, detailedData) { this.addAlert({ text: txt, type, detailedData }); } /** * Returns all alerts. * @deprecated Use alertService.alerts instead. */ list() { return this.state; } /** * Remove an alert from the current state. */ remove(alert) { this.changeAlerts(this.state.filter(item => !this.areSame(alert, item))); } /** * Updates matching alert with provided values. */ update(alert, fieldsToUpdate) { this.changeAlerts(this.state.map(item => { if (this.areSame(alert, item)) { Object.assign(item, fieldsToUpdate); } return item; })); } /** * Removes last danger alert. * It can be used e.g. in the case of a failed request which triggered an alert, to hide it from user. * * ```js * try { * // something that might throw a danger server msg * } catch (ex) { * this.alertService.removeLastDanger(); * } * ``` */ removeLastDanger() { const firstDangerAlert = this.state.reverse().find(({ type }) => type === 'danger'); this.changeAlerts(this.state.filter(alert => alert !== firstDangerAlert)); } /** * Shorthand for a save successful alert. * @param savedObject The object which was saved. * @return A function that can be executed to show the msg. */ saveSuccess(savedObject) { return () => { const text = `${savedObject} saved successfully`; this.addByText('success', text); }; } /** * Shorthand for a create successful alert. * @param createdObject The object which was created. * @return A function that can be executed to show the msg. */ createSuccess(createdObject) { return () => { const text = `${createdObject} created successfully`; this.addByText('success', text); }; } /** * Clears all alerts. */ clearAll() { this.changeAlerts([]); } /** * A shorthand to display a simple success message. * @param text The success text. * @param detailedData The text with additional information. */ success(text, detailedData) { this.addByText('success', text, detailedData); } /** * A shorthand to display a simple danger message. * @param text The danger text. * @param detailedData The text with additional information. */ danger(text, detailedData) { this.addByText('danger', text, detailedData); } /** * A shorthand to display a simple info message. * @param text The info text. * @param detailedData The text with additional information. */ info(text, detailedData) { this.addByText('info', text, detailedData); } /** * A shorthand to display a simple warning message. * @param text The warning text. * @param detailedData The text with additional information. */ warning(text, detailedData) { this.addByText('warning', text, detailedData); } /** * A shorthand to display a simple system message. * @param text The system message text. * @param detailedData The text with additional information. */ system(text, detailedData) { this.addByText('system', text, detailedData); } /** * Creates alert from standard api errors. * Should be used for errors generated by @c8y/client services. * @param {IResult} error The error from server. * @param {alertType} type The type of alert. */ addServerFailure(error, type = 'danger') { const { data, res } = error; let text = data?.message || null; let detailedData; if (data) { if (typeof data === 'object') { detailedData = data.exceptionMessage; } else if (typeof data === 'string') { detailedData = data; } } const hasRelevantMessage = !!(text || detailedData); if (!text) { text = gettext('A server error occurred.'); } if (res && !hasRelevantMessage) { detailedData = { status: res.status, statusText: res.statusText, url: res.url }; } this.addAlert({ type, text, detailedData }); } /** * Compares two alert objects. Alerts are same if text, type, detailed data and callbacks are same. * Callbacks are same if they refer to the same function. */ areSame(alert1, alert2) { return (alert1.text === alert2.text && alert1.type === alert2.type && isEqual(alert1.detailedData, alert2.detailedData) && alert1.onClose === alert2.onClose && alert1.onDetail === alert2.onDetail); } changeAlerts(newAlerts) { this.state$.next(newAlerts); } addAlert(alert) { if (!alert.text && !alert.type) { throw new Error('Cannot add empty alert'); } const alertAlreadyAdded = this.state.find(item => this.areSame(alert, item)); if (alertAlreadyAdded) { return; } this.changeAlerts([...this.state, alert]); this.hideAutomaticallyIfNeeded(alert); this.removeOldestIfMax(); } hideAutomaticallyIfNeeded(alert) { const isSuccess = alert.type === 'success'; const noDetails = !alert.detailedData; let alertTimeout = isSuccess && noDetails ? this.ALERT_TIMEOUT : 0; if (typeof alert.timeout !== 'undefined') { alertTimeout = alert.timeout; } if (alertTimeout) { setTimeout(() => this.remove(alert), alertTimeout); } } removeOldestIfMax() { if (this.state.length > this.MAX_ALERTS) { const [, ...firstRemoved] = this.state; this.changeAlerts(firstRemoved); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlertService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvYWxlcnQvYWxlcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUdwQzs7R0FFRztBQUlILE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQUg5Qzs7UUFXRTs7V0FFRztRQUNILFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBVSxFQUFFLENBQUMsQ0FBQztRQUVsQyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysa0JBQWEsR0FBRyxJQUFJLENBQUM7S0FnTzlCO0lBN09DOzs7T0FHRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQVNEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLEtBQVk7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxJQUFlLEVBQUUsR0FBVyxFQUFFLFlBQXFCO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxL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QUFFLENBQUM7WUFDekMsWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7K0dBN09VLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxlcnQgfSBmcm9tICcuL2FsZXJ0Lm1vZGVsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3N0YXRlLXNlcnZpY2UuYWJzdHJhY3QnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuZXhwb3J0IHR5cGUgQWxlcnRUeXBlID0gJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgfCAnaW5mbycgfCAnc3lzdGVtJztcbi8qKlxuICogQSBzZXJ2aWNlIHdoaWNoIGFsbG93cyB0byBkaXNwbGF5IGFsZXJ0cy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnRTZXJ2aWNlIGV4dGVuZHMgU3RhdGVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGFsZXJ0cy5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFsZXJ0W10+KFtdKTtcblxuICBwcml2YXRlIE1BWF9BTEVSVFMgPSAzO1xuICBwcml2YXRlIEFMRVJUX1RJTUVPVVQgPSAzMDAwO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGFsZXJ0IHRvIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgYWRkKGFsZXJ0OiBBbGVydCkge1xuICAgIHRoaXMuYWRkQWxlcnQoYWxlcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBhbGVydCBieSB0ZXh0LlxuICAgKi9cbiAgYWRkQnlUZXh0KHR5cGU6IEFsZXJ0VHlwZSwgdHh0OiBzdHJpbmcsIGRldGFpbGVkRGF0YT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWRkQWxlcnQoeyB0ZXh0OiB0eHQsIHR5cGUsIGRldGFpbGVkRGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBhbGVydHMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhbGVydFNlcnZpY2UuYWxlcnRzIGluc3RlYWQuXG4gICAqL1xuICBsaXN0KCk6IEFsZXJ0W10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhbGVydCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVtb3ZlKGFsZXJ0OiBBbGVydCkge1xuICAgIHRoaXMuY2hhbmdlQWxlcnRzKHRoaXMuc3RhdGUuZmlsdGVyKGl0ZW0gPT4gIXRoaXMuYXJlU2FtZShhbGVydCwgaXRlbSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG1hdGNoaW5nIGFsZXJ0IHdpdGggcHJvdmlkZWQgdmFsdWVzLlxuICAgKi9cbiAgdXBkYXRlKGFsZXJ0OiBBbGVydCwgZmllbGRzVG9VcGRhdGU6IFBhcnRpYWw8QWxlcnQ+KSB7XG4gICAgdGhpcy5jaGFuZ2VBbGVydHMoXG4gICAgICB0aGlzLnN0YXRlLm1hcChpdGVtID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXJlU2FtZShhbGVydCwgaXRlbSkpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGZpZWxkc1RvVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGxhc3QgZGFuZ2VyIGFsZXJ0LlxuICAgKiBJdCBjYW4gYmUgdXNlZCBlLmcuIGluIHRoZSBjYXNlIG9mIGEgZmFpbGVkIHJlcXVlc3Qgd2hpY2ggdHJpZ2dlcmVkIGFuIGFsZXJ0LCB0byBoaWRlIGl0IGZyb20gdXNlci5cbiAgICpcbiAgICogYGBganNcbiAgICogIHRyeSB7XG4gICAqICAgIC8vIHNvbWV0aGluZyB0aGF0IG1pZ2h0IHRocm93IGEgZGFuZ2VyIHNlcnZlciBtc2dcbiAgICogIH0gY2F0Y2ggKGV4KSB7XG4gICAqICAgdGhpcy5hbGVydFNlcnZpY2UucmVtb3ZlTGFzdERhbmdlcigpO1xuICAgKiAgfVxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUxhc3REYW5nZXIoKSB7XG4gICAgY29uc3QgZmlyc3REYW5nZXJBbGVydCA9IHRoaXMuc3RhdGUucmV2ZXJzZSgpLmZpbmQoKHsgdHlwZSB9KSA9PiB0eXBlID09PSAnZGFuZ2VyJyk7XG4gICAgdGhpcy5jaGFuZ2VBbGVydHModGhpcy5zdGF0ZS5maWx0ZXIoYWxlcnQgPT4gYWxlcnQgIT09IGZpcnN0RGFuZ2VyQWxlcnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgZm9yIGEgc2F2ZSBzdWNjZXNzZnVsIGFsZXJ0LlxuICAgKiBAcGFyYW0gc2F2ZWRPYmplY3QgVGhlIG9iamVjdCB3aGljaCB3YXMgc2F2ZWQuXG4gICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleGVjdXRlZCB0byBzaG93IHRoZSBtc2cuXG4gICAqL1xuICBzYXZlU3VjY2VzcyhzYXZlZE9iamVjdDogc3RyaW5nKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBgJHtzYXZlZE9iamVjdH0gc2F2ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgIHRoaXMuYWRkQnlUZXh0KCdzdWNjZXNzJywgdGV4dCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgZm9yIGEgY3JlYXRlIHN1Y2Nlc3NmdWwgYWxlcnQuXG4gICAqIEBwYXJhbSBjcmVhdGVkT2JqZWN0IFRoZSBvYmplY3Qgd2hpY2ggd2FzIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleGVjdXRlZCB0byBzaG93IHRoZSBtc2cuXG4gICAqL1xuICBjcmVhdGVTdWNjZXNzKGNyZWF0ZWRPYmplY3QpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGAke2NyZWF0ZWRPYmplY3R9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgIHRoaXMuYWRkQnlUZXh0KCdzdWNjZXNzJywgdGV4dCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGFsZXJ0cy5cbiAgICovXG4gIGNsZWFyQWxsKCkge1xuICAgIHRoaXMuY2hhbmdlQWxlcnRzKFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNob3J0aGFuZCB0byBkaXNwbGF5IGEgc2ltcGxlIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHN1Y2Nlc3MgdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBzdWNjZXNzKHRleHQ6IHN0cmluZywgZGV0YWlsZWREYXRhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRCeVRleHQoJ3N1Y2Nlc3MnLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgZGFuZ2VyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSBkYW5nZXIgdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBkYW5nZXIodGV4dDogc3RyaW5nLCBkZXRhaWxlZERhdGE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZEJ5VGV4dCgnZGFuZ2VyJywgdGV4dCwgZGV0YWlsZWREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNob3J0aGFuZCB0byBkaXNwbGF5IGEgc2ltcGxlIGluZm8gbWVzc2FnZS5cbiAgICogQHBhcmFtIHRleHQgVGhlIGluZm8gdGV4dC5cbiAgICogQHBhcmFtIGRldGFpbGVkRGF0YSBUaGUgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAqL1xuICBpbmZvKHRleHQ6IHN0cmluZywgZGV0YWlsZWREYXRhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRCeVRleHQoJ2luZm8nLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgd2FybmluZyBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgd2FybmluZyB0ZXh0LlxuICAgKiBAcGFyYW0gZGV0YWlsZWREYXRhIFRoZSB0ZXh0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHdhcm5pbmcodGV4dDogc3RyaW5nLCBkZXRhaWxlZERhdGE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZEJ5VGV4dCgnd2FybmluZycsIHRleHQsIGRldGFpbGVkRGF0YSk7XG4gIH1cbiAgLyoqXG4gICAqIEEgc2hvcnRoYW5kIHRvIGRpc3BsYXkgYSBzaW1wbGUgc3lzdGVtIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSBzeXN0ZW0gbWVzc2FnZSB0ZXh0LlxuICAgKiBAcGFyYW0gZGV0YWlsZWREYXRhIFRoZSB0ZXh0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHN5c3RlbSh0ZXh0OiBzdHJpbmcsIGRldGFpbGVkRGF0YT86IHN0cmluZykge1xuICAgIHRoaXMuYWRkQnlUZXh0KCdzeXN0ZW0nLCB0ZXh0LCBkZXRhaWxlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYWxlcnQgZnJvbSBzdGFuZGFyZCBhcGkgZXJyb3JzLlxuICAgKiBTaG91bGQgYmUgdXNlZCBmb3IgZXJyb3JzIGdlbmVyYXRlZCBieSBAYzh5L2NsaWVudCBzZXJ2aWNlcy5cbiAgICogQHBhcmFtIHtJUmVzdWx0fSAgZXJyb3IgVGhlIGVycm9yIGZyb20gc2VydmVyLlxuICAgKiBAcGFyYW0ge2FsZXJ0VHlwZX0gdHlwZSBUaGUgdHlwZSBvZiBhbGVydC5cbiAgICovXG4gIGFkZFNlcnZlckZhaWx1cmUoZXJyb3I6IGFueSwgdHlwZTogQWxlcnRUeXBlID0gJ2RhbmdlcicpIHtcbiAgICBjb25zdCB7IGRhdGEsIHJlcyB9ID0gZXJyb3I7XG4gICAgbGV0IHRleHQgPSBkYXRhPy5tZXNzYWdlIHx8IG51bGw7XG4gICAgbGV0IGRldGFpbGVkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZXRhaWxlZERhdGEgPSBkYXRhLmV4Y2VwdGlvbk1lc3NhZ2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXRhaWxlZERhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoYXNSZWxldmFudE1lc3NhZ2UgPSAhISh0ZXh0IHx8IGRldGFpbGVkRGF0YSk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0ZXh0ID0gZ2V0dGV4dCgnQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuJyk7XG4gICAgfVxuICAgIGlmIChyZXMgJiYgIWhhc1JlbGV2YW50TWVzc2FnZSkge1xuICAgICAgZGV0YWlsZWREYXRhID0ge1xuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNUZXh0LFxuICAgICAgICB1cmw6IHJlcy51cmxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5hZGRBbGVydCh7XG4gICAgICB0eXBlLFxuICAgICAgdGV4dCxcbiAgICAgIGRldGFpbGVkRGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHR3byBhbGVydCBvYmplY3RzLiBBbGVydHMgYXJlIHNhbWUgaWYgdGV4dCwgdHlwZSwgZGV0YWlsZWQgZGF0YSBhbmQgY2FsbGJhY2tzIGFyZSBzYW1lLlxuICAgKiBDYWxsYmFja3MgYXJlIHNhbWUgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmdW5jdGlvbi5cbiAgICovXG4gIGFyZVNhbWUoYWxlcnQxOiBBbGVydCwgYWxlcnQyOiBBbGVydCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhbGVydDEudGV4dCA9PT0gYWxlcnQyLnRleHQgJiZcbiAgICAgIGFsZXJ0MS50eXBlID09PSBhbGVydDIudHlwZSAmJlxuICAgICAgaXNFcXVhbChhbGVydDEuZGV0YWlsZWREYXRhLCBhbGVydDIuZGV0YWlsZWREYXRhKSAmJlxuICAgICAgYWxlcnQxLm9uQ2xvc2UgPT09IGFsZXJ0Mi5vbkNsb3NlICYmXG4gICAgICBhbGVydDEub25EZXRhaWwgPT09IGFsZXJ0Mi5vbkRldGFpbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUFsZXJ0cyhuZXdBbGVydHM6IEFsZXJ0W10pIHtcbiAgICB0aGlzLnN0YXRlJC5uZXh0KG5ld0FsZXJ0cyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEFsZXJ0KGFsZXJ0OiBBbGVydCk6IHZvaWQge1xuICAgIGlmICghYWxlcnQudGV4dCAmJiAhYWxlcnQudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVtcHR5IGFsZXJ0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxlcnRBbHJlYWR5QWRkZWQgPSB0aGlzLnN0YXRlLmZpbmQoaXRlbSA9PiB0aGlzLmFyZVNhbWUoYWxlcnQsIGl0ZW0pKTtcbiAgICBpZiAoYWxlcnRBbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZUFsZXJ0cyhbLi4udGhpcy5zdGF0ZSwgYWxlcnRdKTtcbiAgICB0aGlzLmhpZGVBdXRvbWF0aWNhbGx5SWZOZWVkZWQoYWxlcnQpO1xuICAgIHRoaXMucmVtb3ZlT2xkZXN0SWZNYXgoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUF1dG9tYXRpY2FsbHlJZk5lZWRlZChhbGVydDogQWxlcnQpIHtcbiAgICBjb25zdCBpc1N1Y2Nlc3MgPSBhbGVydC50eXBlID09PSAnc3VjY2Vzcyc7XG4gICAgY29uc3Qgbm9EZXRhaWxzID0gIWFsZXJ0LmRldGFpbGVkRGF0YTtcbiAgICBsZXQgYWxlcnRUaW1lb3V0ID0gaXNTdWNjZXNzICYmIG5vRGV0YWlscyA/IHRoaXMuQUxFUlRfVElNRU9VVCA6IDA7XG4gICAgaWYgKHR5cGVvZiBhbGVydC50aW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgYWxlcnRUaW1lb3V0ID0gYWxlcnQudGltZW91dDtcbiAgICB9XG4gICAgaWYgKGFsZXJ0VGltZW91dCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbW92ZShhbGVydCksIGFsZXJ0VGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVPbGRlc3RJZk1heCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5sZW5ndGggPiB0aGlzLk1BWF9BTEVSVFMpIHtcbiAgICAgIGNvbnN0IFssIC4uLmZpcnN0UmVtb3ZlZF0gPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5jaGFuZ2VBbGVydHMoZmlyc3RSZW1vdmVkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==