Regresión Lineal Simple

Un modelo de regresión es un modelo que permite describir cómo influye una variable X sobre otra variable Y.

  • X: Variable independiente o explicativa o exógena o predictora

  • Y: Variable dependiente o respuesta o endógena

El objetivo es obtener estimaciones razonables de Y para distintos valores de X a partir de una muestra de n pares de valores \((x_{1}, y_{1}), (x_{2}, y_{2}),...,(x_{n}, y_{n})\) .


Ejemplos


  • Estudiar cómo influye la estatura del padre (X) sobre la estatura del hijo (Y)
  • Estimar el precio de una vivienda (Y) en función de su superficie (X).
  • Aproximar la calificación obtenida en una materia (Y) según el número de horas de estudio semanal (X).
  • Prever el tiempo de cálculo de un programa (Y) en función de la velocidad del procesador (X).
  • Predecir la duración de una leche en días (Y) a partir de la temperatura a la que se almacena (X).

Supongamos que queremos encontrar la relación que hay entre las estaturas (X) y pesos (Y) de alumnos universitarios y que se consiguen las siguientes mediciones en 8 alumnos:

Para encontrar el modelo lo que se debe hacer es:

  1. Ver la forma que tiene la relación entre las variables. Esto se consigue a través de un gráfico de dispersión
estaturaX <- c(1.58, 1.63, 1.68, 1.74, 1.78, 1.85, 1.90, 1.94)
pesoY <- c(60, 64, 69, 75, 80, 84, 91, 95)
plot(estaturaX,pesoY, xlab = "Estatura (m)", ylab = "Peso (Kg)", main = "Alumnos Universitarios")

En éste puede verse que la forma de la relación es cómo un línea recta. Pero no solo puede haber relaciones lineales:

  1. Se debe describir el sentido y la fuerza de la relación.

Sentido de la relación

  • Puede ser positivo, si cuando X crece tambien lo hace Y o viceversa. En este caso el coeficiente de correlación es positivo.
  • Negativo, si Y disminuye cuando X crece.El coeficiente de correlación es negativo.

Las estaturas y los pesos se relacionan con sentido positivo, pues si crece l estatura también lo hace el peso.

Fuerza de la relación

Tiene que ver con lo cercano que están los puntos originales a una linea (ya sea recta o curva) imaginaria que pasa entre los puntos.

plot(estaturaX ~ pesoY, xlab = "Estatura (m)", ylab = "Peso (Kg)", main = "Alumnos Universitarios")
abline(lm(estaturaX ~ pesoY), col='red')

En este caso puede decirse que hay una relación fuerte.

Dado que es subjetivo hablar sobre la fuerza de la relación sólo con ver el gráfico, hay un número que mide esa relación. Este número es el coeficiente de correlación de Pearson:

\(r = \frac{n\sum XY-(\sum X\sum Y)}{\sqrt{(n\sum x^{2}-(\sum x)^{2})(n\sum y^{2}-(\sum y)^{2})}}\)

Los cálculos que deben hacersese muestran en la siguiente imágen:

Por lo que el coeficiente r es:

\(r=\frac{8*1100.54-(14.1*618)}{\sqrt{[8*24.9678-14.1^2][8*48844-618^2]}} = 0.99772821\)

Esto quiere decir que hay una relación muy alta según la siguiente tabla (considere el valor absoluto).

  1. Cómo la forma de la relación es una linea recta, entonces habrá que calcular los parámetros de la linea recta que mejor representa esta relación:
\(Y=a+bX\)

Donde a es la ordenada al origen y b es la pendiente de la recta. Para encontrar estos parámetros se recurre a un procedimiento denominado método de los mínimos cuadrados. Esto es, la línea recta obtenida con éste método pasa lo más cerca posiblede los pares de puntos:

\(b=\frac{n\sum XY-(\sum X\sum Y)}{n\sum x^{2}-(\sum x)^{2}}\)

\(b=\frac{8*1100.54-(14.1*618)}{8*24.9678-14.1^2} = 97.08\)

y la ordenada al origen

\(a=\bar{y}-b*\bar{x}\)

Finalmente, la ecuación de la linea recta es:

\(Y = -93.86 + 97.08 * X\)

