dmencu 3.2.21 → 3.4.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/README.md +42 -42
- package/ayuda/asignacion.md +16 -0
- package/ayuda/circuito-encuesta.md +27 -0
- package/ayuda/control.md +13 -0
- package/ayuda/dm-cambiar-modo.md +16 -0
- package/ayuda/dm-relevamiento.md +20 -0
- package/ayuda/dm-sincronizar.md +18 -0
- package/ayuda/fin-de-campo.md +14 -0
- package/ayuda/metadatos.md +14 -0
- package/ayuda/procesar.md +13 -0
- package/ayuda/recepcion.md +20 -0
- package/ayuda/supervision.md +9 -0
- package/ayuda/usuarios.md +12 -0
- package/ayuda/varios.md +23 -0
- package/dist/client/client/client.js +101 -4
- package/dist/client/client/css/menu.styl +29 -0
- package/dist/client/unlogged/abrir-formulario.js +1 -1
- package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
- package/dist/client/unlogged/bypass-formulario.js +84 -219
- package/dist/client/unlogged/calculos-encuesta.js +112 -38
- package/dist/client/unlogged/css/formulario-react.styl +9 -0
- package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
- package/dist/client/unlogged/helpers-casilleros.js +12 -18
- package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/client/unlogged/helpers-formulario.js +88 -0
- package/dist/client/unlogged/redux-formulario.d.ts +1 -2
- package/dist/client/unlogged/redux-formulario.js +21 -31
- package/dist/client/unlogged/render-config.d.ts +5 -1
- package/dist/client/unlogged/render-config.js +14 -1
- package/dist/client/unlogged/render-formulario.d.ts +3 -6
- package/dist/client/unlogged/render-formulario.js +71 -69
- package/dist/client/unlogged/render-formulario.tsx +100 -57
- package/dist/client/unlogged/render-general.d.ts +2 -0
- package/dist/client/unlogged/render-general.js +2 -1
- package/dist/client/unlogged/render-general.tsx +2 -1
- package/dist/client/unlogged/render-init.d.ts +1 -0
- package/dist/client/unlogged/render-init.js +9 -2
- package/dist/client/unlogged/tipos.d.ts +93 -41
- package/dist/client/unlogged/tipos.js +1 -1
- package/dist/server/app-dmencu.d.ts +1435 -0
- package/dist/server/app-dmencu.js +1091 -0
- package/dist/server/ayuda.d.ts +19 -0
- package/dist/server/ayuda.js +224 -0
- package/dist/server/def-config.d.ts +1 -0
- package/dist/server/def-config.js +123 -0
- package/dist/server/procedures-dmencu.d.ts +43 -0
- package/dist/server/procedures-dmencu.js +2313 -0
- package/dist/server/server/app-dmencu.d.ts +49 -91
- package/dist/server/server/app-dmencu.js +151 -52
- package/dist/server/server/ayuda.d.ts +19 -0
- package/dist/server/server/ayuda.js +224 -0
- package/dist/server/server/procedures-dmencu.d.ts +34 -2
- package/dist/server/server/procedures-dmencu.js +93 -51
- package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
- package/dist/server/server/setters-rea-no-rea.js +35 -0
- package/dist/server/server/table-areas.js +4 -4
- package/dist/server/server/table-areas_asignacion_general.js +2 -1
- package/dist/server/server/table-control_campo.js +4 -4
- package/dist/server/server/table-no_rea.js +4 -2
- package/dist/server/server/table-no_rea_sup.js +7 -3
- package/dist/server/server/table-personal.js +1 -1
- package/dist/server/server/table-tareas_tem.js +2 -2
- package/dist/server/server/table-tem.js +2 -2
- package/dist/server/server/types-dmencu.d.ts +53 -2
- package/dist/server/server/types-dmencu.js +2 -1
- package/dist/server/setters-rea-no-rea.d.ts +13 -0
- package/dist/server/setters-rea-no-rea.js +35 -0
- package/dist/server/table-acciones.d.ts +2 -0
- package/dist/server/table-acciones.js +45 -0
- package/dist/server/table-area_enc_proximas.d.ts +2 -0
- package/dist/server/table-area_enc_proximas.js +30 -0
- package/dist/server/table-areas.d.ts +4 -0
- package/dist/server/table-areas.js +112 -0
- package/dist/server/table-areas_asignacion_general.d.ts +2 -0
- package/dist/server/table-areas_asignacion_general.js +86 -0
- package/dist/server/table-barrios.d.ts +2 -0
- package/dist/server/table-barrios.js +35 -0
- package/dist/server/table-comunas.d.ts +2 -0
- package/dist/server/table-comunas.js +33 -0
- package/dist/server/table-control_campo.d.ts +12 -0
- package/dist/server/table-control_campo.js +119 -0
- package/dist/server/table-control_dias_carga.d.ts +2 -0
- package/dist/server/table-control_dias_carga.js +63 -0
- package/dist/server/table-control_resumen.d.ts +2 -0
- package/dist/server/table-control_resumen.js +19 -0
- package/dist/server/table-diccionario.d.ts +2 -0
- package/dist/server/table-diccionario.js +32 -0
- package/dist/server/table-dictra.d.ts +2 -0
- package/dist/server/table-dictra.js +46 -0
- package/dist/server/table-dicvar.d.ts +2 -0
- package/dist/server/table-dicvar.js +32 -0
- package/dist/server/table-encuestadores.d.ts +13 -0
- package/dist/server/table-encuestadores.js +75 -0
- package/dist/server/table-estados.d.ts +2 -0
- package/dist/server/table-estados.js +47 -0
- package/dist/server/table-estados_acciones.d.ts +2 -0
- package/dist/server/table-estados_acciones.js +40 -0
- package/dist/server/table-fracciones.d.ts +2 -0
- package/dist/server/table-fracciones.js +37 -0
- package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
- package/dist/server/table-grilla_hoja_ruta.js +93 -0
- package/dist/server/table-historial_tem.d.ts +2 -0
- package/dist/server/table-historial_tem.js +57 -0
- package/dist/server/table-hogares.d.ts +2 -0
- package/dist/server/table-hogares.js +156 -0
- package/dist/server/table-hogares_sup.d.ts +2 -0
- package/dist/server/table-hogares_sup.js +191 -0
- package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
- package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
- package/dist/server/table-manzanas.d.ts +2 -0
- package/dist/server/table-manzanas.js +36 -0
- package/dist/server/table-mis_encuestadores.d.ts +2 -0
- package/dist/server/table-mis_encuestadores.js +77 -0
- package/dist/server/table-mis_tareas.d.ts +2 -0
- package/dist/server/table-mis_tareas.js +18 -0
- package/dist/server/table-mis_tareas_areas.d.ts +2 -0
- package/dist/server/table-mis_tareas_areas.js +20 -0
- package/dist/server/table-modos_dm.d.ts +2 -0
- package/dist/server/table-modos_dm.js +28 -0
- package/dist/server/table-no_rea.js +38 -0
- package/dist/server/table-no_rea_sup.js +36 -0
- package/dist/server/table-operaciones.d.ts +2 -0
- package/dist/server/table-operaciones.js +30 -0
- package/dist/server/table-parametros.d.ts +2 -0
- package/dist/server/table-parametros.js +40 -0
- package/dist/server/table-permisos.d.ts +2 -0
- package/dist/server/table-permisos.js +31 -0
- package/dist/server/table-personal.d.ts +5 -0
- package/dist/server/table-personal.js +62 -0
- package/dist/server/table-personal_rol.d.ts +2 -0
- package/dist/server/table-personal_rol.js +42 -0
- package/dist/server/table-personas.d.ts +2 -0
- package/dist/server/table-personas.js +448 -0
- package/dist/server/table-personas_sup.d.ts +2 -0
- package/dist/server/table-personas_sup.js +93 -0
- package/dist/server/table-radios.d.ts +2 -0
- package/dist/server/table-radios.js +37 -0
- package/dist/server/table-rea.d.ts +2 -0
- package/dist/server/table-rea.js +38 -0
- package/dist/server/table-rea_sup.d.ts +2 -0
- package/dist/server/table-rea_sup.js +38 -0
- package/dist/server/table-recepcionistas.d.ts +2 -0
- package/dist/server/table-recepcionistas.js +18 -0
- package/dist/server/table-recuperadores.d.ts +2 -0
- package/dist/server/table-recuperadores.js +18 -0
- package/dist/server/table-roles.d.ts +2 -0
- package/dist/server/table-roles.js +33 -0
- package/dist/server/table-roles_permisos.d.ts +2 -0
- package/dist/server/table-roles_permisos.js +36 -0
- package/dist/server/table-roles_subordinados.d.ts +2 -0
- package/dist/server/table-roles_subordinados.js +31 -0
- package/dist/server/table-semanas.d.ts +2 -0
- package/dist/server/table-semanas.js +42 -0
- package/dist/server/table-sincronizaciones.d.ts +2 -0
- package/dist/server/table-sincronizaciones.js +30 -0
- package/dist/server/table-supervisores.d.ts +2 -0
- package/dist/server/table-supervisores.js +18 -0
- package/dist/server/table-tareas.d.ts +2 -0
- package/dist/server/table-tareas.js +48 -0
- package/dist/server/table-tareas_areas.d.ts +7 -0
- package/dist/server/table-tareas_areas.js +112 -0
- package/dist/server/table-tareas_proximas.d.ts +2 -0
- package/dist/server/table-tareas_proximas.js +48 -0
- package/dist/server/table-tareas_tem.d.ts +14 -0
- package/dist/server/table-tareas_tem.js +206 -0
- package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
- package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
- package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
- package/dist/server/table-tareas_tem_fin_campo.js +56 -0
- package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
- package/dist/server/table-tareas_tem_ingreso.js +31 -0
- package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
- package/dist/server/table-tareas_tem_procesamiento.js +34 -0
- package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
- package/dist/server/table-tareas_tem_recepcion.js +59 -0
- package/dist/server/table-tem.d.ts +3 -0
- package/dist/server/table-tem.js +247 -0
- package/dist/server/table-tem_asignacion.d.ts +2 -0
- package/dist/server/table-tem_asignacion.js +50 -0
- package/dist/server/table-tem_borradas.d.ts +2 -0
- package/dist/server/table-tem_borradas.js +35 -0
- package/dist/server/table-usuarios.d.ts +2 -0
- package/dist/server/table-usuarios.js +63 -0
- package/dist/server/table-visitas.d.ts +2 -0
- package/dist/server/table-visitas.js +91 -0
- package/dist/server/table-visitas_sup.d.ts +2 -0
- package/dist/server/table-visitas_sup.js +91 -0
- package/dist/server/table-viviendas.d.ts +2 -0
- package/dist/server/table-viviendas.js +299 -0
- package/dist/server/types-dmencu.d.ts +114 -0
- package/dist/server/types-dmencu.js +34 -0
- package/dist/server/unlogged/tipos.d.ts +93 -41
- package/dist/server/unlogged/tipos.js +1 -1
- package/dist/test/app-para-tests.d.ts +1117 -0
- package/dist/test/app-para-tests.js +95 -0
- package/dist/test/test-ayuda.d.ts +1 -0
- package/dist/test/test-ayuda.js +183 -0
- package/dist/test/test-caches-rea.d.ts +1 -0
- package/dist/test/test-caches-rea.js +243 -0
- package/dist/test/test-helpers-casilleros.d.ts +1 -0
- package/dist/test/test-helpers-casilleros.js +154 -0
- package/dist/test/test-helpers-formulario.d.ts +1 -0
- package/dist/test/test-helpers-formulario.js +95 -0
- package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
- package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
- package/dist/test/test-menu-segun-rol.d.ts +1 -0
- package/dist/test/test-menu-segun-rol.js +170 -0
- package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
- package/dist/test/test-setters-rea-no-rea.js +95 -0
- package/dist/test/test.d.ts +7 -0
- package/dist/test/test.js +9 -2
- package/dist/unlogged/helpers-casilleros.d.ts +1 -1
- package/dist/unlogged/helpers-casilleros.js +12 -18
- package/dist/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/unlogged/helpers-formulario.js +88 -0
- package/dist/unlogged/tipos.d.ts +20 -2
- package/dist/unlogged/tipos.js +1 -1
- package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
- package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
- package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
- package/dist/unlogged/unlogged/css/formulario-react.styl +9 -0
- package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
- package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
- package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
- package/dist/unlogged/unlogged/redux-formulario.js +21 -31
- package/dist/unlogged/unlogged/render-config.d.ts +5 -1
- package/dist/unlogged/unlogged/render-config.js +14 -1
- package/dist/unlogged/unlogged/render-formulario.d.ts +3 -6
- package/dist/unlogged/unlogged/render-formulario.js +71 -69
- package/dist/unlogged/unlogged/render-formulario.tsx +100 -57
- package/dist/unlogged/unlogged/render-general.d.ts +2 -0
- package/dist/unlogged/unlogged/render-general.js +2 -1
- package/dist/unlogged/unlogged/render-general.tsx +2 -1
- package/dist/unlogged/unlogged/render-init.d.ts +1 -0
- package/dist/unlogged/unlogged/render-init.js +9 -2
- package/dist/unlogged/unlogged/tipos.d.ts +93 -41
- package/dist/unlogged/unlogged/tipos.js +1 -1
- package/dist/unlogged/unlogged/unlogged.js +15 -2
- package/install/accion_cumple_condicion.sql +1 -1
- package/install/generador_accion_cumple_condicion.sql +2 -2
- package/install/tarea_cumple_condicion.sql +1 -1
- package/install/xcalcular_resultado_trg.sql +1 -1
- package/package.json +24 -18
- package/dist/server/server/table-no_rea copy.js +0 -38
- package/dist/server/server/table-no_rea_sup copy.js +0 -36
- package/dist/unlogged/bypass-formulario.d.ts +0 -198
- package/dist/unlogged/bypass-formulario.js +0 -1226
- package/dist/unlogged/redux-formulario.d.ts +0 -440
- package/dist/unlogged/redux-formulario.js +0 -324
- package/dist/unlogged/render-config.d.ts +0 -52
- package/dist/unlogged/render-config.js +0 -161
- package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
- package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
- package/dist/unlogged/unlogged/helpers.d.ts +0 -14
- package/dist/unlogged/unlogged/helpers.js +0 -129
- /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
- /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
(function (factory) {
|
|
11
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
12
|
+
var v = factory(require, exports);
|
|
13
|
+
if (v !== undefined) module.exports = v;
|
|
14
|
+
}
|
|
15
|
+
else if (typeof define === "function" && define.amd) {
|
|
16
|
+
define(["require", "exports", "mocha", "node:assert", "../server/app-dmencu", "../server/procedures-dmencu", "../unlogged/helpers-casilleros", "./app-para-tests"], factory);
|
|
17
|
+
}
|
|
18
|
+
})(function (require, exports) {
|
|
19
|
+
"use strict";
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const mocha_1 = require("mocha");
|
|
22
|
+
const assert = require("node:assert");
|
|
23
|
+
const app_dmencu_1 = require("../server/app-dmencu");
|
|
24
|
+
const procedures_dmencu_1 = require("../server/procedures-dmencu");
|
|
25
|
+
const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
|
|
26
|
+
const app_para_tests_1 = require("./app-para-tests");
|
|
27
|
+
// se listan acá (y no se importa TABLAS_REA_NO_REA) para que el test falle si alguna deja de tratarse
|
|
28
|
+
const TABLAS_REA_NO_REA = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
|
|
29
|
+
// Base de datos en memoria: cada consulta se resuelve por la tabla del "from"
|
|
30
|
+
class BaseFalsa {
|
|
31
|
+
constructor(tablas) {
|
|
32
|
+
this.tablas = tablas;
|
|
33
|
+
this.consultas = [];
|
|
34
|
+
}
|
|
35
|
+
query(sql) {
|
|
36
|
+
var _a, _b, _c, _d, _e;
|
|
37
|
+
this.consultas.push(sql);
|
|
38
|
+
var tabla = (_b = (_a = /from (\w+)/.exec(sql)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
|
|
39
|
+
var filas = (_c = this.tablas[tabla]) !== null && _c !== void 0 ? _c : [];
|
|
40
|
+
if (/group by grupo0?(_sup)? /.test(sql + ' ')) {
|
|
41
|
+
var campoGrupo = (_e = (_d = /select (\w+)/.exec(sql)) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : 'grupo';
|
|
42
|
+
var alias = /as grupo,/.test(sql) ? 'grupo' : campoGrupo;
|
|
43
|
+
var grupos = {};
|
|
44
|
+
filas.forEach(fila => {
|
|
45
|
+
var grupo = String(fila[campoGrupo]);
|
|
46
|
+
grupos[grupo] = grupos[grupo] || [];
|
|
47
|
+
grupos[grupo].push(fila);
|
|
48
|
+
});
|
|
49
|
+
filas = Object.keys(grupos).sort().map(grupo => ({ [alias]: grupo, codigos: grupos[grupo] }));
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
fetchAll: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: filas.length, rows: filas, fields: [] }); }),
|
|
53
|
+
fetchUniqueRow: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: 1, row: filas[0], fields: [] }); }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const noReas = [
|
|
58
|
+
{ operativo: 'etoi211', no_rea: 1, descripcion: 'ausente', grupo: 'ausencia', variable: 'v1', valor: '7', grupo0: 'encuestable', orden: 1 },
|
|
59
|
+
{ operativo: 'etoi211', no_rea: 2, descripcion: 'rechazo', grupo: 'rechazo', variable: 'v1', valor: '8', grupo0: 'encuestable', orden: 2 },
|
|
60
|
+
{ operativo: 'eah2022', no_rea: 1, descripcion: 'deshabitada', grupo: 'no encuestable', variable: 'v1', valor: '9', grupo0: 'no encuestable', orden: 1 },
|
|
61
|
+
];
|
|
62
|
+
const noReasSup = [
|
|
63
|
+
{ operativo: 'etoi211', no_rea_sup: 71, desc_norea_sup: 'no contacto', grupo_sup: 'sin contacto', variable_sup: 's1', valor_sup: '2', grupo0_sup: 'sup', orden: 1 },
|
|
64
|
+
{ operativo: 'eah2022', no_rea_sup: 72, desc_norea_sup: 'otro', grupo_sup: 'otro', variable_sup: 's1', valor_sup: '3', grupo0_sup: 'sup', orden: 1 },
|
|
65
|
+
];
|
|
66
|
+
const reas = [
|
|
67
|
+
{ operativo: 'etoi211', rea: 1, descripcion: 'completa', condicion: 'v1 = 1 and v2 > 10', orden: 1, es_positiva: true, tarea: null },
|
|
68
|
+
{ operativo: 'etoi211', rea: 2, descripcion: 'incompleta', condicion: 'v1 = 1', orden: 2, es_positiva: false, tarea: 'encu' },
|
|
69
|
+
{ operativo: 'eah2022', rea: 1, descripcion: 'otra', condicion: 'v3 = 5', orden: 1, es_positiva: true, tarea: null },
|
|
70
|
+
];
|
|
71
|
+
const reasSup = [
|
|
72
|
+
{ operativo: 'etoi211', rea_sup: 1, descripcion: 'supervisada', condicion: 's1 = 1', orden: 1, es_positiva: true, tarea: 'supe' },
|
|
73
|
+
];
|
|
74
|
+
const operativos = [{ con_rea_hogar: true, operativo: 'etoi211', config_sorteo: null }];
|
|
75
|
+
function baseConDatos() {
|
|
76
|
+
return new BaseFalsa({ no_rea: noReas, rea: reas, no_rea_sup: noReasSup, rea_sup: reasSup, operativos });
|
|
77
|
+
}
|
|
78
|
+
// evalúa una condición compilada (condicion_js) como lo hace el dispositivo
|
|
79
|
+
function evaluar(condicionJs, valores) {
|
|
80
|
+
var funcion = new Function('valores', 'helpers', 'return ' + condicionJs);
|
|
81
|
+
return funcion(valores, helpers_casilleros_1.helpersCasilleros);
|
|
82
|
+
}
|
|
83
|
+
(0, mocha_1.describe)('dmencu - caches de rea/no rea', () => {
|
|
84
|
+
(0, mocha_1.describe)('refreshCaches', () => {
|
|
85
|
+
(0, mocha_1.it)('carga rea, no rea y sus versiones _sup', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
86
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
87
|
+
yield be.refreshCaches(baseConDatos());
|
|
88
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea, noReas);
|
|
89
|
+
assert.deepStrictEqual(be.caches.tableContent.rea, reas);
|
|
90
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_sup, noReasSup);
|
|
91
|
+
assert.deepStrictEqual(be.caches.tableContent.rea_sup, reasSup);
|
|
92
|
+
}));
|
|
93
|
+
(0, mocha_1.it)('pide a la base las listas ordenadas por operativo y orden (define la prioridad de evaluación)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
94
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
95
|
+
var base = baseConDatos();
|
|
96
|
+
yield be.refreshCaches(base);
|
|
97
|
+
for (var tabla of TABLAS_REA_NO_REA) {
|
|
98
|
+
var consulta = base.consultas.find(sql => new RegExp(`from ${tabla} order by`).test(sql));
|
|
99
|
+
assert.ok(consulta, `no se consultó ${tabla}`);
|
|
100
|
+
assert.match(consulta, new RegExp(`order by operativo, orden, ${tabla}`));
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
(0, mocha_1.it)('agrupa los no rea por grupo y por grupo0', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
104
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
105
|
+
yield be.refreshCaches(baseConDatos());
|
|
106
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_groups.map((g) => g.grupo), ['ausencia', 'no encuestable', 'rechazo']);
|
|
107
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_groups0.map((g) => g.grupo), ['encuestable', 'no encuestable']);
|
|
108
|
+
}));
|
|
109
|
+
(0, mocha_1.it)('carga la configuración del operativo actual (con_rea_hogar)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
111
|
+
yield be.refreshCaches(baseConDatos());
|
|
112
|
+
assert.deepStrictEqual(be.caches.tableContent.conReaHogar, operativos[0]);
|
|
113
|
+
}));
|
|
114
|
+
(0, mocha_1.it)('al recargar reemplaza los datos anteriores', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
116
|
+
var base = baseConDatos();
|
|
117
|
+
yield be.refreshCaches(base);
|
|
118
|
+
base.tablas.rea = [reas[0]];
|
|
119
|
+
yield be.refreshCaches(base);
|
|
120
|
+
assert.deepStrictEqual(be.caches.tableContent.rea, [reas[0]]);
|
|
121
|
+
}));
|
|
122
|
+
});
|
|
123
|
+
(0, mocha_1.describe)('refrescarEstructuraAlModificarTabla (envuelve table_record_save y table_record_delete)', () => {
|
|
124
|
+
function prepararRefrescador() {
|
|
125
|
+
var eventos = [];
|
|
126
|
+
var clientesRefrescados = [];
|
|
127
|
+
var be = {
|
|
128
|
+
caches: { timestampEstructura: 0 },
|
|
129
|
+
refreshCaches: (client) => __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
eventos.push('refrescar');
|
|
131
|
+
clientesRefrescados.push(client);
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
var llamadas = [];
|
|
135
|
+
var guardar = (_context, parameters, extra) => __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
eventos.push('guardar');
|
|
137
|
+
llamadas.push({ tabla: parameters.table, extra });
|
|
138
|
+
return { guardado: parameters.table };
|
|
139
|
+
});
|
|
140
|
+
return { be, eventos, clientesRefrescados, llamadas, guardar };
|
|
141
|
+
}
|
|
142
|
+
for (const tabla of TABLAS_REA_NO_REA) {
|
|
143
|
+
(0, mocha_1.it)(`al modificar ${tabla} recarga las caches después de guardar y cambia la estructura`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
144
|
+
var { be, eventos, clientesRefrescados, guardar } = prepararRefrescador();
|
|
145
|
+
var client = new BaseFalsa({});
|
|
146
|
+
var resultado = yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client }, { table: tabla });
|
|
147
|
+
assert.deepStrictEqual(resultado, { guardado: tabla });
|
|
148
|
+
assert.deepStrictEqual(eventos, ['guardar', 'refrescar']);
|
|
149
|
+
assert.strictEqual(clientesRefrescados[0], client, 'debe recargar con el mismo cliente (misma transacción)');
|
|
150
|
+
assert.ok(be.caches.timestampEstructura > 0);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
for (const tabla of ['casilleros', 'semanas']) {
|
|
154
|
+
(0, mocha_1.it)(`al modificar ${tabla} cambia la estructura sin recargar las caches de rea`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
155
|
+
var { be, eventos, guardar } = prepararRefrescador();
|
|
156
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: tabla });
|
|
157
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
158
|
+
assert.ok(be.caches.timestampEstructura > 0);
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
(0, mocha_1.it)('al modificar otras tablas no toca la estructura ni las caches', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
162
|
+
var { be, eventos, guardar } = prepararRefrescador();
|
|
163
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'usuarios' });
|
|
164
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
165
|
+
assert.strictEqual(be.caches.timestampEstructura, 0);
|
|
166
|
+
}));
|
|
167
|
+
(0, mocha_1.it)('si falla el guardado no recarga ni cambia la estructura', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
168
|
+
var { be, eventos } = prepararRefrescador();
|
|
169
|
+
var guardarConError = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
+
eventos.push('guardar');
|
|
171
|
+
throw new Error('error al guardar');
|
|
172
|
+
});
|
|
173
|
+
yield assert.rejects((0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardarConError)({ client: new BaseFalsa({}) }, { table: 'rea' }), /error al guardar/);
|
|
174
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
175
|
+
assert.strictEqual(be.caches.timestampEstructura, 0);
|
|
176
|
+
}));
|
|
177
|
+
(0, mocha_1.it)('pasa a la función original los argumentos extra (files/opts de table_record_save)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
178
|
+
var { be, llamadas, guardar } = prepararRefrescador();
|
|
179
|
+
var extra = { files: [] };
|
|
180
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'no_rea' }, extra);
|
|
181
|
+
assert.strictEqual(llamadas[0].extra, extra);
|
|
182
|
+
}));
|
|
183
|
+
});
|
|
184
|
+
(0, mocha_1.describe)('reasNoReasDelOperativo (rea/no rea en la estructura que recibe el dispositivo)', () => {
|
|
185
|
+
const tableContent = { no_rea: noReas, no_rea_sup: noReasSup, rea: reas, rea_sup: reasSup };
|
|
186
|
+
(0, mocha_1.it)('filtra cada lista por operativo', () => {
|
|
187
|
+
var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
|
|
188
|
+
assert.deepStrictEqual(resultado.noReas, [noReas[0], noReas[1]]);
|
|
189
|
+
assert.deepStrictEqual(resultado.noReasSup, [noReasSup[0]]);
|
|
190
|
+
assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [1, 2]);
|
|
191
|
+
assert.deepStrictEqual(resultado.reasSup.map(reaSup => reaSup.rea_sup), [1]);
|
|
192
|
+
});
|
|
193
|
+
(0, mocha_1.it)('conserva el orden de las caches (que viene ordenado por orden)', () => {
|
|
194
|
+
var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(Object.assign(Object.assign({}, tableContent), { rea: [reas[1], reas[0]] }), 'etoi211');
|
|
195
|
+
assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [2, 1]);
|
|
196
|
+
});
|
|
197
|
+
(0, mocha_1.it)('compila las condiciones de rea a js evaluable en el dispositivo', () => {
|
|
198
|
+
var [completa, incompleta] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
|
|
199
|
+
assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 11 }), true);
|
|
200
|
+
assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 5 }), false);
|
|
201
|
+
assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 1 }), true);
|
|
202
|
+
assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 2 }), false);
|
|
203
|
+
});
|
|
204
|
+
(0, mocha_1.it)('compila las condiciones de rea_sup', () => {
|
|
205
|
+
var [supervisada] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reasSup;
|
|
206
|
+
assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 1 }), true);
|
|
207
|
+
assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 2 }), false);
|
|
208
|
+
});
|
|
209
|
+
(0, mocha_1.it)('las variables sin cargar se toman como 0 (no rompen la evaluación)', () => {
|
|
210
|
+
var [completa] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
|
|
211
|
+
assert.strictEqual(evaluar(completa.condicion_js, {}), false);
|
|
212
|
+
});
|
|
213
|
+
(0, mocha_1.it)('no modifica las caches', () => {
|
|
214
|
+
var antes = JSON.stringify(tableContent);
|
|
215
|
+
(0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
|
|
216
|
+
assert.strictEqual(JSON.stringify(tableContent), antes);
|
|
217
|
+
});
|
|
218
|
+
(0, mocha_1.it)('si las caches no se cargaron devuelve listas vacías', () => {
|
|
219
|
+
assert.deepStrictEqual((0, procedures_dmencu_1.reasNoReasDelOperativo)({}, 'etoi211'), { noReas: [], noReasSup: [], reas: [], reasSup: [] });
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
(0, mocha_1.describe)('de punta a punta: modificar una rea llega a la estructura del dispositivo', () => {
|
|
223
|
+
(0, mocha_1.it)('después de guardar una rea, la estructura del operativo la incluye compilada', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
224
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
225
|
+
var base = baseConDatos();
|
|
226
|
+
yield be.refreshCaches(base);
|
|
227
|
+
var timestampAnterior = be.caches.timestampEstructura;
|
|
228
|
+
var nuevaRea = { operativo: 'etoi211', rea: 3, descripcion: 'nueva', condicion: 'v4 = 2', orden: 3, es_positiva: true, tarea: null };
|
|
229
|
+
var guardar = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
|
|
230
|
+
base.tablas.rea = [...reas, nuevaRea];
|
|
231
|
+
return 'ok';
|
|
232
|
+
});
|
|
233
|
+
yield new Promise(resolve => setTimeout(resolve, 2));
|
|
234
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: base }, { table: 'rea' });
|
|
235
|
+
assert.ok(be.caches.timestampEstructura > timestampAnterior, 'los dispositivos deben recibir la estructura nueva');
|
|
236
|
+
var reasOP1 = (0, procedures_dmencu_1.reasNoReasDelOperativo)(be.caches.tableContent, 'etoi211').reas;
|
|
237
|
+
assert.deepStrictEqual(reasOP1.map(rea => rea.rea), [1, 2, 3]);
|
|
238
|
+
assert.strictEqual(evaluar(reasOP1[2].condicion_js, { v4: 2 }), true);
|
|
239
|
+
}));
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYWNoZXMtcmVhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdC1jYWNoZXMtcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsaUNBQXFDO0lBRXJDLHNDQUF1QztJQUV2QyxxREFBeUg7SUFDekgsbUVBQXFFO0lBQ3JFLHVFQUFtRTtJQUVuRSxxREFBcUQ7SUFFckQsc0dBQXNHO0lBQ3RHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUlyRSw4RUFBOEU7SUFDOUUsTUFBTSxTQUFTO1FBRVgsWUFBbUIsTUFBbUM7WUFBbkMsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7WUFEdEQsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUNpQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxHQUFXOztZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxHQUFHLE1BQUEsTUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQ0FBRyxDQUFDLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFHLE1BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLFVBQVUsR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMENBQUcsQ0FBQyxDQUFDLG1DQUFJLE9BQU8sQ0FBQztnQkFDMUQsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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QUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0Jyk7XG5cbmltcG9ydCB7IENsaWVudGVEYiwgQ29uc3VsdGFEYiwgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEsIFJlZnJlc2NhZG9yRXN0cnVjdHVyYSB9IGZyb20gJy4uL3NlcnZlci9hcHAtZG1lbmN1JztcbmltcG9ydCB7IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8gfSBmcm9tICcuLi9zZXJ2ZXIvcHJvY2VkdXJlcy1kbWVuY3UnO1xuaW1wb3J0IHsgaGVscGVyc0Nhc2lsbGVyb3MgfSBmcm9tICcuLi91bmxvZ2dlZC9oZWxwZXJzLWNhc2lsbGVyb3MnO1xuaW1wb3J0IHR5cGUgeyBOb1JlYSwgTm9SZWFTdXAsIFJlYSwgUmVhU3VwLCBWYWxvciB9IGZyb20gJy4uL3VubG9nZ2VkL3RpcG9zJztcbmltcG9ydCB7IGNyZWFyQXBwUGFyYVRlc3RzIH0gZnJvbSAnLi9hcHAtcGFyYS10ZXN0cyc7XG5cbi8vIHNlIGxpc3RhbiBhY8OhICh5IG5vIHNlIGltcG9ydGEgVEFCTEFTX1JFQV9OT19SRUEpIHBhcmEgcXVlIGVsIHRlc3QgZmFsbGUgc2kgYWxndW5hIGRlamEgZGUgdHJhdGFyc2VcbmNvbnN0IFRBQkxBU19SRUFfTk9fUkVBID0gWydyZWEnLCAnbm9fcmVhJywgJ3JlYV9zdXAnLCAnbm9fcmVhX3N1cCddO1xuXG50eXBlIEZpbGEgPSB7IFtjYW1wbzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBGaWxhW10gfTtcblxuLy8gQmFzZSBkZSBkYXRvcyBlbiBtZW1vcmlhOiBjYWRhIGNvbnN1bHRhIHNlIHJlc3VlbHZlIHBvciBsYSB0YWJsYSBkZWwgXCJmcm9tXCJcbmNsYXNzIEJhc2VGYWxzYSBpbXBsZW1lbnRzIENsaWVudGVEYiB7XG4gICAgY29uc3VsdGFzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0YWJsYXM6IHsgW3RhYmxhOiBzdHJpbmddOiBGaWxhW10gfSkgeyB9XG4gICAgcXVlcnkoc3FsOiBzdHJpbmcpOiBDb25zdWx0YURiIHtcbiAgICAgICAgdGhpcy5jb25zdWx0YXMucHVzaChzcWwpO1xuICAgICAgICB2YXIgdGFibGEgPSAvZnJvbSAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICcnO1xuICAgICAgICB2YXIgZmlsYXMgPSB0aGlzLnRhYmxhc1t0YWJsYV0gPz8gW107XG4gICAgICAgIGlmICgvZ3JvdXAgYnkgZ3J1cG8wPyhfc3VwKT8gLy50ZXN0KHNxbCArICcgJykpIHtcbiAgICAgICAgICAgIHZhciBjYW1wb0dydXBvID0gL3NlbGVjdCAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICdncnVwbyc7XG4gICAgICAgICAgICB2YXIgYWxpYXMgPSAvYXMgZ3J1cG8sLy50ZXN0KHNxbCkgPyAnZ3J1cG8nIDogY2FtcG9HcnVwbztcbiAgICAgICAgICAgIHZhciBncnVwb3M6IHsgW2dydXBvOiBzdHJpbmddOiBGaWxhW10gfSA9IHt9O1xuICAgICAgICAgICAgZmlsYXMuZm9yRWFjaChmaWxhID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgZ3J1cG8gPSBTdHJpbmcoZmlsYVtjYW1wb0dydXBvXSk7XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXSA9IGdydXBvc1tncnVwb10gfHwgW107XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXS5wdXNoKGZpbGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxhcyA9IE9iamVjdC5rZXlzKGdydXBvcykuc29ydCgpLm1hcChncnVwbyA9PiAoeyBbYWxpYXNdOiBncnVwbywgY29kaWdvczogZ3J1cG9zW2dydXBvXSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZldGNoQWxsOiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogZmlsYXMubGVuZ3RoLCByb3dzOiBmaWxhcywgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgICAgIGZldGNoVW5pcXVlUm93OiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogMSwgcm93OiBmaWxhc1swXSwgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IG5vUmVhczogTm9SZWFbXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnYXVzZW50ZScsIGdydXBvOiAnYXVzZW5jaWEnLCB2YXJpYWJsZTogJ3YxJywgdmFsb3I6ICc3JywgZ3J1cG8wOiAnZW5jdWVzdGFibGUnLCBvcmRlbjogMSB9LFxuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIG5vX3JlYTogMiwgZGVzY3JpcGNpb246ICdyZWNoYXpvJywgZ3J1cG86ICdyZWNoYXpvJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOCcsIGdydXBvMDogJ2VuY3Vlc3RhYmxlJywgb3JkZW46IDIgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnZGVzaGFiaXRhZGEnLCBncnVwbzogJ25vIGVuY3Vlc3RhYmxlJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOScsIGdydXBvMDogJ25vIGVuY3Vlc3RhYmxlJywgb3JkZW46IDEgfSxcbl07XG5jb25zdCBub1JlYXNTdXA6IE5vUmVhU3VwW10gPSBbXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgbm9fcmVhX3N1cDogNzEsIGRlc2Nfbm9yZWFfc3VwOiAnbm8gY29udGFjdG8nLCBncnVwb19zdXA6ICdzaW4gY29udGFjdG8nLCB2YXJpYWJsZV9zdXA6ICdzMScsIHZhbG9yX3N1cDogJzInLCBncnVwbzBfc3VwOiAnc3VwJywgb3JkZW46IDEgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWFfc3VwOiA3MiwgZGVzY19ub3JlYV9zdXA6ICdvdHJvJywgZ3J1cG9fc3VwOiAnb3RybycsIHZhcmlhYmxlX3N1cDogJ3MxJywgdmFsb3Jfc3VwOiAnMycsIGdydXBvMF9zdXA6ICdzdXAnLCBvcmRlbjogMSB9LFxuXTtcbmNvbnN0IHJlYXM6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz5bXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDEsIGRlc2NyaXBjaW9uOiAnY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEgYW5kIHYyID4gMTAnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgcmVhOiAyLCBkZXNjcmlwY2lvbjogJ2luY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEnLCBvcmRlbjogMiwgZXNfcG9zaXRpdmE6IGZhbHNlLCB0YXJlYTogJ2VuY3UnIH0sXG4gICAgeyBvcGVyYXRpdm86ICdlYWgyMDIyJywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ290cmEnLCBjb25kaWNpb246ICd2MyA9IDUnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG5dO1xuY29uc3QgcmVhc1N1cDogT21pdDxSZWFTdXAsICdjb25kaWNpb25fanMnPltdID0gW1xuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIHJlYV9zdXA6IDEsIGRlc2NyaXBjaW9uOiAnc3VwZXJ2aXNhZGEnLCBjb25kaWNpb246ICdzMSA9IDEnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAnc3VwZScgfSxcbl07XG5jb25zdCBvcGVyYXRpdm9zOiBGaWxhW10gPSBbeyBjb25fcmVhX2hvZ2FyOiB0cnVlLCBvcGVyYXRpdm86ICdldG9pMjExJywgY29uZmlnX3NvcnRlbzogbnVsbCB9XTtcblxuZnVuY3Rpb24gYmFzZUNvbkRhdG9zKCkge1xuICAgIHJldHVybiBuZXcgQmFzZUZhbHNhKHsgbm9fcmVhOiBub1JlYXMsIHJlYTogcmVhcywgbm9fcmVhX3N1cDogbm9SZWFzU3VwLCByZWFfc3VwOiByZWFzU3VwLCBvcGVyYXRpdm9zIH0pO1xufVxuXG4vLyBldmFsw7phIHVuYSBjb25kaWNpw7NuIGNvbXBpbGFkYSAoY29uZGljaW9uX2pzKSBjb21vIGxvIGhhY2UgZWwgZGlzcG9zaXRpdm9cbmZ1bmN0aW9uIGV2YWx1YXIoY29uZGljaW9uSnM6IHN0cmluZywgdmFsb3JlczogUmVjb3JkPHN0cmluZywgVmFsb3I+KTogYm9vbGVhbiB7XG4gICAgdmFyIGZ1bmNpb24gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGNvbmRpY2lvbkpzKTtcbiAgICByZXR1cm4gZnVuY2lvbih2YWxvcmVzLCBoZWxwZXJzQ2FzaWxsZXJvcyk7XG59XG5cbmRlc2NyaWJlKCdkbWVuY3UgLSBjYWNoZXMgZGUgcmVhL25vIHJlYScsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdyZWZyZXNoQ2FjaGVzJywgKCkgPT4ge1xuICAgICAgICBpdCgnY2FyZ2EgcmVhLCBubyByZWEgeSBzdXMgdmVyc2lvbmVzIF9zdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXMpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChiZS5jYWNoZXMudGFibGVDb250ZW50LnJlYSwgcmVhcyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX3N1cCwgbm9SZWFzU3VwKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWFfc3VwLCByZWFzU3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwaWRlIGEgbGEgYmFzZSBsYXMgbGlzdGFzIG9yZGVuYWRhcyBwb3Igb3BlcmF0aXZvIHkgb3JkZW4gKGRlZmluZSBsYSBwcmlvcmlkYWQgZGUgZXZhbHVhY2nDs24pJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgZm9yICh2YXIgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uc3VsdGEgPSBiYXNlLmNvbnN1bHRhcy5maW5kKHNxbCA9PiBuZXcgUmVnRXhwKGBmcm9tICR7dGFibGF9IG9yZGVyIGJ5YCkudGVzdChzcWwpKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soY29uc3VsdGEsIGBubyBzZSBjb25zdWx0w7MgJHt0YWJsYX1gKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQubWF0Y2goY29uc3VsdGEsIG5ldyBSZWdFeHAoYG9yZGVyIGJ5IG9wZXJhdGl2bywgb3JkZW4sICR7dGFibGF9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2FncnVwYSBsb3Mgbm8gcmVhIHBvciBncnVwbyB5IHBvciBncnVwbzAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgICAgIGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3Vwcy5tYXAoKGc6IEZpbGEpID0+IGcuZ3J1cG8pLFxuICAgICAgICAgICAgICAgIFsnYXVzZW5jaWEnLCAnbm8gZW5jdWVzdGFibGUnLCAncmVjaGF6byddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMwLm1hcCgoZzogRmlsYSkgPT4gZy5ncnVwbyksXG4gICAgICAgICAgICAgICAgWydlbmN1ZXN0YWJsZScsICdubyBlbmN1ZXN0YWJsZSddXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NhcmdhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBvcGVyYXRpdm8gYWN0dWFsIChjb25fcmVhX2hvZ2FyKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciBiZSA9IGNyZWFyQXBwUGFyYVRlc3RzKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2VDb25EYXRvcygpKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciwgb3BlcmF0aXZvc1swXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYWwgcmVjYXJnYXIgcmVlbXBsYXphIGxvcyBkYXRvcyBhbnRlcmlvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgYmFzZS50YWJsYXMucmVhID0gW3JlYXNbMF1dO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWEsIFtyZWFzWzBdXSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3JlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhIChlbnZ1ZWx2ZSB0YWJsZV9yZWNvcmRfc2F2ZSB5IHRhYmxlX3JlY29yZF9kZWxldGUpJywgKCkgPT4ge1xuICAgICAgICB0eXBlIENvbnRleHRvRmFsc28gPSB7IGNsaWVudDogQ2xpZW50ZURiIH07XG4gICAgICAgIHR5cGUgTGxhbWFkYSA9IHsgdGFibGE6IHN0cmluZywgZXh0cmE6IG9iamVjdCB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHByZXBhcmFyUmVmcmVzY2Fkb3IoKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRvczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIHZhciBjbGllbnRlc1JlZnJlc2NhZG9zOiBDbGllbnRlRGJbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGJlOiBSZWZyZXNjYWRvckVzdHJ1Y3R1cmEgPSB7XG4gICAgICAgICAgICAgICAgY2FjaGVzOiB7IHRpbWVzdGFtcEVzdHJ1Y3R1cmE6IDAgfSxcbiAgICAgICAgICAgICAgICByZWZyZXNoQ2FjaGVzOiBhc3luYyAoY2xpZW50OiBDbGllbnRlRGIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdyZWZyZXNjYXInKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50ZXNSZWZyZXNjYWRvcy5wdXNoKGNsaWVudCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbGxhbWFkYXM6IExsYW1hZGFbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXIgPSBhc3luYyAoX2NvbnRleHQ6IENvbnRleHRvRmFsc28sIHBhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9LCBleHRyYT86IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50b3MucHVzaCgnZ3VhcmRhcicpO1xuICAgICAgICAgICAgICAgIGxsYW1hZGFzLnB1c2goeyB0YWJsYTogcGFyYW1ldGVycy50YWJsZSwgZXh0cmEgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZ3VhcmRhZG86IHBhcmFtZXRlcnMudGFibGUgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgbGxhbWFkYXMsIGd1YXJkYXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgIGl0KGBhbCBtb2RpZmljYXIgJHt0YWJsYX0gcmVjYXJnYSBsYXMgY2FjaGVzIGRlc3B1w6lzIGRlIGd1YXJkYXIgeSBjYW1iaWEgbGEgZXN0cnVjdHVyYWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgQmFzZUZhbHNhKHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0YWRvID0gYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50IH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGd1YXJkYWRvOiB0YWJsYSB9KTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGV2ZW50b3MsIFsnZ3VhcmRhcicsICdyZWZyZXNjYXInXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNsaWVudGVzUmVmcmVzY2Fkb3NbMF0sIGNsaWVudCwgJ2RlYmUgcmVjYXJnYXIgY29uIGVsIG1pc21vIGNsaWVudGUgKG1pc21hIHRyYW5zYWNjacOzbiknKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgWydjYXNpbGxlcm9zJywgJ3NlbWFuYXMnXSkge1xuICAgICAgICAgICAgaXQoYGFsIG1vZGlmaWNhciAke3RhYmxhfSBjYW1iaWEgbGEgZXN0cnVjdHVyYSBzaW4gcmVjYXJnYXIgbGFzIGNhY2hlcyBkZSByZWFgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIHsgYmUsIGV2ZW50b3MsIGd1YXJkYXIgfSA9IHByZXBhcmFyUmVmcmVzY2Fkb3IoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5vayhiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSA+IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaXQoJ2FsIG1vZGlmaWNhciBvdHJhcyB0YWJsYXMgbm8gdG9jYSBsYSBlc3RydWN0dXJhIG5pIGxhcyBjYWNoZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAndXN1YXJpb3MnIH0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChldmVudG9zLCBbJ2d1YXJkYXInXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEsIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3NpIGZhbGxhIGVsIGd1YXJkYWRvIG5vIHJlY2FyZ2EgbmkgY2FtYmlhIGxhIGVzdHJ1Y3R1cmEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcyB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXJDb25FcnJvciA9IGFzeW5jIChfY29udGV4dDogQ29udGV4dG9GYWxzbywgX3BhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdndWFyZGFyJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBhbCBndWFyZGFyJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAgICAgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXJDb25FcnJvcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6ICdyZWEnIH0pLFxuICAgICAgICAgICAgICAgIC9lcnJvciBhbCBndWFyZGFyL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwYXNhIGEgbGEgZnVuY2nDs24gb3JpZ2luYWwgbG9zIGFyZ3VtZW50b3MgZXh0cmEgKGZpbGVzL29wdHMgZGUgdGFibGVfcmVjb3JkX3NhdmUpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgYmUsIGxsYW1hZGFzLCBndWFyZGFyIH0gPSBwcmVwYXJhclJlZnJlc2NhZG9yKCk7XG4gICAgICAgICAgICB2YXIgZXh0cmEgPSB7IGZpbGVzOiBbXSB9O1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAnbm9fcmVhJyB9LCBleHRyYSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobGxhbWFkYXNbMF0uZXh0cmEsIGV4dHJhKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncmVhc05vUmVhc0RlbE9wZXJhdGl2byAocmVhL25vIHJlYSBlbiBsYSBlc3RydWN0dXJhIHF1ZSByZWNpYmUgZWwgZGlzcG9zaXRpdm8pJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB7IG5vX3JlYTogbm9SZWFzLCBub19yZWFfc3VwOiBub1JlYXNTdXAsIHJlYTogcmVhcywgcmVhX3N1cDogcmVhc1N1cCB9O1xuXG4gICAgICAgIGl0KCdmaWx0cmEgY2FkYSBsaXN0YSBwb3Igb3BlcmF0aXZvJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHJlc3VsdGFkbyA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ubm9SZWFzLCBbbm9SZWFzWzBdLCBub1JlYXNbMV1dKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLm5vUmVhc1N1cCwgW25vUmVhc1N1cFswXV0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMSwgMl0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhc1N1cC5tYXAocmVhU3VwID0+IHJlYVN1cC5yZWFfc3VwKSwgWzFdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdjb25zZXJ2YSBlbCBvcmRlbiBkZSBsYXMgY2FjaGVzIChxdWUgdmllbmUgb3JkZW5hZG8gcG9yIG9yZGVuKScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciByZXN1bHRhZG8gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHsgLi4udGFibGVDb250ZW50LCByZWE6IFtyZWFzWzFdLCByZWFzWzBdXSB9LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMiwgMV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NvbXBpbGEgbGFzIGNvbmRpY2lvbmVzIGRlIHJlYSBhIGpzIGV2YWx1YWJsZSBlbiBlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbY29tcGxldGEsIGluY29tcGxldGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhcztcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDExIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDUgfSksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAxIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAyIH0pLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnY29tcGlsYSBsYXMgY29uZGljaW9uZXMgZGUgcmVhX3N1cCcsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbc3VwZXJ2aXNhZGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhc1N1cDtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKHN1cGVydmlzYWRhLmNvbmRpY2lvbl9qcywgeyBzMTogMSB9KSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihzdXBlcnZpc2FkYS5jb25kaWNpb25fanMsIHsgczE6IDIgfSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdsYXMgdmFyaWFibGVzIHNpbiBjYXJnYXIgc2UgdG9tYW4gY29tbyAwIChubyByb21wZW4gbGEgZXZhbHVhY2nDs24pJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIFtjb21wbGV0YV0gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV2YWx1YXIoY29tcGxldGEuY29uZGljaW9uX2pzLCB7fSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdubyBtb2RpZmljYSBsYXMgY2FjaGVzJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGFudGVzID0gSlNPTi5zdHJpbmdpZnkodGFibGVDb250ZW50KTtcbiAgICAgICAgICAgIHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKEpTT04uc3RyaW5naWZ5KHRhYmxlQ29udGVudCksIGFudGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaSBsYXMgY2FjaGVzIG5vIHNlIGNhcmdhcm9uIGRldnVlbHZlIGxpc3RhcyB2YWPDrWFzJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHt9LCAnZXRvaTIxMScpLCB7IG5vUmVhczogW10sIG5vUmVhc1N1cDogW10sIHJlYXM6IFtdLCByZWFzU3VwOiBbXSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZGUgcHVudGEgYSBwdW50YTogbW9kaWZpY2FyIHVuYSByZWEgbGxlZ2EgYSBsYSBlc3RydWN0dXJhIGRlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgaXQoJ2Rlc3B1w6lzIGRlIGd1YXJkYXIgdW5hIHJlYSwgbGEgZXN0cnVjdHVyYSBkZWwgb3BlcmF0aXZvIGxhIGluY2x1eWUgY29tcGlsYWRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgdmFyIHRpbWVzdGFtcEFudGVyaW9yID0gYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmE7XG4gICAgICAgICAgICB2YXIgbnVldmFSZWE6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz4gPSB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDMsIGRlc2NyaXBjaW9uOiAnbnVldmEnLCBjb25kaWNpb246ICd2NCA9IDInLCBvcmRlbjogMywgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH07XG4gICAgICAgICAgICB2YXIgZ3VhcmRhciA9IGFzeW5jIChfY29udGV4dDogeyBjbGllbnQ6IENsaWVudGVEYiB9LCBfcGFyYW1ldGVyczogeyB0YWJsZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLnRhYmxhcy5yZWEgPSBbLi4ucmVhcywgbnVldmFSZWFdO1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyKSk7XG4gICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IGJhc2UgfSwgeyB0YWJsZTogJ3JlYScgfSk7XG4gICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiB0aW1lc3RhbXBBbnRlcmlvciwgJ2xvcyBkaXNwb3NpdGl2b3MgZGViZW4gcmVjaWJpciBsYSBlc3RydWN0dXJhIG51ZXZhJyk7XG4gICAgICAgICAgICB2YXIgcmVhc09QMSA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8oYmUuY2FjaGVzLnRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzT1AxLm1hcChyZWEgPT4gcmVhLnJlYSksIFsxLCAyLCAzXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihyZWFzT1AxWzJdLmNvbmRpY2lvbl9qcywgeyB2NDogMiB9KSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "mocha", "node:assert", "../unlogged/helpers-casilleros"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const mocha_1 = require("mocha");
|
|
13
|
+
const assert = require("node:assert");
|
|
14
|
+
const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
|
|
15
|
+
const { funs } = helpers_casilleros_1.helpersCasilleros;
|
|
16
|
+
(0, mocha_1.describe)('dmencu - helpersCasilleros', () => {
|
|
17
|
+
(0, mocha_1.describe)('null2zero', () => {
|
|
18
|
+
(0, mocha_1.it)('convierte null y undefined en 0', () => {
|
|
19
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(null), 0);
|
|
20
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(undefined), 0);
|
|
21
|
+
});
|
|
22
|
+
(0, mocha_1.it)('deja intactos los demás valores (incluso 0, "" y false)', () => {
|
|
23
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(5), 5);
|
|
24
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(0), 0);
|
|
25
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(''), '');
|
|
26
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.null2zero(false), false);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
(0, mocha_1.describe)('div0err', () => {
|
|
30
|
+
(0, mocha_1.it)('divide normalmente', () => {
|
|
31
|
+
assert.strictEqual(helpers_casilleros_1.helpersCasilleros.div0err(10, 4, 'v1'), 2.5);
|
|
32
|
+
});
|
|
33
|
+
(0, mocha_1.it)('lanza error indicando la pk si el denominador es 0', () => {
|
|
34
|
+
assert.throws(() => helpers_casilleros_1.helpersCasilleros.div0err(10, 0, 'viv 7'), /Error en viv 7 division por cero de 10/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
(0, mocha_1.describe)('funs.blanco', () => {
|
|
38
|
+
(0, mocha_1.it)('null, undefined y "" son blanco', () => {
|
|
39
|
+
assert.strictEqual(funs.blanco(null), true);
|
|
40
|
+
assert.strictEqual(funs.blanco(undefined), true);
|
|
41
|
+
assert.strictEqual(funs.blanco(''), true);
|
|
42
|
+
});
|
|
43
|
+
(0, mocha_1.it)('0 NO es blanco (es una respuesta válida)', () => {
|
|
44
|
+
assert.strictEqual(funs.blanco(0), false);
|
|
45
|
+
});
|
|
46
|
+
(0, mocha_1.it)('valores cargados no son blanco', () => {
|
|
47
|
+
assert.strictEqual(funs.blanco(1), false);
|
|
48
|
+
assert.strictEqual(funs.blanco('a'), false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
(0, mocha_1.describe)('funs.informado', () => {
|
|
52
|
+
(0, mocha_1.it)('null y undefined no están informados', () => {
|
|
53
|
+
assert.strictEqual(funs.informado(null), false);
|
|
54
|
+
assert.strictEqual(funs.informado(undefined), false);
|
|
55
|
+
});
|
|
56
|
+
(0, mocha_1.it)('arrays y objetos vacíos no están informados', () => {
|
|
57
|
+
assert.strictEqual(funs.informado([]), false);
|
|
58
|
+
assert.strictEqual(funs.informado({}), false);
|
|
59
|
+
});
|
|
60
|
+
(0, mocha_1.it)('valores, arrays y objetos con contenido están informados', () => {
|
|
61
|
+
assert.strictEqual(funs.informado(0), true);
|
|
62
|
+
assert.strictEqual(funs.informado(''), true);
|
|
63
|
+
assert.strictEqual(funs.informado([1]), true);
|
|
64
|
+
assert.strictEqual(funs.informado({ a: 1 }), true);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
(0, mocha_1.describe)('funs.nsnc y funs.par', () => {
|
|
68
|
+
(0, mocha_1.it)('nsnc solo es verdadero para -9 (número o texto)', () => {
|
|
69
|
+
assert.strictEqual(funs.nsnc(-9), true);
|
|
70
|
+
assert.strictEqual(funs.nsnc('-9'), true);
|
|
71
|
+
assert.strictEqual(funs.nsnc(9), false);
|
|
72
|
+
assert.strictEqual(funs.nsnc(null), false);
|
|
73
|
+
});
|
|
74
|
+
(0, mocha_1.it)('par', () => {
|
|
75
|
+
assert.strictEqual(funs.par(4), true);
|
|
76
|
+
assert.strictEqual(funs.par(0), true);
|
|
77
|
+
assert.strictEqual(funs.par(7), false);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
(0, mocha_1.describe)('funs.hoy', () => {
|
|
81
|
+
(0, mocha_1.it)('devuelve la fecha de hoy en formato dd/mm/aaaa', () => {
|
|
82
|
+
const ahora = new Date();
|
|
83
|
+
const hoy = funs.hoy();
|
|
84
|
+
assert.match(hoy, /^\d{1,2}\/\d{1,2}\/\d{4}$/);
|
|
85
|
+
const [d, m, y] = hoy.split('/').map(Number);
|
|
86
|
+
assert.deepStrictEqual([d, m, y], [ahora.getDate(), ahora.getMonth() + 1, ahora.getFullYear()]);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
(0, mocha_1.describe)('funs.fecha_valida', () => {
|
|
90
|
+
(0, mocha_1.it)('acepta fechas válidas con y sin ceros a la izquierda', () => {
|
|
91
|
+
assert.strictEqual(funs.fecha_valida('01/01/2025'), true);
|
|
92
|
+
assert.strictEqual(funs.fecha_valida('1/1/2025'), true);
|
|
93
|
+
assert.strictEqual(funs.fecha_valida('31/12/2025'), true);
|
|
94
|
+
});
|
|
95
|
+
(0, mocha_1.it)('acepta el 29/02 de un año bisiesto', () => {
|
|
96
|
+
assert.strictEqual(funs.fecha_valida('29/02/2024'), true);
|
|
97
|
+
});
|
|
98
|
+
(0, mocha_1.it)('rechaza días inexistentes en el mes', () => {
|
|
99
|
+
assert.strictEqual(funs.fecha_valida('31/02/2025'), false);
|
|
100
|
+
assert.strictEqual(funs.fecha_valida('30/02/2025'), false);
|
|
101
|
+
assert.strictEqual(funs.fecha_valida('31/04/2025'), false);
|
|
102
|
+
assert.strictEqual(funs.fecha_valida('31/06/2025'), false);
|
|
103
|
+
});
|
|
104
|
+
(0, mocha_1.it)('rechaza el 29/02 de un año no bisiesto', () => {
|
|
105
|
+
assert.strictEqual(funs.fecha_valida('29/02/2023'), false);
|
|
106
|
+
});
|
|
107
|
+
(0, mocha_1.it)('rechaza formatos inválidos', () => {
|
|
108
|
+
assert.strictEqual(funs.fecha_valida('15/13/2025'), false);
|
|
109
|
+
assert.strictEqual(funs.fecha_valida('00/01/2025'), false);
|
|
110
|
+
assert.strictEqual(funs.fecha_valida('32/01/2025'), false);
|
|
111
|
+
assert.strictEqual(funs.fecha_valida('2025-01-01'), false);
|
|
112
|
+
assert.strictEqual(funs.fecha_valida('01/01/25'), false);
|
|
113
|
+
assert.strictEqual(funs.fecha_valida(''), false);
|
|
114
|
+
});
|
|
115
|
+
(0, mocha_1.it)('solo acepta años 20xx', () => {
|
|
116
|
+
assert.strictEqual(funs.fecha_valida('01/01/1999'), false);
|
|
117
|
+
assert.strictEqual(funs.fecha_valida('01/01/2100'), false);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
(0, mocha_1.describe)('funs.mesanio_valido', () => {
|
|
121
|
+
(0, mocha_1.it)('acepta mm/aaaa con años 19xx y 20xx', () => {
|
|
122
|
+
assert.strictEqual(funs.mesanio_valido('01/1995'), true);
|
|
123
|
+
assert.strictEqual(funs.mesanio_valido('1/1995'), true);
|
|
124
|
+
assert.strictEqual(funs.mesanio_valido('12/2025'), true);
|
|
125
|
+
});
|
|
126
|
+
(0, mocha_1.it)('rechaza meses fuera de rango y años fuera de 19xx/20xx', () => {
|
|
127
|
+
assert.strictEqual(funs.mesanio_valido('13/2025'), false);
|
|
128
|
+
assert.strictEqual(funs.mesanio_valido('00/2025'), false);
|
|
129
|
+
assert.strictEqual(funs.mesanio_valido('01/1895'), false);
|
|
130
|
+
assert.strictEqual(funs.mesanio_valido('01/25'), false);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
(0, mocha_1.describe)('funs.edad_mes_annio_valido', () => {
|
|
134
|
+
(0, mocha_1.it)('acepta la edad que corresponde a los meses cumplidos', () => {
|
|
135
|
+
// feb/1995 a ene/2025: 359 meses -> 29 años
|
|
136
|
+
assert.strictEqual(funs.edad_mes_annio_valido(29, '02/1995', '15/01/2025'), true);
|
|
137
|
+
assert.strictEqual(funs.edad_mes_annio_valido(30, '02/1995', '15/01/2025'), false);
|
|
138
|
+
});
|
|
139
|
+
(0, mocha_1.it)('en el mes de cumpleaños acepta ambas edades (tolerancia de un mes)', () => {
|
|
140
|
+
// ene/1995 a ene/2025: 360 meses exactos -> 30, o 29 si todavía no cumplió
|
|
141
|
+
assert.strictEqual(funs.edad_mes_annio_valido(30, '01/1995', '15/01/2025'), true);
|
|
142
|
+
assert.strictEqual(funs.edad_mes_annio_valido(29, '01/1995', '15/01/2025'), true);
|
|
143
|
+
assert.strictEqual(funs.edad_mes_annio_valido(28, '01/1995', '15/01/2025'), false);
|
|
144
|
+
});
|
|
145
|
+
(0, mocha_1.it)('un bebé nacido en el mes de la realización tiene 0 años', () => {
|
|
146
|
+
assert.strictEqual(funs.edad_mes_annio_valido(0, '01/2025', '15/01/2025'), true);
|
|
147
|
+
});
|
|
148
|
+
(0, mocha_1.it)('rechaza edades muy distintas', () => {
|
|
149
|
+
assert.strictEqual(funs.edad_mes_annio_valido(40, '06/1995', '15/01/2025'), false);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1oZWxwZXJzLWNhc2lsbGVyb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC90ZXN0LWhlbHBlcnMtY2FzaWxsZXJvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFBLGlDQUFxQztJQUVyQyxzQ0FBdUM7SUFFdkMsdUVBQW1FO0lBRW5FLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxzQ0FBaUIsQ0FBQztJQUVuQyxJQUFBLGdCQUFRLEVBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBRXhDLElBQUEsZ0JBQVEsRUFBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ3ZCLElBQUEsVUFBRSxFQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtnQkFDdkMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxzQ0FBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sQ0FBQyxXQUFXLENBQUMsc0NBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBQSxVQUFFLEVBQUMseURBQXlELEVBQUUsR0FBRyxFQUFFO2dCQUMvRCxNQUFNLENBQUMsV0FBVyxDQUFDLHNDQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxzQ0FBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sQ0FBQyxXQUFXLENBQUMsc0NBQWlCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLHNDQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FB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TSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixDQUFDLENBQUMsQ0FBQztZQUNILElBQUEsVUFBRSxFQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtnQkFDL0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRixDQUFDLENBQUMsQ0FBQztZQUNILElBQUEsVUFBRSxFQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5cbmltcG9ydCBhc3NlcnQgPSByZXF1aXJlKCdub2RlOmFzc2VydCcpO1xuXG5pbXBvcnQgeyBoZWxwZXJzQ2FzaWxsZXJvcyB9IGZyb20gJy4uL3VubG9nZ2VkL2hlbHBlcnMtY2FzaWxsZXJvcyc7XG5cbmNvbnN0IHsgZnVucyB9ID0gaGVscGVyc0Nhc2lsbGVyb3M7XG5cbmRlc2NyaWJlKCdkbWVuY3UgLSBoZWxwZXJzQ2FzaWxsZXJvcycsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdudWxsMnplcm8nLCAoKSA9PiB7XG4gICAgICAgIGl0KCdjb252aWVydGUgbnVsbCB5IHVuZGVmaW5lZCBlbiAwJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGhlbHBlcnNDYXNpbGxlcm9zLm51bGwyemVybyhudWxsKSwgMCk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaGVscGVyc0Nhc2lsbGVyb3MubnVsbDJ6ZXJvKHVuZGVmaW5lZCksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2RlamEgaW50YWN0b3MgbG9zIGRlbcOhcyB2YWxvcmVzIChpbmNsdXNvIDAsIFwiXCIgeSBmYWxzZSknLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaGVscGVyc0Nhc2lsbGVyb3MubnVsbDJ6ZXJvKDUpLCA1KTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChoZWxwZXJzQ2FzaWxsZXJvcy5udWxsMnplcm8oMCksIDApO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGhlbHBlcnNDYXNpbGxlcm9zLm51bGwyemVybygnJyksICcnKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChoZWxwZXJzQ2FzaWxsZXJvcy5udWxsMnplcm8oZmFsc2UpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2RpdjBlcnInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdkaXZpZGUgbm9ybWFsbWVudGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaGVscGVyc0Nhc2lsbGVyb3MuZGl2MGVycigxMCwgNCwgJ3YxJyksIDIuNSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnbGFuemEgZXJyb3IgaW5kaWNhbmRvIGxhIHBrIHNpIGVsIGRlbm9taW5hZG9yIGVzIDAnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGhlbHBlcnNDYXNpbGxlcm9zLmRpdjBlcnIoMTAsIDAsICd2aXYgNycpLCAvRXJyb3IgZW4gdml2IDcgZGl2aXNpb24gcG9yIGNlcm8gZGUgMTAvKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZnVucy5ibGFuY28nLCAoKSA9PiB7XG4gICAgICAgIGl0KCdudWxsLCB1bmRlZmluZWQgeSBcIlwiIHNvbiBibGFuY28nLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5ibGFuY28obnVsbCksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuYmxhbmNvKHVuZGVmaW5lZCksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuYmxhbmNvKCcnKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnMCBOTyBlcyBibGFuY28gKGVzIHVuYSByZXNwdWVzdGEgdsOhbGlkYSknLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5ibGFuY28oMCksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCd2YWxvcmVzIGNhcmdhZG9zIG5vIHNvbiBibGFuY28nLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5ibGFuY28oMSksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmJsYW5jbygnYScpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Z1bnMuaW5mb3JtYWRvJywgKCkgPT4ge1xuICAgICAgICBpdCgnbnVsbCB5IHVuZGVmaW5lZCBubyBlc3TDoW4gaW5mb3JtYWRvcycsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmluZm9ybWFkbyhudWxsKSwgZmFsc2UpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuaW5mb3JtYWRvKHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdhcnJheXMgeSBvYmpldG9zIHZhY8Otb3Mgbm8gZXN0w6FuIGluZm9ybWFkb3MnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5pbmZvcm1hZG8oW10pLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5pbmZvcm1hZG8oe30pLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgndmFsb3JlcywgYXJyYXlzIHkgb2JqZXRvcyBjb24gY29udGVuaWRvIGVzdMOhbiBpbmZvcm1hZG9zJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuaW5mb3JtYWRvKDApLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmluZm9ybWFkbygnJyksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuaW5mb3JtYWRvKFsxXSksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuaW5mb3JtYWRvKHsgYTogMSB9KSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Z1bnMubnNuYyB5IGZ1bnMucGFyJywgKCkgPT4ge1xuICAgICAgICBpdCgnbnNuYyBzb2xvIGVzIHZlcmRhZGVybyBwYXJhIC05IChuw7ptZXJvIG8gdGV4dG8pJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMubnNuYygtOSksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMubnNuYygnLTknKSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5uc25jKDkpLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5uc25jKG51bGwpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgncGFyJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMucGFyKDQpLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLnBhcigwKSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5wYXIoNyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZnVucy5ob3knLCAoKSA9PiB7XG4gICAgICAgIGl0KCdkZXZ1ZWx2ZSBsYSBmZWNoYSBkZSBob3kgZW4gZm9ybWF0byBkZC9tbS9hYWFhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWhvcmEgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgaG95ID0gZnVucy5ob3koKTtcbiAgICAgICAgICAgIGFzc2VydC5tYXRjaChob3ksIC9eXFxkezEsMn1cXC9cXGR7MSwyfVxcL1xcZHs0fSQvKTtcbiAgICAgICAgICAgIGNvbnN0IFtkLCBtLCB5XSA9IGhveS5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChbZCwgbSwgeV0sIFthaG9yYS5nZXREYXRlKCksIGFob3JhLmdldE1vbnRoKCkgKyAxLCBhaG9yYS5nZXRGdWxsWWVhcigpXSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Z1bnMuZmVjaGFfdmFsaWRhJywgKCkgPT4ge1xuICAgICAgICBpdCgnYWNlcHRhIGZlY2hhcyB2w6FsaWRhcyBjb24geSBzaW4gY2Vyb3MgYSBsYSBpenF1aWVyZGEnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzAxLzAxLzIwMjUnKSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzEvMS8yMDI1JyksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCczMS8xMi8yMDI1JyksIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2FjZXB0YSBlbCAyOS8wMiBkZSB1biBhw7FvIGJpc2llc3RvJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCcyOS8wMi8yMDI0JyksIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3JlY2hhemEgZMOtYXMgaW5leGlzdGVudGVzIGVuIGVsIG1lcycsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmZlY2hhX3ZhbGlkYSgnMzEvMDIvMjAyNScpLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzMwLzAyLzIwMjUnKSwgZmFsc2UpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCczMS8wNC8yMDI1JyksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmZlY2hhX3ZhbGlkYSgnMzEvMDYvMjAyNScpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgncmVjaGF6YSBlbCAyOS8wMiBkZSB1biBhw7FvIG5vIGJpc2llc3RvJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCcyOS8wMi8yMDIzJyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdyZWNoYXphIGZvcm1hdG9zIGludsOhbGlkb3MnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzE1LzEzLzIwMjUnKSwgZmFsc2UpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCcwMC8wMS8yMDI1JyksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmZlY2hhX3ZhbGlkYSgnMzIvMDEvMjAyNScpLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzIwMjUtMDEtMDEnKSwgZmFsc2UpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZmVjaGFfdmFsaWRhKCcwMS8wMS8yNScpLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJycpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc29sbyBhY2VwdGEgYcOxb3MgMjB4eCcsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmZlY2hhX3ZhbGlkYSgnMDEvMDEvMTk5OScpLCBmYWxzZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5mZWNoYV92YWxpZGEoJzAxLzAxLzIxMDAnKSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdmdW5zLm1lc2FuaW9fdmFsaWRvJywgKCkgPT4ge1xuICAgICAgICBpdCgnYWNlcHRhIG1tL2FhYWEgY29uIGHDsW9zIDE5eHggeSAyMHh4JywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMubWVzYW5pb192YWxpZG8oJzAxLzE5OTUnKSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5tZXNhbmlvX3ZhbGlkbygnMS8xOTk1JyksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMubWVzYW5pb192YWxpZG8oJzEyLzIwMjUnKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgncmVjaGF6YSBtZXNlcyBmdWVyYSBkZSByYW5nbyB5IGHDsW9zIGZ1ZXJhIGRlIDE5eHgvMjB4eCcsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLm1lc2FuaW9fdmFsaWRvKCcxMy8yMDI1JyksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLm1lc2FuaW9fdmFsaWRvKCcwMC8yMDI1JyksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLm1lc2FuaW9fdmFsaWRvKCcwMS8xODk1JyksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLm1lc2FuaW9fdmFsaWRvKCcwMS8yNScpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Z1bnMuZWRhZF9tZXNfYW5uaW9fdmFsaWRvJywgKCkgPT4ge1xuICAgICAgICBpdCgnYWNlcHRhIGxhIGVkYWQgcXVlIGNvcnJlc3BvbmRlIGEgbG9zIG1lc2VzIGN1bXBsaWRvcycsICgpID0+IHtcbiAgICAgICAgICAgIC8vIGZlYi8xOTk1IGEgZW5lLzIwMjU6IDM1OSBtZXNlcyAtPiAyOSBhw7Fvc1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZWRhZF9tZXNfYW5uaW9fdmFsaWRvKDI5LCAnMDIvMTk5NScsICcxNS8wMS8yMDI1JyksIHRydWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZ1bnMuZWRhZF9tZXNfYW5uaW9fdmFsaWRvKDMwLCAnMDIvMTk5NScsICcxNS8wMS8yMDI1JyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdlbiBlbCBtZXMgZGUgY3VtcGxlYcOxb3MgYWNlcHRhIGFtYmFzIGVkYWRlcyAodG9sZXJhbmNpYSBkZSB1biBtZXMpJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gZW5lLzE5OTUgYSBlbmUvMjAyNTogMzYwIG1lc2VzIGV4YWN0b3MgLT4gMzAsIG8gMjkgc2kgdG9kYXbDrWEgbm8gY3VtcGxpw7NcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmVkYWRfbWVzX2FubmlvX3ZhbGlkbygzMCwgJzAxLzE5OTUnLCAnMTUvMDEvMjAyNScpLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmVkYWRfbWVzX2FubmlvX3ZhbGlkbygyOSwgJzAxLzE5OTUnLCAnMTUvMDEvMjAyNScpLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmVkYWRfbWVzX2FubmlvX3ZhbGlkbygyOCwgJzAxLzE5OTUnLCAnMTUvMDEvMjAyNScpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgndW4gYmViw6kgbmFjaWRvIGVuIGVsIG1lcyBkZSBsYSByZWFsaXphY2nDs24gdGllbmUgMCBhw7FvcycsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmdW5zLmVkYWRfbWVzX2FubmlvX3ZhbGlkbygwLCAnMDEvMjAyNScsICcxNS8wMS8yMDI1JyksIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3JlY2hhemEgZWRhZGVzIG11eSBkaXN0aW50YXMnLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnVucy5lZGFkX21lc19hbm5pb192YWxpZG8oNDAsICcwNi8xOTk1JywgJzE1LzAxLzIwMjUnKSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|