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.
Files changed (258) hide show
  1. package/README.md +42 -42
  2. package/ayuda/asignacion.md +16 -0
  3. package/ayuda/circuito-encuesta.md +27 -0
  4. package/ayuda/control.md +13 -0
  5. package/ayuda/dm-cambiar-modo.md +16 -0
  6. package/ayuda/dm-relevamiento.md +20 -0
  7. package/ayuda/dm-sincronizar.md +18 -0
  8. package/ayuda/fin-de-campo.md +14 -0
  9. package/ayuda/metadatos.md +14 -0
  10. package/ayuda/procesar.md +13 -0
  11. package/ayuda/recepcion.md +20 -0
  12. package/ayuda/supervision.md +9 -0
  13. package/ayuda/usuarios.md +12 -0
  14. package/ayuda/varios.md +23 -0
  15. package/dist/client/client/client.js +101 -4
  16. package/dist/client/client/css/menu.styl +29 -0
  17. package/dist/client/unlogged/abrir-formulario.js +1 -1
  18. package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
  19. package/dist/client/unlogged/bypass-formulario.js +84 -219
  20. package/dist/client/unlogged/calculos-encuesta.js +112 -38
  21. package/dist/client/unlogged/css/formulario-react.styl +9 -0
  22. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  23. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  24. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  25. package/dist/client/unlogged/helpers-formulario.js +88 -0
  26. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  27. package/dist/client/unlogged/redux-formulario.js +21 -31
  28. package/dist/client/unlogged/render-config.d.ts +5 -1
  29. package/dist/client/unlogged/render-config.js +14 -1
  30. package/dist/client/unlogged/render-formulario.d.ts +3 -6
  31. package/dist/client/unlogged/render-formulario.js +71 -69
  32. package/dist/client/unlogged/render-formulario.tsx +100 -57
  33. package/dist/client/unlogged/render-general.d.ts +2 -0
  34. package/dist/client/unlogged/render-general.js +2 -1
  35. package/dist/client/unlogged/render-general.tsx +2 -1
  36. package/dist/client/unlogged/render-init.d.ts +1 -0
  37. package/dist/client/unlogged/render-init.js +9 -2
  38. package/dist/client/unlogged/tipos.d.ts +93 -41
  39. package/dist/client/unlogged/tipos.js +1 -1
  40. package/dist/server/app-dmencu.d.ts +1435 -0
  41. package/dist/server/app-dmencu.js +1091 -0
  42. package/dist/server/ayuda.d.ts +19 -0
  43. package/dist/server/ayuda.js +224 -0
  44. package/dist/server/def-config.d.ts +1 -0
  45. package/dist/server/def-config.js +123 -0
  46. package/dist/server/procedures-dmencu.d.ts +43 -0
  47. package/dist/server/procedures-dmencu.js +2313 -0
  48. package/dist/server/server/app-dmencu.d.ts +49 -91
  49. package/dist/server/server/app-dmencu.js +151 -52
  50. package/dist/server/server/ayuda.d.ts +19 -0
  51. package/dist/server/server/ayuda.js +224 -0
  52. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  53. package/dist/server/server/procedures-dmencu.js +93 -51
  54. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  55. package/dist/server/server/setters-rea-no-rea.js +35 -0
  56. package/dist/server/server/table-areas.js +4 -4
  57. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  58. package/dist/server/server/table-control_campo.js +4 -4
  59. package/dist/server/server/table-no_rea.js +4 -2
  60. package/dist/server/server/table-no_rea_sup.js +7 -3
  61. package/dist/server/server/table-personal.js +1 -1
  62. package/dist/server/server/table-tareas_tem.js +2 -2
  63. package/dist/server/server/table-tem.js +2 -2
  64. package/dist/server/server/types-dmencu.d.ts +53 -2
  65. package/dist/server/server/types-dmencu.js +2 -1
  66. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  67. package/dist/server/setters-rea-no-rea.js +35 -0
  68. package/dist/server/table-acciones.d.ts +2 -0
  69. package/dist/server/table-acciones.js +45 -0
  70. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  71. package/dist/server/table-area_enc_proximas.js +30 -0
  72. package/dist/server/table-areas.d.ts +4 -0
  73. package/dist/server/table-areas.js +112 -0
  74. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  75. package/dist/server/table-areas_asignacion_general.js +86 -0
  76. package/dist/server/table-barrios.d.ts +2 -0
  77. package/dist/server/table-barrios.js +35 -0
  78. package/dist/server/table-comunas.d.ts +2 -0
  79. package/dist/server/table-comunas.js +33 -0
  80. package/dist/server/table-control_campo.d.ts +12 -0
  81. package/dist/server/table-control_campo.js +119 -0
  82. package/dist/server/table-control_dias_carga.d.ts +2 -0
  83. package/dist/server/table-control_dias_carga.js +63 -0
  84. package/dist/server/table-control_resumen.d.ts +2 -0
  85. package/dist/server/table-control_resumen.js +19 -0
  86. package/dist/server/table-diccionario.d.ts +2 -0
  87. package/dist/server/table-diccionario.js +32 -0
  88. package/dist/server/table-dictra.d.ts +2 -0
  89. package/dist/server/table-dictra.js +46 -0
  90. package/dist/server/table-dicvar.d.ts +2 -0
  91. package/dist/server/table-dicvar.js +32 -0
  92. package/dist/server/table-encuestadores.d.ts +13 -0
  93. package/dist/server/table-encuestadores.js +75 -0
  94. package/dist/server/table-estados.d.ts +2 -0
  95. package/dist/server/table-estados.js +47 -0
  96. package/dist/server/table-estados_acciones.d.ts +2 -0
  97. package/dist/server/table-estados_acciones.js +40 -0
  98. package/dist/server/table-fracciones.d.ts +2 -0
  99. package/dist/server/table-fracciones.js +37 -0
  100. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  101. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  102. package/dist/server/table-historial_tem.d.ts +2 -0
  103. package/dist/server/table-historial_tem.js +57 -0
  104. package/dist/server/table-hogares.d.ts +2 -0
  105. package/dist/server/table-hogares.js +156 -0
  106. package/dist/server/table-hogares_sup.d.ts +2 -0
  107. package/dist/server/table-hogares_sup.js +191 -0
  108. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  109. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  110. package/dist/server/table-manzanas.d.ts +2 -0
  111. package/dist/server/table-manzanas.js +36 -0
  112. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  113. package/dist/server/table-mis_encuestadores.js +77 -0
  114. package/dist/server/table-mis_tareas.d.ts +2 -0
  115. package/dist/server/table-mis_tareas.js +18 -0
  116. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  117. package/dist/server/table-mis_tareas_areas.js +20 -0
  118. package/dist/server/table-modos_dm.d.ts +2 -0
  119. package/dist/server/table-modos_dm.js +28 -0
  120. package/dist/server/table-no_rea.js +38 -0
  121. package/dist/server/table-no_rea_sup.js +36 -0
  122. package/dist/server/table-operaciones.d.ts +2 -0
  123. package/dist/server/table-operaciones.js +30 -0
  124. package/dist/server/table-parametros.d.ts +2 -0
  125. package/dist/server/table-parametros.js +40 -0
  126. package/dist/server/table-permisos.d.ts +2 -0
  127. package/dist/server/table-permisos.js +31 -0
  128. package/dist/server/table-personal.d.ts +5 -0
  129. package/dist/server/table-personal.js +62 -0
  130. package/dist/server/table-personal_rol.d.ts +2 -0
  131. package/dist/server/table-personal_rol.js +42 -0
  132. package/dist/server/table-personas.d.ts +2 -0
  133. package/dist/server/table-personas.js +448 -0
  134. package/dist/server/table-personas_sup.d.ts +2 -0
  135. package/dist/server/table-personas_sup.js +93 -0
  136. package/dist/server/table-radios.d.ts +2 -0
  137. package/dist/server/table-radios.js +37 -0
  138. package/dist/server/table-rea.d.ts +2 -0
  139. package/dist/server/table-rea.js +38 -0
  140. package/dist/server/table-rea_sup.d.ts +2 -0
  141. package/dist/server/table-rea_sup.js +38 -0
  142. package/dist/server/table-recepcionistas.d.ts +2 -0
  143. package/dist/server/table-recepcionistas.js +18 -0
  144. package/dist/server/table-recuperadores.d.ts +2 -0
  145. package/dist/server/table-recuperadores.js +18 -0
  146. package/dist/server/table-roles.d.ts +2 -0
  147. package/dist/server/table-roles.js +33 -0
  148. package/dist/server/table-roles_permisos.d.ts +2 -0
  149. package/dist/server/table-roles_permisos.js +36 -0
  150. package/dist/server/table-roles_subordinados.d.ts +2 -0
  151. package/dist/server/table-roles_subordinados.js +31 -0
  152. package/dist/server/table-semanas.d.ts +2 -0
  153. package/dist/server/table-semanas.js +42 -0
  154. package/dist/server/table-sincronizaciones.d.ts +2 -0
  155. package/dist/server/table-sincronizaciones.js +30 -0
  156. package/dist/server/table-supervisores.d.ts +2 -0
  157. package/dist/server/table-supervisores.js +18 -0
  158. package/dist/server/table-tareas.d.ts +2 -0
  159. package/dist/server/table-tareas.js +48 -0
  160. package/dist/server/table-tareas_areas.d.ts +7 -0
  161. package/dist/server/table-tareas_areas.js +112 -0
  162. package/dist/server/table-tareas_proximas.d.ts +2 -0
  163. package/dist/server/table-tareas_proximas.js +48 -0
  164. package/dist/server/table-tareas_tem.d.ts +14 -0
  165. package/dist/server/table-tareas_tem.js +206 -0
  166. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  167. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  168. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  169. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  170. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  171. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  172. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  173. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  174. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  175. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  176. package/dist/server/table-tem.d.ts +3 -0
  177. package/dist/server/table-tem.js +247 -0
  178. package/dist/server/table-tem_asignacion.d.ts +2 -0
  179. package/dist/server/table-tem_asignacion.js +50 -0
  180. package/dist/server/table-tem_borradas.d.ts +2 -0
  181. package/dist/server/table-tem_borradas.js +35 -0
  182. package/dist/server/table-usuarios.d.ts +2 -0
  183. package/dist/server/table-usuarios.js +63 -0
  184. package/dist/server/table-visitas.d.ts +2 -0
  185. package/dist/server/table-visitas.js +91 -0
  186. package/dist/server/table-visitas_sup.d.ts +2 -0
  187. package/dist/server/table-visitas_sup.js +91 -0
  188. package/dist/server/table-viviendas.d.ts +2 -0
  189. package/dist/server/table-viviendas.js +299 -0
  190. package/dist/server/types-dmencu.d.ts +114 -0
  191. package/dist/server/types-dmencu.js +34 -0
  192. package/dist/server/unlogged/tipos.d.ts +93 -41
  193. package/dist/server/unlogged/tipos.js +1 -1
  194. package/dist/test/app-para-tests.d.ts +1117 -0
  195. package/dist/test/app-para-tests.js +95 -0
  196. package/dist/test/test-ayuda.d.ts +1 -0
  197. package/dist/test/test-ayuda.js +183 -0
  198. package/dist/test/test-caches-rea.d.ts +1 -0
  199. package/dist/test/test-caches-rea.js +243 -0
  200. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  201. package/dist/test/test-helpers-casilleros.js +154 -0
  202. package/dist/test/test-helpers-formulario.d.ts +1 -0
  203. package/dist/test/test-helpers-formulario.js +95 -0
  204. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  205. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  206. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  207. package/dist/test/test-menu-segun-rol.js +170 -0
  208. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  209. package/dist/test/test-setters-rea-no-rea.js +95 -0
  210. package/dist/test/test.d.ts +7 -0
  211. package/dist/test/test.js +9 -2
  212. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  213. package/dist/unlogged/helpers-casilleros.js +12 -18
  214. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  215. package/dist/unlogged/helpers-formulario.js +88 -0
  216. package/dist/unlogged/tipos.d.ts +20 -2
  217. package/dist/unlogged/tipos.js +1 -1
  218. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  219. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  220. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  221. package/dist/unlogged/unlogged/css/formulario-react.styl +9 -0
  222. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  223. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  224. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  225. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  226. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  227. package/dist/unlogged/unlogged/render-config.d.ts +5 -1
  228. package/dist/unlogged/unlogged/render-config.js +14 -1
  229. package/dist/unlogged/unlogged/render-formulario.d.ts +3 -6
  230. package/dist/unlogged/unlogged/render-formulario.js +71 -69
  231. package/dist/unlogged/unlogged/render-formulario.tsx +100 -57
  232. package/dist/unlogged/unlogged/render-general.d.ts +2 -0
  233. package/dist/unlogged/unlogged/render-general.js +2 -1
  234. package/dist/unlogged/unlogged/render-general.tsx +2 -1
  235. package/dist/unlogged/unlogged/render-init.d.ts +1 -0
  236. package/dist/unlogged/unlogged/render-init.js +9 -2
  237. package/dist/unlogged/unlogged/tipos.d.ts +93 -41
  238. package/dist/unlogged/unlogged/tipos.js +1 -1
  239. package/dist/unlogged/unlogged/unlogged.js +15 -2
  240. package/install/accion_cumple_condicion.sql +1 -1
  241. package/install/generador_accion_cumple_condicion.sql +2 -2
  242. package/install/tarea_cumple_condicion.sql +1 -1
  243. package/install/xcalcular_resultado_trg.sql +1 -1
  244. package/package.json +24 -18
  245. package/dist/server/server/table-no_rea copy.js +0 -38
  246. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  247. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  248. package/dist/unlogged/bypass-formulario.js +0 -1226
  249. package/dist/unlogged/redux-formulario.d.ts +0 -440
  250. package/dist/unlogged/redux-formulario.js +0 -324
  251. package/dist/unlogged/render-config.d.ts +0 -52
  252. package/dist/unlogged/render-config.js +0 -161
  253. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  254. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  255. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  256. package/dist/unlogged/unlogged/helpers.js +0 -129
  257. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  258. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -1,1226 +0,0 @@
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", "like-ar", "row-validator", "best-globals", "cast-error", "./tipos", "./render-config", "./redux-formulario", "./calculos-encuesta"], factory);
17
- }
18
- })(function (require, exports) {
19
- "use strict";
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.calcularPermiteBorrarBF = exports.calcularDisabledBF = exports.calcularActualBF = exports.getFormulariosForValuePkRaiz = exports.buscarFormulariosHijos = exports.getMainFormForVivienda = exports.defOperativo = exports.getFuncionValorar = exports.getFuncionHabilitar = exports.helpersCasilleros = exports.MAXCP = exports.ultimaVaribleVivienda = exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = exports.NO_CAMBIAR__SOLO_TRAER_STATUS = exports.getDatosByPass = exports.intentarBackup = exports.crearEncuesta = exports.hayDatosByPassAlmacenados = void 0;
22
- exports.setCalcularComodines = setCalcularComodines;
23
- exports.suscribirCambioVariable = suscribirCambioVariable;
24
- exports.desuscribirCambioVariable = desuscribirCambioVariable;
25
- exports.notificarCambioVariable = notificarCambioVariable;
26
- exports.setCalcularVariables = setCalcularVariables;
27
- exports.setCalcularVariablesEspecificasOperativo = setCalcularVariablesEspecificasOperativo;
28
- exports.setPersistirDatosByPass = setPersistirDatosByPass;
29
- exports.persistirDatosByPass = persistirDatosByPass;
30
- exports.setEncolarBackup = setEncolarBackup;
31
- exports.setEstructura = setEstructura;
32
- exports.setDatosByPass = setDatosByPass;
33
- exports.getFeedbackRowValidator = getFeedbackRowValidator;
34
- exports.getDirty = getDirty;
35
- exports.getEstructura = getEstructura;
36
- exports.registrarElemento = registrarElemento;
37
- exports.respuestasForPk = respuestasForPk;
38
- exports.volcadoInicialElementosRegistrados = volcadoInicialElementosRegistrados;
39
- exports.calcularElementoEnfocado = calcularElementoEnfocado;
40
- exports.setAttrDistinto = setAttrDistinto;
41
- exports.setValorDistinto = setValorDistinto;
42
- exports.accion_id_pregunta = accion_id_pregunta;
43
- exports.accion_registrar_respuesta = accion_registrar_respuesta;
44
- exports.accion_registrar_respuestas = accion_registrar_respuestas;
45
- exports.accion_registrar_nota = accion_registrar_nota;
46
- exports.accion_agregar_visita = accion_agregar_visita;
47
- exports.accion_modificar_visita = accion_modificar_visita;
48
- exports.accion_borrar_visita = accion_borrar_visita;
49
- exports.accion_agregar_formulario = accion_agregar_formulario;
50
- exports.accion_abrir_formulario = accion_abrir_formulario;
51
- exports.accion_borrar_formulario = accion_borrar_formulario;
52
- exports.dispatchByPass = dispatchByPass;
53
- exports.miniCompiladorSQlJs = miniCompiladorSQlJs;
54
- exports.getFuncionCompilada = getFuncionCompilada;
55
- exports.setCalculoReaNoRea = setCalculoReaNoRea;
56
- exports.verificarSorteo = verificarSorteo;
57
- exports.recalcularTodoElArbol = recalcularTodoElArbol;
58
- exports.calcularFeedbackUnidadAnalisis = calcularFeedbackUnidadAnalisis;
59
- exports.numberOrStringIncIfArray = numberOrStringIncIfArray;
60
- exports.calcularFeedbackHojaDeRuta = calcularFeedbackHojaDeRuta;
61
- exports.calcularFeedbackEncuesta = calcularFeedbackEncuesta;
62
- exports.calcularResumenVivienda = calcularResumenVivienda;
63
- const like_ar_1 = require("like-ar");
64
- const row_validator_1 = require("row-validator");
65
- const best_globals_1 = require("best-globals");
66
- const cast_error_1 = require("cast-error");
67
- const tipos_1 = require("./tipos");
68
- const render_config_1 = require("./render-config");
69
- const redux_formulario_1 = require("./redux-formulario");
70
- const calculos_encuesta_1 = require("./calculos-encuesta");
71
- var comodines = {};
72
- function setCalcularComodines(calcularComodines) {
73
- comodines.calcularComodines = calcularComodines;
74
- }
75
- var suscripcionesCambioVariable = [];
76
- function suscribirCambioVariable(listener, variables) {
77
- const varsSet = variables
78
- ? new Set(Array.isArray(variables) ? variables : [variables])
79
- : undefined;
80
- const sub = { listener, variables: varsSet };
81
- suscripcionesCambioVariable.push(sub);
82
- return () => {
83
- const index = suscripcionesCambioVariable.indexOf(sub);
84
- if (index > -1) {
85
- suscripcionesCambioVariable.splice(index, 1);
86
- }
87
- };
88
- }
89
- function desuscribirCambioVariable(listener) {
90
- const index = suscripcionesCambioVariable.findIndex(s => s.listener === listener);
91
- if (index > -1) {
92
- suscripcionesCambioVariable.splice(index, 1);
93
- }
94
- }
95
- function notificarCambioVariable(variable, valor, forPk, respuestasAumentadas) {
96
- for (let i = 0; i < suscripcionesCambioVariable.length; i++) {
97
- const { listener, variables } = suscripcionesCambioVariable[i];
98
- if (variables) {
99
- let aplica = variables.has(variable);
100
- if (!aplica && respuestasAumentadas) {
101
- for (const v of variables) {
102
- if (v in respuestasAumentadas) {
103
- aplica = true;
104
- break;
105
- }
106
- }
107
- }
108
- if (!aplica)
109
- continue;
110
- }
111
- try {
112
- listener(variable, valor, forPk, respuestasAumentadas);
113
- }
114
- catch (err) {
115
- console.error('Error en listener de cambio de variable', err);
116
- }
117
- }
118
- }
119
- var especiales = {};
120
- function setCalcularVariables(calcularVariables) {
121
- especiales.calcularVariables = calcularVariables;
122
- }
123
- function setCalcularVariablesEspecificasOperativo(calcularVariablesEspecificasOperativo) {
124
- especiales.calcularVariablesEspecificasOperativo = calcularVariablesEspecificasOperativo;
125
- }
126
- var datosByPass = {};
127
- const hayDatosByPassAlmacenados = () => datosByPass && Object.keys(datosByPass).length > 0;
128
- exports.hayDatosByPassAlmacenados = hayDatosByPassAlmacenados;
129
- function getRect(element) {
130
- var rect = { top: 0, left: 0, width: element.offsetWidth, height: element.offsetHeight };
131
- var current = element;
132
- while (current != null) {
133
- rect.top += current.offsetTop;
134
- rect.left += current.offsetLeft;
135
- current = current.offsetParent;
136
- }
137
- return rect;
138
- }
139
- //@ts-ignore arranca en blanco
140
- var estructura = null;
141
- let persistirDatosByPassInterno = () => {
142
- throw new Error('persistirDatosByPass SIN DEFINIR');
143
- };
144
- function setPersistirDatosByPass(persistirDatosByPassFun) {
145
- persistirDatosByPassInterno = persistirDatosByPassFun;
146
- }
147
- function persistirDatosByPass(dbpp) {
148
- return __awaiter(this, void 0, void 0, function* () {
149
- yield (0, render_config_1.getFormRenderer)().persistirDatos(dbpp);
150
- datosByPass.dirty = false;
151
- refrescarMarcaDirty();
152
- });
153
- }
154
- const crearEncuesta = (idCarga, callBack) => {
155
- const NEXT_AUTO_VALUE_PK_RAIZ = (0, render_config_1.getFormRenderer)().getUltimoValorPkRaiz() || '-1';
156
- const estructura = getEstructura();
157
- (0, render_config_1.getFormRenderer)().setUltimoValorPkRaiz((Number(NEXT_AUTO_VALUE_PK_RAIZ) - 1).toString());
158
- datosByPass.respuestas[estructura.uaPpal][NEXT_AUTO_VALUE_PK_RAIZ] = {};
159
- datosByPass.informacionHdr[NEXT_AUTO_VALUE_PK_RAIZ] = Object.assign(Object.assign({}, estructura.defaultInformacionHdr), { tem: Object.assign({}, estructura.defaultInformacionHdr.tem) });
160
- datosByPass.informacionHdr[NEXT_AUTO_VALUE_PK_RAIZ].tem.carga = idCarga;
161
- calcularFeedbackHojaDeRuta();
162
- persistirDatosByPass(datosByPass).then(() => callBack({
163
- formulario: estructura.defaultInformacionHdr.tarea.main_form,
164
- [estructura.pkAgregadaUaPpal]: Number(NEXT_AUTO_VALUE_PK_RAIZ)
165
- })); //no quitar el casteo porque viene como texto y necesito que sea número
166
- };
167
- exports.crearEncuesta = crearEncuesta;
168
- function setEncolarBackup(encolarBackupFun) {
169
- encolarBackup = encolarBackupFun;
170
- }
171
- let encolarBackup = () => {
172
- throw new Error("SIN ESPECIFICAR encolarBackup");
173
- };
174
- var intentarBackup = (forPk) => {
175
- var { respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true);
176
- var token = datosByPass.token;
177
- if (token) {
178
- encolarBackup(token, forPkRaiz, respuestasRaiz);
179
- }
180
- else {
181
- console.log("no hay token, no se pudo hacer el backup");
182
- }
183
- };
184
- exports.intentarBackup = intentarBackup;
185
- function setEstructura(estructuraACargar) {
186
- var _a;
187
- estructura = (0, redux_formulario_1.adaptarEstructura)(estructuraACargar);
188
- exports.defOperativo.UAprincipal = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find(ua => !!ua.principal)) === null || _a === void 0 ? void 0 : _a.unidad_analisis;
189
- exports.defOperativo.defFor = (0, like_ar_1.strict)(estructura.formularios).map(f => ({ hermano: f.casilleros.hermano })).plain();
190
- exports.defOperativo.defUA = (0, like_ar_1.strict)(estructura.unidades_analisis).map((uaDef, ua) => ({
191
- pk: uaDef.pk_agregada,
192
- incluidas: (0, like_ar_1.strict)(uaDef.hijas).keys(),
193
- idsFor: (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == ua).keys()
194
- })).plain();
195
- return estructura;
196
- }
197
- function setDatosByPass(nuevoPaquete) {
198
- datosByPass = Object.assign(Object.assign({ dirty: false }, nuevoPaquete), { feedbackRowValidator: {} });
199
- calcularFeedbackHojaDeRuta();
200
- }
201
- var getDatosByPass = () => datosByPass;
202
- exports.getDatosByPass = getDatosByPass;
203
- function objetoVacio(o) {
204
- for (var k in o) {
205
- return false;
206
- }
207
- return true;
208
- }
209
- function getFeedbackRowValidator() {
210
- if (!datosByPass.feedbackRowValidator || objetoVacio(datosByPass.feedbackRowValidator)) {
211
- calcularFeedbackHojaDeRuta();
212
- }
213
- return datosByPass.feedbackRowValidator;
214
- }
215
- function getDirty() {
216
- return datosByPass.dirty;
217
- }
218
- function getEstructura() {
219
- return estructura;
220
- }
221
- var registroElementosGlobal = {};
222
- function registrarElemento(def) {
223
- // @ts-ignore Sí, podría ser que los tipos de T sean distintos, pero van a ser coherentes
224
- var registroElementos = registroElementosGlobal;
225
- registroElementos[def.id] = def;
226
- }
227
- function respuestasForPk(forPk, conAumentadas, agregarSiFalta) {
228
- var respuestasAumentadas = {};
229
- // @ts-expect-error lo que sobrar de respuestas no me importa...
230
- var respuestas = datosByPass.respuestas;
231
- var respuestasRaiz;
232
- var forPkRaiz;
233
- var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
234
- var forPkApilada = forPk;
235
- var pila = [];
236
- while (unidad_analisis) {
237
- var uaDef = estructura.unidades_analisis[unidad_analisis];
238
- pila.push([unidad_analisis, uaDef, forPkApilada]);
239
- forPkApilada = Object.assign({}, forPkApilada);
240
- delete forPkApilada[uaDef.pk_agregada];
241
- unidad_analisis = uaDef.padre;
242
- }
243
- while (pila.length) {
244
- [unidad_analisis, uaDef, forPkApilada] = pila.pop();
245
- var valorPkOPosicion = forPkApilada[uaDef.pk_agregada];
246
- if (valorPkOPosicion == undefined) {
247
- throw new Error(`falta un valor para ${JSON.stringify(uaDef.pk_agregada)}`);
248
- }
249
- if (respuestas[unidad_analisis] == null) {
250
- respuestas[unidad_analisis] = [];
251
- }
252
- var respuestasAnterior = respuestas;
253
- let posicion = respuestas[unidad_analisis] instanceof Array ? valorPkOPosicion - 1 : valorPkOPosicion;
254
- respuestas = respuestas[unidad_analisis][posicion];
255
- if (respuestas == null) {
256
- if (agregarSiFalta) {
257
- respuestas = {};
258
- respuestasAnterior[unidad_analisis][posicion] = respuestas;
259
- persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
260
- }
261
- else {
262
- throw new Error(`No existe el elemento '${posicion}' en la unidad_analisis '${unidad_analisis}'`);
263
- }
264
- }
265
- forPkRaiz || (forPkRaiz = forPkApilada);
266
- // @ts-expect-error Sé que es raíz por cómo estoy revolviendo la pila
267
- respuestasRaiz || (respuestasRaiz = respuestas);
268
- if (conAumentadas) {
269
- respuestasAumentadas = Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestas), { [uaDef.pk_agregada]: valorPkOPosicion });
270
- }
271
- }
272
- return {
273
- respuestas, respuestasAumentadas,
274
- // @ts-ignore Sé que la pila tiene al menos un elemento por lo tanto esto está lleno seguro.
275
- respuestasRaiz, forPkRaiz, unidadAnalisis: uaDef
276
- };
277
- }
278
- function volcadoInicialElementosRegistrados(forPkRaiz) {
279
- var { respuestasAumentadas } = respuestasForPk(forPkRaiz, true);
280
- var registroElementos = registroElementosGlobal;
281
- var plainForPk = (0, tipos_1.toPlainForPk)(forPkRaiz);
282
- var rowValidator = datosByPass.feedbackRowValidator[plainForPk];
283
- for (var id in registroElementos) {
284
- var def = registroElementos[id];
285
- if (def.elemento) {
286
- if (!document.body.contains(def.elemento)) {
287
- def.elemento = undefined;
288
- }
289
- }
290
- if (!def.elemento) {
291
- def.elemento = document.getElementById(def.id);
292
- }
293
- if (!def.elemento) {
294
- // console.log('BUSCANDO el elemento registrado ',id,'no está en el DOM')
295
- continue;
296
- }
297
- var value = def.fun(respuestasAumentadas, rowValidator, def.elemento, datosByPass.feedbackRowValidator, estructura);
298
- if ('prop' in def) {
299
- setValorDistinto(def.elemento, def.prop, value);
300
- }
301
- if ('attr' in def) {
302
- setAttrDistinto(def.elemento, def.attr, value);
303
- }
304
- if ('style' in def) {
305
- setValorDistinto(def.elemento.style, def.style, value);
306
- }
307
- }
308
- if (rowValidator.actual) {
309
- var { top, bottom } = calcularElementoEnfocado(rowValidator.actual);
310
- if (top != null && bottom != null) {
311
- // @ts-ignore
312
- document.getElementById('fab-activo-arriba').elTopVisibilizar = top;
313
- // @ts-ignore
314
- document.getElementById('fab-activo-abajo').elBottomVisibilizar = bottom;
315
- }
316
- }
317
- }
318
- function calcularElementoEnfocado(idVariable) {
319
- var _a;
320
- var elementoVariableAEnfocar = document.getElementById(idVariable == 'fin' ? `boton-volver-2` : `var-${idVariable}`)
321
- || document.getElementById(idVariable);
322
- var elemento = elementoVariableAEnfocar;
323
- var MARGEN_SCROLL = 64;
324
- var altoPantalla = window.innerHeight * 0.7 - MARGEN_SCROLL;
325
- var elementoEntero = null; // es el elemento que va a entar entero en pantalla, define el bottom
326
- var rectElementoEntero = null;
327
- var elementoSuperior = null; // es el elemento que va a mostrarse desde arriba aunque no entre entero, define el top
328
- var rectElementoSuperior = null;
329
- while (elemento != null) {
330
- if ((elemento.classList.contains('variable')
331
- || elemento.classList.contains('multiple')
332
- || elemento.classList.contains('pregunta')
333
- || elemento.classList.contains('conjuntopreguntas')
334
- || elemento.classList.contains('seccion-boton-formulario')
335
- || elemento.classList.contains('botonformulario')
336
- || elemento.classList.contains('boton-volver')) && elemento.offsetHeight > 0) {
337
- if (elementoSuperior == null && elemento.clientHeight < altoPantalla) {
338
- elementoEntero = elemento;
339
- }
340
- else {
341
- if (elementoEntero == null)
342
- elementoEntero = elemento;
343
- if (rectElementoEntero == null) {
344
- elementoSuperior = elementoEntero;
345
- rectElementoEntero = getRect(elementoEntero);
346
- rectElementoSuperior = rectElementoEntero;
347
- }
348
- var rect = getRect(elemento);
349
- if (rectElementoEntero.top + rectElementoEntero.height - rect.top < altoPantalla) {
350
- elementoSuperior = elemento;
351
- rectElementoSuperior = rect;
352
- }
353
- else {
354
- elemento = null;
355
- }
356
- }
357
- }
358
- elemento = (_a = elemento === null || elemento === void 0 ? void 0 : elemento.parentElement) !== null && _a !== void 0 ? _a : null;
359
- }
360
- if (elementoSuperior == null) {
361
- elementoSuperior = elementoEntero;
362
- }
363
- var result = {};
364
- if (elementoEntero != null) {
365
- if (rectElementoEntero == null) {
366
- rectElementoEntero = getRect(elementoEntero);
367
- }
368
- result.elementoInputVariable = elementoVariableAEnfocar;
369
- var top = (rectElementoSuperior !== null && rectElementoSuperior !== void 0 ? rectElementoSuperior : rectElementoEntero).top - MARGEN_SCROLL;
370
- result.top = top;
371
- result.bottom = rectElementoEntero.top + rectElementoEntero.height;
372
- if (top < document.documentElement.scrollTop) {
373
- result.desenfoque = 'arriba';
374
- }
375
- else if (rectElementoEntero.top + rectElementoEntero.height > document.documentElement.scrollTop + altoPantalla) {
376
- result.desenfoque = 'abajo';
377
- }
378
- else {
379
- result.enfocado = true;
380
- }
381
- }
382
- return result;
383
- }
384
- function setAttrDistinto(objeto, name, valor) {
385
- if (objeto && objeto.getAttribute(name) != valor) {
386
- objeto.setAttribute(name, valor);
387
- }
388
- }
389
- function setValorDistinto(objeto, name, valor) {
390
- if (objeto[name] != valor) {
391
- objeto[name] = valor;
392
- }
393
- }
394
- function calcularVariablesBotonFormulario(forPk) {
395
- if (estructura.habilitacionBotonFormulario && !(datosByPass === null || datosByPass === void 0 ? void 0 : datosByPass.soloLectura)) {
396
- var { respuestas } = respuestasForPk(forPk);
397
- (0, like_ar_1.strict)(estructura.habilitacionBotonFormulario)
398
- .forEach((configBotonFormulario, idFormulario) => {
399
- var respUA = respuestas[estructura.habilitacionBotonFormulario[idFormulario].unidad_analisis];
400
- if (respUA != null && respUA instanceof Array) {
401
- if (!configBotonFormulario.habilitar_agregar_listo) {
402
- respuestas['$B.' + idFormulario] = 'ok';
403
- }
404
- }
405
- });
406
- }
407
- }
408
- ;
409
- function accion_id_pregunta(_payload, _datosByPass) {
410
- }
411
- exports.NO_CAMBIAR__SOLO_TRAER_STATUS = Symbol('NO_CAMBIAR_SOLO_TRAER_STATUS');
412
- exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = Symbol('NO_CAMBIAR_VERIFICAR_SI_ES_NECESARIO');
413
- function refrescarMarcaDirty() {
414
- var botonGrabar = document.getElementById("save-button");
415
- if (botonGrabar) {
416
- if (botonGrabar.disabled !== !datosByPass.dirty) {
417
- botonGrabar.disabled = !datosByPass.dirty;
418
- }
419
- }
420
- }
421
- function aplicarCambioUnaRespuesta(forPk, respuestas, variable, respuestaInput) {
422
- var _a;
423
- var respuesta = respuestaInput;
424
- var valorAnterior = respuestas[variable];
425
- if (respuesta === '') {
426
- respuesta = null;
427
- }
428
- else if (((_a = estructura.formularios[forPk.formulario].estructuraRowValidator.variables[variable]) === null || _a === void 0 ? void 0 : _a.tipo) == 'numero') {
429
- if (respuesta != null) {
430
- respuesta = Number(respuesta);
431
- }
432
- }
433
- // si es un falsy (0 == false) tengo que comparar con !==
434
- var recentModified = respuesta ? valorAnterior != respuesta : valorAnterior !== respuesta;
435
- if (recentModified) {
436
- respuestas[variable] = respuesta !== null && respuesta !== void 0 ? respuesta : null; // cambio undefined por null
437
- }
438
- return { recentModified, valorAnterior, respuestaProcesada: respuesta };
439
- }
440
- function refrescarYRecalcularBypass(forPk, respuestas, respuestasRaiz, forPkRaiz, variablesModificadas, recentModified) {
441
- recalcularTodoElArbol(respuestasRaiz, forPkRaiz);
442
- recalcularComodinesForPk(forPk);
443
- if (estructura.configSorteo && !(datosByPass === null || datosByPass === void 0 ? void 0 : datosByPass.soloLectura)) {
444
- for (var i = 0; i < variablesModificadas.length; i++) {
445
- verificarSorteo({
446
- configuracionSorteo: estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPk[estructura.pkAgregadaUaPpal])],
447
- respuestas,
448
- respuestasRaiz,
449
- variableActual: variablesModificadas[i],
450
- forPk: forPk
451
- });
452
- }
453
- }
454
- datosByPass.dirty = datosByPass.dirty || recentModified;
455
- respuestasRaiz.$dirty = respuestasRaiz.$dirty || recentModified;
456
- refrescarMarcaDirty();
457
- calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
458
- var feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
459
- calcularVariablesBotonFormulario(forPk);
460
- volcadoInicialElementosRegistrados(forPk);
461
- const { respuestasAumentadas } = respuestasForPk(forPk, true);
462
- for (var j = 0; j < variablesModificadas.length; j++) {
463
- var v = variablesModificadas[j];
464
- notificarCambioVariable(v, respuestasAumentadas[v], forPk, respuestasAumentadas);
465
- }
466
- persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
467
- return feedbackRow;
468
- }
469
- function recalcularComodinesForPk(forPk) {
470
- if (comodines.calcularComodines) {
471
- comodines.calcularComodines(forPk);
472
- }
473
- }
474
- function accion_registrar_respuesta(payload, _datosByPass) {
475
- var _a, _b, _c, _d;
476
- let token = 'AVERIGUAR TODO';
477
- let { forPk, respuesta, variable } = payload;
478
- var { respuestas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk);
479
- var unidad_analisis = estructura.formularios[forPk.formulario];
480
- var recentModified = false;
481
- var valorAnterior = variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS ? respuestas[variable] : null;
482
- var feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
483
- var siguienteVariable;
484
- if (respuesta !== exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS) {
485
- var resCambio = aplicarCambioUnaRespuesta(forPk, respuestas, variable, respuesta);
486
- recentModified = resCambio.recentModified;
487
- if (!recentModified) {
488
- siguienteVariable = (_a = feedbackRow.feedback[variable]) === null || _a === void 0 ? void 0 : _a.siguiente;
489
- }
490
- }
491
- if (variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS && (recentModified || exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && ((_b = feedbackRow.autoIngresadas) === null || _b === void 0 ? void 0 : _b[variable]))) {
492
- feedbackRow = refrescarYRecalcularBypass(forPk, respuestas, respuestasRaiz, forPkRaiz, [variable], recentModified);
493
- siguienteVariable = variable;
494
- do {
495
- siguienteVariable = (_c = feedbackRow.feedback[siguienteVariable]) === null || _c === void 0 ? void 0 : _c.siguiente;
496
- } while (valorAnterior == null && recentModified && siguienteVariable != null && siguienteVariable != 'fin' && estructura.formularios[forPk.formulario].estructuraRowValidator.variables[siguienteVariable].funcionAutoIngresar);
497
- if (siguienteVariable == null && ((_d = feedbackRow.feedback[variable]) === null || _d === void 0 ? void 0 : _d.estado) == 'valida') {
498
- siguienteVariable = 'fin';
499
- }
500
- }
501
- return { recentModified, siguienteVariable, variableActual: feedbackRow.actual };
502
- }
503
- function accion_registrar_respuestas(payload, _datosByPass) {
504
- let { forPk, respuestas: listaRespuestas } = payload;
505
- var { respuestas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk);
506
- var recentModifiedAny = false;
507
- var variablesModificadas = [];
508
- for (var i = 0; i < listaRespuestas.length; i++) {
509
- var item = listaRespuestas[i];
510
- var resCambio = aplicarCambioUnaRespuesta(forPk, respuestas, item.variable, item.respuesta);
511
- if (resCambio.recentModified) {
512
- recentModifiedAny = true;
513
- variablesModificadas.push(item.variable);
514
- }
515
- }
516
- if (recentModifiedAny && variablesModificadas.length > 0) {
517
- refrescarYRecalcularBypass(forPk, respuestas, respuestasRaiz, forPkRaiz, variablesModificadas, recentModifiedAny);
518
- }
519
- return { recentModified: recentModifiedAny };
520
- }
521
- function accion_registrar_nota(payload, _datosByPass) {
522
- let { forPkRaiz, tarea, nota } = payload;
523
- console.log("FALTA // TODO");
524
- }
525
- function accion_agregar_visita(payload, _datosByPass) {
526
- let { forPkRaiz, observaciones } = payload;
527
- }
528
- function accion_modificar_visita(payload, _datosByPass) {
529
- let { forPkRaiz, index, opcion, valor } = payload;
530
- }
531
- function accion_borrar_visita(payload, _datosByPass) {
532
- let { forPkRaiz, index } = payload;
533
- }
534
- function accion_agregar_formulario({ forPk }, _datosByPass) {
535
- var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true, true);
536
- recalcularTodoElArbol(respuestasRaiz, forPkRaiz);
537
- recalcularComodinesForPk(forPk);
538
- calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
539
- calcularVariablesBotonFormulario(forPk);
540
- persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
541
- }
542
- function accion_abrir_formulario({ forPk }, _datosByPass) {
543
- var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true, true);
544
- recalcularTodoElArbol(respuestasRaiz, forPkRaiz);
545
- recalcularComodinesForPk(forPk);
546
- calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
547
- calcularVariablesBotonFormulario(forPk);
548
- persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
549
- }
550
- function accion_borrar_formulario({ forPk, forPkPadre }) {
551
- var { respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true, true);
552
- var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
553
- var uaDef = estructura.unidades_analisis[unidad_analisis];
554
- var index = forPk[uaDef.pk_agregada];
555
- var { respuestas: respuestasPadre } = respuestasForPk(forPkPadre, true, true);
556
- respuestasPadre[unidad_analisis].splice(index - 1, 1);
557
- recalcularTodoElArbol(respuestasRaiz, forPkRaiz);
558
- recalcularComodinesForPk(forPkPadre);
559
- datosByPass.dirty = datosByPass.dirty || true;
560
- respuestasRaiz.$dirty = respuestasRaiz.$dirty || true;
561
- refrescarMarcaDirty();
562
- calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
563
- calcularVariablesBotonFormulario(forPkPadre);
564
- volcadoInicialElementosRegistrados(forPkPadre);
565
- persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
566
- }
567
- function dispatchByPass(fun, payload) {
568
- return fun(payload, datosByPass);
569
- }
570
- //////////////////////////////////////////////////////////////////////////
571
- exports.ultimaVaribleVivienda = 'NO_ESTA_DEFINIDA_AUN//TODO';
572
- exports.MAXCP = 20;
573
- /* REDUCERS */
574
- var reemplazosHabilitar = {
575
- false: 'false',
576
- true: 'true',
577
- "=": '==',
578
- "<>": '!=',
579
- "&": '&&',
580
- "|": '||',
581
- "OR": '||',
582
- "AND": '&&',
583
- "or": '||',
584
- "and": '&&',
585
- "not": '!',
586
- "NOT": '!',
587
- };
588
- exports.helpersCasilleros = {
589
- null2zero(posibleNull) {
590
- if (posibleNull == null) {
591
- return 0;
592
- }
593
- return posibleNull;
594
- },
595
- div0err(numerador, denominador, pk) {
596
- if (denominador == 0) {
597
- throw new Error("Error en " + pk + " division por cero de " + numerador);
598
- }
599
- return numerador / denominador;
600
- },
601
- funs: {
602
- blanco(x) {
603
- return x !== 0 && !x;
604
- },
605
- hoy() {
606
- return best_globals_1.date.today().toDmy();
607
- },
608
- fecha_valida(x) {
609
- var formato_valido = /^([1-9]|0[1-9]|[12]\d|3[01])\/([1-9]|0[1-9]|1[012])\/20\d\d$/.test(x);
610
- var xDate;
611
- var conversionOk;
612
- conversionOk = true;
613
- if (formato_valido) {
614
- const [d, m, y] = x.split('/');
615
- try {
616
- xDate = new Date(`${y}/${m}/${d}`);
617
- }
618
- catch (err) {
619
- conversionOk = false;
620
- }
621
- }
622
- ;
623
- //faltaria validar que no sea una fecha futura y que sea una fecha en el rango del operativo
624
- return formato_valido && conversionOk;
625
- },
626
- mesanio_valido(x) {
627
- var formato_valido = /^([1-9]|0[1-9]|1[012])\/(19|20)\d\d$/.test(x);
628
- return formato_valido;
629
- },
630
- informado(x) {
631
- return x !== undefined && x !== null && (!(x instanceof Array) || x.length !== 0)
632
- && (!(x instanceof Object) || Object.keys(x).length !== 0);
633
- },
634
- nsnc(x) {
635
- return x == -9;
636
- },
637
- par(x) {
638
- return x % 2 == 0;
639
- },
640
- edad_mes_annio_valido(edad, mesAnnio, fechaRealizacionDDMMYYYY) {
641
- var mesesDiferencia = (d1, d2) => {
642
- var months;
643
- months = (d2.getFullYear() - d1.getFullYear()) * 12;
644
- months -= d1.getMonth();
645
- months += d2.getMonth();
646
- return months <= 0 ? 0 : months;
647
- };
648
- var partesRealizacion = fechaRealizacionDDMMYYYY.split("/");
649
- //@ts-ignore las partes corresponden a una fecha válida
650
- var today = best_globals_1.date.ymd(Number(partesRealizacion[2]), Number(partesRealizacion[1]), Number(partesRealizacion[0]));
651
- var partesMesAnnio = mesAnnio.split('/');
652
- //@ts-ignore las partes corresponden a una fecha válida
653
- var nacimiento = best_globals_1.date.ymd(Number(partesMesAnnio[1]), Number(partesMesAnnio[0]), 1);
654
- //@ts-ignore RealDate es Date y se puede restar
655
- var diferenciaMeses = mesesDiferencia(nacimiento, today);
656
- var edadDecimales = diferenciaMeses / 12; //ej 36.5
657
- return (Math.floor(edadDecimales) == edad || //misma edad
658
- edadDecimales == edad + 1 //mes de tolerancia
659
- );
660
- },
661
- //copiar_campo_ua_rama(respuestasOrigen:Respuestas[], posicion:number, variableOrigen: IdVariable, camino:string, condicion:boolean){
662
- // return condicion?(respuestasOrigen && respuestasOrigen[posicion-1] && respuestasOrigen[posicion-1][`${camino}`][variableOrigen]):null
663
- // return condicion?eval(`respuestasOrigen[${posicion-1}].`+camino+'.'+variableOrigen):null;
664
- //}
665
- /*
666
- dbo:{
667
- datoFamiliar(encu:string,hog:number,per:number, dato:string){
668
- var xpersonas=personas;
669
- return encu==enc && hog==hogar && informado(xpersonas) && per<= xpersonas.length && per>=1 && !!xpersonas[per-1][dato]? xpersonas[per-1][dato]:null
670
- },
671
- edadfamiliar(encu:string,hog:number,per:number){
672
- var xpersonas=personas;
673
- return datoFamiliar(encu:string,hog:number,per:number,'edad')
674
- },
675
- existeindividual(encu:string,hog:number,per:number){
676
- var xpersonas=personas;
677
- return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1 && !!personas[per-1]['entreaind']
678
- },
679
- existemiembro(encu:string,hog:number,per:number){
680
- var xpersonas=personas;
681
- return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1
682
- },
683
- nroconyuges(encu:string,hog:number){
684
- var xpersonas=personas
685
- return xpersonas.filter( per->per.p4==2).length
686
- },
687
- nrojefes(encu:string,hog:number,per:number){
688
- return personas.filter( per->per.p4==1).length
689
- },
690
- parentescofamiliar(encu:string,hog:number,per:number){
691
- return datoFamiliar(encu:string,hog:number,per:number,'p4')
692
- },
693
- sexofamiliar(encu:string,hog:number,per:number){
694
- var xpersonas=personas;
695
- return encu==enc && hog==hogar && !!xpersonas && per<= xpersonas.length && per>=1 && !!xpersonas[per-1].sexo? xpersonas[per-1]['sexo']:null
696
- },
697
- sitconyjefe(encu:string,hog:number){
698
- return datoFamiliar(encu:string,hog:number,1,'p5')
699
- }
700
- } */
701
- }
702
- };
703
- var funcionesHabilitar = {};
704
- var funcionesValorar = {};
705
- function miniCompiladorSQlJs(expresionCasiSQL) {
706
- var expresion = expresionCasiSQL.replace(/\u00A0/g, ' ');
707
- var cuerpo = expresion.replace(/\bis distinct from\b/gi, '!=').replace(/\b.+?\b/g, function (elToken) {
708
- var elTokenTrimeado = elToken.trim();
709
- if (elTokenTrimeado in reemplazosHabilitar) {
710
- return reemplazosHabilitar[elTokenTrimeado];
711
- }
712
- else if (/^\d+\.?\d*$/.test(elTokenTrimeado)) {
713
- return elToken;
714
- }
715
- else if (/^\W+$/.test(elTokenTrimeado)) {
716
- return elToken;
717
- }
718
- else if (/^\s+$/.test(elToken)) {
719
- return elToken;
720
- }
721
- return 'helpers.null2zero(valores.' + elToken + ')';
722
- });
723
- return cuerpo;
724
- }
725
- function getFuncionCompilada(conjuntoDeFunciones) {
726
- return function (nombreFuncionComoExpresionJs) {
727
- if (!conjuntoDeFunciones[nombreFuncionComoExpresionJs]) {
728
- var cuerpo = nombreFuncionComoExpresionJs;
729
- try {
730
- // var cuerpo = miniCompiladorSQlJs(nombreFuncionComoExpresionJs);
731
- var internalFun = new Function('valores', 'helpers', 'return ' + cuerpo);
732
- conjuntoDeFunciones[nombreFuncionComoExpresionJs] = function (valores) {
733
- try {
734
- var result = internalFun(valores, exports.helpersCasilleros);
735
- }
736
- catch (err) {
737
- console.log('ERROR EJECUCCION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs, (0, cast_error_1.expected)(err));
738
- console.log(cuerpo);
739
- console.log(valores);
740
- throw err;
741
- }
742
- return result;
743
- };
744
- }
745
- catch (err) {
746
- console.log('ERROR COMPILACION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs, (0, cast_error_1.expected)(err));
747
- console.log(cuerpo);
748
- throw err;
749
- }
750
- }
751
- return conjuntoDeFunciones[nombreFuncionComoExpresionJs];
752
- };
753
- }
754
- exports.getFuncionHabilitar = getFuncionCompilada(funcionesHabilitar);
755
- exports.getFuncionValorar = getFuncionCompilada(funcionesValorar);
756
- const evaluarExpresionRea = (condicionJs, respuestas) => (0, exports.getFuncionHabilitar)(condicionJs)(respuestas);
757
- var rowValidator = (0, row_validator_1.getRowValidator)({ getFuncionHabilitar: exports.getFuncionHabilitar, getFuncionValorar: exports.getFuncionValorar });
758
- exports.defOperativo = {
759
- esNoRea: (respuestas, tarea) => {
760
- const estructura = getEstructura();
761
- const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
762
- let result = {
763
- codNoRea: null,
764
- esNoRea: false
765
- };
766
- const { codRea, esRea } = exports.defOperativo.esRealizada(respuestas, tarea);
767
- if (!esRea) {
768
- const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.noReas, 'no_rea', tarea);
769
- if (codigo !== null) {
770
- result.codNoRea = codigo;
771
- result.esNoRea = resultado;
772
- }
773
- }
774
- return result;
775
- },
776
- esNoReaSup: (respuestas, tarea) => {
777
- const estructura = getEstructura();
778
- const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
779
- let result = {
780
- codNoReaSup: null,
781
- esNoReaSup: false
782
- };
783
- const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.noReasSup, 'no_rea_sup', tarea);
784
- if (codigo !== null) {
785
- result.codNoReaSup = codigo;
786
- result.esNoReaSup = resultado;
787
- }
788
- return result;
789
- },
790
- esRealizada: (respuestas, tarea) => {
791
- const estructura = getEstructura();
792
- const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
793
- let result = {
794
- codRea: null,
795
- esRea: false
796
- };
797
- const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.reas, 'rea', tarea, evaluarExpresionRea);
798
- if (codigo !== null) {
799
- result.codRea = codigo;
800
- result.esRea = resultado;
801
- }
802
- return result;
803
- },
804
- esRealizadaSup: (respuestas, tarea) => {
805
- const estructura = getEstructura();
806
- const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
807
- let result = {
808
- codReaSup: null,
809
- esReaSup: false
810
- };
811
- const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.reasSup, 'rea_sup', tarea, evaluarExpresionRea);
812
- if (codigo !== null) {
813
- result.codReaSup = codigo;
814
- result.esReaSup = resultado;
815
- }
816
- return result;
817
- },
818
- UAprincipal: '',
819
- defUA: {},
820
- defFor: {}
821
- };
822
- // 3. Implementación unificada
823
- function setCalculoReaNoRea(esNoReaOrFunciones, _esNoReaSup, _esRealizada, _esRealizadaSup) {
824
- if (typeof esNoReaOrFunciones === 'function') {
825
- console.warn("setCalculoReaNoRea: la forma antigua está deprecada, se ignoran sobrescrituras, usar setCalculoReaNoRea({ esNoRea, esNoReaSup, esRealizada, esRealizadaSup })");
826
- }
827
- else {
828
- exports.defOperativo = Object.assign(Object.assign({}, exports.defOperativo), esNoReaOrFunciones);
829
- }
830
- }
831
- function num(num) {
832
- //@ts-ignore la gracia es meter num cuando es string
833
- if (isNaN(num - 0))
834
- return 0;
835
- //@ts-ignore la gracia es meter num cuando es string
836
- return num - 0;
837
- }
838
- var funcionesConocidas = {};
839
- function verificarSorteo(opts) {
840
- var _a, _b, _c;
841
- const resetearSorteo = (opts) => {
842
- var _a;
843
- var { respuestas } = opts;
844
- respuestas[configuracionSorteo.resultado] = null;
845
- respuestas[configuracionSorteo.cantidad_sorteables] = null;
846
- respuestas[configuracionSorteo.disparador] = null;
847
- (_a = configuracionSorteo.sorteado_mostrar) === null || _a === void 0 ? void 0 : _a.forEach((mostrar) => respuestas[mostrar.target] = null);
848
- if ('var_letra' in configuracionSorteo.param_metodo) {
849
- if (respuestas[unidadAnalisis] && respuestas[unidadAnalisis] instanceof Array) {
850
- for (var per of (0, tipos_1.iterator)(respuestas[unidadAnalisis])) {
851
- per[configuracionSorteo.param_metodo.var_letra] = null;
852
- }
853
- }
854
- }
855
- };
856
- var { configuracionSorteo, variableActual, respuestas, forPk, respuestasRaiz } = opts;
857
- var idEnc = forPk[estructura.pkAgregadaUaPpal];
858
- var { respuestasAumentadas, respuestasRaiz } = respuestasForPk(forPk, true);
859
- var expr_incompletitud_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.expr_incompletitud_js[respuestasAumentadas.vdominio].expr);
860
- var filtro_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.filtro_js[respuestasAumentadas.vdominio].expr);
861
- var unidadAnalisis = configuracionSorteo.unidad_analisis;
862
- if (configuracionSorteo.parametros.includes(variableActual)) {
863
- var uaPadre = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == unidadAnalisis)) === null || _a === void 0 ? void 0 : _a.padre;
864
- var pkAgregadaPadre = (_b = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == uaPadre)) === null || _b === void 0 ? void 0 : _b.pk_agregada;
865
- if (estructura.conReaHogar) {
866
- if (uaPadre && respuestasAumentadas[uaPadre]) {
867
- //@ts-ignore pkAgregadaPadre existe e indica la posicion del padre
868
- var padre = respuestasAumentadas[uaPadre][Number(respuestasAumentadas[pkAgregadaPadre]) - 1];
869
- if (variableActual != configuracionSorteo.cantidad_total) {
870
- padre[configuracionSorteo.cantidad_total] = (0, like_ar_1.strict)(padre[unidadAnalisis] || []).array().length; //si agrega desde boton agregar
871
- }
872
- resetearSorteo({ respuestas: padre });
873
- respuestas = padre;
874
- }
875
- }
876
- else {
877
- if (uaPadre && respuestasRaiz) {
878
- //@ts-ignore pkAgregadaPadre existe e indica la posicion del padre
879
- var padre = respuestasRaiz;
880
- if (variableActual != configuracionSorteo.cantidad_total) {
881
- padre[configuracionSorteo.cantidad_total] = (0, like_ar_1.strict)(padre[unidadAnalisis] || []).array().length; //si agrega desde boton agregar
882
- }
883
- resetearSorteo({ respuestas: padre });
884
- respuestas = padre;
885
- }
886
- }
887
- }
888
- if (respuestas[unidadAnalisis] != null) {
889
- if (respuestas[unidadAnalisis] instanceof Array) {
890
- var respuestasUA = respuestas[unidadAnalisis];
891
- if (respuestas[configuracionSorteo.disparador] != 1) {
892
- if (respuestas[configuracionSorteo.disparador] == 2) {
893
- respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length + 1;
894
- }
895
- resetearSorteo({ respuestas });
896
- }
897
- let cantidadTotal = Number(respuestas[configuracionSorteo.cantidad_total]);
898
- if (cantidadTotal < respuestasUA.length) {
899
- // doble asignación para que lo cargue en respuestas
900
- respuestasUA = respuestasUA.filter((p, i) => configuracionSorteo.parametros.some((param) => p[param] || i <= cantidadTotal - 1));
901
- respuestas[unidadAnalisis] = respuestasUA;
902
- }
903
- while (cantidadTotal > respuestasUA.length) {
904
- respuestasUA.push({});
905
- }
906
- respuestas[configuracionSorteo.incompletas] = respuestasUA.filter(p => expr_incompletitud_fun(p)).length;
907
- var var$p0 = "$p0";
908
- if (respuestas[configuracionSorteo.disparador] == 1 &&
909
- !respuestas[configuracionSorteo.resultado] &&
910
- respuestas[configuracionSorteo.incompletas] == 0) {
911
- var sortear = respuestasUA.filter(p => filtro_fun(p));
912
- if (sortear.length) {
913
- respuestasUA.forEach((per, i) => per[var$p0] = i + 1);
914
- configuracionSorteo.orden.push({ variable: var$p0, orden: 1 });
915
- sortear.sort((0, best_globals_1.compareForOrder)(configuracionSorteo.orden.map(elem => ({ column: elem.variable, order: elem.orden }))));
916
- var posicionSorteada = null;
917
- if (configuracionSorteo.metodo == 'hash') {
918
- throw new Error('NO IMPLEMENTADO');
919
- /*posicionSorteada=(
920
- configuracionSorteo.param_metodo.var_coef.reduce(
921
- ((sum, pair)=>sum + datosVivienda.tem[pair.var] * pair.coef),
922
- 0
923
- ) % configuracionSorteo.param_metodo.divisor
924
- ) % sortear.length*/
925
- }
926
- else {
927
- var letra = 'A';
928
- const varLetra = configuracionSorteo.param_metodo.var_letra;
929
- for (var persona of sortear) {
930
- respuestasUA.find((_per, i) => i == persona[var$p0] - 1)[varLetra] = letra;
931
- persona[varLetra] = letra;
932
- letra = String.fromCharCode(letra.charCodeAt(0) + 1);
933
- }
934
- var tablaAleatoriaMiembros = configuracionSorteo.param_metodo.tabla.map((lista) => lista.split(''));
935
- var resto = idEnc % 10;
936
- var columnaTablaAleatoria = resto ? resto - 1 : 9;
937
- if (sortear.length > tablaAleatoriaMiembros.length) {
938
- sortear.splice(tablaAleatoriaMiembros.length); //descarto candidatos si son más que lo que permite la tabla
939
- }
940
- var filaTablaAleatoria = sortear.length - 1;
941
- var letraSeleccionada = tablaAleatoriaMiembros[filaTablaAleatoria][columnaTablaAleatoria];
942
- posicionSorteada = respuestasUA.findIndex((p) => p[varLetra] == letraSeleccionada) + 1;
943
- respuestas[configuracionSorteo.resultado] = posicionSorteada;
944
- respuestas[configuracionSorteo.cantidad_sorteables] = sortear.length;
945
- (_c = configuracionSorteo.sorteado_mostrar) === null || _c === void 0 ? void 0 : _c.forEach((mostrar) => respuestas[mostrar.target] = respuestasUA[respuestas[configuracionSorteo.resultado] - 1][mostrar.source]);
946
- }
947
- }
948
- else {
949
- respuestas[configuracionSorteo.cantidad_sorteables] = 0;
950
- }
951
- }
952
- respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length || null; //no queremos el valor 0
953
- respuestas[configuracionSorteo.variableBotonFormularioUA] = 'ok';
954
- if (configuracionSorteo.variableBotonFormularioUAIndividual) {
955
- respuestas[configuracionSorteo.variableBotonFormularioUAIndividual] = 'ok';
956
- }
957
- }
958
- }
959
- }
960
- function barrerSubArbol(respuestasRaiz, nodoActual, unidad_analisis, forPkAcumulado) {
961
- var uaDef = estructura.unidades_analisis[unidad_analisis];
962
- var esArray = nodoActual instanceof Array;
963
- var conjunto = esArray ? nodoActual : [nodoActual];
964
- for (var i = 0; i < conjunto.length; i++) {
965
- var resp = conjunto[i];
966
- if (!resp)
967
- continue;
968
- var num = esArray ? i + 1 : (forPkAcumulado[uaDef.pk_agregada] || 1);
969
- var idFormularios = Object.keys(estructura.formularios).filter(key => estructura.formularios[key].casilleros.unidad_analisis === unidad_analisis);
970
- for (const idFormulario of idFormularios) {
971
- var miForPk = Object.assign(Object.assign({}, forPkAcumulado), { [uaDef.pk_agregada]: num, formulario: idFormulario || forPkAcumulado.formulario });
972
- if (especiales.calcularVariables) {
973
- especiales.calcularVariables(respuestasRaiz, miForPk);
974
- }
975
- if (especiales.calcularVariablesEspecificasOperativo) {
976
- especiales.calcularVariablesEspecificasOperativo(respuestasRaiz, miForPk);
977
- }
978
- var hijas = (0, like_ar_1.strict)(estructura.unidades_analisis).filter(u => u.padre === unidad_analisis).keys();
979
- for (var uaHija of hijas) {
980
- var hijasResp = resp[uaHija];
981
- if (hijasResp) {
982
- barrerSubArbol(respuestasRaiz, hijasResp, uaHija, miForPk);
983
- }
984
- }
985
- }
986
- }
987
- }
988
- function recalcularTodoElArbol(respuestasRaiz, forPkRaiz) {
989
- var uaPpal = Object.keys(estructura.unidades_analisis).find(key => !estructura.unidades_analisis[key].padre);
990
- barrerSubArbol(respuestasRaiz, respuestasRaiz, uaPpal, forPkRaiz);
991
- barrerSubArbol(respuestasRaiz, respuestasRaiz, uaPpal, forPkRaiz);
992
- }
993
- function calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, UA, forPk, respuestasAumentadas, // incluyen la de todos los padres y ansestros,
994
- respuestasPadre, opts) {
995
- // recorriend UA personas y mascotas
996
- for (var UAincluida of exports.defOperativo.defUA[UA].incluidas) {
997
- var pkNueva = exports.defOperativo.defUA[UAincluida].pk;
998
- var conjuntoRespuestasUA = respuestas[UAincluida];
999
- (0, like_ar_1.strict)(conjuntoRespuestasUA).forEach((respuestasHijo, valorPkOPosicion) => {
1000
- var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
1001
- calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestasHijo, UAincluida, Object.assign(Object.assign({}, forPk), { [pkNueva]: valorPk }), Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestasHijo), { [pkNueva]: valorPk }), respuestas, opts);
1002
- });
1003
- }
1004
- // S1 , A1
1005
- for (var esHermano of [true, false]) {
1006
- for (var formulario of exports.defOperativo.defUA[UA].idsFor)
1007
- if (!!esHermano == !!exports.defOperativo.defFor[formulario].hermano) {
1008
- var plainForPk = (0, tipos_1.toPlainForPk)(Object.assign(Object.assign({}, forPk), { formulario }));
1009
- var maxPasosAutoingresadas = 10;
1010
- var varAutoIngresadas = [];
1011
- do {
1012
- var huboAutoingresos = false;
1013
- feedbackRowValidator[plainForPk] =
1014
- rowValidator(Object.assign({ marcaFin: 'fin' }, formularios[formulario].estructuraRowValidator), respuestasAumentadas, opts);
1015
- var { resumen, autoIngresadas } = feedbackRowValidator[plainForPk];
1016
- var varName;
1017
- if (autoIngresadas != null) {
1018
- for (varName in autoIngresadas) {
1019
- var cambio = respuestas[varName] !== autoIngresadas[varName];
1020
- if (cambio) {
1021
- respuestas[varName] = autoIngresadas[varName];
1022
- respuestasAumentadas[varName] = autoIngresadas[varName];
1023
- varAutoIngresadas.push(varName);
1024
- huboAutoingresos = true;
1025
- }
1026
- }
1027
- }
1028
- } while (huboAutoingresos && maxPasosAutoingresadas-- > 0);
1029
- varAutoIngresadas.forEach(_varname => {
1030
- // feedbackRowValidator[plainForPk].estados[_varname as IdVariable] = 'actual';
1031
- });
1032
- var BF_varname = '$B.' + formulario;
1033
- var formPrincipalForVivienda = (0, exports.getMainFormForVivienda)(forPk[estructura.pkAgregadaUaPpal]);
1034
- if (estructura.configSorteo && !estructura.configSorteo[formPrincipalForVivienda]) {
1035
- throw new Error(`no hay configuracion de sorteo para el formulario ${formPrincipalForVivienda}`);
1036
- }
1037
- var configSorteoFormulario = estructura.configSorteo && estructura.configSorteo[formPrincipalForVivienda];
1038
- var resumenOrNull = configSorteoFormulario &&
1039
- configSorteoFormulario.variableBotonFormularioUAIndividual &&
1040
- configSorteoFormulario.variableBotonFormularioUAIndividual == BF_varname ?
1041
- 'ok'
1042
- : resumen == 'vacio' ?
1043
- null
1044
- : resumen;
1045
- if (esHermano) {
1046
- respuestas[BF_varname] = resumenOrNull == 'ok' ? 'ok' : null;
1047
- }
1048
- else if (respuestasPadre != null) {
1049
- //respuestasPadre[BF_varname] = resumenOrNull;
1050
- }
1051
- }
1052
- }
1053
- }
1054
- function numberOrStringIncIfArray(numberOrString, object) {
1055
- // @ts-expect-error estoy usando isNaN para ver si es o no un número sumable
1056
- if (isNaN(numberOrString)) {
1057
- return numberOrString;
1058
- }
1059
- return Number(numberOrString) + (object instanceof Array ? 1 : 0);
1060
- }
1061
- var getMainFormForVivienda = (valuePkRaiz) => {
1062
- return datosByPass.informacionHdr[valuePkRaiz].tarea.main_form;
1063
- };
1064
- exports.getMainFormForVivienda = getMainFormForVivienda;
1065
- function calcularFeedbackHojaDeRuta() {
1066
- (0, like_ar_1.strict)(estructura.unidades_analisis).filter(uaDef => !uaDef.padre).forEach(uaDef => {
1067
- var esPrincipal = (f, enc) => {
1068
- let formularioPrincipal = (0, exports.getMainFormForVivienda)(enc);
1069
- return formularioPrincipal ? formularioPrincipal == f.id_casillero : f.formulario_principal;
1070
- };
1071
- //acá hay que sanitizar porque evidentemente puede venir con hashs de encuestas sin info el datosByPass.respuestas
1072
- var conjuntoRespuestasUA = datosByPass.respuestas[uaDef.unidad_analisis];
1073
- (0, like_ar_1.beingArray)(conjuntoRespuestasUA).forEach((respuestas, valorPkOPosicion) => {
1074
- var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
1075
- (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == uaDef.unidad_analisis && esPrincipal(f.casilleros, valorPk)).forEach((_defF, formulario) => {
1076
- var forPkRaiz = { formulario, [uaDef.pk_agregada]: valorPk };
1077
- calcularFeedback(respuestas, forPkRaiz, {});
1078
- });
1079
- });
1080
- });
1081
- }
1082
- function calcularFeedbackEncuesta(feedbackRowValidator, formularios, forPkRaiz, respuestas, opts) {
1083
- var forPk = Object.assign({}, forPkRaiz);
1084
- calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, exports.defOperativo.UAprincipal, forPk, respuestas, null, opts);
1085
- }
1086
- function calcularFeedback(respuestas, forPkRaiz, opts) {
1087
- var resumenEstado;
1088
- // @ts-ignore Partial
1089
- var nuevosRows = {};
1090
- calcularFeedbackEncuesta(nuevosRows, estructura.formularios, forPkRaiz, respuestas, opts);
1091
- datosByPass.feedbackRowValidator = (0, like_ar_1.strict)(datosByPass.feedbackRowValidator).filter((_feedback, plainPk) => JSON.parse(plainPk)[estructura.pkAgregadaUaPpal] != forPkRaiz[estructura.pkAgregadaUaPpal]).plain();
1092
- datosByPass.feedbackRowValidator = Object.assign(Object.assign({}, datosByPass.feedbackRowValidator), nuevosRows);
1093
- datosByPass.respuestas[estructura.uaPpal][forPkRaiz[estructura.pkAgregadaUaPpal]] = Object.assign(Object.assign({}, datosByPass.respuestas[estructura.uaPpal][forPkRaiz[estructura.pkAgregadaUaPpal]]), calcularResumenVivienda(forPkRaiz, nuevosRows, respuestas));
1094
- }
1095
- var buscarFormulariosHijos = (idFormulario, formsFeedback = []) => {
1096
- var _a;
1097
- if (idFormulario) {
1098
- for (let casillero of estructura.formularios[idFormulario].casilleros.casilleros) {
1099
- if (casillero.tipoc == 'BF') {
1100
- var formHijo = (((_a = casillero.salto) === null || _a === void 0 ? void 0 : _a.startsWith('F:')) ? casillero.salto : 'F:' + casillero.salto);
1101
- if (formHijo) {
1102
- formsFeedback.push(formHijo);
1103
- (0, exports.buscarFormulariosHijos)(formHijo, formsFeedback);
1104
- }
1105
- }
1106
- }
1107
- }
1108
- return formsFeedback;
1109
- };
1110
- exports.buscarFormulariosHijos = buscarFormulariosHijos;
1111
- var getFormulariosForValuePkRaiz = (valuePkRaiz) => {
1112
- var mainFormForValuePkRaiz = (0, exports.getMainFormForVivienda)(valuePkRaiz);
1113
- var formsFeedback = [mainFormForValuePkRaiz];
1114
- (0, exports.buscarFormulariosHijos)(mainFormForValuePkRaiz, formsFeedback);
1115
- return formsFeedback;
1116
- };
1117
- exports.getFormulariosForValuePkRaiz = getFormulariosForValuePkRaiz;
1118
- var calcularActualBF = (configSorteoFormulario, numElementoUA, numActual, formulario, r) => !!(configSorteoFormulario &&
1119
- configSorteoFormulario.id_formulario_individual &&
1120
- configSorteoFormulario.id_formulario_individual == formulario
1121
- ?
1122
- numElementoUA == (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado])
1123
- :
1124
- numActual == numElementoUA);
1125
- exports.calcularActualBF = calcularActualBF;
1126
- var calcularDisabledBF = (configSorteoFormulario, habilitacionBotonFormulario, numElementoUA, formulario, r) => {
1127
- if (habilitacionBotonFormulario && habilitacionBotonFormulario[formulario]) {
1128
- var expr_habilitar_fun = (0, exports.getFuncionHabilitar)(habilitacionBotonFormulario[formulario].expr_habilitar_boton_js);
1129
- return !expr_habilitar_fun(r[habilitacionBotonFormulario[formulario].unidad_analisis][numElementoUA - 1]);
1130
- }
1131
- else {
1132
- return !!(configSorteoFormulario &&
1133
- (configSorteoFormulario.id_formulario_individual == formulario ||
1134
- (0, exports.buscarFormulariosHijos)(configSorteoFormulario.id_formulario_individual).includes(formulario)) &&
1135
- numElementoUA != (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado]));
1136
- }
1137
- };
1138
- exports.calcularDisabledBF = calcularDisabledBF;
1139
- var calcularPermiteBorrarBF = (configSorteoFormulario, formulario) => !(configSorteoFormulario &&
1140
- configSorteoFormulario.id_formulario_individual == formulario);
1141
- exports.calcularPermiteBorrarBF = calcularPermiteBorrarBF;
1142
- function calcularResumenVivienda(forPkRaiz, feedbackRowValidator, respuestas) {
1143
- var tarea = datosByPass.informacionHdr[forPkRaiz[estructura.pkAgregadaUaPpal]].tarea.tarea;
1144
- var { codRea, esRea } = exports.defOperativo.esRealizada(respuestas, tarea);
1145
- var { codNoRea, esNoRea } = exports.defOperativo.esNoRea(respuestas, tarea);
1146
- var { codReaSup, esReaSup } = exports.defOperativo.esRealizadaSup(respuestas, tarea);
1147
- var { codNoReaSup, esNoReaSup } = exports.defOperativo.esNoReaSup(respuestas, tarea);
1148
- var formsFeedback = (0, exports.getFormulariosForValuePkRaiz)(forPkRaiz[estructura.pkAgregadaUaPpal]);
1149
- var configuracionSorteoFormulario = estructura.configSorteo && estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPkRaiz[estructura.pkAgregadaUaPpal])];
1150
- var habilitacionBotonFormulario = estructura.habilitacionBotonFormulario;
1151
- var feedBackVivienda = (0, like_ar_1.strict)(feedbackRowValidator).filter((_row, plainPk) => {
1152
- var _a;
1153
- var tieneIndividual = configuracionSorteoFormulario && !!(configuracionSorteoFormulario.id_formulario_individual && configuracionSorteoFormulario.id_formulario_padre);
1154
- var tieneBotonDesHabilitable = habilitacionBotonFormulario && habilitacionBotonFormulario[JSON.parse(plainPk).formulario];
1155
- var pkAgregada = null;
1156
- if (tieneBotonDesHabilitable) {
1157
- pkAgregada = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua, _idUA) => ua.unidad_analisis == habilitacionBotonFormulario[JSON.parse(plainPk).formulario].unidad_analisis)) === null || _a === void 0 ? void 0 : _a.pk_agregada;
1158
- }
1159
- return JSON.parse(plainPk)[estructura.pkAgregadaUaPpal] == forPkRaiz[estructura.pkAgregadaUaPpal] &&
1160
- formsFeedback.includes(JSON.parse(plainPk).formulario) &&
1161
- (tieneBotonDesHabilitable ?
1162
- !(0, exports.calcularDisabledBF)(configuracionSorteoFormulario, habilitacionBotonFormulario, JSON.parse(plainPk)[pkAgregada], JSON.parse(plainPk).formulario, respuestasForPk(JSON.parse(plainPk), true).respuestasAumentadas)
1163
- : tieneIndividual ?
1164
- !(0, exports.calcularDisabledBF)(configuracionSorteoFormulario, habilitacionBotonFormulario, JSON.parse(plainPk).persona, JSON.parse(plainPk).formulario, estructura.conReaHogar ?
1165
- JSON.parse(plainPk).hogar ? respuestasForPk({
1166
- [estructura.pkAgregadaUaPpal]: forPkRaiz[estructura.pkAgregadaUaPpal],
1167
- formulario: configuracionSorteoFormulario.id_formulario_padre,
1168
- hogar: JSON.parse(plainPk).hogar
1169
- }).respuestas : {}
1170
- :
1171
- respuestasForPk({
1172
- [estructura.pkAgregadaUaPpal]: forPkRaiz[estructura.pkAgregadaUaPpal],
1173
- formulario: configuracionSorteoFormulario.id_formulario_padre,
1174
- }).respuestas)
1175
- : true);
1176
- }).array();
1177
- var prioridades = {
1178
- 'no rea': { prioridad: 1, cantidad: 0 },
1179
- 'con problemas': { prioridad: 2, cantidad: 0 },
1180
- 'incompleto': { prioridad: 3, cantidad: 0 },
1181
- 'vacio': { prioridad: 4, cantidad: 0 },
1182
- 'cita pactada': { prioridad: 5, cantidad: 0 },
1183
- 'ok': { prioridad: 6, cantidad: 0 }
1184
- };
1185
- var min = 6;
1186
- var minResumen = 'ok';
1187
- for (var feedback of feedBackVivienda) {
1188
- var resumen = feedback.resumen;
1189
- prioridades[resumen].cantidad++;
1190
- if (prioridades[resumen].prioridad < min) {
1191
- min = prioridades[resumen].prioridad;
1192
- minResumen = resumen;
1193
- }
1194
- }
1195
- if (minResumen == 'vacio' && prioridades['ok'].cantidad || minResumen == 'incompleto') {
1196
- if (false /*respuestas[sp1]==2 && respuestas[sp6]==null*/) {
1197
- minResumen = 'cita pactada';
1198
- }
1199
- else {
1200
- minResumen = 'incompleto';
1201
- }
1202
- }
1203
- //TODO ARREGLAR ESTE HORROR, GENERALIZAR
1204
- var tarea = datosByPass.informacionHdr[forPkRaiz[estructura.pkAgregadaUaPpal]].tarea.tarea;
1205
- var resumenEstado;
1206
- var resumenEstadoSup = 'vacio';
1207
- if (tarea == 'supe') {
1208
- resumenEstadoSup = esNoReaSup ? 'no rea' : minResumen;
1209
- //para que coloree bien en la hdr del DM (luego en bbdd no se guarda)
1210
- resumenEstado = resumenEstadoSup;
1211
- }
1212
- else {
1213
- resumenEstado = esNoRea ? 'no rea' : minResumen;
1214
- }
1215
- var resultado = {
1216
- resumenEstado,
1217
- resumenEstadoSup,
1218
- codRea,
1219
- codNoRea,
1220
- codReaSup,
1221
- codNoReaSup
1222
- };
1223
- return resultado;
1224
- }
1225
- });
1226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8gY29weS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91bmxvZ2dlZC9ieXBhc3MtZm9ybXVsYXJpbyBjb3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTZDQSxvREFFQztJQVdELDBEQVlDO0lBRUQsOERBS0M7SUFFRCwwREFxQkM7SUFNRCxvREFFQztJQUVELDRGQUVDO0lBc0NELDBEQUVDO0lBRUQsb0RBSUM7SUFzQkQsNENBSUM7SUFnQkQsc0NBVUM7SUFFRCx3Q0FVQztJQVdELDBEQUtDO0lBRUQsNEJBRUM7SUFFRCxzQ0FFQztJQWtDRCw4Q0FJQztJQU1ELDBDQWlEQztJQUVELGdGQXVDQztJQUVELDREQW9FQztJQUVELDBDQVFDO0lBRUQsNENBUUM7SUFrQkQsZ0RBQ0M7SUFnRkQsZ0VBaUNDO0lBT0Qsa0VBdUJDO0lBRUQsc0RBR0M7SUFFRCxzREFFQztJQUVELDBEQUVDO0lBRUQsb0RBRUM7SUFFRCw4REFPQztJQUVELDBEQU9DO0lBRUQsNERBZ0JDO0lBR0Qsd0NBS0M7SUFvSkQsa0RBZ0JDO0lBRUQsa0RBMEJDO0lBd0dELGdEQWlCQztJQWNELDBDQWtJQztJQWlDRCxzREFJQztJQUVELHdFQWdGQztJQUVELDREQU1DO0lBTUQsZ0VBaUJDO0lBRUQsNERBU0M7SUFnRkQsMERBaUdDO0lBaDlDRCxxQ0FBdUQ7SUFFdkQsaURBQW9HO0lBRXBHLCtDQUErRDtJQUMvRCwyQ0FBc0M7SUFFdEMsbUNBeUJpQjtJQUVqQixtREFBa0Q7SUFDbEQseURBQXVEO0lBQ3ZELDJEQUc2QjtJQUU3QixJQUFJLFNBQVMsR0FBRyxFQUVmLENBQUE7SUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxpQkFBeUM7UUFDMUUsU0FBUyxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFBO0lBQ25ELENBQUM7SUFTRCxJQUFJLDJCQUEyQixHQUFnQyxFQUFFLENBQUM7SUFF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QUFVLElBQUksT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3BGLElBQUksS0FBSyxDQUFDLCtDQUErQyxFQUFFLENBQUM7Z0JBQ3hELFVBQVUsR0FBRyxjQUFjLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFVBQVUsR0FBRyxZQUFZLENBQUM7WUFDOUIsQ0FBQztRQUNMLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMvRyxJQUFJLGFBQTRCLENBQUM7UUFDakMsSUFBSSxnQkFBZ0IsR0FBa0IsT0FBTyxDQUFDO1FBQzlDLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7WUFDckQscUVBQXFFO1lBQ3JFLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQTtRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNKLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1FBQ25ELENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBcUI7WUFDOUIsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixNQUFNO1lBQ04sUUFBUTtZQUNSLFNBQVM7WUFDVCxXQUFXO1NBQ2QsQ0FBQTtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHJpY3QgYXMgbGlrZUFyLCBiZWluZ0FycmF5IH0gZnJvbSBcImxpa2UtYXJcIjtcclxuXHJcbmltcG9ydCB7IGdldFJvd1ZhbGlkYXRvciwgRm9ybVN0cnVjdHVyZVN0YXRlLCBPcGNpb25lc1Jvd1ZhbGlkYXRvciwgRmVlZGJhY2sgfSBmcm9tIFwicm93LXZhbGlkYXRvclwiO1xyXG5cclxuaW1wb3J0IHsgZGF0ZSwgY29tcGFyZUZvck9yZGVyLCBjb2FsZXNjZSB9IGZyb20gXCJiZXN0LWdsb2JhbHNcIjtcclxuaW1wb3J0IHsgZXhwZWN0ZWQgfSBmcm9tIFwiY2FzdC1lcnJvclwiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIEVzdHJ1Y3R1cmEsXHJcbiAgICBGb3JQaywgRm9yUGtSYWl6LFxyXG4gICAgSWRGaW4sIElkRm9ybXVsYXJpbywgSWRQcmVndW50YSwgSWRUYXJlYSwgSWRWYXJpYWJsZSxcclxuICAgIElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBJbmZvRm9ybXVsYXJpbyxcclxuICAgIFBsYWluRm9yUGssIFJlc3B1ZXN0YXMsIFJlc3B1ZXN0YXNSYWl6LCBSZXN1bWVuRXN0YWRvLFxyXG4gICAgVmFsb3IsIFZpc2l0YSxcclxuICAgIHRvUGxhaW5Gb3JQayxcclxuICAgIFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgRm9ybXVsYXJpbyxcclxuICAgIENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMsXHJcbiAgICBJZEVuYyxcclxuICAgIERlZk9wZXJhdGl2byxcclxuICAgIGl0ZXJhdG9yLFxyXG4gICAgQ29uZmlndXJhY2lvbkhhYmlsaXRhckJvdG9uRm9ybXVsYXJpbyxcclxuICAgIENhbXBvUGssXHJcbiAgICBJZENhcmdhLFxyXG4gICAgQ2FyZ2EsXHJcbiAgICBDYW1wb1BrUmFpeixcclxuICAgIFZhbHVlUGtSYWl6LFxyXG4gICAgRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhLFxyXG4gICAgUmVzdWx0YWRvUmVzdW1lbixcclxuICAgIFJlc3VsdGFkb1JlYU5vUmVhLFxyXG59IGZyb20gXCIuL3RpcG9zXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRGb3JtUmVuZGVyZXIgfSBmcm9tIFwiLi9yZW5kZXItY29uZmlnXCI7XHJcbmltcG9ydCB7IGFkYXB0YXJFc3RydWN0dXJhIH0gZnJvbSBcIi4vcmVkdXgtZm9ybXVsYXJpb1wiO1xyXG5pbXBvcnQge1xyXG4gICAgYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMsXHJcbiAgICBFdmFsdWFkb3JFeHByZXNpb25cclxufSBmcm9tIFwiLi9jYWxjdWxvcy1lbmN1ZXN0YVwiO1xyXG5cclxudmFyIGNvbW9kaW5lcyA9IHt9IGFzIHtcclxuICAgIGNhbGN1bGFyQ29tb2RpbmVzPzogKGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3VsYXJDb21vZGluZXMoY2FsY3VsYXJDb21vZGluZXM6IChmb3JQazogRm9yUGspID0+IHZvaWQpIHtcclxuICAgIGNvbW9kaW5lcy5jYWxjdWxhckNvbW9kaW5lcyA9IGNhbGN1bGFyQ29tb2RpbmVzXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExpc3RlbmVyQ2FtYmlvVmFyaWFibGUgPSAodmFyaWFibGU6IHN0cmluZywgdmFsb3I6IGFueSwgZm9yUGs/OiBGb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzKSA9PiB2b2lkO1xyXG5cclxudHlwZSBTdXNjcmlwY2lvbkNhbWJpb1ZhcmlhYmxlID0ge1xyXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGU7XHJcbiAgICB2YXJpYWJsZXM/OiBTZXQ8c3RyaW5nPjtcclxufTtcclxuXHJcbnZhciBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGU6IFN1c2NyaXBjaW9uQ2FtYmlvVmFyaWFibGVbXSA9IFtdO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1c2NyaWJpckNhbWJpb1ZhcmlhYmxlKGxpc3RlbmVyOiBMaXN0ZW5lckNhbWJpb1ZhcmlhYmxlLCB2YXJpYWJsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSk6ICgpID0+IHZvaWQge1xyXG4gICAgY29uc3QgdmFyc1NldCA9IHZhcmlhYmxlc1xyXG4gICAgICAgID8gbmV3IFNldChBcnJheS5pc0FycmF5KHZhcmlhYmxlcykgPyB2YXJpYWJsZXMgOiBbdmFyaWFibGVzXSlcclxuICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHN1YjogU3VzY3JpcGNpb25DYW1iaW9WYXJpYWJsZSA9IHsgbGlzdGVuZXIsIHZhcmlhYmxlczogdmFyc1NldCB9O1xyXG4gICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnB1c2goc3ViKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGUuaW5kZXhPZihzdWIpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXN1c2NyaWJpckNhbWJpb1ZhcmlhYmxlKGxpc3RlbmVyOiBMaXN0ZW5lckNhbWJpb1ZhcmlhYmxlKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5maW5kSW5kZXgocyA9PiBzLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm90aWZpY2FyQ2FtYmlvVmFyaWFibGUodmFyaWFibGU6IHN0cmluZywgdmFsb3I6IGFueSwgZm9yUGs/OiBGb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHsgbGlzdGVuZXIsIHZhcmlhYmxlcyB9ID0gc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlW2ldO1xyXG4gICAgICAgIGlmICh2YXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgbGV0IGFwbGljYSA9IHZhcmlhYmxlcy5oYXModmFyaWFibGUpO1xyXG4gICAgICAgICAgICBpZiAoIWFwbGljYSAmJiByZXNwdWVzdGFzQXVtZW50YWRhcykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbGljYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWFwbGljYSkgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxpc3RlbmVyKHZhcmlhYmxlLCB2YWxvciwgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZW4gbGlzdGVuZXIgZGUgY2FtYmlvIGRlIHZhcmlhYmxlJywgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbnZhciBlc3BlY2lhbGVzID0ge30gYXMge1xyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXM/OiAocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazogRm9yUGspID0+IHZvaWRcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8/OiAocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazogRm9yUGspID0+IHZvaWRcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3VsYXJWYXJpYWJsZXMoY2FsY3VsYXJWYXJpYWJsZXM6IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcyA9IGNhbGN1bGFyVmFyaWFibGVzXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKGNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvID0gY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2b1xyXG59XHJcblxyXG50eXBlIERhdG9zQnlQYXNzID0gRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7XHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyAgLy8gbm8gc2UgcGVyc2lzdGVcclxuICAgICAgICBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gLy8gcmVzdWx0YWRvIGRlbCByb3dWYWxpZGF0b3IgcGFyYSBlc3RhZG8uZm9yUGtcclxuICAgIH1cclxuICAgIGRpcnR5OiBib29sZWFuXHJcbn07XHJcblxyXG52YXIgZGF0b3NCeVBhc3MgPSB7fSBhcyBEYXRvc0J5UGFzc1xyXG5cclxuZXhwb3J0IGNvbnN0IGhheURhdG9zQnlQYXNzQWxtYWNlbmFkb3MgPSAoKSA9PiBkYXRvc0J5UGFzcyAmJiBPYmplY3Qua2V5cyhkYXRvc0J5UGFzcykubGVuZ3RoID4gMFxyXG5cclxuaW50ZXJmYWNlIFJlY3Qge1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJlY3QoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcclxuICAgIHZhciByZWN0OiBSZWN0ID0geyB0b3A6IDAsIGxlZnQ6IDAsIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IH07XHJcbiAgICB2YXIgY3VycmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDtcclxuICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHtcclxuICAgICAgICByZWN0LnRvcCArPSBjdXJyZW50Lm9mZnNldFRvcDtcclxuICAgICAgICByZWN0LmxlZnQgKz0gY3VycmVudC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjdDtcclxufVxyXG5cclxuLy9AdHMtaWdub3JlIGFycmFuY2EgZW4gYmxhbmNvXHJcbnZhciBlc3RydWN0dXJhOiBFc3RydWN0dXJhID0gbnVsbCBhcyBFc3RydWN0dXJhO1xyXG5cclxubGV0IHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubzogKGRicHA6IERhdG9zQnlQYXNzUGVyc2lzdGlibGVzKSA9PiBQcm9taXNlPGFueT4gPSAoKSA9PiB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BlcnNpc3RpckRhdG9zQnlQYXNzIFNJTiBERUZJTklSJylcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlcnNpc3RpckRhdG9zQnlQYXNzKHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuOiB0eXBlb2YgcGVyc2lzdGlyRGF0b3NCeVBhc3MpIHtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyA9IHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGJwcDogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMpIHtcclxuICAgIGF3YWl0IGdldEZvcm1SZW5kZXJlcigpLnBlcnNpc3RpckRhdG9zKGRicHApO1xyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBmYWxzZVxyXG4gICAgcmVmcmVzY2FyTWFyY2FEaXJ0eSgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXJFbmN1ZXN0YSA9IChpZENhcmdhOiBJZENhcmdhLCBjYWxsQmFjazogKGZvclBrUmFpejogRm9yUGtSYWl6KSA9PiB2b2lkKSA9PiB7XHJcbiAgICBjb25zdCBORVhUX0FVVE9fVkFMVUVfUEtfUkFJWiA9IGdldEZvcm1SZW5kZXJlcigpLmdldFVsdGltb1ZhbG9yUGtSYWl6KCkgfHwgJy0xJztcclxuICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICBnZXRGb3JtUmVuZGVyZXIoKS5zZXRVbHRpbW9WYWxvclBrUmFpeigoTnVtYmVyKE5FWFRfQVVUT19WQUxVRV9QS19SQUlaKSAtIDEpLnRvU3RyaW5nKCkpO1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10gPSB7fSBhcyBSZXNwdWVzdGFzUmFpejtcclxuICAgIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW05FWFRfQVVUT19WQUxVRV9QS19SQUlaIGFzIHVua25vd24gYXMgSWRFbmNdID0ge1xyXG4gICAgICAgIC4uLmVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLFxyXG4gICAgICAgIHRlbTogeyAuLi5lc3RydWN0dXJhLmRlZmF1bHRJbmZvcm1hY2lvbkhkci50ZW0gfVxyXG4gICAgfTtcclxuICAgIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW05FWFRfQVVUT19WQUxVRV9QS19SQUlaIGFzIHVua25vd24gYXMgSWRFbmNdLnRlbS5jYXJnYSA9IGlkQ2FyZ2E7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrSG9qYURlUnV0YSgpO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpLnRoZW4oXHJcbiAgICAgICAgKCkgPT4gY2FsbEJhY2soe1xyXG4gICAgICAgICAgICBmb3JtdWxhcmlvOiBlc3RydWN0dXJhLmRlZmF1bHRJbmZvcm1hY2lvbkhkci50YXJlYS5tYWluX2Zvcm0sXHJcbiAgICAgICAgICAgIFtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdOiBOdW1iZXIoTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVopIGFzIFZhbHVlUGtSYWl6XHJcbiAgICAgICAgfSBhcyBGb3JQa1JhaXopXHJcbiAgICApLy9ubyBxdWl0YXIgZWwgY2FzdGVvIHBvcnF1ZSB2aWVuZSBjb21vIHRleHRvIHkgbmVjZXNpdG8gcXVlIHNlYSBuw7ptZXJvXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RW5jb2xhckJhY2t1cChcclxuICAgIGVuY29sYXJCYWNrdXBGdW46ICh0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXMpID0+IHZvaWRcclxuKSB7XHJcbiAgICBlbmNvbGFyQmFja3VwID0gZW5jb2xhckJhY2t1cEZ1blxyXG59XHJcblxyXG5sZXQgZW5jb2xhckJhY2t1cDogKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZvclBrUmFpejogRm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3RhcykgPT4gdm9pZCA9ICgpID0+IHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlNJTiBFU1BFQ0lGSUNBUiBlbmNvbGFyQmFja3VwXCIpXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgaW50ZW50YXJCYWNrdXAgPSAoZm9yUGs6IEZvclBrKSA9PiB7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUpXHJcbiAgICB2YXIgdG9rZW4gPSBkYXRvc0J5UGFzcy50b2tlbjtcclxuICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgIGVuY29sYXJCYWNrdXAodG9rZW4sIGZvclBrUmFpeiwgcmVzcHVlc3Rhc1JhaXopO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5vIGhheSB0b2tlbiwgbm8gc2UgcHVkbyBoYWNlciBlbCBiYWNrdXBcIilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVzdHJ1Y3R1cmEoZXN0cnVjdHVyYUFDYXJnYXI6IEVzdHJ1Y3R1cmEpIHtcclxuICAgIGVzdHJ1Y3R1cmEgPSBhZGFwdGFyRXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcik7XHJcbiAgICBkZWZPcGVyYXRpdm8uVUFwcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCh1YSA9PiAhIXVhLnByaW5jaXBhbCk/LnVuaWRhZF9hbmFsaXNpcyFcclxuICAgIGRlZk9wZXJhdGl2by5kZWZGb3IgPSBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykubWFwKGYgPT4gKHsgaGVybWFubzogZi5jYXNpbGxlcm9zLmhlcm1hbm8gfSkpLnBsYWluKClcclxuICAgIGRlZk9wZXJhdGl2by5kZWZVQSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5tYXAoKHVhRGVmLCB1YSkgPT4gKHtcclxuICAgICAgICBwazogdWFEZWYucGtfYWdyZWdhZGEgYXMgSWRWYXJpYWJsZSxcclxuICAgICAgICBpbmNsdWlkYXM6IGxpa2VBcih1YURlZi5oaWphcykua2V5cygpLFxyXG4gICAgICAgIGlkc0ZvcjogbGlrZUFyKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MpLmZpbHRlcihmID0+IGYuY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMgPT0gdWEpLmtleXMoKVxyXG4gICAgfSkpLnBsYWluKClcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RGF0b3NCeVBhc3MoXHJcbiAgICBudWV2b1BhcXVldGU6IERhdG9zQnlQYXNzUGVyc2lzdGlibGVzICYgeyBkaXJ0eT86IGJvb2xlYW4gfVxyXG4pIHtcclxuICAgIGRhdG9zQnlQYXNzID0ge1xyXG4gICAgICAgIGRpcnR5OiBmYWxzZSxcclxuICAgICAgICAuLi5udWV2b1BhcXVldGUsXHJcbiAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHt9IGFzIERhdG9zQnlQYXNzW1wiZmVlZGJhY2tSb3dWYWxpZGF0b3JcIl1cclxuICAgIH07XHJcblxyXG4gICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBnZXREYXRvc0J5UGFzcyA9ICgpID0+IGRhdG9zQnlQYXNzXHJcblxyXG5mdW5jdGlvbiBvYmpldG9WYWNpbyhvOiBvYmplY3QpIHtcclxuICAgIGZvciAodmFyIGsgaW4gbykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVlZGJhY2tSb3dWYWxpZGF0b3IoKSB7XHJcbiAgICBpZiAoIWRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yIHx8IG9iamV0b1ZhY2lvKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKSkge1xyXG4gICAgICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3I7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJ0eSgpIHtcclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5kaXJ0eVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXN0cnVjdHVyYSgpIHtcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG50eXBlIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcyA9IEhUTUxEaXZFbGVtZW50IHwgSFRNTEJ1dHRvbkVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxudHlwZSBEaXJlY3RGdW5jdGlvbjxULCBSZXN1bHQ+ID0gKHJlc3B1ZXN0YXNBdW1lbnRhZGFzOiBSZXNwdWVzdGFzLCBmZWVkYmFja0Zvcm06IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+LCBlbGVtZW50bzogVCxcclxuICAgIGZlZWRiYWNrQWxsOiB7XHJcbiAgICAgICAgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9LFxyXG4gICAgZXN0cnVjdHVyYTogRXN0cnVjdHVyYVxyXG4pID0+IFJlc3VsdFxyXG5cclxudHlwZSBSZWdpc3Ryb0VsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+ID0ge1xyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgYW55PixcclxuICAgIHZhcmlhYmxlPzogSWRWYXJpYWJsZSxcclxuICAgIGZvclBrPzogRm9yUGssXHJcbn0gJiAoe1xyXG4gICAgcHJvcDoga2V5b2YgVFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBUW2tleW9mIFRdPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGxhIHByb3AoZXJ0eSkgZGVsIGVsZW1lbnRvXHJcbn0gfCB7XHJcbiAgICBhdHRyOiBzdHJpbmdcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgc3RyaW5nPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGVsIHZhbG9yIGRlbCBhdHRyKGlidXRvKVxyXG59IHwge1xyXG4gICAgc3R5bGU6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb25cclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgc3RyaW5nPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGVsIHZhbG9yIGRlbCBzdHlsZVxyXG59IHwge1xyXG4gICAgZGlyZWN0OiB0cnVlXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHZvaWQ+IC8vIExhIGZ1bmNpw7NuIHZhIGEgdG9jYXIgZGlyZWN0YW1lbnRlIGVsIGVsZW1lbnRvIHkgaGFjZXIgdG9kbyBsbyBxdWUgdGVuZ2EgcXVlIGhhY2VyXHJcbn0pXHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG9zPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+ID0geyBbaWQ6IHN0cmluZ106IFJlZ2lzdHJvRWxlbWVudG88VD4gJiB7IGVsZW1lbnRvPzogVCB9IH07XHJcblxyXG52YXIgcmVnaXN0cm9FbGVtZW50b3NHbG9iYWwgPSB7fSBhcyBSZWdpc3Ryb0VsZW1lbnRvczxFbGVtZW50b3NSZWdpc3RyYWJsZXM+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJhckVsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+KGRlZjogUmVnaXN0cm9FbGVtZW50bzxUPikge1xyXG4gICAgLy8gQHRzLWlnbm9yZSBTw60sIHBvZHLDrWEgc2VyIHF1ZSBsb3MgdGlwb3MgZGUgVCBzZWFuIGRpc3RpbnRvcywgcGVybyB2YW4gYSBzZXIgY29oZXJlbnRlc1xyXG4gICAgdmFyIHJlZ2lzdHJvRWxlbWVudG9zOiBSZWdpc3Ryb0VsZW1lbnRvczxUPiA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgcmVnaXN0cm9FbGVtZW50b3NbZGVmLmlkXSA9IGRlZjtcclxufVxyXG5cclxudHlwZSBSZXNwdWVzdGFzRm9yUGtDb211biA9IHsgcmVzcHVlc3RhczogUmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgdW5pZGFkQW5hbGlzaXM6IFVuaWRhZEFuYWxpc2lzIH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6IEZvclBrKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGssIGNvbkF1bWVudGFkYXM6IHRydWUsIGFncmVnYXJTaUZhbHRhPzogYm9vbGVhbik6IFJlc3B1ZXN0YXNGb3JQa0NvbXVuICYgeyByZXNwdWVzdGFzQXVtZW50YWRhczogUmVzcHVlc3RhcyB9XHJcbmV4cG9ydCBmdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6IEZvclBrLCBjb25BdW1lbnRhZGFzPzogYm9vbGVhbiwgYWdyZWdhclNpRmFsdGE/OiBib29sZWFuKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW4gJiB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzPzogUmVzcHVlc3RhcyB9IHtcclxuICAgIHZhciByZXNwdWVzdGFzQXVtZW50YWRhcyA9IHt9IGFzIFJlc3B1ZXN0YXM7XHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGxvIHF1ZSBzb2JyYXIgZGUgcmVzcHVlc3RhcyBubyBtZSBpbXBvcnRhLi4uXHJcbiAgICB2YXIgcmVzcHVlc3RhcyA9IGRhdG9zQnlQYXNzLnJlc3B1ZXN0YXMgYXMgUmVzcHVlc3RhcztcclxuICAgIHZhciByZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXo7XHJcbiAgICB2YXIgZm9yUGtSYWl6OiBGb3JQaztcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6IElkVW5pZGFkQW5hbGlzaXMgfCB1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgZm9yUGtBcGlsYWRhID0gZm9yUGs7XHJcbiAgICB2YXIgcGlsYTogW3VuaWRhZF9hbmFsaXNpczogSWRVbmlkYWRBbmFsaXNpcywgdWFEZWY6IFVuaWRhZEFuYWxpc2lzLCBmb3JQazogRm9yUGtdW10gPSBbXTtcclxuICAgIHdoaWxlICh1bmlkYWRfYW5hbGlzaXMpIHtcclxuICAgICAgICB2YXIgdWFEZWY6IFVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgIHBpbGEucHVzaChbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSk7XHJcbiAgICAgICAgZm9yUGtBcGlsYWRhID0geyAuLi5mb3JQa0FwaWxhZGEgfTtcclxuICAgICAgICBkZWxldGUgZm9yUGtBcGlsYWRhW3VhRGVmLnBrX2FncmVnYWRhXVxyXG4gICAgICAgIHVuaWRhZF9hbmFsaXNpcyA9IHVhRGVmLnBhZHJlXHJcbiAgICB9XHJcbiAgICB3aGlsZSAocGlsYS5sZW5ndGgpIHtcclxuICAgICAgICBbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSA9IHBpbGEucG9wKCkhXHJcbiAgICAgICAgdmFyIHZhbG9yUGtPUG9zaWNpb24gPSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdO1xyXG4gICAgICAgIGlmICh2YWxvclBrT1Bvc2ljaW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhbHRhIHVuIHZhbG9yIHBhcmEgJHtKU09OLnN0cmluZ2lmeSh1YURlZi5wa19hZ3JlZ2FkYSl9YClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzcHVlc3Rhc0FudGVyaW9yID0gcmVzcHVlc3RhcztcclxuICAgICAgICBsZXQgcG9zaWNpb24gPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSA/IHZhbG9yUGtPUG9zaWNpb24gLSAxIDogdmFsb3JQa09Qb3NpY2lvblxyXG4gICAgICAgIHJlc3B1ZXN0YXMgPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dO1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGFzID09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFncmVnYXJTaUZhbHRhKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0ge30gYXMgUmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0FudGVyaW9yW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dID0gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBleGlzdGUgZWwgZWxlbWVudG8gJyR7cG9zaWNpb259JyBlbiBsYSB1bmlkYWRfYW5hbGlzaXMgJyR7dW5pZGFkX2FuYWxpc2lzfSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JQa1JhaXogfHw9IGZvclBrQXBpbGFkYTtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFPDqSBxdWUgZXMgcmHDrXogcG9yIGPDs21vIGVzdG95IHJldm9sdmllbmRvIGxhIHBpbGFcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiB8fD0gcmVzcHVlc3RhcztcclxuICAgICAgICBpZiAoY29uQXVtZW50YWRhcykge1xyXG4gICAgICAgICAgICByZXNwdWVzdGFzQXVtZW50YWRhcyA9IHsgLi4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXMsIFt1YURlZi5wa19hZ3JlZ2FkYV06IHZhbG9yUGtPUG9zaWNpb24gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBTw6kgcXVlIGxhIHBpbGEgdGllbmUgYWwgbWVub3MgdW4gZWxlbWVudG8gcG9yIGxvIHRhbnRvIGVzdG8gZXN0w6EgbGxlbm8gc2VndXJvLiBcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczogdWFEZWZcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtSYWl6OiBGb3JQa1JhaXopIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGtSYWl6LCB0cnVlKVxyXG4gICAgdmFyIHJlZ2lzdHJvRWxlbWVudG9zID0gcmVnaXN0cm9FbGVtZW50b3NHbG9iYWw7XHJcbiAgICB2YXIgcGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayhmb3JQa1JhaXopXHJcbiAgICB2YXIgcm93VmFsaWRhdG9yID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa107XHJcbiAgICBmb3IgKHZhciBpZCBpbiByZWdpc3Ryb0VsZW1lbnRvcykge1xyXG4gICAgICAgIHZhciBkZWYgPSByZWdpc3Ryb0VsZW1lbnRvc1tpZF07XHJcbiAgICAgICAgaWYgKGRlZi5lbGVtZW50bykge1xyXG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZGVmLmVsZW1lbnRvKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmLmVsZW1lbnRvID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIGRlZi5lbGVtZW50byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlZi5pZCkgYXMgRWxlbWVudG9zUmVnaXN0cmFibGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRlZi5lbGVtZW50bykge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQlVTQ0FORE8gZWwgZWxlbWVudG8gcmVnaXN0cmFkbyAnLGlkLCdubyBlc3TDoSBlbiBlbCBET00nKVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZhbHVlID0gZGVmLmZ1bihyZXNwdWVzdGFzQXVtZW50YWRhcywgcm93VmFsaWRhdG9yLCBkZWYuZWxlbWVudG8sIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCBlc3RydWN0dXJhKTtcclxuICAgICAgICBpZiAoJ3Byb3AnIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGRlZi5lbGVtZW50bywgZGVmLnByb3AsIHZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJ2F0dHInIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRBdHRyRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYuYXR0ciwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgnc3R5bGUnIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGRlZi5lbGVtZW50by5zdHlsZSwgZGVmLnN0eWxlLCB2YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocm93VmFsaWRhdG9yLmFjdHVhbCkge1xyXG4gICAgICAgIHZhciB7IHRvcCwgYm90dG9tIH0gPSBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8ocm93VmFsaWRhdG9yLmFjdHVhbCk7XHJcbiAgICAgICAgaWYgKHRvcCAhPSBudWxsICYmIGJvdHRvbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhYi1hY3Rpdm8tYXJyaWJhJykuZWxUb3BWaXNpYmlsaXphciA9IHRvcDtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hYmFqbycpLmVsQm90dG9tVmlzaWJpbGl6YXIgPSBib3R0b207XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJFbGVtZW50b0VuZm9jYWRvKGlkVmFyaWFibGU6IElkVmFyaWFibGUgfCBJZEZpbikge1xyXG4gICAgdmFyIGVsZW1lbnRvVmFyaWFibGVBRW5mb2NhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVmFyaWFibGUgPT0gJ2ZpbicgPyBgYm90b24tdm9sdmVyLTJgIDogYHZhci0ke2lkVmFyaWFibGV9YClcclxuICAgICAgICB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFZhcmlhYmxlKTtcclxuICAgIHZhciBlbGVtZW50byA9IGVsZW1lbnRvVmFyaWFibGVBRW5mb2NhcjtcclxuICAgIHZhciBNQVJHRU5fU0NST0xMID0gNjQ7XHJcbiAgICB2YXIgYWx0b1BhbnRhbGxhID0gd2luZG93LmlubmVySGVpZ2h0ICogMC43IC0gTUFSR0VOX1NDUk9MTDtcclxuICAgIHZhciBlbGVtZW50b0VudGVybzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgZW50YXIgZW50ZXJvIGVuIHBhbnRhbGxhLCBkZWZpbmUgZWwgYm90dG9tXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvRW50ZXJvOiBSZWN0IHwgbnVsbCA9IG51bGw7XHJcbiAgICB2YXIgZWxlbWVudG9TdXBlcmlvcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgbW9zdHJhcnNlIGRlc2RlIGFycmliYSBhdW5xdWUgbm8gZW50cmUgZW50ZXJvLCBkZWZpbmUgZWwgdG9wXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvU3VwZXJpb3I6IFJlY3R8IG51bGwgPSBudWxsO1xyXG4gICAgd2hpbGUgKGVsZW1lbnRvICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIChlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ZhcmlhYmxlJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnbXVsdGlwbGUnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwcmVndW50YScpXHJcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvbmp1bnRvcHJlZ3VudGFzJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnc2VjY2lvbi1ib3Rvbi1mb3JtdWxhcmlvJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnYm90b25mb3JtdWxhcmlvJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnYm90b24tdm9sdmVyJylcclxuICAgICAgICAgICAgKSAmJiBlbGVtZW50by5vZmZzZXRIZWlnaHQgPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50b1N1cGVyaW9yID09IG51bGwgJiYgZWxlbWVudG8uY2xpZW50SGVpZ2h0IDwgYWx0b1BhbnRhbGxhKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50b0VudGVybyA9IGVsZW1lbnRvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRvRW50ZXJvID09IG51bGwpIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm9cclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBnZXRSZWN0KGVsZW1lbnRvRW50ZXJvISlcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3RFbGVtZW50b0VudGVybztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZ2V0UmVjdChlbGVtZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdEVsZW1lbnRvRW50ZXJvLnRvcCArIHJlY3RFbGVtZW50b0VudGVyby5oZWlnaHQgLSByZWN0LnRvcCA8IGFsdG9QYW50YWxsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3Q7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50byA9IGVsZW1lbnRvPy5wYXJlbnRFbGVtZW50ID8/IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAoZWxlbWVudG9TdXBlcmlvciA9PSBudWxsKSB7XHJcbiAgICAgICAgZWxlbWVudG9TdXBlcmlvciA9IGVsZW1lbnRvRW50ZXJvO1xyXG4gICAgfVxyXG4gICAgdmFyIHJlc3VsdDoge1xyXG4gICAgICAgIGVsZW1lbnRvSW5wdXRWYXJpYWJsZT86IEhUTUxFbGVtZW50IHwgbnVsbFxyXG4gICAgICAgIHRvcD86IG51bWJlciB8IG51bGxcclxuICAgICAgICBib3R0b20/OiBudW1iZXIgfCBudWxsXHJcbiAgICAgICAgZW5mb2NhZG8/OiBib29sZWFuIHwgbnVsbFxyXG4gICAgICAgIGRlc2VuZm9xdWU/OiBzdHJpbmcgfCBudWxsXHJcbiAgICB9ID0ge307XHJcbiAgICBpZiAoZWxlbWVudG9FbnRlcm8gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBnZXRSZWN0KGVsZW1lbnRvRW50ZXJvKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZWxlbWVudG9JbnB1dFZhcmlhYmxlID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgICAgIHZhciB0b3AgPSAocmVjdEVsZW1lbnRvU3VwZXJpb3IgPz8gcmVjdEVsZW1lbnRvRW50ZXJvKS50b3AgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgICAgIHJlc3VsdC50b3AgPSB0b3A7XHJcbiAgICAgICAgcmVzdWx0LmJvdHRvbSA9IHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0O1xyXG4gICAgICAgIGlmICh0b3AgPCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5kZXNlbmZvcXVlID0gJ2FycmliYSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZWN0RWxlbWVudG9FbnRlcm8udG9wICsgcmVjdEVsZW1lbnRvRW50ZXJvLmhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgKyBhbHRvUGFudGFsbGEpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWUgPSAnYWJham8nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lbmZvY2FkbyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0ckRpc3RpbnRvPE4gZXh0ZW5kcyBzdHJpbmc+KFxyXG4gICAgb2JqZXRvOiB7IHNldEF0dHJpYnV0ZTogKG5hbWU6IE4sIHZhbG9yOiBzdHJpbmcpID0+IHZvaWQsIGdldEF0dHJpYnV0ZTogKG5hbWU6IE4pID0+IHN0cmluZyB8IG51bGwgfSxcclxuICAgIG5hbWU6IE4sXHJcbiAgICB2YWxvcjogc3RyaW5nXHJcbikge1xyXG4gICAgaWYgKG9iamV0byAmJiBvYmpldG8uZ2V0QXR0cmlidXRlKG5hbWUpICE9IHZhbG9yKSB7XHJcbiAgICAgICAgb2JqZXRvLnNldEF0dHJpYnV0ZShuYW1lLCB2YWxvcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWxvckRpc3RpbnRvPFQgZXh0ZW5kcyB7fSwgTiBleHRlbmRzIGtleW9mIFQ+KFxyXG4gICAgb2JqZXRvOiBULFxyXG4gICAgbmFtZTogTixcclxuICAgIHZhbG9yOiBUW05dXHJcbikge1xyXG4gICAgaWYgKG9iamV0b1tuYW1lXSAhPSB2YWxvcikge1xyXG4gICAgICAgIG9iamV0b1tuYW1lXSA9IHZhbG9yO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQazogRm9yUGspIHtcclxuICAgIGlmIChlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyAmJiAhZGF0b3NCeVBhc3M/LnNvbG9MZWN0dXJhKSB7XHJcbiAgICAgICAgdmFyIHsgcmVzcHVlc3RhcyB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgICAgICBsaWtlQXIoZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb25maWdCb3RvbkZvcm11bGFyaW8sIGlkRm9ybXVsYXJpbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3BVQSA9IHJlc3B1ZXN0YXNbZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9baWRGb3JtdWxhcmlvXS51bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BVQSAhPSBudWxsICYmIHJlc3BVQSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdCb3RvbkZvcm11bGFyaW8uaGFiaWxpdGFyX2FncmVnYXJfbGlzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1snJEIuJyArIGlkRm9ybXVsYXJpbyBhcyBJZFZhcmlhYmxlXSA9ICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25faWRfcHJlZ3VudGEoX3BheWxvYWQ6IHsgcHJlZ3VudGE6IElkUHJlZ3VudGEsIGZvclBrOiBGb3JQayB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA9IFN5bWJvbCgnTk9fQ0FNQklBUl9TT0xPX1RSQUVSX1NUQVRVUycpXHJcbmV4cG9ydCBjb25zdCBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPID0gU3ltYm9sKCdOT19DQU1CSUFSX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8nKVxyXG5cclxuZnVuY3Rpb24gcmVmcmVzY2FyTWFyY2FEaXJ0eSgpIHtcclxuICAgIHZhciBib3RvbkdyYWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZS1idXR0b25cIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcbiAgICBpZiAoYm90b25HcmFiYXIpIHtcclxuICAgICAgICBpZiAoYm90b25HcmFiYXIuZGlzYWJsZWQgIT09ICFkYXRvc0J5UGFzcy5kaXJ0eSkge1xyXG4gICAgICAgICAgICBib3RvbkdyYWJhci5kaXNhYmxlZCA9ICFkYXRvc0J5UGFzcy5kaXJ0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwbGljYXJDYW1iaW9VbmFSZXNwdWVzdGEoXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUsXHJcbiAgICByZXNwdWVzdGFJbnB1dDogVmFsb3JcclxuKSB7XHJcbiAgICB2YXIgcmVzcHVlc3RhID0gcmVzcHVlc3RhSW5wdXQ7XHJcbiAgICB2YXIgdmFsb3JBbnRlcmlvciA9IHJlc3B1ZXN0YXNbdmFyaWFibGVdO1xyXG4gICAgaWYgKHJlc3B1ZXN0YSA9PT0gJycpIHtcclxuICAgICAgICByZXNwdWVzdGEgPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmIChlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IudmFyaWFibGVzW3ZhcmlhYmxlXT8udGlwbyA9PSAnbnVtZXJvJykge1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXNwdWVzdGEgPSBOdW1iZXIocmVzcHVlc3RhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBzaSBlcyB1biBmYWxzeSAoMCA9PSBmYWxzZSkgdGVuZ28gcXVlIGNvbXBhcmFyIGNvbiAhPT1cclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IHJlc3B1ZXN0YSA/IHZhbG9yQW50ZXJpb3IgIT0gcmVzcHVlc3RhIDogdmFsb3JBbnRlcmlvciAhPT0gcmVzcHVlc3RhO1xyXG4gICAgaWYgKHJlY2VudE1vZGlmaWVkKSB7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1t2YXJpYWJsZV0gPSByZXNwdWVzdGEgPz8gbnVsbDsgLy8gY2FtYmlvIHVuZGVmaW5lZCBwb3IgbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQsIHZhbG9yQW50ZXJpb3IsIHJlc3B1ZXN0YVByb2Nlc2FkYTogcmVzcHVlc3RhIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKFxyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgcmVzcHVlc3RhczogUmVzcHVlc3RhcyxcclxuICAgIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeixcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgdmFyaWFibGVzTW9kaWZpY2FkYXM6IElkVmFyaWFibGVbXSxcclxuICAgIHJlY2VudE1vZGlmaWVkOiBib29sZWFuXHJcbikge1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGlmIChlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiAhZGF0b3NCeVBhc3M/LnNvbG9MZWN0dXJhKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2ZXJpZmljYXJTb3J0ZW8oe1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlbzogZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1tlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKV0sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1JhaXosXHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUFjdHVhbDogdmFyaWFibGVzTW9kaWZpY2FkYXNbaV0sXHJcbiAgICAgICAgICAgICAgICBmb3JQazogZm9yUGtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBkYXRvc0J5UGFzcy5kaXJ0eSB8fCByZWNlbnRNb2RpZmllZDtcclxuICAgIHJlc3B1ZXN0YXNSYWl6LiRkaXJ0eSA9IHJlc3B1ZXN0YXNSYWl6LiRkaXJ0eSB8fCByZWNlbnRNb2RpZmllZDtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgeyBhdXRvSW5ncmVzbzogdHJ1ZSB9KTtcclxuICAgIHZhciBmZWVkYmFja1JvdyA9IGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yW3RvUGxhaW5Gb3JQayhmb3JQayldO1xyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQayk7XHJcbiAgICBjb25zdCB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUpO1xyXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIHZhciB2ID0gdmFyaWFibGVzTW9kaWZpY2FkYXNbal07XHJcbiAgICAgICAgbm90aWZpY2FyQ2FtYmlvVmFyaWFibGUodiBhcyBzdHJpbmcsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3ZdLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMpO1xyXG4gICAgfVxyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG4gICAgcmV0dXJuIGZlZWRiYWNrUm93O1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGs6IEZvclBrKSB7XHJcbiAgICBpZiAoY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzKSB7XHJcbiAgICAgICAgY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzKGZvclBrKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhKHBheWxvYWQ6IHtcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHZhcmlhYmxlOiBJZFZhcmlhYmxlIHwgdHlwZW9mIE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTLFxyXG4gICAgcmVzcHVlc3RhOiBWYWxvciB8IHR5cGVvZiBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPXHJcbn0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB0b2tlbiA9ICdBVkVSSUdVQVIgVE9ETyc7XHJcbiAgICBsZXQgeyBmb3JQaywgcmVzcHVlc3RhLCB2YXJpYWJsZSB9ID0gcGF5bG9hZDtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgdmFyIHZhbG9yQW50ZXJpb3IgPSB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA/IHJlc3B1ZXN0YXNbdmFyaWFibGVdIDogbnVsbDtcclxuICAgIHZhciBmZWVkYmFja1JvdyA9IGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yW3RvUGxhaW5Gb3JQayhmb3JQayldO1xyXG4gICAgdmFyIHNpZ3VpZW50ZVZhcmlhYmxlOiBJZFZhcmlhYmxlIHwgSWRGaW4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChyZXNwdWVzdGEgIT09IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gJiYgdmFyaWFibGUgIT0gTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMpIHtcclxuICAgICAgICB2YXIgcmVzQ2FtYmlvID0gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShmb3JQaywgcmVzcHVlc3RhcywgdmFyaWFibGUsIHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgcmVjZW50TW9kaWZpZWQgPSByZXNDYW1iaW8ucmVjZW50TW9kaWZpZWQ7XHJcbiAgICAgICAgaWYgKCFyZWNlbnRNb2RpZmllZCkge1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3ZhcmlhYmxlXT8uc2lndWllbnRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFyaWFibGUgIT0gTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMgJiYgKHJlY2VudE1vZGlmaWVkIHx8IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gJiYgZmVlZGJhY2tSb3cuYXV0b0luZ3Jlc2FkYXM/Llt2YXJpYWJsZV0pKSB7XHJcbiAgICAgICAgZmVlZGJhY2tSb3cgPSByZWZyZXNjYXJZUmVjYWxjdWxhckJ5cGFzcyhmb3JQaywgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgW3ZhcmlhYmxlXSwgcmVjZW50TW9kaWZpZWQpO1xyXG4gICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gdmFyaWFibGU7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3NpZ3VpZW50ZVZhcmlhYmxlXT8uc2lndWllbnRlO1xyXG4gICAgICAgIH0gd2hpbGUgKHZhbG9yQW50ZXJpb3IgPT0gbnVsbCAmJiByZWNlbnRNb2RpZmllZCAmJiBzaWd1aWVudGVWYXJpYWJsZSAhPSBudWxsICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9ICdmaW4nICYmIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbc2lndWllbnRlVmFyaWFibGVdLmZ1bmNpb25BdXRvSW5ncmVzYXIpO1xyXG4gICAgICAgIGlmIChzaWd1aWVudGVWYXJpYWJsZSA9PSBudWxsICYmIGZlZWRiYWNrUm93LmZlZWRiYWNrW3ZhcmlhYmxlXT8uZXN0YWRvID09ICd2YWxpZGEnKSB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gJ2Zpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQsIHNpZ3VpZW50ZVZhcmlhYmxlLCB2YXJpYWJsZUFjdHVhbDogZmVlZGJhY2tSb3cuYWN0dWFsIH07XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlZ2lzdHJvUmVzcHVlc3RhU2ltcGxlID0ge1xyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUsXHJcbiAgICByZXNwdWVzdGE6IFZhbG9yXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGFzKHBheWxvYWQ6IHtcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHJlc3B1ZXN0YXM6IFJlZ2lzdHJvUmVzcHVlc3RhU2ltcGxlW11cclxufSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGssIHJlc3B1ZXN0YXM6IGxpc3RhUmVzcHVlc3RhcyB9ID0gcGF5bG9hZDtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgcmVjZW50TW9kaWZpZWRBbnkgPSBmYWxzZTtcclxuICAgIHZhciB2YXJpYWJsZXNNb2RpZmljYWRhczogSWRWYXJpYWJsZVtdID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0YVJlc3B1ZXN0YXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGxpc3RhUmVzcHVlc3Rhc1tpXTtcclxuICAgICAgICB2YXIgcmVzQ2FtYmlvID0gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShmb3JQaywgcmVzcHVlc3RhcywgaXRlbS52YXJpYWJsZSwgaXRlbS5yZXNwdWVzdGEpO1xyXG4gICAgICAgIGlmIChyZXNDYW1iaW8ucmVjZW50TW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgcmVjZW50TW9kaWZpZWRBbnkgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXJpYWJsZXNNb2RpZmljYWRhcy5wdXNoKGl0ZW0udmFyaWFibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVjZW50TW9kaWZpZWRBbnkgJiYgdmFyaWFibGVzTW9kaWZpY2FkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKGZvclBrLCByZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB2YXJpYWJsZXNNb2RpZmljYWRhcywgcmVjZW50TW9kaWZpZWRBbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHJlY2VudE1vZGlmaWVkOiByZWNlbnRNb2RpZmllZEFueSB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9ub3RhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIHRhcmVhOiBJZFRhcmVhLCBub3RhOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgdGFyZWEsIG5vdGEgfSA9IHBheWxvYWQ7XHJcbiAgICBjb25zb2xlLmxvZyhcIkZBTFRBIC8vIFRPRE9cIilcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hZ3JlZ2FyX3Zpc2l0YShwYXlsb2FkOiB7IGZvclBrUmFpejogRm9yUGtSYWl6LCBvYnNlcnZhY2lvbmVzOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgb2JzZXJ2YWNpb25lcyB9ID0gcGF5bG9hZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9tb2RpZmljYXJfdmlzaXRhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIGluZGV4OiBudW1iZXIsIG9wY2lvbjoga2V5b2YgVmlzaXRhLCB2YWxvcjogc3RyaW5nIHwgbnVsbCB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIGluZGV4LCBvcGNpb24sIHZhbG9yIH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl92aXNpdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgaW5kZXg6IG51bWJlciB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIGluZGV4IH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyh7IGZvclBrIH06IHsgZm9yUGs6IEZvclBrIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzQXVtZW50YWRhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHJlY2FsY3VsYXJUb2RvRWxBcmJvbChyZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6KTtcclxuICAgIHJlY2FsY3VsYXJDb21vZGluZXNGb3JQayhmb3JQayk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcywgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBudWxsLCB7fSlcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrKTtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hYnJpcl9mb3JtdWxhcmlvKHsgZm9yUGsgfTogeyBmb3JQazogRm9yUGsgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUsIHRydWUpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl9mb3JtdWxhcmlvKHsgZm9yUGssIGZvclBrUGFkcmUgfTogeyBmb3JQazogRm9yUGssIGZvclBrUGFkcmU6IEZvclBrIH0pIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzIHwgdW5kZWZpbmVkID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpc1xyXG4gICAgdmFyIHVhRGVmOiBVbmlkYWRBbmFsaXNpcyA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBpbmRleCA9IGZvclBrW3VhRGVmLnBrX2FncmVnYWRhXSBhcyBudW1iZXI7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzOiByZXNwdWVzdGFzUGFkcmUgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQa1BhZHJlLCB0cnVlLCB0cnVlKTtcclxuICAgIChyZXNwdWVzdGFzUGFkcmVbdW5pZGFkX2FuYWxpc2lzXSBhcyBSZXNwdWVzdGFzW10pLnNwbGljZShpbmRleCAtIDEsIDEpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrUGFkcmUpO1xyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBkYXRvc0J5UGFzcy5kaXJ0eSB8fCB0cnVlO1xyXG4gICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHRydWU7XHJcbiAgICByZWZyZXNjYXJNYXJjYURpcnR5KCk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHsgYXV0b0luZ3Jlc286IHRydWUgfSk7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQa1BhZHJlKTtcclxuICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtQYWRyZSk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hCeVBhc3M8VCwgUj4oXHJcbiAgICBmdW46IChwYXlsb2FkOiBULCBkYXRvczogdHlwZW9mIGRhdG9zQnlQYXNzKSA9PiBSLFxyXG4gICAgcGF5bG9hZDogVFxyXG4pIHtcclxuICAgIHJldHVybiBmdW4ocGF5bG9hZCwgZGF0b3NCeVBhc3MpO1xyXG59XHJcblxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCB1bHRpbWFWYXJpYmxlVml2aWVuZGEgPSAnTk9fRVNUQV9ERUZJTklEQV9BVU4vL1RPRE8nIGFzIElkVmFyaWFibGU7XHJcblxyXG5leHBvcnQgY29uc3QgTUFYQ1AgPSAyMDtcclxuXHJcbi8qIFJFRFVDRVJTICovXHJcblxyXG52YXIgcmVlbXBsYXpvc0hhYmlsaXRhcjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgIGZhbHNlOiAnZmFsc2UnLFxyXG4gICAgdHJ1ZTogJ3RydWUnLFxyXG4gICAgXCI9XCI6ICc9PScsXHJcbiAgICBcIjw+XCI6ICchPScsXHJcbiAgICBcIiZcIjogJyYmJyxcclxuICAgIFwifFwiOiAnfHwnLFxyXG4gICAgXCJPUlwiOiAnfHwnLFxyXG4gICAgXCJBTkRcIjogJyYmJyxcclxuICAgIFwib3JcIjogJ3x8JyxcclxuICAgIFwiYW5kXCI6ICcmJicsXHJcbiAgICBcIm5vdFwiOiAnIScsXHJcbiAgICBcIk5PVFwiOiAnIScsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaGVscGVyc0Nhc2lsbGVyb3MgPSB7XHJcbiAgICBudWxsMnplcm8ocG9zaWJsZU51bGw6IGFueSkge1xyXG4gICAgICAgIGlmIChwb3NpYmxlTnVsbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9zaWJsZU51bGw7XHJcbiAgICB9LFxyXG4gICAgZGl2MGVycihudW1lcmFkb3I6IG51bWJlciwgZGVub21pbmFkb3I6IG51bWJlciwgcGs6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChkZW5vbWluYWRvciA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGVuIFwiICsgcGsgKyBcIiBkaXZpc2lvbiBwb3IgY2VybyBkZSBcIiArIG51bWVyYWRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1lcmFkb3IgLyBkZW5vbWluYWRvcjtcclxuICAgIH0sXHJcbiAgICBmdW5zOiB7XHJcbiAgICAgICAgYmxhbmNvKHg6IGFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4geCAhPT0gMCAmJiAheFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaG95KCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b2RheSgpLnRvRG15KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZlY2hhX3ZhbGlkYSh4OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgdmFyIGZvcm1hdG9fdmFsaWRvID0gL14oWzEtOV18MFsxLTldfFsxMl1cXGR8M1swMV0pXFwvKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvMjBcXGRcXGQkLy50ZXN0KHgpXHJcbiAgICAgICAgICAgIHZhciB4RGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnNpb25PazogYm9vbGVhbjtcclxuICAgICAgICAgICAgY29udmVyc2lvbk9rID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm1hdG9fdmFsaWRvKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBbZCwgbSwgeV0gPSB4LnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHhEYXRlID0gbmV3IERhdGUoYCR7eX0vJHttfS8ke2R9YCk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uT2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy9mYWx0YXJpYSB2YWxpZGFyIHF1ZSBubyBzZWEgdW5hIGZlY2hhIGZ1dHVyYSB5IHF1ZSBzZWEgdW5hIGZlY2hhIGVuIGVsIHJhbmdvIGRlbCBvcGVyYXRpdm9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvICYmIGNvbnZlcnNpb25Pa1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWVzYW5pb192YWxpZG8oeDogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtYXRvX3ZhbGlkbyA9IC9eKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvKDE5fDIwKVxcZFxcZCQvLnRlc3QoeClcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbmZvcm1hZG8oeDogYW55KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB4ICE9PSB1bmRlZmluZWQgJiYgeCAhPT0gbnVsbCAmJiAoISh4IGluc3RhbmNlb2YgQXJyYXkpIHx8IHgubGVuZ3RoICE9PSAwKVxyXG4gICAgICAgICAgICAgICAgJiYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgT2JqZWN0LmtleXMoeCkubGVuZ3RoICE9PSAwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbnNuYyh4OiBhbnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHggPT0gLTlcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcih4OiBudW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHggJSAyID09IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkYWRfbWVzX2FubmlvX3ZhbGlkbyhlZGFkOiBudW1iZXIsIG1lc0FubmlvOiBzdHJpbmcsIGZlY2hhUmVhbGl6YWNpb25ERE1NWVlZWTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHZhciBtZXNlc0RpZmVyZW5jaWEgPSAoZDE6IERhdGUsIGQyOiBEYXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9udGhzO1xyXG4gICAgICAgICAgICAgICAgbW9udGhzID0gKGQyLmdldEZ1bGxZZWFyKCkgLSBkMS5nZXRGdWxsWWVhcigpKSAqIDEyO1xyXG4gICAgICAgICAgICAgICAgbW9udGhzIC09IGQxLmdldE1vbnRoKCk7XHJcbiAgICAgICAgICAgICAgICBtb250aHMgKz0gZDIuZ2V0TW9udGgoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgPD0gMCA/IDAgOiBtb250aHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHBhcnRlc1JlYWxpemFjaW9uID0gZmVjaGFSZWFsaXphY2lvbkRETU1ZWVlZLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIGxhcyBwYXJ0ZXMgY29ycmVzcG9uZGVuIGEgdW5hIGZlY2hhIHbDoWxpZGFcclxuICAgICAgICAgICAgdmFyIHRvZGF5ID0gZGF0ZS55bWQoTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzJdKSwgTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzFdKSwgTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzBdKSlcclxuICAgICAgICAgICAgdmFyIHBhcnRlc01lc0FubmlvID0gbWVzQW5uaW8uc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIGxhcyBwYXJ0ZXMgY29ycmVzcG9uZGVuIGEgdW5hIGZlY2hhIHbDoWxpZGFcclxuICAgICAgICAgICAgdmFyIG5hY2ltaWVudG8gPSBkYXRlLnltZChOdW1iZXIocGFydGVzTWVzQW5uaW9bMV0pLCBOdW1iZXIocGFydGVzTWVzQW5uaW9bMF0pLCAxKVxyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgUmVhbERhdGUgZXMgRGF0ZSB5IHNlIHB1ZWRlIHJlc3RhclxyXG4gICAgICAgICAgICB2YXIgZGlmZXJlbmNpYU1lc2VzID0gbWVzZXNEaWZlcmVuY2lhKG5hY2ltaWVudG8sIHRvZGF5KTtcclxuICAgICAgICAgICAgdmFyIGVkYWREZWNpbWFsZXMgPSBkaWZlcmVuY2lhTWVzZXMgLyAxMjsgLy9laiAzNi41XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGVkYWREZWNpbWFsZXMpID09IGVkYWQgfHwgLy9taXNtYSBlZGFkXHJcbiAgICAgICAgICAgICAgICBlZGFkRGVjaW1hbGVzID09IGVkYWQgKyAxIC8vbWVzIGRlIHRvbGVyYW5jaWFcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy9jb3BpYXJfY2FtcG9fdWFfcmFtYShyZXNwdWVzdGFzT3JpZ2VuOlJlc3B1ZXN0YXNbXSwgcG9zaWNpb246bnVtYmVyLCB2YXJpYWJsZU9yaWdlbjogSWRWYXJpYWJsZSwgY2FtaW5vOnN0cmluZywgY29uZGljaW9uOmJvb2xlYW4pe1xyXG4gICAgICAgIC8vICAgIHJldHVybiBjb25kaWNpb24/KHJlc3B1ZXN0YXNPcmlnZW4gJiYgcmVzcHVlc3Rhc09yaWdlbltwb3NpY2lvbi0xXSAmJiByZXNwdWVzdGFzT3JpZ2VuW3Bvc2ljaW9uLTFdW2Ake2NhbWlub31gXVt2YXJpYWJsZU9yaWdlbl0pOm51bGxcclxuICAgICAgICAvLyAgICByZXR1cm4gY29uZGljaW9uP2V2YWwoYHJlc3B1ZXN0YXNPcmlnZW5bJHtwb3NpY2lvbi0xfV0uYCtjYW1pbm8rJy4nK3ZhcmlhYmxlT3JpZ2VuKTpudWxsO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgZGJvOntcclxuICAgICAgICAgICAgZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlciwgZGF0bzpzdHJpbmcpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiBpbmZvcm1hZG8oeHBlcnNvbmFzKSAmJiBwZXI8PSB4cGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXhwZXJzb25hc1twZXItMV1bZGF0b10/IHhwZXJzb25hc1twZXItMV1bZGF0b106bnVsbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGFkZmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlciwnZWRhZCcpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV4aXN0ZWluZGl2aWR1YWwoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgISFwZXJzb25hcyAmJiBwZXI8PSBwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xICYmICEhcGVyc29uYXNbcGVyLTFdWydlbnRyZWFpbmQnXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleGlzdGVtaWVtYnJvKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEhcGVyc29uYXMgJiYgcGVyPD0gcGVyc29uYXMubGVuZ3RoICYmIHBlcj49MVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBucm9jb255dWdlcyhlbmN1OnN0cmluZyxob2c6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXNcclxuICAgICAgICAgICAgICAgIHJldHVybiB4cGVyc29uYXMuZmlsdGVyKCBwZXItPnBlci5wND09MikubGVuZ3RoXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5yb2plZmVzKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVyc29uYXMuZmlsdGVyKCBwZXItPnBlci5wND09MSkubGVuZ3RoXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBhcmVudGVzY29mYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsJ3A0JylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V4b2ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEheHBlcnNvbmFzICYmIHBlcjw9IHhwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xICYmICEheHBlcnNvbmFzW3Blci0xXS5zZXhvPyB4cGVyc29uYXNbcGVyLTFdWydzZXhvJ106bnVsbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXRjb255amVmZShlbmN1OnN0cmluZyxob2c6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlciwxLCdwNScpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ICovXHJcbiAgICB9XHJcbn07XHJcblxyXG50eXBlIEZ1bmNpb25IYWJpbGl0YXIgPSAodmFsb3JlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gYm9vbGVhbjtcclxudHlwZSBGdW5jaW9uVmFsb3JhciA9ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBhbnk7XHJcbnZhciBmdW5jaW9uZXNIYWJpbGl0YXI6IHsgW2tleTogc3RyaW5nXTogRnVuY2lvbkhhYmlsaXRhciB9ID0ge1xyXG59XHJcbnZhciBmdW5jaW9uZXNWYWxvcmFyOiB7IFtrZXk6IHN0cmluZ106IEZ1bmNpb25WYWxvcmFyIH0gPSB7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtaW5pQ29tcGlsYWRvclNRbEpzKGV4cHJlc2lvbkNhc2lTUUw6IHN0cmluZykge1xyXG4gICAgdmFyIGV4cHJlc2lvbiA9IGV4cHJlc2lvbkNhc2lTUUwucmVwbGFjZSgvXFx1MDBBMC9nLCAnICcpO1xyXG4gICAgdmFyIGN1ZXJwbyA9IGV4cHJlc2lvbi5yZXBsYWNlKC9cXGJpcyBkaXN0aW5jdCBmcm9tXFxiL2dpLCAnIT0nKS5yZXBsYWNlKC9cXGIuKz9cXGIvZywgZnVuY3Rpb24gKGVsVG9rZW4pIHtcclxuICAgICAgICB2YXIgZWxUb2tlblRyaW1lYWRvID0gZWxUb2tlbi50cmltKCk7XHJcbiAgICAgICAgaWYgKGVsVG9rZW5UcmltZWFkbyBpbiByZWVtcGxhem9zSGFiaWxpdGFyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWVtcGxhem9zSGFiaWxpdGFyW2VsVG9rZW5UcmltZWFkb107XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxcZCtcXC4/XFxkKiQvLnRlc3QoZWxUb2tlblRyaW1lYWRvKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxUb2tlblxyXG4gICAgICAgIH0gZWxzZSBpZiAoL15cXFcrJC8udGVzdChlbFRva2VuVHJpbWVhZG8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxccyskLy50ZXN0KGVsVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4nICsgZWxUb2tlbiArICcpJztcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGN1ZXJwbztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmNpb25Db21waWxhZGE8VD4oY29uanVudG9EZUZ1bmNpb25lczogeyBba2V5OiBzdHJpbmddOiAodmFsb3JlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gVCB9KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnM6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSkge1xyXG4gICAgICAgICAgICB2YXIgY3VlcnBvID0gbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBjdWVycG8gPSBtaW5pQ29tcGlsYWRvclNRbEpzKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnMpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGludGVybmFsRnVuID0gbmV3IEZ1bmN0aW9uKCd2YWxvcmVzJywgJ2hlbHBlcnMnLCAncmV0dXJuICcgKyBjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSA9IGZ1bmN0aW9uICh2YWxvcmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGludGVybmFsRnVuKHZhbG9yZXMsIGhlbHBlcnNDYXNpbGxlcm9zKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SIEVKRUNVQ0NJT04gRVhQUkVTSU9OIEVYVEVSTkEgJywgbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcywgZXhwZWN0ZWQoZXJyKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3VlcnBvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codmFsb3Jlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1IgQ09NUElMQUNJT04gRVhQUkVTSU9OIEVYVEVSTkEgJywgbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcywgZXhwZWN0ZWQoZXJyKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGN1ZXJwbyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmp1bnRvRGVGdW5jaW9uZXNbbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kc107XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGdW5jaW9uSGFiaWxpdGFyID0gZ2V0RnVuY2lvbkNvbXBpbGFkYShmdW5jaW9uZXNIYWJpbGl0YXIpO1xyXG5leHBvcnQgY29uc3QgZ2V0RnVuY2lvblZhbG9yYXIgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc1ZhbG9yYXIpO1xyXG5cclxuY29uc3QgZXZhbHVhckV4cHJlc2lvblJlYTogRXZhbHVhZG9yRXhwcmVzaW9uID0gKGNvbmRpY2lvbkpzLCByZXNwdWVzdGFzKSA9PlxyXG4gICAgZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25kaWNpb25KcykocmVzcHVlc3Rhcyk7XHJcblxyXG52YXIgcm93VmFsaWRhdG9yID0gZ2V0Um93VmFsaWRhdG9yPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4oeyBnZXRGdW5jaW9uSGFiaWxpdGFyLCBnZXRGdW5jaW9uVmFsb3JhciB9KVxyXG5cclxuZXhwb3J0IHZhciBkZWZPcGVyYXRpdm86IERlZk9wZXJhdGl2byA9IHtcclxuICAgIGVzTm9SZWE6IChyZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCB0YXJlYTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgICAgICBjb25zdCB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gIXVhLnBhZHJlKTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVzdWx0OiBSZXN1bHRhZG9SZWFOb1JlYTwnY29kTm9SZWEnLCAnZXNOb1JlYSc+ID0ge1xyXG4gICAgICAgICAgICBjb2ROb1JlYTogbnVsbCxcclxuICAgICAgICAgICAgZXNOb1JlYTogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgeyBjb2RSZWEsIGVzUmVhIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGEocmVzcHVlc3RhcywgdGFyZWEpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghZXNSZWEpIHtcclxuICAgICAgICAgICAgY29uc3Qge2NvZGlnbywgcmVzdWx0YWRvfSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKHVhUHJpbmNpcGFsISwgcmVzcHVlc3RhcywgZXN0cnVjdHVyYS5ub1JlYXMsICdub19yZWEnLCB0YXJlYSk7XHJcbiAgICAgICAgICAgIGlmKGNvZGlnbyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvZE5vUmVhID0gY29kaWdvO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmVzTm9SZWEgPSByZXN1bHRhZG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgZXNOb1JlYVN1cDogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIHRhcmVhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIGNvbnN0IHVhUHJpbmNpcGFsID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiAhdWEucGFkcmUpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBSZXN1bHRhZG9SZWFOb1JlYTwnY29kTm9SZWFTdXAnLCAnZXNOb1JlYVN1cCc+ID0ge1xyXG4gICAgICAgICAgICBjb2ROb1JlYVN1cDogbnVsbCxcclxuICAgICAgICAgICAgZXNOb1JlYVN1cDogZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHtjb2RpZ28sIHJlc3VsdGFkb30gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbCEsIHJlc3B1ZXN0YXMsIGVzdHJ1Y3R1cmEubm9SZWFzU3VwLCAnbm9fcmVhX3N1cCcsIHRhcmVhKTtcclxuICAgICAgICBpZiAoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jb2ROb1JlYVN1cCA9IGNvZGlnbztcclxuICAgICAgICAgICAgcmVzdWx0LmVzTm9SZWFTdXAgPSByZXN1bHRhZG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGVzUmVhbGl6YWRhOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcywgdGFyZWE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICAgICAgY29uc3QgdWFQcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEpID0+ICF1YS5wYWRyZSk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2RSZWEnLCAnZXNSZWEnPiA9IHtcclxuICAgICAgICAgICAgY29kUmVhOiBudWxsLFxyXG4gICAgICAgICAgICBlc1JlYTogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3Qge2NvZGlnbywgcmVzdWx0YWRvfSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKHVhUHJpbmNpcGFsISwgcmVzcHVlc3RhcywgZXN0cnVjdHVyYS5yZWFzLCAncmVhJywgdGFyZWEsIGV2YWx1YXJFeHByZXNpb25SZWEpO1xyXG4gICAgICAgIGlmKGNvZGlnbyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXN1bHQuY29kUmVhID0gY29kaWdvO1xyXG4gICAgICAgICAgICByZXN1bHQuZXNSZWEgPSByZXN1bHRhZG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGVzUmVhbGl6YWRhU3VwOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcywgdGFyZWE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICAgICAgY29uc3QgdWFQcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEpID0+ICF1YS5wYWRyZSk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2RSZWFTdXAnLCAnZXNSZWFTdXAnPiA9IHtcclxuICAgICAgICAgICAgY29kUmVhU3VwOiBudWxsLFxyXG4gICAgICAgICAgICBlc1JlYVN1cDogZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHtjb2RpZ28sIHJlc3VsdGFkb30gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbCEsIHJlc3B1ZXN0YXMsIGVzdHJ1Y3R1cmEucmVhc1N1cCwgJ3JlYV9zdXAnLCB0YXJlYSwgZXZhbHVhckV4cHJlc2lvblJlYSk7XHJcbiAgICAgICAgaWYoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jb2RSZWFTdXAgPSBjb2RpZ287XHJcbiAgICAgICAgICAgIHJlc3VsdC5lc1JlYVN1cCA9IHJlc3VsdGFkbztcclxuICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIFVBcHJpbmNpcGFsOiAnJyBhcyBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgZGVmVUE6IHt9IGFzIHsgW2kgaW4gSWRVbmlkYWRBbmFsaXNpc106IHsgcGs6IElkVmFyaWFibGUsIGluY2x1aWRhczogSWRVbmlkYWRBbmFsaXNpc1tdLCBpZHNGb3I6IElkRm9ybXVsYXJpb1tdIH0gfSxcclxuICAgIGRlZkZvcjoge30gYXMgeyBbZiBpbiBJZEZvcm11bGFyaW9dOiB7IGhlcm1hbm8/OiB0cnVlIH0gfVxyXG59O1xyXG5cclxuXHJcbi8vIDEuIFNvYnJlY2FyZ2EgcGFyYSBsYSBmb3JtYSBhbnRpZ3VhICg0IGZ1bmNpb25lcyBwb3NpY2lvbmFsZXMpXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxvUmVhTm9SZWEoXHJcbiAgICBlc05vUmVhOiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzTm9SZWEnXSxcclxuICAgIGVzTm9SZWFTdXA6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNOb1JlYVN1cCddLFxyXG4gICAgZXNSZWFsaXphZGE6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNSZWFsaXphZGEnXSxcclxuICAgIGVzUmVhbGl6YWRhU3VwOiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhU3VwJ11cclxuKTogdm9pZDtcclxuXHJcbi8vIDIuIFNvYnJlY2FyZ2EgcGFyYSBsYSBmb3JtYSBudWV2YSAob2JqZXRvIHBhcmNpYWwpXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxvUmVhTm9SZWEoXHJcbiAgICBmdW5jaW9uZXM6IFBhcnRpYWw8RnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhPlxyXG4pOiB2b2lkO1xyXG5cclxuLy8gMy4gSW1wbGVtZW50YWNpw7NuIHVuaWZpY2FkYVxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3Vsb1JlYU5vUmVhKFxyXG4gICAgZXNOb1JlYU9yRnVuY2lvbmVzOlxyXG4gICAgICAgIHwgRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc05vUmVhJ11cclxuICAgICAgICB8IFBhcnRpYWw8RnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhPixcclxuICAgIF9lc05vUmVhU3VwPzogRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc05vUmVhU3VwJ10sXHJcbiAgICBfZXNSZWFsaXphZGE/OiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhJ10sXHJcbiAgICBfZXNSZWFsaXphZGFTdXA/OiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhU3VwJ11cclxuKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIGVzTm9SZWFPckZ1bmNpb25lcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcInNldENhbGN1bG9SZWFOb1JlYTogbGEgZm9ybWEgYW50aWd1YSBlc3TDoSBkZXByZWNhZGEsIHNlIGlnbm9yYW4gc29icmVzY3JpdHVyYXMsIHVzYXIgc2V0Q2FsY3Vsb1JlYU5vUmVhKHsgZXNOb1JlYSwgZXNOb1JlYVN1cCwgZXNSZWFsaXphZGEsIGVzUmVhbGl6YWRhU3VwIH0pXCIpO1xyXG4gICAgICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBkZWZPcGVyYXRpdm8gPSB7XHJcbiAgICAgICAgICAgIC4uLmRlZk9wZXJhdGl2byxcclxuICAgICAgICAgICAgLi4uZXNOb1JlYU9yRnVuY2lvbmVzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gVE9ETzogR0VORVJBTElaQVJcclxudHlwZSBQZXJzb25hID0geyBwMTogc3RyaW5nLCBwMjogbnVtYmVyLCBwMzogbnVtYmVyLCBwNDogbnVtYmVyIHwgbnVsbCwgcDU6IDEgfCBudWxsLCBwNjogMSB8IG51bGwgfVxyXG5cclxuZnVuY3Rpb24gbnVtKG51bTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICBpZiAoaXNOYU4obnVtIC0gMCkpIHJldHVybiAwO1xyXG4gICAgLy9AdHMtaWdub3JlIGxhIGdyYWNpYSBlcyBtZXRlciBudW0gY3VhbmRvIGVzIHN0cmluZ1xyXG4gICAgcmV0dXJuIG51bSAtIDA7XHJcbn1cclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6IHsgW2sgaW4gc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZmljYXJTb3J0ZW8ob3B0czoge1xyXG4gICAgY29uZmlndXJhY2lvblNvcnRlbzogQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6XHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICB2YXJpYWJsZUFjdHVhbDogSWRWYXJpYWJsZVxyXG5cclxufSkge1xyXG4gICAgY29uc3QgcmVzZXRlYXJTb3J0ZW8gPSAob3B0czogeyByZXNwdWVzdGFzOiBSZXNwdWVzdGFzIH0pID0+IHtcclxuICAgICAgICB2YXIgeyByZXNwdWVzdGFzIH0gPSBvcHRzO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gbnVsbDtcclxuICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSBudWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9IG51bGw7XHJcbiAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKSA9PiByZXNwdWVzdGFzW21vc3RyYXIudGFyZ2V0XSA9IG51bGwpO1xyXG4gICAgICAgIGlmICgndmFyX2xldHJhJyBpbiBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kbykge1xyXG4gICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gJiYgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyIG9mIGl0ZXJhdG9yKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBlcltjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfbGV0cmFdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgeyBjb25maWd1cmFjaW9uU29ydGVvLCB2YXJpYWJsZUFjdHVhbCwgcmVzcHVlc3RhcywgZm9yUGssIHJlc3B1ZXN0YXNSYWl6IH0gPSBvcHRzO1xyXG4gICAgdmFyIGlkRW5jID0gZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXTtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlKTtcclxuICAgIHZhciBleHByX2luY29tcGxldGl0dWRfZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmV4cHJfaW5jb21wbGV0aXR1ZF9qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pbyBhcyB1bmtub3duIGFzIG51bWJlcl0uZXhwcik7XHJcbiAgICB2YXIgZmlsdHJvX2Z1biA9IGdldEZ1bmNpb25IYWJpbGl0YXIoY29uZmlndXJhY2lvblNvcnRlby5maWx0cm9fanNbcmVzcHVlc3Rhc0F1bWVudGFkYXMudmRvbWluaW8gYXMgdW5rbm93biBhcyBudW1iZXJdLmV4cHIpO1xyXG4gICAgdmFyIHVuaWRhZEFuYWxpc2lzID0gY29uZmlndXJhY2lvblNvcnRlby51bmlkYWRfYW5hbGlzaXM7XHJcblxyXG4gICAgaWYgKGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1ldHJvcy5pbmNsdWRlcyh2YXJpYWJsZUFjdHVhbCkpIHtcclxuICAgICAgICB2YXIgdWFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVuaWRhZEFuYWxpc2lzKT8ucGFkcmU7XHJcbiAgICAgICAgdmFyIHBrQWdyZWdhZGFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVhUGFkcmUpPy5wa19hZ3JlZ2FkYVxyXG4gICAgICAgIGlmIChlc3RydWN0dXJhLmNvblJlYUhvZ2FyKSB7XHJcbiAgICAgICAgICAgIGlmICh1YVBhZHJlICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdKSB7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgcGtBZ3JlZ2FkYVBhZHJlIGV4aXN0ZSBlIGluZGljYSBsYSBwb3NpY2lvbiBkZWwgcGFkcmVcclxuICAgICAgICAgICAgICAgIHZhciBwYWRyZSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdW051bWJlcihyZXNwdWVzdGFzQXVtZW50YWRhc1twa0FncmVnYWRhUGFkcmVdKSAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlQWN0dWFsICE9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRyZVtjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSA9IGxpa2VBcihwYWRyZVt1bmlkYWRBbmFsaXNpc10gfHwgW10pLmFycmF5KCkubGVuZ3RoOyAvL3NpIGFncmVnYSBkZXNkZSBib3RvbiBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNldGVhclNvcnRlbyh7IHJlc3B1ZXN0YXM6IHBhZHJlIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3RhcyA9IHBhZHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHVhUGFkcmUgJiYgcmVzcHVlc3Rhc1JhaXopIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBwa0FncmVnYWRhUGFkcmUgZXhpc3RlIGUgaW5kaWNhIGxhIHBvc2ljaW9uIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICAgICAgdmFyIHBhZHJlID0gcmVzcHVlc3Rhc1JhaXo7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gbGlrZUFyKHBhZHJlW3VuaWRhZEFuYWxpc2lzXSB8fCBbXSkuYXJyYXkoKS5sZW5ndGg7IC8vc2kgYWdyZWdhIGRlc2RlIGJvdG9uIGFncmVnYXJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhczogcGFkcmUgfSk7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0gcGFkcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBhcyBSZXNwdWVzdGFzW11cclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSAhPSAxKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gcmVzcHVlc3Rhc1VBLmxlbmd0aCArIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhcyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRUb3RhbCA9IE51bWJlcihyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkVG90YWwgPCByZXNwdWVzdGFzVUEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2JsZSBhc2lnbmFjacOzbiBwYXJhIHF1ZSBsbyBjYXJndWUgZW4gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1VBLmZpbHRlcigocCwgaSkgPT5cclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtZXRyb3Muc29tZSgocGFyYW0pID0+IHBbcGFyYW1dIHx8IGkgPD0gY2FudGlkYWRUb3RhbCAtIDEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gPSByZXNwdWVzdGFzVUFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRUb3RhbCA+IHJlc3B1ZXN0YXNVQS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5wdXNoKHt9IGFzIFJlc3B1ZXN0YXMpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc10gPSByZXNwdWVzdGFzVUEuZmlsdGVyKHAgPT4gZXhwcl9pbmNvbXBsZXRpdHVkX2Z1bihwKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgdmFyJHAwID0gXCIkcDBcIiBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl0gPT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgIXJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dICYmXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uaW5jb21wbGV0YXNdID09IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc29ydGVhciA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocCA9PiBmaWx0cm9fZnVuKHApKTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3J0ZWFyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5mb3JFYWNoKChwZXIsIGkpID0+IHBlclt2YXIkcDBdID0gaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ub3JkZW4ucHVzaCh7IHZhcmlhYmxlOiB2YXIkcDAsIG9yZGVuOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlYXIuc29ydChjb21wYXJlRm9yT3JkZXIoY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5tYXAoZWxlbSA9PiAoeyBjb2x1bW46IGVsZW0udmFyaWFibGUsIG9yZGVyOiBlbGVtLm9yZGVuIH0pKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3NpY2lvblNvcnRlYWRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby5tZXRvZG8gPT0gJ2hhc2gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTk8gSU1QTEVNRU5UQURPJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qcG9zaWNpb25Tb3J0ZWFkYT0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfY29lZi5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdW0sIHBhaXIpPT5zdW0gKyBkYXRvc1ZpdmllbmRhLnRlbVtwYWlyLnZhcl0gKiBwYWlyLmNvZWYpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby5kaXZpc29yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJSBzb3J0ZWFyLmxlbmd0aCovXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxldHJhID0gJ0EnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJMZXRyYTogSWRWYXJpYWJsZSA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnZhcl9sZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyc29uYSBvZiBzb3J0ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUEuZmluZCgoX3BlciwgaSkgPT4gaSA9PSBwZXJzb25hW3ZhciRwMF0gYXMgbnVtYmVyIC0gMSkhW3ZhckxldHJhXSA9IGxldHJhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYVt2YXJMZXRyYV0gPSBsZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHJhID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXRyYS5jaGFyQ29kZUF0KDApICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxhQWxlYXRvcmlhTWllbWJyb3MgPSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby50YWJsYS5tYXAoKGxpc3RhKSA9PiBsaXN0YS5zcGxpdCgnJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdG8gPSBpZEVuYyAlIDEwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uYVRhYmxhQWxlYXRvcmlhID0gcmVzdG8gPyByZXN0byAtIDEgOiA5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydGVhci5sZW5ndGggPiB0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVhci5zcGxpY2UodGFibGFBbGVhdG9yaWFNaWVtYnJvcy5sZW5ndGgpIC8vZGVzY2FydG8gY2FuZGlkYXRvcyBzaSBzb24gbcOhcyBxdWUgbG8gcXVlIHBlcm1pdGUgbGEgdGFibGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsYVRhYmxhQWxlYXRvcmlhID0gc29ydGVhci5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmFTZWxlY2Npb25hZGEgPSB0YWJsYUFsZWF0b3JpYU1pZW1icm9zW2ZpbGFUYWJsYUFsZWF0b3JpYV1bY29sdW1uYVRhYmxhQWxlYXRvcmlhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaWNpb25Tb3J0ZWFkYSA9IHJlc3B1ZXN0YXNVQS5maW5kSW5kZXgoKHA6IFJlc3B1ZXN0YXMpID0+IHBbdmFyTGV0cmFdID09IGxldHJhU2VsZWNjaW9uYWRhKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gcG9zaWNpb25Tb3J0ZWFkYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3NvcnRlYWJsZXNdID0gc29ydGVhci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8uc29ydGVhZG9fbW9zdHJhcj8uZm9yRWFjaCgobW9zdHJhcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbbW9zdHJhci50YXJnZXRdID0gcmVzcHVlc3Rhc1VBW3Jlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dIGFzIG51bWJlciAtIDFdW21vc3RyYXIuc291cmNlXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0gPSByZXNwdWVzdGFzVUEubGVuZ3RoIHx8IG51bGw7IC8vbm8gcXVlcmVtb3MgZWwgdmFsb3IgMFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQV0gPSAnb2snO1xyXG4gICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsXSA9ICdvayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgbm9kb0FjdHVhbDogUmVzcHVlc3RhcyB8IFJlc3B1ZXN0YXNbXSwgdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzLCBmb3JQa0FjdW11bGFkbzogRm9yUGspIHtcclxuICAgIHZhciB1YURlZiA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBlc0FycmF5ID0gbm9kb0FjdHVhbCBpbnN0YW5jZW9mIEFycmF5O1xyXG4gICAgdmFyIGNvbmp1bnRvOiBSZXNwdWVzdGFzW10gPSBlc0FycmF5ID8gbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzW10gOiBbbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzXTtcclxuICAgIFxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25qdW50by5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciByZXNwID0gY29uanVudG9baV07XHJcbiAgICAgICAgaWYgKCFyZXNwKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgdmFyIG51bSA9IGVzQXJyYXkgPyBpICsgMSA6IChmb3JQa0FjdW11bGFkb1t1YURlZi5wa19hZ3JlZ2FkYV0gfHwgMSk7XHJcbiAgICAgICAgdmFyIGlkRm9ybXVsYXJpb3MgPSBPYmplY3Qua2V5cyhlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoa2V5ID0+IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3Nba2V5IGFzIElkRm9ybXVsYXJpb10uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMgPT09IHVuaWRhZF9hbmFsaXNpcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZEZvcm11bGFyaW8gb2YgaWRGb3JtdWxhcmlvcykge1xyXG4gICAgICAgICAgICB2YXIgbWlGb3JQazogRm9yUGsgPSB7IC4uLmZvclBrQWN1bXVsYWRvLCBbdWFEZWYucGtfYWdyZWdhZGFdOiBudW0sIGZvcm11bGFyaW86IGlkRm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW8gfHwgZm9yUGtBY3VtdWxhZG8uZm9ybXVsYXJpbyB9O1xyXG4gICAgICAgICAgICBpZiAoZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcyhyZXNwdWVzdGFzUmFpeiwgbWlGb3JQayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVzcGVjaWFsZXMuY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKHJlc3B1ZXN0YXNSYWl6LCBtaUZvclBrKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGhpamFzID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbHRlcih1ID0+IHUucGFkcmUgPT09IHVuaWRhZF9hbmFsaXNpcykua2V5cygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB1YUhpamEgb2YgaGlqYXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBoaWphc1Jlc3AgPSByZXNwW3VhSGlqYSBhcyBJZFVuaWRhZEFuYWxpc2lzXTtcclxuICAgICAgICAgICAgICAgIGlmIChoaWphc1Jlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXJyZXJTdWJBcmJvbChyZXNwdWVzdGFzUmFpeiwgaGlqYXNSZXNwIGFzIFJlc3B1ZXN0YXNbXSwgdWFIaWphIGFzIElkVW5pZGFkQW5hbGlzaXMsIG1pRm9yUGspO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6OiBGb3JQaykge1xyXG4gICAgdmFyIHVhUHBhbCA9IE9iamVjdC5rZXlzKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoa2V5ID0+ICFlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW2tleSBhcyBJZFVuaWRhZEFuYWxpc2lzXS5wYWRyZSkgYXMgSWRVbmlkYWRBbmFsaXNpcztcclxuICAgIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6LCByZXNwdWVzdGFzUmFpeiwgdWFQcGFsLCBmb3JQa1JhaXopO1xyXG4gICAgYmFycmVyU3ViQXJib2wocmVzcHVlc3Rhc1JhaXosIHJlc3B1ZXN0YXNSYWl6LCB1YVBwYWwsIGZvclBrUmFpeik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIGZvcm11bGFyaW9zOiB7IFtub21icmVGb3JtdWxhcmlvIGluIElkRm9ybXVsYXJpb106IEluZm9Gb3JtdWxhcmlvIH0sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgVUE6IElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhczogUmVzcHVlc3RhcywgLy8gaW5jbHV5ZW4gbGEgZGUgdG9kb3MgbG9zIHBhZHJlcyB5IGFuc2VzdHJvcyxcclxuICAgIHJlc3B1ZXN0YXNQYWRyZTogUmVzcHVlc3RhcyB8IG51bGwsXHJcbiAgICBvcHRzOiBPcGNpb25lc1Jvd1ZhbGlkYXRvcixcclxuKSB7XHJcbiAgICAvLyByZWNvcnJpZW5kIFVBIHBlcnNvbmFzIHkgbWFzY290YXNcclxuICAgIGZvciAodmFyIFVBaW5jbHVpZGEgb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pbmNsdWlkYXMpIHtcclxuICAgICAgICB2YXIgcGtOdWV2YSA9IGRlZk9wZXJhdGl2by5kZWZVQVtVQWluY2x1aWRhXS5waztcclxuICAgICAgICB2YXIgY29uanVudG9SZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW1VBaW5jbHVpZGFdO1xyXG4gICAgICAgIGxpa2VBcihjb25qdW50b1Jlc3B1ZXN0YXNVQSkuZm9yRWFjaCgocmVzcHVlc3Rhc0hpam8sIHZhbG9yUGtPUG9zaWNpb24pID0+IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUGsgPSBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkodmFsb3JQa09Qb3NpY2lvbiwgY29uanVudG9SZXNwdWVzdGFzVUEpO1xyXG4gICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcixcclxuICAgICAgICAgICAgICAgIGZvcm11bGFyaW9zLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0hpam8sXHJcbiAgICAgICAgICAgICAgICBVQWluY2x1aWRhLFxyXG4gICAgICAgICAgICAgICAgeyAuLi5mb3JQaywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICB7IC4uLnJlc3B1ZXN0YXNBdW1lbnRhZGFzLCAuLi5yZXNwdWVzdGFzSGlqbywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyBTMSAsIEExXHJcbiAgICBmb3IgKHZhciBlc0hlcm1hbm8gb2YgW3RydWUsIGZhbHNlXSkge1xyXG4gICAgICAgIGZvciAodmFyIGZvcm11bGFyaW8gb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pZHNGb3IpIGlmICghIWVzSGVybWFubyA9PSAhIWRlZk9wZXJhdGl2by5kZWZGb3JbZm9ybXVsYXJpb10uaGVybWFubykge1xyXG4gICAgICAgICAgICB2YXIgcGxhaW5Gb3JQazogUGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayh7IC4uLmZvclBrLCBmb3JtdWxhcmlvIH0pXHJcbiAgICAgICAgICAgIHZhciBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzID0gMTA7XHJcbiAgICAgICAgICAgIHZhciB2YXJBdXRvSW5ncmVzYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHVib0F1dG9pbmdyZXNvcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa10gPVxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1ZhbGlkYXRvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtYXJjYUZpbjogJ2ZpbicsIC4uLmZvcm11bGFyaW9zW2Zvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB2YXIgeyByZXN1bWVuLCBhdXRvSW5ncmVzYWRhcyB9ID0gZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa107XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFyTmFtZTogSWRWYXJpYWJsZTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5ncmVzYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXJOYW1lIGluIGF1dG9JbmdyZXNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1iaW8gPSByZXNwdWVzdGFzW3Zhck5hbWVdICE9PSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t2YXJOYW1lXSA9IGF1dG9JbmdyZXNhZGFzW3Zhck5hbWVdIGFzIFZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdmFyTmFtZV0gPSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhckF1dG9JbmdyZXNhZGFzLnB1c2godmFyTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWJvQXV0b2luZ3Jlc29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSB3aGlsZSAoaHVib0F1dG9pbmdyZXNvcyAmJiBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzLS0gPiAwKTtcclxuICAgICAgICAgICAgdmFyQXV0b0luZ3Jlc2FkYXMuZm9yRWFjaChfdmFybmFtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXS5lc3RhZG9zW192YXJuYW1lIGFzIElkVmFyaWFibGVdID0gJ2FjdHVhbCc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBCRl92YXJuYW1lID0gJyRCLicgKyBmb3JtdWxhcmlvIGFzIElkVmFyaWFibGVcclxuICAgICAgICAgICAgdmFyIGZvcm1QcmluY2lwYWxGb3JWaXZpZW5kYSA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSk7XHJcbiAgICAgICAgICAgIGlmIChlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiAhZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZm9ybVByaW5jaXBhbEZvclZpdmllbmRhXSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBoYXkgY29uZmlndXJhY2lvbiBkZSBzb3J0ZW8gcGFyYSBlbCBmb3JtdWxhcmlvICR7Zm9ybVByaW5jaXBhbEZvclZpdmllbmRhfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gPSBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdO1xyXG4gICAgICAgICAgICB2YXIgcmVzdW1lbk9yTnVsbCA9XHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWwgPT0gQkZfdmFybmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgJ29rJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogcmVzdW1lbiA9PSAndmFjaW8nID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3VtZW5cclxuICAgICAgICAgICAgaWYgKGVzSGVybWFubykge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGwgPT0gJ29rJyA/ICdvaycgOiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3B1ZXN0YXNQYWRyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL3Jlc3B1ZXN0YXNQYWRyZVtCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkobnVtYmVyT3JTdHJpbmc6IG51bWJlciB8IHN0cmluZywgb2JqZWN0OiBvYmplY3QgfCBhbnlbXSk6IChudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0b3kgdXNhbmRvIGlzTmFOIHBhcmEgdmVyIHNpIGVzIG8gbm8gdW4gbsO6bWVybyBzdW1hYmxlXHJcbiAgICBpZiAoaXNOYU4obnVtYmVyT3JTdHJpbmcpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9yU3RyaW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE51bWJlcihudW1iZXJPclN0cmluZykgKyAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgPyAxIDogMCk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYSA9ICh2YWx1ZVBrUmFpejogVmFsdWVQa1JhaXopOiBJZEZvcm11bGFyaW8gPT4ge1xyXG4gICAgcmV0dXJuIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW3ZhbHVlUGtSYWl6XS50YXJlYS5tYWluX2Zvcm1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCkge1xyXG4gICAgbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbHRlcih1YURlZiA9PiAhdWFEZWYucGFkcmUpLmZvckVhY2godWFEZWYgPT4ge1xyXG4gICAgICAgIHZhciBlc1ByaW5jaXBhbCA9IChmOiBGb3JtdWxhcmlvLCBlbmM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZm9ybXVsYXJpb1ByaW5jaXBhbCA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZW5jKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm11bGFyaW9QcmluY2lwYWwgPyBmb3JtdWxhcmlvUHJpbmNpcGFsID09IGYuaWRfY2FzaWxsZXJvIDogZi5mb3JtdWxhcmlvX3ByaW5jaXBhbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9hY8OhIGhheSBxdWUgc2FuaXRpemFyIHBvcnF1ZSBldmlkZW50ZW1lbnRlIHB1ZWRlIHZlbmlyIGNvbiBoYXNocyBkZSBlbmN1ZXN0YXMgc2luIGluZm8gZWwgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1xyXG4gICAgICAgIHZhciBjb25qdW50b1Jlc3B1ZXN0YXNVQSA9IGRhdG9zQnlQYXNzLnJlc3B1ZXN0YXNbdWFEZWYudW5pZGFkX2FuYWxpc2lzXVxyXG4gICAgICAgIGJlaW5nQXJyYXkoY29uanVudG9SZXNwdWVzdGFzVUEpLmZvckVhY2goKHJlc3B1ZXN0YXMsIHZhbG9yUGtPUG9zaWNpb24pID0+IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUGsgPSBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkodmFsb3JQa09Qb3NpY2lvbiwgY29uanVudG9SZXNwdWVzdGFzVUEpO1xyXG4gICAgICAgICAgICBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykuZmlsdGVyKGYgPT4gZi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YURlZi51bmlkYWRfYW5hbGlzaXMgJiYgZXNQcmluY2lwYWwoZi5jYXNpbGxlcm9zLCB2YWxvclBrIGFzIG51bWJlcikpLmZvckVhY2goKF9kZWZGLCBmb3JtdWxhcmlvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9yUGtSYWl6ID0geyBmb3JtdWxhcmlvLCBbdWFEZWYucGtfYWdyZWdhZGFdOiB2YWxvclBrIH0gYXMgRm9yUGtSYWl6XHJcbiAgICAgICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXMsIGZvclBrUmFpeiwge30pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiB9LFxyXG4gICAgZm9ybXVsYXJpb3M6IHsgW25vbWJyZUZvcm11bGFyaW8gaW4gSWRGb3JtdWxhcmlvXTogSW5mb0Zvcm11bGFyaW8gfSxcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgcmVzcHVlc3RhczogUmVzcHVlc3RhcyxcclxuICAgIG9wdHM6IE9wY2lvbmVzUm93VmFsaWRhdG9yXHJcbikge1xyXG4gICAgdmFyIGZvclBrOiBGb3JQayA9IHsgLi4uZm9yUGtSYWl6IH07XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGZvcm11bGFyaW9zLCByZXNwdWVzdGFzLCBkZWZPcGVyYXRpdm8uVUFwcmluY2lwYWwsIGZvclBrLCByZXNwdWVzdGFzLCBudWxsLCBvcHRzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFjayhyZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgb3B0czogT3BjaW9uZXNSb3dWYWxpZGF0b3IpIHtcclxuICAgIHZhciByZXN1bWVuRXN0YWRvOiBSZXN1bWVuRXN0YWRvO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBQYXJ0aWFsXHJcbiAgICB2YXIgbnVldm9zUm93czogeyBbeCBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIElkRmluPiB9ID0ge31cclxuICAgIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShudWV2b3NSb3dzLCBlc3RydWN0dXJhLmZvcm11bGFyaW9zLCBmb3JQa1JhaXosIHJlc3B1ZXN0YXMsIG9wdHMpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSBsaWtlQXIoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IpLmZpbHRlcigoX2ZlZWRiYWNrOiBhbnksIHBsYWluUGs6IFBsYWluRm9yUGspID0+IEpTT04ucGFyc2UocGxhaW5QaylbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSAhPSBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSkucGxhaW4oKTtcclxuICAgIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yID0geyAuLi5kYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgLi4ubnVldm9zUm93cyB9O1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF1dID0ge1xyXG4gICAgICAgIC4uLmRhdG9zQnlQYXNzLnJlc3B1ZXN0YXNbZXN0cnVjdHVyYS51YVBwYWxdW2ZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdXSxcclxuICAgICAgICAuLi5jYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgICAgICAgICAgZm9yUGtSYWl6LFxyXG4gICAgICAgICAgICBudWV2b3NSb3dzLFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzXHJcbiAgICAgICAgKVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBidXNjYXJGb3JtdWxhcmlvc0hpam9zID0gKGlkRm9ybXVsYXJpbzogSWRGb3JtdWxhcmlvIHwgdW5kZWZpbmVkLCBmb3Jtc0ZlZWRiYWNrOiBJZEZvcm11bGFyaW9bXSA9IFtdKSA9PiB7XHJcbiAgICBpZiAoaWRGb3JtdWxhcmlvKSB7XHJcbiAgICAgICAgZm9yIChsZXQgY2FzaWxsZXJvIG9mIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbaWRGb3JtdWxhcmlvXS5jYXNpbGxlcm9zLmNhc2lsbGVyb3MpIHtcclxuICAgICAgICAgICAgaWYgKGNhc2lsbGVyby50aXBvYyA9PSAnQkYnKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9ybUhpam8gPSAoY2FzaWxsZXJvLnNhbHRvPy5zdGFydHNXaXRoKCdGOicpID8gY2FzaWxsZXJvLnNhbHRvIDogJ0Y6JyArIGNhc2lsbGVyby5zYWx0bykgYXMgSWRGb3JtdWxhcmlvO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1IaWpvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybXNGZWVkYmFjay5wdXNoKGZvcm1IaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKGZvcm1IaWpvLCBmb3Jtc0ZlZWRiYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3Jtc0ZlZWRiYWNrO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldEZvcm11bGFyaW9zRm9yVmFsdWVQa1JhaXogPSAodmFsdWVQa1JhaXo6IFZhbHVlUGtSYWl6KSA9PiB7XHJcbiAgICB2YXIgbWFpbkZvcm1Gb3JWYWx1ZVBrUmFpeiA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEodmFsdWVQa1JhaXopO1xyXG4gICAgdmFyIGZvcm1zRmVlZGJhY2sgPSBbbWFpbkZvcm1Gb3JWYWx1ZVBrUmFpel07XHJcbiAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKG1haW5Gb3JtRm9yVmFsdWVQa1JhaXosIGZvcm1zRmVlZGJhY2spO1xyXG4gICAgcmV0dXJuIGZvcm1zRmVlZGJhY2s7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJBY3R1YWxCRiA9IChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyB8IG51bGwsIG51bUVsZW1lbnRvVUE6IG51bWJlciwgbnVtQWN0dWFsOiBudW1iZXIgfCBudWxsLCBmb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8sIHI6IFJlc3B1ZXN0YXMpID0+XHJcbiAgICAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgJiZcclxuICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvXHJcbiAgICAgICAgP1xyXG4gICAgICAgIG51bUVsZW1lbnRvVUEgPT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgIHJbY29uZmlnU29ydGVvRm9ybXVsYXJpby5yZXN1bHRhZG9fbWFudWFsXSxcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICApXHJcbiAgICAgICAgOlxyXG4gICAgICAgIG51bUFjdHVhbCA9PSBudW1FbGVtZW50b1VBXHJcbiAgICApXHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyRGlzYWJsZWRCRiA9IChcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCxcclxuICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbzogQ29uZmlndXJhY2lvbkhhYmlsaXRhckJvdG9uRm9ybXVsYXJpbyB8IG51bGwsXHJcbiAgICBudW1FbGVtZW50b1VBOiBudW1iZXIsXHJcbiAgICBmb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8sXHJcbiAgICByOiBSZXNwdWVzdGFzXHJcbikgPT4ge1xyXG4gICAgaWYgKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyAmJiBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10pIHtcclxuICAgICAgICB2YXIgZXhwcl9oYWJpbGl0YXJfZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10uZXhwcl9oYWJpbGl0YXJfYm90b25fanMpO1xyXG4gICAgICAgIHJldHVybiAhZXhwcl9oYWJpbGl0YXJfZnVuKHJbaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvW2Zvcm11bGFyaW9dLnVuaWRhZF9hbmFsaXNpc11bbnVtRWxlbWVudG9VQSAtIDFdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gISEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJlxyXG4gICAgICAgICAgICAoY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbyB8fFxyXG4gICAgICAgICAgICAgICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCkuaW5jbHVkZXMoZm9ybXVsYXJpbylcclxuICAgICAgICAgICAgKSAmJlxyXG4gICAgICAgICAgICBudW1FbGVtZW50b1VBICE9IGNvYWxlc2NlKFxyXG4gICAgICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb19tYW51YWxdLFxyXG4gICAgICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICAgICAgKSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBjYWxjdWxhclBlcm1pdGVCb3JyYXJCRiA9IChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyB8IG51bGwsIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbykgPT5cclxuICAgICEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJlxyXG4gICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW8pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJSZXN1bWVuVml2aWVuZGEoXHJcbiAgICBmb3JQa1JhaXo6IEZvclBrUmFpeixcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiB9LFxyXG4gICAgcmVzcHVlc3RhczogUmVzcHVlc3Rhc1xyXG4pOiBSZXN1bHRhZG9SZXN1bWVuIHtcclxuICAgIHZhciB0YXJlYSA9IGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW2ZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdIGFzIHVua25vd24gYXMgSWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgdmFyIHsgY29kUmVhLCBlc1JlYSB9ID0gZGVmT3BlcmF0aXZvLmVzUmVhbGl6YWRhKHJlc3B1ZXN0YXMsIHRhcmVhKVxyXG4gICAgdmFyIHsgY29kTm9SZWEsIGVzTm9SZWEgfSA9IGRlZk9wZXJhdGl2by5lc05vUmVhKHJlc3B1ZXN0YXMsIHRhcmVhKVxyXG4gICAgdmFyIHsgY29kUmVhU3VwLCBlc1JlYVN1cCB9ID0gZGVmT3BlcmF0aXZvLmVzUmVhbGl6YWRhU3VwKHJlc3B1ZXN0YXMsIHRhcmVhKVxyXG4gICAgdmFyIHsgY29kTm9SZWFTdXAsIGVzTm9SZWFTdXAgfSA9IGRlZk9wZXJhdGl2by5lc05vUmVhU3VwKHJlc3B1ZXN0YXMsIHRhcmVhKVxyXG4gICAgdmFyIGZvcm1zRmVlZGJhY2sgPSBnZXRGb3JtdWxhcmlvc0ZvclZhbHVlUGtSYWl6KGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKTtcclxuICAgIHZhciBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmIGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvW2dldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0pXVxyXG4gICAgdmFyIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvO1xyXG4gICAgdmFyIGZlZWRCYWNrVml2aWVuZGEgPSBsaWtlQXIoZmVlZGJhY2tSb3dWYWxpZGF0b3IpLmZpbHRlcigoX3JvdywgcGxhaW5QaykgPT4ge1xyXG4gICAgICAgIHZhciB0aWVuZUluZGl2aWR1YWwgPSBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyAmJiAhIShjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgJiYgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSlcclxuICAgICAgICB2YXIgdGllbmVCb3RvbkRlc0hhYmlsaXRhYmxlID0gaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvICYmIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8gYXMgSWRGb3JtdWxhcmlvXTtcclxuICAgICAgICB2YXIgcGtBZ3JlZ2FkYSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRpZW5lQm90b25EZXNIYWJpbGl0YWJsZSkge1xyXG4gICAgICAgICAgICBwa0FncmVnYWRhID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhLCBfaWRVQSkgPT5cclxuICAgICAgICAgICAgICAgIHVhLnVuaWRhZF9hbmFsaXNpcyA9PSBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvIGFzIElkRm9ybXVsYXJpb10udW5pZGFkX2FuYWxpc2lzKT8ucGtfYWdyZWdhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHBsYWluUGspW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gPT0gZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gJiZcclxuICAgICAgICAgICAgZm9ybXNGZWVkYmFjay5pbmNsdWRlcyhKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8pICYmXHJcbiAgICAgICAgICAgICh0aWVuZUJvdG9uRGVzSGFiaWxpdGFibGUgP1xyXG4gICAgICAgICAgICAgICAgIWNhbGN1bGFyRGlzYWJsZWRCRihcclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKVtwa0FncmVnYWRhIGFzIENhbXBvUGtdLFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzRm9yUGsoSlNPTi5wYXJzZShwbGFpblBrKSwgdHJ1ZSkucmVzcHVlc3Rhc0F1bWVudGFkYXNcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIDogdGllbmVJbmRpdmlkdWFsID9cclxuICAgICAgICAgICAgICAgICAgICAhY2FsY3VsYXJEaXNhYmxlZEJGKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLnBlcnNvbmEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXN0cnVjdHVyYS5jb25SZWFIb2dhciA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLmhvZ2FyID8gcmVzcHVlc3Rhc0ZvclBrKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXTogZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYXJpbzogY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9nYXI6IEpTT04ucGFyc2UocGxhaW5QaykuaG9nYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgRm9yUGspLnJlc3B1ZXN0YXMgOiB7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzRm9yUGsoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdOiBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhcmlvOiBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX3BhZHJlISxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgRm9yUGspLnJlc3B1ZXN0YXNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0cnVlKVxyXG4gICAgfSkuYXJyYXkoKTtcclxuICAgIHZhciBwcmlvcmlkYWRlczogeyBba2V5IGluIFJlc3VtZW5Fc3RhZG9dOiB7IHByaW9yaWRhZDogbnVtYmVyLCBjYW50aWRhZDogbnVtYmVyIH0gfSA9IHtcclxuICAgICAgICAnbm8gcmVhJzogeyBwcmlvcmlkYWQ6IDEsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ2NvbiBwcm9ibGVtYXMnOiB7IHByaW9yaWRhZDogMiwgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAnaW5jb21wbGV0byc6IHsgcHJpb3JpZGFkOiAzLCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICd2YWNpbyc6IHsgcHJpb3JpZGFkOiA0LCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdjaXRhIHBhY3RhZGEnOiB7IHByaW9yaWRhZDogNSwgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAnb2snOiB7IHByaW9yaWRhZDogNiwgY2FudGlkYWQ6IDAgfVxyXG4gICAgfVxyXG4gICAgdmFyIG1pbiA9IDY7XHJcbiAgICB2YXIgbWluUmVzdW1lbjogUmVzdW1lbkVzdGFkbyA9ICdvayc7XHJcbiAgICBmb3IgKHZhciBmZWVkYmFjayBvZiBmZWVkQmFja1ZpdmllbmRhKSB7XHJcbiAgICAgICAgdmFyIHJlc3VtZW4gPSBmZWVkYmFjay5yZXN1bWVuO1xyXG4gICAgICAgIHByaW9yaWRhZGVzW3Jlc3VtZW5dLmNhbnRpZGFkKys7XHJcbiAgICAgICAgaWYgKHByaW9yaWRhZGVzW3Jlc3VtZW5dLnByaW9yaWRhZCA8IG1pbikge1xyXG4gICAgICAgICAgICBtaW4gPSBwcmlvcmlkYWRlc1tyZXN1bWVuXS5wcmlvcmlkYWQ7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW4gPSByZXN1bWVuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChtaW5SZXN1bWVuID09ICd2YWNpbycgJiYgcHJpb3JpZGFkZXNbJ29rJ10uY2FudGlkYWQgfHwgbWluUmVzdW1lbiA9PSAnaW5jb21wbGV0bycpIHtcclxuICAgICAgICBpZiAoZmFsc2UgLypyZXNwdWVzdGFzW3NwMV09PTIgJiYgcmVzcHVlc3Rhc1tzcDZdPT1udWxsKi8pIHtcclxuICAgICAgICAgICAgbWluUmVzdW1lbiA9ICdjaXRhIHBhY3RhZGEnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW4gPSAnaW5jb21wbGV0byc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETyBBUlJFR0xBUiBFU1RFIEhPUlJPUiwgR0VORVJBTElaQVJcclxuICAgIHZhciB0YXJlYSA9IGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW2ZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdIGFzIHVua25vd24gYXMgSWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG86IFJlc3VtZW5Fc3RhZG87XHJcbiAgICB2YXIgcmVzdW1lbkVzdGFkb1N1cDogUmVzdW1lbkVzdGFkbyA9ICd2YWNpbyc7XHJcbiAgICBpZiAodGFyZWEgPT0gJ3N1cGUnKSB7XHJcbiAgICAgICAgcmVzdW1lbkVzdGFkb1N1cCA9IGVzTm9SZWFTdXAgPyAnbm8gcmVhJyA6IG1pblJlc3VtZW5cclxuICAgICAgICAvL3BhcmEgcXVlIGNvbG9yZWUgYmllbiBlbiBsYSBoZHIgZGVsIERNIChsdWVnbyBlbiBiYmRkIG5vIHNlIGd1YXJkYSlcclxuICAgICAgICByZXN1bWVuRXN0YWRvID0gcmVzdW1lbkVzdGFkb1N1cFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvID0gZXNOb1JlYSA/ICdubyByZWEnIDogbWluUmVzdW1lblxyXG4gICAgfVxyXG4gICAgdmFyIHJlc3VsdGFkbzogUmVzdWx0YWRvUmVzdW1lbiA9IHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG9TdXAsXHJcbiAgICAgICAgY29kUmVhLFxyXG4gICAgICAgIGNvZE5vUmVhLFxyXG4gICAgICAgIGNvZFJlYVN1cCxcclxuICAgICAgICBjb2ROb1JlYVN1cFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdGFkb1xyXG59XHJcbiJdfQ==