1 Qué se estudió

Pregunta de investigación: ¿cambia el promedio de comprensión del paciente sobre su cirugía de reemplazo total de rodilla según el formato de consentimiento que recibe?

Se comparan 18 pacientes, seis por modalidad, en un diseño completamente al azar. Cada paciente recibe un solo tratamiento. La asignación del ejemplo representa un posible sorteo global; no es un estudio con mediciones repetidas.

Tratamiento Modalidad
T1 · Control Formato tradicional legal y textual.
T2 Documento simplificado con infografías físicas impresas.
T3 Consentimiento digital con infografías y firma electrónica.

La respuesta es un puntaje numérico de 0 a 100: un valor mayor representa mayor comprensión. Los puntajes son inventados y no proceden de la aplicación del BICEP ni de otro cuestionario validado. En una investigación real debe emplearse un instrumento apropiado y validado para la población, idioma y contexto quirúrgico, siguiendo sus reglas de puntuación.

Resultado principal del ejemplo. El ANOVA detecta diferencias entre las medias, con F = 23,076 y p < 0,001. La tabla de Tukey permite identificar las comparaciones concretas. Estos resultados describen únicamente los datos ficticios.

2 Cómo se distribuyeron los puntajes

Tabla 1. Resumen de comprensión por modalidad. Escala de 0 a 100.
Modalidad Pacientes Media Desv. estándar Mediana Mínimo Máximo
T1 · Texto legal 6 68.67 5.35 69.25 60.5 75.5
T2 · Infografía impresa 6 81.33 4.49 81.25 75.0 88.0
T3 · Digital y firma 6 86.58 4.16 86.50 80.5 92.0

La media es el promedio del grupo. La mediana es el valor central al ordenar sus seis puntajes. La desviación estándar indica cuánto se separan los resultados del promedio: una desviación mayor refleja más variación entre pacientes.

Figura 1. Distribución de la comprensión. Los puntos representan pacientes; el rombo blanco representa la media.

Figura 1. Distribución de la comprensión. Los puntos representan pacientes; el rombo blanco representa la media.

Cómo leer el gráfico. La línea dentro de cada caja es la mediana. La caja contiene la mitad central de los puntajes; los bigotes se extienden hasta los valores que quedan dentro de 1,5 rangos intercuartílicos desde la caja. Los puntos muestran todas las observaciones, incluso las que pudieran quedar fuera de los bigotes. Un punto alejado merece revisión; no debe eliminarse automáticamente.

Qué muestra este ejemplo. T1 tiene una media de 68,67 puntos, T2 de 81,33 y T3 de 86,58. T2 y T3 presentan puntajes más altos que T1. Sin embargo, observar cajas separadas o superpuestas no sustituye una comparación estadística: el gráfico ayuda a ver los datos, mientras que los intervalos de Tukey cuantifican la incertidumbre.

3 Qué comprobamos antes de interpretar el ANOVA

El ANOVA supone independencia entre pacientes, variación residual aproximadamente similar en los tratamientos y errores razonablemente compatibles con una distribución normal. La normalidad se revisa en los residuos del modelo, no en todos los puntajes mezclados.

Un residuo es la diferencia entre el puntaje de un paciente y el promedio que el modelo estima para su modalidad. Por ejemplo, un residuo de +5 significa que obtuvo cinco puntos más de lo esperado para su grupo.

Tabla 2. Diagnósticos con nivel de referencia 0,05.
Prueba Pregunta p Lectura
Shapiro–Wilk ¿Los residuos se apartan de la normalidad? 0,8374 No se detecta incumplimiento
Bartlett ¿Difieren las varianzas entre modalidades? 0,8551 No se detecta incumplimiento
Levene centrado en mediana ¿Difiere la dispersión entre modalidades? 0,8686 No se detecta incumplimiento

Interpretación sencilla. Con estos datos, las tres pruebas no detectan problemas al nivel de 0,05. Eso no demuestra normalidad ni igualdad de varianzas. Con seis pacientes por grupo, las pruebas pueden no detectar desviaciones relevantes. Bartlett es especialmente sensible a la falta de normalidad; Levene centrado en la mediana es más resistente a observaciones extremas.

La independencia se sostiene en el diseño: pacientes distintos, una modalidad por persona y ausencia de influencias relevantes entre ellos. Ninguna de estas tres pruebas confirma esa condición.

Figura 2. Gráfico QQ de los residuos estandarizados. La línea es una referencia para una distribución normal.

Figura 2. Gráfico QQ de los residuos estandarizados. La línea es una referencia para una distribución normal.

Cómo leerlo. Si los puntos siguen razonablemente la línea, la forma de los residuos es compatible con la normalidad. Curvas pronunciadas o puntos muy alejados en los extremos sugieren revisar el supuesto. No esperamos una alineación perfecta con solo 18 observaciones. En este ejemplo, Shapiro–Wilk aporta p = 0,8374, sin detectar un alejamiento de la normalidad.

Figura 3. Residuos por valor ajustado. Las tres columnas corresponden a las medias de las tres modalidades.

Figura 3. Residuos por valor ajustado. Las tres columnas corresponden a las medias de las tres modalidades.

Cómo leerlo. Los residuos deben repartirse alrededor de cero y presentar una amplitud vertical relativamente semejante. Una columna mucho más extendida, o un patrón de abanico, sugeriría varianzas distintas. Las columnas son normales en este gráfico: cada paciente comparte el valor ajustado con los otros cinco de su tratamiento. Los puntos extremos deben revisarse con su registro original, sin eliminarlos para obtener un valor p favorable.

4 Qué diferencias detectó el análisis

4.1 La comparación global

La hipótesis nula establece que las tres medias son iguales. El ANOVA compara la separación entre los promedios con la variación entre pacientes que recibieron la misma modalidad.

Tabla 3. ANOVA de una vía para el DCA.
Fuente gl Suma de cuadrados Cuadrado medio F p
Tratamiento 2 1018.03 509.01 23,076 < 0,001
Error residual 15 330.88 22.06 — —

El resultado global indica que hay evidencia de que al menos una media es diferente. No identifica por sí solo cuál modalidad difiere de cuál. El valor p tampoco es la probabilidad de que la hipótesis nula sea verdadera ni indica cuántos puntos mejora una modalidad.

Como complemento, omega cuadrado es 0,710. Resume la magnitud de la separación entre grupos respecto a la variabilidad total, con una corrección por el error. No es un porcentaje de pacientes beneficiados y, en estos datos inventados, no constituye una estimación de eficacia clínica.

4.2 Las comparaciones entre modalidades

Se aplica Tukey para comparar los tres pares manteniendo una cobertura simultánea del 95 % para sus intervalos bajo el modelo.

Tabla 4. Diferencias de comprensión en puntos. T2–T1 significa T2 menos T1.
Comparación Diferencia Límite inferior Límite superior p ajustado Lectura
T2-T1 12.67 5.62 19.71 < 0,001 Diferencia detectada
T3-T1 17.92 10.87 24.96 < 0,001 Diferencia detectada
T3-T2 5.25 -1.79 12.29 0,1629 Sin evidencia suficiente
Figura 4. Diferencias de medias e intervalos simultáneos del 95 % de Tukey. La línea vertical indica diferencia cero.

Figura 4. Diferencias de medias e intervalos simultáneos del 95 % de Tukey. La línea vertical indica diferencia cero.

Cómo leerlo. El punto representa la diferencia entre promedios y la línea horizontal muestra su intervalo. Si todo el intervalo queda por encima de cero, la primera modalidad tiene una media mayor que la segunda bajo este análisis. Si el intervalo cruza cero, la muestra no permite distinguir ese par al nivel elegido.

T2 frente a T1: la diferencia es de 12,67 puntos, con intervalo de 5,62 a 19,71. Se detecta una diferencia favorable a T2 en estos datos.

T3 frente a T1: la diferencia es de 17,92 puntos, con intervalo de 10,87 a 24,96. Se detecta una diferencia favorable a T3 en estos datos.

T3 frente a T2: la diferencia es de 5,25 puntos, con intervalo de -1,79 a 12,29. No hay evidencia suficiente para distinguirlas. Esto no demuestra que sean equivalentes.

5 Qué ocurre con otras formas de analizar

Welch se incluye como sensibilidad ante varianzas diferentes. Kruskal–Wallis utiliza rangos y compara distribuciones; su interpretación como diferencia de localización requiere formas y dispersiones semejantes. No son pruebas intercambiables ni se elige la que produce el menor valor p.

Tabla 5. Análisis de sensibilidad; no constituyen estudios independientes.
Metodo Enfoque p
ANOVA clásico Igualdad de medias con varianza común < 0,001
ANOVA de Welch Igualdad de medias permitiendo varianzas diferentes < 0,001
Kruskal–Wallis Comparación por rangos entre grupos independientes 0,0021

En el ejemplo, las tres pruebas globales detectan diferencias. Esto muestra consistencia descriptiva frente a distintos enfoques, pero no corrige limitaciones del diseño ni valida datos simulados. Los resultados por pares pueden diferir entre métodos, especialmente con seis personas por grupo.

6 Qué podemos concluir

En estos datos ficticios, los formatos con infografías presentan mayor comprensión promedio que el formato textual tradicional. El formato digital tiene el promedio más alto, pero Tukey no aporta evidencia suficiente para afirmar que supera al documento impreso con infografías.

La pregunta clínica real exige más: una muestra calculada, un instrumento válido para el contexto, contenido clínico equivalente, oportunidad de preguntar y evaluación en condiciones comparables. La significación estadística no determina por sí sola si una diferencia es importante para la práctica.

T3 combina formato digital, infografías y firma electrónica; el experimento compara el paquete completo y no aísla el efecto de la firma. El consentimiento tampoco queda reducido a un formulario: en todos los grupos debe mantenerse un proceso de información y aclaración de dudas adecuado.

7 Detalles y reproducibilidad

