@sentropic/design-system-svelte 0.34.0 → 0.34.21

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 (112) hide show
  1. package/dist/AppChrome.svelte +660 -0
  2. package/dist/AppChrome.svelte.d.ts +74 -0
  3. package/dist/AppChrome.svelte.d.ts.map +1 -0
  4. package/dist/AppChrome.test.d.ts +2 -0
  5. package/dist/AppChrome.test.d.ts.map +1 -0
  6. package/dist/AppChrome.test.js +122 -0
  7. package/dist/AppHeader.svelte +159 -1
  8. package/dist/AppHeader.svelte.d.ts +18 -1
  9. package/dist/AppHeader.svelte.d.ts.map +1 -1
  10. package/dist/ArcDiagramChart.svelte +380 -0
  11. package/dist/ArcDiagramChart.svelte.d.ts +43 -0
  12. package/dist/ArcDiagramChart.svelte.d.ts.map +1 -0
  13. package/dist/AreaRangeChart.svelte +487 -0
  14. package/dist/AreaRangeChart.svelte.d.ts +38 -0
  15. package/dist/AreaRangeChart.svelte.d.ts.map +1 -0
  16. package/dist/AreaSplineRangeChart.svelte +478 -0
  17. package/dist/AreaSplineRangeChart.svelte.d.ts +37 -0
  18. package/dist/AreaSplineRangeChart.svelte.d.ts.map +1 -0
  19. package/dist/BellCurveChart.svelte +487 -0
  20. package/dist/BellCurveChart.svelte.d.ts +40 -0
  21. package/dist/BellCurveChart.svelte.d.ts.map +1 -0
  22. package/dist/Calendar.svelte +11 -0
  23. package/dist/ChatThread.svelte +32 -1
  24. package/dist/ChatThread.svelte.d.ts +14 -0
  25. package/dist/ChatThread.svelte.d.ts.map +1 -1
  26. package/dist/ColumnPyramidChart.svelte +332 -0
  27. package/dist/ColumnPyramidChart.svelte.d.ts +35 -0
  28. package/dist/ColumnPyramidChart.svelte.d.ts.map +1 -0
  29. package/dist/ColumnRangeChart.svelte +432 -0
  30. package/dist/ColumnRangeChart.svelte.d.ts +42 -0
  31. package/dist/ColumnRangeChart.svelte.d.ts.map +1 -0
  32. package/dist/Combobox.svelte +3 -0
  33. package/dist/ConfigItemCard.svelte +303 -0
  34. package/dist/ConfigItemCard.svelte.d.ts +37 -0
  35. package/dist/ConfigItemCard.svelte.d.ts.map +1 -0
  36. package/dist/ContentSwitcher.svelte +1 -1
  37. package/dist/DatePicker.svelte +3 -0
  38. package/dist/DependencyWheelChart.svelte +413 -0
  39. package/dist/DependencyWheelChart.svelte.d.ts +42 -0
  40. package/dist/DependencyWheelChart.svelte.d.ts.map +1 -0
  41. package/dist/DumbbellChart.svelte +403 -0
  42. package/dist/DumbbellChart.svelte.d.ts +44 -0
  43. package/dist/DumbbellChart.svelte.d.ts.map +1 -0
  44. package/dist/ErrorBarChart.svelte +428 -0
  45. package/dist/ErrorBarChart.svelte.d.ts +40 -0
  46. package/dist/ErrorBarChart.svelte.d.ts.map +1 -0
  47. package/dist/FieldCard.svelte +220 -0
  48. package/dist/FieldCard.svelte.d.ts +28 -0
  49. package/dist/FieldCard.svelte.d.ts.map +1 -0
  50. package/dist/GanttChart.svelte +410 -0
  51. package/dist/GanttChart.svelte.d.ts +39 -0
  52. package/dist/GanttChart.svelte.d.ts.map +1 -0
  53. package/dist/HLCChart.svelte +330 -0
  54. package/dist/HLCChart.svelte.d.ts +32 -0
  55. package/dist/HLCChart.svelte.d.ts.map +1 -0
  56. package/dist/HeikinAshiChart.svelte +365 -0
  57. package/dist/HeikinAshiChart.svelte.d.ts +37 -0
  58. package/dist/HeikinAshiChart.svelte.d.ts.map +1 -0
  59. package/dist/HollowCandlestickChart.svelte +357 -0
  60. package/dist/HollowCandlestickChart.svelte.d.ts +34 -0
  61. package/dist/HollowCandlestickChart.svelte.d.ts.map +1 -0
  62. package/dist/Input.svelte +3 -0
  63. package/dist/ItemChart.svelte +389 -0
  64. package/dist/ItemChart.svelte.d.ts +67 -0
  65. package/dist/ItemChart.svelte.d.ts.map +1 -0
  66. package/dist/LollipopChart.svelte +1 -1
  67. package/dist/MultiSelect.svelte +3 -0
  68. package/dist/NumberInput.svelte +3 -0
  69. package/dist/OHLCChart.svelte +343 -0
  70. package/dist/OHLCChart.svelte.d.ts +33 -0
  71. package/dist/OHLCChart.svelte.d.ts.map +1 -0
  72. package/dist/OrganizationChart.svelte +284 -0
  73. package/dist/OrganizationChart.svelte.d.ts +19 -0
  74. package/dist/OrganizationChart.svelte.d.ts.map +1 -0
  75. package/dist/PasswordInput.svelte +3 -0
  76. package/dist/PolygonChart.svelte +189 -0
  77. package/dist/PolygonChart.svelte.d.ts +17 -0
  78. package/dist/PolygonChart.svelte.d.ts.map +1 -0
  79. package/dist/ScoreCard.svelte +172 -0
  80. package/dist/ScoreCard.svelte.d.ts +27 -0
  81. package/dist/ScoreCard.svelte.d.ts.map +1 -0
  82. package/dist/Search.svelte +7 -5
  83. package/dist/Select.svelte +3 -0
  84. package/dist/StreamgraphChart.svelte +283 -0
  85. package/dist/StreamgraphChart.svelte.d.ts +23 -0
  86. package/dist/StreamgraphChart.svelte.d.ts.map +1 -0
  87. package/dist/StreamingMessage.svelte +44 -2
  88. package/dist/StreamingMessage.svelte.d.ts +18 -1
  89. package/dist/StreamingMessage.svelte.d.ts.map +1 -1
  90. package/dist/TileMapChart.svelte +314 -0
  91. package/dist/TileMapChart.svelte.d.ts +45 -0
  92. package/dist/TileMapChart.svelte.d.ts.map +1 -0
  93. package/dist/TimePicker.svelte +3 -0
  94. package/dist/TimelineChart.svelte +362 -0
  95. package/dist/TimelineChart.svelte.d.ts +22 -0
  96. package/dist/TimelineChart.svelte.d.ts.map +1 -0
  97. package/dist/TreegraphChart.svelte +281 -0
  98. package/dist/TreegraphChart.svelte.d.ts +19 -0
  99. package/dist/TreegraphChart.svelte.d.ts.map +1 -0
  100. package/dist/VariablePieChart.svelte +313 -0
  101. package/dist/VariablePieChart.svelte.d.ts +52 -0
  102. package/dist/VariablePieChart.svelte.d.ts.map +1 -0
  103. package/dist/VennChart.svelte +348 -0
  104. package/dist/VennChart.svelte.d.ts +72 -0
  105. package/dist/VennChart.svelte.d.ts.map +1 -0
  106. package/dist/WordCloudChart.svelte +279 -0
  107. package/dist/WordCloudChart.svelte.d.ts +18 -0
  108. package/dist/WordCloudChart.svelte.d.ts.map +1 -0
  109. package/dist/index.d.ts +56 -0
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +28 -0
  112. package/package.json +5 -3
