@graview/tools 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.
Files changed (111) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +47 -0
  3. package/dist/agent/adapters.d.ts +43 -0
  4. package/dist/agent/adapters.d.ts.map +1 -0
  5. package/dist/agent/adapters.js +52 -0
  6. package/dist/agent/adapters.js.map +1 -0
  7. package/dist/agent/tools.d.ts +105 -0
  8. package/dist/agent/tools.d.ts.map +1 -0
  9. package/dist/agent/tools.js +311 -0
  10. package/dist/agent/tools.js.map +1 -0
  11. package/dist/cli.d.ts +37 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +306 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/conversation.d.ts +108 -0
  16. package/dist/conversation.d.ts.map +1 -0
  17. package/dist/conversation.js +698 -0
  18. package/dist/conversation.js.map +1 -0
  19. package/dist/decide.d.ts +43 -0
  20. package/dist/decide.d.ts.map +1 -0
  21. package/dist/decide.js +125 -0
  22. package/dist/decide.js.map +1 -0
  23. package/dist/derive.d.ts +84 -0
  24. package/dist/derive.d.ts.map +1 -0
  25. package/dist/derive.js +302 -0
  26. package/dist/derive.js.map +1 -0
  27. package/dist/edit.d.ts +70 -0
  28. package/dist/edit.d.ts.map +1 -0
  29. package/dist/edit.js +97 -0
  30. package/dist/edit.js.map +1 -0
  31. package/dist/figure.d.ts +53 -0
  32. package/dist/figure.d.ts.map +1 -0
  33. package/dist/figure.js +86 -0
  34. package/dist/figure.js.map +1 -0
  35. package/dist/index.d.ts +44 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +31 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/intelligence.d.ts +132 -0
  40. package/dist/intelligence.d.ts.map +1 -0
  41. package/dist/intelligence.js +463 -0
  42. package/dist/intelligence.js.map +1 -0
  43. package/dist/local.d.ts +192 -0
  44. package/dist/local.d.ts.map +1 -0
  45. package/dist/local.js +365 -0
  46. package/dist/local.js.map +1 -0
  47. package/dist/loop.d.ts +84 -0
  48. package/dist/loop.d.ts.map +1 -0
  49. package/dist/loop.js +173 -0
  50. package/dist/loop.js.map +1 -0
  51. package/dist/mcp-stdio.d.ts +38 -0
  52. package/dist/mcp-stdio.d.ts.map +1 -0
  53. package/dist/mcp-stdio.js +83 -0
  54. package/dist/mcp-stdio.js.map +1 -0
  55. package/dist/pins.d.ts +29 -0
  56. package/dist/pins.d.ts.map +1 -0
  57. package/dist/pins.js +60 -0
  58. package/dist/pins.js.map +1 -0
  59. package/dist/plan.d.ts +150 -0
  60. package/dist/plan.d.ts.map +1 -0
  61. package/dist/plan.js +303 -0
  62. package/dist/plan.js.map +1 -0
  63. package/dist/providers/insight.d.ts +14 -0
  64. package/dist/providers/insight.d.ts.map +1 -0
  65. package/dist/providers/insight.js +81 -0
  66. package/dist/providers/insight.js.map +1 -0
  67. package/dist/providers/invariant.d.ts +14 -0
  68. package/dist/providers/invariant.d.ts.map +1 -0
  69. package/dist/providers/invariant.js +123 -0
  70. package/dist/providers/invariant.js.map +1 -0
  71. package/dist/providers/jev.d.ts +115 -0
  72. package/dist/providers/jev.d.ts.map +1 -0
  73. package/dist/providers/jev.js +148 -0
  74. package/dist/providers/jev.js.map +1 -0
  75. package/dist/providers/lens.d.ts +24 -0
  76. package/dist/providers/lens.d.ts.map +1 -0
  77. package/dist/providers/lens.js +36 -0
  78. package/dist/providers/lens.js.map +1 -0
  79. package/dist/providers/llm.d.ts +25 -0
  80. package/dist/providers/llm.d.ts.map +1 -0
  81. package/dist/providers/llm.js +44 -0
  82. package/dist/providers/llm.js.map +1 -0
  83. package/dist/providers/schema.d.ts +12 -0
  84. package/dist/providers/schema.d.ts.map +1 -0
  85. package/dist/providers/schema.js +508 -0
  86. package/dist/providers/schema.js.map +1 -0
  87. package/dist/providers/structure.d.ts +14 -0
  88. package/dist/providers/structure.d.ts.map +1 -0
  89. package/dist/providers/structure.js +211 -0
  90. package/dist/providers/structure.js.map +1 -0
  91. package/dist/questions.d.ts +162 -0
  92. package/dist/questions.d.ts.map +1 -0
  93. package/dist/questions.js +316 -0
  94. package/dist/questions.js.map +1 -0
  95. package/dist/run.d.ts +202 -0
  96. package/dist/run.d.ts.map +1 -0
  97. package/dist/run.js +453 -0
  98. package/dist/run.js.map +1 -0
  99. package/dist/space.d.ts +50 -0
  100. package/dist/space.d.ts.map +1 -0
  101. package/dist/space.js +55 -0
  102. package/dist/space.js.map +1 -0
  103. package/dist/types.d.ts +122 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/usage.d.ts +10 -0
  108. package/dist/usage.d.ts.map +1 -0
  109. package/dist/usage.js +59 -0
  110. package/dist/usage.js.map +1 -0
  111. package/package.json +61 -0