Ver las 18 observaciones analizadas
Paciente Tratamiento Comprensión
DCA_P01 T2 78.5
DCA_P02 T1 65.0
DCA_P03 T3 85.5
DCA_P04 T1 72.5
DCA_P05 T3 90.0
DCA_P06 T2 82.0
DCA_P07 T3 80.5
DCA_P08 T2 75.0
DCA_P09 T1 60.5
DCA_P10 T2 88.0
DCA_P11 T3 87.5
DCA_P12 T1 70.0
DCA_P13 T1 68.5
DCA_P14 T2 80.5
DCA_P15 T3 92.0
DCA_P16 T3 84.0
DCA_P17 T1 75.5
DCA_P18 T2 84.0
Ver las comparaciones adicionales de sensibilidad

Los intervalos siguientes usan Bonferroni para cobertura conjunta de al menos 95 %; los valores p se ajustan con Holm. Los dos ajustes son distintos y están identificados por separado.

Comparaciones t de Welch: intervalos Bonferroni y p de Holm.
Comparacion Diferencia LI_Bonferroni LS_Bonferroni p_Holm
T1 menos T2 -12.67 -20.90 -4.43 0,0027
T1 menos T3 -17.92 -25.96 -9.87 < 0,001
T2 menos T3 -5.25 -12.43 1.93 0,0623

Las comparaciones por rangos son Mann–Whitney con ajuste Holm, no el procedimiento de Dunn. Se emplea aproximación normal para admitir empates; sus valores p requieren cautela con muestras pequeñas.

## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  datos_dca$comprension and datos_dca$tratamiento 
## 
##    T1    T2   
## T2 0.016 -    
## T3 0.015 0.092
## 
## P value adjustment method: holm
Ver observaciones potencialmente influyentes

La distancia de Cook ayuda a identificar qué observaciones podrían cambiar más el ajuste del modelo. La referencia 4/n es orientativa: no es una regla automática para borrar pacientes. Primero debe comprobarse la calidad del registro y la sensibilidad del resultado.

Paciente Residuo_estandarizado Cook Revisar
DCA_P09 -1.905 0.242 Revisar registro
DCA_P17 1.594 0.169 Sin señal según esta referencia
DCA_P10 1.555 0.161 Sin señal según esta referencia
DCA_P08 -1.477 0.145 Sin señal según esta referencia
DCA_P07 -1.419 0.134 Sin señal según esta referencia
DCA_P15 1.263 0.106 Sin señal según esta referencia
DCA_P04 0.894 0.053 Sin señal según esta referencia
DCA_P02 -0.855 0.049 Sin señal según esta referencia
DCA_P05 0.797 0.042 Sin señal según esta referencia
DCA_P01 -0.661 0.029 Sin señal según esta referencia
DCA_P18 0.622 0.026 Sin señal según esta referencia
DCA_P16 -0.603 0.024 Sin señal según esta referencia
DCA_P12 0.311 0.006 Sin señal según esta referencia
DCA_P03 -0.253 0.004 Sin señal según esta referencia
DCA_P11 0.214 0.003 Sin señal según esta referencia
DCA_P14 -0.194 0.003 Sin señal según esta referencia
DCA_P06 0.155 0.002 Sin señal según esta referencia
DCA_P13 -0.039 0.000 Sin señal según esta referencia
Ver configuración de R y paquetes
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Spanish_Panama.utf8  LC_CTYPE=Spanish_Panama.utf8   
## [3] LC_MONETARY=Spanish_Panama.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Spanish_Panama.utf8    
## 
## time zone: America/Panama
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] vctrs_0.7.3        cli_3.6.6          knitr_1.52         rlang_1.3.0       
##  [5] xfun_0.62          generics_0.1.4     S7_0.2.2           jsonlite_2.0.0    
##  [9] labeling_0.4.3     glue_1.8.1         htmltools_0.5.9    sass_0.4.10       
## [13] scales_1.4.0       rmarkdown_2.32     grid_4.6.1         tibble_3.3.1      
## [17] evaluate_1.0.5     jquerylib_0.1.4    fastmap_1.2.0      yaml_2.3.12       
## [21] lifecycle_1.0.5    compiler_4.6.1     dplyr_1.2.1        RColorBrewer_1.1-3
## [25] pkgconfig_2.0.3    rstudioapi_0.19.0  farver_2.1.2       digest_0.6.39     
## [29] R6_2.6.1           tidyselect_1.2.1   pillar_1.11.1      magrittr_2.0.5    
## [33] bslib_0.12.0       withr_3.0.3        tools_4.6.1        gtable_0.3.6      
## [37] ggplot2_4.0.3      cachem_1.1.0

Este informe se elaboró a partir de Analisis_DCA_Consentimiento.R, conservando sus 18 registros, ANOVA, pruebas de supuestos y análisis de sensibilidad. Los resultados y figuras se recalculan al ejecutar Knit; el archivo no necesita conectarse con el script original ni con una base externa. El código completo puede consultarse con la opción de descarga del documento HTML o abriendo este archivo .rmd.

