@zenalexa/unicli 0.225.2 → 0.225.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.
Files changed (184) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +3 -3
  3. package/README.zh-CN.md +3 -3
  4. package/dist/adapters/acl-anthology/papers.d.ts +16 -9
  5. package/dist/adapters/acl-anthology/papers.d.ts.map +1 -1
  6. package/dist/adapters/acl-anthology/papers.js +322 -58
  7. package/dist/adapters/acl-anthology/papers.js.map +1 -1
  8. package/dist/adapters/arxiv/papers.d.ts +22 -4
  9. package/dist/adapters/arxiv/papers.d.ts.map +1 -1
  10. package/dist/adapters/arxiv/papers.js +202 -4
  11. package/dist/adapters/arxiv/papers.js.map +1 -1
  12. package/dist/adapters/baidu-scholar/search.d.ts +15 -1
  13. package/dist/adapters/baidu-scholar/search.d.ts.map +1 -1
  14. package/dist/adapters/baidu-scholar/search.js +72 -8
  15. package/dist/adapters/baidu-scholar/search.js.map +1 -1
  16. package/dist/adapters/biorxiv/preprints.d.ts +9 -0
  17. package/dist/adapters/biorxiv/preprints.d.ts.map +1 -0
  18. package/dist/adapters/biorxiv/preprints.js +78 -0
  19. package/dist/adapters/biorxiv/preprints.js.map +1 -0
  20. package/dist/adapters/cnki/search.d.ts +82 -0
  21. package/dist/adapters/cnki/search.d.ts.map +1 -0
  22. package/dist/adapters/cnki/search.js +236 -0
  23. package/dist/adapters/cnki/search.js.map +1 -0
  24. package/dist/adapters/cvf/papers.d.ts +12 -7
  25. package/dist/adapters/cvf/papers.d.ts.map +1 -1
  26. package/dist/adapters/cvf/papers.js +210 -27
  27. package/dist/adapters/cvf/papers.js.map +1 -1
  28. package/dist/adapters/dblp/publications.d.ts +12 -5
  29. package/dist/adapters/dblp/publications.d.ts.map +1 -1
  30. package/dist/adapters/dblp/publications.js +31 -8
  31. package/dist/adapters/dblp/publications.js.map +1 -1
  32. package/dist/adapters/google-scholar/search.d.ts +22 -1
  33. package/dist/adapters/google-scholar/search.d.ts.map +1 -1
  34. package/dist/adapters/google-scholar/search.js +129 -14
  35. package/dist/adapters/google-scholar/search.js.map +1 -1
  36. package/dist/adapters/hf/paper.d.ts +12 -3
  37. package/dist/adapters/hf/paper.d.ts.map +1 -1
  38. package/dist/adapters/hf/paper.js +65 -5
  39. package/dist/adapters/hf/paper.js.map +1 -1
  40. package/dist/adapters/medrxiv/preprints.d.ts +9 -0
  41. package/dist/adapters/medrxiv/preprints.d.ts.map +1 -0
  42. package/dist/adapters/medrxiv/preprints.js +78 -0
  43. package/dist/adapters/medrxiv/preprints.js.map +1 -0
  44. package/dist/adapters/neurips/proceedings.d.ts +8 -7
  45. package/dist/adapters/neurips/proceedings.d.ts.map +1 -1
  46. package/dist/adapters/neurips/proceedings.js +209 -21
  47. package/dist/adapters/neurips/proceedings.js.map +1 -1
  48. package/dist/adapters/openalex/works.d.ts +21 -5
  49. package/dist/adapters/openalex/works.d.ts.map +1 -1
  50. package/dist/adapters/openalex/works.js +108 -8
  51. package/dist/adapters/openalex/works.js.map +1 -1
  52. package/dist/adapters/openreview/papers.d.ts +10 -4
  53. package/dist/adapters/openreview/papers.d.ts.map +1 -1
  54. package/dist/adapters/openreview/papers.js +351 -24
  55. package/dist/adapters/openreview/papers.js.map +1 -1
  56. package/dist/adapters/pmlr/proceedings.d.ts +6 -6
  57. package/dist/adapters/pmlr/proceedings.d.ts.map +1 -1
  58. package/dist/adapters/pmlr/proceedings.js +92 -12
  59. package/dist/adapters/pmlr/proceedings.js.map +1 -1
  60. package/dist/adapters/pubmed/articles.d.ts +8 -4
  61. package/dist/adapters/pubmed/articles.d.ts.map +1 -1
  62. package/dist/adapters/pubmed/articles.js +272 -39
  63. package/dist/adapters/pubmed/articles.js.map +1 -1
  64. package/dist/adapters/rxiv/preprints.d.ts +75 -0
  65. package/dist/adapters/rxiv/preprints.d.ts.map +1 -0
  66. package/dist/adapters/rxiv/preprints.js +651 -0
  67. package/dist/adapters/rxiv/preprints.js.map +1 -0
  68. package/dist/adapters/scholar-artifacts/pdf-read.d.ts +49 -0
  69. package/dist/adapters/scholar-artifacts/pdf-read.d.ts.map +1 -0
  70. package/dist/adapters/scholar-artifacts/pdf-read.js +204 -0
  71. package/dist/adapters/scholar-artifacts/pdf-read.js.map +1 -0
  72. package/dist/adapters/scholar-artifacts/pdf.d.ts +16 -0
  73. package/dist/adapters/scholar-artifacts/pdf.d.ts.map +1 -0
  74. package/dist/adapters/scholar-artifacts/pdf.js +122 -0
  75. package/dist/adapters/scholar-artifacts/pdf.js.map +1 -0
  76. package/dist/adapters/semantic-scholar/papers.d.ts +6 -6
  77. package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -1
  78. package/dist/adapters/semantic-scholar/papers.js +80 -6
  79. package/dist/adapters/semantic-scholar/papers.js.map +1 -1
  80. package/dist/adapters/unpaywall/works.d.ts +7 -7
  81. package/dist/adapters/unpaywall/works.d.ts.map +1 -1
  82. package/dist/adapters/unpaywall/works.js +104 -12
  83. package/dist/adapters/unpaywall/works.js.map +1 -1
  84. package/dist/adapters/wanfang/search.d.ts +14 -0
  85. package/dist/adapters/wanfang/search.d.ts.map +1 -1
  86. package/dist/adapters/wanfang/search.js +56 -7
  87. package/dist/adapters/wanfang/search.js.map +1 -1
  88. package/dist/browser/page.d.ts +2 -0
  89. package/dist/browser/page.d.ts.map +1 -1
  90. package/dist/browser/page.js +12 -0
  91. package/dist/browser/page.js.map +1 -1
  92. package/dist/commands/browser/actions.d.ts.map +1 -1
  93. package/dist/commands/browser/actions.js +59 -3
  94. package/dist/commands/browser/actions.js.map +1 -1
  95. package/dist/commands/scholar.d.ts +77 -5
  96. package/dist/commands/scholar.d.ts.map +1 -1
  97. package/dist/commands/scholar.js +2945 -83
  98. package/dist/commands/scholar.js.map +1 -1
  99. package/dist/core/command-contract.d.ts.map +1 -1
  100. package/dist/core/command-contract.js +5 -0
  101. package/dist/core/command-contract.js.map +1 -1
  102. package/dist/core/schema-v2.d.ts +1 -0
  103. package/dist/core/schema-v2.d.ts.map +1 -1
  104. package/dist/core/schema-v2.js +1 -0
  105. package/dist/core/schema-v2.js.map +1 -1
  106. package/dist/discovery/aliases.d.ts.map +1 -1
  107. package/dist/discovery/aliases.js +208 -0
  108. package/dist/discovery/aliases.js.map +1 -1
  109. package/dist/discovery/core-catalog.d.ts +2 -0
  110. package/dist/discovery/core-catalog.d.ts.map +1 -1
  111. package/dist/discovery/core-catalog.js +487 -0
  112. package/dist/discovery/core-catalog.js.map +1 -1
  113. package/dist/discovery/intents.d.ts.map +1 -1
  114. package/dist/discovery/intents.js +273 -2
  115. package/dist/discovery/intents.js.map +1 -1
  116. package/dist/discovery/loader.d.ts.map +1 -1
  117. package/dist/discovery/loader.js +3 -0
  118. package/dist/discovery/loader.js.map +1 -1
  119. package/dist/engine/capability-policy.d.ts.map +1 -1
  120. package/dist/engine/capability-policy.js +30 -4
  121. package/dist/engine/capability-policy.js.map +1 -1
  122. package/dist/engine/kernel/stages.d.ts.map +1 -1
  123. package/dist/engine/kernel/stages.js +3 -0
  124. package/dist/engine/kernel/stages.js.map +1 -1
  125. package/dist/engine/operation-policy.d.ts +4 -1
  126. package/dist/engine/operation-policy.d.ts.map +1 -1
  127. package/dist/engine/operation-policy.js +23 -0
  128. package/dist/engine/operation-policy.js.map +1 -1
  129. package/dist/fast-path/manifest.d.ts +3 -0
  130. package/dist/fast-path/manifest.d.ts.map +1 -1
  131. package/dist/fast-path/manifest.js.map +1 -1
  132. package/dist/fast-path/policy.d.ts.map +1 -1
  133. package/dist/fast-path/policy.js +3 -0
  134. package/dist/fast-path/policy.js.map +1 -1
  135. package/dist/manifest-compact.txt +1 -1
  136. package/dist/manifest.json +6804 -1002
  137. package/dist/registry.d.ts +2 -0
  138. package/dist/registry.d.ts.map +1 -1
  139. package/dist/registry.js +1 -0
  140. package/dist/registry.js.map +1 -1
  141. package/dist/types/scholarly.d.ts +19 -4
  142. package/dist/types/scholarly.d.ts.map +1 -1
  143. package/dist/types/scholarly.js +4 -4
  144. package/dist/types.d.ts +8 -0
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js.map +1 -1
  147. package/package.json +1 -1
  148. package/server.json +2 -2
  149. package/skills/unicli/SKILL.md +1 -1
  150. package/skills/unicli-claude-code/SKILL.md +1 -1
  151. package/skills/unicli-hermes/SKILL.md +1 -1
  152. package/src/adapters/acl-anthology/papers.test.ts +111 -0
  153. package/src/adapters/acl-anthology/papers.ts +379 -71
  154. package/src/adapters/arxiv/papers.test.ts +46 -0
  155. package/src/adapters/arxiv/papers.ts +251 -4
  156. package/src/adapters/baidu-scholar/search.ts +74 -11
  157. package/src/adapters/biorxiv/preprints.ts +112 -0
  158. package/src/adapters/cnki/search.ts +357 -0
  159. package/src/adapters/cvf/papers.ts +260 -27
  160. package/src/adapters/dblp/publications.test.ts +9 -0
  161. package/src/adapters/dblp/publications.ts +31 -8
  162. package/src/adapters/google-scholar/search.ts +165 -17
  163. package/src/adapters/hf/paper.test.ts +23 -0
  164. package/src/adapters/hf/paper.ts +89 -5
  165. package/src/adapters/hf/top.yaml +34 -2
  166. package/src/adapters/huggingface-papers/daily.yaml +37 -3
  167. package/src/adapters/huggingface-papers/search.yaml +43 -9
  168. package/src/adapters/medrxiv/preprints.ts +112 -0
  169. package/src/adapters/neurips/proceedings.ts +266 -22
  170. package/src/adapters/openalex/works.test.ts +15 -4
  171. package/src/adapters/openalex/works.ts +136 -8
  172. package/src/adapters/openreview/papers.test.ts +31 -0
  173. package/src/adapters/openreview/papers.ts +407 -29
  174. package/src/adapters/pmlr/proceedings.ts +102 -12
  175. package/src/adapters/pubmed/articles.test.ts +88 -1
  176. package/src/adapters/pubmed/articles.ts +343 -44
  177. package/src/adapters/rxiv/preprints.test.ts +233 -0
  178. package/src/adapters/rxiv/preprints.ts +849 -0
  179. package/src/adapters/scholar-artifacts/pdf-read.ts +277 -0
  180. package/src/adapters/scholar-artifacts/pdf.ts +133 -0
  181. package/src/adapters/semantic-scholar/papers.ts +98 -6
  182. package/src/adapters/unpaywall/works.ts +141 -12
  183. package/src/adapters/wanfang/search.ts +57 -7
  184. package/src/adapters/cnki/search.yaml +0 -49
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @owner src::adapters::cnki::search
3
+ * @does Registers CNKI Scholar title search against the current public KNS criteria endpoint.
4
+ * @needs scholar.cnki.net KNS criteria API, node:crypto, src/registry.ts, src/types/scholarly.ts
5
+ * @feeds `unicli cnki search`, src/commands/scholar.ts via scholar.search, scholar doctor live probes
6
+ * @breaks CNKI token/request-shape drift surfaces as upstream_error; access-controlled PDF/order URLs are exposed as relation hints, not as a scholar.pdf guarantee.
7
+ * @invariants Search uses CNKI's current all-database class id; rows must carry source-local id/title/source_adapter/retrieved_at; no stale API fallback is kept.
8
+ * @side-effects HTTPS egress to scholar.cnki.net only
9
+ * @perf O(limit) JSON mapping after one POST request.
10
+ * @concurrency safe
11
+ * @test tests/unit/adapters/scholar-sources.test.ts; live smoke via `unicli cnki search <query>` and `unicli scholar doctor --sources cnki --live`
12
+ * @stability experimental
13
+ * @since 2026-06-27
14
+ */
15
+ import { createCipheriv } from "node:crypto";
16
+ import { cli, Strategy } from "../../registry.js";
17
+ const CNKI_QUERY_API = "https://scholar.cnki.net/restapi/kns8s-api/v2/criteria/query";
18
+ const CNKI_TOKEN_SECRET = "cf4e8f25360248f89248af06a55d21ea";
19
+ const CNKI_CLIENT_ID = "c5fd4ef0-d314-4888-b0a7-f6190eaefaf0";
20
+ const CNKI_ALL_DATABASE_CLASS_ID = "WD0FTY92";
21
+ const CNKI_REFERER = "https://scholar.cnki.net/";
22
+ const MAX_LIMIT = 50;
23
+ function str(value) {
24
+ return typeof value === "string" ? value.trim() : "";
25
+ }
26
+ function stripHtml(value) {
27
+ return str(value)
28
+ .replace(/<[^>]*>/g, "")
29
+ .replace(/&nbsp;/g, " ")
30
+ .replace(/&amp;/g, "&")
31
+ .replace(/&lt;/g, "<")
32
+ .replace(/&gt;/g, ">")
33
+ .replace(/&quot;/g, '"')
34
+ .replace(/&#39;/g, "'")
35
+ .replace(/\s+/g, " ")
36
+ .trim();
37
+ }
38
+ function metadataValue(row, name) {
39
+ const entry = row.metadata?.find((candidate) => str(candidate.name).toUpperCase() === name);
40
+ return stripHtml(entry?.value);
41
+ }
42
+ function relationUrl(relations, scope) {
43
+ const found = relations?.find((relation) => str(relation.scope).toUpperCase() === scope);
44
+ return str(found?.url);
45
+ }
46
+ function firstRelationUrl(row, scopes) {
47
+ for (const scope of scopes) {
48
+ const rowUrl = relationUrl(row.relations, scope);
49
+ if (rowUrl)
50
+ return rowUrl;
51
+ const sourceUrl = relationUrl(row.source?.relations, scope);
52
+ if (sourceUrl)
53
+ return sourceUrl;
54
+ }
55
+ return "";
56
+ }
57
+ function parseYear(value) {
58
+ const year = Number(value.match(/(?:19|20)\d{2}/)?.[0]);
59
+ return Number.isInteger(year) ? year : undefined;
60
+ }
61
+ function splitMetadataAuthors(value) {
62
+ return value
63
+ .split(/[;;]/)
64
+ .map((author) => author.trim())
65
+ .filter(Boolean);
66
+ }
67
+ function cnkiError(message, code = "upstream_error") {
68
+ const error = new Error(message);
69
+ error.code = code;
70
+ error.suggestion =
71
+ "CNKI changed or rejected the public KNS criteria query. Run `unicli describe cnki search`, then inspect scholar.cnki.net's current search request before changing the adapter.";
72
+ error.retryable = false;
73
+ return error;
74
+ }
75
+ export function createCnkiVvToken(timestamp = Date.now()) {
76
+ const cipher = createCipheriv("aes-256-ecb", Buffer.from(CNKI_TOKEN_SECRET, "utf8"), null);
77
+ cipher.setAutoPadding(true);
78
+ return Buffer.concat([
79
+ cipher.update(JSON.stringify({ timestamp }), "utf8"),
80
+ cipher.final(),
81
+ ]).toString("hex");
82
+ }
83
+ export function buildCnkiSearchPayload(query, limit) {
84
+ return {
85
+ Resource: "",
86
+ Classid: CNKI_ALL_DATABASE_CLASS_ID,
87
+ Products: "",
88
+ KuaKuCode: "",
89
+ QNode: {
90
+ QGroup: [
91
+ {
92
+ Key: "",
93
+ Title: "",
94
+ Logic: 0,
95
+ Items: [],
96
+ ChildItems: [
97
+ {
98
+ Key: "subject",
99
+ Title: "",
100
+ Logic: 0,
101
+ Items: [
102
+ {
103
+ Key: "",
104
+ Title: "题名",
105
+ Logic: 0,
106
+ Field: "TI",
107
+ Operator: "FUZZY",
108
+ Value: query,
109
+ },
110
+ ],
111
+ ChildItems: [],
112
+ },
113
+ ],
114
+ },
115
+ ],
116
+ },
117
+ ExScope: "1",
118
+ SearchType: 2,
119
+ SearchFrom: 1,
120
+ Rlang: "",
121
+ sort: "PT",
122
+ sortType: "DESC",
123
+ pageNum: 1,
124
+ pageSize: limit,
125
+ };
126
+ }
127
+ export function mapCnkiSearchRow(row, rank) {
128
+ const title = metadataValue(row, "TI") || metadataValue(row, "ENTI");
129
+ const doi = metadataValue(row, "DOI").replace(/^doi:/i, "");
130
+ const date = metadataValue(row, "PT");
131
+ const source = metadataValue(row, "LY") || stripHtml(row.source?.title);
132
+ const authorNames = row.authors?.map((author) => stripHtml(author.title)).filter(Boolean) ?? [];
133
+ const authors = authorNames.length
134
+ ? authorNames
135
+ : splitMetadataAuthors(metadataValue(row, "AU"));
136
+ const sourceUrl = firstRelationUrl(row, ["ABSTRACT", "PUBLICATION"]);
137
+ const pdfUrl = firstRelationUrl(row, ["PDF"]);
138
+ const id = metadataValue(row, "ID") ||
139
+ metadataValue(row, "FN") ||
140
+ doi ||
141
+ sourceUrl ||
142
+ title;
143
+ if (!id || !title) {
144
+ throw cnkiError("CNKI returned a row without a stable id or title.");
145
+ }
146
+ const citedByCount = Number(metadataValue(row, "CF"));
147
+ return {
148
+ id,
149
+ rank,
150
+ title,
151
+ authors,
152
+ year: parseYear(date) ?? parseYear(str(row.source?.year)),
153
+ date: date || undefined,
154
+ venue: source || undefined,
155
+ type: metadataValue(row, "DB") || stripHtml(row.source?.type) || undefined,
156
+ abstract: metadataValue(row, "AB") || undefined,
157
+ doi: doi || undefined,
158
+ cited_by_count: Number.isFinite(citedByCount) ? citedByCount : undefined,
159
+ pdf_url: pdfUrl || undefined,
160
+ landing_url: sourceUrl || undefined,
161
+ source_adapter: "cnki",
162
+ source_url: sourceUrl || undefined,
163
+ retrieved_at: new Date().toISOString(),
164
+ };
165
+ }
166
+ async function fetchCnkiSearch(payload) {
167
+ const url = new URL(CNKI_QUERY_API);
168
+ url.searchParams.set("vv", createCnkiVvToken());
169
+ url.searchParams.set("clientId", CNKI_CLIENT_ID);
170
+ const response = await fetch(url, {
171
+ method: "POST",
172
+ headers: {
173
+ Accept: "application/json, text/plain, */*",
174
+ "Content-Type": "application/json;charset=UTF-8",
175
+ Origin: "https://scholar.cnki.net",
176
+ Referer: CNKI_REFERER,
177
+ "User-Agent": "Mozilla/5.0 (compatible; Uni-CLI/1.0; +https://github.com/olo-dot-io/Uni-CLI)",
178
+ Version: "",
179
+ },
180
+ body: JSON.stringify(payload),
181
+ });
182
+ if (!response.ok) {
183
+ throw cnkiError(`CNKI search returned HTTP ${response.status}.`);
184
+ }
185
+ const json = (await response.json());
186
+ const code = Number(json.code);
187
+ if (code !== 0) {
188
+ throw cnkiError(`CNKI search returned code ${String(json.code)}: ${str(json.message)}`);
189
+ }
190
+ return json;
191
+ }
192
+ cli({
193
+ site: "cnki",
194
+ name: "search",
195
+ description: "Search CNKI academic papers by title",
196
+ domain: "scholar.cnki.net",
197
+ strategy: Strategy.PUBLIC,
198
+ adapter_path: "src/adapters/cnki/search.ts",
199
+ args: [
200
+ { name: "query", type: "str", required: true, positional: true },
201
+ { name: "limit", type: "int", default: 20 },
202
+ ],
203
+ columns: [
204
+ "rank",
205
+ "id",
206
+ "title",
207
+ "authors",
208
+ "venue",
209
+ "year",
210
+ "doi",
211
+ "cited_by_count",
212
+ "pdf_url",
213
+ "source_url",
214
+ ],
215
+ capabilities: ["http.fetch", "scholar.search"],
216
+ func: async (_page, kwargs) => {
217
+ const query = str(kwargs.query);
218
+ if (!query) {
219
+ const error = new Error("cnki search query cannot be empty.");
220
+ error.code = "invalid_input";
221
+ error.suggestion =
222
+ "Pass a CNKI title keyword, for example `unicli cnki search 人工智能`.";
223
+ error.retryable = false;
224
+ throw error;
225
+ }
226
+ const requestedLimit = Number(kwargs.limit ?? 20);
227
+ const limit = Number.isFinite(requestedLimit)
228
+ ? Math.min(Math.max(Math.trunc(requestedLimit), 1), MAX_LIMIT)
229
+ : 20;
230
+ const payload = buildCnkiSearchPayload(query, limit);
231
+ const response = await fetchCnkiSearch(payload);
232
+ const rows = Array.isArray(response.data?.data) ? response.data.data : [];
233
+ return rows.map((row, index) => mapCnkiSearchRow(row, index + 1));
234
+ },
235
+ });
236
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/cnki/search.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,22 @@
1
1
  /**
2
2
  * @owner src::adapters::cvf::papers
3
- * @does Registers CVF OpenAccess conference paper search for CVPR/ICCV/ECCV-style proceedings pages.
4
- * @needs openaccess.thecvf.com static proceedings HTML, src/registry.ts
5
- * @feeds src/commands/scholar.ts via scholar.search, scholar.pdf, and scholar.venue
6
- * @breaks CVF markup drift surfaces as empty/parse errors rather than non-CVF fallbacks.
7
- * @invariants Venue/year map to explicit CVF event pages; PDF URLs are absolutized against openaccess.thecvf.com.
8
- * @side-effects HTTPS egress to openaccess.thecvf.com only
9
- * @perf O(N) over one proceedings HTML page
3
+ * @does Registers CVF OpenAccess conference paper search, detail retrieval, and PDF text reading for CVPR/ICCV/ECCV-style proceedings pages.
4
+ * @needs openaccess.thecvf.com static proceedings HTML/PDFs, src/adapters/scholar-artifacts/pdf-read.ts, src/registry.ts
5
+ * @feeds src/commands/scholar.ts via scholar.search, scholar.get, scholar.pdf, scholar.fulltext, and scholar.venue
6
+ * @breaks CVF markup/PDF drift, denied downloads, or missing pdftotext surface as explicit adapter errors rather than non-CVF fallbacks.
7
+ * @invariants Venue/year map to explicit CVF event pages; paper detail prefers citation_* metadata over scraped display blocks.
8
+ * @side-effects HTTPS egress to openaccess.thecvf.com; read writes one PDF artifact and executes pdftotext.
9
+ * @perf O(N) over one proceedings HTML page; read is O(PDF bytes + selected pages)
10
10
  * @concurrency safe
11
11
  * @test tests/unit/adapters/scholar-sources.test.ts
12
12
  * @stability experimental
13
13
  * @since 2026-05-19
14
14
  */
15
15
  import type { ScholarlyWorkRecord } from "../../types/scholarly.js";
16
+ export declare const CVF_HTTP_HEADERS: {
17
+ readonly Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
18
+ readonly "User-Agent": "unicli-cvf/1.0 (https://github.com/olo-dot-io/Uni-CLI)";
19
+ };
20
+ export declare function parseCvfPaperPage(html: string, sourceUrl: string): ScholarlyWorkRecord;
16
21
  export declare function parseCvfRows(html: string, event?: string): ScholarlyWorkRecord[];
17
22
  //# sourceMappingURL=papers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"papers.d.ts","sourceRoot":"","sources":["../../../src/adapters/cvf/papers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAgCpE,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,SAAa,GACjB,mBAAmB,EAAE,CAmCvB"}
1
+ {"version":3,"file":"papers.d.ts","sourceRoot":"","sources":["../../../src/adapters/cvf/papers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAOpE,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAiGX,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,mBAAmB,CAsCrB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,SAAa,GACjB,mBAAmB,EAAE,CA2BvB"}
@@ -1,19 +1,27 @@
1
1
  /**
2
2
  * @owner src::adapters::cvf::papers
3
- * @does Registers CVF OpenAccess conference paper search for CVPR/ICCV/ECCV-style proceedings pages.
4
- * @needs openaccess.thecvf.com static proceedings HTML, src/registry.ts
5
- * @feeds src/commands/scholar.ts via scholar.search, scholar.pdf, and scholar.venue
6
- * @breaks CVF markup drift surfaces as empty/parse errors rather than non-CVF fallbacks.
7
- * @invariants Venue/year map to explicit CVF event pages; PDF URLs are absolutized against openaccess.thecvf.com.
8
- * @side-effects HTTPS egress to openaccess.thecvf.com only
9
- * @perf O(N) over one proceedings HTML page
3
+ * @does Registers CVF OpenAccess conference paper search, detail retrieval, and PDF text reading for CVPR/ICCV/ECCV-style proceedings pages.
4
+ * @needs openaccess.thecvf.com static proceedings HTML/PDFs, src/adapters/scholar-artifacts/pdf-read.ts, src/registry.ts
5
+ * @feeds src/commands/scholar.ts via scholar.search, scholar.get, scholar.pdf, scholar.fulltext, and scholar.venue
6
+ * @breaks CVF markup/PDF drift, denied downloads, or missing pdftotext surface as explicit adapter errors rather than non-CVF fallbacks.
7
+ * @invariants Venue/year map to explicit CVF event pages; paper detail prefers citation_* metadata over scraped display blocks.
8
+ * @side-effects HTTPS egress to openaccess.thecvf.com; read writes one PDF artifact and executes pdftotext.
9
+ * @perf O(N) over one proceedings HTML page; read is O(PDF bytes + selected pages)
10
10
  * @concurrency safe
11
11
  * @test tests/unit/adapters/scholar-sources.test.ts
12
12
  * @stability experimental
13
13
  * @since 2026-05-19
14
14
  */
15
15
  import { cli, Strategy } from "../../registry.js";
16
+ import { readScholarPdf } from "../scholar-artifacts/pdf-read.js";
17
+ import { Agent, request } from "undici";
16
18
  const ORIGIN = "https://openaccess.thecvf.com";
19
+ const CVF_USER_AGENT = "unicli-cvf/1.0 (https://github.com/olo-dot-io/Uni-CLI)";
20
+ const CVF_HTTP_AGENT = new Agent({ connect: { timeout: 30_000 } });
21
+ export const CVF_HTTP_HEADERS = {
22
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
23
+ "User-Agent": CVF_USER_AGENT,
24
+ };
17
25
  function decode(value) {
18
26
  return value
19
27
  .replace(/&amp;/g, "&")
@@ -29,6 +37,21 @@ function absolute(path) {
29
37
  ? path
30
38
  : `${ORIGIN}${path.startsWith("/") ? "" : "/"}${path}`;
31
39
  }
40
+ function metaContents(html, name) {
41
+ const values = [];
42
+ const re = new RegExp(`<meta\\s+name=["']${name}["']\\s+content=["']([^"']*)["'][^>]*>`, "gi");
43
+ let match;
44
+ while ((match = re.exec(html)) !== null)
45
+ values.push(decode(match[1]));
46
+ return values;
47
+ }
48
+ function firstMetaContent(html, name) {
49
+ return metaContents(html, name)[0] ?? "";
50
+ }
51
+ function parseYear(value) {
52
+ const year = value.match(/\d{4}/)?.[0];
53
+ return year ? Number(year) : undefined;
54
+ }
32
55
  function eventId(venue, year) {
33
56
  const v = String(venue ?? "CVPR")
34
57
  .trim()
@@ -40,6 +63,69 @@ function eventId(venue, year) {
40
63
  throw new Error(`cvf year "${y}" is not valid.`);
41
64
  return `${v}${y}`;
42
65
  }
66
+ function requireCvfPaperId(value) {
67
+ const raw = String(value ?? "").trim();
68
+ const id = raw.match(/\/html\/([^/?#]+\.html)/)?.[1]?.replace(/\.html$/, "") ??
69
+ raw.replace(/\.html$/, "");
70
+ if (!/^[A-Za-z0-9_.-]+$/.test(id)) {
71
+ throw new Error(`CVF paper id "${raw}" is not valid.`);
72
+ }
73
+ return id;
74
+ }
75
+ function paperUrl(id, event) {
76
+ return `${ORIGIN}/content/${event}/html/${id}.html`;
77
+ }
78
+ function cvfUpstreamError(label, detail) {
79
+ const error = new Error(`${label} failed: ${detail}.`);
80
+ error.code = "upstream_error";
81
+ error.suggestion =
82
+ "CVF OpenAccess did not return the expected public proceedings page on this network path; retry later or verify the official openaccess.thecvf.com page manually.";
83
+ error.retryable =
84
+ /fetch failed|timeout|ECONNRESET|ETIMEDOUT|HTTP (429|5\d\d)/i.test(detail);
85
+ error.alternatives = [];
86
+ return error;
87
+ }
88
+ function parseListAuthors(block) {
89
+ const beforeLinks = block.split(/\[<a\s+href=/i)[0] ?? block;
90
+ const dd = beforeLinks.match(/<dd>([\s\S]*?)(?:<\/dd>|$)/i)?.[1] ?? "";
91
+ const text = decode(dd.replace(/<div class="bibref[\s\S]*$/i, " ").replace(/<[^>]+>/g, " "));
92
+ const authors = text
93
+ .replace(/;\s*Proceedings[\s\S]*$/i, "")
94
+ .split(",")
95
+ .map((author) => author.trim())
96
+ .filter(Boolean);
97
+ return authors.length > 0 ? authors : undefined;
98
+ }
99
+ export function parseCvfPaperPage(html, sourceUrl) {
100
+ const title = firstMetaContent(html, "citation_title") ||
101
+ decode(html
102
+ .match(/<div id="papertitle">([\s\S]*?)<dd>/i)?.[1]
103
+ ?.replace(/<[^>]+>/g, " ") ?? "");
104
+ if (!title)
105
+ throw new Error("CVF paper page did not expose a title.");
106
+ const event = sourceUrl.match(/\/content\/([A-Z]+\d{4})\//)?.[1] ?? undefined;
107
+ const id = sourceUrl
108
+ .split("/")
109
+ .pop()
110
+ ?.replace(/\.html$/, "") ?? title;
111
+ const pdfUrl = firstMetaContent(html, "citation_pdf_url") ||
112
+ html.match(/<a href="([^"]+\.pdf)">pdf<\/a>/i)?.[1] ||
113
+ "";
114
+ return {
115
+ id,
116
+ title,
117
+ authors: metaContents(html, "citation_author"),
118
+ year: parseYear(firstMetaContent(html, "citation_publication_date")) ??
119
+ (event ? Number(event.slice(-4)) : undefined),
120
+ venue: firstMetaContent(html, "citation_conference_title") ||
121
+ event?.replace(/\d{4}$/, ""),
122
+ abstract: decode(html.match(/<div id="abstract">([\s\S]*?)<\/div>/i)?.[1] ?? "").replace(/<[^>]+>/g, " ") || undefined,
123
+ pdf_url: pdfUrl ? absolute(pdfUrl) : undefined,
124
+ source_adapter: "cvf",
125
+ source_url: sourceUrl,
126
+ retrieved_at: new Date().toISOString(),
127
+ };
128
+ }
43
129
  export function parseCvfRows(html, event = "CVPR2024") {
44
130
  const out = [];
45
131
  const re = /<dt class="ptitle">[\s\S]*?<a href="([^"]+)">([\s\S]*?)<\/a><\/dt>([\s\S]*?)(?=<dt class="ptitle">|$)/g;
@@ -49,21 +135,13 @@ export function parseCvfRows(html, event = "CVPR2024") {
49
135
  const title = decode(match[2].replace(/<[^>]+>/g, " "));
50
136
  const block = match[3];
51
137
  const pdf = block.match(/<a href="([^"]+\.pdf)">pdf<\/a>/i)?.[1] ?? "";
52
- const authorText = block
53
- .replace(/\[[\s\S]*?\]/g, " ")
54
- .replace(/<form[\s\S]*?<\/form>/g, " ")
55
- .replace(/<[^>]+>/g, " ");
56
- const authors = decode(authorText)
57
- .split(",")
58
- .map((author) => author.trim())
59
- .filter(Boolean);
60
138
  out.push({
61
139
  id: sourceUrl
62
140
  .split("/")
63
141
  .pop()
64
142
  ?.replace(/\.html$/, "") ?? title,
65
143
  title,
66
- authors: authors.length > 0 ? authors : undefined,
144
+ authors: parseListAuthors(block),
67
145
  year: Number(event.slice(-4)),
68
146
  venue: event.replace(/\d{4}$/, ""),
69
147
  pdf_url: pdf ? absolute(pdf) : undefined,
@@ -74,6 +152,45 @@ export function parseCvfRows(html, event = "CVPR2024") {
74
152
  }
75
153
  return out;
76
154
  }
155
+ async function fetchCvfHtml(url, label) {
156
+ let response;
157
+ try {
158
+ response = await request(url, {
159
+ dispatcher: CVF_HTTP_AGENT,
160
+ headers: CVF_HTTP_HEADERS,
161
+ });
162
+ }
163
+ catch (error) {
164
+ throw cvfUpstreamError(label, error instanceof Error ? error.message : String(error));
165
+ }
166
+ if (response.statusCode === 404)
167
+ throw new Error(`${label} returned no page.`);
168
+ if (response.statusCode < 200 || response.statusCode >= 300) {
169
+ throw cvfUpstreamError(label, `HTTP ${response.statusCode}`);
170
+ }
171
+ return response.body.text();
172
+ }
173
+ async function readCvfPaperPdf(row, kwargs) {
174
+ if (!row.pdf_url)
175
+ throw new Error(`CVF paper ${row.id} has no PDF URL.`);
176
+ return readScholarPdf({
177
+ id: row.id,
178
+ title: row.title,
179
+ source_adapter: "cvf",
180
+ source_url: row.source_url,
181
+ pdf_url: row.pdf_url,
182
+ output: kwargs.output,
183
+ filename: kwargs.filename,
184
+ "first-page": kwargs["first-page"] ?? kwargs.firstPage,
185
+ "last-page": kwargs["last-page"] ?? kwargs.lastPage,
186
+ "max-chars": kwargs["max-chars"] ?? kwargs.maxChars,
187
+ }, {
188
+ site: "cvf",
189
+ command: "read",
190
+ defaultOutput: "./cvf-downloads",
191
+ userAgent: CVF_USER_AGENT,
192
+ });
193
+ }
77
194
  cli({
78
195
  site: "cvf",
79
196
  name: "search",
@@ -100,18 +217,8 @@ cli({
100
217
  if (!query)
101
218
  throw new Error("cvf search query cannot be empty.");
102
219
  const event = eventId(kwargs.venue, kwargs.year);
103
- const response = await fetch(`${ORIGIN}/${event}?day=all`, {
104
- headers: {
105
- Accept: "*/*",
106
- "User-Agent": "unicli-cvf/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
107
- },
108
- });
109
- if (response.status === 404)
110
- throw new Error(`CVF ${event} returned no proceedings page.`);
111
- if (!response.ok)
112
- throw new Error(`CVF ${event} returned HTTP ${response.status}.`);
113
220
  const limit = Math.min(Math.max(Number(kwargs.limit ?? 20), 1), 200);
114
- const rows = parseCvfRows(await response.text(), event)
221
+ const rows = parseCvfRows(await fetchCvfHtml(`${ORIGIN}/${event}?day=all`, `CVF ${event}`), event)
115
222
  .filter((row) => `${row.title} ${row.authors?.join(" ") ?? ""}`
116
223
  .toLowerCase()
117
224
  .includes(query))
@@ -121,4 +228,80 @@ cli({
121
228
  return rows;
122
229
  },
123
230
  });
231
+ cli({
232
+ site: "cvf",
233
+ name: "paper",
234
+ description: "Fetch CVF OpenAccess paper metadata by page id",
235
+ domain: "openaccess.thecvf.com",
236
+ strategy: Strategy.PUBLIC,
237
+ args: [
238
+ { name: "id", type: "str", required: true, positional: true },
239
+ { name: "venue", type: "str", default: "CVPR" },
240
+ { name: "year", type: "str", default: "2024" },
241
+ ],
242
+ columns: ["id", "title", "authors", "year", "venue", "pdf_url", "source_url"],
243
+ capabilities: ["http.fetch", "scholar.get", "scholar.pdf"],
244
+ func: async (_page, kwargs) => {
245
+ const event = eventId(kwargs.venue, kwargs.year);
246
+ const id = requireCvfPaperId(kwargs.id ?? kwargs.ref);
247
+ const url = paperUrl(id, event);
248
+ return [parseCvfPaperPage(await fetchCvfHtml(url, `CVF paper ${id}`), url)];
249
+ },
250
+ });
251
+ cli({
252
+ site: "cvf",
253
+ name: "read",
254
+ description: "Download a CVF OpenAccess paper PDF by page id and extract text",
255
+ domain: "openaccess.thecvf.com",
256
+ strategy: Strategy.PUBLIC,
257
+ args: [
258
+ { name: "id", type: "str", required: true, positional: true },
259
+ { name: "venue", type: "str", default: "CVPR" },
260
+ { name: "year", type: "str", default: "2024" },
261
+ {
262
+ name: "output",
263
+ type: "str",
264
+ default: "./cvf-downloads",
265
+ description: "Output directory for the downloaded PDF",
266
+ "x-unicli-kind": "path",
267
+ },
268
+ { name: "filename", type: "str", description: "Output PDF filename" },
269
+ { name: "first-page", type: "int", default: 1, description: "First page" },
270
+ { name: "last-page", type: "int", default: 20, description: "Last page" },
271
+ {
272
+ name: "max-chars",
273
+ type: "int",
274
+ default: 40000,
275
+ description: "Maximum extracted text characters",
276
+ },
277
+ ],
278
+ columns: [
279
+ "id",
280
+ "title",
281
+ "source_adapter",
282
+ "source_url",
283
+ "pdf_url",
284
+ "path",
285
+ "text_source",
286
+ "text",
287
+ "text_chars",
288
+ "text_truncated",
289
+ ],
290
+ capabilities: [
291
+ "http.fetch",
292
+ "http.download",
293
+ "subprocess.exec",
294
+ "scholar.fulltext",
295
+ "scholar.pdf",
296
+ ],
297
+ executables: ["pdftotext"],
298
+ minimum_capability: "subprocess.exec",
299
+ func: async (_page, kwargs) => {
300
+ const event = eventId(kwargs.venue, kwargs.year);
301
+ const id = requireCvfPaperId(kwargs.id ?? kwargs.ref);
302
+ const url = paperUrl(id, event);
303
+ const row = parseCvfPaperPage(await fetchCvfHtml(url, `CVF paper ${id}`), url);
304
+ return [await readCvfPaperPdf(row, kwargs)];
305
+ },
306
+ });
124
307
  //# sourceMappingURL=papers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"papers.js","sourceRoot":"","sources":["../../../src/adapters/cvf/papers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"papers.js","sourceRoot":"","sources":["../../../src/adapters/cvf/papers.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
1
1
  /**
2
- * @owner src/adapters/dblp/publications.ts
3
- * @does Register agent-facing dblp publication, author, paper, and venue commands.
4
- * @needs dblp public JSON/XML APIs, conservative XML field extraction, bounded result limits.
5
- * @feeds surface coverage ledger, scholarly search surface, CS bibliography inspection.
6
- * @breaks dblp API envelope drift, record-key parsing, or silent empty rows hide bibliography lookup failures.
2
+ * @owner src::adapters::dblp::publications
3
+ * @does Registers DBLP publication, paper, author, and venue commands for computer-science bibliography discovery.
4
+ * @needs dblp public JSON/XML APIs, conservative XML field extraction, bounded result limits, src/registry.ts
5
+ * @feeds src/commands/scholar.ts via scholar.search, scholar.get, scholar.pdf, scholar.author, and scholar.venue
6
+ * @breaks DBLP API envelope drift, record-key parsing drift, or missing normalized ids makes CS bibliography rows invisible to the scholar meta-command.
7
+ * @invariants DBLP `key` is the source-local scholarly id and is mirrored as `dblp_key`; DOI remains a separate cross-source dedupe key.
8
+ * @side-effects HTTPS egress to dblp.org only
9
+ * @perf O(limit) JSON/XML mapping after one DBLP API request per command
10
+ * @concurrency safe
11
+ * @test src/adapters/dblp/publications.test.ts; live smoke via `unicli dblp search <query>` and `unicli scholar doctor --sources dblp --live`
12
+ * @stability experimental
13
+ * @since 2026-05-19
7
14
  */
8
15
  interface DblpAuthorField {
9
16
  author?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../../../src/adapters/dblp/publications.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,OAAO;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,MAAM,CAIxE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOvD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAaxD;AAuBD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,EAAE,CAiBpE;AAWD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM7D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AA4BD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BjE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASxD"}
1
+ {"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../../../src/adapters/dblp/publications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,OAAO;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,MAAM,CAIxE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOvD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAaxD;AAuBD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,EAAE,CAiBpE;AAWD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM7D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AA4BD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCjE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASxD"}