@vibe-validate/cli 0.17.6 → 0.18.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.
- package/dist/bin/vibe-validate +4 -0
- package/dist/bin/vibe-validate.js +4 -0
- package/dist/bin/vibe-validate.js.map +1 -1
- package/dist/bin/vv +4 -0
- package/dist/bin.js +12 -4
- package/dist/bin.js.map +1 -1
- package/dist/commands/cleanup.d.ts +4 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +168 -122
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +35 -21
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create-extractor.d.ts.map +1 -1
- package/dist/commands/create-extractor.js +29 -14
- package/dist/commands/create-extractor.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +12 -23
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-workflow.d.ts.map +1 -1
- package/dist/commands/generate-workflow.js +6 -2
- package/dist/commands/generate-workflow.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +19 -9
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pre-commit.d.ts.map +1 -1
- package/dist/commands/pre-commit.js +3 -1
- package/dist/commands/pre-commit.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +21 -13
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/state.d.ts.map +1 -1
- package/dist/commands/state.js +11 -6
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/watch-pr.d.ts +16 -0
- package/dist/commands/watch-pr.d.ts.map +1 -1
- package/dist/commands/watch-pr.js +574 -320
- package/dist/commands/watch-pr.js.map +1 -1
- package/dist/schemas/watch-pr-result.schema.d.ts +2071 -0
- package/dist/schemas/watch-pr-result.schema.d.ts.map +1 -0
- package/dist/schemas/watch-pr-result.schema.js +346 -0
- package/dist/schemas/watch-pr-result.schema.js.map +1 -0
- package/dist/schemas/watch-pr-schema.d.ts +6 -6
- package/dist/services/cache-manager.d.ts +113 -0
- package/dist/services/cache-manager.d.ts.map +1 -0
- package/dist/services/cache-manager.js +211 -0
- package/dist/services/cache-manager.js.map +1 -0
- package/dist/services/ci-providers/github-actions.d.ts.map +1 -1
- package/dist/services/ci-providers/github-actions.js +10 -16
- package/dist/services/ci-providers/github-actions.js.map +1 -1
- package/dist/services/external-check-extractor.d.ts +66 -0
- package/dist/services/external-check-extractor.d.ts.map +1 -0
- package/dist/services/external-check-extractor.js +114 -0
- package/dist/services/external-check-extractor.js.map +1 -0
- package/dist/services/extraction-mode-detector.d.ts +85 -0
- package/dist/services/extraction-mode-detector.d.ts.map +1 -0
- package/dist/services/extraction-mode-detector.js +200 -0
- package/dist/services/extraction-mode-detector.js.map +1 -0
- package/dist/services/github-fetcher.d.ts +234 -0
- package/dist/services/github-fetcher.d.ts.map +1 -0
- package/dist/services/github-fetcher.js +441 -0
- package/dist/services/github-fetcher.js.map +1 -0
- package/dist/services/history-summary-builder.d.ts +74 -0
- package/dist/services/history-summary-builder.d.ts.map +1 -0
- package/dist/services/history-summary-builder.js +199 -0
- package/dist/services/history-summary-builder.js.map +1 -0
- package/dist/services/watch-pr-orchestrator.d.ts +132 -0
- package/dist/services/watch-pr-orchestrator.d.ts.map +1 -0
- package/dist/services/watch-pr-orchestrator.js +451 -0
- package/dist/services/watch-pr-orchestrator.js.map +1 -0
- package/dist/utils/command-name.d.ts +21 -0
- package/dist/utils/command-name.d.ts.map +1 -0
- package/dist/utils/command-name.js +45 -0
- package/dist/utils/command-name.js.map +1 -0
- package/dist/utils/pid-lock.d.ts.map +1 -1
- package/dist/utils/pid-lock.js +3 -3
- package/dist/utils/pid-lock.js.map +1 -1
- package/dist/utils/secret-scanning.d.ts.map +1 -1
- package/dist/utils/secret-scanning.js +45 -17
- package/dist/utils/secret-scanning.js.map +1 -1
- package/dist/utils/temp-files.d.ts +1 -2
- package/dist/utils/temp-files.d.ts.map +1 -1
- package/dist/utils/temp-files.js +4 -4
- package/dist/utils/temp-files.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History Summary Builder
|
|
3
|
+
*
|
|
4
|
+
* Fetches workflow runs for a PR branch and calculates:
|
|
5
|
+
* - Total number of runs
|
|
6
|
+
* - Recent pattern (passed/failed/flaky)
|
|
7
|
+
* - Success rate
|
|
8
|
+
*
|
|
9
|
+
* Provides context for pattern recognition without full history details.
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { safeExecSync } from '@vibe-validate/utils';
|
|
14
|
+
/**
|
|
15
|
+
* HistorySummaryBuilder
|
|
16
|
+
*
|
|
17
|
+
* Builds a condensed history summary for pattern recognition.
|
|
18
|
+
*/
|
|
19
|
+
export class HistorySummaryBuilder {
|
|
20
|
+
_owner;
|
|
21
|
+
_repo;
|
|
22
|
+
constructor(_owner, _repo) {
|
|
23
|
+
this._owner = _owner;
|
|
24
|
+
this._repo = _repo;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build history summary for a PR branch
|
|
28
|
+
*
|
|
29
|
+
* @param branch - Branch name
|
|
30
|
+
* @returns History summary with total runs, pattern, and success rate
|
|
31
|
+
*/
|
|
32
|
+
async buildSummary(branch) {
|
|
33
|
+
try {
|
|
34
|
+
const runs = await this.fetchWorkflowRuns(branch);
|
|
35
|
+
if (runs.length === 0) {
|
|
36
|
+
return {
|
|
37
|
+
total_runs: 0,
|
|
38
|
+
recent_pattern: 'No previous runs',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const totalRuns = runs.length;
|
|
42
|
+
const recentRuns = runs.slice(0, 10); // Last 10 for pattern detection
|
|
43
|
+
const recentPattern = this.detectPattern(runs);
|
|
44
|
+
const successRate = this.calculateSuccessRate(recentRuns);
|
|
45
|
+
return {
|
|
46
|
+
total_runs: totalRuns,
|
|
47
|
+
recent_pattern: recentPattern,
|
|
48
|
+
success_rate: successRate,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Gracefully handle errors (gh CLI not available, API errors, etc.)
|
|
53
|
+
// Note: Error intentionally not logged for production use
|
|
54
|
+
return {
|
|
55
|
+
total_runs: 0,
|
|
56
|
+
recent_pattern: 'No previous runs',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fetch workflow runs for a branch via gh CLI
|
|
62
|
+
*
|
|
63
|
+
* @param branch - Branch name
|
|
64
|
+
* @returns Array of workflow runs (sorted by created_at DESC)
|
|
65
|
+
*/
|
|
66
|
+
async fetchWorkflowRuns(branch) {
|
|
67
|
+
const output = safeExecSync('gh', [
|
|
68
|
+
'run',
|
|
69
|
+
'list',
|
|
70
|
+
'--repo',
|
|
71
|
+
`${this._owner}/${this._repo}`,
|
|
72
|
+
'--branch',
|
|
73
|
+
branch,
|
|
74
|
+
'--json',
|
|
75
|
+
'conclusion,createdAt',
|
|
76
|
+
'--limit',
|
|
77
|
+
'50', // Fetch up to 50 runs (more than we need)
|
|
78
|
+
], { cwd: process.cwd(), encoding: 'utf8' });
|
|
79
|
+
const outputStr = typeof output === 'string' ? output : output.toString('utf8');
|
|
80
|
+
const runs = JSON.parse(outputStr);
|
|
81
|
+
// Map to our internal format
|
|
82
|
+
return runs.map((run) => ({
|
|
83
|
+
conclusion: run.conclusion,
|
|
84
|
+
created_at: run.createdAt,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Detect pattern from recent runs
|
|
89
|
+
*
|
|
90
|
+
* Patterns:
|
|
91
|
+
* - "Passed last N runs" - All recent runs passed
|
|
92
|
+
* - "Failed last N runs" - All recent runs failed
|
|
93
|
+
* - "Flaky (alternating)" - Alternating pass/fail
|
|
94
|
+
* - "Recently fixed (was failing)" - Recent passes after failures
|
|
95
|
+
* - Generic pattern otherwise
|
|
96
|
+
*
|
|
97
|
+
* @param runs - All runs (sorted DESC)
|
|
98
|
+
* @returns Pattern description
|
|
99
|
+
*/
|
|
100
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
101
|
+
detectPattern(runs) {
|
|
102
|
+
if (runs.length === 0) {
|
|
103
|
+
return 'No previous runs';
|
|
104
|
+
}
|
|
105
|
+
// Check for consistent success
|
|
106
|
+
const recentRuns = runs.slice(0, 10);
|
|
107
|
+
const consecutivePasses = this.countConsecutive(runs, 'success');
|
|
108
|
+
const consecutiveFails = this.countConsecutive(runs, 'failure');
|
|
109
|
+
if (consecutivePasses === runs.length && runs.length >= 1) {
|
|
110
|
+
return `Passed last ${runs.length} run${runs.length > 1 ? 's' : ''}`;
|
|
111
|
+
}
|
|
112
|
+
if (consecutiveFails === runs.length && runs.length >= 1) {
|
|
113
|
+
return `Failed last ${runs.length} run${runs.length > 1 ? 's' : ''}`;
|
|
114
|
+
}
|
|
115
|
+
// Check for recently fixed (BEFORE checking consecutive passes alone)
|
|
116
|
+
if (consecutivePasses >= 2 && runs.length > consecutivePasses) {
|
|
117
|
+
const afterPasses = runs.slice(consecutivePasses);
|
|
118
|
+
const failsAfter = afterPasses.filter((r) => r.conclusion === 'failure').length;
|
|
119
|
+
if (failsAfter >= 2) {
|
|
120
|
+
return 'Recently fixed (was failing)';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (consecutivePasses >= 2) {
|
|
124
|
+
return `Passed last ${consecutivePasses} run${consecutivePasses > 1 ? 's' : ''}`;
|
|
125
|
+
}
|
|
126
|
+
if (consecutiveFails >= 2) {
|
|
127
|
+
return `Failed last ${consecutiveFails} run${consecutiveFails > 1 ? 's' : ''}`;
|
|
128
|
+
}
|
|
129
|
+
// Check for alternating pattern (flaky)
|
|
130
|
+
if (this.isAlternating(recentRuns)) {
|
|
131
|
+
return 'Flaky (alternating)';
|
|
132
|
+
}
|
|
133
|
+
// Generic pattern
|
|
134
|
+
const passCount = recentRuns.filter((r) => r.conclusion === 'success').length;
|
|
135
|
+
const failCount = recentRuns.filter((r) => r.conclusion === 'failure').length;
|
|
136
|
+
if (passCount > failCount) {
|
|
137
|
+
return `Mostly passing (${passCount}/${recentRuns.length} runs)`;
|
|
138
|
+
}
|
|
139
|
+
if (failCount > passCount) {
|
|
140
|
+
return `Mostly failing (${failCount}/${recentRuns.length} runs)`;
|
|
141
|
+
}
|
|
142
|
+
return `Mixed results (${passCount} passed, ${failCount} failed)`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Count consecutive runs with the same conclusion (starting from most recent)
|
|
146
|
+
*
|
|
147
|
+
* @param runs - Workflow runs
|
|
148
|
+
* @param conclusion - Conclusion to check
|
|
149
|
+
* @returns Count of consecutive runs
|
|
150
|
+
*/
|
|
151
|
+
countConsecutive(runs, conclusion) {
|
|
152
|
+
let count = 0;
|
|
153
|
+
for (const run of runs) {
|
|
154
|
+
if (run.conclusion === conclusion) {
|
|
155
|
+
count++;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return count;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if runs are alternating between success and failure
|
|
165
|
+
*
|
|
166
|
+
* @param runs - Workflow runs (at least 4 required)
|
|
167
|
+
* @returns True if alternating pattern detected
|
|
168
|
+
*/
|
|
169
|
+
isAlternating(runs) {
|
|
170
|
+
if (runs.length < 4) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
for (let i = 0; i < runs.length - 1; i++) {
|
|
174
|
+
const current = runs[i].conclusion;
|
|
175
|
+
const next = runs[i + 1].conclusion;
|
|
176
|
+
// Check if they're different (success vs failure)
|
|
177
|
+
const isSuccess = (c) => c === 'success';
|
|
178
|
+
if (isSuccess(current) === isSuccess(next)) {
|
|
179
|
+
return false; // Not alternating
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Calculate success rate from recent runs
|
|
186
|
+
*
|
|
187
|
+
* @param runs - Recent workflow runs (up to 10)
|
|
188
|
+
* @returns Success rate as percentage string (e.g., "75%")
|
|
189
|
+
*/
|
|
190
|
+
calculateSuccessRate(runs) {
|
|
191
|
+
if (runs.length === 0) {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
const successCount = runs.filter((r) => r.conclusion === 'success').length;
|
|
195
|
+
const rate = Math.round((successCount / runs.length) * 100);
|
|
196
|
+
return `${rate}%`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=history-summary-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-summary-builder.js","sourceRoot":"","sources":["../../src/services/history-summary-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WatchPROrchestrator - Coordinate all components to build complete WatchPRResult
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Coordinate data fetching (PR metadata, checks, history, changes)
|
|
6
|
+
* - Extract errors from check logs (matrix + non-matrix modes)
|
|
7
|
+
* - Extract external check details (codecov, SonarCloud, etc.)
|
|
8
|
+
* - Build complete WatchPRResult with validation
|
|
9
|
+
* - Generate intelligent guidance
|
|
10
|
+
* - Handle caching (save/retrieve results)
|
|
11
|
+
* - Select output format (YAML on failure, text on success)
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import type { WatchPRResult } from '../schemas/watch-pr-result.schema.js';
|
|
16
|
+
/**
|
|
17
|
+
* WatchPROrchestrator - Build complete WatchPRResult
|
|
18
|
+
*/
|
|
19
|
+
export declare class WatchPROrchestrator {
|
|
20
|
+
private readonly owner;
|
|
21
|
+
private readonly repo;
|
|
22
|
+
private readonly fetcher;
|
|
23
|
+
private readonly historyBuilder;
|
|
24
|
+
private readonly extractionDetector;
|
|
25
|
+
private readonly externalCheckExtractor;
|
|
26
|
+
private cacheManager?;
|
|
27
|
+
constructor(owner: string, repo: string);
|
|
28
|
+
/**
|
|
29
|
+
* Build complete WatchPRResult
|
|
30
|
+
*
|
|
31
|
+
* @param prNumber - PR number
|
|
32
|
+
* @param options - Options (useCache, forceFetch)
|
|
33
|
+
* @returns Complete WatchPRResult
|
|
34
|
+
*/
|
|
35
|
+
buildResult(prNumber: number, options?: {
|
|
36
|
+
useCache?: boolean;
|
|
37
|
+
forceFetch?: boolean;
|
|
38
|
+
}): Promise<WatchPRResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Build GitHub Action check from a workflow job
|
|
41
|
+
*/
|
|
42
|
+
private buildCheckFromJob;
|
|
43
|
+
/**
|
|
44
|
+
* Extract errors for a check from run logs
|
|
45
|
+
*/
|
|
46
|
+
private extractErrorsForCheck;
|
|
47
|
+
/**
|
|
48
|
+
* Determine overall PR status from checks
|
|
49
|
+
*/
|
|
50
|
+
private determineOverallStatus;
|
|
51
|
+
/**
|
|
52
|
+
* Build result for a specific run ID
|
|
53
|
+
*
|
|
54
|
+
* Fetches all jobs for the workflow run and creates individual checks for each job.
|
|
55
|
+
* This provides consistent job-level detail matching the default behavior.
|
|
56
|
+
*
|
|
57
|
+
* @param prNumber - PR number
|
|
58
|
+
* @param runId - GitHub run ID
|
|
59
|
+
* @param options - Options (useCache)
|
|
60
|
+
* @returns WatchPRResult with job-level checks
|
|
61
|
+
*/
|
|
62
|
+
buildResultForRun(prNumber: number, runId: number, options?: {
|
|
63
|
+
useCache?: boolean;
|
|
64
|
+
}): Promise<WatchPRResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Get priority for check ordering (lower is higher priority)
|
|
67
|
+
*/
|
|
68
|
+
private getCheckPriority;
|
|
69
|
+
/**
|
|
70
|
+
* Order checks: failed first, then pending, then passed
|
|
71
|
+
*
|
|
72
|
+
* @param checks - GitHub Action checks
|
|
73
|
+
* @returns Ordered checks
|
|
74
|
+
*/
|
|
75
|
+
private orderChecks;
|
|
76
|
+
/**
|
|
77
|
+
* Order external checks: failed first, then pending, then passed
|
|
78
|
+
*
|
|
79
|
+
* @param checks - External checks
|
|
80
|
+
* @returns Ordered checks
|
|
81
|
+
*/
|
|
82
|
+
private orderExternalChecks;
|
|
83
|
+
/**
|
|
84
|
+
* Generate intelligent guidance based on check results
|
|
85
|
+
*
|
|
86
|
+
* @param status - Overall status
|
|
87
|
+
* @param githubActions - GitHub Action checks
|
|
88
|
+
* @param externalChecks - External checks
|
|
89
|
+
* @param mergeable - Is PR mergeable?
|
|
90
|
+
* @returns Guidance with next steps
|
|
91
|
+
*/
|
|
92
|
+
private generateGuidance;
|
|
93
|
+
/**
|
|
94
|
+
* Fetch logs with retry logic for race conditions
|
|
95
|
+
*
|
|
96
|
+
* When GitHub marks a check as complete, logs may not be immediately available.
|
|
97
|
+
* This method retries with exponential backoff to handle the race condition.
|
|
98
|
+
*
|
|
99
|
+
* Retry schedule: 2s, 4s, 8s (total 3 attempts over ~14 seconds)
|
|
100
|
+
*
|
|
101
|
+
* @param runId - GitHub run ID
|
|
102
|
+
* @param jobId - GitHub job ID (optional, for matrix strategy jobs)
|
|
103
|
+
* @param maxRetries - Maximum number of retry attempts (default: 3)
|
|
104
|
+
* @returns Log content, or null if all retries failed
|
|
105
|
+
*/
|
|
106
|
+
private fetchLogsWithRetry;
|
|
107
|
+
/**
|
|
108
|
+
* Fetch all workflow runs for a PR (for --history flag)
|
|
109
|
+
*
|
|
110
|
+
* @param prNumber - PR number
|
|
111
|
+
* @returns List of workflow runs with basic metadata
|
|
112
|
+
*/
|
|
113
|
+
fetchRunsForPR(prNumber: number): Promise<Array<{
|
|
114
|
+
run_id: number;
|
|
115
|
+
workflow_name: string;
|
|
116
|
+
status: string;
|
|
117
|
+
conclusion: string | null;
|
|
118
|
+
started_at: string;
|
|
119
|
+
duration?: string;
|
|
120
|
+
}>>;
|
|
121
|
+
/**
|
|
122
|
+
* Determine if output should be YAML format
|
|
123
|
+
*
|
|
124
|
+
* Auto-YAML on failure (consistent with validate command)
|
|
125
|
+
*
|
|
126
|
+
* @param status - Overall status
|
|
127
|
+
* @param forceYAML - Force YAML output
|
|
128
|
+
* @returns True if should output YAML
|
|
129
|
+
*/
|
|
130
|
+
shouldOutputYAML(status: string, forceYAML: boolean): boolean;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=watch-pr-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-pr-orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/watch-pr-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAQV,aAAa,EACd,MAAM,sCAAsC,CAAC;AAY9C;;GAEG;AACH,qBAAa,mBAAmB;IAQ5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IARvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAyB;IAC5D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4B;IACnE,OAAO,CAAC,YAAY,CAAC,CAAe;gBAGjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM;IAY/B;;;;;;OAMG;IAEG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACzD,OAAO,CAAC,aAAa,CAAC;IAmJzB;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;YACW,qBAAqB;IAkBnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;;;;;;;;;OAUG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GACnC,OAAO,CAAC,aAAa,CAAC;IAkDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAMnB;;;;;OAKG;IAEH,OAAO,CAAC,mBAAmB;IAM3B;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAoFxB;;;;;;;;;;;;OAYG;YACW,kBAAkB;IAsBhC;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QACpD,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAIH;;;;;;;;OAQG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO;CAG9D"}
|