librerías
Leyendo la Base de datos
Actividad 1
Evalúe el efecto de la exposición a tabaquismo, sobre la relación entre tabaquismo y el desarrollo de cáncer. Los autores suponen que la exposición a asbesto puede interactuar con el tabaquismo.
Las variables están codificadas como 0: ausencia, 1: Presencia
1.1 Análisis estratificado de Mantel-Haenszel
Odds Ratio Crudo para tabaquismo y cáncer de pulmón
En la explicación del comando de epi.2by2 en “R”, en el Ejemplo 2 se indica iniciar fijando el desenlace y la exposición como factores y estableciendo los niveles de las mismas para que las frecuencias en la tabla 2x2 se presenten en el formato convencional:
LungCA
Smoke 1 0
1 80 100
0 15 90
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio 4.80 (2.58, 8.93)
Attrib fraction (est) in the exposed (%) 79.06 (60.15, 89.57)
Attrib fraction (est) in the population (%) 66.67 (45.70, 79.54)
-------------------------------------------------------------------
Uncorrected chi2 test that OR = 1: chi2(1) = 27.143 Pr>chi2 = <0.001
Fisher exact test that OR = 1: Pr>chi2 = <0.001
Wald confidence limits
CI: confidence interval
* Outcomes per 100 population units
Measures of association strength:
The exposure odds among cases was 4.8 (95% CI 2.58 to 8.93) times greater than exposure odds among controls.
Measures of effect in the exposed:
79.1% of outcomes in the exposed were attributable to exposure (95% CI 60.1% to 89.6%).
Measures of effect in the population:
66.7% of outcomes in the population were attributable to exposure (95% CI 45.7% to 79.5%).
Medidas de fuerza de asociación:
Odds de CA para los fumadores: 80/100 = 0.8 Odds de CA para no fumadores: 15/90 = 0.167 Odds Ratio: (80/100)/(15/90) = 4.8
El odds de CA de pulmonar en los pacientes fumadores es 4.8 veces el odds de CA pulmonar en los paciente que no son fumadores (95% CI 2.58 to 8.93).
Odds Ratio Cruda asbesto y cáncer de pulmón
LungCA
Asbestos 1 0
1 80 38
0 15 152
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio 21.33 (11.07, 41.12)
Attrib fraction (est) in the exposed (%) 95.24 (90.60, 97.72)
Attrib fraction (est) in the population (%) 80.26 (68.43, 87.66)
-------------------------------------------------------------------
Uncorrected chi2 test that OR = 1: chi2(1) = 107.631 Pr>chi2 = <0.001
Fisher exact test that OR = 1: Pr>chi2 = <0.001
Wald confidence limits
CI: confidence interval
* Outcomes per 100 population units
Measures of association strength:
The exposure odds among cases was 21.33 (95% CI 11.07 to 41.12) times greater than exposure odds among controls.
Measures of effect in the exposed:
95.2% of outcomes in the exposed were attributable to exposure (95% CI 90.6% to 97.7%).
Measures of effect in the population:
80.3% of outcomes in the population were attributable to exposure (95% CI 68.4% to 87.7%).
Medidas de fuerza de asociación:
Odds de expuestos a asbeto frente al CA: 80/38 = 2.1053 Odds de no expuestos a asbesto frente al CA: 15/152 = 0.0987 Odds ratio: (80/38)/(15/152) = 21.3333
El odds de CA de pulmonar en los pacientes con exposición a asbestos es de 21.33 veces el odds de CA pulmonar de los pacientes sin exposición a asbestos (95% CI 11.07 to 41.12).
Tabla de contingencia estratificada a la exposición o no a asbestos
, , ASBESTOS = 1
LUNGCA
SMOKE 1 0
1 75 20
0 5 18
, , ASBESTOS = 0
LUNGCA
SMOKE 1 0
1 5 80
0 10 72
Resultados de los Odds Ratio por niveles de la covariable
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio (crude) 4.80 (2.58, 8.93)
Odds ratio (M-H) 2.41 (1.25, 4.66)
Odds ratio (crude:M-H) 1.99
Attrib fraction (est) in the exposed (%) 0.79 (0.61, 0.89)
Attrib fraction (est) in the population (%) * 0.67 (0.58, 0.79)
-------------------------------------------------------------------
Woolf test of homogeneity of ORs: chi2(1) = 17.765 Pr>chi2 = <0.001
Test that M-H adjusted OR = 1: chi2(1) = 8.434 Pr>chi2 = 0.002
Wald confidence limits
M-H: Mantel-Haenszel; CI: confidence interval
* Outcomes per 100 population units
Measures of association strength:
If we don't account for confounding exposure odds among cases was 4.8 (95% CI 2.58 to 8.93) times greater than the exposure odds among controls. After accounting for confounding exposure odds among cases was 2.41 (95% CI 1.25 to 4.66) times greater than the exposure odds among controls.
Measures of effect in the exposed:
79.2% of outcomes in the exposed were attributable to exposure (95% CI 61.5% to 88.7%).
Measures of effect in the population:
66.7% of outcomes in the population were attributable to exposure (95% CI 58.5% to 78.9%).
Según los resultados anteriores, ¿Considera que hay homogeneidad o heterogeneidad de los efectos para la relación entre tabaquismo y ca de pulmón? ¿Qué tipo de interacción se presenta: cuantitativa o cualitativa? Explique.
Odds ratio (crude) 4.80 (2.58, 8.93) Odds ratio (M-H) 2.41 (1.25, 4.66)
El asbesto en este caso se comporta como un factor de interacción y no se busca controlar, sino que se debe evidenciar y reportar. La relación entre el consumo de cigarrillo y la exposición a asbesto es de interacción porque este último no tiene relación con el primero.
Existe heterogeneidad de los efectos de la covariable porque los OR son diferentes entre los estratos (exposición o no a asbestos): * Si se tiene en cuenta el asbesto como factor de en cuenta el asbesto (factor de interacción), el odds de CA pulmonar en los fumadores es 4.8 (95% CI 2.58 a 8.93) el odds de CA de pulmón en los no fumadores.
* Si no se tiene en cuenta el asbesto, el odds de CA de pulmón en los fumadores es 2.41 (95% CI 1.25 a 4.66) el odds de CA pulmonar en los no fumadores.
Dicha interacción es cuantitativa pues ambos OR estan en la misma dirección en cada estrato de la variable modificadora, en este caso ambos son mayor que 1. Además se considera una interacción cuantitativa-positiva, ya que la presencia de la variable de exposición a asbestos aumenta el efecto de la exposición al cigarrillo, es decir estas variables tienen una relación sineérgica.
1.2 Resultados del análisis de Mantel Haneszel. Test de homogeneidad y test de M-H OR=1.
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio (crude) 4.80 (2.58, 8.93)
Odds ratio (M-H) 2.41 (1.25, 4.66)
Odds ratio (crude:M-H) 1.99
Attrib fraction (est) in the exposed (%) 0.79 (0.61, 0.89)
Attrib fraction (est) in the population (%) * 0.67 (0.58, 0.79)
-------------------------------------------------------------------
Woolf test of homogeneity of ORs: chi2(1) = 17.765 Pr>chi2 = <0.001
Test that M-H adjusted OR = 1: chi2(1) = 8.434 Pr>chi2 = 0.002
Wald confidence limits
M-H: Mantel-Haenszel; CI: confidence interval
* Outcomes per 100 population units
Measures of association strength:
If we don't account for confounding exposure odds among cases was 4.8 (95% CI 2.58 to 8.93) times greater than the exposure odds among controls. After accounting for confounding exposure odds among cases was 2.41 (95% CI 1.25 to 4.66) times greater than the exposure odds among controls.
Measures of effect in the exposed:
79.2% of outcomes in the exposed were attributable to exposure (95% CI 61.5% to 88.7%).
Measures of effect in the population:
66.7% of outcomes in the population were attributable to exposure (95% CI 58.5% to 78.9%).
1.2.1. Desde el enfoque de la significación estadística, asumiendo un alfa =0.05 para el error tipo I, ¿qué sugiere el test de homogeneidad de Woolf?
El test Chi2 de Woolf arroja un resultado de 17.76 con una nivel p < 0.001. Desde el enfoque de significación estadística indica que se rechaza la H0 de homogeneidad entre los OR de los estratos y sugiere heterogeneidad, lo que confirma lo anotado anteriormente según el valor del OR.
1.2.3. ¿En que condiciones se puede presentar este resultado (Odds ratio (M-H)?
El resultado del OR (M-H) se puede presentar cuándo se desea ajustar una variable de confusión, cuándo en el análisis por factores hay homogeneidad entre los OR, cuándo la variable de confusión no está en la cadena causal y cuándo no hay colinealidad.
1.2.4. Desde el enfoque de la significación estadística, asumiendo un alfa =0.05 para el error tipo I, ¿qué sugiere el test de Mantel-Hanenszel para el OR ajustado bajo hipótesis nula de 1?
Ho: El OR ajustado es igual 1 H1: El OR ajustado es diferente de 1 (Dos colas)
Desde el enfoque de significación estadística, un valor de asumiendo un alfa =0.05 para el error tipo I, se puede indicar que el cumplimiento de p < 0.05 rechaza Ho a favor de H1, indicando heterogeneidad entre los OR ajustados.
Para nuestro caso se arrojo: Test that M-H adjusted OR = 1: chi2(1) = 8.434 Pr>chi2 = 0.002. Como valor-P=0.002, concluimos que el OR ajustado para los expuestos a asbesto es diferente al OR ajustado para los no expuestos a asbesto.
Actividad 2
Con base en la información del estudio de bajo peso al nacer evalúe si para la relación consumo de tabaco durante el embarazo y el bajo peso al nacer, se presenta interacción positiva o negativa, teniendo en cuenta si la madre está o no casada (mmarried), y si la madre es o no extranjera (foreign: 0 Americana, 1 Latina).
Generación de etiquetas en las variables
bweight mmarried mhisp
Min. : 340 notmarried:1394 No-Madre Latina:4484
1st Qu.:3033 married :3248 Madre Latina : 158
Median :3390
Mean :3362
3rd Qu.:3725
Max. :5500
fhisp foreign alcohol
nofhisp:4470 noforeign:4394 noalcohol:4492
fhisp : 172 foreign : 248 alcohol : 150
deadkids mage medu
nodeadkids:3438 Min. :13.0 Min. : 0.0
deadkids :1204 1st Qu.:22.0 1st Qu.:12.0
Median :26.0 Median :12.0
Mean :26.5 Mean :12.7
3rd Qu.:30.0 3rd Qu.:14.0
Max. :45.0 Max. :17.0
fage fedu nprenatal
Min. : 0.0 Min. : 0.0 Min. : 0.0
1st Qu.:24.0 1st Qu.:12.0 1st Qu.: 9.0
Median :28.0 Median :12.0 Median :11.0
Mean :27.3 Mean :12.3 Mean :10.8
3rd Qu.:33.0 3rd Qu.:14.0 3rd Qu.:13.0
Max. :60.0 Max. :17.0 Max. :40.0
monthslb order
Min. : 0.0 Min. : 0.00
1st Qu.: 0.0 1st Qu.: 1.00
Median : 13.0 Median : 2.00
Mean : 23.1 Mean : 1.89
3rd Qu.: 35.0 3rd Qu.: 2.00
Max. :272.0 Max. :12.00
msmoke mbsmoke
0 cigarettes daily :3778 nonsmoker:3778
1-5 cigarettes daily : 200 smoker : 864
6-10 cigarettes daily : 337
11 or more cigarettes daily: 327
mrace frace prenatal birthmonth
other : 740 other : 865 0: 70 6 : 455
mwhite:3902 fwhite:3777 1:3720 8 : 443
2: 697 9 : 404
3: 155 3 : 393
7 : 388
5 : 386
(Other):2173
lbweight fbaby prenatal1
nolbw:4362 no :2609 Min. :0.000
lbw : 280 firstbaby:2033 1st Qu.:1.000
Median :1.000
Mean :0.801
3rd Qu.:1.000
Max. :1.000
2.1 Interacción con estado civil (mmarried): Madre casada o no.
2.1.1 Tabla estratificada
, , Married = notmarried
Low BW
Smoke lbw nolbw
smoker 55 400
nonsmoker 85 854
, , Married = married
Low BW
Smoke lbw nolbw
smoker 40 369
nonsmoker 100 2739
2.1.2 Evaluación de la homogeneidad o heterogeneidad de los efectos
Resultados M-H
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio (crude) 2.40 (1.85, 3.11)
Odds ratio (M-H) 1.89 (1.45, 2.46)
Odds ratio (crude:M-H) 1.27
Attrib fraction (est) in the exposed (%) 0.58 (0.46, 0.68)
Attrib fraction (est) in the population (%) * 0.20 (0.18, 0.22)
-------------------------------------------------------------------
Woolf test of homogeneity of ORs: chi2(1) = 8.315 Pr>chi2 = 0.004
Test that M-H adjusted OR = 1: chi2(1) = 23.630 Pr>chi2 = <0.001
Wald confidence limits
M-H: Mantel-Haenszel; CI: confidence interval
* Outcomes per 100 population units
Measures of association strength:
If we don't account for confounding exposure odds among cases was 2.4 (95% CI 1.85 to 3.11) times greater than the exposure odds among controls. After accounting for confounding exposure odds among cases was 1.89 (95% CI 1.45 to 2.46) times greater than the exposure odds among controls.
Measures of effect in the exposed:
58.3% of outcomes in the exposed were attributable to exposure (95% CI 46% to 67.8%).
Measures of effect in the population:
19.8% of outcomes in the population were attributable to exposure (95% CI 17.9% to 22.5%).
2.1.3 Según los resultados anteriores, ¿considera que hay homogeneidad o heterogeneidad de los efectos para la relación tabaquismo y bajo peso al nacer? ¿Qué tipo de interacción se presenta: cuantitativa o cualitativa? Explique
Al evaluar los OR estratificados por el estado civil se puede interpretar que entre los pacientes solteros (notmarried) y con hábito de fumar, el odds de desarrollar bajo peso al nacer es de 1.38 veces el odds desarrollar bajo peso al nacer en pacientes no fumadores, sin embargo, este mismo OR tiene un IC que atraviesa la unidad y por lo tanto no es posible interpretar adecuadamente la relacion de interacción entre las variables. Por otra parte, en paciente casados (marrried) con hábito de fumar, el odds de desarrollar bajo peso al nacer es de 2.96 veces el odds desarrollar bajo peso al nacer en pacientes no fumadores (95% CI 2.02 a 4.35). En este caso el IC no cruza la unidad.
Dichos OR por estratos muestran amplia diferencia, lo que indica heterogeneidad. Además, como ya se dijo uno de los OR cruza la unidad y en el otro si se muestra una asociación cambiando la dirección, por tanto se habla de una interacción cualitativa.
2.1.4 Desde el enfoque de la significación estadística, asumiendo un alfa =0.05 para el error tipo I, ¿qué sugiere el test de homogeneidad de Woolf? ¿Está de acuerdo con la decisión estadística desde este enfoque?
El test Chi2 de Woolf arroja un resultado de 23.53 con una nivel p < 0.001. Desde el enfoque de significación estadística indica que se rechaza la H0 de homogeneidad entre los OR de los estratos y sugiere heterogeneidad, lo que confirma lo anotado anteriormente según el valor del OR.
2.1.5 Desde el enfoque de la significación estadística, asumiendo un alfa =0.05 para el error tipo I, ¿qué sugiere el test de Mantel-Haenszel para el OR ajustado bajo hipótesis nula de 1?
Ho: El OR ajustado es igual 1 H1: El OR ajustado es diferente de 1 (Dos colas)
Desde el enfoque de significación estadística, un valor de asumiendo un alfa =0.05 para el error tipo I, se puede indicar que el cumplimiento de p < 0.05 rechaza Ho a favor de H1, indicando heterogeneidad entre los OR ajustados.
Para nuestro caso se arrojo: Test that M-H adjusted OR = 1: chi2(1) = 8.31 Pr>chi2 = 0.004. Como valor p=0.004 (<0.05) heterogeneidad de los efectos del análisis estratificado por la variable mmarried.
2.2 Interacción con Madre latina (mhisp):
2.2.1 Tabla estratificada
, , MadreLatina = No-Madre Latina
Low BW
Smoke lbw nolbw
smoker 93 750
nonsmoker 180 3461
, , MadreLatina = Madre Latina
Low BW
Smoke lbw nolbw
smoker 2 19
nonsmoker 5 132
2.2.2 Resultados de los Odds Ratio por niveles de la covariable
Point estimates and 95% CIs:
-------------------------------------------------------------------
Odds ratio (crude) 2.40 (1.85, 3.11)
Odds ratio (M-H) 2.39 (1.85, 3.10)
Odds ratio (crude:M-H) 1.00
Attrib fraction (est) in the exposed (%) 0.58 (0.46, 0.68)
Attrib fraction (est) in the population (%) * 0.20 (0.18, 0.22)
-------------------------------------------------------------------
Woolf test of homogeneity of ORs: chi2(1) = 0.100 Pr>chi2 = 0.752
Test that M-H adjusted OR = 1: chi2(1) = 45.767 Pr>chi2 = <0.001
Wald confidence limits
M-H: Mantel-Haenszel; CI: confidence interval
* Outcomes per 100 population units
2.2.3 Según los resultados anteriores, ¿considera que hay homogeneidad o heterogeneidad de los efectos, para la relación tabaquismo y bajo peso al nacer?¿Qué tipo de interacción se presenta: cuantitativa o cualitativa? Explique
Al evaluar los OR estratificados a ser madre latina o no, se puede interpretar que entre los recien nacidos de madres no latinas y con hábito de fumar, el odds de desarrollar bajo peso al nacer es de 2.38 veces el odds desarrollar bajo peso al nacer en pacientes no fumadores hijos de madres no latinas (95% CI 1.83 a 3.09). Por otra parte recien nacidos de madres latinas y con hábito de fumar el odds de desarrollar bajo peso al nacer es de 2.77 veces el odds desarrollar bajo peso al nacer en pacientes hijos de madres no fumadores latinas (95% CI 0.50 a 15.34) . En este caso el IC cruza la unidad y tiene un amplio rango.
Dichos OR por estratos muestran amplia diferencia, lo que indica heterogeneidad. Además, como ya se dijo uno de los OR cruza la unidad y en el otro si se muestra una asociación cambiando la dirección, por tanto se habla de una interacción cualitativa.
2.2.4 Resultados del análisis de Mantel Haneszel. Test de homogeneidad y test de M-H OR=1
Ho: El OR ajustado es igual 1 H1: El OR ajustado es diferente de 1 (Dos colas)
Desde el enfoque de significación estadística, un valor de asumiendo un alfa =0.05 para el error tipo I, se puede indicar que el cumplimiento de p < 0.05 rechaza Ho a favor de H1, indicando heterogeneidad entre los OR ajustados.
Para nuestro caso se arrojo: Test that M-H adjusted OR = 1: chi2(1) = 45.76 Pr>chi2 < 0.001. Como valor p < 0.001 (<0.05) heterogeneidad de los efectos del análisis estratificado por la variable mhisp.
2.2.5 Desde el enfoque de la significación estadística, asumiendo un alfa =0.05 para el error tipo I, ¿qué sugiere el test de homogeneidad de Woolf? ¿Está de acuerdo con la decisión estadística desde este enfoque?
El test Chi2 de Woolf arroja un resultado de 0.1 con una nivel p < 0.001. Desde el enfoque de significación estadística indica que no se rechaza la H0 de homogenedidad entre los OR de los estratos. Se sugiere entonces homogeneidad por test de Wolf aunque se contradice con los datos anteriormente mencionados.
3 Actividad 3. Comparación entre los efectos conjuntos observados y los esperados
Comparación entre los efectos conjuntos observados y los esperados del factor de riesgo A y la tercera variable Z.
LS0tCnRpdGxlOiAiVGFsbGVyIEFuw6FsaXNpcyBkZSBsYSBoZXRlcm9nZW5laWRhZCBkZSBsb3MgZWZlY3RvcyBsIgphdXRob3I6ICJGcmFuY2lzY28gTHVpcyBDYXJvIFphcGF0YSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogZmxhdGx5CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICczJwogICAgZGZfcHJpbnQ6IHBhZ2VkCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRX0KbGlicmFyeShrbml0cikKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGNvbW1lbnQ9TkEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRSwgZW5naW5lID0gJ1InLCBmaWcuYWxpZ24gPSAnY2VudGVyJywgZmlnLnBvcyA9ICdIJykKb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICcnKQpvcHRpb25zKGRpZ2l0cz02KQpsaWJyYXJ5KGZvcm1hdFIpCmBgYAoKKmxpYnJlcsOtYXMqCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkgCmxpYnJhcnkoc2pQbG90KQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoc3Vydml2YWwpCmxpYnJhcnkoZXBpUikKbGlicmFyeShoYXZlbikKYGBgCgojIExleWVuZG8gbGEgQmFzZSBkZSBkYXRvcwpgYGB7cn0KbXlkYXRhIDwtIHJlYWRfZXhjZWwoImRhdGFzZXRzL2FzYmVzdG9zLnhsc3giKQoKYGBgCgojIEFjdGl2aWRhZCAxCgpFdmFsw7plIGVsIGVmZWN0byBkZSBsYSBleHBvc2ljacOzbiBhIHRhYmFxdWlzbW8sIHNvYnJlIGxhIHJlbGFjacOzbiBlbnRyZSB0YWJhcXVpc21vIHkgZWwgZGVzYXJyb2xsbyBkZSBjw6FuY2VyLiBMb3MgYXV0b3JlcyBzdXBvbmVuIHF1ZSBsYSBleHBvc2ljacOzbiBhIGFzYmVzdG8gcHVlZGUgaW50ZXJhY3R1YXIgY29uIGVsIHRhYmFxdWlzbW8uCgpMYXMgdmFyaWFibGVzIGVzdMOhbiBjb2RpZmljYWRhcyBjb21vIDA6IGF1c2VuY2lhLCAxOiBQcmVzZW5jaWEKCiMjIDEuMSBBbsOhbGlzaXMgZXN0cmF0aWZpY2FkbyBkZSBNYW50ZWwtSGFlbnN6ZWwKCiMjIyBPZGRzIFJhdGlvIENydWRvIHBhcmEgdGFiYXF1aXNtbyB5IGPDoW5jZXIgZGUgcHVsbcOzbgoKRW4gbGEgZXhwbGljYWNpw7NuIGRlbCBjb21hbmRvIGRlICoqZXBpLjJieTIqKiBlbiAiUiIsIGVuIGVsIEVqZW1wbG8gMiBzZSBpbmRpY2EgaW5pY2lhciBmaWphbmRvIGVsIGRlc2VubGFjZSB5IGxhIGV4cG9zaWNpw7NuIGNvbW8gZmFjdG9yZXMgeSBlc3RhYmxlY2llbmRvIGxvcyBuaXZlbGVzIGRlIGxhcyBtaXNtYXMgcGFyYSBxdWUgbGFzIGZyZWN1ZW5jaWFzIGVuIGxhIHRhYmxhIDJ4MiBzZSBwcmVzZW50ZW4gZW4gZWwgZm9ybWF0byBjb252ZW5jaW9uYWw6CgpgYGB7cn0KbXlkYXRhJExVTkdDQSA8LSBmYWN0b3IobXlkYXRhJExVTkdDQSwgbGV2ZWxzID0gYygxLDApKQpteWRhdGEkU01PS0UgPC0gZmFjdG9yKG15ZGF0YSRTTU9LRSwgbGV2ZWxzID0gYygxLDApKQoKdGFibGFzbW9rZWx1bmdjYSA8LSB0YWJsZShteWRhdGEkU01PS0UsIG15ZGF0YSRMVU5HQ0EsIGRubj1jKCJTbW9rZSIsIkx1bmdDQSIpKQoKcHJpbnQodGFibGFzbW9rZWx1bmdjYSkKYGBgCgpgYGB7cn0KZXBpLjJieTIoZGF0ID0gdGFibGFzbW9rZWx1bmdjYSwgbWV0aG9kID0gImNhc2UuY29udHJvbCIsIAogICAgICAgICBkaWdpdHMgPSAyLCBjb25mLmxldmVsID0gMC45NSwgdW5pdHMgPSAxMDAsIAogICAgICAgICBpbnRlcnByZXQgPSBUUlVFLCBvdXRjb21lID0gImFzLmNvbHVtbnMiKQpgYGAKCioqTWVkaWRhcyBkZSBmdWVyemEgZGUgYXNvY2lhY2nDs246KioKCk9kZHMgZGUgQ0EgcGFyYSBsb3MgZnVtYWRvcmVzOiA4MC8xMDAgPSAwLjgKT2RkcyBkZSBDQSBwYXJhIG5vIGZ1bWFkb3JlczogMTUvOTAgPSAwLjE2NwpPZGRzIFJhdGlvOiAoODAvMTAwKS8oMTUvOTApID0gNC44CgpFbCBvZGRzIGRlIENBIGRlIHB1bG1vbmFyIGVuIGxvcyBwYWNpZW50ZXMgZnVtYWRvcmVzIGVzIDQuOCB2ZWNlcyBlbCBvZGRzIGRlIENBIHB1bG1vbmFyIGVuIGxvcyBwYWNpZW50ZSBxdWUgbm8gc29uIGZ1bWFkb3JlcyAoOTUlIENJIDIuNTggdG8gOC45MykuIAoKIyMjIE9kZHMgUmF0aW8gQ3J1ZGEgYXNiZXN0byB5IGPDoW5jZXIgZGUgcHVsbcOzbgoKYGBge3J9CgpteWRhdGEkTFVOR0NBIDwtIGZhY3RvcihteWRhdGEkTFVOR0NBLCBsZXZlbHMgPSBjKDEsMCkpCm15ZGF0YSRBU0JFU1RPUyA8LSBmYWN0b3IobXlkYXRhJEFTQkVTVE9TLCBsZXZlbHMgPSBjKDEsMCkpIAoKdGFibGFzYXNiZXN0b2x1bmdjYSA8LSB0YWJsZShteWRhdGEkQVNCRVNUT1MsIG15ZGF0YSRMVU5HQ0EsIGRubj1jKCJBc2Jlc3RvcyIsIkx1bmdDQSIpKQoKcHJpbnQodGFibGFzYXNiZXN0b2x1bmdjYSkKCmBgYAoKCmBgYHtyfQplcGkuMmJ5MihkYXQgPSB0YWJsYXNhc2Jlc3RvbHVuZ2NhLCBtZXRob2QgPSAiY2FzZS5jb250cm9sIiwgZGlnaXRzID0gMiwgY29uZi5sZXZlbCA9IDAuOTUsIHVuaXRzID0gMTAwLCBpbnRlcnByZXQgPSBUUlVFLCBvdXRjb21lID0gImFzLmNvbHVtbnMiKQpgYGAKCioqTWVkaWRhcyBkZSBmdWVyemEgZGUgYXNvY2lhY2nDs246KioKCk9kZHMgZGUgZXhwdWVzdG9zIGEgYXNiZXRvIGZyZW50ZSBhbCBDQTogODAvMzggPSAyLjEwNTMKT2RkcyBkZSBubyBleHB1ZXN0b3MgYSBhc2Jlc3RvIGZyZW50ZSBhbCBDQTogMTUvMTUyID0gMC4wOTg3Ck9kZHMgcmF0aW86ICg4MC8zOCkvKDE1LzE1MikgPSAyMS4zMzMzCgpFbCBvZGRzIGRlIENBIGRlIHB1bG1vbmFyIGVuIGxvcyBwYWNpZW50ZXMgY29uIGV4cG9zaWNpw7NuIGEgYXNiZXN0b3MgZXMgZGUgMjEuMzMgdmVjZXMgZWwgb2RkcyBkZSBDQSBwdWxtb25hciBkZSBsb3MgcGFjaWVudGVzIHNpbiBleHBvc2ljacOzbiBhIGFzYmVzdG9zICg5NSUgQ0kgMTEuMDcgdG8gNDEuMTIpLgoKIyMjIFRhYmxhIGRlIGNvbnRpbmdlbmNpYSBlc3RyYXRpZmljYWRhIGEgbGEgZXhwb3NpY2nDs24gbyBubyBhIGFzYmVzdG9zCgpgYGB7cn0KdGFiRXN0cmF0aWZjYW5jZXIgPC0geHRhYnMoZGF0YSA9IG15ZGF0YSwgZm9ybXVsYSA9IH4gU01PS0UgKyBMVU5HQ0EgKyBBU0JFU1RPUykKdGFiRXN0cmF0aWZjYW5jZXIKYGBgCgojIyMgUmVzdWx0YWRvcyBkZSBsb3MgT2RkcyBSYXRpbyBwb3Igbml2ZWxlcyBkZSBsYSBjb3ZhcmlhYmxlCgpgYGB7cn0KI09kZHMgUmF0aW8gcG9yIG5pdmVsZXMgZGUgbGEgY292YXJpYWJsZQpyZXN1bHRhZG9zTV9IIDwtIGVwaS4yYnkyKGRhdCA9IHRhYkVzdHJhdGlmY2FuY2VyLCAKICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY2FzZS5jb250cm9sIiwgY29uZi5sZXZlbCA9IDAuOTUsCiAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9ICJhcy5jb2x1bW5zIiwgaW50ZXJwcmV0ID0gVFJVRSkKcHJpbnQocmVzdWx0YWRvc01fSCkKIyBPUiBwb3IgZXN0cmF0b3MKcmVzdWx0YWRvc01fSFtbIm1hc3NvYy5kZXRhaWwiXV1bWyJPUi5zdHJhdGEud2FsZCJdXQpgYGAKCiMjIyBTZWfDum4gbG9zIHJlc3VsdGFkb3MgYW50ZXJpb3Jlcywgwr9Db25zaWRlcmEgcXVlIGhheSBob21vZ2VuZWlkYWQgbyBoZXRlcm9nZW5laWRhZCBkZSBsb3MgZWZlY3RvcyBwYXJhIGxhIHJlbGFjacOzbiBlbnRyZSB0YWJhcXVpc21vIHkgY2EgZGUgcHVsbcOzbj8gwr9RdcOpIHRpcG8gZGUgaW50ZXJhY2Npw7NuIHNlIHByZXNlbnRhOiBjdWFudGl0YXRpdmEgbyBjdWFsaXRhdGl2YT8gRXhwbGlxdWUuCgpPZGRzIHJhdGlvIChjcnVkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuODAgKDIuNTgsIDguOTMpCk9kZHMgcmF0aW8gKE0tSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MSAoMS4yNSwgNC42NikKCkVsIGFzYmVzdG8gZW4gZXN0ZSBjYXNvIHNlIGNvbXBvcnRhIGNvbW8gdW4gZmFjdG9yIGRlIGludGVyYWNjacOzbiB5IG5vIHNlIGJ1c2NhIGNvbnRyb2xhciwgc2lubyBxdWUgc2UgZGViZSBldmlkZW5jaWFyIHkgcmVwb3J0YXIuIExhIHJlbGFjacOzbiBlbnRyZSBlbCBjb25zdW1vIGRlIGNpZ2FycmlsbG8geSBsYSBleHBvc2ljacOzbiBhIGFzYmVzdG8gZXMgZGUgaW50ZXJhY2Npw7NuIHBvcnF1ZSBlc3RlIMO6bHRpbW8gbm8gdGllbmUgcmVsYWNpw7NuIGNvbiBlbCBwcmltZXJvLgoKRXhpc3RlIGhldGVyb2dlbmVpZGFkIGRlIGxvcyBlZmVjdG9zIGRlIGxhIGNvdmFyaWFibGUgcG9ycXVlIGxvcyBPUiBzb24gZGlmZXJlbnRlcyBlbnRyZSBsb3MgZXN0cmF0b3MgKGV4cG9zaWNpw7NuIG8gbm8gYSBhc2Jlc3Rvcyk6CiogU2kgc2UgdGllbmUgZW4gY3VlbnRhIGVsIGFzYmVzdG8gY29tbyBmYWN0b3IgZGUgIGVuIGN1ZW50YSBlbCBhc2Jlc3RvIChmYWN0b3IgZGUgaW50ZXJhY2Npw7NuKSwgZWwgb2RkcyBkZSBDQSBwdWxtb25hciBlbiBsb3MgZnVtYWRvcmVzIGVzIDQuOCAoOTUlIENJIDIuNTggYSA4LjkzKSBlbCBvZGRzIGRlIENBIGRlIHB1bG3Ds24gZW4gbG9zIG5vIGZ1bWFkb3Jlcy4gICAKKiBTaSBubyBzZSB0aWVuZSBlbiBjdWVudGEgZWwgYXNiZXN0bywgZWwgb2RkcyBkZSBDQSBkZSBwdWxtw7NuIGVuIGxvcyBmdW1hZG9yZXMgZXMgMi40MSAoOTUlIENJIDEuMjUgYSA0LjY2KSBlbCBvZGRzIGRlIENBIHB1bG1vbmFyIGVuIGxvcyBubyBmdW1hZG9yZXMuCgpEaWNoYSBpbnRlcmFjY2nDs24gZXMgY3VhbnRpdGF0aXZhIHB1ZXMgYW1ib3MgT1IgZXN0YW4gZW4gbGEgbWlzbWEgZGlyZWNjacOzbiBlbiBjYWRhIGVzdHJhdG8gZGUgbGEgdmFyaWFibGUgbW9kaWZpY2Fkb3JhLCBlbiBlc3RlIGNhc28gYW1ib3Mgc29uIG1heW9yIHF1ZSAxLiBBZGVtw6FzIHNlIGNvbnNpZGVyYSB1bmEgaW50ZXJhY2Npw7NuIGN1YW50aXRhdGl2YS1wb3NpdGl2YSwgeWEgcXVlIGxhIHByZXNlbmNpYSBkZSBsYSB2YXJpYWJsZSBkZSBleHBvc2ljacOzbiBhIGFzYmVzdG9zIGF1bWVudGEgZWwgZWZlY3RvIGRlIGxhIGV4cG9zaWNpw7NuIGFsIGNpZ2FycmlsbG8sIGVzIGRlY2lyIGVzdGFzIHZhcmlhYmxlcyB0aWVuZW4gdW5hIHJlbGFjacOzbiBzaW5lw6lyZ2ljYS4KCiMjIDEuMiBSZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMgZGUgTWFudGVsIEhhbmVzemVsLiBUZXN0IGRlIGhvbW9nZW5laWRhZCB5IHRlc3QgZGUgTS1IIE9SPTEuCgpgYGB7cn0KcmVzdWx0YWRvc01fSApgYGAKCiMjIyAxLjIuMS4gRGVzZGUgZWwgZW5mb3F1ZSBkZSBsYSBzaWduaWZpY2FjacOzbiBlc3RhZMOtc3RpY2EsIGFzdW1pZW5kbyB1biBhbGZhID0wLjA1IHBhcmEgZWwgZXJyb3IgdGlwbyBJLCDCv3F1w6kgc3VnaWVyZSBlbCB0ZXN0IGRlIGhvbW9nZW5laWRhZCBkZSBXb29sZj8gCgpFbCB0ZXN0IENoaTIgZGUgV29vbGYgYXJyb2phIHVuIHJlc3VsdGFkbyBkZSAxNy43NiBjb24gdW5hIG5pdmVsIHAgPCAwLjAwMS4gRGVzZGUgZWwgZW5mb3F1ZSBkZSBzaWduaWZpY2FjacOzbiBlc3RhZMOtc3RpY2EgaW5kaWNhIHF1ZSBzZSByZWNoYXphIGxhIEgwIGRlIGhvbW9nZW5laWRhZCBlbnRyZSBsb3MgT1IgZGUgbG9zIGVzdHJhdG9zIHkgc3VnaWVyZSBoZXRlcm9nZW5laWRhZCwgbG8gcXVlIGNvbmZpcm1hIGxvIGFub3RhZG8gYW50ZXJpb3JtZW50ZSBzZWfDum4gZWwgdmFsb3IgZGVsIE9SLgoKIyMjIDEuMi4yLiDCv0NvbiBiYXNlIGVuIGxvIGFudGVyaW9yLCBlcyBhZGVjdWFkYSBsYSBwcmVzZW50YWNpw7NuIGVuIHVuIGluZm9ybWUgY2llbnTDrWZpY28gbGEgT2RkcyByYXRpbyAoTS1IKT0yLjQxPyBFbiBjYXNvIGRlIHF1ZSBzZSBwdWRpZXJhIHByZXNlbnRhciDCv0NvbW8gc2UgaW50ZXJwcmV0YXLDrWEgZXN0ZSB2YWxvcj8KCk5vIGVzIGFkZWN1YWRvIGxhIHByZXNlbnRhY2nDs24gZGVsIE9SIChNLUgpID0gMi40MSBwb3JxdWUgY29tbyBzZSBtZW5jaW9uw7MgYW50ZXJpb3JtZW50ZSBsYSB2YXJpYWJsZSBubyBlcyBkZSBjb25mdXNpw7NuLCBhZGVtw6FzIGxvcyBPUiBzb24gZGlmZXJlbnRlcyBlbiBsb3MgZXN0cmF0b3MgeSBlbCB0ZXN0IGRlIGhvbW9nZW5laWRhZCBjb25maXJtw7MgaGV0ZXJvZ2VuZWlkYWQsIGxvIHF1ZSBjb250cmFpbmRpY2EgZWwgY8OhbGN1bG8gbWlzbW8uIApTaW4gZW1iYXJnbywgc2kgc2UgZnVlcmEgcHJlc2VudGFyIHNlIHBvZHLDrWEgaW5kaWNhciBxdWUgZW4gcGFjaWVudGVzIGZ1bWFkb3JlcyBsYSBvZGRzIGRlIHN1ZnJpciBDQSBkZSBwdWxtw7NuIGVuIGxvcyBleHB1ZXN0b3MgYSBhc2Jlc3RvcyBlcyBkZSAyLjQxIHZlY2VzIGxhIG9kZHMgcHJlc2VudGFybG8gbG9zIG5vIGZ1bWFkb3JlcyBxdWUgbm8gcHJlc2VudGFuIGV4cG9zaWNpw7NuIGEgYXNiZXN0b3MgKDk1JSBDSSAxLjI1IHRvIDQuNjYpLiAKCiMjIyAxLjIuMy4gwr9FbiBxdWUgY29uZGljaW9uZXMgc2UgcHVlZGUgcHJlc2VudGFyIGVzdGUgcmVzdWx0YWRvIChPZGRzIHJhdGlvIChNLUgpPwoKRWwgcmVzdWx0YWRvIGRlbCBPUiAoTS1IKSBzZSBwdWVkZSBwcmVzZW50YXIgY3XDoW5kbyBzZSBkZXNlYSBhanVzdGFyIHVuYSB2YXJpYWJsZSBkZSBjb25mdXNpw7NuLCBjdcOhbmRvIGVuIGVsIGFuw6FsaXNpcyBwb3IgZmFjdG9yZXMgaGF5IGhvbW9nZW5laWRhZCBlbnRyZSBsb3MgT1IsIGN1w6FuZG8gbGEgdmFyaWFibGUgZGUgY29uZnVzacOzbiBubyBlc3TDoSBlbiBsYSBjYWRlbmEgY2F1c2FsIHkgY3XDoW5kbyBubyBoYXkgY29saW5lYWxpZGFkLgoKIyMjIDEuMi40LiBEZXNkZSBlbCBlbmZvcXVlIGRlIGxhIHNpZ25pZmljYWNpw7NuIGVzdGFkw61zdGljYSwgYXN1bWllbmRvIHVuIGFsZmEgPTAuMDUgcGFyYSBlbCBlcnJvciB0aXBvIEksIMK/cXXDqSBzdWdpZXJlIGVsIHRlc3QgZGUgTWFudGVsLUhhbmVuc3plbCBwYXJhIGVsIE9SIGFqdXN0YWRvIGJham8gaGlww7N0ZXNpcyBudWxhIGRlIDE/CgpIbzogRWwgT1IgYWp1c3RhZG8gZXMgaWd1YWwgMQpIMTogRWwgT1IgYWp1c3RhZG8gZXMgZGlmZXJlbnRlIGRlIDEgKERvcyBjb2xhcykKCkRlc2RlIGVsIGVuZm9xdWUgZGUgc2lnbmlmaWNhY2nDs24gZXN0YWTDrXN0aWNhLCB1biB2YWxvciBkZSBhc3VtaWVuZG8gdW4gYWxmYSA9MC4wNSBwYXJhIGVsIGVycm9yIHRpcG8gSSwgc2UgcHVlZGUgaW5kaWNhciBxdWUgZWwgY3VtcGxpbWllbnRvIGRlIHAgPCAwLjA1IHJlY2hhemEgSG8gYSBmYXZvciBkZSBIMSwgaW5kaWNhbmRvIGhldGVyb2dlbmVpZGFkIGVudHJlIGxvcyBPUiBhanVzdGFkb3MuCgpQYXJhIG51ZXN0cm8gY2FzbyBzZSBhcnJvam86ClRlc3QgdGhhdCBNLUggYWRqdXN0ZWQgT1IgPSAxOiAgY2hpMigxKSA9IDguNDM0IFByPmNoaTIgPSAwLjAwMi4KQ29tbyB2YWxvci1QPTAuMDAyLCBjb25jbHVpbW9zIHF1ZSBlbCBPUiBhanVzdGFkbyBwYXJhIGxvcyBleHB1ZXN0b3MgYSBhc2Jlc3RvIGVzIGRpZmVyZW50ZSBhbCBPUiBhanVzdGFkbyBwYXJhIGxvcyBubyBleHB1ZXN0b3MgYSBhc2Jlc3RvLgoKCiMgQWN0aXZpZGFkIDIKCkNvbiBiYXNlIGVuIGxhIGluZm9ybWFjacOzbiBkZWwgZXN0dWRpbyBkZSBiYWpvIHBlc28gYWwgbmFjZXIgZXZhbMO6ZSBzaSBwYXJhIGxhIHJlbGFjacOzbiBjb25zdW1vIGRlIHRhYmFjbyBkdXJhbnRlIGVsIGVtYmFyYXpvIHkgZWwgYmFqbyBwZXNvIGFsIG5hY2VyLCBzZSBwcmVzZW50YSBpbnRlcmFjY2nDs24gcG9zaXRpdmEgbyBuZWdhdGl2YSwgdGVuaWVuZG8gZW4gY3VlbnRhIHNpIGxhIG1hZHJlIGVzdMOhIG8gbm8gY2FzYWRhIChtbWFycmllZCksIHkgc2kgbGEgbWFkcmUgZXMgbyBubyBleHRyYW5qZXJhIChmb3JlaWduOiAwIEFtZXJpY2FuYSwgMSBMYXRpbmEpLgoKYGBge3J9Cm15ZGF0YSA8LSByZWFkX2R0YSgiZGF0YXNldHMvUGVzb05hY2VydjExLmR0YSIpCmBgYAoKKkdlbmVyYWNpw7NuIGRlIGV0aXF1ZXRhcyBlbiBsYXMgdmFyaWFibGVzKgpgYGB7cn0KbXlkYXRhJG1tYXJyaWVkIDwtIGZhY3RvcihteWRhdGEkbW1hcnJpZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMCwxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJub3RtYXJyaWVkIiwgIm1hcnJpZWQiKSkKCm15ZGF0YSRtaGlzcCA8LSBmYWN0b3IobXlkYXRhJG1oaXNwLCBsZXZlbHMgPSBjKDAsMSksIGxhYmVscyA9IGMoIk5vLU1hZHJlIExhdGluYSIsICJNYWRyZSBMYXRpbmEiKSkKCm15ZGF0YSRmaGlzcCA8LSBmYWN0b3IobXlkYXRhJGZoaXNwLCBsZXZlbHMgPSBjKDAsMSksIGxhYmVscyA9IGMoIm5vZmhpc3AiLCAiZmhpc3AiKSkKCm15ZGF0YSRmb3JlaWduIDwtIGZhY3RvcihteWRhdGEkZm9yZWlnbiwgbGV2ZWxzID0gYygwLDEpLCBsYWJlbHMgPSBjKCJub2ZvcmVpZ24iLCAiZm9yZWlnbiIpKQoKbXlkYXRhJGFsY29ob2wgPC0gZmFjdG9yKG15ZGF0YSRhbGNvaG9sLCBsZXZlbHMgPSBjKDAsMSksIGxhYmVscyA9IGMoIm5vYWxjb2hvbCIsICJhbGNvaG9sIikpCgpteWRhdGEkZGVhZGtpZHMgPC0gZmFjdG9yKG15ZGF0YSRkZWFka2lkcywgbGV2ZWxzID0gYygwLDEpLCBsYWJlbHMgPSBjKCJub2RlYWRraWRzIiwgImRlYWRraWRzIikpCgpteWRhdGEkbXNtb2tlIDwtIGZhY3RvcihteWRhdGEkbXNtb2tlLCBsZXZlbHMgPSBjKDAsMSwgMiwgMyksIGxhYmVscyA9ICAgICAgICBjKCIwIGNpZ2FyZXR0ZXMgZGFpbHkiLCAiMS01IGNpZ2FyZXR0ZXMgZGFpbHkiLAogICAgICAgIjYtMTAgY2lnYXJldHRlcyBkYWlseSIsCiAgICAgICIxMSBvciBtb3JlIGNpZ2FyZXR0ZXMgZGFpbHkiICkpCgpteWRhdGEkbWJzbW9rZSA8LSBmYWN0b3IobXlkYXRhJG1ic21va2UsIGxldmVscyA9IGMoMCwxKSwgbGFiZWxzID0gYygibm9uc21va2VyIiwgInNtb2tlciIpKQoKbXlkYXRhJG1yYWNlIDwtIGZhY3RvcihteWRhdGEkbXJhY2UsIGxldmVscyA9IGMoMCwxKSwgbGFiZWxzID0gYygib3RoZXIiLCAibXdoaXRlIikpCgpteWRhdGEkZnJhY2UgPC0gZmFjdG9yKG15ZGF0YSRmcmFjZSwgbGV2ZWxzID0gYygwLDEpLCBsYWJlbHMgPSBjKCJvdGhlciIsICJmd2hpdGUiKSkKCm15ZGF0YSRwcmVuYXRhbCA8LSBmYWN0b3IobXlkYXRhJHByZW5hdGFsKSAKCm15ZGF0YSRiaXJ0aG1vbnRoIDwtIGZhY3RvcihteWRhdGEkYmlydGhtb250aCkKCm15ZGF0YSRmYmFieSA8LSBmYWN0b3IobXlkYXRhJGZiYWJ5LCBsZXZlbHMgPSBjKDAsMSksIGxhYmVscyA9IGMoIm5vIiwKImZpcnN0YmFieSIpKQoKbXlkYXRhJGxid2VpZ2h0IDwtIGZhY3RvcihteWRhdGEkbGJ3ZWlnaHQsIGxldmVscyA9IGMoMCwxKSwgbGFiZWxzID0gYygibm9sYnciLCAibGJ3IikpCgpzdW1tYXJ5KG15ZGF0YSkKCmBgYAoKYGBge3J9CiNtc21va2UgZXMgdW5hIHZhcmlhYmxlIG9yZGluYWwsIHBhcmEgcXVlIGxhIGZ1bmNpw7NuIHRhYmxlb25lIG5vIGxhIGRlc2NhcnRlIAoKbXlkYXRhJG1zbW9rZTwtYXMuZmFjdG9yKG15ZGF0YSRtc21va2UpIAoKI0NvbiBlc3RvIHNlIGluZGljYSBxdWUgbGEgdmFyaWFibGUgZXMgZmFjdG9yCgpgYGAKCiMjIDIuMSBJbnRlcmFjY2nDs24gY29uIGVzdGFkbyBjaXZpbCAobW1hcnJpZWQpOiBNYWRyZSBjYXNhZGEgbyBuby4KCiMjIyAyLjEuMSBUYWJsYSBlc3RyYXRpZmljYWRhIAoKYGBge3J9CiMgUHJlcGFyZW1vcyBsb3MgZGF0b3MgcGFyYSBjb25maWd1cmFyIGxhcyB0YWJsYXMuIAojIENhbWJpYXIgb3JkZW4gZGUgY2F0ZWdvcsOtYXMuCiMgbGJ3OiBCYWpvIHBlc28gYWwgbmFjZXIgPDI1MDAgZ3JzLiAKIyAibm9sYnciOiBQZXNvIG5vcm1hbD49MjUwMCBncnMuCiMgQ2FtYmlvIGRlIG9yZGVuIGRlIGxvcyBuaXZlbGVzIHBhcmEgZWwgY8OhbGN1bG8gYXByb3BpYWRvIGRlbCBPUgoKbXlkYXRhJGxid2VpZ2h0MiA8LSBmYWN0b3IobXlkYXRhJGxid2VpZ2h0LCBsZXZlbHMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYygibGJ3Iiwibm9sYnciKSkgCm15ZGF0YSRtYnNtb2tlMiA8LSBmYWN0b3IobXlkYXRhJG1ic21va2UsIGxldmVscwogICAgICAgICAgICAgICAgICAgICAgICAgID0gYygic21va2VyIiwibm9uc21va2VyIikpCgogIyBDcmVhciB0YWJsYSBkZSBjb250aW5nZW5jaWEgZXN0cmF0aWZpY2FkYQoKdGFiRXN0cmF0aWYxIDwtIHRhYmxlKG15ZGF0YSRtYnNtb2tlMiwgbXlkYXRhJGxid2VpZ2h0MiwgbXlkYXRhJG1tYXJyaWVkLCBkbm4gPSBjKCJTbW9rZSIsICJMb3cgQlciLCAiTWFycmllZCIpKQp0YWJFc3RyYXRpZjEKCgpgYGAKCiMjIyAyLjEuMiBFdmFsdWFjacOzbiBkZSBsYSBob21vZ2VuZWlkYWQgbyBoZXRlcm9nZW5laWRhZCBkZSBsb3MgZWZlY3RvcwoKIyMjIFJlc3VsdGFkb3MgTS1ICgpgYGB7cn0KCnJlc3VsdGFkb3NNX0ggPC0gZXBpLjJieTIoZGF0ID0gdGFiRXN0cmF0aWYxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiY2FzZS5jb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLmxldmVsID0gMC45NSwKICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gImFzLmNvbHVtbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldCA9IFRSVUUpCgoKIyBPUiBwb3IgZXN0cmF0b3MKcmVzdWx0YWRvc01fSFtbIm1hc3NvYy5kZXRhaWwiXV1bWyJPUi5zdHJhdGEud2FsZCJdXQoKIyNDw6FsY3VsbyBtYW51YWwgT1IgTS1IICgoNTUqNTg0LzEzOTQpKyg0MCoyNzM5LzMyNDgpKS8oKDg1KjQwMC8xMzk0KSsoMTAwKjM2OS8zMjQ4KSkKCnByaW50KHJlc3VsdGFkb3NNX0gpCmBgYAojIyMgMi4xLjMgU2Vnw7puIGxvcyByZXN1bHRhZG9zIGFudGVyaW9yZXMsIMK/Y29uc2lkZXJhIHF1ZSBoYXkgaG9tb2dlbmVpZGFkIG8gaGV0ZXJvZ2VuZWlkYWQgZGUgbG9zIGVmZWN0b3MgcGFyYSBsYSByZWxhY2nDs24gdGFiYXF1aXNtbyB5IGJham8gcGVzbyBhbCBuYWNlcj8gwr9RdcOpIHRpcG8gZGUgaW50ZXJhY2Npw7NuIHNlIHByZXNlbnRhOiBjdWFudGl0YXRpdmEgbyBjdWFsaXRhdGl2YT8gRXhwbGlxdWUKCkFsIGV2YWx1YXIgbG9zIE9SIGVzdHJhdGlmaWNhZG9zIHBvciBlbCBlc3RhZG8gY2l2aWwgc2UgcHVlZGUgaW50ZXJwcmV0YXIgcXVlIGVudHJlIGxvcyBwYWNpZW50ZXMgc29sdGVyb3MgKG5vdG1hcnJpZWQpIHkgY29uIGjDoWJpdG8gZGUgZnVtYXIsIGVsIG9kZHMgZGUgZGVzYXJyb2xsYXIgYmFqbyBwZXNvIGFsIG5hY2VyIGVzIGRlIDEuMzggdmVjZXMgZWwgb2RkcyBkZXNhcnJvbGxhciBiYWpvIHBlc28gYWwgbmFjZXIgZW4gIHBhY2llbnRlcyBubyBmdW1hZG9yZXMsIHNpbiBlbWJhcmdvLCBlc3RlIG1pc21vIE9SIHRpZW5lIHVuIElDIHF1ZSBhdHJhdmllc2EgbGEgdW5pZGFkIHkgcG9yIGxvIHRhbnRvIG5vIGVzIHBvc2libGUgaW50ZXJwcmV0YXIgYWRlY3VhZGFtZW50ZSBsYSByZWxhY2lvbiBkZSBpbnRlcmFjY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4KUG9yIG90cmEgcGFydGUsIGVuIHBhY2llbnRlIGNhc2Fkb3MgKG1hcnJyaWVkKSBjb24gaMOhYml0byBkZSBmdW1hciwgZWwgb2RkcyBkZSBkZXNhcnJvbGxhciBiYWpvIHBlc28gYWwgbmFjZXIgZXMgZGUgMi45NiB2ZWNlcyBlbCBvZGRzIGRlc2Fycm9sbGFyIGJham8gcGVzbyBhbCBuYWNlciBlbiAgcGFjaWVudGVzIG5vIGZ1bWFkb3JlcyAoOTUlIENJIDIuMDIgYSA0LjM1KS4gRW4gZXN0ZSBjYXNvIGVsIElDIG5vIGNydXphIGxhIHVuaWRhZC4KCkRpY2hvcyBPUiBwb3IgZXN0cmF0b3MgbXVlc3RyYW4gYW1wbGlhIGRpZmVyZW5jaWEsIGxvIHF1ZSBpbmRpY2EgaGV0ZXJvZ2VuZWlkYWQuIEFkZW3DoXMsIGNvbW8geWEgc2UgZGlqbyB1bm8gZGUgbG9zIE9SIGNydXphIGxhIHVuaWRhZCB5IGVuIGVsIG90cm8gc2kgc2UgbXVlc3RyYSB1bmEgYXNvY2lhY2nDs24gY2FtYmlhbmRvIGxhIGRpcmVjY2nDs24sIHBvciB0YW50byBzZSBoYWJsYSBkZSB1bmEgaW50ZXJhY2Npw7NuIGN1YWxpdGF0aXZhLgoKIyMjICAyLjEuNCBEZXNkZSBlbCBlbmZvcXVlIGRlIGxhIHNpZ25pZmljYWNpw7NuIGVzdGFkw61zdGljYSwgYXN1bWllbmRvIHVuIGFsZmEgPTAuMDUgcGFyYSBlbCBlcnJvciB0aXBvIEksIMK/cXXDqSBzdWdpZXJlIGVsIHRlc3QgZGUgaG9tb2dlbmVpZGFkIGRlIFdvb2xmPyDCv0VzdMOhIGRlIGFjdWVyZG8gY29uIGxhIGRlY2lzacOzbiBlc3RhZMOtc3RpY2EgZGVzZGUgZXN0ZSBlbmZvcXVlPwoKRWwgdGVzdCBDaGkyIGRlIFdvb2xmIGFycm9qYSB1biByZXN1bHRhZG8gZGUgMjMuNTMgY29uIHVuYSBuaXZlbCBwIDwgMC4wMDEuIERlc2RlIGVsIGVuZm9xdWUgZGUgc2lnbmlmaWNhY2nDs24gZXN0YWTDrXN0aWNhIGluZGljYSBxdWUgc2UgcmVjaGF6YSBsYSBIMCBkZSBob21vZ2VuZWlkYWQgZW50cmUgbG9zIE9SIGRlIGxvcyBlc3RyYXRvcyB5IHN1Z2llcmUgaGV0ZXJvZ2VuZWlkYWQsIGxvIHF1ZSBjb25maXJtYSBsbyBhbm90YWRvIGFudGVyaW9ybWVudGUgc2Vnw7puIGVsIHZhbG9yIGRlbCBPUi4KCiMjIyAyLjEuNSBEZXNkZSBlbCBlbmZvcXVlIGRlIGxhIHNpZ25pZmljYWNpw7NuIGVzdGFkw61zdGljYSwgYXN1bWllbmRvIHVuIGFsZmEgPTAuMDUgcGFyYSBlbCBlcnJvciB0aXBvIEksIMK/cXXDqSBzdWdpZXJlIGVsIHRlc3QgZGUgTWFudGVsLUhhZW5zemVsIHBhcmEgZWwgT1IgYWp1c3RhZG8gYmFqbyBoaXDDs3Rlc2lzIG51bGEgZGUgMT8KCkhvOiBFbCBPUiBhanVzdGFkbyBlcyBpZ3VhbCAxCkgxOiBFbCBPUiBhanVzdGFkbyBlcyBkaWZlcmVudGUgZGUgMSAoRG9zIGNvbGFzKQoKRGVzZGUgZWwgZW5mb3F1ZSBkZSBzaWduaWZpY2FjacOzbiBlc3RhZMOtc3RpY2EsIHVuIHZhbG9yIGRlIGFzdW1pZW5kbyB1biBhbGZhID0wLjA1IHBhcmEgZWwgZXJyb3IgdGlwbyBJLCBzZSBwdWVkZSBpbmRpY2FyIHF1ZSBlbCBjdW1wbGltaWVudG8gZGUgcCA8IDAuMDUgcmVjaGF6YSBIbyBhIGZhdm9yIGRlIEgxLCBpbmRpY2FuZG8gaGV0ZXJvZ2VuZWlkYWQgZW50cmUgbG9zIE9SIGFqdXN0YWRvcy4KClBhcmEgbnVlc3RybyBjYXNvIHNlIGFycm9qbzoKVGVzdCB0aGF0IE0tSCBhZGp1c3RlZCBPUiA9IDE6ICBjaGkyKDEpID0gOC4zMSBQcj5jaGkyID0gMC4wMDQuCkNvbW8gdmFsb3IgcD0wLjAwNCAoPDAuMDUpIGhldGVyb2dlbmVpZGFkIGRlIGxvcyBlZmVjdG9zIGRlbCBhbsOhbGlzaXMgZXN0cmF0aWZpY2FkbyBwb3IgbGEgdmFyaWFibGUgbW1hcnJpZWQuIAoKIyMgMi4yIEludGVyYWNjacOzbiBjb24gTWFkcmUgbGF0aW5hIChtaGlzcCk6CgojIyMgMi4yLjEgVGFibGEgZXN0cmF0aWZpY2FkYQoKYGBge3J9CiMgQ3JlYXIgdGFibGEgZGUgY29udGluZ2VuY2lhIGVzdHJhdGlmaWNhZGEKdGFiRXN0cmF0aWYyIDwtIHRhYmxlKG15ZGF0YSRtYnNtb2tlMiwgbXlkYXRhJGxid2VpZ2h0MiwgbXlkYXRhJG1oaXNwLAogICAgICAgICAgICAgICAgICAgICAgZG5uID0gYygiU21va2UiLCAiTG93IEJXIiwgIk1hZHJlTGF0aW5hIikpCnRhYkVzdHJhdGlmMgpgYGAKCiMjIyAyLjIuMiBSZXN1bHRhZG9zIGRlIGxvcyBPZGRzIFJhdGlvIHBvciBuaXZlbGVzIGRlIGxhIGNvdmFyaWFibGUKCmBgYHtyfQoKcmVzdWx0YWRvc01fSCA8LSBlcGkuMmJ5MihkYXQgPSB0YWJFc3RyYXRpZjIsIG1ldGhvZCA9ICJjYXNlLmNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1LG91dGNvbWUgPSAiYXMuY29sdW1ucyIpCgojIE9SIHBvciBlc3RyYXRvcwpyZXN1bHRhZG9zTV9IW1sibWFzc29jLmRldGFpbCJdXVtbIk9SLnN0cmF0YS53YWxkIl1dCgpwcmludChyZXN1bHRhZG9zTV9IKQoKYGBgCgojIyMgMi4yLjMgU2Vnw7puIGxvcyByZXN1bHRhZG9zIGFudGVyaW9yZXMsIMK/Y29uc2lkZXJhIHF1ZSBoYXkgaG9tb2dlbmVpZGFkIG8gaGV0ZXJvZ2VuZWlkYWQgZGUgbG9zIGVmZWN0b3MsIHBhcmEgbGEgcmVsYWNpw7NuIHRhYmFxdWlzbW8geSBiYWpvIHBlc28gYWwgbmFjZXI/wr9RdcOpIHRpcG8gZGUgaW50ZXJhY2Npw7NuIHNlIHByZXNlbnRhOiBjdWFudGl0YXRpdmEgbyBjdWFsaXRhdGl2YT8gRXhwbGlxdWUKCkFsIGV2YWx1YXIgbG9zIE9SIGVzdHJhdGlmaWNhZG9zIGEgc2VyIG1hZHJlIGxhdGluYSBvIG5vLCBzZSBwdWVkZSBpbnRlcnByZXRhciBxdWUgZW50cmUgbG9zIHJlY2llbiBuYWNpZG9zIGRlIG1hZHJlcyBubyBsYXRpbmFzIHkgY29uIGjDoWJpdG8gZGUgZnVtYXIsIGVsIG9kZHMgZGUgZGVzYXJyb2xsYXIgYmFqbyBwZXNvIGFsIG5hY2VyIGVzIGRlIDIuMzggdmVjZXMgZWwgb2RkcyBkZXNhcnJvbGxhciBiYWpvIHBlc28gYWwgbmFjZXIgZW4gIHBhY2llbnRlcyBubyBmdW1hZG9yZXMgaGlqb3MgZGUgbWFkcmVzIG5vIGxhdGluYXMgKDk1JSBDSSAxLjgzIGEgMy4wOSkuClBvciBvdHJhIHBhcnRlIHJlY2llbiBuYWNpZG9zIGRlIG1hZHJlcyBsYXRpbmFzIHkgY29uIGjDoWJpdG8gZGUgZnVtYXIgZWwgb2RkcyBkZSBkZXNhcnJvbGxhciBiYWpvIHBlc28gYWwgbmFjZXIgZXMgZGUgMi43NyB2ZWNlcyBlbCBvZGRzIGRlc2Fycm9sbGFyIGJham8gcGVzbyBhbCBuYWNlciBlbiAgcGFjaWVudGVzIGhpam9zIGRlIG1hZHJlcyBubyBmdW1hZG9yZXMgbGF0aW5hcyAoOTUlIENJIDAuNTAgYSAxNS4zNCkgLiBFbiBlc3RlIGNhc28gZWwgSUMgY3J1emEgbGEgdW5pZGFkIHkgdGllbmUgdW4gYW1wbGlvIHJhbmdvLgoKRGljaG9zIE9SIHBvciBlc3RyYXRvcyBtdWVzdHJhbiBhbXBsaWEgZGlmZXJlbmNpYSwgbG8gcXVlIGluZGljYSBoZXRlcm9nZW5laWRhZC4gQWRlbcOhcywgY29tbyB5YSBzZSBkaWpvIHVubyBkZSBsb3MgT1IgY3J1emEgbGEgdW5pZGFkIHkgZW4gZWwgb3RybyBzaSBzZSBtdWVzdHJhIHVuYSBhc29jaWFjacOzbiBjYW1iaWFuZG8gbGEgZGlyZWNjacOzbiwgcG9yIHRhbnRvIHNlIGhhYmxhIGRlIHVuYSBpbnRlcmFjY2nDs24gY3VhbGl0YXRpdmEuCgojIyMgMi4yLjQgUmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIGRlIE1hbnRlbCBIYW5lc3plbC4gVGVzdCBkZSBob21vZ2VuZWlkYWQgeSB0ZXN0IGRlIE0tSCBPUj0xCgpIbzogRWwgT1IgYWp1c3RhZG8gZXMgaWd1YWwgMQpIMTogRWwgT1IgYWp1c3RhZG8gZXMgZGlmZXJlbnRlIGRlIDEgKERvcyBjb2xhcykKCkRlc2RlIGVsIGVuZm9xdWUgZGUgc2lnbmlmaWNhY2nDs24gZXN0YWTDrXN0aWNhLCB1biB2YWxvciBkZSBhc3VtaWVuZG8gdW4gYWxmYSA9MC4wNSBwYXJhIGVsIGVycm9yIHRpcG8gSSwgc2UgcHVlZGUgaW5kaWNhciBxdWUgZWwgY3VtcGxpbWllbnRvIGRlIHAgPCAwLjA1IHJlY2hhemEgSG8gYSBmYXZvciBkZSBIMSwgaW5kaWNhbmRvIGhldGVyb2dlbmVpZGFkIGVudHJlIGxvcyBPUiBhanVzdGFkb3MuCgpQYXJhIG51ZXN0cm8gY2FzbyBzZSBhcnJvam86ClRlc3QgdGhhdCBNLUggYWRqdXN0ZWQgT1IgPSAxOiAgY2hpMigxKSA9IDQ1Ljc2IFByPmNoaTIgPCAwLjAwMS4KQ29tbyB2YWxvciBwIDwgMC4wMDEgKDwwLjA1KSBoZXRlcm9nZW5laWRhZCBkZSBsb3MgZWZlY3RvcyBkZWwgYW7DoWxpc2lzIGVzdHJhdGlmaWNhZG8gcG9yIGxhIHZhcmlhYmxlIG1oaXNwLiAKCiMjIyAyLjIuNSBEZXNkZSBlbCBlbmZvcXVlIGRlIGxhIHNpZ25pZmljYWNpw7NuIGVzdGFkw61zdGljYSwgYXN1bWllbmRvIHVuIGFsZmEgPTAuMDUgcGFyYSBlbCBlcnJvciB0aXBvIEksIMK/cXXDqSBzdWdpZXJlIGVsIHRlc3QgZGUgaG9tb2dlbmVpZGFkIGRlIFdvb2xmPyDCv0VzdMOhIGRlIGFjdWVyZG8gY29uIGxhIGRlY2lzacOzbiBlc3RhZMOtc3RpY2EgZGVzZGUgZXN0ZSBlbmZvcXVlPwoKRWwgdGVzdCBDaGkyIGRlIFdvb2xmIGFycm9qYSB1biByZXN1bHRhZG8gZGUgMC4xIGNvbiB1bmEgbml2ZWwgcCA8IDAuMDAxLiBEZXNkZSBlbCBlbmZvcXVlIGRlIHNpZ25pZmljYWNpw7NuIGVzdGFkw61zdGljYSBpbmRpY2EgcXVlIG5vIHNlIHJlY2hhemEgbGEgSDAgZGUgaG9tb2dlbmVkaWRhZCBlbnRyZSBsb3MgT1IgZGUgbG9zIGVzdHJhdG9zLiBTZSBzdWdpZXJlIGVudG9uY2VzIGhvbW9nZW5laWRhZCBwb3IgdGVzdCBkZSBXb2xmIGF1bnF1ZSBzZSBjb250cmFkaWNlIGNvbiBsb3MgZGF0b3MgYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvcy4KCiMgMyBBY3RpdmlkYWQgMy4gQ29tcGFyYWNpw7NuIGVudHJlIGxvcyBlZmVjdG9zIGNvbmp1bnRvcyBvYnNlcnZhZG9zIHkgbG9zIGVzcGVyYWRvcwoKQ29tcGFyYWNpw7NuIGVudHJlIGxvcyBlZmVjdG9zIGNvbmp1bnRvcyBvYnNlcnZhZG9zIHkgbG9zIGVzcGVyYWRvcyBkZWwgZmFjdG9yIGRlIHJpZXNnbyBBIHkgbGEgdGVyY2VyYSB2YXJpYWJsZSBaLgoKIyMgMy4xIENvbXBsZXRlIGxhIHRhYmxhIHNpZ3VpZW50ZSBjb25zaWRlcmFuZG8gbGEgaW5mb3JtYWNpw7NuIHN1bWluaXN0cmFkYSBwYXJhIGxhIGVzdHJhdGlmaWNhY2nDs24gcG9yIGVzdGFkbyBjaXZpbC4gQ2FsY3VsZSBlbCBPUiBwYXJhIGVsIGVmZWN0byBkZSB0YWJhcXVpc21vIGluZGVwZW5kaWVudGUgZGVsIGVzdGFkbyBjaXZpbCwgZWwgT1IgcGFyYSBlbCBlZmVjdG8gZGVsIGVzdGFkbyBjaXZpbCBpbmRlcGVuZGllbnRlIGRlbCB0YWJhcXVpc21vLCB5IGVsIE9SIGNvbmp1bnRvLiBMdWVnbyBjYWxjdWxlIGVsIE9SIGVzcGVyYWRvIHVzYW5kbyB1biBtb2RlbG8gbXVsdGlwbGljYXRpdm8uCgojIyMgMy4xLjIgVGFibGEgZXN0cmF0aWZpY2FkYSBwYXJhIGxhIHJlbGFjacOzbiB0YWJhcXVpc21vIGNvbiBiYWpvIHBlc28gYWwgbmFjZXIsIGVzdHJhdGlmaWNhZGEgcG9yIGVzdGFkbyBjaXZpbC4KCmBgYHtyfQp0YWJFc3RyYXRpZjEKYGBgCgrCv1F1w6kgc2UgbWlkZT8gfCBaPUVzdGFkb0NpdmlsQ2FzYWRhIChtYXJyaWVkKSB8IEE9VGFiYXF1aXNtbyB8IENhc29zIHwgQ29udHJvbGVzCjotLSB8IDotLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0tOiB8Oi0tLS0tLSB8IDotLS0tLS0gCkNhdGVnb3LDrWEgZGUgcmVmZXJlbmNpYSB8IEF1c2VuY2lhIHwgQXVzZW5jaWEgfCA4NSB8IDg1NApFZmVjdG8gaW5kZXBlbmRpZW50ZSBkZSBBIHwgQXVzZW5jaWEgfCBQcmVzZW5jaWEgfCA1NSB8IDQwMApFZmVjdG8gaW5kZXBlbmRpZW50ZSBkZSBaIHwgUHJlc2VuY2lhIHwgQXVzZW5jaWEgfCAxMDAgfCAyNzM5CkVmZWN0byBjb25qdW50byBvYnNlcnZhZG8gfCBQcmVzZW5jaWEgfCBQcmVzZW5jaWEgfCA0MCB8IDM2OQoKIyMjIDMuMS4zIENhbGN1bGUgZWwgT1IgZGVzZGUgZWwgTW9kZWxvIG11bHRpcGxpY2F0aXZvLiDCv0NvbnNpZGVyYSBxdWUgaGF5IGludGVyYWNjacOzbiBwb3NpdGl2YSBvIG5lZ2F0aXZhPwoKKipVc2FuZG8gbGEgcmVncmVzacOzbiBsb2fDrXN0aWNhOioqCgpgYGB7cn0KbW9kZWwuaW50ZXIgPC0gZ2xtKGxid2VpZ2h0IH5tYnNtb2tlKm1tYXJyaWVkLCAKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBteWRhdGEsIGZhbWlseSA9IGJpbm9taWFsKQojIFRhYmxhIGNvZWZpY2llbnRlcyBleHBvbmVuY2lhZG9zIChPUikgZGVsIG1vZGVsbwp0YWJfbW9kZWwobW9kZWwuaW50ZXIpCgpgYGAKClRlbmVtb3M6CgpaPUVzdGFkb0NpdmlsQ2FzYWRhIChtYXJyaWVkKSAKCkE9VGFiYXF1aXNtbwoKJE9SX3tBPTE7Wj0wfSA9IDEuMzgkCgokT1Jfe0E9MDtaPTF9ID0gMC4zNyQKCiRPUl97QT0xO1o9MX0oT2JzZXJ2YWRvKSA9IDIuMTUkCgpDYWxjdWxvIE9SIG9ic2VydmFkbzoKCiRPUl8oRXNwZXJhZG8pID0gMS4zOCowLjM3ID0gMC41MTA2ICQKCkNvbW8gZWwgT1IgKE9ic2VydmFkbykgPiBPUiAoRXNwZXJhZG8pLCBlbnRvbmNlcyB0ZW5lbW9zIHVuIG1vZGVsbyBtdWx0aXBsaWNhdGl2byBjb24gaW50ZXJhY2Npw7NuIHBvc2l0aXZhLgoKIyMjIDMuMS40IFRhYmxhIGVzdHJhdGlmaWNhZGEgcGFyYSBsYSByZWxhY2nDs24gdGFiYXF1aXNtbyBjb24gYmFqbyBwZXNvIGFsIG5hY2VyLCBlc3RyYXRpZmljYWRhIHBvciBlc3RhZG8gY2l2aWwuCgpgYGB7cn0KdGFiRXN0cmF0aWYxCmBgYAoK