langmart-gateway-type3 3.0.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 (75) hide show
  1. package/.env.example +29 -0
  2. package/README.md +480 -0
  3. package/dist/bash-tools.d.ts +56 -0
  4. package/dist/bash-tools.d.ts.map +1 -0
  5. package/dist/bash-tools.js +188 -0
  6. package/dist/bash-tools.js.map +1 -0
  7. package/dist/core-tools.d.ts +94 -0
  8. package/dist/core-tools.d.ts.map +1 -0
  9. package/dist/core-tools.js +694 -0
  10. package/dist/core-tools.js.map +1 -0
  11. package/dist/debug-utils.d.ts +22 -0
  12. package/dist/debug-utils.d.ts.map +1 -0
  13. package/dist/debug-utils.js +37 -0
  14. package/dist/debug-utils.js.map +1 -0
  15. package/dist/devops-tools.d.ts +147 -0
  16. package/dist/devops-tools.d.ts.map +1 -0
  17. package/dist/devops-tools.js +718 -0
  18. package/dist/devops-tools.js.map +1 -0
  19. package/dist/gateway-config.d.ts +56 -0
  20. package/dist/gateway-config.d.ts.map +1 -0
  21. package/dist/gateway-config.js +198 -0
  22. package/dist/gateway-config.js.map +1 -0
  23. package/dist/gateway-mode.d.ts +58 -0
  24. package/dist/gateway-mode.d.ts.map +1 -0
  25. package/dist/gateway-mode.js +240 -0
  26. package/dist/gateway-mode.js.map +1 -0
  27. package/dist/gateway-server.d.ts +208 -0
  28. package/dist/gateway-server.d.ts.map +1 -0
  29. package/dist/gateway-server.js +1811 -0
  30. package/dist/gateway-server.js.map +1 -0
  31. package/dist/headless-session.d.ts +192 -0
  32. package/dist/headless-session.d.ts.map +1 -0
  33. package/dist/headless-session.js +584 -0
  34. package/dist/headless-session.js.map +1 -0
  35. package/dist/index-server.d.ts +4 -0
  36. package/dist/index-server.d.ts.map +1 -0
  37. package/dist/index-server.js +129 -0
  38. package/dist/index-server.js.map +1 -0
  39. package/dist/index.d.ts +6 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +101 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/key-vault.d.ts +102 -0
  44. package/dist/key-vault.d.ts.map +1 -0
  45. package/dist/key-vault.js +365 -0
  46. package/dist/key-vault.js.map +1 -0
  47. package/dist/local-vault.d.ts +195 -0
  48. package/dist/local-vault.d.ts.map +1 -0
  49. package/dist/local-vault.js +571 -0
  50. package/dist/local-vault.js.map +1 -0
  51. package/dist/marketplace-tools.d.ts +104 -0
  52. package/dist/marketplace-tools.d.ts.map +1 -0
  53. package/dist/marketplace-tools.js +2846 -0
  54. package/dist/marketplace-tools.js.map +1 -0
  55. package/dist/mcp-manager.d.ts +114 -0
  56. package/dist/mcp-manager.d.ts.map +1 -0
  57. package/dist/mcp-manager.js +338 -0
  58. package/dist/mcp-manager.js.map +1 -0
  59. package/dist/web-tools.d.ts +86 -0
  60. package/dist/web-tools.d.ts.map +1 -0
  61. package/dist/web-tools.js +431 -0
  62. package/dist/web-tools.js.map +1 -0
  63. package/dist/websocket-handler.d.ts +131 -0
  64. package/dist/websocket-handler.d.ts.map +1 -0
  65. package/dist/websocket-handler.js +596 -0
  66. package/dist/websocket-handler.js.map +1 -0
  67. package/dist/welcome-pages.d.ts +6 -0
  68. package/dist/welcome-pages.d.ts.map +1 -0
  69. package/dist/welcome-pages.js +200 -0
  70. package/dist/welcome-pages.js.map +1 -0
  71. package/package.json +168 -0
  72. package/scripts/install-remote.sh +282 -0
  73. package/scripts/start.sh +85 -0
  74. package/scripts/status.sh +79 -0
  75. package/scripts/stop.sh +67 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Built-in Bash Tools for Chat Mode
