@ng-log/log4a
Version:
A powerful and customizable logging library for Angular application.
164 lines • 22.4 kB
JavaScript
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { AppenderService } from './appender-impl.service';
import * as i0 from "@angular/core";
import * as i1 from "./appender-impl.service";
import * as i2 from "@angular/common/http";
const PUBLISHERS_FILE = 'assets/logging-config.json';
export class Log4a {
constructor(appenderService, http) {
this.appenderService = appenderService;
this.http = http;
// tslint:disable-next-line: no-use-before-declare
this.level = LogLevel.All;
this.logWithDate = true;
this.abstractAppenders = appenderService.appenders;
}
async loadConfigs() {
const loggerOption = this.appenderService.getQueryParams('logger-option');
if (loggerOption !== '') {
this.appenderService.loadRuntimeConfig();
}
else {
this.http
.get(PUBLISHERS_FILE).subscribe((res) => {
this.appenderService.loadConfig(res);
});
}
}
debug(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.Debug, optionalParams);
}
info(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.Info, optionalParams);
}
warn(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.Warn, optionalParams);
}
error(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.Error, optionalParams);
}
fatal(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.Fatal, optionalParams);
}
log(msg, ...optionalParams) {
// tslint:disable-next-line: no-use-before-declare
this.writeToLog(msg, LogLevel.All, optionalParams);
}
clear() {
for (const logger of this.abstractAppenders) {
logger.clear().subscribe((response) => console.log(response));
}
}
shouldLog(level) {
let ret = false;
if (
// tslint:disable-next-line: no-use-before-declare
(level >= this.level && level !== LogLevel.Off) ||
// tslint:disable-next-line: no-use-before-declare
this.level === LogLevel.All) {
ret = true;
}
return ret;
}
writeToLog(msg, level, params) {
if (this.shouldLog(level)) {
// Declare variables
// tslint:disable-next-line: no-use-before-declare
const entry = new LogEntry();
// Build Log Entry
entry.message = msg;
entry.level = level;
entry.extraInfo = params;
entry.logWithDate = this.logWithDate;
for (const logger of this.abstractAppenders) {
logger.log(entry);
// .subscribe(response => console.log(response));
}
}
}
}
/** @nocollapse */ Log4a.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a, deps: [{ token: i1.AppenderService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ Log4a.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Log4a, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.AppenderService }, { type: i2.HttpClient }]; } });
export var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["All"] = 0] = "All";
LogLevel[LogLevel["Debug"] = 1] = "Debug";
LogLevel[LogLevel["Info"] = 2] = "Info";
LogLevel[LogLevel["Warn"] = 3] = "Warn";
LogLevel[LogLevel["Error"] = 4] = "Error";
LogLevel[LogLevel["Fatal"] = 5] = "Fatal";
LogLevel[LogLevel["Off"] = 6] = "Off";
})(LogLevel || (LogLevel = {}));
export class LogEntry {
constructor() {
// Public Properties
this.entryDate = new Date();
this.message = '';
this.level = LogLevel.Debug;
this.extraInfo = [];
this.logWithDate = true;
}
// **************
// Public Methods
// **************
buildLogString() {
let value = '';
if (this.logWithDate) {
value = new Date() + '';
}
// value += "Type: " + LogLevel[this.level];
value += ' - Message: ' + this.message;
if (this.extraInfo.length) {
value += ' - Extra Info: ' + this.formatParams(this.extraInfo);
}
switch (LogLevel[this.level]) {
case 'Debug':
// tslint:disable-next-line: no-console
console.debug('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid blue; font-weight: 900;color:blue');
break;
case 'Info':
// tslint:disable-next-line: no-console
console.info('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom:1px solid blue; font-weight: 900;color:blue');
break;
case 'Warn':
console.warn('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: black; background: orange; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid orange; font-weight: 900; ');
break;
case 'Error':
console.error('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: white; background: red; color: white; display: block; font-weight: bold;', 'background: ;border-bottom: 1px solid red; font-weight: 900; color:red');
break;
case 'Fatal':
console.error('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: white; background: red; color: white; display: block; font-weight: bold;', 'background: ;border-bottom: 1px solid red; font-weight: 900; color:red');
break;
case 'All':
// tslint:disable-next-line: no-console
console.info('%c Type: [' + LogLevel[this.level] + ']%c' + value, ' border-bottom-color: blue; background: blue; color: white; display: block; font-weight: bold;', 'background: white;border-bottom: 1px solid blue; font-weight: 900;color:blue');
break;
}
// return value;
}
// ***************
// Private Methods
// ***************
formatParams(params) {
let ret = params.join(',');
// Is there at least one object in the array?
if (params.some(p => typeof p === 'object')) {
ret = '';
// Build comma-delimited string
for (const item of params) {
ret += JSON.stringify(item) + ',';
}
}
return ret;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nNGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWxvZy9sb2c0YS9zcmMvbGliL2xvZzRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBRTFELE1BQU0sZUFBZSxHQUFHLDRCQUE0QixDQUFDO0FBR3JELE1BQU0sT0FBTyxLQUFLO0lBS2hCLFlBQ1MsZUFBZ0MsRUFDaEMsSUFBZ0I7UUFEaEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFNBQUksR0FBSixJQUFJLENBQVk7UUFMekIsa0RBQWtEO1FBQ2xELFVBQUssR0FBYSxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBS2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUN0RCxlQUFlLENBQ2hCLENBQUM7UUFDRixJQUFJLFlBQVksS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFDO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSTtpQkFDTixHQUFHLENBQXNCLGVBQWUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQTtTQUNMO0lBQ0gsQ0FBQztJQUVE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QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRTtZQUMzQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ1QsK0JBQStCO1lBQy9CLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO2dCQUN6QixHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDbkM7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcHBlbmRlci1pbXBsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIExvZ0FwcGVuZGVyQ29uZmlnIH0gZnJvbSAnLi9sb2c0YS5tb2RlbCc7XG5jb25zdCBQVUJMSVNIRVJTX0ZJTEUgPSAnYXNzZXRzL2xvZ2dpbmctY29uZmlnLmpzb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9nNGEge1xuICBhYnN0cmFjdEFwcGVuZGVyczogQWJzdHJhY3RMb2dnZXJbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuQWxsO1xuICBsb2dXaXRoRGF0ZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhcHBlbmRlclNlcnZpY2U6IEFwcGVuZGVyU2VydmljZSxcbiAgICBwdWJsaWMgaHR0cDogSHR0cENsaWVudFxuICApIHtcbiAgICB0aGlzLmFic3RyYWN0QXBwZW5kZXJzID0gYXBwZW5kZXJTZXJ2aWNlLmFwcGVuZGVycztcbiAgfVxuXG4gIGFzeW5jIGxvYWRDb25maWdzKCkge1xuICAgIGNvbnN0IGxvZ2dlck9wdGlvbiA9IHRoaXMuYXBwZW5kZXJTZXJ2aWNlLmdldFF1ZXJ5UGFyYW1zKFxuICAgICAgJ2xvZ2dlci1vcHRpb24nXG4gICAgKTtcbiAgICBpZiAobG9nZ2VyT3B0aW9uICE9PSAnJykge1xuICAgICAgdGhpcy5hcHBlbmRlclNlcnZpY2UubG9hZFJ1bnRpbWVDb25maWcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5nZXQ8TG9nQXBwZW5kZXJDb25maWdbXT4oUFVCTElTSEVSU19GSUxFKS5zdWJzY3JpYmUoKHJlcyk9PiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRlclNlcnZpY2UubG9hZENvbmZpZyhyZXMpO1xuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGRlYnVnKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkRlYnVnLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBpbmZvKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkluZm8sIG9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHdhcm4obXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuV2Fybiwgb3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgZXJyb3IobXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuRXJyb3IsIG9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIGZhdGFsKG1zZzogc3RyaW5nLCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgIHRoaXMud3JpdGVUb0xvZyhtc2csIExvZ0xldmVsLkZhdGFsLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBsb2cobXNnOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdXNlLWJlZm9yZS1kZWNsYXJlXG4gICAgdGhpcy53cml0ZVRvTG9nKG1zZywgTG9nTGV2ZWwuQWxsLCBvcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxvZ2dlciBvZiB0aGlzLmFic3RyYWN0QXBwZW5kZXJzKSB7XG4gICAgICBsb2dnZXIuY2xlYXIoKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IGNvbnNvbGUubG9nKHJlc3BvbnNlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2cobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldCA9IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgICAgIChsZXZlbCA+PSB0aGlzLmxldmVsICYmIGxldmVsICE9PSBMb2dMZXZlbC5PZmYpIHx8XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgICAgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuQWxsXG4gICAgKSB7XG4gICAgICByZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIHdyaXRlVG9Mb2cobXNnOiBzdHJpbmcsIGxldmVsOiBMb2dMZXZlbCwgcGFyYW1zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIC8vIERlY2xhcmUgdmFyaWFibGVzXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0gbmV3IExvZ0VudHJ5KCk7XG5cbiAgICAgIC8vIEJ1aWxkIExvZyBFbnRyeVxuICAgICAgZW50cnkubWVzc2FnZSA9IG1zZztcbiAgICAgIGVudHJ5LmxldmVsID0gbGV2ZWw7XG4gICAgICBlbnRyeS5leHRyYUluZm8gPSBwYXJhbXM7XG4gICAgICBlbnRyeS5sb2dXaXRoRGF0ZSA9IHRoaXMubG9nV2l0aERhdGU7XG5cbiAgICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIHRoaXMuYWJzdHJhY3RBcHBlbmRlcnMpIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhlbnRyeSk7XG4gICAgICAgIC8vIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4gY29uc29sZS5sb2cocmVzcG9uc2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBBbGwgPSAwLFxuICBEZWJ1ZyA9IDEsXG4gIEluZm8gPSAyLFxuICBXYXJuID0gMyxcbiAgRXJyb3IgPSA0LFxuICBGYXRhbCA9IDUsXG4gIE9mZiA9IDZcbn1cblxuZXhwb3J0IGNsYXNzIExvZ0VudHJ5IHtcbiAgLy8gUHVibGljIFByb3BlcnRpZXNcbiAgZW50cnlEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgbWVzc2FnZSA9ICcnO1xuICBsZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5EZWJ1ZztcbiAgZXh0cmFJbmZvOiBhbnlbXSA9IFtdO1xuICBsb2dXaXRoRGF0ZSA9IHRydWU7XG5cbiAgLy8gKioqKioqKioqKioqKipcbiAgLy8gUHVibGljIE1ldGhvZHNcbiAgLy8gKioqKioqKioqKioqKipcbiAgYnVpbGRMb2dTdHJpbmcoKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gJyc7XG5cbiAgICBpZiAodGhpcy5sb2dXaXRoRGF0ZSkge1xuICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpICsgJyc7XG4gICAgfVxuICAgIC8vIHZhbHVlICs9IFwiVHlwZTogXCIgKyBMb2dMZXZlbFt0aGlzLmxldmVsXTtcbiAgICB2YWx1ZSArPSAnIC0gTWVzc2FnZTogJyArIHRoaXMubWVzc2FnZTtcbiAgICBpZiAodGhpcy5leHRyYUluZm8ubGVuZ3RoKSB7XG4gICAgICB2YWx1ZSArPSAnIC0gRXh0cmEgSW5mbzogJyArIHRoaXMuZm9ybWF0UGFyYW1zKHRoaXMuZXh0cmFJbmZvKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKExvZ0xldmVsW3RoaXMubGV2ZWxdKSB7XG4gICAgICBjYXNlICdEZWJ1Zyc6XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOiAxcHggc29saWQgYmx1ZTsgZm9udC13ZWlnaHQ6IDkwMDtjb2xvcjpibHVlJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0luZm8nOlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCBibHVlOyBmb250LXdlaWdodDogOTAwO2NvbG9yOmJsdWUnXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV2Fybic6XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnJWMgVHlwZTogWycgKyBMb2dMZXZlbFt0aGlzLmxldmVsXSArICddJWMnICsgdmFsdWUsXG4gICAgICAgICAgJyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogYmxhY2s7IGJhY2tncm91bmQ6IG9yYW5nZTsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAnYmFja2dyb3VuZDogd2hpdGU7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIG9yYW5nZTsgZm9udC13ZWlnaHQ6IDkwMDsgJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnJWMgVHlwZTogWycgKyBMb2dMZXZlbFt0aGlzLmxldmVsXSArICddJWMnICsgdmFsdWUsXG4gICAgICAgICAgJyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogd2hpdGU7IGJhY2tncm91bmQ6IHJlZDsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IGJvbGQ7JyxcbiAgICAgICAgICAnYmFja2dyb3VuZDogIDtib3JkZXItYm90dG9tOiAxcHggc29saWQgcmVkOyBmb250LXdlaWdodDogOTAwOyBjb2xvcjpyZWQnXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRmF0YWwnOlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZDogcmVkOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiAgO2JvcmRlci1ib3R0b206IDFweCBzb2xpZCByZWQ7IGZvbnQtd2VpZ2h0OiA5MDA7IGNvbG9yOnJlZCdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBbGwnOlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICclYyBUeXBlOiBbJyArIExvZ0xldmVsW3RoaXMubGV2ZWxdICsgJ10lYycgKyB2YWx1ZSxcbiAgICAgICAgICAnICBib3JkZXItYm90dG9tLWNvbG9yOiBibHVlOyBiYWNrZ3JvdW5kOiBibHVlOyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogYm9sZDsnLFxuICAgICAgICAgICdiYWNrZ3JvdW5kOiB3aGl0ZTtib3JkZXItYm90dG9tOiAxcHggc29saWQgYmx1ZTsgZm9udC13ZWlnaHQ6IDkwMDtjb2xvcjpibHVlJ1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyAqKioqKioqKioqKioqKipcbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIC8vICoqKioqKioqKioqKioqKlxuICBwcml2YXRlIGZvcm1hdFBhcmFtcyhwYXJhbXM6IGFueVtdKTogc3RyaW5nIHtcbiAgICBsZXQgcmV0OiBzdHJpbmcgPSBwYXJhbXMuam9pbignLCcpO1xuXG4gICAgLy8gSXMgdGhlcmUgYXQgbGVhc3Qgb25lIG9iamVjdCBpbiB0aGUgYXJyYXk/XG4gICAgaWYgKHBhcmFtcy5zb21lKHAgPT4gdHlwZW9mIHAgPT09ICdvYmplY3QnKSkge1xuICAgICAgcmV0ID0gJyc7XG4gICAgICAvLyBCdWlsZCBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyYW1zKSB7XG4gICAgICAgIHJldCArPSBKU09OLnN0cmluZ2lmeShpdGVtKSArICcsJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG4iXX0=