@decaf-ts/logging 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/logging.cjs +458 -125
- package/dist/logging.esm.cjs +454 -119
- package/lib/constants.cjs +116 -17
- package/lib/constants.d.ts +72 -10
- package/lib/esm/constants.d.ts +72 -10
- package/lib/esm/constants.js +115 -16
- package/lib/esm/index.d.ts +2 -5
- package/lib/esm/index.js +3 -6
- package/lib/esm/logging.d.ts +172 -19
- package/lib/esm/logging.js +353 -37
- package/lib/esm/types.d.ts +205 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/winston/index.d.ts +0 -0
- package/lib/esm/winston/index.js +2 -0
- package/lib/esm/winston/winston.d.ts +12 -0
- package/lib/esm/winston/winston.js +44 -0
- package/lib/index.cjs +3 -6
- package/lib/index.d.ts +2 -5
- package/lib/logging.cjs +354 -37
- package/lib/logging.d.ts +172 -19
- package/lib/types.cjs +3 -0
- package/lib/types.d.ts +205 -0
- package/lib/winston/index.cjs +2 -0
- package/lib/winston/index.d.ts +0 -0
- package/lib/winston/winston.cjs +52 -0
- package/lib/winston/winston.d.ts +12 -0
- package/package.json +6 -3
- package/lib/Factory.cjs +0 -10
- package/lib/Factory.d.ts +0 -13
- package/lib/default.cjs +0 -76
- package/lib/default.d.ts +0 -9
- package/lib/esm/Factory.d.ts +0 -13
- package/lib/esm/Factory.js +0 -6
- package/lib/esm/default.d.ts +0 -9
- package/lib/esm/default.js +0 -72
- package/lib/esm/interfaces.d.ts +0 -21
- package/lib/esm/interfaces.js +0 -2
- package/lib/esm/utils.d.ts +0 -2
- package/lib/esm/utils.js +0 -8
- package/lib/esm/winston.d.ts +0 -15
- package/lib/esm/winston.js +0 -38
- package/lib/interfaces.cjs +0 -3
- package/lib/interfaces.d.ts +0 -21
- package/lib/utils.cjs +0 -11
- package/lib/utils.d.ts +0 -2
- package/lib/winston.cjs +0 -75
- package/lib/winston.d.ts +0 -15
package/dist/logging.esm.cjs
CHANGED
|
@@ -1,145 +1,480 @@
|
|
|
1
|
+
import { style } from 'styled-string-builder';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @description Enum for log levels.
|
|
5
|
+
* @summary Defines different levels of logging for the application.
|
|
6
|
+
* @enum {string}
|
|
7
|
+
* @memberOf @decaf-ts/utils
|
|
8
|
+
*/
|
|
1
9
|
var LogLevel;
|
|
2
10
|
(function (LogLevel) {
|
|
3
|
-
|
|
4
|
-
LogLevel["
|
|
5
|
-
|
|
6
|
-
LogLevel["
|
|
7
|
-
|
|
8
|
-
LogLevel["
|
|
9
|
-
|
|
10
|
-
LogLevel["
|
|
11
|
+
/** Error events that are likely to cause problems. */
|
|
12
|
+
LogLevel["error"] = "error";
|
|
13
|
+
/** Routine information, such as ongoing status or performance. */
|
|
14
|
+
LogLevel["info"] = "info";
|
|
15
|
+
/** Additional relevant information. */
|
|
16
|
+
LogLevel["verbose"] = "verbose";
|
|
17
|
+
/** Debug or trace information. */
|
|
18
|
+
LogLevel["debug"] = "debug";
|
|
19
|
+
/** way too verbose or silly information. */
|
|
20
|
+
LogLevel["silly"] = "silly";
|
|
11
21
|
})(LogLevel || (LogLevel = {}));
|
|
22
|
+
/**
|
|
23
|
+
* @description Numeric values associated with log levels.
|
|
24
|
+
* @summary Provides a numeric representation of log levels for comparison and filtering.
|
|
25
|
+
* @const {Object} NumericLogLevels
|
|
26
|
+
* @property {number} error - Numeric value for error level (0).
|
|
27
|
+
* @property {number} info - Numeric value for info level (2).
|
|
28
|
+
* @property {number} verbose - Numeric value for verbose level (4).
|
|
29
|
+
* @property {number} debug - Numeric value for debug level (5).
|
|
30
|
+
* @property {number} silly - Numeric value for silly level (8).
|
|
31
|
+
* @memberOf @decaf-ts/utils
|
|
32
|
+
*/
|
|
12
33
|
const NumericLogLevels = {
|
|
13
|
-
error:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
34
|
+
error: 2,
|
|
35
|
+
info: 4,
|
|
36
|
+
verbose: 6,
|
|
37
|
+
debug: 7,
|
|
38
|
+
silly: 9,
|
|
39
|
+
};
|
|
40
|
+
var LoggingMode;
|
|
41
|
+
(function (LoggingMode) {
|
|
42
|
+
LoggingMode["RAW"] = "raw";
|
|
43
|
+
LoggingMode["JSON"] = "json";
|
|
44
|
+
})(LoggingMode || (LoggingMode = {}));
|
|
45
|
+
/**
|
|
46
|
+
* @description Default theme for styling log output.
|
|
47
|
+
* @summary Defines the default color and style settings for various components of log messages.
|
|
48
|
+
* @const DefaultTheme
|
|
49
|
+
* @typedef {Theme} DefaultTheme
|
|
50
|
+
* @property {Object} class - Styling for class names.
|
|
51
|
+
* @property {number} class.fg - Foreground color code for class names (4).
|
|
52
|
+
* @property {Object} id - Styling for identifiers.
|
|
53
|
+
* @property {number} id.fg - Foreground color code for identifiers (36).
|
|
54
|
+
* @property {Object} stack - Styling for stack traces (empty object).
|
|
55
|
+
* @property {Object} timestamp - Styling for timestamps (empty object).
|
|
56
|
+
* @property {Object} message - Styling for different types of messages.
|
|
57
|
+
* @property {Object} message.error - Styling for error messages.
|
|
58
|
+
* @property {number} message.error.fg - Foreground color code for error messages (34).
|
|
59
|
+
* @property {Object} method - Styling for method names (empty object).
|
|
60
|
+
* @property {Object} logLevel - Styling for different log levels.
|
|
61
|
+
* @property {Object} logLevel.error - Styling for error level logs.
|
|
62
|
+
* @property {number} logLevel.error.fg - Foreground color code for error level logs (6).
|
|
63
|
+
* @property {Object} logLevel.info - Styling for info level logs (empty object).
|
|
64
|
+
* @property {Object} logLevel.verbose - Styling for verbose level logs (empty object).
|
|
65
|
+
* @property {Object} logLevel.debug - Styling for debug level logs.
|
|
66
|
+
* @property {number} logLevel.debug.fg - Foreground color code for debug level logs (7).
|
|
67
|
+
* @memberOf @decaf-ts/utils
|
|
68
|
+
*/
|
|
69
|
+
const DefaultTheme = {
|
|
70
|
+
class: {
|
|
71
|
+
fg: 34,
|
|
72
|
+
},
|
|
73
|
+
id: {
|
|
74
|
+
fg: 36,
|
|
75
|
+
},
|
|
76
|
+
stack: {},
|
|
77
|
+
timestamp: {},
|
|
78
|
+
message: {
|
|
79
|
+
error: {
|
|
80
|
+
fg: 31,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
method: {},
|
|
84
|
+
logLevel: {
|
|
85
|
+
error: {
|
|
86
|
+
fg: 31,
|
|
87
|
+
style: ["bold"],
|
|
88
|
+
},
|
|
89
|
+
info: {},
|
|
90
|
+
verbose: {},
|
|
91
|
+
debug: {
|
|
92
|
+
fg: 33,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* @description Default configuration for logging.
|
|
98
|
+
* @summary Defines the default settings for the logging system, including verbosity, log level, styling, and timestamp format.
|
|
99
|
+
* @const DefaultLoggingConfig
|
|
100
|
+
* @typedef {LoggingConfig} DefaultLoggingConfig
|
|
101
|
+
* @property {number} verbose - Verbosity level (0).
|
|
102
|
+
* @property {LogLevel} level - Default log level (LogLevel.info).
|
|
103
|
+
* @property {boolean} style - Whether to apply styling to log output (false).
|
|
104
|
+
* @property {boolean} timestamp - Whether to include timestamps in log messages (true).
|
|
105
|
+
* @property {string} timestampFormat - Format for timestamps ("HH:mm:ss.SSS").
|
|
106
|
+
* @property {boolean} context - Whether to include context information in log messages (true).
|
|
107
|
+
* @property {Theme} theme - The theme to use for styling log messages (DefaultTheme).
|
|
108
|
+
* @memberOf @decaf-ts/utils
|
|
109
|
+
*/
|
|
110
|
+
const DefaultLoggingConfig = {
|
|
111
|
+
verbose: 0,
|
|
112
|
+
level: LogLevel.info,
|
|
113
|
+
logLevel: true,
|
|
114
|
+
mode: LoggingMode.RAW,
|
|
115
|
+
style: false,
|
|
116
|
+
separator: " - ",
|
|
117
|
+
timestamp: true,
|
|
118
|
+
timestampFormat: "HH:mm:ss.SSS",
|
|
119
|
+
context: true,
|
|
120
|
+
theme: DefaultTheme,
|
|
20
121
|
};
|
|
21
122
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
123
|
+
/**
|
|
124
|
+
* @description A minimal logger implementation.
|
|
125
|
+
* @summary MiniLogger is a lightweight logging class that implements the VerbosityLogger interface.
|
|
126
|
+
* It provides basic logging functionality with support for different log levels and verbosity.
|
|
127
|
+
*
|
|
128
|
+
* @class
|
|
129
|
+
*/
|
|
130
|
+
class MiniLogger {
|
|
131
|
+
/**
|
|
132
|
+
* @description Creates a new MiniLogger instance.
|
|
133
|
+
* @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
|
|
134
|
+
*
|
|
135
|
+
* @param context - The name of the class using this logger.
|
|
136
|
+
* @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
|
|
137
|
+
* @param [id] - Optional unique identifier for the logger instance.
|
|
138
|
+
*/
|
|
139
|
+
constructor(context, conf, id) {
|
|
140
|
+
this.context = context;
|
|
141
|
+
this.conf = conf;
|
|
142
|
+
this.id = id;
|
|
25
143
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return NumericLogLevels[level.toString()];
|
|
144
|
+
config(key) {
|
|
145
|
+
if (this.conf && key in this.conf)
|
|
146
|
+
return this.conf[key];
|
|
147
|
+
return Logging.getConfig()[key];
|
|
31
148
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
149
|
+
for(method, config) {
|
|
150
|
+
method = method
|
|
151
|
+
? typeof method === "string"
|
|
152
|
+
? method
|
|
153
|
+
: method.name
|
|
154
|
+
: undefined;
|
|
155
|
+
return Logging.for([this.context, method].join("."), this.id, config);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* @description Creates a formatted log string.
|
|
159
|
+
* @summary Generates a log string with timestamp, colored log level, and message.
|
|
160
|
+
*
|
|
161
|
+
* @param level - The log level as a string.
|
|
162
|
+
* @param message
|
|
163
|
+
* @param stack
|
|
164
|
+
* @return A formatted log string.
|
|
165
|
+
*/
|
|
166
|
+
createLog(level, message, stack) {
|
|
167
|
+
const log = [];
|
|
168
|
+
const style = this.config("style");
|
|
169
|
+
if (this.config("timestamp")) {
|
|
170
|
+
const date = new Date().toISOString();
|
|
171
|
+
const timestamp = style ? Logging.theme(date, "timestamp", level) : date;
|
|
172
|
+
log.push(timestamp);
|
|
173
|
+
}
|
|
174
|
+
if (this.config("logLevel")) {
|
|
175
|
+
const lvl = style
|
|
176
|
+
? Logging.theme(level, "logLevel", level)
|
|
177
|
+
: level;
|
|
178
|
+
log.push(lvl);
|
|
179
|
+
}
|
|
180
|
+
if (this.config("context")) {
|
|
181
|
+
const context = style
|
|
182
|
+
? Logging.theme(this.context, "class", level)
|
|
183
|
+
: this.context;
|
|
184
|
+
log.push(context);
|
|
185
|
+
}
|
|
186
|
+
if (this.id) {
|
|
187
|
+
{
|
|
188
|
+
const id = style
|
|
189
|
+
? Logging.theme(this.id, "id", level)
|
|
190
|
+
: this.id;
|
|
191
|
+
log.push(id);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const msg = style
|
|
195
|
+
? Logging.theme(typeof message === "string" ? message : message.message, "message", level)
|
|
196
|
+
: typeof message === "string"
|
|
197
|
+
? message
|
|
198
|
+
: message.message;
|
|
199
|
+
log.push(msg);
|
|
200
|
+
if (stack || message instanceof Error) {
|
|
201
|
+
stack = style
|
|
202
|
+
? Logging.theme((stack || message.stack), "stack", level)
|
|
203
|
+
: stack;
|
|
204
|
+
log.push(`\nStack trace:\n${stack}`);
|
|
205
|
+
}
|
|
206
|
+
return log.join(this.config("separator"));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @description Logs a message with the specified log level.
|
|
210
|
+
* @summary Checks if the message should be logged based on the current log level,
|
|
211
|
+
* then uses the appropriate console method to output the log.
|
|
212
|
+
*
|
|
213
|
+
* @param level - The log level of the message.
|
|
214
|
+
* @param msg - The message to be logged.
|
|
215
|
+
* @param stack
|
|
216
|
+
*/
|
|
217
|
+
log(level, msg, stack) {
|
|
218
|
+
if (NumericLogLevels[this.config("level")] <
|
|
219
|
+
NumericLogLevels[level])
|
|
43
220
|
return;
|
|
44
|
-
|
|
45
|
-
const msg = `${profile ? `[${profile}]` : ""}${app ? `[${app}]` : ""}${context ? `[${context}]` : ""}${this.clazz ? `[${this.clazz}]` : ""}${this.method ? `[${this.method}]` : ""} ${message}`;
|
|
221
|
+
let method;
|
|
46
222
|
switch (level) {
|
|
47
|
-
case LogLevel.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
case LogLevel.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
case LogLevel.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
case LogLevel.Silly:
|
|
58
|
-
return console.debug(msg);
|
|
223
|
+
case LogLevel.info:
|
|
224
|
+
method = console.log;
|
|
225
|
+
break;
|
|
226
|
+
case LogLevel.verbose:
|
|
227
|
+
case LogLevel.debug:
|
|
228
|
+
method = console.debug;
|
|
229
|
+
break;
|
|
230
|
+
case LogLevel.error:
|
|
231
|
+
method = console.error;
|
|
232
|
+
break;
|
|
59
233
|
default:
|
|
60
|
-
throw new Error(
|
|
234
|
+
throw new Error("Invalid log level");
|
|
61
235
|
}
|
|
236
|
+
method(this.createLog(level, msg, stack));
|
|
62
237
|
}
|
|
63
|
-
|
|
64
|
-
|
|
238
|
+
/**
|
|
239
|
+
* @description LLogs a `way too verbose` or a silly message.
|
|
240
|
+
* @summary Logs a message at the Silly level if the current verbosity allows it.
|
|
241
|
+
*
|
|
242
|
+
* @param msg - The message to be logged.
|
|
243
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
244
|
+
*/
|
|
245
|
+
silly(msg, verbosity = 0) {
|
|
246
|
+
if (this.config("verbose") >= verbosity)
|
|
247
|
+
this.log(LogLevel.verbose, msg);
|
|
65
248
|
}
|
|
66
|
-
|
|
67
|
-
|
|
249
|
+
/**
|
|
250
|
+
* @description Logs a verbose message.
|
|
251
|
+
* @summary Logs a message at the Verbose level if the current verbosity allows it.
|
|
252
|
+
*
|
|
253
|
+
* @param msg - The message to be logged.
|
|
254
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
255
|
+
*/
|
|
256
|
+
verbose(msg, verbosity = 0) {
|
|
257
|
+
if (this.config("verbose") >= verbosity)
|
|
258
|
+
this.log(LogLevel.verbose, msg);
|
|
68
259
|
}
|
|
69
|
-
|
|
70
|
-
|
|
260
|
+
/**
|
|
261
|
+
* @description Logs an info message.
|
|
262
|
+
* @summary Logs a message at the Info level.
|
|
263
|
+
*
|
|
264
|
+
* @param msg - The message to be logged.
|
|
265
|
+
*/
|
|
266
|
+
info(msg) {
|
|
267
|
+
this.log(LogLevel.info, msg);
|
|
71
268
|
}
|
|
72
|
-
|
|
73
|
-
|
|
269
|
+
/**
|
|
270
|
+
* @description Logs a debug message.
|
|
271
|
+
* @summary Logs a message at the Debug level.
|
|
272
|
+
*
|
|
273
|
+
* @param msg - The message to be logged.
|
|
274
|
+
*/
|
|
275
|
+
debug(msg) {
|
|
276
|
+
this.log(LogLevel.debug, msg);
|
|
74
277
|
}
|
|
75
|
-
|
|
76
|
-
|
|
278
|
+
/**
|
|
279
|
+
* @description Logs an error message.
|
|
280
|
+
* @summary Logs a message at the Error level.
|
|
281
|
+
*
|
|
282
|
+
* @param msg - The message to be logged.
|
|
283
|
+
*/
|
|
284
|
+
error(msg) {
|
|
285
|
+
this.log(LogLevel.error, msg);
|
|
77
286
|
}
|
|
78
|
-
|
|
79
|
-
|
|
287
|
+
setConfig(config) {
|
|
288
|
+
this.conf = { ...(this.conf || {}), ...config };
|
|
80
289
|
}
|
|
81
|
-
|
|
82
|
-
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* @description A static class for managing logging operations.
|
|
293
|
+
* @summary The Logging class provides a centralized logging mechanism with support for
|
|
294
|
+
* different log levels and verbosity. It uses a singleton pattern to maintain a global
|
|
295
|
+
* logger instance and allows creating specific loggers for different classes and methods.
|
|
296
|
+
*
|
|
297
|
+
* @class
|
|
298
|
+
*/
|
|
299
|
+
class Logging {
|
|
300
|
+
/**
|
|
301
|
+
* @description Factory function for creating logger instances.
|
|
302
|
+
* @summary A function that creates new VerbosityLogger instances. By default, it creates a MiniLogger.
|
|
303
|
+
*/
|
|
304
|
+
static { this._factory = (object, config, id) => {
|
|
305
|
+
return new MiniLogger(object, config, id);
|
|
306
|
+
}; }
|
|
307
|
+
/**
|
|
308
|
+
* @description Configuration for the logging system.
|
|
309
|
+
* @summary Stores the global verbosity level and log level settings.
|
|
310
|
+
*/
|
|
311
|
+
static { this._config = DefaultLoggingConfig; }
|
|
312
|
+
/**
|
|
313
|
+
* @description Private constructor to prevent instantiation.
|
|
314
|
+
* @summary Ensures that the Logging class cannot be instantiated as it's designed to be used statically.
|
|
315
|
+
*/
|
|
316
|
+
constructor() { }
|
|
317
|
+
setFactory(factory) {
|
|
318
|
+
Logging._factory = factory;
|
|
83
319
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
320
|
+
/**
|
|
321
|
+
* @description Setter for the logging configuration.
|
|
322
|
+
* @summary Allows updating the global logging configuration.
|
|
323
|
+
*
|
|
324
|
+
* @param config - An object containing verbosity and log level settings.
|
|
325
|
+
*/
|
|
326
|
+
static setConfig(config) {
|
|
327
|
+
Object.assign(this._config, config);
|
|
87
328
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
constructor(level) {
|
|
91
|
-
super(level);
|
|
329
|
+
static getConfig() {
|
|
330
|
+
return Object.assign({}, this._config);
|
|
92
331
|
}
|
|
93
|
-
|
|
94
|
-
|
|
332
|
+
/**
|
|
333
|
+
* @description Retrieves or creates the global logger instance.
|
|
334
|
+
* @summary Returns the existing global logger or creates a new one if it doesn't exist.
|
|
335
|
+
*
|
|
336
|
+
* @return The global VerbosityLogger instance.
|
|
337
|
+
*/
|
|
338
|
+
static get() {
|
|
339
|
+
this.global = this.global ? this.global : this._factory("Logging");
|
|
340
|
+
return this.global;
|
|
95
341
|
}
|
|
96
|
-
|
|
97
|
-
|
|
342
|
+
/**
|
|
343
|
+
* @description Logs a verbose message.
|
|
344
|
+
* @summary Delegates the verbose logging to the global logger instance.
|
|
345
|
+
*
|
|
346
|
+
* @param msg - The message to be logged.
|
|
347
|
+
* @param verbosity - The verbosity level of the message (default: 0).
|
|
348
|
+
*/
|
|
349
|
+
static verbose(msg, verbosity = 0) {
|
|
350
|
+
return this.get().verbose(msg, verbosity);
|
|
98
351
|
}
|
|
99
|
-
|
|
100
|
-
|
|
352
|
+
/**
|
|
353
|
+
* @description Logs an info message.
|
|
354
|
+
* @summary Delegates the info logging to the global logger instance.
|
|
355
|
+
*
|
|
356
|
+
* @param msg - The message to be logged.
|
|
357
|
+
*/
|
|
358
|
+
static info(msg) {
|
|
359
|
+
return this.get().info(msg);
|
|
101
360
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
static
|
|
109
|
-
|
|
110
|
-
static get level() {
|
|
111
|
-
return this._level;
|
|
112
|
-
}
|
|
113
|
-
static set level(level) {
|
|
114
|
-
this._level = level;
|
|
115
|
-
}
|
|
116
|
-
static get instance() {
|
|
117
|
-
if (!this._instance)
|
|
118
|
-
this._instance = new this._factory(Logging.level);
|
|
119
|
-
return this._instance;
|
|
120
|
-
}
|
|
121
|
-
static set factory(factory) {
|
|
122
|
-
this._factory = factory;
|
|
123
|
-
}
|
|
124
|
-
static forClass(clazz) {
|
|
125
|
-
const name = clazz.name;
|
|
126
|
-
if (!(name in this.cacheByClass))
|
|
127
|
-
this.cacheByClass[name] = Logging.instance.forClass(clazz);
|
|
128
|
-
return this.cacheByClass[name];
|
|
129
|
-
}
|
|
130
|
-
static forMethod(clazz, method) {
|
|
131
|
-
const name = clazz.name;
|
|
132
|
-
if (!(name in this.cacheByClassMethod))
|
|
133
|
-
this.cacheByClassMethod[name] = {};
|
|
134
|
-
const methodName = typeof method === "string" ? method : method.name;
|
|
135
|
-
if (!(methodName in this.cacheByClassMethod[name]))
|
|
136
|
-
this.cacheByClassMethod[name][methodName] = Logging.instance.forMethod(clazz, method);
|
|
137
|
-
return this.cacheByClassMethod[name][methodName];
|
|
361
|
+
/**
|
|
362
|
+
* @description Logs a debug message.
|
|
363
|
+
* @summary Delegates the debug logging to the global logger instance.
|
|
364
|
+
*
|
|
365
|
+
* @param msg - The message to be logged.
|
|
366
|
+
*/
|
|
367
|
+
static debug(msg) {
|
|
368
|
+
return this.get().debug(msg);
|
|
138
369
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
370
|
+
/**
|
|
371
|
+
* @description Logs a silly message.
|
|
372
|
+
* @summary Delegates the debug logging to the global logger instance.
|
|
373
|
+
*
|
|
374
|
+
* @param msg - The message to be logged.
|
|
375
|
+
*/
|
|
376
|
+
static silly(msg) {
|
|
377
|
+
return this.get().silly(msg);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* @description Logs an error message.
|
|
381
|
+
* @summary Delegates the error logging to the global logger instance.
|
|
382
|
+
*
|
|
383
|
+
* @param msg - The message to be logged.
|
|
384
|
+
*/
|
|
385
|
+
static error(msg) {
|
|
386
|
+
return this.get().error(msg);
|
|
387
|
+
}
|
|
388
|
+
static for(object, id, config) {
|
|
389
|
+
object = typeof object === "string" ? object : object.name;
|
|
390
|
+
id = typeof id === "string" ? id : undefined;
|
|
391
|
+
config = typeof id === "object" ? id : config;
|
|
392
|
+
return this._factory(object, config, id);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* @description Creates a logger for a specific reason or context.
|
|
396
|
+
*
|
|
397
|
+
* @summary This static method creates a new logger instance using the factory function,
|
|
398
|
+
* based on a given reason or context.
|
|
399
|
+
*
|
|
400
|
+
* @param reason - A string describing the reason or context for creating this logger.
|
|
401
|
+
* @param id
|
|
402
|
+
* @returns A new VerbosityLogger or ClassLogger instance.
|
|
403
|
+
*/
|
|
404
|
+
static because(reason, id) {
|
|
405
|
+
return this._factory(reason, this._config, id);
|
|
406
|
+
}
|
|
407
|
+
static theme(text, type, loggerLevel, template = DefaultTheme) {
|
|
408
|
+
if (!this._config.style)
|
|
409
|
+
return text;
|
|
410
|
+
const logger = Logging.get().for(this.theme);
|
|
411
|
+
function apply(txt, option, value) {
|
|
412
|
+
try {
|
|
413
|
+
const t = txt;
|
|
414
|
+
let c = style(t);
|
|
415
|
+
function applyColor(val, isBg = false) {
|
|
416
|
+
let f = isBg ? c.background : c.foreground;
|
|
417
|
+
if (!Array.isArray(val)) {
|
|
418
|
+
return f.call(c, value);
|
|
419
|
+
}
|
|
420
|
+
switch (val.length) {
|
|
421
|
+
case 1:
|
|
422
|
+
f = isBg ? c.bgColor256 : c.color256;
|
|
423
|
+
return f(val[0]);
|
|
424
|
+
case 3:
|
|
425
|
+
f = isBg ? c.bgRgb : c.rgb;
|
|
426
|
+
return c.rgb(val[0], val[1], val[2]);
|
|
427
|
+
default:
|
|
428
|
+
logger.error(`Not a valid color option: ${option}`);
|
|
429
|
+
return style(t);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
function applyStyle(v) {
|
|
433
|
+
if (typeof v === "number") {
|
|
434
|
+
c = c.style(v);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
c = c[v];
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
switch (option) {
|
|
441
|
+
case "bg":
|
|
442
|
+
case "fg":
|
|
443
|
+
return applyColor(value).text;
|
|
444
|
+
case "style":
|
|
445
|
+
if (Array.isArray(value)) {
|
|
446
|
+
value.forEach(applyStyle);
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
applyStyle(value);
|
|
450
|
+
}
|
|
451
|
+
return c.text;
|
|
452
|
+
default:
|
|
453
|
+
logger.error(`Not a valid theme option: ${option}`);
|
|
454
|
+
return t;
|
|
455
|
+
}
|
|
456
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
457
|
+
}
|
|
458
|
+
catch (e) {
|
|
459
|
+
logger.error(`Error applying style: ${option} with value ${value}`);
|
|
460
|
+
return txt;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
const individualTheme = template[type];
|
|
464
|
+
if (!individualTheme || !Object.keys(individualTheme).length) {
|
|
465
|
+
return text;
|
|
466
|
+
}
|
|
467
|
+
let actualTheme = individualTheme;
|
|
468
|
+
const logLevels = Object.assign({}, LogLevel);
|
|
469
|
+
if (Object.keys(individualTheme)[0] in logLevels)
|
|
470
|
+
actualTheme =
|
|
471
|
+
individualTheme[loggerLevel] || {};
|
|
472
|
+
return Object.keys(actualTheme).reduce((acc, key) => {
|
|
473
|
+
const val = actualTheme[key];
|
|
474
|
+
if (val)
|
|
475
|
+
return apply(acc, key, val);
|
|
476
|
+
return acc;
|
|
477
|
+
}, text);
|
|
143
478
|
}
|
|
144
479
|
}
|
|
145
480
|
|
|
@@ -160,7 +495,7 @@ class Logging {
|
|
|
160
495
|
* @const VERSION
|
|
161
496
|
* @memberOf module:ts-workspace
|
|
162
497
|
*/
|
|
163
|
-
const VERSION = "0.
|
|
498
|
+
const VERSION = "0.2.0";
|
|
164
499
|
|
|
165
|
-
export {
|
|
166
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL0ZhY3RvcnkudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvZGVmYXVsdC50cyIsIi4uL3NyYy9sb2dnaW5nLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgRmF0YWwgPSBcImZhdGFsXCIsIC8vIEEgcGVyc29uIG11c3QgdGFrZSBhbiBhY3Rpb24gaW1tZWRpYXRlbHlcbiAgRXJyb3IgPSBcImVycm9yXCIsIC8vIEVycm9yIGV2ZW50cyBhcmUgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zXG4gIFdhcm4gPSBcIndhcm5cIiwgLy8gV2FybmluZyBldmVudHMgbWlnaHQgY2F1c2UgcHJvYmxlbXMgaW4gdGhlIGZ1dHVyZSBhbmQgZGVzZXJ2ZSBleWVzXG4gIEluZm8gPSBcImluZm9cIiwgLy8gUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZVxuICBIdHRwID0gXCJodHRwXCIsIC8vIEh0dHAgaW5mb3JtYXRpb25cbiAgVmVyYm9zZSA9IFwidmVyYm9zZVwiLCAvLyBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvblxuICBEZWJ1ZyA9IFwiZGVidWdcIiwgLy8gRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb25cbiAgU2lsbHkgPSBcInNpbGx5XCIsIC8vIERlYnVnIG9yIHRyYWNlIGluZm9ybWF0aW9uXG59XG5cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBlcnJvcjogMCxcbiAgd2FybjogMSxcbiAgaW5mbzogMixcbiAgaHR0cDogMyxcbiAgdmVyYm9zZTogNCxcbiAgZGVidWc6IDUsXG4gIHNpbGx5OiA2LFxufTtcbiIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJGYWN0b3J5IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBsZXZlbDogTG9nTGV2ZWwpIHt9XG4gIGFic3RyYWN0IGZvckNsYXNzKGNsYXp6OiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSk6IExvZ2dlcjtcbiAgYWJzdHJhY3QgZm9yTWV0aG9kKFxuICAgIGNsYXp6OiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogTG9nZ2VyO1xuICBhYnN0cmFjdCBnZXQoKTogTG9nZ2VyO1xufVxuIiwiaW1wb3J0IHsgTG9nTGV2ZWwsIE51bWVyaWNMb2dMZXZlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvTG9nTGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogbnVtYmVyIHtcbiAgaWYgKGxldmVsLnRvU3RyaW5nKCkgaW4gTnVtZXJpY0xvZ0xldmVscykge1xuICAgIHJldHVybiAoTnVtZXJpY0xvZ0xldmVscyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtsZXZlbC50b1N0cmluZygpXTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbGV2ZWw6ICR7bGV2ZWwudG9TdHJpbmcoKX1gKTtcbn1cbiIsImltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9GYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nRGF0YSwgTG9nZ2VyIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgdG9Mb2dMZXZlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHByb3RlY3RlZCBjbGF6ej86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgbWV0aG9kPzogc3RyaW5nXG4gICkge31cblxuICBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRvTG9nTGV2ZWwobGV2ZWwpIDwgdG9Mb2dMZXZlbCh0aGlzLmxldmVsKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBjb250ZXh0LCBhcHAgfSA9IGRhdGEgfHwge307XG5cbiAgICAgXG4gICAgY29uc3QgbXNnID0gYCR7cHJvZmlsZSA/IGBbJHtwcm9maWxlfV1gIDogXCJcIn0ke2FwcCA/IGBbJHthcHB9XWAgOiBcIlwifSR7Y29udGV4dCA/IGBbJHtjb250ZXh0fV1gIDogXCJcIn0ke3RoaXMuY2xhenogPyBgWyR7dGhpcy5jbGF6en1dYCA6IFwiXCJ9JHt0aGlzLm1ldGhvZCA/IGBbJHt0aGlzLm1ldGhvZH1dYCA6IFwiXCJ9ICR7bWVzc2FnZX1gO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICBjYXNlIExvZ0xldmVsLkZhdGFsOlxuICAgIGNhc2UgTG9nTGV2ZWwuRXJyb3I6XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihtc2cpO1xuICAgIGNhc2UgTG9nTGV2ZWwuV2FybjpcbiAgICAgIHJldHVybiBjb25zb2xlLndhcm4obXNnKTtcbiAgICBjYXNlIExvZ0xldmVsLkluZm86XG4gICAgICByZXR1cm4gY29uc29sZS5pbmZvKG1zZyk7XG4gICAgY2FzZSBMb2dMZXZlbC5IdHRwOlxuICAgIGNhc2UgTG9nTGV2ZWwuVmVyYm9zZTpcbiAgICBjYXNlIExvZ0xldmVsLkRlYnVnOlxuICAgIGNhc2UgTG9nTGV2ZWwuU2lsbHk6XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1Zyhtc2cpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbG9nIGxldmVsOiAke2xldmVsfWApO1xuICAgIH1cbiAgfVxuICBzaWxseShcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuU2lsbHksIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG5cbiAgdmVyYm9zZShcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuVmVyYm9zZSwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cblxuICBkZWJ1ZyhcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuRGVidWcsIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIGluZm8oXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubG9nKExvZ0xldmVsLkluZm8sIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIHdhcm4oXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuV2FybiwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cbiAgZXJyb3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuRXJyb3IsIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIGVtZXJnKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubG9nKExvZ0xldmVsLkZhdGFsLCBtZXNzYWdlLCBkYXRhLCBwcm9maWxlKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb2ZpbGUoaWQ6IHN0cmluZyB8IG51bWJlciwgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRMb2dnZXJGYWN0b3J5IGV4dGVuZHMgTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHN1cGVyKGxldmVsKTtcbiAgfVxuXG4gIGZvckNsYXNzKGNsYXp6OiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgRGVmYXVsdExvZ2dlcih0aGlzLmxldmVsLCBjbGF6ei5uYW1lKTtcbiAgfVxuICBmb3JNZXRob2QoXG4gICAgY2xheno6IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgICBtZXRob2Q6IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSlcbiAgKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRMb2dnZXIoXG4gICAgICB0aGlzLmxldmVsLFxuICAgICAgY2xhenoubmFtZSxcbiAgICAgIHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCIgPyBtZXRob2QgOiBtZXRob2QubmFtZVxuICAgICk7XG4gIH1cblxuICBnZXQoKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRMb2dnZXIodGhpcy5sZXZlbCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9GYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVmYXVsdExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9kZWZhdWx0XCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLkluZm87XG4gIHByaXZhdGUgc3RhdGljIF9mYWN0b3J5OiB7IG5ldyAobGV2ZWw6IExvZ0xldmVsKTogTG9nZ2VyRmFjdG9yeSB9ID1cbiAgICBEZWZhdWx0TG9nZ2VyRmFjdG9yeTtcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBMb2dnZXJGYWN0b3J5O1xuXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlQnlDbGFzczogUmVjb3JkPHN0cmluZywgTG9nZ2VyPiA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZUJ5Q2xhc3NNZXRob2Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIExvZ2dlcj4+ID1cbiAgICB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldCBsZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBzdGF0aWMgc2V0IGxldmVsKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBMb2dnZXJGYWN0b3J5IHtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB0aGlzLl9pbnN0YW5jZSA9IG5ldyB0aGlzLl9mYWN0b3J5KExvZ2dpbmcubGV2ZWwpO1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZmFjdG9yeShmYWN0b3J5OiB7IG5ldyAobGV2ZWw6IExvZ0xldmVsKTogTG9nZ2VyRmFjdG9yeSB9KSB7XG4gICAgdGhpcy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICBzdGF0aWMgZm9yQ2xhc3MoY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9KSB7XG4gICAgY29uc3QgbmFtZSA9IGNsYXp6Lm5hbWU7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLmNhY2hlQnlDbGFzcykpXG4gICAgICB0aGlzLmNhY2hlQnlDbGFzc1tuYW1lXSA9IExvZ2dpbmcuaW5zdGFuY2UuZm9yQ2xhc3MoY2xhenopO1xuICAgIHJldHVybiB0aGlzLmNhY2hlQnlDbGFzc1tuYW1lXTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JNZXRob2QoXG4gICAgY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9LFxuICAgIG1ldGhvZDogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHN0cmluZ1xuICApOiBMb2dnZXIge1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6ei5uYW1lO1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5jYWNoZUJ5Q2xhc3NNZXRob2QpKSB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXSA9IHt9O1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSB0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiID8gbWV0aG9kIDogbWV0aG9kLm5hbWU7XG4gICAgaWYgKCEobWV0aG9kTmFtZSBpbiB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXSkpXG4gICAgICB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXVttZXRob2ROYW1lXSA9IExvZ2dpbmcuaW5zdGFuY2UuZm9yTWV0aG9kKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgbWV0aG9kXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXVttZXRob2ROYW1lXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuZ2xvYmFsKSB0aGlzLmdsb2JhbCA9IExvZ2dpbmcuaW5zdGFuY2UuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlZmF1bHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgTG9nZ2luZ1xuICovXG5cbi8qKlxuICogQHN1bW1hcnkgTG9nZ2luZ1xuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZSBkZXNjcmlwdGlvblxuICogQG5hbWVzcGFjZSBMb2dnaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiSUFBWTtBQUFaLENBQUEsVUFBWSxRQUFRLEVBQUE7QUFDbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtBQUNmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0FBQ2IsSUFBQSxRQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtBQUNiLElBQUEsUUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7QUFDYixJQUFBLFFBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjtBQUNuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlO0FBQ2YsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtBQUNqQixDQUFDLEVBVFcsUUFBUSxLQUFSLFFBQVEsR0FTbkIsRUFBQSxDQUFBLENBQUE7QUFFWSxNQUFBLGdCQUFnQixHQUFHO0FBQzlCLElBQUEsS0FBSyxFQUFFLENBQUM7QUFDUixJQUFBLElBQUksRUFBRSxDQUFDO0FBQ1AsSUFBQSxJQUFJLEVBQUUsQ0FBQztBQUNQLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7OztNQ2ZZLGFBQWEsQ0FBQTtBQUNqQyxJQUFBLFdBQUEsQ0FBZ0MsS0FB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
|
|
500
|
+
export { DefaultLoggingConfig, DefaultTheme, LogLevel, Logging, LoggingMode, MiniLogger, NumericLogLevels, VERSION };
|
|
501
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2xvZ2dpbmcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZywgVGhlbWUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEVycm9yIGV2ZW50cyB0aGF0IGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZS4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQWRkaXRpb25hbCByZWxldmFudCBpbmZvcm1hdGlvbi4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb24uICovXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICAvKiogd2F5IHRvbyB2ZXJib3NlIG9yIHNpbGx5IGluZm9ybWF0aW9uLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQGNvbnN0IHtPYmplY3R9IE51bWVyaWNMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoMikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDQpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDgpLlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY0xvZ0xldmVscyA9IHtcbiAgZXJyb3I6IDIsXG4gIGluZm86IDQsXG4gIHZlcmJvc2U6IDYsXG4gIGRlYnVnOiA3LFxuICBzaWxseTogOSxcbn07XG5cbmV4cG9ydCBlbnVtIExvZ2dpbmdNb2RlIHtcbiAgUkFXID0gXCJyYXdcIixcbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEBjb25zdCBEZWZhdWx0VGhlbWVcbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGlkIC0gU3R5bGluZyBmb3IgaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGlkZW50aWZpZXJzICgzNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3RhY2sgLSBTdHlsaW5nIGZvciBzdGFjayB0cmFjZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGltZXN0YW1wIC0gU3R5bGluZyBmb3IgdGltZXN0YW1wcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtZXNzYWdlLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBtZXNzYWdlcyAoMzQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1ldGhvZCAtIFN0eWxpbmcgZm9yIG1ldGhvZCBuYW1lcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoNykuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBlcnJvcjoge1xuICAgICAgZmc6IDMxLFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICBpbmZvOiB7fSxcbiAgICB2ZXJib3NlOiB7fSxcbiAgICBkZWJ1Zzoge1xuICAgICAgZmc6IDMzLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGxvZ2dpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0sIGluY2x1ZGluZyB2ZXJib3NpdHksIGxvZyBsZXZlbCwgc3R5bGluZywgYW5kIHRpbWVzdGFtcCBmb3JtYXQuXG4gKiBAY29uc3QgRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEB0eXBlZGVmIHtMb2dnaW5nQ29uZmlnfSBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBWZXJib3NpdHkgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBEZWZhdWx0IGxvZyBsZXZlbCAoTG9nTGV2ZWwuaW5mbykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wIC0gV2hldGhlciB0byBpbmNsdWRlIHRpbWVzdGFtcHMgaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXBGb3JtYXQgLSBGb3JtYXQgZm9yIHRpbWVzdGFtcHMgKFwiSEg6bW06c3MuU1NTXCIpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb250ZXh0IC0gV2hldGhlciB0byBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7VGhlbWV9IHRoZW1lIC0gVGhlIHRoZW1lIHRvIHVzZSBmb3Igc3R5bGluZyBsb2cgbWVzc2FnZXMgKERlZmF1bHRUaGVtZSkuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgdmVyYm9zZTogMCxcbiAgbGV2ZWw6IExvZ0xldmVsLmluZm8sXG4gIGxvZ0xldmVsOiB0cnVlLFxuICBtb2RlOiBMb2dnaW5nTW9kZS5SQVcsXG4gIHN0eWxlOiBmYWxzZSxcbiAgc2VwYXJhdG9yOiBcIiAtIFwiLFxuICB0aW1lc3RhbXA6IHRydWUsXG4gIHRpbWVzdGFtcEZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgY29udGV4dDogdHJ1ZSxcbiAgdGhlbWU6IERlZmF1bHRUaGVtZSxcbn07XG4iLCJpbXBvcnQge1xuICBMb2dnZXJGYWN0b3J5LFxuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIExvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBEZWZhdWx0VGhlbWUsXG4gIExvZ0xldmVsLFxuICBOdW1lcmljTG9nTGV2ZWxzLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBtaW5pbWFsIGxvZ2dlciBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IE1pbmlMb2dnZXIgaXMgYSBsaWdodHdlaWdodCBsb2dnaW5nIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgVmVyYm9zaXR5TG9nZ2VyIGludGVyZmFjZS5cbiAqIEl0IHByb3ZpZGVzIGJhc2ljIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IE1pbmlMb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgTWluaUxvZ2dlciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLCBvcHRpb25hbCBjb25maWd1cmF0aW9uLCBhbmQgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHVzaW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gW2NvbmZdIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBJbmZvIGxldmVsIGFuZCB2ZXJib3NpdHkgMC5cbiAgICogQHBhcmFtIFtpZF0gLSBPcHRpb25hbCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIHByb3RlY3RlZCBpZD86IHN0cmluZ1xuICApIHt9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZyhcbiAgICBrZXk6IGtleW9mIExvZ2dpbmdDb25maWdcbiAgKTogTG9nZ2luZ0NvbmZpZ1trZXlvZiBMb2dnaW5nQ29uZmlnXSB7XG4gICAgaWYgKHRoaXMuY29uZiAmJiBrZXkgaW4gdGhpcy5jb25mKSByZXR1cm4gdGhpcy5jb25mW2tleV07XG4gICAgcmV0dXJuIExvZ2dpbmcuZ2V0Q29uZmlnKClba2V5XTtcbiAgfVxuXG4gIGZvcihcbiAgICBtZXRob2Q/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogTG9nZ2VyIHtcbiAgICBtZXRob2QgPSBtZXRob2RcbiAgICAgID8gdHlwZW9mIG1ldGhvZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1ldGhvZFxuICAgICAgICA6IG1ldGhvZC5uYW1lXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBMb2dnaW5nLmZvcihbdGhpcy5jb250ZXh0LCBtZXRob2RdLmpvaW4oXCIuXCIpLCB0aGlzLmlkLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGxvZyBzdHJpbmcgd2l0aCB0aW1lc3RhbXAsIGNvbG9yZWQgbG9nIGxldmVsLCBhbmQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YWNrXG4gICAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuY29uZmlnKFwic3R5bGVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnKFwidGltZXN0YW1wXCIpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gc3R5bGUgPyBMb2dnaW5nLnRoZW1lKGRhdGUsIFwidGltZXN0YW1wXCIsIGxldmVsKSA6IGRhdGU7XG4gICAgICBsb2cucHVzaCh0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImxvZ0xldmVsXCIpKSB7XG4gICAgICBjb25zdCBsdmw6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShsZXZlbCwgXCJsb2dMZXZlbFwiLCBsZXZlbClcbiAgICAgICAgOiBsZXZlbDtcbiAgICAgIGxvZy5wdXNoKGx2bCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cucHVzaChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAge1xuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5pZCwgXCJpZFwiLCBsZXZlbClcbiAgICAgICAgICA6IHRoaXMuaWQ7XG4gICAgICAgIGxvZy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtc2c6IHN0cmluZyA9IHN0eWxlXG4gICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgbGV2ZWxcbiAgICAgICAgKVxuICAgICAgOiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICBsb2cucHVzaChtc2cpO1xuICAgIGlmIChzdGFjayB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKHN0YWNrIHx8IChtZXNzYWdlIGFzIEVycm9yKS5zdGFjaykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdGFja1wiLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgIDogc3RhY2s7XG4gICAgICBsb2cucHVzaChgXFxuU3RhY2sgdHJhY2U6XFxuJHtzdGFja31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nLmpvaW4odGhpcy5jb25maWcoXCJzZXBhcmF0b3JcIikgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZyBsZXZlbC5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICovXG4gIHByb3RlY3RlZCBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbdGhpcy5jb25maWcoXCJsZXZlbFwiKSBhcyBMb2dMZXZlbF0gPFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF1cbiAgICApXG4gICAgICByZXR1cm47XG4gICAgbGV0IG1ldGhvZDtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIHN0YWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExMb2dzIGEgYHdheSB0b28gdmVyYm9zZWAgb3IgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgU2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBWZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgSW5mbyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuaW5mbywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBEZWJ1ZyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmRlYnVnLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBFcnJvciBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKG1zZzogU3RyaW5nTGlrZSB8IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZXJyb3IsIG1zZyk7XG4gIH1cblxuICBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgdGhpcy5jb25mID0geyAuLi4odGhpcy5jb25mIHx8IHt9KSwgLi4uY29uZmlnIH07XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGF0aWMgY2xhc3MgZm9yIG1hbmFnaW5nIGxvZ2dpbmcgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBMb2dnaW5nIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgbG9nZ2luZyBtZWNoYW5pc20gd2l0aCBzdXBwb3J0IGZvclxuICogZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS4gSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1haW50YWluIGEgZ2xvYmFsXG4gKiBsb2dnZXIgaW5zdGFuY2UgYW5kIGFsbG93cyBjcmVhdGluZyBzcGVjaWZpYyBsb2dnZXJzIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBhbmQgbWV0aG9kcy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBWZXJib3NpdHlMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnbG9iYWw/OiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBsb2dnZXIgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlcy4gQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIE1pbmlMb2dnZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZmFjdG9yeTogTG9nZ2VyRmFjdG9yeSA9IChcbiAgICBvYmplY3Q6IHN0cmluZyxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGlkPzogc3RyaW5nXG4gICkgPT4ge1xuICAgIHJldHVybiBuZXcgTWluaUxvZ2dlcihvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBnbG9iYWwgdmVyYm9zaXR5IGxldmVsIGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfY29uZmlnOiBMb2dnaW5nQ29uZmlnID0gRGVmYXVsdExvZ2dpbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbi5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IHRoZSBMb2dnaW5nIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYXMgaXQncyBkZXNpZ25lZCB0byBiZSB1c2VkIHN0YXRpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRGYWN0b3J5KGZhY3Rvcnk6IExvZ2dlckZhY3RvcnkpIHtcbiAgICBMb2dnaW5nLl9mYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0dGVyIGZvciB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBBbGxvd3MgdXBkYXRpbmcgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBbiBvYmplY3QgY29udGFpbmluZyB2ZXJib3NpdHkgYW5kIGxvZyBsZXZlbCBzZXR0aW5ncy5cbiAgICovXG4gIHN0YXRpYyBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb25maWcsIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29uZmlnKCk6IExvZ2dpbmdDb25maWcge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2xvYmFsIGxvZ2dlciBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBnbG9iYWwgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGdldCgpOiBMb2dnZXIge1xuICAgIHRoaXMuZ2xvYmFsID0gdGhpcy5nbG9iYWwgPyB0aGlzLmdsb2JhbCA6IHRoaXMuX2ZhY3RvcnkoXCJMb2dnaW5nXCIpO1xuICAgIHJldHVybiB0aGlzLmdsb2JhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSB2ZXJib3NlIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHN0YXRpYyB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkudmVyYm9zZShtc2csIHZlcmJvc2l0eSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGluZm8gbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmluZm8obXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5kZWJ1Zyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnNpbGx5KG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBlcnJvciBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGVycm9yKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmVycm9yKG1zZyk7XG4gIH1cblxuICBzdGF0aWMgZm9yKFxuICAgIG9iamVjdDogTG9nZ2luZ0NvbnRleHQsXG4gICAgaWQ/OiBzdHJpbmcgfCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogTG9nZ2VyIHtcbiAgICBvYmplY3QgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiID8gb2JqZWN0IDogb2JqZWN0Lm5hbWU7XG4gICAgaWQgPSB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IHVuZGVmaW5lZDtcbiAgICBjb25maWcgPSB0eXBlb2YgaWQgPT09IFwib2JqZWN0XCIgPyAoaWQgYXMgUGFydGlhbDxMb2dnaW5nQ29uZmlnPikgOiBjb25maWc7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3Rvcnkob2JqZWN0LCBjb25maWcsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29udGV4dC5cbiAgICpcbiAgICogQHN1bW1hcnkgVGhpcyBzdGF0aWMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHVzaW5nIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLFxuICAgKiBiYXNlZCBvbiBhIGdpdmVuIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVhc29uIG9yIGNvbnRleHQgZm9yIGNyZWF0aW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gaWRcbiAgICogQHJldHVybnMgQSBuZXcgVmVyYm9zaXR5TG9nZ2VyIG9yIENsYXNzTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGJlY2F1c2UocmVhc29uOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShyZWFzb24sIHRoaXMuX2NvbmZpZywgaWQpO1xuICB9XG5cbiAgc3RhdGljIHRoZW1lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0eXBlOiBrZXlvZiBUaGVtZSB8IGtleW9mIExvZ0xldmVsLFxuICAgIGxvZ2dlckxldmVsOiBMb2dMZXZlbCxcbiAgICB0ZW1wbGF0ZTogVGhlbWUgPSBEZWZhdWx0VGhlbWVcbiAgKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc3R5bGUpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHRoaXMudGhlbWUpO1xuXG4gICAgZnVuY3Rpb24gYXBwbHkoXG4gICAgICB0eHQ6IHN0cmluZyxcbiAgICAgIG9wdGlvbjoga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICB2YWx1ZTogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudW1iZXJbXSB8IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQ6IHN0cmluZyB8IFN0eWxlZFN0cmluZyA9IHR4dDtcbiAgICAgICAgbGV0IGMgPSBzdHlsZSh0KTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvbG9yKFxuICAgICAgICAgIHZhbDogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgaXNCZyA9IGZhbHNlXG4gICAgICAgICk6IFN0eWxlZFN0cmluZyB7XG4gICAgICAgICAgbGV0IGY6XG4gICAgICAgICAgICB8IHR5cGVvZiBjLmJhY2tncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuZm9yZWdyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5yZ2JcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuY29sb3IyNTYgPSBpc0JnID8gYy5iYWNrZ3JvdW5kIDogYy5mb3JlZ3JvdW5kO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmFja2dyb3VuZCB8IHR5cGVvZiBjLmZvcmVncm91bmQpLmNhbGwoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ0NvbG9yMjU2IDogYy5jb2xvcjI1NjtcbiAgICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJnQ29sb3IyNTYgfCB0eXBlb2YgYy5jb2xvcjI1NikodmFsWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnUmdiIDogYy5yZ2I7XG4gICAgICAgICAgICAgIHJldHVybiBjLnJnYih2YWxbMF0sIHZhbFsxXSwgdmFsWzJdKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgY29sb3Igb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlKHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVN0eWxlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgYyA9IGMuc3R5bGUodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPSBjW3YgYXMga2V5b2YgQ29sb3JpemVPcHRpb25zXSBhcyBTdHlsZWRTdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYmdcIjpcbiAgICAgICAgICBjYXNlIFwiZmdcIjpcbiAgICAgICAgICAgIHJldHVybiBhcHBseUNvbG9yKHZhbHVlIGFzIG51bWJlcikudGV4dDtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFwcGx5U3R5bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBwbHlTdHlsZSh2YWx1ZSBhcyBudW1iZXIgfCBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGMudGV4dDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCB0aGVtZSBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGFwcGx5aW5nIHN0eWxlOiAke29wdGlvbn0gd2l0aCB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZGl2aWR1YWxUaGVtZSA9IHRlbXBsYXRlW3R5cGUgYXMga2V5b2YgVGhlbWVdO1xuICAgIGlmICghaW5kaXZpZHVhbFRoZW1lIHx8ICFPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFRoZW1lOiBUaGVtZU9wdGlvbiA9IGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbjtcblxuICAgIGNvbnN0IGxvZ0xldmVscyA9IE9iamVjdC5hc3NpZ24oe30sIExvZ0xldmVsKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKVswXSBpbiBsb2dMZXZlbHMpXG4gICAgICBhY3R1YWxUaGVtZSA9XG4gICAgICAgIChpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb25CeUxvZ0xldmVsKVtsb2dnZXJMZXZlbF0gfHwge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0dWFsVGhlbWUpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoYWN0dWFsVGhlbWUgYXMgVGhlbWVPcHRpb24pW2tleSBhcyBrZXlvZiBUaGVtZU9wdGlvbl07XG4gICAgICBpZiAodmFsKVxuICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgYWNjLFxuICAgICAgICAgIGtleSBhcyBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgICAgICB2YWwgYXNcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IFtudW1iZXJdXG4gICAgICAgICAgICB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgICAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICAgICAgfCBzdHJpbmdbXVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0ZXh0KTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZHVsZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIGRlc2NyaXB0aW9uXG4gKiBAbW9kdWxlIExvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IExvZ2dpbmdcbiAqIEBkZXNjcmlwdGlvbiBOYW1lc3BhY2UgZGVzY3JpcHRpb25cbiAqIEBuYW1lc3BhY2UgTG9nZ2luZ1xuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBzdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAZGVzY3JpcHRpb24gdGhpcyBpcyBob3cgeW91IHNob3VsZCBkb2N1bWVudCBhIGNvbnN0YW50XG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7QUFLRztJQUNTO0FBQVosQ0FBQSxVQUFZLFFBQVEsRUFBQTs7QUFFbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhOztBQUViLElBQUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUVuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUVmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDakIsQ0FBQyxFQVhXLFFBQVEsS0FBUixRQUFRLEdBV25CLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7QUFVRztBQUNVLE1BQUEsZ0JBQWdCLEdBQUc7QUFDOUIsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7O0lBR0U7QUFBWixDQUFBLFVBQVksV0FBVyxFQUFBO0FBQ3JCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7QUFDWCxJ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
|