llm-mask 0.3.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 (88) hide show
  1. package/.github/workflows/llm-mask-check.yml +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +549 -0
  4. package/dist/audit.d.ts +56 -0
  5. package/dist/audit.d.ts.map +1 -0
  6. package/dist/audit.js +90 -0
  7. package/dist/audit.js.map +1 -0
  8. package/dist/cli-old.d.ts +12 -0
  9. package/dist/cli-old.d.ts.map +1 -0
  10. package/dist/cli-old.js +257 -0
  11. package/dist/cli-old.js.map +1 -0
  12. package/dist/cli.d.ts +19 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +197 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands.d.ts +9 -0
  17. package/dist/commands.d.ts.map +1 -0
  18. package/dist/commands.js +121 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +38 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +81 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/context-detection.d.ts +54 -0
  25. package/dist/context-detection.d.ts.map +1 -0
  26. package/dist/context-detection.js +219 -0
  27. package/dist/context-detection.js.map +1 -0
  28. package/dist/diff-masking.d.ts +51 -0
  29. package/dist/diff-masking.d.ts.map +1 -0
  30. package/dist/diff-masking.js +121 -0
  31. package/dist/diff-masking.js.map +1 -0
  32. package/dist/executor.d.ts +105 -0
  33. package/dist/executor.d.ts.map +1 -0
  34. package/dist/executor.js +250 -0
  35. package/dist/executor.js.map +1 -0
  36. package/dist/executor.test.d.ts +5 -0
  37. package/dist/executor.test.d.ts.map +1 -0
  38. package/dist/executor.test.js +500 -0
  39. package/dist/executor.test.js.map +1 -0
  40. package/dist/features.test.d.ts +5 -0
  41. package/dist/features.test.d.ts.map +1 -0
  42. package/dist/features.test.js +118 -0
  43. package/dist/features.test.js.map +1 -0
  44. package/dist/formatter.d.ts +54 -0
  45. package/dist/formatter.d.ts.map +1 -0
  46. package/dist/formatter.js +139 -0
  47. package/dist/formatter.js.map +1 -0
  48. package/dist/index.d.ts +36 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +37 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/language-patterns.d.ts +39 -0
  53. package/dist/language-patterns.d.ts.map +1 -0
  54. package/dist/language-patterns.js +177 -0
  55. package/dist/language-patterns.js.map +1 -0
  56. package/dist/masker.d.ts +100 -0
  57. package/dist/masker.d.ts.map +1 -0
  58. package/dist/masker.js +255 -0
  59. package/dist/masker.js.map +1 -0
  60. package/dist/masker.test.d.ts +11 -0
  61. package/dist/masker.test.d.ts.map +1 -0
  62. package/dist/masker.test.js +162 -0
  63. package/dist/masker.test.js.map +1 -0
  64. package/dist/mcp-server.d.ts +9 -0
  65. package/dist/mcp-server.d.ts.map +1 -0
  66. package/dist/mcp-server.js +494 -0
  67. package/dist/mcp-server.js.map +1 -0
  68. package/dist/patterns.d.ts +25 -0
  69. package/dist/patterns.d.ts.map +1 -0
  70. package/dist/patterns.js +184 -0
  71. package/dist/patterns.js.map +1 -0
  72. package/dist/scanner.d.ts +75 -0
  73. package/dist/scanner.d.ts.map +1 -0
  74. package/dist/scanner.js +247 -0
  75. package/dist/scanner.js.map +1 -0
  76. package/dist/test-utils.d.ts +5 -0
  77. package/dist/test-utils.d.ts.map +1 -0
  78. package/dist/test-utils.js +6 -0
  79. package/dist/test-utils.js.map +1 -0
  80. package/dist/tokenizer.d.ts +62 -0
  81. package/dist/tokenizer.d.ts.map +1 -0
  82. package/dist/tokenizer.js +95 -0
  83. package/dist/tokenizer.js.map +1 -0
  84. package/dist/types.d.ts +63 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +16 -0
  87. package/dist/types.js.map +1 -0
  88. package/package.json +60 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * CLI commands for exec functionality
