@react-x11/components 0.8.0 → 0.9.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.
Files changed (323) hide show
  1. package/README.md +95 -34
  2. package/dist/charts/node.d.ts +1 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +6 -2
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/embed/client.d.ts +48 -3
  7. package/dist/embed/client.d.ts.map +1 -1
  8. package/dist/embed/client.js +79 -5
  9. package/dist/embed/client.js.map +1 -1
  10. package/dist/embed/index.d.ts +1 -1
  11. package/dist/embed/index.d.ts.map +1 -1
  12. package/dist/embed/index.js +1 -1
  13. package/dist/embed/index.js.map +1 -1
  14. package/dist/html/node.d.ts +3 -1
  15. package/dist/html/node.d.ts.map +1 -1
  16. package/dist/html/node.js +7 -5
  17. package/dist/html/node.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
  23. package/dist/internal/markdown/ast.d.ts.map +1 -0
  24. package/dist/internal/markdown/ast.js +22 -0
  25. package/dist/internal/markdown/ast.js.map +1 -0
  26. package/dist/internal/markdown/parse.d.ts.map +1 -0
  27. package/dist/{markdown → internal/markdown}/parse.js +112 -22
  28. package/dist/internal/markdown/parse.js.map +1 -0
  29. package/dist/internal/markdown/stringify.d.ts +4 -0
  30. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  31. package/dist/internal/markdown/stringify.js +684 -0
  32. package/dist/internal/markdown/stringify.js.map +1 -0
  33. package/dist/internal/markdown/tags.d.ts.map +1 -0
  34. package/dist/internal/markdown/tags.js.map +1 -0
  35. package/dist/internal/scroll.d.ts +3 -2
  36. package/dist/internal/scroll.d.ts.map +1 -1
  37. package/dist/internal/scroll.js +1 -0
  38. package/dist/internal/scroll.js.map +1 -1
  39. package/dist/maps/anchors.d.ts +98 -0
  40. package/dist/maps/anchors.d.ts.map +1 -0
  41. package/dist/maps/anchors.js +531 -0
  42. package/dist/maps/anchors.js.map +1 -0
  43. package/dist/maps/controller.d.ts +283 -0
  44. package/dist/maps/controller.d.ts.map +1 -0
  45. package/dist/maps/controller.js +743 -0
  46. package/dist/maps/controller.js.map +1 -0
  47. package/dist/maps/gl/buckets.d.ts +95 -0
  48. package/dist/maps/gl/buckets.d.ts.map +1 -0
  49. package/dist/maps/gl/buckets.js +362 -0
  50. package/dist/maps/gl/buckets.js.map +1 -0
  51. package/dist/maps/gl/build-worker.d.ts +13 -0
  52. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  53. package/dist/maps/gl/build-worker.js +44 -0
  54. package/dist/maps/gl/build-worker.js.map +1 -0
  55. package/dist/maps/gl/color.d.ts +8 -0
  56. package/dist/maps/gl/color.d.ts.map +1 -0
  57. package/dist/maps/gl/color.js +57 -0
  58. package/dist/maps/gl/color.js.map +1 -0
  59. package/dist/maps/gl/cover.d.ts +51 -0
  60. package/dist/maps/gl/cover.d.ts.map +1 -0
  61. package/dist/maps/gl/cover.js +124 -0
  62. package/dist/maps/gl/cover.js.map +1 -0
  63. package/dist/maps/gl/index.d.ts +3 -0
  64. package/dist/maps/gl/index.d.ts.map +1 -0
  65. package/dist/maps/gl/index.js +20 -0
  66. package/dist/maps/gl/index.js.map +1 -0
  67. package/dist/maps/gl/markers.d.ts +28 -0
  68. package/dist/maps/gl/markers.d.ts.map +1 -0
  69. package/dist/maps/gl/markers.js +60 -0
  70. package/dist/maps/gl/markers.js.map +1 -0
  71. package/dist/maps/gl/overlays.d.ts +68 -0
  72. package/dist/maps/gl/overlays.d.ts.map +1 -0
  73. package/dist/maps/gl/overlays.js +300 -0
  74. package/dist/maps/gl/overlays.js.map +1 -0
  75. package/dist/maps/gl/pane.d.ts +12 -0
  76. package/dist/maps/gl/pane.d.ts.map +1 -0
  77. package/dist/maps/gl/pane.js +37 -0
  78. package/dist/maps/gl/pane.js.map +1 -0
  79. package/dist/maps/gl/placement.d.ts +111 -0
  80. package/dist/maps/gl/placement.d.ts.map +1 -0
  81. package/dist/maps/gl/placement.js +567 -0
  82. package/dist/maps/gl/placement.js.map +1 -0
  83. package/dist/maps/gl/renderer.d.ts +352 -0
  84. package/dist/maps/gl/renderer.d.ts.map +1 -0
  85. package/dist/maps/gl/renderer.js +1127 -0
  86. package/dist/maps/gl/renderer.js.map +1 -0
  87. package/dist/maps/gl/shaders.d.ts +120 -0
  88. package/dist/maps/gl/shaders.d.ts.map +1 -0
  89. package/dist/maps/gl/shaders.js +451 -0
  90. package/dist/maps/gl/shaders.js.map +1 -0
  91. package/dist/maps/gl/store.d.ts +115 -0
  92. package/dist/maps/gl/store.d.ts.map +1 -0
  93. package/dist/maps/gl/store.js +469 -0
  94. package/dist/maps/gl/store.js.map +1 -0
  95. package/dist/maps/gl/text.d.ts +154 -0
  96. package/dist/maps/gl/text.d.ts.map +1 -0
  97. package/dist/maps/gl/text.js +382 -0
  98. package/dist/maps/gl/text.js.map +1 -0
  99. package/dist/maps/gl/view.d.ts +54 -0
  100. package/dist/maps/gl/view.d.ts.map +1 -0
  101. package/dist/maps/gl/view.js +974 -0
  102. package/dist/maps/gl/view.js.map +1 -0
  103. package/dist/maps/index.d.ts +1 -1
  104. package/dist/maps/index.d.ts.map +1 -1
  105. package/dist/maps/index.js +216 -52
  106. package/dist/maps/index.js.map +1 -1
  107. package/dist/maps/labels.d.ts +37 -16
  108. package/dist/maps/labels.d.ts.map +1 -1
  109. package/dist/maps/labels.js +188 -119
  110. package/dist/maps/labels.js.map +1 -1
  111. package/dist/maps/node.d.ts +162 -56
  112. package/dist/maps/node.d.ts.map +1 -1
  113. package/dist/maps/node.js +607 -515
  114. package/dist/maps/node.js.map +1 -1
  115. package/dist/maps/overlay.d.ts +72 -9
  116. package/dist/maps/overlay.d.ts.map +1 -1
  117. package/dist/maps/overlay.js +108 -28
  118. package/dist/maps/overlay.js.map +1 -1
  119. package/dist/maps/paint.d.ts +3 -0
  120. package/dist/maps/paint.d.ts.map +1 -1
  121. package/dist/maps/paint.js.map +1 -1
  122. package/dist/maps/proj.d.ts +14 -0
  123. package/dist/maps/proj.d.ts.map +1 -1
  124. package/dist/maps/proj.js +28 -0
  125. package/dist/maps/proj.js.map +1 -1
  126. package/dist/maps/renderer.d.ts +69 -0
  127. package/dist/maps/renderer.d.ts.map +1 -0
  128. package/dist/maps/renderer.js +66 -0
  129. package/dist/maps/renderer.js.map +1 -0
  130. package/dist/maps/sources.d.ts +25 -3
  131. package/dist/maps/sources.d.ts.map +1 -1
  132. package/dist/maps/sources.js +17 -0
  133. package/dist/maps/sources.js.map +1 -1
  134. package/dist/maps/theme.d.ts +19 -0
  135. package/dist/maps/theme.d.ts.map +1 -0
  136. package/dist/maps/theme.js +44 -0
  137. package/dist/maps/theme.js.map +1 -0
  138. package/dist/maps/tiles.d.ts +117 -17
  139. package/dist/maps/tiles.d.ts.map +1 -1
  140. package/dist/maps/tiles.js +163 -30
  141. package/dist/maps/tiles.js.map +1 -1
  142. package/dist/maps/types.d.ts +188 -20
  143. package/dist/maps/types.d.ts.map +1 -1
  144. package/dist/markdown/expressions.d.ts +1 -1
  145. package/dist/markdown/expressions.d.ts.map +1 -1
  146. package/dist/markdown/expressions.js.map +1 -1
  147. package/dist/markdown/index.d.ts +7 -6
  148. package/dist/markdown/index.d.ts.map +1 -1
  149. package/dist/markdown/index.js +9 -7
  150. package/dist/markdown/index.js.map +1 -1
  151. package/dist/markdown/spans.d.ts +1 -1
  152. package/dist/markdown/spans.d.ts.map +1 -1
  153. package/dist/media-player/index.d.ts +11 -3
  154. package/dist/media-player/index.d.ts.map +1 -1
  155. package/dist/media-player/index.js +13 -2
  156. package/dist/media-player/index.js.map +1 -1
  157. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  158. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  159. package/dist/rich-text-editor/clipboard.js +307 -0
  160. package/dist/rich-text-editor/clipboard.js.map +1 -0
  161. package/dist/rich-text-editor/collab.d.ts +32 -0
  162. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  163. package/dist/rich-text-editor/collab.js +55 -0
  164. package/dist/rich-text-editor/collab.js.map +1 -0
  165. package/dist/rich-text-editor/commands.d.ts +50 -0
  166. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  167. package/dist/rich-text-editor/commands.js +376 -0
  168. package/dist/rich-text-editor/commands.js.map +1 -0
  169. package/dist/rich-text-editor/drag.d.ts +68 -0
  170. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  171. package/dist/rich-text-editor/drag.js +148 -0
  172. package/dist/rich-text-editor/drag.js.map +1 -0
  173. package/dist/rich-text-editor/html.d.ts +145 -0
  174. package/dist/rich-text-editor/html.d.ts.map +1 -0
  175. package/dist/rich-text-editor/html.js +516 -0
  176. package/dist/rich-text-editor/html.js.map +1 -0
  177. package/dist/rich-text-editor/index.d.ts +263 -0
  178. package/dist/rich-text-editor/index.d.ts.map +1 -0
  179. package/dist/rich-text-editor/index.js +822 -0
  180. package/dist/rich-text-editor/index.js.map +1 -0
  181. package/dist/rich-text-editor/inline.d.ts +94 -0
  182. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  183. package/dist/rich-text-editor/inline.js +252 -0
  184. package/dist/rich-text-editor/inline.js.map +1 -0
  185. package/dist/rich-text-editor/keymap.d.ts +71 -0
  186. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  187. package/dist/rich-text-editor/keymap.js +393 -0
  188. package/dist/rich-text-editor/keymap.js.map +1 -0
  189. package/dist/rich-text-editor/keys.d.ts +29 -0
  190. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  191. package/dist/rich-text-editor/keys.js +93 -0
  192. package/dist/rich-text-editor/keys.js.map +1 -0
  193. package/dist/rich-text-editor/look.d.ts +71 -0
  194. package/dist/rich-text-editor/look.d.ts.map +1 -0
  195. package/dist/rich-text-editor/look.js +342 -0
  196. package/dist/rich-text-editor/look.js.map +1 -0
  197. package/dist/rich-text-editor/markdown.d.ts +18 -0
  198. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  199. package/dist/rich-text-editor/markdown.js +496 -0
  200. package/dist/rich-text-editor/markdown.js.map +1 -0
  201. package/dist/rich-text-editor/nodes.d.ts +135 -0
  202. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  203. package/dist/rich-text-editor/nodes.js +397 -0
  204. package/dist/rich-text-editor/nodes.js.map +1 -0
  205. package/dist/rich-text-editor/render.d.ts +68 -0
  206. package/dist/rich-text-editor/render.d.ts.map +1 -0
  207. package/dist/rich-text-editor/render.js +500 -0
  208. package/dist/rich-text-editor/render.js.map +1 -0
  209. package/dist/rich-text-editor/schema.d.ts +16 -0
  210. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  211. package/dist/rich-text-editor/schema.js +386 -0
  212. package/dist/rich-text-editor/schema.js.map +1 -0
  213. package/dist/rich-text-editor/store.d.ts +11 -0
  214. package/dist/rich-text-editor/store.d.ts.map +1 -0
  215. package/dist/rich-text-editor/store.js +43 -0
  216. package/dist/rich-text-editor/store.js.map +1 -0
  217. package/dist/rich-text-editor/suggest.d.ts +127 -0
  218. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  219. package/dist/rich-text-editor/suggest.js +0 -0
  220. package/dist/rich-text-editor/suggest.js.map +1 -0
  221. package/dist/rich-text-editor/tables.d.ts +41 -0
  222. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  223. package/dist/rich-text-editor/tables.js +204 -0
  224. package/dist/rich-text-editor/tables.js.map +1 -0
  225. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  226. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  227. package/dist/rich-text-editor/toolbar.js +548 -0
  228. package/dist/rich-text-editor/toolbar.js.map +1 -0
  229. package/dist/rich-text-editor/view.d.ts +368 -0
  230. package/dist/rich-text-editor/view.d.ts.map +1 -0
  231. package/dist/rich-text-editor/view.js +1968 -0
  232. package/dist/rich-text-editor/view.js.map +1 -0
  233. package/dist/rich-text-editor/virtual.d.ts +54 -0
  234. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  235. package/dist/rich-text-editor/virtual.js +262 -0
  236. package/dist/rich-text-editor/virtual.js.map +1 -0
  237. package/dist/richtext/node.d.ts +25 -2
  238. package/dist/richtext/node.d.ts.map +1 -1
  239. package/dist/richtext/node.js +46 -24
  240. package/dist/richtext/node.js.map +1 -1
  241. package/dist/terminal/backends.d.ts +4 -1
  242. package/dist/terminal/backends.d.ts.map +1 -1
  243. package/dist/terminal/backends.js.map +1 -1
  244. package/dist/terminal/index.d.ts +18 -7
  245. package/dist/terminal/index.d.ts.map +1 -1
  246. package/dist/terminal/index.js +28 -11
  247. package/dist/terminal/index.js.map +1 -1
  248. package/package.json +23 -4
  249. package/src/charts/node.ts +6 -2
  250. package/src/embed/client.ts +102 -8
  251. package/src/embed/index.ts +2 -0
  252. package/src/html/node.ts +7 -5
  253. package/src/index.ts +2 -0
  254. package/src/{markdown → internal/markdown}/ast.ts +24 -7
  255. package/src/{markdown → internal/markdown}/parse.ts +134 -24
  256. package/src/internal/markdown/stringify.ts +772 -0
  257. package/src/internal/scroll.ts +5 -3
  258. package/src/maps/anchors.ts +607 -0
  259. package/src/maps/controller.ts +999 -0
  260. package/src/maps/gl/buckets.ts +457 -0
  261. package/src/maps/gl/build-worker.ts +55 -0
  262. package/src/maps/gl/color.ts +62 -0
  263. package/src/maps/gl/cover.ts +170 -0
  264. package/src/maps/gl/index.ts +23 -0
  265. package/src/maps/gl/markers.ts +83 -0
  266. package/src/maps/gl/overlays.ts +379 -0
  267. package/src/maps/gl/pane.ts +42 -0
  268. package/src/maps/gl/placement.ts +816 -0
  269. package/src/maps/gl/renderer.ts +1576 -0
  270. package/src/maps/gl/shaders.ts +486 -0
  271. package/src/maps/gl/store.ts +566 -0
  272. package/src/maps/gl/text.ts +495 -0
  273. package/src/maps/gl/view.ts +1224 -0
  274. package/src/maps/index.ts +270 -81
  275. package/src/maps/labels.ts +214 -121
  276. package/src/maps/node.ts +763 -629
  277. package/src/maps/overlay.ts +148 -43
  278. package/src/maps/paint.ts +3 -0
  279. package/src/maps/proj.ts +31 -0
  280. package/src/maps/renderer.ts +155 -0
  281. package/src/maps/sources.ts +38 -3
  282. package/src/maps/theme.ts +51 -0
  283. package/src/maps/tiles.ts +191 -33
  284. package/src/maps/types.ts +188 -20
  285. package/src/markdown/expressions.ts +5 -1
  286. package/src/markdown/index.ts +14 -11
  287. package/src/markdown/spans.ts +1 -1
  288. package/src/media-player/index.ts +18 -4
  289. package/src/rich-text-editor/clipboard.ts +439 -0
  290. package/src/rich-text-editor/collab.ts +91 -0
  291. package/src/rich-text-editor/commands.ts +448 -0
  292. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  293. package/src/rich-text-editor/drag.ts +211 -0
  294. package/src/rich-text-editor/html.ts +619 -0
  295. package/src/rich-text-editor/index.ts +1331 -0
  296. package/src/rich-text-editor/inline.ts +345 -0
  297. package/src/rich-text-editor/keymap.ts +510 -0
  298. package/src/rich-text-editor/keys.ts +119 -0
  299. package/src/rich-text-editor/look.ts +427 -0
  300. package/src/rich-text-editor/markdown.ts +653 -0
  301. package/src/rich-text-editor/nodes.ts +497 -0
  302. package/src/rich-text-editor/render.ts +800 -0
  303. package/src/rich-text-editor/schema.ts +431 -0
  304. package/src/rich-text-editor/store.ts +39 -0
  305. package/src/rich-text-editor/suggest.ts +597 -0
  306. package/src/rich-text-editor/tables.ts +272 -0
  307. package/src/rich-text-editor/toolbar.ts +724 -0
  308. package/src/rich-text-editor/view.ts +2287 -0
  309. package/src/rich-text-editor/virtual.ts +347 -0
  310. package/src/richtext/node.ts +59 -30
  311. package/src/terminal/backends.ts +4 -1
  312. package/src/terminal/index.ts +43 -15
  313. package/dist/markdown/ast.d.ts.map +0 -1
  314. package/dist/markdown/ast.js +0 -17
  315. package/dist/markdown/ast.js.map +0 -1
  316. package/dist/markdown/parse.d.ts.map +0 -1
  317. package/dist/markdown/parse.js.map +0 -1
  318. package/dist/markdown/tags.d.ts.map +0 -1
  319. package/dist/markdown/tags.js.map +0 -1
  320. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  321. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  322. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  323. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -0,0 +1,57 @@
