@kephas/core
Version:
Provides a common infrastructure for all the other Kephas Framework components: ambient services, dynamic reflection, composition, application management, and others.
199 lines • 19.6 kB
JavaScript
import { __decorate } from "tslib";
import { AppService } from "../services/appService";
import { SingletonAppServiceContract } from "../services/appServiceContract";
import { Priority } from "../services/appServiceMetadata";
/**
* Enumerates the logging levels.
*
* @enum {number}
*/
export var LogLevel;
(function (LogLevel) {
/**
* Fatal errors.
*/
LogLevel[LogLevel["Fatal"] = 0] = "Fatal";
/**
* Common errors.
*/
LogLevel[LogLevel["Error"] = 1] = "Error";
/**
* Warning information.
*/
LogLevel[LogLevel["Warning"] = 2] = "Warning";
/**
* Common information.
*/
LogLevel[LogLevel["Info"] = 3] = "Info";
/**
* Debugging information.
*/
LogLevel[LogLevel["Debug"] = 4] = "Debug";
/**
* Tracing information.
*/
LogLevel[LogLevel["Trace"] = 5] = "Trace";
})(LogLevel || (LogLevel = {}));
/**
* Base service for logging.
*
* @class Logger
*/
let Logger = class Logger {
constructor() {
this._logLevel = LogLevel.Info;
}
/**
* Logs the information at the provided level.
*
* @param {LogLevel | string} level The logging level.
* @param {Error} exception The error that occured (may not be specified).
* @param {string} messageFormat The message format.
* @param {...any[]} args The arguments for the message format.
* @memberof Logger
*/
log(level, exception, messageFormat, ...args) {
if (typeof level === 'string') {
level = LogLevel[level];
}
if (this.isEnabled(level)) {
this.write(level, exception, messageFormat, args);
}
}
/**
* Indicates whether logging at the indicated level is enabled.
* @param {LogLevel | string} level The logging level.
* @return true if enabled, false if not.
*/
isEnabled(level) {
if (typeof level === 'string') {
level = LogLevel[level];
}
return level <= this._logLevel;
}
/**
* Sets the logging level to the indicated one.
*
* @param {(LogLevel | string)} level The new log level.
* @memberof Logger
*/
setLevel(level) {
if (typeof level === 'string') {
level = LogLevel[level];
}
this._logLevel = level;
}
/**
* Logs the event at the fatal level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
fatal(event, ...args) {
this._log(LogLevel.Fatal, event, args);
}
/**
* Logs the event at the error level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
error(event, ...args) {
this._log(LogLevel.Error, event, args);
}
/**
* Logs the event at the warning level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
warn(event, ...args) {
this._log(LogLevel.Warning, event, args);
}
/**
* Logs the event at the information level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
info(event, ...args) {
this._log(LogLevel.Info, event, args);
}
/**
* Logs the event at the debug level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
debug(event, ...args) {
this._log(LogLevel.Debug, event, args);
}
/**
* Logs the event at the trace level.
*
* @param {Error | string} event The event to be logged.
* @param {...any[]} args The arguments for the event.
* @memberof Logger
*/
trace(event, ...args) {
this._log(LogLevel.Trace, event, args);
}
/**
* Overridable method for writing to the log.
*
* @param {LogLevel} level The logging level.
* @param {Error} exception The error that occured (may not be specified).
* @param {string} messageFormat The message format.
* @param {any[]} args The arguments for the message format.
* @memberof Logger
*/
write(level, exception, messageFormat, args) {
const message = exception ? exception.message : messageFormat;
switch (level) {
case LogLevel.Fatal:
console.error('FATAL ' + message, ...args);
break;
case LogLevel.Error:
console.error(message, ...args);
break;
case LogLevel.Warning:
console.warn(message, ...args);
break;
case LogLevel.Info:
console.info(message, ...args);
break;
case LogLevel.Debug:
console.debug(message, ...args);
break;
case LogLevel.Trace:
console.trace(message, ...args);
break;
default:
break;
}
}
_log(level, event, args) {
if (!this.isEnabled(level)) {
return;
}
if (typeof event === 'string') {
this.write(level, null, event, args);
}
else {
const messageFormat = args && args.length && args[0];
args = (args && args.length && args.splice(0, 1)) || [];
this.write(level, event, messageFormat, args);
}
}
};
Logger = __decorate([
AppService({ overridePriority: Priority.Low }),
SingletonAppServiceContract()
], Logger);
export { Logger };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL2NvcmUvc3JjL2xpYi9sb2dnaW5nL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUE4Qlg7QUE5QkQsV0FBWSxRQUFRO0lBQ2hCOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gsNkNBQU8sQ0FBQTtJQUVQOztPQUVHO0lBQ0gsdUNBQUksQ0FBQTtJQUVKOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtBQUNULENBQUMsRUE5QlcsUUFBUSxLQUFSLFFBQVEsUUE4Qm5CO0FBRUQ7Ozs7R0FJRztBQUdILElBQWEsTUFBTSxHQUFuQixNQUFhLE1BQU07SUFBbkI7UUFDWSxjQUFTLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQztJQWtLaEQsQ0FBQztJQWhLRzs7Ozs7Ozs7T0FRRztJQUNILEdBQUcsQ0FBQyxLQUF3QixFQUFFLFNBQW1DLEVBQUUsYUFBcUIsRUFBRSxHQUFHLElBQVc7UUFDcEcsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsS0FBSyxHQUFJLFFBQW9CLENBQUMsS0FBSyxDQUFhLENBQUM7U0FDcEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxJQUFJ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LE1BQU07WUFDVixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFDVjtnQkFDSSxNQUFNO1NBQ2I7SUFDTCxDQUFDO0lBRU8sSUFBSSxDQUFDLEtBQWUsRUFBRSxLQUFxQixFQUFFLElBQVc7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTztTQUNWO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQW5LWSxNQUFNO0lBRmxCLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QywyQkFBMkIsRUFBRTtHQUNqQixNQUFNLENBbUtsQjtTQW5LWSxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXhwYW5kbyB9IGZyb20gXCIuLi9leHBhbmRvXCI7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYXBwU2VydmljZVwiO1xyXG5pbXBvcnQgeyBTaW5nbGV0b25BcHBTZXJ2aWNlQ29udHJhY3QgfSBmcm9tIFwiLi4vc2VydmljZXMvYXBwU2VydmljZUNvbnRyYWN0XCI7XHJcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2FwcFNlcnZpY2VNZXRhZGF0YVwiO1xyXG5cclxuLyoqXHJcbiAqIEVudW1lcmF0ZXMgdGhlIGxvZ2dpbmcgbGV2ZWxzLlxyXG4gKlxyXG4gKiBAZW51bSB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBGYXRhbCBlcnJvcnMuXHJcbiAgICAgKi9cclxuICAgIEZhdGFsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tbW9uIGVycm9ycy5cclxuICAgICAqL1xyXG4gICAgRXJyb3IsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXYXJuaW5nIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBXYXJuaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tbW9uIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBJbmZvLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVidWdnaW5nIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBEZWJ1ZyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNpbmcgaW5mb3JtYXRpb24uXHJcbiAgICAgKi9cclxuICAgIFRyYWNlLFxyXG59XHJcblxyXG4vKipcclxuICogQmFzZSBzZXJ2aWNlIGZvciBsb2dnaW5nLlxyXG4gKlxyXG4gKiBAY2xhc3MgTG9nZ2VyXHJcbiAqL1xyXG5AQXBwU2VydmljZSh7IG92ZXJyaWRlUHJpb3JpdHk6IFByaW9yaXR5LkxvdyB9KVxyXG5AU2luZ2xldG9uQXBwU2VydmljZUNvbnRyYWN0KClcclxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XHJcbiAgICBwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5JbmZvO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgaW5mb3JtYXRpb24gYXQgdGhlIHByb3ZpZGVkIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TG9nTGV2ZWwgfCBzdHJpbmd9IGxldmVsIFRoZSBsb2dnaW5nIGxldmVsLlxyXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXhjZXB0aW9uIFRoZSBlcnJvciB0aGF0IG9jY3VyZWQgKG1heSBub3QgYmUgc3BlY2lmaWVkKS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlRm9ybWF0IFRoZSBtZXNzYWdlIGZvcm1hdC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIG1lc3NhZ2UgZm9ybWF0LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBsb2cobGV2ZWw6IExvZ0xldmVsIHwgc3RyaW5nLCBleGNlcHRpb246IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWVzc2FnZUZvcm1hdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZChsZXZlbCkpIHtcclxuICAgICAgICAgICAgdGhpcy53cml0ZShsZXZlbCwgZXhjZXB0aW9uLCBtZXNzYWdlRm9ybWF0LCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBsb2dnaW5nIGF0IHRoZSBpbmRpY2F0ZWQgbGV2ZWwgaXMgZW5hYmxlZC5cclxuICAgICAqIEBwYXJhbSB7TG9nTGV2ZWwgfCBzdHJpbmd9IGxldmVsIFRoZSBsb2dnaW5nIGxldmVsLlxyXG4gICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQsIGZhbHNlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNFbmFibGVkKGxldmVsOiBMb2dMZXZlbCB8IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsZXZlbCA8PSB0aGlzLl9sb2dMZXZlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gdGhlIGluZGljYXRlZCBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoTG9nTGV2ZWwgfCBzdHJpbmcpfSBsZXZlbCBUaGUgbmV3IGxvZyBsZXZlbC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldExldmVsKGxldmVsOiBMb2dMZXZlbCB8IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gbGV2ZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgZmF0YWwgbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBmYXRhbChldmVudDogRXJyb3IgfCBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9nKExvZ0xldmVsLkZhdGFsLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgZXJyb3IgbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBlcnJvcihldmVudDogRXJyb3IgfCBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9nKExvZ0xldmVsLkVycm9yLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgd2FybmluZyBsZXZlbC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBldmVudCBUaGUgZXZlbnQgdG8gYmUgbG9nZ2VkLlxyXG4gICAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTG9nZ2VyXHJcbiAgICAgKi9cclxuICAgIHdhcm4oZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5XYXJuaW5nLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgaW5mb3JtYXRpb24gbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBpbmZvKGV2ZW50OiBFcnJvciB8IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2coTG9nTGV2ZWwuSW5mbywgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgZXZlbnQgYXQgdGhlIGRlYnVnIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGV2ZW50IFRoZSBldmVudCB0byBiZSBsb2dnZWQuXHJcbiAgICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgZGVidWcoZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5EZWJ1ZywgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgZXZlbnQgYXQgdGhlIHRyYWNlIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGV2ZW50IFRoZSBldmVudCB0byBiZSBsb2dnZWQuXHJcbiAgICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgdHJhY2UoZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5UcmFjZSwgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGFibGUgbWV0aG9kIGZvciB3cml0aW5nIHRvIHRoZSBsb2cuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgVGhlIGxvZ2dpbmcgbGV2ZWwuXHJcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBleGNlcHRpb24gVGhlIGVycm9yIHRoYXQgb2NjdXJlZCAobWF5IG5vdCBiZSBzcGVjaWZpZWQpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VGb3JtYXQgVGhlIG1lc3NhZ2UgZm9ybWF0LlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgbWVzc2FnZSBmb3JtYXQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTG9nZ2VyXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB3cml0ZShsZXZlbDogTG9nTGV2ZWwsIGV4Y2VwdGlvbjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBtZXNzYWdlRm9ybWF0OiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV4Y2VwdGlvbiA/IGV4Y2VwdGlvbi5tZXNzYWdlIDogbWVzc2FnZUZvcm1hdDtcclxuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTG9nTGV2ZWwuRmF0YWw6XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGQVRBTCAnICsgbWVzc2FnZSwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5FcnJvcjpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5XYXJuaW5nOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTG9nTGV2ZWwuSW5mbzpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLkRlYnVnOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLlRyYWNlOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS50cmFjZShtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvZyhsZXZlbDogTG9nTGV2ZWwsIGV2ZW50OiBFcnJvciB8IHN0cmluZywgYXJnczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKGxldmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLndyaXRlKGxldmVsLCBudWxsLCBldmVudCwgYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUZvcm1hdCA9IGFyZ3MgJiYgYXJncy5sZW5ndGggJiYgYXJnc1swXTtcclxuICAgICAgICAgICAgYXJncyA9IChhcmdzICYmIGFyZ3MubGVuZ3RoICYmIGFyZ3Muc3BsaWNlKDAsIDEpKSB8fCBbXTtcclxuICAgICAgICAgICAgdGhpcy53cml0ZShsZXZlbCwgZXZlbnQsIG1lc3NhZ2VGb3JtYXQsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=