@google/gemini-cli-core 0.10.0-preview.3 → 0.11.0-nightly.20251020.a96f0659
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/google-gemini-cli-core-0.11.0-nightly.20251015.203bad7c.tgz +0 -0
- package/dist/src/agents/codebase-investigator.js +2 -5
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/executor.js +6 -13
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +36 -31
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/config/config.d.ts +1 -3
- package/dist/src/config/config.js +0 -5
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +0 -4
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +5 -0
- package/dist/src/core/client.test.js +0 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +6 -0
- package/dist/src/core/coreToolScheduler.js +30 -6
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +37 -3
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -0
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +13 -20
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/stream-json-formatter.d.ts +32 -0
- package/dist/src/output/stream-json-formatter.js +52 -0
- package/dist/src/output/stream-json-formatter.js.map +1 -0
- package/dist/src/output/stream-json-formatter.test.js +479 -0
- package/dist/src/output/stream-json-formatter.test.js.map +1 -0
- package/dist/src/output/types.d.ts +63 -1
- package/dist/src/output/types.js +11 -0
- package/dist/src/output/types.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +9 -9
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +16 -11
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/activity-monitor.d.ts +116 -0
- package/dist/src/telemetry/activity-monitor.js +208 -0
- package/dist/src/telemetry/activity-monitor.js.map +1 -0
- package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
- package/dist/src/telemetry/activity-monitor.test.js +248 -0
- package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +7 -7
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +3 -10
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.js +2 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +0 -1
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/tools/edit.d.ts +0 -1
- package/dist/src/tools/edit.js +4 -5
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +0 -1
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +0 -1
- package/dist/src/tools/glob.js +1 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.d.ts +0 -1
- package/dist/src/tools/grep.js +10 -5
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.d.ts +0 -1
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +0 -1
- package/dist/src/tools/memoryTool.js +3 -3
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/message-bus-integration.test.js +14 -1
- package/dist/src/tools/message-bus-integration.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +0 -1
- package/dist/src/tools/read-file.js +3 -3
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +0 -1
- package/dist/src/tools/read-many-files.js +3 -3
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +0 -1
- package/dist/src/tools/ripGrep.js +2 -2
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/shell.d.ts +0 -1
- package/dist/src/tools/shell.js +21 -58
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +61 -8
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +0 -1
- package/dist/src/tools/smart-edit.js +3 -4
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +0 -1
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +8 -0
- package/dist/src/tools/tool-names.js +8 -5
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tools.d.ts +10 -6
- package/dist/src/tools/tools.js +19 -33
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +3 -3
- package/dist/src/tools/web-fetch.js +43 -18
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +261 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +0 -1
- package/dist/src/tools/web-search.js +1 -2
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +0 -1
- package/dist/src/tools/write-file.js +2 -3
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +0 -1
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +1 -7
- package/dist/src/tools/write-todos.js +2 -3
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +2 -2
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/debugLogger.d.ts +25 -0
- package/dist/src/utils/debugLogger.js +33 -0
- package/dist/src/utils/debugLogger.js.map +1 -0
- package/dist/src/utils/debugLogger.test.d.ts +6 -0
- package/dist/src/utils/debugLogger.test.js +67 -0
- package/dist/src/utils/debugLogger.test.js.map +1 -0
- package/dist/src/utils/delay.d.ts +16 -0
- package/dist/src/utils/delay.js +43 -0
- package/dist/src/utils/delay.js.map +1 -0
- package/dist/src/utils/delay.test.d.ts +6 -0
- package/dist/src/utils/delay.test.js +88 -0
- package/dist/src/utils/delay.test.js.map +1 -0
- package/dist/src/utils/editCorrector.js +5 -9
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +3 -5
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/environmentContext.js +0 -33
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +0 -34
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -0
- package/dist/src/utils/fileUtils.js +31 -0
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +6 -5
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +14 -0
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +1 -0
- package/dist/src/utils/retry.js +14 -12
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +17 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.d.ts +4 -4
- package/dist/src/utils/safeJsonStringify.js +31 -7
- package/dist/src/utils/safeJsonStringify.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +2 -2
- package/dist/src/utils/shell-utils.js +307 -136
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +126 -60
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +2 -2
- package/dist/src/utils/tool-utils.js +14 -5
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -3
- package/dist/google-gemini-cli-core-0.10.0-preview.2.tgz +0 -0
- package/dist/src/core/subagent.d.ts +0 -236
- package/dist/src/core/subagent.js +0 -482
- package/dist/src/core/subagent.js.map +0 -1
- package/dist/src/core/subagent.test.js +0 -556
- package/dist/src/core/subagent.test.js.map +0 -1
- /package/dist/src/{core/subagent.test.d.ts → output/stream-json-formatter.test.d.ts} +0 -0
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { ContextState, SubAgentScope, SubagentTerminateMode, } from './subagent.js';
|
|
8
|
-
import { Config } from '../config/config.js';
|
|
9
|
-
import { GeminiChat, StreamEventType } from './geminiChat.js';
|
|
10
|
-
import { createContentGenerator } from './contentGenerator.js';
|
|
11
|
-
import { getEnvironmentContext } from '../utils/environmentContext.js';
|
|
12
|
-
import { executeToolCall } from './nonInteractiveToolExecutor.js';
|
|
13
|
-
import { DEFAULT_GEMINI_MODEL } from '../config/models.js';
|
|
14
|
-
import { Type } from '@google/genai';
|
|
15
|
-
import { ToolErrorType } from '../tools/tool-error.js';
|
|
16
|
-
vi.mock('./geminiChat.js');
|
|
17
|
-
vi.mock('./contentGenerator.js');
|
|
18
|
-
vi.mock('../utils/environmentContext.js');
|
|
19
|
-
vi.mock('./nonInteractiveToolExecutor.js');
|
|
20
|
-
vi.mock('../ide/ide-client.js');
|
|
21
|
-
async function createMockConfig(toolRegistryMocks = {}, configParameters = {}) {
|
|
22
|
-
const configParams = {
|
|
23
|
-
sessionId: 'test-session',
|
|
24
|
-
model: DEFAULT_GEMINI_MODEL,
|
|
25
|
-
targetDir: '.',
|
|
26
|
-
debugMode: false,
|
|
27
|
-
cwd: process.cwd(),
|
|
28
|
-
enableShellOutputEfficiency: false,
|
|
29
|
-
...configParameters,
|
|
30
|
-
};
|
|
31
|
-
const config = new Config(configParams);
|
|
32
|
-
await config.initialize();
|
|
33
|
-
// Mock ToolRegistry
|
|
34
|
-
const mockToolRegistry = {
|
|
35
|
-
getTool: vi.fn(),
|
|
36
|
-
getFunctionDeclarationsFiltered: vi.fn().mockReturnValue([]),
|
|
37
|
-
...toolRegistryMocks,
|
|
38
|
-
};
|
|
39
|
-
vi.spyOn(config, 'getToolRegistry').mockReturnValue(mockToolRegistry);
|
|
40
|
-
return { config, toolRegistry: mockToolRegistry };
|
|
41
|
-
}
|
|
42
|
-
// Helper to simulate LLM responses (sequence of tool calls over multiple turns)
|
|
43
|
-
const createMockStream = (functionCallsList) => {
|
|
44
|
-
let index = 0;
|
|
45
|
-
// This mock now returns a Promise that resolves to the async generator,
|
|
46
|
-
// matching the new signature for sendMessageStream.
|
|
47
|
-
return vi.fn().mockImplementation(async () => {
|
|
48
|
-
const response = functionCallsList[index] || 'stop';
|
|
49
|
-
index++;
|
|
50
|
-
return (async function* () {
|
|
51
|
-
let mockResponseValue;
|
|
52
|
-
if (response === 'stop' || response.length === 0) {
|
|
53
|
-
// Simulate a text response for stop/empty conditions.
|
|
54
|
-
mockResponseValue = {
|
|
55
|
-
candidates: [{ content: { parts: [{ text: 'Done.' }] } }],
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
// Simulate a tool call response.
|
|
60
|
-
mockResponseValue = {
|
|
61
|
-
candidates: [], // Good practice to include for safety.
|
|
62
|
-
functionCalls: response,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
// The stream must now yield a StreamEvent object of type CHUNK.
|
|
66
|
-
yield {
|
|
67
|
-
type: StreamEventType.CHUNK,
|
|
68
|
-
value: mockResponseValue,
|
|
69
|
-
};
|
|
70
|
-
})();
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
describe('subagent.ts', () => {
|
|
74
|
-
describe('ContextState', () => {
|
|
75
|
-
it('should set and get values correctly', () => {
|
|
76
|
-
const context = new ContextState();
|
|
77
|
-
context.set('key1', 'value1');
|
|
78
|
-
context.set('key2', 123);
|
|
79
|
-
expect(context.get('key1')).toBe('value1');
|
|
80
|
-
expect(context.get('key2')).toBe(123);
|
|
81
|
-
expect(context.get_keys()).toEqual(['key1', 'key2']);
|
|
82
|
-
});
|
|
83
|
-
it('should return undefined for missing keys', () => {
|
|
84
|
-
const context = new ContextState();
|
|
85
|
-
expect(context.get('missing')).toBeUndefined();
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
describe('SubAgentScope', () => {
|
|
89
|
-
let mockSendMessageStream;
|
|
90
|
-
const defaultModelConfig = {
|
|
91
|
-
model: 'gemini-1.5-flash-latest',
|
|
92
|
-
temp: 0.5, // Specific temp to test override
|
|
93
|
-
top_p: 1,
|
|
94
|
-
};
|
|
95
|
-
const defaultRunConfig = {
|
|
96
|
-
max_time_minutes: 5,
|
|
97
|
-
max_turns: 10,
|
|
98
|
-
};
|
|
99
|
-
beforeEach(async () => {
|
|
100
|
-
vi.clearAllMocks();
|
|
101
|
-
vi.mocked(getEnvironmentContext).mockResolvedValue([
|
|
102
|
-
{ text: 'Env Context' },
|
|
103
|
-
]);
|
|
104
|
-
vi.mocked(createContentGenerator).mockResolvedValue({
|
|
105
|
-
getGenerativeModel: vi.fn(),
|
|
106
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
-
});
|
|
108
|
-
mockSendMessageStream = vi.fn();
|
|
109
|
-
// We mock the implementation of the constructor.
|
|
110
|
-
vi.mocked(GeminiChat).mockImplementation(() => ({
|
|
111
|
-
sendMessageStream: mockSendMessageStream,
|
|
112
|
-
}));
|
|
113
|
-
});
|
|
114
|
-
afterEach(() => {
|
|
115
|
-
vi.restoreAllMocks();
|
|
116
|
-
});
|
|
117
|
-
// Helper to safely access generationConfig from mock calls
|
|
118
|
-
const getGenerationConfigFromMock = (callIndex = 0) => {
|
|
119
|
-
const callArgs = vi.mocked(GeminiChat).mock.calls[callIndex];
|
|
120
|
-
const generationConfig = callArgs?.[1];
|
|
121
|
-
// Ensure it's defined before proceeding
|
|
122
|
-
expect(generationConfig).toBeDefined();
|
|
123
|
-
if (!generationConfig)
|
|
124
|
-
throw new Error('generationConfig is undefined');
|
|
125
|
-
return generationConfig;
|
|
126
|
-
};
|
|
127
|
-
describe('create (Tool Validation)', () => {
|
|
128
|
-
const promptConfig = { systemPrompt: 'Test prompt' };
|
|
129
|
-
it('should create a SubAgentScope successfully with minimal config', async () => {
|
|
130
|
-
const { config } = await createMockConfig();
|
|
131
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
132
|
-
expect(scope).toBeInstanceOf(SubAgentScope);
|
|
133
|
-
});
|
|
134
|
-
it('should throw an error if a tool requires confirmation', async () => {
|
|
135
|
-
const mockTool = {
|
|
136
|
-
name: 'risky_tool',
|
|
137
|
-
schema: { parametersJsonSchema: { type: 'object', properties: {} } },
|
|
138
|
-
build: vi.fn().mockReturnValue({
|
|
139
|
-
shouldConfirmExecute: vi.fn().mockResolvedValue({
|
|
140
|
-
type: 'exec',
|
|
141
|
-
title: 'Confirm',
|
|
142
|
-
command: 'rm -rf /',
|
|
143
|
-
}),
|
|
144
|
-
}),
|
|
145
|
-
};
|
|
146
|
-
const { config } = await createMockConfig({
|
|
147
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
148
|
-
getTool: vi.fn().mockReturnValue(mockTool),
|
|
149
|
-
});
|
|
150
|
-
const toolConfig = { tools: ['risky_tool'] };
|
|
151
|
-
const options = { toolConfig };
|
|
152
|
-
await expect(SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options)).rejects.toThrow('Tool "risky_tool" requires user confirmation and cannot be used in a non-interactive subagent.');
|
|
153
|
-
});
|
|
154
|
-
it('should succeed if tools do not require confirmation', async () => {
|
|
155
|
-
const mockTool = {
|
|
156
|
-
name: 'safe_tool',
|
|
157
|
-
schema: { parametersJsonSchema: { type: 'object', properties: {} } },
|
|
158
|
-
build: vi.fn().mockReturnValue({
|
|
159
|
-
shouldConfirmExecute: vi.fn().mockResolvedValue(null),
|
|
160
|
-
}),
|
|
161
|
-
};
|
|
162
|
-
const { config } = await createMockConfig({
|
|
163
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
-
getTool: vi.fn().mockReturnValue(mockTool),
|
|
165
|
-
});
|
|
166
|
-
const toolConfig = { tools: ['safe_tool'] };
|
|
167
|
-
const options = { toolConfig };
|
|
168
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options);
|
|
169
|
-
expect(scope).toBeInstanceOf(SubAgentScope);
|
|
170
|
-
});
|
|
171
|
-
it('should skip interactivity check and warn for tools with required parameters', async () => {
|
|
172
|
-
const consoleWarnSpy = vi
|
|
173
|
-
.spyOn(console, 'warn')
|
|
174
|
-
.mockImplementation(() => { });
|
|
175
|
-
const mockToolWithParams = {
|
|
176
|
-
name: 'tool_with_params',
|
|
177
|
-
schema: {
|
|
178
|
-
parametersJsonSchema: {
|
|
179
|
-
type: 'object',
|
|
180
|
-
properties: {
|
|
181
|
-
path: { type: 'string' },
|
|
182
|
-
},
|
|
183
|
-
required: ['path'],
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
// build should not be called, but we mock it to be safe
|
|
187
|
-
build: vi.fn(),
|
|
188
|
-
};
|
|
189
|
-
const { config } = await createMockConfig({
|
|
190
|
-
getTool: vi.fn().mockReturnValue(mockToolWithParams),
|
|
191
|
-
getAllTools: vi.fn().mockReturnValue([mockToolWithParams]),
|
|
192
|
-
});
|
|
193
|
-
const toolConfig = { tools: ['tool_with_params'] };
|
|
194
|
-
const options = { toolConfig };
|
|
195
|
-
// The creation should succeed without throwing
|
|
196
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, options);
|
|
197
|
-
expect(scope).toBeInstanceOf(SubAgentScope);
|
|
198
|
-
// Check that the warning was logged
|
|
199
|
-
expect(consoleWarnSpy).toHaveBeenCalledWith('Cannot check tool "tool_with_params" for interactivity because it requires parameters. Assuming it is safe for non-interactive use.');
|
|
200
|
-
// Ensure build was never called
|
|
201
|
-
expect(mockToolWithParams.build).not.toHaveBeenCalled();
|
|
202
|
-
consoleWarnSpy.mockRestore();
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
describe('runNonInteractive - Initialization and Prompting', () => {
|
|
206
|
-
it('should correctly template the system prompt and initialize GeminiChat', async () => {
|
|
207
|
-
const { config } = await createMockConfig();
|
|
208
|
-
vi.mocked(GeminiChat).mockClear();
|
|
209
|
-
const promptConfig = {
|
|
210
|
-
systemPrompt: 'Hello ${name}, your task is ${task}.',
|
|
211
|
-
};
|
|
212
|
-
const context = new ContextState();
|
|
213
|
-
context.set('name', 'Agent');
|
|
214
|
-
context.set('task', 'Testing');
|
|
215
|
-
// Model stops immediately
|
|
216
|
-
mockSendMessageStream.mockImplementation(createMockStream(['stop']));
|
|
217
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
218
|
-
await scope.runNonInteractive(context);
|
|
219
|
-
// Check if GeminiChat was initialized correctly by the subagent
|
|
220
|
-
expect(GeminiChat).toHaveBeenCalledTimes(1);
|
|
221
|
-
const callArgs = vi.mocked(GeminiChat).mock.calls[0];
|
|
222
|
-
// Check Generation Config
|
|
223
|
-
const generationConfig = getGenerationConfigFromMock();
|
|
224
|
-
// Check temperature override
|
|
225
|
-
expect(generationConfig.temperature).toBe(defaultModelConfig.temp);
|
|
226
|
-
expect(generationConfig.systemInstruction).toContain('Hello Agent, your task is Testing.');
|
|
227
|
-
expect(generationConfig.systemInstruction).toContain('Important Rules:');
|
|
228
|
-
// Check History (should include environment context)
|
|
229
|
-
const history = callArgs[2];
|
|
230
|
-
expect(history).toEqual([
|
|
231
|
-
{ role: 'user', parts: [{ text: 'Env Context' }] },
|
|
232
|
-
{
|
|
233
|
-
role: 'model',
|
|
234
|
-
parts: [{ text: 'Got it. Thanks for the context!' }],
|
|
235
|
-
},
|
|
236
|
-
]);
|
|
237
|
-
});
|
|
238
|
-
it('should include output instructions in the system prompt when outputs are defined', async () => {
|
|
239
|
-
const { config } = await createMockConfig();
|
|
240
|
-
vi.mocked(GeminiChat).mockClear();
|
|
241
|
-
const promptConfig = { systemPrompt: 'Do the task.' };
|
|
242
|
-
const outputConfig = {
|
|
243
|
-
outputs: {
|
|
244
|
-
result1: 'The first result',
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
const context = new ContextState();
|
|
248
|
-
// Model stops immediately
|
|
249
|
-
mockSendMessageStream.mockImplementation(createMockStream(['stop']));
|
|
250
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
|
|
251
|
-
await scope.runNonInteractive(context);
|
|
252
|
-
const generationConfig = getGenerationConfigFromMock();
|
|
253
|
-
const systemInstruction = generationConfig.systemInstruction;
|
|
254
|
-
expect(systemInstruction).toContain('Do the task.');
|
|
255
|
-
expect(systemInstruction).toContain('you MUST emit the required output variables');
|
|
256
|
-
expect(systemInstruction).toContain("Use 'self.emitvalue' to emit the 'result1' key");
|
|
257
|
-
});
|
|
258
|
-
it('should use initialMessages instead of systemPrompt if provided', async () => {
|
|
259
|
-
const { config } = await createMockConfig();
|
|
260
|
-
vi.mocked(GeminiChat).mockClear();
|
|
261
|
-
const initialMessages = [
|
|
262
|
-
{ role: 'user', parts: [{ text: 'Hi' }] },
|
|
263
|
-
];
|
|
264
|
-
const promptConfig = { initialMessages };
|
|
265
|
-
const context = new ContextState();
|
|
266
|
-
// Model stops immediately
|
|
267
|
-
mockSendMessageStream.mockImplementation(createMockStream(['stop']));
|
|
268
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
269
|
-
await scope.runNonInteractive(context);
|
|
270
|
-
const callArgs = vi.mocked(GeminiChat).mock.calls[0];
|
|
271
|
-
const generationConfig = getGenerationConfigFromMock();
|
|
272
|
-
const history = callArgs[2];
|
|
273
|
-
expect(generationConfig.systemInstruction).toBeUndefined();
|
|
274
|
-
expect(history).toEqual([
|
|
275
|
-
{ role: 'user', parts: [{ text: 'Env Context' }] },
|
|
276
|
-
{
|
|
277
|
-
role: 'model',
|
|
278
|
-
parts: [{ text: 'Got it. Thanks for the context!' }],
|
|
279
|
-
},
|
|
280
|
-
...initialMessages,
|
|
281
|
-
]);
|
|
282
|
-
});
|
|
283
|
-
it('should throw an error if template variables are missing', async () => {
|
|
284
|
-
const { config } = await createMockConfig();
|
|
285
|
-
const promptConfig = {
|
|
286
|
-
systemPrompt: 'Hello ${name}, you are missing ${missing}.',
|
|
287
|
-
};
|
|
288
|
-
const context = new ContextState();
|
|
289
|
-
context.set('name', 'Agent');
|
|
290
|
-
// 'missing' is not set
|
|
291
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
292
|
-
// The error from templating causes the runNonInteractive to reject and the terminate_reason to be ERROR.
|
|
293
|
-
await expect(scope.runNonInteractive(context)).rejects.toThrow('Missing context values for the following keys: missing');
|
|
294
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
|
|
295
|
-
});
|
|
296
|
-
it('should validate that systemPrompt and initialMessages are mutually exclusive', async () => {
|
|
297
|
-
const { config } = await createMockConfig();
|
|
298
|
-
const promptConfig = {
|
|
299
|
-
systemPrompt: 'System',
|
|
300
|
-
initialMessages: [{ role: 'user', parts: [{ text: 'Hi' }] }],
|
|
301
|
-
};
|
|
302
|
-
const context = new ContextState();
|
|
303
|
-
const agent = await SubAgentScope.create('TestAgent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
304
|
-
await expect(agent.runNonInteractive(context)).rejects.toThrow('PromptConfig cannot have both `systemPrompt` and `initialMessages` defined.');
|
|
305
|
-
expect(agent.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
describe('runNonInteractive - Execution and Tool Use', () => {
|
|
309
|
-
const promptConfig = { systemPrompt: 'Execute task.' };
|
|
310
|
-
it('should terminate with GOAL if no outputs are expected and model stops', async () => {
|
|
311
|
-
const { config } = await createMockConfig();
|
|
312
|
-
// Model stops immediately
|
|
313
|
-
mockSendMessageStream.mockImplementation(createMockStream(['stop']));
|
|
314
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
315
|
-
await scope.runNonInteractive(new ContextState());
|
|
316
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
|
|
317
|
-
expect(scope.output.emitted_vars).toEqual({});
|
|
318
|
-
expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
|
|
319
|
-
// Check the initial message
|
|
320
|
-
expect(mockSendMessageStream.mock.calls[0][1].message).toEqual([
|
|
321
|
-
{ text: 'Get Started!' },
|
|
322
|
-
]);
|
|
323
|
-
});
|
|
324
|
-
it('should handle self.emitvalue and terminate with GOAL when outputs are met', async () => {
|
|
325
|
-
const { config } = await createMockConfig();
|
|
326
|
-
const outputConfig = {
|
|
327
|
-
outputs: { result: 'The final result' },
|
|
328
|
-
};
|
|
329
|
-
// Turn 1: Model responds with emitvalue call
|
|
330
|
-
// Turn 2: Model stops after receiving the tool response
|
|
331
|
-
mockSendMessageStream.mockImplementation(createMockStream([
|
|
332
|
-
[
|
|
333
|
-
{
|
|
334
|
-
name: 'self.emitvalue',
|
|
335
|
-
args: {
|
|
336
|
-
emit_variable_name: 'result',
|
|
337
|
-
emit_variable_value: 'Success!',
|
|
338
|
-
},
|
|
339
|
-
},
|
|
340
|
-
],
|
|
341
|
-
'stop',
|
|
342
|
-
]));
|
|
343
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
|
|
344
|
-
await scope.runNonInteractive(new ContextState());
|
|
345
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
|
|
346
|
-
expect(scope.output.emitted_vars).toEqual({ result: 'Success!' });
|
|
347
|
-
expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
|
|
348
|
-
// Check the tool response sent back in the second call
|
|
349
|
-
const secondCallArgs = mockSendMessageStream.mock.calls[0][1];
|
|
350
|
-
expect(secondCallArgs.message).toEqual([{ text: 'Get Started!' }]);
|
|
351
|
-
});
|
|
352
|
-
it('should execute external tools and provide the response to the model', async () => {
|
|
353
|
-
const listFilesToolDef = {
|
|
354
|
-
name: 'list_files',
|
|
355
|
-
description: 'Lists files',
|
|
356
|
-
parameters: { type: Type.OBJECT, properties: {} },
|
|
357
|
-
};
|
|
358
|
-
const { config } = await createMockConfig({
|
|
359
|
-
getFunctionDeclarationsFiltered: vi
|
|
360
|
-
.fn()
|
|
361
|
-
.mockReturnValue([listFilesToolDef]),
|
|
362
|
-
getTool: vi.fn().mockReturnValue(undefined),
|
|
363
|
-
});
|
|
364
|
-
const toolConfig = { tools: ['list_files'] };
|
|
365
|
-
// Turn 1: Model calls the external tool
|
|
366
|
-
// Turn 2: Model stops
|
|
367
|
-
mockSendMessageStream.mockImplementation(createMockStream([
|
|
368
|
-
[
|
|
369
|
-
{
|
|
370
|
-
id: 'call_1',
|
|
371
|
-
name: 'list_files',
|
|
372
|
-
args: { path: '.' },
|
|
373
|
-
},
|
|
374
|
-
],
|
|
375
|
-
'stop',
|
|
376
|
-
]));
|
|
377
|
-
// Mock the tool execution result - must return CompletedToolCall
|
|
378
|
-
vi.mocked(executeToolCall).mockResolvedValue({
|
|
379
|
-
status: 'success',
|
|
380
|
-
request: {
|
|
381
|
-
callId: 'call_1',
|
|
382
|
-
name: 'list_files',
|
|
383
|
-
args: { path: '.' },
|
|
384
|
-
isClientInitiated: false,
|
|
385
|
-
prompt_id: 'prompt-id-1',
|
|
386
|
-
},
|
|
387
|
-
tool: {},
|
|
388
|
-
invocation: {},
|
|
389
|
-
response: {
|
|
390
|
-
callId: 'call_1',
|
|
391
|
-
responseParts: [{ text: 'file1.txt\nfile2.ts' }],
|
|
392
|
-
resultDisplay: 'Listed 2 files',
|
|
393
|
-
error: undefined,
|
|
394
|
-
errorType: undefined,
|
|
395
|
-
contentLength: undefined,
|
|
396
|
-
},
|
|
397
|
-
});
|
|
398
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { toolConfig });
|
|
399
|
-
await scope.runNonInteractive(new ContextState());
|
|
400
|
-
// Check tool execution
|
|
401
|
-
expect(executeToolCall).toHaveBeenCalledWith(config, expect.objectContaining({ name: 'list_files', args: { path: '.' } }), expect.any(AbortSignal));
|
|
402
|
-
// Check the response sent back to the model
|
|
403
|
-
const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
|
|
404
|
-
expect(secondCallArgs.message).toEqual([
|
|
405
|
-
{ text: 'file1.txt\nfile2.ts' },
|
|
406
|
-
]);
|
|
407
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
|
|
408
|
-
});
|
|
409
|
-
it('should provide specific tool error responses to the model', async () => {
|
|
410
|
-
const { config } = await createMockConfig();
|
|
411
|
-
const toolConfig = { tools: ['failing_tool'] };
|
|
412
|
-
// Turn 1: Model calls the failing tool
|
|
413
|
-
// Turn 2: Model stops after receiving the error response
|
|
414
|
-
mockSendMessageStream.mockImplementation(createMockStream([
|
|
415
|
-
[
|
|
416
|
-
{
|
|
417
|
-
id: 'call_fail',
|
|
418
|
-
name: 'failing_tool',
|
|
419
|
-
args: {},
|
|
420
|
-
},
|
|
421
|
-
],
|
|
422
|
-
'stop',
|
|
423
|
-
]));
|
|
424
|
-
// Mock the tool execution failure - must return CompletedToolCall
|
|
425
|
-
vi.mocked(executeToolCall).mockResolvedValue({
|
|
426
|
-
status: 'error',
|
|
427
|
-
request: {
|
|
428
|
-
callId: 'call_fail',
|
|
429
|
-
name: 'failing_tool',
|
|
430
|
-
args: {},
|
|
431
|
-
isClientInitiated: false,
|
|
432
|
-
prompt_id: 'prompt-id-fail',
|
|
433
|
-
},
|
|
434
|
-
tool: {},
|
|
435
|
-
response: {
|
|
436
|
-
callId: 'call_fail',
|
|
437
|
-
responseParts: [{ text: 'ERROR: Tool failed catastrophically' }], // This should be sent to the model
|
|
438
|
-
resultDisplay: 'Tool failed catastrophically',
|
|
439
|
-
error: new Error('Failure'),
|
|
440
|
-
errorType: ToolErrorType.INVALID_TOOL_PARAMS,
|
|
441
|
-
contentLength: undefined,
|
|
442
|
-
},
|
|
443
|
-
});
|
|
444
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { toolConfig });
|
|
445
|
-
await scope.runNonInteractive(new ContextState());
|
|
446
|
-
// The agent should send the specific error message from responseParts.
|
|
447
|
-
const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
|
|
448
|
-
expect(secondCallArgs.message).toEqual([
|
|
449
|
-
{
|
|
450
|
-
text: 'ERROR: Tool failed catastrophically',
|
|
451
|
-
},
|
|
452
|
-
]);
|
|
453
|
-
});
|
|
454
|
-
it('should nudge the model if it stops before emitting all required variables', async () => {
|
|
455
|
-
const { config } = await createMockConfig();
|
|
456
|
-
const outputConfig = {
|
|
457
|
-
outputs: { required_var: 'Must be present' },
|
|
458
|
-
};
|
|
459
|
-
// Turn 1: Model stops prematurely
|
|
460
|
-
// Turn 2: Model responds to the nudge and emits the variable
|
|
461
|
-
// Turn 3: Model stops
|
|
462
|
-
mockSendMessageStream.mockImplementation(createMockStream([
|
|
463
|
-
'stop',
|
|
464
|
-
[
|
|
465
|
-
{
|
|
466
|
-
name: 'self.emitvalue',
|
|
467
|
-
args: {
|
|
468
|
-
emit_variable_name: 'required_var',
|
|
469
|
-
emit_variable_value: 'Here it is',
|
|
470
|
-
},
|
|
471
|
-
},
|
|
472
|
-
],
|
|
473
|
-
'stop',
|
|
474
|
-
]));
|
|
475
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig, { outputConfig });
|
|
476
|
-
await scope.runNonInteractive(new ContextState());
|
|
477
|
-
// Check the nudge message sent in Turn 2
|
|
478
|
-
const secondCallArgs = mockSendMessageStream.mock.calls[1][1];
|
|
479
|
-
// We check that the message contains the required variable name and the nudge phrasing.
|
|
480
|
-
expect(secondCallArgs.message[0].text).toContain('required_var');
|
|
481
|
-
expect(secondCallArgs.message[0].text).toContain('You have stopped calling tools');
|
|
482
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.GOAL);
|
|
483
|
-
expect(scope.output.emitted_vars).toEqual({
|
|
484
|
-
required_var: 'Here it is',
|
|
485
|
-
});
|
|
486
|
-
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
describe('runNonInteractive - Termination and Recovery', () => {
|
|
490
|
-
const promptConfig = { systemPrompt: 'Execute task.' };
|
|
491
|
-
it('should terminate with MAX_TURNS if the limit is reached', async () => {
|
|
492
|
-
const { config } = await createMockConfig();
|
|
493
|
-
const runConfig = { ...defaultRunConfig, max_turns: 2 };
|
|
494
|
-
// Model keeps looping by calling emitvalue repeatedly
|
|
495
|
-
mockSendMessageStream.mockImplementation(createMockStream([
|
|
496
|
-
[
|
|
497
|
-
{
|
|
498
|
-
name: 'self.emitvalue',
|
|
499
|
-
args: { emit_variable_name: 'loop', emit_variable_value: 'v1' },
|
|
500
|
-
},
|
|
501
|
-
],
|
|
502
|
-
[
|
|
503
|
-
{
|
|
504
|
-
name: 'self.emitvalue',
|
|
505
|
-
args: { emit_variable_name: 'loop', emit_variable_value: 'v2' },
|
|
506
|
-
},
|
|
507
|
-
],
|
|
508
|
-
// This turn should not happen
|
|
509
|
-
[
|
|
510
|
-
{
|
|
511
|
-
name: 'self.emitvalue',
|
|
512
|
-
args: { emit_variable_name: 'loop', emit_variable_value: 'v3' },
|
|
513
|
-
},
|
|
514
|
-
],
|
|
515
|
-
]));
|
|
516
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, runConfig);
|
|
517
|
-
await scope.runNonInteractive(new ContextState());
|
|
518
|
-
expect(mockSendMessageStream).toHaveBeenCalledTimes(2);
|
|
519
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.MAX_TURNS);
|
|
520
|
-
});
|
|
521
|
-
it('should terminate with TIMEOUT if the time limit is reached during an LLM call', async () => {
|
|
522
|
-
// Use fake timers to reliably test timeouts
|
|
523
|
-
vi.useFakeTimers();
|
|
524
|
-
const { config } = await createMockConfig({}, { useRipgrep: false });
|
|
525
|
-
const runConfig = { max_time_minutes: 5, max_turns: 100 };
|
|
526
|
-
// We need to control the resolution of the sendMessageStream promise to advance the timer during execution.
|
|
527
|
-
let resolveStream;
|
|
528
|
-
const streamPromise = new Promise((resolve) => {
|
|
529
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
530
|
-
resolveStream = resolve;
|
|
531
|
-
});
|
|
532
|
-
// The LLM call will hang until we resolve the promise.
|
|
533
|
-
mockSendMessageStream.mockReturnValue(streamPromise);
|
|
534
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, runConfig);
|
|
535
|
-
const runPromise = scope.runNonInteractive(new ContextState());
|
|
536
|
-
// Advance time beyond the limit (6 minutes) while the agent is awaiting the LLM response.
|
|
537
|
-
await vi.advanceTimersByTimeAsync(6 * 60 * 1000);
|
|
538
|
-
// Now resolve the stream. The model returns 'stop'.
|
|
539
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
540
|
-
resolveStream(createMockStream(['stop'])());
|
|
541
|
-
await runPromise;
|
|
542
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.TIMEOUT);
|
|
543
|
-
expect(mockSendMessageStream).toHaveBeenCalledTimes(1);
|
|
544
|
-
vi.useRealTimers();
|
|
545
|
-
});
|
|
546
|
-
it('should terminate with ERROR if the model call throws', async () => {
|
|
547
|
-
const { config } = await createMockConfig({}, { useRipgrep: false });
|
|
548
|
-
mockSendMessageStream.mockRejectedValue(new Error('API Failure'));
|
|
549
|
-
const scope = await SubAgentScope.create('test-agent', config, promptConfig, defaultModelConfig, defaultRunConfig);
|
|
550
|
-
await expect(scope.runNonInteractive(new ContextState())).rejects.toThrow('API Failure');
|
|
551
|
-
expect(scope.output.terminate_reason).toBe(SubagentTerminateMode.ERROR);
|
|
552
|
-
});
|
|
553
|
-
});
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
//# sourceMappingURL=subagent.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.test.js","sourceRoot":"","sources":["../../../src/core/subagent.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,qBAAqB,GACtB,MAAM,eAAe,CAAC;AASvB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAQrC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3B,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACjC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAC1C,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;AAC3C,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAEhC,KAAK,UAAU,gBAAgB,CAC7B,iBAAiB,GAAG,EAAE,EACtB,mBAA8C,EAAE;IAEhD,MAAM,YAAY,GAAqB;QACrC,SAAS,EAAE,cAAc;QACzB,KAAK,EAAE,oBAAoB;QAC3B,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,2BAA2B,EAAE,KAAK;QAClC,GAAG,gBAAgB;KACpB,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1B,oBAAoB;IACpB,MAAM,gBAAgB,GAAG;QACvB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;QAChB,+BAA+B,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5D,GAAG,iBAAiB;KACM,CAAC;IAE7B,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACpD,CAAC;AAED,gFAAgF;AAChF,MAAM,gBAAgB,GAAG,CACvB,iBAAiD,EACjD,EAAE;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,wEAAwE;IACxE,oDAAoD;IACpD,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;QACpD,KAAK,EAAE,CAAC;QAER,OAAO,CAAC,KAAK,SAAS,CAAC;YACrB,IAAI,iBAAmD,CAAC;YAExD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,sDAAsD;gBACtD,iBAAiB,GAAG;oBAClB,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;iBAC1D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,iBAAiB,GAAG;oBAClB,UAAU,EAAE,EAAE,EAAE,uCAAuC;oBACvD,aAAa,EAAE,QAAQ;iBACxB,CAAC;YACJ,CAAC;YAED,gEAAgE;YAChE,MAAM;gBACJ,IAAI,EAAE,eAAe,CAAC,KAAK;gBAC3B,KAAK,EAAE,iBAA4C;aACpD,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,IAAI,qBAA2B,CAAC;QAEhC,MAAM,kBAAkB,GAAgB;YACtC,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,GAAG,EAAE,iCAAiC;YAC5C,KAAK,EAAE,CAAC;SACT,CAAC;QAEF,MAAM,gBAAgB,GAAc;YAClC,gBAAgB,EAAE,CAAC;YACnB,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,EAAE,CAAC,aAAa,EAAE,CAAC;YAEnB,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,iBAAiB,CAAC;gBACjD,EAAE,IAAI,EAAE,aAAa,EAAE;aACxB,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,iBAAiB,CAAC;gBAClD,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC3B,8DAA8D;aACxD,CAAC,CAAC;YAEV,qBAAqB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,iDAAiD;YACjD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,CACtC,GAAG,EAAE,CACH,CAAC;gBACC,iBAAiB,EAAE,qBAAqB;aACzC,CAA0B,CAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,MAAM,2BAA2B,GAAG,CAClC,SAAS,GAAG,CAAC,EACU,EAAE;YACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,gBAAgB,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,wCAAwC;YACxC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,CAAC,gBAAgB;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACxE,OAAO,gBAAyC,CAAC;QACnD,CAAC,CAAC;QAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,MAAM,YAAY,GAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;YAEnE,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;gBAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;gBACrE,MAAM,QAAQ,GAAG;oBACf,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;oBACpE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;wBAC7B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;4BAC9C,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,UAAU;yBACpB,CAAC;qBACH,CAAC;iBACH,CAAC;gBAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;oBACxC,8DAA8D;oBAC9D,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAe,CAAC;iBAClD,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAe,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBACzD,MAAM,OAAO,GAAoB,EAAE,UAAU,EAAE,CAAC;gBAEhD,MAAM,MAAM,CACV,aAAa,CAAC,MAAM,CAClB,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,CACR,CACF,CAAC,OAAO,CAAC,OAAO,CACf,gGAAgG,CACjG,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;gBACnE,MAAM,QAAQ,GAAG;oBACf,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;oBACpE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;wBAC7B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;qBACtD,CAAC;iBACH,CAAC;gBACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;oBACxC,8DAA8D;oBAC9D,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAe,CAAC;iBAClD,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAe,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxD,MAAM,OAAO,GAAoB,EAAE,UAAU,EAAE,CAAC;gBAEhD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,CACR,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;gBAC3F,MAAM,cAAc,GAAG,EAAE;qBACtB,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;qBACtB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAEhC,MAAM,kBAAkB,GAAG;oBACzB,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE;wBACN,oBAAoB,EAAE;4BACpB,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACzB;4BACD,QAAQ,EAAE,CAAC,MAAM,CAAC;yBACnB;qBACF;oBACD,wDAAwD;oBACxD,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;iBACf,CAAC;gBAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;oBACxC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC;oBACpD,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,kBAAkB,CAAC,CAAC;iBAC3D,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAe,EAAE,KAAK,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC/D,MAAM,OAAO,GAAoB,EAAE,UAAU,EAAE,CAAC;gBAEhD,+CAA+C;gBAC/C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,CACR,CAAC;gBAEF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBAE5C,oCAAoC;gBACpC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,qIAAqI,CACtI,CAAC;gBAEF,gCAAgC;gBAChC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;gBAExD,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAChE,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;gBACrF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAE5C,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;gBAElC,MAAM,YAAY,GAAiB;oBACjC,YAAY,EAAE,sCAAsC;iBACrD,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAE/B,0BAA0B;gBAC1B,qBAAqB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAEvC,gEAAgE;gBAChE,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAErD,0BAA0B;gBAC1B,MAAM,gBAAgB,GAAG,2BAA2B,EAAE,CAAC;gBAEvD,6BAA6B;gBAC7B,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAClD,oCAAoC,CACrC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAClD,kBAAkB,CACnB,CAAC;gBAEF,qDAAqD;gBACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;oBACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;oBAClD;wBACE,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;qBACrD;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;gBAChG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;gBAElC,MAAM,YAAY,GAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;gBACpE,MAAM,YAAY,GAAiB;oBACjC,OAAO,EAAE;wBACP,OAAO,EAAE,kBAAkB;qBAC5B;iBACF,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;gBAEnC,0BAA0B;gBAC1B,qBAAqB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,EAAE,YAAY,EAAE,CACjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAEvC,MAAM,gBAAgB,GAAG,2BAA2B,EAAE,CAAC;gBACvD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,iBAA2B,CAAC;gBAEvE,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBACpD,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CACjC,6CAA6C,CAC9C,CAAC;gBACF,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CACjC,gDAAgD,CACjD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;gBAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;gBAElC,MAAM,eAAe,GAAc;oBACjC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;iBAC1C,CAAC;gBACF,MAAM,YAAY,GAAiB,EAAE,eAAe,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;gBAEnC,0BAA0B;gBAC1B,qBAAqB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAEvC,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrD,MAAM,gBAAgB,GAAG,2BAA2B,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE5B,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,aAAa,EAAE,CAAC;gBAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;oBACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;oBAClD;wBACE,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;qBACrD;oBACD,GAAG,eAAe;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAiB;oBACjC,YAAY,EAAE,4CAA4C;iBAC3D,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7B,uBAAuB;gBAEvB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBAEF,yGAAyG;gBACzG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,wDAAwD,CACzD,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;gBAC5F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAiB;oBACjC,YAAY,EAAE,QAAQ;oBACtB,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;iBAC7D,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;gBAEnC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,WAAW,EACX,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBAEF,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,6EAA6E,CAC9E,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;YAC1D,MAAM,YAAY,GAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;YAErE,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;gBACrF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,0BAA0B;gBAC1B,qBAAqB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CAEjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACvE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBACvD,4BAA4B;gBAC5B,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;oBAC7D,EAAE,IAAI,EAAE,cAAc,EAAE;iBACzB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;gBACzF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAiB;oBACjC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;iBACxC,CAAC;gBAEF,6CAA6C;gBAC7C,wDAAwD;gBACxD,qBAAqB,CAAC,kBAAkB,CACtC,gBAAgB,CAAC;oBACf;wBACE;4BACE,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE;gCACJ,kBAAkB,EAAE,QAAQ;gCAC5B,mBAAmB,EAAE,UAAU;6BAChC;yBACF;qBACF;oBACD,MAAM;iBACP,CAAC,CACH,CAAC;gBAEF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,EAAE,YAAY,EAAE,CACjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACvE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClE,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAEvD,uDAAuD;gBACvD,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;gBACnF,MAAM,gBAAgB,GAAwB;oBAC5C,IAAI,EAAE,YAAY;oBAClB,WAAW,EAAE,aAAa;oBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;iBAClD,CAAC;gBAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC;oBACxC,+BAA+B,EAAE,EAAE;yBAChC,EAAE,EAAE;yBACJ,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC;oBACtC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;iBAC5C,CAAC,CAAC;gBACH,MAAM,UAAU,GAAe,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBAEzD,wCAAwC;gBACxC,sBAAsB;gBACtB,qBAAqB,CAAC,kBAAkB,CACtC,gBAAgB,CAAC;oBACf;wBACE;4BACE,EAAE,EAAE,QAAQ;4BACZ,IAAI,EAAE,YAAY;4BAClB,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;yBACpB;qBACF;oBACD,MAAM;iBACP,CAAC,CACH,CAAC;gBAEF,iEAAiE;gBACjE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC;oBAC3C,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE;wBACP,MAAM,EAAE,QAAQ;wBAChB,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;wBACnB,iBAAiB,EAAE,KAAK;wBACxB,SAAS,EAAE,aAAa;qBACzB;oBACD,IAAI,EAAE,EAAwB;oBAC9B,UAAU,EAAE,EAAuB;oBACnC,QAAQ,EAAE;wBACR,MAAM,EAAE,QAAQ;wBAChB,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;wBAChD,aAAa,EAAE,gBAAgB;wBAC/B,KAAK,EAAE,SAAS;wBAChB,SAAS,EAAE,SAAS;wBACpB,aAAa,EAAE,SAAS;qBACzB;iBACF,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,EAAE,UAAU,EAAE,CACf,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,uBAAuB;gBACvB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,MAAM,EACN,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EACpE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CACxB,CAAC;gBAEF,4CAA4C;gBAC5C,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;oBACrC,EAAE,IAAI,EAAE,qBAAqB,EAAE;iBAChC,CAAC,CAAC;gBAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAe,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;gBAE3D,uCAAuC;gBACvC,yDAAyD;gBACzD,qBAAqB,CAAC,kBAAkB,CACtC,gBAAgB,CAAC;oBACf;wBACE;4BACE,EAAE,EAAE,WAAW;4BACf,IAAI,EAAE,cAAc;4BACpB,IAAI,EAAE,EAAE;yBACT;qBACF;oBACD,MAAM;iBACP,CAAC,CACH,CAAC;gBAEF,kEAAkE;gBAClE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC;oBAC3C,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE;wBACP,MAAM,EAAE,WAAW;wBACnB,IAAI,EAAE,cAAc;wBACpB,IAAI,EAAE,EAAE;wBACR,iBAAiB,EAAE,KAAK;wBACxB,SAAS,EAAE,gBAAgB;qBAC5B;oBACD,IAAI,EAAE,EAAwB;oBAC9B,QAAQ,EAAE;wBACR,MAAM,EAAE,WAAW;wBACnB,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,EAAE,mCAAmC;wBACrG,aAAa,EAAE,8BAA8B;wBAC7C,KAAK,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC;wBAC3B,SAAS,EAAE,aAAa,CAAC,mBAAmB;wBAC5C,aAAa,EAAE,SAAS;qBACzB;iBACF,CAAC,CAAC;gBAEH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,EAAE,UAAU,EAAE,CACf,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,uEAAuE;gBACvE,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;oBACrC;wBACE,IAAI,EAAE,qCAAqC;qBAC5C;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;gBACzF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,YAAY,GAAiB;oBACjC,OAAO,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE;iBAC7C,CAAC;gBAEF,kCAAkC;gBAClC,6DAA6D;gBAC7D,sBAAsB;gBACtB,qBAAqB,CAAC,kBAAkB,CACtC,gBAAgB,CAAC;oBACf,MAAM;oBACN;wBACE;4BACE,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE;gCACJ,kBAAkB,EAAE,cAAc;gCAClC,mBAAmB,EAAE,YAAY;6BAClC;yBACF;qBACF;oBACD,MAAM;iBACP,CAAC,CACH,CAAC;gBAEF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,EAAE,YAAY,EAAE,CACjB,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,yCAAyC;gBACzC,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9D,wFAAwF;gBACxF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBACjE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAC9C,gCAAgC,CACjC,CAAC;gBAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACvE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;oBACxC,YAAY,EAAE,YAAY;iBAC3B,CAAC,CAAC;gBACH,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;YAC5D,MAAM,YAAY,GAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;YAErE,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAc,EAAE,GAAG,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBAEnE,sDAAsD;gBACtD,qBAAqB,CAAC,kBAAkB,CACtC,gBAAgB,CAAC;oBACf;wBACE;4BACE,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE;yBAChE;qBACF;oBACD;wBACE;4BACE,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE;yBAChE;qBACF;oBACD,8BAA8B;oBAC9B;wBACE;4BACE,IAAI,EAAE,gBAAgB;4BACtB,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE;yBAChE;qBACF;iBACF,CAAC,CACH,CAAC;gBAEF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,SAAS,CACV,CAAC;gBAEF,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAElD,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACxC,qBAAqB,CAAC,SAAS,CAChC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;gBAC7F,4CAA4C;gBAC5C,EAAE,CAAC,aAAa,EAAE,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,MAAM,SAAS,GAAc,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;gBAErE,4GAA4G;gBAC5G,IAAI,aAEK,CAAC;gBACV,MAAM,aAAa,GAAG,IAAI,OAAO,CAE/B,CAAC,OAAO,EAAE,EAAE;oBACZ,8DAA8D;oBAC9D,aAAa,GAAG,OAAc,CAAC;gBACjC,CAAC,CAAC,CAAC;gBAEH,uDAAuD;gBACvD,qBAAqB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBAErD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,SAAS,CACV,CAAC;gBAEF,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;gBAE/D,0FAA0F;gBAC1F,MAAM,EAAE,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAEjD,oDAAoD;gBACpD,8DAA8D;gBAC9D,aAAc,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,EAAS,CAAC,CAAC;gBAEpD,MAAM,UAAU,CAAC;gBAEjB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACxC,qBAAqB,CAAC,OAAO,CAC9B,CAAC;gBACF,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAEvD,EAAE,CAAC,aAAa,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;gBAElE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CACtC,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;gBAEF,MAAM,MAAM,CACV,KAAK,CAAC,iBAAiB,CAAC,IAAI,YAAY,EAAE,CAAC,CAC5C,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
File without changes
|