@yoyoboot/yoyo-admin-schema 10.5.5

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 (49) hide show
  1. package/dist/action-contract.d.ts +50 -0
  2. package/dist/action-contract.d.ts.map +1 -0
  3. package/dist/action-contract.js +185 -0
  4. package/dist/action-registry.d.ts +12 -0
  5. package/dist/action-registry.d.ts.map +1 -0
  6. package/dist/action-registry.js +23 -0
  7. package/dist/compiler.d.ts +17 -0
  8. package/dist/compiler.d.ts.map +1 -0
  9. package/dist/compiler.js +1300 -0
  10. package/dist/contract-drift.d.ts +18 -0
  11. package/dist/contract-drift.d.ts.map +1 -0
  12. package/dist/contract-drift.js +32 -0
  13. package/dist/diagnostics.d.ts +19 -0
  14. package/dist/diagnostics.d.ts.map +1 -0
  15. package/dist/diagnostics.js +8 -0
  16. package/dist/extension-registry.d.ts +13 -0
  17. package/dist/extension-registry.d.ts.map +1 -0
  18. package/dist/extension-registry.js +23 -0
  19. package/dist/field-registry.d.ts +12 -0
  20. package/dist/field-registry.d.ts.map +1 -0
  21. package/dist/field-registry.js +30 -0
  22. package/dist/generated/action-contract/action-contract-keys.d.ts +3 -0
  23. package/dist/generated/action-contract/action-contract-keys.d.ts.map +1 -0
  24. package/dist/generated/action-contract/action-contract-keys.js +50 -0
  25. package/dist/generated/action-contract/index.d.ts +534 -0
  26. package/dist/generated/action-contract/index.d.ts.map +1 -0
  27. package/dist/generated/action-contract/index.js +579 -0
  28. package/dist/generated-validation-contract.d.ts +36 -0
  29. package/dist/generated-validation-contract.d.ts.map +1 -0
  30. package/dist/generated-validation-contract.js +124 -0
  31. package/dist/index.d.ts +15 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +14 -0
  34. package/dist/page-contract-linking.d.ts +36 -0
  35. package/dist/page-contract-linking.d.ts.map +1 -0
  36. package/dist/page-contract-linking.js +78 -0
  37. package/dist/project-check.d.ts +34 -0
  38. package/dist/project-check.d.ts.map +1 -0
  39. package/dist/project-check.js +151 -0
  40. package/dist/registry-diagnostics.d.ts +15 -0
  41. package/dist/registry-diagnostics.d.ts.map +1 -0
  42. package/dist/registry-diagnostics.js +41 -0
  43. package/dist/renderer-registry.d.ts +22 -0
  44. package/dist/renderer-registry.d.ts.map +1 -0
  45. package/dist/renderer-registry.js +33 -0
  46. package/dist/types.d.ts +290 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +49 -0
  49. package/package.json +30 -0
