@hxui/angular
Version:
* * *
471 lines • 37.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Inject, Injectable, Injector, NgZone, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { Overlay } from './overlay/overlay';
import { ComponentPortal } from './portal/portal';
import { ToastrInjector, ToastrRef } from './toastr-injector';
import { ToastPackage, TOAST_CONFIG } from './toastr-config';
import * as i0 from "@angular/core";
import * as i1 from "./toastr-config";
import * as i2 from "./overlay/overlay";
import * as i3 from "@angular/platform-browser";
/**
* @record
* @template C
*/
export function ActiveToast() { }
if (false) {
/**
* Your Toast ID. Use this to close it individually
* @type {?}
*/
ActiveToast.prototype.toastId;
/**
* the message of your toast. Stored to prevent duplicates
* @type {?}
*/
ActiveToast.prototype.message;
/**
* a reference to the component see portal.ts
* @type {?}
*/
ActiveToast.prototype.portal;
/**
* a reference to your toast
* @type {?}
*/
ActiveToast.prototype.toastRef;
/**
* triggered when toast is active
* @type {?}
*/
ActiveToast.prototype.onShown;
/**
* triggered when toast is destroyed
* @type {?}
*/
ActiveToast.prototype.onHidden;
/**
* triggered on toast click
* @type {?}
*/
ActiveToast.prototype.onTap;
/**
* available for your use in custom toast
* @type {?}
*/
ActiveToast.prototype.onAction;
}
var ToastrService = /** @class */ (function () {
function ToastrService(token, overlay, _injector, sanitizer, ngZone) {
this.overlay = overlay;
this._injector = _injector;
this.sanitizer = sanitizer;
this.ngZone = ngZone;
this.currentlyActive = 0;
this.toasts = [];
this.index = 0;
this.toastrConfig = tslib_1.__assign({}, token.default, token.config);
if (token.config.iconClasses) {
this.toastrConfig.iconClasses = tslib_1.__assign({}, token.default.iconClasses, token.config.iconClasses);
}
}
/** show toast */
/**
* show toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @param {?=} type
* @return {?}
*/
ToastrService.prototype.show = /**
* show toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @param {?=} type
* @return {?}
*/
function (message, title, override, type) {
if (override === void 0) { override = {}; }
if (type === void 0) { type = ''; }
return this._preBuildNotification(type, message, title, this.applyConfig(override));
};
/** show successful toast */
/**
* show successful toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
ToastrService.prototype.success = /**
* show successful toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
function (message, title, override) {
if (override === void 0) { override = {}; }
/** @type {?} */
var type = this.toastrConfig.iconClasses.success || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
};
/** show error toast */
/**
* show error toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
ToastrService.prototype.error = /**
* show error toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
function (message, title, override) {
if (override === void 0) { override = {}; }
/** @type {?} */
var type = this.toastrConfig.iconClasses.error || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
};
/** show info toast */
/**
* show info toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
ToastrService.prototype.info = /**
* show info toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
function (message, title, override) {
if (override === void 0) { override = {}; }
/** @type {?} */
var type = this.toastrConfig.iconClasses.info || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
};
/** show warning toast */
/**
* show warning toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
ToastrService.prototype.warning = /**
* show warning toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
function (message, title, override) {
if (override === void 0) { override = {}; }
/** @type {?} */
var type = this.toastrConfig.iconClasses.warning || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
};
/**
* Remove all or a single toast by id
*/
/**
* Remove all or a single toast by id
* @param {?=} toastId
* @return {?}
*/
ToastrService.prototype.clear = /**
* Remove all or a single toast by id
* @param {?=} toastId
* @return {?}
*/
function (toastId) {
var e_1, _a;
try {
// Call every toastRef manualClose function
for (var _b = tslib_1.__values(this.toasts), _c = _b.next(); !_c.done; _c = _b.next()) {
var toast = _c.value;
if (toastId !== undefined) {
if (toast.toastId === toastId) {
toast.toastRef.manualClose();
return;
}
}
else {
toast.toastRef.manualClose();
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
};
/**
* Remove and destroy a single toast by id
*/
/**
* Remove and destroy a single toast by id
* @param {?} toastId
* @return {?}
*/
ToastrService.prototype.remove = /**
* Remove and destroy a single toast by id
* @param {?} toastId
* @return {?}
*/
function (toastId) {
/** @type {?} */
var found = this._findToast(toastId);
if (!found) {
return false;
}
found.activeToast.toastRef.close();
this.toasts.splice(found.index, 1);
this.currentlyActive = this.currentlyActive - 1;
if (!this.toastrConfig.maxOpened || !this.toasts.length) {
return false;
}
if (this.currentlyActive < this.toastrConfig.maxOpened &&
this.toasts[this.currentlyActive]) {
/** @type {?} */
var p = this.toasts[this.currentlyActive].toastRef;
if (!p.isInactive()) {
this.currentlyActive = this.currentlyActive + 1;
p.activate();
}
}
return true;
};
/**
* Finds a duplicate toast if one exists
*/
/**
* Finds a duplicate toast if one exists
* @param {?} message
* @param {?} resetOnDuplicate
* @return {?}
*/
ToastrService.prototype.findDuplicate = /**
* Finds a duplicate toast if one exists
* @param {?} message
* @param {?} resetOnDuplicate
* @return {?}
*/
function (message, resetOnDuplicate) {
for (var i = 0; i < this.toasts.length; i++) {
/** @type {?} */
var toast = this.toasts[i];
if (toast.message === message) {
if (resetOnDuplicate && toast.toastRef.componentInstance.resetTimeout) {
toast.toastRef.resetTimeout();
}
return toast;
}
}
return null;
};
/** create a clone of global config and apply individual settings */
/**
* create a clone of global config and apply individual settings
* @param {?=} override
* @return {?}
*/
ToastrService.prototype.applyConfig = /**
* create a clone of global config and apply individual settings
* @param {?=} override
* @return {?}
*/
function (override) {
if (override === void 0) { override = {}; }
return tslib_1.__assign({}, this.toastrConfig, override);
};
/**
* Find toast object by id
*/
/**
* Find toast object by id
* @param {?} toastId
* @return {?}
*/
ToastrService.prototype._findToast = /**
* Find toast object by id
* @param {?} toastId
* @return {?}
*/
function (toastId) {
for (var i = 0; i < this.toasts.length; i++) {
if (this.toasts[i].toastId === toastId) {
return { index: i, activeToast: this.toasts[i] };
}
}
return null;
};
/**
* Determines the need to run inside angular's zone then builds the toast
*/
/**
* Determines the need to run inside angular's zone then builds the toast
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
ToastrService.prototype._preBuildNotification = /**
* Determines the need to run inside angular's zone then builds the toast
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
function (toastType, message, title, config) {
var _this = this;
if (config.onActivateTick) {
return this.ngZone.run(function () {
return _this._buildNotification(toastType, message, title, config);
});
}
return this._buildNotification(toastType, message, title, config);
};
/**
* Creates and attaches toast data to component
* returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast.
*/
/**
* Creates and attaches toast data to component
* returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast.
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
ToastrService.prototype._buildNotification = /**
* Creates and attaches toast data to component
* returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast.
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
function (toastType, message, title, config) {
var _this = this;
if (!config.toastComponent) {
throw new Error('toastComponent required');
}
// max opened and auto dismiss = true
if (message &&
this.toastrConfig.preventDuplicates) {
/** @type {?} */
var duplicate = this.findDuplicate(message, this.toastrConfig.resetTimeoutOnDuplicate);
if (duplicate !== null) {
return duplicate;
}
}
this.previousToastMessage = message;
/** @type {?} */
var keepInactive = false;
if (this.toastrConfig.maxOpened &&
this.currentlyActive >= this.toastrConfig.maxOpened) {
keepInactive = true;
if (this.toastrConfig.autoDismiss) {
this.clear(this.toasts[0].toastId);
}
}
/** @type {?} */
var overlayRef = this.overlay.create(config.position, this.overlayContainer);
this.index = this.index + 1;
/** @type {?} */
var sanitizedMessage = message;
if (message && config.enableHtml) {
sanitizedMessage = this.sanitizer.sanitize(SecurityContext.HTML, message);
}
/** @type {?} */
var toastRef = new ToastrRef(overlayRef);
/** @type {?} */
var toastPackage = new ToastPackage(this.index, config, sanitizedMessage, title, toastType, toastRef);
/** @type {?} */
var toastInjector = new ToastrInjector(toastPackage, this._injector);
/** @type {?} */
var component = new ComponentPortal(config.toastComponent, toastInjector);
/** @type {?} */
var portal = overlayRef.attach(component, this.toastrConfig.newestOnTop);
toastRef.componentInstance = ((/** @type {?} */ (portal)))._component;
/** @type {?} */
var ins = {
toastId: this.index,
message: message || '',
toastRef: toastRef,
onShown: toastRef.afterActivate(),
onHidden: toastRef.afterClosed(),
onTap: toastPackage.onTap(),
onAction: toastPackage.onAction(),
portal: portal
};
if (!keepInactive) {
setTimeout(function () {
ins.toastRef.activate();
_this.currentlyActive = _this.currentlyActive + 1;
});
}
this.toasts.push(ins);
return ins;
};
ToastrService.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] },
];
/** @nocollapse */
ToastrService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [TOAST_CONFIG,] }] },
{ type: Overlay },
{ type: Injector },
{ type: DomSanitizer },
{ type: NgZone }
]; };
/** @nocollapse */ ToastrService.ngInjectableDef = i0.defineInjectable({ factory: function ToastrService_Factory() { return new ToastrService(i0.inject(i1.TOAST_CONFIG), i0.inject(i2.Overlay), i0.inject(i0.INJECTOR), i0.inject(i3.DomSanitizer), i0.inject(i0.NgZone)); }, token: ToastrService, providedIn: "root" });
return ToastrService;
}());
export { ToastrService };
if (false) {
/** @type {?} */
ToastrService.prototype.toastrConfig;
/** @type {?} */
ToastrService.prototype.currentlyActive;
/** @type {?} */
ToastrService.prototype.toasts;
/** @type {?} */
ToastrService.prototype.overlayContainer;
/** @type {?} */
ToastrService.prototype.previousToastMessage;
/** @type {?} */
ToastrService.prototype.index;
/** @type {?} */
ToastrService.prototype.overlay;
/** @type {?} */
ToastrService.prototype._injector;
/** @type {?} */
ToastrService.prototype.sanitizer;
/** @type {?} */
ToastrService.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RvYXN0ci90b2FzdHIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFFTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBQ04sZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFJbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlELE9BQU8sRUFBa0MsWUFBWSxFQUFlLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFFMUcsaUNBaUJDOzs7Ozs7SUFmQyw4QkFBZ0I7Ozs7O0lBRWhCLDhCQUFnQjs7Ozs7SUFFaEIsNkJBQXdCOzs7OztJQUV4QiwrQkFBdUI7Ozs7O0lBRXZCLDhCQUF5Qjs7Ozs7SUFFekIsK0JBQTBCOzs7OztJQUUxQiw0QkFBdUI7Ozs7O0lBRXZCLCtCQUEwQjs7QUFHNUI7SUFTRSx1QkFDd0IsS0FBa0IsRUFDaEMsT0FBZ0IsRUFDaEIsU0FBbUIsRUFDbkIsU0FBdUIsRUFDdkIsTUFBYztRQUhkLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFYeEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUF1QixFQUFFLENBQUM7UUFHeEIsVUFBSyxHQUFHLENBQUMsQ0FBQztRQVNoQixJQUFJLENBQUMsWUFBWSx3QkFD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bkIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO1lBQ3RCLFFBQVEsVUFBQTtZQUNSLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQ2pDLFFBQVEsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFO1lBQ2hDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQ2pDLE1BQU0sUUFBQTtTQUNQO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixVQUFVLENBQUM7Z0JBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsS0FBSSxDQUFDLGVBQWUsR0FBRyxLQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztnQkE1UUYsVUFBVSxTQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7OztnREFVN0IsTUFBTSxTQUFDLFlBQVk7Z0JBbkNmLE9BQU87Z0JBUmQsUUFBUTtnQkFJRCxZQUFZO2dCQUhuQixNQUFNOzs7d0JBTFI7Q0FrVEMsQUE3UUQsSUE2UUM7U0E1UVksYUFBYTs7O0lBQ3hCLHFDQUEyQjs7SUFDM0Isd0NBQW9COztJQUNwQiwrQkFBZ0M7O0lBQ2hDLHlDQUEyQzs7SUFDM0MsNkNBQXlDOztJQUN6Qyw4QkFBa0I7O0lBSWhCLGdDQUF3Qjs7SUFDeEIsa0NBQTJCOztJQUMzQixrQ0FBK0I7O0lBQy9CLCtCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIE5nWm9uZSxcclxuICBTZWN1cml0eUNvbnRleHRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheS9vdmVybGF5JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnLi9wb3J0YWwvcG9ydGFsJztcclxuaW1wb3J0IHsgVG9hc3RySW5qZWN0b3IsIFRvYXN0clJlZiB9IGZyb20gJy4vdG9hc3RyLWluamVjdG9yJztcclxuaW1wb3J0IHsgVG9hc3RyQ29udGFpbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi90b2FzdHIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR2xvYmFsQ29uZmlnLCBJbmRpdmlkdWFsQ29uZmlnLCBUb2FzdFBhY2thZ2UsIFRvYXN0clRva2VuLCBUT0FTVF9DT05GSUcgfSBmcm9tICcuL3RvYXN0ci1jb25maWcnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVUb2FzdDxDPiB7XHJcbiAgLyoqIFlvdXIgVG9hc3QgSUQuIFVzZSB0aGlzIHRvIGNsb3NlIGl0IGluZGl2aWR1YWxseSAqL1xyXG4gIHRvYXN0SWQ6IG51bWJlcjtcclxuICAvKiogdGhlIG1lc3NhZ2Ugb2YgeW91ciB0b2FzdC4gU3RvcmVkIHRvIHByZXZlbnQgZHVwbGljYXRlcyAqL1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICAvKiogYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBzZWUgcG9ydGFsLnRzICovXHJcbiAgcG9ydGFsOiBDb21wb25lbnRSZWY8Qz47XHJcbiAgLyoqIGEgcmVmZXJlbmNlIHRvIHlvdXIgdG9hc3QgKi9cclxuICB0b2FzdFJlZjogVG9hc3RyUmVmPEM+O1xyXG4gIC8qKiB0cmlnZ2VyZWQgd2hlbiB0b2FzdCBpcyBhY3RpdmUgKi9cclxuICBvblNob3duOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIHRyaWdnZXJlZCB3aGVuIHRvYXN0IGlzIGRlc3Ryb3llZCAqL1xyXG4gIG9uSGlkZGVuOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIHRyaWdnZXJlZCBvbiB0b2FzdCBjbGljayAqL1xyXG4gIG9uVGFwOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UgaW4gY3VzdG9tIHRvYXN0ICovXHJcbiAgb25BY3Rpb246IE9ic2VydmFibGU8YW55PjtcclxufVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRvYXN0clNlcnZpY2Uge1xyXG4gIHRvYXN0ckNvbmZpZzogR2xvYmFsQ29uZmlnO1xyXG4gIGN1cnJlbnRseUFjdGl2ZSA9IDA7XHJcbiAgdG9hc3RzOiBBY3RpdmVUb2FzdDxhbnk+W10gPSBbXTtcclxuICBvdmVybGF5Q29udGFpbmVyOiBUb2FzdHJDb250YWluZXJEaXJlY3RpdmU7XHJcbiAgcHJldmlvdXNUb2FzdE1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGluZGV4ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFRPQVNUX0NPTkZJRykgdG9rZW46IFRvYXN0clRva2VuLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIHRoaXMudG9hc3RyQ29uZmlnID0ge1xyXG4gICAgICAuLi50b2tlbi5kZWZhdWx0LFxyXG4gICAgICAuLi50b2tlbi5jb25maWcsXHJcbiAgICB9O1xyXG4gICAgaWYgKHRva2VuLmNvbmZpZy5pY29uQ2xhc3Nlcykge1xyXG4gICAgICB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3NlcyA9IHtcclxuICAgICAgICAuLi50b2tlbi5kZWZhdWx0Lmljb25DbGFzc2VzLFxyXG4gICAgICAgIC4uLnRva2VuLmNvbmZpZy5pY29uQ2xhc3NlcyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqIHNob3cgdG9hc3QgKi9cclxuICBzaG93KFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fSxcclxuICAgIHR5cGUgPSAnJ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKiBzaG93IHN1Y2Nlc3NmdWwgdG9hc3QgKi9cclxuICBzdWNjZXNzKFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fVxyXG4gICkge1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9hc3RyQ29uZmlnLmljb25DbGFzc2VzLnN1Y2Nlc3MgfHwgJyc7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0aGlzLmFwcGx5Q29uZmlnKG92ZXJyaWRlKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIHNob3cgZXJyb3IgdG9hc3QgKi9cclxuICBlcnJvcihcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy5lcnJvciB8fCAnJztcclxuICAgIHJldHVybiB0aGlzLl9wcmVCdWlsZE5vdGlmaWNhdGlvbihcclxuICAgICAgdHlwZSxcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRoaXMuYXBwbHlDb25maWcob3ZlcnJpZGUpXHJcbiAgICApO1xyXG4gIH1cclxuICAvKiogc2hvdyBpbmZvIHRvYXN0ICovXHJcbiAgaW5mbyhcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy5pbmZvIHx8ICcnO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKiBzaG93IHdhcm5pbmcgdG9hc3QgKi9cclxuICB3YXJuaW5nKFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fVxyXG4gICkge1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9hc3RyQ29uZmlnLmljb25DbGFzc2VzLndhcm5pbmcgfHwgJyc7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0aGlzLmFwcGx5Q29uZmlnKG92ZXJyaWRlKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFsbCBvciBhIHNpbmdsZSB0b2FzdCBieSBpZFxyXG4gICAqL1xyXG4gIGNsZWFyKHRvYXN0SWQ/OiBudW1iZXIpIHtcclxuICAgIC8vIENhbGwgZXZlcnkgdG9hc3RSZWYgbWFudWFsQ2xvc2UgZnVuY3Rpb25cclxuICAgIGZvciAoY29uc3QgdG9hc3Qgb2YgdGhpcy50b2FzdHMpIHtcclxuICAgICAgaWYgKHRvYXN0SWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0b2FzdC50b2FzdElkID09PSB0b2FzdElkKSB7XHJcbiAgICAgICAgICB0b2FzdC50b2FzdFJlZi5tYW51YWxDbG9zZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b2FzdC50b2FzdFJlZi5tYW51YWxDbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbmQgZGVzdHJveSBhIHNpbmdsZSB0b2FzdCBieSBpZFxyXG4gICAqL1xyXG4gIHJlbW92ZSh0b2FzdElkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fZmluZFRvYXN0KHRvYXN0SWQpO1xyXG4gICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3VuZC5hY3RpdmVUb2FzdC50b2FzdFJlZi5jbG9zZSgpO1xyXG4gICAgdGhpcy50b2FzdHMuc3BsaWNlKGZvdW5kLmluZGV4LCAxKTtcclxuICAgIHRoaXMuY3VycmVudGx5QWN0aXZlID0gdGhpcy5jdXJyZW50bHlBY3RpdmUgLSAxO1xyXG4gICAgaWYgKCF0aGlzLnRvYXN0ckNvbmZpZy5tYXhPcGVuZWQgfHwgIXRoaXMudG9hc3RzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY3VycmVudGx5QWN0aXZlIDwgdGhpcy50b2FzdHJDb25maWcubWF4T3BlbmVkICYmXHJcbiAgICAgIHRoaXMudG9hc3RzW3RoaXMuY3VycmVudGx5QWN0aXZlXVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnRvYXN0c1t0aGlzLmN1cnJlbnRseUFjdGl2ZV0udG9hc3RSZWY7XHJcbiAgICAgIGlmICghcC5pc0luYWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRseUFjdGl2ZSA9IHRoaXMuY3VycmVudGx5QWN0aXZlICsgMTtcclxuICAgICAgICBwLmFjdGl2YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZHMgYSBkdXBsaWNhdGUgdG9hc3QgaWYgb25lIGV4aXN0c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZER1cGxpY2F0ZShtZXNzYWdlOiBzdHJpbmcsIHJlc2V0T25EdXBsaWNhdGU6IGJvb2xlYW4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b2FzdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgdG9hc3QgPSB0aGlzLnRvYXN0c1tpXTtcclxuICAgICAgaWYgKHRvYXN0Lm1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAocmVzZXRPbkR1cGxpY2F0ZSAmJiB0b2FzdC50b2FzdFJlZi5jb21wb25lbnRJbnN0YW5jZS5yZXNldFRpbWVvdXQpIHtcclxuICAgICAgICAgIHRvYXN0LnRvYXN0UmVmLnJlc2V0VGltZW91dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG9hc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIGNyZWF0ZSBhIGNsb25lIG9mIGdsb2JhbCBjb25maWcgYW5kIGFwcGx5IGluZGl2aWR1YWwgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGFwcGx5Q29uZmlnKG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge30pOiBHbG9iYWxDb25maWcge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy50b2FzdHJDb25maWcsIC4uLm92ZXJyaWRlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIHRvYXN0IG9iamVjdCBieSBpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZpbmRUb2FzdChcclxuICAgIHRvYXN0SWQ6IG51bWJlclxyXG4gICk6IHsgaW5kZXg6IG51bWJlcjsgYWN0aXZlVG9hc3Q6IEFjdGl2ZVRvYXN0PGFueT4gfSB8IG51bGwge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvYXN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy50b2FzdHNbaV0udG9hc3RJZCA9PT0gdG9hc3RJZCkge1xyXG4gICAgICAgIHJldHVybiB7IGluZGV4OiBpLCBhY3RpdmVUb2FzdDogdGhpcy50b2FzdHNbaV0gfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBuZWVkIHRvIHJ1biBpbnNpZGUgYW5ndWxhcidzIHpvbmUgdGhlbiBidWlsZHMgdGhlIHRvYXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICB0b2FzdFR5cGU6IHN0cmluZyxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IEdsb2JhbENvbmZpZ1xyXG4gICk6IEFjdGl2ZVRvYXN0PGFueT4gfCBudWxsIHtcclxuICAgIGlmIChjb25maWcub25BY3RpdmF0ZVRpY2spIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgIHRoaXMuX2J1aWxkTm90aWZpY2F0aW9uKHRvYXN0VHlwZSwgbWVzc2FnZSwgdGl0bGUsIGNvbmZpZylcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9idWlsZE5vdGlmaWNhdGlvbih0b2FzdFR5cGUsIG1lc3NhZ2UsIHRpdGxlLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbmQgYXR0YWNoZXMgdG9hc3QgZGF0YSB0byBjb21wb25lbnRcclxuICAgKiByZXR1cm5zIHRoZSBhY3RpdmUgdG9hc3QsIG9yIGluIGNhc2UgcHJldmVudER1cGxpY2F0ZXMgaXMgZW5hYmxlZCB0aGUgb3JpZ2luYWwvbm9uLWR1cGxpY2F0ZSBhY3RpdmUgdG9hc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYnVpbGROb3RpZmljYXRpb24oXHJcbiAgICB0b2FzdFR5cGU6IHN0cmluZyxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IEdsb2JhbENvbmZpZ1xyXG4gICk6IEFjdGl2ZVRvYXN0PGFueT4gfCBudWxsIHtcclxuICAgIGlmICghY29uZmlnLnRvYXN0Q29tcG9uZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG9hc3RDb21wb25lbnQgcmVxdWlyZWQnKTtcclxuICAgIH1cclxuICAgIC8vIG1heCBvcGVuZWQgYW5kIGF1dG8gZGlzbWlzcyA9IHRydWVcclxuICAgIGlmIChcclxuICAgICAgbWVzc2FnZSAmJlxyXG4gICAgICB0aGlzLnRvYXN0ckNvbmZpZy5wcmV2ZW50RHVwbGljYXRlc1xyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHRoaXMuZmluZER1cGxpY2F0ZShtZXNzYWdlLCB0aGlzLnRvYXN0ckNvbmZpZy5yZXNldFRpbWVvdXRPbkR1cGxpY2F0ZSk7XHJcbiAgICAgIGlmIChkdXBsaWNhdGUgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZpb3VzVG9hc3RNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgIGxldCBrZWVwSW5hY3RpdmUgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50b2FzdHJDb25maWcubWF4T3BlbmVkICYmXHJcbiAgICAgIHRoaXMuY3VycmVudGx5QWN0aXZlID49IHRoaXMudG9hc3RyQ29uZmlnLm1heE9wZW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIGtlZXBJbmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnRvYXN0ckNvbmZpZy5hdXRvRGlzbWlzcykge1xyXG4gICAgICAgIHRoaXMuY2xlYXIodGhpcy50b2FzdHNbMF0udG9hc3RJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxyXG4gICAgICBjb25maWcucG9zaXRpb24sXHJcbiAgICAgIHRoaXMub3ZlcmxheUNvbnRhaW5lclxyXG4gICAgKTtcclxuICAgIHRoaXMuaW5kZXggPSB0aGlzLmluZGV4ICsgMTtcclxuICAgIGxldCBzYW5pdGl6ZWRNZXNzYWdlOiBzdHJpbmcgfCBTYWZlSHRtbCB8IHVuZGVmaW5lZCB8IG51bGwgPSBtZXNzYWdlO1xyXG4gICAgaWYgKG1lc3NhZ2UgJiYgY29uZmlnLmVuYWJsZUh0bWwpIHtcclxuICAgICAgc2FuaXRpemVkTWVzc2FnZSA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRvYXN0UmVmID0gbmV3IFRvYXN0clJlZihvdmVybGF5UmVmKTtcclxuICAgIGNvbnN0IHRvYXN0UGFja2FnZSA9IG5ldyBUb2FzdFBhY2thZ2UoXHJcbiAgICAgIHRoaXMuaW5kZXgsXHJcbiAgICAgIGNvbmZpZyxcclxuICAgICAgc2FuaXRpemVkTWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRvYXN0VHlwZSxcclxuICAgICAgdG9hc3RSZWZcclxuICAgICk7XHJcbiAgICBjb25zdCB0b2FzdEluamVjdG9yID0gbmV3IFRvYXN0ckluamVjdG9yKHRvYXN0UGFja2FnZSwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudFBvcnRhbChjb25maWcudG9hc3RDb21wb25lbnQsIHRvYXN0SW5qZWN0b3IpO1xyXG4gICAgY29uc3QgcG9ydGFsID0gb3ZlcmxheVJlZi5hdHRhY2goY29tcG9uZW50LCB0aGlzLnRvYXN0ckNvbmZpZy5uZXdlc3RPblRvcCk7XHJcbiAgICB0b2FzdFJlZi5jb21wb25lbnRJbnN0YW5jZSA9ICg8YW55PnBvcnRhbCkuX2NvbXBvbmVudDtcclxuICAgIGNvbnN0IGluczogQWN0aXZlVG9hc3Q8YW55PiA9IHtcclxuICAgICAgdG9hc3RJZDogdGhpcy5pbmRleCxcclxuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcclxuICAgICAgdG9hc3RSZWYsXHJcbiAgICAgIG9uU2hvd246IHRvYXN0UmVmLmFmdGVyQWN0aXZhdGUoKSxcclxuICAgICAgb25IaWRkZW46IHRvYXN0UmVmLmFmdGVyQ2xvc2VkKCksXHJcbiAgICAgIG9uVGFwOiB0b2FzdFBhY2thZ2Uub25UYXAoKSxcclxuICAgICAgb25BY3Rpb246IHRvYXN0UGFja2FnZS5vbkFjdGlvbigpLFxyXG4gICAgICBwb3J0YWxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFrZWVwSW5hY3RpdmUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaW5zLnRvYXN0UmVmLmFjdGl2YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50bHlBY3RpdmUgPSB0aGlzLmN1cnJlbnRseUFjdGl2ZSArIDE7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9hc3RzLnB1c2goaW5zKTtcclxuICAgIHJldHVybiBpbnM7XHJcbiAgfVxyXG59XHJcbiJdfQ==