LS0tCnRpdGxlOiAiQ29tcHJlbnNpw7NuIGRlbCBjb25zZW50aW1pZW50byBpbmZvcm1hZG8iCnN1YnRpdGxlOiAiVHJlcyBmb3JtYXRvcyBkZSBwcmVzZW50YWNpw7NuIGV2YWx1YWRvcyBjb24gdW4gZGlzZcOxbyBjb21wbGV0YW1lbnRlIGFsIGF6YXIiCmRhdGU6ICJFamVtcGxvIGRpZMOhY3RpY28gY29uIGRhdG9zIGZpY3RpY2lvcyIKbGFuZzogZXMKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGRmX3ByaW50OiBrYWJsZQogICAgbWF0aGpheDogbnVsbAotLS0KCjwhLS0KQVJDSElWTyBBVVTDk05PTU86IG5vIG5lY2VzaXRhIGVsIHNjcmlwdCAuUiBuaSBhcmNoaXZvcyBkZSBkYXRvcyBleHRlcm5vcy4KR3VhcmRlIGVuIFVURi04LiBBYnJhIGVuIFJTdHVkaW8geSBwdWxzZSBLbml0ID4gS25pdCB0byBIVE1MLgoKUFJJTUVSIFVTTzogYW50ZXMgZGUgS25pdCwgZWplY3V0ZSBlbiBsYSBjb25zb2xhIGRlIFI6CnBhcXVldGVzIDwtIGMoInJtYXJrZG93biIsICJrbml0ciIsICJnZ3Bsb3QyIikKZmFsdGFudGVzIDwtIHBhcXVldGVzWyF2YXBwbHkocGFxdWV0ZXMsIHJlcXVpcmVOYW1lc3BhY2UsIGxvZ2ljYWwoMSksIHF1aWV0bHkgPSBUUlVFKV0KaWYgKGxlbmd0aChmYWx0YW50ZXMpKSBpbnN0YWxsLnBhY2thZ2VzKGZhbHRhbnRlcywgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKCkRlc3B1w6lzIHB1bHNlIEtuaXQuIFRhbWJpw6luIHB1ZWRlIGVqZWN1dGFyOgpybWFya2Rvd246OnJlbmRlcigiSW5mb3JtZV9EQ0FfQ29uc2VudGltaWVudG8ucm1kIiwgZW5jb2RpbmcgPSAiVVRGLTgiKQoKUlN0dWRpbyBub3JtYWxtZW50ZSBpbmNsdXllIFBhbmRvYy4gUGFyYSBjb21wcm9iYXJsbzoKcm1hcmtkb3duOjpwYW5kb2NfYXZhaWxhYmxlKCkKLS0+CgpgYGB7ciBjb25maWd1cmFjaW9uLCBpbmNsdWRlPUZBTFNFfQpwYXF1ZXRlcyA8LSBjKCJrbml0ciIsICJnZ3Bsb3QyIikKZm9yIChwIGluIHBhcXVldGVzKSB7CiAgaWYgKCFyZXF1aXJlTmFtZXNwYWNlKHAsIHF1aWV0bHkgPSBUUlVFKSkgewogICAgdHJ5Q2F0Y2goCiAgICAgIHV0aWxzOjppbnN0YWxsLnBhY2thZ2VzKHAsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpLAogICAgICBlcnJvciA9IGZ1bmN0aW9uKGUpIG1lc3NhZ2UoY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICkKICB9CiAgaWYgKCFyZXF1aXJlTmFtZXNwYWNlKHAsIHF1aWV0bHkgPSBUUlVFKSkgewogICAgc3RvcCgiRmFsdGEgZWwgcGFxdWV0ZSAiLCBwLAogICAgICAgICAiLiBSZXZpc2UgSW50ZXJuZXQsIHBlcm1pc29zIGRlIGluc3RhbGFjacOzbiB5IHZlcnNpw7NuIGRlIFIuIikKICB9Cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gVFJVRSwgZXJyb3IgPSBGQUxTRSwKICBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gNC44LCBkcGkgPSAxNjAsCiAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICIxMDAlIiwgY2FjaGUgPSBGQUxTRQopCm9wdGlvbnMod2lkdGggPSA5NSkKYWxwaGEgPC0gMC4wNQpmbXQgPC0gZnVuY3Rpb24oeCwgZCA9IDIpIGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSBkLCBkZWNpbWFsLm1hcmsgPSAiLCIpCmZwIDwtIGZ1bmN0aW9uKHgpIGlmZWxzZSh4IDwgMC4wMDEsICI8IDAsMDAxIiwgZm10KHgsIDQpKQpjb2xvcmVzIDwtIGMoVDEgPSAiIzYzNzU4QSIsIFQyID0gIiMxNTlBOTQiLCBUMyA9ICIjNTM2OUIwIikKZXRpcXVldGFzIDwtIGMoVDEgPSAiVDEgwrcgVGV4dG8gbGVnYWwiLCBUMiA9ICJUMiDCtyBJbmZvZ3JhZsOtYSBpbXByZXNhIiwKICAgICAgICAgICAgICAgVDMgPSAiVDMgwrcgRGlnaXRhbCB5IGZpcm1hIikKdGVtYSA8LSBnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArCiAgZ2dwbG90Mjo6dGhlbWUoCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTUsIGNvbG91ciA9ICIjMTgzMzQ5IiksCiAgICBwbG90LnN1YnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3VyID0gIiM1MjY0NzciKSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoY29sb3VyID0gIiMzMzQ4NUMiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHBsb3QubWFyZ2luID0gZ2dwbG90Mjo6bWFyZ2luKDEyLCAxNiwgMTIsIDEwKQogICkKYGBgCgo8c3R5bGU+CmJvZHkgeyBjb2xvcjogIzI2M2I0ZDsgYmFja2dyb3VuZDogI2ZmZjsgZm9udC1mYW1pbHk6ICJTZWdvZSBVSSIsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxLjc7IH0KLm1haW4tY29udGFpbmVyIHsgbWF4LXdpZHRoOiAxMTIwcHg7IH0KaDEsIGgyLCBoMyB7IGNvbG9yOiAjMTgzMzQ5OyBmb250LXdlaWdodDogNjUwOyBsaW5lLWhlaWdodDogMS4yNTsgfQpoMS50aXRsZSB7IGZvbnQtc2l6ZTogMzdweDsgbWFyZ2luLXRvcDogMjhweDsgbGV0dGVyLXNwYWNpbmc6IC0uOHB4OyB9CmgyIHsgZm9udC1zaXplOiAyNXB4OyBtYXJnaW4tdG9wOiAzNnB4OyB9CmgzIHsgZm9udC1zaXplOiAyMHB4OyBtYXJnaW4tdG9wOiAyNHB4OyB9Ci5zdWJ0aXRsZSB7IGNvbG9yOiAjNTI2NDc3OyBmb250LXNpemU6IDE5cHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OyB9Ci5kYXRlIHsgY29sb3I6ICM2NTc4ODk7IGZvbnQtc2l6ZTogMTRweDsgfQpwIHsgbWFyZ2luLWJvdHRvbTogMTZweDsgfQphIHsgY29sb3I6ICMxMTdlNzk7IH0KLnRhYmxlIHsgd2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwIDI0cHg7IGZvbnQtc2l6ZTogMTRweDsgfQoudGFibGUgdGggeyBiYWNrZ3JvdW5kOiAjMTgzMzQ5OyBjb2xvcjogI2ZmZjsgcGFkZGluZzogMTJweCAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsgfQoudGFibGUgdGQgeyBwYWRkaW5nOiAxMXB4IDEycHggIWltcG9ydGFudDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNGVhZjAgIWltcG9ydGFudDsgdmVydGljYWwtYWxpZ246IG1pZGRsZSAhaW1wb3J0YW50OyB9Ci50YWJsZSB0Ym9keSB0cjpudGgtY2hpbGQoZXZlbikgeyBiYWNrZ3JvdW5kOiAjZjNmN2ZhOyB9Ci5jYXB0aW9uIHsgY29sb3I6ICM2NTc4ODk7IGZvbnQtc2l6ZTogMTNweDsgbWFyZ2luLXRvcDogOHB4OyB9Ci50b2NpZnkgeyBmb250LXNpemU6IDEzcHg7IGJvcmRlci1jb2xvcjogI2U0ZWFmMDsgYm9yZGVyLXJhZGl1czogNnB4OyB9Ci50b2NpZnkgLmFjdGl2ZSB7IGJhY2tncm91bmQ6ICMxMTdlNzk7IH0KcHJlIHsgYm9yZGVyOiAxcHggc29saWQgI2U0ZWFmMDsgYmFja2dyb3VuZDogI2Y2ZjhmYTsgYm9yZGVyLXJhZGl1czogNXB4OyBmb250LXNpemU6IDEycHg7IH0KZGV0YWlscyB7IG1hcmdpbjogMjBweCAwOyBwYWRkaW5nOiAxNXB4IDA7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGZlN2VkOyB9CnN1bW1hcnkgeyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTE3ZTc5OyB9CkBtZWRpYSBwcmludCB7ICNUT0MsIC5jb2RlLWZvbGRpbmctYnRuLCAuY29kZS10b29scyB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSBib2R5IHsgZm9udC1zaXplOiAxMXB0OyB9IH0KPC9zdHlsZT4KCmBgYHtyIGRhdG9zLXktYW5hbGlzaXMsIGluY2x1ZGU9RkFMU0V9CmRhdG9zX2RjYSA8LSBkYXRhLmZyYW1lKAogIHBhY2llbnRlID0gc3ByaW50ZigiRENBX1AlMDJkIiwgMToxOCksCiAgdHJhdGFtaWVudG8gPSBmYWN0b3IoYygiVDIiLCJUMSIsIlQzIiwiVDEiLCJUMyIsIlQyIiwKICAgICJUMyIsIlQyIiwiVDEiLCJUMiIsIlQzIiwiVDEiLCJUMSIsIlQyIiwiVDMiLCJUMyIsIlQxIiwiVDIiKSwKICAgIGxldmVscyA9IGMoIlQxIiwiVDIiLCJUMyIpKSwKICBjb21wcmVuc2lvbiA9IGMoNzguNSw2NSw4NS41LDcyLjUsOTAsODIsODAuNSw3NSw2MC41LAogICAgICAgICAgICAgICAgICA4OCw4Ny41LDcwLDY4LjUsODAuNSw5Miw4NCw3NS41LDg0KQopCnN0b3BpZm5vdChucm93KGRhdG9zX2RjYSkgPT0gMTgsICFhbnlOQShkYXRvc19kY2EpLAogICFhbnlEdXBsaWNhdGVkKGRhdG9zX2RjYSRwYWNpZW50ZSksCiAgYWxsKHRhYmxlKGRhdG9zX2RjYSR0cmF0YW1pZW50bykgPT0gNiksCiAgYWxsKGRhdG9zX2RjYSRjb21wcmVuc2lvbiA+PSAwICYgZGF0b3NfZGNhJGNvbXByZW5zaW9uIDw9IDEwMCkpCm1vZGVsbyA8LSBzdGF0czo6YW92KGNvbXByZW5zaW9uIH4gdHJhdGFtaWVudG8sIGRhdGEgPSBkYXRvc19kY2EpCmFuIDwtIHN1bW1hcnkobW9kZWxvKVtbMV1dCnJvd25hbWVzKGFuKSA8LSB0cmltd3Mocm93bmFtZXMoYW4pKQpyZXMgPC0gc3RhdHM6OnJlc2lkdWFscyhtb2RlbG8pCnNoIDwtIHN0YXRzOjpzaGFwaXJvLnRlc3QocmVzKQpiYSA8LSBzdGF0czo6YmFydGxldHQudGVzdChjb21wcmVuc2lvbiB+IHRyYXRhbWllbnRvLCBkYXRhID0gZGF0b3NfZGNhKQp6IDwtIHdpdGgoZGF0b3NfZGNhLCBhYnMoY29tcHJlbnNpb24gLSBhdmUoY29tcHJlbnNpb24sIHRyYXRhbWllbnRvLCBGVU4gPSBzdGF0czo6bWVkaWFuKSkpCmxldiA8LSBzdGF0czo6YW5vdmEoc3RhdHM6OmxtKHogfiB0cmF0YW1pZW50bywgZGF0YSA9IGRhdG9zX2RjYSkpCnR1IDwtIHN0YXRzOjpUdWtleUhTRChtb2RlbG8sICJ0cmF0YW1pZW50byIsIGNvbmYubGV2ZWwgPSAwLjk1KSR0cmF0YW1pZW50bwp3ZSA8LSBzdGF0czo6b25ld2F5LnRlc3QoY29tcHJlbnNpb24gfiB0cmF0YW1pZW50bywgZGF0YSA9IGRhdG9zX2RjYSwgdmFyLmVxdWFsID0gRkFMU0UpCmt3IDwtIHN0YXRzOjprcnVza2FsLnRlc3QoY29tcHJlbnNpb24gfiB0cmF0YW1pZW50bywgZGF0YSA9IGRhdG9zX2RjYSkKU1NfdHIgPC0gYW5bInRyYXRhbWllbnRvIiwgIlN1bSBTcSJdClNTX2UgPC0gYW5bIlJlc2lkdWFscyIsICJTdW0gU3EiXQpDTV9lIDwtIGFuWyJSZXNpZHVhbHMiLCAiTWVhbiBTcSJdCm9tZWdhMiA8LSBtYXgoMCwgKFNTX3RyIC0gMiAqIENNX2UpIC8gKFNTX3RyICsgU1NfZSArIENNX2UpKQpyZXN1bWVuIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShsZXZlbHMoZGF0b3NfZGNhJHRyYXRhbWllbnRvKSwgZnVuY3Rpb24odCkgewogIHggPC0gZGF0b3NfZGNhJGNvbXByZW5zaW9uW2RhdG9zX2RjYSR0cmF0YW1pZW50byA9PSB0XQogIGRhdGEuZnJhbWUoVHJhdGFtaWVudG8gPSB1bm5hbWUoZXRpcXVldGFzW3RdKSwgbiA9IGxlbmd0aCh4KSwKICAgIE1lZGlhID0gbWVhbih4KSwgREUgPSBzdGF0czo6c2QoeCksIE1lZGlhbmEgPSBzdGF0czo6bWVkaWFuKHgpLAogICAgTWluaW1vID0gbWluKHgpLCBNYXhpbW8gPSBtYXgoeCkpCn0pKQpjb21wYXJhY2lvbmVzIDwtIGRhdGEuZnJhbWUoQ29tcGFyYWNpb24gPSByb3duYW1lcyh0dSksCiAgRGlmZXJlbmNpYSA9IHR1WywgImRpZmYiXSwgTEkgPSB0dVssICJsd3IiXSwgTFMgPSB0dVssICJ1cHIiXSwKICBwX2FqdXN0YWRvID0gdHVbLCAicCBhZGoiXSwgcm93Lm5hbWVzID0gTlVMTCkKY29tcGFyYWNpb25lcyRSZXN1bHRhZG8gPC0gaWZlbHNlKGNvbXBhcmFjaW9uZXMkcF9hanVzdGFkbyA8IGFscGhhLAogICJEaWZlcmVuY2lhIGRldGVjdGFkYSIsICJTaW4gZXZpZGVuY2lhIHN1ZmljaWVudGUiKQpkaWFnIDwtIGRhdGEuZnJhbWUoQWp1c3RhZG8gPSBzdGF0czo6Zml0dGVkKG1vZGVsbyksCiAgUmVzaWR1byA9IHJlcywgRXN0YW5kYXJpemFkbyA9IHN0YXRzOjpyc3RhbmRhcmQobW9kZWxvKSwKICBDb29rID0gc3RhdHM6OmNvb2tzLmRpc3RhbmNlKG1vZGVsbykpCnBhcmVzIDwtIGNvbWJuKGxldmVscyhkYXRvc19kY2EkdHJhdGFtaWVudG8pLCAyLCBzaW1wbGlmeSA9IEZBTFNFKQpwb3N0X3dlIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShwYXJlcywgZnVuY3Rpb24ocCkgewogIGEgPC0gZGF0b3NfZGNhJGNvbXByZW5zaW9uW2RhdG9zX2RjYSR0cmF0YW1pZW50byA9PSBwWzFdXQogIGIgPC0gZGF0b3NfZGNhJGNvbXByZW5zaW9uW2RhdG9zX2RjYSR0cmF0YW1pZW50byA9PSBwWzJdXQogIHRlc3QgPC0gc3RhdHM6OnQudGVzdChhLCBiLCB2YXIuZXF1YWwgPSBGQUxTRSwgY29uZi5sZXZlbCA9IDEgLSBhbHBoYSAvIDMpCiAgZGF0YS5mcmFtZShDb21wYXJhY2lvbiA9IHBhc3RlKHAsIGNvbGxhcHNlID0gIiBtZW5vcyAiKSwKICAgIERpZmVyZW5jaWEgPSBtZWFuKGEpIC0gbWVhbihiKSwgTElfQm9uZmVycm9uaSA9IHRlc3QkY29uZi5pbnRbMV0sCiAgICBMU19Cb25mZXJyb25pID0gdGVzdCRjb25mLmludFsyXSwgcCA9IHRlc3QkcC52YWx1ZSkKfSkpCnBvc3Rfd2UkcF9Ib2xtIDwtIHN0YXRzOjpwLmFkanVzdChwb3N0X3dlJHAsICJob2xtIikKcG9zdF9rdyA8LSBzdGF0czo6cGFpcndpc2Uud2lsY294LnRlc3QoZGF0b3NfZGNhJGNvbXByZW5zaW9uLAogIGRhdG9zX2RjYSR0cmF0YW1pZW50bywgcC5hZGp1c3QubWV0aG9kID0gImhvbG0iLCBleGFjdCA9IEZBTFNFKQpgYGAKCiMgUXXDqSBzZSBlc3R1ZGnDswoKKipQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbjoqKiDCv2NhbWJpYSBlbCBwcm9tZWRpbyBkZSBjb21wcmVuc2nDs24gZGVsIHBhY2llbnRlIHNvYnJlIHN1IGNpcnVnw61hIGRlIHJlZW1wbGF6byB0b3RhbCBkZSByb2RpbGxhIHNlZ8O6biBlbCBmb3JtYXRvIGRlIGNvbnNlbnRpbWllbnRvIHF1ZSByZWNpYmU/CgpTZSBjb21wYXJhbiAqKjE4IHBhY2llbnRlcywgc2VpcyBwb3IgbW9kYWxpZGFkKiosIGVuIHVuIGRpc2XDsW8gY29tcGxldGFtZW50ZSBhbCBhemFyLiBDYWRhIHBhY2llbnRlIHJlY2liZSB1biBzb2xvIHRyYXRhbWllbnRvLiBMYSBhc2lnbmFjacOzbiBkZWwgZWplbXBsbyByZXByZXNlbnRhIHVuIHBvc2libGUgc29ydGVvIGdsb2JhbDsgbm8gZXMgdW4gZXN0dWRpbyBjb24gbWVkaWNpb25lcyByZXBldGlkYXMuCgp8IFRyYXRhbWllbnRvIHwgTW9kYWxpZGFkIHwKfDotLXw6LS18CnwgKipUMSDCtyBDb250cm9sKiogfCBGb3JtYXRvIHRyYWRpY2lvbmFsIGxlZ2FsIHkgdGV4dHVhbC4gfAp8ICoqVDIqKiB8IERvY3VtZW50byBzaW1wbGlmaWNhZG8gY29uIGluZm9ncmFmw61hcyBmw61zaWNhcyBpbXByZXNhcy4gfAp8ICoqVDMqKiB8IENvbnNlbnRpbWllbnRvIGRpZ2l0YWwgY29uIGluZm9ncmFmw61hcyB5IGZpcm1hIGVsZWN0csOzbmljYS4gfAoKTGEgcmVzcHVlc3RhIGVzIHVuIHB1bnRhamUgbnVtw6lyaWNvIGRlICoqMCBhIDEwMCoqOiB1biB2YWxvciBtYXlvciByZXByZXNlbnRhIG1heW9yIGNvbXByZW5zacOzbi4gTG9zIHB1bnRhamVzIHNvbiBpbnZlbnRhZG9zIHkgKipubyBwcm9jZWRlbiBkZSBsYSBhcGxpY2FjacOzbiBkZWwgQklDRVAgbmkgZGUgb3RybyBjdWVzdGlvbmFyaW8gdmFsaWRhZG8qKi4gRW4gdW5hIGludmVzdGlnYWNpw7NuIHJlYWwgZGViZSBlbXBsZWFyc2UgdW4gaW5zdHJ1bWVudG8gYXByb3BpYWRvIHkgdmFsaWRhZG8gcGFyYSBsYSBwb2JsYWNpw7NuLCBpZGlvbWEgeSBjb250ZXh0byBxdWlyw7pyZ2ljbywgc2lndWllbmRvIHN1cyByZWdsYXMgZGUgcHVudHVhY2nDs24uCgoqKlJlc3VsdGFkbyBwcmluY2lwYWwgZGVsIGVqZW1wbG8uKiogRWwgQU5PVkEgYHIgaWYgKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSA8IGFscGhhKSAiZGV0ZWN0YSBkaWZlcmVuY2lhcyIgZWxzZSAibm8gZGV0ZWN0YSBkaWZlcmVuY2lhcyJgIGVudHJlIGxhcyBtZWRpYXMsIGNvbiBGID0gYHIgZm10KGFuWyJ0cmF0YW1pZW50byIsICJGIHZhbHVlIl0sIDMpYCB5IHAgYHIgaWYgKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSA8IDAuMDAxKSAiPCAwLDAwMSIgZWxzZSBwYXN0ZSgiPSIsIGZwKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSkpYC4gTGEgdGFibGEgZGUgVHVrZXkgcGVybWl0ZSBpZGVudGlmaWNhciBsYXMgY29tcGFyYWNpb25lcyBjb25jcmV0YXMuIEVzdG9zIHJlc3VsdGFkb3MgZGVzY3JpYmVuIMO6bmljYW1lbnRlIGxvcyBkYXRvcyBmaWN0aWNpb3MuCgojIEPDs21vIHNlIGRpc3RyaWJ1eWVyb24gbG9zIHB1bnRhamVzCgpgYGB7ciB0YWJsYS1kZXNjcmlwdGl2YX0Ka25pdHI6OmthYmxlKHJlc3VtZW4sIGRpZ2l0cyA9IDIsIHJvdy5uYW1lcyA9IEZBTFNFLAogIGNvbC5uYW1lcyA9IGMoIk1vZGFsaWRhZCIsICJQYWNpZW50ZXMiLCAiTWVkaWEiLCAiRGVzdi4gZXN0w6FuZGFyIiwgIk1lZGlhbmEiLCAiTcOtbmltbyIsICJNw6F4aW1vIiksCiAgY2FwdGlvbiA9ICJUYWJsYSAxLiBSZXN1bWVuIGRlIGNvbXByZW5zacOzbiBwb3IgbW9kYWxpZGFkLiBFc2NhbGEgZGUgMCBhIDEwMC4iKQpgYGAKCkxhICoqbWVkaWEqKiBlcyBlbCBwcm9tZWRpbyBkZWwgZ3J1cG8uIExhICoqbWVkaWFuYSoqIGVzIGVsIHZhbG9yIGNlbnRyYWwgYWwgb3JkZW5hciBzdXMgc2VpcyBwdW50YWplcy4gTGEgKipkZXN2aWFjacOzbiBlc3TDoW5kYXIqKiBpbmRpY2EgY3XDoW50byBzZSBzZXBhcmFuIGxvcyByZXN1bHRhZG9zIGRlbCBwcm9tZWRpbzogdW5hIGRlc3ZpYWNpw7NuIG1heW9yIHJlZmxlamEgbcOhcyB2YXJpYWNpw7NuIGVudHJlIHBhY2llbnRlcy4KCmBgYHtyIGJveHBsb3QsIGZpZy5jYXA9IkZpZ3VyYSAxLiBEaXN0cmlidWNpw7NuIGRlIGxhIGNvbXByZW5zacOzbi4gTG9zIHB1bnRvcyByZXByZXNlbnRhbiBwYWNpZW50ZXM7IGVsIHJvbWJvIGJsYW5jbyByZXByZXNlbnRhIGxhIG1lZGlhLiJ9CmdncGxvdDI6OmdncGxvdChkYXRvc19kY2EsIGdncGxvdDI6OmFlcyh0cmF0YW1pZW50bywgY29tcHJlbnNpb24sIGZpbGwgPSB0cmF0YW1pZW50bykpICsKICBnZ3Bsb3QyOjpnZW9tX2JveHBsb3Qod2lkdGggPSAwLjQ4LCBhbHBoYSA9IDAuNTgsIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdncGxvdDI6Omdlb21fcG9pbnQocG9zaXRpb24gPSBnZ3Bsb3QyOjpwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjA2NSwgc2VlZCA9IDIwKSwKICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICIjMjAzNzRBIiwgc2l6ZSA9IDIuNSwgYWxwaGEgPSAwLjg1KSArCiAgZ2dwbG90Mjo6c3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDIzLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiIzE4MzM0OSIsIHNpemUgPSAzLjUpICsKICBnZ3Bsb3QyOjpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArCiAgZ2dwbG90Mjo6c2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBldGlxdWV0YXMpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwKSkgKyB0ZW1hICsKICBnZ3Bsb3QyOjpsYWJzKHRpdGxlID0gIkNvbXByZW5zacOzbiBlbiBsYXMgdHJlcyBtb2RhbGlkYWRlcyIsCiAgICBzdWJ0aXRsZSA9ICJDYWRhIHB1bnRvIGVzIHVuIHBhY2llbnRlOyBuID0gNiBwb3IgZ3J1cG8iLAogICAgeCA9IE5VTEwsIHkgPSAiUHVudGFqZSBkZSBjb21wcmVuc2nDs24iKQpgYGAKCioqQ8OzbW8gbGVlciBlbCBncsOhZmljby4qKiBMYSBsw61uZWEgZGVudHJvIGRlIGNhZGEgY2FqYSBlcyBsYSBtZWRpYW5hLiBMYSBjYWphIGNvbnRpZW5lIGxhIG1pdGFkIGNlbnRyYWwgZGUgbG9zIHB1bnRhamVzOyBsb3MgYmlnb3RlcyBzZSBleHRpZW5kZW4gaGFzdGEgbG9zIHZhbG9yZXMgcXVlIHF1ZWRhbiBkZW50cm8gZGUgMSw1IHJhbmdvcyBpbnRlcmN1YXJ0w61saWNvcyBkZXNkZSBsYSBjYWphLiBMb3MgcHVudG9zIG11ZXN0cmFuIHRvZGFzIGxhcyBvYnNlcnZhY2lvbmVzLCBpbmNsdXNvIGxhcyBxdWUgcHVkaWVyYW4gcXVlZGFyIGZ1ZXJhIGRlIGxvcyBiaWdvdGVzLiBVbiBwdW50byBhbGVqYWRvIG1lcmVjZSByZXZpc2nDs247IG5vIGRlYmUgZWxpbWluYXJzZSBhdXRvbcOhdGljYW1lbnRlLgoKKipRdcOpIG11ZXN0cmEgZXN0ZSBlamVtcGxvLioqIFQxIHRpZW5lIHVuYSBtZWRpYSBkZSBgciBmbXQocmVzdW1lbiRNZWRpYVsxXSlgIHB1bnRvcywgVDIgZGUgYHIgZm10KHJlc3VtZW4kTWVkaWFbMl0pYCB5IFQzIGRlIGByIGZtdChyZXN1bWVuJE1lZGlhWzNdKWAuIFQyIHkgVDMgcHJlc2VudGFuIHB1bnRhamVzIG3DoXMgYWx0b3MgcXVlIFQxLiBTaW4gZW1iYXJnbywgb2JzZXJ2YXIgY2FqYXMgc2VwYXJhZGFzIG8gc3VwZXJwdWVzdGFzIG5vIHN1c3RpdHV5ZSB1bmEgY29tcGFyYWNpw7NuIGVzdGFkw61zdGljYTogZWwgZ3LDoWZpY28gYXl1ZGEgYSB2ZXIgbG9zIGRhdG9zLCBtaWVudHJhcyBxdWUgbG9zIGludGVydmFsb3MgZGUgVHVrZXkgY3VhbnRpZmljYW4gbGEgaW5jZXJ0aWR1bWJyZS4KCiMgUXXDqSBjb21wcm9iYW1vcyBhbnRlcyBkZSBpbnRlcnByZXRhciBlbCBBTk9WQQoKRWwgQU5PVkEgc3Vwb25lIGluZGVwZW5kZW5jaWEgZW50cmUgcGFjaWVudGVzLCB2YXJpYWNpw7NuIHJlc2lkdWFsIGFwcm94aW1hZGFtZW50ZSBzaW1pbGFyIGVuIGxvcyB0cmF0YW1pZW50b3MgeSBlcnJvcmVzIHJhem9uYWJsZW1lbnRlIGNvbXBhdGlibGVzIGNvbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuICoqTGEgbm9ybWFsaWRhZCBzZSByZXZpc2EgZW4gbG9zIHJlc2lkdW9zIGRlbCBtb2RlbG8qKiwgbm8gZW4gdG9kb3MgbG9zIHB1bnRhamVzIG1lemNsYWRvcy4KClVuIHJlc2lkdW8gZXMgbGEgZGlmZXJlbmNpYSBlbnRyZSBlbCBwdW50YWplIGRlIHVuIHBhY2llbnRlIHkgZWwgcHJvbWVkaW8gcXVlIGVsIG1vZGVsbyBlc3RpbWEgcGFyYSBzdSBtb2RhbGlkYWQuIFBvciBlamVtcGxvLCB1biByZXNpZHVvIGRlICs1IHNpZ25pZmljYSBxdWUgb2J0dXZvIGNpbmNvIHB1bnRvcyBtw6FzIGRlIGxvIGVzcGVyYWRvIHBhcmEgc3UgZ3J1cG8uCgpgYGB7ciB0YWJsYS1zdXB1ZXN0b3N9CnN1cHVlc3RvcyA8LSBkYXRhLmZyYW1lKAogIFBydWViYSA9IGMoIlNoYXBpcm/igJNXaWxrIiwgIkJhcnRsZXR0IiwgIkxldmVuZSBjZW50cmFkbyBlbiBtZWRpYW5hIiksCiAgUHJlZ3VudGEgPSBjKCLCv0xvcyByZXNpZHVvcyBzZSBhcGFydGFuIGRlIGxhIG5vcm1hbGlkYWQ/IiwKICAgICAgICAgICAgICAgIsK/RGlmaWVyZW4gbGFzIHZhcmlhbnphcyBlbnRyZSBtb2RhbGlkYWRlcz8iLAogICAgICAgICAgICAgICAiwr9EaWZpZXJlIGxhIGRpc3BlcnNpw7NuIGVudHJlIG1vZGFsaWRhZGVzPyIpLAogIHAgPSBjKGZwKHNoJHAudmFsdWUpLCBmcChiYSRwLnZhbHVlKSwgZnAobGV2WzEsICJQcig+RikiXSkpLAogIExlY3R1cmEgPSBpZmVsc2UoYyhzaCRwLnZhbHVlLCBiYSRwLnZhbHVlLCBsZXZbMSwgIlByKD5GKSJdKSA8IGFscGhhLAogICAgICAgICAgICAgICAgICAiUmV2aXNhciBwb3NpYmxlIGluY3VtcGxpbWllbnRvIiwgIk5vIHNlIGRldGVjdGEgaW5jdW1wbGltaWVudG8iKQopCmtuaXRyOjprYWJsZShzdXB1ZXN0b3MsIHJvdy5uYW1lcyA9IEZBTFNFLAogIGNhcHRpb24gPSAiVGFibGEgMi4gRGlhZ27Ds3N0aWNvcyBjb24gbml2ZWwgZGUgcmVmZXJlbmNpYSAwLDA1LiIpCmBgYAoKKipJbnRlcnByZXRhY2nDs24gc2VuY2lsbGEuKiogQ29uIGVzdG9zIGRhdG9zLCBsYXMgdHJlcyBwcnVlYmFzIG5vIGRldGVjdGFuIHByb2JsZW1hcyBhbCBuaXZlbCBkZSAwLDA1LiBFc28gKipubyBkZW11ZXN0cmEqKiBub3JtYWxpZGFkIG5pIGlndWFsZGFkIGRlIHZhcmlhbnphcy4gQ29uIHNlaXMgcGFjaWVudGVzIHBvciBncnVwbywgbGFzIHBydWViYXMgcHVlZGVuIG5vIGRldGVjdGFyIGRlc3ZpYWNpb25lcyByZWxldmFudGVzLiBCYXJ0bGV0dCBlcyBlc3BlY2lhbG1lbnRlIHNlbnNpYmxlIGEgbGEgZmFsdGEgZGUgbm9ybWFsaWRhZDsgTGV2ZW5lIGNlbnRyYWRvIGVuIGxhIG1lZGlhbmEgZXMgbcOhcyByZXNpc3RlbnRlIGEgb2JzZXJ2YWNpb25lcyBleHRyZW1hcy4KCkxhIGluZGVwZW5kZW5jaWEgc2Ugc29zdGllbmUgZW4gZWwgZGlzZcOxbzogcGFjaWVudGVzIGRpc3RpbnRvcywgdW5hIG1vZGFsaWRhZCBwb3IgcGVyc29uYSB5IGF1c2VuY2lhIGRlIGluZmx1ZW5jaWFzIHJlbGV2YW50ZXMgZW50cmUgZWxsb3MuIE5pbmd1bmEgZGUgZXN0YXMgdHJlcyBwcnVlYmFzIGNvbmZpcm1hIGVzYSBjb25kaWNpw7NuLgoKYGBge3IgcXEtcmVzaWR1b3MsIGZpZy5jYXA9IkZpZ3VyYSAyLiBHcsOhZmljbyBRUSBkZSBsb3MgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MuIExhIGzDrW5lYSBlcyB1bmEgcmVmZXJlbmNpYSBwYXJhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbC4ifQpnZ3Bsb3QyOjpnZ3Bsb3QoZGlhZywgZ2dwbG90Mjo6YWVzKHNhbXBsZSA9IEVzdGFuZGFyaXphZG8pKSArCiAgZ2dwbG90Mjo6c3RhdF9xcShjb2xvdXIgPSAiIzE1OUE5NCIsIHNpemUgPSAyLjUpICsKICBnZ3Bsb3QyOjpzdGF0X3FxX2xpbmUoY29sb3VyID0gIiMxODMzNDkiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHRlbWEgKwogIGdncGxvdDI6OmxhYnModGl0bGUgPSAiwr9Mb3MgZXJyb3JlcyB0aWVuZW4gdW5hIGZvcm1hIGFwcm94aW1hZGFtZW50ZSBub3JtYWw/IiwKICAgIHN1YnRpdGxlID0gIlNlIGV2YWzDumFuIGxvcyByZXNpZHVvcywgbm8gbGEgbWV6Y2xhIGRlIGxvcyB0cmVzIHRyYXRhbWllbnRvcyIsCiAgICB4ID0gIkN1YW50aWxlcyBkZSByZWZlcmVuY2lhIG5vcm1hbCIsIHkgPSAiUmVzaWR1b3MgZXN0YW5kYXJpemFkb3MiKQpgYGAKCioqQ8OzbW8gbGVlcmxvLioqIFNpIGxvcyBwdW50b3Mgc2lndWVuIHJhem9uYWJsZW1lbnRlIGxhIGzDrW5lYSwgbGEgZm9ybWEgZGUgbG9zIHJlc2lkdW9zIGVzIGNvbXBhdGlibGUgY29uIGxhIG5vcm1hbGlkYWQuIEN1cnZhcyBwcm9udW5jaWFkYXMgbyBwdW50b3MgbXV5IGFsZWphZG9zIGVuIGxvcyBleHRyZW1vcyBzdWdpZXJlbiByZXZpc2FyIGVsIHN1cHVlc3RvLiBObyBlc3BlcmFtb3MgdW5hIGFsaW5lYWNpw7NuIHBlcmZlY3RhIGNvbiBzb2xvIDE4IG9ic2VydmFjaW9uZXMuIEVuIGVzdGUgZWplbXBsbywgU2hhcGlyb+KAk1dpbGsgYXBvcnRhIHAgPSBgciBmcChzaCRwLnZhbHVlKWAsIHNpbiBkZXRlY3RhciB1biBhbGVqYW1pZW50byBkZSBsYSBub3JtYWxpZGFkLgoKYGBge3IgcmVzaWR1b3MtYWp1c3RhZG9zLCBmaWcuY2FwPSJGaWd1cmEgMy4gUmVzaWR1b3MgcG9yIHZhbG9yIGFqdXN0YWRvLiBMYXMgdHJlcyBjb2x1bW5hcyBjb3JyZXNwb25kZW4gYSBsYXMgbWVkaWFzIGRlIGxhcyB0cmVzIG1vZGFsaWRhZGVzLiJ9CmdncGxvdDI6OmdncGxvdChkaWFnLCBnZ3Bsb3QyOjphZXMoQWp1c3RhZG8sIFJlc2lkdW8pKSArCiAgZ2dwbG90Mjo6Z2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3VyID0gIiM2Mzc1OEEiKSArCiAgZ2dwbG90Mjo6Z2VvbV9wb2ludChjb2xvdXIgPSAiIzUzNjlCMCIsIHNpemUgPSAyLjcpICsgdGVtYSArCiAgZ2dwbG90Mjo6bGFicyh0aXRsZSA9ICLCv0xhIHZhcmlhYmlsaWRhZCBjYW1iaWEgZW50cmUgbW9kYWxpZGFkZXM/IiwKICAgIHN1YnRpdGxlID0gIkJ1c2NhciBhbXBsaXR1ZGVzIHZlcnRpY2FsZXMgcGFyZWNpZGFzIHkgb2JzZXJ2YWNpb25lcyBtdXkgYWxlamFkYXMiLAogICAgeCA9ICJDb21wcmVuc2nDs24gbWVkaWEgZXN0aW1hZGEgcG9yIGVsIG1vZGVsbyIsIHkgPSAiUmVzaWR1byBlbiBwdW50b3MiKQpgYGAKCioqQ8OzbW8gbGVlcmxvLioqIExvcyByZXNpZHVvcyBkZWJlbiByZXBhcnRpcnNlIGFscmVkZWRvciBkZSBjZXJvIHkgcHJlc2VudGFyIHVuYSBhbXBsaXR1ZCB2ZXJ0aWNhbCByZWxhdGl2YW1lbnRlIHNlbWVqYW50ZS4gVW5hIGNvbHVtbmEgbXVjaG8gbcOhcyBleHRlbmRpZGEsIG8gdW4gcGF0csOzbiBkZSBhYmFuaWNvLCBzdWdlcmlyw61hIHZhcmlhbnphcyBkaXN0aW50YXMuIExhcyBjb2x1bW5hcyBzb24gbm9ybWFsZXMgZW4gZXN0ZSBncsOhZmljbzogY2FkYSBwYWNpZW50ZSBjb21wYXJ0ZSBlbCB2YWxvciBhanVzdGFkbyBjb24gbG9zIG90cm9zIGNpbmNvIGRlIHN1IHRyYXRhbWllbnRvLiBMb3MgcHVudG9zIGV4dHJlbW9zIGRlYmVuIHJldmlzYXJzZSBjb24gc3UgcmVnaXN0cm8gb3JpZ2luYWwsIHNpbiBlbGltaW5hcmxvcyBwYXJhIG9idGVuZXIgdW4gdmFsb3IgcCBmYXZvcmFibGUuCgojIFF1w6kgZGlmZXJlbmNpYXMgZGV0ZWN0w7MgZWwgYW7DoWxpc2lzCgojIyBMYSBjb21wYXJhY2nDs24gZ2xvYmFsCgpMYSBoaXDDs3Rlc2lzIG51bGEgZXN0YWJsZWNlIHF1ZSAqKmxhcyB0cmVzIG1lZGlhcyBzb24gaWd1YWxlcyoqLiBFbCBBTk9WQSBjb21wYXJhIGxhIHNlcGFyYWNpw7NuIGVudHJlIGxvcyBwcm9tZWRpb3MgY29uIGxhIHZhcmlhY2nDs24gZW50cmUgcGFjaWVudGVzIHF1ZSByZWNpYmllcm9uIGxhIG1pc21hIG1vZGFsaWRhZC4KCmBgYHtyIHRhYmxhLWFub3ZhfQp0YWJsYV9hbm92YSA8LSBkYXRhLmZyYW1lKAogIEZ1ZW50ZSA9IGMoIlRyYXRhbWllbnRvIiwgIkVycm9yIHJlc2lkdWFsIiksCiAgZ2wgPSBhbiREZiwKICBTQyA9IGFuJGBTdW0gU3FgLAogIENNID0gYW4kYE1lYW4gU3FgLAogIEYgPSBjKGZtdChhblsidHJhdGFtaWVudG8iLCAiRiB2YWx1ZSJdLCAzKSwgIuKAlCIpLAogIHAgPSBjKGZwKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSksICLigJQiKQopCmtuaXRyOjprYWJsZSh0YWJsYV9hbm92YSwgZGlnaXRzID0gMiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgY29sLm5hbWVzID0gYygiRnVlbnRlIiwgImdsIiwgIlN1bWEgZGUgY3VhZHJhZG9zIiwgIkN1YWRyYWRvIG1lZGlvIiwgIkYiLCAicCIpLAogIGNhcHRpb24gPSAiVGFibGEgMy4gQU5PVkEgZGUgdW5hIHbDrWEgcGFyYSBlbCBEQ0EuIikKYGBgCgpFbCByZXN1bHRhZG8gZ2xvYmFsIGluZGljYSBxdWUgYHIgaWYgKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSA8IGFscGhhKSAiaGF5IGV2aWRlbmNpYSBkZSBxdWUgYWwgbWVub3MgdW5hIG1lZGlhIGVzIGRpZmVyZW50ZSIgZWxzZSAibm8gaGF5IGV2aWRlbmNpYSBzdWZpY2llbnRlIHBhcmEgZGlzdGluZ3VpciBsYXMgbWVkaWFzImAuIE5vIGlkZW50aWZpY2EgcG9yIHPDrSBzb2xvIGN1w6FsIG1vZGFsaWRhZCBkaWZpZXJlIGRlIGN1w6FsLiBFbCB2YWxvciBwIHRhbXBvY28gZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBsYSBoaXDDs3Rlc2lzIG51bGEgc2VhIHZlcmRhZGVyYSBuaSBpbmRpY2EgY3XDoW50b3MgcHVudG9zIG1lam9yYSB1bmEgbW9kYWxpZGFkLgoKQ29tbyBjb21wbGVtZW50bywgb21lZ2EgY3VhZHJhZG8gZXMgYHIgZm10KG9tZWdhMiwgMylgLiBSZXN1bWUgbGEgbWFnbml0dWQgZGUgbGEgc2VwYXJhY2nDs24gZW50cmUgZ3J1cG9zIHJlc3BlY3RvIGEgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLCBjb24gdW5hIGNvcnJlY2Npw7NuIHBvciBlbCBlcnJvci4gTm8gZXMgdW4gcG9yY2VudGFqZSBkZSBwYWNpZW50ZXMgYmVuZWZpY2lhZG9zIHksIGVuIGVzdG9zIGRhdG9zIGludmVudGFkb3MsIG5vIGNvbnN0aXR1eWUgdW5hIGVzdGltYWNpw7NuIGRlIGVmaWNhY2lhIGNsw61uaWNhLgoKIyMgTGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgbW9kYWxpZGFkZXMKClNlIGFwbGljYSBUdWtleSBwYXJhIGNvbXBhcmFyIGxvcyB0cmVzIHBhcmVzIG1hbnRlbmllbmRvIHVuYSBjb2JlcnR1cmEgc2ltdWx0w6FuZWEgZGVsIDk1ICUgcGFyYSBzdXMgaW50ZXJ2YWxvcyBiYWpvIGVsIG1vZGVsby4KCmBgYHtyIHRhYmxhLXR1a2V5fQp0YWJsYV90dWtleSA8LSBjb21wYXJhY2lvbmVzCnRhYmxhX3R1a2V5JHBfYWp1c3RhZG8gPC0gZnAodGFibGFfdHVrZXkkcF9hanVzdGFkbykKa25pdHI6OmthYmxlKHRhYmxhX3R1a2V5LCBkaWdpdHMgPSAyLCByb3cubmFtZXMgPSBGQUxTRSwKICBjb2wubmFtZXMgPSBjKCJDb21wYXJhY2nDs24iLCAiRGlmZXJlbmNpYSIsICJMw61taXRlIGluZmVyaW9yIiwgIkzDrW1pdGUgc3VwZXJpb3IiLCAicCBhanVzdGFkbyIsICJMZWN0dXJhIiksCiAgY2FwdGlvbiA9ICJUYWJsYSA0LiBEaWZlcmVuY2lhcyBkZSBjb21wcmVuc2nDs24gZW4gcHVudG9zLiBUMuKAk1QxIHNpZ25pZmljYSBUMiBtZW5vcyBUMS4iKQpgYGAKCmBgYHtyIGludGVydmFsb3MtdHVrZXksIGZpZy5jYXA9IkZpZ3VyYSA0LiBEaWZlcmVuY2lhcyBkZSBtZWRpYXMgZSBpbnRlcnZhbG9zIHNpbXVsdMOhbmVvcyBkZWwgOTUgJSBkZSBUdWtleS4gTGEgbMOtbmVhIHZlcnRpY2FsIGluZGljYSBkaWZlcmVuY2lhIGNlcm8uIn0KZ2dwbG90Mjo6Z2dwbG90KGNvbXBhcmFjaW9uZXMsIGdncGxvdDI6OmFlcyh4ID0gQ29tcGFyYWNpb24sIHkgPSBEaWZlcmVuY2lhKSkgKwogIGdncGxvdDI6Omdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG91ciA9ICIjNjM3NThBIikgKwogIGdncGxvdDI6Omdlb21fZXJyb3JiYXIoZ2dwbG90Mjo6YWVzKHltaW4gPSBMSSwgeW1heCA9IExTKSwKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAwLjE0LCBjb2xvdXIgPSAiIzExN0U3OSIsIGxpbmV3aWR0aCA9IDAuODUpICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KHNpemUgPSAzLjUsIGNvbG91ciA9ICIjMTgzMzQ5IikgKwogIGdncGxvdDI6OmNvb3JkX2ZsaXAoKSArIHRlbWEgKwogIGdncGxvdDI6OmxhYnModGl0bGUgPSAiQ3XDoW50byBkaWZpZXJlbiBsb3MgdHJhdGFtaWVudG9zIHkgY29uIHF1w6kgaW5jZXJ0aWR1bWJyZSIsCiAgICBzdWJ0aXRsZSA9ICJJbnRlcnZhbG9zIGFqdXN0YWRvcyBwYXJhIGxhcyB0cmVzIGNvbXBhcmFjaW9uZXMiLAogICAgeCA9IE5VTEwsIHkgPSAiRGlmZXJlbmNpYSBkZSBjb21wcmVuc2nDs24gZW4gcHVudG9zIikKYGBgCgoqKkPDs21vIGxlZXJsby4qKiBFbCBwdW50byByZXByZXNlbnRhIGxhIGRpZmVyZW5jaWEgZW50cmUgcHJvbWVkaW9zIHkgbGEgbMOtbmVhIGhvcml6b250YWwgbXVlc3RyYSBzdSBpbnRlcnZhbG8uIFNpIHRvZG8gZWwgaW50ZXJ2YWxvIHF1ZWRhIHBvciBlbmNpbWEgZGUgY2VybywgbGEgcHJpbWVyYSBtb2RhbGlkYWQgdGllbmUgdW5hIG1lZGlhIG1heW9yIHF1ZSBsYSBzZWd1bmRhIGJham8gZXN0ZSBhbsOhbGlzaXMuIFNpIGVsIGludGVydmFsbyBjcnV6YSBjZXJvLCBsYSBtdWVzdHJhIG5vIHBlcm1pdGUgZGlzdGluZ3VpciBlc2UgcGFyIGFsIG5pdmVsIGVsZWdpZG8uCgoqKlQyIGZyZW50ZSBhIFQxOioqIGxhIGRpZmVyZW5jaWEgZXMgZGUgYHIgZm10KHR1WyJUMi1UMSIsICJkaWZmIl0pYCBwdW50b3MsIGNvbiBpbnRlcnZhbG8gZGUgYHIgZm10KHR1WyJUMi1UMSIsICJsd3IiXSlgIGEgYHIgZm10KHR1WyJUMi1UMSIsICJ1cHIiXSlgLiBgciBpZiAodHVbIlQyLVQxIiwgInAgYWRqIl0gPCBhbHBoYSkgIlNlIGRldGVjdGEgdW5hIGRpZmVyZW5jaWEgZmF2b3JhYmxlIGEgVDIgZW4gZXN0b3MgZGF0b3MuIiBlbHNlICJObyBzZSBkZXRlY3RhIHVuYSBkaWZlcmVuY2lhIGVuIGVzdG9zIGRhdG9zLiJgCgoqKlQzIGZyZW50ZSBhIFQxOioqIGxhIGRpZmVyZW5jaWEgZXMgZGUgYHIgZm10KHR1WyJUMy1UMSIsICJkaWZmIl0pYCBwdW50b3MsIGNvbiBpbnRlcnZhbG8gZGUgYHIgZm10KHR1WyJUMy1UMSIsICJsd3IiXSlgIGEgYHIgZm10KHR1WyJUMy1UMSIsICJ1cHIiXSlgLiBgciBpZiAodHVbIlQzLVQxIiwgInAgYWRqIl0gPCBhbHBoYSkgIlNlIGRldGVjdGEgdW5hIGRpZmVyZW5jaWEgZmF2b3JhYmxlIGEgVDMgZW4gZXN0b3MgZGF0b3MuIiBlbHNlICJObyBzZSBkZXRlY3RhIHVuYSBkaWZlcmVuY2lhIGVuIGVzdG9zIGRhdG9zLiJgCgoqKlQzIGZyZW50ZSBhIFQyOioqIGxhIGRpZmVyZW5jaWEgZXMgZGUgYHIgZm10KHR1WyJUMy1UMiIsICJkaWZmIl0pYCBwdW50b3MsIGNvbiBpbnRlcnZhbG8gZGUgYHIgZm10KHR1WyJUMy1UMiIsICJsd3IiXSlgIGEgYHIgZm10KHR1WyJUMy1UMiIsICJ1cHIiXSlgLiBgciBpZiAodHVbIlQzLVQyIiwgInAgYWRqIl0gPCBhbHBoYSkgIlNlIGRldGVjdGEgdW5hIGRpZmVyZW5jaWEgZW50cmUgYW1iYXMgbW9kYWxpZGFkZXMuIiBlbHNlICJObyBoYXkgZXZpZGVuY2lhIHN1ZmljaWVudGUgcGFyYSBkaXN0aW5ndWlybGFzLiBFc3RvIG5vIGRlbXVlc3RyYSBxdWUgc2VhbiBlcXVpdmFsZW50ZXMuImAKCiMgUXXDqSBvY3VycmUgY29uIG90cmFzIGZvcm1hcyBkZSBhbmFsaXphcgoKV2VsY2ggc2UgaW5jbHV5ZSBjb21vIHNlbnNpYmlsaWRhZCBhbnRlIHZhcmlhbnphcyBkaWZlcmVudGVzLiBLcnVza2Fs4oCTV2FsbGlzIHV0aWxpemEgcmFuZ29zIHkgY29tcGFyYSBkaXN0cmlidWNpb25lczsgc3UgaW50ZXJwcmV0YWNpw7NuIGNvbW8gZGlmZXJlbmNpYSBkZSBsb2NhbGl6YWNpw7NuIHJlcXVpZXJlIGZvcm1hcyB5IGRpc3BlcnNpb25lcyBzZW1lamFudGVzLiBObyBzb24gcHJ1ZWJhcyBpbnRlcmNhbWJpYWJsZXMgbmkgc2UgZWxpZ2UgbGEgcXVlIHByb2R1Y2UgZWwgbWVub3IgdmFsb3IgcC4KCmBgYHtyIHNlbnNpYmlsaWRhZH0Kc2Vuc2liaWxpZGFkIDwtIGRhdGEuZnJhbWUoCiAgTWV0b2RvID0gYygiQU5PVkEgY2zDoXNpY28iLCAiQU5PVkEgZGUgV2VsY2giLCAiS3J1c2thbOKAk1dhbGxpcyIpLAogIEVuZm9xdWUgPSBjKCJJZ3VhbGRhZCBkZSBtZWRpYXMgY29uIHZhcmlhbnphIGNvbcO6biIsCiAgICAgICAgICAgICAgIklndWFsZGFkIGRlIG1lZGlhcyBwZXJtaXRpZW5kbyB2YXJpYW56YXMgZGlmZXJlbnRlcyIsCiAgICAgICAgICAgICAgIkNvbXBhcmFjacOzbiBwb3IgcmFuZ29zIGVudHJlIGdydXBvcyBpbmRlcGVuZGllbnRlcyIpLAogIHAgPSBjKGZwKGFuWyJ0cmF0YW1pZW50byIsICJQcig+RikiXSksIGZwKHdlJHAudmFsdWUpLCBmcChrdyRwLnZhbHVlKSkKKQprbml0cjo6a2FibGUoc2Vuc2liaWxpZGFkLCByb3cubmFtZXMgPSBGQUxTRSwKICBjYXB0aW9uID0gIlRhYmxhIDUuIEFuw6FsaXNpcyBkZSBzZW5zaWJpbGlkYWQ7IG5vIGNvbnN0aXR1eWVuIGVzdHVkaW9zIGluZGVwZW5kaWVudGVzLiIpCmBgYAoKRW4gZWwgZWplbXBsbywgbGFzIHRyZXMgcHJ1ZWJhcyBnbG9iYWxlcyBkZXRlY3RhbiBkaWZlcmVuY2lhcy4gRXN0byBtdWVzdHJhIGNvbnNpc3RlbmNpYSBkZXNjcmlwdGl2YSBmcmVudGUgYSBkaXN0aW50b3MgZW5mb3F1ZXMsIHBlcm8gbm8gY29ycmlnZSBsaW1pdGFjaW9uZXMgZGVsIGRpc2XDsW8gbmkgdmFsaWRhIGRhdG9zIHNpbXVsYWRvcy4gTG9zIHJlc3VsdGFkb3MgcG9yIHBhcmVzIHB1ZWRlbiBkaWZlcmlyIGVudHJlIG3DqXRvZG9zLCBlc3BlY2lhbG1lbnRlIGNvbiBzZWlzIHBlcnNvbmFzIHBvciBncnVwby4KCiMgUXXDqSBwb2RlbW9zIGNvbmNsdWlyCgpFbiBlc3RvcyBkYXRvcyBmaWN0aWNpb3MsICoqbG9zIGZvcm1hdG9zIGNvbiBpbmZvZ3JhZsOtYXMgcHJlc2VudGFuIG1heW9yIGNvbXByZW5zacOzbiBwcm9tZWRpbyBxdWUgZWwgZm9ybWF0byB0ZXh0dWFsIHRyYWRpY2lvbmFsKiouIEVsIGZvcm1hdG8gZGlnaXRhbCB0aWVuZSBlbCBwcm9tZWRpbyBtw6FzIGFsdG8sIHBlcm8gVHVrZXkgbm8gYXBvcnRhIGV2aWRlbmNpYSBzdWZpY2llbnRlIHBhcmEgYWZpcm1hciBxdWUgc3VwZXJhIGFsIGRvY3VtZW50byBpbXByZXNvIGNvbiBpbmZvZ3JhZsOtYXMuCgpMYSBwcmVndW50YSBjbMOtbmljYSByZWFsIGV4aWdlIG3DoXM6IHVuYSBtdWVzdHJhIGNhbGN1bGFkYSwgdW4gaW5zdHJ1bWVudG8gdsOhbGlkbyBwYXJhIGVsIGNvbnRleHRvLCBjb250ZW5pZG8gY2zDrW5pY28gZXF1aXZhbGVudGUsIG9wb3J0dW5pZGFkIGRlIHByZWd1bnRhciB5IGV2YWx1YWNpw7NuIGVuIGNvbmRpY2lvbmVzIGNvbXBhcmFibGVzLiBMYSBzaWduaWZpY2FjacOzbiBlc3RhZMOtc3RpY2Egbm8gZGV0ZXJtaW5hIHBvciBzw60gc29sYSBzaSB1bmEgZGlmZXJlbmNpYSBlcyBpbXBvcnRhbnRlIHBhcmEgbGEgcHLDoWN0aWNhLgoKVDMgY29tYmluYSBmb3JtYXRvIGRpZ2l0YWwsIGluZm9ncmFmw61hcyB5IGZpcm1hIGVsZWN0csOzbmljYTsgZWwgZXhwZXJpbWVudG8gY29tcGFyYSBlbCBwYXF1ZXRlIGNvbXBsZXRvIHkgKipubyBhw61zbGEgZWwgZWZlY3RvIGRlIGxhIGZpcm1hKiouIEVsIGNvbnNlbnRpbWllbnRvIHRhbXBvY28gcXVlZGEgcmVkdWNpZG8gYSB1biBmb3JtdWxhcmlvOiBlbiB0b2RvcyBsb3MgZ3J1cG9zIGRlYmUgbWFudGVuZXJzZSB1biBwcm9jZXNvIGRlIGluZm9ybWFjacOzbiB5IGFjbGFyYWNpw7NuIGRlIGR1ZGFzIGFkZWN1YWRvLgoKIyBEZXRhbGxlcyB5IHJlcHJvZHVjaWJpbGlkYWQKCjxkZXRhaWxzPgo8c3VtbWFyeT5WZXIgbGFzIDE4IG9ic2VydmFjaW9uZXMgYW5hbGl6YWRhczwvc3VtbWFyeT4KCmBgYHtyIGRhdG9zLWNvbXBsZXRvc30Ka25pdHI6OmthYmxlKGRhdG9zX2RjYSwgcm93Lm5hbWVzID0gRkFMU0UsCiAgY29sLm5hbWVzID0gYygiUGFjaWVudGUiLCAiVHJhdGFtaWVudG8iLCAiQ29tcHJlbnNpw7NuIikpCmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+CjxzdW1tYXJ5PlZlciBsYXMgY29tcGFyYWNpb25lcyBhZGljaW9uYWxlcyBkZSBzZW5zaWJpbGlkYWQ8L3N1bW1hcnk+CgpMb3MgaW50ZXJ2YWxvcyBzaWd1aWVudGVzIHVzYW4gQm9uZmVycm9uaSBwYXJhIGNvYmVydHVyYSBjb25qdW50YSBkZSBhbCBtZW5vcyA5NSAlOyBsb3MgdmFsb3JlcyBwIHNlIGFqdXN0YW4gY29uIEhvbG0uIExvcyBkb3MgYWp1c3RlcyBzb24gZGlzdGludG9zIHkgZXN0w6FuIGlkZW50aWZpY2Fkb3MgcG9yIHNlcGFyYWRvLgoKYGBge3IgcG9zdGhvYy1zZW5zaWJpbGlkYWR9CnBvc3Rfd2VfdGFibGEgPC0gcG9zdF93ZVssIGMoIkNvbXBhcmFjaW9uIiwgIkRpZmVyZW5jaWEiLCAiTElfQm9uZmVycm9uaSIsICJMU19Cb25mZXJyb25pIiwgInBfSG9sbSIpXQpwb3N0X3dlX3RhYmxhJHBfSG9sbSA8LSBmcChwb3N0X3dlX3RhYmxhJHBfSG9sbSkKa25pdHI6OmthYmxlKHBvc3Rfd2VfdGFibGEsIGRpZ2l0cyA9IDIsIHJvdy5uYW1lcyA9IEZBTFNFLAogIGNhcHRpb24gPSAiQ29tcGFyYWNpb25lcyB0IGRlIFdlbGNoOiBpbnRlcnZhbG9zIEJvbmZlcnJvbmkgeSBwIGRlIEhvbG0uIikKYGBgCgpMYXMgY29tcGFyYWNpb25lcyBwb3IgcmFuZ29zIHNvbiBNYW5u4oCTV2hpdG5leSBjb24gYWp1c3RlIEhvbG0sIG5vIGVsIHByb2NlZGltaWVudG8gZGUgRHVubi4gU2UgZW1wbGVhIGFwcm94aW1hY2nDs24gbm9ybWFsIHBhcmEgYWRtaXRpciBlbXBhdGVzOyBzdXMgdmFsb3JlcyBwIHJlcXVpZXJlbiBjYXV0ZWxhIGNvbiBtdWVzdHJhcyBwZXF1ZcOxYXMuCgpgYGB7ciBwYXJlcy1yYW5nb3N9CnByaW50KHBvc3Rfa3cpCmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+CjxzdW1tYXJ5PlZlciBvYnNlcnZhY2lvbmVzIHBvdGVuY2lhbG1lbnRlIGluZmx1eWVudGVzPC9zdW1tYXJ5PgoKTGEgZGlzdGFuY2lhIGRlIENvb2sgYXl1ZGEgYSBpZGVudGlmaWNhciBxdcOpIG9ic2VydmFjaW9uZXMgcG9kcsOtYW4gY2FtYmlhciBtw6FzIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLiBMYSByZWZlcmVuY2lhIDQvbiBlcyBvcmllbnRhdGl2YTogbm8gZXMgdW5hIHJlZ2xhIGF1dG9tw6F0aWNhIHBhcmEgYm9ycmFyIHBhY2llbnRlcy4gUHJpbWVybyBkZWJlIGNvbXByb2JhcnNlIGxhIGNhbGlkYWQgZGVsIHJlZ2lzdHJvIHkgbGEgc2Vuc2liaWxpZGFkIGRlbCByZXN1bHRhZG8uCgpgYGB7ciBpbmZsdWVuY2lhfQppbmZsdWVuY2lhIDwtIGRhdGEuZnJhbWUoUGFjaWVudGUgPSBkYXRvc19kY2EkcGFjaWVudGUsCiAgUmVzaWR1b19lc3RhbmRhcml6YWRvID0gZGlhZyRFc3RhbmRhcml6YWRvLCBDb29rID0gZGlhZyRDb29rLAogIFJldmlzYXIgPSBpZmVsc2UoZGlhZyRDb29rID4gNCAvIG5yb3coZGF0b3NfZGNhKSwgIlJldmlzYXIgcmVnaXN0cm8iLCAiU2luIHNlw7FhbCBzZWfDum4gZXN0YSByZWZlcmVuY2lhIikpCmtuaXRyOjprYWJsZShpbmZsdWVuY2lhW29yZGVyKC1pbmZsdWVuY2lhJENvb2spLCBdLCBkaWdpdHMgPSAzLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KPHN1bW1hcnk+VmVyIGNvbmZpZ3VyYWNpw7NuIGRlIFIgeSBwYXF1ZXRlczwvc3VtbWFyeT4KCmBgYHtyIHNlc2lvbn0Kc2Vzc2lvbkluZm8oKQpgYGAKCjwvZGV0YWlscz4KCkVzdGUgaW5mb3JtZSBzZSBlbGFib3LDsyBhIHBhcnRpciBkZSAqKkFuYWxpc2lzX0RDQV9Db25zZW50aW1pZW50by5SKiosIGNvbnNlcnZhbmRvIHN1cyAxOCByZWdpc3Ryb3MsIEFOT1ZBLCBwcnVlYmFzIGRlIHN1cHVlc3RvcyB5IGFuw6FsaXNpcyBkZSBzZW5zaWJpbGlkYWQuIExvcyByZXN1bHRhZG9zIHkgZmlndXJhcyBzZSByZWNhbGN1bGFuIGFsIGVqZWN1dGFyICoqS25pdCoqOyBlbCBhcmNoaXZvIG5vIG5lY2VzaXRhIGNvbmVjdGFyc2UgY29uIGVsIHNjcmlwdCBvcmlnaW5hbCBuaSBjb24gdW5hIGJhc2UgZXh0ZXJuYS4gRWwgY8OzZGlnbyBjb21wbGV0byBwdWVkZSBjb25zdWx0YXJzZSBjb24gbGEgb3BjacOzbiBkZSBkZXNjYXJnYSBkZWwgZG9jdW1lbnRvIEhUTUwgbyBhYnJpZW5kbyBlc3RlIGFyY2hpdm8gYC5ybWRgLgo=