@@ -0,0 +1,50 @@
1
+ import type { YoyoSchemaDiagnostic } from './diagnostics.js';
2
+ export declare const YOYO_ACTION_CONTRACT_SCHEMA_VERSION = "1.0.0";
3
+ export declare const YOYO_ACTION_CONTRACT_OPERATIONS: readonly ["create", "update", "setEnabled", "softDelete"];
4
+ export type YoyoActionContractOperation = typeof YOYO_ACTION_CONTRACT_OPERATIONS[number];
5
+ export declare const YOYO_ACTION_CONCURRENCY_POLICIES: readonly ["none", "required"];
6
+ export type YoyoActionConcurrencyPolicy = typeof YOYO_ACTION_CONCURRENCY_POLICIES[number];
7
+ export interface YoyoActionContract {
8
+ actionKey: string;
9
+ operation: YoyoActionContractOperation;
10
+ /** Generated backend/OpenAPI operation reference for create/update validation. */
11
+ validationOperationId?: string | null;
12
+ permission?: string | null;
13
+ feature?: string | null;
14
+ concurrencyPolicy: YoyoActionConcurrencyPolicy;
15
+ sourceModule: string;
16
+ schemaVersion: string;
17
+ generatorVersion: string;
18
+ sourceHash: string;
19
+ generatedCommand: string;
20
+ }
21
+ export interface YoyoActionContractCatalog {
22
+ schemaVersion: string;
23
+ generator: string;
24
+ generatorVersion: string;
25
+ sourceHash: string;
26
+ generatedAt: string;
27
+ generatedBy: string;
28
+ generatedCommand: string;
29
+ actions: readonly YoyoActionContract[];
30
+ }
31
+ export type YoyoActionContractManifest = Omit<YoyoActionContractCatalog, 'actions' | 'generatedAt'>;
32
+ export interface YoyoLinkedActionContract extends YoyoActionContract {
33
+ catalogSchemaVersion: string;
34
+ catalogSourceHash: string;
35
+ }
36
+ export interface YoyoActionContractCapabilityRegistry {
37
+ permissions?: readonly string[];
38
+ features?: readonly string[];
39
+ }
40
+ export interface YoyoActionContractSnapshot {
41
+ readonly catalog: YoyoActionContractCatalog;
42
+ readonly manifest: YoyoActionContractManifest;
43
+ }
44
+ export declare function operationForYoyoActionKind(kind: string): YoyoActionContractOperation | undefined;
45
+ export declare function isYoyoMutationActionKind(kind: string): boolean;
46
+ export declare function linkYoyoActionContract(catalog: YoyoActionContractCatalog, actionKey: string): YoyoLinkedActionContract | undefined;
47
+ export declare function validateYoyoActionContractCatalog(catalog: YoyoActionContractCatalog, capabilities?: YoyoActionContractCapabilityRegistry): readonly YoyoSchemaDiagnostic[];
48
+ export declare function isYoyoActionContractSnapshotCompatible(linked: YoyoLinkedActionContract, catalog: YoyoActionContractCatalog): boolean;
49
+ export declare function diagnoseYoyoActionContractSnapshot(linked: YoyoLinkedActionContract | undefined, catalog: YoyoActionContractCatalog | undefined, path?: string): readonly YoyoSchemaDiagnostic[];
50
+ //# sourceMappingURL=action-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-contract.d.ts","sourceRoot":"","sources":["../src/action-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAE5D,eAAO,MAAM,mCAAmC,UAAU,CAAA;AAC1D,eAAO,MAAM,+BAA+B,2DAA4D,CAAA;AACxG,MAAM,MAAM,2BAA2B,GAAG,OAAO,+BAA+B,CAAC,MAAM,CAAC,CAAA;AAExF,eAAO,MAAM,gCAAgC,+BAAgC,CAAA;AAC7E,MAAM,MAAM,2BAA2B,GAAG,OAAO,gCAAgC,CAAC,MAAM,CAAC,CAAA;AAEzF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,2BAA2B,CAAA;IACtC,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,EAAE,2BAA2B,CAAA;IAC9C,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACvC;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,yBAAyB,EAAE,SAAS,GAAG,aAAa,CAAC,CAAA;AAEnG,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,oBAAoB,EAAE,MAAM,CAAA;IAC5B,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,oCAAoC;IACnD,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAA;IAC3C,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAA;CAC9C;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS,CAiBhG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,yBAAyB,EAClC,SAAS,EAAE,MAAM,GAChB,wBAAwB,GAAG,SAAS,CAStC;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,yBAAyB,EAClC,YAAY,GAAE,oCAAyC,GACtD,SAAS,oBAAoB,EAAE,CAsHjC;AAED,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAeT;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,EAAE,yBAAyB,GAAG,SAAS,EAC9C,IAAI,SAAmB,GACtB,SAAS,oBAAoB,EAAE,CAsBjC"}
@@ -0,0 +1,185 @@
1
+ export const YOYO_ACTION_CONTRACT_SCHEMA_VERSION = '1.0.0';
2
+ export const YOYO_ACTION_CONTRACT_OPERATIONS = ['create', 'update', 'setEnabled', 'softDelete'];
3
+ export const YOYO_ACTION_CONCURRENCY_POLICIES = ['none', 'required'];
4
+ export function operationForYoyoActionKind(kind) {
5
+ switch (kind) {
6
+ case 'create':
7
+ return 'create';
8
+ case 'edit':
9
+ case 'addChild':
10
+ case 'updateChild':
11
+ case 'removeChild':
12
+ case 'replaceRoles':
13
+ return 'update';
14
+ case 'disable':
15
+ return 'setEnabled';
16
+ case 'delete':
17
+ return 'softDelete';
18
+ default:
19
+ return undefined;
20
+ }
21
+ }
22
+ export function isYoyoMutationActionKind(kind) {
23
+ return operationForYoyoActionKind(kind) !== undefined;
24
+ }
25
+ export function linkYoyoActionContract(catalog, actionKey) {
26
+ const contract = catalog.actions.find((item) => item.actionKey === actionKey);
27
+ if (!contract)
28
+ return undefined;
29
+ return {
30
+ ...contract,
31
+ catalogSchemaVersion: catalog.schemaVersion,
32
+ catalogSourceHash: catalog.sourceHash,
33
+ };
34
+ }
35
+ export function validateYoyoActionContractCatalog(catalog, capabilities = {}) {
36
+ const diagnostics = [];
37
+ const keys = new Set();
38
+ const allowedContractKeys = new Set([
39
+ 'actionKey',
40
+ 'operation',
41
+ 'validationOperationId',
42
+ 'permission',
43
+ 'feature',
44
+ 'concurrencyPolicy',
45
+ 'sourceModule',
46
+ 'schemaVersion',
47
+ 'generatorVersion',
48
+ 'sourceHash',
49
+ 'generatedCommand',
50
+ ]);
51
+ if (!catalog.schemaVersion || !catalog.generator || !catalog.generatorVersion || !catalog.sourceHash || !catalog.generatedBy || !catalog.generatedCommand) {
52
+ diagnostics.push({
53
+ code: 'YACT008',
54
+ path: 'catalog',
55
+ severity: 'blocking',
56
+ guidance: 'Regenerate the action contract catalog with complete provenance metadata.',
57
+ message: 'Action contract catalog provenance is incomplete.',
58
+ });
59
+ }
60
+ if (catalog.schemaVersion !== YOYO_ACTION_CONTRACT_SCHEMA_VERSION) {
61
+ diagnostics.push({
62
+ code: 'YACT005',
63
+ path: 'catalog.schemaVersion',
64
+ severity: 'blocking',
65
+ guidance: `Regenerate the catalog with schemaVersion ${YOYO_ACTION_CONTRACT_SCHEMA_VERSION}.`,
66
+ message: `Action contract catalog schemaVersion '${catalog.schemaVersion}' is incompatible.`,
67
+ });
68
+ }
69
+ for (const [index, contract] of catalog.actions.entries()) {
70
+ const path = `actionContracts.actions[${index}]`;
71
+ if (keys.has(contract.actionKey)) {
72
+ diagnostics.push({
73
+ code: 'YACT008',
74
+ path: `${path}.actionKey`,
75
+ severity: 'blocking',
76
+ guidance: 'Use one feature-scoped actionKey per backend action contract.',
77
+ message: `Action contract '${contract.actionKey}' is duplicated.`,
78
+ });
79
+ }
80
+ keys.add(contract.actionKey);
81
+ for (const key of Object.keys(contract)) {
82
+ if (!allowedContractKeys.has(key)) {
83
+ diagnostics.push({
84
+ code: 'YACT010',
85
+ path: `${path}.${key}`,
86
+ severity: 'blocking',
87
+ guidance: 'Keep grants, DTO fields, tokens and runtime state outside the static action contract catalog.',
88
+ message: `Action contract contains unsupported field '${key}'.`,
89
+ });
90
+ }
91
+ }
92
+ if (!contract.actionKey || !contract.sourceModule || !contract.schemaVersion || !contract.generatorVersion || !contract.sourceHash || !contract.generatedCommand) {
93
+ diagnostics.push({
94
+ code: 'YACT008',
95
+ path,
96
+ severity: 'blocking',
97
+ guidance: 'Regenerate the action contract with a complete source and generator provenance.',
98
+ message: `Action contract '${contract.actionKey || '<unknown>'}' has incomplete provenance.`,
99
+ });
100
+ }
101
+ if (!YOYO_ACTION_CONTRACT_OPERATIONS.includes(contract.operation)) {
102
+ diagnostics.push({
103
+ code: 'YACT008',
104
+ path: `${path}.operation`,
105
+ severity: 'blocking',
106
+ guidance: 'Use create, update, setEnabled or softDelete.',
107
+ message: `Action contract operation '${String(contract.operation)}' is invalid.`,
108
+ });
109
+ }
110
+ if (!YOYO_ACTION_CONCURRENCY_POLICIES.includes(contract.concurrencyPolicy)) {
111
+ diagnostics.push({
112
+ code: 'YACT008',
113
+ path: `${path}.concurrencyPolicy`,
114
+ severity: 'blocking',
115
+ guidance: 'Declare concurrencyPolicy explicitly as none or required.',
116
+ message: `Action contract '${contract.actionKey}' has no valid concurrency policy.`,
117
+ });
118
+ }
119
+ if (contract.operation === 'create' && contract.concurrencyPolicy !== 'none') {
120
+ diagnostics.push({
121
+ code: 'YACT009',
122
+ path: `${path}.concurrencyPolicy`,
123
+ severity: 'blocking',
124
+ guidance: 'Create actions must explicitly declare concurrencyPolicy: none.',
125
+ message: `Create action '${contract.actionKey}' cannot require optimistic concurrency.`,
126
+ });
127
+ }
128
+ if (contract.permission && capabilities.permissions && !capabilities.permissions.includes(contract.permission)) {
129
+ diagnostics.push({
130
+ code: 'YACT006',
131
+ path: `${path}.permission`,
132
+ severity: 'blocking',
133
+ guidance: 'Register the permission in the capability catalog before linking the action contract.',
134
+ message: `Permission '${contract.permission}' is not registered.`,
135
+ });
136
+ }
137
+ if (contract.feature && capabilities.features && !capabilities.features.includes(contract.feature)) {
138
+ diagnostics.push({
139
+ code: 'YACT006',
140
+ path: `${path}.feature`,
141
+ severity: 'blocking',
142
+ guidance: 'Register the feature in the capability catalog before linking the action contract.',
143
+ message: `Feature '${contract.feature}' is not registered.`,
144
+ });
145
+ }
146
+ }
147
+ return diagnostics;
148
+ }
149
+ export function isYoyoActionContractSnapshotCompatible(linked, catalog) {
150
+ const current = linkYoyoActionContract(catalog, linked.actionKey);
151
+ return Boolean(current)
152
+ && current.operation === linked.operation
153
+ && current.validationOperationId === linked.validationOperationId
154
+ && current.permission === linked.permission
155
+ && current.feature === linked.feature
156
+ && current.concurrencyPolicy === linked.concurrencyPolicy
157
+ && current.sourceModule === linked.sourceModule
158
+ && current.schemaVersion === linked.schemaVersion
159
+ && current.generatorVersion === linked.generatorVersion
160
+ && current.sourceHash === linked.sourceHash
161
+ && current.generatedCommand === linked.generatedCommand
162
+ && current.catalogSchemaVersion === linked.catalogSchemaVersion
163
+ && current.catalogSourceHash === linked.catalogSourceHash;
164
+ }
165
+ export function diagnoseYoyoActionContractSnapshot(linked, catalog, path = 'actionContract') {
166
+ if (!linked || !catalog) {
167
+ return [{
168
+ code: 'YACT011',
169
+ path,
170
+ severity: 'blocking',
171
+ guidance: 'Bind the mutation to the current generated action-contract catalog before calling a datasource.',
172
+ message: 'The mutation action contract snapshot is unavailable.',
173
+ }];
174
+ }
175
+ if (!isYoyoActionContractSnapshotCompatible(linked, catalog)) {
176
+ return [{
177
+ code: 'YACT011',
178
+ path,
179
+ severity: 'blocking',
180
+ guidance: 'Regenerate and bind the same action-contract catalog snapshot used to compile the page.',
181
+ message: `Action contract '${linked.actionKey}' is stale or incompatible with the current catalog snapshot.`,
182
+ }];
183
+ }
184
+ return [];
185
+ }
@@ -0,0 +1,12 @@
1
+ export interface YoyoActionDefinition {
2
+ key: string;
3
+ }
4
+ export interface YoyoActionRegistry {
5
+ has(key: string): boolean;
6
+ keys(): readonly string[];
7
+ resolve(key: string): YoyoActionDefinition;
8
+ }
9
+ export declare const yoyoV1ActionDefinitions: readonly YoyoActionDefinition[];
10
+ export declare const yoyoV1ActionRegistry: YoyoActionRegistry;
11
+ export declare function createYoyoActionRegistry(definitions: readonly YoyoActionDefinition[]): YoyoActionRegistry;
12
+ //# sourceMappingURL=action-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../src/action-registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,IAAI,IAAI,SAAS,MAAM,EAAE,CAAA;IACzB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAA;CAC3C;AAED,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAA8D,CAAA;AACjI,eAAO,MAAM,oBAAoB,oBAAoD,CAAA;AAErF,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,kBAAkB,CAiBzG"}
@@ -0,0 +1,23 @@
1
+ import { YOYO_ACTION_KINDS } from './types.js';
2
+ export const yoyoV1ActionDefinitions = YOYO_ACTION_KINDS.map((key) => ({ key }));
3
+ export const yoyoV1ActionRegistry = createYoyoActionRegistry(yoyoV1ActionDefinitions);
4
+ export function createYoyoActionRegistry(definitions) {
5
+ const entries = new Map();
6
+ for (const definition of definitions) {
7
+ if (!definition.key.trim())
8
+ throw new Error('Action registry does not accept an empty key.');
9
+ if (entries.has(definition.key))
10
+ throw new Error(`Action '${definition.key}' is already registered.`);
11
+ entries.set(definition.key, definition);
12
+ }
13
+ return {
14
+ has: (key) => entries.has(key),
15
+ keys: () => [...entries.keys()].sort(),
16
+ resolve: (key) => {
17
+ const definition = entries.get(key);
18
+ if (!definition)
19
+ throw new Error(`Action '${key}' is not registered.`);
20
+ return definition;
21
+ },
22
+ };
23
+ }
@@ -0,0 +1,17 @@
1
+ import { type YoyoPageIR, type YoyoPageSchema, type YoyoPageKind, type YoyoSchemaCompilerOptions, type YoyoSchemaDiffEntry, type YoyoSchemaUsageReport } from './types.js';
2
+ import { type YoyoSchemaDiagnostic } from './diagnostics.js';
3
+ export interface YoyoCompileResult {
4
+ ir: YoyoPageIR;
5
+ diagnostics: readonly YoyoSchemaDiagnostic[];
6
+ usageReport: YoyoSchemaUsageReport;
7
+ }
8
+ /**
9
+ * Declares a canonical V1 page schema while retaining its literal page kind.
10
+ * The historical name remains the single public authoring entry point.
11
+ */
12
+ export declare function defineYoyoQueryPage<const TPage extends YoyoPageSchema>(page: TPage): TPage;
13
+ export declare function compileYoyoPageSchema(input: unknown, options?: YoyoSchemaCompilerOptions): YoyoCompileResult;
14
+ export declare function isPageKindAllowed(value: string): value is YoyoPageKind;
15
+ export declare function diffYoyoPageIR(before: YoyoPageIR, after: YoyoPageIR): readonly YoyoSchemaDiffEntry[];
16
+ export declare function formatYoyoSchemaDiff(entries: readonly YoyoSchemaDiffEntry[]): string;
17
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EAKjB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EAExB,KAAK,qBAAqB,EAI3B,MAAM,YAAY,CAAA;AAiBnB,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAkQvF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,UAAU,CAAA;IACd,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAC5C,WAAW,EAAE,qBAAqB,CAAA;CACnC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,KAAK,SAAS,cAAc,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAE1F;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,iBAAiB,CAqgBnB;AAwDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEtE;AAkSD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,GAChB,SAAS,mBAAmB,EAAE,CA0BhC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,UAY3E"}