Esta ecuación permite hacer estimaciones del peso de un alumno en fnción de su estatura, por ejemplo, si un alumno mide 1.73 ¿cuánto pesará?

Basta con sustituir en la ecuación para obteer el resultado de la estimación:

\(Y = -93.86 + 97.08 * 1.73 = 74.0949\)

Es decir, que se espera que ese alumno pese aproximadamente 74.09 kg.


TAREA


1. Los siguientes datos son sobre el tiempo en minutos de llamadas y el costo en pesos del servicio.

¿Cuál es la variable que depende Y?

El costo del servicio

¿Cuál es la variable independiente X?

El tiempo de la llamada

Construya el diagrama de dispersión. Diga cuál es la forma de la relación, cuál es el sentido

tiempo <- c(2, 4, 6, 8, 10)
costo <- c(2, 5, 7, 9, 11)
n1 <- length(tiempo)

plot(tiempo ~ costo, xlab = "Tiempo (min)", ylab = "Costo del Servicio", main = "Costo de las llamadas por minuto", col ='#045FB4')
abline(lm(tiempo ~ costo), col='#DF3A01')

La relacion tiene forma

Calcule el coeficiente de correlación y haga la interpretación según la tabla.

Cálculos previos

Calculo del Coeficiente de correlación de Pearson r

r1 <- (n1*248 - (30 * 34)) / (sqrt((n1*220-(30)^2)*(n1*280-(34)^2)))
r1
[1] 0.9958932

El valor de r entre la duración de las llamadas con la con el costo de ese servicio es de 0.995, lo que indica que la correlación es muy alta casi perfecta.

Encuentre el valor de la pendiente b

b1 <- (n1*248 - (30 * 34)) / (n1*220-(30)^2)
b1
[1] 1.1

El Valor de b para este problema es de 1.1.

Encuentre el valor de la ordenada al origen a

a1 <- (34/n1)-1.1 * (30/n1)
a1
[1] 0.2

El valor de a para este problema es de 0.2

Escriba la ecuación que relaciona a estas dos variables.

\(Y = 0.2 +1.1*X\)

Use esta ecuación para pronosticar cuánto costará una llamada que tarda 3.5 min

y3.5 <- 0.2+1.1*(3.5)
y3.5
[1] 4.05

Si una llamada dura 3.5 minutos el costo de la mimas será de 4.05.


2. La duración de la leche en dias se relaciona con la temperatura de su almacenamiento en gradoscentígrados. Se obtuvieron los siguientes datos:

¿Cuál es la variable que depende Y?

La Duración de la leche (días).

¿Cuál es la variable independiente X?

La temperatura a la que se almacena la leche (°C).

Construya el diagrama de dispersión. Diga cuál es la forma de la relación, cuál es el sentido

temperatura <- c(0, 5, 10, 15, 20, 25)
duracion <- c(24, 20, 16, 10, 2, 1)
n2 <- length(temperatura)

plot(temperatura ~ duracion, xlab = "Temperatura (°C)", ylab = "Duración (Días)", main = "Leche", col='#298A08')
abline(lm(temperatura ~ duracion), col='#FE2E2E')

Es una correlación lineal negativa, porque conforme aumenta la temperatura, disminuye la duración.

Calcule el coeficiente de correlación y haga la interpretación según la tabla.

Cálculos previos

Calculo del Coeficiente de correlación de Pearson r

r2 <- (n2*475 - (75 * 73)) / (sqrt((n2*1375-(75)^2)*(n2*1337-(73)^2)))
r2
[1] -0.987294

El valor de r entre la duración de la leche con la temperatura es de -0.987, lo que indica que la correlación es muy alta.

Encuentre el valor de la pendiente b

b2 <- (n2*475 - (75 * 73)) / (n2*1375-(75)^2)
b2
[1] -1

El Valor de b para este problema es de -1.

Encuentre el valor de la ordenada al origen a

a2 <- (73/n2)-(-1) * (75/n2)
a2
[1] 24.66667
e <- (618/8)-97.08*(14.1/8)
e
[1] -93.8535

El valor de a para este problema es de 24.67

Escriba la ecuación que relaciona a estas dos variables.

\(Y = 24.67 -1*X\)

Use esta ecuación para pronosticar cuánto durará la leche si se almacena a 3 grados centígrados

