xonecode 0.17.1 → 0.19.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 (86) hide show
  1. package/apps/web/dist/assets/{index-BRVuyPBf.js → index-BvPUqjUm.js} +72 -72
  2. package/apps/web/dist/assets/{index-DLfF2uEK.css → index-CGEXMJBx.css} +1 -1
  3. package/apps/web/dist/assets/{php-B5LpMCn-.js → php-Dk28VW45.js} +1 -1
  4. package/apps/web/dist/assets/{ruby-Clm-qfwM.js → ruby-CPzEcmdp.js} +1 -1
  5. package/apps/web/dist/index.html +2 -2
  6. package/dist/agent/config/iconosEnRed.js +47 -0
  7. package/dist/agent/config/iconosEnRed.js.map +1 -0
  8. package/dist/agent/dispositivos/decodificarImagen.js +62 -0
  9. package/dist/agent/dispositivos/decodificarImagen.js.map +1 -0
  10. package/dist/agent/grafo/buscarIcono.js +92 -0
  11. package/dist/agent/grafo/buscarIcono.js.map +1 -0
  12. package/dist/agent/grafo/compararCapturas.js +103 -0
  13. package/dist/agent/grafo/compararCapturas.js.map +1 -0
  14. package/dist/agent/grafo/criticaVisual.js +23 -3
  15. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  16. package/dist/agent/grafo/diferenciaDeCapturas.js +88 -0
  17. package/dist/agent/grafo/diferenciaDeCapturas.js.map +1 -0
  18. package/dist/agent/grafo/generarFondoSvg.js +83 -0
  19. package/dist/agent/grafo/generarFondoSvg.js.map +1 -0
  20. package/dist/agent/grafo/lectorDeReferencias.js +19 -0
  21. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -0
  22. package/dist/agent/grafo/xoneAgent.js +8 -1
  23. package/dist/agent/grafo/xoneAgent.js.map +1 -1
  24. package/dist/agent/motores/trueforge/eventosTrueforge.js +11 -1
  25. package/dist/agent/motores/trueforge/eventosTrueforge.js.map +1 -1
  26. package/dist/agent/motores/trueforge/modeloLangchain.js +5 -0
  27. package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
  28. package/dist/agent/motores/trueforge/sesionTrueforge.js +67 -6
  29. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  30. package/dist/agent/subagentes/agentesEnDisco.js +26 -2
  31. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  32. package/dist/agent/turno/diagnosticoDeTools.js +32 -3
  33. package/dist/agent/turno/diagnosticoDeTools.js.map +1 -1
  34. package/dist/agent/turno/informeDeTraza.js +54 -4
  35. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  36. package/dist/agent/turno/registroDeFallos.js +6 -1
  37. package/dist/agent/turno/registroDeFallos.js.map +1 -1
  38. package/dist/agent/turno/resumenDeTool.js +9 -0
  39. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  40. package/dist/agent/turno/turnoReal.js +8 -2
  41. package/dist/agent/turno/turnoReal.js.map +1 -1
  42. package/dist/cli/run.js +11 -0
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/core/agentes.js +29 -1
  45. package/dist/core/agentes.js.map +1 -1
  46. package/dist/core/analisisDeSesion.js +198 -0
  47. package/dist/core/analisisDeSesion.js.map +1 -0
  48. package/dist/core/compararCapturas.js +339 -0
  49. package/dist/core/compararCapturas.js.map +1 -0
  50. package/dist/core/fallos.js.map +1 -1
  51. package/dist/core/fondosSvg.js +223 -0
  52. package/dist/core/fondosSvg.js.map +1 -0
  53. package/dist/core/iconos.js +135 -0
  54. package/dist/core/iconos.js.map +1 -0
  55. package/dist/core/modoDeEscritura.js +22 -0
  56. package/dist/core/modoDeEscritura.js.map +1 -1
  57. package/dist/core/notify.js +8 -0
  58. package/dist/core/notify.js.map +1 -1
  59. package/dist/core/nucleoXone.js +111 -0
  60. package/dist/core/nucleoXone.js.map +1 -0
  61. package/dist/core/paqueteDeSoporte.js +118 -0
  62. package/dist/core/paqueteDeSoporte.js.map +1 -0
  63. package/dist/core/ports.js +31 -0
  64. package/dist/core/ports.js.map +1 -1
  65. package/dist/core/referenciasDeImagen.js +55 -0
  66. package/dist/core/referenciasDeImagen.js.map +1 -0
  67. package/dist/web/servidor/arranque.js +110 -0
  68. package/dist/web/servidor/arranque.js.map +1 -1
  69. package/dist/web/servidor/sesiones.js +8 -0
  70. package/dist/web/servidor/sesiones.js.map +1 -1
  71. package/dist/web/servidor/soporte.js +571 -0
  72. package/dist/web/servidor/soporte.js.map +1 -0
  73. package/dist/web/servidor/transporte.js.map +1 -1
  74. package/package.json +4 -1
  75. package/skills/artifacts-builder/reference/estilo.md +3 -6
  76. package/skills/xone-development/SKILL.md +1 -5
  77. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -0
  78. package/skills/xone-development/references/fundamentos/errores-comunes.md +15 -3
  79. package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +2 -0
  80. package/skills/xone-hotswap/SKILL.md +10 -0
  81. package/skills/xone-hotswap/references/comandos.md +14 -0
  82. package/skills/xone-hotswap/scripts/xone-recargar-android +269 -0
  83. package/skills/xone-plan-builder/SKILL.md +8 -0
  84. package/skills/xone-plan-builder/references/TASKS-FORMAT.md +8 -0
  85. package/skills/xone-project-generator/SKILL.md +1 -1
  86. package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +1 -0
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Comparar la ESTRUCTURA de dos pantallas con aritmética de píxeles (IXCODE-18).
3
+ *
4
+ * ## Por qué existe, medido
5
+ *
6
+ * Pidiendo a un agente «haz este diseño» (una calculadora de Stitch), el turno cerró diciendo «sin
7
+ * solape ni recorte: los controles caben» mientras el teclado ocupaba un tercio de la pantalla y
8
+ * las teclas salían cortadas. El crítico visual había dicho rojo y el propio agente lo descartó
9
+ * como «no fiable»: dos opiniones de modelos, ninguna cifra. Con cifras el desacuerdo no cabe: la
10
+ * maqueta ocupaba el 96 % del alto y la captura el 33 %.
11
+ *
12
+ * ## Qué mide, y por qué solo eso
13
+ *
14
+ * Es DETERMINISTA: las mismas dos imágenes dan siempre los mismos números, y no depende de que el
15
+ * modelo tenga visión (DeepSeek no la tiene). Mide **dónde hay contenido**, no cómo es:
16
+ *
17
+ * 1. El FONDO es el color más frecuente (una pantalla de app es un fondo liso con cosas encima).
18
+ * 2. «Contenido» es todo píxel que se aparta del fondo más que `UMBRAL_DE_CONTENIDO`.
19
+ * 3. La ocupación por FRANJAS horizontales (`FRANJAS_DE_FILAS`) y verticales
20
+ * (`FRANJAS_DE_COLUMNAS`), y hasta dónde llega el contenido.
21
+ *
22
+ * Todo en PORCENTAJES del área útil, así que una maqueta de 390 px y una captura de 1080 px se
23
+ * comparan sin escalar. Se recorta un margen arriba y abajo (barra de estado y de navegación).
24
+ *
25
+ * **Lo que NO hace, y se dice en cada respuesta**: no ve texto cortado, ni estilo (píldoras contra
26
+ * lápidas), ni colores. Y **no cuenta teclas**: se probó y no es fiable (las teclas oscuras sobre
27
+ * fondo oscuro se funden: 12 manchas en una maqueta de unas 20). Da el ESQUELETO; el parecido y las
28
+ * roturas siguen siendo cosa del crítico con visión.
29
+ *
30
+ * `core/` no decodifica imágenes: recibe los píxeles ya en RGBA (`agent/dispositivos/
31
+ * decodificarImagen.ts` los saca de un PNG o un JPEG).
32
+ */
33
+ /** Fracción del alto que se recorta arriba y abajo: barra de estado y barra de navegación. */
34
+ export const RECORTE_DE_BARRAS = 0.05;
35
+ export const FRANJAS_DE_FILAS = 10;
36
+ export const FRANJAS_DE_COLUMNAS = 8;
37
+ /** Suma de diferencias por canal a partir de la cual un píxel ya no es el fondo. */
38
+ export const UMBRAL_DE_CONTENIDO = 24;
39
+ /** Una franja «tiene contenido» si al menos esta fracción de sus píxeles no es fondo. */
40
+ const DENSIDAD_MINIMA_DE_FILA = 0.02;
41
+ /** Diferencia de ocupación (en puntos de 0 a 1) a partir de la cual una franja se señala. */
42
+ export const DIFERENCIA_QUE_SE_SEÑALA = 0.3;
43
+ /** Diferencia media de perfil bajo la que dos pantallas se dan por parecidas en estructura. */
44
+ export const DISTANCIA_PARECIDA = 0.12;
45
+ /** Se mira uno de cada tantos píxeles al buscar el fondo: no hace falta ver los 2,6 millones. */
46
+ const PASO_DE_MUESTREO = 7;
47
+ const pct = (n) => `${Math.round(n * 100)} %`;
48
+ /** Fracción del ancho, a cada lado, donde se busca el fondo: los márgenes de una pantalla. */
49
+ const BORDE_PARA_EL_FONDO = 0.03;
50
+ /** Si el color más frecuente del borde no llega a esta fracción de los píxeles del borde, el borde no es fiable. */
51
+ const FRACCION_MINIMA_DEL_BORDE = 0.3;
52
+ function modaDeColor(img, desde, hasta, dentro) {
53
+ const cuentas = new Map();
54
+ const { ancho, datos } = img;
55
+ let total = 0;
56
+ for (let y = desde; y < hasta; y += PASO_DE_MUESTREO) {
57
+ for (let x = 0; x < ancho; x++) {
58
+ if (!dentro(x))
59
+ continue;
60
+ const i = (y * ancho + x) * 4;
61
+ // Cuantizado a 6 bits por canal para tolerar el ruido de un JPEG.
62
+ const clave = ((datos[i] >> 2) << 16) | ((datos[i + 1] >> 2) << 8) | (datos[i + 2] >> 2);
63
+ cuentas.set(clave, (cuentas.get(clave) ?? 0) + 1);
64
+ total++;
65
+ }
66
+ }
67
+ let mejor = 0;
68
+ let cuenta = -1;
69
+ for (const [clave, n] of cuentas) {
70
+ if (n > cuenta) {
71
+ cuenta = n;
72
+ mejor = clave;
73
+ }
74
+ }
75
+ return {
76
+ color: [((mejor >> 16) & 63) << 2, ((mejor >> 8) & 63) << 2, (mejor & 63) << 2],
77
+ fraccion: total === 0 ? 0 : cuenta / total,
78
+ };
79
+ }
80
+ /**
81
+ * El color de FONDO: el más frecuente en los MÁRGENES laterales, no en toda la imagen.
82
+ *
83
+ * **Lo de «el más frecuente de todos» falló, y se midió**: en una calculadora cuyas teclas redondas
84
+ * ocupaban más superficie que el fondo, eligió el gris de las teclas, y toda la barra superior y la
85
+ * tarjeta del display contaron como contenido al cien por cien (una distancia del 46 % a una pantalla
86
+ * que a la vista estaba mucho más cerca de la maqueta). Incluso en la maqueta y en una captura buena
87
+ * eligió el color de la tarjeta del display, con menos de un tercio de los píxeles. Los márgenes
88
+ * laterales, en cambio, son fondo casi siempre —el contenido de una app deja margen a los lados— y
89
+ * dieron el mismo color en las cuatro imágenes probadas. Si el borde no es uniforme (contenido a
90
+ * sangre), se cae al más frecuente global, que es lo que había.
91
+ */
92
+ function colorDeFondo(img, desde, hasta) {
93
+ const margen = img.ancho * BORDE_PARA_EL_FONDO;
94
+ const borde = modaDeColor(img, desde, hasta, (x) => x < margen || x >= img.ancho - margen);
95
+ if (borde.fraccion >= FRACCION_MINIMA_DEL_BORDE)
96
+ return borde.color;
97
+ return modaDeColor(img, desde, hasta, () => true).color;
98
+ }
99
+ /**
100
+ * La ocupación de una imagen. **Lanza si no se puede medir** (vacía o diminuta): quien llama lo
101
+ * convierte en texto.
102
+ */
103
+ export function medirPantalla(img, recorte = RECORTE_DE_BARRAS) {
104
+ if (img.ancho < FRANJAS_DE_COLUMNAS || img.alto < FRANJAS_DE_FILAS * 4) {
105
+ throw new Error("la imagen es demasiado pequeña para medirla");
106
+ }
107
+ if (img.datos.length < img.ancho * img.alto * 4)
108
+ throw new Error("la imagen está incompleta");
109
+ const desde = Math.floor(img.alto * recorte);
110
+ const hasta = img.alto - Math.floor(img.alto * recorte);
111
+ const alto = hasta - desde;
112
+ const fondo = colorDeFondo(img, desde, hasta);
113
+ const { ancho, datos } = img;
114
+ const densidadDeFila = new Float64Array(alto);
115
+ const cuentaDeColumna = new Float64Array(ancho);
116
+ for (let y = 0; y < alto; y++) {
117
+ let n = 0;
118
+ const base = (desde + y) * ancho * 4;
119
+ for (let x = 0; x < ancho; x++) {
120
+ const i = base + x * 4;
121
+ const d = Math.abs(datos[i] - fondo[0]) + Math.abs(datos[i + 1] - fondo[1]) + Math.abs(datos[i + 2] - fondo[2]);
122
+ if (d > UMBRAL_DE_CONTENIDO) {
123
+ n++;
124
+ cuentaDeColumna[x] += 1;
125
+ }
126
+ }
127
+ densidadDeFila[y] = n / ancho;
128
+ }
129
+ let primera = -1;
130
+ let ultima = -1;
131
+ for (let y = 0; y < alto; y++) {
132
+ if (densidadDeFila[y] > DENSIDAD_MINIMA_DE_FILA) {
133
+ if (primera < 0)
134
+ primera = y;
135
+ ultima = y;
136
+ }
137
+ }
138
+ const media = (v, a, b) => {
139
+ let s = 0;
140
+ for (let i = a; i < b; i++)
141
+ s += v[i];
142
+ return b > a ? s / (b - a) : 0;
143
+ };
144
+ const filas = Array.from({ length: FRANJAS_DE_FILAS }, (_, k) => media(densidadDeFila, Math.floor((k * alto) / FRANJAS_DE_FILAS), Math.floor(((k + 1) * alto) / FRANJAS_DE_FILAS)));
145
+ const columnas = Array.from({ length: FRANJAS_DE_COLUMNAS }, (_, k) => media(cuentaDeColumna, Math.floor((k * ancho) / FRANJAS_DE_COLUMNAS), Math.floor(((k + 1) * ancho) / FRANJAS_DE_COLUMNAS)) /
146
+ alto);
147
+ return {
148
+ fondo,
149
+ inicioDelContenido: primera < 0 ? 0 : primera / alto,
150
+ finDelContenido: ultima < 0 ? 0 : (ultima + 1) / alto,
151
+ filas,
152
+ columnas,
153
+ };
154
+ }
155
+ const distancia = (a, b) => a.reduce((s, v, i) => s + Math.abs(v - b[i]), 0) / a.length;
156
+ /** Franjas consecutivas que difieren, juntadas en un rango: «franjas 5–10 (40–100 % del alto)». */
157
+ function rangos(dif, total) {
158
+ const salida = [];
159
+ let abierto;
160
+ dif.forEach((d, k) => {
161
+ if (Math.abs(d) >= DIFERENCIA_QUE_SE_SEÑALA) {
162
+ if (abierto !== undefined && abierto.hasta === k)
163
+ abierto.hasta = k + 1;
164
+ else {
165
+ abierto = { desde: k, hasta: k + 1 };
166
+ salida.push(abierto);
167
+ }
168
+ }
169
+ });
170
+ return salida.map((r) => ({ desde: r.desde / total, hasta: r.hasta / total }));
171
+ }
172
+ function describirRangos(nombre, ref, cap) {
173
+ const dif = cap.map((c, k) => c - ref[k]);
174
+ return rangos(dif, ref.length).map((r) => {
175
+ const a = Math.floor(r.desde * ref.length);
176
+ const b = Math.ceil(r.hasta * ref.length);
177
+ const media = (v) => v.slice(a, b).reduce((s, x) => s + x, 0) / Math.max(b - a, 1);
178
+ const donde = `entre el ${pct(r.desde)} y el ${pct(r.hasta)} del ${nombre}`;
179
+ const r0 = media(ref);
180
+ const c0 = media(cap);
181
+ // «Casi nada» solo si de verdad lo es: un 45 % frente a un 89 % es la MITAD, no nada.
182
+ if (c0 < r0) {
183
+ return c0 < r0 * 0.25
184
+ ? `${donde} la referencia tiene contenido (${pct(r0)} de ocupación) y la captura casi nada (${pct(c0)})`
185
+ : `${donde} la captura tiene bastante menos contenido (${pct(c0)}) que la referencia (${pct(r0)})`;
186
+ }
187
+ return `${donde} la captura tiene mucho más contenido (${pct(c0)}) que la referencia (${pct(r0)})`;
188
+ });
189
+ }
190
+ /** Compara dos pantallas ya medidas. Puro: los números salen de `medirPantalla`. */
191
+ export function compararMedidas(referencia, captura) {
192
+ const dv = distancia(referencia.filas, captura.filas);
193
+ const dh = distancia(referencia.columnas, captura.columnas);
194
+ const hallazgos = [];
195
+ const finRef = referencia.finDelContenido;
196
+ const finCap = captura.finDelContenido;
197
+ if (finRef - finCap > 0.15) {
198
+ hallazgos.push(`El contenido de la captura acaba al ${pct(finCap)} del alto útil y el de la referencia al ${pct(finRef)}: ` +
199
+ `queda una banda vacía de un ${pct(finRef - finCap)} debajo`);
200
+ }
201
+ else if (finCap - finRef > 0.15) {
202
+ hallazgos.push(`El contenido de la captura llega al ${pct(finCap)} del alto útil y el de la referencia solo al ${pct(finRef)}`);
203
+ }
204
+ const inicioRef = referencia.inicioDelContenido;
205
+ const inicioCap = captura.inicioDelContenido;
206
+ if (Math.abs(inicioRef - inicioCap) > 0.1) {
207
+ hallazgos.push(`El contenido de la captura empieza al ${pct(inicioCap)} del alto útil y el de la referencia al ${pct(inicioRef)}`);
208
+ }
209
+ hallazgos.push(...describirRangos("alto", referencia.filas, captura.filas));
210
+ hallazgos.push(...describirRangos("ancho", referencia.columnas, captura.columnas));
211
+ const parecida = dv <= DISTANCIA_PARECIDA && dh <= DISTANCIA_PARECIDA && hallazgos.length === 0;
212
+ return {
213
+ referencia,
214
+ captura,
215
+ distanciaVertical: dv,
216
+ distanciaHorizontal: dh,
217
+ hallazgos,
218
+ veredicto: parecida ? "parecida" : "distinta",
219
+ };
220
+ }
221
+ /** Medir las dos y compararlas. */
222
+ export function compararPantallas(referencia, captura) {
223
+ return compararMedidas(medirPantalla(referencia), medirPantalla(captura));
224
+ }
225
+ /**
226
+ * El informe en texto, que es lo que lee el modelo. **Termina diciendo lo que esto NO mide**: un
227
+ * «parecida» de aquí es «la estructura coincide», y se leería como «se ve bien» si no se dijera.
228
+ */
229
+ export function informeDeComparacion(c) {
230
+ const filas = (m) => m.filas.map((f) => String(Math.round(f * 100)).padStart(3)).join("");
231
+ const lineas = [
232
+ `Estructura ${c.veredicto === "parecida" ? "PARECIDA" : "DISTINTA"} (distancia vertical ${pct(c.distanciaVertical)}, horizontal ${pct(c.distanciaHorizontal)}; se da por parecida bajo ${pct(DISTANCIA_PARECIDA)}).`,
233
+ `Ocupación por franjas del alto, de arriba abajo (%):`,
234
+ ` referencia:${filas(c.referencia)}`,
235
+ ` captura: ${filas(c.captura)}`,
236
+ ];
237
+ if (c.hallazgos.length > 0) {
238
+ lineas.push("Diferencias que se señalan:", ...c.hallazgos.map((h) => ` - ${h}`));
239
+ }
240
+ else {
241
+ lineas.push("Ninguna franja difiere más de lo tolerado.");
242
+ }
243
+ lineas.push("OJO, esto mide DÓNDE hay contenido y no CÓMO es: no ve texto cortado, ni el estilo de las formas (píldoras o rectángulos), " +
244
+ "ni colores, ni cuenta teclas. Para eso está xone_critica_visual, pasándole esta misma referencia.");
245
+ return lineas;
246
+ }
247
+ /** Fracción de píxeles de la zona que tienen que diferir para dar la zona por CAMBIADA. */
248
+ export const UMBRAL_DE_CAMBIO = 0.003;
249
+ const IMAGEN_ENTERA = { x: 0, y: 0, ancho: 1, alto: 1 };
250
+ /** Por qué una zona no vale, o `undefined`. */
251
+ export function motivoDeRegionInaceptable(r) {
252
+ const finitos = [r.x, r.y, r.ancho, r.alto].every((n) => Number.isFinite(n));
253
+ if (!finitos || r.x < 0 || r.y < 0 || r.ancho <= 0 || r.alto <= 0 || r.x + r.ancho > 1.0001 || r.y + r.alto > 1.0001) {
254
+ return "la zona va en fracciones de la imagen (0 a 1): x e y de la esquina y su ancho y su alto, sin salirse";
255
+ }
256
+ return undefined;
257
+ }
258
+ /**
259
+ * Cuánto cambió una zona entre dos capturas. **Lanza** si no son comparables: las dos tienen que ser
260
+ * del MISMO tamaño (dos capturas del mismo aparato); comparar tamaños distintos es la pregunta de
261
+ * `compararPantallas`, no ésta.
262
+ *
263
+ * Es lo que un agente escribía a mano cada pasada (46 scripts de Python con PIL y 31 `md5`): un
264
+ * `md5` igual solo dice que TODA la imagen es igual, no si cambió lo que importaba, y uno distinto
265
+ * puede ser solo un cursor parpadeando.
266
+ */
267
+ export function medirCambio(antes, despues, region = IMAGEN_ENTERA) {
268
+ if (antes.ancho !== despues.ancho || antes.alto !== despues.alto) {
269
+ throw new Error(`las dos capturas no tienen el mismo tamaño (${antes.ancho}×${antes.alto} frente a ${despues.ancho}×${despues.alto})`);
270
+ }
271
+ const motivo = motivoDeRegionInaceptable(region);
272
+ if (motivo !== undefined)
273
+ throw new Error(motivo);
274
+ if (antes.datos.length < antes.ancho * antes.alto * 4 || despues.datos.length < despues.ancho * despues.alto * 4) {
275
+ throw new Error("una de las imágenes está incompleta");
276
+ }
277
+ const x0 = Math.floor(region.x * antes.ancho);
278
+ const y0 = Math.floor(region.y * antes.alto);
279
+ const x1 = Math.min(antes.ancho, Math.ceil((region.x + region.ancho) * antes.ancho));
280
+ const y1 = Math.min(antes.alto, Math.ceil((region.y + region.alto) * antes.alto));
281
+ let cambiados = 0;
282
+ let minX = Infinity, minY = Infinity, maxX = -1, maxY = -1;
283
+ for (let y = y0; y < y1; y++) {
284
+ for (let x = x0; x < x1; x++) {
285
+ const i = (y * antes.ancho + x) * 4;
286
+ const d = Math.abs(antes.datos[i] - despues.datos[i]) +
287
+ Math.abs(antes.datos[i + 1] - despues.datos[i + 1]) +
288
+ Math.abs(antes.datos[i + 2] - despues.datos[i + 2]);
289
+ if (d > UMBRAL_DE_CONTENIDO) {
290
+ cambiados++;
291
+ if (x < minX)
292
+ minX = x;
293
+ if (x > maxX)
294
+ maxX = x;
295
+ if (y < minY)
296
+ minY = y;
297
+ if (y > maxY)
298
+ maxY = y;
299
+ }
300
+ }
301
+ }
302
+ const total = Math.max((x1 - x0) * (y1 - y0), 1);
303
+ const fraccion = cambiados / total;
304
+ const cambio = fraccion >= UMBRAL_DE_CAMBIO;
305
+ return {
306
+ region,
307
+ cambiados: fraccion,
308
+ ...(cambio
309
+ ? {
310
+ cajaDelCambio: {
311
+ x: minX / antes.ancho,
312
+ y: minY / antes.alto,
313
+ ancho: (maxX - minX + 1) / antes.ancho,
314
+ alto: (maxY - minY + 1) / antes.alto,
315
+ },
316
+ }
317
+ : {}),
318
+ veredicto: cambio ? "cambio" : "igual",
319
+ };
320
+ }
321
+ const pct1 = (n) => `${(n * 100).toFixed(n < 0.1 ? 1 : 0)} %`;
322
+ /** El informe en texto. En «igual» dice las DOS explicaciones posibles, para que no se elija una sin mirar. */
323
+ export function informeDeCambio(c) {
324
+ const zona = `zona x ${pct1(c.region.x)}, y ${pct1(c.region.y)}, ${pct1(c.region.ancho)} de ancho por ${pct1(c.region.alto)} de alto`;
325
+ if (c.veredicto === "cambio" && c.cajaDelCambio !== undefined) {
326
+ const b = c.cajaDelCambio;
327
+ return [
328
+ `CAMBIÓ: el ${pct1(c.cambiados)} de los píxeles de la ${zona} son distintos.`,
329
+ `Lo que cambió cabe en x ${pct1(b.x)}, y ${pct1(b.y)}, ${pct1(b.ancho)} de ancho por ${pct1(b.alto)} de alto.`,
330
+ ];
331
+ }
332
+ return [
333
+ `IGUAL: solo el ${pct1(c.cambiados)} de los píxeles de la ${zona} difieren, bajo el ${pct1(UMBRAL_DE_CAMBIO)} que se da por un cambio.`,
334
+ "Si esperabas un cambio hay DOS explicaciones y no se distinguen con estas dos capturas: que la app no repinta,",
335
+ "o que la segunda captura se tomó antes del repintado (que es asíncrono). Toma otra unos 500 ms después y vuelve a medir;",
336
+ "si sigue igual, es que no se repinta. No la des por «cacheada» sin haberlo hecho.",
337
+ ];
338
+ }
339
+ //# sourceMappingURL=compararCapturas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compararCapturas.js","sourceRoot":"","sources":["../../src/core/compararCapturas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fallos.js","sourceRoot":"","sources":["../../src/core/fallos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fallos.js","sourceRoot":"","sources":["../../src/core/fallos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Fondos SVG para frames y botones: degradados, sombras y resplandores (IXCODE-18).
3
+ *
4
+ * XOne no tiene degradados ni desenfoques propios, y el `imgbk` acepta SVG. Es la parte PURA:
5
+ * una plantilla por tipo, sin red ni puerto. Lo que vuelve es texto que `write_file` escribe.
6
+ *
7
+ * ## Por qué un generador y no un SVG tecleado por el modelo
8
+ *
9
+ * Un degradado son ids, `url(#…)`, offsets y coordenadas, y un error ahí no da error: XOne
10
+ * ignora en silencio lo que no entiende y el fondo simplemente no se ve. Una plantilla no se
11
+ * equivoca en eso, y valida los colores antes de escribir nada.
12
+ *
13
+ * ## Lo que se midió en un emulador Android (`docs/DECISIONES.md`, «Fondos SVG en XOne»)
14
+ *
15
+ * - `linearGradient`, `radialGradient` y `stop-opacity` SE PINTAN. Los FILTROS (`feGaussianBlur`,
16
+ * `feDropShadow`) SE IGNORAN: por eso aquí no hay ni un `<filter>`. La sombra son rectángulos
17
+ * apilados de opacidad baja, y el resplandor un degradado que acaba transparente.
18
+ * - `border-corner-radius` NO recorta el `imgbk`: **la esquina se DIBUJA en el SVG**.
19
+ * - Con `preserveAspectRatio="none"` y una proporción distinta a la del control, la esquina sale
20
+ * achatada; con el `viewBox` de la MISMA proporción sale limpia. Por eso se pide el ancho y el
21
+ * alto del control, y el `viewBox` los lleva.
22
+ *
23
+ * Sin `preserveAspectRatio`, XOne ya estira el SVG hasta llenar el control (medido: uno 1:1 en un
24
+ * frame ancho se deformó a elipse, sin bandas). Se escribe `none` igualmente: es lo que se mide
25
+ * hoy y no depende de que otro renderizador use `meet` y deje bandas vacías.
26
+ *
27
+ * ## Todo va RELATIVO al alto
28
+ *
29
+ * El `viewBox` mide 100 de alto y `ancho/alto·100` de ancho, y el radio, el margen y la sombra
30
+ * están en esa escala. Así solo importa la PROPORCIÓN del control, no sus píxeles: el mismo SVG
31
+ * vale en cualquier densidad mientras la relación ancho/alto se mantenga.
32
+ */
33
+ /**
34
+ * ## Los colores llegan COMO EN XONE, y se convierten
35
+ *
36
+ * XOne escribe un color `#RRGGBB` o `#AARRGGBB` —el alfa PRIMERO, como Android (la documentación:
37
+ * `fillcolor: "#7F00FF00"`, «ARGB: semi-transparente»)—. SVG y CSS de HTML lo esperan al final,
38
+ * `#RRGGBBAA`. Copiar un `#7F00FF00` tal cual a un SVG lo leería como rojo 7F, azul FF y alfa 0:
39
+ * transparente y del color equivocado, sin un solo error. Por eso la tool acepta la forma de XOne
40
+ * y aquí se separa en `#RRGGBB` + opacidad (`stop-opacity`/`fill-opacity`), que es lo que SVG
41
+ * entiende en cualquier renderizador.
42
+ */
43
+ export const NOMBRE_GENERAR_FONDO = "generar_fondo_svg";
44
+ /**
45
+ * Las medidas de un control se declaran en XOne mezclando unidades (`width="90%" height="60p"`),
46
+ * y la tool las acepta así. **Es una ESTIMACIÓN**, sobre el aparato donde se midió: un ancho de
47
+ * pantalla de 1080 px y 1,144 px por `p` (`90%`×`90p` salieron 972×103 en el árbol de controles).
48
+ * En otro dispositivo el `%` sigue a la pantalla y la `p` a la densidad, así que la proporción
49
+ * cambia; la respuesta de la tool lo dice.
50
+ */
51
+ export const ANCHO_DE_PANTALLA_DE_REFERENCIA = 1080;
52
+ export const PIXELES_POR_P = 1.144;
53
+ /** De `90%`, `60p`, `120px` o `120` a píxeles de referencia. `%` solo en el ancho. */
54
+ export function medidaEnPixeles(valor, eje) {
55
+ if (typeof valor === "number") {
56
+ return Number.isFinite(valor) && valor > 0 ? { px: valor } : { motivo: `el ${eje} tiene que ser positivo` };
57
+ }
58
+ const m = /^\s*(\d+(?:[.,]\d+)?)\s*(%|p|px)?\s*$/.exec(valor);
59
+ if (m === null)
60
+ return { motivo: `«${valor}» no es una medida: \`90%\`, \`60p\`, \`120px\` o un número` };
61
+ const n = Number(m[1].replace(",", "."));
62
+ if (!(n > 0))
63
+ return { motivo: `el ${eje} tiene que ser positivo` };
64
+ if (m[2] === "%") {
65
+ return eje === "ancho"
66
+ ? { px: (n / 100) * ANCHO_DE_PANTALLA_DE_REFERENCIA }
67
+ : { motivo: "el alto en % depende del contenedor y no se puede estimar: dalo en `p` o en píxeles" };
68
+ }
69
+ return { px: m[2] === "p" ? n * PIXELES_POR_P : n };
70
+ }
71
+ export const TIPOS_DE_FONDO = ["degradado-lineal", "degradado-radial", "sombra", "glow"];
72
+ /** Proporción ancho/alto aceptada: fuera de ella la tarjeta de la sombra no cabe o no es un botón. */
73
+ export const PROPORCION_MINIMA = 0.5;
74
+ export const PROPORCION_MAXIMA = 40;
75
+ const ALTO = 100;
76
+ const PORCENTAJE_DE_RADIO_POR_OMISION = 25;
77
+ /** Margen a cada lado de la tarjeta de la sombra: cabe la difusión (`DIFUSION`) sin salirse. */
78
+ const MARGEN_DE_SOMBRA = 14;
79
+ const DIFUSION_DE_SOMBRA = 12;
80
+ const CAPAS_DE_SOMBRA = 7;
81
+ const DESPLAZAMIENTO_DE_SOMBRA = 5;
82
+ const INTENSIDAD_DE_SOMBRA = { suave: 0.03, media: 0.05, fuerte: 0.08 };
83
+ export const INTENSIDADES = Object.keys(INTENSIDAD_DE_SOMBRA);
84
+ const COLOR_DE_XONE = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
85
+ /** Por qué no vale como color de XOne, o `undefined`. Vale `#RGB`, `#RRGGBB` y `#AARRGGBB`. */
86
+ export function motivoDeColorDeXoneInaceptable(color) {
87
+ return COLOR_DE_XONE.test(color)
88
+ ? undefined
89
+ : `«${color}» no vale: el color va como en XOne, #RRGGBB o #AARRGGBB (alfa primero). Un nombre CSS o currentColor no se usan`;
90
+ }
91
+ /**
92
+ * De un color de XOne al de SVG. **`#AARRGGBB` de XOne → `#RRGGBB` + opacidad**: el alfa es el
93
+ * PRIMER byte, no el último como en el `#RRGGBBAA` de HTML.
94
+ */
95
+ export function colorDeXoneASvg(color) {
96
+ const h = color.slice(1);
97
+ if (h.length === 3)
98
+ return { hex: `#${[...h].map((c) => c + c).join("")}`, opacidad: 1 };
99
+ if (h.length === 8)
100
+ return { hex: `#${h.slice(2)}`, opacidad: Number((parseInt(h.slice(0, 2), 16) / 255).toFixed(2)) };
101
+ return { hex: `#${h}`, opacidad: 1 };
102
+ }
103
+ /** Un nombre de fichero sin ruta ni punto: el fichero será `bg_<nombre>.svg`. */
104
+ export function motivoDeNombreDeFondoInaceptable(nombre) {
105
+ return /^[a-z][a-z0-9_]{0,39}$/.test(nombre)
106
+ ? undefined
107
+ : `«${nombre}» no vale como nombre: minúsculas, dígitos y guion bajo, empezando por letra (menú_inicio no; menu_inicio sí)`;
108
+ }
109
+ export function nombreDeFicheroDeFondo(nombre) {
110
+ return `bg_${nombre}.svg`;
111
+ }
112
+ export function rutaDeFondo(nombre) {
113
+ return `/icons/${nombreDeFicheroDeFondo(nombre)}`;
114
+ }
115
+ /** Por qué la petición no vale, o `undefined`. Las cosas que la plantilla no sabría dibujar. */
116
+ export function motivoDePeticionInaceptable(p) {
117
+ if (!Number.isFinite(p.ancho) || !Number.isFinite(p.alto) || p.ancho <= 0 || p.alto <= 0) {
118
+ return "ancho y alto son los del control y tienen que ser positivos";
119
+ }
120
+ const proporcion = p.ancho / p.alto;
121
+ if (proporcion < PROPORCION_MINIMA || proporcion > PROPORCION_MAXIMA) {
122
+ return `la proporción ancho/alto (${redondear(proporcion)}) queda fuera de ${PROPORCION_MINIMA}–${PROPORCION_MAXIMA}`;
123
+ }
124
+ const [minimo, maximo] = p.tipo === "degradado-lineal" || p.tipo === "degradado-radial" ? [2, 4] : [1, 1];
125
+ if (p.colores.length < minimo || p.colores.length > maximo) {
126
+ return minimo === maximo
127
+ ? `«${p.tipo}» lleva exactamente ${minimo} color en \`colores\``
128
+ : `«${p.tipo}» lleva de ${minimo} a ${maximo} colores`;
129
+ }
130
+ for (const c of [...p.colores, ...(p.fondo === undefined ? [] : [p.fondo])]) {
131
+ const motivo = motivoDeColorDeXoneInaceptable(c);
132
+ if (motivo !== undefined)
133
+ return motivo;
134
+ }
135
+ if (p.radio !== undefined && (!Number.isFinite(p.radio) || p.radio < 0 || p.radio > 50)) {
136
+ return "`radio` es un porcentaje del alto entre 0 y 50";
137
+ }
138
+ if (p.angulo !== undefined && !Number.isFinite(p.angulo))
139
+ return "`angulo` tiene que ser un número";
140
+ return undefined;
141
+ }
142
+ function redondear(n) {
143
+ return Number(n.toFixed(2));
144
+ }
145
+ const num = (n) => String(redondear(n));
146
+ function paradas(colores, opacidades) {
147
+ const ultimo = Math.max(colores.length - 1, 1);
148
+ return colores
149
+ .map((c, i) => {
150
+ const op = redondear((opacidades?.[i] ?? 1) * c.opacidad);
151
+ return `<stop offset="${num((i / ultimo) * 100)}%" stop-color="${c.hex}"${op < 1 ? ` stop-opacity="${op}"` : ""}/>`;
152
+ })
153
+ .join("");
154
+ }
155
+ const relleno = (c) => `fill="${c.hex}"${c.opacidad < 1 ? ` fill-opacity="${c.opacidad}"` : ""}`;
156
+ const envolver = (ancho, dentro) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${num(ancho)} ${ALTO}" preserveAspectRatio="none">${dentro}</svg>`;
157
+ /**
158
+ * El SVG de la petición. **Lanza si no es válida**: quien lo llama comprueba antes con
159
+ * `motivoDePeticionInaceptable` y devuelve el motivo como texto (la tool no lanza).
160
+ */
161
+ export function generarFondo(p) {
162
+ const motivo = motivoDePeticionInaceptable(p);
163
+ if (motivo !== undefined)
164
+ throw new Error(motivo);
165
+ const W = redondear((p.ancho / p.alto) * ALTO);
166
+ const H = ALTO;
167
+ const colores = p.colores.map(colorDeXoneASvg);
168
+ const r = Math.min(p.radio ?? PORCENTAJE_DE_RADIO_POR_OMISION, 50);
169
+ const esquina = r > 0 ? ` rx="${num(r)}" ry="${num(r)}"` : "";
170
+ if (p.tipo === "degradado-lineal") {
171
+ // Los extremos van de borde a borde del rectángulo a lo largo del ángulo (como el `linear-
172
+ // gradient` de CSS) y en coordenadas ABSOLUTAS: en un rectángulo que no es cuadrado, el ángulo
173
+ // en coordenadas relativas al objeto se tuerce.
174
+ const a = ((p.angulo ?? 90) * Math.PI) / 180;
175
+ const dx = Math.cos(a);
176
+ const dy = Math.sin(a);
177
+ const largo = Math.abs((W / 2) * dx) + Math.abs((H / 2) * dy);
178
+ const x1 = W / 2 - dx * largo;
179
+ const y1 = H / 2 - dy * largo;
180
+ const x2 = W / 2 + dx * largo;
181
+ const y2 = H / 2 + dy * largo;
182
+ return {
183
+ anchoDelViewBox: W,
184
+ svg: envolver(W, `<defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="${num(x1)}" y1="${num(y1)}" x2="${num(x2)}" y2="${num(y2)}">${paradas(colores)}</linearGradient></defs>` +
185
+ `<rect width="${num(W)}" height="${H}"${esquina} fill="url(#g)"/>`),
186
+ };
187
+ }
188
+ if (p.tipo === "degradado-radial") {
189
+ // Circular, no estirado: el radio llega al borde del lado MÁS LARGO.
190
+ return {
191
+ anchoDelViewBox: W,
192
+ svg: envolver(W, `<defs><radialGradient id="g" gradientUnits="userSpaceOnUse" cx="${num(W / 2)}" cy="${num(H / 2)}" r="${num(Math.max(W, H) / 2)}">${paradas(colores)}</radialGradient></defs>` +
193
+ `<rect width="${num(W)}" height="${H}"${esquina} fill="url(#g)"/>`),
194
+ };
195
+ }
196
+ if (p.tipo === "sombra") {
197
+ // Sin filtros —se ignoran—: rectángulos apilados, cada vez más grandes y más transparentes.
198
+ // La tarjeta es más pequeña que el control para que la difusión quepa dentro de su caja.
199
+ const opacidad = INTENSIDAD_DE_SOMBRA[p.intensidad ?? "media"];
200
+ const cx = MARGEN_DE_SOMBRA;
201
+ const cy = 8;
202
+ const cw = W - 2 * MARGEN_DE_SOMBRA;
203
+ const ch = H - cy - MARGEN_DE_SOMBRA - DESPLAZAMIENTO_DE_SOMBRA - DIFUSION_DE_SOMBRA + 4;
204
+ let capas = "";
205
+ for (let i = CAPAS_DE_SOMBRA; i >= 1; i--) {
206
+ const s = (i / CAPAS_DE_SOMBRA) * DIFUSION_DE_SOMBRA;
207
+ capas += `<rect x="${num(cx - s)}" y="${num(cy + DESPLAZAMIENTO_DE_SOMBRA - s)}" width="${num(cw + 2 * s)}" height="${num(ch + 2 * s)}" rx="${num(r + s)}" ry="${num(r + s)}" fill="#000000" fill-opacity="${opacidad}"/>`;
208
+ }
209
+ return {
210
+ anchoDelViewBox: W,
211
+ svg: envolver(W, `${capas}<rect x="${num(cx)}" y="${num(cy)}" width="${num(cw)}" height="${num(ch)}" rx="${num(r)}" ry="${num(r)}" ${relleno(colores[0])}/>`),
212
+ };
213
+ }
214
+ // glow: una elipse que llena la caja, con un degradado que acaba transparente.
215
+ const luz = colores[0];
216
+ const detras = p.fondo === undefined ? "" : `<rect width="${num(W)}" height="${H}"${esquina} ${relleno(colorDeXoneASvg(p.fondo))}/>`;
217
+ return {
218
+ anchoDelViewBox: W,
219
+ svg: envolver(W, `<defs><radialGradient id="g" cx="50%" cy="50%" r="50%">${paradas([luz, luz], [0.9, 0])}</radialGradient></defs>` +
220
+ `${detras}<ellipse cx="${num(W / 2)}" cy="${num(H / 2)}" rx="${num(W / 2)}" ry="${num(H / 2)}" fill="url(#g)"/>`),
221
+ };
222
+ }
223
+ //# sourceMappingURL=fondosSvg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fondosSvg.js","sourceRoot":"","sources":["../../src/core/fondosSvg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAEnC,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,KAAsB,EAAE,GAAqB;IAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAC9G,CAAC;IACD,MAAM,CAAC,GAAG,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,KAAK,6DAA6D,EAAE,CAAC;IAC1G,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAAC;IACpE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,OAAO,GAAG,KAAK,OAAO;YACpB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,+BAA+B,EAAE;YACrD,CAAC,CAAC,EAAE,MAAM,EAAE,qFAAqF,EAAE,CAAC;IACxG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAGlG,sGAAsG;AACtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAC3C,gGAAgG;AAChG,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,oBAAoB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAW,CAAC;AAEjF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAyB,CAAC;AAQtF,MAAM,aAAa,GAAG,qDAAqD,CAAC;AAE5E,+FAA+F;AAC/F,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,KAAK,kHAAkH,CAAC;AAClI,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvH,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACvC,CAAC;AAyBD,iFAAiF;AACjF,MAAM,UAAU,gCAAgC,CAAC,MAAc;IAC7D,OAAO,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,MAAM,+GAA+G,CAAC;AAChI,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,MAAM,MAAM,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,UAAU,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,2BAA2B,CAAC,CAAkB;IAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QACzF,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,IAAI,UAAU,GAAG,iBAAiB,IAAI,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACrE,OAAO,6BAA6B,SAAS,CAAC,UAAU,CAAC,oBAAoB,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;IACxH,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3D,OAAO,MAAM,KAAK,MAAM;YACtB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,uBAAuB,MAAM,uBAAuB;YAChE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,cAAc,MAAM,MAAM,MAAM,UAAU,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,8BAA8B,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;QACxF,OAAO,gDAAgD,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,kCAAkC,CAAC;IACpG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,SAAS,OAAO,CAAC,OAA4B,EAAE,UAA8B;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1D,OAAO,iBAAiB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACtH,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAW,EAAU,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAEnH,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,MAAc,EAAU,EAAE,CACzD,wDAAwD,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,gCAAgC,MAAM,QAAQ,CAAC;AAE3H;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,CAAkB;IAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,+BAA+B,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAClC,2FAA2F;QAC3F,+FAA+F;QAC/F,gDAAgD;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B,OAAO;YACL,eAAe,EAAE,CAAC;YAClB,GAAG,EAAE,QAAQ,CACX,CAAC,EACD,mEAAmE,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,0BAA0B;gBACvK,gBAAgB,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,OAAO,mBAAmB,CACrE;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAClC,qEAAqE;QACrE,OAAO;YACL,eAAe,EAAE,CAAC;YAClB,GAAG,EAAE,QAAQ,CACX,CAAC,EACD,mEAAmE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,0BAA0B;gBAC5K,gBAAgB,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,OAAO,mBAAmB,CACrE;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxB,4FAA4F;QAC5F,yFAAyF;QACzF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC;QAC/D,MAAM,EAAE,GAAG,gBAAgB,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,CAAC,CAAC;QACzF,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,kBAAkB,CAAC;YACrD,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,wBAAwB,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,kCAAkC,QAAQ,KAAK,CAAC;QAC7N,CAAC;QACD,OAAO;YACL,eAAe,EAAE,CAAC;YAClB,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;SAC/J,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;IACrI,OAAO;QACL,eAAe,EAAE,CAAC;QAClB,GAAG,EAAE,QAAQ,CACX,CAAC,EACD,0DAA0D,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,0BAA0B;YAC/G,GAAG,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,oBAAoB,CACnH;KACF,CAAC;AACJ,CAAC"}