3
+ */
4
+ import { SecureExecutor } from './executor.js';
5
+ /**
6
+ * Register exec commands with commander program
7
+ */
8
+ export function registerExecCommands(program) {
9
+ // Main exec command
10
+ program
11
+ .command('exec [command...]')
12
+ .description('Execute a command and redact sensitive output')
13
+ .option('-l, --level <level>', 'Masking level (basic|standard|aggressive)', 'standard')
14
+ .option('-f, --preserve-format', 'Preserve format in redacted output')
15
+ .option('-t, --timeout <ms>', 'Command timeout in milliseconds', '30000')
16
+ .option('--original', 'Show original output (WARNING: contains sensitive data)')
17
+ .option('--json', 'Output as JSON')
18
+ .action(async (command, options) => {
19
+ if (!command || command.length === 0) {
20
+ console.error('Error: command required');
21
+ process.exit(1);
22
+ }
23
+ const executor = new SecureExecutor();
24
+ try {
25
+ const result = await executor.exec({
26
+ command: command[0],
27
+ args: command.slice(1),
28
+ timeout: parseInt(options.timeout),
29
+ level: options.level,
30
+ preserveFormat: options.preserveFormat
31
+ });
32
+ if (options.json) {
33
+ console.log(JSON.stringify(result, null, 2));
34
+ }
35
+ else {
36
+ console.log(executor.formatResult(result, options.original));
37
+ }
38
+ // Exit with the same code as the command
39
+ if (result.exitCode !== null) {
40
+ process.exit(result.exitCode);
41
+ }
42
+ }
43
+ catch (error) {
44
+ console.error('Error:', error instanceof Error ? error.message : error);
45
+ process.exit(1);
46
+ }
47
+ });
48
+ // Kubernetes command
49
+ program
50
+ .command('kube [kubectl-args...]')
51
+ .description('Execute kubectl commands with output redaction')
52
+ .option('-n, --namespace <ns>', 'Kubernetes namespace')
53
+ .option('-c, --context <ctx>', 'Kubectl context')
54
+ .option('--pod <pod>', 'Pod name (for exec)')
55
+ .option('--container <container>', 'Container name (for exec)')
56
+ .option('--exec <cmd>', 'Command to execute in pod')
57
+ .option('-l, --level <level>', 'Masking level', 'standard')
58
+ .option('-f, --preserve-format', 'Preserve format in output')
59
+ .option('--json', 'Output as JSON')
60
+ .action(async (kubectlArgs, options) => {
61
+ const executor = new SecureExecutor();
62
+ try {
63
+ const result = await executor.kubectl({
64
+ args: kubectlArgs.length > 0 ? kubectlArgs : ['get', 'pods', '-o', 'wide'],
65
+ namespace: options.namespace,
66
+ context: options.context,
67
+ pod: options.pod,
68
+ container: options.container,
69
+ execCommand: options.exec,
70
+ level: options.level,
71
+ preserveFormat: options.preserveFormat
72
+ });
73
+ if (options.json) {
74
+ console.log(JSON.stringify(result, null, 2));
75
+ }
76
+ else {
77
+ console.log(executor.formatResult(result));
78
+ }
79
+ }
80
+ catch (error) {
81
+ console.error('Error:', error instanceof Error ? error.message : error);
82
+ process.exit(1);
83
+ }
84
+ });
85
+ // SSH command
86
+ program
87
+ .command('ssh <host>')
88
+ .description('Execute SSH commands with output redaction')
89
+ .option('-u, --user <user>', 'SSH user')
90
+ .option('-p, --port <port>', 'SSH port')
91
+ .option('-i, --identity <file>', 'Identity file (private key)')
92
+ .option('-c, --command <cmd>', 'Command to execute on remote host')
93
+ .option('-l, --level <level>', 'Masking level', 'standard')
94
+ .option('-f, --preserve-format', 'Preserve format in output')
95
+ .option('--json', 'Output as JSON')
96
+ .action(async (host, options) => {
97
+ const executor = new SecureExecutor();
98
+ try {
99
+ const result = await executor.ssh({
100
+ host,
101
+ user: options.user,
102
+ port: options.port ? parseInt(options.port) : undefined,
103
+ identity: options.identity,
104
+ remoteCommand: options.command,
105
+ level: options.level,
106
+ preserveFormat: options.preserveFormat
107
+ });
108
+ if (options.json) {
109
+ console.log(JSON.stringify(result, null, 2));
110
+ }
111
+ else {
112
+ console.log(executor.formatResult(result));
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.error('Error:', error instanceof Error ? error.message : error);
117
+ process.exit(1);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Configuration loader for llm-mask
3
+ *
4
+ * Loads custom patterns from .llm-mask-rules.json
5
+ */
6
+ import type { MaskPattern, MaskerConfig } from './types.js';
7
+ export interface ConfigFile {
8
+ customPatterns?: Array<{
9
+ name: string;
10
+ regex: string;
11
+ placeholder: string;
12
+ priority?: number;
13
+ }>;
14
+ defaultLevel?: 'basic' | 'standard' | 'aggressive';
15
+ excludePatterns?: string[];
16
+ auditLog?: boolean;
17
+ auditLogFile?: string;
18
+ }
19
+ export interface LoadedConfig {
20
+ customPatterns: MaskPattern[];
21
+ defaultLevel: 'basic' | 'standard' | 'aggressive';
22
+ excludePatterns: string[];
23
+ auditLog: boolean;
24
+ auditLogFile: string;
25
+ }
26
+ /**
27
+ * Load config file
28
+ */
29
+ export declare function loadConfig(configPath?: string): LoadedConfig;
30
+ /**
31
+ * Merge loaded config with MaskerConfig
32
+ */
33
+ export declare function createMaskerConfig(loaded: LoadedConfig): MaskerConfig;
34
+ /**
35
+ * Get mask level from config or default
36
+ */
37
+ export declare function getMaskLevel(loaded: LoadedConfig, cliLevel?: string): string;
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAC,CAAA;IACF,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IAClD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,WAAW,EAAE,CAAA;IAC7B,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IACjD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAgCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CA8B5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAKrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E"}
package/dist/config.js ADDED
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Configuration loader for llm-mask
3
+ *
4
+ * Loads custom patterns from .llm-mask-rules.json
5
+ */
6
+ import { readFileSync, existsSync } from 'fs';
7
+ import { resolve } from 'path';
8
+ import { homedir } from 'os';
9
+ const DEFAULT_CONFIG = {
10
+ customPatterns: [],
11
+ defaultLevel: 'standard',
12
+ excludePatterns: [],
13
+ auditLog: false,
14
+ auditLogFile: ''
15
+ };
16
+ /**
17
+ * Search for config file in multiple locations:
18
+ * 1. ./.llm-mask-rules.json (current directory)
19
+ * 2. ~/.llm-mask-rules.json (home directory)
20
+ * 3. ~/.config/llm-mask/rules.json (XDG config)
21
+ */
22
+ function findConfigPath(startDir = process.cwd()) {
23
+ const paths = [
24
+ resolve(startDir, '.llm-mask-rules.json'),
25
+ resolve(homedir(), '.llm-mask-rules.json'),
26
+ resolve(homedir(), '.config', 'llm-mask', 'rules.json')
27
+ ];
28
+ for (const path of paths) {
29
+ if (existsSync(path)) {
30
+ return path;
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Load config file
37
+ */
38
+ export function loadConfig(configPath) {
39
+ const path = configPath || findConfigPath();
40
+ if (!path || !existsSync(path)) {
41
+ return DEFAULT_CONFIG;
42
+ }
43
+ try {
44
+ const content = readFileSync(path, 'utf-8');
45
+ const raw = JSON.parse(content);
46
+ // Convert regex strings to RegExp objects
47
+ const customPatterns = (raw.customPatterns || []).map(p => ({
48
+ name: p.name,
49
+ regex: new RegExp(p.regex, 'g'),
50
+ placeholder: (i) => p.placeholder.replace('{i}', String(i)),
51
+ priority: p.priority || 50
52
+ }));
53
+ return {
54
+ customPatterns,
55
+ defaultLevel: raw.defaultLevel || 'standard',
56
+ excludePatterns: raw.excludePatterns || [],
57
+ auditLog: raw.auditLog || false,
58
+ auditLogFile: raw.auditLogFile || ''
59
+ };
60
+ }
61
+ catch (error) {
62
+ console.error(`Failed to load config from ${path}:`, error);
63
+ return DEFAULT_CONFIG;
64
+ }
65
+ }
66
+ /**
67
+ * Merge loaded config with MaskerConfig
68
+ */
69
+ export function createMaskerConfig(loaded) {
70
+ return {
71
+ customPatterns: loaded.customPatterns,
72
+ excludePatterns: loaded.excludePatterns
73
+ };
74
+ }
75
+ /**
76
+ * Get mask level from config or default
77
+ */
78
+ export function getMaskLevel(loaded, cliLevel) {
79
+ return cliLevel || loaded.defaultLevel;
80
+ }
81
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAwB5B,MAAM,cAAc,GAAiB;IACnC,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,UAAU;IACxB,eAAe,EAAE,EAAE;IACnB,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,EAAE;CACjB,CAAA;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACtD,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC;QACzC,OAAO,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC;QAC1C,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC;KACxD,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,EAAE,CAAA;IAE3C,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,GAAG,GAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAE3C,0CAA0C;QAC1C,MAAM,cAAc,GAAkB,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;YAC/B,WAAW,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACnE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;SAC3B,CAAC,CAAC,CAAA;QAEH,OAAO;YACL,cAAc;YACd,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,UAAU;YAC5C,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;YAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;YAC/B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;SACrC,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3D,OAAO,cAAc,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,QAAiB;IAClE,OAAO,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAA;AACxC,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Smart context detection - mask values while preserving structure
3
+ *
4
+ * Detects SQL, JSON, YAML, code and masks only values
5
+ */
6
+ export type ContextType = 'sql' | 'json' | 'yaml' | 'xml' | 'code' | 'plaintext';
7
+ export interface ContextMaskResult {
8
+ masked: string;
9
+ context: ContextType;
10
+ stats: {
11
+ valuesMasked: number;
12
+ identifiersPreserved: number;
13
+ };
14
+ }
15
+ /**
16
+ * Detect context type from content
17
+ */
18
+ export declare function detectContext(content: string): ContextType;
19
+ /**
20
+ * Context-aware masker
21
+ */
22
+ export declare class ContextMasker {
23
+ private masker;
24
+ constructor();
25
+ /**
26
+ * Mask content with context awareness
27
+ */
28
+ mask(content: string): ContextMaskResult;
29
+ /**
30
+ * Mask JSON - preserve keys, mask values
31
+ */
32
+ private maskJSON;
33
+ /**
34
+ * Mask SQL - preserve identifiers, mask string literals
35
+ */
36
+ private maskSQL;
37
+ /**
38
+ * Mask YAML - preserve keys, mask values
39
+ */
40
+ private maskYAML;
41
+ /**
42
+ * Mask XML - preserve tags/attributes, mask text content
43
+ */
44
+ private maskXML;
45
+ /**
46
+ * Regular plaintext masking
47
+ */
48
+ private maskPlaintext;
49
+ }
50
+ /**
51
+ * Convenience function
52
+ */
53
+ export declare function maskWithContext(content: string): ContextMaskResult;
54
+ //# sourceMappingURL=context-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-detection.d.ts","sourceRoot":"","sources":["../src/context-detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAA;AAEhF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;CACF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAiC1D;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;;IAM1B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IAiBxC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAwChB;;OAEG;IACH,OAAO,CAAC,OAAO;IA8Bf;;OAEG;IACH,OAAO,CAAC,QAAQ;IA6ChB;;OAEG;IACH,OAAO,CAAC,OAAO;IAgCf;;OAEG;IACH,OAAO,CAAC,aAAa;CAQtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAGlE"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Smart context detection - mask values while preserving structure
3
+ *
4
+ * Detects SQL, JSON, YAML, code and masks only values
5
+ */
6
+ import { DataMasker } from './masker.js';
7
+ /**
8
+ * Detect context type from content
9
+ */
10
+ export function detectContext(content) {
11
+ const trimmed = content.trim();
12
+ // JSON
13
+ if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
14
+ return 'json';
15
+ }
16
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
17
+ return 'json';
18
+ }
19
+ // YAML
20
+ if (/^[\w\s-]+:/.test(trimmed)) {
21
+ return 'yaml';
22
+ }
23
+ // SQL
24
+ const sqlKeywords = /\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|INTO|VALUES|JOIN)\b/i;
25
+ if (sqlKeywords.test(content)) {
26
+ return 'sql';
27
+ }
28
+ // XML
29
+ if (trimmed.startsWith('<?xml') || trimmed.startsWith('<!DOCTYPE') || /<[^>]+>/.test(trimmed)) {
30
+ return 'xml';
31
+ }
32
+ // Code-like (has function/class definitions, imports, etc.)
33
+ if (/^(\s*(import|export|from|const|let|var|function|class|def|pub|fn)\b)/m.test(content)) {
34
+ return 'code';
35
+ }
36
+ return 'plaintext';
37
+ }
38
+ /**
39
+ * Context-aware masker
40
+ */
41
+ export class ContextMasker {
42
+ masker;
43
+ constructor() {
44
+ this.masker = new DataMasker();
45
+ }
46
+ /**
47
+ * Mask content with context awareness
48
+ */
49
+ mask(content) {
50
+ const context = detectContext(content);
51
+ switch (context) {
52
+ case 'json':
53
+ return this.maskJSON(content);
54
+ case 'sql':
55
+ return this.maskSQL(content);
56
+ case 'yaml':
57
+ return this.maskYAML(content);
58
+ case 'xml':
59
+ return this.maskXML(content);
60
+ default:
61
+ return this.maskPlaintext(content, context);
62
+ }
63
+ }
64
+ /**
65
+ * Mask JSON - preserve keys, mask values
66
+ */
67
+ maskJSON(content) {
68
+ let valuesMasked = 0;
69
+ let identifiersPreserved = 0;
70
+ try {
71
+ const obj = JSON.parse(content);
72
+ const maskValue = (val) => {
73
+ if (typeof val === 'string') {
74
+ const result = this.masker.mask(val);
75
+ if (result.stats.total > 0) {
76
+ valuesMasked++;
77
+ return result.masked;
78
+ }
79
+ return val;
80
+ }
81
+ if (Array.isArray(val)) {
82
+ return val.map(maskValue);
83
+ }
84
+ if (val && typeof val === 'object') {
85
+ const result = {};
86
+ for (const [key, value] of Object.entries(val)) {
87
+ identifiersPreserved++;
88
+ result[key] = maskValue(value);
89
+ }
90
+ return result;
91
+ }
92
+ return val;
93
+ };
94
+ const maskedObj = maskValue(obj);
95
+ const masked = JSON.stringify(maskedObj, null, 2);
96
+ return { masked, context: 'json', stats: { valuesMasked, identifiersPreserved } };
97
+ }
98
+ catch {
99
+ // Not valid JSON, fall back to plaintext
100
+ return this.maskPlaintext(content, 'plaintext');
101
+ }
102
+ }
103
+ /**
104
+ * Mask SQL - preserve identifiers, mask string literals
105
+ */
106
+ maskSQL(content) {
107
+ let valuesMasked = 0;
108
+ let identifiersPreserved = 0;
109
+ // Match SQL string literals
110
+ const lines = content.split('\n');
111
+ const maskedLines = lines.map(line => {
112
+ // Mask string literals
113
+ let masked = line.replace(/'([^']+)'/g, (match, value) => {
114
+ const result = this.masker.mask(value);
115
+ if (result.stats.total > 0) {
116
+ valuesMasked++;
117
+ return `'${result.masked}'`;
118
+ }
119
+ return match;
120
+ });
121
+ // Preserve identifiers (table names, column names)
122
+ identifiersPreserved += (line.match(/\b[A-Z][A-Z0-9_]*\b/g) || []).length;
123
+ return masked;
124
+ });
125
+ return {
126
+ masked: maskedLines.join('\n'),
127
+ context: 'sql',
128
+ stats: { valuesMasked, identifiersPreserved }
129
+ };
130
+ }
131
+ /**
132
+ * Mask YAML - preserve keys, mask values
133
+ */
134
+ maskYAML(content) {
135
+ let valuesMasked = 0;
136
+ let identifiersPreserved = 0;
137
+ const lines = content.split('\n');
138
+ const maskedLines = lines.map(line => {
139
+ // Check if this is a key-value line
140
+ const match = line.match(/^(\s*)([\w-]+):\s*(.+)$/);
141
+ if (match) {
142
+ const [, indent, key, value] = match;
143
+ const result = this.masker.mask(value.trim());
144
+ if (result.stats.total > 0) {
145
+ valuesMasked++;
146
+ return `${indent}${key}: ${result.masked}`;
147
+ }
148
+ identifiersPreserved++;
149
+ return line;
150
+ }
151
+ // Check for array items
152
+ const arrayMatch = line.match(/^(\s*)-\s*(.+)/);
153
+ if (arrayMatch) {
154
+ const [, indent, value] = arrayMatch;
155
+ const result = this.masker.mask(value.trim());
156
+ if (result.stats.total > 0) {
157
+ valuesMasked++;
158
+ return `${indent}- ${result.masked}`;
159
+ }
160
+ return line;
161
+ }
162
+ return line;
163
+ });
164
+ return {
165
+ masked: maskedLines.join('\n'),
166
+ context: 'yaml',
167
+ stats: { valuesMasked, identifiersPreserved }
168
+ };
169
+ }
170
+ /**
171
+ * Mask XML - preserve tags/attributes, mask text content
172
+ */
173
+ maskXML(content) {
174
+ let valuesMasked = 0;
175
+ let identifiersPreserved = 0;
176
+ // Count tags (identifiers)
177
+ identifiersPreserved += (content.match(/<[\w:]+/g) || []).length;
178
+ // Mask text content between tags
179
+ let masked = content.replace(/>([^<]+)</g, (match, text) => {
180
+ if (text.trim().length === 0)
181
+ return match;
182
+ const result = this.masker.mask(text.trim());
183
+ if (result.stats.total > 0) {
184
+ valuesMasked++;
185
+ return `>${result.masked}<`;
186
+ }
187
+ return match;
188
+ });
189
+ // Mask attribute values
190
+ masked = masked.replace(/(\s+[\w:]+)=["']([^"']+)["']/g, (match, attr, value) => {
191
+ const result = this.masker.mask(value);
192
+ if (result.stats.total > 0) {
193
+ valuesMasked++;
194
+ return `${attr}="${result.masked}"`;
195
+ }
196
+ return match;
197
+ });
198
+ return { masked, context: 'xml', stats: { valuesMasked, identifiersPreserved } };
199
+ }
200
+ /**
201
+ * Regular plaintext masking
202
+ */
203
+ maskPlaintext(content, context) {
204
+ const result = this.masker.mask(content);
205
+ return {
206
+ masked: result.masked,
207
+ context,
208
+ stats: { valuesMasked: result.stats.total, identifiersPreserved: 0 }
209
+ };
210
+ }
211
+ }
212
+ /**
213
+ * Convenience function
214
+ */
215
+ export function maskWithContext(content) {
216
+ const masker = new ContextMasker();
217
+ return masker.mask(content);
218
+ }
219
+ //# sourceMappingURL=context-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-detection.js","sourceRoot":"","sources":["../src/context-detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAaxC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAE9B,OAAO;IACP,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO;IACP,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM;IACN,MAAM,WAAW,GAAG,gEAAgE,CAAA;IACpF,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;IACN,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9F,OAAO,KAAK,CAAA;IACd,CAAC;IAED,4DAA4D;IAC5D,IAAI,uEAAuE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1F,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAY;IAE1B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;QAEtC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAC/B,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9B,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAC/B,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9B;gBACE,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe;QAC9B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,oBAAoB,GAAG,CAAC,CAAA;QAE5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAE/B,MAAM,SAAS,GAAG,CAAC,GAAY,EAAW,EAAE;gBAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACpC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;wBAC3B,YAAY,EAAE,CAAA;wBACd,OAAO,MAAM,CAAC,MAAM,CAAA;oBACtB,CAAC;oBACD,OAAO,GAAG,CAAA;gBACZ,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC3B,CAAC;gBACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACnC,MAAM,MAAM,GAA4B,EAAE,CAAA;oBAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC/C,oBAAoB,EAAE,CAAA;wBACtB,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;oBAChC,CAAC;oBACD,OAAO,MAAM,CAAA;gBACf,CAAC;gBACD,OAAO,GAAG,CAAA;YACZ,CAAC,CAAA;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,CAAA;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,OAAe;QAC7B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,oBAAoB,GAAG,CAAC,CAAA;QAE5B,4BAA4B;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnC,uBAAuB;YACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACtC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC3B,YAAY,EAAE,CAAA;oBACd,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAA;gBAC7B,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;YAEF,mDAAmD;YACnD,oBAAoB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;YAEzE,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE;SAC9C,CAAA;IACH,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAe;QAC9B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,oBAAoB,GAAG,CAAC,CAAA;QAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACnC,oCAAoC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;YACnD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;gBAE7C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC3B,YAAY,EAAE,CAAA;oBACd,OAAO,GAAG,MAAM,GAAG,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAA;gBAC5C,CAAC;gBAED,oBAAoB,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAA;YACb,CAAC;YAED,wBAAwB;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,UAAU,CAAA;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;gBAE7C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC3B,YAAY,EAAE,CAAA;oBACd,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAA;gBACtC,CAAC;gBAED,OAAO,IAAI,CAAA;YACb,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE;SAC9C,CAAA;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,OAAe;QAC7B,IAAI,YAAY,GAAG,CAAC,CAAA;QACpB,IAAI,oBAAoB,GAAG,CAAC,CAAA;QAE5B,2BAA2B;QAC3B,oBAAoB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QAEhE,iCAAiC;QACjC,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACzD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAC5C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC3B,YAAY,EAAE,CAAA;gBACd,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAA;YAC7B,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,wBAAwB;QACxB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,+BAA+B,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC3B,YAAY,EAAE,CAAA;gBACd,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,GAAG,CAAA;YACrC,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,CAAA;IAClF,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe,EAAE,OAAoB;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO;YACP,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,EAAE,CAAC,EAAE;SACrE,CAAA;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAA;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Diff masking - mask git diff output for safe LLM code review
3
+ *
4
+ * Preserves diff structure while masking sensitive data
5
+ */
6
+ export interface DiffOptions {
7
+ /** Base branch or commit */
8
+ base?: string;
9
+ /** Head branch or commit (default: working directory) */
10
+ head?: string;
11
+ /** Git options */
12
+ gitDir?: string;
13
+ /** Masking level */
14
+ level?: 'basic' | 'standard' | 'aggressive';
15
+ /** Path to restrict diff */
16
+ path?: string;
17
+ }
18
+ export interface MaskedDiff {
19
+ maskedDiff: string;
20
+ originalLineCount: number;
21
+ stats: {
22
+ filesChanged: number;
23
+ linesAdded: number;
24
+ linesRemoved: number;
25
+ masksApplied: number;
26
+ };
27
+ }
28
+ /**
29
+ * Masker for git diff output
30
+ */
31
+ export declare class DiffMasker {
32
+ private masker;
33
+ constructor();
34
+ /**
35
+ * Get git diff and mask it
36
+ */
37
+ maskDiff(options?: DiffOptions): MaskedDiff;
38
+ /**
39
+ * Get git diff output
40
+ */
41
+ private getDiff;
42
+ /**
43
+ * Format masked diff for display
44
+ */
45
+ format(maskedDiff: MaskedDiff): string;
46
+ }
47
+ /**
48
+ * Convenience function to mask git diff
49
+ */
50
+ export declare function maskDiff(options?: DiffOptions): string;
51
+ //# sourceMappingURL=diff-masking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-masking.d.ts","sourceRoot":"","sources":["../src/diff-masking.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAA;IAC3C,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;;IAM1B;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU;IAqD/C;;OAEG;IACH,OAAO,CAAC,OAAO;IA+Bf;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;CAiBvC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAItD"}