ionic-logging-service
Version:
Logging functionalities for apps built with Ionic framework
191 lines • 19.5 kB
JavaScript
import * as log4javascript from "log4javascript";
import { LogLevelConverter } from "./log-level.converter";
/**
* Logger for writing log messages.
*/
export class Logger {
/**
* Creates a new instance of a logger.
*/
constructor(logger) {
if (typeof logger === "undefined") {
this.logger = log4javascript.getRootLogger();
}
else if (typeof logger === "string") {
this.logger = log4javascript.getLogger(logger);
}
else {
this.logger = logger;
}
}
/**
* Get the log level.
*/
getLogLevel() {
return LogLevelConverter.levelFromLog4Javascript(this.logger.getLevel());
}
/**
* Set the log level.
*
* @param level the new log level
*/
setLogLevel(level) {
this.logger.setLevel(LogLevelConverter.levelToLog4Javascript(level));
}
/**
* Logs a message at level TRACE.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
trace(methodName, ...params) {
if (this.logger.isTraceEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.trace.apply(this.logger, args);
}
}
/**
* Logs a message at level DEBUG.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
debug(methodName, ...params) {
if (this.logger.isDebugEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.debug.apply(this.logger, args);
}
}
/**
* Logs a message at level INFO.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
info(methodName, ...params) {
if (this.logger.isInfoEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.info.apply(this.logger, args);
}
}
/**
* Logs a message at level WARN.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
warn(methodName, ...params) {
if (this.logger.isWarnEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.warn.apply(this.logger, args);
}
}
/**
* Logs a message at level ERROR.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
error(methodName, ...params) {
if (this.logger.isErrorEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.error.apply(this.logger, args);
}
}
/**
* Logs a message at level FATAL.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
fatal(methodName, ...params) {
if (this.logger.isFatalEnabled()) {
const args = [methodName];
for (const param of params) {
args.push(this.formatArgument(param));
}
this.logger.fatal.apply(this.logger, args);
}
}
/**
* Logs the entry into a method.
* The method name will be logged at level INFO, the parameters at level DEBUG.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
entry(methodName, ...params) {
if (this.logger.isInfoEnabled()) {
const args = [methodName, "entry"];
if (this.logger.isDebugEnabled()) {
for (const param of params) {
args.push(this.formatArgument(param));
}
}
this.logger.info.apply(this.logger, args);
}
}
/**
* Logs the exit of a method.
* The method name will be logged at level INFO, the parameters at level DEBUG.
*
* @param methodName name of the method
* @param params optional parameters to be logged; objects will be formatted as JSON
*/
exit(methodName, ...params) {
if (this.logger.isInfoEnabled()) {
const args = [methodName, "exit"];
if (this.logger.isDebugEnabled()) {
for (const param of params) {
args.push(this.formatArgument(param));
}
}
this.logger.info.apply(this.logger, args);
}
}
/**
* Formats the given argument.
*/
formatArgument(arg) {
if (typeof arg === "string") {
return arg;
}
else if (typeof arg === "number") {
return arg.toString();
}
else if (arg instanceof Error) {
// JSON.stringify() returns here "{ }"
return arg.toString();
}
else {
try {
return JSON.stringify(arg);
}
catch (e) {
return e.message;
}
}
}
/**
* Returns the internal Logger (for unit tests only).
*/
getInternalLogger() {
return this.logger;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy1zZXJ2aWNlL3NyYy9saWIvbG9nZ2VyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQUlsQjs7T0FFRztJQUNILFlBQVksTUFBcUI7UUFDaEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNqQixPQUFPLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxLQUFlO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFVBQWtCLEVBQUUsR0FBRyxNQUFhO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVB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QUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0YsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsR0FBUTtRQUM3QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQ2pDLHNDQUFzQztZQUN0QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2xCLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBsb2c0amF2YXNjcmlwdCBmcm9tIFwibG9nNGphdmFzY3JpcHRcIjtcblxuaW1wb3J0IHsgTG9nTGV2ZWxDb252ZXJ0ZXIgfSBmcm9tIFwiLi9sb2ctbGV2ZWwuY29udmVydGVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZy1sZXZlbC5tb2RlbFwiO1xuXG4vKipcbiAqIExvZ2dlciBmb3Igd3JpdGluZyBsb2cgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuXG5cdHByaXZhdGUgbG9nZ2VyOiBsb2c0amF2YXNjcmlwdC5Mb2dnZXI7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBsb2dnZXIuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihsb2dnZXI/OiBzdHJpbmcgfCBhbnkpIHtcblx0XHRpZiAodHlwZW9mIGxvZ2dlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBsb2c0amF2YXNjcmlwdC5nZXRSb290TG9nZ2VyKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbG9nZ2VyID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IGxvZzRqYXZhc2NyaXB0LmdldExvZ2dlcihsb2dnZXIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsb2cgbGV2ZWwuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuXHRcdHJldHVybiBMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21Mb2c0SmF2YXNjcmlwdCh0aGlzLmxvZ2dlci5nZXRMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGxvZyBsZXZlbC5cblx0ICpcblx0ICogQHBhcmFtIGxldmVsIHRoZSBuZXcgbG9nIGxldmVsXG5cdCAqL1xuXHRwdWJsaWMgc2V0TG9nTGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dnZXIuc2V0TGV2ZWwoTG9nTGV2ZWxDb252ZXJ0ZXIubGV2ZWxUb0xvZzRKYXZhc2NyaXB0KGxldmVsKSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyBhIG1lc3NhZ2UgYXQgbGV2ZWwgVFJBQ0UuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuXHQgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgbG9nZ2VkOyBvYmplY3RzIHdpbGwgYmUgZm9ybWF0dGVkIGFzIEpTT05cblx0ICovXG5cdHB1YmxpYyB0cmFjZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lXTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZS5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgYSBtZXNzYWdlIGF0IGxldmVsIERFQlVHLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgZGVidWcobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGFyZ3MgPSBbbWV0aG9kTmFtZV07XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0XHRhcmdzLnB1c2godGhpcy5mb3JtYXRBcmd1bWVudChwYXJhbSkpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2dnZXIuZGVidWcuYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBJTkZPLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgaW5mbyhtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmluZm8uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBXQVJOLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgd2FybihtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLndhcm4uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBFUlJPUi5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGVycm9yKG1ldGhvZE5hbWU6IHN0cmluZywgLi4ucGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yLmFwcGx5KHRoaXMubG9nZ2VyLCBhcmdzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyBhIG1lc3NhZ2UgYXQgbGV2ZWwgRkFUQUwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuXHQgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgbG9nZ2VkOyBvYmplY3RzIHdpbGwgYmUgZm9ybWF0dGVkIGFzIEpTT05cblx0ICovXG5cdHB1YmxpYyBmYXRhbChtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lXTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci5mYXRhbC5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIGVudHJ5IGludG8gYSBtZXRob2QuXG5cdCAqIFRoZSBtZXRob2QgbmFtZSB3aWxsIGJlIGxvZ2dlZCBhdCBsZXZlbCBJTkZPLCB0aGUgcGFyYW1ldGVycyBhdCBsZXZlbCBERUJVRy5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGVudHJ5KG1ldGhvZE5hbWU6IHN0cmluZywgLi4ucGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGFyZ3MgPSBbbWV0aG9kTmFtZSwgXCJlbnRyeVwiXTtcblx0XHRcdGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mby5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIGV4aXQgb2YgYSBtZXRob2QuXG5cdCAqIFRoZSBtZXRob2QgbmFtZSB3aWxsIGJlIGxvZ2dlZCBhdCBsZXZlbCBJTkZPLCB0aGUgcGFyYW1ldGVycyBhdCBsZXZlbCBERUJVRy5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGV4aXQobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lLCBcImV4aXRcIl07XG5cdFx0XHRpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmluZm8uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGb3JtYXRzIHRoZSBnaXZlbiBhcmd1bWVudC5cblx0ICovXG5cdHB1YmxpYyBmb3JtYXRBcmd1bWVudChhcmc6IGFueSk6IHN0cmluZyB7XG5cdFx0aWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRyZXR1cm4gYXJnLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0Ly8gSlNPTi5zdHJpbmdpZnkoKSByZXR1cm5zIGhlcmUgXCJ7IH1cIlxuXHRcdFx0cmV0dXJuIGFyZy50b1N0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaW50ZXJuYWwgTG9nZ2VyIChmb3IgdW5pdCB0ZXN0cyBvbmx5KS5cblx0ICovXG5cdHB1YmxpYyBnZXRJbnRlcm5hbExvZ2dlcigpOiBsb2c0amF2YXNjcmlwdC5Mb2dnZXIge1xuXHRcdHJldHVybiB0aGlzLmxvZ2dlcjtcblx0fVxufVxuIl19