y3 <- 24.67-1*(3)
y3
[1] 21.67

A los 3°C la leche durará 22 dias.

………………… Melanie Icedo Félix …………………

LS0tDQp0aXRsZTogIkFzaWduYWNpw7NuIDggLSBNZWxhbmllIEljZWRvIEZlbGl4Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNClVuIG1vZGVsbyBkZSAqKnJlZ3Jlc2nDs24qKiBlcyB1biBtb2RlbG8gcXVlIHBlcm1pdGUgZGVzY3JpYmlyIGPDs21vIGluZmx1eWUgdW5hIHZhcmlhYmxlICoqWCoqIHNvYnJlIG90cmEgdmFyaWFibGUgKipZKiouDQoNCiogKipYOioqIFZhcmlhYmxlIGluZGVwZW5kaWVudGUgbyBleHBsaWNhdGl2YSBvIGV4w7NnZW5hIG8gcHJlZGljdG9yYQ0KDQoqICoqWToqKiBWYXJpYWJsZSBkZXBlbmRpZW50ZSBvIHJlc3B1ZXN0YSBvIGVuZMOzZ2VuYQ0KDQpFbCBvYmpldGl2byBlcyBvYnRlbmVyIGVzdGltYWNpb25lcyByYXpvbmFibGVzIGRlICoqWSoqIHBhcmEgZGlzdGludG9zIHZhbG9yZXMgZGUgKipYKiogYSBwYXJ0aXIgZGUgdW5hIG11ZXN0cmEgZGUgKipuKiogcGFyZXMgZGUgdmFsb3JlcyAgJCh4X3sxfSwgeV97MX0pLCAoeF97Mn0sIHlfezJ9KSwuLi4sKHhfe259LCB5X3tufSkkICAuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgRWplbXBsb3MNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KKiBFc3R1ZGlhciBjw7NtbyBpbmZsdXllIGxhIGVzdGF0dXJhIGRlbCBwYWRyZSAoWCkgc29icmUgbGEgZXN0YXR1cmEgZGVsIGhpam8gKFkpDQoqIEVzdGltYXIgZWwgcHJlY2lvIGRlIHVuYSB2aXZpZW5kYSAoWSkgZW4gZnVuY2nDs24gZGUgc3Ugc3VwZXJmaWNpZSAoWCkuDQoqIEFwcm94aW1hciBsYSBjYWxpZmljYWNpw7NuIG9idGVuaWRhIGVuIHVuYSBtYXRlcmlhIChZKSBzZWfDum4gZWwgbsO6bWVybyBkZSBob3JhcyBkZSBlc3R1ZGlvIHNlbWFuYWwgKFgpLg0KKiBQcmV2ZXIgZWwgdGllbXBvIGRlIGPDoWxjdWxvIGRlIHVuIHByb2dyYW1hIChZKSBlbiBmdW5jacOzbiBkZSBsYSB2ZWxvY2lkYWQgZGVsIHByb2Nlc2Fkb3IgKFgpLg0KKiBQcmVkZWNpciBsYSBkdXJhY2nDs24gZGUgdW5hIGxlY2hlIGVuIGTDrWFzIChZKSBhIHBhcnRpciBkZSBsYSB0ZW1wZXJhdHVyYSBhIGxhIHF1ZSBzZSBhbG1hY2VuYSAoWCkuDQoNClN1cG9uZ2Ftb3MgcXVlIHF1ZXJlbW9zIGVuY29udHJhciBsYSByZWxhY2nDs24gcXVlIGhheSBlbnRyZSBsYXMgZXN0YXR1cmFzIChYKSB5IHBlc29zIChZKSBkZSBhbHVtbm9zIHVuaXZlcnNpdGFyaW9zIHkgcXVlIHNlIGNvbnNpZ3VlbiBsYXMgc2lndWllbnRlcyBtZWRpY2lvbmVzIGVuIDggYWx1bW5vczoNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4NCiFbXShFamVtcGxvQThSZWdyZWNpb25MaW5lYWwuUE5HKQ0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNClBhcmEgZW5jb250cmFyIGVsIG1vZGVsbyBsbyBxdWUgc2UgZGViZSBoYWNlciBlczoNCg0KMS4gVmVyIGxhIGZvcm1hIHF1ZSB0aWVuZSBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4gRXN0byBzZSBjb25zaWd1ZSBhIHRyYXbDqXMgZGUgdW4gZ3LDoWZpY28gZGUgZGlzcGVyc2nDs24NCg0KYGBge3IgRWplbXBsbyBkaXNwZXJjacOzbiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZXN0YXR1cmFYIDwtIGMoMS41OCwgMS42MywgMS42OCwgMS43NCwgMS43OCwgMS44NSwgMS45MCwgMS45NCkNCnBlc29ZIDwtIGMoNjAsIDY0LCA2OSwgNzUsIDgwLCA4NCwgOTEsIDk1KQ0KcGxvdChlc3RhdHVyYVggfiBwZXNvWSwgeGxhYiA9ICJFc3RhdHVyYSAobSkiLCB5bGFiID0gIlBlc28gKEtnKSIsIG1haW4gPSAiQWx1bW5vcyBVbml2ZXJzaXRhcmlvcyIpDQpgYGANCg0KRW4gw6lzdGUgcHVlZGUgdmVyc2UgcXVlIGxhIGZvcm1hIGRlIGxhIHJlbGFjacOzbiBlcyBjw7NtbyB1biBsw61uZWEgcmVjdGEuIFBlcm8gbm8gc29sbyBwdWVkZSBoYWJlciByZWxhY2lvbmVzIGxpbmVhbGVzOg0KDQohW10oVGlwb3NfZGVfQ29ycmVsYWNpw7NuLlBORykNCg0KMi4gU2UgZGViZSBkZXNjcmliaXIgZWwgc2VudGlkbyB5IGxhIGZ1ZXJ6YSBkZSBsYSByZWxhY2nDs24uDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQojIyMgU2VudGlkbyBkZSBsYSByZWxhY2nDs24NCg0KKiBQdWVkZSBzZXIgcG9zaXRpdm8sIHNpIGN1YW5kbyAqKlgqKiBjcmVjZSB0YW1iaWVuIGxvIGhhY2UgKipZKiogbyB2aWNldmVyc2EuIEVuIGVzdGUgY2FzbyBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZXMgcG9zaXRpdm8uDQoqIE5lZ2F0aXZvLCBzaSAqKlkqKiBkaXNtaW51eWUgY3VhbmRvICoqWCoqIGNyZWNlLkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBlcyBuZWdhdGl2by4NCg0KTGFzIGVzdGF0dXJhcyB5IGxvcyBwZXNvcyBzZSByZWxhY2lvbmFuIGNvbiBzZW50aWRvIHBvc2l0aXZvLCBwdWVzIHNpIGNyZWNlIGwgZXN0YXR1cmEgdGFtYmnDqW4gbG8gaGFjZSBlbCBwZXNvLg0KDQojIyMgRnVlcnphIGRlIGxhIHJlbGFjacOzbg0KDQpUaWVuZSBxdWUgdmVyIGNvbiBsbyBjZXJjYW5vIHF1ZSBlc3TDoW4gbG9zIHB1bnRvcyBvcmlnaW5hbGVzIGEgdW5hIGxpbmVhICh5YSBzZWEgcmVjdGEgbyBjdXJ2YSkgaW1hZ2luYXJpYSBxdWUgcGFzYSBlbnRyZSBsb3MgcHVudG9zLg0KDQpgYGB7cn0NCnBsb3QoZXN0YXR1cmFYIH4gcGVzb1ksIHhsYWIgPSAiRXN0YXR1cmEgKG0pIiwgeWxhYiA9ICJQZXNvIChLZykiLCBtYWluID0gIkFsdW1ub3MgVW5pdmVyc2l0YXJpb3MiKQ0KYWJsaW5lKGxtKGVzdGF0dXJhWCB+IHBlc29ZKSwgY29sPSdyZWQnKQ0KYGBgDQoNCg0KRW4gZXN0ZSBjYXNvIHB1ZWRlIGRlY2lyc2UgcXVlIGhheSB1bmEgcmVsYWNpw7NuIGZ1ZXJ0ZS4NCg0KRGFkbyBxdWUgZXMgc3ViamV0aXZvIGhhYmxhciBzb2JyZSBsYSBmdWVyemEgZGUgbGEgcmVsYWNpw7NuIHPDs2xvIGNvbiB2ZXIgZWwgZ3LDoWZpY28sIGhheSB1biBuw7ptZXJvIHF1ZSBtaWRlIGVzYSByZWxhY2nDs24uIEVzdGUgbsO6bWVybyBlcyBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbjoNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4NCiRyID0gXGZyYWN7blxzdW0gWFktKFxzdW0gWFxzdW0gWSl9e1xzcXJ0eyhuXHN1bSB4XnsyfS0oXHN1bSB4KV57Mn0pKG5cc3VtIHleezJ9LShcc3VtIHkpXnsyfSl9fSQgIA0KDQohW10oVmFsb3JSLlBORykNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpMb3MgY8OhbGN1bG9zIHF1ZSBkZWJlbiBoYWNlcnNlc2UgbXVlc3RyYW4gZW4gbGEgc2lndWllbnRlIGltw6FnZW46DQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQohW10oY2FsY3Vsb3NFeGNlbC5QTkcpDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KUG9yIGxvIHF1ZSBlbCBjb2VmaWNpZW50ZSAqKnIqKiBlczoNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4NCiRyPVxmcmFjezgqMTEwMC41NC0oMTQuMSo2MTgpfXtcc3FydHtbOCoyNC45Njc4LTE0LjFeMl1bOCo0ODg0NC02MTheMl19fSA9IDAuOTk3NzI4MjEkDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRXN0byBxdWllcmUgZGVjaXIgcXVlIGhheSB1bmEgcmVsYWNpw7NuIG11eSBhbHRhIHNlZ8O6biBsYSBzaWd1aWVudGUgdGFibGEgKGNvbnNpZGVyZSBlbCB2YWxvciBhYnNvbHV0bykuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQohW10oSW50ZXJwcmVyYWNpb24gVmFsb3JlcyBkZSBSLlBORykNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQozLiBDw7NtbyBsYSBmb3JtYSBkZSBsYSByZWxhY2nDs24gZXMgdW5hIGxpbmVhIHJlY3RhLCBlbnRvbmNlcyBoYWJyw6EgcXVlIGNhbGN1bGFyIGxvcyBwYXLDoW1ldHJvcyBkZSBsYSBsaW5lYSByZWN0YSBxdWUgbWVqb3IgcmVwcmVzZW50YSBlc3RhIHJlbGFjacOzbjoNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4NCiRZPWErYlgkDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRG9uZGUgKiphKiogZXMgbGEgb3JkZW5hZGEgYWwgb3JpZ2VuIHkgKipiKiogZXMgbGEgcGVuZGllbnRlIGRlIGxhIHJlY3RhLiBQYXJhIGVuY29udHJhciBlc3RvcyBwYXLDoW1ldHJvcyBzZSByZWN1cnJlIGEgdW4gcHJvY2VkaW1pZW50byBkZW5vbWluYWRvIG3DqXRvZG8gZGUgbG9zIG3DrW5pbW9zIGN1YWRyYWRvcy4gRXN0byBlcywgbGEgbMOtbmVhIHJlY3RhIG9idGVuaWRhIGNvbiDDqXN0ZSBtw6l0b2RvIHBhc2EgbG8gbcOhcyBjZXJjYSBwb3NpYmxlZGUgbG9zIHBhcmVzIGRlIHB1bnRvczoNCg0KDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQokYj1cZnJhY3tuXHN1bSBYWS0oXHN1bSBYXHN1bSBZKX17blxzdW0geF57Mn0tKFxzdW0geCleezJ9fSQNCg0KJGI9XGZyYWN7OCoxMTAwLjU0LSgxNC4xKjYxOCl9ezgqMjQuOTY3OC0xNC4xXjJ9ID0gOTcuMDgkDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KDQoNCnkgbGEgb3JkZW5hZGEgYWwgb3JpZ2VuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQokYT1cYmFye3l9LWIqXGJhcnt4fSQNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQoNCg0KRmluYWxtZW50ZSwgbGEgZWN1YWNpw7NuIGRlIGxhIGxpbmVhIHJlY3RhIGVzOg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KJFkgPSAtOTMuODYgKyA5Ny4wOCAqIFgkDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KDQoNCkVzdGEgZWN1YWNpw7NuIHBlcm1pdGUgaGFjZXIgZXN0aW1hY2lvbmVzIGRlbCBwZXNvIGRlIHVuIGFsdW1ubyBlbiBmbmNpw7NuIGRlIHN1IGVzdGF0dXJhLCBwb3IgZWplbXBsbywgc2kgdW4gYWx1bW5vIG1pZGUgMS43MyDCv2N1w6FudG8gcGVzYXLDoT8NCg0KQmFzdGEgY29uIHN1c3RpdHVpciBlbiBsYSBlY3VhY2nDs24gcGFyYSBvYnRlZXIgZWwgcmVzdWx0YWRvIGRlIGxhIGVzdGltYWNpw7NuOg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KJFkgPSAtOTMuODYgKyA5Ny4wOCAqIDEuNzMgPSA3NC4wOTQ5JA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCg0KRXMgZGVjaXIsIHF1ZSBzZSBlc3BlcmEgcXVlIGVzZSBhbHVtbm8gcGVzZSBhcHJveGltYWRhbWVudGUgNzQuMDkga2cuDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyBUQVJFQQ0KDQotLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyAqKjEuKiogKkxvcyBzaWd1aWVudGVzIGRhdG9zIHNvbiBzb2JyZSBlbCB0aWVtcG8gZW4gbWludXRvcyBkZSBsbGFtYWRhcyB5IGVsIGNvc3RvIGVuIHBlc29zIGRlbCBzZXJ2aWNpby4qDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQoNCiFbXShBc2lnbmFjaW9uOFRhcmVhMS5QTkcpDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQojIyMjICrCv0N1w6FsIGVzIGxhIHZhcmlhYmxlIHF1ZSBkZXBlbmRlKiAqKlkqKio/Kg0KDQpFbCBjb3N0byBkZWwgc2VydmljaW8NCg0KIyMjIyAqwr9DdcOhbCBlcyBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlKiAqKlgqKio/Kg0KDQpFbCB0aWVtcG8gZGUgbGEgbGxhbWFkYQ0KDQojIyMjICpDb25zdHJ1eWEgZWwgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24uIERpZ2EgY3XDoWwgZXMgbGEgZm9ybWEgZGUgbGEgcmVsYWNpw7NuLCBjdcOhbCBlcyBlbCBzZW50aWRvKg0KDQpgYGB7cn0NCnRpZW1wbyA8LSBjKDIsIDQsIDYsIDgsIDEwKQ0KY29zdG8gPC0gYygyLCA1LCA3LCA5LCAxMSkNCm4xIDwtIGxlbmd0aCh0aWVtcG8pDQoNCnBsb3QodGllbXBvIH4gY29zdG8sIHhsYWIgPSAiVGllbXBvIChtaW4pIiwgeWxhYiA9ICJDb3N0byBkZWwgU2VydmljaW8iLCBtYWluID0gIkNvc3RvIGRlIGxhcyBsbGFtYWRhcyBwb3IgbWludXRvIiwgY29sID0nIzA0NUZCNCcpDQphYmxpbmUobG0odGllbXBvIH4gY29zdG8pLCBjb2w9JyNERjNBMDEnKQ0KYGBgDQpMYSByZWxhY2lvbiB0aWVuZSBmb3JtYSANCg0KIyMjIyAqQ2FsY3VsZSBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24geSBoYWdhIGxhIGludGVycHJldGFjacOzbiBzZWfDum4gbGEgdGFibGEuKg0KDQpDw6FsY3Vsb3MgcHJldmlvcw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KIVtdKENvc3RvTGxhbWFkYXMuUE5HKQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQ2FsY3VsbyBkZWwgQ29lZmljaWVudGUgIGRlIGNvcnJlbGFjacOzbiBkZSBQZWFyc29uICoqcioqDQpgYGB7cn0NCnIxIDwtIChuMSoyNDggLSAoMzAgKiAzNCkpIC8gKHNxcnQoKG4xKjIyMC0oMzApXjIpKihuMSoyODAtKDM0KV4yKSkpDQpyMQ0KYGBgDQoNCkVsIHZhbG9yIGRlIHIgZW50cmUgbGEgZHVyYWNpw7NuIGRlIGxhcyBsbGFtYWRhcyBjb24gbGEgY29uIGVsIGNvc3RvIGRlIGVzZSBzZXJ2aWNpbyBlcyBkZSAwLjk5NSwgbG8gcXVlIGluZGljYSBxdWUgbGEgY29ycmVsYWNpw7NuIGVzIG11eSBhbHRhIGNhc2kgcGVyZmVjdGEuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQojIyMjICpFbmN1ZW50cmUgZWwgdmFsb3IgZGUgbGEgcGVuZGllbnRlKiAqKmIqKg0KDQpgYGB7cn0NCmIxIDwtIChuMSoyNDggLSAoMzAgKiAzNCkpIC8gKG4xKjIyMC0oMzApXjIpDQpiMQ0KYGBgDQpFbCBWYWxvciBkZSAqKmIqKiBwYXJhIGVzdGUgcHJvYmxlbWEgZXMgZGUgMS4xLg0KDQojIyMjICpFbmN1ZW50cmUgZWwgdmFsb3IgZGUgbGEgb3JkZW5hZGEgYWwgb3JpZ2VuKiAqKmEqKg0KDQpgYGB7cn0NCmExIDwtICgzNC9uMSktMS4xICogKDMwL24xKQ0KYTENCmBgYA0KDQpFbCB2YWxvciBkZSAqKmEqKiBwYXJhIGVzdGUgcHJvYmxlbWEgZXMgZGUgMC4yDQoNCiMjIyMgKkVzY3JpYmEgbGEgZWN1YWNpw7NuIHF1ZSByZWxhY2lvbmEgYSBlc3RhcyBkb3MgdmFyaWFibGVzLioNCg0KDQoNCiRZID0gMC4yICsxLjEqWCQNCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCiMjIyMgKlVzZSBlc3RhIGVjdWFjacOzbiBwYXJhIHByb25vc3RpY2FyIGN1w6FudG8gY29zdGFyw6EgdW5hIGxsYW1hZGEgcXVlKiAqKnRhcmRhIDMuNSBtaW4qKg0KDQpgYGB7cn0NCnkzLjUgPC0gMC4yKzEuMSooMy41KQ0KeTMuNQ0KYGBgDQoNClNpIHVuYSBsbGFtYWRhIGR1cmEgMy41IG1pbnV0b3MgZWwgY29zdG8gZGUgbGEgbWltYXMgc2Vyw6EgZGUgNC4wNS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjICoqMi4qKiAqTGEgZHVyYWNpw7NuIGRlIGxhIGxlY2hlIGVuIGRpYXMgc2UgcmVsYWNpb25hIGNvbiBsYSB0ZW1wZXJhdHVyYSBkZSBzdSBhbG1hY2VuYW1pZW50byBlbiBncmFkb3NjZW50w61ncmFkb3MuIFNlIG9idHV2aWVyb24gbG9zIHNpZ3VpZW50ZXMgZGF0b3M6Kg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPg0KDQohW10oQXNpZ25hY2lvbjhUYXJlYTIuUE5HKQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KIyMjIyAqwr9DdcOhbCBlcyBsYSB2YXJpYWJsZSBxdWUgZGVwZW5kZSogKipZKioqPyoNCg0KTGEgRHVyYWNpw7NuIGRlIGxhIGxlY2hlIChkw61hcykuDQoNCiMjIyMgKsK/Q3XDoWwgZXMgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSogKipYKioqPyoNCg0KTGEgdGVtcGVyYXR1cmEgYSBsYSBxdWUgc2UgYWxtYWNlbmEgbGEgbGVjaGUgKMKwQykuDQoNCiMjIyMgKkNvbnN0cnV5YSBlbCBkaWFncmFtYSBkZSBkaXNwZXJzacOzbi4gRGlnYSBjdcOhbCBlcyBsYSBmb3JtYSBkZSBsYSByZWxhY2nDs24sIGN1w6FsIGVzIGVsIHNlbnRpZG8qDQoNCmBgYHtyfQ0KdGVtcGVyYXR1cmEgPC0gYygwLCA1LCAxMCwgMTUsIDIwLCAyNSkNCmR1cmFjaW9uIDwtIGMoMjQsIDIwLCAxNiwgMTAsIDIsIDEpDQpuMiA8LSBsZW5ndGgodGVtcGVyYXR1cmEpDQoNCnBsb3QodGVtcGVyYXR1cmEgfiBkdXJhY2lvbiwgeGxhYiA9ICJUZW1wZXJhdHVyYSAowrBDKSIsIHlsYWIgPSAiRHVyYWNpw7NuIChEw61hcykiLCBtYWluID0gIkxlY2hlIiwgY29sPScjMjk4QTA4JykNCmFibGluZShsbSh0ZW1wZXJhdHVyYSB+IGR1cmFjaW9uKSwgY29sPScjRkUyRTJFJykNCmBgYA0KRXMgdW5hIGNvcnJlbGFjacOzbiBsaW5lYWwgbmVnYXRpdmEsIHBvcnF1ZSBjb25mb3JtZSBhdW1lbnRhIGxhIHRlbXBlcmF0dXJhLCBkaXNtaW51eWUgbGEgZHVyYWNpw7NuLg0KDQojIyMjICpDYWxjdWxlIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiB5IGhhZ2EgbGEgaW50ZXJwcmV0YWNpw7NuIHNlZ8O6biBsYSB0YWJsYS4qDQoNCkPDoWxjdWxvcyBwcmV2aW9zDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+DQohW10oRHVyYWNpb25MZWNoZS5QTkcpDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQ2FsY3VsbyBkZWwgQ29lZmljaWVudGUgIGRlIGNvcnJlbGFjacOzbiBkZSBQZWFyc29uICoqcioqDQpgYGB7cn0NCnIyIDwtIChuMio0NzUgLSAoNzUgKiA3MykpIC8gKHNxcnQoKG4yKjEzNzUtKDc1KV4yKSoobjIqMTMzNy0oNzMpXjIpKSkNCnIyDQpgYGANCkVsIHZhbG9yIGRlIHIgZW50cmUgbGEgZHVyYWNpw7NuIGRlIGxhIGxlY2hlIGNvbiBsYSB0ZW1wZXJhdHVyYSBlcyBkZSAtMC45ODcsIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIGNvcnJlbGFjacOzbiBlcyBtdXkgYWx0YS4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQojIyMjICpFbmN1ZW50cmUgZWwgdmFsb3IgZGUgbGEgcGVuZGllbnRlKiAqKmIqKg0KDQpgYGB7cn0NCmIyIDwtIChuMio0NzUgLSAoNzUgKiA3MykpIC8gKG4yKjEzNzUtKDc1KV4yKQ0KYjINCmBgYA0KRWwgVmFsb3IgZGUgKipiKiogcGFyYSBlc3RlIHByb2JsZW1hIGVzIGRlIC0xLg0KDQojIyMjICpFbmN1ZW50cmUgZWwgdmFsb3IgZGUgbGEgb3JkZW5hZGEgYWwgb3JpZ2VuKiAqKmEqKg0KDQpgYGB7cn0NCmEyIDwtICg3My9uMiktKC0xKSAqICg3NS9uMikNCmEyDQoNCmUgPC0gKDYxOC84KS05Ny4wOCooMTQuMS84KQ0KZQ0KYGBgDQpFbCB2YWxvciBkZSAqKmEqKiBwYXJhIGVzdGUgcHJvYmxlbWEgZXMgZGUgMjQuNjcNCg0KIyMjIyAqRXNjcmliYSBsYSBlY3VhY2nDs24gcXVlIHJlbGFjaW9uYSBhIGVzdGFzIGRvcyB2YXJpYWJsZXMqLg0KDQoNCiRZID0gMjQuNjcgLTEqWCQNCg0KDQojIyMjICpVc2UgZXN0YSBlY3VhY2nDs24gcGFyYSBwcm9ub3N0aWNhciBjdcOhbnRvIGR1cmFyw6EgbGEgbGVjaGUgc2kgc2UgYWxtYWNlbmEgYSAqKiozIGdyYWRvcyBjZW50w61ncmFkb3MqKg0KDQpgYGB7cn0NCnkzIDwtIDI0LjY3LTEqKDMpDQp5Mw0KYGBgDQoNCkEgbG9zIDPCsEMgbGEgbGVjaGUgZHVyYXLDoSAyMiBkaWFzLiANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uIE1lbGFuaWUgSWNlZG8gRsOpbGl4IC4uLi4uLi4uLi4uLi4uLi4uLi4uLg==