@boristype/bt-ir 0.1.0-alpha.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 +21 -0
- package/README.md +338 -0
- package/build/analyzer/index.d.ts +7 -0
- package/build/analyzer/index.d.ts.map +1 -0
- package/build/analyzer/index.js +7 -0
- package/build/analyzer/index.js.map +1 -0
- package/build/analyzer/scope-analyzer.d.ts +88 -0
- package/build/analyzer/scope-analyzer.d.ts.map +1 -0
- package/build/analyzer/scope-analyzer.js +565 -0
- package/build/analyzer/scope-analyzer.js.map +1 -0
- package/build/cli.d.ts +10 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +96 -0
- package/build/cli.js.map +1 -0
- package/build/emitter/bt-emitter.d.ts +31 -0
- package/build/emitter/bt-emitter.d.ts.map +1 -0
- package/build/emitter/bt-emitter.js +919 -0
- package/build/emitter/bt-emitter.js.map +1 -0
- package/build/emitter/index.d.ts +7 -0
- package/build/emitter/index.d.ts.map +1 -0
- package/build/emitter/index.js +7 -0
- package/build/emitter/index.js.map +1 -0
- package/build/index.d.ts +25 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +24 -0
- package/build/index.js.map +1 -0
- package/build/ir/builders.d.ts +235 -0
- package/build/ir/builders.d.ts.map +1 -0
- package/build/ir/builders.js +387 -0
- package/build/ir/builders.js.map +1 -0
- package/build/ir/index.d.ts +8 -0
- package/build/ir/index.d.ts.map +1 -0
- package/build/ir/index.js +8 -0
- package/build/ir/index.js.map +1 -0
- package/build/ir/nodes.d.ts +596 -0
- package/build/ir/nodes.d.ts.map +1 -0
- package/build/ir/nodes.js +16 -0
- package/build/ir/nodes.js.map +1 -0
- package/build/lowering/bare-visitors.d.ts +72 -0
- package/build/lowering/bare-visitors.d.ts.map +1 -0
- package/build/lowering/bare-visitors.js +287 -0
- package/build/lowering/bare-visitors.js.map +1 -0
- package/build/lowering/binding.d.ts +127 -0
- package/build/lowering/binding.d.ts.map +1 -0
- package/build/lowering/binding.js +194 -0
- package/build/lowering/binding.js.map +1 -0
- package/build/lowering/expressions.d.ts +106 -0
- package/build/lowering/expressions.d.ts.map +1 -0
- package/build/lowering/expressions.js +1172 -0
- package/build/lowering/expressions.js.map +1 -0
- package/build/lowering/function-builder.d.ts +111 -0
- package/build/lowering/function-builder.d.ts.map +1 -0
- package/build/lowering/function-builder.js +111 -0
- package/build/lowering/function-builder.js.map +1 -0
- package/build/lowering/helpers.d.ts +88 -0
- package/build/lowering/helpers.d.ts.map +1 -0
- package/build/lowering/helpers.js +347 -0
- package/build/lowering/helpers.js.map +1 -0
- package/build/lowering/index.d.ts +21 -0
- package/build/lowering/index.d.ts.map +1 -0
- package/build/lowering/index.js +28 -0
- package/build/lowering/index.js.map +1 -0
- package/build/lowering/precedence.d.ts +18 -0
- package/build/lowering/precedence.d.ts.map +1 -0
- package/build/lowering/precedence.js +104 -0
- package/build/lowering/precedence.js.map +1 -0
- package/build/lowering/spread-helpers.d.ts +12 -0
- package/build/lowering/spread-helpers.d.ts.map +1 -0
- package/build/lowering/spread-helpers.js +32 -0
- package/build/lowering/spread-helpers.js.map +1 -0
- package/build/lowering/statements.d.ts +85 -0
- package/build/lowering/statements.d.ts.map +1 -0
- package/build/lowering/statements.js +713 -0
- package/build/lowering/statements.js.map +1 -0
- package/build/lowering/visitor.d.ts +121 -0
- package/build/lowering/visitor.d.ts.map +1 -0
- package/build/lowering/visitor.js +165 -0
- package/build/lowering/visitor.js.map +1 -0
- package/build/pipeline/index.d.ts +84 -0
- package/build/pipeline/index.d.ts.map +1 -0
- package/build/pipeline/index.js +224 -0
- package/build/pipeline/index.js.map +1 -0
- package/build/polyfill-spec.d.ts +18 -0
- package/build/polyfill-spec.d.ts.map +1 -0
- package/build/polyfill-spec.js +26 -0
- package/build/polyfill-spec.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding Manager - централизованная генерация уникальных имён
|
|
3
|
+
*
|
|
4
|
+
* Обеспечивает единый механизм для:
|
|
5
|
+
* - Генерации имён для временных переменных (__tmp0, __arr1, ...)
|
|
6
|
+
* - Генерации имён для анонимных функций (__arrow0, __func1, ...)
|
|
7
|
+
* - Переименования shadowed переменных (a → a__0, a__1, ...)
|
|
8
|
+
* - Защиты от коллизий с именами из исходного кода
|
|
9
|
+
*
|
|
10
|
+
* @module lowering/binding
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Менеджер генерации уникальных имён
|
|
14
|
+
*
|
|
15
|
+
* Все сгенерированные имена гарантированно уникальны в пределах
|
|
16
|
+
* одного экземпляра менеджера и не конфликтуют с именами из исходного кода.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const bindings = new BindingManager();
|
|
21
|
+
* bindings.registerSourceNames(["__item", "foo", "bar"]);
|
|
22
|
+
*
|
|
23
|
+
* bindings.create("item"); // "__item0" (если __item0 не занято)
|
|
24
|
+
* bindings.create("arrow"); // "__arrow0"
|
|
25
|
+
* bindings.create("arrow"); // "__arrow1"
|
|
26
|
+
* bindings.temp(); // "__tmp0"
|
|
27
|
+
* bindings.shadow("x"); // "x__0"
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class BindingManager {
|
|
31
|
+
/** Счётчики для каждого префикса */
|
|
32
|
+
counters = new Map();
|
|
33
|
+
/** Имена из исходного кода (для проверки коллизий) */
|
|
34
|
+
sourceNames = new Set();
|
|
35
|
+
/** Все сгенерированные имена (для проверки коллизий) */
|
|
36
|
+
generatedNames = new Set();
|
|
37
|
+
/**
|
|
38
|
+
* Регистрирует имена из исходного кода для проверки коллизий
|
|
39
|
+
*
|
|
40
|
+
* @param names - Массив имён переменных/функций из исходного файла
|
|
41
|
+
*/
|
|
42
|
+
registerSourceNames(names) {
|
|
43
|
+
for (const name of names) {
|
|
44
|
+
this.sourceNames.add(name);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Проверяет, занято ли имя (в исходнике или уже сгенерировано)
|
|
49
|
+
*/
|
|
50
|
+
isNameTaken(name) {
|
|
51
|
+
return this.sourceNames.has(name) || this.generatedNames.has(name);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Создаёт уникальное имя с заданным префиксом
|
|
55
|
+
*
|
|
56
|
+
* Гарантирует что имя не конфликтует с:
|
|
57
|
+
* - Именами из исходного кода
|
|
58
|
+
* - Ранее сгенерированными именами
|
|
59
|
+
*
|
|
60
|
+
* @param prefix - Префикс имени (без __)
|
|
61
|
+
* @returns Уникальное имя вида __prefix0, __prefix1, ...
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* bindings.create("arrow") // "__arrow0"
|
|
65
|
+
* bindings.create("obj") // "__obj0"
|
|
66
|
+
*/
|
|
67
|
+
create(prefix) {
|
|
68
|
+
let count = this.counters.get(prefix) ?? 0;
|
|
69
|
+
let name;
|
|
70
|
+
// Ищем свободное имя
|
|
71
|
+
do {
|
|
72
|
+
name = `__${prefix}${count}`;
|
|
73
|
+
count++;
|
|
74
|
+
} while (this.isNameTaken(name));
|
|
75
|
+
this.counters.set(prefix, count);
|
|
76
|
+
this.generatedNames.add(name);
|
|
77
|
+
return name;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Создаёт уникальное имя для временной переменной
|
|
81
|
+
*
|
|
82
|
+
* @returns Уникальное имя вида __tmp0, __tmp1, ...
|
|
83
|
+
*/
|
|
84
|
+
temp() {
|
|
85
|
+
return this.create("tmp");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Создаёт уникальное имя для shadowed переменной
|
|
89
|
+
*
|
|
90
|
+
* Используется когда let/const во вложенном блоке перекрывает
|
|
91
|
+
* переменную из внешнего scope.
|
|
92
|
+
*
|
|
93
|
+
* @param original - Оригинальное имя переменной
|
|
94
|
+
* @returns Уникальное имя вида original__0, original__1, ...
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* bindings.shadow("a") // "a__0"
|
|
98
|
+
* bindings.shadow("a") // "a__1"
|
|
99
|
+
* bindings.shadow("b") // "b__0"
|
|
100
|
+
*/
|
|
101
|
+
shadow(original) {
|
|
102
|
+
const key = `shadow:${original}`;
|
|
103
|
+
let count = this.counters.get(key) ?? 0;
|
|
104
|
+
let name;
|
|
105
|
+
// Ищем свободное имя
|
|
106
|
+
do {
|
|
107
|
+
name = `${original}__${count}`;
|
|
108
|
+
count++;
|
|
109
|
+
} while (this.isNameTaken(name));
|
|
110
|
+
this.counters.set(key, count);
|
|
111
|
+
this.generatedNames.add(name);
|
|
112
|
+
return name;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Создаёт уникальное имя для env переменной функции
|
|
116
|
+
*
|
|
117
|
+
* @param funcName - Имя функции
|
|
118
|
+
* @returns Имя env вида funcName_env
|
|
119
|
+
*/
|
|
120
|
+
envName(funcName) {
|
|
121
|
+
return `${funcName}_env`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Создаёт уникальное имя для descriptor функции
|
|
125
|
+
*
|
|
126
|
+
* @param funcName - Имя функции
|
|
127
|
+
* @returns Имя descriptor вида funcName_desc
|
|
128
|
+
*/
|
|
129
|
+
descName(funcName) {
|
|
130
|
+
return `${funcName}_desc`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Создаёт уникальное имя для hoisted вложенной функции (module mode)
|
|
134
|
+
*
|
|
135
|
+
* @param originalName - Оригинальное имя функции
|
|
136
|
+
* @returns Уникальное имя вида __hoisted_originalName_N
|
|
137
|
+
*/
|
|
138
|
+
hoistedName(originalName) {
|
|
139
|
+
const key = `hoisted:${originalName}`;
|
|
140
|
+
let count = this.counters.get(key) ?? 0;
|
|
141
|
+
let name;
|
|
142
|
+
do {
|
|
143
|
+
name = `__hoisted_${originalName}_${count}`;
|
|
144
|
+
count++;
|
|
145
|
+
} while (this.isNameTaken(name));
|
|
146
|
+
this.counters.set(key, count);
|
|
147
|
+
this.generatedNames.add(name);
|
|
148
|
+
return name;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Сбрасывает все счётчики и имена (для тестирования)
|
|
152
|
+
*/
|
|
153
|
+
reset() {
|
|
154
|
+
this.counters.clear();
|
|
155
|
+
this.sourceNames.clear();
|
|
156
|
+
this.generatedNames.clear();
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Получает текущее значение счётчика (для отладки)
|
|
160
|
+
*/
|
|
161
|
+
getCount(prefix) {
|
|
162
|
+
return this.counters.get(prefix) ?? 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Глобальный экземпляр для использования в pipeline
|
|
167
|
+
* Создаётся заново для каждой компиляции
|
|
168
|
+
*/
|
|
169
|
+
let globalBindings = null;
|
|
170
|
+
/**
|
|
171
|
+
* Получает текущий BindingManager
|
|
172
|
+
* @throws Если менеджер не инициализирован
|
|
173
|
+
*/
|
|
174
|
+
export function getBindings() {
|
|
175
|
+
if (!globalBindings) {
|
|
176
|
+
throw new Error("BindingManager not initialized. Call initBindings() first.");
|
|
177
|
+
}
|
|
178
|
+
return globalBindings;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Инициализирует новый BindingManager для компиляции
|
|
182
|
+
* @returns Созданный менеджер
|
|
183
|
+
*/
|
|
184
|
+
export function initBindings() {
|
|
185
|
+
globalBindings = new BindingManager();
|
|
186
|
+
return globalBindings;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Создаёт изолированный BindingManager (для тестов)
|
|
190
|
+
*/
|
|
191
|
+
export function createBindings() {
|
|
192
|
+
return new BindingManager();
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/lowering/binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression Visitors - обработка expressions TypeScript AST
|
|
3
|
+
*
|
|
4
|
+
* Содержит:
|
|
5
|
+
* - visitExpression (dispatch)
|
|
6
|
+
* - visitIdentifier
|
|
7
|
+
* - visitTemplateExpression
|
|
8
|
+
* - visitBinaryExpression
|
|
9
|
+
* - visitPrefixUnaryExpression, visitPostfixUnaryExpression
|
|
10
|
+
* - visitCallExpression
|
|
11
|
+
* - visitObjectLiteral, visitArrayLiteral
|
|
12
|
+
* - visitArrowFunction, visitFunctionExpression
|
|
13
|
+
* - visitNewExpression
|
|
14
|
+
*
|
|
15
|
+
* @module lowering/expressions
|
|
16
|
+
*/
|
|
17
|
+
import * as ts from "typescript";
|
|
18
|
+
import { type IRExpression } from "../ir/index.ts";
|
|
19
|
+
import type { VisitorContext } from "./visitor.ts";
|
|
20
|
+
/**
|
|
21
|
+
* Обрабатывает expression
|
|
22
|
+
* @param objectName - имя объекта если это инициализатор переменной
|
|
23
|
+
*/
|
|
24
|
+
export declare function visitExpression(node: ts.Expression, ctx: VisitorContext, objectName?: string): IRExpression;
|
|
25
|
+
/**
|
|
26
|
+
* Обрабатывает identifier
|
|
27
|
+
*/
|
|
28
|
+
export declare function visitIdentifier(node: ts.Identifier, ctx: VisitorContext): IRExpression;
|
|
29
|
+
/**
|
|
30
|
+
* Обрабатывает template expression
|
|
31
|
+
*/
|
|
32
|
+
export declare function visitTemplateExpression(node: ts.TemplateExpression, ctx: VisitorContext): IRExpression;
|
|
33
|
+
/**
|
|
34
|
+
* Обрабатывает binary expression
|
|
35
|
+
*/
|
|
36
|
+
export declare function visitBinaryExpression(node: ts.BinaryExpression, ctx: VisitorContext): IRExpression;
|
|
37
|
+
/**
|
|
38
|
+
* Обрабатывает prefix unary expression
|
|
39
|
+
*/
|
|
40
|
+
export declare function visitPrefixUnaryExpression(node: ts.PrefixUnaryExpression, ctx: VisitorContext): IRExpression;
|
|
41
|
+
/**
|
|
42
|
+
* Обрабатывает postfix unary expression
|
|
43
|
+
*/
|
|
44
|
+
export declare function visitPostfixUnaryExpression(node: ts.PostfixUnaryExpression, ctx: VisitorContext): IRExpression;
|
|
45
|
+
/**
|
|
46
|
+
* Обрабатывает call expression
|
|
47
|
+
*/
|
|
48
|
+
export declare function visitCallExpression(node: ts.CallExpression, ctx: VisitorContext): IRExpression;
|
|
49
|
+
/**
|
|
50
|
+
* Обрабатывает object literal
|
|
51
|
+
*
|
|
52
|
+
* Spread-свойства преобразуются в вызовы ObjectUnion.
|
|
53
|
+
* Если объект содержит методы:
|
|
54
|
+
* 1. Создаём временную переменную __objN
|
|
55
|
+
* 2. Генерируем функции, env, desc для каждого метода
|
|
56
|
+
* 3. Присваиваем obj в дескрипторе после создания объекта
|
|
57
|
+
* 4. Возвращаем __objN
|
|
58
|
+
*/
|
|
59
|
+
export declare function visitObjectLiteral(node: ts.ObjectLiteralExpression, ctx: VisitorContext, objectName?: string): IRExpression;
|
|
60
|
+
/**
|
|
61
|
+
* Обрабатывает array literal.
|
|
62
|
+
* Spread-элементы преобразуются в вызов ArrayUnion([...], spreadExpr, [...]).
|
|
63
|
+
*/
|
|
64
|
+
export declare function visitArrayLiteral(node: ts.ArrayLiteralExpression, ctx: VisitorContext): IRExpression;
|
|
65
|
+
/**
|
|
66
|
+
* Обрабатывает arrow function
|
|
67
|
+
*
|
|
68
|
+
* Использует buildFunction для генерации env/desc паттерна
|
|
69
|
+
* Возвращает: __env.__arrowN
|
|
70
|
+
*/
|
|
71
|
+
export declare function visitArrowFunction(node: ts.ArrowFunction, ctx: VisitorContext): IRExpression;
|
|
72
|
+
/**
|
|
73
|
+
* Обрабатывает function expression
|
|
74
|
+
*/
|
|
75
|
+
export declare function visitFunctionExpression(node: ts.FunctionExpression, ctx: VisitorContext): IRExpression;
|
|
76
|
+
/**
|
|
77
|
+
* Обрабатывает new expression
|
|
78
|
+
*/
|
|
79
|
+
export declare function visitNewExpression(node: ts.NewExpression, ctx: VisitorContext): IRExpression;
|
|
80
|
+
/**
|
|
81
|
+
* Строит ссылку на переменную импортированного модуля (__module_X) через __env цепочку.
|
|
82
|
+
*
|
|
83
|
+
* Если какой-либо именованный импорт из модуля используется во вложенной функции
|
|
84
|
+
* (isCaptured), переменная `__module_X` записывается в __env на уровне модуля.
|
|
85
|
+
* Доступ к ней из вложенных функций осуществляется через __env.__parent цепочку,
|
|
86
|
+
* аналогично обычным captured-переменным.
|
|
87
|
+
*
|
|
88
|
+
* @param moduleVar - Имя переменной модуля (например "__module___utils")
|
|
89
|
+
* @param isCapturedImport - Является ли этот импорт captured (используется во вложенной функции)
|
|
90
|
+
* @param ctx - Текущий VisitorContext
|
|
91
|
+
* @returns IR выражение: прямой IR.id(moduleVar) или __env[.__parent...].moduleVar
|
|
92
|
+
*/
|
|
93
|
+
export declare function importModuleVarAccess(moduleVar: string, isCapturedImport: boolean, ctx: VisitorContext): IRExpression;
|
|
94
|
+
/**
|
|
95
|
+
* Строит ссылку на helper-функцию через цепочку __env.__parent.
|
|
96
|
+
*
|
|
97
|
+
* Хелперы (__ImportMeta_*, __AbsoluteUrl) зарегистрированы в top-level __env
|
|
98
|
+
* (moduleScope). Если текущий код — внутри вложенной функции, нужно
|
|
99
|
+
* пройти цепочку __parent до module-level __env.
|
|
100
|
+
*
|
|
101
|
+
* @param helperName - Имя хелпера (например "__ImportMeta_dirUrl")
|
|
102
|
+
* @param ctx - Текущий VisitorContext
|
|
103
|
+
* @returns IR выражение вида __env.__ImportMeta_dirUrl или __env.__parent.__ImportMeta_dirUrl
|
|
104
|
+
*/
|
|
105
|
+
export declare function helperEnvAccess(helperName: string, ctx: VisitorContext): IRExpression;
|
|
106
|
+
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/lowering/expressions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAGL,KAAK,YAAY,EAIlB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA0HnD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,EAAE,CAAC,UAAU,EACnB,GAAG,EAAE,cAAc,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,YAAY,CAoPd;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,cAAc,GAAG,YAAY,CA4DtF;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAC3B,GAAG,EAAE,cAAc,GAClB,YAAY,CA4Bd;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,EAAE,CAAC,gBAAgB,EACzB,GAAG,EAAE,cAAc,GAClB,YAAY,CAoId;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,EAAE,CAAC,qBAAqB,EAC9B,GAAG,EAAE,cAAc,GAClB,YAAY,CA4Bd;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,EAAE,CAAC,sBAAsB,EAC/B,GAAG,EAAE,cAAc,GAClB,YAAY,CAwBd;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,YAAY,CAwO9F;AAmCD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,EAAE,CAAC,uBAAuB,EAChC,GAAG,EAAE,cAAc,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,YAAY,CA8Md;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,EAAE,CAAC,sBAAsB,EAC/B,GAAG,EAAE,cAAc,GAClB,YAAY,CAoCd;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,YAAY,CAmF5F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,EAAE,CAAC,kBAAkB,EAC3B,GAAG,EAAE,cAAc,GAClB,YAAY,CA0Dd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,YAAY,CAO5F;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,OAAO,EACzB,GAAG,EAAE,cAAc,GAClB,YAAY,CAwBd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,YAAY,CAgBrF"}
|