github-issue-tower-defence-management 1.33.0 → 1.34.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/CHANGELOG.md +7 -0
- package/README.md +80 -6
- package/bin/adapter/entry-points/cli/index.js +422 -5
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/repositories/OauthAPIClaudeRepository.js +225 -0
- package/bin/adapter/repositories/OauthAPIClaudeRepository.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +1315 -15
- package/src/adapter/entry-points/cli/index.ts +648 -5
- package/src/adapter/repositories/OauthAPIClaudeRepository.ts +279 -0
- package/types/adapter/entry-points/cli/index.d.ts +19 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/repositories/OauthAPIClaudeRepository.d.ts +13 -0
- package/types/adapter/repositories/OauthAPIClaudeRepository.d.ts.map +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.34.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.33.0...v1.34.0) (2026-03-22)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **cli:** add startDaemon and notifyFinishedIssuePreparation commands ([72fe2c4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/72fe2c43c0423f5760f27640704fc79af1078b5d))
|
|
7
|
+
|
|
1
8
|
# [1.33.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.32.0...v1.33.0) (2026-03-21)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -11,15 +11,41 @@ Welcome to npm-cli-github-issue-tower-defence-management :tada:
|
|
|
11
11
|
Here's how you can use github-issue-tower-defence-management:
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
Usage: github-issue-tower-defence-management [options]
|
|
14
|
+
Usage: github-issue-tower-defence-management [command] [options]
|
|
15
15
|
|
|
16
16
|
CLI tool for GitHub Issue Tower Defence Management
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Commands:
|
|
19
|
+
schedule [options] Handle scheduled events (trigger: issue or schedule) (default)
|
|
20
|
+
startDaemon [options] Start daemon to prepare GitHub issues
|
|
21
|
+
notifyFinishedIssuePreparation [options] Notify that issue preparation is finished
|
|
22
|
+
help [command] display help for command
|
|
23
|
+
|
|
24
|
+
Options for schedule:
|
|
19
25
|
-t, --trigger <type> Trigger type: issue or schedule
|
|
20
26
|
-c, --config <path> Path to config YAML file
|
|
27
|
+
-v, --verbose Verbose output
|
|
21
28
|
-i, --issue <url> GitHub Issue URL
|
|
22
|
-
|
|
29
|
+
|
|
30
|
+
Options for startDaemon:
|
|
31
|
+
--configFilePath <path> Path to config file for tower defence management (required)
|
|
32
|
+
--projectUrl <url> GitHub project URL
|
|
33
|
+
--awaitingWorkspaceStatus <status> Status for issues awaiting workspace
|
|
34
|
+
--preparationStatus <status> Status for issues in preparation
|
|
35
|
+
--defaultAgentName <name> Default agent name
|
|
36
|
+
--logFilePath <path> Path to log file
|
|
37
|
+
--maximumPreparingIssuesCount <count> Maximum number of issues in preparation status (default: 6)
|
|
38
|
+
--allowIssueCacheMinutes <minutes> Allow cache for issues in minutes (default: 0)
|
|
39
|
+
|
|
40
|
+
Options for notifyFinishedIssuePreparation:
|
|
41
|
+
--configFilePath <path> Path to config file for tower defence management (required)
|
|
42
|
+
--issueUrl <url> GitHub issue URL (required)
|
|
43
|
+
--projectUrl <url> GitHub project URL
|
|
44
|
+
--preparationStatus <status> Status for issues in preparation
|
|
45
|
+
--awaitingWorkspaceStatus <status> Status for issues awaiting workspace
|
|
46
|
+
--awaitingQualityCheckStatus <status> Status for issues awaiting quality check
|
|
47
|
+
--thresholdForAutoReject <count> Threshold for auto-escalation after consecutive rejections (default: 3)
|
|
48
|
+
--workflowBlockerResolvedWebhookUrl <url> Webhook URL to notify when a workflow blocker issue status changes
|
|
23
49
|
```
|
|
24
50
|
|
|
25
51
|
## Example 📖
|
|
@@ -27,16 +53,26 @@ Options:
|
|
|
27
53
|
Here's a quick example to illustrate its usage:
|
|
28
54
|
|
|
29
55
|
```
|
|
30
|
-
npx github-issue-tower-defence-management -t schedule -c ./config.yml
|
|
56
|
+
npx github-issue-tower-defence-management schedule -t schedule -c ./config.yml
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
npx github-issue-tower-defence-management schedule -t issue -c ./config.yml -i https://github.com/HiromiShikata/test-repository/issues/1
|
|
31
61
|
```
|
|
32
62
|
|
|
33
63
|
```
|
|
34
|
-
npx github-issue-tower-defence-management
|
|
64
|
+
npx github-issue-tower-defence-management startDaemon --configFilePath ./preparator-config.yml
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
npx github-issue-tower-defence-management notifyFinishedIssuePreparation --configFilePath ./preparator-config.yml --issueUrl https://github.com/HiromiShikata/test-repository/issues/1
|
|
35
69
|
```
|
|
36
70
|
|
|
37
71
|
## Config
|
|
38
72
|
|
|
39
|
-
|
|
73
|
+
### Schedule Command Config
|
|
74
|
+
|
|
75
|
+
The `config.yaml` for the `schedule` command must match the input type of `HandleScheduledEventUseCase.run()`. Below is the structure:
|
|
40
76
|
|
|
41
77
|
```yaml
|
|
42
78
|
disabled: boolean # When true, skip all processing and return null
|
|
@@ -110,6 +146,44 @@ notifyFinishedPreparation:
|
|
|
110
146
|
workflowBlockerResolvedWebhookUrl: 'https://example.com/webhook?url={URL}&msg={MESSAGE}'
|
|
111
147
|
```
|
|
112
148
|
|
|
149
|
+
### startDaemon and notifyFinishedIssuePreparation Commands Config
|
|
150
|
+
|
|
151
|
+
The config YAML for `startDaemon` and `notifyFinishedIssuePreparation` commands:
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
projectUrl: string # URL of the GitHub project
|
|
155
|
+
projectName: string # Project name (used for cache directory path)
|
|
156
|
+
awaitingWorkspaceStatus: string # Status name for issues awaiting workspace
|
|
157
|
+
preparationStatus: string # Status name for issues in preparation
|
|
158
|
+
defaultAgentName: string # Default agent name for issue preparation
|
|
159
|
+
logFilePath?: string # Optional: Path to log file for preparation output
|
|
160
|
+
maximumPreparingIssuesCount?: number # Optional: Max concurrent preparing issues (null/omitted = 6)
|
|
161
|
+
allowIssueCacheMinutes?: number # Optional: Allow cache for issues in minutes (default: 0)
|
|
162
|
+
awaitingQualityCheckStatus: string # Status name for issues awaiting quality check
|
|
163
|
+
thresholdForAutoReject?: number # Optional: Consecutive rejections before escalation (default: 3)
|
|
164
|
+
workflowBlockerResolvedWebhookUrl?: string # Optional: Webhook URL. Supports {URL} and {MESSAGE} placeholders
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Example:
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
projectUrl: 'https://github.com/orgs/my-org/projects/1'
|
|
171
|
+
projectName: 'my-project'
|
|
172
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace'
|
|
173
|
+
preparationStatus: 'Preparation'
|
|
174
|
+
defaultAgentName: 'umino-bot'
|
|
175
|
+
logFilePath: '/tmp/preparation.log'
|
|
176
|
+
maximumPreparingIssuesCount: 3
|
|
177
|
+
allowIssueCacheMinutes: 5
|
|
178
|
+
awaitingQualityCheckStatus: 'Awaiting Quality Check'
|
|
179
|
+
thresholdForAutoReject: 3
|
|
180
|
+
workflowBlockerResolvedWebhookUrl: 'https://example.com/webhook?url={URL}&msg={MESSAGE}'
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### README-based Config Overrides
|
|
184
|
+
|
|
185
|
+
For `startDaemon` and `notifyFinishedIssuePreparation`, the GitHub project README can override config file values. Add a `<details><summary>config</summary>...</details>` section with YAML content to the project README. This takes highest priority over both the config file and CLI arguments.
|
|
186
|
+
|
|
113
187
|
### Slack User Token
|
|
114
188
|
|
|
115
189
|
#### scope
|
|
@@ -1,12 +1,228 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
+
if (mod && mod.__esModule) return mod;
|
|
21
|
+
var result = {};
|
|
22
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
+
__setModuleDefault(result, mod);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
|
+
};
|
|
3
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.program = exports.fetchProjectReadme = exports.mergeConfigs = exports.parseProjectReadmeConfig = exports.loadConfigFile = void 0;
|
|
31
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
4
32
|
const commander_1 = require("commander");
|
|
33
|
+
const fs = __importStar(require("fs"));
|
|
5
34
|
const HandleScheduledEventUseCaseHandler_1 = require("../handlers/HandleScheduledEventUseCaseHandler");
|
|
6
|
-
const
|
|
7
|
-
|
|
35
|
+
const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPreparationUseCase");
|
|
36
|
+
const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
|
|
37
|
+
const LocalStorageRepository_1 = require("../../repositories/LocalStorageRepository");
|
|
38
|
+
const GraphqlProjectRepository_1 = require("../../repositories/GraphqlProjectRepository");
|
|
39
|
+
const ApiV3IssueRepository_1 = require("../../repositories/issue/ApiV3IssueRepository");
|
|
40
|
+
const RestIssueRepository_1 = require("../../repositories/issue/RestIssueRepository");
|
|
41
|
+
const GraphqlProjectItemRepository_1 = require("../../repositories/issue/GraphqlProjectItemRepository");
|
|
42
|
+
const ApiV3CheerioRestIssueRepository_1 = require("../../repositories/issue/ApiV3CheerioRestIssueRepository");
|
|
43
|
+
const LocalStorageCacheRepository_1 = require("../../repositories/LocalStorageCacheRepository");
|
|
44
|
+
const CheerioProjectRepository_1 = require("../../repositories/CheerioProjectRepository");
|
|
45
|
+
const NodeLocalCommandRunner_1 = require("../../repositories/NodeLocalCommandRunner");
|
|
46
|
+
const OauthAPIClaudeRepository_1 = require("../../repositories/OauthAPIClaudeRepository");
|
|
47
|
+
const GitHubIssueCommentRepository_1 = require("../../repositories/GitHubIssueCommentRepository");
|
|
48
|
+
const FetchWebhookRepository_1 = require("../../repositories/FetchWebhookRepository");
|
|
49
|
+
const getStringValue = (obj, key) => {
|
|
50
|
+
const value = obj[key];
|
|
51
|
+
return typeof value === 'string' ? value : undefined;
|
|
52
|
+
};
|
|
53
|
+
const getNumberValue = (obj, key) => {
|
|
54
|
+
const value = obj[key];
|
|
55
|
+
return typeof value === 'number' ? value : undefined;
|
|
56
|
+
};
|
|
57
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
58
|
+
const loadConfigFile = (configFilePath) => {
|
|
59
|
+
try {
|
|
60
|
+
const content = fs.readFileSync(configFilePath, 'utf-8');
|
|
61
|
+
const parsed = yaml_1.default.parse(content);
|
|
62
|
+
if (!isRecord(parsed)) {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
projectUrl: getStringValue(parsed, 'projectUrl'),
|
|
67
|
+
awaitingWorkspaceStatus: getStringValue(parsed, 'awaitingWorkspaceStatus'),
|
|
68
|
+
preparationStatus: getStringValue(parsed, 'preparationStatus'),
|
|
69
|
+
defaultAgentName: getStringValue(parsed, 'defaultAgentName'),
|
|
70
|
+
logFilePath: getStringValue(parsed, 'logFilePath'),
|
|
71
|
+
maximumPreparingIssuesCount: getNumberValue(parsed, 'maximumPreparingIssuesCount'),
|
|
72
|
+
allowIssueCacheMinutes: getNumberValue(parsed, 'allowIssueCacheMinutes'),
|
|
73
|
+
awaitingQualityCheckStatus: getStringValue(parsed, 'awaitingQualityCheckStatus'),
|
|
74
|
+
thresholdForAutoReject: getNumberValue(parsed, 'thresholdForAutoReject'),
|
|
75
|
+
workflowBlockerResolvedWebhookUrl: getStringValue(parsed, 'workflowBlockerResolvedWebhookUrl'),
|
|
76
|
+
projectName: getStringValue(parsed, 'projectName'),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
81
|
+
console.error(`Failed to load configuration file "${configFilePath}": ${message}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.loadConfigFile = loadConfigFile;
|
|
86
|
+
const parseProjectReadmeConfig = (readme) => {
|
|
87
|
+
const detailsRegex = /<details>\s*<summary>config<\/summary>([\s\S]*?)<\/details>/i;
|
|
88
|
+
const match = detailsRegex.exec(readme);
|
|
89
|
+
if (!match) {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
const yamlContent = match[1].trim();
|
|
93
|
+
if (!yamlContent) {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const parsed = yaml_1.default.parse(yamlContent);
|
|
98
|
+
if (!isRecord(parsed)) {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
awaitingWorkspaceStatus: getStringValue(parsed, 'awaitingWorkspaceStatus'),
|
|
103
|
+
preparationStatus: getStringValue(parsed, 'preparationStatus'),
|
|
104
|
+
defaultAgentName: getStringValue(parsed, 'defaultAgentName'),
|
|
105
|
+
logFilePath: getStringValue(parsed, 'logFilePath'),
|
|
106
|
+
maximumPreparingIssuesCount: getNumberValue(parsed, 'maximumPreparingIssuesCount'),
|
|
107
|
+
allowIssueCacheMinutes: getNumberValue(parsed, 'allowIssueCacheMinutes'),
|
|
108
|
+
awaitingQualityCheckStatus: getStringValue(parsed, 'awaitingQualityCheckStatus'),
|
|
109
|
+
thresholdForAutoReject: getNumberValue(parsed, 'thresholdForAutoReject'),
|
|
110
|
+
workflowBlockerResolvedWebhookUrl: getStringValue(parsed, 'workflowBlockerResolvedWebhookUrl'),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
console.warn('Failed to parse YAML from project README config section');
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.parseProjectReadmeConfig = parseProjectReadmeConfig;
|
|
119
|
+
const mergeConfigs = (configFile, cliOverrides, readmeOverrides) => ({
|
|
120
|
+
projectUrl: cliOverrides.projectUrl ?? configFile.projectUrl,
|
|
121
|
+
awaitingWorkspaceStatus: readmeOverrides.awaitingWorkspaceStatus ??
|
|
122
|
+
cliOverrides.awaitingWorkspaceStatus ??
|
|
123
|
+
configFile.awaitingWorkspaceStatus,
|
|
124
|
+
preparationStatus: readmeOverrides.preparationStatus ??
|
|
125
|
+
cliOverrides.preparationStatus ??
|
|
126
|
+
configFile.preparationStatus,
|
|
127
|
+
defaultAgentName: readmeOverrides.defaultAgentName ??
|
|
128
|
+
cliOverrides.defaultAgentName ??
|
|
129
|
+
configFile.defaultAgentName,
|
|
130
|
+
logFilePath: readmeOverrides.logFilePath ??
|
|
131
|
+
cliOverrides.logFilePath ??
|
|
132
|
+
configFile.logFilePath,
|
|
133
|
+
maximumPreparingIssuesCount: readmeOverrides.maximumPreparingIssuesCount ??
|
|
134
|
+
cliOverrides.maximumPreparingIssuesCount ??
|
|
135
|
+
configFile.maximumPreparingIssuesCount,
|
|
136
|
+
allowIssueCacheMinutes: readmeOverrides.allowIssueCacheMinutes ??
|
|
137
|
+
cliOverrides.allowIssueCacheMinutes ??
|
|
138
|
+
configFile.allowIssueCacheMinutes,
|
|
139
|
+
awaitingQualityCheckStatus: readmeOverrides.awaitingQualityCheckStatus ??
|
|
140
|
+
cliOverrides.awaitingQualityCheckStatus ??
|
|
141
|
+
configFile.awaitingQualityCheckStatus,
|
|
142
|
+
thresholdForAutoReject: readmeOverrides.thresholdForAutoReject ??
|
|
143
|
+
cliOverrides.thresholdForAutoReject ??
|
|
144
|
+
configFile.thresholdForAutoReject,
|
|
145
|
+
workflowBlockerResolvedWebhookUrl: readmeOverrides.workflowBlockerResolvedWebhookUrl ??
|
|
146
|
+
cliOverrides.workflowBlockerResolvedWebhookUrl ??
|
|
147
|
+
configFile.workflowBlockerResolvedWebhookUrl,
|
|
148
|
+
projectName: configFile.projectName,
|
|
149
|
+
});
|
|
150
|
+
exports.mergeConfigs = mergeConfigs;
|
|
151
|
+
const isGraphqlProjectV2ReadmeResponse = (value) => {
|
|
152
|
+
if (!isRecord(value))
|
|
153
|
+
return false;
|
|
154
|
+
const data = value['data'];
|
|
155
|
+
if (data !== undefined && !isRecord(data))
|
|
156
|
+
return false;
|
|
157
|
+
return true;
|
|
158
|
+
};
|
|
159
|
+
const fetchProjectReadme = async (projectUrl, token) => {
|
|
160
|
+
try {
|
|
161
|
+
const urlParts = projectUrl.split('/');
|
|
162
|
+
const projectNumber = parseInt(urlParts[urlParts.length - 1], 10);
|
|
163
|
+
const owner = urlParts[urlParts.length - 3];
|
|
164
|
+
const query = `
|
|
165
|
+
query($owner: String!, $number: Int!) {
|
|
166
|
+
organization(login: $owner) {
|
|
167
|
+
projectV2(number: $number) {
|
|
168
|
+
readme
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
user(login: $owner) {
|
|
172
|
+
projectV2(number: $number) {
|
|
173
|
+
readme
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
`;
|
|
178
|
+
const response = await fetch('https://api.github.com/graphql', {
|
|
179
|
+
method: 'POST',
|
|
180
|
+
headers: {
|
|
181
|
+
Authorization: `Bearer ${token}`,
|
|
182
|
+
'Content-Type': 'application/json',
|
|
183
|
+
},
|
|
184
|
+
body: JSON.stringify({
|
|
185
|
+
query,
|
|
186
|
+
variables: { owner, number: projectNumber },
|
|
187
|
+
}),
|
|
188
|
+
});
|
|
189
|
+
if (!response.ok) {
|
|
190
|
+
throw new Error(`GraphQL request failed: ${response.status}`);
|
|
191
|
+
}
|
|
192
|
+
const responseData = await response.json();
|
|
193
|
+
if (!isGraphqlProjectV2ReadmeResponse(responseData)) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const orgReadme = responseData.data?.organization?.projectV2?.readme;
|
|
197
|
+
const userReadme = responseData.data?.user?.projectV2?.readme;
|
|
198
|
+
const readme = typeof orgReadme === 'string'
|
|
199
|
+
? orgReadme
|
|
200
|
+
: typeof userReadme === 'string'
|
|
201
|
+
? userReadme
|
|
202
|
+
: null;
|
|
203
|
+
return readme;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
console.warn('Failed to fetch project README');
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
exports.fetchProjectReadme = fetchProjectReadme;
|
|
211
|
+
const buildGithubRepositoryParams = (localStorageRepository, cachePath, token) => [
|
|
212
|
+
localStorageRepository,
|
|
213
|
+
`${cachePath}/github.com.cookies.json`,
|
|
214
|
+
token,
|
|
215
|
+
undefined,
|
|
216
|
+
undefined,
|
|
217
|
+
undefined,
|
|
218
|
+
];
|
|
219
|
+
exports.program = new commander_1.Command();
|
|
220
|
+
exports.program
|
|
8
221
|
.name('github-issue-tower-defence-management')
|
|
9
|
-
.description('CLI tool for GitHub Issue Tower Defence Management')
|
|
222
|
+
.description('CLI tool for GitHub Issue Tower Defence Management');
|
|
223
|
+
exports.program
|
|
224
|
+
.command('schedule', { isDefault: true })
|
|
225
|
+
.description('Handle scheduled events (trigger: issue or schedule)')
|
|
10
226
|
.requiredOption('-t, --trigger <type>', 'Trigger type: issue or schedule', /^(issue|schedule)$/i)
|
|
11
227
|
.requiredOption('-c, --config <path>', 'Path to config YAML file')
|
|
12
228
|
.option('-v, --verbose', 'Verbose output')
|
|
@@ -21,7 +237,208 @@ program
|
|
|
21
237
|
await handler.handle(options.config, options.verbose);
|
|
22
238
|
}
|
|
23
239
|
});
|
|
24
|
-
|
|
25
|
-
|
|
240
|
+
exports.program
|
|
241
|
+
.command('startDaemon')
|
|
242
|
+
.description('Start daemon to prepare GitHub issues')
|
|
243
|
+
.requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
|
|
244
|
+
.option('--projectUrl <url>', 'GitHub project URL')
|
|
245
|
+
.option('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
|
|
246
|
+
.option('--preparationStatus <status>', 'Status for issues in preparation')
|
|
247
|
+
.option('--defaultAgentName <name>', 'Default agent name')
|
|
248
|
+
.option('--logFilePath <path>', 'Path to log file')
|
|
249
|
+
.option('--maximumPreparingIssuesCount <count>', 'Maximum number of issues in preparation status (default: 6)')
|
|
250
|
+
.option('--allowIssueCacheMinutes <minutes>', 'Allow cache for issues in minutes (default: 0)')
|
|
251
|
+
.action(async (options) => {
|
|
252
|
+
const token = process.env.GH_TOKEN;
|
|
253
|
+
if (!token) {
|
|
254
|
+
console.error('GH_TOKEN environment variable is required');
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
const configFileValues = (0, exports.loadConfigFile)(options.configFilePath);
|
|
258
|
+
const cliOverrides = {
|
|
259
|
+
projectUrl: options.projectUrl,
|
|
260
|
+
awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
|
|
261
|
+
preparationStatus: options.preparationStatus,
|
|
262
|
+
defaultAgentName: options.defaultAgentName,
|
|
263
|
+
logFilePath: options.logFilePath,
|
|
264
|
+
maximumPreparingIssuesCount: options.maximumPreparingIssuesCount
|
|
265
|
+
? Number(options.maximumPreparingIssuesCount)
|
|
266
|
+
: undefined,
|
|
267
|
+
allowIssueCacheMinutes: options.allowIssueCacheMinutes
|
|
268
|
+
? Number(options.allowIssueCacheMinutes)
|
|
269
|
+
: undefined,
|
|
270
|
+
};
|
|
271
|
+
const tempProjectUrl = cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
272
|
+
let readmeOverrides = {};
|
|
273
|
+
if (tempProjectUrl) {
|
|
274
|
+
const readme = await (0, exports.fetchProjectReadme)(tempProjectUrl, token);
|
|
275
|
+
if (readme) {
|
|
276
|
+
readmeOverrides = (0, exports.parseProjectReadmeConfig)(readme);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const config = (0, exports.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
|
|
280
|
+
const projectUrl = config.projectUrl;
|
|
281
|
+
const awaitingWorkspaceStatus = config.awaitingWorkspaceStatus;
|
|
282
|
+
const preparationStatus = config.preparationStatus;
|
|
283
|
+
const defaultAgentName = config.defaultAgentName;
|
|
284
|
+
const logFilePath = config.logFilePath;
|
|
285
|
+
if (!projectUrl) {
|
|
286
|
+
console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
if (!awaitingWorkspaceStatus) {
|
|
290
|
+
console.error('awaitingWorkspaceStatus is required. Provide via --awaitingWorkspaceStatus, config file, or project README.');
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
if (!preparationStatus) {
|
|
294
|
+
console.error('preparationStatus is required. Provide via --preparationStatus, config file, or project README.');
|
|
295
|
+
process.exit(1);
|
|
296
|
+
}
|
|
297
|
+
if (!defaultAgentName) {
|
|
298
|
+
console.error('defaultAgentName is required. Provide via --defaultAgentName, config file, or project README.');
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
let maximumPreparingIssuesCount = null;
|
|
302
|
+
const rawMaxCount = config.maximumPreparingIssuesCount;
|
|
303
|
+
if (rawMaxCount !== undefined) {
|
|
304
|
+
const parsedCount = Number(rawMaxCount);
|
|
305
|
+
if (!Number.isFinite(parsedCount) ||
|
|
306
|
+
!Number.isInteger(parsedCount) ||
|
|
307
|
+
parsedCount <= 0) {
|
|
308
|
+
console.error('Invalid value for --maximumPreparingIssuesCount. It must be a positive integer.');
|
|
309
|
+
process.exit(1);
|
|
310
|
+
}
|
|
311
|
+
maximumPreparingIssuesCount = parsedCount;
|
|
312
|
+
}
|
|
313
|
+
const allowIssueCacheMinutes = config.allowIssueCacheMinutes ?? 0;
|
|
314
|
+
console.log(`maximumPreparingIssuesCount: ${maximumPreparingIssuesCount ?? 'null (default: 6)'}`);
|
|
315
|
+
const projectName = config.projectName ?? 'default';
|
|
316
|
+
const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
|
|
317
|
+
const cachePath = `./tmp/cache/${projectName}`;
|
|
318
|
+
const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
|
|
319
|
+
const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, cachePath, token);
|
|
320
|
+
const projectRepository = {
|
|
321
|
+
...new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams),
|
|
322
|
+
...new CheerioProjectRepository_1.CheerioProjectRepository(...githubRepositoryParams),
|
|
323
|
+
};
|
|
324
|
+
const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
|
|
325
|
+
const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
|
|
326
|
+
const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
|
|
327
|
+
const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
|
|
328
|
+
const claudeRepository = new OauthAPIClaudeRepository_1.OauthAPIClaudeRepository();
|
|
329
|
+
const localCommandRunner = new NodeLocalCommandRunner_1.NodeLocalCommandRunner();
|
|
330
|
+
const useCase = new StartPreparationUseCase_1.StartPreparationUseCase(projectRepository, issueRepository, claudeRepository, localCommandRunner);
|
|
331
|
+
await useCase.run({
|
|
332
|
+
projectUrl,
|
|
333
|
+
awaitingWorkspaceStatus,
|
|
334
|
+
preparationStatus,
|
|
335
|
+
defaultAgentName,
|
|
336
|
+
logFilePath: logFilePath ?? undefined,
|
|
337
|
+
maximumPreparingIssuesCount,
|
|
338
|
+
allowIssueCacheMinutes,
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
exports.program
|
|
342
|
+
.command('notifyFinishedIssuePreparation')
|
|
343
|
+
.description('Notify that issue preparation is finished')
|
|
344
|
+
.requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
|
|
345
|
+
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
346
|
+
.option('--projectUrl <url>', 'GitHub project URL')
|
|
347
|
+
.option('--preparationStatus <status>', 'Status for issues in preparation')
|
|
348
|
+
.option('--awaitingWorkspaceStatus <status>', 'Status for issues awaiting workspace')
|
|
349
|
+
.option('--awaitingQualityCheckStatus <status>', 'Status for issues awaiting quality check')
|
|
350
|
+
.option('--thresholdForAutoReject <count>', 'Threshold for auto-escalation after consecutive rejections (default: 3)')
|
|
351
|
+
.option('--workflowBlockerResolvedWebhookUrl <url>', 'Webhook URL to notify when a workflow blocker issue status changes to awaiting quality check. Supports {URL} and {MESSAGE} placeholders.')
|
|
352
|
+
.action(async (options) => {
|
|
353
|
+
const token = process.env.GH_TOKEN;
|
|
354
|
+
if (!token) {
|
|
355
|
+
console.error('GH_TOKEN environment variable is required');
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
const configFileValues = (0, exports.loadConfigFile)(options.configFilePath);
|
|
359
|
+
const cliOverrides = {
|
|
360
|
+
projectUrl: options.projectUrl,
|
|
361
|
+
preparationStatus: options.preparationStatus,
|
|
362
|
+
awaitingWorkspaceStatus: options.awaitingWorkspaceStatus,
|
|
363
|
+
awaitingQualityCheckStatus: options.awaitingQualityCheckStatus,
|
|
364
|
+
thresholdForAutoReject: options.thresholdForAutoReject
|
|
365
|
+
? Number(options.thresholdForAutoReject)
|
|
366
|
+
: undefined,
|
|
367
|
+
workflowBlockerResolvedWebhookUrl: options.workflowBlockerResolvedWebhookUrl,
|
|
368
|
+
};
|
|
369
|
+
const tempProjectUrl = cliOverrides.projectUrl ?? configFileValues.projectUrl;
|
|
370
|
+
let readmeOverrides = {};
|
|
371
|
+
if (tempProjectUrl) {
|
|
372
|
+
const readme = await (0, exports.fetchProjectReadme)(tempProjectUrl, token);
|
|
373
|
+
if (readme) {
|
|
374
|
+
readmeOverrides = (0, exports.parseProjectReadmeConfig)(readme);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const config = (0, exports.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
|
|
378
|
+
const projectUrl = config.projectUrl;
|
|
379
|
+
const preparationStatus = config.preparationStatus;
|
|
380
|
+
const awaitingWorkspaceStatus = config.awaitingWorkspaceStatus;
|
|
381
|
+
const awaitingQualityCheckStatus = config.awaitingQualityCheckStatus;
|
|
382
|
+
if (!projectUrl) {
|
|
383
|
+
console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
|
|
384
|
+
process.exit(1);
|
|
385
|
+
}
|
|
386
|
+
if (!preparationStatus) {
|
|
387
|
+
console.error('preparationStatus is required. Provide via --preparationStatus, config file, or project README.');
|
|
388
|
+
process.exit(1);
|
|
389
|
+
}
|
|
390
|
+
if (!awaitingWorkspaceStatus) {
|
|
391
|
+
console.error('awaitingWorkspaceStatus is required. Provide via --awaitingWorkspaceStatus, config file, or project README.');
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
if (!awaitingQualityCheckStatus) {
|
|
395
|
+
console.error('awaitingQualityCheckStatus is required. Provide via --awaitingQualityCheckStatus, config file, or project README.');
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
let thresholdForAutoReject = 3;
|
|
399
|
+
const rawThreshold = config.thresholdForAutoReject;
|
|
400
|
+
if (rawThreshold !== undefined) {
|
|
401
|
+
const parsed = Number(rawThreshold);
|
|
402
|
+
if (!Number.isFinite(parsed) ||
|
|
403
|
+
!Number.isInteger(parsed) ||
|
|
404
|
+
parsed <= 0) {
|
|
405
|
+
console.error('Invalid value for --thresholdForAutoReject. It must be a positive integer.');
|
|
406
|
+
process.exit(1);
|
|
407
|
+
}
|
|
408
|
+
thresholdForAutoReject = parsed;
|
|
409
|
+
}
|
|
410
|
+
const workflowBlockerResolvedWebhookUrl = config.workflowBlockerResolvedWebhookUrl ?? null;
|
|
411
|
+
const projectName = config.projectName ?? 'default';
|
|
412
|
+
const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
|
|
413
|
+
const cachePath = `./tmp/cache/${projectName}`;
|
|
414
|
+
const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
|
|
415
|
+
const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, cachePath, token);
|
|
416
|
+
const projectRepository = {
|
|
417
|
+
...new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams),
|
|
418
|
+
...new CheerioProjectRepository_1.CheerioProjectRepository(...githubRepositoryParams),
|
|
419
|
+
prepareStatus: async (_name, project) => {
|
|
420
|
+
return project;
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
|
|
424
|
+
const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
|
|
425
|
+
const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
|
|
426
|
+
const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
|
|
427
|
+
const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
|
|
428
|
+
const webhookRepository = new FetchWebhookRepository_1.FetchWebhookRepository();
|
|
429
|
+
const useCase = new NotifyFinishedIssuePreparationUseCase_1.NotifyFinishedIssuePreparationUseCase(projectRepository, issueRepository, issueCommentRepository, webhookRepository);
|
|
430
|
+
await useCase.run({
|
|
431
|
+
projectUrl,
|
|
432
|
+
issueUrl: options.issueUrl,
|
|
433
|
+
preparationStatus,
|
|
434
|
+
awaitingWorkspaceStatus,
|
|
435
|
+
awaitingQualityCheckStatus,
|
|
436
|
+
thresholdForAutoReject,
|
|
437
|
+
workflowBlockerResolvedWebhookUrl,
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
/* istanbul ignore next */
|
|
441
|
+
if (process.argv && require.main === module) {
|
|
442
|
+
exports.program.parse(process.argv);
|
|
26
443
|
}
|
|
27
444
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,uGAAoG;AAEpG,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAS9B,OAAO;KACJ,IAAI,CAAC,uCAAuC,CAAC;KAC7C,WAAW,CAAC,oDAAoD,CAAC;KACjE,cAAc,CACb,sBAAsB,EACtB,iCAAiC,EACjC,qBAAqB,CACtB;KACA,cAAc,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,uEAAkC,EAAE,CAAC;QACzD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,gDAAwB;AACxB,yCAAoC;AACpC,uCAAyB;AACzB,uGAAoG;AACpG,8FAA2F;AAC3F,0HAAuH;AACvH,sFAAmF;AACnF,0FAAuF;AACvF,wFAAqF;AACrF,sFAAmF;AACnF,wGAAqG;AACrG,8GAA2G;AAC3G,gGAA6F;AAC7F,0FAAuF;AAEvF,sFAAmF;AACnF,0FAAuF;AACvF,kGAA+F;AAC/F,sFAAmF;AAuCnF,MAAM,cAAc,GAAG,CACrB,GAA4B,EAC5B,GAAW,EACS,EAAE;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,GAA4B,EAC5B,GAAW,EACS,EAAE;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEhE,MAAM,cAAc,GAAG,CAAC,cAAsB,EAAc,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAY,cAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL,UAAU,EAAE,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;YAChD,uBAAuB,EAAE,cAAc,CACrC,MAAM,EACN,yBAAyB,CAC1B;YACD,iBAAiB,EAAE,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC;YAC9D,gBAAgB,EAAE,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC;YAC5D,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC;YAClD,2BAA2B,EAAE,cAAc,CACzC,MAAM,EACN,6BAA6B,CAC9B;YACD,sBAAsB,EAAE,cAAc,CAAC,MAAM,EAAE,wBAAwB,CAAC;YACxE,0BAA0B,EAAE,cAAc,CACxC,MAAM,EACN,4BAA4B,CAC7B;YACD,sBAAsB,EAAE,cAAc,CAAC,MAAM,EAAE,wBAAwB,CAAC;YACxE,iCAAiC,EAAE,cAAc,CAC/C,MAAM,EACN,mCAAmC,CACpC;YACD,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CACX,sCAAsC,cAAc,MAAM,OAAO,EAAE,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAvCW,QAAA,cAAc,kBAuCzB;AAEK,MAAM,wBAAwB,GAAG,CAAC,MAAc,EAAc,EAAE;IACrE,MAAM,YAAY,GAChB,8DAA8D,CAAC;IACjE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,cAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL,uBAAuB,EAAE,cAAc,CACrC,MAAM,EACN,yBAAyB,CAC1B;YACD,iBAAiB,EAAE,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC;YAC9D,gBAAgB,EAAE,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC;YAC5D,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC;YAClD,2BAA2B,EAAE,cAAc,CACzC,MAAM,EACN,6BAA6B,CAC9B;YACD,sBAAsB,EAAE,cAAc,CAAC,MAAM,EAAE,wBAAwB,CAAC;YACxE,0BAA0B,EAAE,cAAc,CACxC,MAAM,EACN,4BAA4B,CAC7B;YACD,sBAAsB,EAAE,cAAc,CAAC,MAAM,EAAE,wBAAwB,CAAC;YACxE,iCAAiC,EAAE,cAAc,CAC/C,MAAM,EACN,mCAAmC,CACpC;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AA3CW,QAAA,wBAAwB,4BA2CnC;AAEK,MAAM,YAAY,GAAG,CAC1B,UAAsB,EACtB,YAAwB,EACxB,eAA2B,EACf,EAAE,CAAC,CAAC;IAChB,UAAU,EAAE,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU;IAC5D,uBAAuB,EACrB,eAAe,CAAC,uBAAuB;QACvC,YAAY,CAAC,uBAAuB;QACpC,UAAU,CAAC,uBAAuB;IACpC,iBAAiB,EACf,eAAe,CAAC,iBAAiB;QACjC,YAAY,CAAC,iBAAiB;QAC9B,UAAU,CAAC,iBAAiB;IAC9B,gBAAgB,EACd,eAAe,CAAC,gBAAgB;QAChC,YAAY,CAAC,gBAAgB;QAC7B,UAAU,CAAC,gBAAgB;IAC7B,WAAW,EACT,eAAe,CAAC,WAAW;QAC3B,YAAY,CAAC,WAAW;QACxB,UAAU,CAAC,WAAW;IACxB,2BAA2B,EACzB,eAAe,CAAC,2BAA2B;QAC3C,YAAY,CAAC,2BAA2B;QACxC,UAAU,CAAC,2BAA2B;IACxC,sBAAsB,EACpB,eAAe,CAAC,sBAAsB;QACtC,YAAY,CAAC,sBAAsB;QACnC,UAAU,CAAC,sBAAsB;IACnC,0BAA0B,EACxB,eAAe,CAAC,0BAA0B;QAC1C,YAAY,CAAC,0BAA0B;QACvC,UAAU,CAAC,0BAA0B;IACvC,sBAAsB,EACpB,eAAe,CAAC,sBAAsB;QACtC,YAAY,CAAC,sBAAsB;QACnC,UAAU,CAAC,sBAAsB;IACnC,iCAAiC,EAC/B,eAAe,CAAC,iCAAiC;QACjD,YAAY,CAAC,iCAAiC;QAC9C,UAAU,CAAC,iCAAiC;IAC9C,WAAW,EAAE,UAAU,CAAC,WAAW;CACpC,CAAC,CAAC;AA3CU,QAAA,YAAY,gBA2CtB;AASH,MAAM,gCAAgC,GAAG,CACvC,KAAc,EAC2B,EAAE;IAC3C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,KAAK,EACrC,UAAkB,EAClB,KAAa,EACW,EAAE;IAC1B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAG;;;;;;;;;;;;;KAab,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;aAC5C,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,YAAY,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEpD,IAAI,CAAC,gCAAgC,CAAC,YAAY,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC;QACrE,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC;QAC9D,MAAM,MAAM,GACV,OAAO,SAAS,KAAK,QAAQ;YAC3B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,UAAU,KAAK,QAAQ;gBAC9B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,IAAI,CAAC;QAEb,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AA5DW,QAAA,kBAAkB,sBA4D7B;AAEF,MAAM,2BAA2B,GAAG,CAClC,sBAA8C,EAC9C,SAAiB,EACjB,KAAa,EACuC,EAAE,CAAC;IACvD,sBAAsB;IACtB,GAAG,SAAS,0BAA0B;IACtC,KAAK;IACL,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AASW,QAAA,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAErC,eAAO;KACJ,IAAI,CAAC,uCAAuC,CAAC;KAC7C,WAAW,CAAC,oDAAoD,CAAC,CAAC;AAErE,eAAO;KACJ,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACxC,WAAW,CAAC,sDAAsD,CAAC;KACnE,cAAc,CACb,sBAAsB,EACtB,iCAAiC,EACjC,qBAAqB,CACtB;KACA,cAAc,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;IACzC,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,uEAAkC,EAAE,CAAC;QACzD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CACb,yBAAyB,EACzB,kDAAkD,CACnD;KACA,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;KAClD,MAAM,CACL,oCAAoC,EACpC,sCAAsC,CACvC;KACA,MAAM,CAAC,8BAA8B,EAAE,kCAAkC,CAAC;KAC1E,MAAM,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;KACzD,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;KAClD,MAAM,CACL,uCAAuC,EACvC,6DAA6D,CAC9D;KACA,MAAM,CACL,oCAAoC,EACpC,gDAAgD,CACjD;KACA,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAA,sBAAc,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAe;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;YAC9D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC;YAC7C,CAAC,CAAC,SAAS;QACb,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACpD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,MAAM,cAAc,GAClB,YAAY,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU,CAAC;IAEzD,IAAI,eAAe,GAAe,EAAE,CAAC;IACrC,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAkB,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,GAAG,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,oBAAY,EACzB,gBAAgB,EAChB,YAAY,EACZ,eAAe,CAChB,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;IAC/D,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACX,mFAAmF,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CACX,6GAA6G,CAC9G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CACX,iGAAiG,CAClG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CACX,+FAA+F,CAChG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,2BAA2B,GAAkB,IAAI,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;IACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACxC,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;YAC9B,WAAW,IAAI,CAAC,EAChB,CAAC;YACD,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,2BAA2B,GAAG,WAAW,CAAC;IAC5C,CAAC;IAED,MAAM,sBAAsB,GAAG,MAAM,CAAC,sBAAsB,IAAI,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CACT,gCAAgC,2BAA2B,IAAI,mBAAmB,EAAE,CACrF,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;IACpD,MAAM,sBAAsB,GAAG,IAAI,+CAAsB,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,eAAe,WAAW,EAAE,CAAC;IAC/C,MAAM,2BAA2B,GAAG,IAAI,yDAA2B,CACjE,sBAAsB,EACtB,SAAS,CACV,CAAC;IACF,MAAM,sBAAsB,GAAG,2BAA2B,CACxD,sBAAsB,EACtB,SAAS,EACT,KAAK,CACN,CAAC;IACF,MAAM,iBAAiB,GAAG;QACxB,GAAG,IAAI,mDAAwB,CAAC,GAAG,sBAAsB,CAAC;QAC1D,GAAG,IAAI,mDAAwB,CAAC,GAAG,sBAAsB,CAAC;KAC3D,CAAC;IACF,MAAM,oBAAoB,GAAG,IAAI,2CAAoB,CACnD,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CACjD,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,4BAA4B,GAAG,IAAI,2DAA4B,CACnE,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,iEAA+B,CACzD,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC5B,2BAA2B,EAC3B,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,mDAAwB,EAAE,CAAC;IACxD,MAAM,kBAAkB,GAAG,IAAI,+CAAsB,EAAE,CAAC;IAExD,MAAM,OAAO,GAAG,IAAI,iDAAuB,CACzC,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,CACnB,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,UAAU;QACV,uBAAuB;QACvB,iBAAiB;QACjB,gBAAgB;QAChB,WAAW,EAAE,WAAW,IAAI,SAAS;QACrC,2BAA2B;QAC3B,sBAAsB;KACvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,eAAO;KACJ,OAAO,CAAC,gCAAgC,CAAC;KACzC,WAAW,CAAC,2CAA2C,CAAC;KACxD,cAAc,CACb,yBAAyB,EACzB,kDAAkD,CACnD;KACA,cAAc,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KACtD,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;KAClD,MAAM,CAAC,8BAA8B,EAAE,kCAAkC,CAAC;KAC1E,MAAM,CACL,oCAAoC,EACpC,sCAAsC,CACvC;KACA,MAAM,CACL,uCAAuC,EACvC,0CAA0C,CAC3C;KACA,MAAM,CACL,kCAAkC,EAClC,yEAAyE,CAC1E;KACA,MAAM,CACL,2CAA2C,EAC3C,0IAA0I,CAC3I;KACA,MAAM,CAAC,KAAK,EAAE,OAA8B,EAAE,EAAE;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAA,sBAAc,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAe;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,0BAA0B,EAAE,OAAO,CAAC,0BAA0B;QAC9D,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACpD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,SAAS;QACb,iCAAiC,EAC/B,OAAO,CAAC,iCAAiC;KAC5C,CAAC;IAEF,MAAM,cAAc,GAClB,YAAY,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU,CAAC;IAEzD,IAAI,eAAe,GAAe,EAAE,CAAC;IACrC,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAkB,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,GAAG,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,oBAAY,EACzB,gBAAgB,EAChB,YAAY,EACZ,eAAe,CAChB,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACnD,MAAM,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;IAC/D,MAAM,0BAA0B,GAAG,MAAM,CAAC,0BAA0B,CAAC;IAErE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CACX,mFAAmF,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CACX,iGAAiG,CAClG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CACX,6GAA6G,CAC9G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CACX,mHAAmH,CACpH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,sBAAsB,CAAC;IACnD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACzB,MAAM,IAAI,CAAC,EACX,CAAC;YACD,OAAO,CAAC,KAAK,CACX,4EAA4E,CAC7E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,sBAAsB,GAAG,MAAM,CAAC;IAClC,CAAC;IAED,MAAM,iCAAiC,GACrC,MAAM,CAAC,iCAAiC,IAAI,IAAI,CAAC;IAEnD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;IACpD,MAAM,sBAAsB,GAAG,IAAI,+CAAsB,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,eAAe,WAAW,EAAE,CAAC;IAC/C,MAAM,2BAA2B,GAAG,IAAI,yDAA2B,CACjE,sBAAsB,EACtB,SAAS,CACV,CAAC;IACF,MAAM,sBAAsB,GAAG,2BAA2B,CACxD,sBAAsB,EACtB,SAAS,EACT,KAAK,CACN,CAAC;IACF,MAAM,iBAAiB,GAAG;QACxB,GAAG,IAAI,mDAAwB,CAAC,GAAG,sBAAsB,CAAC;QAC1D,GAAG,IAAI,mDAAwB,CAAC,GAAG,sBAAsB,CAAC;QAC1D,aAAa,EAAE,KAAK,EAClB,KAAa,EACb,OAAgB,EACE,EAAE;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;IACF,MAAM,oBAAoB,GAAG,IAAI,2CAAoB,CACnD,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CACjD,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,4BAA4B,GAAG,IAAI,2DAA4B,CACnE,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,iEAA+B,CACzD,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC5B,2BAA2B,EAC3B,GAAG,sBAAsB,CAC1B,CAAC;IACF,MAAM,sBAAsB,GAAG,IAAI,2DAA4B,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,IAAI,+CAAsB,EAAE,CAAC;IAEvD,MAAM,OAAO,GAAG,IAAI,6EAAqC,CACvD,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,CAClB,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,UAAU;QACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,iBAAiB;QACjB,uBAAuB;QACvB,0BAA0B;QAC1B,sBAAsB;QACtB,iCAAiC;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,0BAA0B;AAC1B,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5C,eAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|