Resultados previos

En trabajos anteriores se realizó la simulación del tiempo de contagio que podemos durar en cuarentena, ne Colombia (https://rpubs.com/alexjzc/covid-19).

Según estos resultados se replica el proceso para estimar el número de casos dias diarios que se puede tener para Bogotá. Para lo anterior, se procede a estimar el número de días días que nos falta para alcanzar el máximo de casos diarios para Bogotá.

Para ellos se descarga los casos diarios que se han dado para Bogotá según el portal de Datos Abiertos. Los datos está disponible el el siguiente link (https://www.datos.gov.co/Salud-y-Protecci-n-Social/Casos-positivos-de-COVID-19-en-Colombia/gt2j-8ykr/data).

A continuación se presentan los datos:

Distribución de nuevos casos en Bogotá

Construcción del modelo para predecir el número de casos de Coronavirus en Bogotá

Se desea construir un modelo que permita estimar el número de casos confirmados acumulados. Para ellos se construye un modelo quasipoisson el que se tiene en cuenta el número de casos confirmados acumulados como variable dependiente (valores) y como variables independientes el tiempo que ha transcurrido despues del primer caso (tiempo).

Para determinar que tan bueno es el modelo se excluyen los últimos 5 datos para tratar de predecir con el modelo.

los resultados son los siguientes


Call:
glm(formula = conteo ~ tiempo, family = quasipoisson(link = "log"), 
    data = df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-29.915   -6.603   -2.592    2.215   34.510  

Coefficients:
             Estimate Std. Error t value            Pr(>|t|)    
(Intercept) 3.1029355  0.1100047   28.21 <0.0000000000000002 ***
tiempo      0.0333088  0.0007804   42.68 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasipoisson family taken to be 85.20307)

    Null deviance: 275328  on 166  degrees of freedom
Residual deviance:  13878  on 165  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 4

Analysis of Deviance Table

Model: quasipoisson, link: log

Response: conteo

Terms added sequentially (first to last)

       Df Deviance Resid. Df Resid. Dev              Pr(>Chi)    
NULL                     166     275328                          
tiempo  1   261450       165      13878 < 0.00000000000000022 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Según los resultados son significativas, por lo que se utilizan para realizar las estimaciones.

Estimación la tasa de contagio por día

Estimate    2.5 %   97.5 % 
1.033870 1.032308 1.035471 

Según el valor anterior, tenemos que la tasa de contagio es del 1.0338698. Por lo que por cada día que pasa el tiempo la tasa de infección aumenta en un 3.4%, con intervalo entre el 3.2% y 3.5%.

Ajuste del modelo

Se determina que tan bueno es el ajuste del modelo. Calculando la función envelope para determinar que tan bueno se ajusta el modelo.

Quasi-Poisson model 

Observando el modelo, notamos que se ajustan bien los resultados, ya que la mayoría de los residuales se encuentra dentro de los límites de la gráfica envelope.

Predicciones del modelo

Realizando las predicciones respectivas para determinar el número de casos acumulados encontramos que las predicciones son buenas. Los valores que se se encuentran por encima de la linea vertical, son valores que se están prediciendo.

En la siguiente tabla se puede observar las predicciones (pred_cum) los valores del intervalo al 95% (lower_cum, upper_cum), los valores de confirmados (valores) y las fechas actuales.

Estimación del número de días que puede llegar durar la cuarentena en Bogotá

Para estimar el número de días, se tiene en cuenta el modelo SIR (Susceptible-Infectado-Recuperado), este modelo consiste en solucionar un sistema de ecuaciones diferenciales que relaciona el número de personas susceptible a ser infectadas de una población, el número de personas infectadas el cual y el número de personas recuperadas. El sistema de ecuaciones el el siguiente: \[ \begin{align*} \frac{dS}{dt} &= -\frac{\beta IS}{N}\\ \frac{dI}{dt} &= \frac{\beta IS}{N}-\gamma I\\ \frac{dR}{dt} &= \gamma I\\ \end{align*} \] Donde \(\beta\) es el parámetro de que controla la transición de entre los suceptibles (S) e infectados (I) y \(\gamma\) que controla la transición entre los infectados (I) y recuperados (R).

Para realizar la estimación en el caso colombiano, se tiene en cuenta la información tomada en el blog de Learning Machines (https://blog.ephorie.de/epidemiology-how-contagious-is-novel-coronavirus-2019-ncov). La data arreglar queda de la siguiente manera:

Simulación para Bogotá a la fecha

Para nuestro caso tenemos una población de personas de 7743955 según el DANE. Las simulaciones se realizaran con la información actual y además teniendo en cuenta que según los estudios del INS la población máxima que se puede contagiar es del 80%.

A continuación se simula el \(R_0\) y cuando se tendría y la fecha máxima que se tendría el número máximo de infectados. Tengamos presente que los resultados hacen parte de un proceso de simulación y también que debido a las diferentes intervenciones que realizó el gobierno de Colombia y la alcaldía de Bogotá estos datos pueden variar.

A continuación los nuevos valores de \(\beta\) y \(\gamma\) son los siguientes:.

     beta     gamma 
0.3624985 0.2807653 

La estimación de \(R_0\) a la fecha actual es la siguiente:

      R0 
1.291109 

Según el resultado anterior, por cada persona infectada en Bogotá, está tiene la capacidad de infectar 1.29 personas.

El número de dias para llegar al máximo a la fecha de hoy es de:

[1] 167

Por lo que el máximo se alcanzaría a los 167 dias. A fecha de hoy 2020-08-25 han pasado 172 días por lo que ya hemos alcanzado el máximo según el modelo ajustado.

Estimación de los parametros de la distribución de infectados

Recordemos que la estimación del número promedio de días que vamos a estar en cuarentena según el modelo SIR es de \(168.7764918\). A continuación se estiman el número de casos que se pueden dar en los siguientes días teniendo en cuenta los siguientes supuestos.

Teniendo en cuenta lo anterior se procede a realizar un proceso de simulación y los resultados finales son los siguientes:

A continuación se revisa el ajuste mediante el gráfico de casos acumulados

LS0tDQp0aXRsZTogIkNPVklELTE5IEJvZ290w6E6IEVzdGltYWNpw7NuIGRlbCB0aWVtcG8gZGVsIG7Dum1lcm8gZGUgY29udGFnaW9zIGRpYXJpb3MgZW4gQm9nb3TDoSINCmF1dGhvcjogIkFsZXggWmFtYnJhbm8gYWxleC56QG1vbnRlY2hlbG8uY29tLmNvIg0KZGF0ZTogIkluZm9ybWUgYWN0dWFsaXphZG8gYWw6IGByIGRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyBSZXN1bHRhZG9zIHByZXZpb3MNCg0KRW4gdHJhYmFqb3MgYW50ZXJpb3JlcyBzZSByZWFsaXrDsyBsYSBzaW11bGFjacOzbiBkZWwgdGllbXBvIGRlIGNvbnRhZ2lvIHF1ZSBwb2RlbW9zIGR1cmFyIGVuIGN1YXJlbnRlbmEsIG5lIENvbG9tYmlhIChodHRwczovL3JwdWJzLmNvbS9hbGV4anpjL2NvdmlkLTE5KS4NCg0KU2Vnw7puIGVzdG9zIHJlc3VsdGFkb3Mgc2UgcmVwbGljYSBlbCBwcm9jZXNvIHBhcmEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGNhc29zIGRpYXMgZGlhcmlvcyBxdWUgc2UgcHVlZGUgdGVuZXIgcGFyYSBCb2dvdMOhLiBQYXJhIGxvIGFudGVyaW9yLCBzZSBwcm9jZWRlIGEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGTDrWFzIGTDrWFzIHF1ZSBub3MgZmFsdGEgcGFyYSBhbGNhbnphciBlbCBtw6F4aW1vIGRlIGNhc29zIGRpYXJpb3MgcGFyYSBCb2dvdMOhLg0KDQpQYXJhIGVsbG9zIHNlIGRlc2NhcmdhIGxvcyBjYXNvcyBkaWFyaW9zIHF1ZSBzZSBoYW4gZGFkbyBwYXJhIEJvZ290w6Egc2Vnw7puIGVsIHBvcnRhbCBkZSBEYXRvcyBBYmllcnRvcy4gTG9zIGRhdG9zIGVzdMOhIGRpc3BvbmlibGUgZWwgZWwgc2lndWllbnRlIGxpbmsgKGh0dHBzOi8vd3d3LmRhdG9zLmdvdi5jby9TYWx1ZC15LVByb3RlY2NpLW4tU29jaWFsL0Nhc29zLXBvc2l0aXZvcy1kZS1DT1ZJRC0xOS1lbi1Db2xvbWJpYS9ndDJqLTh5a3IvZGF0YSkuDQoNCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YW4gbG9zIGRhdG9zOg0KYGBge3IgbGVjdHVyYSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2lUb29scykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIExlY3R1cmEgZGUgbG9zIGRhdG9zICMjIyMNCmRiIDwtIHJlYWRfY3N2KCJodHRwczovL3d3dy5kYXRvcy5nb3YuY28vYXBpL3ZpZXdzL2d0MmotOHlrci9yb3dzLmNzdj9hY2Nlc3NUeXBlPURPV05MT0FEJmJvbT10cnVlJmZvcm1hdD10cnVlIikNCg0KZGIgPC0gZGIgJT4lIGRhdGEuZnJhbWUoKQ0KZGIgPC0gZGIgJT4lIGZpbHRlcihkYiRDb2RpZ28uZGVwYXJ0YW1lbnRvID09IDExKQ0KDQppbmZlY3RhZG9zIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRmZWNoYS5yZXBvcnRlLndlYikgJT4lDQogIHN1bW1hcmlzZShpbmZlY3RhZG9zID0gbigpKSAlPiUgbmEub21pdCgpDQppbmZlY3RhZG9zJGZlY2hhcyA8LSBhcy5EYXRlKGluZmVjdGFkb3MkZmVjaGFzLCAiJXktJW0tJWQiKQ0KDQptdWVydGVzIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRGZWNoYS5kZS5tdWVydGUpICU+JQ0KICBzdW1tYXJpc2UobXVlcnRlcyA9IG4oKSkgJT4lICBuYS5vbWl0KCkNCm11ZXJ0ZXMkZmVjaGFzIDwtIGFzLkRhdGUobXVlcnRlcyRmZWNoYXMsICIleS0lbS0lZCIpDQoNCnJlY3VwZXJhZG9zIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRGZWNoYS5yZWN1cGVyYWRvKSAlPiUNCiAgc3VtbWFyaXNlKHJlY3VwZXJhZG9zID0gbigpKSAlPiUgIG5hLm9taXQoKQ0KcmVjdXBlcmFkb3MkZmVjaGFzIDwtIGFzLkRhdGUocmVjdXBlcmFkb3MkZmVjaGFzLCAiJXktJW0tJWQiKSAgICANCg0KZGIgPC0gZGF0YS5mcmFtZSgNCiAgZmVjaGFzID0gYXNfZGF0ZShtaW4oaW5mZWN0YWRvcyRmZWNoYXMpOm1heChpbmZlY3RhZG9zJGZlY2hhcykpKQ0KDQpkYiA8LSBsZWZ0X2pvaW4oZGIsaW5mZWN0YWRvcykNCmRiIDwtIGxlZnRfam9pbihkYixtdWVydGVzKQ0KZGIgPC0gbGVmdF9qb2luKGRiLHJlY3VwZXJhZG9zKQ0KZGIkaW5mZWN0YWRvcyA8LSByZXBsYWNlX25hKGRiJGluZmVjdGFkb3MsIDApIA0KZGIkbXVlcnRlcyA8LSByZXBsYWNlX25hKGRiJG11ZXJ0ZXMsIDApDQpkYiRyZWN1cGVyYWRvcyA8LSByZXBsYWNlX25hKGRiJHJlY3VwZXJhZG9zLCAwKQ0KZGIkZGlhcyA8LSAxOm5yb3coZGIpDQoNCmRmIDwtIGRiICU+JSBzZWxlY3QoZmVjaGFzLGluZmVjdGFkb3MpDQpkZiA8LSBkZiAlPiUgcmVuYW1lKGZlY2hhID0gZmVjaGFzLCBjb250ZW8gPSBpbmZlY3RhZG9zKQ0KZGYkYWN1bXVsYWRvIDwtIGN1bXN1bShkZiRjb250ZW8pDQpgYGANCg0KYGBge3IgZGF0b3MsZWNobz1GQUxTRX0NCmRmDQpgYGANCg0KIyBEaXN0cmlidWNpw7NuIGRlIG51ZXZvcyBjYXNvcyBlbiBCb2dvdMOhDQoNCmBgYHtyICBjYXNvc19udWV2b3MsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkZiAlPiUgZ2dwbG90KGFlcyhmZWNoYSxjb250ZW8pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGF0ZShicmVha3MgPSBkZiRmZWNoYSwgZGF0ZV9sYWJlbHMgPSAiJWIgJWQiLCBleHBhbmQgPSBjKDAsMCkpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhmZWNoYSwgY29udGVvLCBsYWJlbCA9IGNvbnRlbyksIHNpemU9MiwgaGp1c3Q9MC41KSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLHNpemU9Nywgdmp1c3QgPSAwLjUpKSArIHlsYWIoIkNhc29zIG51ZXZvcyIpICMgZ3LDoWZpY2EgZGVsIG7Dum1lcm8gZGUgZGlhcyBzaW4gYWN1bXVsYXINCmBgYA0KIyBDb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gcGFyYSBwcmVkZWNpciBlbCBuw7ptZXJvIGRlIGNhc29zIGRlIENvcm9uYXZpcnVzIGVuIEJvZ290w6ENCg0KU2UgZGVzZWEgY29uc3RydWlyIHVuIG1vZGVsbyBxdWUgcGVybWl0YSBlc3RpbWFyIGVsIG7Dum1lcm8gZGUgY2Fzb3MgY29uZmlybWFkb3MgYWN1bXVsYWRvcy4gUGFyYSBlbGxvcyBzZSBjb25zdHJ1eWUgdW4gbW9kZWxvIHF1YXNpcG9pc3NvbiBlbCBxdWUgc2UgdGllbmUgZW4gY3VlbnRhIGVsIG7Dum1lcm8gZGUgY2Fzb3MgY29uZmlybWFkb3MgYWN1bXVsYWRvcyBjb21vIHZhcmlhYmxlIGRlcGVuZGllbnRlICh2YWxvcmVzKSB5IGNvbW8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVsIHRpZW1wbyBxdWUgaGEgdHJhbnNjdXJyaWRvIGRlc3B1ZXMgZGVsIHByaW1lciBjYXNvICh0aWVtcG8pLg0KDQpQYXJhIGRldGVybWluYXIgcXVlIHRhbiBidWVubyBlcyBlbCBtb2RlbG8gc2UgZXhjbHV5ZW4gbG9zIMO6bHRpbW9zIDUgZGF0b3MgcGFyYSB0cmF0YXIgZGUgcHJlZGVjaXIgY29uIGVsIG1vZGVsby4NCg0KDQpsb3MgcmVzdWx0YWRvcyBzb24gbG9zIHNpZ3VpZW50ZXMNCmBgYHtyIGNvcnJpZGFfbW9kZWxvLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbiA8LSBkaW0oZGYpWzFdDQpkZiR5IDwtIGRmJGNvbnRlbw0KI2RmJHkgPC0gZGYkdmFsb3Jlcw0KZGlmZl9jb3J0ZXMgPC0gcmVwKDA6dHJ1bmMobGVuZ3RoKGRmJHkpLzE0KSxlYWNoPTE0KQ0KZGYkY29ydGVzIDwtIGRpZmZfY29ydGVzWzE6bGVuZ3RoKGRmJHkpXQ0KZGYkY29ydGVzIDwtIGFzLmZhY3RvcihkZiRjb3J0ZXMpDQpkZl90ZXN0IDwtIGRmWyhuLTQpOm4sXQ0KZGYgPC0gZGZbMToobi01KSxdDQpuaXZlbGVzIDwtIGxldmVscyhkZiRjb3J0ZXMpDQpkZl90ZXN0JGNvcnRlcyA8LSByZXBsYWNlKA0KICBkZl90ZXN0JGNvcnRlcywgZGZfdGVzdCRjb3J0ZXMgIT0gYXMuY2hhcmFjdGVyKHRhaWwoZGYsMSkkY29ydGVzKSwNCiAgYXMuY2hhcmFjdGVyKHRhaWwoZGYsMSkkY29ydGVzKSkNCmRmX3Rlc3QkY29ydGVzIDwtIGZhY3RvcihkZl90ZXN0JGNvcnRlcyxsZXZlbHMgPSBuaXZlbGVzKQ0KZGYkdGllbXBvIDwtIDE6bnJvdyhkZikNCg0KbW9kZWxvIDwtIGdsbShjb250ZW8gfiB0aWVtcG8sIGRmLGZhbWlseSA9IHF1YXNpcG9pc3NvbihsaW5rID0gImxvZyIpKQ0KI21vZGVsbyA8LSBNQVNTOjpnbG0ubmIodmFsb3JlcyB+IHRpZW1wbyArIGNvcnRlcywgY29sb21iaWEpDQpzdW1tYXJ5KG1vZGVsbykNCmFub3ZhKG1vZGVsbyx0ZXN0ID0gIkNoaXNxIikNCmBgYA0KU2Vnw7puIGxvcyByZXN1bHRhZG9zIHNvbiBzaWduaWZpY2F0aXZhcywgcG9yIGxvIHF1ZSBzZSB1dGlsaXphbiBwYXJhIHJlYWxpemFyIGxhcyBlc3RpbWFjaW9uZXMuDQoNCiMjIEVzdGltYWNpw7NuIGxhIHRhc2EgZGUgY29udGFnaW8gcG9yIGTDrWENCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQplc3QgPC0gY2JpbmQoRXN0aW1hdGUgPSBjb2VmKG1vZGVsbyksIGNvbmZpbnQobW9kZWxvKSkNCmV4cChlc3RbMixdKQ0KYGBgDQpTZWfDum4gZWwgdmFsb3IgYW50ZXJpb3IsIHRlbmVtb3MgcXVlIGxhIHRhc2EgZGUgY29udGFnaW8gZXMgZGVsIGByIGV4cChlc3RbMiwxXSlgLiBQb3IgbG8gcXVlIHBvciBjYWRhIGTDrWEgcXVlIHBhc2EgZWwgdGllbXBvIGxhIHRhc2EgZGUgaW5mZWNjacOzbiBhdW1lbnRhIGVuIHVuIGByIHJvdW5kKGV4cChlc3RbMiwxXSktMSwzKSoxMDBgJSwgY29uIGludGVydmFsbyBlbnRyZSBlbCBgciByb3VuZChleHAoZXN0WzIsMl0pLTEsMykqMTAwYCUgeSBgciByb3VuZChleHAoZXN0WzIsM10pLTEsMykqMTAwYCUuDQoNCiMjIEFqdXN0ZSBkZWwgbW9kZWxvDQoNClNlIGRldGVybWluYSBxdWUgdGFuIGJ1ZW5vIGVzIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLiBDYWxjdWxhbmRvIGxhIGZ1bmNpw7NuIGVudmVsb3BlIHBhcmEgZGV0ZXJtaW5hciBxdWUgdGFuIGJ1ZW5vIHNlIGFqdXN0YSBlbCBtb2RlbG8uDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBSZXZpc2FuZG8gcXVlIHRhbiBidWVubyBlcyBlbCBtb2RlbG8gIyMjIw0KaG5wOjpobnAobW9kZWxvKQ0KI3NvdXJjZSgnaHR0cDovL3d3dy5wb2xldG8uY29tL2Z1bmNvZXMvZW52ZWwubmIudHh0JykNCiNlbnZlbC5uYihtb2RlbG8sY29uZj0wLjk1KQ0KYGBgDQoNCg0KT2JzZXJ2YW5kbyBlbCBtb2RlbG8sIG5vdGFtb3MgcXVlIHNlIGFqdXN0YW4gYmllbiBsb3MgcmVzdWx0YWRvcywgeWEgcXVlIGxhIG1heW9yw61hIGRlIGxvcyByZXNpZHVhbGVzIHNlIGVuY3VlbnRyYSBkZW50cm8gZGUgbG9zIGzDrW1pdGVzIGRlIGxhIGdyw6FmaWNhIGVudmVsb3BlLg0KDQojIyBQcmVkaWNjaW9uZXMgZGVsIG1vZGVsbw0KDQpSZWFsaXphbmRvIGxhcyBwcmVkaWNjaW9uZXMgcmVzcGVjdGl2YXMgcGFyYSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gZGUgY2Fzb3MgYWN1bXVsYWRvcyBlbmNvbnRyYW1vcyBxdWUgbGFzIHByZWRpY2Npb25lcyBzb24gYnVlbmFzLiBMb3MgdmFsb3JlcyBxdWUgc2Ugc2UgZW5jdWVudHJhbiBwb3IgZW5jaW1hIGRlIGxhIGxpbmVhIHZlcnRpY2FsLCBzb24gdmFsb3JlcyBxdWUgc2UgZXN0w6FuIHByZWRpY2llbmRvLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGllbXBvMiA8LSAxOihucm93KGRmKStucm93KGRmX3Rlc3QpKzUpDQpjb3J0ZXMyIDwtIA0KICBjKGFzLm51bWVyaWMobGV2ZWxzKGRmJGNvcnRlcykpW2RmJGNvcnRlc10sDQogICAgYXMubnVtZXJpYyhsZXZlbHMoZGZfdGVzdCRjb3J0ZXMpKVtkZl90ZXN0JGNvcnRlc10sDQogICAgYXMubnVtZXJpYyhsZXZlbHMoZGZfdGVzdCRjb3J0ZXMpKVtkZl90ZXN0JGNvcnRlc10pDQpjb3J0ZXMyIDwtIGZhY3Rvcihjb3J0ZXMyLCBsZXZlbHMgPSBsZXZlbHMoZGYkY29ydGVzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgDQoNCiMgQ29uc3RydXllbmRvIHByZWRpY2Npb25lcyAjIyMjDQpkZl9wcmVkaWN0aXZlIDwtIGFkZF9jaShkYXRhLmZyYW1lKHRpZW1wbyA9IHRpZW1wbzIsIGNvcnRlcyA9IGNvcnRlczIpLGZpdCA9IG1vZGVsbywgYWxwaGEgPSAwLjA1LCBuYW1lcyA9IGMoImxvd2VyIiwgInVwcGVyIikpDQoNCiMgUGVnYW5kbyBiYXNlcyAjIyMjDQpkZiA8LSBkZiAlPiUgZnVsbF9qb2luKGRmX3ByZWRpY3RpdmUpDQpkZlthcy5udW1lcmljKHJvdy5uYW1lcyhkZl90ZXN0KSksYygiZmVjaGEiLCAiY29udGVvIiwgImFjdW11bGFkbyIsICJ5IiwgImNvcnRlcyIpXSA8LSBkZl90ZXN0DQoNCg0KZGYkcHJlZF9jdW0gPC0gY3Vtc3VtKGRmJHByZWQpDQpkZiRsb3dlcl9jdW0gPC0gY3Vtc3VtKGRmJGxvd2VyKQ0KZGYkdXBwZXJfY3VtIDwtIGN1bXN1bShkZiR1cHBlcikNCg0KIyBQcmVkaWNjacOzbiA1IGTDrWFzICMjIyMNCmRmICU+JSBnZ3Bsb3QoYWVzKHggPSB0aWVtcG8pKSArIGdlb21fbGluZShhZXMoeSA9IHByZWRfY3VtKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBsb3dlcl9jdW0sY29sb3VyID0gIlJlZCIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IHVwcGVyX2N1bSxjb2xvdXIgPSAiUmVkIikpICsgZ2VvbV9wb2ludChhZXMoeSA9IGFjdW11bGFkbykpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbnJvdyhkZiktMTApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbnJvdyhkZikpLCBicmVha3MgPSBzZXEoMCwgMzAwLCBieSA9IDIpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsc2l6ZT03LCB2anVzdCA9IDAuNSkpICsgeWxhYigiUHJlZGljY2lvbmVzIGRlIGNhc29zIikNCmBgYA0KRW4gbGEgc2lndWllbnRlIHRhYmxhIHNlIHB1ZWRlIG9ic2VydmFyIGxhcyBwcmVkaWNjaW9uZXMgKHByZWRfY3VtKSBsb3MgdmFsb3JlcyBkZWwgaW50ZXJ2YWxvIGFsIDk1JSAobG93ZXJfY3VtLCB1cHBlcl9jdW0pLCBsb3MgdmFsb3JlcyBkZSBjb25maXJtYWRvcyAodmFsb3JlcykgeSBsYXMgZmVjaGFzIGFjdHVhbGVzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGYgJT4lIHNlbGVjdChmZWNoYSx0aWVtcG8sICB5LCBhY3VtdWxhZG8sIGxvd2VyX2N1bSwgcHJlZF9jdW0sIHVwcGVyX2N1bSkNCmBgYA0KDQojIEVzdGltYWNpw7NuIGRlbCBuw7ptZXJvIGRlIGTDrWFzIHF1ZSBwdWVkZSBsbGVnYXIgZHVyYXIgbGEgY3VhcmVudGVuYSBlbiBCb2dvdMOhDQoNClBhcmEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGTDrWFzLCBzZSB0aWVuZSBlbiBjdWVudGEgZWwgbW9kZWxvIFNJUiAoU3VzY2VwdGlibGUtSW5mZWN0YWRvLVJlY3VwZXJhZG8pLCBlc3RlIG1vZGVsbyBjb25zaXN0ZSBlbiBzb2x1Y2lvbmFyIHVuIHNpc3RlbWEgZGUgZWN1YWNpb25lcyBkaWZlcmVuY2lhbGVzIHF1ZSByZWxhY2lvbmEgZWwgbsO6bWVybyBkZSBwZXJzb25hcyBzdXNjZXB0aWJsZSBhIHNlciBpbmZlY3RhZGFzIGRlIHVuYSBwb2JsYWNpw7NuLCBlbCBuw7ptZXJvIGRlIHBlcnNvbmFzIGluZmVjdGFkYXMgZWwgY3VhbCB5IGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgcmVjdXBlcmFkYXMuIEVsIHNpc3RlbWEgZGUgZWN1YWNpb25lcyBlbCBlbCBzaWd1aWVudGU6DQokJA0KXGJlZ2lue2FsaWduKn0NClxmcmFje2RTfXtkdH0gJj0gLVxmcmFje1xiZXRhIElTfXtOfVxcDQpcZnJhY3tkSX17ZHR9ICY9IFxmcmFje1xiZXRhIElTfXtOfS1cZ2FtbWEgSVxcDQpcZnJhY3tkUn17ZHR9ICY9IFxnYW1tYSBJXFwNClxlbmR7YWxpZ24qfQ0KJCQNCkRvbmRlICRcYmV0YSQgZXMgZWwgcGFyw6FtZXRybyBkZSBxdWUgY29udHJvbGEgbGEgdHJhbnNpY2nDs24gZGUgZW50cmUgbG9zIHN1Y2VwdGlibGVzIChTKSBlIGluZmVjdGFkb3MgKEkpIHkgJFxnYW1tYSQgcXVlIGNvbnRyb2xhIGxhIHRyYW5zaWNpw7NuIGVudHJlIGxvcyBpbmZlY3RhZG9zIChJKSB5IHJlY3VwZXJhZG9zIChSKS4NCg0KUGFyYSByZWFsaXphciBsYSBlc3RpbWFjacOzbiBlbiBlbCBjYXNvIGNvbG9tYmlhbm8sIHNlIHRpZW5lIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2nDs24gdG9tYWRhIGVuIGVsIGJsb2cgZGUgTGVhcm5pbmcgTWFjaGluZXMgKGh0dHBzOi8vYmxvZy5lcGhvcmllLmRlL2VwaWRlbWlvbG9neS1ob3ctY29udGFnaW91cy1pcy1ub3ZlbC1jb3JvbmF2aXJ1cy0yMDE5LW5jb3YpLiBMYSBkYXRhIGFycmVnbGFyIHF1ZWRhIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCmBgYHtyIGxlY3R1cmEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KZGYyIDwtIGRiDQoNCmRmMiRpbmZlY3RhZG9zIDwtIGN1bXN1bShkZjIkaW5mZWN0YWRvcykNCmRmMiRtdWVydGVzIDwtIGN1bXN1bShkZjIkbXVlcnRlcykNCmRmMiRyZWN1cGVyYWRvcyA8LSBjdW1zdW0oZGYyJHJlY3VwZXJhZG9zKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZjINCmBgYA0KIyMgU2ltdWxhY2nDs24gcGFyYSBCb2dvdMOhIGEgbGEgZmVjaGENCg0KUGFyYSBudWVzdHJvIGNhc28gdGVuZW1vcyB1bmEgcG9ibGFjacOzbiBkZSBwZXJzb25hcyBkZSA3NzQzOTU1IHNlZ8O6biBlbCBEQU5FLiBMYXMgc2ltdWxhY2lvbmVzIHNlIHJlYWxpemFyYW4gY29uIGxhIGluZm9ybWFjacOzbiBhY3R1YWwgeSBhZGVtw6FzIHRlbmllbmRvIGVuIGN1ZW50YSBxdWUgc2Vnw7puIGxvcyBlc3R1ZGlvcyBkZWwgSU5TIGxhIHBvYmxhY2nDs24gbcOheGltYSBxdWUgc2UgcHVlZGUgY29udGFnaWFyIGVzIGRlbCA4MFwlLg0KDQpBIGNvbnRpbnVhY2nDs24gc2Ugc2ltdWxhIGVsICRSXzAkIHkgY3VhbmRvIHNlIHRlbmRyw61hIHkgbGEgZmVjaGEgbcOheGltYSBxdWUgc2UgdGVuZHLDrWEgZWwgbsO6bWVybyBtw6F4aW1vIGRlIGluZmVjdGFkb3MuIFRlbmdhbW9zIHByZXNlbnRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBoYWNlbiBwYXJ0ZSBkZSB1biBwcm9jZXNvIGRlIHNpbXVsYWNpw7NuIHkgdGFtYmnDqW4gcXVlIGRlYmlkbyBhIGxhcyBkaWZlcmVudGVzIGludGVydmVuY2lvbmVzIHF1ZSByZWFsaXrDsyBlbCBnb2JpZXJubyBkZSBDb2xvbWJpYSB5IGxhIGFsY2FsZMOtYSBkZSBCb2dvdMOhIGVzdG9zIGRhdG9zIHB1ZWRlbiB2YXJpYXIuDQoNCkEgY29udGludWFjacOzbiBsb3MgbnVldm9zIHZhbG9yZXMgZGUgJFxiZXRhJCB5ICRcZ2FtbWEkIHNvbiBsb3Mgc2lndWllbnRlczouDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkZVNvbHZlKQ0KDQpOIDwtIDc3NDM5NTUqMC44ICMgODAlIGRlIGxhIHBvYmxhY2nDs24gZGUgQm9nb3TDoSBzZWfDum4gZWwgREFORQ0KDQpJbmZlY3RlZCA8LSBkZjIkaW5mZWN0YWRvcw0KUiA8LSBkZjIkcmVjdXBlcmFkb3MNCkRheSA8LSBkZjIkZGlhcw0KDQojDQojIE9ERSBlcXVhdGlvbiB1c2VkIGZvciBmaXR0aW5nDQojDQpTSVIgPC0gZnVuY3Rpb24odGltZSwgc3RhdGUsIHBhcmFtZXRlcnMpIHsNCiAgcGFyIDwtIGFzLmxpc3QoYyhzdGF0ZSwgcGFyYW1ldGVycykpDQogIHdpdGgocGFyLCB7DQogICAgZFMgPC0gLWJldGEvTiAqIEkgKiBTDQogICAgZEkgPC0gYmV0YS9OICogSSAqIFMgLSBnYW1tYSAqIEkNCiAgICBkUiA8LSBnYW1tYSAqIEkNCiAgICBsaXN0KGMoZFMsIGRJLCBkUikpDQogIH0pDQp9DQoNCiMNCiMgY29zdCBmdW5jdGlvbiB0byBiZSBvcHRpbWl6ZWQgaW4gdGhlIGZpdHRpbmcNCiMNClJTUyA8LSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7DQogIG5hbWVzKHBhcmFtZXRlcnMpIDwtIGMoImJldGEiLCAiZ2FtbWEiKQ0KICBvdXQgPC0gb2RlKHkgPSBpbml0LCB0aW1lcyA9IERheSwgZnVuYyA9IFNJUiwgcGFybXMgPSBwYXJhbWV0ZXJzKQ0KICBmaXRJbmZlY3RlZCA8LSBvdXRbLDNdDQogIHN1bSgoSW5mZWN0ZWQgLSBmaXRJbmZlY3RlZCleMikNCn0NCg0KIyBzdGFydGluZyBjb25kaXRpb24NCmluaXQgPC0gYyhTID0gTi1JbmZlY3RlZFsxXSwgSSA9IEluZmVjdGVkWzFdLCBSID0gUlsxXSkNCiNpbml0IDwtIGMoUyA9IE4tSW5mZWN0ZWRbMV0sIEkgPSBJbmZlY3RlZFsxXS1SWzFdLURbMV0pICB1c2UgdGhpcyBzdGFydGluZyBjb25kaXRpb24gd2hlbiBhcHBseWluZyB0aGUgZGlmZmVyZW50IGxpbmUgaW4gdGhlIFJTUyBmdW5jdGlvbg0KDQojIHBlcmZvcm1pbmcgdGhlIGZpdA0KT3B0IDwtIG9wdGltKGMoMC41LCAwLjUpLCBSU1MsIG1ldGhvZCA9ICJMLUJGR1MtQiIsIGxvd2VyID0gYygwLCAwKSwgdXBwZXIgPSBjKDEsIDEpKSAjIG9wdGltaXplIHdpdGggc29tZSBzZW5zaWJsZSBjb25kaXRpb25zDQoNCk9wdF9wYXJfbmV3IDwtIHNldE5hbWVzKE9wdCRwYXIsIGMoImJldGEiLCAiZ2FtbWEiKSkNCk9wdF9wYXJfbmV3DQpgYGANCg0KTGEgZXN0aW1hY2nDs24gZGUgJFJfMCQgYSBsYSBmZWNoYSBhY3R1YWwgZXMgbGEgc2lndWllbnRlOg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClIwX25ldyA8LSBzZXROYW1lcyhPcHRfcGFyX25ld1siYmV0YSJdIC8gT3B0X3Bhcl9uZXdbImdhbW1hIl0sICJSMCIpDQpSMF9uZXcNCmBgYA0KU2Vnw7puIGVsIHJlc3VsdGFkbyBhbnRlcmlvciwgcG9yIGNhZGEgcGVyc29uYSBpbmZlY3RhZGEgZW4gQm9nb3TDoSwgZXN0w6EgdGllbmUgbGEgY2FwYWNpZGFkIGRlIGluZmVjdGFyIGByIHJvdW5kKFIwX25ldywyKWAgcGVyc29uYXMuDQoNCkVsIG7Dum1lcm8gZGUgZGlhcyBwYXJhIGxsZWdhciBhbCBtw6F4aW1vIGEgbGEgZmVjaGEgZGUgaG95IGVzIGRlOg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnQgPC0gMTozMDAgIyB0aW1lIGluIGRheXMNCmZpdCA8LSBkYXRhLmZyYW1lKG9kZSh5ID0gaW5pdCwgdGltZXMgPSB0LCBmdW5jID0gU0lSLCBwYXJtcyA9IE9wdF9wYXJfbmV3KSkNCg0KbWF4aW1vIDwtIGZpdFtmaXQkSSA9PSBtYXgoZml0JEkpLCAiSSIsIGRyb3AgPSBGQUxTRV0gIyBoZWlnaHQgb2YgcGFuZGVtaWMNCmRpYXNfbWF4X25ldyA8LSBhcy5udW1lcmljKHJvdy5uYW1lcyhtYXhpbW8pKQ0KZGlhc19tYXhfbmV3DQpgYGANClBvciBsbyBxdWUgZWwgbcOheGltbyBzZSBhbGNhbnphcsOtYSBhIGxvcyBgciBkaWFzX21heF9uZXdgIGRpYXMuIEEgZmVjaGEgZGUgaG95IGByIFN5cy5EYXRlKClgIGhhbiBwYXNhZG8gYHIgbnJvdyhkZjIpYCAgZMOtYXMgcG9yIGxvIHF1ZSB5YSBoZW1vcyBhbGNhbnphZG8gZWwgbcOheGltbyBzZWfDum4gZWwgbW9kZWxvIGFqdXN0YWRvLg0KDQojIEVzdGltYWNpw7NuIGRlIGxvcyBwYXJhbWV0cm9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgaW5mZWN0YWRvcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YS5zaW11bGEgPC0gZGF0YS5mcmFtZShkaWFzID0gMTozMDAsZnJlY3VlbmNpYT1maXQkSSkNCg0KbWVkaWEgPC0gSG1pc2M6Ond0ZC5tZWFuKGRhdGEuc2ltdWxhJGRpYXMsZGF0YS5zaW11bGEkZnJlY3VlbmNpYSkNCnZhcmlhIDwtIEhtaXNjOjp3dGQudmFyKGRhdGEuc2ltdWxhJGRpYXMsZGF0YS5zaW11bGEkZnJlY3VlbmNpYSkNCmRlc3ZpYSA8LSBzcXJ0KHZhcmlhKQ0KDQptdSA8LSBleHAoY29lZihsbShsb2cobW9kZWxvJGZpdHRlZC52YWx1ZXMpfjEpKSkNCmRpc3BlciA8LSBzdW1tYXJ5KG1vZGVsbykkZGlzcGVyc2lvbg0KYGBgDQpSZWNvcmRlbW9zIHF1ZSBsYSBlc3RpbWFjacOzbiBkZWwgbsO6bWVybyBwcm9tZWRpbyBkZSBkw61hcyBxdWUgdmFtb3MgYSBlc3RhciBlbiBjdWFyZW50ZW5hIHNlZ8O6biBlbCBtb2RlbG8gU0lSIGVzIGRlICRgciBtZWRpYWAkLiBBIGNvbnRpbnVhY2nDs24gc2UgZXN0aW1hbiBlbCBuw7ptZXJvIGRlIGNhc29zIHF1ZSBzZSBwdWVkZW4gZGFyIGVuIGxvcyBzaWd1aWVudGVzIGTDrWFzIHRlbmllbmRvIGVuIGN1ZW50YSBsb3Mgc2lndWllbnRlcyBzdXB1ZXN0b3MuDQoNCg0KKiBTZWfDum4gbGEgbGl0ZXJhdHVyYSB5IGVsIGFqdXN0ZSBkZWwgbW9kZWxvIHF1YXNpLXBvaXNzb24gY29uc3RydWlkbyBzZSB0aWVuZSBxdWUgIGxvcyBwYXLDoW1ldHJvcyBzb24gbG9zIHNpZ3VpZW50ZXMgJFxtdSA9IGByIG11YCQgeSAkXHRoZXRhID0gYHIgZGlzcGVyYCQgKGVzdG9zIHZhbG9yZXMgc29uIHRvbWFkb3MgZGVsIGFqdXN0ZSBvYnRlbmlkbyBlbiBsYSByZWdyZXNpw7NuIGFudGVyaW9yIGNvbW8gZW4gbGEgc2ltdWxhY2nDs24gZGUgZGlhcykuDQoqIFNlIGFzdW1lIHF1ZSBhIHBhcnRpciBkZSBsYSBtZWRpYSBzZSByZWZsZWphbiBlbCA1MCUgZGUgbG9zIGNhc29zIGFjdHVhbGVzIHF1ZSBzZSBwdWVkZW4gdGVuZXIgYSBsYSBmZWNoYS4NCg0KVGVuaWVuZG8gZW4gY3VlbnRhIGxvIGFudGVyaW9yIHNlIHByb2NlZGUgYSByZWFsaXphciB1biBwcm9jZXNvIGRlIHNpbXVsYWNpw7NuIHkgbG9zIHJlc3VsdGFkb3MgZmluYWxlcyBzb24gbG9zIHNpZ3VpZW50ZXM6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQphanVzdGUgPC0gZGF0YS5mcmFtZShmZWNoYXMgPSBhc19kYXRlKGFzLkRhdGUoIjIwMjAvMDMvMDYiKTooYXMuRGF0ZSgiMjAyMC8wMy8wNiIpICsgMjk5KSkpDQphanVzdGUkbW9kZWxvX1NJUiA8LSByb3VuZChmaXQkSSkNCmFqdXN0ZSRtb2RlbG9fcXVhc2lwb2lzc29uIDwtIE5BDQpkYXRhX3ByZWRpYyA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZGVsbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh0aWVtcG8gPSAxOm11KSx0eXBlID0gInJlc3BvbnNlIikNCmFqdXN0ZVsxOmxlbmd0aChkYXRhX3ByZWRpYyksXSRtb2RlbG9fcXVhc2lwb2lzc29uIDwtIGRhdGFfcHJlZGljDQoNCmRpZl9taW4gPC0gbWluKGFwcGx5KGFqdXN0ZVssMjozXSwxLGRpc3QpLG5hLnJtID0gVCkNCg0KcHVudG8xIDwtIGFzLm51bWVyaWMocm93Lm5hbWVzKG5hLm9taXQoYWp1c3RlW2FwcGx5KGFqdXN0ZVssMjozXSwxLGRpc3QpID09IGRpZl9taW4sXSkpKQ0KcHVudG8yIDwtIHJvdW5kKG1lZGlhICsgZGlzcGVyKQ0KYWp1c3RlIDwtIGFqdXN0ZVsxOjMwMCxdDQphanVzdGUkYXJyZWdsbyA8LSByb3VuZChjKGFqdXN0ZVsxOihwdW50bzEtMSksXSRtb2RlbG9fU0lSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhanVzdGVbcHVudG8xOihwdW50bzItMSksXSRtb2RlbG9fcXVhc2lwb2lzc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhanVzdGVbcHVudG8yOjMwMCxdJG1vZGVsb19TSVIpKQ0KYWp1c3RlJGFycmVnbG8gPC0gcmVwbGFjZShhanVzdGUkYXJyZWdsbywgYWp1c3RlJGFycmVnbG8gPiA0MDAwLCBOQSkgIyBBcnJlZ2xvDQphanVzdGUkdGllbXBvIDwtIDE6bnJvdyhhanVzdGUpDQpsaWJyYXJ5KG1pY2UpDQppbXAgPC0gbWljZShzZWxlY3QoYWp1c3RlLHRpZW1wbywgYXJyZWdsbyksbWV0aG9kID0gInJmIikNCmFqdXN0ZSRhcnJlZ2xvIDwtIGNvbXBsZXRlKGltcCkkYXJyZWdsbw0KYWp1c3RlJGNvbnRlbyA8LSBOQQ0KYWp1c3RlWzE6bGVuZ3RoKGRmJGNvbnRlbyksXSRjb250ZW8gPC0gZGYkY29udGVvDQphanVzdGUkYWN1bXVsYWRvIDwtIE5BDQphanVzdGVbMTpsZW5ndGgoZGYkY29udGVvKSxdJGFjdW11bGFkbyA8LSBjdW1zdW0oZGYkY29udGVvKQ0KDQphanVzdGUkcHJlZCA8LSBhanVzdGUkYXJyZWdsbw0KYWp1c3RlJHByZWRfY3VtIDwtIGN1bXN1bShhanVzdGUkYXJyZWdsbykNCmBgYA0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojcnFwb2lzIDwtIGZ1bmN0aW9uKG4sbXUsdGhldGEpew0KIyAgcm5iaW5vbShuPW4sIG11ID0gbXUsIHNpemUgPSBtdS8odGhldGEtMSkpDQojfQ0KDQojaSA8LSAwDQojaiA8LSAxDQojd2hpbGUoaiA8IG11KXsNCiMgIGogPC0gaipleHAobW9kZWxvJGNvZWZmaWNpZW50cylbMl0NCiMgIGkgPC0gaSsxDQojfQ0KDQojY2Fzb3M1MDwtc3VtKHByZWRpY3Qob2JqZWN0ID0gbW9kZWxvLG5ld2RhdGEgPSBkYXRhLmZyYW1lKHRpZW1wbyA9IDE6aSksdHlwZSA9ICJyZXNwb25zZSIpKQ0KI211IDwtIGV4cChjb2VmKGxtKGxvZyhtb2RlbG8kZml0dGVkLnZhbHVlcyl+MSkpKQ0KI2Rpc3BlciA8LSBzdW1tYXJ5KG1vZGVsbykkZGlzcGVyc2lvbg0KIyANCiNzZXQuc2VlZCgxNTA3MjAyMCkNCiNzaW11bGEgPC0gcnFwb2lzKDMqY2Fzb3M1MCxtZWRpYSxkaXNwZXIpDQojIA0KI2RpYXNfbWluIDwtIG1pbihzaW11bGEpDQojZGlhc19tYXggPC0gbWF4KHNpbXVsYSkNCiMgDQojcmVzdWx0YWRvcyA8LSBoaXN0KHNpbXVsYSxicmVha3MgPSAwOihkaWFzX21heCsxKSxwbG90ID0gRkFMU0UpJGNvdW50cw0KIyANCiNwbG90KGRmJGNvbnRlbykNCiMgbGluZXMocmVzdWx0YWRvc1sxOmxlbmd0aChkZiRjb250ZW8pXSkNCiMgbGluZXMobW9kZWxvJGZpdHRlZC52YWx1ZXMpDQojIGRhdGEuZnJhbWUoY3Vtc3VtKGRmJGNvbnRlbyksY3Vtc3VtKHJlc3VsdGFkb3NbMTpsZW5ndGgoZGYkY29udGVvKV0pKQ0KIyANCiMgcGxvdChjdW1zdW0oZGYkY29udGVvKSkNCiMgbGluZXMoY3Vtc3VtKHJlc3VsdGFkb3NbMTpsZW5ndGgoZGYkY29udGVvKV0pKQ0KIyANCiMgc2V0LnNlZWQoMTUwNzIwMjApDQojIHNpbXVsYSA8LSBtYXRyaXgoTkEsbmNvbCA9IDEwMDAsbnJvdyA9IDIqY2Fzb3M1MCkNCiMgZm9yKGkgaW4gMToxMDAwKXsNCiMgICBzaW11bGFbLGldIDwtIHJxcG9pcygyKmNhc29zNTAsbXUsZGlzcGVyKQ0KIyB9DQojIA0KIyBkaWFzX21pbiA8LSBtaW4oc2ltdWxhKQ0KIyBkaWFzX21heCA8LSBtYXgoc2ltdWxhKQ0KIyANCiMgc2ltdWxhIDwtIGRhdGEuZnJhbWUoc2ltdWxhKQ0KIyANCiMgcmVzdWx0YWRvcyA8LSBhcHBseShzaW11bGEsMixoaXN0LGJyZWFrcyA9IGRpYXNfbWluOmRpYXNfbWF4LHBsb3QgPSBGQUxTRSkNCiMgDQojIGhpc3RvZ3JhbWFzIDwtIG1hdHJpeChOQSxuY29sID0gZGlhc19tYXgsIG5yb3cgPSAxMDAwKQ0KIyBmb3IoaSBpbiAxOjEwMDApew0KIyAgIGhpc3RvZ3JhbWFzW2ksXSA8LSByZXN1bHRhZG9zW1tpXV0kY291bnRzDQojIH0NCiMgDQojIGludGVydmFsbyA8LSBkYXRhLmZyYW1lKHQoYXBwbHkoaGlzdG9ncmFtYXMsMixxdWFudGlsZSxjKDAuMDUvMiwxLTAuMDUvMikpKSkNCiMgbmFtZXMoaW50ZXJ2YWxvKSA8LSBjKCJsb3dlciIsInVwcGVyIikNCiMgaW50ZXJ2YWxvJHByZWQgPC0gYXBwbHkoaGlzdG9ncmFtYXMsMixtZWFuKQ0KIyBpbnRlcnZhbG8gPC0gaW50ZXJ2YWxvICU+JSBzZWxlY3QobG93ZXIsIHByZWQsIHVwcGVyKQ0KDQoNCiMgaW50ZXJ2YWxvJGxvd2VyX2N1bSA8LSBjdW1zdW0oaW50ZXJ2YWxvJGxvd2VyKQ0KIyBpbnRlcnZhbG8kcHJlZF9jdW0gPC0gY3Vtc3VtKGludGVydmFsbyRwcmVkKQ0KIyBpbnRlcnZhbG8kdXBwZXJfY3VtIDwtIGN1bXN1bShpbnRlcnZhbG8kdXBwZXIpDQojIGludGVydmFsbyR0aWVtcG8gPC0gMTpucm93KGludGVydmFsbykNCiMgaW50ZXJ2YWxvJGFjdW11bGFkbyA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZGYkYWN1bXVsYWRvKSxdJGFjdW11bGFkbyA8LSBkZiRhY3VtdWxhZG8NCiMgaW50ZXJ2YWxvJGNvbnRlbyA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZGYkY29udGVvKSxdJGNvbnRlbyA8LSBkZiRjb250ZW8NCiMgbmFtZXMoaW50ZXJ2YWxvKSA8LSBjKA0KIyAgICJsb3dlciIsICJwcmVkIiwgInVwcGVyIiwgImxvd2VyX2N1bSIsICJwcmVkX2N1bSIsICJ1cHBlcl9jdW0iLCAidGllbXBvIiwgImFjdW11bGFkbyIsICJjb250ZW8iKQ0KIyANCiMgaW50ZXJ2YWxvJGZlY2hhcyA8LSBhc19kYXRlKGFzLkRhdGUoIjIwMjAvMDMvMDYiKTooYXMuRGF0ZSgiMjAyMC8wMy8wNiIpICsgbnJvdyhpbnRlcnZhbG8pLTEpKQ0KIyANCiMgDQojIA0KIyANCiMgaW50ZXJ2YWxvJHBydWViYSA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZml0JEkpLF0kcHJ1ZWJhIDwtIGZpdCRJDQojIGludGVydmFsbyRwcnVlYmEyIDwtIE5BDQojIGFqdXN0ZSA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZGVsbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh0aWVtcG8gPSAxOnJvdW5kKG1lZGlhK2Rpc3BlcikpLHR5cGUgPSAicmVzcG9uc2UiKQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoYWp1c3RlKSxdJHBydWViYTIgPC0gYWp1c3RlDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQphanVzdGUgJT4lIHNlbGVjdChmZWNoYXMsIHByZWQsIHByZWRfY3VtLCBjb250ZW8sICBhY3VtdWxhZG8pDQpgYGANCg0KQSBjb250aW51YWNpw7NuIHNlIHJldmlzYSBlbCBhanVzdGUgbWVkaWFudGUgZWwgZ3LDoWZpY28gZGUgY2Fzb3MgYWN1bXVsYWRvcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFqdXN0ZSAlPiUgZ2dwbG90KGFlcyh4ID0gdGllbXBvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkX2N1bSxjb2xvdXIgPSAiUmVkIikpICtnZW9tX3BvaW50KGFlcyh5ID0gYWN1bXVsYWRvKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBucm93KGFqdXN0ZSkpLCBicmVha3MgPSBzZXEoMCwgMzAwLCBieSA9IDIpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsc2l6ZT03LCB2anVzdCA9IDAuNSkpICsgeWxhYigiUHJlZGljY2lvbmVzIGRlIGNhc29zIHNpbXVsYWRvcyIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFqdXN0ZSAlPiUgZ2dwbG90KGFlcyh4ID0gdGllbXBvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkLGNvbG91ciA9ICJSZWQiKSkgKyBnZW9tX3BvaW50KGFlcyh5ID0gY29udGVvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBjb250ZW8pKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIG5yb3coYWp1c3RlKSksIGJyZWFrcyA9IHNlcSgwLCAzMDAsIGJ5ID0gMikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KGFqdXN0ZSRjb250ZW8sbmEucm0gPSBUKSs1MDApLCBicmVha3MgPSBzZXEoMCwgbWF4KGFqdXN0ZSRjb250ZW8sbmEucm0gPSBUKSs1MDAsIGJ5ID0gMTAwMCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIixheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCxzaXplPTcsIHZqdXN0ID0gMC41KSkgKyB5bGFiKCJQcmVkaWNjaW9uZXMgZGUgY2Fzb3Mgc2ltdWxhZG9zIGRpYXJpb3MiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm9wZW54bHN4Ojp3cml0ZS54bHN4KHggPSBhanVzdGUsZmlsZSA9ICJyZXMvaW50ZXJ2YWxvLnhsc3giKQ0KYGBgDQo=