cli-api 0.1.1 → 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.
Files changed (43) hide show
  1. package/README.md +22 -25
  2. package/dist/index.d.mts +394 -0
  3. package/dist/index.mjs +3 -0
  4. package/dist/interfaces-COq24bNI.mjs +391 -0
  5. package/dist/run-C903J5ca.mjs +1137 -0
  6. package/package.json +37 -37
  7. package/.hgignore +0 -12
  8. package/.idea/$CACHE_FILE$ +0 -6
  9. package/.idea/clap.iml +0 -8
  10. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  11. package/.idea/deployment.xml +0 -63
  12. package/.idea/inspectionProfiles/Project_Default.xml +0 -10
  13. package/.idea/misc.xml +0 -6
  14. package/.idea/modules.xml +0 -8
  15. package/.idea/vcs.xml +0 -6
  16. package/Makefile +0 -14
  17. package/babel.config.json +0 -33
  18. package/dist/cjs/index.js +0 -588
  19. package/dist/cjs/index.js.map +0 -1
  20. package/dist/es/index.mjs +0 -578
  21. package/dist/es/index.mjs.map +0 -1
  22. package/dist/types/app-help.d.ts +0 -3
  23. package/dist/types/commands/command-help.d.ts +0 -2
  24. package/dist/types/commands/version.d.ts +0 -2
  25. package/dist/types/constants.d.ts +0 -4
  26. package/dist/types/index.d.ts +0 -3
  27. package/dist/types/interfaces.d.ts +0 -79
  28. package/dist/types/options.d.ts +0 -7
  29. package/dist/types/print-command-help.d.ts +0 -2
  30. package/dist/types/run.d.ts +0 -2
  31. package/dist/types/utils.d.ts +0 -17
  32. package/rollup.config.js +0 -44
  33. package/src/app-help.ts +0 -34
  34. package/src/commands/command-help.ts +0 -28
  35. package/src/commands/version.ts +0 -11
  36. package/src/constants.ts +0 -4
  37. package/src/index.ts +0 -3
  38. package/src/interfaces.ts +0 -89
  39. package/src/options.ts +0 -266
  40. package/src/print-command-help.ts +0 -78
  41. package/src/run.ts +0 -45
  42. package/src/utils.ts +0 -86
  43. package/tsconfig.json +0 -32