@@ -0,0 +1,211 @@
1
+ import { fieldWords, humaniseField, labelOf, nodeRefKinds } from "@graview/core";
2
+ const SHARED_SCORE = 70;
3
+ const ALIGN_SCORE = 80;
4
+ const IGNORED_FIELDS = new Set(["id", "kind"]);
5
+ /**
6
+ * What is TRUE about this selection, and what that makes worth doing.
7
+ *
8
+ * Nothing here knows what a duty or a person is. It notices shared
9
+ * neighbours, agreement on a field, and the one node that breaks the
10
+ * agreement — then looks for a declared mutation that could resolve the
11
+ * difference. "Move the Wednesday run to Tuesday like the other three" comes
12
+ * out of this without anyone writing a rule about days, because the schema
13
+ * already said which mutation writes that field.
14
+ */
15
+ export function structureProvider() {
16
+ return {
17
+ name: "structure",
18
+ derive({ store, nodes }) {
19
+ // A node's name as its kind says it, not its label field alone.
20
+ const named = (node) => labelOf(store.schema.tryDefinition(node.kind), node);
21
+ if (nodes.length < 2)
22
+ return {};
23
+ const observations = [];
24
+ const affordances = [];
25
+ const ids = nodes.map((node) => node.id);
26
+ // ---------------------------------------------------- shared neighbours
27
+ for (const edgeKind of store.schema.edgeKinds) {
28
+ const shared = intersect(nodes.map((node) => new Set([
29
+ ...store.graph.out(node.id, edgeKind).map((n) => n.id),
30
+ ...store.graph.in(node.id, edgeKind).map((n) => n.id),
31
+ ])));
32
+ for (const neighbourId of shared) {
33
+ const neighbour = store.graph.getNode(neighbourId);
34
+ if (!neighbour)
35
+ continue;
36
+ observations.push({
37
+ id: `shared:${edgeKind}:${neighbourId}`,
38
+ text: `all ${nodes.length} share "${named(neighbour)}" (${humaniseField(edgeKind).toLowerCase()})`,
39
+ nodeIds: [...ids, neighbourId],
40
+ });
41
+ }
42
+ // The near-miss is more interesting than the agreement: one node out
43
+ // of step is a thing you can fix.
44
+ const counts = new Map();
45
+ for (const node of nodes) {
46
+ for (const neighbour of [
47
+ ...store.graph.out(node.id, edgeKind),
48
+ ...store.graph.in(node.id, edgeKind),
49
+ ]) {
50
+ counts.set(neighbour.id, (counts.get(neighbour.id) ?? 0) + 1);
51
+ }
52
+ }
53
+ for (const [neighbourId, count] of counts) {
54
+ if (count !== nodes.length - 1 || nodes.length < 3)
55
+ continue;
56
+ const neighbour = store.graph.getNode(neighbourId);
57
+ if (!neighbour)
58
+ continue;
59
+ const odd = nodes.find((node) => ![
60
+ ...store.graph.out(node.id, edgeKind),
61
+ ...store.graph.in(node.id, edgeKind),
62
+ ].some((n) => n.id === neighbourId));
63
+ if (!odd)
64
+ continue;
65
+ observations.push({
66
+ id: `near-shared:${edgeKind}:${neighbourId}`,
67
+ text: `all but "${named(odd)}" share "${named(neighbour)}" (${humaniseField(edgeKind).toLowerCase()})`,
68
+ nodeIds: [...ids, neighbourId],
69
+ });
70
+ for (const mutation of store.allMutations()) {
71
+ const subject = mutation.subject;
72
+ if (!subject)
73
+ continue;
74
+ if (subject.kinds !== "*" && !subject.kinds.includes(odd.kind)) {
75
+ continue;
76
+ }
77
+ const target = argAccepting(mutation.input, neighbour.kind);
78
+ if (!target)
79
+ continue;
80
+ affordances.push({
81
+ id: `structure:join:${mutation.name}:${odd.id}:${neighbourId}`,
82
+ label: `${mutation.title ?? mutation.name}: bring "${named(odd)}" in line with the others`,
83
+ provider: "structure",
84
+ mutation: mutation.name,
85
+ args: { [subject.arg]: odd.id, [target]: neighbourId },
86
+ open: [],
87
+ score: SHARED_SCORE,
88
+ why: `every other selected node is connected to "${named(neighbour)}"`,
89
+ nodeIds: [odd.id, neighbourId],
90
+ });
91
+ }
92
+ }
93
+ }
94
+ // ------------------------------------------------- agreement on a field
95
+ const fields = new Set();
96
+ for (const node of nodes) {
97
+ for (const key of Object.keys(node)) {
98
+ if (!IGNORED_FIELDS.has(key))
99
+ fields.add(key);
100
+ }
101
+ }
102
+ // A field and its value in words: "all 3 share status open" read the key and the JSON.
103
+ const definitionOf = (kind) => store.schema.definitions.find((definition) => definition.kind === kind);
104
+ for (const field of [...fields].sort()) {
105
+ const words = fieldWords(definitionOf(nodes[0].kind), field).toLowerCase();
106
+ const values = nodes.map((node) => node[field]);
107
+ const groups = new Map();
108
+ values.forEach((value, index) => {
109
+ const key = JSON.stringify(value ?? null);
110
+ const list = groups.get(key);
111
+ if (list)
112
+ list.push(nodes[index]);
113
+ else
114
+ groups.set(key, [nodes[index]]);
115
+ });
116
+ if (groups.size === 1) {
117
+ const [key] = [...groups.keys()];
118
+ if (key === "null")
119
+ continue;
120
+ observations.push({
121
+ id: `agree:${field}`,
122
+ text: `all ${nodes.length} share the ${words} ${key}`,
123
+ nodeIds: ids,
124
+ });
125
+ continue;
126
+ }
127
+ // A majority and exactly one hold-out: that is an alignment.
128
+ if (nodes.length < 3 || groups.size !== 2)
129
+ continue;
130
+ const sorted = [...groups.entries()].sort((a, b) => b[1].length - a[1].length);
131
+ const [majorityKey, majority] = sorted[0];
132
+ const [, minority] = sorted[1];
133
+ if (minority.length !== 1 || majorityKey === "null")
134
+ continue;
135
+ const odd = minority[0];
136
+ const majorityValue = JSON.parse(majorityKey);
137
+ observations.push({
138
+ id: `odd-one-out:${field}`,
139
+ text: `${majority.length} share the ${words} ${majorityKey}; "${named(odd)}" does not`,
140
+ nodeIds: ids,
141
+ });
142
+ for (const mutation of store.allMutations()) {
143
+ const subject = mutation.subject;
144
+ if (!subject)
145
+ continue;
146
+ if (subject.kinds !== "*" && !subject.kinds.includes(odd.kind)) {
147
+ continue;
148
+ }
149
+ const shape = shapeOf(mutation.input);
150
+ if (!shape || !(field in shape))
151
+ continue;
152
+ // Fill every other argument this mutation needs from the node's own
153
+ // current values, so the aligned change is exactly the one field.
154
+ const args = {
155
+ [subject.arg]: odd.id,
156
+ [field]: majorityValue,
157
+ };
158
+ let satisfiable = true;
159
+ for (const [name, schema] of Object.entries(shape)) {
160
+ if (name in args)
161
+ continue;
162
+ if (schema.safeParse(undefined).success)
163
+ continue;
164
+ const current = odd[name];
165
+ if (current === undefined) {
166
+ satisfiable = false;
167
+ break;
168
+ }
169
+ args[name] = current;
170
+ }
171
+ if (!satisfiable)
172
+ continue;
173
+ affordances.push({
174
+ id: `structure:align:${mutation.name}:${field}:${odd.id}`,
175
+ label: `Align the ${words} of "${named(odd)}" with the other ${majority.length}`,
176
+ provider: "structure",
177
+ mutation: mutation.name,
178
+ args,
179
+ open: [],
180
+ score: ALIGN_SCORE,
181
+ why: `${majority.length} of ${nodes.length} share the ${words} ${majorityKey}`,
182
+ nodeIds: ids,
183
+ });
184
+ }
185
+ }
186
+ return { affordances, observations };
187
+ },
188
+ };
189
+ }
190
+ function intersect(sets) {
191
+ if (sets.length === 0)
192
+ return [];
193
+ const [first, ...rest] = sets;
194
+ return [...first].filter((value) => rest.every((set) => set.has(value))).sort();
195
+ }
196
+ function shapeOf(input) {
197
+ return input.shape ?? null;
198
+ }
199
+ /** The first argument of a mutation that accepts a node of `kind`. */
200
+ function argAccepting(input, kind) {
201
+ const shape = shapeOf(input);
202
+ if (!shape)
203
+ return null;
204
+ for (const [name] of Object.entries(shape)) {
205
+ const kinds = nodeRefKinds(shape[name]);
206
+ if (kinds && (kinds.includes("*") || kinds.includes(kind)))
207
+ return name;
208
+ }
209
+ return null;
210
+ }
211
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/providers/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { type AnySchema, type Store, type Violation } from "@graview/core";
2
+ /**
3
+ * THE QUESTIONS ARE DERIVED, NOT AUTHORED.
4
+ *
5
+ * A Graview declaration already types every question worth asking. A
6
+ * `z.enum` is a Choice whose criteria are its own options; a `nodeRef` is a
7
+ * Choice over the live nodes of that kind, labelled the way every surface
8
+ * labels them; a `z.boolean` and an invariant are a truth with the rule as
9
+ * what "yes" means; a bounded number is a Score over its own levels. None
10
+ * of it is written by hand, for the same reason no agent tool is: two
11
+ * descriptions of one domain will disagree, and the one in the declaration
12
+ * is the one the store enforces.
13
+ *
14
+ * The shapes here are the wire shapes of a decision provider — a map of
15
+ * typed questions over one state, typed answers back under the same keys —
16
+ * so a derived question is sent as it is, and an answer is read straight
17
+ * into an argument of the act that writes the thing asked about.
18
+ */
19
+ export type ChoiceQuestion = {
20
+ readonly type: "choice";
21
+ readonly instructions: string;
22
+ /** Option name → what it means, or null when the name says it all. */
23
+ readonly criteria: Readonly<Record<string, string | null>>;
24
+ };
25
+ export type NoulQuestion = {
26
+ readonly type: "noul";
27
+ readonly instructions: string;
28
+ readonly criteria?: {
29
+ readonly true?: string;
30
+ readonly false?: string;
31
+ };
32
+ };
33
+ export type ScoreQuestion = {
34
+ readonly type: "score";
35
+ readonly instructions: string;
36
+ /** Ordered level descriptions, lowest first. At least two. */
37
+ readonly criteria: readonly string[];
38
+ };
39
+ export type Question = ChoiceQuestion | NoulQuestion | ScoreQuestion;
40
+ /** Where a question came from, and where its answer goes. */
41
+ export type QuestionAbout = {
42
+ readonly about: "field";
43
+ readonly kind: string;
44
+ readonly field: string;
45
+ /** The act that writes the field, and the argument the answer fills. */
46
+ readonly writes?: {
47
+ readonly mutation: string;
48
+ readonly arg: string;
49
+ readonly subjectArg: string;
50
+ };
51
+ } | {
52
+ readonly about: "argument";
53
+ readonly mutation: string;
54
+ readonly arg: string;
55
+ /** For a pair question: the other node the argument would name. Carried, not parsed — an id may hold a colon. */
56
+ readonly other?: string;
57
+ } | {
58
+ readonly about: "rule";
59
+ readonly invariant: string;
60
+ readonly subjectId?: string;
61
+ } | {
62
+ readonly about: "repair";
63
+ readonly invariant: string;
64
+ readonly subjectId?: string;
65
+ /** Option name → the call it means, arguments already settled. */
66
+ readonly options: Readonly<Record<string, {
67
+ readonly mutation: string;
68
+ readonly args: Readonly<Record<string, unknown>>;
69
+ }>>;
70
+ };
71
+ export type DerivedQuestion = QuestionAbout & {
72
+ /** Stable, code-facing. Never sent to the model. */
73
+ readonly id: string;
74
+ readonly question: Question;
75
+ /** For a Score: the field's own scale, so level 0 is `min`. */
76
+ readonly scale?: {
77
+ readonly min: number;
78
+ readonly max: number;
79
+ };
80
+ };
81
+ /**
82
+ * A QUESTION FOR A PERSON, because the answer was not one.
83
+ *
84
+ * "turf 0.5, bed 0.45" is a split, not an answer, and a low confidence is a
85
+ * shrug. Either is offered rather than applied: the question, the node it
86
+ * is about by name, and each option with its probability and the call it
87
+ * would be — so a surface can stand the question AT that node, with the
88
+ * choices as presses, rather than in a list somewhere else.
89
+ */
90
+ export interface OfferedQuestion {
91
+ readonly id: string;
92
+ /** The node it is about, when it is about one. */
93
+ readonly nodeId?: string;
94
+ /** Its label, so a surface can say it without a lookup. */
95
+ readonly nodeLabel?: string;
96
+ /** The question in the declaration's words. */
97
+ readonly asks: string;
98
+ /** Why it is offered rather than applied. */
99
+ readonly because: "split" | "unsure";
100
+ readonly confidence: number;
101
+ readonly options: readonly {
102
+ readonly value: string;
103
+ readonly probability: number;
104
+ /** The call taking this option would be; absent when "no" means do nothing. */
105
+ readonly call?: {
106
+ readonly mutation: string;
107
+ readonly args: Readonly<Record<string, unknown>>;
108
+ readonly why?: string;
109
+ };
110
+ }[];
111
+ }
112
+ /** The number a Score answer means, on the field's own scale. */
113
+ export declare function scoreToValue(field: {
114
+ readonly min: number;
115
+ }, level: number): number;
116
+ /**
117
+ * The questions a KIND asks of one of its members: one per settable field
118
+ * with a typed answer, each naming the act that writes it. A kind whose
119
+ * every field is prose asks nothing, and says so by an empty list.
120
+ */
121
+ export declare function questionsForKind<S extends AnySchema>(store: Store<S>, kind: string): readonly DerivedQuestion[];
122
+ /**
123
+ * The questions an ACT asks before it can be called: one per argument with
124
+ * a typed answer that `given` has not already settled. The subject is
125
+ * usually given — a run fans out over nodes and asks each one's questions
126
+ * — and an argument with no typed answer is simply not asked, which is
127
+ * what the checker already guaranteed a decision provider would never
128
+ * meet on its allowlist.
129
+ */
130
+ export declare function questionsForMutation<S extends AnySchema>(store: Store<S>, name: string, given?: Readonly<Record<string, unknown>>): readonly DerivedQuestion[];
131
+ /**
132
+ * A RULE IS A TRUTH, and its repairs are the closed set that follows.
133
+ *
134
+ * The invariant's own words are what "yes" means; a violation the store
135
+ * already raised narrows the follow-on Choice to the repairs it named, each
136
+ * with its arguments settled, so the answer is a call and not a guess.
137
+ * Asked without a violation, the follow-on is over the repairs the
138
+ * invariant declares it may name, which is what a loop asks before the
139
+ * store has judged.
140
+ */
141
+ export declare function questionsForInvariant<S extends AnySchema>(store: Store<S>, name: string, violation?: Violation): readonly DerivedQuestion[];
142
+ /**
143
+ * A PAIR IS A TRUTH. An act that joins a subject to one other node —
144
+ * "says it helps": a practice and a concern — asked of one particular pair
145
+ * is a yes-or-no question, and the act's own title and description are
146
+ * its words. Fan this out over every pair and you have a matrix nobody
147
+ * ever had to author.
148
+ */
149
+ export declare function pairQuestion<S extends AnySchema>(store: Store<S>, name: string, subjectId: string, otherId: string): (DerivedQuestion & {
150
+ readonly about: "argument";
151
+ }) | undefined;
152
+ /**
153
+ * THE STATE A QUESTION IS ASKED OVER: one node as the model should see it
154
+ * — its kind and what the kind is for, its label, its readable fields in
155
+ * the declaration's own words, and what it is joined to, by label. Nothing
156
+ * a card would not show. Ids are kept beside labels so an answer that is
157
+ * an id can be checked against what was shown.
158
+ */
159
+ export declare function nodeState<S extends AnySchema>(store: Store<S>, id: string): Readonly<Record<string, unknown>> | undefined;
160
+ /** Every derived question in the app, for a reader — or a test — that wants the whole surface. */
161
+ export declare function allQuestions<S extends AnySchema>(store: Store<S>): readonly DerivedQuestion[];
162
+ //# sourceMappingURL=questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EAGd,KAAK,KAAK,EACV,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5D,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzE,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,CAAC;AAErE,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpG,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iHAAiH;IACjH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IACE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CAC7H,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,oDAAoD;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,+EAA+E;QAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE;YAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACxH,EAAE,CAAC;CACL;AAgFD,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CA6B/G;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,EACtD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAC5C,SAAS,eAAe,EAAE,CAgB5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,EACvD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,SAAS,GACpB,SAAS,eAAe,EAAE,CAqE5B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAC9C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,CAAC,eAAe,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,GAAG,SAAS,CA6BhE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CA0BzH;AAED,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,eAAe,EAAE,CAS7F"}