1
+ // CSS colours as the floats GL takes.
2
+ //
3
+ // A local parser rather than ntk's `cssColorStraight`: that one is exported
4
+ // by ntk at runtime but not declared by `react-x11/ntk`'s types, and a map
5
+ // style is written in the three forms below in practice — the default
6
+ // palettes use nothing else. An unknown colour is `null`, and the layer that
7
+ // asked for it draws nothing rather than drawing black.
8
+ const NAMED = {
9
+ transparent: [0, 0, 0, 0],
10
+ black: [0, 0, 0, 1],
11
+ white: [1, 1, 1, 1],
12
+ };
13
+ function hex(value) {
14
+ const h = value.slice(1);
15
+ if (!/^[0-9a-fA-F]+$/.test(h))
16
+ return null;
17
+ if (h.length === 3 || h.length === 4) {
18
+ const c = (i) => parseInt(h[i] + h[i], 16) / 255;
19
+ return [c(0), c(1), c(2), h.length === 4 ? c(3) : 1];
20
+ }
21
+ if (h.length === 6 || h.length === 8) {
22
+ const c = (i) => parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;
23
+ return [c(0), c(1), c(2), h.length === 8 ? c(3) : 1];
24
+ }
25
+ return null;
26
+ }
27
+ function functional(value) {
28
+ const m = /^rgba?\(([^)]*)\)$/i.exec(value);
29
+ if (!m)
30
+ return null;
31
+ const parts = m[1].split(/[\s,/]+/).filter(Boolean);
32
+ if (parts.length < 3)
33
+ return null;
34
+ const channel = (p) => p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p) / 255;
35
+ const alpha = (p) => p === undefined ? 1 : p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p);
36
+ const out = [
37
+ channel(parts[0]),
38
+ channel(parts[1]),
39
+ channel(parts[2]),
40
+ alpha(parts[3]),
41
+ ];
42
+ return out.every((c) => Number.isFinite(c)) ? out : null;
43
+ }
44
+ /** Parse `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` and `rgba()`. */
45
+ export function parseColor(value) {
46
+ const v = value.trim();
47
+ if (v.startsWith('#'))
48
+ return hex(v);
49
+ return NAMED[v.toLowerCase()] ?? functional(v);
50
+ }
51
+ /** Premultiplied, with an extra opacity folded in — what the renderer's
52
+ * `ONE, ONE_MINUS_SRC_ALPHA` blend wants. */
53
+ export function premultiplied(color, opacity = 1) {
54
+ const a = color[3] * opacity;
55
+ return [color[0] * a, color[1] * a, color[2] * a, a];
56
+ }
57
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/maps/gl/color.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { MapCamera, TileId, TilePyramid } from '../proj.js';
2
+ import type { GlTileData } from './buckets.js';
3
+ import type { RenderTile } from './renderer.js';
4
+ /** What the cover asks of a tile store: the tile's data, `null` when the
5
+ * source has no data there, `undefined` while it is still to come. */
6
+ export interface TileLookup {
7
+ get(tile: TileId): GlTileData | null | undefined;
8
+ }
9
+ export interface CoverResult {
10
+ tiles: RenderTile[];
11
+ /** Tiles the view wants and the store has not answered for yet — the
12
+ * padded ring around the view included, so a pan finds its tiles. */
13
+ missing: TileId[];
14
+ /** The pyramid level the view is drawn from. */
15
+ level: number;
16
+ /** Tiles of the view drawn from their own data, from an ancestor's, and
17
+ * from their children's — the retained renderer's `ready`,
18
+ * `fromAncestor` and `fromDescendant`. */
19
+ own: number;
20
+ ancestors: number;
21
+ descendants: number;
22
+ /** Tiles of the view, stand-ins or not: its cover, less the padded ring. */
23
+ inView: TileId[];
24
+ }
25
+ /**
26
+ * The frame's tiles, centre-out, each with its screen square and its clip.
27
+ *
28
+ * A hole — a tile still loading, or one the source has no data for — is
29
+ * covered from whichever side has geometry: the nearest ancestor, drawn at
30
+ * its own larger size and clipped to the hole; or, zooming out, the four
31
+ * children, when all of them are in hand. `AGENTS.md`'s rule for the
32
+ * retained cache holds here too: a pyramid has two neighbours.
33
+ */
34
+ export declare function renderCover(camera: MapCamera, pane: {
35
+ width: number;
36
+ height: number;
37
+ }, scale: number, pyramid: TilePyramid, lookup: TileLookup, options?: {
38
+ /**
39
+ * Draw the view from this pyramid level rather than the one its zoom
40
+ * picks — the level being faded out, or a coarser one while adaptive
41
+ * quality is saving work. Holes still borrow from the whole pyramid.
42
+ */
43
+ level?: number;
44
+ /**
45
+ * Logical pixels of tiles to ask for around the view, which are wanted
46
+ * — so they load, and a load in flight for one is not given up — and
47
+ * not drawn. The retained renderer keeps the same ring warm.
48
+ */
49
+ padding?: number;
50
+ }): CoverResult;
51
+ //# sourceMappingURL=cover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cover.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/cover.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;uEACuE;AACvE,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB;0EACsE;IACtE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd;;+CAE2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IACP;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,WAAW,CAyFb"}
@@ -0,0 +1,124 @@
1
+ // Which tiles a GL frame draws, and where.
2
+ //
3
+ // The same cover the retained renderer uses (`../proj.ts`'s `tileCover`),
4
+ // resolved against what is loaded. The difference is what a stand-in costs:
5
+ // the retained renderer scales an ancestor's *bitmap* over a hole, so a
6
+ // stand-in is blurry until the real tile lands; here an ancestor is the same
7
+ // geometry drawn at a larger scale, so a stand-in is exactly as sharp as its
8
+ // data. Overzoom is the same move with no hole in it — a z14 tile at zoom 20
9
+ // is the z14 tile, drawn 64 times bigger, with no sub-tiling and nothing
10
+ // rasterized — which is why this file has no overzoom code at all. A raster
11
+ // tile past its source's depth is the same move again: its data tile, drawn
12
+ // whole and stretched over its own square.
13
+ //
14
+ // **The grid is laid out on the projection's world**, `512 · 2^zoom`, and
15
+ // not on the source's tile size. That is react-x11-components#65 again, and
16
+ // the proof of concept had it back: a 256-pixel raster source laid out on a
17
+ // 256-pixel world lands at half the size of everything placed with the
18
+ // projection — markers, overlays, labels, `project()`. `tileCover` reads a
19
+ // smaller tile one level deeper instead, which puts every image at its own
20
+ // natural size on the one world everything shares.
21
+ import { DEFAULT_TILE_SIZE, tileCover, transformFor } from '../proj.js';
22
+ /** How far up the pyramid a hole looks for a stand-in. */
23
+ const MAX_ANCESTOR = 8;
24
+ /**
25
+ * The frame's tiles, centre-out, each with its screen square and its clip.
26
+ *
27
+ * A hole — a tile still loading, or one the source has no data for — is
28
+ * covered from whichever side has geometry: the nearest ancestor, drawn at
29
+ * its own larger size and clipped to the hole; or, zooming out, the four
30
+ * children, when all of them are in hand. `AGENTS.md`'s rule for the
31
+ * retained cache holds here too: a pyramid has two neighbours.
32
+ */
33
+ export function renderCover(camera, pane, scale, pyramid, lookup, options = {}) {
34
+ const transform = transformFor(camera, pane, DEFAULT_TILE_SIZE);
35
+ const forced = options.level;
36
+ const entries = tileCover(transform, forced === undefined
37
+ ? pyramid
38
+ : { ...pyramid, minZoom: forced, maxZoom: forced }, options.padding ?? 0);
39
+ const tiles = [];
40
+ const missing = [];
41
+ const inView = [];
42
+ const level = entries.length > 0 ? entries[0].tile.z : 0;
43
+ let own = 0;
44
+ let ancestors = 0;
45
+ let descendants = 0;
46
+ for (const entry of entries) {
47
+ const clip = {
48
+ x: entry.x * scale,
49
+ y: entry.y * scale,
50
+ width: entry.size * scale,
51
+ height: entry.size * scale,
52
+ };
53
+ const data = lookup.get(entry.tile);
54
+ if (data === undefined)
55
+ missing.push(entry.tile);
56
+ const visible = entry.x < pane.width &&
57
+ entry.y < pane.height &&
58
+ entry.x + entry.size > 0 &&
59
+ entry.y + entry.size > 0;
60
+ // The padded ring is wanted, and that is all.
61
+ if (!visible)
62
+ continue;
63
+ inView.push(entry.tile);
64
+ if (data) {
65
+ tiles.push({ data, x: clip.x, y: clip.y, size: clip.width, clip });
66
+ own++;
67
+ continue;
68
+ }
69
+ // An ancestor: the same ground, `2^k` times the size, from `sub` cells
70
+ // above and to the left of this entry's square.
71
+ let found = false;
72
+ const { z, x, y } = entry.tile;
73
+ for (let k = 1; k <= MAX_ANCESTOR && z - k >= pyramid.minZoom; k++) {
74
+ const ancestor = { z: z - k, x: x >> k, y: y >> k };
75
+ const stand = lookup.get(ancestor);
76
+ if (!stand)
77
+ continue;
78
+ const span = 1 << k;
79
+ const size = clip.width * span;
80
+ tiles.push({
81
+ data: stand,
82
+ x: clip.x - (x - (ancestor.x << k)) * clip.width,
83
+ y: clip.y - (y - (ancestor.y << k)) * clip.width,
84
+ size,
85
+ clip,
86
+ });
87
+ ancestors++;
88
+ found = true;
89
+ break;
90
+ }
91
+ if (found || data === null || z + 1 > pyramid.maxZoom)
92
+ continue;
93
+ // Zooming out: the finer level is what is in hand. Only when all four
94
+ // children have answered, or the hole would be patched with holes.
95
+ const children = [];
96
+ for (let dy = 0; dy < 2; dy++) {
97
+ for (let dx = 0; dx < 2; dx++) {
98
+ const child = lookup.get({ z: z + 1, x: x * 2 + dx, y: y * 2 + dy });
99
+ if (child === undefined)
100
+ break;
101
+ children.push(child);
102
+ }
103
+ }
104
+ if (children.length !== 4)
105
+ continue;
106
+ const half = clip.width / 2;
107
+ children.forEach((child, i) => {
108
+ if (!child)
109
+ return;
110
+ const cx = clip.x + (i % 2) * half;
111
+ const cy = clip.y + Math.floor(i / 2) * half;
112
+ tiles.push({
113
+ data: child,
114
+ x: cx,
115
+ y: cy,
116
+ size: half,
117
+ clip: { x: cx, y: cy, width: half, height: half },
118
+ });
119
+ });
120
+ descendants++;
121
+ }
122
+ return { tiles, missing, level, own, ancestors, descendants, inView };
123
+ }
124
+ //# sourceMappingURL=cover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cover.js","sourceRoot":"","sources":["../../../src/maps/gl/cover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { GlMapPane } from './view.js';
2
+ export type { GlMapPaneProps } from './view.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,20 @@
1
+ // The GL renderer's entry: what `<Map>` loads, by dynamic import, when it
2
+ // chooses to draw a map through GL — and only then.
3
+ //
4
+ // **Registration happens when this module is evaluated**, which is the design
5
+ // here as it is in `../index.ts`: the pane element (`./pane.ts`) is
6
+ // registered by the module that is loaded when GL is chosen, so an
7
+ // application that never draws a map through GL registers nothing and
8
+ // bundles none of this. The vt terminal's `src/terminal/vt/index.ts` is the
9
+ // same shape, for the same reason.
10
+ import { registerElement, registeredElements } from 'react-x11/host';
11
+ import { GL_PANE, GlPaneNode } from './pane.js';
12
+ if (!registeredElements().includes(GL_PANE)) {
13
+ registerElement(GL_PANE, {
14
+ create: (props, app) => new GlPaneNode(props, app),
15
+ // The `<glarea>` the map is drawn in.
16
+ childrenAllowed: true,
17
+ });
18
+ }
19
+ export { GlMapPane } from './view.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/maps/gl/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,oEAAoE;AACpE,mEAAmE;AACnE,sEAAsE;AACtE,4EAA4E;AAC5E,mCAAmC;AACnC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEhD,IAAI,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,eAAe,CAAC,OAAO,EAAE;QACvB,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;QAClD,sCAAsC;QACtC,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { MapMarker, OverlayPalette } from '../overlay.js';
2
+ import type { Transform } from '../proj.js';
3
+ /**
4
+ * Floats per marker: the point it marks, in device pixels — a pin's tip, a
5
+ * disc's centre — its head's radius, and how far above the point the head's
6
+ * centre is (0 for a disc); the fill; the ring; the ring's width, and one
7
+ * float unused.
8
+ */
9
+ export declare const MARKER_INSTANCE = 14;
10
+ /** A frame's markers, bottom first. */
11
+ export interface MarkerBatch {
12
+ instances: Float32Array;
13
+ count: number;
14
+ }
15
+ export declare class MarkerBatcher {
16
+ private _instances;
17
+ private readonly _colors;
18
+ /**
19
+ * The markers in view, bottom first. `transform` is the map's at this
20
+ * frame and `pane` its size, in logical pixels.
21
+ */
22
+ batch(markers: readonly MapMarker[], transform: Transform, pane: {
23
+ width: number;
24
+ height: number;
25
+ }, scale: number, palette: OverlayPalette): MarkerBatch;
26
+ private _color;
27
+ }
28
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/markers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C;;;;;GAKG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;IACH,KAAK,CACH,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,WAAW,CAwBb;IAED,OAAO,CAAC,MAAM;CAUf"}
@@ -0,0 +1,60 @@
1
+ // The markers, as the GL renderer draws them: a quad each, in one instanced
2
+ // draw, shaded by its distance to the marker's outline (`MARKER_FRAGMENT`) —
3
+ // a disc, or a pin's teardrop, and the ring around it. Which markers, in
4
+ // what order, where and in what colours is `../overlay.ts`'s, which the
5
+ // retained renderer draws from too; what is here is only the packing.
6
+ import { MARKER_SIZE, PIN_HEIGHT, markerPaint, markersInView, } from '../overlay.js';
7
+ import { parseColor, premultiplied } from './color.js';
8
+ /**
9
+ * Floats per marker: the point it marks, in device pixels — a pin's tip, a
10
+ * disc's centre — its head's radius, and how far above the point the head's
11
+ * centre is (0 for a disc); the fill; the ring; the ring's width, and one
12
+ * float unused.
13
+ */
14
+ export const MARKER_INSTANCE = 14;
15
+ const CLEAR = [0, 0, 0, 0];
16
+ export class MarkerBatcher {
17
+ _instances = new Float32Array(MARKER_INSTANCE * 16);
18
+ _colors = new Map();
19
+ /**
20
+ * The markers in view, bottom first. `transform` is the map's at this
21
+ * frame and `pane` its size, in logical pixels.
22
+ */
23
+ batch(markers, transform, pane, scale, palette) {
24
+ const shown = markersInView(markers, transform, pane);
25
+ if (this._instances.length < shown.length * MARKER_INSTANCE) {
26
+ this._instances = new Float32Array(shown.length * MARKER_INSTANCE * 2);
27
+ }
28
+ const d = this._instances;
29
+ shown.forEach(({ marker, rect }, i) => {
30
+ const at = i * MARKER_INSTANCE;
31
+ const size = marker.size ?? MARKER_SIZE;
32
+ const r = (size / 2) * scale;
33
+ const paint = markerPaint(marker, palette, scale);
34
+ d[at] = rect.tipX * scale;
35
+ d[at + 1] = rect.tipY * scale;
36
+ d[at + 2] = r;
37
+ d[at + 3] =
38
+ (marker.shape ?? 'pin') === 'circle'
39
+ ? 0
40
+ : size * PIN_HEIGHT * scale - r;
41
+ d.set(this._color(paint.fill), at + 4);
42
+ d.set(this._color(paint.ring), at + 8);
43
+ d[at + 12] = paint.ringWidth;
44
+ d[at + 13] = 0;
45
+ });
46
+ return { instances: d, count: shown.length };
47
+ }
48
+ _color(value) {
49
+ let color = this._colors.get(value);
50
+ if (!color) {
51
+ const parsed = parseColor(value);
52
+ color = parsed ? premultiplied(parsed) : CLEAR;
53
+ if (this._colors.size > 256)
54
+ this._colors.clear();
55
+ this._colors.set(value, color);
56
+ }
57
+ return color;
58
+ }
59
+ }
60
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../../../src/maps/gl/markers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { MapOverlay, OverlayPalette } from '../overlay.js';
2
+ import type { MapCamera } from '../proj.js';
3
+ import type { GlTileData } from './buckets.js';
4
+ /** A square of the world an overlay bucket is built around. */
5
+ export interface OverlayRegion {
6
+ /** Its centre, in mercator. */
7
+ x: number;
8
+ y: number;
9
+ /** Units per mercator unit. */
10
+ k: number;
11
+ /** The zoom it was built at. */
12
+ zoom: number;
13
+ /** The display scale it was built for — what a circle's segments are
14
+ * counted in. */
15
+ scale: number;
16
+ }
17
+ /** One draw from the bucket: an overlay's fill, or one of its strokes. */
18
+ export interface OverlayPass {
19
+ /** The geometry: an index into the bucket's `draws`. */
20
+ index: number;
21
+ kind: 'fill' | 'stroke';
22
+ /** A stroke of the fill stream — a polygon's or a circle's outline —
23
+ * rather than of the line stream. */
24
+ outline?: boolean;
25
+ color: string;
26
+ opacity: number;
27
+ /** A stroke's width, in logical pixels. */
28
+ width: number;
29
+ dash?: readonly number[];
30
+ }
31
+ export interface OverlayBucket {
32
+ data: GlTileData;
33
+ passes: OverlayPass[];
34
+ region: OverlayRegion;
35
+ }
36
+ /**
37
+ * A region around the view: centred on the camera, with room for the pane's
38
+ * diagonal either side — so a view zoomed a level out is still inside it,
39
+ * and a pan has most of a pane to go before the bucket is built again.
40
+ */
41
+ export declare function overlayRegion(camera: MapCamera, pane: {
42
+ width: number;
43
+ height: number;
44
+ }, scale: number): OverlayRegion;
45
+ /** Whether a region still serves a view: the zoom within a level of its
46
+ * own, the scale its own, and the view inside it with room to spare. */
47
+ export declare function regionHolds(region: OverlayRegion, camera: MapCamera, pane: {
48
+ width: number;
49
+ height: number;
50
+ }, scale: number): boolean;
51
+ /**
52
+ * Where a region lands this frame: device pixels per unit, and its centre
53
+ * in device pixels — in float64, from the camera, which is what keeps both
54
+ * small enough for the float32s they become.
55
+ */
56
+ export declare function regionPlacement(region: OverlayRegion, camera: MapCamera, width: number, height: number, scale: number): {
57
+ unit: number;
58
+ x: number;
59
+ y: number;
60
+ };
61
+ /**
62
+ * The bucket for a map's overlays, around a region: each overlay's geometry
63
+ * once, in `drawOverlays`' order, and the passes that draw it — a line's
64
+ * casing and then the line; a polygon's or a circle's fill and then its
65
+ * outline. Colours an overlay does not name are the palette's.
66
+ */
67
+ export declare function buildOverlayBucket(overlays: readonly MapOverlay[], region: OverlayRegion, palette: OverlayPalette): OverlayBucket;
68
+ //# sourceMappingURL=overlays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/overlays.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQhE,OAAO,KAAK,EAAU,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,cAAc,CAAC;AAQ1D,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb;sBACkB;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB;0CACsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;CACvB;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,MAAM,GACZ,aAAa,CAWf;AAED;yEACyE;AACzE,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,MAAM,GACZ,OAAO,CAYT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAUxC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAc,GACtB,aAAa,CAyGf"}