package/dist/cjs/index.js DELETED
@@ -1,588 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var Path = require('path');
6
- var stringWidth = require('string-width');
7
- var Chalk = require('chalk');
8
- var FileSys = require('fs');
9
-
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
-
12
- var Path__default = /*#__PURE__*/_interopDefaultLegacy(Path);
13
- var stringWidth__default = /*#__PURE__*/_interopDefaultLegacy(stringWidth);
14
- var Chalk__default = /*#__PURE__*/_interopDefaultLegacy(Chalk);
15
- var FileSys__default = /*#__PURE__*/_interopDefaultLegacy(FileSys);
16
-
17
- exports.OptType = void 0;
18
-
19
- (function (OptType) {
20
- OptType[OptType["STRING"] = 0] = "STRING";
21
- OptType[OptType["BOOL"] = 1] = "BOOL";
22
- OptType[OptType["INT"] = 2] = "INT";
23
- OptType[OptType["FLOAT"] = 3] = "FLOAT";
24
- OptType[OptType["ENUM"] = 4] = "ENUM";
25
- OptType[OptType["INPUT_FILE"] = 5] = "INPUT_FILE";
26
- OptType[OptType["INPUT_DIRECTORY"] = 6] = "INPUT_DIRECTORY";
27
- OptType[OptType["OUTPUT_FILE"] = 7] = "OUTPUT_FILE";
28
- OptType[OptType["OUTPUT_DIRECTORY"] = 8] = "OUTPUT_DIRECTORY";
29
- OptType[OptType["EMPTY_DIRECTORY"] = 9] = "EMPTY_DIRECTORY";
30
- })(exports.OptType || (exports.OptType = {}));
31
-
32
- const EMPTY_ARRAY = Object.freeze([]);
33
- Object.freeze(Object.create({
34
- __proto__: null
35
- }));
36
- const TRUE_VALUES = new Set(['y', 'yes', 't', 'true', '1', 'on']);
37
- const FALSE_VALUES = new Set(['n', 'no', 'f', 'false', '0', 'off']);
38
-
39
- const print = process.stdout.write.bind(process.stdout);
40
- const printLn = console.log.bind(console);
41
-
42
- function blockError(str) {
43
- const lines = str.split('\n');
44
- const width = Math.max(...lines.map(l => stringWidth__default['default'](l))) + 4;
45
- printLn(Chalk__default['default'].bgRed(space(width)));
46
-
47
- for (const line of lines) {
48
- const txt = ` ${line}`;
49
- printLn(Chalk__default['default'].bgRed(txt + space(width, txt)));
50
- }
51
-
52
- printLn(Chalk__default['default'].bgRed(space(width)));
53
- }
54
-
55
- function abort(message, code = 1) {
56
- blockError(message);
57
- process.exit(code);
58
- }
59
- function toArray(x) {
60
- if (!x) return EMPTY_ARRAY;
61
- return Array.isArray(x) ? x : [x];
62
- }
63
- function resolve(x) {
64
- return typeof x === 'function' ? x() : x;
65
- }
66
- function toBool(str) {
67
- if (typeof str === 'boolean') return str;
68
- str = String(str).trim().toLowerCase();
69
-
70
- if (TRUE_VALUES.has(str)) {
71
- return true;
72
- }
73
-
74
- if (FALSE_VALUES.has(str)) {
75
- return false;
76
- }
77
-
78
- throw new Error(`Could not cast "${str}" to boolean`);
79
- }
80
- function space(len, str) {
81
- if (str) {
82
- len -= stringWidth__default['default'](str);
83
- }
84
-
85
- return len > 0 ? ' '.repeat(len) : '';
86
- }
87
- function getProcName(app) {
88
- if (app.argv0 != null) {
89
- return app.argv0;
90
- }
91
-
92
- const relPath = Path__default['default'].relative(process.cwd(), process.argv[1]);
93
- return `${Path__default['default'].basename(process.argv[0])} ${relPath.length < process.argv[1].length ? relPath : process.argv[1]}`;
94
- }
95
- function includes(needle, haystack) {
96
- if (!haystack) return false;
97
- if (Array.isArray(haystack)) return haystack.includes(needle);
98
- return needle === haystack;
99
- }
100
- function statSync(path) {
101
- try {
102
- return FileSys__default['default'].lstatSync(path);
103
- } catch {
104
- return null;
105
- }
106
- }
107
- function sortBy(arr, cmp) {
108
- const collator = new Intl.Collator();
109
- const values = arr.map(cmp);
110
- const keys = Array.from(arr.keys());
111
- keys.sort((a, b) => collator.compare(values[a], values[b]));
112
- return keys.map(i => arr[i]);
113
- }
114
-
115
- function formatOption(opt) {
116
- var _opt$description;
117
-
118
- const aliases = [];
119
-
120
- if (opt.alias) {
121
- if (Array.isArray(opt.alias)) {
122
- aliases.push(...opt.alias);
123
- } else {
124
- aliases.push(opt.alias);
125
- }
126
- }
127
-
128
- aliases.push(opt.name);
129
- let flags = aliases.map(a => Chalk__default['default'].green(a.length === 1 ? `-${a}` : `--${a}`)).join(', ');
130
- let valuePlaceholder = getValuePlaceholder(opt);
131
-
132
- if (opt.type !== exports.OptType.BOOL) {
133
- flags += `=${valuePlaceholder}`;
134
- }
135
-
136
- let desc = (_opt$description = opt.description) != null ? _opt$description : '';
137
- let defaultValueText = opt.defaultValueText;
138
-
139
- if (defaultValueText === undefined && opt.defaultValue !== undefined) {
140
- defaultValueText = JSON.stringify(resolve(opt.defaultValue));
141
- }
142
-
143
- if (defaultValueText !== undefined) {
144
- desc += Chalk__default['default'].yellow(` [default: ${defaultValueText}]`);
145
- }
146
-
147
- return [flags, desc];
148
- }
149
- function getValuePlaceholder(opt) {
150
- if (opt.valuePlaceholder !== undefined) {
151
- return opt.valuePlaceholder;
152
- }
153
-
154
- if (Array.isArray(opt.type)) {
155
- return opt.type.join('|');
156
- } else if (opt.type == exports.OptType.BOOL) {
157
- return JSON.stringify(!resolve(opt.defaultValue));
158
- } else if (opt.type === exports.OptType.INT || opt.type === exports.OptType.FLOAT) {
159
- return '#';
160
- } else if (opt.type === exports.OptType.INPUT_FILE || opt.type === exports.OptType.OUTPUT_FILE) {
161
- return 'FILE';
162
- } else if (opt.type === exports.OptType.INPUT_DIRECTORY || opt.type === exports.OptType.OUTPUT_DIRECTORY || opt.type === exports.OptType.EMPTY_DIRECTORY) {
163
- return 'DIR';
164
- } else {
165
- return opt.name;
166
- }
167
- }
168
- function getOptions(cmd) {
169
- return [...toArray(cmd.options), ...toArray(cmd.flags).map(f => ({ ...f,
170
- valueNotRequired: true,
171
- type: exports.OptType.BOOL
172
- }))];
173
- }
174
- function parseArgs(cmd, argv) {
175
- var _cmd$arguments;
176
-
177
- const args = [];
178
- const opts = Object.create(null);
179
- let parseFlags = true;
180
- const allOptions = getOptions(cmd);
181
- let argIdx = 0;
182
-
183
- for (let i = 0; i < argv.length; ++i) {
184
- let arg = argv[i];
185
-
186
- if (parseFlags && arg === '--') {
187
- parseFlags = false;
188
- continue;
189
- }
190
-
191
- if (parseFlags && arg.length >= 2 && arg.startsWith('-')) {
192
- var _opt$key;
193
-
194
- let name;
195
- let value;
196
-
197
- if (arg.includes('=')) {
198
- [arg, value] = arg.split('=', 2);
199
- }
200
-
201
- if (arg.startsWith('--')) {
202
- name = arg.slice(2);
203
- } else {
204
- if (arg.length > 2) {
205
- if (value !== undefined) {
206
- abort(`Malformed option "${arg}"`);
207
- }
208
-
209
- value = arg.slice(2);
210
- arg = arg.slice(0, 2);
211
- }
212
-
213
- name = arg.slice(1);
214
- }
215
-
216
- const opt = allOptions.find(opt => opt.name === name || includes(name, opt.alias));
217
-
218
- if (!opt) {
219
- abort(`"${cmd.name}" command does not have option "${name}".`);
220
- }
221
-
222
- if (value === undefined) {
223
- if (opt.valueNotRequired) {
224
- value = !resolve(opt.defaultValue);
225
- } else if (i < argv.length - 1) {
226
- value = argv[++i];
227
- } else {
228
- abort(`Missing required value for option "${arg}"`);
229
- }
230
- }
231
-
232
- if (opt.type != null) {
233
- value = coerceType(value, opt.type);
234
- }
235
-
236
- opts[(_opt$key = opt.key) != null ? _opt$key : opt.name] = value;
237
- } else {
238
- let value = arg;
239
-
240
- if (cmd.arguments && cmd.arguments.length > argIdx) {
241
- const cmdArg = cmd.arguments[argIdx];
242
-
243
- if (cmdArg.type != null) {
244
- value = coerceType(value, cmdArg.type);
245
- }
246
-
247
- if (cmdArg.key) {
248
- opts[cmdArg.key] = value;
249
- }
250
- }
251
-
252
- args.push(value);
253
- ++argIdx;
254
- }
255
- }
256
-
257
- if (allOptions.length) {
258
- for (const opt of allOptions) {
259
- var _opt$key2;
260
-
261
- const k = (_opt$key2 = opt.key) != null ? _opt$key2 : opt.name;
262
-
263
- if (opts[k] === undefined) {
264
- if (opt.defaultValue !== undefined) {
265
- opts[k] = resolve(opt.defaultValue);
266
- } else if (opt.required) {
267
- throw new Error(`"${getOptName(opt)}" option is required`);
268
- } else ;
269
- }
270
- }
271
- }
272
-
273
- if ((_cmd$arguments = cmd.arguments) != null && _cmd$arguments.length) {
274
- for (let i = 0; i < cmd.arguments.length; ++i) {
275
- if (cmd.arguments[i].required && argIdx <= i) {
276
- throw new Error(`"${cmd.arguments[i].name}" argument is required`);
277
- }
278
- }
279
- }
280
-
281
- return [args, opts];
282
- }
283
-
284
- function coerceType(value, type) {
285
- if (Array.isArray(type)) {
286
- return String(value).trim().toLowerCase();
287
- }
288
-
289
- switch (type) {
290
- case exports.OptType.BOOL:
291
- return toBool(value);
292
-
293
- case exports.OptType.INT:
294
- return Math.trunc(Number(value));
295
-
296
- case exports.OptType.FLOAT:
297
- return Number(value);
298
-
299
- case exports.OptType.ENUM:
300
- return String(value).trim().toLowerCase();
301
-
302
- case exports.OptType.STRING:
303
- return String(value);
304
-
305
- case exports.OptType.INPUT_FILE:
306
- {
307
- if (value === '-') return '/dev/stdin';
308
- const file = Path__default['default'].normalize(value);
309
- const fullPath = Path__default['default'].resolve(file);
310
- const stat = statSync(file);
311
-
312
- if (!stat) {
313
- throw new Error(`File ${Chalk__default['default'].underline(fullPath)} does not exist`);
314
- }
315
-
316
- if (!stat.isFile()) {
317
- throw new Error(`${Chalk__default['default'].underline(fullPath)} is not a file`);
318
- }
319
-
320
- try {
321
- FileSys__default['default'].accessSync(file, FileSys__default['default'].constants.R_OK);
322
- } catch (err) {
323
- throw new Error(`${Chalk__default['default'].underline(fullPath)} is not readable`);
324
- }
325
-
326
- return file;
327
- }
328
-
329
- case exports.OptType.INPUT_DIRECTORY:
330
- const dir = Path__default['default'].normalize(value);
331
- FileSys__default['default'].accessSync(dir, FileSys__default['default'].constants.X_OK);
332
- return dir;
333
-
334
- case exports.OptType.OUTPUT_FILE:
335
- {
336
- if (value === '-') return '/dev/stdout';
337
- const file = Path__default['default'].normalize(value);
338
- const stat = statSync(file);
339
-
340
- if (stat) {
341
- if (!stat.isFile()) {
342
- throw new Error(`'${file}' is not a file`);
343
- }
344
-
345
- FileSys__default['default'].accessSync(file, FileSys__default['default'].constants.W_OK);
346
- } else {
347
- FileSys__default['default'].accessSync(Path__default['default'].dirname(file), FileSys__default['default'].constants.W_OK);
348
- }
349
-
350
- return file;
351
- }
352
-
353
- case exports.OptType.OUTPUT_DIRECTORY:
354
- {
355
- FileSys__default['default'].accessSync(value, FileSys__default['default'].constants.W_OK);
356
- return Path__default['default'].normalize(value);
357
- }
358
-
359
- case exports.OptType.EMPTY_DIRECTORY:
360
- {
361
- const dir = Path__default['default'].normalize(value);
362
- let files = [];
363
-
364
- try {
365
- files = FileSys__default['default'].readdirSync(dir);
366
- } catch (err) {
367
- if (err.code === 'ENOENT') {
368
- FileSys__default['default'].accessSync(Path__default['default'].dirname(dir), FileSys__default['default'].constants.W_OK);
369
- } else {
370
- throw err;
371
- }
372
- }
373
-
374
- if (files.length) {
375
- throw new Error(`${Chalk__default['default'].underline(dir)} is not empty`);
376
- }
377
-
378
- return dir;
379
- }
380
- }
381
-
382
- return value;
383
- }
384
-
385
- function getOptName(opt) {
386
- return (opt.name.length > 1 ? '--' : '-') + opt.name;
387
- }
388
- function getCommand(name, app) {
389
- const cmdName = String(name).trim().replace(/^-{1,2}/, '').toLowerCase();
390
- const cmd = app.commands.find(c => c.name === cmdName || includes(cmdName, c.alias));
391
-
392
- if (cmd === undefined) {
393
- throw new Error(`Command "${name}" does not exist.`);
394
- }
395
-
396
- return cmd;
397
- }
398
-
399
- function printCommandHelp(app, cmd) {
400
- var _cmd$arguments, _cmd$arguments2;
401
-
402
- if (cmd.description) {
403
- printLn(cmd.description);
404
- printLn();
405
- }
406
-
407
- printLn(Chalk__default['default'].yellow("Usage:"));
408
- print(` ${Chalk__default['default'].cyan(getProcName(app))} ${cmd.name}`);
409
- const allOptions = getOptions(cmd);
410
-
411
- if (allOptions.length) {
412
- let otherOptions = 0;
413
-
414
- for (let opt of allOptions) {
415
- if (opt.required) {
416
- print(` ${getOptName(opt)}`);
417
-
418
- if (opt.type !== exports.OptType.BOOL) {
419
- print(`=${getValuePlaceholder(opt)}`);
420
- }
421
- } else {
422
- ++otherOptions;
423
- }
424
- }
425
-
426
- if (otherOptions) {
427
- print(` ${Chalk__default['default'].gray('[')}options${Chalk__default['default'].gray(']')}`);
428
- }
429
- }
430
-
431
- if ((_cmd$arguments = cmd.arguments) != null && _cmd$arguments.length) {
432
- print(` ${Chalk__default['default'].grey('[')}--${Chalk__default['default'].grey(']')}`);
433
-
434
- for (const arg of cmd.arguments) {
435
- print(' ');
436
- print(Chalk__default['default'].grey(arg.required ? '<' : '['));
437
-
438
- if (arg.repeatable) {
439
- print(Chalk__default['default'].grey('...'));
440
- }
441
-
442
- print(arg.name);
443
- print(Chalk__default['default'].grey(arg.required ? '>' : ']'));
444
- }
445
- }
446
-
447
- printLn();
448
-
449
- if (allOptions.length) {
450
- printLn(Chalk__default['default'].yellow("\nOptions:"));
451
- const lines = allOptions.map(formatOption);
452
- const width = Math.max(...lines.map(l => stringWidth__default['default'](l[0])));
453
-
454
- for (const line of lines) {
455
- printLn(' ' + line[0] + space(width + 2, line[0]) + line[1]);
456
- }
457
- }
458
-
459
- if ((_cmd$arguments2 = cmd.arguments) != null && _cmd$arguments2.length) {
460
- printLn(Chalk__default['default'].yellow("\nArguments:"));
461
- const width = Math.max(...cmd.arguments.map(a => stringWidth__default['default'](a.name)));
462
-
463
- for (const arg of cmd.arguments) {
464
- print(' ' + Chalk__default['default'].green(arg.name));
465
-
466
- if (arg.description) {
467
- print(space(width + 2, arg.name) + arg.description);
468
- }
469
-
470
- printLn();
471
- }
472
- }
473
-
474
- if (cmd.alias) {
475
- const alaises = toArray(cmd.alias);
476
- printLn(Chalk__default['default'].yellow(`\nAlias${alaises.length !== 1 ? 'es' : ''}: `) + toArray(cmd.alias).join(Chalk__default['default'].gray(', ')));
477
- }
478
-
479
- if (cmd.longDescription) {
480
- printLn(Chalk__default['default'].yellow("\nDescription:"));
481
- printLn(' ' + cmd.longDescription);
482
- }
483
- }
484
-
485
- function printHelp(app) {
486
- print(Chalk__default['default'].green(app.name));
487
-
488
- if (app.version) {
489
- print(` version ${Chalk__default['default'].yellow(app.version)}`);
490
- }
491
-
492
- print('\n\n');
493
- printLn(Chalk__default['default'].yellow("Usage:"));
494
- printLn(` ${Chalk__default['default'].cyan(getProcName(app))} ${Chalk__default['default'].gray('<')}command${Chalk__default['default'].gray('>')} ${Chalk__default['default'].gray(`[options] [arguments]`)}\n`);
495
-
496
- if (app.globalOptions) {
497
- printLn("TODO");
498
- }
499
-
500
- printAvailableCommands(app);
501
- }
502
- function printAvailableCommands(app) {
503
- printLn(Chalk__default['default'].yellow("Available commands:"));
504
- const width = Math.max(...app.commands.map(c => stringWidth__default['default'](c.name))) + 2;
505
-
506
- for (const cmd of app.commands) {
507
- print(` ${Chalk__default['default'].green(cmd.name)}`);
508
-
509
- if (cmd.description) {
510
- print(`${space(width, cmd.name)}${cmd.description}`);
511
- }
512
-
513
- printLn();
514
- }
515
- }
516
-
517
- const helpCommand = {
518
- name: 'help',
519
- description: "Displays help for a command",
520
- arguments: [{
521
- name: "command",
522
- description: "The command name.",
523
- required: false
524
- }],
525
-
526
- async execute(options, [commandName], app) {
527
- if (commandName) {
528
- printCommandHelp(app, getCommand(commandName, app));
529
- } else {
530
- printCommandHelp(app, getCommand('help', app));
531
- printLn();
532
- printAvailableCommands(app);
533
- }
534
- }
535
-
536
- };
537
-
538
- const versionCommand = {
539
- name: 'version',
540
- description: "Displays current version",
541
-
542
- async execute(opts, args, app) {
543
- printLn(app.version);
544
- }
545
-
546
- };
547
-
548
- function run(app) {
549
- app = { ...app,
550
- commands: [...sortBy(app.commands, c => c.name), versionCommand, helpCommand]
551
- };
552
-
553
- if (process.argv.length <= 2) {
554
- printHelp(app);
555
- process.exit(0);
556
- }
557
-
558
- const cmd = getCommand(process.argv[2], app);
559
- const rawArgs = process.argv.slice(3);
560
-
561
- if (rawArgs.includes('--help')) {
562
- printCommandHelp(app, cmd);
563
- process.exit(0);
564
- }
565
-
566
- let args, opts;
567
-
568
- try {
569
- [args, opts] = parseArgs(cmd, rawArgs);
570
- } catch (err) {
571
- abort(String(err.message));
572
- process.exit(2);
573
- }
574
-
575
- Promise.resolve(cmd.execute(opts, args, app)).then(code => {
576
- if (code != null) {
577
- process.exit(code);
578
- }
579
-
580
- process.exit(0);
581
- }, err => {
582
- abort(String(err.stack));
583
- process.exit(1);
584
- });
585
- }
586
-
587
- exports.default = run;
588
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/interfaces.ts","../../src/constants.ts","../../src/utils.ts","../../src/options.ts","../../src/print-command-help.ts","../../src/app-help.ts","../../src/commands/command-help.ts","../../src/commands/version.ts","../../src/run.ts"],"sourcesContent":["export interface Command {\n name: string\n alias?: string|string[]\n description?: string\n longDescription?: string\n flags?: Flag[]\n options?: Option[]\n arguments?: Argument[]\n /**\n * Executed when the command matches.\n *\n * @param options Named arguments, options, and flags.\n * @param args Positional arguments.\n * @param app Entire app config.\n */\n execute(options: Record<string,any>, args: string[], app: App): Promise<number|void>\n}\n\nexport enum OptType {\n STRING,\n BOOL,\n INT,\n FLOAT,\n /** A string, truncated and converted to lowercase. */\n ENUM,\n /** File must be readable. Single dash will be converted to STDIN. */\n INPUT_FILE,\n /** Directory must be readable. */\n INPUT_DIRECTORY,\n /** File's directory must exist and be writeable. Single dash will be converted to STDOUT. */\n OUTPUT_FILE,\n OUTPUT_DIRECTORY,\n /** An empty or non-existent directory. */\n EMPTY_DIRECTORY,\n}\n\ninterface ArgumentOrOptionOrFlag {\n /** Name of the option to display in help. */\n name: string\n /** Alternative name for this option. */\n alias?: string|string[]\n /** Description of the option. */\n description?: string\n /** Default value if not provided. */\n defaultValue?: any|((value:string)=>any)\n /** Default value to display in help. */\n defaultValueText?: string\n /** Property name to use in `execute()` options. */\n key?: string\n}\n\nexport type AnyOptType = OptType | string[] // | ((value:string)=>any)\n\nexport interface ArgumentOrOption extends ArgumentOrOptionOrFlag {\n /** Type to coerce the option value to. */\n type?: AnyOptType\n /** Option is repeatable by specifying the flag again. Value will be an array. */\n repeatable?: boolean\n /** Option is required. */\n required?: boolean\n}\n\n/** Boolean flag. */\nexport interface Flag extends ArgumentOrOptionOrFlag,OptionOrFlag {\n\n}\n\n/** Positional argument. */\nexport interface Argument extends ArgumentOrOption {\n\n}\n\ninterface OptionOrFlag {\n valueNotRequired?: boolean\n}\n\n/** Option with value. */\nexport interface Option extends ArgumentOrOption,OptionOrFlag {\n /** Placeholder value to use in help. */\n valuePlaceholder?: string\n}\n\nexport interface App {\n name: string\n argv0?: string\n version?: string\n commands: Command[]\n globalOptions?: Option[]\n}\n","export const EMPTY_ARRAY: ReadonlyArray<any> = Object.freeze([])\nexport const EMPTY_OBJECT: Record<string,any> = Object.freeze(Object.create({__proto__:null}))\nexport const TRUE_VALUES = new Set(['y', 'yes', 't', 'true', '1', 'on'])\nexport const FALSE_VALUES = new Set(['n', 'no', 'f', 'false', '0', 'off'])\n","import {App} from './interfaces'\nimport Path from 'path'\nimport stringWidth from 'string-width'\nimport Chalk from 'chalk'\nimport {EMPTY_ARRAY, FALSE_VALUES, TRUE_VALUES} from './constants'\nimport FileSys from 'fs'\n\nexport const print = process.stdout.write.bind(process.stdout)\nexport const printLn = console.log.bind(console)\n\nfunction blockError(str: string) {\n const lines = str.split('\\n')\n const width = Math.max(...lines.map(l => stringWidth(l))) + 4\n printLn(Chalk.bgRed(space(width)))\n for (const line of lines) {\n const txt = ` ${line}`\n printLn(Chalk.bgRed(txt + space(width, txt)))\n }\n printLn(Chalk.bgRed(space(width)))\n}\n\nexport function abort(message: string, code: number = 1): never {\n blockError(message)\n process.exit(code)\n}\n\nexport function toArray<T>(x: T | T[]): readonly T[] {\n if (!x) return EMPTY_ARRAY\n return Array.isArray(x) ? x : [x]\n}\n\nexport function resolve<T>(x: any): T {\n return typeof x === 'function' ? x() : x\n}\n\nexport function toBool(str: string | boolean): boolean {\n if (typeof str === 'boolean') return str\n str = String(str).trim().toLowerCase()\n if (TRUE_VALUES.has(str)) {\n return true\n }\n if (FALSE_VALUES.has(str)) {\n return false\n }\n throw new Error(`Could not cast \"${str}\" to boolean`)\n}\n\nexport function space(len: number, str?: string) {\n if (str) {\n len -= stringWidth(str)\n }\n\n return len > 0 ? ' '.repeat(len) : ''\n}\n\nexport function getProcName(app: App) {\n if (app.argv0 != null) {\n return app.argv0\n }\n const relPath = Path.relative(process.cwd(), process.argv[1])\n // console.log(relPath, process.argv[1])\n // console.log(process.argv0,process.argv[0])\n return `${Path.basename(process.argv[0])} ${relPath.length < process.argv[1].length ? relPath : process.argv[1]}`\n}\n\nexport function includes(needle: string, haystack: string | string[] | undefined) {\n if (!haystack) return false\n if (Array.isArray(haystack)) return haystack.includes(needle)\n return needle === haystack\n}\n\nexport function statSync(path: string): FileSys.Stats | null {\n try {\n return FileSys.lstatSync(path)\n } catch {\n return null\n }\n}\n\nexport function sortBy<T>(arr: T[], cmp: (x: T) => string): T[] {\n const collator = new Intl.Collator() // 'en',{usage: 'sort',sensitivity:'base'}\n const values = arr.map(cmp)\n const keys = Array.from(arr.keys())\n keys.sort((a, b) => collator.compare(values[a], values[b]))\n return keys.map(i => arr[i])\n}\n","import {AnyOptType, App, Command, Option, OptType} from './interfaces'\nimport {abort, includes, resolve, statSync, toArray, toBool} from './utils'\nimport Chalk from 'chalk'\nimport Path from 'path'\nimport FileSys from 'fs'\n\nexport function formatOption(opt: Option): [string, string] {\n const aliases: string[] = []\n if (opt.alias) {\n if (Array.isArray(opt.alias)) {\n aliases.push(...opt.alias)\n } else {\n aliases.push(opt.alias)\n }\n }\n aliases.push(opt.name)\n let flags = aliases.map(a => Chalk.green(a.length === 1 ? `-${a}` : `--${a}`)).join(', ')\n let valuePlaceholder = getValuePlaceholder(opt)\n if (opt.type !== OptType.BOOL) {\n flags += `=${valuePlaceholder}`\n }\n let desc = opt.description ?? ''\n let defaultValueText = opt.defaultValueText\n if (defaultValueText === undefined && opt.defaultValue !== undefined) {\n defaultValueText = JSON.stringify(resolve(opt.defaultValue))\n }\n if (defaultValueText !== undefined) {\n desc += Chalk.yellow(` [default: ${defaultValueText}]`)\n }\n return [flags, desc]\n}\n\nexport function getValuePlaceholder(opt: Option): string {\n if (opt.valuePlaceholder !== undefined) {\n return opt.valuePlaceholder\n }\n if (Array.isArray(opt.type)) {\n return opt.type.join('|')\n } else if (opt.type == OptType.BOOL) {\n return JSON.stringify(!resolve(opt.defaultValue))\n } else if (opt.type === OptType.INT || opt.type === OptType.FLOAT) {\n return '#'\n } else if (opt.type === OptType.INPUT_FILE || opt.type === OptType.OUTPUT_FILE) {\n return 'FILE'\n } else if (opt.type === OptType.INPUT_DIRECTORY || opt.type === OptType.OUTPUT_DIRECTORY || opt.type === OptType.EMPTY_DIRECTORY) {\n return 'DIR'\n } else {\n return opt.name\n }\n}\n\nexport function getOptions(cmd: Command): Option[] {\n return [\n ...toArray(cmd.options),\n ...toArray(cmd.flags).map(f => ({\n ...f,\n valueNotRequired: true,\n type: OptType.BOOL,\n\n })),\n // {\n // name: 'help',\n // description: \"Print help for this command\",\n // valueNotRequired: true,\n // type: OptType.BOOL,\n // }\n ] as Option[]\n}\n\nexport function parseArgs(cmd: Command, argv: string[]): [any[], Record<string, any>] {\n const args: any[] = []\n const opts: Record<string, any> = Object.create(null)\n let parseFlags = true\n // TODO: initialize all repeatables to empty arrays\n\n const allOptions = getOptions(cmd)\n\n let argIdx = 0\n for (let i = 0; i < argv.length; ++i) {\n let arg = argv[i]\n\n if (parseFlags && arg === '--') {\n parseFlags = false\n continue\n }\n\n if (parseFlags && arg.length >= 2 && arg.startsWith('-')) {\n let name: string\n let value: any\n if (arg.includes('=')) {\n [arg, value] = arg.split('=', 2)\n } /*else if(i < argv.length - 2 && argv[i+1] === '=') {\n value = argv[i+2]\n i += 2\n }*/\n if (arg.startsWith('--')) {\n name = arg.slice(2)\n } else {\n if (arg.length > 2) {\n if (value !== undefined) {\n abort(`Malformed option \"${arg}\"`)\n }\n value = arg.slice(2)\n arg = arg.slice(0, 2)\n }\n name = arg.slice(1)\n // TODO: parse multiple single-char flags\n }\n\n const opt = allOptions.find(opt => opt.name === name || includes(name, opt.alias))\n if (!opt) {\n abort(`\"${cmd.name}\" command does not have option \"${name}\".`)\n }\n if (value === undefined) {\n if (opt.valueNotRequired) {\n value = !resolve(opt.defaultValue)\n } else if (i < argv.length - 1) {\n value = argv[++i]\n } else {\n abort(`Missing required value for option \"${arg}\"`)\n }\n }\n if (opt.type != null) {\n value = coerceType(value, opt.type)\n }\n opts[opt.key ?? opt.name] = value\n } else {\n // TODO: examine cmd.arguments\n let value: any = arg\n\n if (cmd.arguments && cmd.arguments.length > argIdx) {\n const cmdArg = cmd.arguments[argIdx]\n if (cmdArg.type != null) {\n value = coerceType(value, cmdArg.type)\n }\n if (cmdArg.key) {\n opts[cmdArg.key] = value\n }\n }\n args.push(value)\n ++argIdx\n }\n }\n\n if (allOptions.length) {\n for (const opt of allOptions) {\n const k = opt.key ?? opt.name\n if (opts[k] === undefined) {\n if (opt.defaultValue !== undefined) {\n opts[k] = resolve(opt.defaultValue)\n } else if (opt.required) {\n throw new Error(`\"${getOptName(opt)}\" option is required`)\n } else {\n // TODO: should we fill in undefined options? with `null` or `undefined`?\n }\n }\n }\n }\n\n if (cmd.arguments?.length) {\n for (let i = 0; i < cmd.arguments.length; ++i) {\n if (cmd.arguments[i].required && argIdx <= i) {\n throw new Error(`\"${cmd.arguments[i].name}\" argument is required`)\n }\n }\n }\n\n // TODO: fill global options into opts\n // TODO: copy named arguments into opts too\n return [args, opts]\n}\n\nfunction coerceType(value: string, type: AnyOptType) {\n if (Array.isArray(type)) {\n // TODO: search for closest match of value in type or throw error\n return String(value).trim().toLowerCase()\n }\n switch (type) {\n case OptType.BOOL:\n return toBool(value)\n case OptType.INT:\n return Math.trunc(Number(value))\n case OptType.FLOAT:\n return Number(value)\n case OptType.ENUM:\n return String(value).trim().toLowerCase()\n case OptType.STRING:\n return String(value)\n case OptType.INPUT_FILE: {\n if (value === '-') return '/dev/stdin' // TODO: support windows\n const file = Path.normalize(value)\n const fullPath = Path.resolve(file)\n const stat = statSync(file)\n if (!stat) {\n throw new Error(`File ${Chalk.underline(fullPath)} does not exist`)\n }\n if (!stat.isFile()) {\n throw new Error(`${Chalk.underline(fullPath)} is not a file`)\n }\n try {\n FileSys.accessSync(file, FileSys.constants.R_OK)\n } catch (err) {\n throw new Error(`${Chalk.underline(fullPath)} is not readable`)\n }\n return file\n }\n case OptType.INPUT_DIRECTORY:\n const dir = Path.normalize(value)\n FileSys.accessSync(dir, FileSys.constants.X_OK)\n return dir\n case OptType.OUTPUT_FILE: {\n if (value === '-') return '/dev/stdout' // TODO: support windows\n const file = Path.normalize(value)\n const stat = statSync(file)\n if (stat) {\n if (!stat.isFile()) {\n throw new Error(`'${file}' is not a file`)\n }\n // if((stat.mode & 0x222) === 0) { // TODO: does this work?\n // throw new Error(`'${value}' is not writeable`);\n // }\n FileSys.accessSync(file, FileSys.constants.W_OK)\n } else {\n FileSys.accessSync(Path.dirname(file), FileSys.constants.W_OK)\n }\n return file\n }\n case OptType.OUTPUT_DIRECTORY: {\n FileSys.accessSync(value, FileSys.constants.W_OK)\n return Path.normalize(value)\n }\n case OptType.EMPTY_DIRECTORY: {\n const dir = Path.normalize(value)\n let files = []\n try {\n files = FileSys.readdirSync(dir)\n } catch (err) {\n if (err.code === 'ENOENT') {\n FileSys.accessSync(Path.dirname(dir), FileSys.constants.W_OK)\n } else {\n throw err\n }\n }\n if (files.length) {\n throw new Error(`${Chalk.underline(dir)} is not empty`)\n }\n return dir\n }\n }\n return value\n}\n\n\nexport function getOptName(opt: Option) {\n return (opt.name.length > 1 ? '--' : '-') + opt.name\n}\n\nexport function getCommand(name: string, app: App): Command {\n const cmdName = String(name).trim().replace(/^-{1,2}/,'').toLowerCase()\n const cmd = app.commands.find(c => c.name === cmdName || includes(cmdName, c.alias))\n if (cmd === undefined) {\n // TODO: levenshtein search for closest match? \"Did you mean...?\"\n throw new Error(`Command \"${name}\" does not exist.`)\n }\n return cmd\n}\n","import {App, Command, OptType} from './interfaces'\nimport {getProcName, print, printLn, space, toArray} from './utils'\nimport Chalk from 'chalk'\nimport {formatOption, getOptions, getOptName, getValuePlaceholder} from './options'\nimport stringWidth from 'string-width'\n\n\nexport function printCommandHelp(app: App, cmd: Command) {\n if (cmd.description) {\n printLn(cmd.description)\n printLn()\n }\n\n printLn(Chalk.yellow(\"Usage:\"))\n print(` ${Chalk.cyan(getProcName(app))} ${cmd.name}`)\n\n const allOptions = getOptions(cmd)\n\n if (allOptions.length) {\n let otherOptions = 0\n for (let opt of allOptions) {\n if (opt.required) {\n print(` ${getOptName(opt)}`)\n if (opt.type !== OptType.BOOL) {\n print(`=${getValuePlaceholder(opt)}`)\n }\n } else {\n ++otherOptions\n }\n }\n if (otherOptions) {\n print(` ${Chalk.gray('[')}options${Chalk.gray(']')}`)\n }\n }\n if (cmd.arguments?.length) {\n print(` ${Chalk.grey('[')}--${Chalk.grey(']')}`)\n for (const arg of cmd.arguments) {\n print(' ')\n print(Chalk.grey(arg.required ? '<' : '['))\n if (arg.repeatable) {\n print(Chalk.grey('...'))\n }\n print(arg.name)\n print(Chalk.grey(arg.required ? '>' : ']'))\n }\n }\n printLn()\n\n if (allOptions.length) {\n printLn(Chalk.yellow(\"\\nOptions:\"))\n const lines = allOptions.map(formatOption)\n const width = Math.max(...lines.map(l => stringWidth(l[0])))\n for (const line of lines) {\n printLn(' ' + line[0] + space(width + 2, line[0]) + line[1])\n }\n }\n\n if (cmd.arguments?.length) {\n printLn(Chalk.yellow(\"\\nArguments:\"))\n const width = Math.max(...cmd.arguments.map(a => stringWidth(a.name)))\n for (const arg of cmd.arguments) {\n print(' ' + Chalk.green(arg.name))\n if (arg.description) {\n print(space(width + 2, arg.name) + arg.description)\n }\n printLn()\n }\n }\n\n if (cmd.alias) {\n const alaises = toArray(cmd.alias)\n printLn(Chalk.yellow(`\\nAlias${alaises.length !== 1 ? 'es' : ''}: `) + toArray(cmd.alias).join(Chalk.gray(', ')))\n }\n if (cmd.longDescription) {\n printLn(Chalk.yellow(\"\\nDescription:\"))\n printLn(' ' + cmd.longDescription)\n }\n}\n","import {App} from './interfaces'\nimport {getProcName, print, printLn, space} from './utils'\nimport Chalk from 'chalk'\nimport stringWidth from 'string-width'\n\nexport function printHelp(app: App) {\n print(Chalk.green(app.name))\n if (app.version) {\n print(` version ${Chalk.yellow(app.version)}`)\n }\n print('\\n\\n')\n printLn(Chalk.yellow(\"Usage:\"))\n printLn(` ${Chalk.cyan(getProcName(app))} ${Chalk.gray('<')}command${Chalk.gray('>')} ${Chalk.gray(`[options] [arguments]`)}\\n`)\n\n if (app.globalOptions) {\n printLn(\"TODO\")\n }\n\n printAvailableCommands(app)\n}\n\nexport function printAvailableCommands(app: App) {\n printLn(Chalk.yellow(\"Available commands:\"))\n const width = Math.max(...app.commands.map(c => stringWidth(c.name))) + 2\n for (const cmd of app.commands) {\n print(` ${Chalk.green(cmd.name)}`)\n if (cmd.description) {\n print(`${space(width, cmd.name)}${cmd.description}`)\n }\n printLn()\n }\n\n // printLn()\n}\n","import {App, Command} from '../interfaces'\nimport {getCommand} from '../options'\nimport {printCommandHelp} from '../print-command-help'\nimport {printAvailableCommands} from '../app-help'\nimport {printLn} from '../utils'\n\nexport const helpCommand: Command = {\n name: 'help',\n // alias: '--help',\n description: \"Displays help for a command\",\n arguments: [\n {\n name: \"command\",\n description: \"The command name.\",\n required: false,\n }\n ],\n async execute(options: Record<string, string>, [commandName]: string[], app: App) {\n if(commandName) {\n printCommandHelp(app, getCommand(commandName, app))\n } else {\n printCommandHelp(app, getCommand('help', app))\n printLn()\n printAvailableCommands(app)\n }\n }\n}\n\n","import {Command} from '../interfaces'\nimport {printLn} from '../utils'\n\nexport const versionCommand: Command = {\n name: 'version',\n // alias: '--version',\n description: \"Displays current version\",\n async execute(opts, args, app) {\n printLn(app.version)\n }\n}\n","import {App} from './interfaces'\nimport {helpCommand} from './commands/command-help'\nimport {versionCommand} from './commands/version'\nimport {printHelp} from './app-help'\nimport {getCommand, parseArgs} from './options'\nimport {abort, sortBy} from './utils'\nimport {printCommandHelp} from './print-command-help'\n\nexport default function run(app: App) {\n app = {\n ...app,\n commands: [...sortBy(app.commands, c => c.name), versionCommand,helpCommand],\n // commands: sortBy([...app.commands,versionCommand,helpCommand], c => c.name),\n }\n if (process.argv.length <= 2) {\n printHelp(app)\n process.exit(0)\n }\n\n const cmd = getCommand(process.argv[2], app)\n const rawArgs = process.argv.slice(3)\n if (rawArgs.includes('--help')) {\n printCommandHelp(app, cmd)\n process.exit(0)\n }\n let args, opts\n try {\n [args, opts] = parseArgs(cmd, rawArgs)\n } catch (err) {\n abort(String(err.message))\n process.exit(2)\n }\n Promise.resolve(cmd.execute(opts, args, app))\n .then(code => {\n if (code != null) {\n process.exit(code)\n }\n process.exit(0)\n }, err => {\n // console.error(err)\n abort(String(err.stack))\n process.exit(1)\n })\n\n}\n"],"names":["OptType","EMPTY_ARRAY","Object","freeze","create","__proto__","TRUE_VALUES","Set","FALSE_VALUES","print","process","stdout","write","bind","printLn","console","log","blockError","str","lines","split","width","Math","max","map","l","stringWidth","Chalk","bgRed","space","line","txt","abort","message","code","exit","toArray","x","Array","isArray","resolve","toBool","String","trim","toLowerCase","has","Error","len","repeat","getProcName","app","argv0","relPath","Path","relative","cwd","argv","basename","length","includes","needle","haystack","statSync","path","FileSys","lstatSync","sortBy","arr","cmp","collator","Intl","Collator","values","keys","from","sort","a","b","compare","i","formatOption","opt","aliases","alias","push","name","flags","green","join","valuePlaceholder","getValuePlaceholder","type","BOOL","desc","description","defaultValueText","undefined","defaultValue","JSON","stringify","yellow","INT","FLOAT","INPUT_FILE","OUTPUT_FILE","INPUT_DIRECTORY","OUTPUT_DIRECTORY","EMPTY_DIRECTORY","getOptions","cmd","options","f","valueNotRequired","parseArgs","args","opts","parseFlags","allOptions","argIdx","arg","startsWith","value","slice","find","coerceType","key","arguments","cmdArg","k","required","getOptName","trunc","Number","ENUM","STRING","file","normalize","fullPath","stat","underline","isFile","accessSync","constants","R_OK","err","dir","X_OK","W_OK","dirname","files","readdirSync","getCommand","cmdName","replace","commands","c","printCommandHelp","cyan","otherOptions","gray","grey","repeatable","alaises","longDescription","printHelp","version","globalOptions","printAvailableCommands","helpCommand","execute","commandName","versionCommand","run","rawArgs","Promise","then","stack"],"mappings":";;;;;;;;;;;;;;;;AAkBYA;;WAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;AAAAA,EAAAA,QAAAA;GAAAA,oBAAAA;;AClBL,MAAMC,WAA+B,GAAGC,MAAM,CAACC,MAAP,CAAc,EAAd,CAAxC;AACyCD,MAAM,CAACC,MAAP,CAAcD,MAAM,CAACE,MAAP,CAAc;AAACC,EAAAA,SAAS,EAAC;AAAX,CAAd,CAAd;AACzC,MAAMC,WAAW,GAAG,IAAIC,GAAJ,CAAQ,CAAC,GAAD,EAAM,KAAN,EAAa,GAAb,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,IAA/B,CAAR,CAApB;AACA,MAAMC,YAAY,GAAG,IAAID,GAAJ,CAAQ,CAAC,GAAD,EAAM,IAAN,EAAY,GAAZ,EAAiB,OAAjB,EAA0B,GAA1B,EAA+B,KAA/B,CAAR,CAArB;;ACIA,MAAME,KAAK,GAAGC,OAAO,CAACC,MAAR,CAAeC,KAAf,CAAqBC,IAArB,CAA0BH,OAAO,CAACC,MAAlC,CAAd;AACA,MAAMG,OAAO,GAAGC,OAAO,CAACC,GAAR,CAAYH,IAAZ,CAAiBE,OAAjB,CAAhB;;AAEP,SAASE,UAAT,CAAoBC,GAApB,EAAiC;AAC7B,QAAMC,KAAK,GAAGD,GAAG,CAACE,KAAJ,CAAU,IAAV,CAAd;AACA,QAAMC,KAAK,GAAGC,IAAI,CAACC,GAAL,CAAS,GAAGJ,KAAK,CAACK,GAAN,CAAUC,CAAC,IAAIC,+BAAW,CAACD,CAAD,CAA1B,CAAZ,IAA8C,CAA5D;AACAX,EAAAA,OAAO,CAACa,yBAAK,CAACC,KAAN,CAAYC,KAAK,CAACR,KAAD,CAAjB,CAAD,CAAP;;AACA,OAAK,MAAMS,IAAX,IAAmBX,KAAnB,EAA0B;AACtB,UAAMY,GAAG,GAAI,KAAID,IAAK,EAAtB;AACAhB,IAAAA,OAAO,CAACa,yBAAK,CAACC,KAAN,CAAYG,GAAG,GAAGF,KAAK,CAACR,KAAD,EAAQU,GAAR,CAAvB,CAAD,CAAP;AACH;;AACDjB,EAAAA,OAAO,CAACa,yBAAK,CAACC,KAAN,CAAYC,KAAK,CAACR,KAAD,CAAjB,CAAD,CAAP;AACH;;AAEM,SAASW,KAAT,CAAeC,OAAf,EAAgCC,IAAY,GAAG,CAA/C,EAAyD;AAC5DjB,EAAAA,UAAU,CAACgB,OAAD,CAAV;AACAvB,EAAAA,OAAO,CAACyB,IAAR,CAAaD,IAAb;AACH;AAEM,SAASE,OAAT,CAAoBC,CAApB,EAA8C;AACjD,MAAI,CAACA,CAAL,EAAQ,OAAOpC,WAAP;AACR,SAAOqC,KAAK,CAACC,OAAN,CAAcF,CAAd,IAAmBA,CAAnB,GAAuB,CAACA,CAAD,CAA9B;AACH;AAEM,SAASG,OAAT,CAAoBH,CAApB,EAA+B;AAClC,SAAO,OAAOA,CAAP,KAAa,UAAb,GAA0BA,CAAC,EAA3B,GAAgCA,CAAvC;AACH;AAEM,SAASI,MAAT,CAAgBvB,GAAhB,EAAgD;AACnD,MAAI,OAAOA,GAAP,KAAe,SAAnB,EAA8B,OAAOA,GAAP;AAC9BA,EAAAA,GAAG,GAAGwB,MAAM,CAACxB,GAAD,CAAN,CAAYyB,IAAZ,GAAmBC,WAAnB,EAAN;;AACA,MAAItC,WAAW,CAACuC,GAAZ,CAAgB3B,GAAhB,CAAJ,EAA0B;AACtB,WAAO,IAAP;AACH;;AACD,MAAIV,YAAY,CAACqC,GAAb,CAAiB3B,GAAjB,CAAJ,EAA2B;AACvB,WAAO,KAAP;AACH;;AACD,QAAM,IAAI4B,KAAJ,CAAW,mBAAkB5B,GAAI,cAAjC,CAAN;AACH;AAEM,SAASW,KAAT,CAAekB,GAAf,EAA4B7B,GAA5B,EAA0C;AAC7C,MAAIA,GAAJ,EAAS;AACL6B,IAAAA,GAAG,IAAIrB,+BAAW,CAACR,GAAD,CAAlB;AACH;;AAED,SAAO6B,GAAG,GAAG,CAAN,GAAU,IAAIC,MAAJ,CAAWD,GAAX,CAAV,GAA4B,EAAnC;AACH;AAEM,SAASE,WAAT,CAAqBC,GAArB,EAA+B;AAClC,MAAIA,GAAG,CAACC,KAAJ,IAAa,IAAjB,EAAuB;AACnB,WAAOD,GAAG,CAACC,KAAX;AACH;;AACD,QAAMC,OAAO,GAAGC,wBAAI,CAACC,QAAL,CAAc5C,OAAO,CAAC6C,GAAR,EAAd,EAA6B7C,OAAO,CAAC8C,IAAR,CAAa,CAAb,CAA7B,CAAhB;AAGA,SAAQ,GAAEH,wBAAI,CAACI,QAAL,CAAc/C,OAAO,CAAC8C,IAAR,CAAa,CAAb,CAAd,CAA+B,IAAGJ,OAAO,CAACM,MAAR,GAAiBhD,OAAO,CAAC8C,IAAR,CAAa,CAAb,EAAgBE,MAAjC,GAA0CN,OAA1C,GAAoD1C,OAAO,CAAC8C,IAAR,CAAa,CAAb,CAAgB,EAAhH;AACH;AAEM,SAASG,QAAT,CAAkBC,MAAlB,EAAkCC,QAAlC,EAA2E;AAC9E,MAAI,CAACA,QAAL,EAAe,OAAO,KAAP;AACf,MAAIvB,KAAK,CAACC,OAAN,CAAcsB,QAAd,CAAJ,EAA6B,OAAOA,QAAQ,CAACF,QAAT,CAAkBC,MAAlB,CAAP;AAC7B,SAAOA,MAAM,KAAKC,QAAlB;AACH;AAEM,SAASC,QAAT,CAAkBC,IAAlB,EAAsD;AACzD,MAAI;AACA,WAAOC,2BAAO,CAACC,SAAR,CAAkBF,IAAlB,CAAP;AACH,GAFD,CAEE,MAAM;AACJ,WAAO,IAAP;AACH;AACJ;AAEM,SAASG,MAAT,CAAmBC,GAAnB,EAA6BC,GAA7B,EAAyD;AAC5D,QAAMC,QAAQ,GAAG,IAAIC,IAAI,CAACC,QAAT,EAAjB;AACA,QAAMC,MAAM,GAAGL,GAAG,CAAC3C,GAAJ,CAAQ4C,GAAR,CAAf;AACA,QAAMK,IAAI,GAAGnC,KAAK,CAACoC,IAAN,CAAWP,GAAG,CAACM,IAAJ,EAAX,CAAb;AACAA,EAAAA,IAAI,CAACE,IAAL,CAAU,CAACC,CAAD,EAAIC,CAAJ,KAAUR,QAAQ,CAACS,OAAT,CAAiBN,MAAM,CAACI,CAAD,CAAvB,EAA4BJ,MAAM,CAACK,CAAD,CAAlC,CAApB;AACA,SAAOJ,IAAI,CAACjD,GAAL,CAASuD,CAAC,IAAIZ,GAAG,CAACY,CAAD,CAAjB,CAAP;AACH;;AC/EM,SAASC,YAAT,CAAsBC,GAAtB,EAAqD;AAAA;;AACxD,QAAMC,OAAiB,GAAG,EAA1B;;AACA,MAAID,GAAG,CAACE,KAAR,EAAe;AACX,QAAI7C,KAAK,CAACC,OAAN,CAAc0C,GAAG,CAACE,KAAlB,CAAJ,EAA8B;AAC1BD,MAAAA,OAAO,CAACE,IAAR,CAAa,GAAGH,GAAG,CAACE,KAApB;AACH,KAFD,MAEO;AACHD,MAAAA,OAAO,CAACE,IAAR,CAAaH,GAAG,CAACE,KAAjB;AACH;AACJ;;AACDD,EAAAA,OAAO,CAACE,IAAR,CAAaH,GAAG,CAACI,IAAjB;AACA,MAAIC,KAAK,GAAGJ,OAAO,CAAC1D,GAAR,CAAYoD,CAAC,IAAIjD,yBAAK,CAAC4D,KAAN,CAAYX,CAAC,CAAClB,MAAF,KAAa,CAAb,GAAkB,IAAGkB,CAAE,EAAvB,GAA4B,KAAIA,CAAE,EAA9C,CAAjB,EAAmEY,IAAnE,CAAwE,IAAxE,CAAZ;AACA,MAAIC,gBAAgB,GAAGC,mBAAmB,CAACT,GAAD,CAA1C;;AACA,MAAIA,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAAC4F,IAAzB,EAA+B;AAC3BN,IAAAA,KAAK,IAAK,IAAGG,gBAAiB,EAA9B;AACH;;AACD,MAAII,IAAI,uBAAGZ,GAAG,CAACa,WAAP,+BAAsB,EAA9B;AACA,MAAIC,gBAAgB,GAAGd,GAAG,CAACc,gBAA3B;;AACA,MAAIA,gBAAgB,KAAKC,SAArB,IAAkCf,GAAG,CAACgB,YAAJ,KAAqBD,SAA3D,EAAsE;AAClED,IAAAA,gBAAgB,GAAGG,IAAI,CAACC,SAAL,CAAe3D,OAAO,CAACyC,GAAG,CAACgB,YAAL,CAAtB,CAAnB;AACH;;AACD,MAAIF,gBAAgB,KAAKC,SAAzB,EAAoC;AAChCH,IAAAA,IAAI,IAAIlE,yBAAK,CAACyE,MAAN,CAAc,cAAaL,gBAAiB,GAA5C,CAAR;AACH;;AACD,SAAO,CAACT,KAAD,EAAQO,IAAR,CAAP;AACH;AAEM,SAASH,mBAAT,CAA6BT,GAA7B,EAAkD;AACrD,MAAIA,GAAG,CAACQ,gBAAJ,KAAyBO,SAA7B,EAAwC;AACpC,WAAOf,GAAG,CAACQ,gBAAX;AACH;;AACD,MAAInD,KAAK,CAACC,OAAN,CAAc0C,GAAG,CAACU,IAAlB,CAAJ,EAA6B;AACzB,WAAOV,GAAG,CAACU,IAAJ,CAASH,IAAT,CAAc,GAAd,CAAP;AACH,GAFD,MAEO,IAAIP,GAAG,CAACU,IAAJ,IAAY3F,eAAO,CAAC4F,IAAxB,EAA8B;AACjC,WAAOM,IAAI,CAACC,SAAL,CAAe,CAAC3D,OAAO,CAACyC,GAAG,CAACgB,YAAL,CAAvB,CAAP;AACH,GAFM,MAEA,IAAIhB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAACqG,GAArB,IAA4BpB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAACsG,KAArD,EAA4D;AAC/D,WAAO,GAAP;AACH,GAFM,MAEA,IAAIrB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAACuG,UAArB,IAAmCtB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAACwG,WAA5D,EAAyE;AAC5E,WAAO,MAAP;AACH,GAFM,MAEA,IAAIvB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAACyG,eAArB,IAAwCxB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAAC0G,gBAA7D,IAAiFzB,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAAC2G,eAA1G,EAA2H;AAC9H,WAAO,KAAP;AACH,GAFM,MAEA;AACH,WAAO1B,GAAG,CAACI,IAAX;AACH;AACJ;AAEM,SAASuB,UAAT,CAAoBC,GAApB,EAA4C;AAC/C,SAAO,CACH,GAAGzE,OAAO,CAACyE,GAAG,CAACC,OAAL,CADP,EAEH,GAAG1E,OAAO,CAACyE,GAAG,CAACvB,KAAL,CAAP,CAAmB9D,GAAnB,CAAuBuF,CAAC,KAAK,EAC5B,GAAGA,CADyB;AAE5BC,IAAAA,gBAAgB,EAAE,IAFU;AAG5BrB,IAAAA,IAAI,EAAE3F,eAAO,CAAC4F;AAHc,GAAL,CAAxB,CAFA,CAAP;AAeH;AAEM,SAASqB,SAAT,CAAmBJ,GAAnB,EAAiCrD,IAAjC,EAA+E;AAAA;;AAClF,QAAM0D,IAAW,GAAG,EAApB;AACA,QAAMC,IAAyB,GAAGjH,MAAM,CAACE,MAAP,CAAc,IAAd,CAAlC;AACA,MAAIgH,UAAU,GAAG,IAAjB;AAGA,QAAMC,UAAU,GAAGT,UAAU,CAACC,GAAD,CAA7B;AAEA,MAAIS,MAAM,GAAG,CAAb;;AACA,OAAK,IAAIvC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGvB,IAAI,CAACE,MAAzB,EAAiC,EAAEqB,CAAnC,EAAsC;AAClC,QAAIwC,GAAG,GAAG/D,IAAI,CAACuB,CAAD,CAAd;;AAEA,QAAIqC,UAAU,IAAIG,GAAG,KAAK,IAA1B,EAAgC;AAC5BH,MAAAA,UAAU,GAAG,KAAb;AACA;AACH;;AAED,QAAIA,UAAU,IAAIG,GAAG,CAAC7D,MAAJ,IAAc,CAA5B,IAAiC6D,GAAG,CAACC,UAAJ,CAAe,GAAf,CAArC,EAA0D;AAAA;;AACtD,UAAInC,IAAJ;AACA,UAAIoC,KAAJ;;AACA,UAAIF,GAAG,CAAC5D,QAAJ,CAAa,GAAb,CAAJ,EAAuB;AACnB,SAAC4D,GAAD,EAAME,KAAN,IAAeF,GAAG,CAACnG,KAAJ,CAAU,GAAV,EAAe,CAAf,CAAf;AACH;;AAID,UAAImG,GAAG,CAACC,UAAJ,CAAe,IAAf,CAAJ,EAA0B;AACtBnC,QAAAA,IAAI,GAAGkC,GAAG,CAACG,KAAJ,CAAU,CAAV,CAAP;AACH,OAFD,MAEO;AACH,YAAIH,GAAG,CAAC7D,MAAJ,GAAa,CAAjB,EAAoB;AAChB,cAAI+D,KAAK,KAAKzB,SAAd,EAAyB;AACrBhE,YAAAA,KAAK,CAAE,qBAAoBuF,GAAI,GAA1B,CAAL;AACH;;AACDE,UAAAA,KAAK,GAAGF,GAAG,CAACG,KAAJ,CAAU,CAAV,CAAR;AACAH,UAAAA,GAAG,GAAGA,GAAG,CAACG,KAAJ,CAAU,CAAV,EAAa,CAAb,CAAN;AACH;;AACDrC,QAAAA,IAAI,GAAGkC,GAAG,CAACG,KAAJ,CAAU,CAAV,CAAP;AAEH;;AAED,YAAMzC,GAAG,GAAGoC,UAAU,CAACM,IAAX,CAAgB1C,GAAG,IAAIA,GAAG,CAACI,IAAJ,KAAaA,IAAb,IAAqB1B,QAAQ,CAAC0B,IAAD,EAAOJ,GAAG,CAACE,KAAX,CAApD,CAAZ;;AACA,UAAI,CAACF,GAAL,EAAU;AACNjD,QAAAA,KAAK,CAAE,IAAG6E,GAAG,CAACxB,IAAK,mCAAkCA,IAAK,IAArD,CAAL;AACH;;AACD,UAAIoC,KAAK,KAAKzB,SAAd,EAAyB;AACrB,YAAIf,GAAG,CAAC+B,gBAAR,EAA0B;AACtBS,UAAAA,KAAK,GAAG,CAACjF,OAAO,CAACyC,GAAG,CAACgB,YAAL,CAAhB;AACH,SAFD,MAEO,IAAIlB,CAAC,GAAGvB,IAAI,CAACE,MAAL,GAAc,CAAtB,EAAyB;AAC5B+D,UAAAA,KAAK,GAAGjE,IAAI,CAAC,EAAEuB,CAAH,CAAZ;AACH,SAFM,MAEA;AACH/C,UAAAA,KAAK,CAAE,sCAAqCuF,GAAI,GAA3C,CAAL;AACH;AACJ;;AACD,UAAItC,GAAG,CAACU,IAAJ,IAAY,IAAhB,EAAsB;AAClB8B,QAAAA,KAAK,GAAGG,UAAU,CAACH,KAAD,EAAQxC,GAAG,CAACU,IAAZ,CAAlB;AACH;;AACDwB,MAAAA,IAAI,aAAClC,GAAG,CAAC4C,GAAL,uBAAY5C,GAAG,CAACI,IAAhB,CAAJ,GAA4BoC,KAA5B;AACH,KAxCD,MAwCO;AAEH,UAAIA,KAAU,GAAGF,GAAjB;;AAEA,UAAIV,GAAG,CAACiB,SAAJ,IAAiBjB,GAAG,CAACiB,SAAJ,CAAcpE,MAAd,GAAuB4D,MAA5C,EAAoD;AAChD,cAAMS,MAAM,GAAGlB,GAAG,CAACiB,SAAJ,CAAcR,MAAd,CAAf;;AACA,YAAIS,MAAM,CAACpC,IAAP,IAAe,IAAnB,EAAyB;AACrB8B,UAAAA,KAAK,GAAGG,UAAU,CAACH,KAAD,EAAQM,MAAM,CAACpC,IAAf,CAAlB;AACH;;AACD,YAAIoC,MAAM,CAACF,GAAX,EAAgB;AACZV,UAAAA,IAAI,CAACY,MAAM,CAACF,GAAR,CAAJ,GAAmBJ,KAAnB;AACH;AACJ;;AACDP,MAAAA,IAAI,CAAC9B,IAAL,CAAUqC,KAAV;AACA,QAAEH,MAAF;AACH;AACJ;;AAED,MAAID,UAAU,CAAC3D,MAAf,EAAuB;AACnB,SAAK,MAAMuB,GAAX,IAAkBoC,UAAlB,EAA8B;AAAA;;AAC1B,YAAMW,CAAC,gBAAG/C,GAAG,CAAC4C,GAAP,wBAAc5C,GAAG,CAACI,IAAzB;;AACA,UAAI8B,IAAI,CAACa,CAAD,CAAJ,KAAYhC,SAAhB,EAA2B;AACvB,YAAIf,GAAG,CAACgB,YAAJ,KAAqBD,SAAzB,EAAoC;AAChCmB,UAAAA,IAAI,CAACa,CAAD,CAAJ,GAAUxF,OAAO,CAACyC,GAAG,CAACgB,YAAL,CAAjB;AACH,SAFD,MAEO,IAAIhB,GAAG,CAACgD,QAAR,EAAkB;AACrB,gBAAM,IAAInF,KAAJ,CAAW,IAAGoF,UAAU,CAACjD,GAAD,CAAM,sBAA9B,CAAN;AACH,SAFM,MAEA;AAGV;AACJ;AACJ;;AAED,wBAAI4B,GAAG,CAACiB,SAAR,aAAI,eAAepE,MAAnB,EAA2B;AACvB,SAAK,IAAIqB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG8B,GAAG,CAACiB,SAAJ,CAAcpE,MAAlC,EAA0C,EAAEqB,CAA5C,EAA+C;AAC3C,UAAI8B,GAAG,CAACiB,SAAJ,CAAc/C,CAAd,EAAiBkD,QAAjB,IAA6BX,MAAM,IAAIvC,CAA3C,EAA8C;AAC1C,cAAM,IAAIjC,KAAJ,CAAW,IAAG+D,GAAG,CAACiB,SAAJ,CAAc/C,CAAd,EAAiBM,IAAK,wBAApC,CAAN;AACH;AACJ;AACJ;;AAID,SAAO,CAAC6B,IAAD,EAAOC,IAAP,CAAP;AACH;;AAED,SAASS,UAAT,CAAoBH,KAApB,EAAmC9B,IAAnC,EAAqD;AACjD,MAAIrD,KAAK,CAACC,OAAN,CAAcoD,IAAd,CAAJ,EAAyB;AAErB,WAAOjD,MAAM,CAAC+E,KAAD,CAAN,CAAc9E,IAAd,GAAqBC,WAArB,EAAP;AACH;;AACD,UAAQ+C,IAAR;AACI,SAAK3F,eAAO,CAAC4F,IAAb;AACI,aAAOnD,MAAM,CAACgF,KAAD,CAAb;;AACJ,SAAKzH,eAAO,CAACqG,GAAb;AACI,aAAO/E,IAAI,CAAC6G,KAAL,CAAWC,MAAM,CAACX,KAAD,CAAjB,CAAP;;AACJ,SAAKzH,eAAO,CAACsG,KAAb;AACI,aAAO8B,MAAM,CAACX,KAAD,CAAb;;AACJ,SAAKzH,eAAO,CAACqI,IAAb;AACI,aAAO3F,MAAM,CAAC+E,KAAD,CAAN,CAAc9E,IAAd,GAAqBC,WAArB,EAAP;;AACJ,SAAK5C,eAAO,CAACsI,MAAb;AACI,aAAO5F,MAAM,CAAC+E,KAAD,CAAb;;AACJ,SAAKzH,eAAO,CAACuG,UAAb;AAAyB;AACrB,YAAIkB,KAAK,KAAK,GAAd,EAAmB,OAAO,YAAP;AACnB,cAAMc,IAAI,GAAGlF,wBAAI,CAACmF,SAAL,CAAef,KAAf,CAAb;AACA,cAAMgB,QAAQ,GAAGpF,wBAAI,CAACb,OAAL,CAAa+F,IAAb,CAAjB;AACA,cAAMG,IAAI,GAAG5E,QAAQ,CAACyE,IAAD,CAArB;;AACA,YAAI,CAACG,IAAL,EAAW;AACP,gBAAM,IAAI5F,KAAJ,CAAW,QAAOnB,yBAAK,CAACgH,SAAN,CAAgBF,QAAhB,CAA0B,iBAA5C,CAAN;AACH;;AACD,YAAI,CAACC,IAAI,CAACE,MAAL,EAAL,EAAoB;AAChB,gBAAM,IAAI9F,KAAJ,CAAW,GAAEnB,yBAAK,CAACgH,SAAN,CAAgBF,QAAhB,CAA0B,gBAAvC,CAAN;AACH;;AACD,YAAI;AACAzE,UAAAA,2BAAO,CAAC6E,UAAR,CAAmBN,IAAnB,EAAyBvE,2BAAO,CAAC8E,SAAR,CAAkBC,IAA3C;AACH,SAFD,CAEE,OAAOC,GAAP,EAAY;AACV,gBAAM,IAAIlG,KAAJ,CAAW,GAAEnB,yBAAK,CAACgH,SAAN,CAAgBF,QAAhB,CAA0B,kBAAvC,CAAN;AACH;;AACD,eAAOF,IAAP;AACH;;AACD,SAAKvI,eAAO,CAACyG,eAAb;AACI,YAAMwC,GAAG,GAAG5F,wBAAI,CAACmF,SAAL,CAAef,KAAf,CAAZ;AACAzD,MAAAA,2BAAO,CAAC6E,UAAR,CAAmBI,GAAnB,EAAwBjF,2BAAO,CAAC8E,SAAR,CAAkBI,IAA1C;AACA,aAAOD,GAAP;;AACJ,SAAKjJ,eAAO,CAACwG,WAAb;AAA0B;AACtB,YAAIiB,KAAK,KAAK,GAAd,EAAmB,OAAO,aAAP;AACnB,cAAMc,IAAI,GAAGlF,wBAAI,CAACmF,SAAL,CAAef,KAAf,CAAb;AACA,cAAMiB,IAAI,GAAG5E,QAAQ,CAACyE,IAAD,CAArB;;AACA,YAAIG,IAAJ,EAAU;AACN,cAAI,CAACA,IAAI,CAACE,MAAL,EAAL,EAAoB;AAChB,kBAAM,IAAI9F,KAAJ,CAAW,IAAGyF,IAAK,iBAAnB,CAAN;AACH;;AAIDvE,UAAAA,2BAAO,CAAC6E,UAAR,CAAmBN,IAAnB,EAAyBvE,2BAAO,CAAC8E,SAAR,CAAkBK,IAA3C;AACH,SARD,MAQO;AACHnF,UAAAA,2BAAO,CAAC6E,UAAR,CAAmBxF,wBAAI,CAAC+F,OAAL,CAAab,IAAb,CAAnB,EAAuCvE,2BAAO,CAAC8E,SAAR,CAAkBK,IAAzD;AACH;;AACD,eAAOZ,IAAP;AACH;;AACD,SAAKvI,eAAO,CAAC0G,gBAAb;AAA+B;AAC3B1C,QAAAA,2BAAO,CAAC6E,UAAR,CAAmBpB,KAAnB,EAA0BzD,2BAAO,CAAC8E,SAAR,CAAkBK,IAA5C;AACA,eAAO9F,wBAAI,CAACmF,SAAL,CAAef,KAAf,CAAP;AACH;;AACD,SAAKzH,eAAO,CAAC2G,eAAb;AAA8B;AAC1B,cAAMsC,GAAG,GAAG5F,wBAAI,CAACmF,SAAL,CAAef,KAAf,CAAZ;AACA,YAAI4B,KAAK,GAAG,EAAZ;;AACA,YAAI;AACAA,UAAAA,KAAK,GAAGrF,2BAAO,CAACsF,WAAR,CAAoBL,GAApB,CAAR;AACH,SAFD,CAEE,OAAOD,GAAP,EAAY;AACV,cAAIA,GAAG,CAAC9G,IAAJ,KAAa,QAAjB,EAA2B;AACvB8B,YAAAA,2BAAO,CAAC6E,UAAR,CAAmBxF,wBAAI,CAAC+F,OAAL,CAAaH,GAAb,CAAnB,EAAsCjF,2BAAO,CAAC8E,SAAR,CAAkBK,IAAxD;AACH,WAFD,MAEO;AACH,kBAAMH,GAAN;AACH;AACJ;;AACD,YAAIK,KAAK,CAAC3F,MAAV,EAAkB;AACd,gBAAM,IAAIZ,KAAJ,CAAW,GAAEnB,yBAAK,CAACgH,SAAN,CAAgBM,GAAhB,CAAqB,eAAlC,CAAN;AACH;;AACD,eAAOA,GAAP;AACH;AAtEL;;AAwEA,SAAOxB,KAAP;AACH;;AAGM,SAASS,UAAT,CAAoBjD,GAApB,EAAiC;AACpC,SAAO,CAACA,GAAG,CAACI,IAAJ,CAAS3B,MAAT,GAAkB,CAAlB,GAAsB,IAAtB,GAA6B,GAA9B,IAAqCuB,GAAG,CAACI,IAAhD;AACH;AAEM,SAASkE,UAAT,CAAoBlE,IAApB,EAAkCnC,GAAlC,EAAqD;AACxD,QAAMsG,OAAO,GAAG9G,MAAM,CAAC2C,IAAD,CAAN,CAAa1C,IAAb,GAAoB8G,OAApB,CAA4B,SAA5B,EAAsC,EAAtC,EAA0C7G,WAA1C,EAAhB;AACA,QAAMiE,GAAG,GAAG3D,GAAG,CAACwG,QAAJ,CAAa/B,IAAb,CAAkBgC,CAAC,IAAIA,CAAC,CAACtE,IAAF,KAAWmE,OAAX,IAAsB7F,QAAQ,CAAC6F,OAAD,EAAUG,CAAC,CAACxE,KAAZ,CAArD,CAAZ;;AACA,MAAI0B,GAAG,KAAKb,SAAZ,EAAuB;AAEnB,UAAM,IAAIlD,KAAJ,CAAW,YAAWuC,IAAK,mBAA3B,CAAN;AACH;;AACD,SAAOwB,GAAP;AACH;;AClQM,SAAS+C,gBAAT,CAA0B1G,GAA1B,EAAoC2D,GAApC,EAAkD;AAAA;;AACrD,MAAIA,GAAG,CAACf,WAAR,EAAqB;AACjBhF,IAAAA,OAAO,CAAC+F,GAAG,CAACf,WAAL,CAAP;AACAhF,IAAAA,OAAO;AACV;;AAEDA,EAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,QAAb,CAAD,CAAP;AACA3F,EAAAA,KAAK,CAAE,KAAIkB,yBAAK,CAACkI,IAAN,CAAW5G,WAAW,CAACC,GAAD,CAAtB,CAA6B,IAAG2D,GAAG,CAACxB,IAAK,EAA/C,CAAL;AAEA,QAAMgC,UAAU,GAAGT,UAAU,CAACC,GAAD,CAA7B;;AAEA,MAAIQ,UAAU,CAAC3D,MAAf,EAAuB;AACnB,QAAIoG,YAAY,GAAG,CAAnB;;AACA,SAAK,IAAI7E,GAAT,IAAgBoC,UAAhB,EAA4B;AACxB,UAAIpC,GAAG,CAACgD,QAAR,EAAkB;AACdxH,QAAAA,KAAK,CAAE,IAAGyH,UAAU,CAACjD,GAAD,CAAM,EAArB,CAAL;;AACA,YAAIA,GAAG,CAACU,IAAJ,KAAa3F,eAAO,CAAC4F,IAAzB,EAA+B;AAC3BnF,UAAAA,KAAK,CAAE,IAAGiF,mBAAmB,CAACT,GAAD,CAAM,EAA9B,CAAL;AACH;AACJ,OALD,MAKO;AACH,UAAE6E,YAAF;AACH;AACJ;;AACD,QAAIA,YAAJ,EAAkB;AACdrJ,MAAAA,KAAK,CAAE,IAAGkB,yBAAK,CAACoI,IAAN,CAAW,GAAX,CAAgB,UAASpI,yBAAK,CAACoI,IAAN,CAAW,GAAX,CAAgB,EAA9C,CAAL;AACH;AACJ;;AACD,wBAAIlD,GAAG,CAACiB,SAAR,aAAI,eAAepE,MAAnB,EAA2B;AACvBjD,IAAAA,KAAK,CAAE,IAAGkB,yBAAK,CAACqI,IAAN,CAAW,GAAX,CAAgB,KAAIrI,yBAAK,CAACqI,IAAN,CAAW,GAAX,CAAgB,EAAzC,CAAL;;AACA,SAAK,MAAMzC,GAAX,IAAkBV,GAAG,CAACiB,SAAtB,EAAiC;AAC7BrH,MAAAA,KAAK,CAAC,GAAD,CAAL;AACAA,MAAAA,KAAK,CAACkB,yBAAK,CAACqI,IAAN,CAAWzC,GAAG,CAACU,QAAJ,GAAe,GAAf,GAAqB,GAAhC,CAAD,CAAL;;AACA,UAAIV,GAAG,CAAC0C,UAAR,EAAoB;AAChBxJ,QAAAA,KAAK,CAACkB,yBAAK,CAACqI,IAAN,CAAW,KAAX,CAAD,CAAL;AACH;;AACDvJ,MAAAA,KAAK,CAAC8G,GAAG,CAAClC,IAAL,CAAL;AACA5E,MAAAA,KAAK,CAACkB,yBAAK,CAACqI,IAAN,CAAWzC,GAAG,CAACU,QAAJ,GAAe,GAAf,GAAqB,GAAhC,CAAD,CAAL;AACH;AACJ;;AACDnH,EAAAA,OAAO;;AAEP,MAAIuG,UAAU,CAAC3D,MAAf,EAAuB;AACnB5C,IAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,YAAb,CAAD,CAAP;AACA,UAAMjF,KAAK,GAAGkG,UAAU,CAAC7F,GAAX,CAAewD,YAAf,CAAd;AACA,UAAM3D,KAAK,GAAGC,IAAI,CAACC,GAAL,CAAS,GAAGJ,KAAK,CAACK,GAAN,CAAUC,CAAC,IAAIC,+BAAW,CAACD,CAAC,CAAC,CAAD,CAAF,CAA1B,CAAZ,CAAd;;AACA,SAAK,MAAMK,IAAX,IAAmBX,KAAnB,EAA0B;AACtBL,MAAAA,OAAO,CAAC,OAAOgB,IAAI,CAAC,CAAD,CAAX,GAAiBD,KAAK,CAACR,KAAK,GAAG,CAAT,EAAYS,IAAI,CAAC,CAAD,CAAhB,CAAtB,GAA6CA,IAAI,CAAC,CAAD,CAAlD,CAAP;AACH;AACJ;;AAED,yBAAI+E,GAAG,CAACiB,SAAR,aAAI,gBAAepE,MAAnB,EAA2B;AACvB5C,IAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,cAAb,CAAD,CAAP;AACA,UAAM/E,KAAK,GAAGC,IAAI,CAACC,GAAL,CAAS,GAAGsF,GAAG,CAACiB,SAAJ,CAActG,GAAd,CAAkBoD,CAAC,IAAIlD,+BAAW,CAACkD,CAAC,CAACS,IAAH,CAAlC,CAAZ,CAAd;;AACA,SAAK,MAAMkC,GAAX,IAAkBV,GAAG,CAACiB,SAAtB,EAAiC;AAC7BrH,MAAAA,KAAK,CAAC,OAAOkB,yBAAK,CAAC4D,KAAN,CAAYgC,GAAG,CAAClC,IAAhB,CAAR,CAAL;;AACA,UAAIkC,GAAG,CAACzB,WAAR,EAAqB;AACjBrF,QAAAA,KAAK,CAACoB,KAAK,CAACR,KAAK,GAAG,CAAT,EAAYkG,GAAG,CAAClC,IAAhB,CAAL,GAA6BkC,GAAG,CAACzB,WAAlC,CAAL;AACH;;AACDhF,MAAAA,OAAO;AACV;AACJ;;AAED,MAAI+F,GAAG,CAAC1B,KAAR,EAAe;AACX,UAAM+E,OAAO,GAAG9H,OAAO,CAACyE,GAAG,CAAC1B,KAAL,CAAvB;AACArE,IAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAc,UAAS8D,OAAO,CAACxG,MAAR,KAAmB,CAAnB,GAAuB,IAAvB,GAA8B,EAAG,IAAxD,IAA+DtB,OAAO,CAACyE,GAAG,CAAC1B,KAAL,CAAP,CAAmBK,IAAnB,CAAwB7D,yBAAK,CAACoI,IAAN,CAAW,IAAX,CAAxB,CAAhE,CAAP;AACH;;AACD,MAAIlD,GAAG,CAACsD,eAAR,EAAyB;AACrBrJ,IAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,gBAAb,CAAD,CAAP;AACAtF,IAAAA,OAAO,CAAC,OAAO+F,GAAG,CAACsD,eAAZ,CAAP;AACH;AACJ;;ACxEM,SAASC,SAAT,CAAmBlH,GAAnB,EAA6B;AAChCzC,EAAAA,KAAK,CAACkB,yBAAK,CAAC4D,KAAN,CAAYrC,GAAG,CAACmC,IAAhB,CAAD,CAAL;;AACA,MAAInC,GAAG,CAACmH,OAAR,EAAiB;AACb5J,IAAAA,KAAK,CAAE,YAAWkB,yBAAK,CAACyE,MAAN,CAAalD,GAAG,CAACmH,OAAjB,CAA0B,EAAvC,CAAL;AACH;;AACD5J,EAAAA,KAAK,CAAC,MAAD,CAAL;AACAK,EAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,QAAb,CAAD,CAAP;AACAtF,EAAAA,OAAO,CAAE,KAAIa,yBAAK,CAACkI,IAAN,CAAW5G,WAAW,CAACC,GAAD,CAAtB,CAA6B,IAAGvB,yBAAK,CAACoI,IAAN,CAAW,GAAX,CAAgB,UAASpI,yBAAK,CAACoI,IAAN,CAAW,GAAX,CAAgB,IAAGpI,yBAAK,CAACoI,IAAN,CAAY,uBAAZ,CAAoC,IAAtH,CAAP;;AAEA,MAAI7G,GAAG,CAACoH,aAAR,EAAuB;AACnBxJ,IAAAA,OAAO,CAAC,MAAD,CAAP;AACH;;AAEDyJ,EAAAA,sBAAsB,CAACrH,GAAD,CAAtB;AACH;AAEM,SAASqH,sBAAT,CAAgCrH,GAAhC,EAA0C;AAC7CpC,EAAAA,OAAO,CAACa,yBAAK,CAACyE,MAAN,CAAa,qBAAb,CAAD,CAAP;AACA,QAAM/E,KAAK,GAAGC,IAAI,CAACC,GAAL,CAAS,GAAG2B,GAAG,CAACwG,QAAJ,CAAalI,GAAb,CAAiBmI,CAAC,IAAIjI,+BAAW,CAACiI,CAAC,CAACtE,IAAH,CAAjC,CAAZ,IAA0D,CAAxE;;AACA,OAAK,MAAMwB,GAAX,IAAkB3D,GAAG,CAACwG,QAAtB,EAAgC;AAC5BjJ,IAAAA,KAAK,CAAE,KAAIkB,yBAAK,CAAC4D,KAAN,CAAYsB,GAAG,CAACxB,IAAhB,CAAsB,EAA5B,CAAL;;AACA,QAAIwB,GAAG,CAACf,WAAR,EAAqB;AACjBrF,MAAAA,KAAK,CAAE,GAAEoB,KAAK,CAACR,KAAD,EAAQwF,GAAG,CAACxB,IAAZ,CAAkB,GAAEwB,GAAG,CAACf,WAAY,EAA7C,CAAL;AACH;;AACDhF,IAAAA,OAAO;AACV;AAGJ;;AC3BM,MAAM0J,WAAoB,GAAG;AAChCnF,EAAAA,IAAI,EAAE,MAD0B;AAGhCS,EAAAA,WAAW,EAAE,6BAHmB;AAIhCgC,EAAAA,SAAS,EAAE,CACP;AACIzC,IAAAA,IAAI,EAAE,SADV;AAEIS,IAAAA,WAAW,EAAE,mBAFjB;AAGImC,IAAAA,QAAQ,EAAE;AAHd,GADO,CAJqB;;AAWhC,QAAMwC,OAAN,CAAc3D,OAAd,EAA+C,CAAC4D,WAAD,CAA/C,EAAwExH,GAAxE,EAAkF;AAC9E,QAAGwH,WAAH,EAAgB;AACZd,MAAAA,gBAAgB,CAAC1G,GAAD,EAAMqG,UAAU,CAACmB,WAAD,EAAcxH,GAAd,CAAhB,CAAhB;AACH,KAFD,MAEO;AACH0G,MAAAA,gBAAgB,CAAC1G,GAAD,EAAMqG,UAAU,CAAC,MAAD,EAASrG,GAAT,CAAhB,CAAhB;AACApC,MAAAA,OAAO;AACPyJ,MAAAA,sBAAsB,CAACrH,GAAD,CAAtB;AACH;AACJ;;AAnB+B,CAA7B;;ACHA,MAAMyH,cAAuB,GAAG;AACnCtF,EAAAA,IAAI,EAAE,SAD6B;AAGnCS,EAAAA,WAAW,EAAE,0BAHsB;;AAInC,QAAM2E,OAAN,CAActD,IAAd,EAAoBD,IAApB,EAA0BhE,GAA1B,EAA+B;AAC3BpC,IAAAA,OAAO,CAACoC,GAAG,CAACmH,OAAL,CAAP;AACH;;AANkC,CAAhC;;ACKQ,SAASO,GAAT,CAAa1H,GAAb,EAAuB;AAClCA,EAAAA,GAAG,GAAG,EACF,GAAGA,GADD;AAEFwG,IAAAA,QAAQ,EAAE,CAAC,GAAGxF,MAAM,CAAChB,GAAG,CAACwG,QAAL,EAAeC,CAAC,IAAIA,CAAC,CAACtE,IAAtB,CAAV,EAAuCsF,cAAvC,EAAsDH,WAAtD;AAFR,GAAN;;AAKA,MAAI9J,OAAO,CAAC8C,IAAR,CAAaE,MAAb,IAAuB,CAA3B,EAA8B;AAC1B0G,IAAAA,SAAS,CAAClH,GAAD,CAAT;AACAxC,IAAAA,OAAO,CAACyB,IAAR,CAAa,CAAb;AACH;;AAED,QAAM0E,GAAG,GAAG0C,UAAU,CAAC7I,OAAO,CAAC8C,IAAR,CAAa,CAAb,CAAD,EAAkBN,GAAlB,CAAtB;AACA,QAAM2H,OAAO,GAAGnK,OAAO,CAAC8C,IAAR,CAAakE,KAAb,CAAmB,CAAnB,CAAhB;;AACA,MAAImD,OAAO,CAAClH,QAAR,CAAiB,QAAjB,CAAJ,EAAgC;AAC5BiG,IAAAA,gBAAgB,CAAC1G,GAAD,EAAM2D,GAAN,CAAhB;AACAnG,IAAAA,OAAO,CAACyB,IAAR,CAAa,CAAb;AACH;;AACD,MAAI+E,IAAJ,EAAUC,IAAV;;AACA,MAAI;AACA,KAACD,IAAD,EAAOC,IAAP,IAAeF,SAAS,CAACJ,GAAD,EAAMgE,OAAN,CAAxB;AACH,GAFD,CAEE,OAAO7B,GAAP,EAAY;AACVhH,IAAAA,KAAK,CAACU,MAAM,CAACsG,GAAG,CAAC/G,OAAL,CAAP,CAAL;AACAvB,IAAAA,OAAO,CAACyB,IAAR,CAAa,CAAb;AACH;;AACD2I,EAAAA,OAAO,CAACtI,OAAR,CAAgBqE,GAAG,CAAC4D,OAAJ,CAAYtD,IAAZ,EAAkBD,IAAlB,EAAwBhE,GAAxB,CAAhB,EACK6H,IADL,CACU7I,IAAI,IAAI;AACV,QAAIA,IAAI,IAAI,IAAZ,EAAkB;AACdxB,MAAAA,OAAO,CAACyB,IAAR,CAAaD,IAAb;AACH;;AACDxB,IAAAA,OAAO,CAACyB,IAAR,CAAa,CAAb;AACH,GANL,EAMO6G,GAAG,IAAI;AAENhH,IAAAA,KAAK,CAACU,MAAM,CAACsG,GAAG,CAACgC,KAAL,CAAP,CAAL;AACAtK,IAAAA,OAAO,CAACyB,IAAR,CAAa,CAAb;AACH,GAVL;AAYH;;;;"}