genus-pdf-viewer 0.2.3 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.js CHANGED
@@ -1,6 +1,10 @@
1
1
  export const VIEWER_STYLES = `
2
2
  :host {
3
3
  display: block;
4
+ width: 100%;
5
+ height: 100%;
6
+ min-width: 0;
7
+ min-height: 0;
4
8
  color: #0f172a;
5
9
  font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
6
10
  }
@@ -12,8 +16,8 @@ export const VIEWER_STYLES = `
12
16
  .shell {
13
17
  display: flex;
14
18
  flex-direction: column;
15
- gap: 12px;
16
19
  width: 100%;
20
+ height: 100%;
17
21
  min-height: 320px;
18
22
  background: #f8fafc;
19
23
  border: 1px solid #dbe4ee;
@@ -25,14 +29,16 @@ export const VIEWER_STYLES = `
25
29
  display: flex;
26
30
  align-items: center;
27
31
  flex-wrap: nowrap;
28
- gap: 8px;
29
- padding: 10px 12px;
30
- background: rgba(255, 255, 255, 0.92);
31
- border-bottom: 1px solid #dbe4ee;
32
+ gap: 10px;
33
+ min-height: 56px;
34
+ padding: 10px 16px;
35
+ background: rgba(248, 250, 252, 0.98);
36
+ border-bottom: 1px solid #e2e8f0;
32
37
  position: sticky;
33
38
  top: 0;
34
39
  z-index: 2;
35
- backdrop-filter: blur(14px);
40
+ backdrop-filter: blur(10px);
41
+ overflow: hidden;
36
42
  }
37
43
 
38
44
  .toolbar[hidden] {
@@ -42,7 +48,7 @@ export const VIEWER_STYLES = `
42
48
  .toolbar-group {
43
49
  display: flex;
44
50
  align-items: center;
45
- gap: 6px;
51
+ gap: 8px;
46
52
  flex-wrap: nowrap;
47
53
  flex: 0 0 auto;
48
54
  min-width: 0;
@@ -50,35 +56,38 @@ export const VIEWER_STYLES = `
50
56
 
51
57
  .toolbar-group-actions {
52
58
  margin-left: auto;
59
+ padding-left: 4px;
53
60
  }
54
61
 
55
62
  .toolbar button {
56
63
  appearance: none;
57
- border: 1px solid #cbd5e1;
64
+ border: 1px solid #d7dee8;
58
65
  background: #ffffff;
59
- color: #0f172a;
60
- border-radius: 999px;
61
- min-width: 32px;
62
- height: 34px;
63
- padding: 0 10px;
66
+ color: #334155;
67
+ border-radius: 10px;
68
+ min-width: 36px;
69
+ height: 36px;
70
+ padding: 0 12px;
64
71
  font: inherit;
65
- font-weight: 700;
72
+ font-size: 12px;
73
+ font-weight: 600;
66
74
  cursor: pointer;
67
75
  flex: 0 0 auto;
68
76
  transition:
69
- transform 140ms ease,
70
77
  background-color 180ms ease,
71
78
  border-color 180ms ease,
72
- box-shadow 180ms ease;
79
+ color 180ms ease;
80
+ white-space: nowrap;
73
81
  }
74
82
 
75
83
  .toolbar button:hover:not(:disabled) {
76
- transform: translateY(-1px);
77
- box-shadow: 0 10px 18px rgba(15, 23, 42, 0.08);
84
+ background: #f8fafc;
85
+ border-color: #cbd5e1;
86
+ color: #0f172a;
78
87
  }
79
88
 
80
89
  .toolbar button:active:not(:disabled) {
81
- transform: translateY(0);
90
+ background: #f1f5f9;
82
91
  }
83
92
 
84
93
  .toolbar button:disabled {
@@ -87,23 +96,67 @@ export const VIEWER_STYLES = `
87
96
  }
88
97
 
89
98
  .toolbar button.primary {
90
- background: #0f766e;
91
- border-color: #0f766e;
92
- color: #f8fafc;
99
+ background: #ffffff;
100
+ border-color: #d7dee8;
101
+ color: #0f766e;
102
+ }
103
+
104
+ .toolbar button.icon-button {
105
+ width: 36px;
106
+ min-width: 36px;
107
+ height: 36px;
108
+ padding: 0;
109
+ display: inline-flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ border-radius: 10px;
113
+ }
114
+
115
+ .toolbar button.icon-button svg {
116
+ width: 18px;
117
+ height: 18px;
118
+ display: block;
119
+ }
120
+
121
+ .toolbar button.compact {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ gap: 6px;
126
+ }
127
+
128
+ .toolbar button.compact .button-icon {
129
+ width: 14px;
130
+ height: 14px;
131
+ display: inline-flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ flex: 0 0 auto;
135
+ }
136
+
137
+ .toolbar button.compact .button-icon svg {
138
+ width: 14px;
139
+ height: 14px;
140
+ display: block;
141
+ }
142
+
143
+ .toolbar button.compact .button-label {
144
+ flex: 0 0 auto;
93
145
  }
94
146
 
95
147
  .toolbar .value {
96
148
  min-width: 56px;
97
149
  text-align: center;
98
- font-size: 13px;
99
- color: #475569;
150
+ font-size: 12px;
151
+ color: #64748b;
100
152
  flex: 0 0 auto;
153
+ font-variant-numeric: tabular-nums;
101
154
  }
102
155
 
103
156
  .stage {
157
+ flex: 1 1 auto;
104
158
  position: relative;
105
- min-height: 320px;
106
- max-height: 80vh;
159
+ min-height: 0;
107
160
  overflow: auto;
108
161
  scroll-behavior: smooth;
109
162
  overscroll-behavior: contain;
@@ -118,6 +171,10 @@ export const VIEWER_STYLES = `
118
171
  place-items: center;
119
172
  }
120
173
 
174
+ .stage.native-stage {
175
+ display: block;
176
+ }
177
+
121
178
  .page-stack {
122
179
  display: flex;
123
180
  flex-direction: column;
@@ -150,6 +207,53 @@ canvas {
150
207
  transition: filter 180ms ease;
151
208
  }
152
209
 
210
+ .native-page {
211
+ width: 100%;
212
+ min-height: calc(100% - 32px);
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 12px;
216
+ padding: 12px;
217
+ }
218
+
219
+ .native-frame {
220
+ width: 100%;
221
+ min-height: 70vh;
222
+ flex: 1 1 auto;
223
+ border: 0;
224
+ border-radius: 12px;
225
+ background: #ffffff;
226
+ }
227
+
228
+ .native-actions {
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: space-between;
232
+ gap: 12px;
233
+ flex-wrap: wrap;
234
+ }
235
+
236
+ .native-note {
237
+ margin: 0;
238
+ color: #475569;
239
+ font-size: 13px;
240
+ line-height: 1.5;
241
+ }
242
+
243
+ .native-link {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ min-height: 36px;
247
+ padding: 0 14px;
248
+ border-radius: 999px;
249
+ background: #0f766e;
250
+ color: #f8fafc;
251
+ font-size: 12px;
252
+ font-weight: 700;
253
+ text-decoration: none;
254
+ white-space: nowrap;
255
+ }
256
+
153
257
  .status {
154
258
  position: absolute;
155
259
  inset: 16px;
@@ -169,28 +273,101 @@ canvas {
169
273
  display: flex;
170
274
  }
171
275
 
276
+ :host([compact-ui]) .toolbar {
277
+ gap: 6px;
278
+ min-height: 52px;
279
+ padding: 10px 8px;
280
+ }
281
+
282
+ :host([compact-ui]) .toolbar-group {
283
+ gap: 6px;
284
+ }
285
+
286
+ :host([compact-ui]) .toolbar-group-actions {
287
+ margin-left: 0;
288
+ padding-left: 0;
289
+ }
290
+
291
+ :host([compact-ui]) .toolbar button {
292
+ min-width: 34px;
293
+ min-height: 36px;
294
+ height: 36px;
295
+ padding: 0 8px;
296
+ font-size: 11px;
297
+ border-radius: 9px;
298
+ }
299
+
300
+ :host([compact-ui]) .toolbar button.icon-button {
301
+ width: 36px;
302
+ min-width: 36px;
303
+ height: 36px;
304
+ padding: 0;
305
+ }
306
+
307
+ :host([compact-ui]) .toolbar button.compact {
308
+ width: 36px;
309
+ min-width: 36px;
310
+ padding: 0;
311
+ gap: 0;
312
+ }
313
+
314
+ :host([compact-ui]) .toolbar button.compact .button-label {
315
+ display: none;
316
+ }
317
+
318
+ :host([compact-ui]) .toolbar .value {
319
+ min-width: 42px;
320
+ font-size: 11px;
321
+ }
322
+
323
+ :host([compact-ui]) .stage {
324
+ padding: 12px;
325
+ }
326
+
172
327
  @media (max-width: 720px) {
173
328
  .toolbar {
174
- gap: 6px;
175
- padding: 8px 10px;
329
+ gap: 4px;
330
+ min-height: 44px;
331
+ padding: 8px;
332
+ }
333
+
334
+ .toolbar-group {
335
+ gap: 4px;
176
336
  }
177
337
 
178
338
  .toolbar button {
179
339
  min-width: 30px;
180
340
  min-height: 32px;
181
341
  height: 32px;
182
- padding: 0 8px;
183
- font-size: 12px;
342
+ padding: 0 7px;
343
+ font-size: 11px;
344
+ border-radius: 8px;
345
+ }
346
+
347
+ .toolbar button.icon-button {
348
+ width: 32px;
349
+ min-width: 32px;
350
+ height: 32px;
351
+ padding: 0;
352
+ }
353
+
354
+ .toolbar button.compact {
355
+ width: 32px;
356
+ min-width: 32px;
357
+ padding: 0;
358
+ gap: 0;
359
+ }
360
+
361
+ .toolbar button.compact .button-label {
362
+ display: none;
184
363
  }
185
364
 
186
365
  .toolbar .value {
187
- min-width: 48px;
188
- font-size: 12px;
366
+ min-width: 40px;
367
+ font-size: 11px;
189
368
  }
190
369
 
191
370
  .stage {
192
- max-height: none;
193
- min-height: 60vh;
194
371
  padding: 12px;
195
372
  }
196
373
  }
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgN5B,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiY5B,CAAC"}
package/dist/types.d.ts CHANGED
@@ -13,6 +13,7 @@ export interface GenusPdfViewerConfig {
13
13
  showToolbar?: boolean;
14
14
  allowDownload?: boolean;
15
15
  workerSrc?: string;
16
+ proxyUrl?: string | false;
16
17
  withCredentials?: boolean;
17
18
  httpHeaders?: Record<string, string>;
18
19
  }
@@ -31,6 +32,8 @@ export interface GenusPdfViewerZoomChangeEventDetail {
31
32
  export interface GenusPdfViewerErrorEventDetail {
32
33
  error: unknown;
33
34
  message: string;
35
+ code?: "cors" | "network" | "unknown";
36
+ sourceUrl?: string;
34
37
  }
35
38
  export interface GenusPdfViewerEventMap {
36
39
  ready: GenusPdfViewerReadyEventDetail;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,8BAA8B,CAAC;IACtC,UAAU,EAAE,mCAAmC,CAAC;IAChD,UAAU,EAAE,mCAAmC,CAAC;IAChD,KAAK,EAAE,8BAA8B,CAAC;CACvC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,8BAA8B,CAAC;IACtC,UAAU,EAAE,mCAAmC,CAAC;IAChD,UAAU,EAAE,mCAAmC,CAAC;IAChD,KAAK,EAAE,8BAA8B,CAAC;CACvC"}
package/dist/types.js CHANGED
File without changes
package/dist/types.js.map CHANGED
File without changes
package/dist/viewer.d.ts CHANGED
@@ -1,4 +1,11 @@
1
1
  import type { GenusPdfViewerConfig } from "./types.js";
2
+ export declare const PDF_WORKER_BOOTSTRAP_ASSET_PATH = "assets/pdf.worker.bootstrap.mjs";
3
+ export type ResolveDefaultPdfWorkerSrcOptions = {
4
+ moduleUrl?: string;
5
+ baseUri?: string;
6
+ };
7
+ export declare function releaseDefaultPdfWorkerSrc(): void;
8
+ export declare function resolveDefaultPdfWorkerSrc(options?: ResolveDefaultPdfWorkerSrcOptions): string;
2
9
  export declare class GenusPdfViewerElement extends HTMLElement {
3
10
  #private;
4
11
  static get observedAttributes(): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EAMrB,MAAM,YAAY,CAAC;AA+MpB,qBAAa,qBAAsB,SAAQ,WAAW;;IACpD,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;;IAiID,iBAAiB,IAAI,IAAI;IAkBzB,oBAAoB,IAAI,IAAI;IAK5B,wBAAwB,IAAI,IAAI;IAOhC,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IA+DvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAiV/B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,qBAAqB,CAAC;KAC3C;CACF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,SAAuB,GAAG,IAAI,CAIhF;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,oBAAoB,GAC3B,qBAAqB,CAMvB"}
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAMrB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,+BAA+B,oCAAoC,CAAC;AA4XjF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAgCF,wBAAgB,0BAA0B,IAAI,IAAI,CAUjD;AAED,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iCAAsC,GAC9C,MAAM,CAqBR;AAgUD,qBAAa,qBAAsB,SAAQ,WAAW;;IACpD,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAYxC;;IAqKD,iBAAiB,IAAI,IAAI;IAqBzB,oBAAoB,IAAI,IAAI;IAM5B,wBAAwB,IAAI,IAAI;IAOhC,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAgEvC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAkiB/B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,qBAAqB,CAAC;KAC3C;CACF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,SAAuB,GAAG,IAAI,CAIhF;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,oBAAoB,GAC3B,qBAAqB,CAMvB"}