@decaf-ts/utils 0.2.6 → 0.2.7

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.
Files changed (72) hide show
  1. package/bin/build-scripts.cjs +1018 -996
  2. package/bin/tag-release.cjs +1023 -1005
  3. package/bin/update-scripts.cjs +1016 -998
  4. package/dist/utils.cjs +83 -544
  5. package/dist/utils.esm.cjs +75 -530
  6. package/lib/cli/command.cjs +6 -7
  7. package/lib/cli/command.d.ts +5 -5
  8. package/lib/cli/commands/build-scripts.cjs +7 -3
  9. package/lib/cli/commands/build-scripts.d.ts +1 -1
  10. package/lib/cli/commands/tag-release.cjs +1 -1
  11. package/lib/cli/commands/tag-release.d.ts +1 -1
  12. package/lib/cli/commands/update-scripts.cjs +1 -1
  13. package/lib/cli/commands/update-scripts.d.ts +1 -1
  14. package/lib/cli/types.cjs +1 -1
  15. package/lib/cli/types.d.ts +1 -1
  16. package/lib/esm/cli/command.d.ts +5 -5
  17. package/lib/esm/cli/command.js +2 -3
  18. package/lib/esm/cli/commands/build-scripts.d.ts +1 -1
  19. package/lib/esm/cli/commands/build-scripts.js +7 -3
  20. package/lib/esm/cli/commands/tag-release.d.ts +1 -1
  21. package/lib/esm/cli/commands/tag-release.js +1 -1
  22. package/lib/esm/cli/commands/update-scripts.d.ts +1 -1
  23. package/lib/esm/cli/commands/update-scripts.js +1 -1
  24. package/lib/esm/cli/types.d.ts +1 -1
  25. package/lib/esm/cli/types.js +1 -1
  26. package/lib/esm/index.d.ts +2 -2
  27. package/lib/esm/index.js +2 -2
  28. package/lib/esm/input/input.d.ts +1 -2
  29. package/lib/esm/input/input.js +2 -2
  30. package/lib/esm/input/types.d.ts +83 -0
  31. package/lib/esm/input/types.js +1 -1
  32. package/lib/esm/output/common.d.ts +3 -3
  33. package/lib/esm/output/common.js +2 -2
  34. package/lib/esm/output/index.d.ts +1 -3
  35. package/lib/esm/output/index.js +2 -4
  36. package/lib/esm/utils/constants.d.ts +0 -77
  37. package/lib/esm/utils/constants.js +1 -114
  38. package/lib/esm/utils/fs.js +2 -2
  39. package/lib/esm/utils/http.d.ts +1 -1
  40. package/lib/esm/utils/http.js +2 -2
  41. package/lib/esm/utils/utils.d.ts +2 -2
  42. package/lib/esm/utils/utils.js +2 -2
  43. package/lib/esm/writers/StandardOutputWriter.d.ts +2 -2
  44. package/lib/esm/writers/StandardOutputWriter.js +2 -2
  45. package/lib/index.cjs +2 -2
  46. package/lib/index.d.ts +2 -2
  47. package/lib/input/input.cjs +2 -2
  48. package/lib/input/input.d.ts +1 -2
  49. package/lib/input/types.cjs +1 -1
  50. package/lib/input/types.d.ts +83 -0
  51. package/lib/output/common.cjs +2 -2
  52. package/lib/output/common.d.ts +3 -3
  53. package/lib/output/index.cjs +1 -3
  54. package/lib/output/index.d.ts +1 -3
  55. package/lib/utils/constants.cjs +2 -115
  56. package/lib/utils/constants.d.ts +0 -77
  57. package/lib/utils/fs.cjs +2 -2
  58. package/lib/utils/http.cjs +2 -2
  59. package/lib/utils/http.d.ts +1 -1
  60. package/lib/utils/utils.cjs +2 -2
  61. package/lib/utils/utils.d.ts +2 -2
  62. package/lib/writers/StandardOutputWriter.cjs +2 -2
  63. package/lib/writers/StandardOutputWriter.d.ts +2 -2
  64. package/package.json +3 -1
  65. package/lib/esm/output/logging.d.ts +0 -177
  66. package/lib/esm/output/logging.js +0 -349
  67. package/lib/esm/output/types.d.ts +0 -203
  68. package/lib/esm/output/types.js +0 -2
  69. package/lib/output/logging.cjs +0 -354
  70. package/lib/output/logging.d.ts +0 -177
  71. package/lib/output/types.cjs +0 -3
  72. package/lib/output/types.d.ts +0 -203