4
+ * Provides bash command execution without external MCP server dependency
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BashTools = void 0;
8
+ const child_process_1 = require("child_process");
9
+ const util_1 = require("util");
10
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
11
+ class BashTools {
12
+ constructor() { }
13
+ static getInstance() {
14
+ if (!BashTools.instance) {
15
+ BashTools.instance = new BashTools();
16
+ }
17
+ return BashTools.instance;
18
+ }
19
+ /**
20
+ * Get available bash tools
21
+ */
22
+ getTools() {
23
+ return [
24
+ {
25
+ name: 'bash.execute_command',
26
+ description: 'Execute a bash command and return the output',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ command: {
31
+ type: 'string',
32
+ description: 'The bash command to execute'
33
+ }
34
+ },
35
+ required: ['command']
36
+ }
37
+ },
38
+ {
39
+ name: 'bash.list_files',
40
+ description: 'List files in a directory (shorthand for ls)',
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ path: {
45
+ type: 'string',
46
+ description: 'Path to list (default: current directory)'
47
+ },
48
+ options: {
49
+ type: 'string',
50
+ description: 'Options for ls command (e.g., "-la")'
51
+ }
52
+ }
53
+ }
54
+ },
55
+ {
56
+ name: 'bash.read_file',
57
+ description: 'Read the contents of a file',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ path: {
62
+ type: 'string',
63
+ description: 'Path to the file to read'
64
+ }
65
+ },
66
+ required: ['path']
67
+ }
68
+ },
69
+ {
70
+ name: 'bash.find_files',
71
+ description: 'Find files matching a pattern',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ pattern: {
76
+ type: 'string',
77
+ description: 'File pattern to search for (e.g., "*.ts")'
78
+ },
79
+ path: {
80
+ type: 'string',
81
+ description: 'Path to search in (default: current directory)'
82
+ }
83
+ },
84
+ required: ['pattern']
85
+ }
86
+ }
87
+ ];
88
+ }
89
+ /**
90
+ * Execute a bash tool
91
+ */
92
+ async executeTool(toolName, args) {
93
+ try {
94
+ let command;
95
+ switch (toolName) {
96
+ case 'bash.execute_command':
97
+ command = args.command;
98
+ break;
99
+ case 'bash.list_files':
100
+ const path = args.path || '.';
101
+ const options = args.options || '-la';
102
+ command = `ls ${options} ${path}`;
103
+ break;
104
+ case 'bash.read_file':
105
+ command = `cat ${args.path}`;
106
+ break;
107
+ case 'bash.find_files':
108
+ const searchPath = args.path || '.';
109
+ command = `find ${searchPath} -name "${args.pattern}"`;
110
+ break;
111
+ default:
112
+ throw new Error(`Unknown tool: ${toolName}`);
113
+ }
114
+ // Execute command with timeout
115
+ console.log(`[BashTools] Executing: ${command}`);
116
+ console.log(`[BashTools] Working directory: ${process.cwd()}`);
117
+ const { stdout, stderr } = await execAsync(command, {
118
+ timeout: 10000, // 10 second timeout
119
+ maxBuffer: 1024 * 1024, // 1MB buffer
120
+ cwd: process.cwd()
121
+ });
122
+ console.log(`[BashTools] stdout length: ${stdout.length}`);
123
+ if (stderr)
124
+ console.log(`[BashTools] stderr: ${stderr}`);
125
+ return {
126
+ stdout: stdout.trim(),
127
+ stderr: stderr.trim(),
128
+ exitCode: 0
129
+ };
130
+ }
131
+ catch (error) {
132
+ console.error(`[BashTools] Error executing command:`, error.message);
133
+ console.error(`[BashTools] Exit code:`, error.code);
134
+ return {
135
+ stdout: error.stdout || '',
136
+ stderr: error.stderr || error.message,
137
+ exitCode: error.code || 1,
138
+ error: error.message
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Format tools for AI system prompt
144
+ */
145
+ formatToolsForPrompt() {
146
+ const tools = this.getTools();
147
+ const toolDescriptions = tools.map(tool => `- ${tool.name}: ${tool.description}`).join('\n');
148
+ return `\n\nAvailable Tools:\n${toolDescriptions}\n\nTo use a tool, respond with JSON: {"tool": "tool.name", "args": {...}}`;
149
+ }
150
+ /**
151
+ * Parse tool call from AI response
152
+ */
153
+ parseToolCall(response) {
154
+ try {
155
+ // Try to extract JSON from response
156
+ const jsonMatch = response.match(/\{[\s\S]*"tool"[\s\S]*\}/);
157
+ if (jsonMatch) {
158
+ const parsed = JSON.parse(jsonMatch[0]);
159
+ if (parsed.tool && parsed.args) {
160
+ return { tool: parsed.tool, args: parsed.args };
161
+ }
162
+ }
163
+ }
164
+ catch (error) {
165
+ // Not a tool call
166
+ }
167
+ return null;
168
+ }
169
+ }
170
+ exports.BashTools = BashTools;
171
+ BashTools.instance = null;
172
+ /**
173
+ * Usage Example:
174
+ *
175
+ * const bashTools = BashTools.getInstance();
176
+ *
177
+ * // Get available tools
178
+ * const tools = bashTools.getTools();
179
+ *
180
+ * // Execute a command
181
+ * const result = await bashTools.executeTool('bash.execute_command', {
182
+ * command: 'ls -la'
183
+ * });
184
+ *
185
+ * // Add tools to AI prompt
186
+ * const systemPrompt = "You are a helpful assistant." + bashTools.formatToolsForPrompt();
187
+ */
188
+ //# sourceMappingURL=bash-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-tools.js","sourceRoot":"","sources":["../bash-tools.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAqC;AACrC,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAelC,MAAa,SAAS;IAGlB,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtB,SAAS,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,QAAQ;QACX,OAAO;YACH;gBACI,IAAI,EAAE,sBAAsB;gBAC5B,WAAW,EAAE,8CAA8C;gBAC3D,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,OAAO,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,6BAA6B;yBAC7C;qBACJ;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACxB;aACJ;YACD;gBACI,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,8CAA8C;gBAC3D,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,IAAI,EAAE;4BACF,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,2CAA2C;yBAC3D;wBACD,OAAO,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,sCAAsC;yBACtD;qBACJ;iBACJ;aACJ;YACD;gBACI,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,6BAA6B;gBAC1C,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,IAAI,EAAE;4BACF,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,0BAA0B;yBAC1C;qBACJ;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACrB;aACJ;YACD;gBACI,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,+BAA+B;gBAC5C,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,OAAO,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,2CAA2C;yBAC3D;wBACD,IAAI,EAAE;4BACF,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,gDAAgD;yBAChE;qBACJ;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACxB;aACJ;SACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,IAAS;QAChD,IAAI,CAAC;YACD,IAAI,OAAe,CAAC;YAEpB,QAAQ,QAAQ,EAAE,CAAC;gBACf,KAAK,sBAAsB;oBACvB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBACvB,MAAM;gBAEV,KAAK,iBAAiB;oBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;oBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;oBACtC,OAAO,GAAG,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;oBAClC,MAAM;gBAEV,KAAK,gBAAgB;oBACjB,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC7B,MAAM;gBAEV,KAAK,iBAAiB;oBAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;oBACpC,OAAO,GAAG,QAAQ,UAAU,WAAW,IAAI,CAAC,OAAO,GAAG,CAAC;oBACvD,MAAM;gBAEV;oBACI,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;YACrD,CAAC;YAED,+BAA+B;YAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;gBAChD,OAAO,EAAE,KAAK,EAAE,oBAAoB;gBACpC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,aAAa;gBACrC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACrB,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3D,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;YAEzD,OAAO;gBACH,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,QAAQ,EAAE,CAAC;aACd,CAAC;QAEN,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,OAAO;gBACH,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO;gBACrC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;gBACzB,KAAK,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACI,oBAAoB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACtC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,yBAAyB,gBAAgB,4EAA4E,CAAC;IACjI,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,QAAgB;QACjC,IAAI,CAAC;YACD,oCAAoC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpD,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,kBAAkB;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;;AA9KL,8BA+KC;AA9KkB,kBAAQ,GAAqB,IAAI,CAAC;AAgLrD;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,94 @@
1
+ export interface CoreTool {
2
+ name: string;
3
+ description: string;
4
+ category: 'core' | 'execution' | 'web';
5
+ inputSchema: any;
6
+ }
7
+ export interface ToolResult {
8
+ success: boolean;
9
+ output?: string;
10
+ error?: string;
11
+ exitCode?: number;
12
+ }
13
+ export declare class CoreTools {
14
+ private static instance;
15
+ private backgroundProcesses;
16
+ private fileReadHistory;
17
+ private constructor();
18
+ static getInstance(): CoreTools;
19
+ /**
20
+ * Get all available tools organized by category
21
+ */
22
+ getTools(): CoreTool[];
23
+ /**
24
+ * Execute a tool by name
25
+ */
26
+ executeTool(toolName: string, args: any): Promise<ToolResult>;
27
+ /**
28
+ * Read - Read files with line numbers (cat -n format)
29
+ * Defaults to 2000 lines, supports offset/limit
30
+ * Tracks read history for Edit validation
31
+ */
32
+ private toolRead;
33
+ /**
34
+ * Write - Create or overwrite files
35
+ * MUST have read file first if it exists (checked via read history)
36
+ * Prefer Edit for existing files
37
+ */
38
+ private toolWrite;
39
+ /**
40
+ * Edit - Exact string replacement
41
+ * MUST have read file first
42
+ * Validates uniqueness unless replace_all is true
43
+ */
44
+ private toolEdit;
45
+ /**
46
+ * Glob - Find files by pattern
47
+ * Returns paths sorted by modification time (newest first)
48
+ */
49
+ private toolGlob;
50
+ /**
51
+ * Grep - Search file contents using ripgrep
52
+ * Supports multiple output modes, context lines, filters
53
+ */
54
+ private toolGrep;
55
+ /**
56
+ * Bash - Execute shell commands
57
+ * Supports background execution with process tracking
58
+ * Default timeout: 2 minutes, max: 10 minutes
59
+ */
60
+ private toolBash;
61
+ /**
62
+ * BashOutput - Monitor background processes
63
+ * Returns only NEW output since last check
64
+ */
65
+ private toolBashOutput;
66
+ /**
67
+ * KillShell - Terminate background process
68
+ */
69
+ private toolKillShell;
70
+ /**
71
+ * Format tools for AI system prompt - organized by category
72
+ */
73
+ formatToolsForPrompt(): string;
74
+ /**
75
+ * Convert tools to OpenAI tools array format
76
+ * Used when sending tools parameter in chat completion requests
77
+ */
78
+ toOpenAITools(): any[];
79
+ /**
80
+ * Parse tool call from AI response
81
+ * Supports multiple formats:
82
+ * 1. JSON: {"tool": "exec.bash", "args": {...}}
83
+ * 2. Function tags: <function=exec.bash={...}</function>
84
+ */
85
+ parseToolCall(response: string): {
86
+ tool: string;
87
+ args: any;
88
+ } | null;
89
+ /**
90
+ * List background processes
91
+ */
92
+ listBackgroundProcesses(): string[];
93
+ }
94
+ //# sourceMappingURL=core-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tools.d.ts","sourceRoot":"","sources":["../core-tools.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;IACvC,WAAW,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,qBAAa,SAAS;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,eAAe,CAA0B;IAEjD,OAAO;WAEO,WAAW,IAAI,SAAS;IAOtC;;OAEG;IACI,QAAQ,IAAI,QAAQ,EAAE;IA2N7B;;OAEG;IACU,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IA6C1E;;;;OAIG;YACW,QAAQ;IAiCtB;;;;OAIG;YACW,SAAS;IA6BvB;;;;OAIG;YACW,QAAQ;IAkDtB;;;OAGG;YACW,QAAQ;IAwBtB;;;OAGG;YACW,QAAQ;IAgEtB;;;;OAIG;YACW,QAAQ;IA+DtB;;;OAGG;YACW,cAAc;IA4B5B;;OAEG;YACW,aAAa;IAqB3B;;OAEG;IACI,oBAAoB,IAAI,MAAM;IAgCrC;;;OAGG;IACI,aAAa,IAAI,GAAG,EAAE;IAW7B;;;;;OAKG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IA+B1E;;OAEG;IACI,uBAAuB,IAAI,MAAM,EAAE;CAG7C"}