@nahisaho/katashiro-collector 0.1.1 → 0.1.3
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.
|
@@ -15,8 +15,10 @@ export declare class WebSearchClient implements IWebSearchClient {
|
|
|
15
15
|
private readonly defaultMaxResults;
|
|
16
16
|
/**
|
|
17
17
|
* Web検索を実行
|
|
18
|
+
* @param queryOrString 検索クエリ(文字列またはSearchQueryオブジェクト)
|
|
19
|
+
* @param options 検索オプション
|
|
18
20
|
*/
|
|
19
|
-
search(
|
|
21
|
+
search(queryOrString: string | SearchQuery, options?: WebSearchOptions): Promise<Result<SearchResult[], Error>>;
|
|
20
22
|
/**
|
|
21
23
|
* プロバイダーから検索結果を取得
|
|
22
24
|
*/
|
|
@@ -26,6 +28,24 @@ export declare class WebSearchClient implements IWebSearchClient {
|
|
|
26
28
|
* Note: 本番環境ではSerpAPIやBraveSearchAPIなどを使用推奨
|
|
27
29
|
*/
|
|
28
30
|
private searchDuckDuckGo;
|
|
31
|
+
/**
|
|
32
|
+
* DuckDuckGo HTML検索(スクレイピング)
|
|
33
|
+
* Instant Answer APIより確実に検索結果が得られる
|
|
34
|
+
*/
|
|
35
|
+
private searchDuckDuckGoHtml;
|
|
36
|
+
/**
|
|
37
|
+
* DuckDuckGo HTML検索結果をパース
|
|
38
|
+
*/
|
|
39
|
+
private parseDuckDuckGoHtml;
|
|
40
|
+
/**
|
|
41
|
+
* HTMLエンティティをデコード
|
|
42
|
+
*/
|
|
43
|
+
private decodeHtmlEntities;
|
|
44
|
+
/**
|
|
45
|
+
* SearXNG を使用した検索(複数インスタンス対応)
|
|
46
|
+
* APIキー不要で確実に検索結果が得られる
|
|
47
|
+
*/
|
|
48
|
+
private searchSearXNG;
|
|
29
49
|
/**
|
|
30
50
|
* Google Custom Search API を使用した検索
|
|
31
51
|
* Note: 実装にはAPI Keyが必要
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search-client.d.ts","sourceRoot":"","sources":["../../src/web-search/web-search-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,EAKjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search-client.d.ts","sourceRoot":"","sources":["../../src/web-search/web-search-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,EAKjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgCtE;;GAEG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAExC;;;;OAIG;IACG,MAAM,CACV,aAAa,EAAE,MAAM,GAAG,WAAW,EACnC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IA8BzC;;OAEG;YACW,iBAAiB;IAkB/B;;;OAGG;YACW,gBAAgB;IA6D9B;;;OAGG;YACW,oBAAoB;IAoBlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+D3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;OAGG;YACW,aAAa;IAkD3B;;;OAGG;YACW,YAAY;IAM1B;;;OAGG;YACW,UAAU;IAMxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAQrB"}
|
|
@@ -14,8 +14,14 @@ export class WebSearchClient {
|
|
|
14
14
|
defaultMaxResults = 10;
|
|
15
15
|
/**
|
|
16
16
|
* Web検索を実行
|
|
17
|
+
* @param queryOrString 検索クエリ(文字列またはSearchQueryオブジェクト)
|
|
18
|
+
* @param options 検索オプション
|
|
17
19
|
*/
|
|
18
|
-
async search(
|
|
20
|
+
async search(queryOrString, options) {
|
|
21
|
+
// 文字列の場合はSearchQueryオブジェクトに変換
|
|
22
|
+
const query = typeof queryOrString === 'string'
|
|
23
|
+
? { query: queryOrString }
|
|
24
|
+
: queryOrString;
|
|
19
25
|
// バリデーション
|
|
20
26
|
if (!query.query || query.query.trim().length === 0) {
|
|
21
27
|
return err(new Error('Search query cannot be empty'));
|
|
@@ -43,6 +49,8 @@ export class WebSearchClient {
|
|
|
43
49
|
switch (provider) {
|
|
44
50
|
case 'duckduckgo':
|
|
45
51
|
return this.searchDuckDuckGo(query);
|
|
52
|
+
case 'searxng':
|
|
53
|
+
return this.searchSearXNG(query);
|
|
46
54
|
case 'google':
|
|
47
55
|
return this.searchGoogle(query);
|
|
48
56
|
case 'bing':
|
|
@@ -56,6 +64,17 @@ export class WebSearchClient {
|
|
|
56
64
|
* Note: 本番環境ではSerpAPIやBraveSearchAPIなどを使用推奨
|
|
57
65
|
*/
|
|
58
66
|
async searchDuckDuckGo(query) {
|
|
67
|
+
// まずHTML検索を試行(より確実に結果が得られる)
|
|
68
|
+
try {
|
|
69
|
+
const htmlResults = await this.searchDuckDuckGoHtml(query);
|
|
70
|
+
if (htmlResults.length > 0) {
|
|
71
|
+
return htmlResults;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// HTML検索に失敗した場合はInstant Answer APIにフォールバック
|
|
76
|
+
}
|
|
77
|
+
// Instant Answer API(Wikipediaなどの定義情報)
|
|
59
78
|
const encodedQuery = encodeURIComponent(query.query);
|
|
60
79
|
const url = `https://api.duckduckgo.com/?q=${encodedQuery}&format=json&no_html=1`;
|
|
61
80
|
const response = await fetch(url, {
|
|
@@ -98,6 +117,146 @@ export class WebSearchClient {
|
|
|
98
117
|
}
|
|
99
118
|
return results;
|
|
100
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* DuckDuckGo HTML検索(スクレイピング)
|
|
122
|
+
* Instant Answer APIより確実に検索結果が得られる
|
|
123
|
+
*/
|
|
124
|
+
async searchDuckDuckGoHtml(query) {
|
|
125
|
+
const encodedQuery = encodeURIComponent(query.query);
|
|
126
|
+
const url = `https://html.duckduckgo.com/html/?q=${encodedQuery}`;
|
|
127
|
+
const response = await fetch(url, {
|
|
128
|
+
headers: {
|
|
129
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
130
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
131
|
+
'Accept-Language': 'ja,en-US;q=0.9,en;q=0.8',
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
throw new Error(`DuckDuckGo HTML error: ${response.status}`);
|
|
136
|
+
}
|
|
137
|
+
const html = await response.text();
|
|
138
|
+
return this.parseDuckDuckGoHtml(html);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* DuckDuckGo HTML検索結果をパース
|
|
142
|
+
*/
|
|
143
|
+
parseDuckDuckGoHtml(html) {
|
|
144
|
+
const results = [];
|
|
145
|
+
// 結果ブロックを抽出(正規表現ベース)
|
|
146
|
+
// <a class="result__a" href="...">タイトル</a>
|
|
147
|
+
// <a class="result__snippet">スニペット</a>
|
|
148
|
+
const resultPattern = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([^<]*)<\/a>[\s\S]*?<a[^>]*class="result__snippet"[^>]*>([^<]*)<\/a>/gi;
|
|
149
|
+
let match;
|
|
150
|
+
while ((match = resultPattern.exec(html)) !== null) {
|
|
151
|
+
const rawUrl = match[1];
|
|
152
|
+
const title = match[2];
|
|
153
|
+
const snippet = match[3];
|
|
154
|
+
// DuckDuckGoのリダイレクトURLから実際のURLを抽出
|
|
155
|
+
let url = rawUrl ?? '';
|
|
156
|
+
if (rawUrl) {
|
|
157
|
+
const udMatch = rawUrl.match(/uddg=([^&]+)/);
|
|
158
|
+
if (udMatch?.[1]) {
|
|
159
|
+
url = decodeURIComponent(udMatch[1]);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (url && title) {
|
|
163
|
+
results.push({
|
|
164
|
+
id: generateId('search'),
|
|
165
|
+
title: this.decodeHtmlEntities(title.trim()),
|
|
166
|
+
url: url,
|
|
167
|
+
snippet: this.decodeHtmlEntities(snippet?.trim() ?? ''),
|
|
168
|
+
source: 'duckduckgo',
|
|
169
|
+
timestamp: formatTimestamp(),
|
|
170
|
+
relevanceScore: 0.9 - (results.length * 0.05),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// 別パターンも試行(シンプルなリンク形式)
|
|
175
|
+
if (results.length === 0) {
|
|
176
|
+
const simplePattern = /<a[^>]*class="[^"]*result[^"]*"[^>]*href="\/\/duckduckgo\.com\/l\/\?uddg=([^&"]+)[^"]*"[^>]*>([^<]+)<\/a>/gi;
|
|
177
|
+
while ((match = simplePattern.exec(html)) !== null) {
|
|
178
|
+
const encodedUrl = match[1];
|
|
179
|
+
const title = match[2];
|
|
180
|
+
if (!encodedUrl)
|
|
181
|
+
continue;
|
|
182
|
+
const url = decodeURIComponent(encodedUrl);
|
|
183
|
+
if (url && title && !url.includes('duckduckgo.com')) {
|
|
184
|
+
results.push({
|
|
185
|
+
id: generateId('search'),
|
|
186
|
+
title: this.decodeHtmlEntities(title.trim()),
|
|
187
|
+
url: url,
|
|
188
|
+
snippet: '',
|
|
189
|
+
source: 'duckduckgo',
|
|
190
|
+
timestamp: formatTimestamp(),
|
|
191
|
+
relevanceScore: 0.8,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return results;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* HTMLエンティティをデコード
|
|
200
|
+
*/
|
|
201
|
+
decodeHtmlEntities(text) {
|
|
202
|
+
const entities = {
|
|
203
|
+
'&': '&',
|
|
204
|
+
'<': '<',
|
|
205
|
+
'>': '>',
|
|
206
|
+
'"': '"',
|
|
207
|
+
''': "'",
|
|
208
|
+
' ': ' ',
|
|
209
|
+
};
|
|
210
|
+
return text.replace(/&[^;]+;/g, (entity) => entities[entity] ?? entity);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* SearXNG を使用した検索(複数インスタンス対応)
|
|
214
|
+
* APIキー不要で確実に検索結果が得られる
|
|
215
|
+
*/
|
|
216
|
+
async searchSearXNG(query) {
|
|
217
|
+
const instances = [
|
|
218
|
+
'https://searx.be',
|
|
219
|
+
'https://search.disroot.org',
|
|
220
|
+
'https://searx.tiekoetter.com',
|
|
221
|
+
'https://search.sapti.me',
|
|
222
|
+
];
|
|
223
|
+
for (const instance of instances) {
|
|
224
|
+
try {
|
|
225
|
+
const encodedQuery = encodeURIComponent(query.query);
|
|
226
|
+
const url = `${instance}/search?q=${encodedQuery}&format=json&categories=general`;
|
|
227
|
+
const response = await fetch(url, {
|
|
228
|
+
headers: {
|
|
229
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
230
|
+
'Accept': 'application/json',
|
|
231
|
+
},
|
|
232
|
+
signal: AbortSignal.timeout(10000), // 10秒タイムアウト
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
const data = (await response.json());
|
|
238
|
+
if (data.results && data.results.length > 0) {
|
|
239
|
+
return data.results
|
|
240
|
+
.filter(r => r.url && r.title)
|
|
241
|
+
.map((r, index) => ({
|
|
242
|
+
id: generateId('search'),
|
|
243
|
+
title: r.title ?? '',
|
|
244
|
+
url: r.url ?? '',
|
|
245
|
+
snippet: r.content ?? '',
|
|
246
|
+
source: `searxng:${r.engine ?? 'unknown'}`,
|
|
247
|
+
timestamp: formatTimestamp(),
|
|
248
|
+
relevanceScore: 1.0 - (index * 0.05),
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// このインスタンスは失敗、次を試行
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// 全インスタンス失敗
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
101
260
|
/**
|
|
102
261
|
* Google Custom Search API を使用した検索
|
|
103
262
|
* Note: 実装にはAPI Keyが必要
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search-client.js","sourceRoot":"","sources":["../../src/web-search/web-search-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,EAAE,EACF,GAAG,EACH,UAAU,EACV,eAAe,GAChB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search-client.js","sourceRoot":"","sources":["../../src/web-search/web-search-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,EAAE,EACF,GAAG,EACH,UAAU,EACV,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAiClC;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,eAAe,GAAmB,YAAY,CAAC;IAC/C,iBAAiB,GAAG,EAAE,CAAC;IAExC;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,aAAmC,EACnC,OAA0B;QAE1B,8BAA8B;QAC9B,MAAM,KAAK,GAAgB,OAAO,aAAa,KAAK,QAAQ;YAC1D,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE;YAC1B,CAAC,CAAC,aAAa,CAAC;QAElB,UAAU;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAErF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBACrD,GAAG,KAAK;gBACR,UAAU;aACX,CAAC,CAAC;YAEH,kBAAkB;YAClB,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAEpD,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAC7B,QAAwB,EACxB,KAAkB;QAElB,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACnC,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAClC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC;gBACE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,gBAAgB,CAAC,KAAkB;QAC/C,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,iCAAiC,YAAY,wBAAwB,CAAC;QAElF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,YAAY,EAAE,iBAAiB;aAChC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC3D,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;gBACxB,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK;gBAClC,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY;gBAC1B,MAAM,EAAE,YAAY;gBACpB,SAAS,EAAE,eAAe,EAAE;gBAC5B,cAAc,EAAE,GAAG;aACpB,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;wBACxB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACpC,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;wBACnB,MAAM,EAAE,YAAY;wBACpB,SAAS,EAAE,eAAe,EAAE;wBAC5B,cAAc,EAAE,GAAG;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,oBAAoB,CAAC,KAAkB;QACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,uCAAuC,YAAY,EAAE,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,YAAY,EAAE,iHAAiH;gBAC/H,QAAQ,EAAE,iEAAiE;gBAC3E,iBAAiB,EAAE,yBAAyB;aAC7C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAY;QACtC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,qBAAqB;QACrB,2CAA2C;QAC3C,uCAAuC;QACvC,MAAM,aAAa,GAAG,yHAAyH,CAAC;QAEhJ,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,kCAAkC;YAClC,IAAI,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;YACvB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC7C,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjB,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;oBACxB,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC5C,GAAG,EAAE,GAAG;oBACR,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBACvD,MAAM,EAAE,YAAY;oBACpB,SAAS,EAAE,eAAe,EAAE;oBAC5B,cAAc,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,6GAA6G,CAAC;YACpI,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAE3C,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACpD,OAAO,CAAC,IAAI,CAAC;wBACX,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;wBACxB,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC5C,GAAG,EAAE,GAAG;wBACR,OAAO,EAAE,EAAE;wBACX,MAAM,EAAE,YAAY;wBACpB,SAAS,EAAE,eAAe,EAAE;wBAC5B,cAAc,EAAE,GAAG;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAY;QACrC,MAAM,QAAQ,GAA2B;YACvC,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,GAAG;SACd,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CAAC,KAAkB;QAC5C,MAAM,SAAS,GAAG;YAChB,kBAAkB;YAClB,4BAA4B;YAC5B,8BAA8B;YAC9B,yBAAyB;SAC1B,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,GAAG,QAAQ,aAAa,YAAY,iCAAiC,CAAC;gBAElF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,OAAO,EAAE;wBACP,YAAY,EAAE,8DAA8D;wBAC5E,QAAQ,EAAE,kBAAkB;qBAC7B;oBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY;iBACjD,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;gBAExD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,OAAO,IAAI,CAAC,OAAO;yBAChB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;yBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;wBAClB,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;wBACxB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;wBACpB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;wBAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;wBACxB,MAAM,EAAE,WAAW,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE;wBAC1C,SAAS,EAAE,eAAe,EAAE;wBAC5B,cAAc,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;qBACrC,CAAC,CAAC,CAAC;gBACR,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;gBACnB,SAAS;YACX,CAAC;QACH,CAAC;QAED,YAAY;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,MAAmB;QAC5C,+BAA+B;QAC/B,qCAAqC;QACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU,CAAC,MAAmB;QAC1C,sBAAsB;QACtB,wBAAwB;QACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,IAAY;QAC/B,2BAA2B;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACjD,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9C,CAAC;CACF"}
|