@dexto/server 1.6.16 → 1.6.18
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/events/a2a-sse-subscriber.cjs +9 -2
- package/dist/events/a2a-sse-subscriber.d.ts.map +1 -1
- package/dist/events/a2a-sse-subscriber.js +9 -2
- package/dist/events/usage-event-subscriber.cjs +263 -0
- package/dist/events/usage-event-subscriber.d.ts +35 -0
- package/dist/events/usage-event-subscriber.d.ts.map +1 -0
- package/dist/events/usage-event-subscriber.js +244 -0
- package/dist/events/usage-event-types.cjs +16 -0
- package/dist/events/usage-event-types.d.ts +33 -0
- package/dist/events/usage-event-types.d.ts.map +1 -0
- package/dist/events/usage-event-types.js +0 -0
- package/dist/hono/__tests__/test-fixtures.cjs +3 -2
- package/dist/hono/__tests__/test-fixtures.d.ts +6 -2
- package/dist/hono/__tests__/test-fixtures.d.ts.map +1 -1
- package/dist/hono/__tests__/test-fixtures.js +3 -2
- package/dist/hono/index.d.ts +245 -33
- package/dist/hono/index.d.ts.map +1 -1
- package/dist/hono/routes/a2a-tasks.d.ts +9 -9
- package/dist/hono/routes/approvals.cjs +94 -6
- package/dist/hono/routes/approvals.d.ts +22 -6
- package/dist/hono/routes/approvals.d.ts.map +1 -1
- package/dist/hono/routes/approvals.js +94 -6
- package/dist/hono/routes/messages.cjs +16 -5
- package/dist/hono/routes/messages.d.ts +6 -0
- package/dist/hono/routes/messages.d.ts.map +1 -1
- package/dist/hono/routes/messages.js +17 -6
- package/dist/hono/routes/search.d.ts +10 -0
- package/dist/hono/routes/search.d.ts.map +1 -1
- package/dist/hono/routes/sessions.cjs +251 -2
- package/dist/hono/routes/sessions.d.ts +198 -18
- package/dist/hono/routes/sessions.d.ts.map +1 -1
- package/dist/hono/routes/sessions.js +259 -3
- package/dist/hono/routes/system-prompt.d.ts +1 -1
- package/dist/hono/schemas/responses.cjs +48 -8
- package/dist/hono/schemas/responses.d.ts +489 -22
- package/dist/hono/schemas/responses.d.ts.map +1 -1
- package/dist/hono/schemas/responses.js +49 -9
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/package.json +9 -9
|
@@ -15,9 +15,9 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
15
15
|
inputTokens: number;
|
|
16
16
|
outputTokens: number;
|
|
17
17
|
reasoningTokens: number;
|
|
18
|
-
totalTokens: number;
|
|
19
18
|
cacheReadTokens: number;
|
|
20
19
|
cacheWriteTokens: number;
|
|
20
|
+
totalTokens: number;
|
|
21
21
|
} | undefined;
|
|
22
22
|
estimatedCost?: number | undefined;
|
|
23
23
|
modelStats?: {
|
|
@@ -25,17 +25,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
25
25
|
inputTokens: number;
|
|
26
26
|
outputTokens: number;
|
|
27
27
|
reasoningTokens: number;
|
|
28
|
-
totalTokens: number;
|
|
29
28
|
cacheReadTokens: number;
|
|
30
29
|
cacheWriteTokens: number;
|
|
30
|
+
totalTokens: number;
|
|
31
31
|
};
|
|
32
|
+
estimatedCost: number;
|
|
32
33
|
model: string;
|
|
33
34
|
provider: string;
|
|
34
35
|
messageCount: number;
|
|
35
|
-
estimatedCost: number;
|
|
36
36
|
firstUsedAt: number;
|
|
37
37
|
lastUsedAt: number;
|
|
38
38
|
}[] | undefined;
|
|
39
|
+
usageTracking?: {
|
|
40
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
41
|
+
} | undefined;
|
|
39
42
|
workspaceId?: string | null | undefined;
|
|
40
43
|
parentSessionId?: string | null | undefined;
|
|
41
44
|
}[];
|
|
@@ -63,9 +66,9 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
63
66
|
inputTokens: number;
|
|
64
67
|
outputTokens: number;
|
|
65
68
|
reasoningTokens: number;
|
|
66
|
-
totalTokens: number;
|
|
67
69
|
cacheReadTokens: number;
|
|
68
70
|
cacheWriteTokens: number;
|
|
71
|
+
totalTokens: number;
|
|
69
72
|
} | undefined;
|
|
70
73
|
estimatedCost?: number | undefined;
|
|
71
74
|
modelStats?: {
|
|
@@ -73,17 +76,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
73
76
|
inputTokens: number;
|
|
74
77
|
outputTokens: number;
|
|
75
78
|
reasoningTokens: number;
|
|
76
|
-
totalTokens: number;
|
|
77
79
|
cacheReadTokens: number;
|
|
78
80
|
cacheWriteTokens: number;
|
|
81
|
+
totalTokens: number;
|
|
79
82
|
};
|
|
83
|
+
estimatedCost: number;
|
|
80
84
|
model: string;
|
|
81
85
|
provider: string;
|
|
82
86
|
messageCount: number;
|
|
83
|
-
estimatedCost: number;
|
|
84
87
|
firstUsedAt: number;
|
|
85
88
|
lastUsedAt: number;
|
|
86
89
|
}[] | undefined;
|
|
90
|
+
usageTracking?: {
|
|
91
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
92
|
+
} | undefined;
|
|
87
93
|
workspaceId?: string | null | undefined;
|
|
88
94
|
parentSessionId?: string | null | undefined;
|
|
89
95
|
};
|
|
@@ -111,9 +117,9 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
111
117
|
inputTokens: number;
|
|
112
118
|
outputTokens: number;
|
|
113
119
|
reasoningTokens: number;
|
|
114
|
-
totalTokens: number;
|
|
115
120
|
cacheReadTokens: number;
|
|
116
121
|
cacheWriteTokens: number;
|
|
122
|
+
totalTokens: number;
|
|
117
123
|
} | undefined;
|
|
118
124
|
estimatedCost?: number | undefined;
|
|
119
125
|
modelStats?: {
|
|
@@ -121,17 +127,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
121
127
|
inputTokens: number;
|
|
122
128
|
outputTokens: number;
|
|
123
129
|
reasoningTokens: number;
|
|
124
|
-
totalTokens: number;
|
|
125
130
|
cacheReadTokens: number;
|
|
126
131
|
cacheWriteTokens: number;
|
|
132
|
+
totalTokens: number;
|
|
127
133
|
};
|
|
134
|
+
estimatedCost: number;
|
|
128
135
|
model: string;
|
|
129
136
|
provider: string;
|
|
130
137
|
messageCount: number;
|
|
131
|
-
estimatedCost: number;
|
|
132
138
|
firstUsedAt: number;
|
|
133
139
|
lastUsedAt: number;
|
|
134
140
|
}[] | undefined;
|
|
141
|
+
usageTracking?: {
|
|
142
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
143
|
+
} | undefined;
|
|
135
144
|
workspaceId?: string | null | undefined;
|
|
136
145
|
parentSessionId?: string | null | undefined;
|
|
137
146
|
};
|
|
@@ -178,9 +187,9 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
178
187
|
inputTokens: number;
|
|
179
188
|
outputTokens: number;
|
|
180
189
|
reasoningTokens: number;
|
|
181
|
-
totalTokens: number;
|
|
182
190
|
cacheReadTokens: number;
|
|
183
191
|
cacheWriteTokens: number;
|
|
192
|
+
totalTokens: number;
|
|
184
193
|
} | undefined;
|
|
185
194
|
estimatedCost?: number | undefined;
|
|
186
195
|
modelStats?: {
|
|
@@ -188,17 +197,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
188
197
|
inputTokens: number;
|
|
189
198
|
outputTokens: number;
|
|
190
199
|
reasoningTokens: number;
|
|
191
|
-
totalTokens: number;
|
|
192
200
|
cacheReadTokens: number;
|
|
193
201
|
cacheWriteTokens: number;
|
|
202
|
+
totalTokens: number;
|
|
194
203
|
};
|
|
204
|
+
estimatedCost: number;
|
|
195
205
|
model: string;
|
|
196
206
|
provider: string;
|
|
197
207
|
messageCount: number;
|
|
198
|
-
estimatedCost: number;
|
|
199
208
|
firstUsedAt: number;
|
|
200
209
|
lastUsedAt: number;
|
|
201
210
|
}[] | undefined;
|
|
211
|
+
usageTracking?: {
|
|
212
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
213
|
+
} | undefined;
|
|
202
214
|
workspaceId?: string | null | undefined;
|
|
203
215
|
parentSessionId?: string | null | undefined;
|
|
204
216
|
};
|
|
@@ -244,6 +256,7 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
244
256
|
} | undefined;
|
|
245
257
|
})[] | null;
|
|
246
258
|
role: "system" | "user" | "assistant" | "tool";
|
|
259
|
+
usageScopeId?: string | undefined;
|
|
247
260
|
id?: string | undefined;
|
|
248
261
|
name?: string | undefined;
|
|
249
262
|
timestamp?: number | undefined;
|
|
@@ -252,8 +265,12 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
252
265
|
inputTokens?: number | undefined;
|
|
253
266
|
outputTokens?: number | undefined;
|
|
254
267
|
reasoningTokens?: number | undefined;
|
|
268
|
+
cacheReadTokens?: number | undefined;
|
|
269
|
+
cacheWriteTokens?: number | undefined;
|
|
255
270
|
totalTokens?: number | undefined;
|
|
256
271
|
} | undefined;
|
|
272
|
+
estimatedCost?: number | undefined;
|
|
273
|
+
pricingStatus?: "estimated" | "unpriced" | undefined;
|
|
257
274
|
model?: string | undefined;
|
|
258
275
|
provider?: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere" | "minimax" | "glm" | "openrouter" | "litellm" | "glama" | "vertex" | "bedrock" | "local" | "ollama" | "dexto-nova" | undefined;
|
|
259
276
|
toolCalls?: {
|
|
@@ -273,6 +290,93 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
273
290
|
status: 200;
|
|
274
291
|
};
|
|
275
292
|
};
|
|
293
|
+
} & {
|
|
294
|
+
"/sessions/:sessionId/system-prompt/contributors": {
|
|
295
|
+
$get: {
|
|
296
|
+
input: {
|
|
297
|
+
param: {
|
|
298
|
+
sessionId: string;
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
output: never;
|
|
302
|
+
outputFormat: "json";
|
|
303
|
+
status: 404;
|
|
304
|
+
} | {
|
|
305
|
+
input: {
|
|
306
|
+
param: {
|
|
307
|
+
sessionId: string;
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
output: {
|
|
311
|
+
contributors: {
|
|
312
|
+
id: string;
|
|
313
|
+
priority: number;
|
|
314
|
+
}[];
|
|
315
|
+
};
|
|
316
|
+
outputFormat: "json";
|
|
317
|
+
status: 200;
|
|
318
|
+
};
|
|
319
|
+
};
|
|
320
|
+
} & {
|
|
321
|
+
"/sessions/:sessionId/system-prompt/contributors": {
|
|
322
|
+
$post: {
|
|
323
|
+
input: {
|
|
324
|
+
param: {
|
|
325
|
+
sessionId: string;
|
|
326
|
+
};
|
|
327
|
+
} & {
|
|
328
|
+
json: {
|
|
329
|
+
id: string;
|
|
330
|
+
content?: string | undefined;
|
|
331
|
+
enabled?: boolean | undefined;
|
|
332
|
+
priority?: number | undefined;
|
|
333
|
+
};
|
|
334
|
+
};
|
|
335
|
+
output: never;
|
|
336
|
+
outputFormat: "json";
|
|
337
|
+
status: 400;
|
|
338
|
+
} | {
|
|
339
|
+
input: {
|
|
340
|
+
param: {
|
|
341
|
+
sessionId: string;
|
|
342
|
+
};
|
|
343
|
+
} & {
|
|
344
|
+
json: {
|
|
345
|
+
id: string;
|
|
346
|
+
content?: string | undefined;
|
|
347
|
+
enabled?: boolean | undefined;
|
|
348
|
+
priority?: number | undefined;
|
|
349
|
+
};
|
|
350
|
+
};
|
|
351
|
+
output: never;
|
|
352
|
+
outputFormat: "json";
|
|
353
|
+
status: 404;
|
|
354
|
+
} | {
|
|
355
|
+
input: {
|
|
356
|
+
param: {
|
|
357
|
+
sessionId: string;
|
|
358
|
+
};
|
|
359
|
+
} & {
|
|
360
|
+
json: {
|
|
361
|
+
id: string;
|
|
362
|
+
content?: string | undefined;
|
|
363
|
+
enabled?: boolean | undefined;
|
|
364
|
+
priority?: number | undefined;
|
|
365
|
+
};
|
|
366
|
+
};
|
|
367
|
+
output: {
|
|
368
|
+
id: string;
|
|
369
|
+
enabled: boolean;
|
|
370
|
+
priority?: number | undefined;
|
|
371
|
+
replaced?: boolean | undefined;
|
|
372
|
+
removed?: boolean | undefined;
|
|
373
|
+
contentLength?: number | undefined;
|
|
374
|
+
truncated?: boolean | undefined;
|
|
375
|
+
};
|
|
376
|
+
outputFormat: "json";
|
|
377
|
+
status: 200;
|
|
378
|
+
};
|
|
379
|
+
};
|
|
276
380
|
} & {
|
|
277
381
|
"/sessions/:sessionId": {
|
|
278
382
|
$delete: {
|
|
@@ -326,14 +430,68 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
326
430
|
createdAt: number | null;
|
|
327
431
|
lastActivity: number | null;
|
|
328
432
|
isBusy: boolean;
|
|
433
|
+
usageSummary: {
|
|
434
|
+
tokenUsage: {
|
|
435
|
+
inputTokens: number;
|
|
436
|
+
outputTokens: number;
|
|
437
|
+
reasoningTokens: number;
|
|
438
|
+
cacheReadTokens: number;
|
|
439
|
+
cacheWriteTokens: number;
|
|
440
|
+
totalTokens: number;
|
|
441
|
+
};
|
|
442
|
+
estimatedCost: number;
|
|
443
|
+
hasUnpricedResponses: boolean;
|
|
444
|
+
modelStats?: {
|
|
445
|
+
tokenUsage: {
|
|
446
|
+
inputTokens: number;
|
|
447
|
+
outputTokens: number;
|
|
448
|
+
reasoningTokens: number;
|
|
449
|
+
cacheReadTokens: number;
|
|
450
|
+
cacheWriteTokens: number;
|
|
451
|
+
totalTokens: number;
|
|
452
|
+
};
|
|
453
|
+
estimatedCost: number;
|
|
454
|
+
model: string;
|
|
455
|
+
provider: string;
|
|
456
|
+
messageCount: number;
|
|
457
|
+
}[] | undefined;
|
|
458
|
+
};
|
|
459
|
+
activeUsageScopeId: string | null;
|
|
460
|
+
activeUsageScope: {
|
|
461
|
+
tokenUsage: {
|
|
462
|
+
inputTokens: number;
|
|
463
|
+
outputTokens: number;
|
|
464
|
+
reasoningTokens: number;
|
|
465
|
+
cacheReadTokens: number;
|
|
466
|
+
cacheWriteTokens: number;
|
|
467
|
+
totalTokens: number;
|
|
468
|
+
};
|
|
469
|
+
estimatedCost: number;
|
|
470
|
+
hasUnpricedResponses: boolean;
|
|
471
|
+
scopeId: string;
|
|
472
|
+
modelStats?: {
|
|
473
|
+
tokenUsage: {
|
|
474
|
+
inputTokens: number;
|
|
475
|
+
outputTokens: number;
|
|
476
|
+
reasoningTokens: number;
|
|
477
|
+
cacheReadTokens: number;
|
|
478
|
+
cacheWriteTokens: number;
|
|
479
|
+
totalTokens: number;
|
|
480
|
+
};
|
|
481
|
+
estimatedCost: number;
|
|
482
|
+
model: string;
|
|
483
|
+
provider: string;
|
|
484
|
+
messageCount: number;
|
|
485
|
+
}[] | undefined;
|
|
486
|
+
} | null;
|
|
329
487
|
title?: string | null | undefined;
|
|
330
488
|
tokenUsage?: {
|
|
331
489
|
inputTokens: number;
|
|
332
490
|
outputTokens: number;
|
|
333
491
|
reasoningTokens: number;
|
|
334
|
-
totalTokens: number;
|
|
335
492
|
cacheReadTokens: number;
|
|
336
493
|
cacheWriteTokens: number;
|
|
494
|
+
totalTokens: number;
|
|
337
495
|
} | undefined;
|
|
338
496
|
estimatedCost?: number | undefined;
|
|
339
497
|
modelStats?: {
|
|
@@ -341,17 +499,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
341
499
|
inputTokens: number;
|
|
342
500
|
outputTokens: number;
|
|
343
501
|
reasoningTokens: number;
|
|
344
|
-
totalTokens: number;
|
|
345
502
|
cacheReadTokens: number;
|
|
346
503
|
cacheWriteTokens: number;
|
|
504
|
+
totalTokens: number;
|
|
347
505
|
};
|
|
506
|
+
estimatedCost: number;
|
|
348
507
|
model: string;
|
|
349
508
|
provider: string;
|
|
350
509
|
messageCount: number;
|
|
351
|
-
estimatedCost: number;
|
|
352
510
|
firstUsedAt: number;
|
|
353
511
|
lastUsedAt: number;
|
|
354
512
|
}[] | undefined;
|
|
513
|
+
usageTracking?: {
|
|
514
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
515
|
+
} | undefined;
|
|
355
516
|
workspaceId?: string | null | undefined;
|
|
356
517
|
parentSessionId?: string | null | undefined;
|
|
357
518
|
};
|
|
@@ -371,6 +532,22 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
371
532
|
status: 404;
|
|
372
533
|
};
|
|
373
534
|
};
|
|
535
|
+
} & {
|
|
536
|
+
"/sessions/:sessionId/clear-context": {
|
|
537
|
+
$post: {
|
|
538
|
+
input: {
|
|
539
|
+
param: {
|
|
540
|
+
sessionId: string;
|
|
541
|
+
};
|
|
542
|
+
};
|
|
543
|
+
output: {
|
|
544
|
+
status: "context cleared";
|
|
545
|
+
sessionId: string;
|
|
546
|
+
};
|
|
547
|
+
outputFormat: "json";
|
|
548
|
+
status: 200;
|
|
549
|
+
};
|
|
550
|
+
};
|
|
374
551
|
} & {
|
|
375
552
|
"/sessions/:sessionId": {
|
|
376
553
|
$patch: {
|
|
@@ -394,9 +571,9 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
394
571
|
inputTokens: number;
|
|
395
572
|
outputTokens: number;
|
|
396
573
|
reasoningTokens: number;
|
|
397
|
-
totalTokens: number;
|
|
398
574
|
cacheReadTokens: number;
|
|
399
575
|
cacheWriteTokens: number;
|
|
576
|
+
totalTokens: number;
|
|
400
577
|
} | undefined;
|
|
401
578
|
estimatedCost?: number | undefined;
|
|
402
579
|
modelStats?: {
|
|
@@ -404,17 +581,20 @@ export declare function createSessionsRouter(getAgent: GetAgentFn): OpenAPIHono<
|
|
|
404
581
|
inputTokens: number;
|
|
405
582
|
outputTokens: number;
|
|
406
583
|
reasoningTokens: number;
|
|
407
|
-
totalTokens: number;
|
|
408
584
|
cacheReadTokens: number;
|
|
409
585
|
cacheWriteTokens: number;
|
|
586
|
+
totalTokens: number;
|
|
410
587
|
};
|
|
588
|
+
estimatedCost: number;
|
|
411
589
|
model: string;
|
|
412
590
|
provider: string;
|
|
413
591
|
messageCount: number;
|
|
414
|
-
estimatedCost: number;
|
|
415
592
|
firstUsedAt: number;
|
|
416
593
|
lastUsedAt: number;
|
|
417
594
|
}[] | undefined;
|
|
595
|
+
usageTracking?: {
|
|
596
|
+
hasUntrackedChatGPTLoginUsage?: boolean | undefined;
|
|
597
|
+
} | undefined;
|
|
418
598
|
workspaceId?: string | null | undefined;
|
|
419
599
|
parentSessionId?: string | null | undefined;
|
|
420
600
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAehE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwF9C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAowBxD"}
|