@jantstack/adonis-authz 1.1.0 → 2.0.0-alpha.1

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 (132) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +417 -58
  3. package/build/commands/authz_catalog_diff.d.ts +28 -0
  4. package/build/commands/authz_catalog_diff.d.ts.map +1 -0
  5. package/build/commands/authz_catalog_diff.js +67 -0
  6. package/build/commands/authz_catalog_diff.js.map +1 -0
  7. package/build/commands/authz_catalog_sync.d.ts +20 -0
  8. package/build/commands/authz_catalog_sync.d.ts.map +1 -0
  9. package/build/commands/authz_catalog_sync.js +58 -0
  10. package/build/commands/authz_catalog_sync.js.map +1 -0
  11. package/build/commands/main.d.ts +2 -0
  12. package/build/commands/main.d.ts.map +1 -1
  13. package/build/commands/main.js +2 -0
  14. package/build/commands/main.js.map +1 -1
  15. package/build/commands/openfga_import.d.ts +8 -2
  16. package/build/commands/openfga_import.d.ts.map +1 -1
  17. package/build/commands/openfga_import.js +29 -6
  18. package/build/commands/openfga_import.js.map +1 -1
  19. package/build/commands/openfga_provision.d.ts.map +1 -1
  20. package/build/commands/openfga_provision.js +2 -1
  21. package/build/commands/openfga_provision.js.map +1 -1
  22. package/build/index.d.ts +45 -6
  23. package/build/index.d.ts.map +1 -1
  24. package/build/index.js +37 -4
  25. package/build/index.js.map +1 -1
  26. package/build/src/catalog.d.ts +249 -2
  27. package/build/src/catalog.d.ts.map +1 -1
  28. package/build/src/catalog.js +709 -59
  29. package/build/src/catalog.js.map +1 -1
  30. package/build/src/catalog_cache.d.ts +300 -0
  31. package/build/src/catalog_cache.d.ts.map +1 -0
  32. package/build/src/catalog_cache.js +656 -0
  33. package/build/src/catalog_cache.js.map +1 -0
  34. package/build/src/clock.d.ts +24 -0
  35. package/build/src/clock.d.ts.map +1 -0
  36. package/build/src/clock.js +7 -0
  37. package/build/src/clock.js.map +1 -0
  38. package/build/src/define_config.d.ts +102 -6
  39. package/build/src/define_config.d.ts.map +1 -1
  40. package/build/src/define_config.js.map +1 -1
  41. package/build/src/drivers/backend_guard.d.ts +92 -0
  42. package/build/src/drivers/backend_guard.d.ts.map +1 -0
  43. package/build/src/drivers/backend_guard.js +221 -0
  44. package/build/src/drivers/backend_guard.js.map +1 -0
  45. package/build/src/drivers/database_driver.d.ts +242 -15
  46. package/build/src/drivers/database_driver.d.ts.map +1 -1
  47. package/build/src/drivers/database_driver.js +692 -127
  48. package/build/src/drivers/database_driver.js.map +1 -1
  49. package/build/src/drivers/openfga_driver.d.ts +341 -27
  50. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  51. package/build/src/drivers/openfga_driver.js +1020 -271
  52. package/build/src/drivers/openfga_driver.js.map +1 -1
  53. package/build/src/drivers/sql_expiry.d.ts +53 -0
  54. package/build/src/drivers/sql_expiry.d.ts.map +1 -0
  55. package/build/src/drivers/sql_expiry.js +66 -0
  56. package/build/src/drivers/sql_expiry.js.map +1 -0
  57. package/build/src/errors.d.ts +333 -0
  58. package/build/src/errors.d.ts.map +1 -1
  59. package/build/src/errors.js +352 -0
  60. package/build/src/errors.js.map +1 -1
  61. package/build/src/expiry.d.ts +27 -0
  62. package/build/src/expiry.d.ts.map +1 -0
  63. package/build/src/expiry.js +50 -0
  64. package/build/src/expiry.js.map +1 -0
  65. package/build/src/hierarchical_resolver.d.ts +56 -0
  66. package/build/src/hierarchical_resolver.d.ts.map +1 -0
  67. package/build/src/hierarchical_resolver.js +87 -0
  68. package/build/src/hierarchical_resolver.js.map +1 -0
  69. package/build/src/identity.d.ts +155 -0
  70. package/build/src/identity.d.ts.map +1 -0
  71. package/build/src/identity.js +359 -0
  72. package/build/src/identity.js.map +1 -0
  73. package/build/src/manager.d.ts +225 -7
  74. package/build/src/manager.d.ts.map +1 -1
  75. package/build/src/manager.js +1670 -23
  76. package/build/src/manager.js.map +1 -1
  77. package/build/src/memoize_ancestors.d.ts +23 -0
  78. package/build/src/memoize_ancestors.d.ts.map +1 -0
  79. package/build/src/memoize_ancestors.js +42 -0
  80. package/build/src/memoize_ancestors.js.map +1 -0
  81. package/build/src/middleware/app_access_middleware.d.ts +8 -6
  82. package/build/src/middleware/app_access_middleware.d.ts.map +1 -1
  83. package/build/src/middleware/app_access_middleware.js +10 -26
  84. package/build/src/middleware/app_access_middleware.js.map +1 -1
  85. package/build/src/models/authz_assignment.d.ts +5 -5
  86. package/build/src/models/authz_assignment.d.ts.map +1 -1
  87. package/build/src/models/authz_deny.d.ts +5 -5
  88. package/build/src/models/authz_deny.d.ts.map +1 -1
  89. package/build/src/models/authz_permission.d.ts +11 -5
  90. package/build/src/models/authz_permission.d.ts.map +1 -1
  91. package/build/src/models/authz_permission.js +4 -0
  92. package/build/src/models/authz_permission.js.map +1 -1
  93. package/build/src/models/authz_role.d.ts +13 -6
  94. package/build/src/models/authz_role.d.ts.map +1 -1
  95. package/build/src/models/authz_role.js +6 -1
  96. package/build/src/models/authz_role.js.map +1 -1
  97. package/build/src/models/authz_role_permission.d.ts +5 -5
  98. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  99. package/build/src/openfga.d.ts +13 -0
  100. package/build/src/openfga.d.ts.map +1 -0
  101. package/build/src/openfga.js +12 -0
  102. package/build/src/openfga.js.map +1 -0
  103. package/build/src/sql_descendants.d.ts +51 -0
  104. package/build/src/sql_descendants.d.ts.map +1 -0
  105. package/build/src/sql_descendants.js +129 -0
  106. package/build/src/sql_descendants.js.map +1 -0
  107. package/build/src/testing/contract.d.ts +138 -7
  108. package/build/src/testing/contract.d.ts.map +1 -1
  109. package/build/src/testing/contract.js +2946 -24
  110. package/build/src/testing/contract.js.map +1 -1
  111. package/build/src/testing/main.d.ts +4 -2
  112. package/build/src/testing/main.d.ts.map +1 -1
  113. package/build/src/testing/main.js +2 -1
  114. package/build/src/testing/main.js.map +1 -1
  115. package/build/src/testing/scope_tree.d.ts +65 -0
  116. package/build/src/testing/scope_tree.d.ts.map +1 -0
  117. package/build/src/testing/scope_tree.js +145 -0
  118. package/build/src/testing/scope_tree.js.map +1 -0
  119. package/build/src/traits/authz_scopes.d.ts +30 -6
  120. package/build/src/traits/authz_scopes.d.ts.map +1 -1
  121. package/build/src/traits/authz_scopes.js +30 -18
  122. package/build/src/traits/authz_scopes.js.map +1 -1
  123. package/build/src/traits/has_uuid.d.ts +5 -5
  124. package/build/src/traits/has_uuid.d.ts.map +1 -1
  125. package/build/src/types.d.ts +530 -28
  126. package/build/src/types.d.ts.map +1 -1
  127. package/build/src/types.js +10 -4
  128. package/build/src/types.js.map +1 -1
  129. package/build/stubs/config/app_acl.stub +4 -2
  130. package/build/stubs/config/authorization.stub +66 -12
  131. package/build/stubs/migration.stub +57 -13
  132. package/package.json +11 -6
