@tx5dr/plugin-api 1.0.0 → 1.2.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.
- package/README.md +135 -0
- package/dist/context.d.ts +27 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/definition.d.ts +35 -3
- package/dist/definition.d.ts.map +1 -1
- package/dist/helpers.d.ts +185 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/sync.d.ts +176 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +9 -0
- package/dist/sync.js.map +1 -0
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +48 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/utils/adif.d.ts +53 -0
- package/dist/utils/adif.d.ts.map +1 -0
- package/dist/utils/adif.js +421 -0
- package/dist/utils/adif.js.map +1 -0
- package/dist/utils/callsign.d.ts +17 -0
- package/dist/utils/callsign.d.ts.map +1 -0
- package/dist/utils/callsign.js +29 -0
- package/dist/utils/callsign.js.map +1 -0
- package/dist/utils/page-scope.d.ts +7 -0
- package/dist/utils/page-scope.d.ts.map +1 -0
- package/dist/utils/page-scope.js +18 -0
- package/dist/utils/page-scope.js.map +1 -0
- package/dist/utils/qso-text-fields.d.ts +9 -0
- package/dist/utils/qso-text-fields.d.ts.map +1 -0
- package/dist/utils/qso-text-fields.js +37 -0
- package/dist/utils/qso-text-fields.js.map +1 -0
- package/package.json +11 -4
- package/src/bridge.d.ts +147 -0
- package/tokens.css +60 -0
package/dist/sync.d.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logbook sync provider interfaces.
|
|
3
|
+
*
|
|
4
|
+
* A utility plugin registers a sync provider via `ctx.logbookSync.register()`
|
|
5
|
+
* during `onLoad`. The host manages per-callsign lifecycle, auto-upload on QSO
|
|
6
|
+
* completion, and renders the provider's settings page in the sync modal.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* A logbook sync provider implements the communication logic with a single
|
|
10
|
+
* external log service (e.g. LoTW, QRZ.com, WaveLog).
|
|
11
|
+
*
|
|
12
|
+
* All methods receive a `callsign` parameter because sync configuration and
|
|
13
|
+
* data are organized per-callsign. The provider is responsible for managing
|
|
14
|
+
* its own per-callsign state (typically via `ctx.store.global` keyed by
|
|
15
|
+
* callsign).
|
|
16
|
+
*
|
|
17
|
+
* The provider has full access to the logbook via `ctx.logbook` and is
|
|
18
|
+
* responsible for querying, writing and deduplicating QSO records internally.
|
|
19
|
+
* The host only routes user actions to provider methods — it does not read or
|
|
20
|
+
* write QSOs on the provider's behalf.
|
|
21
|
+
*/
|
|
22
|
+
export interface LogbookSyncProvider {
|
|
23
|
+
/** Stable service identifier (e.g. 'lotw', 'qrz', 'wavelog'). */
|
|
24
|
+
readonly id: string;
|
|
25
|
+
/** Display name (i18n key or literal text). */
|
|
26
|
+
readonly displayName: string;
|
|
27
|
+
/** Optional icon identifier (FontAwesome icon name or URL). */
|
|
28
|
+
readonly icon?: string;
|
|
29
|
+
/** Optional button color hint for the frontend (HeroUI color name). */
|
|
30
|
+
readonly color?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
|
|
31
|
+
/** Which audience may access this provider through host runtime routes. */
|
|
32
|
+
readonly accessScope?: 'admin' | 'operator';
|
|
33
|
+
/**
|
|
34
|
+
* ID of the settings page declared in `PluginDefinition.ui.pages`.
|
|
35
|
+
* The host renders this page inside `<PluginIframeHost>` in the sync
|
|
36
|
+
* settings modal, passing `{ callsign }` as params.
|
|
37
|
+
*/
|
|
38
|
+
readonly settingsPageId: string;
|
|
39
|
+
/**
|
|
40
|
+
* Custom sync action menu items. When declared, these replace the default
|
|
41
|
+
* three-item dropdown (download / upload / full_sync).
|
|
42
|
+
*
|
|
43
|
+
* Each action either performs an operation directly (`operation`) or opens
|
|
44
|
+
* an iframe page for user input before proceeding (`pageId`).
|
|
45
|
+
*/
|
|
46
|
+
readonly actions?: SyncAction[];
|
|
47
|
+
/** Tests whether the external service connection is healthy. */
|
|
48
|
+
testConnection(callsign: string): Promise<SyncTestResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Uploads QSO records to the external service.
|
|
51
|
+
*
|
|
52
|
+
* Manual uploads typically query the logbook via `ctx.logbook.queryQSOs()`
|
|
53
|
+
* internally to determine which records to upload. Auto-upload may pass a
|
|
54
|
+
* narrow `options.records` batch so providers can upload only the freshly
|
|
55
|
+
* completed QSOs without re-scanning the entire logbook.
|
|
56
|
+
*
|
|
57
|
+
* Providers remain responsible for updating any per-QSO sync fields
|
|
58
|
+
* (e.g. `lotwQslSent`) via `ctx.logbook.updateQSO()`.
|
|
59
|
+
*/
|
|
60
|
+
upload(callsign: string, options?: SyncUploadOptions): Promise<SyncUploadResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Optional host-visible upload readiness check.
|
|
63
|
+
*
|
|
64
|
+
* When implemented, the host may call this before upload/full-sync actions
|
|
65
|
+
* to surface blocked QSOs or missing configuration without starting upload.
|
|
66
|
+
*/
|
|
67
|
+
getUploadPreflight?(callsign: string): Promise<SyncUploadPreflightResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Downloads QSO confirmations/records from the external service.
|
|
70
|
+
*
|
|
71
|
+
* The provider writes downloaded records or QSL updates directly into the
|
|
72
|
+
* logbook via `ctx.logbook.addQSO()` / `ctx.logbook.updateQSO()`. It
|
|
73
|
+
* should call `ctx.logbook.notifyUpdated()` when done.
|
|
74
|
+
*/
|
|
75
|
+
download(callsign: string, options?: SyncDownloadOptions): Promise<SyncDownloadResult>;
|
|
76
|
+
/** Returns `true` when the provider is fully configured for this callsign. */
|
|
77
|
+
isConfigured(callsign: string): boolean;
|
|
78
|
+
/** Returns `true` when auto-upload is enabled for this callsign. */
|
|
79
|
+
isAutoUploadEnabled(callsign: string): boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Describes a single sync action menu item displayed in the frontend dropdown.
|
|
83
|
+
*
|
|
84
|
+
* Either `operation` or `pageId` must be set (not both):
|
|
85
|
+
* - `operation`: the host directly calls the corresponding provider method
|
|
86
|
+
* - `pageId`: the host opens an iframe page where the user provides input;
|
|
87
|
+
* the page then triggers the operation via `bridge.invoke()`.
|
|
88
|
+
*/
|
|
89
|
+
export interface SyncAction {
|
|
90
|
+
/** Unique action identifier within this provider. */
|
|
91
|
+
id: string;
|
|
92
|
+
/** Display label for the menu item. */
|
|
93
|
+
label: string;
|
|
94
|
+
/** Optional description text shown below the label. */
|
|
95
|
+
description?: string;
|
|
96
|
+
/** Icon hint: download / upload / sync. */
|
|
97
|
+
icon?: 'download' | 'upload' | 'sync';
|
|
98
|
+
/**
|
|
99
|
+
* When set, clicking this action opens the iframe page (registered in
|
|
100
|
+
* `PluginDefinition.ui.pages`) instead of directly executing an operation.
|
|
101
|
+
* The page is responsible for collecting user input and calling
|
|
102
|
+
* `bridge.invoke()` to trigger the actual sync.
|
|
103
|
+
*/
|
|
104
|
+
pageId?: string;
|
|
105
|
+
/**
|
|
106
|
+
* When set (and `pageId` is not), clicking this action directly triggers
|
|
107
|
+
* the corresponding provider method.
|
|
108
|
+
*/
|
|
109
|
+
operation?: 'upload' | 'download' | 'full_sync';
|
|
110
|
+
}
|
|
111
|
+
export interface SyncTestResult {
|
|
112
|
+
success: boolean;
|
|
113
|
+
/** Human-readable result description. */
|
|
114
|
+
message?: string;
|
|
115
|
+
/** Additional service-specific details (e.g. account info, logbook count). */
|
|
116
|
+
details?: unknown;
|
|
117
|
+
}
|
|
118
|
+
export interface SyncUploadResult {
|
|
119
|
+
uploaded: number;
|
|
120
|
+
skipped: number;
|
|
121
|
+
failed: number;
|
|
122
|
+
errors?: string[];
|
|
123
|
+
}
|
|
124
|
+
export interface SyncUploadOptions {
|
|
125
|
+
/** Distinguishes manual uploads from auto-upload triggered by QSO completion. */
|
|
126
|
+
trigger?: 'manual' | 'auto';
|
|
127
|
+
/**
|
|
128
|
+
* Optional explicit QSO batch supplied by the host.
|
|
129
|
+
*
|
|
130
|
+
* When present, providers should prefer this list over performing another
|
|
131
|
+
* logbook scan so auto-upload can stay scoped to the just-completed QSOs.
|
|
132
|
+
*/
|
|
133
|
+
records?: import('@tx5dr/contracts').QSORecord[];
|
|
134
|
+
}
|
|
135
|
+
export interface SyncPreflightIssue {
|
|
136
|
+
code: string;
|
|
137
|
+
severity: 'info' | 'warning' | 'error';
|
|
138
|
+
message: string;
|
|
139
|
+
}
|
|
140
|
+
export interface SyncUploadPreflightResult {
|
|
141
|
+
ready: boolean;
|
|
142
|
+
pendingCount: number;
|
|
143
|
+
uploadableCount: number;
|
|
144
|
+
blockedCount: number;
|
|
145
|
+
issues?: SyncPreflightIssue[];
|
|
146
|
+
guidance?: string[];
|
|
147
|
+
}
|
|
148
|
+
export interface SyncDownloadResult {
|
|
149
|
+
/** Number of records downloaded from the external service. */
|
|
150
|
+
downloaded: number;
|
|
151
|
+
/** Number of records matched to existing local QSOs. */
|
|
152
|
+
matched: number;
|
|
153
|
+
/** Number of local QSOs whose QSL status was updated. */
|
|
154
|
+
updated: number;
|
|
155
|
+
errors?: string[];
|
|
156
|
+
}
|
|
157
|
+
export interface SyncDownloadOptions {
|
|
158
|
+
/** Download records since this timestamp (epoch ms). */
|
|
159
|
+
since?: number;
|
|
160
|
+
/** Download records until this timestamp (epoch ms). */
|
|
161
|
+
until?: number;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Registration entry point exposed via `ctx.logbookSync`.
|
|
165
|
+
*/
|
|
166
|
+
export interface LogbookSyncRegistrar {
|
|
167
|
+
/**
|
|
168
|
+
* Registers a logbook sync provider. The host stores the reference and
|
|
169
|
+
* exposes it through the sync settings UI and auto-upload pipeline.
|
|
170
|
+
*
|
|
171
|
+
* A single plugin may register multiple providers (e.g. one plugin
|
|
172
|
+
* supporting both upload and download for different services).
|
|
173
|
+
*/
|
|
174
|
+
register(provider: LogbookSyncProvider): void;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logbook sync provider interfaces.
|
|
3
|
+
*
|
|
4
|
+
* A utility plugin registers a sync provider via `ctx.logbookSync.register()`
|
|
5
|
+
* during `onLoad`. The host manages per-callsign lifecycle, auto-upload on QSO
|
|
6
|
+
* completion, and renders the provider's settings page in the sync modal.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* import { createMockContext, createMockSlotInfo } from '@tx5dr/plugin-api/testing';
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
import type { KVStore, PluginLogger, PluginTimers, OperatorControl, RadioControl, LogbookAccess, BandAccess, UIBridge } from '../helpers.js';
|
|
12
|
+
import type { KVStore, PluginLogger, PluginTimers, OperatorControl, RadioControl, LogbookAccess, BandAccess, UIBridge, PluginFileStore } from '../helpers.js';
|
|
13
13
|
import type { PluginContext } from '../context.js';
|
|
14
14
|
import type { SlotInfo, ParsedFT8Message, ModeDescriptor } from '@tx5dr/contracts';
|
|
15
15
|
/** KVStore backed by an in-memory Map. Inspect `_data` in assertions. */
|
|
@@ -50,6 +50,7 @@ export declare function createMockRadioControl(overrides?: Partial<RadioControl>
|
|
|
50
50
|
export declare function createMockLogbookAccess(overrides?: Partial<LogbookAccess>): LogbookAccess;
|
|
51
51
|
export declare function createMockBandAccess(overrides?: Partial<BandAccess>): BandAccess;
|
|
52
52
|
export declare function createMockUIBridge(): MockUIBridge;
|
|
53
|
+
export declare function createMockFileStore(): PluginFileStore;
|
|
53
54
|
export interface MockPluginContextOptions {
|
|
54
55
|
/** Initial config values (default: empty). */
|
|
55
56
|
config?: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/index.js
CHANGED
|
@@ -16,6 +16,9 @@ export function createMockKVStore(initial) {
|
|
|
16
16
|
getAll() {
|
|
17
17
|
return Object.fromEntries(data);
|
|
18
18
|
},
|
|
19
|
+
async flush() {
|
|
20
|
+
// no-op in mock
|
|
21
|
+
},
|
|
19
22
|
};
|
|
20
23
|
}
|
|
21
24
|
// ===== Factory: Logger =====
|
|
@@ -96,10 +99,26 @@ export function createMockRadioControl(overrides) {
|
|
|
96
99
|
}
|
|
97
100
|
// ===== Factory: LogbookAccess =====
|
|
98
101
|
export function createMockLogbookAccess(overrides) {
|
|
102
|
+
const callsignAccess = {
|
|
103
|
+
callsign: 'N0CALL',
|
|
104
|
+
getLogBookId: async () => 'logbook-N0CALL',
|
|
105
|
+
queryQSOs: async () => [],
|
|
106
|
+
countQSOs: async () => 0,
|
|
107
|
+
addQSO: async () => { },
|
|
108
|
+
updateQSO: async () => { },
|
|
109
|
+
getStatistics: async () => null,
|
|
110
|
+
notifyUpdated: async () => { },
|
|
111
|
+
};
|
|
99
112
|
return {
|
|
100
113
|
hasWorked: async () => false,
|
|
101
114
|
hasWorkedDXCC: async () => false,
|
|
102
115
|
hasWorkedGrid: async () => false,
|
|
116
|
+
queryQSOs: async () => [],
|
|
117
|
+
countQSOs: async () => 0,
|
|
118
|
+
forCallsign: () => callsignAccess,
|
|
119
|
+
addQSO: async () => { },
|
|
120
|
+
updateQSO: async () => { },
|
|
121
|
+
notifyUpdated: async () => { },
|
|
103
122
|
...overrides,
|
|
104
123
|
};
|
|
105
124
|
}
|
|
@@ -123,6 +142,31 @@ export function createMockUIBridge() {
|
|
|
123
142
|
existing.push(data);
|
|
124
143
|
sentData.set(panelId, existing);
|
|
125
144
|
},
|
|
145
|
+
registerPageHandler(_handler) {
|
|
146
|
+
// no-op in mock
|
|
147
|
+
},
|
|
148
|
+
pushToSession(_pageSessionId, _action, _data) {
|
|
149
|
+
// no-op in mock
|
|
150
|
+
},
|
|
151
|
+
listActivePageSessions(_pageId) {
|
|
152
|
+
return [];
|
|
153
|
+
},
|
|
154
|
+
pushToPage(_pageId, _action, _data) {
|
|
155
|
+
// no-op in mock
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// ===== Factory: PluginFileStore =====
|
|
160
|
+
export function createMockFileStore() {
|
|
161
|
+
const storage = new Map();
|
|
162
|
+
return {
|
|
163
|
+
async write(p, data) { storage.set(p, data); },
|
|
164
|
+
async read(p) { return storage.get(p) ?? null; },
|
|
165
|
+
async delete(p) { return storage.delete(p); },
|
|
166
|
+
async list(prefix) {
|
|
167
|
+
const keys = Array.from(storage.keys());
|
|
168
|
+
return prefix ? keys.filter(k => k.startsWith(prefix)) : keys;
|
|
169
|
+
},
|
|
126
170
|
};
|
|
127
171
|
}
|
|
128
172
|
export function createMockContext(options) {
|
|
@@ -146,6 +190,8 @@ export function createMockContext(options) {
|
|
|
146
190
|
const radio = createMockRadioControl(opts.radio);
|
|
147
191
|
const logbook = createMockLogbookAccess(opts.logbook);
|
|
148
192
|
const band = createMockBandAccess(opts.band);
|
|
193
|
+
const files = createMockFileStore();
|
|
194
|
+
const logbookSync = { register() { } };
|
|
149
195
|
return {
|
|
150
196
|
config: opts.config ?? {},
|
|
151
197
|
store: { global: globalStore, operator: operatorStore },
|
|
@@ -156,6 +202,8 @@ export function createMockContext(options) {
|
|
|
156
202
|
logbook,
|
|
157
203
|
band,
|
|
158
204
|
ui,
|
|
205
|
+
files,
|
|
206
|
+
logbookSync,
|
|
159
207
|
};
|
|
160
208
|
}
|
|
161
209
|
// ===== Data factories =====
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADIF (Amateur Data Interchange Format) utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides parsing, generation and conversion of ADIF format records.
|
|
5
|
+
* Used by logbook sync plugins (WaveLog, QRZ, LoTW).
|
|
6
|
+
*/
|
|
7
|
+
import type { QSORecord } from '@tx5dr/contracts';
|
|
8
|
+
/**
|
|
9
|
+
* Format a Date as ADIF date string (YYYYMMDD).
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatADIFDate(date: Date): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format a Date as ADIF time string (HHMMSS).
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatADIFTime(date: Date): string;
|
|
16
|
+
/**
|
|
17
|
+
* Parse ADIF date and time strings into an ISO date string.
|
|
18
|
+
* @param dateStr ADIF date format YYYYMMDD
|
|
19
|
+
* @param timeStr ADIF time format HHMMSS or HHMM
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseADIFDateTime(dateStr: string, timeStr: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Convert a QSORecord to a single ADIF record string.
|
|
24
|
+
*/
|
|
25
|
+
export declare function convertQSOToADIF(qso: QSORecord, options?: {
|
|
26
|
+
includeStationCallsign?: boolean;
|
|
27
|
+
includeMyGrid?: boolean;
|
|
28
|
+
}): string;
|
|
29
|
+
/**
|
|
30
|
+
* Parse ADIF field string into key-value pairs.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseADIFFields(recordStr: string): Record<string, string>;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a single ADIF record string into a QSORecord.
|
|
35
|
+
* @param recordStr Single ADIF record string
|
|
36
|
+
* @param source Source identifier (used for ID generation)
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseADIFRecord(recordStr: string, source?: string): QSORecord | null;
|
|
39
|
+
/**
|
|
40
|
+
* Parse a complete ADIF content string into QSORecord array.
|
|
41
|
+
* @param adifContent Complete ADIF file content
|
|
42
|
+
* @param source Source identifier
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseADIFContent(adifContent: string, source?: string): QSORecord[];
|
|
45
|
+
/**
|
|
46
|
+
* Generate a complete ADIF file with header.
|
|
47
|
+
*/
|
|
48
|
+
export declare function generateADIFFile(qsos: QSORecord[], options?: {
|
|
49
|
+
programId?: string;
|
|
50
|
+
programVersion?: string;
|
|
51
|
+
includeStationCallsign?: boolean;
|
|
52
|
+
}): string;
|
|
53
|
+
//# sourceMappingURL=adif.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adif.d.ts","sourceRoot":"","sources":["../../src/utils/adif.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAoClD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKjD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAU1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;IACzD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,MAAM,CA2IT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAazE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,SAAS,GAAG,IAAI,CAkK5F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,SAAS,EAAE,CAqB1F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,MAAM,CAwBT"}
|