@nahisaho/katashiro-knowledge 0.1.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/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +7 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/knowledge-graph.d.ts +164 -0
- package/dist/graph/knowledge-graph.d.ts.map +1 -0
- package/dist/graph/knowledge-graph.js +298 -0
- package/dist/graph/knowledge-graph.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +20 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +5 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/persistence/graph-persistence.d.ts +102 -0
- package/dist/persistence/graph-persistence.d.ts.map +1 -0
- package/dist/persistence/graph-persistence.js +222 -0
- package/dist/persistence/graph-persistence.js.map +1 -0
- package/dist/persistence/index.d.ts +7 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +7 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/query/graph-query.d.ts +103 -0
- package/dist/query/graph-query.d.ts.map +1 -0
- package/dist/query/graph-query.js +237 -0
- package/dist/query/graph-query.js.map +1 -0
- package/dist/query/index.d.ts +7 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +7 -0
- package/dist/query/index.js.map +1 -0
- package/dist/sync/graph-sync.d.ts +132 -0
- package/dist/sync/graph-sync.d.ts.map +1 -0
- package/dist/sync/graph-sync.js +338 -0
- package/dist/sync/graph-sync.js.map +1 -0
- package/dist/sync/index.d.ts +7 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +7 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/visualization/graph-visualization.d.ts +139 -0
- package/dist/visualization/graph-visualization.d.ts.map +1 -0
- package/dist/visualization/graph-visualization.js +259 -0
- package/dist/visualization/graph-visualization.js.map +1 -0
- package/dist/visualization/index.d.ts +7 -0
- package/dist/visualization/index.d.ts.map +1 -0
- package/dist/visualization/index.js +7 -0
- package/dist/visualization/index.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQuery - Query engine for KnowledgeGraph
|
|
3
|
+
*
|
|
4
|
+
* Provides query capabilities for searching and filtering graph data
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-knowledge
|
|
7
|
+
* @task TSK-042
|
|
8
|
+
*/
|
|
9
|
+
import { ok, err, isOk } from '@nahisaho/katashiro-core';
|
|
10
|
+
/**
|
|
11
|
+
* GraphQuery
|
|
12
|
+
*
|
|
13
|
+
* Query engine for KnowledgeGraph
|
|
14
|
+
*/
|
|
15
|
+
export class GraphQuery {
|
|
16
|
+
graph;
|
|
17
|
+
constructor(graph) {
|
|
18
|
+
this.graph = graph;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find all nodes of a given type
|
|
22
|
+
*
|
|
23
|
+
* @param type - Node type to find
|
|
24
|
+
* @returns Array of matching nodes
|
|
25
|
+
*/
|
|
26
|
+
findByType(type) {
|
|
27
|
+
try {
|
|
28
|
+
const nodes = this.graph.getNodesByType(type);
|
|
29
|
+
return ok(nodes);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find nodes with a specific property value
|
|
37
|
+
*
|
|
38
|
+
* @param property - Property name
|
|
39
|
+
* @param value - Property value
|
|
40
|
+
* @returns Array of matching nodes
|
|
41
|
+
*/
|
|
42
|
+
findByProperty(property, value) {
|
|
43
|
+
try {
|
|
44
|
+
const allNodes = this.graph.getAllNodes();
|
|
45
|
+
const matching = allNodes.filter((node) => node.properties[property] === value);
|
|
46
|
+
return ok(matching);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Find edges with a given predicate
|
|
54
|
+
*
|
|
55
|
+
* @param predicate - Edge predicate
|
|
56
|
+
* @returns Array of matching edges
|
|
57
|
+
*/
|
|
58
|
+
findByPredicate(predicate) {
|
|
59
|
+
try {
|
|
60
|
+
const edges = this.graph.getEdgesByPredicate(predicate);
|
|
61
|
+
return ok(edges);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Find nodes related to a given node
|
|
69
|
+
*
|
|
70
|
+
* @param nodeId - Source node ID
|
|
71
|
+
* @param predicate - Optional predicate filter
|
|
72
|
+
* @returns Array of related nodes
|
|
73
|
+
*/
|
|
74
|
+
findRelated(nodeId, predicate) {
|
|
75
|
+
try {
|
|
76
|
+
const neighborsResult = this.graph.getNeighbors(nodeId);
|
|
77
|
+
if (!isOk(neighborsResult)) {
|
|
78
|
+
return neighborsResult;
|
|
79
|
+
}
|
|
80
|
+
let neighbors = neighborsResult.value;
|
|
81
|
+
// Filter by predicate if specified
|
|
82
|
+
if (predicate) {
|
|
83
|
+
const edges = this.graph.getAllEdges();
|
|
84
|
+
const validTargets = new Set(edges
|
|
85
|
+
.filter((e) => e.source === nodeId && e.predicate === predicate)
|
|
86
|
+
.map((e) => e.target));
|
|
87
|
+
neighbors = neighbors.filter((n) => validTargets.has(n.id));
|
|
88
|
+
}
|
|
89
|
+
return ok(neighbors);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Search nodes by label
|
|
97
|
+
*
|
|
98
|
+
* @param query - Search query (case insensitive substring match)
|
|
99
|
+
* @returns Array of matching nodes
|
|
100
|
+
*/
|
|
101
|
+
search(query) {
|
|
102
|
+
try {
|
|
103
|
+
const nodes = this.graph.searchByLabel(query);
|
|
104
|
+
return ok(nodes);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Execute a structured query
|
|
112
|
+
*
|
|
113
|
+
* @param queryDef - Query definition
|
|
114
|
+
* @returns Query result
|
|
115
|
+
*/
|
|
116
|
+
execute(queryDef) {
|
|
117
|
+
const startTime = performance.now();
|
|
118
|
+
try {
|
|
119
|
+
let nodes;
|
|
120
|
+
// Start with type filter or all nodes
|
|
121
|
+
if (queryDef.type) {
|
|
122
|
+
nodes = this.graph.getNodesByType(queryDef.type);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
nodes = this.graph.getAllNodes();
|
|
126
|
+
}
|
|
127
|
+
// Apply filters
|
|
128
|
+
if (queryDef.filters) {
|
|
129
|
+
for (const filter of queryDef.filters) {
|
|
130
|
+
nodes = nodes.filter((node) => this.applyFilter(node, filter));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const totalCount = nodes.length;
|
|
134
|
+
// Apply sorting
|
|
135
|
+
if (queryDef.orderBy) {
|
|
136
|
+
const direction = queryDef.orderDirection === 'desc' ? -1 : 1;
|
|
137
|
+
nodes.sort((a, b) => {
|
|
138
|
+
const aVal = a.properties[queryDef.orderBy];
|
|
139
|
+
const bVal = b.properties[queryDef.orderBy];
|
|
140
|
+
if (typeof aVal === 'string' && typeof bVal === 'string') {
|
|
141
|
+
return aVal.localeCompare(bVal) * direction;
|
|
142
|
+
}
|
|
143
|
+
if (typeof aVal === 'number' && typeof bVal === 'number') {
|
|
144
|
+
return (aVal - bVal) * direction;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Apply pagination
|
|
150
|
+
if (queryDef.offset !== undefined) {
|
|
151
|
+
nodes = nodes.slice(queryDef.offset);
|
|
152
|
+
}
|
|
153
|
+
if (queryDef.limit !== undefined) {
|
|
154
|
+
nodes = nodes.slice(0, queryDef.limit);
|
|
155
|
+
}
|
|
156
|
+
const executionTime = performance.now() - startTime;
|
|
157
|
+
return ok({
|
|
158
|
+
nodes,
|
|
159
|
+
totalCount,
|
|
160
|
+
executionTime,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Aggregate nodes by a property
|
|
169
|
+
*
|
|
170
|
+
* @param operation - Aggregation operation
|
|
171
|
+
* @param groupBy - Property to group by
|
|
172
|
+
* @returns Aggregation result
|
|
173
|
+
*/
|
|
174
|
+
aggregate(operation, groupBy) {
|
|
175
|
+
try {
|
|
176
|
+
const nodes = this.graph.getAllNodes();
|
|
177
|
+
const groups = {};
|
|
178
|
+
for (const node of nodes) {
|
|
179
|
+
let key;
|
|
180
|
+
if (groupBy === 'type') {
|
|
181
|
+
key = node.type;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
key = String(node.properties[groupBy] ?? 'unknown');
|
|
185
|
+
}
|
|
186
|
+
if (!groups[key]) {
|
|
187
|
+
groups[key] = [];
|
|
188
|
+
}
|
|
189
|
+
groups[key].push(1);
|
|
190
|
+
}
|
|
191
|
+
const result = {};
|
|
192
|
+
for (const [key, values] of Object.entries(groups)) {
|
|
193
|
+
switch (operation) {
|
|
194
|
+
case 'count':
|
|
195
|
+
result[key] = values.length;
|
|
196
|
+
break;
|
|
197
|
+
case 'sum':
|
|
198
|
+
result[key] = values.reduce((a, b) => a + b, 0);
|
|
199
|
+
break;
|
|
200
|
+
case 'avg':
|
|
201
|
+
result[key] = values.reduce((a, b) => a + b, 0) / values.length;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return ok(result);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Apply a filter to a node
|
|
213
|
+
*/
|
|
214
|
+
applyFilter(node, filter) {
|
|
215
|
+
const value = node.properties[filter.property];
|
|
216
|
+
switch (filter.operator) {
|
|
217
|
+
case 'eq':
|
|
218
|
+
return value === filter.value;
|
|
219
|
+
case 'ne':
|
|
220
|
+
return value !== filter.value;
|
|
221
|
+
case 'gt':
|
|
222
|
+
return typeof value === 'number' && value > filter.value;
|
|
223
|
+
case 'lt':
|
|
224
|
+
return typeof value === 'number' && value < filter.value;
|
|
225
|
+
case 'gte':
|
|
226
|
+
return typeof value === 'number' && value >= filter.value;
|
|
227
|
+
case 'lte':
|
|
228
|
+
return typeof value === 'number' && value <= filter.value;
|
|
229
|
+
case 'contains':
|
|
230
|
+
return (typeof value === 'string' &&
|
|
231
|
+
value.toLowerCase().includes(String(filter.value).toLowerCase()));
|
|
232
|
+
default:
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=graph-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../src/query/graph-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,GAIX,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphSync - Synchronization between knowledge graphs
|
|
3
|
+
*
|
|
4
|
+
* Handles merging and syncing graph data between local and remote
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-knowledge
|
|
7
|
+
* @task TSK-044
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import { KnowledgeGraph, type GraphNode, type GraphEdge } from '../graph/knowledge-graph.js';
|
|
11
|
+
/**
|
|
12
|
+
* Sync options
|
|
13
|
+
*/
|
|
14
|
+
export interface SyncOptions {
|
|
15
|
+
/** Whether to update existing nodes/edges */
|
|
16
|
+
updateExisting?: boolean;
|
|
17
|
+
/** Conflict resolution strategy */
|
|
18
|
+
conflictResolution?: 'local' | 'remote' | 'newer';
|
|
19
|
+
/** Only sync specific node types */
|
|
20
|
+
nodeTypes?: string[];
|
|
21
|
+
/** Only sync specific predicates */
|
|
22
|
+
predicates?: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Sync result
|
|
26
|
+
*/
|
|
27
|
+
export interface SyncResult {
|
|
28
|
+
nodesAdded: number;
|
|
29
|
+
nodesUpdated: number;
|
|
30
|
+
nodesRemoved: number;
|
|
31
|
+
edgesAdded: number;
|
|
32
|
+
edgesUpdated: number;
|
|
33
|
+
edgesRemoved: number;
|
|
34
|
+
conflicts: Conflict[];
|
|
35
|
+
timestamp: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Comparison result
|
|
39
|
+
*/
|
|
40
|
+
export interface ComparisonResult {
|
|
41
|
+
localOnly: {
|
|
42
|
+
nodes: GraphNode[];
|
|
43
|
+
edges: GraphEdge[];
|
|
44
|
+
};
|
|
45
|
+
remoteOnly: {
|
|
46
|
+
nodes: GraphNode[];
|
|
47
|
+
edges: GraphEdge[];
|
|
48
|
+
};
|
|
49
|
+
modified: {
|
|
50
|
+
nodes: Array<{
|
|
51
|
+
local: GraphNode;
|
|
52
|
+
remote: GraphNode;
|
|
53
|
+
}>;
|
|
54
|
+
edges: Array<{
|
|
55
|
+
local: GraphEdge;
|
|
56
|
+
remote: GraphEdge;
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
59
|
+
identical: {
|
|
60
|
+
nodes: GraphNode[];
|
|
61
|
+
edges: GraphEdge[];
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Conflict representation
|
|
66
|
+
*/
|
|
67
|
+
export interface Conflict {
|
|
68
|
+
type: 'node' | 'edge';
|
|
69
|
+
id: string;
|
|
70
|
+
local: GraphNode | GraphEdge;
|
|
71
|
+
remote: GraphNode | GraphEdge;
|
|
72
|
+
field: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* GraphSync
|
|
76
|
+
*
|
|
77
|
+
* Synchronizes knowledge graphs between local and remote sources
|
|
78
|
+
*/
|
|
79
|
+
export declare class GraphSync {
|
|
80
|
+
private localGraph;
|
|
81
|
+
private remoteGraph;
|
|
82
|
+
private lastSyncTime;
|
|
83
|
+
constructor(localGraph: KnowledgeGraph, remoteGraph: KnowledgeGraph);
|
|
84
|
+
/**
|
|
85
|
+
* Compare local and remote graphs
|
|
86
|
+
*
|
|
87
|
+
* @returns Comparison result
|
|
88
|
+
*/
|
|
89
|
+
compare(): Result<ComparisonResult, Error>;
|
|
90
|
+
/**
|
|
91
|
+
* Pull changes from remote to local
|
|
92
|
+
*
|
|
93
|
+
* @param options - Sync options
|
|
94
|
+
* @returns Sync result
|
|
95
|
+
*/
|
|
96
|
+
pull(options?: SyncOptions): Result<SyncResult, Error>;
|
|
97
|
+
/**
|
|
98
|
+
* Push changes from local to remote
|
|
99
|
+
*
|
|
100
|
+
* @param options - Sync options
|
|
101
|
+
* @returns Sync result
|
|
102
|
+
*/
|
|
103
|
+
push(options?: SyncOptions): Result<SyncResult, Error>;
|
|
104
|
+
/**
|
|
105
|
+
* Bidirectional sync
|
|
106
|
+
*
|
|
107
|
+
* @param options - Sync options
|
|
108
|
+
* @returns Sync result
|
|
109
|
+
*/
|
|
110
|
+
sync(options?: SyncOptions): Result<SyncResult, Error>;
|
|
111
|
+
/**
|
|
112
|
+
* Get conflicts between graphs
|
|
113
|
+
*
|
|
114
|
+
* @returns Array of conflicts
|
|
115
|
+
*/
|
|
116
|
+
getConflicts(): Result<Conflict[], Error>;
|
|
117
|
+
/**
|
|
118
|
+
* Get last sync timestamp
|
|
119
|
+
*
|
|
120
|
+
* @returns Last sync timestamp or null
|
|
121
|
+
*/
|
|
122
|
+
getLastSyncTime(): string | null;
|
|
123
|
+
/**
|
|
124
|
+
* Check if a node has been modified
|
|
125
|
+
*/
|
|
126
|
+
private isNodeModified;
|
|
127
|
+
/**
|
|
128
|
+
* Check if an edge has been modified
|
|
129
|
+
*/
|
|
130
|
+
private isEdgeModified;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=graph-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-sync.d.ts","sourceRoot":"","sources":["../../src/sync/graph-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClD,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE;QACT,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,SAAS,CAAA;SAAE,CAAC,CAAC;QACtD,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,SAAS,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,SAAS;IAIlB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IAJrB,OAAO,CAAC,YAAY,CAAuB;gBAGjC,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,cAAc;IAGrC;;;;OAIG;IACH,OAAO,IAAI,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC;IAwE1C;;;;;OAKG;IACH,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC;IAuE1D;;;;;OAKG;IACH,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC;IAqE1D;;;;;OAKG;IACH,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC;IAoC1D;;;;OAIG;IACH,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;IAwCzC;;;;OAIG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAQvB"}
|