@@ -1,3 +1,250 @@
1
- import type { CatalogSpec } from './types.js';
2
- export declare function syncAuthzCatalog(catalog: CatalogSpec): Promise<void>;
1
+ import type { CatalogRoleRef, CatalogSpec, ScopeChainResolver, ScopeType } from './types.js';
2
+ /**
3
+ * `assignableAt` de un permiso tal como se GUARDA (`authz_permissions.assignable_at`):
4
+ * JSON ordenado y sin duplicados, o `null` = cualquier nivel. Ordenado para
5
+ * que dos specs equivalentes sean la misma cadena (el sync compara texto).
6
+ */
7
+ export declare function encodeAssignableAt(levels: ScopeType[] | undefined): string | null;
8
+ /**
9
+ * `assignable_at` tal como está EN LA BASE, normalizado a la forma en la que
10
+ * el spec lo codifica (3D · N5): es lo que permite que el sync y el diff
11
+ * comparen lo mismo. Hasta aquí el sync comparaba la cadena cruda y el diff
12
+ * la lista parseada, así que un valor desordenado a mano (`["unit","app"]`)
13
+ * salía «en sync» y el sync lo reescribía. Un valor CORRUPTO no lanza aquí:
14
+ * cuenta como distinto, para que el sync lo repare en vez de atragantarse
15
+ * (leerlo sí es 500, `parseAssignableAt`).
16
+ */
17
+ export declare function storedAssignableAt(slug: string, raw: unknown): string | null;
18
+ /** Marca de `storedAssignableAt` para una fila que no se puede leer (3D · N5). */
19
+ export declare const CORRUPT_ASSIGNABLE_AT = "\0corrupto";
20
+ /** Un rol de nivel `scopeType` que lleva `permission` con esos `levels` (o `null`): legal, o 422 `E_AUTHZ_ROLE_NOT_ASSIGNABLE_AT`. */
21
+ export declare function assertAssignableAt(role: {
22
+ slug: string;
23
+ scopeType: ScopeType;
24
+ }, permission: string, levels: readonly ScopeType[] | null): void;
25
+ /**
26
+ * Longitud de `authz_permissions.assignable_at` (`varchar(500)` en el stub y
27
+ * en el espejo). El JSON codificado tiene que caber (3D · N3).
28
+ */
29
+ export declare const ASSIGNABLE_AT_MAX = 500;
30
+ /** Deadline de cada consulta del catálogo (D15); configurable por `timeoutMs`. */
31
+ export declare const DEFAULT_CATALOG_TIMEOUT_MS = 5000;
32
+ /**
33
+ * Lo que un `syncAuthzCatalog` deja DICHO (3E · P1 b / P6). El sync del
34
+ * despliegue es todo-o-nada para lo que ESCRIBE, pero no puede abortar por
35
+ * lo que un tenant hizo en su scope: hasta 3E, un rol local homónimo tumbaba
36
+ * el catálogo entero de la plataforma (auditor A1: el actor de menor
37
+ * privilegio del sistema paraba el deploy). La política es **reportar y
38
+ * seguir**, nunca romper en silencio: se escribe el global —los globales
39
+ * ganan— y aquí queda quién se ve afectado.
40
+ */
41
+ export interface CatalogSyncReport {
42
+ /**
43
+ * Roles LOCALES cuyo `(slug, nivel)` acaba de ocupar un rol GLOBAL del
44
+ * spec (3E · P1 b). El global manda; el local sigue en la base pero desde
45
+ * ya toda ruta por slug en su cadena es 422 `E_AUTHZ_AMBIGUOUS_ROLE` (M1,
46
+ * fail-closed): su tenant tiene que direccionar por `{ uuid }` o pedir que
47
+ * lo purguen. `authz:catalog:diff` los lista y sale con código ≠ 0.
48
+ */
49
+ shadowedByGlobal: CatalogRoleRef[];
50
+ /**
51
+ * Vínculos rol→permiso que YA existían y que el `assignableAt` nuevo del
52
+ * config ya no admite (3E · P6): estrechar `assignableAt` no revalidaba
53
+ * los roles que ya llevaban el permiso —ni el diff los mencionaba—, así
54
+ * que la restricción entraba a medias y en silencio. No se borran (lo
55
+ * asignado sigue concediendo, invariante 1): se reportan para que el
56
+ * operador decida (`updateScopedRole`, `deleteScopedRole` o ampliar el
57
+ * `assignableAt`).
58
+ */
59
+ assignableAtViolations: Array<{
60
+ role: CatalogRoleRef;
61
+ permission: string;
62
+ }>;
63
+ }
64
+ export interface SyncCatalogOptions {
65
+ /**
66
+ * Qué hacer con los vínculos rol→permiso que el spec YA NO lista, para los
67
+ * roles DEL SPEC (L0.9). `'links'` (default): se eliminan en la misma
68
+ * transacción. `'none'`: sync solo aditivo (el comportamiento de 1.x).
69
+ * Nunca se borran roles ni permisos, y los roles ajenos al spec no se
70
+ * tocan: dos catálogos (plataforma y tenant) coexisten.
71
+ */
72
+ prune?: 'links' | 'none';
73
+ /**
74
+ * Deadline de cada consulta en ms (default 5000). La base caída o lenta
75
+ * es 503 `E_AUTHZ_BACKEND_UNAVAILABLE`/`_TIMEOUT`, no un error crudo del
76
+ * cliente SQL: el sync corre en el arranque de un despliegue (D15).
77
+ */
78
+ timeoutMs?: number;
79
+ }
80
+ /**
81
+ * Sincroniza un catálogo (roles + permisos + vínculos) a las tablas `authz_*`.
82
+ *
83
+ * Idempotente y transaccional. Permisos y roles se crean si faltan (nunca se
84
+ * borran: la limpieza de un rol o permiso retirado es una decisión explícita
85
+ * del consumidor, porque arrastra asignaciones). Los vínculos rol→permiso
86
+ * son la excepción: con `prune: 'links'` (default) el spec MANDA sobre los
87
+ * roles que declara. Antes el sync era solo aditivo y quitar un permiso de
88
+ * un rol en el config no lo quitaba de ningún entorno — la única fuente de
89
+ * verdad visible mentía sobre los permisos efectivos (L0.9, N1).
90
+ *
91
+ * Un rol que concede un permiso que no existe ni en este spec ni en la base
92
+ * (sincronizado por otro catálogo) es 422 `E_AUTHZ_UNKNOWN_PERMISSION`:
93
+ * antes se saltaba en silencio.
94
+ *
95
+ * Lo usan el seeder del nivel app, `authz:catalog:sync` y el harness de la
96
+ * suite de contrato. El catálogo es metadata compartida entre drivers: un
97
+ * driver externo (openfga) materializa aparte solo los hechos.
98
+ */
99
+ export declare function syncAuthzCatalog(catalog: CatalogSpec, options?: SyncCatalogOptions): Promise<CatalogSyncReport>;
100
+ export interface CatalogLinkRef {
101
+ role: string;
102
+ scopeType: ScopeType;
103
+ permission: string;
104
+ }
105
+ export interface CatalogDiff {
106
+ /** Permisos del spec que no existen en la base. */
107
+ missingPermissions: string[];
108
+ /** Roles del spec que no existen en la base. */
109
+ missingRoles: Array<{
110
+ slug: string;
111
+ scopeType: ScopeType;
112
+ }>;
113
+ /** Vínculos que el spec declara y la base no tiene. */
114
+ missingLinks: CatalogLinkRef[];
115
+ /** Vínculos que la base tiene, en roles DEL SPEC, y el spec ya no lista (privilegio zombi). */
116
+ extraLinks: CatalogLinkRef[];
117
+ /** Roles cuyo rank en la base difiere del spec. */
118
+ rankMismatches: Array<{
119
+ role: string;
120
+ scopeType: ScopeType;
121
+ expected: number;
122
+ actual: number;
123
+ }>;
124
+ /**
125
+ * Permisos del spec cuyo `assignableAt` en la base difiere (3B · B5):
126
+ * `null` = cualquier nivel. `corrupt: true` (3E · P5) es una fila que no
127
+ * se puede leer (`assignable_at` que no es JSON de niveles): cuenta como
128
+ * diferencia —el sync la repara— y el diff la nombra en vez de morir.
129
+ */
130
+ assignableAtMismatches: Array<{
131
+ permission: string;
132
+ expected: ScopeType[] | null;
133
+ actual: ScopeType[] | null;
134
+ corrupt?: boolean;
135
+ }>;
136
+ /**
137
+ * Roles LOCALES (3B): propios de un scope, definidos con `defineScopedRole`.
138
+ * Informativo: no son sobrantes ni faltantes (el spec solo declara
139
+ * globales) y no afectan a `catalogInSync`.
140
+ */
141
+ scopedRoles: Array<{
142
+ slug: string;
143
+ scopeType: ScopeType;
144
+ owner: string;
145
+ }>;
146
+ /**
147
+ * `(slug, nivel)` con MÁS DE UN rol visible desde una misma cadena que la
148
+ * AUTORIDAD no sabe ordenar (3D · M2 d; 3F · S3). Desde 3F, la pareja
149
+ * global+local va a `shadowedByGlobal` y la de ancestro+descendiente a
150
+ * `shadowedByAncestor` —las dos son el orden de autoridad funcionando, no
151
+ * deriva—, así que aquí solo queda lo que NINGUNA regla ordena: dos
152
+ * locales que se declaran ancestro el uno del otro (un `resolveChain` con
153
+ * un ciclo o que se contradice). Eso sí es deriva REAL —`catalogInSync` es
154
+ * `false` y el comando sale con código ≠ 0—: mientras dure, toda ruta por
155
+ * slug ahí responde 422 `E_AUTHZ_AMBIGUOUS_ROLE` (M1) y el operador tiene
156
+ * que PURGAR uno (un rol local no se renombra: 3E · Q1). Las parejas de
157
+ * locales solo se juzgan con `resolveChain` (el árbol es del consumidor):
158
+ * sin resolutor se dice en el informe.
159
+ */
160
+ ambiguousRoles: Array<{
161
+ slug: string;
162
+ scopeType: ScopeType;
163
+ owners: string[];
164
+ }>;
165
+ /**
166
+ * Roles LOCALES ensombrecidos por un rol GLOBAL homónimo: el del spec que
167
+ * el sync va a escribir (3E · P1 b) o uno que ya está en la base. **No es
168
+ * deriva** desde 3F · S3: es el orden de AUTORIDAD funcionando (global >
169
+ * local), igual que `shadowedByAncestor`. Se listan para que el operador
170
+ * los vea —mientras duren, ese slug es 422 `E_AUTHZ_AMBIGUOUS_ROLE` en la
171
+ * cadena de esos owners y se opera por `{ uuid }`—, pero no dejan el gate
172
+ * de CI en rojo: un tenant que ocupa un nombre no puede parar el deploy de
173
+ * la plataforma, ni siquiera por la vía del `exit 1` (auditor N1).
174
+ */
175
+ shadowedByGlobal: Array<{
176
+ slug: string;
177
+ scopeType: ScopeType;
178
+ owner: string;
179
+ }>;
180
+ /**
181
+ * Roles LOCALES ensombrecidos por otro LOCAL homónimo cuyo owner es un
182
+ * ANCESTRO suyo (3F · S3): el dueño del árbol definió el suyo y el del
183
+ * descendiente queda tapado dentro de su propio subárbol. Como
184
+ * `shadowedByGlobal`: se lista, no es deriva.
185
+ */
186
+ shadowedByAncestor: Array<{
187
+ slug: string;
188
+ scopeType: ScopeType;
189
+ owner: string;
190
+ shadowedBy: string;
191
+ }>;
192
+ /**
193
+ * Vínculos rol→permiso vivos que el `assignableAt` del spec ya no admite
194
+ * (3E · P6), en roles que el sync no toca (locales y globales de otro
195
+ * catálogo). El sync los reporta igual; el diff los dice antes.
196
+ */
197
+ assignableAtViolations: Array<{
198
+ role: string;
199
+ scopeType: ScopeType;
200
+ owner: string;
201
+ permission: string;
202
+ }>;
203
+ }
204
+ /**
205
+ * Compara un spec con lo que hay en `authz_*`, sin escribir. Igual que el
206
+ * sync, solo mira los roles del spec: lo ajeno (otro catálogo) no es una
207
+ * diferencia. Un diff limpio significa que `syncAuthzCatalog(spec)` sería un
208
+ * no-op.
209
+ */
210
+ export declare function diffAuthzCatalog(catalog: CatalogSpec, options?: {
211
+ timeoutMs?: number;
212
+ resolveChain?: ScopeChainResolver;
213
+ }): Promise<CatalogDiff>;
214
+ export declare function catalogInSync(diff: CatalogDiff): boolean;
215
+ /** Líneas legibles del diff (vacío si está en sync). */
216
+ export declare function formatCatalogDiff(diff: CatalogDiff): string[];
217
+ /** Líneas informativas del diff (no son diferencias): los roles locales, propios de un scope. */
218
+ export declare function formatScopedRoles(diff: CatalogDiff): string[];
219
+ /**
220
+ * Líneas informativas del diff (3F · S3): los roles locales ENSOMBRECIDOS
221
+ * por una definición más autorizada —un global, o un local de un ancestro—.
222
+ * No son deriva: es el orden de autoridad funcionando. Se listan porque
223
+ * mientras duren, ese slug es 422 `E_AUTHZ_AMBIGUOUS_ROLE` en la cadena de
224
+ * su owner y hay que operar por `{ uuid }` (o purgar uno de los dos).
225
+ */
226
+ export declare function formatShadowedRoles(diff: CatalogDiff): string[];
227
+ /** Fábricas de catálogo tal como se declaran en `config.catalogs`. */
228
+ export type CatalogSource = () => Promise<CatalogSpec> | CatalogSpec;
229
+ /**
230
+ * El diff de TODOS los catálogos del config. `inSync: false` ⇒ el comando
231
+ * sale con código ≠ 0 (para CI). Separado del comando para poder probarlo
232
+ * sin un kernel de ace.
233
+ */
234
+ export declare function runCatalogDiff(catalogs: CatalogSource[], options?: {
235
+ resolveChain?: ScopeChainResolver;
236
+ failOnShadows?: boolean;
237
+ }): Promise<{
238
+ inSync: boolean;
239
+ lines: string[];
240
+ }>;
241
+ /**
242
+ * Sincroniza todos los catálogos del config, en orden (lo que hace
243
+ * `authz:catalog:sync`). Devuelve cuántos y lo que hay que DECIR (3E · P1 b
244
+ * / P6): el comando lo imprime como aviso — reportar y seguir, nunca romper
245
+ * en silencio.
246
+ */
247
+ export declare function syncCatalogs(catalogs: CatalogSource[], options?: SyncCatalogOptions): Promise<{
248
+ count: number;
249
+ } & CatalogSyncReport>;
3
250
  //# sourceMappingURL=catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/catalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AA+B7C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E1E"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAO5F;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAO5E;AAED,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,eAAmB,CAAA;AAkBrD,sIAAsI;AACtI,wBAAgB,kBAAkB,CAChC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,EAC5C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,GAClC,IAAI,CAON;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAA;AAEpC,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,OAAQ,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,gBAAgB,EAAE,cAAc,EAAE,CAAA;IAClC;;;;;;;;OAQG;IACH,sBAAsB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA4B5B;AAsOD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,gDAAgD;IAChD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IAC3D,uDAAuD;IACvD,YAAY,EAAE,cAAc,EAAE,CAAA;IAC9B,+FAA+F;IAC/F,UAAU,EAAE,cAAc,EAAE,CAAA;IAC5B,mDAAmD;IACnD,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/F;;;;;OAKG;IACH,sBAAsB,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClI;;;;OAIG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzE;;;;;;;;;;;;;OAaG;IACH,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC/E;;;;;;;;;OASG;IACH,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9E;;;;;OAKG;IACH,kBAAkB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpG;;;;OAIG;IACH,sBAAsB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACzG;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAO,GACtE,OAAO,CAAC,WAAW,CAAC,CAoItB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAWxD;AAwHD,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAmC7D;AAED,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAiB/D;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAA;AAyCpE;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8C/C;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAAC,CAWhD"}