agentic-qe 2.2.0 → 2.2.2
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/.claude/agents/qe-security-scanner.md +26 -0
- package/.claude/skills/agentic-quality-engineering/SKILL.md +4 -4
- package/.claude/skills/cicd-pipeline-qe-orchestrator/README.md +14 -11
- package/.claude/skills/skills-manifest.json +2 -2
- package/CHANGELOG.md +75 -0
- package/README.md +92 -214
- package/dist/agents/BaseAgent.d.ts +5 -1
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +32 -17
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/index.js +3 -3
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/improve/index.d.ts +8 -1
- package/dist/cli/commands/improve/index.d.ts.map +1 -1
- package/dist/cli/commands/improve/index.js +18 -16
- package/dist/cli/commands/improve/index.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +10 -2
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +99 -63
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/commands/patterns/index.d.ts +8 -1
- package/dist/cli/commands/patterns/index.d.ts.map +1 -1
- package/dist/cli/commands/patterns/index.js +79 -45
- package/dist/cli/commands/patterns/index.js.map +1 -1
- package/dist/cli/commands/routing/index.d.ts +5 -0
- package/dist/cli/commands/routing/index.d.ts.map +1 -1
- package/dist/cli/commands/routing/index.js +11 -10
- package/dist/cli/commands/routing/index.js.map +1 -1
- package/dist/cli/init/agents.d.ts +1 -1
- package/dist/cli/init/agents.js +2 -2
- package/dist/cli/init/database-init.d.ts +7 -0
- package/dist/cli/init/database-init.d.ts.map +1 -1
- package/dist/cli/init/database-init.js +29 -48
- package/dist/cli/init/database-init.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.d.ts +261 -0
- package/dist/core/memory/HNSWVectorMemory.d.ts.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +647 -0
- package/dist/core/memory/HNSWVectorMemory.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +7 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +9 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +2 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +11 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/learning/ExplainableLearning.d.ts +191 -0
- package/dist/learning/ExplainableLearning.d.ts.map +1 -0
- package/dist/learning/ExplainableLearning.js +441 -0
- package/dist/learning/ExplainableLearning.js.map +1 -0
- package/dist/learning/GossipPatternSharingProtocol.d.ts +228 -0
- package/dist/learning/GossipPatternSharingProtocol.d.ts.map +1 -0
- package/dist/learning/GossipPatternSharingProtocol.js +590 -0
- package/dist/learning/GossipPatternSharingProtocol.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +4 -4
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +20 -13
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/PerformanceOptimizer.d.ts +268 -0
- package/dist/learning/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/learning/PerformanceOptimizer.js +552 -0
- package/dist/learning/PerformanceOptimizer.js.map +1 -0
- package/dist/learning/PrivacyManager.d.ts +197 -0
- package/dist/learning/PrivacyManager.d.ts.map +1 -0
- package/dist/learning/PrivacyManager.js +551 -0
- package/dist/learning/PrivacyManager.js.map +1 -0
- package/dist/learning/TransferLearningManager.d.ts +212 -0
- package/dist/learning/TransferLearningManager.d.ts.map +1 -0
- package/dist/learning/TransferLearningManager.js +497 -0
- package/dist/learning/TransferLearningManager.js.map +1 -0
- package/dist/learning/algorithms/MAMLMetaLearner.d.ts +218 -0
- package/dist/learning/algorithms/MAMLMetaLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/MAMLMetaLearner.js +532 -0
- package/dist/learning/algorithms/MAMLMetaLearner.js.map +1 -0
- package/dist/learning/algorithms/index.d.ts +4 -1
- package/dist/learning/algorithms/index.d.ts.map +1 -1
- package/dist/learning/algorithms/index.js +7 -1
- package/dist/learning/algorithms/index.js.map +1 -1
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +17 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/providers/HybridRouter.d.ts +217 -0
- package/dist/providers/HybridRouter.d.ts.map +1 -0
- package/dist/providers/HybridRouter.js +679 -0
- package/dist/providers/HybridRouter.js.map +1 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +7 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/telemetry/LearningTelemetry.d.ts +190 -0
- package/dist/telemetry/LearningTelemetry.d.ts.map +1 -0
- package/dist/telemetry/LearningTelemetry.js +403 -0
- package/dist/telemetry/LearningTelemetry.js.map +1 -0
- package/dist/telemetry/index.d.ts +1 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +20 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/instrumentation/agent.d.ts +1 -1
- package/dist/telemetry/instrumentation/agent.js +1 -1
- package/dist/telemetry/instrumentation/index.d.ts +1 -1
- package/dist/telemetry/instrumentation/index.js +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +16 -0
- package/dist/utils/math.js.map +1 -0
- package/docs/reference/agents.md +1 -1
- package/docs/reference/skills.md +3 -3
- package/docs/reference/usage.md +4 -4
- package/package.json +14 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MAMLMetaLearner - Model-Agnostic Meta-Learning for QE Agents
|
|
3
|
+
*
|
|
4
|
+
* Implements MAML-style meta-learning that enables agents to "learn how to learn".
|
|
5
|
+
* Agents can quickly adapt to new testing domains with just 5-10 examples.
|
|
6
|
+
*
|
|
7
|
+
* Key Concepts:
|
|
8
|
+
* - Inner Loop: Fast adaptation to new task with few gradient steps (5-10 examples)
|
|
9
|
+
* - Outer Loop: Learn initialization parameters that enable fast adaptation
|
|
10
|
+
* - Meta-Learning: After seeing few examples of new test pattern, agent performs well
|
|
11
|
+
*
|
|
12
|
+
* Algorithm:
|
|
13
|
+
* 1. Initialize meta-parameters θ (Q-table initialization)
|
|
14
|
+
* 2. For each task Ti in task distribution:
|
|
15
|
+
* a. Sample K examples from Ti (support set)
|
|
16
|
+
* b. Adapt: θ'i = θ - α∇Loss(θ, support) [inner loop]
|
|
17
|
+
* c. Evaluate on query set from Ti
|
|
18
|
+
* 3. Update meta-parameters: θ = θ - β∇Loss(θ', query) [outer loop]
|
|
19
|
+
* 4. Result: θ is optimized for fast adaptation to new tasks
|
|
20
|
+
*
|
|
21
|
+
* Use Cases:
|
|
22
|
+
* - New testing framework adoption (5-10 examples → proficient)
|
|
23
|
+
* - New project domain (few examples → effective testing strategy)
|
|
24
|
+
* - API testing → UI testing transfer learning
|
|
25
|
+
*/
|
|
26
|
+
import { AbstractRLLearner, RLConfig, QValue } from './AbstractRLLearner';
|
|
27
|
+
import { TaskExperience, AgentAction } from '../types';
|
|
28
|
+
/**
|
|
29
|
+
* MAML configuration extends base RL config with meta-learning parameters
|
|
30
|
+
*/
|
|
31
|
+
export interface MAMLConfig extends RLConfig {
|
|
32
|
+
innerLearningRate: number;
|
|
33
|
+
innerSteps: number;
|
|
34
|
+
metaLearningRate: number;
|
|
35
|
+
minTaskExamples: number;
|
|
36
|
+
maxTaskExamples: number;
|
|
37
|
+
taskBatchSize: number;
|
|
38
|
+
firstOrderApproximation: boolean;
|
|
39
|
+
baseAlgorithm?: AbstractRLLearner;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Task for meta-learning (contains support and query sets)
|
|
43
|
+
*/
|
|
44
|
+
interface MetaTask {
|
|
45
|
+
id: string;
|
|
46
|
+
taskType: string;
|
|
47
|
+
supportSet: TaskExperience[];
|
|
48
|
+
querySet: TaskExperience[];
|
|
49
|
+
metadata?: Record<string, any>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Meta-learning episode tracking
|
|
53
|
+
*/
|
|
54
|
+
interface MetaEpisode {
|
|
55
|
+
episodeId: string;
|
|
56
|
+
tasks: MetaTask[];
|
|
57
|
+
preAdaptationLoss: number;
|
|
58
|
+
postAdaptationLoss: number;
|
|
59
|
+
metaLoss: number;
|
|
60
|
+
improvement: number;
|
|
61
|
+
timestamp: Date;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* MAMLMetaLearner - Model-Agnostic Meta-Learning for Fast Adaptation
|
|
65
|
+
*
|
|
66
|
+
* Learns an initialization of Q-values that enables rapid adaptation to new
|
|
67
|
+
* testing tasks with minimal examples (5-10 shots).
|
|
68
|
+
*
|
|
69
|
+
* Example:
|
|
70
|
+
* - Agent trained on Jest, Mocha, Jasmine unit testing
|
|
71
|
+
* - Sees 5-10 examples of Vitest tests
|
|
72
|
+
* - Immediately generates high-quality Vitest tests
|
|
73
|
+
*
|
|
74
|
+
* Meta-Learning Process:
|
|
75
|
+
* 1. Sample batch of tasks (different testing scenarios)
|
|
76
|
+
* 2. For each task:
|
|
77
|
+
* - Adapt Q-table with support set (inner loop)
|
|
78
|
+
* - Evaluate adapted Q-table on query set
|
|
79
|
+
* 3. Compute meta-gradient from all tasks
|
|
80
|
+
* 4. Update meta-parameters (Q-table initialization)
|
|
81
|
+
*/
|
|
82
|
+
export declare class MAMLMetaLearner extends AbstractRLLearner {
|
|
83
|
+
private readonly mamlConfig;
|
|
84
|
+
private metaQTable;
|
|
85
|
+
private taskBuffer;
|
|
86
|
+
private metaEpisodes;
|
|
87
|
+
private metaStepCount;
|
|
88
|
+
private baseAlgorithm?;
|
|
89
|
+
constructor(config?: Partial<MAMLConfig>);
|
|
90
|
+
/**
|
|
91
|
+
* Update Q-value using base algorithm (delegates to wrapped algorithm if available)
|
|
92
|
+
* For MAML, this is called during inner loop adaptation
|
|
93
|
+
*/
|
|
94
|
+
update(experience: TaskExperience, nextAction?: AgentAction): void;
|
|
95
|
+
/**
|
|
96
|
+
* Q-Learning update rule (default inner loop algorithm)
|
|
97
|
+
*/
|
|
98
|
+
private qLearningUpdate;
|
|
99
|
+
/**
|
|
100
|
+
* Buffer experience by task type for meta-learning
|
|
101
|
+
*/
|
|
102
|
+
private bufferExperience;
|
|
103
|
+
/**
|
|
104
|
+
* Perform meta-learning update (outer loop)
|
|
105
|
+
* Learns Q-table initialization that enables fast adaptation
|
|
106
|
+
*
|
|
107
|
+
* This should be called periodically after collecting enough task examples
|
|
108
|
+
*/
|
|
109
|
+
performMetaUpdate(): Promise<MetaEpisode | null>;
|
|
110
|
+
/**
|
|
111
|
+
* Sample batch of meta-tasks from task buffer
|
|
112
|
+
* Each task contains support set (for adaptation) and query set (for evaluation)
|
|
113
|
+
*/
|
|
114
|
+
private sampleMetaTasks;
|
|
115
|
+
/**
|
|
116
|
+
* Adapt Q-table to a specific task using support set (inner loop)
|
|
117
|
+
*/
|
|
118
|
+
private adaptToTask;
|
|
119
|
+
/**
|
|
120
|
+
* Evaluate loss (TD error) on a set of experiences
|
|
121
|
+
*/
|
|
122
|
+
private evaluateLoss;
|
|
123
|
+
/**
|
|
124
|
+
* Compute first-order meta-gradients (FOMAML)
|
|
125
|
+
* Faster approximation that ignores second-order derivatives
|
|
126
|
+
*/
|
|
127
|
+
private computeFirstOrderGradients;
|
|
128
|
+
/**
|
|
129
|
+
* Compute second-order meta-gradients (Full MAML)
|
|
130
|
+
* More accurate but computationally expensive
|
|
131
|
+
*/
|
|
132
|
+
private computeSecondOrderGradients;
|
|
133
|
+
/**
|
|
134
|
+
* Update meta-parameters using accumulated gradients
|
|
135
|
+
*/
|
|
136
|
+
private updateMetaParameters;
|
|
137
|
+
/**
|
|
138
|
+
* Fast adaptation to new task (few-shot learning)
|
|
139
|
+
* Given 5-10 examples, quickly adapt Q-table for new testing domain
|
|
140
|
+
*
|
|
141
|
+
* @param examples Few examples of new task (5-10)
|
|
142
|
+
* @returns Adapted Q-table
|
|
143
|
+
*/
|
|
144
|
+
fastAdapt(examples: TaskExperience[]): Promise<Map<string, Map<string, QValue>>>;
|
|
145
|
+
/**
|
|
146
|
+
* Get Q-value from specific Q-table (helper)
|
|
147
|
+
*/
|
|
148
|
+
private getQValueFromTable;
|
|
149
|
+
/**
|
|
150
|
+
* Set Q-value in specific Q-table (helper)
|
|
151
|
+
*/
|
|
152
|
+
private setQValueInTable;
|
|
153
|
+
/**
|
|
154
|
+
* Get Q-value (raw, without creating entry)
|
|
155
|
+
*/
|
|
156
|
+
private getQValueRaw;
|
|
157
|
+
/**
|
|
158
|
+
* Clone Q-table
|
|
159
|
+
*/
|
|
160
|
+
private cloneQTable;
|
|
161
|
+
/**
|
|
162
|
+
* Copy Q-table from source to destination
|
|
163
|
+
*/
|
|
164
|
+
private copyQTable;
|
|
165
|
+
/**
|
|
166
|
+
* Get meta-learning statistics
|
|
167
|
+
*/
|
|
168
|
+
getMetaStatistics(): {
|
|
169
|
+
metaSteps: number;
|
|
170
|
+
metaEpisodes: number;
|
|
171
|
+
avgPreAdaptLoss: number;
|
|
172
|
+
avgPostAdaptLoss: number;
|
|
173
|
+
avgImprovement: number;
|
|
174
|
+
taskTypes: number;
|
|
175
|
+
bufferedExperiences: number;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Get meta-episodes history
|
|
179
|
+
*/
|
|
180
|
+
getMetaEpisodes(): MetaEpisode[];
|
|
181
|
+
/**
|
|
182
|
+
* Clear task buffer
|
|
183
|
+
*/
|
|
184
|
+
clearTaskBuffer(): void;
|
|
185
|
+
/**
|
|
186
|
+
* Get default exploration rate
|
|
187
|
+
*/
|
|
188
|
+
protected getDefaultExplorationRate(): number;
|
|
189
|
+
/**
|
|
190
|
+
* Get algorithm name
|
|
191
|
+
*/
|
|
192
|
+
getAlgorithmName(): string;
|
|
193
|
+
/**
|
|
194
|
+
* Override getStatistics to include meta-learning metrics
|
|
195
|
+
*/
|
|
196
|
+
getStatistics(): ReturnType<AbstractRLLearner['getStatistics']> & {
|
|
197
|
+
maml: ReturnType<MAMLMetaLearner['getMetaStatistics']>;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Export meta-learner state
|
|
201
|
+
*/
|
|
202
|
+
export(): ReturnType<AbstractRLLearner['export']> & {
|
|
203
|
+
metaQTable: Record<string, Record<string, QValue>>;
|
|
204
|
+
taskBuffer: Record<string, TaskExperience[]>;
|
|
205
|
+
metaEpisodes: MetaEpisode[];
|
|
206
|
+
metaStepCount: number;
|
|
207
|
+
};
|
|
208
|
+
/**
|
|
209
|
+
* Import meta-learner state
|
|
210
|
+
*/
|
|
211
|
+
import(state: ReturnType<MAMLMetaLearner['export']>): void;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Create default MAML configuration
|
|
215
|
+
*/
|
|
216
|
+
export declare function createDefaultMAMLConfig(): MAMLConfig;
|
|
217
|
+
export {};
|
|
218
|
+
//# sourceMappingURL=MAMLMetaLearner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MAMLMetaLearner.d.ts","sourceRoot":"","sources":["../../../src/learning/algorithms/MAMLMetaLearner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAa,MAAM,UAAU,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAE1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IAGnB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,uBAAuB,EAAE,OAAO,CAAC;IAGjC,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC;AA0BD;;GAEG;AACH,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAoB;gBAE9B,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAwB5C;;;OAGG;IACH,MAAM,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,IAAI;IAclE;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;;OAKG;IACG,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA2EtD;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkCvB;;OAEG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,YAAY;IA2BpB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAiClC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAgBnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAkBtF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,iBAAiB,IAAI;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B;IAoBD;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,SAAS,CAAC,yBAAyB,IAAI,MAAM;IAI7C;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,aAAa,IAAI,UAAU,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,GAAG;QAChE,IAAI,EAAE,UAAU,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC;KACxD;IAOD;;OAEG;IACH,MAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG;QAClD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7C,YAAY,EAAE,WAAW,EAAE,CAAC;QAC5B,aAAa,EAAE,MAAM,CAAC;KACvB;IA2BD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;CA4B3D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAEpD"}
|