@untangle-code/file-graph 0.0.0-stage → 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/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +284 -2
- package/THIRD_PARTY_LICENSES.md +29 -0
- package/dist/assignment.d.ts +15 -0
- package/dist/assignment.d.ts.map +1 -0
- package/dist/assignment.js +75 -0
- package/dist/assignment.js.map +1 -0
- package/dist/boundaries/endpoints.d.ts +11 -0
- package/dist/boundaries/endpoints.d.ts.map +1 -0
- package/dist/boundaries/endpoints.js +195 -0
- package/dist/boundaries/endpoints.js.map +1 -0
- package/dist/boundaries/index.d.ts +9 -0
- package/dist/boundaries/index.d.ts.map +1 -0
- package/dist/boundaries/index.js +93 -0
- package/dist/boundaries/index.js.map +1 -0
- package/dist/boundaries/requests.d.ts +12 -0
- package/dist/boundaries/requests.d.ts.map +1 -0
- package/dist/boundaries/requests.js +311 -0
- package/dist/boundaries/requests.js.map +1 -0
- package/dist/edges.d.ts +49 -0
- package/dist/edges.d.ts.map +1 -0
- package/dist/edges.js +223 -0
- package/dist/edges.js.map +1 -0
- package/dist/file-index.d.ts +37 -0
- package/dist/file-index.d.ts.map +1 -0
- package/dist/file-index.js +103 -0
- package/dist/file-index.js.map +1 -0
- package/dist/graph.d.ts +160 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +448 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +67 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +272 -0
- package/dist/metrics.js.map +1 -0
- package/dist/package-catalog.d.ts +43 -0
- package/dist/package-catalog.d.ts.map +1 -0
- package/dist/package-catalog.js +136 -0
- package/dist/package-catalog.js.map +1 -0
- package/dist/paths.d.ts +56 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +129 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence.d.ts +83 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +538 -0
- package/dist/persistence.js.map +1 -0
- package/dist/resolve/candidates.d.ts +52 -0
- package/dist/resolve/candidates.d.ts.map +1 -0
- package/dist/resolve/candidates.js +202 -0
- package/dist/resolve/candidates.js.map +1 -0
- package/dist/resolve/package-exports.d.ts +31 -0
- package/dist/resolve/package-exports.d.ts.map +1 -0
- package/dist/resolve/package-exports.js +229 -0
- package/dist/resolve/package-exports.js.map +1 -0
- package/dist/resolve/pipeline.d.ts +11 -0
- package/dist/resolve/pipeline.d.ts.map +1 -0
- package/dist/resolve/pipeline.js +109 -0
- package/dist/resolve/pipeline.js.map +1 -0
- package/dist/resolve/resolvers.d.ts +25 -0
- package/dist/resolve/resolvers.d.ts.map +1 -0
- package/dist/resolve/resolvers.js +367 -0
- package/dist/resolve/resolvers.js.map +1 -0
- package/dist/restore.d.ts +75 -0
- package/dist/restore.d.ts.map +1 -0
- package/dist/restore.js +136 -0
- package/dist/restore.js.map +1 -0
- package/dist/topology/compose.d.ts +27 -0
- package/dist/topology/compose.d.ts.map +1 -0
- package/dist/topology/compose.js +208 -0
- package/dist/topology/compose.js.map +1 -0
- package/dist/topology/jsonc.d.ts +38 -0
- package/dist/topology/jsonc.d.ts.map +1 -0
- package/dist/topology/jsonc.js +137 -0
- package/dist/topology/jsonc.js.map +1 -0
- package/dist/topology/load.d.ts +61 -0
- package/dist/topology/load.d.ts.map +1 -0
- package/dist/topology/load.js +436 -0
- package/dist/topology/load.js.map +1 -0
- package/dist/topology/manifest.d.ts +48 -0
- package/dist/topology/manifest.d.ts.map +1 -0
- package/dist/topology/manifest.js +109 -0
- package/dist/topology/manifest.js.map +1 -0
- package/dist/topology/project-config.d.ts +39 -0
- package/dist/topology/project-config.d.ts.map +1 -0
- package/dist/topology/project-config.js +150 -0
- package/dist/topology/project-config.js.map +1 -0
- package/dist/topology/workspace-definition.d.ts +26 -0
- package/dist/topology/workspace-definition.d.ts.map +1 -0
- package/dist/topology/workspace-definition.js +104 -0
- package/dist/topology/workspace-definition.js.map +1 -0
- package/dist/traverse.d.ts +49 -0
- package/dist/traverse.d.ts.map +1 -0
- package/dist/traverse.js +167 -0
- package/dist/traverse.js.map +1 -0
- package/dist/types.d.ts +332 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -3
- package/src/assignment.ts +83 -0
- package/src/boundaries/endpoints.ts +273 -0
- package/src/boundaries/index.ts +118 -0
- package/src/boundaries/requests.ts +411 -0
- package/src/edges.ts +334 -0
- package/src/file-index.ts +127 -0
- package/src/graph.ts +591 -0
- package/src/index.ts +58 -0
- package/src/metrics.ts +350 -0
- package/src/package-catalog.ts +145 -0
- package/src/paths.ts +138 -0
- package/src/persistence.ts +746 -0
- package/src/resolve/candidates.ts +230 -0
- package/src/resolve/package-exports.ts +268 -0
- package/src/resolve/pipeline.ts +140 -0
- package/src/resolve/resolvers.ts +468 -0
- package/src/restore.ts +201 -0
- package/src/topology/compose.ts +268 -0
- package/src/topology/jsonc.ts +147 -0
- package/src/topology/load.ts +644 -0
- package/src/topology/manifest.ts +132 -0
- package/src/topology/project-config.ts +183 -0
- package/src/topology/workspace-definition.ts +115 -0
- package/src/traverse.ts +232 -0
- package/src/types.ts +372 -0
package/dist/paths.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pfadhilfen des Dateigraphen — ausschliesslich POSIX, ausschliesslich
|
|
3
|
+
* repo-relativ.
|
|
4
|
+
*
|
|
5
|
+
* Warum eigene Helfer statt `node:path`: der Dateigraph rechnet nie auf
|
|
6
|
+
* Betriebssystempfaden. Er kennt nur `"/"`-normalisierte, repo-relative
|
|
7
|
+
* Pfade (spec.md §5.4), und `node:path` auf Windows wuerde aus `a/b`
|
|
8
|
+
* beim Zusammensetzen `a\b` machen — damit haette dieselbe Codebasis auf
|
|
9
|
+
* zwei Maschinen zwei verschiedene `file_id`s. `node:path/posix` deckt
|
|
10
|
+
* einen Teil ab, liefert aber `".."`-Ergebnisse ausserhalb der Wurzel
|
|
11
|
+
* still zurueck; hier wird das zu `null` und damit zu einem benannten
|
|
12
|
+
* Fehlschlag (E4).
|
|
13
|
+
*/
|
|
14
|
+
/** Normalisiert Trennzeichen und entfernt fuehrende `"./"` sowie Mehrfachslashes. */
|
|
15
|
+
export function normalizePath(path) {
|
|
16
|
+
const forward = path.replace(/\\/g, "/");
|
|
17
|
+
const collapsed = forward.replace(/\/{2,}/g, "/");
|
|
18
|
+
const withoutLeadingDot = collapsed.startsWith("./") ? collapsed.slice(2) : collapsed;
|
|
19
|
+
const withoutLeadingSlash = withoutLeadingDot.startsWith("/")
|
|
20
|
+
? withoutLeadingDot.slice(1)
|
|
21
|
+
: withoutLeadingDot;
|
|
22
|
+
return withoutLeadingSlash.endsWith("/") && withoutLeadingSlash.length > 1
|
|
23
|
+
? withoutLeadingSlash.slice(0, -1)
|
|
24
|
+
: withoutLeadingSlash;
|
|
25
|
+
}
|
|
26
|
+
/** Verzeichnisanteil eines repo-relativen Pfades; `""` fuer Dateien in der Wurzel. */
|
|
27
|
+
export function dirnameOf(path) {
|
|
28
|
+
const normalized = normalizePath(path);
|
|
29
|
+
const index = normalized.lastIndexOf("/");
|
|
30
|
+
return index === -1 ? "" : normalized.slice(0, index);
|
|
31
|
+
}
|
|
32
|
+
/** Dateiname ohne Verzeichnisanteil. */
|
|
33
|
+
export function basenameOf(path) {
|
|
34
|
+
const normalized = normalizePath(path);
|
|
35
|
+
const index = normalized.lastIndexOf("/");
|
|
36
|
+
return index === -1 ? normalized : normalized.slice(index + 1);
|
|
37
|
+
}
|
|
38
|
+
/** Erweiterung inklusive Punkt, kleingeschrieben; `""` bei Dotfiles und ohne Punkt. */
|
|
39
|
+
export function extensionOf(path) {
|
|
40
|
+
const name = basenameOf(path);
|
|
41
|
+
const index = name.lastIndexOf(".");
|
|
42
|
+
if (index <= 0) {
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
return name.slice(index).toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Setzt einen Basispfad und ein Segment zusammen und loest `.`/`..` auf.
|
|
49
|
+
*
|
|
50
|
+
* Gibt `null` zurueck, wenn die Aufloesung ueber die Repositorywurzel
|
|
51
|
+
* hinauslaeuft. Ein Import wie `"../../../../etc/passwd"` aus `src/a.ts`
|
|
52
|
+
* ist damit ein benannter Fehlschlag und kein still auf `etc/passwd`
|
|
53
|
+
* gekuerzter Treffer.
|
|
54
|
+
*/
|
|
55
|
+
export function joinRelative(baseDir, segment) {
|
|
56
|
+
const base = normalizePath(baseDir);
|
|
57
|
+
const parts = base === "" ? [] : base.split("/");
|
|
58
|
+
const stack = [...parts];
|
|
59
|
+
for (const raw of normalizePath(segment).split("/")) {
|
|
60
|
+
if (raw === "" || raw === ".") {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (raw === "..") {
|
|
64
|
+
if (stack.length === 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
stack.pop();
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
stack.push(raw);
|
|
71
|
+
}
|
|
72
|
+
return stack.join("/");
|
|
73
|
+
}
|
|
74
|
+
/** True, wenn `path` unterhalb von `directory` liegt (oder gleich ist). */
|
|
75
|
+
export function isWithin(directory, path) {
|
|
76
|
+
const dir = normalizePath(directory);
|
|
77
|
+
const target = normalizePath(path);
|
|
78
|
+
if (dir === "" || dir === ".") {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return target === dir || target.startsWith(`${dir}/`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Pfad von `path` relativ zu `directory`; `null`, wenn `path` nicht darunter
|
|
85
|
+
* liegt. Bewusst kein `..`-Ergebnis: der Aufrufer will hier wissen, ob etwas
|
|
86
|
+
* INNERHALB eines Verzeichnisses liegt, nicht wie man hinaufkommt.
|
|
87
|
+
*/
|
|
88
|
+
export function relativeWithin(directory, path) {
|
|
89
|
+
if (!isWithin(directory, path)) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const dir = normalizePath(directory);
|
|
93
|
+
const target = normalizePath(path);
|
|
94
|
+
if (dir === "" || dir === ".") {
|
|
95
|
+
return target;
|
|
96
|
+
}
|
|
97
|
+
return target === dir ? "" : target.slice(dir.length + 1);
|
|
98
|
+
}
|
|
99
|
+
/** True fuer `"./x"`, `"../x"` und `"."`/`".."` selbst. */
|
|
100
|
+
export function isRelativeSpecifier(specifier) {
|
|
101
|
+
return specifier === "." || specifier === ".." || /^\.\.?\//.test(specifier);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Normalisiert nur die Trennzeichen und laesst einen fuehrenden `"/"` stehen.
|
|
105
|
+
*
|
|
106
|
+
* `normalizePath` ist fuer REPO-RELATIVE Pfade gedacht und entfernt deshalb
|
|
107
|
+
* einen fuehrenden Schraegstrich. Auf einen absoluten Wurzelpfad angewandt
|
|
108
|
+
* wuerde daraus ein relativer — und jeder Lesezugriff ginge ins Leere. Fuer
|
|
109
|
+
* absolute Pfade (Repositorywurzeln, Eintraege des Dateisystemports) gilt
|
|
110
|
+
* diese Funktion.
|
|
111
|
+
*/
|
|
112
|
+
export function normalizeSeparators(path) {
|
|
113
|
+
const forward = path.replace(/\\/g, "/").replace(/\/{2,}/g, "/");
|
|
114
|
+
return forward.length > 1 && forward.endsWith("/") ? forward.slice(0, -1) : forward;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Pfad von `path` relativ zur absoluten Wurzel `root`; `null`, wenn `path`
|
|
118
|
+
* nicht darunter liegt. Beide Angaben sind absolut.
|
|
119
|
+
*/
|
|
120
|
+
export function relativeToRoot(root, path) {
|
|
121
|
+
const normalizedRoot = normalizeSeparators(root);
|
|
122
|
+
const normalizedPath = normalizeSeparators(path);
|
|
123
|
+
if (normalizedPath === normalizedRoot) {
|
|
124
|
+
return "";
|
|
125
|
+
}
|
|
126
|
+
const prefix = normalizedRoot.endsWith("/") ? normalizedRoot : `${normalizedRoot}/`;
|
|
127
|
+
return normalizedPath.startsWith(prefix) ? normalizedPath.slice(prefix.length) : null;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ablage des Dateigraphen ueber den BESTEHENDEN `GraphStore`-Port
|
|
3
|
+
* (domain `ports.ts`, architecture.md §6.11, §11.6).
|
|
4
|
+
*
|
|
5
|
+
* ENTSCHEIDUNG: Dieses Paket definiert KEINEN eigenen Speicher-Port. Der
|
|
6
|
+
* `GraphStore` von `domain` hat mit `graph_files`, `graph_indices` und
|
|
7
|
+
* `graph_meta` genau die drei Sammlungen, die ein Dateigraph braucht, und es
|
|
8
|
+
* gibt bereits eine Kontraktsuite (`@untangle-code/testkit`,
|
|
9
|
+
* `runGraphStoreContract`) plus zwei Adapter dagegen. Ein zweiter Port haette
|
|
10
|
+
* dieselbe Semantik ein zweites Mal beschrieben und beide Adapter zur
|
|
11
|
+
* Doppelimplementierung gezwungen.
|
|
12
|
+
*
|
|
13
|
+
* SHARD-AUFTEILUNG:
|
|
14
|
+
* - `graph_meta` / `<workspace>:meta` — Metriken, Topologie, Skip-Ledger, Knotenzahl;
|
|
15
|
+
* - `graph_files` / `<workspace>:file:<file_id>` — ein Knoten samt seiner Kanten;
|
|
16
|
+
* - `graph_indices` / `<workspace>:by-path` — Repository + Pfad → `file_id`.
|
|
17
|
+
*
|
|
18
|
+
* Ein Shard je Datei (statt eines Riesenshards) ist Absicht: die inkrementelle
|
|
19
|
+
* Fortschreibung schreibt dann genau die Dateien zurueck, die sie neu gerechnet
|
|
20
|
+
* hat.
|
|
21
|
+
*/
|
|
22
|
+
import type { GraphShardV1, GraphStore, PortCallOptions } from "@untangle-code/domain";
|
|
23
|
+
import type { FileGraphSnapshotV1 } from "./types.js";
|
|
24
|
+
/** Vor Wave 8 verwendete globale Metadaten-ID; nur fuer expliziten Legacy-Fallback. */
|
|
25
|
+
export declare const META_SHARD_ID = "meta";
|
|
26
|
+
/** Vor Wave 8 verwendete globale Pfadindex-ID; nur fuer expliziten Legacy-Fallback. */
|
|
27
|
+
export declare const PATH_INDEX_SHARD_ID = "by-path";
|
|
28
|
+
/** Versionierter Praefix der workspace-sicheren Dateigraph-Shards. */
|
|
29
|
+
export declare const FILE_GRAPH_SHARD_NAMESPACE = "untangle:file-graph:v1";
|
|
30
|
+
/** Der vollstaendige Geltungsbereich eines persistierten Graphabbilds. */
|
|
31
|
+
export interface GraphSnapshotScope {
|
|
32
|
+
workspaceId: string;
|
|
33
|
+
generationId: string;
|
|
34
|
+
}
|
|
35
|
+
/** Opt-in fuer das Lesen vor Wave 8 erzeugter, nicht namespaceter Shards. */
|
|
36
|
+
export interface GraphSnapshotReadOptions extends PortCallOptions {
|
|
37
|
+
/**
|
|
38
|
+
* Nur ein explizites `true` aktiviert den Legacy-Pfad. Auch dann wird der
|
|
39
|
+
* gelesene Payload strikt gegen `workspaceId` UND `generationId` geprueft.
|
|
40
|
+
*/
|
|
41
|
+
allowLegacyFallback?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** Praefix aller Dateigraph-Shards eines Workspace. */
|
|
44
|
+
export declare function fileGraphWorkspaceShardPrefix(workspaceId: string): string;
|
|
45
|
+
/** Namespacete ID des Metadaten-Shards. */
|
|
46
|
+
export declare function fileGraphMetaShardId(workspaceId: string): string;
|
|
47
|
+
/** Namespacete ID des Pfadindex-Shards. */
|
|
48
|
+
export declare function fileGraphPathIndexShardId(workspaceId: string): string;
|
|
49
|
+
/** Namespacete ID eines Datei-Shards. */
|
|
50
|
+
export declare function fileGraphFileShardId(workspaceId: string, fileId: string): string;
|
|
51
|
+
/** Erzeugt alle Shards eines Abbilds, in stabiler Reihenfolge. */
|
|
52
|
+
export declare function toGraphShards(snapshot: FileGraphSnapshotV1, writeId: string): GraphShardV1[];
|
|
53
|
+
/** Schreibt ein vollstaendiges Abbild in den Speicher. */
|
|
54
|
+
export declare function writeGraphSnapshot(store: GraphStore, snapshot: FileGraphSnapshotV1, writeId: string, options?: PortCallOptions): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Fehler beim Zurueckladen — als Wert, damit der Aufrufer ihn ins Ledger legen
|
|
57
|
+
* kann.
|
|
58
|
+
*
|
|
59
|
+
* `missing_path_index` und `count_mismatch` sind KEINE Zierde: ohne sie
|
|
60
|
+
* verlaeuft der haeufigste Verlustfall (ein Datei-Shard ist nicht mehr da und
|
|
61
|
+
* wird deshalb auch nicht mehr aufgezaehlt) voellig geraeuschlos. Der
|
|
62
|
+
* Pfadindex und die im Metadaten-Shard mitgeschriebenen Sollzahlen sind die
|
|
63
|
+
* beiden unabhaengigen Zeugen dafuer, WIE VIEL da sein muesste.
|
|
64
|
+
*/
|
|
65
|
+
export interface SnapshotReadIssue {
|
|
66
|
+
kind: "missing_meta" | "missing_path_index" | "missing_file_shard" | "malformed_payload" | "count_mismatch" | "workspace_scope_required" | "scope_mismatch";
|
|
67
|
+
message: string;
|
|
68
|
+
}
|
|
69
|
+
export interface SnapshotReadResult {
|
|
70
|
+
snapshot: FileGraphSnapshotV1 | null;
|
|
71
|
+
issues: SnapshotReadIssue[];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Laedt ein Abbild fuer GENAU einen Workspace und GENAU eine Generation.
|
|
75
|
+
*
|
|
76
|
+
* Die alte Signatur `(store, generationId)` bleibt absichtlich typkompatibel,
|
|
77
|
+
* liest aber nichts mehr: ohne Workspace kann kein gespeicherter Graph sicher
|
|
78
|
+
* zugeordnet werden. Alte, globale Shards werden nur ueber
|
|
79
|
+
* `allowLegacyFallback: true` gelesen, nachdem ein vollstaendiger Scope
|
|
80
|
+
* angegeben wurde; jeder Payload wird dabei gegen diesen Scope geprueft.
|
|
81
|
+
*/
|
|
82
|
+
export declare function readGraphSnapshot(store: GraphStore, scope: GraphSnapshotScope | string, options?: GraphSnapshotReadOptions): Promise<SnapshotReadResult>;
|
|
83
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAGV,YAAY,EACZ,UAAU,EACV,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,uFAAuF;AACvF,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,uDAAuD;AACvD,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,2CAA2C;AAC3C,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAsF5F;AAED,0DAA0D;AAC1D,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EACA,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,0BAA0B,GAC1B,gBAAgB,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAgDD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,kBAAkB,GAAG,MAAM,EAClC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,CA4C7B"}
|