@sonisoft/now-sdk-ext-cli 1.1.0-alpha.3 → 2.0.0-alpha.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/README.md +1825 -34
- package/dist/commands/app/index.d.ts +4 -1
- package/dist/commands/app/index.d.ts.map +1 -1
- package/dist/commands/app/index.js +25 -4
- package/dist/commands/app/index.js.map +1 -1
- package/dist/commands/app/install.d.ts +4 -1
- package/dist/commands/app/install.d.ts.map +1 -1
- package/dist/commands/app/install.js +40 -6
- package/dist/commands/app/install.js.map +1 -1
- package/dist/commands/app/repo-install.d.ts +19 -0
- package/dist/commands/app/repo-install.d.ts.map +1 -0
- package/dist/commands/app/repo-install.js +173 -0
- package/dist/commands/app/repo-install.js.map +1 -0
- package/dist/commands/app/repo-list.d.ts +17 -0
- package/dist/commands/app/repo-list.d.ts.map +1 -0
- package/dist/commands/app/repo-list.js +152 -0
- package/dist/commands/app/repo-list.js.map +1 -0
- package/dist/commands/app/uninstall.d.ts +16 -0
- package/dist/commands/app/uninstall.d.ts.map +1 -0
- package/dist/commands/app/uninstall.js +70 -0
- package/dist/commands/app/uninstall.js.map +1 -0
- package/dist/commands/atf/index.d.ts +71 -0
- package/dist/commands/atf/index.d.ts.map +1 -0
- package/dist/commands/atf/index.js +256 -0
- package/dist/commands/atf/index.js.map +1 -0
- package/dist/commands/exec/index.d.ts +17 -3
- package/dist/commands/exec/index.d.ts.map +1 -1
- package/dist/commands/exec/index.js +286 -26
- package/dist/commands/exec/index.js.map +1 -1
- package/dist/commands/log/index.d.ts +46 -0
- package/dist/commands/log/index.d.ts.map +1 -0
- package/dist/commands/log/index.js +418 -0
- package/dist/commands/log/index.js.map +1 -0
- package/dist/common/authenticated-command.js +2 -2
- package/dist/common/authenticated-command.js.map +1 -1
- package/dist/common/scope-autocomplete.d.ts +20 -0
- package/dist/common/scope-autocomplete.d.ts.map +1 -0
- package/dist/common/scope-autocomplete.js +94 -0
- package/dist/common/scope-autocomplete.js.map +1 -0
- package/oclif.manifest.json +691 -12
- package/package.json +31 -12
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/* eslint-disable perfectionist/sort-objects */
|
|
3
|
+
import { Flags } from '@oclif/core';
|
|
4
|
+
import { Logger, SyslogReader } from '@sonisoft/now-sdk-ext-core';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { AuthenticatedCommand } from '../../common/authenticated-command.js';
|
|
9
|
+
export class Log extends AuthenticatedCommand {
|
|
10
|
+
static args = {};
|
|
11
|
+
static description = 'Tail and monitor ServiceNow system logs in real-time with beautiful formatting.\n\n' +
|
|
12
|
+
'This command provides real-time log monitoring with enhanced visual formatting using color-coded ' +
|
|
13
|
+
'output that makes logs easy to scan and understand at a glance. Automatically highlights errors, ' +
|
|
14
|
+
'warnings, success messages, and important keywords.\n\n' +
|
|
15
|
+
'Key Features:\n' +
|
|
16
|
+
' • Real-time log tailing (like Unix tail -f)\n' +
|
|
17
|
+
' • Powerful filtering with multiple operators (CONTAINS, REGEX, EQUALS, etc.)\n' +
|
|
18
|
+
' • Smart keyword highlighting (errors in red, warnings in yellow, etc.)\n' +
|
|
19
|
+
' • Beautiful color-coded console output with chalk\n' +
|
|
20
|
+
' • Export logs to file with automatic appending\n' +
|
|
21
|
+
' • Fast 1-second default polling interval\n' +
|
|
22
|
+
' • Timestamps and sequence numbers for each log\n' +
|
|
23
|
+
' • Graceful shutdown with Ctrl+C\n' +
|
|
24
|
+
' • Clean output without colors (--no-color flag)\n\n' +
|
|
25
|
+
'Smart Highlighting:\n' +
|
|
26
|
+
' • Error terms (error, exception, failed) - highlighted in RED\n' +
|
|
27
|
+
' • Warning terms (warn, warning, deprecated) - highlighted in YELLOW\n' +
|
|
28
|
+
' • Success terms (success, completed, done) - highlighted in GREEN\n' +
|
|
29
|
+
' • System terms (system, user, transaction) - highlighted in BLUE\n\n' +
|
|
30
|
+
'Filtering:\n' +
|
|
31
|
+
' • Apply filters using --filter flag with syntax: "field OPERATOR value"\n' +
|
|
32
|
+
' • Supports case-sensitive and case-insensitive operations\n' +
|
|
33
|
+
' • Multiple filters are combined with AND logic\n' +
|
|
34
|
+
' • Operators: CONTAINS, CONTAINS_CI, EQUALS, EQUALS_CI, STARTS_WITH, STARTS_WITH_CI,\n' +
|
|
35
|
+
' ENDS_WITH, ENDS_WITH_CI, REGEX, NOT_CONTAINS, NOT_CONTAINS_CI, NOT_EQUALS, NOT_EQUALS_CI\n\n' +
|
|
36
|
+
'Use Cases:\n' +
|
|
37
|
+
' • Monitor logs during application development\n' +
|
|
38
|
+
' • Debug issues in real-time\n' +
|
|
39
|
+
' • Track system events during deployments\n' +
|
|
40
|
+
' • Filter logs for specific application or component\n' +
|
|
41
|
+
' • Quickly spot errors and warnings\n' +
|
|
42
|
+
' • Collect logs for analysis or audit trails\n\n' +
|
|
43
|
+
'⚠️ IMPORTANT NOTES:\n' +
|
|
44
|
+
' • Press Ctrl+C to stop tailing and exit gracefully\n' +
|
|
45
|
+
' • Log files are created/appended automatically\n' +
|
|
46
|
+
' • Uses ChannelAjax when available for better performance\n' +
|
|
47
|
+
' • Default poll interval is 1 second for real-time monitoring';
|
|
48
|
+
static examples = [
|
|
49
|
+
{
|
|
50
|
+
description: 'Tail all logs in real-time',
|
|
51
|
+
command: '<%= config.bin %> <%= command.id %> --auth dev-instance',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
description: 'Tail logs and save to a file',
|
|
55
|
+
command: '<%= config.bin %> <%= command.id %> --output ./logs/instance-logs.txt --auth dev-instance',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
description: 'Tail logs with custom polling interval (500ms for faster updates)',
|
|
59
|
+
command: '<%= config.bin %> <%= command.id %> --interval 500 --auth dev-instance',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
description: 'Filter logs containing specific text (case-insensitive)',
|
|
63
|
+
command: '<%= config.bin %> <%= command.id %> --filter "message CONTAINS_CI error" --auth dev-instance',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
description: 'Filter logs with multiple conditions (AND logic)',
|
|
67
|
+
command: '<%= config.bin %> <%= command.id %> --filter "message CONTAINS x_taniu_tan_core" --filter "message CONTAINS error" --auth dev-instance',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
description: 'Filter logs using regex pattern',
|
|
71
|
+
command: '<%= config.bin %> <%= command.id %> --filter "message REGEX .*exception.*" --auth dev-instance',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
description: 'Filter logs by message starting with a pattern',
|
|
75
|
+
command: '<%= config.bin %> <%= command.id %> --filter "message STARTS_WITH [ERROR]" --auth dev-instance',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
description: 'Tail logs without colored output',
|
|
79
|
+
command: '<%= config.bin %> <%= command.id %> --no-color --auth dev-instance',
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
static flags = {
|
|
83
|
+
'output': Flags.string({
|
|
84
|
+
char: 'o',
|
|
85
|
+
description: 'Output file path to save logs. Creates parent directories if needed.',
|
|
86
|
+
required: false
|
|
87
|
+
}),
|
|
88
|
+
'interval': Flags.integer({
|
|
89
|
+
char: 'i',
|
|
90
|
+
description: 'Polling interval in milliseconds',
|
|
91
|
+
required: false,
|
|
92
|
+
default: 1000
|
|
93
|
+
}),
|
|
94
|
+
'no-color': Flags.boolean({
|
|
95
|
+
description: 'Disable colored output',
|
|
96
|
+
required: false,
|
|
97
|
+
default: false
|
|
98
|
+
}),
|
|
99
|
+
'filter': Flags.string({
|
|
100
|
+
char: 'f',
|
|
101
|
+
description: 'Filter logs by field and value. Syntax: field OPERATOR value. ' +
|
|
102
|
+
'Operators: CONTAINS, CONTAINS_CI (case-insensitive), EQUALS, EQUALS_CI, ' +
|
|
103
|
+
'STARTS_WITH, STARTS_WITH_CI, ENDS_WITH, ENDS_WITH_CI, REGEX, NOT_CONTAINS, NOT_EQUALS. ' +
|
|
104
|
+
'Field defaults to "message" if omitted. Multiple filters are combined with AND logic.',
|
|
105
|
+
required: false,
|
|
106
|
+
multiple: true
|
|
107
|
+
}),
|
|
108
|
+
};
|
|
109
|
+
_logger = new Logger("LogCommand");
|
|
110
|
+
filterRules = [];
|
|
111
|
+
syslogReader;
|
|
112
|
+
async run() {
|
|
113
|
+
const { args, flags } = await this.parse(Log);
|
|
114
|
+
try {
|
|
115
|
+
// Parse filter rules if provided
|
|
116
|
+
if (flags.filter && flags.filter.length > 0) {
|
|
117
|
+
this.filterRules = flags.filter.map(f => this.parseFilter(f));
|
|
118
|
+
this._logger.info(`Applied ${this.filterRules.length} filter(s)`);
|
|
119
|
+
}
|
|
120
|
+
// Create SyslogReader instance
|
|
121
|
+
this.syslogReader = new SyslogReader(this.instance);
|
|
122
|
+
// Ensure output directory exists if output file is specified
|
|
123
|
+
if (flags.output) {
|
|
124
|
+
const outputDir = path.dirname(flags.output);
|
|
125
|
+
if (!fs.existsSync(outputDir)) {
|
|
126
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
127
|
+
this._logger.info(`Created output directory: ${outputDir}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Display header
|
|
131
|
+
this.displayHeader(flags);
|
|
132
|
+
// Handle Ctrl+C gracefully
|
|
133
|
+
process.on('SIGINT', () => {
|
|
134
|
+
this.handleExit();
|
|
135
|
+
});
|
|
136
|
+
// Start tailing logs
|
|
137
|
+
let logCount = 0;
|
|
138
|
+
let filteredCount = 0;
|
|
139
|
+
// Check if the new ChannelAjax method is available, otherwise fall back to regular tailing
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
141
|
+
const reader = this.syslogReader;
|
|
142
|
+
await (
|
|
143
|
+
// Use ChannelAjax method if available
|
|
144
|
+
reader.startTailingWithChannelAjax({
|
|
145
|
+
append: true,
|
|
146
|
+
interval: flags.interval,
|
|
147
|
+
onLog: (log) => {
|
|
148
|
+
// Apply filters before displaying
|
|
149
|
+
if (this.matchesFilters(log)) {
|
|
150
|
+
filteredCount++;
|
|
151
|
+
this.displayLog(log, filteredCount, flags);
|
|
152
|
+
}
|
|
153
|
+
logCount++;
|
|
154
|
+
},
|
|
155
|
+
outputFile: flags.output,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
this._logger.error("Error occurred while tailing logs.", error);
|
|
160
|
+
this.error(error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
displayHeader(flags) {
|
|
164
|
+
const width = 80;
|
|
165
|
+
if (flags['no-color']) {
|
|
166
|
+
const line = '═'.repeat(width);
|
|
167
|
+
console.log(`\n${line}`);
|
|
168
|
+
console.log(` ServiceNow Log Tail (ChannelAjax)`.padEnd(width - 2) + ' ');
|
|
169
|
+
console.log(line);
|
|
170
|
+
console.log(`\n Instance: ${this.instance.getHost()}`);
|
|
171
|
+
console.log(` Method: ChannelAjax logtail`);
|
|
172
|
+
console.log(` Poll Interval: ${flags.interval}ms`);
|
|
173
|
+
if (flags.output) {
|
|
174
|
+
console.log(` Output File: ${flags.output}`);
|
|
175
|
+
}
|
|
176
|
+
if (this.filterRules.length > 0) {
|
|
177
|
+
console.log(` Filters: ${this.filterRules.length} active`);
|
|
178
|
+
for (const rule of this.filterRules) {
|
|
179
|
+
console.log(` - ${rule.field} ${rule.operator} "${rule.value}"`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
console.log(`\n${line}`);
|
|
183
|
+
console.log(' Tailing logs... (Press Ctrl+C to stop)');
|
|
184
|
+
console.log(`${line}\n`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const line = chalk.cyan('═'.repeat(width));
|
|
188
|
+
console.log(`\n${line}`);
|
|
189
|
+
console.log(chalk.bold.white(` 🚀 ServiceNow Log Tail ${chalk.cyan('(ChannelAjax)')}`));
|
|
190
|
+
console.log(line);
|
|
191
|
+
console.log(`\n ${chalk.gray('Instance:')} ${chalk.green(this.instance.getHost())}`);
|
|
192
|
+
console.log(` ${chalk.gray('Method:')} ${chalk.yellow('ChannelAjax logtail')}`);
|
|
193
|
+
console.log(` ${chalk.gray('Poll Interval:')} ${chalk.cyan(`${flags.interval}ms`)}`);
|
|
194
|
+
if (flags.output) {
|
|
195
|
+
console.log(` ${chalk.gray('Output File:')} ${chalk.blue(flags.output)}`);
|
|
196
|
+
}
|
|
197
|
+
if (this.filterRules.length > 0) {
|
|
198
|
+
console.log(` ${chalk.gray('Filters:')} ${chalk.magenta(`${this.filterRules.length} active`)}`);
|
|
199
|
+
for (const rule of this.filterRules) {
|
|
200
|
+
console.log(` ${chalk.gray('•')} ${chalk.cyan(rule.field)} ${chalk.yellow(rule.operator)} ${chalk.green(`"${rule.value}"`)}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
console.log(`\n${line}`);
|
|
204
|
+
console.log(chalk.yellow(' 📡 Tailing logs... ') + chalk.gray('(Press Ctrl+C to stop)'));
|
|
205
|
+
console.log(`${line}\n`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
displayLog(log, count, flags) {
|
|
209
|
+
// Format timestamp
|
|
210
|
+
const date = new Date(log.sys_created_on);
|
|
211
|
+
const timestamp = date.toLocaleString();
|
|
212
|
+
// Get message and detect keywords for highlighting
|
|
213
|
+
const message = log.message;
|
|
214
|
+
const lowerMessage = message.toLowerCase();
|
|
215
|
+
if (flags['no-color']) {
|
|
216
|
+
// No color mode - simple clean output
|
|
217
|
+
const divider = '─'.repeat(80);
|
|
218
|
+
console.log(divider);
|
|
219
|
+
console.log(`⏰ ${timestamp}`);
|
|
220
|
+
if (log.sequence) {
|
|
221
|
+
console.log(`🔢 Sequence: ${log.sequence}`);
|
|
222
|
+
}
|
|
223
|
+
console.log(`💬 ${message}`);
|
|
224
|
+
console.log(`#${count}\n`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Enhanced color mode with chalk
|
|
228
|
+
console.log(chalk.gray('─'.repeat(80)));
|
|
229
|
+
// Timestamp with icon
|
|
230
|
+
console.log(chalk.gray('⏰ ') +
|
|
231
|
+
chalk.dim(timestamp) +
|
|
232
|
+
chalk.gray(' │ ') +
|
|
233
|
+
(log.sequence ? chalk.cyan(`#${log.sequence}`) : chalk.gray('#N/A')) +
|
|
234
|
+
chalk.gray(' │ ') +
|
|
235
|
+
chalk.dim(`log ${count}`));
|
|
236
|
+
// Message with smart highlighting based on content
|
|
237
|
+
let formattedMessage = message;
|
|
238
|
+
// Highlight error-related terms in red
|
|
239
|
+
if (lowerMessage.includes('error') || lowerMessage.includes('exception') ||
|
|
240
|
+
lowerMessage.includes('failed') || lowerMessage.includes('failure')) {
|
|
241
|
+
formattedMessage = this.highlightKeywords(message, ['error', 'exception', 'failed', 'failure', 'ERROR', 'Exception', 'Failed', 'Failure'], chalk.bold.red);
|
|
242
|
+
}
|
|
243
|
+
// Highlight warning terms in yellow
|
|
244
|
+
else if (lowerMessage.includes('warn') || lowerMessage.includes('warning') ||
|
|
245
|
+
lowerMessage.includes('deprecated')) {
|
|
246
|
+
formattedMessage = this.highlightKeywords(message, ['warn', 'warning', 'deprecated', 'Warning', 'WARN', 'Deprecated'], chalk.bold.yellow);
|
|
247
|
+
}
|
|
248
|
+
// Highlight success terms in green
|
|
249
|
+
else if (lowerMessage.includes('success') || lowerMessage.includes('completed') ||
|
|
250
|
+
lowerMessage.includes('finished') || lowerMessage.includes('done')) {
|
|
251
|
+
formattedMessage = this.highlightKeywords(message, ['success', 'completed', 'finished', 'done', 'Success', 'Completed', 'Finished', 'Done'], chalk.bold.green);
|
|
252
|
+
}
|
|
253
|
+
// Highlight important system terms in blue
|
|
254
|
+
else if (lowerMessage.includes('system') || lowerMessage.includes('user') ||
|
|
255
|
+
lowerMessage.includes('transaction') || lowerMessage.includes('request')) {
|
|
256
|
+
formattedMessage = chalk.blue(message);
|
|
257
|
+
}
|
|
258
|
+
// Display the formatted message
|
|
259
|
+
console.log(chalk.white('💬 ') + formattedMessage);
|
|
260
|
+
console.log('');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
handleExit() {
|
|
264
|
+
if (this.flags['no-color']) {
|
|
265
|
+
console.log('\n\n⏹️ Stopping tail...');
|
|
266
|
+
console.log('✅ Stopped. Goodbye!\n');
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
console.log(chalk.yellow('\n\n⏹️ Stopping tail...'));
|
|
270
|
+
console.log(chalk.green('✅ Stopped. ') + chalk.gray('Goodbye!\n'));
|
|
271
|
+
}
|
|
272
|
+
if (this.syslogReader) {
|
|
273
|
+
this.syslogReader.stopTailing();
|
|
274
|
+
}
|
|
275
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
|
|
276
|
+
process.exit(0);
|
|
277
|
+
}
|
|
278
|
+
highlightKeywords(text, keywords, formatter) {
|
|
279
|
+
let result = text;
|
|
280
|
+
for (const keyword of keywords) {
|
|
281
|
+
// Use a regex to find and replace the keyword while preserving the original case
|
|
282
|
+
const regex = new RegExp(`\\b(${keyword})\\b`, 'gi');
|
|
283
|
+
result = result.replace(regex, (match) => formatter(match));
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Check if a log record matches a single filter rule
|
|
289
|
+
* @param log The log record to check
|
|
290
|
+
* @param rule The filter rule to apply
|
|
291
|
+
* @returns true if the log matches the filter, false otherwise
|
|
292
|
+
*/
|
|
293
|
+
matchesFilter(log, rule) {
|
|
294
|
+
// Get the field value from the log
|
|
295
|
+
const fieldValue = log[rule.field];
|
|
296
|
+
// Convert to string for comparison
|
|
297
|
+
const strValue = String(fieldValue ?? '');
|
|
298
|
+
switch (rule.operator) {
|
|
299
|
+
case 'CONTAINS': {
|
|
300
|
+
return strValue.includes(rule.value);
|
|
301
|
+
}
|
|
302
|
+
case 'CONTAINS_CI': {
|
|
303
|
+
return strValue.toLowerCase().includes(rule.value.toLowerCase());
|
|
304
|
+
}
|
|
305
|
+
case 'ENDS_WITH': {
|
|
306
|
+
return strValue.endsWith(rule.value);
|
|
307
|
+
}
|
|
308
|
+
case 'ENDS_WITH_CI': {
|
|
309
|
+
return strValue.toLowerCase().endsWith(rule.value.toLowerCase());
|
|
310
|
+
}
|
|
311
|
+
case 'EQUALS': {
|
|
312
|
+
return strValue === rule.value;
|
|
313
|
+
}
|
|
314
|
+
case 'EQUALS_CI': {
|
|
315
|
+
return strValue.toLowerCase() === rule.value.toLowerCase();
|
|
316
|
+
}
|
|
317
|
+
case 'NOT_CONTAINS': {
|
|
318
|
+
return !strValue.includes(rule.value);
|
|
319
|
+
}
|
|
320
|
+
case 'NOT_CONTAINS_CI': {
|
|
321
|
+
return !strValue.toLowerCase().includes(rule.value.toLowerCase());
|
|
322
|
+
}
|
|
323
|
+
case 'NOT_EQUALS': {
|
|
324
|
+
return strValue !== rule.value;
|
|
325
|
+
}
|
|
326
|
+
case 'NOT_EQUALS_CI': {
|
|
327
|
+
return strValue.toLowerCase() !== rule.value.toLowerCase();
|
|
328
|
+
}
|
|
329
|
+
case 'REGEX': {
|
|
330
|
+
try {
|
|
331
|
+
const regex = new RegExp(rule.value);
|
|
332
|
+
return regex.test(strValue);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
this._logger.error(`Invalid regex pattern: ${rule.value}`, error);
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
case 'STARTS_WITH': {
|
|
340
|
+
return strValue.startsWith(rule.value);
|
|
341
|
+
}
|
|
342
|
+
case 'STARTS_WITH_CI': {
|
|
343
|
+
return strValue.toLowerCase().startsWith(rule.value.toLowerCase());
|
|
344
|
+
}
|
|
345
|
+
default: {
|
|
346
|
+
this._logger.warn(`Unknown filter operator: ${rule.operator}`);
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Check if a log record matches all filter rules
|
|
353
|
+
* @param log The log record to check
|
|
354
|
+
* @returns true if the log matches all filters (AND logic), false otherwise
|
|
355
|
+
*/
|
|
356
|
+
matchesFilters(log) {
|
|
357
|
+
this._logger.debug(`Checking if log matches filters: ${this.filterRules.length}`);
|
|
358
|
+
this._logger.debug(`Filter rules: ${JSON.stringify(this.filterRules)}`);
|
|
359
|
+
this._logger.debug(`Log: ${JSON.stringify(log)}`);
|
|
360
|
+
// If no filters are set, all logs match
|
|
361
|
+
if (this.filterRules.length === 0) {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
// All filters must match (AND logic)
|
|
365
|
+
return this.filterRules.every(rule => this.matchesFilter(log, rule));
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Parse a filter string into a FilterRule object
|
|
369
|
+
* Supports formats:
|
|
370
|
+
* - "field OPERATOR value"
|
|
371
|
+
* - "OPERATOR value" (defaults to message field)
|
|
372
|
+
* @param filterStr The filter string to parse
|
|
373
|
+
* @returns A FilterRule object
|
|
374
|
+
*/
|
|
375
|
+
parseFilter(filterStr) {
|
|
376
|
+
const validOperators = [
|
|
377
|
+
'CONTAINS', 'CONTAINS_CI',
|
|
378
|
+
'ENDS_WITH', 'ENDS_WITH_CI',
|
|
379
|
+
'EQUALS', 'EQUALS_CI',
|
|
380
|
+
'NOT_CONTAINS', 'NOT_CONTAINS_CI',
|
|
381
|
+
'NOT_EQUALS', 'NOT_EQUALS_CI',
|
|
382
|
+
'REGEX',
|
|
383
|
+
'STARTS_WITH', 'STARTS_WITH_CI'
|
|
384
|
+
];
|
|
385
|
+
// Sort operators by length (longest first) to match most specific operator first
|
|
386
|
+
const sortedOperators = [...validOperators].sort((a, b) => b.length - a.length);
|
|
387
|
+
// Try to find an operator in the filter string
|
|
388
|
+
let foundOperator = null;
|
|
389
|
+
let operatorIndex = -1;
|
|
390
|
+
for (const op of sortedOperators) {
|
|
391
|
+
const index = filterStr.indexOf(op);
|
|
392
|
+
if (index !== -1) {
|
|
393
|
+
foundOperator = op;
|
|
394
|
+
operatorIndex = index;
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (!foundOperator) {
|
|
399
|
+
throw new Error(`Invalid filter format: "${filterStr}". ` +
|
|
400
|
+
`Must include one of the following operators: ${validOperators.join(', ')}`);
|
|
401
|
+
}
|
|
402
|
+
const beforeOperator = filterStr.slice(0, operatorIndex).trim();
|
|
403
|
+
const afterOperator = filterStr.slice(operatorIndex + foundOperator.length).trim();
|
|
404
|
+
// If there's text before the operator, use it as the field; otherwise default to "message"
|
|
405
|
+
const field = beforeOperator || 'message';
|
|
406
|
+
const value = afterOperator;
|
|
407
|
+
if (!value) {
|
|
408
|
+
throw new Error(`Invalid filter format: "${filterStr}". ` +
|
|
409
|
+
`Value after operator "${foundOperator}" cannot be empty.`);
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
field,
|
|
413
|
+
operator: foundOperator,
|
|
414
|
+
value
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/log/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,8 +42,8 @@ export class AuthenticatedCommand extends Command {
|
|
|
42
42
|
this.args = args;
|
|
43
43
|
// const wrapper:CredentialWrapper = new CredentialWrapper();
|
|
44
44
|
// const credential:Creds = await (flags.auth ? wrapper.getStoredCredentialsByAlias(flags.auth) : wrapper.getStoredCredentialsByAlias( 'fluent-default'));
|
|
45
|
-
const credentialArgs = {
|
|
46
|
-
const credential = await getCredentials(
|
|
45
|
+
// const credentialArgs = {"_": "get-credentials", auth: flags.auth || "fluent-default"};
|
|
46
|
+
const credential = await getCredentials(flags.auth || "fluent-default");
|
|
47
47
|
this.authLogger.debug("Credentials Received: ", credential);
|
|
48
48
|
if (credential) {
|
|
49
49
|
const snSettings = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticated-command.js","sourceRoot":"","sources":["../../src/common/authenticated-command.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAA8B,MAAM,4BAA4B,CAAC;AAOpG,MAAM,OAAgB,oBAA+C,SAAQ,OAAO;IACpF,kFAAkF;IAChF,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;QACrF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU;YAC7D,OAAO,EAAE,4BAA4B;SAEtC,CAAC,EAAE;KACL,CAAA;IAEC,sBAAsB;IACtB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAElB,IAAI,CAAW;IACf,UAAU,GAAU,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvD,KAAK,CAAY;IAGjB,QAAQ,CAAqB;IAE/B,KAAK,CAAC,KAAK,CAAC,GAAgC;QACpD,yDAAyD;QACzD,mDAAmD;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAElE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,CAAoB;QAC1C,8EAA8E;QAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,SAAS,EAAG,KAAK,CAAC,IAAoC,CAAC,SAAS;YAChE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc;YACxC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SACzB,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,GAAG,KAAiB,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAe,CAAA;QAG3B,6DAA6D;QAC7D,0JAA0J;QAC1J,MAAM,
|
|
1
|
+
{"version":3,"file":"authenticated-command.js","sourceRoot":"","sources":["../../src/common/authenticated-command.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAA8B,MAAM,4BAA4B,CAAC;AAOpG,MAAM,OAAgB,oBAA+C,SAAQ,OAAO;IACpF,kFAAkF;IAChF,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;QACrF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU;YAC7D,OAAO,EAAE,4BAA4B;SAEtC,CAAC,EAAE;KACL,CAAA;IAEC,sBAAsB;IACtB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAElB,IAAI,CAAW;IACf,UAAU,GAAU,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvD,KAAK,CAAY;IAGjB,QAAQ,CAAqB;IAE/B,KAAK,CAAC,KAAK,CAAC,GAAgC;QACpD,yDAAyD;QACzD,mDAAmD;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAElE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,CAAoB;QAC1C,8EAA8E;QAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,SAAS,EAAG,KAAK,CAAC,IAAoC,CAAC,SAAS;YAChE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc;YACxC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SACzB,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,GAAG,KAAiB,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAe,CAAA;QAG3B,6DAA6D;QAC7D,0JAA0J;QAC1J,yFAAyF;QAEzF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAG,UAAU,EAAC,CAAC;YACZ,MAAM,UAAU,GAA8B;gBACzC,KAAK,EAAE,KAAK,CAAC,IAAI;gBAClB,UAAU;aACZ,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,6DAA6D,EAAE,UAAU,CAAC,CAAC;YACjG,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;aAAI,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wDAAwD,EAAE,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC;QAC1H,CAAC;IAEH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ScopeInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
scope: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Query ServiceNow for available scopes matching a prefix
|
|
7
|
+
* @param authAlias - Authentication alias to use
|
|
8
|
+
* @param prefix - Prefix to filter scopes by
|
|
9
|
+
* @returns Promise resolving to array of scope names
|
|
10
|
+
*/
|
|
11
|
+
export declare function queryScopes(authAlias: string | undefined, prefix?: string): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Get cached scopes or query if needed
|
|
14
|
+
* This provides a simple caching mechanism to speed up autocomplete
|
|
15
|
+
* @param authAlias - Authentication alias to use
|
|
16
|
+
* @param prefix - Prefix to filter scopes by
|
|
17
|
+
* @returns Promise resolving to array of scope names
|
|
18
|
+
*/
|
|
19
|
+
export declare function getCachedScopes(authAlias: string | undefined, prefix?: string): Promise<string[]>;
|
|
20
|
+
//# sourceMappingURL=scope-autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-autocomplete.d.ts","sourceRoot":"","sources":["../../src/common/scope-autocomplete.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AA6BD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsDvG;AAQD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY3G"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { getCredentials } from "@servicenow/sdk-cli/dist/auth/index.js";
|
|
3
|
+
import { ServiceNowInstance } from '@sonisoft/now-sdk-ext-core';
|
|
4
|
+
/**
|
|
5
|
+
* Get authorization header based on credential type
|
|
6
|
+
* @param credential - ServiceNow credential object
|
|
7
|
+
* @param username - Username for basic auth
|
|
8
|
+
* @returns Authorization header string
|
|
9
|
+
*/
|
|
10
|
+
function getAuthHeader(credential, username) {
|
|
11
|
+
if (credential.type === 'basic' && 'password' in credential) {
|
|
12
|
+
return `Basic ${Buffer.from(`${username}:${credential.password}`).toString('base64')}`;
|
|
13
|
+
}
|
|
14
|
+
if (credential.type === 'oauth' && 'access_token' in credential) {
|
|
15
|
+
return `Bearer ${credential.access_token}`;
|
|
16
|
+
}
|
|
17
|
+
throw new Error('Unsupported authentication type');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Query ServiceNow for available scopes matching a prefix
|
|
21
|
+
* @param authAlias - Authentication alias to use
|
|
22
|
+
* @param prefix - Prefix to filter scopes by
|
|
23
|
+
* @returns Promise resolving to array of scope names
|
|
24
|
+
*/
|
|
25
|
+
export async function queryScopes(authAlias, prefix = '') {
|
|
26
|
+
try {
|
|
27
|
+
// Get credentials
|
|
28
|
+
const credential = await getCredentials(authAlias || "fluent-default");
|
|
29
|
+
if (!credential) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
// Create ServiceNow instance
|
|
33
|
+
const snSettings = {
|
|
34
|
+
alias: authAlias,
|
|
35
|
+
credential
|
|
36
|
+
};
|
|
37
|
+
const instance = new ServiceNowInstance(snSettings);
|
|
38
|
+
// Query sys_scope table via REST API
|
|
39
|
+
const url = `${instance.getHost()}/api/now/table/sys_scope`;
|
|
40
|
+
const params = new URLSearchParams({
|
|
41
|
+
sysparm_fields: 'scope,name',
|
|
42
|
+
sysparm_limit: '50',
|
|
43
|
+
sysparm_query: prefix ? `scopeSTARTSWITH${prefix}^ORnameSTARTSWITH${prefix}` : ''
|
|
44
|
+
});
|
|
45
|
+
const response = await fetch(`${url}?${params.toString()}`, {
|
|
46
|
+
headers: {
|
|
47
|
+
'Accept': 'application/json',
|
|
48
|
+
'Authorization': getAuthHeader(credential, instance.getUserName()),
|
|
49
|
+
'Content-Type': 'application/json'
|
|
50
|
+
},
|
|
51
|
+
method: 'GET'
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const data = await response.json();
|
|
57
|
+
const scopes = [];
|
|
58
|
+
if (data.result && Array.isArray(data.result)) {
|
|
59
|
+
for (const record of data.result) {
|
|
60
|
+
if (record.scope) {
|
|
61
|
+
scopes.push(record.scope);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return scopes;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Silently fail for autocomplete
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Cache for storing scope query results
|
|
74
|
+
*/
|
|
75
|
+
const scopeCache = new Map();
|
|
76
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
77
|
+
/**
|
|
78
|
+
* Get cached scopes or query if needed
|
|
79
|
+
* This provides a simple caching mechanism to speed up autocomplete
|
|
80
|
+
* @param authAlias - Authentication alias to use
|
|
81
|
+
* @param prefix - Prefix to filter scopes by
|
|
82
|
+
* @returns Promise resolving to array of scope names
|
|
83
|
+
*/
|
|
84
|
+
export async function getCachedScopes(authAlias, prefix = '') {
|
|
85
|
+
const cacheKey = `${authAlias || 'default'}:${prefix}`;
|
|
86
|
+
const cached = scopeCache.get(cacheKey);
|
|
87
|
+
if (cached && (Date.now() - cached.timestamp) < CACHE_TTL) {
|
|
88
|
+
return cached.scopes;
|
|
89
|
+
}
|
|
90
|
+
const scopes = await queryScopes(authAlias, prefix);
|
|
91
|
+
scopeCache.set(cacheKey, { scopes, timestamp: Date.now() });
|
|
92
|
+
return scopes;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=scope-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-autocomplete.js","sourceRoot":"","sources":["../../src/common/scope-autocomplete.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAI9B,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAA8B,MAAM,4BAA4B,CAAC;AAgB5F;;;;;GAKG;AACH,SAAS,aAAa,CAAC,UAAiB,EAAE,QAAgB;IACxD,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAC5D,OAAO,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzF,CAAC;IAEF,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;QAC/D,OAAO,UAAU,UAAU,CAAC,YAAY,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAA6B,EAAE,SAAiB,EAAE;IAClF,IAAI,CAAC;QACH,kBAAkB;QAElB,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAA+B;YAC7C,KAAK,EAAE,SAAS;YAChB,UAAU;SACX,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEpD,qCAAqC;QACrC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,MAAM,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;SAClF,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;YAC1D,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,eAAe,EAAE,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAClE,cAAc,EAAE,kBAAkB;aACnC;YACD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;QACvD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmD,CAAC;AAC9E,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAA6B,EAAE,SAAiB,EAAE;IACtF,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|