dmencu 3.2.21 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +42 -42
  2. package/dist/client/client/client.js +3 -3
  3. package/dist/client/unlogged/abrir-formulario.js +1 -1
  4. package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
  5. package/dist/client/unlogged/bypass-formulario.js +84 -219
  6. package/dist/client/unlogged/calculos-encuesta.js +112 -38
  7. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  8. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  9. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  10. package/dist/client/unlogged/helpers-formulario.js +88 -0
  11. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  12. package/dist/client/unlogged/redux-formulario.js +21 -31
  13. package/dist/client/unlogged/render-formulario.d.ts +2 -6
  14. package/dist/client/unlogged/render-formulario.js +29 -68
  15. package/dist/client/unlogged/render-formulario.tsx +29 -57
  16. package/dist/client/unlogged/render-general.js +1 -1
  17. package/dist/client/unlogged/render-general.tsx +1 -1
  18. package/dist/client/unlogged/tipos.d.ts +74 -40
  19. package/dist/client/unlogged/tipos.js +1 -1
  20. package/dist/server/app-dmencu.d.ts +1428 -0
  21. package/dist/server/app-dmencu.js +1054 -0
  22. package/dist/server/def-config.d.ts +1 -0
  23. package/dist/server/def-config.js +123 -0
  24. package/dist/server/procedures-dmencu.d.ts +43 -0
  25. package/dist/server/procedures-dmencu.js +2295 -0
  26. package/dist/server/server/app-dmencu.d.ts +42 -91
  27. package/dist/server/server/app-dmencu.js +114 -52
  28. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  29. package/dist/server/server/procedures-dmencu.js +77 -51
  30. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  31. package/dist/server/server/setters-rea-no-rea.js +35 -0
  32. package/dist/server/server/table-areas.js +4 -4
  33. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  34. package/dist/server/server/table-control_campo.js +4 -4
  35. package/dist/server/server/table-no_rea.js +4 -2
  36. package/dist/server/server/table-no_rea_sup.js +7 -3
  37. package/dist/server/server/table-personal.js +1 -1
  38. package/dist/server/server/table-tareas_tem.js +2 -2
  39. package/dist/server/server/table-tem.js +2 -2
  40. package/dist/server/server/types-dmencu.d.ts +34 -2
  41. package/dist/server/server/types-dmencu.js +2 -1
  42. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  43. package/dist/server/setters-rea-no-rea.js +35 -0
  44. package/dist/server/table-acciones.d.ts +2 -0
  45. package/dist/server/table-acciones.js +45 -0
  46. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  47. package/dist/server/table-area_enc_proximas.js +30 -0
  48. package/dist/server/table-areas.d.ts +4 -0
  49. package/dist/server/table-areas.js +112 -0
  50. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  51. package/dist/server/table-areas_asignacion_general.js +86 -0
  52. package/dist/server/table-barrios.d.ts +2 -0
  53. package/dist/server/table-barrios.js +35 -0
  54. package/dist/server/table-comunas.d.ts +2 -0
  55. package/dist/server/table-comunas.js +33 -0
  56. package/dist/server/table-control_campo.d.ts +12 -0
  57. package/dist/server/table-control_campo.js +119 -0
  58. package/dist/server/table-control_dias_carga.d.ts +2 -0
  59. package/dist/server/table-control_dias_carga.js +63 -0
  60. package/dist/server/table-control_resumen.d.ts +2 -0
  61. package/dist/server/table-control_resumen.js +19 -0
  62. package/dist/server/table-diccionario.d.ts +2 -0
  63. package/dist/server/table-diccionario.js +32 -0
  64. package/dist/server/table-dictra.d.ts +2 -0
  65. package/dist/server/table-dictra.js +46 -0
  66. package/dist/server/table-dicvar.d.ts +2 -0
  67. package/dist/server/table-dicvar.js +32 -0
  68. package/dist/server/table-encuestadores.d.ts +13 -0
  69. package/dist/server/table-encuestadores.js +75 -0
  70. package/dist/server/table-estados.d.ts +2 -0
  71. package/dist/server/table-estados.js +47 -0
  72. package/dist/server/table-estados_acciones.d.ts +2 -0
  73. package/dist/server/table-estados_acciones.js +40 -0
  74. package/dist/server/table-fracciones.d.ts +2 -0
  75. package/dist/server/table-fracciones.js +37 -0
  76. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  77. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  78. package/dist/server/table-historial_tem.d.ts +2 -0
  79. package/dist/server/table-historial_tem.js +57 -0
  80. package/dist/server/table-hogares.d.ts +2 -0
  81. package/dist/server/table-hogares.js +156 -0
  82. package/dist/server/table-hogares_sup.d.ts +2 -0
  83. package/dist/server/table-hogares_sup.js +191 -0
  84. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  85. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  86. package/dist/server/table-manzanas.d.ts +2 -0
  87. package/dist/server/table-manzanas.js +36 -0
  88. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  89. package/dist/server/table-mis_encuestadores.js +77 -0
  90. package/dist/server/table-mis_tareas.d.ts +2 -0
  91. package/dist/server/table-mis_tareas.js +18 -0
  92. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  93. package/dist/server/table-mis_tareas_areas.js +20 -0
  94. package/dist/server/table-modos_dm.d.ts +2 -0
  95. package/dist/server/table-modos_dm.js +28 -0
  96. package/dist/server/table-no_rea.js +38 -0
  97. package/dist/server/table-no_rea_sup.js +36 -0
  98. package/dist/server/table-operaciones.d.ts +2 -0
  99. package/dist/server/table-operaciones.js +30 -0
  100. package/dist/server/table-parametros.d.ts +2 -0
  101. package/dist/server/table-parametros.js +40 -0
  102. package/dist/server/table-permisos.d.ts +2 -0
  103. package/dist/server/table-permisos.js +31 -0
  104. package/dist/server/table-personal.d.ts +5 -0
  105. package/dist/server/table-personal.js +62 -0
  106. package/dist/server/table-personal_rol.d.ts +2 -0
  107. package/dist/server/table-personal_rol.js +42 -0
  108. package/dist/server/table-personas.d.ts +2 -0
  109. package/dist/server/table-personas.js +448 -0
  110. package/dist/server/table-personas_sup.d.ts +2 -0
  111. package/dist/server/table-personas_sup.js +93 -0
  112. package/dist/server/table-radios.d.ts +2 -0
  113. package/dist/server/table-radios.js +37 -0
  114. package/dist/server/table-rea.d.ts +2 -0
  115. package/dist/server/table-rea.js +38 -0
  116. package/dist/server/table-rea_sup.d.ts +2 -0
  117. package/dist/server/table-rea_sup.js +38 -0
  118. package/dist/server/table-recepcionistas.d.ts +2 -0
  119. package/dist/server/table-recepcionistas.js +18 -0
  120. package/dist/server/table-recuperadores.d.ts +2 -0
  121. package/dist/server/table-recuperadores.js +18 -0
  122. package/dist/server/table-roles.d.ts +2 -0
  123. package/dist/server/table-roles.js +33 -0
  124. package/dist/server/table-roles_permisos.d.ts +2 -0
  125. package/dist/server/table-roles_permisos.js +36 -0
  126. package/dist/server/table-roles_subordinados.d.ts +2 -0
  127. package/dist/server/table-roles_subordinados.js +31 -0
  128. package/dist/server/table-semanas.d.ts +2 -0
  129. package/dist/server/table-semanas.js +42 -0
  130. package/dist/server/table-sincronizaciones.d.ts +2 -0
  131. package/dist/server/table-sincronizaciones.js +30 -0
  132. package/dist/server/table-supervisores.d.ts +2 -0
  133. package/dist/server/table-supervisores.js +18 -0
  134. package/dist/server/table-tareas.d.ts +2 -0
  135. package/dist/server/table-tareas.js +48 -0
  136. package/dist/server/table-tareas_areas.d.ts +7 -0
  137. package/dist/server/table-tareas_areas.js +112 -0
  138. package/dist/server/table-tareas_proximas.d.ts +2 -0
  139. package/dist/server/table-tareas_proximas.js +48 -0
  140. package/dist/server/table-tareas_tem.d.ts +14 -0
  141. package/dist/server/table-tareas_tem.js +206 -0
  142. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  143. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  144. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  145. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  146. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  147. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  148. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  149. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  150. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  151. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  152. package/dist/server/table-tem.d.ts +3 -0
  153. package/dist/server/table-tem.js +247 -0
  154. package/dist/server/table-tem_asignacion.d.ts +2 -0
  155. package/dist/server/table-tem_asignacion.js +50 -0
  156. package/dist/server/table-tem_borradas.d.ts +2 -0
  157. package/dist/server/table-tem_borradas.js +35 -0
  158. package/dist/server/table-usuarios.d.ts +2 -0
  159. package/dist/server/table-usuarios.js +63 -0
  160. package/dist/server/table-visitas.d.ts +2 -0
  161. package/dist/server/table-visitas.js +91 -0
  162. package/dist/server/table-visitas_sup.d.ts +2 -0
  163. package/dist/server/table-visitas_sup.js +91 -0
  164. package/dist/server/table-viviendas.d.ts +2 -0
  165. package/dist/server/table-viviendas.js +299 -0
  166. package/dist/server/types-dmencu.d.ts +95 -0
  167. package/dist/server/types-dmencu.js +34 -0
  168. package/dist/server/unlogged/tipos.d.ts +74 -40
  169. package/dist/server/unlogged/tipos.js +1 -1
  170. package/dist/test/app-para-tests.d.ts +1115 -0
  171. package/dist/test/app-para-tests.js +95 -0
  172. package/dist/test/test-caches-rea.d.ts +1 -0
  173. package/dist/test/test-caches-rea.js +243 -0
  174. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  175. package/dist/test/test-helpers-casilleros.js +154 -0
  176. package/dist/test/test-helpers-formulario.d.ts +1 -0
  177. package/dist/test/test-helpers-formulario.js +95 -0
  178. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  179. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  180. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  181. package/dist/test/test-menu-segun-rol.js +170 -0
  182. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  183. package/dist/test/test-setters-rea-no-rea.js +95 -0
  184. package/dist/test/test.d.ts +6 -0
  185. package/dist/test/test.js +8 -2
  186. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  187. package/dist/unlogged/helpers-casilleros.js +12 -18
  188. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  189. package/dist/unlogged/helpers-formulario.js +88 -0
  190. package/dist/unlogged/tipos.d.ts +1 -1
  191. package/dist/unlogged/tipos.js +1 -1
  192. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  193. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  194. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  195. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  196. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  197. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  198. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  199. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  200. package/dist/unlogged/unlogged/render-formulario.d.ts +2 -6
  201. package/dist/unlogged/unlogged/render-formulario.js +29 -68
  202. package/dist/unlogged/unlogged/render-formulario.tsx +29 -57
  203. package/dist/unlogged/unlogged/render-general.js +1 -1
  204. package/dist/unlogged/unlogged/render-general.tsx +1 -1
  205. package/dist/unlogged/unlogged/tipos.d.ts +74 -40
  206. package/dist/unlogged/unlogged/tipos.js +1 -1
  207. package/dist/unlogged/unlogged/unlogged.js +2 -2
  208. package/install/accion_cumple_condicion.sql +1 -1
  209. package/install/generador_accion_cumple_condicion.sql +2 -2
  210. package/install/tarea_cumple_condicion.sql +1 -1
  211. package/install/xcalcular_resultado_trg.sql +1 -1
  212. package/package.json +20 -17
  213. package/dist/server/server/table-no_rea copy.js +0 -38
  214. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  215. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  216. package/dist/unlogged/bypass-formulario.js +0 -1226
  217. package/dist/unlogged/redux-formulario.d.ts +0 -440
  218. package/dist/unlogged/redux-formulario.js +0 -324
  219. package/dist/unlogged/render-config.d.ts +0 -52
  220. package/dist/unlogged/render-config.js +0 -161
  221. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  222. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  223. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  224. package/dist/unlogged/unlogged/helpers.js +0 -129
  225. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  226. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdW5sb2dnZWQvYnlwYXNzLWZvcm11bGFyaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBNkNBLG9EQUVDO0lBV0QsMERBWUM7SUFFRCw4REFLQztJQUVELDBEQXFCQztJQU1ELG9EQUVDO0lBRUQsNEZBRUM7SUFzQ0QsMERBRUM7SUFFRCxvREFJQztJQXNCRCw0Q0FJQztJQWdCRCxzQ0FVQztJQUVELHdDQVVDO0lBV0QsMERBS0M7SUFFRCw0QkFFQztJQUVELHNDQUVDO0lBa0NELDhDQUlDO0lBTUQsMENBaURDO0lBRUQsZ0ZBdUNDO0lBRUQsNERBb0VDO0lBRUQsMENBUUM7SUFFRCw0Q0FRQztJQWtCRCxnREFDQztJQWdGRCxnRUFpQ0M7SUFPRCxrRUF1QkM7SUFFRCxzREFHQztJQUVELHNEQUVDO0lBRUQsMERBRUM7SUFFRCxvREFFQztJQUVELDhEQU9DO0lBRUQsMERBT0M7SUFFRCw0REFnQkM7SUFHRCx3Q0FLQztJQW9KRCxrREFnQkM7SUFFRCxrREEwQkM7SUF3R0QsZ0RBaUJDO0lBY0QsMENBa0lDO0lBaUNELHNEQUlDO0lBRUQsd0VBZ0ZDO0lBRUQsNERBTUM7SUFNRCxnRUFpQkM7SUFFRCw0REFTQztJQWdGRCwwREFpR0M7SUFoOUNELHFDQUF1RDtJQUV2RCxpREFBb0c7SUFFcEcsK0NBQStEO0lBQy9ELDJDQUFzQztJQUV0QyxtQ0F5QmlCO0lBRWpCLG1EQUFrRDtJQUNsRCx5REFBdUQ7SUFDdkQsMkRBRzZCO0lBRTdCLElBQUksU0FBUyxHQUFHLEVBRWYsQ0FBQTtJQUVELFNBQWdCLG9CQUFvQixDQUFDLGlCQUF5QztRQUMxRSxTQUFTLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7SUFDbkQsQ0FBQztJQVNELElBQUksMkJBQTJCLEdBQWdDLEVBQUUsQ0FBQztJQUVsRSxTQUFnQix1QkFB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LElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLElBQUksWUFBWSxFQUFFLENBQUM7WUFDcEYsSUFBSSxLQUFLLENBQUMsK0NBQStDLEVBQUUsQ0FBQztnQkFDeEQsVUFBVSxHQUFHLGNBQWMsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osVUFBVSxHQUFHLFlBQVksQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQy9HLElBQUksYUFBNEIsQ0FBQztRQUNqQyxJQUFJLGdCQUFnQixHQUFrQixPQUFPLENBQUM7UUFDOUMsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEIsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtZQUNyRCxxRUFBcUU7WUFDckUsYUFBYSxHQUFHLGdCQUFnQixDQUFBO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ0osYUFBYSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDbkQsQ0FBQztRQUNELElBQUksU0FBUyxHQUFxQjtZQUM5QixhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLE1BQU07WUFDTixRQUFRO1lBQ1IsU0FBUztZQUNULFdBQVc7U0FDZCxDQUFBO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0cmljdCBhcyBsaWtlQXIsIGJlaW5nQXJyYXkgfSBmcm9tIFwibGlrZS1hclwiO1xyXG5cclxuaW1wb3J0IHsgZ2V0Um93VmFsaWRhdG9yLCBGb3JtU3RydWN0dXJlU3RhdGUsIE9wY2lvbmVzUm93VmFsaWRhdG9yLCBGZWVkYmFjayB9IGZyb20gXCJyb3ctdmFsaWRhdG9yXCI7XHJcblxyXG5pbXBvcnQgeyBkYXRlLCBjb21wYXJlRm9yT3JkZXIsIGNvYWxlc2NlIH0gZnJvbSBcImJlc3QtZ2xvYmFsc1wiO1xyXG5pbXBvcnQgeyBleHBlY3RlZCB9IGZyb20gXCJjYXN0LWVycm9yXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgRXN0cnVjdHVyYSxcclxuICAgIEZvclBrLCBGb3JQa1JhaXosXHJcbiAgICBJZEZpbiwgSWRGb3JtdWxhcmlvLCBJZFByZWd1bnRhLCBJZFRhcmVhLCBJZFZhcmlhYmxlLFxyXG4gICAgSWRVbmlkYWRBbmFsaXNpcyxcclxuICAgIEluZm9Gb3JtdWxhcmlvLFxyXG4gICAgUGxhaW5Gb3JQaywgUmVzcHVlc3RhcywgUmVzcHVlc3Rhc1JhaXosIFJlc3VtZW5Fc3RhZG8sXHJcbiAgICBWYWxvciwgVmlzaXRhLFxyXG4gICAgdG9QbGFpbkZvclBrLFxyXG4gICAgVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBGb3JtdWxhcmlvLFxyXG4gICAgQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcyxcclxuICAgIElkRW5jLFxyXG4gICAgRGVmT3BlcmF0aXZvLFxyXG4gICAgaXRlcmF0b3IsXHJcbiAgICBDb25maWd1cmFjaW9uSGFiaWxpdGFyQm90b25Gb3JtdWxhcmlvLFxyXG4gICAgQ2FtcG9QayxcclxuICAgIElkQ2FyZ2EsXHJcbiAgICBDYXJnYSxcclxuICAgIENhbXBvUGtSYWl6LFxyXG4gICAgVmFsdWVQa1JhaXosXHJcbiAgICBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWEsXHJcbiAgICBSZXN1bHRhZG9SZXN1bWVuLFxyXG4gICAgUmVzdWx0YWRvUmVhTm9SZWEsXHJcbn0gZnJvbSBcIi4vdGlwb3NcIjtcclxuXHJcbmltcG9ydCB7IGdldEZvcm1SZW5kZXJlciB9IGZyb20gXCIuL3JlbmRlci1jb25maWdcIjtcclxuaW1wb3J0IHsgYWRhcHRhckVzdHJ1Y3R1cmEgfSBmcm9tIFwiLi9yZWR1eC1mb3JtdWxhcmlvXCI7XHJcbmltcG9ydCB7XHJcbiAgICBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyxcclxuICAgIEV2YWx1YWRvckV4cHJlc2lvblxyXG59IGZyb20gXCIuL2NhbGN1bG9zLWVuY3Vlc3RhXCI7XHJcblxyXG52YXIgY29tb2RpbmVzID0ge30gYXMge1xyXG4gICAgY2FsY3VsYXJDb21vZGluZXM/OiAoZm9yUGs6IEZvclBrKSA9PiB2b2lkXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhckNvbW9kaW5lcyhjYWxjdWxhckNvbW9kaW5lczogKGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzID0gY2FsY3VsYXJDb21vZGluZXNcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGlzdGVuZXJDYW1iaW9WYXJpYWJsZSA9ICh2YXJpYWJsZTogc3RyaW5nLCB2YWxvcjogYW55LCBmb3JQaz86IEZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcz86IFJlc3B1ZXN0YXMpID0+IHZvaWQ7XHJcblxyXG50eXBlIFN1c2NyaXBjaW9uQ2FtYmlvVmFyaWFibGUgPSB7XHJcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXJDYW1iaW9WYXJpYWJsZTtcclxuICAgIHZhcmlhYmxlcz86IFNldDxzdHJpbmc+O1xyXG59O1xyXG5cclxudmFyIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZTogU3VzY3JpcGNpb25DYW1iaW9WYXJpYWJsZVtdID0gW107XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VzY3JpYmlyQ2FtYmlvVmFyaWFibGUobGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGUsIHZhcmlhYmxlcz86IHN0cmluZyB8IHN0cmluZ1tdKTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCB2YXJzU2V0ID0gdmFyaWFibGVzXHJcbiAgICAgICAgPyBuZXcgU2V0KEFycmF5LmlzQXJyYXkodmFyaWFibGVzKSA/IHZhcmlhYmxlcyA6IFt2YXJpYWJsZXNdKVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3Qgc3ViOiBTdXNjcmlwY2lvbkNhbWJpb1ZhcmlhYmxlID0geyBsaXN0ZW5lciwgdmFyaWFibGVzOiB2YXJzU2V0IH07XHJcbiAgICBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGUucHVzaChzdWIpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5pbmRleE9mKHN1Yik7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlc3VzY3JpYmlyQ2FtYmlvVmFyaWFibGUobGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGUpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLmZpbmRJbmRleChzID0+IHMubGlzdGVuZXIgPT09IGxpc3RlbmVyKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBub3RpZmljYXJDYW1iaW9WYXJpYWJsZSh2YXJpYWJsZTogc3RyaW5nLCB2YWxvcjogYW55LCBmb3JQaz86IEZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcz86IFJlc3B1ZXN0YXMpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgeyBsaXN0ZW5lciwgdmFyaWFibGVzIH0gPSBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGVbaV07XHJcbiAgICAgICAgaWYgKHZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICBsZXQgYXBsaWNhID0gdmFyaWFibGVzLmhhcyh2YXJpYWJsZSk7XHJcbiAgICAgICAgICAgIGlmICghYXBsaWNhICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFyaWFibGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW4gcmVzcHVlc3Rhc0F1bWVudGFkYXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsaWNhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghYXBsaWNhKSBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGlzdGVuZXIodmFyaWFibGUsIHZhbG9yLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBlbiBsaXN0ZW5lciBkZSBjYW1iaW8gZGUgdmFyaWFibGUnLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxudmFyIGVzcGVjaWFsZXMgPSB7fSBhcyB7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlcz86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bz86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlcyhjYWxjdWxhclZhcmlhYmxlczogKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGs6IEZvclBrKSA9PiB2b2lkKSB7XHJcbiAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzID0gY2FsY3VsYXJWYXJpYWJsZXNcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8oY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bzogKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGs6IEZvclBrKSA9PiB2b2lkKSB7XHJcbiAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8gPSBjYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvXHJcbn1cclxuXHJcbnR5cGUgRGF0b3NCeVBhc3MgPSBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcyAmIHtcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7ICAvLyBubyBzZSBwZXJzaXN0ZVxyXG4gICAgICAgIFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiAvLyByZXN1bHRhZG8gZGVsIHJvd1ZhbGlkYXRvciBwYXJhIGVzdGFkby5mb3JQa1xyXG4gICAgfVxyXG4gICAgZGlydHk6IGJvb2xlYW5cclxufTtcclxuXHJcbnZhciBkYXRvc0J5UGFzcyA9IHt9IGFzIERhdG9zQnlQYXNzXHJcblxyXG5leHBvcnQgY29uc3QgaGF5RGF0b3NCeVBhc3NBbG1hY2VuYWRvcyA9ICgpID0+IGRhdG9zQnlQYXNzICYmIE9iamVjdC5rZXlzKGRhdG9zQnlQYXNzKS5sZW5ndGggPiAwXHJcblxyXG5pbnRlcmZhY2UgUmVjdCB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmVjdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IFJlY3Qge1xyXG4gICAgdmFyIHJlY3Q6IFJlY3QgPSB7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgfTtcclxuICAgIHZhciBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xyXG4gICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgIHJlY3QudG9wICs9IGN1cnJlbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgIHJlY3QubGVmdCArPSBjdXJyZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiByZWN0O1xyXG59XHJcblxyXG4vL0B0cy1pZ25vcmUgYXJyYW5jYSBlbiBibGFuY29cclxudmFyIGVzdHJ1Y3R1cmE6IEVzdHJ1Y3R1cmEgPSBudWxsIGFzIEVzdHJ1Y3R1cmE7XHJcblxyXG5sZXQgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vOiAoZGJwcDogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMpID0+IFByb21pc2U8YW55PiA9ICgpID0+IHtcclxuICAgIHRocm93IG5ldyBFcnJvcigncGVyc2lzdGlyRGF0b3NCeVBhc3MgU0lOIERFRklOSVInKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGlyRGF0b3NCeVBhc3MocGVyc2lzdGlyRGF0b3NCeVBhc3NGdW46IHR5cGVvZiBwZXJzaXN0aXJEYXRvc0J5UGFzcykge1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vID0gcGVyc2lzdGlyRGF0b3NCeVBhc3NGdW47XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYnBwOiBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcykge1xyXG4gICAgYXdhaXQgZ2V0Rm9ybVJlbmRlcmVyKCkucGVyc2lzdGlyRGF0b3MoZGJwcCk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGZhbHNlXHJcbiAgICByZWZyZXNjYXJNYXJjYURpcnR5KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhckVuY3Vlc3RhID0gKGlkQ2FyZ2E6IElkQ2FyZ2EsIGNhbGxCYWNrOiAoZm9yUGtSYWl6OiBGb3JQa1JhaXopID0+IHZvaWQpID0+IHtcclxuICAgIGNvbnN0IE5FWFRfQVVUT19WQUxVRV9QS19SQUlaID0gZ2V0Rm9ybVJlbmRlcmVyKCkuZ2V0VWx0aW1vVmFsb3JQa1JhaXooKSB8fCAnLTEnO1xyXG4gICAgY29uc3QgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgIGdldEZvcm1SZW5kZXJlcigpLnNldFVsdGltb1ZhbG9yUGtSYWl6KChOdW1iZXIoTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVopIC0gMSkudG9TdHJpbmcoKSk7XHJcbiAgICBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW2VzdHJ1Y3R1cmEudWFQcGFsXVtORVhUX0FVVE9fVkFMVUVfUEtfUkFJWiBhcyB1bmtub3duIGFzIElkRW5jXSA9IHt9IGFzIFJlc3B1ZXN0YXNSYWl6O1xyXG4gICAgZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10gPSB7XHJcbiAgICAgICAgLi4uZXN0cnVjdHVyYS5kZWZhdWx0SW5mb3JtYWNpb25IZHIsXHJcbiAgICAgICAgdGVtOiB7IC4uLmVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLnRlbSB9XHJcbiAgICB9O1xyXG4gICAgZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10udGVtLmNhcmdhID0gaWRDYXJnYTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcykudGhlbihcclxuICAgICAgICAoKSA9PiBjYWxsQmFjayh7XHJcbiAgICAgICAgICAgIGZvcm11bGFyaW86IGVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLnRhcmVhLm1haW5fZm9ybSxcclxuICAgICAgICAgICAgW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF06IE51bWJlcihORVhUX0FVVE9fVkFMVUVfUEtfUkFJWikgYXMgVmFsdWVQa1JhaXpcclxuICAgICAgICB9IGFzIEZvclBrUmFpeilcclxuICAgICkvL25vIHF1aXRhciBlbCBjYXN0ZW8gcG9ycXVlIHZpZW5lIGNvbW8gdGV4dG8geSBuZWNlc2l0byBxdWUgc2VhIG7Dum1lcm9cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbmNvbGFyQmFja3VwKFxyXG4gICAgZW5jb2xhckJhY2t1cEZ1bjogKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZvclBrUmFpejogRm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3RhcykgPT4gdm9pZFxyXG4pIHtcclxuICAgIGVuY29sYXJCYWNrdXAgPSBlbmNvbGFyQmFja3VwRnVuXHJcbn1cclxuXHJcbmxldCBlbmNvbGFyQmFja3VwOiAodG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgZm9yUGtSYWl6OiBGb3JQa1JhaXosIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzKSA9PiB2b2lkID0gKCkgPT4ge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU0lOIEVTUEVDSUZJQ0FSIGVuY29sYXJCYWNrdXBcIilcclxufVxyXG5cclxuZXhwb3J0IHZhciBpbnRlbnRhckJhY2t1cCA9IChmb3JQazogRm9yUGspID0+IHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSlcclxuICAgIHZhciB0b2tlbiA9IGRhdG9zQnlQYXNzLnRva2VuO1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgZW5jb2xhckJhY2t1cCh0b2tlbiwgZm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpeik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibm8gaGF5IHRva2VuLCBubyBzZSBwdWRvIGhhY2VyIGVsIGJhY2t1cFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcjogRXN0cnVjdHVyYSkge1xyXG4gICAgZXN0cnVjdHVyYSA9IGFkYXB0YXJFc3RydWN0dXJhKGVzdHJ1Y3R1cmFBQ2FyZ2FyKTtcclxuICAgIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKHVhID0+ICEhdWEucHJpbmNpcGFsKT8udW5pZGFkX2FuYWxpc2lzIVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZkZvciA9IGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5tYXAoZiA9PiAoeyBoZXJtYW5vOiBmLmNhc2lsbGVyb3MuaGVybWFubyB9KSkucGxhaW4oKVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZlVBID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLm1hcCgodWFEZWYsIHVhKSA9PiAoe1xyXG4gICAgICAgIHBrOiB1YURlZi5wa19hZ3JlZ2FkYSBhcyBJZFZhcmlhYmxlLFxyXG4gICAgICAgIGluY2x1aWRhczogbGlrZUFyKHVhRGVmLmhpamFzKS5rZXlzKCksXHJcbiAgICAgICAgaWRzRm9yOiBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykuZmlsdGVyKGYgPT4gZi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YSkua2V5cygpXHJcbiAgICB9KSkucGxhaW4oKVxyXG4gICAgcmV0dXJuIGVzdHJ1Y3R1cmE7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRvc0J5UGFzcyhcclxuICAgIG51ZXZvUGFxdWV0ZTogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7IGRpcnR5PzogYm9vbGVhbiB9XHJcbikge1xyXG4gICAgZGF0b3NCeVBhc3MgPSB7XHJcbiAgICAgICAgZGlydHk6IGZhbHNlLFxyXG4gICAgICAgIC4uLm51ZXZvUGFxdWV0ZSxcclxuICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjoge30gYXMgRGF0b3NCeVBhc3NbXCJmZWVkYmFja1Jvd1ZhbGlkYXRvclwiXVxyXG4gICAgfTtcclxuXHJcbiAgICBjYWxjdWxhckZlZWRiYWNrSG9qYURlUnV0YSgpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldERhdG9zQnlQYXNzID0gKCkgPT4gZGF0b3NCeVBhc3NcclxuXHJcbmZ1bmN0aW9uIG9iamV0b1ZhY2lvKG86IG9iamVjdCkge1xyXG4gICAgZm9yICh2YXIgayBpbiBvKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWVkYmFja1Jvd1ZhbGlkYXRvcigpIHtcclxuICAgIGlmICghZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgfHwgb2JqZXRvVmFjaW8oZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IpKSB7XHJcbiAgICAgICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcnR5KCkge1xyXG4gICAgcmV0dXJuIGRhdG9zQnlQYXNzLmRpcnR5XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFc3RydWN0dXJhKCkge1xyXG4gICAgcmV0dXJuIGVzdHJ1Y3R1cmE7XHJcbn1cclxuXHJcbnR5cGUgRWxlbWVudG9zUmVnaXN0cmFibGVzID0gSFRNTERpdkVsZW1lbnQgfCBIVE1MQnV0dG9uRWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG50eXBlIERpcmVjdEZ1bmN0aW9uPFQsIFJlc3VsdD4gPSAocmVzcHVlc3Rhc0F1bWVudGFkYXM6IFJlc3B1ZXN0YXMsIGZlZWRiYWNrRm9ybTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4sIGVsZW1lbnRvOiBULFxyXG4gICAgZmVlZGJhY2tBbGw6IHtcclxuICAgICAgICBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gLy8gcmVzdWx0YWRvIGRlbCByb3dWYWxpZGF0b3IgcGFyYSBlc3RhZG8uZm9yUGtcclxuICAgIH0sXHJcbiAgICBlc3RydWN0dXJhOiBFc3RydWN0dXJhXHJcbikgPT4gUmVzdWx0XHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7XHJcbiAgICBpZDogc3RyaW5nLFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBhbnk+LFxyXG4gICAgdmFyaWFibGU/OiBJZFZhcmlhYmxlLFxyXG4gICAgZm9yUGs/OiBGb3JQayxcclxufSAmICh7XHJcbiAgICBwcm9wOiBrZXlvZiBUXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIFRba2V5b2YgVF0+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgbGEgcHJvcChlcnR5KSBkZWwgZWxlbWVudG9cclxufSB8IHtcclxuICAgIGF0dHI6IHN0cmluZ1xyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBzdHJpbmc+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgZWwgdmFsb3IgZGVsIGF0dHIoaWJ1dG8pXHJcbn0gfCB7XHJcbiAgICBzdHlsZToga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvblxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBzdHJpbmc+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgZWwgdmFsb3IgZGVsIHN0eWxlXHJcbn0gfCB7XHJcbiAgICBkaXJlY3Q6IHRydWVcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgdm9pZD4gLy8gTGEgZnVuY2nDs24gdmEgYSB0b2NhciBkaXJlY3RhbWVudGUgZWwgZWxlbWVudG8geSBoYWNlciB0b2RvIGxvIHF1ZSB0ZW5nYSBxdWUgaGFjZXJcclxufSlcclxuXHJcbnR5cGUgUmVnaXN0cm9FbGVtZW50b3M8VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7IFtpZDogc3RyaW5nXTogUmVnaXN0cm9FbGVtZW50bzxUPiAmIHsgZWxlbWVudG8/OiBUIH0gfTtcclxuXHJcbnZhciByZWdpc3Ryb0VsZW1lbnRvc0dsb2JhbCA9IHt9IGFzIFJlZ2lzdHJvRWxlbWVudG9zPEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0cmFyRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4oZGVmOiBSZWdpc3Ryb0VsZW1lbnRvPFQ+KSB7XHJcbiAgICAvLyBAdHMtaWdub3JlIFPDrSwgcG9kcsOtYSBzZXIgcXVlIGxvcyB0aXBvcyBkZSBUIHNlYW4gZGlzdGludG9zLCBwZXJvIHZhbiBhIHNlciBjb2hlcmVudGVzXHJcbiAgICB2YXIgcmVnaXN0cm9FbGVtZW50b3M6IFJlZ2lzdHJvRWxlbWVudG9zPFQ+ID0gcmVnaXN0cm9FbGVtZW50b3NHbG9iYWw7XHJcbiAgICByZWdpc3Ryb0VsZW1lbnRvc1tkZWYuaWRdID0gZGVmO1xyXG59XHJcblxyXG50eXBlIFJlc3B1ZXN0YXNGb3JQa0NvbXVuID0geyByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpejogRm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczogVW5pZGFkQW5hbGlzaXMgfVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGspOiBSZXNwdWVzdGFzRm9yUGtDb211blxyXG5leHBvcnQgZnVuY3Rpb24gcmVzcHVlc3Rhc0ZvclBrKGZvclBrOiBGb3JQaywgY29uQXVtZW50YWRhczogdHJ1ZSwgYWdyZWdhclNpRmFsdGE/OiBib29sZWFuKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW4gJiB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzOiBSZXNwdWVzdGFzIH1cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGssIGNvbkF1bWVudGFkYXM/OiBib29sZWFuLCBhZ3JlZ2FyU2lGYWx0YT86IGJvb2xlYW4pOiBSZXNwdWVzdGFzRm9yUGtDb211biAmIHsgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzIH0ge1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0ge30gYXMgUmVzcHVlc3RhcztcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbG8gcXVlIHNvYnJhciBkZSByZXNwdWVzdGFzIG5vIG1lIGltcG9ydGEuLi5cclxuICAgIHZhciByZXNwdWVzdGFzID0gZGF0b3NCeVBhc3MucmVzcHVlc3RhcyBhcyBSZXNwdWVzdGFzO1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpejtcclxuICAgIHZhciBmb3JQa1JhaXo6IEZvclBrO1xyXG4gICAgdmFyIHVuaWRhZF9hbmFsaXNpczogSWRVbmlkYWRBbmFsaXNpcyB8IHVuZGVmaW5lZCA9IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXNcclxuICAgIHZhciBmb3JQa0FwaWxhZGEgPSBmb3JQaztcclxuICAgIHZhciBwaWxhOiBbdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzLCB1YURlZjogVW5pZGFkQW5hbGlzaXMsIGZvclBrOiBGb3JQa11bXSA9IFtdO1xyXG4gICAgd2hpbGUgKHVuaWRhZF9hbmFsaXNpcykge1xyXG4gICAgICAgIHZhciB1YURlZjogVW5pZGFkQW5hbGlzaXMgPSBlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW3VuaWRhZF9hbmFsaXNpc107XHJcbiAgICAgICAgcGlsYS5wdXNoKFt1bmlkYWRfYW5hbGlzaXMsIHVhRGVmLCBmb3JQa0FwaWxhZGFdKTtcclxuICAgICAgICBmb3JQa0FwaWxhZGEgPSB7IC4uLmZvclBrQXBpbGFkYSB9O1xyXG4gICAgICAgIGRlbGV0ZSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdXHJcbiAgICAgICAgdW5pZGFkX2FuYWxpc2lzID0gdWFEZWYucGFkcmVcclxuICAgIH1cclxuICAgIHdoaWxlIChwaWxhLmxlbmd0aCkge1xyXG4gICAgICAgIFt1bmlkYWRfYW5hbGlzaXMsIHVhRGVmLCBmb3JQa0FwaWxhZGFdID0gcGlsYS5wb3AoKSFcclxuICAgICAgICB2YXIgdmFsb3JQa09Qb3NpY2lvbiA9IGZvclBrQXBpbGFkYVt1YURlZi5wa19hZ3JlZ2FkYV07XHJcbiAgICAgICAgaWYgKHZhbG9yUGtPUG9zaWNpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFsdGEgdW4gdmFsb3IgcGFyYSAke0pTT04uc3RyaW5naWZ5KHVhRGVmLnBrX2FncmVnYWRhKX1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXNwdWVzdGFzQW50ZXJpb3IgPSByZXNwdWVzdGFzO1xyXG4gICAgICAgIGxldCBwb3NpY2lvbiA9IHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5ID8gdmFsb3JQa09Qb3NpY2lvbiAtIDEgOiB2YWxvclBrT1Bvc2ljaW9uXHJcbiAgICAgICAgcmVzcHVlc3RhcyA9IHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl07XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoYWdyZWdhclNpRmFsdGEpIHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMgPSB7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzQW50ZXJpb3JbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl0gPSByZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGV4aXN0ZSBlbCBlbGVtZW50byAnJHtwb3NpY2lvbn0nIGVuIGxhIHVuaWRhZF9hbmFsaXNpcyAnJHt1bmlkYWRfYW5hbGlzaXN9J2ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvclBrUmFpeiB8fD0gZm9yUGtBcGlsYWRhO1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgU8OpIHF1ZSBlcyByYcOteiBwb3IgY8OzbW8gZXN0b3kgcmV2b2x2aWVuZG8gbGEgcGlsYVxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6IHx8PSByZXNwdWVzdGFzO1xyXG4gICAgICAgIGlmIChjb25BdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0geyAuLi5yZXNwdWVzdGFzQXVtZW50YWRhcywgLi4ucmVzcHVlc3RhcywgW3VhRGVmLnBrX2FncmVnYWRhXTogdmFsb3JQa09Qb3NpY2lvbiB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZXNwdWVzdGFzLCByZXNwdWVzdGFzQXVtZW50YWRhcyxcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFPDqSBxdWUgbGEgcGlsYSB0aWVuZSBhbCBtZW5vcyB1biBlbGVtZW50byBwb3IgbG8gdGFudG8gZXN0byBlc3TDoSBsbGVubyBzZWd1cm8uIFxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHVuaWRhZEFuYWxpc2lzOiB1YURlZlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1JhaXo6IEZvclBrUmFpeikge1xyXG4gICAgdmFyIHsgcmVzcHVlc3Rhc0F1bWVudGFkYXMgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQa1JhaXosIHRydWUpXHJcbiAgICB2YXIgcmVnaXN0cm9FbGVtZW50b3MgPSByZWdpc3Ryb0VsZW1lbnRvc0dsb2JhbDtcclxuICAgIHZhciBwbGFpbkZvclBrID0gdG9QbGFpbkZvclBrKGZvclBrUmFpeilcclxuICAgIHZhciByb3dWYWxpZGF0b3IgPSBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXTtcclxuICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJvRWxlbWVudG9zKSB7XHJcbiAgICAgICAgdmFyIGRlZiA9IHJlZ2lzdHJvRWxlbWVudG9zW2lkXTtcclxuICAgICAgICBpZiAoZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhkZWYuZWxlbWVudG8pKSB7XHJcbiAgICAgICAgICAgICAgICBkZWYuZWxlbWVudG8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFkZWYuZWxlbWVudG8pIHtcclxuICAgICAgICAgICAgZGVmLmVsZW1lbnRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVmLmlkKSBhcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCVVNDQU5ETyBlbCBlbGVtZW50byByZWdpc3RyYWRvICcsaWQsJ25vIGVzdMOhIGVuIGVsIERPTScpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsdWUgPSBkZWYuZnVuKHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByb3dWYWxpZGF0b3IsIGRlZi5lbGVtZW50bywgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEpO1xyXG4gICAgICAgIGlmICgncHJvcCcgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYucHJvcCwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgnYXR0cicgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldEF0dHJEaXN0aW50byhkZWYuZWxlbWVudG8sIGRlZi5hdHRyLCB2YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCdzdHlsZScgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLnN0eWxlLCBkZWYuc3R5bGUsIHZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyb3dWYWxpZGF0b3IuYWN0dWFsKSB7XHJcbiAgICAgICAgdmFyIHsgdG9wLCBib3R0b20gfSA9IGNhbGN1bGFyRWxlbWVudG9FbmZvY2Fkbyhyb3dWYWxpZGF0b3IuYWN0dWFsKTtcclxuICAgICAgICBpZiAodG9wICE9IG51bGwgJiYgYm90dG9tICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hcnJpYmEnKS5lbFRvcFZpc2liaWxpemFyID0gdG9wO1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYWItYWN0aXZvLWFiYWpvJykuZWxCb3R0b21WaXNpYmlsaXphciA9IGJvdHRvbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8oaWRWYXJpYWJsZTogSWRWYXJpYWJsZSB8IElkRmluKSB7XHJcbiAgICB2YXIgZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRWYXJpYWJsZSA9PSAnZmluJyA/IGBib3Rvbi12b2x2ZXItMmAgOiBgdmFyLSR7aWRWYXJpYWJsZX1gKVxyXG4gICAgICAgIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVmFyaWFibGUpO1xyXG4gICAgdmFyIGVsZW1lbnRvID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgdmFyIE1BUkdFTl9TQ1JPTEwgPSA2NDtcclxuICAgIHZhciBhbHRvUGFudGFsbGEgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjcgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgdmFyIGVsZW1lbnRvRW50ZXJvOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsOyAvLyBlcyBlbCBlbGVtZW50byBxdWUgdmEgYSBlbnRhciBlbnRlcm8gZW4gcGFudGFsbGEsIGRlZmluZSBlbCBib3R0b21cclxuICAgIHZhciByZWN0RWxlbWVudG9FbnRlcm86IFJlY3QgfCBudWxsID0gbnVsbDtcclxuICAgIHZhciBlbGVtZW50b1N1cGVyaW9yOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsOyAvLyBlcyBlbCBlbGVtZW50byBxdWUgdmEgYSBtb3N0cmFyc2UgZGVzZGUgYXJyaWJhIGF1bnF1ZSBubyBlbnRyZSBlbnRlcm8sIGRlZmluZSBlbCB0b3BcclxuICAgIHZhciByZWN0RWxlbWVudG9TdXBlcmlvcjogUmVjdHwgbnVsbCA9IG51bGw7XHJcbiAgICB3aGlsZSAoZWxlbWVudG8gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgKGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygndmFyaWFibGUnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtdWx0aXBsZScpXHJcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ByZWd1bnRhJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnY29uanVudG9wcmVndW50YXMnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWNjaW9uLWJvdG9uLWZvcm11bGFyaW8nKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3RvbmZvcm11bGFyaW8nKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3Rvbi12b2x2ZXInKVxyXG4gICAgICAgICAgICApICYmIGVsZW1lbnRvLm9mZnNldEhlaWdodCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRvU3VwZXJpb3IgPT0gbnVsbCAmJiBlbGVtZW50by5jbGllbnRIZWlnaHQgPCBhbHRvUGFudGFsbGEpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudG9FbnRlcm8gPT0gbnVsbCkgZWxlbWVudG9FbnRlcm8gPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50b0VudGVyb1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IGdldFJlY3QoZWxlbWVudG9FbnRlcm8hKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdEVsZW1lbnRvRW50ZXJvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBnZXRSZWN0KGVsZW1lbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8udG9wICsgcmVjdEVsZW1lbnRvRW50ZXJvLmhlaWdodCAtIHJlY3QudG9wIDwgYWx0b1BhbnRhbGxhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudG9TdXBlcmlvciA9IGVsZW1lbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudG8gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnRvID0gZWxlbWVudG8/LnBhcmVudEVsZW1lbnQgPz8gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChlbGVtZW50b1N1cGVyaW9yID09IG51bGwpIHtcclxuICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm87XHJcbiAgICB9XHJcbiAgICB2YXIgcmVzdWx0OiB7XHJcbiAgICAgICAgZWxlbWVudG9JbnB1dFZhcmlhYmxlPzogSFRNTEVsZW1lbnQgfCBudWxsXHJcbiAgICAgICAgdG9wPzogbnVtYmVyIHwgbnVsbFxyXG4gICAgICAgIGJvdHRvbT86IG51bWJlciB8IG51bGxcclxuICAgICAgICBlbmZvY2Fkbz86IGJvb2xlYW4gfCBudWxsXHJcbiAgICAgICAgZGVzZW5mb3F1ZT86IHN0cmluZyB8IG51bGxcclxuICAgIH0gPSB7fTtcclxuICAgIGlmIChlbGVtZW50b0VudGVybyAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHJlY3RFbGVtZW50b0VudGVybyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IGdldFJlY3QoZWxlbWVudG9FbnRlcm8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbGVtZW50b0lucHV0VmFyaWFibGUgPSBlbGVtZW50b1ZhcmlhYmxlQUVuZm9jYXI7XHJcbiAgICAgICAgdmFyIHRvcCA9IChyZWN0RWxlbWVudG9TdXBlcmlvciA/PyByZWN0RWxlbWVudG9FbnRlcm8pLnRvcCAtIE1BUkdFTl9TQ1JPTEw7XHJcbiAgICAgICAgcmVzdWx0LnRvcCA9IHRvcDtcclxuICAgICAgICByZXN1bHQuYm90dG9tID0gcmVjdEVsZW1lbnRvRW50ZXJvLnRvcCArIHJlY3RFbGVtZW50b0VudGVyby5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKHRvcCA8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWUgPSAnYXJyaWJhJztcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCArIGFsdG9QYW50YWxsYSkge1xyXG4gICAgICAgICAgICByZXN1bHQuZGVzZW5mb3F1ZSA9ICdhYmFqbyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0LmVuZm9jYWRvID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyRGlzdGludG88TiBleHRlbmRzIHN0cmluZz4oXHJcbiAgICBvYmpldG86IHsgc2V0QXR0cmlidXRlOiAobmFtZTogTiwgdmFsb3I6IHN0cmluZykgPT4gdm9pZCwgZ2V0QXR0cmlidXRlOiAobmFtZTogTikgPT4gc3RyaW5nIHwgbnVsbCB9LFxyXG4gICAgbmFtZTogTixcclxuICAgIHZhbG9yOiBzdHJpbmdcclxuKSB7XHJcbiAgICBpZiAob2JqZXRvICYmIG9iamV0by5nZXRBdHRyaWJ1dGUobmFtZSkgIT0gdmFsb3IpIHtcclxuICAgICAgICBvYmpldG8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbG9yKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbG9yRGlzdGludG88VCBleHRlbmRzIHt9LCBOIGV4dGVuZHMga2V5b2YgVD4oXHJcbiAgICBvYmpldG86IFQsXHJcbiAgICBuYW1lOiBOLFxyXG4gICAgdmFsb3I6IFRbTl1cclxuKSB7XHJcbiAgICBpZiAob2JqZXRvW25hbWVdICE9IHZhbG9yKSB7XHJcbiAgICAgICAgb2JqZXRvW25hbWVdID0gdmFsb3I7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrOiBGb3JQaykge1xyXG4gICAgaWYgKGVzdHJ1Y3R1cmEuaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpIHtcclxuICAgICAgICB2YXIgeyByZXNwdWVzdGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGspO1xyXG4gICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbylcclxuICAgICAgICAgICAgLmZvckVhY2goKGNvbmZpZ0JvdG9uRm9ybXVsYXJpbywgaWRGb3JtdWxhcmlvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzcFVBID0gcmVzcHVlc3Rhc1tlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tpZEZvcm11bGFyaW9dLnVuaWRhZF9hbmFsaXNpc107XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcFVBICE9IG51bGwgJiYgcmVzcFVBIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0JvdG9uRm9ybXVsYXJpby5oYWJpbGl0YXJfYWdyZWdhcl9saXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzWyckQi4nICsgaWRGb3JtdWxhcmlvIGFzIElkVmFyaWFibGVdID0gJ29rJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9pZF9wcmVndW50YShfcGF5bG9hZDogeyBwcmVndW50YTogSWRQcmVndW50YSwgZm9yUGs6IEZvclBrIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID0gU3ltYm9sKCdOT19DQU1CSUFSX1NPTE9fVFJBRVJfU1RBVFVTJylcclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gPSBTeW1ib2woJ05PX0NBTUJJQVJfVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTycpXHJcblxyXG5mdW5jdGlvbiByZWZyZXNjYXJNYXJjYURpcnR5KCkge1xyXG4gICAgdmFyIGJvdG9uR3JhYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlLWJ1dHRvblwiKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuICAgIGlmIChib3RvbkdyYWJhcikge1xyXG4gICAgICAgIGlmIChib3RvbkdyYWJhci5kaXNhYmxlZCAhPT0gIWRhdG9zQnlQYXNzLmRpcnR5KSB7XHJcbiAgICAgICAgICAgIGJvdG9uR3JhYmFyLmRpc2FibGVkID0gIWRhdG9zQnlQYXNzLmRpcnR5O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsXHJcbiAgICB2YXJpYWJsZTogSWRWYXJpYWJsZSxcclxuICAgIHJlc3B1ZXN0YUlucHV0OiBWYWxvclxyXG4pIHtcclxuICAgIHZhciByZXNwdWVzdGEgPSByZXNwdWVzdGFJbnB1dDtcclxuICAgIHZhciB2YWxvckFudGVyaW9yID0gcmVzcHVlc3Rhc1t2YXJpYWJsZV07XHJcbiAgICBpZiAocmVzcHVlc3RhID09PSAnJykge1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IG51bGw7XHJcbiAgICB9IGVsc2UgaWYgKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbdmFyaWFibGVdPy50aXBvID09ICdudW1lcm8nKSB7XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YSA9IE51bWJlcihyZXNwdWVzdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHNpIGVzIHVuIGZhbHN5ICgwID09IGZhbHNlKSB0ZW5nbyBxdWUgY29tcGFyYXIgY29uICE9PVxyXG4gICAgdmFyIHJlY2VudE1vZGlmaWVkID0gcmVzcHVlc3RhID8gdmFsb3JBbnRlcmlvciAhPSByZXNwdWVzdGEgOiB2YWxvckFudGVyaW9yICE9PSByZXNwdWVzdGE7XHJcbiAgICBpZiAocmVjZW50TW9kaWZpZWQpIHtcclxuICAgICAgICByZXNwdWVzdGFzW3ZhcmlhYmxlXSA9IHJlc3B1ZXN0YSA/PyBudWxsOyAvLyBjYW1iaW8gdW5kZWZpbmVkIHBvciBudWxsXHJcbiAgICB9XHJcbiAgICByZXR1cm4geyByZWNlbnRNb2RpZmllZCwgdmFsb3JBbnRlcmlvciwgcmVzcHVlc3RhUHJvY2VzYWRhOiByZXNwdWVzdGEgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVmcmVzY2FyWVJlY2FsY3VsYXJCeXBhc3MoXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LFxyXG4gICAgZm9yUGtSYWl6OiBGb3JQa1JhaXosXHJcbiAgICB2YXJpYWJsZXNNb2RpZmljYWRhczogSWRWYXJpYWJsZVtdLFxyXG4gICAgcmVjZW50TW9kaWZpZWQ6IGJvb2xlYW5cclxuKSB7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGspO1xyXG4gICAgaWYgKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhcmlhYmxlc01vZGlmaWNhZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZlcmlmaWNhclNvcnRlbyh7XHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvOiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tnZXRNYWluRm9ybUZvclZpdmllbmRhKGZvclBrW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0pXSxcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzUmFpeixcclxuICAgICAgICAgICAgICAgIHZhcmlhYmxlQWN0dWFsOiB2YXJpYWJsZXNNb2RpZmljYWRhc1tpXSxcclxuICAgICAgICAgICAgICAgIGZvclBrOiBmb3JQa1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgcmVmcmVzY2FyTWFyY2FEaXJ0eSgpO1xyXG4gICAgY2FsY3VsYXJGZWVkYmFjayhyZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB7IGF1dG9JbmdyZXNvOiB0cnVlIH0pO1xyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQayk7XHJcbiAgICB2b2xjYWRvSW5pY2lhbEVsZW1lbnRvc1JlZ2lzdHJhZG9zKGZvclBrKTtcclxuICAgIGNvbnN0IHsgcmVzcHVlc3Rhc0F1bWVudGFkYXMgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSk7XHJcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhcmlhYmxlc01vZGlmaWNhZGFzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgdmFyIHYgPSB2YXJpYWJsZXNNb2RpZmljYWRhc1tqXTtcclxuICAgICAgICBub3RpZmljYXJDYW1iaW9WYXJpYWJsZSh2IGFzIHN0cmluZywgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdl0sIGZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcyk7XHJcbiAgICB9XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICByZXR1cm4gZmVlZGJhY2tSb3c7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXJDb21vZGluZXNGb3JQayhmb3JQazogRm9yUGspIHtcclxuICAgIGlmIChjb21vZGluZXMuY2FsY3VsYXJDb21vZGluZXMpIHtcclxuICAgICAgICBjb21vZGluZXMuY2FsY3VsYXJDb21vZGluZXMoZm9yUGspO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGEocGF5bG9hZDoge1xyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUgfCB0eXBlb2YgTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMsXHJcbiAgICByZXNwdWVzdGE6IFZhbG9yIHwgdHlwZW9mIE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU9cclxufSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHRva2VuID0gJ0FWRVJJR1VBUiBUT0RPJztcclxuICAgIGxldCB7IGZvclBrLCByZXNwdWVzdGEsIHZhcmlhYmxlIH0gPSBwYXlsb2FkO1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXMgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dO1xyXG4gICAgdmFyIHJlY2VudE1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICB2YXIgdmFsb3JBbnRlcmlvciA9IHZhcmlhYmxlICE9IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID8gcmVzcHVlc3Rhc1t2YXJpYWJsZV0gOiBudWxsO1xyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICB2YXIgc2lndWllbnRlVmFyaWFibGU6IElkVmFyaWFibGUgfCBJZEZpbiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHJlc3B1ZXN0YSAhPT0gTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUykge1xyXG4gICAgICAgIHZhciByZXNDYW1iaW8gPSBhcGxpY2FyQ2FtYmlvVW5hUmVzcHVlc3RhKGZvclBrLCByZXNwdWVzdGFzLCB2YXJpYWJsZSwgcmVzcHVlc3RhKTtcclxuICAgICAgICByZWNlbnRNb2RpZmllZCA9IHJlc0NhbWJpby5yZWNlbnRNb2RpZmllZDtcclxuICAgICAgICBpZiAoIXJlY2VudE1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbdmFyaWFibGVdPy5zaWd1aWVudGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyAmJiAocmVjZW50TW9kaWZpZWQgfHwgTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiBmZWVkYmFja1Jvdy5hdXRvSW5ncmVzYWRhcz8uW3ZhcmlhYmxlXSkpIHtcclxuICAgICAgICBmZWVkYmFja1JvdyA9IHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKGZvclBrLCByZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCBbdmFyaWFibGVdLCByZWNlbnRNb2RpZmllZCk7XHJcbiAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSB2YXJpYWJsZTtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbc2lndWllbnRlVmFyaWFibGVdPy5zaWd1aWVudGU7XHJcbiAgICAgICAgfSB3aGlsZSAodmFsb3JBbnRlcmlvciA9PSBudWxsICYmIHJlY2VudE1vZGlmaWVkICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9IG51bGwgJiYgc2lndWllbnRlVmFyaWFibGUgIT0gJ2ZpbicgJiYgZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5lc3RydWN0dXJhUm93VmFsaWRhdG9yLnZhcmlhYmxlc1tzaWd1aWVudGVWYXJpYWJsZV0uZnVuY2lvbkF1dG9JbmdyZXNhcik7XHJcbiAgICAgICAgaWYgKHNpZ3VpZW50ZVZhcmlhYmxlID09IG51bGwgJiYgZmVlZGJhY2tSb3cuZmVlZGJhY2tbdmFyaWFibGVdPy5lc3RhZG8gPT0gJ3ZhbGlkYScpIHtcclxuICAgICAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSAnZmluJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyByZWNlbnRNb2RpZmllZCwgc2lndWllbnRlVmFyaWFibGUsIHZhcmlhYmxlQWN0dWFsOiBmZWVkYmFja1Jvdy5hY3R1YWwgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmVnaXN0cm9SZXNwdWVzdGFTaW1wbGUgPSB7XHJcbiAgICB2YXJpYWJsZTogSWRWYXJpYWJsZSxcclxuICAgIHJlc3B1ZXN0YTogVmFsb3JcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YXMocGF5bG9hZDoge1xyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgcmVzcHVlc3RhczogUmVnaXN0cm9SZXNwdWVzdGFTaW1wbGVbXVxyXG59LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQaywgcmVzcHVlc3RhczogbGlzdGFSZXNwdWVzdGFzIH0gPSBwYXlsb2FkO1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZEFueSA9IGZhbHNlO1xyXG4gICAgdmFyIHZhcmlhYmxlc01vZGlmaWNhZGFzOiBJZFZhcmlhYmxlW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RhUmVzcHVlc3Rhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBpdGVtID0gbGlzdGFSZXNwdWVzdGFzW2ldO1xyXG4gICAgICAgIHZhciByZXNDYW1iaW8gPSBhcGxpY2FyQ2FtYmlvVW5hUmVzcHVlc3RhKGZvclBrLCByZXNwdWVzdGFzLCBpdGVtLnZhcmlhYmxlLCBpdGVtLnJlc3B1ZXN0YSk7XHJcbiAgICAgICAgaWYgKHJlc0NhbWJpby5yZWNlbnRNb2RpZmllZCkge1xyXG4gICAgICAgICAgICByZWNlbnRNb2RpZmllZEFueSA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlc01vZGlmaWNhZGFzLnB1c2goaXRlbS52YXJpYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRNb2RpZmllZEFueSAmJiB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmVmcmVzY2FyWVJlY2FsY3VsYXJCeXBhc3MoZm9yUGssIHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHZhcmlhYmxlc01vZGlmaWNhZGFzLCByZWNlbnRNb2RpZmllZEFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQ6IHJlY2VudE1vZGlmaWVkQW55IH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX25vdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgdGFyZWE6IElkVGFyZWEsIG5vdGE6IHN0cmluZyB8IG51bGwgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCB0YXJlYSwgbm90YSB9ID0gcGF5bG9hZDtcclxuICAgIGNvbnNvbGUubG9nKFwiRkFMVEEgLy8gVE9ET1wiKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfdmlzaXRhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIG9ic2VydmFjaW9uZXM6IHN0cmluZyB8IG51bGwgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCBvYnNlcnZhY2lvbmVzIH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX21vZGlmaWNhcl92aXNpdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgaW5kZXg6IG51bWJlciwgb3BjaW9uOiBrZXlvZiBWaXNpdGEsIHZhbG9yOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXgsIG9wY2lvbiwgdmFsb3IgfSA9IHBheWxvYWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYm9ycmFyX3Zpc2l0YShwYXlsb2FkOiB7IGZvclBrUmFpejogRm9yUGtSYWl6LCBpbmRleDogbnVtYmVyIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXggfSA9IHBheWxvYWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYWdyZWdhcl9mb3JtdWxhcmlvKHsgZm9yUGsgfTogeyBmb3JQazogRm9yUGsgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUsIHRydWUpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FicmlyX2Zvcm11bGFyaW8oeyBmb3JQayB9OiB7IGZvclBrOiBGb3JQayB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGspO1xyXG4gICAgY2FsY3VsYXJGZWVkYmFja1VuaWRhZEFuYWxpc2lzKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCBlc3RydWN0dXJhLmZvcm11bGFyaW9zLCByZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcy51bmlkYWRfYW5hbGlzaXMsIGZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcywgbnVsbCwge30pXHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQayk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYm9ycmFyX2Zvcm11bGFyaW8oeyBmb3JQaywgZm9yUGtQYWRyZSB9OiB7IGZvclBrOiBGb3JQaywgZm9yUGtQYWRyZTogRm9yUGsgfSkge1xyXG4gICAgdmFyIHsgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6IElkVW5pZGFkQW5hbGlzaXMgfCB1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgdWFEZWY6IFVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgdmFyIGluZGV4ID0gZm9yUGtbdWFEZWYucGtfYWdyZWdhZGFdIGFzIG51bWJlcjtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXM6IHJlc3B1ZXN0YXNQYWRyZSB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrUGFkcmUsIHRydWUsIHRydWUpO1xyXG4gICAgKHJlc3B1ZXN0YXNQYWRyZVt1bmlkYWRfYW5hbGlzaXNdIGFzIFJlc3B1ZXN0YXNbXSkuc3BsaWNlKGluZGV4IC0gMSwgMSk7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGtQYWRyZSk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHRydWU7XHJcbiAgICByZXNwdWVzdGFzUmFpei4kZGlydHkgPSByZXNwdWVzdGFzUmFpei4kZGlydHkgfHwgdHJ1ZTtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgeyBhdXRvSW5ncmVzbzogdHJ1ZSB9KTtcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrUGFkcmUpO1xyXG4gICAgdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1BhZHJlKTtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaEJ5UGFzczxULCBSPihcclxuICAgIGZ1bjogKHBheWxvYWQ6IFQsIGRhdG9zOiB0eXBlb2YgZGF0b3NCeVBhc3MpID0+IFIsXHJcbiAgICBwYXlsb2FkOiBUXHJcbikge1xyXG4gICAgcmV0dXJuIGZ1bihwYXlsb2FkLCBkYXRvc0J5UGFzcyk7XHJcbn1cclxuXHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHVsdGltYVZhcmlibGVWaXZpZW5kYSA9ICdOT19FU1RBX0RFRklOSURBX0FVTi8vVE9ETycgYXMgSWRWYXJpYWJsZTtcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhDUCA9IDIwO1xyXG5cclxuLyogUkVEVUNFUlMgKi9cclxuXHJcbnZhciByZWVtcGxhem9zSGFiaWxpdGFyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgZmFsc2U6ICdmYWxzZScsXHJcbiAgICB0cnVlOiAndHJ1ZScsXHJcbiAgICBcIj1cIjogJz09JyxcclxuICAgIFwiPD5cIjogJyE9JyxcclxuICAgIFwiJlwiOiAnJiYnLFxyXG4gICAgXCJ8XCI6ICd8fCcsXHJcbiAgICBcIk9SXCI6ICd8fCcsXHJcbiAgICBcIkFORFwiOiAnJiYnLFxyXG4gICAgXCJvclwiOiAnfHwnLFxyXG4gICAgXCJhbmRcIjogJyYmJyxcclxuICAgIFwibm90XCI6ICchJyxcclxuICAgIFwiTk9UXCI6ICchJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBoZWxwZXJzQ2FzaWxsZXJvcyA9IHtcclxuICAgIG51bGwyemVybyhwb3NpYmxlTnVsbDogYW55KSB7XHJcbiAgICAgICAgaWYgKHBvc2libGVOdWxsID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwb3NpYmxlTnVsbDtcclxuICAgIH0sXHJcbiAgICBkaXYwZXJyKG51bWVyYWRvcjogbnVtYmVyLCBkZW5vbWluYWRvcjogbnVtYmVyLCBwazogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGRlbm9taW5hZG9yID09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgZW4gXCIgKyBwayArIFwiIGRpdmlzaW9uIHBvciBjZXJvIGRlIFwiICsgbnVtZXJhZG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bWVyYWRvciAvIGRlbm9taW5hZG9yO1xyXG4gICAgfSxcclxuICAgIGZ1bnM6IHtcclxuICAgICAgICBibGFuY28oeDogYW55KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB4ICE9PSAwICYmICF4XHJcbiAgICAgICAgfSxcclxuICAgICAgICBob3koKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlLnRvZGF5KCkudG9EbXkoKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmVjaGFfdmFsaWRhKHg6IHN0cmluZykge1xyXG4gICAgICAgICAgICB2YXIgZm9ybWF0b192YWxpZG8gPSAvXihbMS05XXwwWzEtOV18WzEyXVxcZHwzWzAxXSlcXC8oWzEtOV18MFsxLTldfDFbMDEyXSlcXC8yMFxcZFxcZCQvLnRlc3QoeClcclxuICAgICAgICAgICAgdmFyIHhEYXRlOiBEYXRlO1xyXG4gICAgICAgICAgICB2YXIgY29udmVyc2lvbk9rOiBib29sZWFuO1xyXG4gICAgICAgICAgICBjb252ZXJzaW9uT2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZm9ybWF0b192YWxpZG8pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtkLCBtLCB5XSA9IHguc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeERhdGUgPSBuZXcgRGF0ZShgJHt5fS8ke219LyR7ZH1gKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25PayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvL2ZhbHRhcmlhIHZhbGlkYXIgcXVlIG5vIHNlYSB1bmEgZmVjaGEgZnV0dXJhIHkgcXVlIHNlYSB1bmEgZmVjaGEgZW4gZWwgcmFuZ28gZGVsIG9wZXJhdGl2b1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0b192YWxpZG8gJiYgY29udmVyc2lvbk9rXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXNhbmlvX3ZhbGlkbyh4OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgdmFyIGZvcm1hdG9fdmFsaWRvID0gL14oWzEtOV18MFsxLTldfDFbMDEyXSlcXC8oMTl8MjApXFxkXFxkJC8udGVzdCh4KVxyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0b192YWxpZG9cclxuICAgICAgICB9LFxyXG4gICAgICAgIGluZm9ybWFkbyh4OiBhbnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHggIT09IHVuZGVmaW5lZCAmJiB4ICE9PSBudWxsICYmICghKHggaW5zdGFuY2VvZiBBcnJheSkgfHwgeC5sZW5ndGggIT09IDApXHJcbiAgICAgICAgICAgICAgICAmJiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSB8fCBPYmplY3Qua2V5cyh4KS5sZW5ndGggIT09IDApXHJcbiAgICAgICAgfSxcclxuICAgICAgICBuc25jKHg6IGFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4geCA9PSAtOVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcGFyKHg6IG51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4geCAlIDIgPT0gMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWRhZF9tZXNfYW5uaW9fdmFsaWRvKGVkYWQ6IG51bWJlciwgbWVzQW5uaW86IHN0cmluZywgZmVjaGFSZWFsaXphY2lvbkRETU1ZWVlZOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgdmFyIG1lc2VzRGlmZXJlbmNpYSA9IChkMTogRGF0ZSwgZDI6IERhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBtb250aHM7XHJcbiAgICAgICAgICAgICAgICBtb250aHMgPSAoZDIuZ2V0RnVsbFllYXIoKSAtIGQxLmdldEZ1bGxZZWFyKCkpICogMTI7XHJcbiAgICAgICAgICAgICAgICBtb250aHMgLT0gZDEuZ2V0TW9udGgoKTtcclxuICAgICAgICAgICAgICAgIG1vbnRocyArPSBkMi5nZXRNb250aCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyA8PSAwID8gMCA6IG1vbnRocztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGFydGVzUmVhbGl6YWNpb24gPSBmZWNoYVJlYWxpemFjaW9uRERNTVlZWVkuc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgbGFzIHBhcnRlcyBjb3JyZXNwb25kZW4gYSB1bmEgZmVjaGEgdsOhbGlkYVxyXG4gICAgICAgICAgICB2YXIgdG9kYXkgPSBkYXRlLnltZChOdW1iZXIocGFydGVzUmVhbGl6YWNpb25bMl0pLCBOdW1iZXIocGFydGVzUmVhbGl6YWNpb25bMV0pLCBOdW1iZXIocGFydGVzUmVhbGl6YWNpb25bMF0pKVxyXG4gICAgICAgICAgICB2YXIgcGFydGVzTWVzQW5uaW8gPSBtZXNBbm5pby5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgbGFzIHBhcnRlcyBjb3JyZXNwb25kZW4gYSB1bmEgZmVjaGEgdsOhbGlkYVxyXG4gICAgICAgICAgICB2YXIgbmFjaW1pZW50byA9IGRhdGUueW1kKE51bWJlcihwYXJ0ZXNNZXNBbm5pb1sxXSksIE51bWJlcihwYXJ0ZXNNZXNBbm5pb1swXSksIDEpXHJcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBSZWFsRGF0ZSBlcyBEYXRlIHkgc2UgcHVlZGUgcmVzdGFyXHJcbiAgICAgICAgICAgIHZhciBkaWZlcmVuY2lhTWVzZXMgPSBtZXNlc0RpZmVyZW5jaWEobmFjaW1pZW50bywgdG9kYXkpO1xyXG4gICAgICAgICAgICB2YXIgZWRhZERlY2ltYWxlcyA9IGRpZmVyZW5jaWFNZXNlcyAvIDEyOyAvL2VqIDM2LjVcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZWRhZERlY2ltYWxlcykgPT0gZWRhZCB8fCAvL21pc21hIGVkYWRcclxuICAgICAgICAgICAgICAgIGVkYWREZWNpbWFsZXMgPT0gZWRhZCArIDEgLy9tZXMgZGUgdG9sZXJhbmNpYVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvL2NvcGlhcl9jYW1wb191YV9yYW1hKHJlc3B1ZXN0YXNPcmlnZW46UmVzcHVlc3Rhc1tdLCBwb3NpY2lvbjpudW1iZXIsIHZhcmlhYmxlT3JpZ2VuOiBJZFZhcmlhYmxlLCBjYW1pbm86c3RyaW5nLCBjb25kaWNpb246Ym9vbGVhbil7XHJcbiAgICAgICAgLy8gICAgcmV0dXJuIGNvbmRpY2lvbj8ocmVzcHVlc3Rhc09yaWdlbiAmJiByZXNwdWVzdGFzT3JpZ2VuW3Bvc2ljaW9uLTFdICYmIHJlc3B1ZXN0YXNPcmlnZW5bcG9zaWNpb24tMV1bYCR7Y2FtaW5vfWBdW3ZhcmlhYmxlT3JpZ2VuXSk6bnVsbFxyXG4gICAgICAgIC8vICAgIHJldHVybiBjb25kaWNpb24/ZXZhbChgcmVzcHVlc3Rhc09yaWdlblske3Bvc2ljaW9uLTF9XS5gK2NhbWlubysnLicrdmFyaWFibGVPcmlnZW4pOm51bGw7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgLypcclxuICAgICAgICBkYm86e1xyXG4gICAgICAgICAgICBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyLCBkYXRvOnN0cmluZyl7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmIGluZm9ybWFkbyh4cGVyc29uYXMpICYmIHBlcjw9IHhwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xICYmICEheHBlcnNvbmFzW3Blci0xXVtkYXRvXT8geHBlcnNvbmFzW3Blci0xXVtkYXRvXTpudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkYWRmYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyLCdlZGFkJylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXhpc3RlaW5kaXZpZHVhbChlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiAhIXBlcnNvbmFzICYmIHBlcjw9IHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTEgJiYgISFwZXJzb25hc1twZXItMV1bJ2VudHJlYWluZCddXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV4aXN0ZW1pZW1icm8oZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgISFwZXJzb25hcyAmJiBwZXI8PSBwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5yb2Nvbnl1Z2VzKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hc1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHhwZXJzb25hcy5maWx0ZXIoIHBlci0+cGVyLnA0PT0yKS5sZW5ndGhcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbnJvamVmZXMoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwZXJzb25hcy5maWx0ZXIoIHBlci0+cGVyLnA0PT0xKS5sZW5ndGhcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFyZW50ZXNjb2ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlciwncDQnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXhvZmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgISF4cGVyc29uYXMgJiYgcGVyPD0geHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTEgJiYgISF4cGVyc29uYXNbcGVyLTFdLnNleG8/IHhwZXJzb25hc1twZXItMV1bJ3NleG8nXTpudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNpdGNvbnlqZWZlKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLDEsJ3A1JylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gKi9cclxuICAgIH1cclxufTtcclxuXHJcbnR5cGUgRnVuY2lvbkhhYmlsaXRhciA9ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBib29sZWFuO1xyXG50eXBlIEZ1bmNpb25WYWxvcmFyID0gKHZhbG9yZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+IGFueTtcclxudmFyIGZ1bmNpb25lc0hhYmlsaXRhcjogeyBba2V5OiBzdHJpbmddOiBGdW5jaW9uSGFiaWxpdGFyIH0gPSB7XHJcbn1cclxudmFyIGZ1bmNpb25lc1ZhbG9yYXI6IHsgW2tleTogc3RyaW5nXTogRnVuY2lvblZhbG9yYXIgfSA9IHtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1pbmlDb21waWxhZG9yU1FsSnMoZXhwcmVzaW9uQ2FzaVNRTDogc3RyaW5nKSB7XHJcbiAgICB2YXIgZXhwcmVzaW9uID0gZXhwcmVzaW9uQ2FzaVNRTC5yZXBsYWNlKC9cXHUwMEEwL2csICcgJyk7XHJcbiAgICB2YXIgY3VlcnBvID0gZXhwcmVzaW9uLnJlcGxhY2UoL1xcYmlzIGRpc3RpbmN0IGZyb21cXGIvZ2ksICchPScpLnJlcGxhY2UoL1xcYi4rP1xcYi9nLCBmdW5jdGlvbiAoZWxUb2tlbikge1xyXG4gICAgICAgIHZhciBlbFRva2VuVHJpbWVhZG8gPSBlbFRva2VuLnRyaW0oKTtcclxuICAgICAgICBpZiAoZWxUb2tlblRyaW1lYWRvIGluIHJlZW1wbGF6b3NIYWJpbGl0YXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZW1wbGF6b3NIYWJpbGl0YXJbZWxUb2tlblRyaW1lYWRvXTtcclxuICAgICAgICB9IGVsc2UgaWYgKC9eXFxkK1xcLj9cXGQqJC8udGVzdChlbFRva2VuVHJpbWVhZG8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxcVyskLy50ZXN0KGVsVG9rZW5UcmltZWFkbykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsVG9rZW5cclxuICAgICAgICB9IGVsc2UgaWYgKC9eXFxzKyQvLnRlc3QoZWxUb2tlbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdoZWxwZXJzLm51bGwyemVybyh2YWxvcmVzLicgKyBlbFRva2VuICsgJyknO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3VlcnBvO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY2lvbkNvbXBpbGFkYTxUPihjb25qdW50b0RlRnVuY2lvbmVzOiB7IFtrZXk6IHN0cmluZ106ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBUIH0pIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAobm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kczogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdKSB7XHJcbiAgICAgICAgICAgIHZhciBjdWVycG8gPSBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGN1ZXJwbyA9IG1pbmlDb21waWxhZG9yU1FsSnMobm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kcyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW50ZXJuYWxGdW4gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGN1ZXJwbyk7XHJcbiAgICAgICAgICAgICAgICBjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdID0gZnVuY3Rpb24gKHZhbG9yZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaW50ZXJuYWxGdW4odmFsb3JlcywgaGVscGVyc0Nhc2lsbGVyb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1IgRUpFQ1VDQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLCBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzLCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWxvcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUiBDT01QSUxBQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLCBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzLCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3VlcnBvKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZ1bmNpb25IYWJpbGl0YXIgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc0hhYmlsaXRhcik7XHJcbmV4cG9ydCBjb25zdCBnZXRGdW5jaW9uVmFsb3JhciA9IGdldEZ1bmNpb25Db21waWxhZGEoZnVuY2lvbmVzVmFsb3Jhcik7XHJcblxyXG5jb25zdCBldmFsdWFyRXhwcmVzaW9uUmVhOiBFdmFsdWFkb3JFeHByZXNpb24gPSAoY29uZGljaW9uSnMsIHJlc3B1ZXN0YXMpID0+XHJcbiAgICBnZXRGdW5jaW9uSGFiaWxpdGFyKGNvbmRpY2lvbkpzKShyZXNwdWVzdGFzKTtcclxuXHJcbnZhciByb3dWYWxpZGF0b3IgPSBnZXRSb3dWYWxpZGF0b3I8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPih7IGdldEZ1bmNpb25IYWJpbGl0YXIsIGdldEZ1bmNpb25WYWxvcmFyIH0pXHJcblxyXG5leHBvcnQgdmFyIGRlZk9wZXJhdGl2bzogRGVmT3BlcmF0aXZvID0ge1xyXG4gICAgZXNOb1JlYTogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIHRhcmVhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIGNvbnN0IHVhUHJpbmNpcGFsID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiAhdWEucGFkcmUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2ROb1JlYScsICdlc05vUmVhJz4gPSB7XHJcbiAgICAgICAgICAgIGNvZE5vUmVhOiBudWxsLFxyXG4gICAgICAgICAgICBlc05vUmVhOiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCB7IGNvZFJlYSwgZXNSZWEgfSA9IGRlZk9wZXJhdGl2by5lc1JlYWxpemFkYShyZXNwdWVzdGFzLCB0YXJlYSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFlc1JlYSkge1xyXG4gICAgICAgICAgICBjb25zdCB7Y29kaWdvLCByZXN1bHRhZG99ID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXModWFQcmluY2lwYWwhLCByZXNwdWVzdGFzLCBlc3RydWN0dXJhLm5vUmVhcywgJ25vX3JlYScsIHRhcmVhKTtcclxuICAgICAgICAgICAgaWYoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kTm9SZWEgPSBjb2RpZ287XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZXNOb1JlYSA9IHJlc3VsdGFkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSxcclxuXHJcbiAgICBlc05vUmVhU3VwOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcywgdGFyZWE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICAgICAgY29uc3QgdWFQcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEpID0+ICF1YS5wYWRyZSk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2ROb1JlYVN1cCcsICdlc05vUmVhU3VwJz4gPSB7XHJcbiAgICAgICAgICAgIGNvZE5vUmVhU3VwOiBudWxsLFxyXG4gICAgICAgICAgICBlc05vUmVhU3VwOiBmYWxzZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qge2NvZGlnbywgcmVzdWx0YWRvfSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKHVhUHJpbmNpcGFsISwgcmVzcHVlc3RhcywgZXN0cnVjdHVyYS5ub1JlYXNTdXAsICdub19yZWFfc3VwJywgdGFyZWEpO1xyXG4gICAgICAgIGlmIChjb2RpZ28gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmNvZE5vUmVhU3VwID0gY29kaWdvO1xyXG4gICAgICAgICAgICByZXN1bHQuZXNOb1JlYVN1cCA9IHJlc3VsdGFkbztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgZXNSZWFsaXphZGE6IChyZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCB0YXJlYTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgICAgICBjb25zdCB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gIXVhLnBhZHJlKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDogUmVzdWx0YWRvUmVhTm9SZWE8J2NvZFJlYScsICdlc1JlYSc+ID0ge1xyXG4gICAgICAgICAgICBjb2RSZWE6IG51bGwsXHJcbiAgICAgICAgICAgIGVzUmVhOiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCB7Y29kaWdvLCByZXN1bHRhZG99ID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXModWFQcmluY2lwYWwhLCByZXNwdWVzdGFzLCBlc3RydWN0dXJhLnJlYXMsICdyZWEnLCB0YXJlYSwgZXZhbHVhckV4cHJlc2lvblJlYSk7XHJcbiAgICAgICAgaWYoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jb2RSZWEgPSBjb2RpZ287XHJcbiAgICAgICAgICAgIHJlc3VsdC5lc1JlYSA9IHJlc3VsdGFkbztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgZXNSZWFsaXphZGFTdXA6IChyZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCB0YXJlYTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgICAgICBjb25zdCB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gIXVhLnBhZHJlKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDogUmVzdWx0YWRvUmVhTm9SZWE8J2NvZFJlYVN1cCcsICdlc1JlYVN1cCc+ID0ge1xyXG4gICAgICAgICAgICBjb2RSZWFTdXA6IG51bGwsXHJcbiAgICAgICAgICAgIGVzUmVhU3VwOiBmYWxzZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qge2NvZGlnbywgcmVzdWx0YWRvfSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKHVhUHJpbmNpcGFsISwgcmVzcHVlc3RhcywgZXN0cnVjdHVyYS5yZWFzU3VwLCAncmVhX3N1cCcsIHRhcmVhLCBldmFsdWFyRXhwcmVzaW9uUmVhKTtcclxuICAgICAgICBpZihjb2RpZ28gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmNvZFJlYVN1cCA9IGNvZGlnbztcclxuICAgICAgICAgICAgcmVzdWx0LmVzUmVhU3VwID0gcmVzdWx0YWRvO1xyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgVUFwcmluY2lwYWw6ICcnIGFzIElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBkZWZVQToge30gYXMgeyBbaSBpbiBJZFVuaWRhZEFuYWxpc2lzXTogeyBwazogSWRWYXJpYWJsZSwgaW5jbHVpZGFzOiBJZFVuaWRhZEFuYWxpc2lzW10sIGlkc0ZvcjogSWRGb3JtdWxhcmlvW10gfSB9LFxyXG4gICAgZGVmRm9yOiB7fSBhcyB7IFtmIGluIElkRm9ybXVsYXJpb106IHsgaGVybWFubz86IHRydWUgfSB9XHJcbn07XHJcblxyXG5cclxuLy8gMS4gU29icmVjYXJnYSBwYXJhIGxhIGZvcm1hIGFudGlndWEgKDQgZnVuY2lvbmVzIHBvc2ljaW9uYWxlcylcclxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbGN1bG9SZWFOb1JlYShcclxuICAgIGVzTm9SZWE6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNOb1JlYSddLFxyXG4gICAgZXNOb1JlYVN1cDogRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc05vUmVhU3VwJ10sXHJcbiAgICBlc1JlYWxpemFkYTogRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc1JlYWxpemFkYSddLFxyXG4gICAgZXNSZWFsaXphZGFTdXA6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNSZWFsaXphZGFTdXAnXVxyXG4pOiB2b2lkO1xyXG5cclxuLy8gMi4gU29icmVjYXJnYSBwYXJhIGxhIGZvcm1hIG51ZXZhIChvYmpldG8gcGFyY2lhbClcclxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbGN1bG9SZWFOb1JlYShcclxuICAgIGZ1bmNpb25lczogUGFydGlhbDxGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWE+XHJcbik6IHZvaWQ7XHJcblxyXG4vLyAzLiBJbXBsZW1lbnRhY2nDs24gdW5pZmljYWRhXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxvUmVhTm9SZWEoXHJcbiAgICBlc05vUmVhT3JGdW5jaW9uZXM6XHJcbiAgICAgICAgfCBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzTm9SZWEnXVxyXG4gICAgICAgIHwgUGFydGlhbDxGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWE+LFxyXG4gICAgX2VzTm9SZWFTdXA/OiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzTm9SZWFTdXAnXSxcclxuICAgIF9lc1JlYWxpemFkYT86IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNSZWFsaXphZGEnXSxcclxuICAgIF9lc1JlYWxpemFkYVN1cD86IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNSZWFsaXphZGFTdXAnXVxyXG4pOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgZXNOb1JlYU9yRnVuY2lvbmVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFwic2V0Q2FsY3Vsb1JlYU5vUmVhOiBsYSBmb3JtYSBhbnRpZ3VhIGVzdMOhIGRlcHJlY2FkYSwgc2UgaWdub3JhbiBzb2JyZXNjcml0dXJhcywgdXNhciBzZXRDYWxjdWxvUmVhTm9SZWEoeyBlc05vUmVhLCBlc05vUmVhU3VwLCBlc1JlYWxpemFkYSwgZXNSZWFsaXphZGFTdXAgfSlcIik7XHJcbiAgICAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRlZk9wZXJhdGl2byA9IHtcclxuICAgICAgICAgICAgLi4uZGVmT3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAuLi5lc05vUmVhT3JGdW5jaW9uZXNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBUT0RPOiBHRU5FUkFMSVpBUlxyXG50eXBlIFBlcnNvbmEgPSB7IHAxOiBzdHJpbmcsIHAyOiBudW1iZXIsIHAzOiBudW1iZXIsIHA0OiBudW1iZXIgfCBudWxsLCBwNTogMSB8IG51bGwsIHA2OiAxIHwgbnVsbCB9XHJcblxyXG5mdW5jdGlvbiBudW0obnVtOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHtcclxuICAgIC8vQHRzLWlnbm9yZSBsYSBncmFjaWEgZXMgbWV0ZXIgbnVtIGN1YW5kbyBlcyBzdHJpbmdcclxuICAgIGlmIChpc05hTihudW0gLSAwKSkgcmV0dXJuIDA7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICByZXR1cm4gbnVtIC0gMDtcclxufVxyXG5cclxudmFyIGZ1bmNpb25lc0Nvbm9jaWRhczogeyBbayBpbiBzdHJpbmddOiBib29sZWFuIH0gPSB7fVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmaWNhclNvcnRlbyhvcHRzOiB7XHJcbiAgICBjb25maWd1cmFjaW9uU29ydGVvOiBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyxcclxuICAgIHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsXHJcbiAgICByZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXpcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHZhcmlhYmxlQWN0dWFsOiBJZFZhcmlhYmxlXHJcblxyXG59KSB7XHJcbiAgICBjb25zdCByZXNldGVhclNvcnRlbyA9IChvcHRzOiB7IHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMgfSkgPT4ge1xyXG4gICAgICAgIHZhciB7IHJlc3B1ZXN0YXMgfSA9IG9wdHM7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gPSBudWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF9zb3J0ZWFibGVzXSA9IG51bGw7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdID0gbnVsbDtcclxuICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnNvcnRlYWRvX21vc3RyYXI/LmZvckVhY2goKG1vc3RyYXIpID0+IHJlc3B1ZXN0YXNbbW9zdHJhci50YXJnZXRdID0gbnVsbCk7XHJcbiAgICAgICAgaWYgKCd2YXJfbGV0cmEnIGluIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSAmJiByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwZXIgb2YgaXRlcmF0b3IocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVyW2NvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnZhcl9sZXRyYV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciB7IGNvbmZpZ3VyYWNpb25Tb3J0ZW8sIHZhcmlhYmxlQWN0dWFsLCByZXNwdWVzdGFzLCBmb3JQaywgcmVzcHVlc3Rhc1JhaXogfSA9IG9wdHM7XHJcbiAgICB2YXIgaWRFbmMgPSBmb3JQa1tlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdO1xyXG4gICAgdmFyIHsgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUpO1xyXG4gICAgdmFyIGV4cHJfaW5jb21wbGV0aXR1ZF9mdW4gPSBnZXRGdW5jaW9uSGFiaWxpdGFyKGNvbmZpZ3VyYWNpb25Tb3J0ZW8uZXhwcl9pbmNvbXBsZXRpdHVkX2pzW3Jlc3B1ZXN0YXNBdW1lbnRhZGFzLnZkb21pbmlvIGFzIHVua25vd24gYXMgbnVtYmVyXS5leHByKTtcclxuICAgIHZhciBmaWx0cm9fZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmZpbHRyb19qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pbyBhcyB1bmtub3duIGFzIG51bWJlcl0uZXhwcik7XHJcbiAgICB2YXIgdW5pZGFkQW5hbGlzaXMgPSBjb25maWd1cmFjaW9uU29ydGVvLnVuaWRhZF9hbmFsaXNpcztcclxuXHJcbiAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby5wYXJhbWV0cm9zLmluY2x1ZGVzKHZhcmlhYmxlQWN0dWFsKSkge1xyXG4gICAgICAgIHZhciB1YVBhZHJlID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiB1YS51bmlkYWRfYW5hbGlzaXMgPT0gdW5pZGFkQW5hbGlzaXMpPy5wYWRyZTtcclxuICAgICAgICB2YXIgcGtBZ3JlZ2FkYVBhZHJlID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiB1YS51bmlkYWRfYW5hbGlzaXMgPT0gdWFQYWRyZSk/LnBrX2FncmVnYWRhXHJcbiAgICAgICAgaWYgKGVzdHJ1Y3R1cmEuY29uUmVhSG9nYXIpIHtcclxuICAgICAgICAgICAgaWYgKHVhUGFkcmUgJiYgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdWFQYWRyZV0pIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBwa0FncmVnYWRhUGFkcmUgZXhpc3RlIGUgaW5kaWNhIGxhIHBvc2ljaW9uIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICAgICAgdmFyIHBhZHJlID0gcmVzcHVlc3Rhc0F1bWVudGFkYXNbdWFQYWRyZV1bTnVtYmVyKHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3BrQWdyZWdhZGFQYWRyZV0pIC0gMV07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gbGlrZUFyKHBhZHJlW3VuaWRhZEFuYWxpc2lzXSB8fCBbXSkuYXJyYXkoKS5sZW5ndGg7IC8vc2kgYWdyZWdhIGRlc2RlIGJvdG9uIGFncmVnYXJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhczogcGFkcmUgfSk7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0gcGFkcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodWFQYWRyZSAmJiByZXNwdWVzdGFzUmFpeikge1xyXG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlIHBrQWdyZWdhZGFQYWRyZSBleGlzdGUgZSBpbmRpY2EgbGEgcG9zaWNpb24gZGVsIHBhZHJlXHJcbiAgICAgICAgICAgICAgICB2YXIgcGFkcmUgPSByZXNwdWVzdGFzUmFpejtcclxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUFjdHVhbCAhPSBjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFkcmVbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0gPSBsaWtlQXIocGFkcmVbdW5pZGFkQW5hbGlzaXNdIHx8IFtdKS5hcnJheSgpLmxlbmd0aDsgLy9zaSBhZ3JlZ2EgZGVzZGUgYm90b24gYWdyZWdhclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzZXRlYXJTb3J0ZW8oeyByZXNwdWVzdGFzOiBwYWRyZSB9KTtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMgPSBwYWRyZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YXNVQSA9IHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdIGFzIFJlc3B1ZXN0YXNbXVxyXG4gICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdICE9IDEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl0gPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0gPSByZXNwdWVzdGFzVUEubGVuZ3RoICsgMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzZXRlYXJTb3J0ZW8oeyByZXNwdWVzdGFzIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZFRvdGFsID0gTnVtYmVyKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0pO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRUb3RhbCA8IHJlc3B1ZXN0YXNVQS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvYmxlIGFzaWduYWNpw7NuIHBhcmEgcXVlIGxvIGNhcmd1ZSBlbiByZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzVUEuZmlsdGVyKChwLCBpKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1ldHJvcy5zb21lKChwYXJhbSkgPT4gcFtwYXJhbV0gfHwgaSA8PSBjYW50aWRhZFRvdGFsIC0gMSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSA9IHJlc3B1ZXN0YXNVQVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFRvdGFsID4gcmVzcHVlc3Rhc1VBLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLnB1c2goe30gYXMgUmVzcHVlc3RhcylcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmluY29tcGxldGFzXSA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocCA9PiBleHByX2luY29tcGxldGl0dWRfZnVuKHApKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciB2YXIkcDAgPSBcIiRwMFwiIGFzIElkVmFyaWFibGVcclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9PSAxICYmXHJcbiAgICAgICAgICAgICAgICAhcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gJiZcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc10gPT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHZhciBzb3J0ZWFyID0gcmVzcHVlc3Rhc1VBLmZpbHRlcihwID0+IGZpbHRyb19mdW4ocCkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlYXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLmZvckVhY2goKHBlciwgaSkgPT4gcGVyW3ZhciRwMF0gPSBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5wdXNoKHsgdmFyaWFibGU6IHZhciRwMCwgb3JkZW46IDEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc29ydGVhci5zb3J0KGNvbXBhcmVGb3JPcmRlcihjb25maWd1cmFjaW9uU29ydGVvLm9yZGVuLm1hcChlbGVtID0+ICh7IGNvbHVtbjogZWxlbS52YXJpYWJsZSwgb3JkZXI6IGVsZW0ub3JkZW4gfSkpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2ljaW9uU29ydGVhZGEgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmFjaW9uU29ydGVvLm1ldG9kbyA9PSAnaGFzaCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOTyBJTVBMRU1FTlRBRE8nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLypwb3NpY2lvblNvcnRlYWRhPShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnZhcl9jb2VmLnJlZHVjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN1bSwgcGFpcik9PnN1bSArIGRhdG9zVml2aWVuZGEudGVtW3BhaXIudmFyXSAqIHBhaXIuY29lZiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAlIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLmRpdmlzb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSAlIHNvcnRlYXIubGVuZ3RoKi9cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmEgPSAnQSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhckxldHJhOiBJZFZhcmlhYmxlID0gY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udmFyX2xldHJhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwZXJzb25hIG9mIHNvcnRlYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5maW5kKChfcGVyLCBpKSA9PiBpID09IHBlcnNvbmFbdmFyJHAwXSBhcyBudW1iZXIgLSAxKSFbdmFyTGV0cmFdID0gbGV0cmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hW3ZhckxldHJhXSA9IGxldHJhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0cmEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxldHJhLmNoYXJDb2RlQXQoMCkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGFBbGVhdG9yaWFNaWVtYnJvcyA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnRhYmxhLm1hcCgobGlzdGEpID0+IGxpc3RhLnNwbGl0KCcnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0byA9IGlkRW5jICUgMTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5hVGFibGFBbGVhdG9yaWEgPSByZXN0byA/IHJlc3RvIC0gMSA6IDk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3J0ZWFyLmxlbmd0aCA+IHRhYmxhQWxlYXRvcmlhTWllbWJyb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWFyLnNwbGljZSh0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkgLy9kZXNjYXJ0byBjYW5kaWRhdG9zIHNpIHNvbiBtw6FzIHF1ZSBsbyBxdWUgcGVybWl0ZSBsYSB0YWJsYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxhVGFibGFBbGVhdG9yaWEgPSBzb3J0ZWFyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZXRyYVNlbGVjY2lvbmFkYSA9IHRhYmxhQWxlYXRvcmlhTWllbWJyb3NbZmlsYVRhYmxhQWxlYXRvcmlhXVtjb2x1bW5hVGFibGFBbGVhdG9yaWFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpY2lvblNvcnRlYWRhID0gcmVzcHVlc3Rhc1VBLmZpbmRJbmRleCgocDogUmVzcHVlc3RhcykgPT4gcFt2YXJMZXRyYV0gPT0gbGV0cmFTZWxlY2Npb25hZGEpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gPSBwb3NpY2lvblNvcnRlYWRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSBzb3J0ZWFyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1ttb3N0cmFyLnRhcmdldF0gPSByZXNwdWVzdGFzVUFbcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gYXMgbnVtYmVyIC0gMV1bbW9zdHJhci5zb3VyY2VdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF9zb3J0ZWFibGVzXSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSA9IHJlc3B1ZXN0YXNVQS5sZW5ndGggfHwgbnVsbDsgLy9ubyBxdWVyZW1vcyBlbCB2YWxvciAwXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBXSA9ICdvayc7XHJcbiAgICAgICAgICAgIGlmIChjb25maWd1cmFjaW9uU29ydGVvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWxdID0gJ29rJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYmFycmVyU3ViQXJib2wocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBub2RvQWN0dWFsOiBSZXNwdWVzdGFzIHwgUmVzcHVlc3Rhc1tdLCB1bmlkYWRfYW5hbGlzaXM6IElkVW5pZGFkQW5hbGlzaXMsIGZvclBrQWN1bXVsYWRvOiBGb3JQaykge1xyXG4gICAgdmFyIHVhRGVmID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgdmFyIGVzQXJyYXkgPSBub2RvQWN0dWFsIGluc3RhbmNlb2YgQXJyYXk7XHJcbiAgICB2YXIgY29uanVudG86IFJlc3B1ZXN0YXNbXSA9IGVzQXJyYXkgPyBub2RvQWN0dWFsIGFzIFJlc3B1ZXN0YXNbXSA6IFtub2RvQWN0dWFsIGFzIFJlc3B1ZXN0YXNdO1xyXG4gICAgXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmp1bnRvLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBjb25qdW50b1tpXTtcclxuICAgICAgICBpZiAoIXJlc3ApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICB2YXIgbnVtID0gZXNBcnJheSA/IGkgKyAxIDogKGZvclBrQWN1bXVsYWRvW3VhRGVmLnBrX2FncmVnYWRhXSB8fCAxKTtcclxuICAgICAgICB2YXIgaWRGb3JtdWxhcmlvcyA9IE9iamVjdC5rZXlzKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MpLmZpbHRlcihrZXkgPT4gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1trZXkgYXMgSWRGb3JtdWxhcmlvXS5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PT0gdW5pZGFkX2FuYWxpc2lzKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGlkRm9ybXVsYXJpbyBvZiBpZEZvcm11bGFyaW9zKSB7XHJcbiAgICAgICAgICAgIHZhciBtaUZvclBrOiBGb3JQayA9IHsgLi4uZm9yUGtBY3VtdWxhZG8sIFt1YURlZi5wa19hZ3JlZ2FkYV06IG51bSwgZm9ybXVsYXJpbzogaWRGb3JtdWxhcmlvIGFzIElkRm9ybXVsYXJpbyB8fCBmb3JQa0FjdW11bGFkby5mb3JtdWxhcmlvIH07XHJcbiAgICAgICAgICAgIGlmIChlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKSB7XHJcbiAgICAgICAgICAgICAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKHJlc3B1ZXN0YXNSYWl6LCBtaUZvclBrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8ocmVzcHVlc3Rhc1JhaXosIG1pRm9yUGspO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgaGlqYXMgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmlsdGVyKHUgPT4gdS5wYWRyZSA9PT0gdW5pZGFkX2FuYWxpc2lzKS5rZXlzKCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHVhSGlqYSBvZiBoaWphcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhpamFzUmVzcCA9IHJlc3BbdWFIaWphIGFzIElkVW5pZGFkQW5hbGlzaXNdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhpamFzUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBoaWphc1Jlc3AgYXMgUmVzcHVlc3Rhc1tdLCB1YUhpamEgYXMgSWRVbmlkYWRBbmFsaXNpcywgbWlGb3JQayk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXo6IEZvclBrKSB7XHJcbiAgICB2YXIgdWFQcGFsID0gT2JqZWN0LmtleXMoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZChrZXkgPT4gIWVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNba2V5IGFzIElkVW5pZGFkQW5hbGlzaXNdLnBhZHJlKSBhcyBJZFVuaWRhZEFuYWxpc2lzO1xyXG4gICAgYmFycmVyU3ViQXJib2wocmVzcHVlc3Rhc1JhaXosIHJlc3B1ZXN0YXNSYWl6LCB1YVBwYWwsIGZvclBrUmFpeik7XHJcbiAgICBiYXJyZXJTdWJBcmJvbChyZXNwdWVzdGFzUmFpeiwgcmVzcHVlc3Rhc1JhaXosIHVhUHBhbCwgZm9yUGtSYWl6KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiB9LFxyXG4gICAgZm9ybXVsYXJpb3M6IHsgW25vbWJyZUZvcm11bGFyaW8gaW4gSWRGb3JtdWxhcmlvXTogSW5mb0Zvcm11bGFyaW8gfSxcclxuICAgIHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsXHJcbiAgICBVQTogSWRVbmlkYWRBbmFsaXNpcyxcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzOiBSZXNwdWVzdGFzLCAvLyBpbmNsdXllbiBsYSBkZSB0b2RvcyBsb3MgcGFkcmVzIHkgYW5zZXN0cm9zLFxyXG4gICAgcmVzcHVlc3Rhc1BhZHJlOiBSZXNwdWVzdGFzIHwgbnVsbCxcclxuICAgIG9wdHM6IE9wY2lvbmVzUm93VmFsaWRhdG9yLFxyXG4pIHtcclxuICAgIC8vIHJlY29ycmllbmQgVUEgcGVyc29uYXMgeSBtYXNjb3Rhc1xyXG4gICAgZm9yICh2YXIgVUFpbmNsdWlkYSBvZiBkZWZPcGVyYXRpdm8uZGVmVUFbVUFdLmluY2x1aWRhcykge1xyXG4gICAgICAgIHZhciBwa051ZXZhID0gZGVmT3BlcmF0aXZvLmRlZlVBW1VBaW5jbHVpZGFdLnBrO1xyXG4gICAgICAgIHZhciBjb25qdW50b1Jlc3B1ZXN0YXNVQSA9IHJlc3B1ZXN0YXNbVUFpbmNsdWlkYV07XHJcbiAgICAgICAgbGlrZUFyKGNvbmp1bnRvUmVzcHVlc3Rhc1VBKS5mb3JFYWNoKChyZXNwdWVzdGFzSGlqbywgdmFsb3JQa09Qb3NpY2lvbikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhcclxuICAgICAgICAgICAgICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yLFxyXG4gICAgICAgICAgICAgICAgZm9ybXVsYXJpb3MsXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzSGlqbyxcclxuICAgICAgICAgICAgICAgIFVBaW5jbHVpZGEsXHJcbiAgICAgICAgICAgICAgICB7IC4uLmZvclBrLCBbcGtOdWV2YV06IHZhbG9yUGsgfSxcclxuICAgICAgICAgICAgICAgIHsgLi4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXNIaWpvLCBbcGtOdWV2YV06IHZhbG9yUGsgfSxcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIC8vIFMxICwgQTFcclxuICAgIGZvciAodmFyIGVzSGVybWFubyBvZiBbdHJ1ZSwgZmFsc2VdKSB7XHJcbiAgICAgICAgZm9yICh2YXIgZm9ybXVsYXJpbyBvZiBkZWZPcGVyYXRpdm8uZGVmVUFbVUFdLmlkc0ZvcikgaWYgKCEhZXNIZXJtYW5vID09ICEhZGVmT3BlcmF0aXZvLmRlZkZvcltmb3JtdWxhcmlvXS5oZXJtYW5vKSB7XHJcbiAgICAgICAgICAgIHZhciBwbGFpbkZvclBrOiBQbGFpbkZvclBrID0gdG9QbGFpbkZvclBrKHsgLi4uZm9yUGssIGZvcm11bGFyaW8gfSlcclxuICAgICAgICAgICAgdmFyIG1heFBhc29zQXV0b2luZ3Jlc2FkYXMgPSAxMDtcclxuICAgICAgICAgICAgdmFyIHZhckF1dG9JbmdyZXNhZGFzID0gW107XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIHZhciBodWJvQXV0b2luZ3Jlc29zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgcm93VmFsaWRhdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IG1hcmNhRmluOiAnZmluJywgLi4uZm9ybXVsYXJpb3NbZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvciB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzQXVtZW50YWRhcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHZhciB7IHJlc3VtZW4sIGF1dG9JbmdyZXNhZGFzIH0gPSBmZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXTtcclxuICAgICAgICAgICAgICAgIHZhciB2YXJOYW1lOiBJZFZhcmlhYmxlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dG9JbmdyZXNhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhck5hbWUgaW4gYXV0b0luZ3Jlc2FkYXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbWJpbyA9IHJlc3B1ZXN0YXNbdmFyTmFtZV0gIT09IGF1dG9JbmdyZXNhZGFzW3Zhck5hbWVdIGFzIFZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW3Zhck5hbWVdID0gYXV0b0luZ3Jlc2FkYXNbdmFyTmFtZV0gYXMgVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzQXVtZW50YWRhc1t2YXJOYW1lXSA9IGF1dG9JbmdyZXNhZGFzW3Zhck5hbWVdIGFzIFZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyQXV0b0luZ3Jlc2FkYXMucHVzaCh2YXJOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1Ym9BdXRvaW5ncmVzb3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IHdoaWxlIChodWJvQXV0b2luZ3Jlc29zICYmIG1heFBhc29zQXV0b2luZ3Jlc2FkYXMtLSA+IDApO1xyXG4gICAgICAgICAgICB2YXJBdXRvSW5ncmVzYWRhcy5mb3JFYWNoKF92YXJuYW1lID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGZlZWRiYWNrUm93VmFsaWRhdG9yW3BsYWluRm9yUGtdLmVzdGFkb3NbX3Zhcm5hbWUgYXMgSWRWYXJpYWJsZV0gPSAnYWN0dWFsJztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdmFyIEJGX3Zhcm5hbWUgPSAnJEIuJyArIGZvcm11bGFyaW8gYXMgSWRWYXJpYWJsZVxyXG4gICAgICAgICAgICB2YXIgZm9ybVByaW5jaXBhbEZvclZpdmllbmRhID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1tlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKTtcclxuICAgICAgICAgICAgaWYgKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGhheSBjb25maWd1cmFjaW9uIGRlIHNvcnRlbyBwYXJhIGVsIGZvcm11bGFyaW8gJHtmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGF9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgY29uZmlnU29ydGVvRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmIGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvW2Zvcm1QcmluY2lwYWxGb3JWaXZpZW5kYV07XHJcbiAgICAgICAgICAgIHZhciByZXN1bWVuT3JOdWxsID1cclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiZcclxuICAgICAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCA9PSBCRl92YXJuYW1lID9cclxuICAgICAgICAgICAgICAgICAgICAnb2snXHJcbiAgICAgICAgICAgICAgICAgICAgOiByZXN1bWVuID09ICd2YWNpbycgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzdW1lblxyXG4gICAgICAgICAgICBpZiAoZXNIZXJtYW5vKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbCA9PSAnb2snID8gJ29rJyA6IG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcHVlc3Rhc1BhZHJlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vcmVzcHVlc3Rhc1BhZHJlW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlck9yU3RyaW5nSW5jSWZBcnJheShudW1iZXJPclN0cmluZzogbnVtYmVyIHwgc3RyaW5nLCBvYmplY3Q6IG9iamVjdCB8IGFueVtdKTogKG51bWJlciB8IHN0cmluZykge1xyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBlc3RveSB1c2FuZG8gaXNOYU4gcGFyYSB2ZXIgc2kgZXMgbyBubyB1biBuw7ptZXJvIHN1bWFibGVcclxuICAgIGlmIChpc05hTihudW1iZXJPclN0cmluZykpIHtcclxuICAgICAgICByZXR1cm4gbnVtYmVyT3JTdHJpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKG51bWJlck9yU3RyaW5nKSArIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IDEgOiAwKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBnZXRNYWluRm9ybUZvclZpdmllbmRhID0gKHZhbHVlUGtSYWl6OiBWYWx1ZVBrUmFpeik6IElkRm9ybXVsYXJpbyA9PiB7XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbdmFsdWVQa1JhaXpdLnRhcmVhLm1haW5fZm9ybVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKSB7XHJcbiAgICBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmlsdGVyKHVhRGVmID0+ICF1YURlZi5wYWRyZSkuZm9yRWFjaCh1YURlZiA9PiB7XHJcbiAgICAgICAgdmFyIGVzUHJpbmNpcGFsID0gKGY6IEZvcm11bGFyaW8sIGVuYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmb3JtdWxhcmlvUHJpbmNpcGFsID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShlbmMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybXVsYXJpb1ByaW5jaXBhbCA/IGZvcm11bGFyaW9QcmluY2lwYWwgPT0gZi5pZF9jYXNpbGxlcm8gOiBmLmZvcm11bGFyaW9fcHJpbmNpcGFsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2Fjw6EgaGF5IHF1ZSBzYW5pdGl6YXIgcG9ycXVlIGV2aWRlbnRlbWVudGUgcHVlZGUgdmVuaXIgY29uIGhhc2hzIGRlIGVuY3Vlc3RhcyBzaW4gaW5mbyBlbCBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzXHJcbiAgICAgICAgdmFyIGNvbmp1bnRvUmVzcHVlc3Rhc1VBID0gZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1t1YURlZi51bmlkYWRfYW5hbGlzaXNdXHJcbiAgICAgICAgYmVpbmdBcnJheShjb25qdW50b1Jlc3B1ZXN0YXNVQSkuZm9yRWFjaCgocmVzcHVlc3RhcywgdmFsb3JQa09Qb3NpY2lvbikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoZiA9PiBmLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhRGVmLnVuaWRhZF9hbmFsaXNpcyAmJiBlc1ByaW5jaXBhbChmLmNhc2lsbGVyb3MsIHZhbG9yUGsgYXMgbnVtYmVyKSkuZm9yRWFjaCgoX2RlZkYsIGZvcm11bGFyaW8pID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JQa1JhaXogPSB7IGZvcm11bGFyaW8sIFt1YURlZi5wa19hZ3JlZ2FkYV06IHZhbG9yUGsgfSBhcyBGb3JQa1JhaXpcclxuICAgICAgICAgICAgICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3RhcywgZm9yUGtSYWl6LCB7fSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0VuY3Vlc3RhKFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICBmb3JtdWxhcmlvczogeyBbbm9tYnJlRm9ybXVsYXJpbyBpbiBJZEZvcm11bGFyaW9dOiBJbmZvRm9ybXVsYXJpbyB9LFxyXG4gICAgZm9yUGtSYWl6OiBGb3JQa1JhaXosXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgb3B0czogT3BjaW9uZXNSb3dWYWxpZGF0b3JcclxuKSB7XHJcbiAgICB2YXIgZm9yUGs6IEZvclBrID0geyAuLi5mb3JQa1JhaXogfTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhmZWVkYmFja1Jvd1ZhbGlkYXRvciwgZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCwgZm9yUGssIHJlc3B1ZXN0YXMsIG51bGwsIG9wdHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIGZvclBrUmFpejogRm9yUGtSYWl6LCBvcHRzOiBPcGNpb25lc1Jvd1ZhbGlkYXRvcikge1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG86IFJlc3VtZW5Fc3RhZG87XHJcbiAgICAvLyBAdHMtaWdub3JlIFBhcnRpYWxcclxuICAgIHZhciBudWV2b3NSb3dzOiB7IFt4IGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgSWRGaW4+IH0gPSB7fVxyXG4gICAgY2FsY3VsYXJGZWVkYmFja0VuY3Vlc3RhKG51ZXZvc1Jvd3MsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIGZvclBrUmFpeiwgcmVzcHVlc3Rhcywgb3B0cyk7XHJcbiAgICBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciA9IGxpa2VBcihkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfZmVlZGJhY2s6IGFueSwgcGxhaW5QazogUGxhaW5Gb3JQaykgPT4gSlNPTi5wYXJzZShwbGFpblBrKVtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdICE9IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKS5wbGFpbigpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSB7IC4uLmRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCAuLi5udWV2b3NSb3dzIH07XHJcbiAgICBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW2VzdHJ1Y3R1cmEudWFQcGFsXVtmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXV0gPSB7XHJcbiAgICAgICAgLi4uZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF1dLFxyXG4gICAgICAgIC4uLmNhbGN1bGFyUmVzdW1lblZpdmllbmRhKFxyXG4gICAgICAgICAgICBmb3JQa1JhaXosXHJcbiAgICAgICAgICAgIG51ZXZvc1Jvd3MsXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNcclxuICAgICAgICApXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MgPSAoaWRGb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8gfCB1bmRlZmluZWQsIGZvcm1zRmVlZGJhY2s6IElkRm9ybXVsYXJpb1tdID0gW10pID0+IHtcclxuICAgIGlmIChpZEZvcm11bGFyaW8pIHtcclxuICAgICAgICBmb3IgKGxldCBjYXNpbGxlcm8gb2YgZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tpZEZvcm11bGFyaW9dLmNhc2lsbGVyb3MuY2FzaWxsZXJvcykge1xyXG4gICAgICAgICAgICBpZiAoY2FzaWxsZXJvLnRpcG9jID09ICdCRicpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtSGlqbyA9IChjYXNpbGxlcm8uc2FsdG8/LnN0YXJ0c1dpdGgoJ0Y6JykgPyBjYXNpbGxlcm8uc2FsdG8gOiAnRjonICsgY2FzaWxsZXJvLnNhbHRvKSBhcyBJZEZvcm11bGFyaW87XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUhpam8pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLnB1c2goZm9ybUhpam8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MoZm9ybUhpam8sIGZvcm1zRmVlZGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1zRmVlZGJhY2s7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0Rm9ybXVsYXJpb3NGb3JWYWx1ZVBrUmFpeiA9ICh2YWx1ZVBrUmFpejogVmFsdWVQa1JhaXopID0+IHtcclxuICAgIHZhciBtYWluRm9ybUZvclZhbHVlUGtSYWl6ID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYSh2YWx1ZVBrUmFpeik7XHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IFttYWluRm9ybUZvclZhbHVlUGtSYWl6XTtcclxuICAgIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MobWFpbkZvcm1Gb3JWYWx1ZVBrUmFpeiwgZm9ybXNGZWVkYmFjayk7XHJcbiAgICByZXR1cm4gZm9ybXNGZWVkYmFjaztcclxufVxyXG5cclxuZXhwb3J0IHZhciBjYWxjdWxhckFjdHVhbEJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCwgbnVtRWxlbWVudG9VQTogbnVtYmVyLCBudW1BY3R1YWw6IG51bWJlciB8IG51bGwsIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbywgcjogUmVzcHVlc3RhcykgPT5cclxuICAgICEhKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiZcclxuICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCAmJlxyXG4gICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW9cclxuICAgICAgICA/XHJcbiAgICAgICAgbnVtRWxlbWVudG9VQSA9PSBjb2FsZXNjZShcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb19tYW51YWxdLFxyXG4gICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvXVxyXG4gICAgICAgIClcclxuICAgICAgICA6XHJcbiAgICAgICAgbnVtQWN0dWFsID09IG51bUVsZW1lbnRvVUFcclxuICAgIClcclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJEaXNhYmxlZEJGID0gKFxyXG4gICAgY29uZmlnU29ydGVvRm9ybXVsYXJpbzogQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8gfCBudWxsLFxyXG4gICAgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uSGFiaWxpdGFyQm90b25Gb3JtdWxhcmlvIHwgbnVsbCxcclxuICAgIG51bUVsZW1lbnRvVUE6IG51bWJlcixcclxuICAgIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbyxcclxuICAgIHI6IFJlc3B1ZXN0YXNcclxuKSA9PiB7XHJcbiAgICBpZiAoaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvICYmIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tmb3JtdWxhcmlvXSkge1xyXG4gICAgICAgIHZhciBleHByX2hhYmlsaXRhcl9mdW4gPSBnZXRGdW5jaW9uSGFiaWxpdGFyKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tmb3JtdWxhcmlvXS5leHByX2hhYmlsaXRhcl9ib3Rvbl9qcyk7XHJcbiAgICAgICAgcmV0dXJuICFleHByX2hhYmlsaXRhcl9mdW4ocltoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10udW5pZGFkX2FuYWxpc2lzXVtudW1FbGVtZW50b1VBIC0gMV0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgICAgIChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvIHx8XHJcbiAgICAgICAgICAgICAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsKS5pbmNsdWRlcyhmb3JtdWxhcmlvKVxyXG4gICAgICAgICAgICApICYmXHJcbiAgICAgICAgICAgIG51bUVsZW1lbnRvVUEgIT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvX21hbnVhbF0sXHJcbiAgICAgICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvXVxyXG4gICAgICAgICAgICApKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyUGVybWl0ZUJvcnJhckJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCwgZm9ybXVsYXJpbzogSWRGb3JtdWxhcmlvKSA9PlxyXG4gICAgIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbylcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzXHJcbik6IFJlc3VsdGFkb1Jlc3VtZW4ge1xyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gYXMgdW5rbm93biBhcyBJZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICB2YXIgeyBjb2RSZWEsIGVzUmVhIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGEocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2ROb1JlYSwgZXNOb1JlYSB9ID0gZGVmT3BlcmF0aXZvLmVzTm9SZWEocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2RSZWFTdXAsIGVzUmVhU3VwIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGFTdXAocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2ROb1JlYVN1cCwgZXNOb1JlYVN1cCB9ID0gZGVmT3BlcmF0aXZvLmVzTm9SZWFTdXAocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IGdldEZvcm11bGFyaW9zRm9yVmFsdWVQa1JhaXooZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0pO1xyXG4gICAgdmFyIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5jb25maWdTb3J0ZW8gJiYgZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSldXHJcbiAgICB2YXIgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW87XHJcbiAgICB2YXIgZmVlZEJhY2tWaXZpZW5kYSA9IGxpa2VBcihmZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfcm93LCBwbGFpblBrKSA9PiB7XHJcbiAgICAgICAgdmFyIHRpZW5lSW5kaXZpZHVhbCA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvICYmICEhKGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCAmJiBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX3BhZHJlKVxyXG4gICAgICAgIHZhciB0aWVuZUJvdG9uRGVzSGFiaWxpdGFibGUgPSBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8gJiYgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvW0pTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW9dO1xyXG4gICAgICAgIHZhciBwa0FncmVnYWRhID0gbnVsbDtcclxuICAgICAgICBpZiAodGllbmVCb3RvbkRlc0hhYmlsaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHBrQWdyZWdhZGEgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEsIF9pZFVBKSA9PlxyXG4gICAgICAgICAgICAgICAgdWEudW5pZGFkX2FuYWxpc2lzID09IGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8gYXMgSWRGb3JtdWxhcmlvXS51bmlkYWRfYW5hbGlzaXMpPy5wa19hZ3JlZ2FkYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGxhaW5QaylbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSA9PSBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSAmJlxyXG4gICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLmluY2x1ZGVzKEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbykgJiZcclxuICAgICAgICAgICAgKHRpZW5lQm90b25EZXNIYWJpbGl0YWJsZSA/XHJcbiAgICAgICAgICAgICAgICAhY2FsY3VsYXJEaXNhYmxlZEJGKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspW3BrQWdyZWdhZGEgYXMgQ2FtcG9Qa10sXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNGb3JQayhKU09OLnBhcnNlKHBsYWluUGspLCB0cnVlKS5yZXNwdWVzdGFzQXVtZW50YWRhc1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgOiB0aWVuZUluZGl2aWR1YWwgP1xyXG4gICAgICAgICAgICAgICAgICAgICFjYWxjdWxhckRpc2FibGVkQkYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykucGVyc29uYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlc3RydWN0dXJhLmNvblJlYUhvZ2FyID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykuaG9nYXIgPyByZXNwdWVzdGFzRm9yUGsoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdOiBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhcmlvOiBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX3BhZHJlISxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcjogSlNPTi5wYXJzZShwbGFpblBrKS5ob2dhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBGb3JQaykucmVzcHVlc3RhcyA6IHt9IGFzIFJlc3B1ZXN0YXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNGb3JQayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF06IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFyaW86IGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9fcGFkcmUhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBGb3JQaykucmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICA6IHRydWUpXHJcbiAgICB9KS5hcnJheSgpO1xyXG4gICAgdmFyIHByaW9yaWRhZGVzOiB7IFtrZXkgaW4gUmVzdW1lbkVzdGFkb106IHsgcHJpb3JpZGFkOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIgfSB9ID0ge1xyXG4gICAgICAgICdubyByZWEnOiB7IHByaW9yaWRhZDogMSwgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAnY29uIHByb2JsZW1hcyc6IHsgcHJpb3JpZGFkOiAyLCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdpbmNvbXBsZXRvJzogeyBwcmlvcmlkYWQ6IDMsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ3ZhY2lvJzogeyBwcmlvcmlkYWQ6IDQsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ2NpdGEgcGFjdGFkYSc6IHsgcHJpb3JpZGFkOiA1LCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdvayc6IHsgcHJpb3JpZGFkOiA2LCBjYW50aWRhZDogMCB9XHJcbiAgICB9XHJcbiAgICB2YXIgbWluID0gNjtcclxuICAgIHZhciBtaW5SZXN1bWVuOiBSZXN1bWVuRXN0YWRvID0gJ29rJztcclxuICAgIGZvciAodmFyIGZlZWRiYWNrIG9mIGZlZWRCYWNrVml2aWVuZGEpIHtcclxuICAgICAgICB2YXIgcmVzdW1lbiA9IGZlZWRiYWNrLnJlc3VtZW47XHJcbiAgICAgICAgcHJpb3JpZGFkZXNbcmVzdW1lbl0uY2FudGlkYWQrKztcclxuICAgICAgICBpZiAocHJpb3JpZGFkZXNbcmVzdW1lbl0ucHJpb3JpZGFkIDwgbWluKSB7XHJcbiAgICAgICAgICAgIG1pbiA9IHByaW9yaWRhZGVzW3Jlc3VtZW5dLnByaW9yaWRhZDtcclxuICAgICAgICAgICAgbWluUmVzdW1lbiA9IHJlc3VtZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG1pblJlc3VtZW4gPT0gJ3ZhY2lvJyAmJiBwcmlvcmlkYWRlc1snb2snXS5jYW50aWRhZCB8fCBtaW5SZXN1bWVuID09ICdpbmNvbXBsZXRvJykge1xyXG4gICAgICAgIGlmIChmYWxzZSAvKnJlc3B1ZXN0YXNbc3AxXT09MiAmJiByZXNwdWVzdGFzW3NwNl09PW51bGwqLykge1xyXG4gICAgICAgICAgICBtaW5SZXN1bWVuID0gJ2NpdGEgcGFjdGFkYSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWluUmVzdW1lbiA9ICdpbmNvbXBsZXRvJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9UT0RPIEFSUkVHTEFSIEVTVEUgSE9SUk9SLCBHRU5FUkFMSVpBUlxyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gYXMgdW5rbm93biBhcyBJZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICB2YXIgcmVzdW1lbkVzdGFkbzogUmVzdW1lbkVzdGFkbztcclxuICAgIHZhciByZXN1bWVuRXN0YWRvU3VwOiBSZXN1bWVuRXN0YWRvID0gJ3ZhY2lvJztcclxuICAgIGlmICh0YXJlYSA9PSAnc3VwZScpIHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwID0gZXNOb1JlYVN1cCA/ICdubyByZWEnIDogbWluUmVzdW1lblxyXG4gICAgICAgIC8vcGFyYSBxdWUgY29sb3JlZSBiaWVuIGVuIGxhIGhkciBkZWwgRE0gKGx1ZWdvIGVuIGJiZGQgbm8gc2UgZ3VhcmRhKVxyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSByZXN1bWVuRXN0YWRvU3VwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSBlc05vUmVhID8gJ25vIHJlYScgOiBtaW5SZXN1bWVuXHJcbiAgICB9XHJcbiAgICB2YXIgcmVzdWx0YWRvOiBSZXN1bHRhZG9SZXN1bWVuID0ge1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8sXHJcbiAgICAgICAgcmVzdW1lbkVzdGFkb1N1cCxcclxuICAgICAgICBjb2RSZWEsXHJcbiAgICAgICAgY29kTm9SZWEsXHJcbiAgICAgICAgY29kUmVhU3VwLFxyXG4gICAgICAgIGNvZE5vUmVhU3VwXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0YWRvXHJcbn1cclxuIl19