@@ -0,0 +1,332 @@
1
+ <script lang="ts" module>
2
+ /**
3
+ * ColumnPyramidChart — colonnes en forme de pyramide (triangle) par catégorie.
4
+ * Comme un histogramme à barres, mais chaque colonne est un triangle : base
5
+ * large posée sur l'axe X, sommet centré à la hauteur de la valeur.
6
+ * API canonique (référence Svelte, React/Vue doivent s'aligner).
7
+ *
8
+ * Props obligatoires :
9
+ * data ColumnPyramidChartDatum[] - tableau {category, value, tone?}
10
+ * label string - aria-label du graphique
11
+ *
12
+ * Props optionnelles :
13
+ * tone ColumnPyramidChartTone - teinte par défaut des colonnes sans tone
14
+ * width number (défaut 480)
15
+ * height number (défaut 280)
16
+ * class string
17
+ */
18
+ export type ColumnPyramidChartTone =
19
+ | "category1"
20
+ | "category2"
21
+ | "category3"
22
+ | "category4"
23
+ | "category5"
24
+ | "category6"
25
+ | "category7"
26
+ | "category8";
27
+
28
+ export type ColumnPyramidChartDatum = {
29
+ category: string;
30
+ value: number;
31
+ tone?: ColumnPyramidChartTone;
32
+ };
33
+ </script>
34
+
35
+ <script lang="ts">
36
+ import ChartDataList from "./ChartDataList.svelte";
37
+
38
+ type ColumnPyramidChartProps = {
39
+ data: ColumnPyramidChartDatum[];
40
+ width?: number;
41
+ height?: number;
42
+ label: string;
43
+ /** Teinte par défaut des colonnes dont le datum n'a pas de `tone`. */
44
+ tone?: ColumnPyramidChartTone;
45
+ class?: string;
46
+ };
47
+
48
+ let {
49
+ data = [],
50
+ width = 480,
51
+ height = 280,
52
+ label,
53
+ tone = "category1",
54
+ class: className
55
+ }: ColumnPyramidChartProps = $props();
56
+
57
+ const MARGIN = { top: 24, right: 16, bottom: 32, left: 44 };
58
+
59
+ function niceTicks(min: number, max: number, target = 5): number[] {
60
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) {
61
+ const base = Number.isFinite(max) ? max : 0;
62
+ return [base];
63
+ }
64
+ const range = max - min;
65
+ const rough = range / Math.max(target - 1, 1);
66
+ const pow = Math.pow(10, Math.floor(Math.log10(rough)));
67
+ const norm = rough / pow;
68
+ let step: number;
69
+ if (norm < 1.5) step = 1 * pow;
70
+ else if (norm < 3) step = 2 * pow;
71
+ else if (norm < 7) step = 5 * pow;
72
+ else step = 10 * pow;
73
+ const start = Math.floor(min / step) * step;
74
+ const end = Math.ceil(max / step) * step;
75
+ const ticks: number[] = [];
76
+ for (let v = start; v <= end + step / 2; v += step) {
77
+ ticks.push(Number(v.toFixed(10)));
78
+ }
79
+ return ticks;
80
+ }
81
+
82
+ function scaleLinear(v: number, d0: number, d1: number, r0: number, r1: number) {
83
+ if (d1 === d0) return r0;
84
+ return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0);
85
+ }
86
+
87
+ function formatTick(v: number): string {
88
+ if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(v % 1000 === 0 ? 0 : 1)}k`;
89
+ if (Number.isInteger(v)) return String(v);
90
+ return v.toFixed(1);
91
+ }
92
+
93
+ let hoveredIndex: number | null = $state(null);
94
+
95
+ // Données valides : value finie et strictement positive (un triangle posé sur
96
+ // l'axe X n'a de sens que pour une valeur > 0).
97
+ const validData = $derived(data.filter((d) => Number.isFinite(d.value) && d.value > 0));
98
+
99
+ const scales = $derived.by(() => {
100
+ const values = validData.map((d) => d.value);
101
+ const minRaw = 0;
102
+ const maxRaw = Math.max(0, ...values);
103
+ const ticks = niceTicks(minRaw, maxRaw, 5);
104
+ const domainMin = ticks[0];
105
+ const domainMax = ticks[ticks.length - 1];
106
+ const plotWidth = Math.max(width - MARGIN.left - MARGIN.right, 1);
107
+ const plotHeight = Math.max(height - MARGIN.top - MARGIN.bottom, 1);
108
+ return { ticks, domainMin, domainMax, plotWidth, plotHeight };
109
+ });
110
+
111
+ const columns = $derived.by(() => {
112
+ const { domainMin, domainMax, plotWidth, plotHeight } = scales;
113
+ if (validData.length === 0) return [];
114
+ const band = plotWidth / validData.length;
115
+ const baseWidth = band * 0.7;
116
+ const zeroY = MARGIN.top + scaleLinear(0, domainMin, domainMax, plotHeight, 0);
117
+ return validData.map((d, i) => {
118
+ const apexY = MARGIN.top + scaleLinear(d.value, domainMin, domainMax, plotHeight, 0);
119
+ const cx = MARGIN.left + band * (i + 0.5);
120
+ const leftX = cx - baseWidth / 2;
121
+ const rightX = cx + baseWidth / 2;
122
+ // Triangle : base large en bas (sur l'axe X), sommet centré à la valeur.
123
+ const points = `${leftX},${zeroY} ${rightX},${zeroY} ${cx},${apexY}`;
124
+ return {
125
+ datum: d,
126
+ tone: (d.tone ?? tone) as ColumnPyramidChartTone,
127
+ points,
128
+ cx,
129
+ cy: apexY,
130
+ labelX: cx,
131
+ labelY: height - MARGIN.bottom + 16
132
+ };
133
+ });
134
+ });
135
+
136
+ const dataValueItems = $derived(validData.map((d) => `${d.category}: ${d.value}`));
137
+
138
+ const valueAxisTicks = $derived.by(() => {
139
+ const { ticks, domainMin, domainMax, plotWidth, plotHeight } = scales;
140
+ return ticks.map((tick) => ({
141
+ value: tick,
142
+ x1: MARGIN.left,
143
+ x2: MARGIN.left + plotWidth,
144
+ y: MARGIN.top + scaleLinear(tick, domainMin, domainMax, plotHeight, 0)
145
+ }));
146
+ });
147
+
148
+ function handleLeave() {
149
+ hoveredIndex = null;
150
+ }
151
+ function handleVisualPointerMove(event: PointerEvent) {
152
+ const target = event.target;
153
+ if (!(target instanceof Element)) {
154
+ hoveredIndex = null;
155
+ return;
156
+ }
157
+ const index = Number(target.getAttribute("data-chart-index"));
158
+ hoveredIndex = Number.isInteger(index) ? index : null;
159
+ }
160
+
161
+ const classes = () => ["st-columnPyramidChart", className].filter(Boolean).join(" ");
162
+ </script>
163
+
164
+ <div class={classes()}>
165
+ <div
166
+ class="st-columnPyramidChart__visual"
167
+ role="img"
168
+ aria-label={label}
169
+ onpointermove={handleVisualPointerMove}
170
+ onpointerleave={handleLeave}
171
+ >
172
+ <svg
173
+ viewBox="0 0 {width} {height}"
174
+ preserveAspectRatio="xMidYMid meet"
175
+ width="100%"
176
+ height="100%"
177
+ focusable="false"
178
+ aria-hidden="true"
179
+ >
180
+ <!-- gridlines + value axis ticks -->
181
+ {#each valueAxisTicks as tick (tick.value)}
182
+ <line class="st-columnPyramidChart__grid" x1={tick.x1} x2={tick.x2} y1={tick.y} y2={tick.y} />
183
+ <text
184
+ class="st-columnPyramidChart__tickLabel"
185
+ x={MARGIN.left - 6}
186
+ y={tick.y}
187
+ text-anchor="end"
188
+ dominant-baseline="middle"
189
+ >
190
+ {formatTick(tick.value)}
191
+ </text>
192
+ {/each}
193
+
194
+ <!-- axes -->
195
+ <line
196
+ class="st-columnPyramidChart__axis"
197
+ x1={MARGIN.left}
198
+ x2={MARGIN.left}
199
+ y1={MARGIN.top}
200
+ y2={height - MARGIN.bottom}
201
+ />
202
+ <line
203
+ class="st-columnPyramidChart__axis"
204
+ x1={MARGIN.left}
205
+ x2={width - MARGIN.right}
206
+ y1={height - MARGIN.bottom}
207
+ y2={height - MARGIN.bottom}
208
+ />
209
+
210
+ <!-- category labels -->
211
+ {#each columns as col (col.datum.category)}
212
+ <text
213
+ class="st-columnPyramidChart__categoryLabel"
214
+ x={col.labelX}
215
+ y={col.labelY}
216
+ text-anchor="middle"
217
+ >
218
+ {col.datum.category}
219
+ </text>
220
+ {/each}
221
+
222
+ <!-- pyramid columns (decorative, inside aria-hidden SVG) -->
223
+ {#each columns as col, i (col.datum.category)}
224
+ <polygon
225
+ class="st-columnPyramidChart__column st-columnPyramidChart__column--{col.tone}"
226
+ points={col.points}
227
+ data-chart-index={i}
228
+ />
229
+ {/each}
230
+ </svg>
231
+ </div>
232
+
233
+ <ChartDataList {label} items={dataValueItems} />
234
+
235
+ {#if hoveredIndex !== null && columns[hoveredIndex]}
236
+ {@const col = columns[hoveredIndex]}
237
+ <div
238
+ class="st-columnPyramidChart__tooltip"
239
+ role="presentation"
240
+ style="left: {(col.cx / width) * 100}%; top: {(col.cy / height) * 100}%"
241
+ >
242
+ <span class="st-columnPyramidChart__tooltipLabel">{col.datum.category}</span>
243
+ <span class="st-columnPyramidChart__tooltipValue">{col.datum.value}</span>
244
+ </div>
245
+ {/if}
246
+ </div>
247
+
248
+ <style>
249
+ .st-columnPyramidChart {
250
+ color: var(--st-semantic-text-secondary);
251
+ display: block;
252
+ font-family: inherit;
253
+ position: relative;
254
+ width: 100%;
255
+ }
256
+
257
+ .st-columnPyramidChart svg {
258
+ display: block;
259
+ overflow: visible;
260
+ }
261
+
262
+ .st-columnPyramidChart__visual {
263
+ display: block;
264
+ }
265
+
266
+ .st-columnPyramidChart__grid {
267
+ stroke: var(--st-component-columnPyramidChart-gridStroke, var(--st-semantic-border-subtle));
268
+ stroke-dasharray: 2 3;
269
+ stroke-width: 1;
270
+ opacity: 0.7;
271
+ }
272
+
273
+ .st-columnPyramidChart__axis {
274
+ stroke: var(--st-component-columnPyramidChart-axisStroke, var(--st-semantic-border-subtle));
275
+ stroke-width: 1;
276
+ }
277
+
278
+ .st-columnPyramidChart__tickLabel,
279
+ .st-columnPyramidChart__categoryLabel {
280
+ fill: var(--st-component-columnPyramidChart-labelColor, var(--st-semantic-text-secondary));
281
+ font-size: 0.6875rem;
282
+ }
283
+
284
+ .st-columnPyramidChart__column {
285
+ cursor: pointer;
286
+ transition: opacity var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
287
+ }
288
+
289
+ .st-columnPyramidChart__column:hover {
290
+ opacity: 0.82;
291
+ }
292
+
293
+ .st-columnPyramidChart__column--category1 { fill: var(--st-semantic-data-category1); }
294
+ .st-columnPyramidChart__column--category2 { fill: var(--st-semantic-data-category2); }
295
+ .st-columnPyramidChart__column--category3 { fill: var(--st-semantic-data-category3); }
296
+ .st-columnPyramidChart__column--category4 { fill: var(--st-semantic-data-category4); }
297
+ .st-columnPyramidChart__column--category5 { fill: var(--st-semantic-data-category5); }
298
+ .st-columnPyramidChart__column--category6 { fill: var(--st-semantic-data-category6); }
299
+ .st-columnPyramidChart__column--category7 { fill: var(--st-semantic-data-category7); }
300
+ .st-columnPyramidChart__column--category8 { fill: var(--st-semantic-data-category8); }
301
+
302
+ .st-columnPyramidChart__tooltip {
303
+ background: var(--st-component-columnPyramidChart-tooltipBackground, var(--st-semantic-surface-inverse));
304
+ border-radius: var(--st-radius-sm, 0.25rem);
305
+ color: var(--st-component-columnPyramidChart-tooltipText, var(--st-semantic-text-inverse));
306
+ display: inline-flex;
307
+ flex-direction: column;
308
+ font-size: 0.75rem;
309
+ gap: 0.125rem;
310
+ line-height: 1.2;
311
+ padding: 0.375rem 0.5rem;
312
+ pointer-events: none;
313
+ position: absolute;
314
+ transform: translate(-50%, calc(-100% - 8px));
315
+ white-space: nowrap;
316
+ z-index: 1;
317
+ }
318
+
319
+ .st-columnPyramidChart__tooltipLabel {
320
+ font-weight: 600;
321
+ }
322
+
323
+ .st-columnPyramidChart__tooltipValue {
324
+ opacity: 0.85;
325
+ }
326
+
327
+ @media (prefers-reduced-motion: reduce) {
328
+ .st-columnPyramidChart__column {
329
+ transition: none;
330
+ }
331
+ }
332
+ </style>
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ColumnPyramidChart — colonnes en forme de pyramide (triangle) par catégorie.
3
+ * Comme un histogramme à barres, mais chaque colonne est un triangle : base
4
+ * large posée sur l'axe X, sommet centré à la hauteur de la valeur.
5
+ * API canonique (référence Svelte, React/Vue doivent s'aligner).
6
+ *
7
+ * Props obligatoires :
8
+ * data ColumnPyramidChartDatum[] - tableau {category, value, tone?}
9
+ * label string - aria-label du graphique
10
+ *
11
+ * Props optionnelles :
12
+ * tone ColumnPyramidChartTone - teinte par défaut des colonnes sans tone
13
+ * width number (défaut 480)
14
+ * height number (défaut 280)
15
+ * class string
16
+ */
17
+ export type ColumnPyramidChartTone = "category1" | "category2" | "category3" | "category4" | "category5" | "category6" | "category7" | "category8";
18
+ export type ColumnPyramidChartDatum = {
19
+ category: string;
20
+ value: number;
21
+ tone?: ColumnPyramidChartTone;
22
+ };
23
+ type ColumnPyramidChartProps = {
24
+ data: ColumnPyramidChartDatum[];
25
+ width?: number;
26
+ height?: number;
27
+ label: string;
28
+ /** Teinte par défaut des colonnes dont le datum n'a pas de `tone`. */
29
+ tone?: ColumnPyramidChartTone;
30
+ class?: string;
31
+ };
32
+ declare const ColumnPyramidChart: import("svelte").Component<ColumnPyramidChartProps, {}, "">;
33
+ type ColumnPyramidChart = ReturnType<typeof ColumnPyramidChart>;
34
+ export default ColumnPyramidChart;
35
+ //# sourceMappingURL=ColumnPyramidChart.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnPyramidChart.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ColumnPyramidChart.svelte.ts"],"names":[],"mappings":"AAGE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAMF,KAAK,uBAAuB,GAAG;IAC7B,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAuKJ,QAAA,MAAM,kBAAkB,6DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}