@@ -1,349 +0,0 @@
1
- import { DefaultLoggingConfig, DefaultTheme, LogLevel, NumericLogLevels, } from "../utils/constants";
2
- import { style } from "styled-string-builder";
3
- /**
4
- * @description A minimal logger implementation.
5
- * @summary MiniLogger is a lightweight logging class that implements the VerbosityLogger interface.
6
- * It provides basic logging functionality with support for different log levels and verbosity.
7
- *
8
- * @class
9
- */
10
- export class MiniLogger {
11
- /**
12
- * @description Creates a new MiniLogger instance.
13
- * @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
14
- *
15
- * @param context - The name of the class using this logger.
16
- * @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
17
- * @param [id] - Optional unique identifier for the logger instance.
18
- */
19
- constructor(context, conf, id) {
20
- this.context = context;
21
- this.conf = conf;
22
- this.id = id;
23
- }
24
- config(key) {
25
- if (this.conf && key in this.conf)
26
- return this.conf[key];
27
- return Logging.getConfig()[key];
28
- }
29
- for(method, config) {
30
- method = method
31
- ? typeof method === "string"
32
- ? method
33
- : method.name
34
- : undefined;
35
- return Logging.for([this.context, method].join("."), this.id, config);
36
- }
37
- /**
38
- * @description Creates a formatted log string.
39
- * @summary Generates a log string with timestamp, colored log level, and message.
40
- *
41
- * @param level - The log level as a string.
42
- * @param message
43
- * @param stack
44
- * @return A formatted log string.
45
- */
46
- createLog(level, message, stack) {
47
- const log = [];
48
- const style = this.config("style");
49
- if (this.config("timestamp")) {
50
- const date = new Date().toISOString();
51
- const timestamp = style ? Logging.theme(date, "timestamp", level) : date;
52
- log.push(timestamp);
53
- }
54
- if (this.config("logLevel")) {
55
- const lvl = style
56
- ? Logging.theme(level, "logLevel", level)
57
- : level;
58
- log.push(lvl);
59
- }
60
- if (this.config("context")) {
61
- const context = style
62
- ? Logging.theme(this.context, "class", level)
63
- : this.context;
64
- log.push(context);
65
- }
66
- const msg = style
67
- ? Logging.theme(typeof message === "string" ? message : message.message, "message", level)
68
- : typeof message === "string"
69
- ? message
70
- : message.message;
71
- log.push(msg);
72
- if (stack || message instanceof Error) {
73
- stack = style
74
- ? Logging.theme((stack || message.stack), "stack", level)
75
- : stack;
76
- log.push(`\nStack trace:\n${stack}`);
77
- }
78
- return log.join(this.config("separator"));
79
- }
80
- /**
81
- * @description Logs a message with the specified log level.
82
- * @summary Checks if the message should be logged based on the current log level,
83
- * then uses the appropriate console method to output the log.
84
- *
85
- * @param level - The log level of the message.
86
- * @param msg - The message to be logged.
87
- * @param stack
88
- */
89
- log(level, msg, stack) {
90
- if (NumericLogLevels[this.config("level")] <
91
- NumericLogLevels[level])
92
- return;
93
- let method;
94
- switch (level) {
95
- case LogLevel.info:
96
- method = console.log;
97
- break;
98
- case LogLevel.verbose:
99
- case LogLevel.debug:
100
- method = console.debug;
101
- break;
102
- case LogLevel.error:
103
- method = console.error;
104
- break;
105
- default:
106
- throw new Error("Invalid log level");
107
- }
108
- method(this.createLog(level, msg, stack));
109
- }
110
- /**
111
- * @description LLogs a `way too verbose` or a silly message.
112
- * @summary Logs a message at the Silly level if the current verbosity allows it.
113
- *
114
- * @param msg - The message to be logged.
115
- * @param verbosity - The verbosity level of the message (default: 0).
116
- */
117
- silly(msg, verbosity = 0) {
118
- if (this.config("verbose") >= verbosity)
119
- this.log(LogLevel.verbose, msg);
120
- }
121
- /**
122
- * @description Logs a verbose message.
123
- * @summary Logs a message at the Verbose level if the current verbosity allows it.
124
- *
125
- * @param msg - The message to be logged.
126
- * @param verbosity - The verbosity level of the message (default: 0).
127
- */
128
- verbose(msg, verbosity = 0) {
129
- if (this.config("verbose") >= verbosity)
130
- this.log(LogLevel.verbose, msg);
131
- }
132
- /**
133
- * @description Logs an info message.
134
- * @summary Logs a message at the Info level.
135
- *
136
- * @param msg - The message to be logged.
137
- */
138
- info(msg) {
139
- this.log(LogLevel.info, msg);
140
- }
141
- /**
142
- * @description Logs a debug message.
143
- * @summary Logs a message at the Debug level.
144
- *
145
- * @param msg - The message to be logged.
146
- */
147
- debug(msg) {
148
- this.log(LogLevel.debug, msg);
149
- }
150
- /**
151
- * @description Logs an error message.
152
- * @summary Logs a message at the Error level.
153
- *
154
- * @param msg - The message to be logged.
155
- */
156
- error(msg) {
157
- this.log(LogLevel.error, msg);
158
- }
159
- setConfig(config) {
160
- this.conf = { ...(this.conf || {}), ...config };
161
- }
162
- }
163
- /**
164
- * @description A static class for managing logging operations.
165
- * @summary The Logging class provides a centralized logging mechanism with support for
166
- * different log levels and verbosity. It uses a singleton pattern to maintain a global
167
- * logger instance and allows creating specific loggers for different classes and methods.
168
- *
169
- * @class
170
- */
171
- export class Logging {
172
- /**
173
- * @description Factory function for creating logger instances.
174
- * @summary A function that creates new VerbosityLogger instances. By default, it creates a MiniLogger.
175
- */
176
- static { this._factory = (object, config, id) => {
177
- return new MiniLogger(object, config, id);
178
- }; }
179
- /**
180
- * @description Configuration for the logging system.
181
- * @summary Stores the global verbosity level and log level settings.
182
- */
183
- static { this._config = DefaultLoggingConfig; }
184
- /**
185
- * @description Private constructor to prevent instantiation.
186
- * @summary Ensures that the Logging class cannot be instantiated as it's designed to be used statically.
187
- */
188
- constructor() { }
189
- /**
190
- * @description Setter for the logging configuration.
191
- * @summary Allows updating the global logging configuration.
192
- *
193
- * @param config - An object containing verbosity and log level settings.
194
- */
195
- static setConfig(config) {
196
- Object.assign(this._config, config);
197
- }
198
- static getConfig() {
199
- return Object.assign({}, this._config);
200
- }
201
- /**
202
- * @description Retrieves or creates the global logger instance.
203
- * @summary Returns the existing global logger or creates a new one if it doesn't exist.
204
- *
205
- * @return The global VerbosityLogger instance.
206
- */
207
- static get() {
208
- this.global = this.global ? this.global : this._factory("Logging");
209
- return this.global;
210
- }
211
- /**
212
- * @description Logs a verbose message.
213
- * @summary Delegates the verbose logging to the global logger instance.
214
- *
215
- * @param msg - The message to be logged.
216
- * @param verbosity - The verbosity level of the message (default: 0).
217
- */
218
- static verbose(msg, verbosity = 0) {
219
- return this.get().verbose(msg, verbosity);
220
- }
221
- /**
222
- * @description Logs an info message.
223
- * @summary Delegates the info logging to the global logger instance.
224
- *
225
- * @param msg - The message to be logged.
226
- */
227
- static info(msg) {
228
- return this.get().info(msg);
229
- }
230
- /**
231
- * @description Logs a debug message.
232
- * @summary Delegates the debug logging to the global logger instance.
233
- *
234
- * @param msg - The message to be logged.
235
- */
236
- static debug(msg) {
237
- return this.get().debug(msg);
238
- }
239
- /**
240
- * @description Logs a silly message.
241
- * @summary Delegates the debug logging to the global logger instance.
242
- *
243
- * @param msg - The message to be logged.
244
- */
245
- static silly(msg) {
246
- return this.get().silly(msg);
247
- }
248
- /**
249
- * @description Logs an error message.
250
- * @summary Delegates the error logging to the global logger instance.
251
- *
252
- * @param msg - The message to be logged.
253
- */
254
- static error(msg) {
255
- return this.get().error(msg);
256
- }
257
- static for(object, id, config) {
258
- object = typeof object === "string" ? object : object.name;
259
- id = typeof id === "string" ? id : undefined;
260
- config = typeof id === "object" ? id : config;
261
- return this._factory(object, config, id);
262
- }
263
- /**
264
- * @description Creates a logger for a specific reason or context.
265
- *
266
- * @summary This static method creates a new logger instance using the factory function,
267
- * based on a given reason or context.
268
- *
269
- * @param reason - A string describing the reason or context for creating this logger.
270
- * @param id
271
- * @returns A new VerbosityLogger or ClassLogger instance.
272
- */
273
- static because(reason, id) {
274
- return this._factory(reason, this._config, id);
275
- }
276
- static theme(text, type, loggerLevel, template = DefaultTheme) {
277
- if (!this._config.style)
278
- return text;
279
- const logger = Logging.get().for(this.theme);
280
- function apply(txt, option, value) {
281
- try {
282
- const t = txt;
283
- let c = style(t);
284
- function applyColor(val, isBg = false) {
285
- let f = isBg ? c.background : c.foreground;
286
- if (!Array.isArray(val)) {
287
- return f.call(c, value);
288
- }
289
- switch (val.length) {
290
- case 1:
291
- f = isBg ? c.bgColor256 : c.color256;
292
- return f(val[0]);
293
- case 3:
294
- f = isBg ? c.bgRgb : c.rgb;
295
- return c.rgb(val[0], val[1], val[2]);
296
- default:
297
- logger.error(`Not a valid color option: ${option}`);
298
- return style(t);
299
- }
300
- }
301
- function applyStyle(v) {
302
- if (typeof v === "number") {
303
- c = c.style(v);
304
- }
305
- else {
306
- c = c[v];
307
- }
308
- }
309
- switch (option) {
310
- case "bg":
311
- case "fg":
312
- return applyColor(value).text;
313
- case "style":
314
- if (Array.isArray(value)) {
315
- value.forEach(applyStyle);
316
- }
317
- else {
318
- applyStyle(value);
319
- }
320
- return c.text;
321
- default:
322
- logger.error(`Not a valid theme option: ${option}`);
323
- return t;
324
- }
325
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
326
- }
327
- catch (e) {
328
- logger.error(`Error applying style: ${option} with value ${value}`);
329
- return txt;
330
- }
331
- }
332
- const individualTheme = template[type];
333
- if (!individualTheme || !Object.keys(individualTheme).length) {
334
- return text;
335
- }
336
- let actualTheme = individualTheme;
337
- const logLevels = Object.assign({}, LogLevel);
338
- if (Object.keys(individualTheme)[0] in logLevels)
339
- actualTheme =
340
- individualTheme[loggerLevel] || {};
341
- return Object.keys(actualTheme).reduce((acc, key) => {
342
- const val = actualTheme[key];
343
- if (val)
344
- return apply(acc, key, val);
345
- return acc;
346
- }, text);
347
- }
348
- }
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdXRwdXQvbG9nZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixRQUFRLEVBQ1IsZ0JBQWdCLEdBQ2pCLE1BQU0sb0JBQW9CLENBQUM7QUFVNUIsT0FBTyxFQUFtQixLQUFLLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFDckI7Ozs7Ozs7T0FPRztJQUNILFlBQ1ksT0FBZSxFQUNmLElBQTZCLEVBQzdCLEVBQVc7UUFGWCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBeUI7UUFDN0IsT0FBRSxHQUFGLEVBQUUsQ0FBUztJQUNwQixDQUFDO0lBRU0sTUFBTSxDQUNkLEdBQXdCO1FBRXhCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELEdBQUcsQ0FDRCxNQUEyQyxFQUMzQyxNQUErQjtRQUUvQixNQUFNLEdBQUcsTUFBTTtZQUNiLENBQUMsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUMxQixDQUFDLENBQUMsTUFBTTtnQkFDUixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDZixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJ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QUNILEdBQXdCLEVBQ3hCLEdBS1ksQ0FDYixDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIERlZmF1bHRUaGVtZSxcbiAgTG9nTGV2ZWwsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG59IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIExvZ2dpbmdDb25maWcsXG4gIExvZ2dpbmdDb250ZXh0LFxuICBTdHJpbmdMaWtlLFxuICBUaGVtZSxcbiAgVGhlbWVPcHRpb24sXG4gIFRoZW1lT3B0aW9uQnlMb2dMZXZlbCxcbiAgVmVyYm9zaXR5TG9nZ2VyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29sb3JpemVPcHRpb25zLCBzdHlsZSwgU3R5bGVkU3RyaW5nIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBWZXJib3NpdHlMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE1pbmlMb2dnZXIgaW1wbGVtZW50cyBWZXJib3NpdHlMb2dnZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgTWluaUxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBNaW5pTG9nZ2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUsIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24sIGFuZCBtZXRob2QgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdXNpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBbY29uZl0gLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIEluZm8gbGV2ZWwgYW5kIHZlcmJvc2l0eSAwLlxuICAgKiBAcGFyYW0gW2lkXSAtIE9wdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbnRleHQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgY29uZj86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgcHJvdGVjdGVkIGlkPzogc3RyaW5nXG4gICkge31cblxuICBwcm90ZWN0ZWQgY29uZmlnKFxuICAgIGtleToga2V5b2YgTG9nZ2luZ0NvbmZpZ1xuICApOiBMb2dnaW5nQ29uZmlnW2tleW9mIExvZ2dpbmdDb25maWddIHtcbiAgICBpZiAodGhpcy5jb25mICYmIGtleSBpbiB0aGlzLmNvbmYpIHJldHVybiB0aGlzLmNvbmZba2V5XTtcbiAgICByZXR1cm4gTG9nZ2luZy5nZXRDb25maWcoKVtrZXldO1xuICB9XG5cbiAgZm9yKFxuICAgIG1ldGhvZD86IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSksXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIG1ldGhvZCA9IG1ldGhvZFxuICAgICAgPyB0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWV0aG9kXG4gICAgICAgIDogbWV0aG9kLm5hbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIExvZ2dpbmcuZm9yKFt0aGlzLmNvbnRleHQsIG1ldGhvZF0uam9pbihcIi5cIiksIHRoaXMuaWQsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgbG9nIHN0cmluZyB3aXRoIHRpbWVzdGFtcCwgY29sb3JlZCBsb2cgbGV2ZWwsIGFuZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIGFzIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2cgc3RyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbWVzc2FnZTogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5jb25maWcoXCJzdHlsZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcoXCJ0aW1lc3RhbXBcIikpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBzdHlsZSA/IExvZ2dpbmcudGhlbWUoZGF0ZSwgXCJ0aW1lc3RhbXBcIiwgbGV2ZWwpIDogZGF0ZTtcbiAgICAgIGxvZy5wdXNoKHRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwibG9nTGV2ZWxcIikpIHtcbiAgICAgIGNvbnN0IGx2bDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKGxldmVsLCBcImxvZ0xldmVsXCIsIGxldmVsKVxuICAgICAgICA6IGxldmVsO1xuICAgICAgbG9nLnB1c2gobHZsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJjb250ZXh0XCIpKSB7XG4gICAgICBjb25zdCBjb250ZXh0OiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5jb250ZXh0LCBcImNsYXNzXCIsIGxldmVsKVxuICAgICAgICA6IHRoaXMuY29udGV4dDtcbiAgICAgIGxvZy5wdXNoKGNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1zZzogc3RyaW5nID0gc3R5bGVcbiAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICBsZXZlbFxuICAgICAgICApXG4gICAgICA6IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWVzc2FnZVxuICAgICAgICA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgIGxvZy5wdXNoKG1zZyk7XG4gICAgaWYgKHN0YWNrIHx8IG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgc3RhY2sgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgICAoc3RhY2sgfHwgKG1lc3NhZ2UgYXMgRXJyb3IpLnN0YWNrKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBcInN0YWNrXCIsXG4gICAgICAgICAgICBsZXZlbFxuICAgICAgICAgIClcbiAgICAgICAgOiBzdGFjaztcbiAgICAgIGxvZy5wdXNoKGBcXG5TdGFjayB0cmFjZTpcXG4ke3N0YWNrfWApO1xuICAgIH1cblxuICAgIHJldHVybiBsb2cuam9pbih0aGlzLmNvbmZpZyhcInNlcGFyYXRvclwiKSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsLlxuICAgKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGxvZ2dlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2cgbGV2ZWwsXG4gICAqIHRoZW4gdXNlcyB0aGUgYXBwcm9wcmlhdGUgY29uc29sZSBtZXRob2QgdG8gb3V0cHV0IHRoZSBsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBzdGFja1xuICAgKi9cbiAgcHJvdGVjdGVkIGxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsXG4gICAgc3RhY2s/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgbWV0aG9kO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuaW5mbzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5sb2c7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC52ZXJib3NlOlxuICAgICAgY2FzZSBMb2dMZXZlbC5kZWJ1ZzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5kZWJ1ZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmVycm9yOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QodGhpcy5jcmVhdGVMb2cobGV2ZWwsIG1zZywgc3RhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTExvZ3MgYSBgd2F5IHRvbyB2ZXJib3NlYCBvciBhIHNpbGx5IG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBTaWxseSBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgYWxsb3dzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICBzaWxseShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIFZlcmJvc2UgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBJbmZvIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5pbmZvLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIERlYnVnIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZGVidWcsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIEVycm9yIGxldmVsLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3IobXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5lcnJvciwgbXNnKTtcbiAgfVxuXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICB0aGlzLmNvbmYgPSB7IC4uLih0aGlzLmNvbmYgfHwge30pLCAuLi5jb25maWcgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YXRpYyBjbGFzcyBmb3IgbWFuYWdpbmcgbG9nZ2luZyBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIExvZ2dpbmcgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBsb2dnaW5nIG1lY2hhbmlzbSB3aXRoIHN1cHBvcnQgZm9yXG4gKiBkaWZmZXJlbnQgbG9nIGxldmVscyBhbmQgdmVyYm9zaXR5LiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFpbnRhaW4gYSBnbG9iYWxcbiAqIGxvZ2dlciBpbnN0YW5jZSBhbmQgYWxsb3dzIGNyZWF0aW5nIHNwZWNpZmljIGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtZXRob2RzLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTG9nZ2luZyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIFZlcmJvc2l0eUxvZ2dlciB1c2VkIGZvciBnbG9iYWwgbG9nZ2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbD86IFZlcmJvc2l0eUxvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXMuXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIG5ldyBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2VzLiBCeSBkZWZhdWx0LCBpdCBjcmVhdGVzIGEgTWluaUxvZ2dlci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9mYWN0b3J5OiAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBpZD86IHN0cmluZ1xuICApID0+IFZlcmJvc2l0eUxvZ2dlciA9IChcbiAgICBvYmplY3Q6IHN0cmluZyxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGlkPzogc3RyaW5nXG4gICkgPT4ge1xuICAgIHJldHVybiBuZXcgTWluaUxvZ2dlcihvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBnbG9iYWwgdmVyYm9zaXR5IGxldmVsIGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfY29uZmlnOiBMb2dnaW5nQ29uZmlnID0gRGVmYXVsdExvZ2dpbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbi5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IHRoZSBMb2dnaW5nIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYXMgaXQncyBkZXNpZ25lZCB0byBiZSB1c2VkIHN0YXRpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHRlciBmb3IgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHN1bW1hcnkgQWxsb3dzIHVwZGF0aW5nIHRoZSBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdmVyYm9zaXR5IGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBzdGF0aWMgc2V0Q29uZmlnKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY29uZmlnLCBjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGdldENvbmZpZygpOiBMb2dnaW5nQ29uZmlnIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGV4aXN0aW5nIGdsb2JhbCBsb2dnZXIgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICpcbiAgICogQHJldHVybiBUaGUgZ2xvYmFsIFZlcmJvc2l0eUxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBnZXQoKTogVmVyYm9zaXR5TG9nZ2VyIHtcbiAgICB0aGlzLmdsb2JhbCA9IHRoaXMuZ2xvYmFsID8gdGhpcy5nbG9iYWwgOiB0aGlzLl9mYWN0b3J5KFwiTG9nZ2luZ1wiKTtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgdmVyYm9zZSBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICBzdGF0aWMgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnZlcmJvc2UobXNnLCB2ZXJib3NpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBpbmZvIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5pbmZvKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuZGVidWcobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHNpbGx5IG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBzaWxseShtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5zaWxseShtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZXJyb3IgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBlcnJvcihtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5lcnJvcihtc2cpO1xuICB9XG5cbiAgc3RhdGljIGZvcihcbiAgICBvYmplY3Q6IExvZ2dpbmdDb250ZXh0LFxuICAgIGlkPzogc3RyaW5nIHwgUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICk6IFZlcmJvc2l0eUxvZ2dlciB7XG4gICAgb2JqZWN0ID0gdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIiA/IG9iamVjdCA6IG9iamVjdC5uYW1lO1xuICAgIGlkID0gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiID8gaWQgOiB1bmRlZmluZWQ7XG4gICAgY29uZmlnID0gdHlwZW9mIGlkID09PSBcIm9iamVjdFwiID8gKGlkIGFzIFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIDogY29uZmlnO1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KG9iamVjdCwgY29uZmlnLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgcmVhc29uIG9yIGNvbnRleHQuXG4gICAqXG4gICAqIEBzdW1tYXJ5IFRoaXMgc3RhdGljIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGxvZ2dlciBpbnN0YW5jZSB1c2luZyB0aGUgZmFjdG9yeSBmdW5jdGlvbixcbiAgICogYmFzZWQgb24gYSBnaXZlbiByZWFzb24gb3IgY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBvciBjb250ZXh0IGZvciBjcmVhdGluZyB0aGlzIGxvZ2dlci5cbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm5zIEEgbmV3IFZlcmJvc2l0eUxvZ2dlciBvciBDbGFzc0xvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBiZWNhdXNlKHJlYXNvbjogc3RyaW5nLCBpZD86IHN0cmluZyk6IFZlcmJvc2l0eUxvZ2dlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3RvcnkocmVhc29uLCB0aGlzLl9jb25maWcsIGlkKTtcbiAgfVxuXG4gIHN0YXRpYyB0aGVtZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgdHlwZToga2V5b2YgVGhlbWUgfCBrZXlvZiBMb2dMZXZlbCxcbiAgICBsb2dnZXJMZXZlbDogTG9nTGV2ZWwsXG4gICAgdGVtcGxhdGU6IFRoZW1lID0gRGVmYXVsdFRoZW1lXG4gICkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnN0eWxlKSByZXR1cm4gdGV4dDtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih0aGlzLnRoZW1lKTtcblxuICAgIGZ1bmN0aW9uIGFwcGx5KFxuICAgICAgdHh0OiBzdHJpbmcsXG4gICAgICBvcHRpb246IGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgdmFsdWU6IG51bWJlciB8IFtudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVtYmVyW10gfCBzdHJpbmdbXVxuICAgICk6IHN0cmluZyB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0OiBzdHJpbmcgfCBTdHlsZWRTdHJpbmcgPSB0eHQ7XG4gICAgICAgIGxldCBjID0gc3R5bGUodCk7XG5cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2xvcihcbiAgICAgICAgICB2YWw6IG51bWJlciB8IFtudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgIGlzQmcgPSBmYWxzZVxuICAgICAgICApOiBTdHlsZWRTdHJpbmcge1xuICAgICAgICAgIGxldCBmOlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5iYWNrZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLmZvcmVncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMucmdiXG4gICAgICAgICAgICB8IHR5cGVvZiBjLmNvbG9yMjU2ID0gaXNCZyA/IGMuYmFja2dyb3VuZCA6IGMuZm9yZWdyb3VuZDtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJhY2tncm91bmQgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kKS5jYWxsKFxuICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgICB2YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAodmFsLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdDb2xvcjI1NiA6IGMuY29sb3IyNTY7XG4gICAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iZ0NvbG9yMjU2IHwgdHlwZW9mIGMuY29sb3IyNTYpKHZhbFswXSk7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ1JnYiA6IGMucmdiO1xuICAgICAgICAgICAgICByZXR1cm4gYy5yZ2IodmFsWzBdLCB2YWxbMV0sIHZhbFsyXSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIGNvbG9yIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICAgIHJldHVybiBzdHlsZSh0IGFzIHN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlTdHlsZSh2OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGMgPSBjLnN0eWxlKHYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjID0gY1t2IGFzIGtleW9mIENvbG9yaXplT3B0aW9uc10gYXMgU3R5bGVkU3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgY2FzZSBcImJnXCI6XG4gICAgICAgICAgY2FzZSBcImZnXCI6XG4gICAgICAgICAgICByZXR1cm4gYXBwbHlDb2xvcih2YWx1ZSBhcyBudW1iZXIpLnRleHQ7XG4gICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChhcHBseVN0eWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFwcGx5U3R5bGUodmFsdWUgYXMgbnVtYmVyIHwgc3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjLnRleHQ7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgdGhlbWUgb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBhcHBseWluZyBzdHlsZTogJHtvcHRpb259IHdpdGggdmFsdWUgJHt2YWx1ZX1gKTtcbiAgICAgICAgcmV0dXJuIHR4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbmRpdmlkdWFsVGhlbWUgPSB0ZW1wbGF0ZVt0eXBlIGFzIGtleW9mIFRoZW1lXTtcbiAgICBpZiAoIWluZGl2aWR1YWxUaGVtZSB8fCAhT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGxldCBhY3R1YWxUaGVtZTogVGhlbWVPcHRpb24gPSBpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb247XG5cbiAgICBjb25zdCBsb2dMZXZlbHMgPSBPYmplY3QuYXNzaWduKHt9LCBMb2dMZXZlbCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSlbMF0gaW4gbG9nTGV2ZWxzKVxuICAgICAgYWN0dWFsVGhlbWUgPVxuICAgICAgICAoaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uQnlMb2dMZXZlbClbbG9nZ2VyTGV2ZWxdIHx8IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGFjdHVhbFRoZW1lKS5yZWR1Y2UoKGFjYzogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gKGFjdHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uKVtrZXkgYXMga2V5b2YgVGhlbWVPcHRpb25dO1xuICAgICAgaWYgKHZhbClcbiAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgIGFjYyxcbiAgICAgICAgICBrZXkgYXMga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICAgICAgdmFsIGFzXG4gICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgfCBbbnVtYmVyXVxuICAgICAgICAgICAgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbiAgICAgICAgICAgIHwgbnVtYmVyW11cbiAgICAgICAgICAgIHwgc3RyaW5nW11cbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgdGV4dCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,203 +0,0 @@
1
- import { LogLevel } from "../utils/constants";
2
- import { styles } from "styled-string-builder";
3
- export type StringLike = string | {
4
- toString: () => string;
5
- };
6
- export type LoggingContext = string | {
7
- new (...args: any[]): any;
8
- } | ((...args: any[]) => any);
9
- /**
10
- * @description Interface for a logger with verbosity levels.
11
- * @summary Defines methods for logging at different verbosity levels.
12
- * @interface VerbosityLogger
13
- * @memberOf @decaf-ts/utils
14
- */
15
- export interface VerbosityLogger {
16
- /**
17
- * @description Logs a `way too verbose` or a silly message.
18
- * @param {StringLike} msg - The message to log.
19
- */
20
- silly(msg: StringLike): void;
21
- /**
22
- * @description Logs a verbose message.
23
- * @param {StringLike} msg - The message to log.
24
- * @param {number} verbosity - The verbosity level of the message.
25
- */
26
- verbose(msg: StringLike, verbosity?: number): void;
27
- /**
28
- * @description Logs an info message.
29
- * @param {StringLike} msg - The message to log.
30
- */
31
- info(msg: StringLike): void;
32
- /**
33
- * @description Logs an error message.
34
- * @param {StringLike | Error} msg - The message to log.
35
- */
36
- error(msg: StringLike | Error): void;
37
- /**
38
- * @description Logs a debug message.
39
- * @param {string} msg - The message to log.
40
- */
41
- debug(msg: StringLike): void;
42
- for(method?: string | ((...args: any[]) => any), config?: Partial<LoggingConfig>): VerbosityLogger;
43
- setConfig(config: Partial<LoggingConfig>): void;
44
- }
45
- /**
46
- * @description Configuration for logging.
47
- * @summary Defines the log level and verbosity for logging.
48
- * @typedef {Object} LoggingConfig
49
- * @property {LogLevel} level - The logging level.
50
- * @property {number} verbose - The verbosity level.
51
- * @memberOf @decaf-ts/utils
52
- */
53
- export type LoggingConfig = {
54
- level: LogLevel;
55
- logLevel?: boolean;
56
- verbose: number;
57
- separator: string;
58
- style?: boolean;
59
- timestamp?: boolean;
60
- timestampFormat?: string;
61
- context?: boolean;
62
- theme?: Theme;
63
- };
64
- /**
65
- /**
66
- * @description Represents a theme option for console output styling.
67
- * @summary Defines the structure for styling a specific element in the console output.
68
- * It allows for customization of foreground color, background color, and additional styles.
69
- * Colors can be specified as a single number, an RGB array, or left undefined for default.
70
- *
71
- * @interface ThemeOption
72
- * @memberOf @decaf-ts/utils
73
- */
74
- export interface ThemeOption {
75
- fg?: number | [number] | [number, number, number];
76
- bg?: number | [number] | [number, number, number];
77
- style?: number[] | [keyof typeof styles];
78
- }
79
- export type ThemeOptionByLogLevel = Partial<Record<LogLevel, ThemeOption>>;
80
- /**
81
- /**
82
- * @description Defines the color theme for console output.
83
- * @summary This interface specifies the color scheme for various elements of console output,
84
- * including styling for different log levels and components. It uses ThemeOption to
85
- * define the styling for each element, allowing for customization of colors and styles
86
- * for different parts of the log output.
87
- *
88
- * @interface Theme
89
- * @memberOf @decaf-ts/utils
90
- */
91
- export interface Theme {
92
- /**
93
- * @description Styling for class names in the output.
94
- */
95
- class: ThemeOption | ThemeOptionByLogLevel;
96
- /**
97
- * @description Styling for timestamps in the output.
98
- */
99
- timestamp: ThemeOption | ThemeOptionByLogLevel;
100
- /**
101
- * @description Styling for the main message text in the output.
102
- */
103
- message: ThemeOption | ThemeOptionByLogLevel;
104
- /**
105
- * @description Styling for method names in the output.
106
- */
107
- method: ThemeOption | ThemeOptionByLogLevel;
108
- /**
109
- * @description Styling for identifier elements in the output.
110
- */
111
- id: ThemeOption | ThemeOptionByLogLevel;
112
- /**
113
- * @description Styling for identifier elements in the output.
114
- */
115
- stack: ThemeOption;
116
- /**
117
- * @description Styling for different log levels in the output.
118
- */
119
- logLevel: ThemeOptionByLogLevel;
120
- }
121
- /**
122
- * @description Represents a color function in the Kleur library.
123
- * @summary The Color interface defines a function that can be called with or without arguments
124
- * to apply color styling to text or chain multiple color operations.
125
- *
126
- * @interface Color
127
- * @memberOf module:@decaf-ts/utils
128
- * */
129
- export interface Color {
130
- /**
131
- * @description Applies the color to the given text.
132
- * @param {string | number} x - The text or number to be colored.
133
- * @return {string} The colored text.
134
- */
135
- (x: string | number): string;
136
- /**
137
- * @description Allows chaining of multiple color operations.
138
- * @return {Kleur} The Kleur instance for method chaining.
139
- */
140
- (): Kleur;
141
- }
142
- /**
143
- * @description Represents the main Kleur interface with all available color and style methods.
144
- * @summary The Kleur interface provides methods for applying various colors, background colors,
145
- * and text styles to strings in terminal output.
146
- *
147
- * @interface Kleur
148
- * @memberOf module:@decaf-ts/utils
149
- */
150
- export interface Kleur {
151
- /** @description Applies black color to the text. */
152
- black: Color;
153
- /** @description Applies red color to the text. */
154
- red: Color;
155
- /** @description Applies green color to the text. */
156
- green: Color;
157
- /** @description Applies yellow color to the text. */
158
- yellow: Color;
159
- /** @description Applies blue color to the text. */
160
- blue: Color;
161
- /** @description Applies magenta color to the text. */
162
- magenta: Color;
163
- /** @description Applies cyan color to the text. */
164
- cyan: Color;
165
- /** @description Applies white color to the text. */
166
- white: Color;
167
- /** @description Applies gray color to the text. */
168
- gray: Color;
169
- /** @description Alias for gray color. */
170
- grey: Color;
171
- /** @description Applies black background to the text. */
172
- bgBlack: Color;
173
- /** @description Applies red background to the text. */
174
- bgRed: Color;
175
- /** @description Applies green background to the text. */
176
- bgGreen: Color;
177
- /** @description Applies yellow background to the text. */
178
- bgYellow: Color;
179
- /** @description Applies blue background to the text. */
180
- bgBlue: Color;
181
- /** @description Applies magenta background to the text. */
182
- bgMagenta: Color;
183
- /** @description Applies cyan background to the text. */
184
- bgCyan: Color;
185
- /** @description Applies white background to the text. */
186
- bgWhite: Color;
187
- /** @description Resets all applied styles. */
188
- reset: Color;
189
- /** @description Applies bold style to the text. */
190
- bold: Color;
191
- /** @description Applies dim (decreased intensity) style to the text. */
192
- dim: Color;
193
- /** @description Applies italic style to the text. */
194
- italic: Color;
195
- /** @description Applies underline style to the text. */
196
- underline: Color;
197
- /** @description Inverts the foreground and background colors. */
198
- inverse: Color;
199
- /** @description Hides the text (same color as background). */
200
- hidden: Color;
201
- /** @description Applies strikethrough style to the text. */
202
- strikethrough: Color;
203
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3V0cHV0L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHN0eWxlcyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuZXhwb3J0IHR5cGUgU3RyaW5nTGlrZSA9IHN0cmluZyB8IHsgdG9TdHJpbmc6ICgpID0+IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBMb2dnaW5nQ29udGV4dCA9XG4gIHwgc3RyaW5nXG4gIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH1cbiAgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGEgbG9nZ2VyIHdpdGggdmVyYm9zaXR5IGxldmVscy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgbWV0aG9kcyBmb3IgbG9nZ2luZyBhdCBkaWZmZXJlbnQgdmVyYm9zaXR5IGxldmVscy5cbiAqIEBpbnRlcmZhY2UgVmVyYm9zaXR5TG9nZ2VyXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyYm9zaXR5TG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgYHdheSB0b28gdmVyYm9zZWAgb3IgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAgICovXG4gIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2cuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eT86IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2cuXG4gICAqL1xuICBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZSB8IEVycm9yfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2cuXG4gICAqL1xuICBlcnJvcihtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG4gIGZvcihcbiAgICBtZXRob2Q/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogVmVyYm9zaXR5TG9nZ2VyO1xuXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciBsb2dnaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgbG9nIGxldmVsIGFuZCB2ZXJib3NpdHkgZm9yIGxvZ2dpbmcuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2dnaW5nIGxldmVsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBUaGUgdmVyYm9zaXR5IGxldmVsLlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgdHlwZSBMb2dnaW5nQ29uZmlnID0ge1xuICBsZXZlbDogTG9nTGV2ZWw7XG4gIGxvZ0xldmVsPzogYm9vbGVhbjtcbiAgdmVyYm9zZTogbnVtYmVyO1xuICBzZXBhcmF0b3I6IHN0cmluZztcbiAgc3R5bGU/OiBib29sZWFuO1xuICB0aW1lc3RhbXA/OiBib29sZWFuO1xuICB0aW1lc3RhbXBGb3JtYXQ/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBib29sZWFuO1xuICB0aGVtZT86IFRoZW1lO1xufTtcblxuLyoqXG4gLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHRoZW1lIG9wdGlvbiBmb3IgY29uc29sZSBvdXRwdXQgc3R5bGluZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3Igc3R5bGluZyBhIHNwZWNpZmljIGVsZW1lbnQgaW4gdGhlIGNvbnNvbGUgb3V0cHV0LlxuICogSXQgYWxsb3dzIGZvciBjdXN0b21pemF0aW9uIG9mIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBhZGRpdGlvbmFsIHN0eWxlcy5cbiAqIENvbG9ycyBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgc2luZ2xlIG51bWJlciwgYW4gUkdCIGFycmF5LCBvciBsZWZ0IHVuZGVmaW5lZCBmb3IgZGVmYXVsdC5cbiAqXG4gKiBAaW50ZXJmYWNlIFRoZW1lT3B0aW9uXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVPcHRpb24ge1xuICBmZz86IG51bWJlciB8IFtudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGJnPzogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgc3R5bGU/OiBudW1iZXJbXSB8IFtrZXlvZiB0eXBlb2Ygc3R5bGVzXTtcbn1cblxuZXhwb3J0IHR5cGUgVGhlbWVPcHRpb25CeUxvZ0xldmVsID0gUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIFRoZW1lT3B0aW9uPj47XG5cbi8qKlxuIC8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGNvbG9yIHRoZW1lIGZvciBjb25zb2xlIG91dHB1dC5cbiAqIEBzdW1tYXJ5IFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgY29sb3Igc2NoZW1lIGZvciB2YXJpb3VzIGVsZW1lbnRzIG9mIGNvbnNvbGUgb3V0cHV0LFxuICogaW5jbHVkaW5nIHN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCBjb21wb25lbnRzLiBJdCB1c2VzIFRoZW1lT3B0aW9uIHRvXG4gKiBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIGVhY2ggZWxlbWVudCwgYWxsb3dpbmcgZm9yIGN1c3RvbWl6YXRpb24gb2YgY29sb3JzIGFuZCBzdHlsZXNcbiAqIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGxvZyBvdXRwdXQuXG4gKlxuICogQGludGVyZmFjZSBUaGVtZVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgY2xhc3M6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgdGltZXN0YW1wcyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgdGltZXN0YW1wOiBUaGVtZU9wdGlvbiB8IFRoZW1lT3B0aW9uQnlMb2dMZXZlbDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0eWxpbmcgZm9yIHRoZSBtYWluIG1lc3NhZ2UgdGV4dCBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgbWVzc2FnZTogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciBtZXRob2QgbmFtZXMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIG1ldGhvZDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciBpZGVudGlmaWVyIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQuXG4gICAqL1xuICBpZDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciBpZGVudGlmaWVyIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQuXG4gICAqL1xuICBzdGFjazogVGhlbWVPcHRpb247XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciBkaWZmZXJlbnQgbG9nIGxldmVscyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgbG9nTGV2ZWw6IFRoZW1lT3B0aW9uQnlMb2dMZXZlbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIGNvbG9yIGZ1bmN0aW9uIGluIHRoZSBLbGV1ciBsaWJyYXJ5LlxuICogQHN1bW1hcnkgVGhlIENvbG9yIGludGVyZmFjZSBkZWZpbmVzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggb3Igd2l0aG91dCBhcmd1bWVudHNcbiAqIHRvIGFwcGx5IGNvbG9yIHN0eWxpbmcgdG8gdGV4dCBvciBjaGFpbiBtdWx0aXBsZSBjb2xvciBvcGVyYXRpb25zLlxuICpcbiAqIEBpbnRlcmZhY2UgQ29sb3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2xvciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUgY29sb3IgdG8gdGhlIGdpdmVuIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB4IC0gVGhlIHRleHQgb3IgbnVtYmVyIHRvIGJlIGNvbG9yZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbG9yZWQgdGV4dC5cbiAgICovXG4gICh4OiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGxvd3MgY2hhaW5pbmcgb2YgbXVsdGlwbGUgY29sb3Igb3BlcmF0aW9ucy5cbiAgICogQHJldHVybiB7S2xldXJ9IFRoZSBLbGV1ciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgKCk6IEtsZXVyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBtYWluIEtsZXVyIGludGVyZmFjZSB3aXRoIGFsbCBhdmFpbGFibGUgY29sb3IgYW5kIHN0eWxlIG1ldGhvZHMuXG4gKiBAc3VtbWFyeSBUaGUgS2xldXIgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFwcGx5aW5nIHZhcmlvdXMgY29sb3JzLCBiYWNrZ3JvdW5kIGNvbG9ycyxcbiAqIGFuZCB0ZXh0IHN0eWxlcyB0byBzdHJpbmdzIGluIHRlcm1pbmFsIG91dHB1dC5cbiAqXG4gKiBAaW50ZXJmYWNlIEtsZXVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtsZXVyIHtcbiAgLy8gQ29sb3JzXG4gIC8qKiBAZGVzY3JpcHRpb24gQXBwbGllcyBibGFjayBjb2xvciB0byB0aGUgdGV4dC4gKi9cbiAgYmxhY2s6IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgcmVkIGNvbG9yIHRvIHRoZSB0ZXh0LiAqL1xuICByZWQ6IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgZ3JlZW4gY29sb3IgdG8gdGhlIHRleHQuICovXG4gIGdyZWVuOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHllbGxvdyBjb2xvciB0byB0aGUgdGV4dC4gKi9cbiAgeWVsbG93OiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsdWUgY29sb3IgdG8gdGhlIHRleHQuICovXG4gIGJsdWU6IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgbWFnZW50YSBjb2xvciB0byB0aGUgdGV4dC4gKi9cbiAgbWFnZW50YTogQ29sb3I7XG4gIC8qKiBAZGVzY3JpcHRpb24gQXBwbGllcyBjeWFuIGNvbG9yIHRvIHRoZSB0ZXh0LiAqL1xuICBjeWFuOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHdoaXRlIGNvbG9yIHRvIHRoZSB0ZXh0LiAqL1xuICB3aGl0ZTogQ29sb3I7XG4gIC8qKiBAZGVzY3JpcHRpb24gQXBwbGllcyBncmF5IGNvbG9yIHRvIHRoZSB0ZXh0LiAqL1xuICBncmF5OiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgZ3JheSBjb2xvci4gKi9cbiAgZ3JleTogQ29sb3I7XG5cbiAgLy8gQmFja2dyb3VuZHNcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsYWNrIGJhY2tncm91bmQgdG8gdGhlIHRleHQuICovXG4gIGJnQmxhY2s6IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgcmVkIGJhY2tncm91bmQgdG8gdGhlIHRleHQuICovXG4gIGJnUmVkOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGdyZWVuIGJhY2tncm91bmQgdG8gdGhlIHRleHQuICovXG4gIGJnR3JlZW46IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgeWVsbG93IGJhY2tncm91bmQgdG8gdGhlIHRleHQuICovXG4gIGJnWWVsbG93OiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsdWUgYmFja2dyb3VuZCB0byB0aGUgdGV4dC4gKi9cbiAgYmdCbHVlOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIG1hZ2VudGEgYmFja2dyb3VuZCB0byB0aGUgdGV4dC4gKi9cbiAgYmdNYWdlbnRhOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGN5YW4gYmFja2dyb3VuZCB0byB0aGUgdGV4dC4gKi9cbiAgYmdDeWFuOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHdoaXRlIGJhY2tncm91bmQgdG8gdGhlIHRleHQuICovXG4gIGJnV2hpdGU6IENvbG9yO1xuXG4gIC8vIE1vZGlmaWVyc1xuICAvKiogQGRlc2NyaXB0aW9uIFJlc2V0cyBhbGwgYXBwbGllZCBzdHlsZXMuICovXG4gIHJlc2V0OiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJvbGQgc3R5bGUgdG8gdGhlIHRleHQuICovXG4gIGJvbGQ6IENvbG9yO1xuICAvKiogQGRlc2NyaXB0aW9uIEFwcGxpZXMgZGltIChkZWNyZWFzZWQgaW50ZW5zaXR5KSBzdHlsZSB0byB0aGUgdGV4dC4gKi9cbiAgZGltOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGl0YWxpYyBzdHlsZSB0byB0aGUgdGV4dC4gKi9cbiAgaXRhbGljOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHVuZGVybGluZSBzdHlsZSB0byB0aGUgdGV4dC4gKi9cbiAgdW5kZXJsaW5lOiBDb2xvcjtcbiAgLyoqIEBkZXNjcmlwdGlvbiBJbnZlcnRzIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycy4gKi9cbiAgaW52ZXJzZTogQ29sb3I7XG4gIC8qKiBAZGVzY3JpcHRpb24gSGlkZXMgdGhlIHRleHQgKHNhbWUgY29sb3IgYXMgYmFja2dyb3VuZCkuICovXG4gIGhpZGRlbjogQ29sb3I7XG4gIC8qKiBAZGVzY3JpcHRpb24gQXBwbGllcyBzdHJpa2V0aHJvdWdoIHN0eWxlIHRvIHRoZSB0ZXh0LiAqL1xuICBzdHJpa2V0aHJvdWdoOiBDb2xvcjtcbn1cbiJdfQ==