Tema: EvaluaciĂłn de la calidad de aguas superficiales en la cuenca del rio RĂ­mac mediante anĂĄlisis multivariado para el periodo 2011-2018

Profesores

  • Mauricio Alberto MaguiĂąa Melgar
  • Clodomiro Fernando Miranda Villagomez

Integrantes

  • Ramos Tapia, Gianella Paulina
  • Ramos Ayma
  • Malpartida Ramirez, Leonardo Daniel
  • Olivas SĂĄnchez, Valentina
  • Llalle Correa Danixa
  • Kuway Chero Giancarlo
  • FarfĂĄn FloriĂĄn Erik David
  • Núùez Campos, Hilary
  • Velasquez Gonzales, Pedro Daniel
  • Ramos Ñaupari , Diego Fernando

INTRODUCCIÓN


DESARROLLO

Pregunta 1

Una aplicaciĂłn de distribuciĂłn truncada con una variable discreta conocida.

Uno de los factores que limita el ĂŠxito de la fitorremediaciĂłn, y que se convierte en una de sus limitantes es el grado de contaminaciĂłn en el suelo, para analizar este grado se usaran algunas investigaciones hechas con perejil (Petroselinum crispum) ya que el crecimiento de las plantas no es muy viable en suelos altamente contaminados. Utilizaremos una muestra 5 plantas de perejil para analizar la variable X definida como el nĂşmero de plantas de perejil que variaron su crecimiento de un 60% a un 33% con respecto al cultivo control, si se sabe que el 80% de plantas variaron su crecimiento de un 60% a un 33%.

PIDEN

Hallar la funciĂłn de Probabilidad X si no se considera la posibilidad de 4 porciones con una variaciĂłn de su crecimiento de un 60% a un 33% con respecto al cultivo control

ENTONCES

\[X\sim Binom(5,0.8)\] \[f(x)=\binom{n}{x}\pi ^{x}(1-\pi )^{n-x}\]

\[f(x)=\binom{5}{x}0.8^{x}(0.2)^{5-x}I_{0,1,...,5 }\]

Probabilidad para X=0,1,2,3,5

p0=dbinom(0,5,0.8);p0
## [1] 0.00032
p1=dbinom(1,5,0.8);p1
## [1] 0.0064
p2=dbinom(2,5,0.8);p2
## [1] 0.0512
p3=dbinom(3,5,0.8);p3
## [1] 0.2048
p4=dbinom(4,5,0.8);p4
## [1] 0.4096
p5=dbinom(5,5,0.8);p5
## [1] 0.32768

\[f(x)=\binom{5}{x}0.8^{x}(0.2)^{5-x}I_{0,1,...,5 }\rightarrow \begin{cases} & \text{0.00032 }, x= 0\\ & \text{0.0064 }, x= 1 \\ & \text{0.0512 }, x= 2\\ & \text{0.2048 }, x= 3 \\ & \text{0.4096 }, x= 4\\ & \text{0.32768 }, x= 5 \end{cases}\]

P<-(p0+p1+p2+p3+p5)
P
## [1] 0.5904

\[P(condicion)=P(X\neq 4)=P(X=0)+P(X=1)+P(X=2)+P(X=3)+P(X=5)=0.5904\]

P0=p0/P;P0
## [1] 0.0005420054
P1=p1/P;P1
## [1] 0.01084011
P2=p2/P;P2
## [1] 0.08672087
P3=p3/P;P3
## [1] 0.3468835
P5=p5/P;P5
## [1] 0.5550136

FUNCIÓN ACUMULADA

\[f_{(x/x\neq4)}(x)=\begin{cases} & \text{ 0.00054201 }, x= 0\\ & \text{ 0.01084011 }, x= 1\\ & \text{ 0.08672087 } , x= 2\\ & \text{ 0.3468835} , x= 3\\ & \text{ 0.5550136 } , x= 5 \end{cases}\]


Pregunta 2

Una aplicaciĂłn de distribuciĂłn truncada con una variable continua conocida:

El oxigeno disuelto o por sus siglas (OD) es uno de los 24 parametros de calidad ambiental, los cuals fueron evaluados entre el periodo del 2011 y 2018. Este parametro cuenta con una distribucion normal y su rango esta entre 0.54 a 12.03 mg/L, media 6.89 mg/L y una desviacion estandar de 1.74 mg/L. Se desea determinar la funcion de densidad en la que el agua tiene buena calidad, contando con los siguientes valores establecidos por el minsa: Se considera agua de mala calidad de 0 – 4 ppm y es aceptable entre los valores 4.1 – 7.9 ppm y de buena calidad de 8 – 12 ppm, mas de 12 ppm debe repetirse la prueba. Fuente del MINSA

Nota: 1ppm <> 1mg/L.

  • X = {niveles de oxigeno disuelto que indican agua de buena calidad}

DATOS

  • Valor minimo de la tesis: 0.54 mg/L
  • Valor maximo de la tesis: 12.03 mg/L
  • Valores de buena calidad segun la misma: 8 a 12 ppm
  • \(\mu\)=6.89 mg/L
  • \(\sigma\)=1.74 mg/L

SOLUCIÓN

\[f_{(\alpha,\beta)}(x)=\frac{f(x)}{F(\beta)-F(\alpha)}I_{(\alpha,\beta]}(x)=\frac{f(x)}{P(X\leq \beta)-P(X\leq\alpha)}I_{(\alpha,\beta)}(x)\]

\[f(x)=\frac{exp[-\frac{1}{2}(\frac{x-\mu}{\sigma})^2]}{\sqrt{2\pi} \sigma}= \frac{exp[-\frac{1}{2}(\frac{x-6.89}{1,74})^2]}{\sqrt{2\pi}1,74}\] \[f_{(8,12.03)}(x)=\frac{f(x)}{F(12.03)-F(8)}I_{(8,12.03]}(x)\]

F_12=pnorm(12.03,6.89,1,74)

F_4=pnorm(8,6.89,1,74)

p=F_12-F_4
p
## [1] 0.1334994

\[f(x)=\frac{\frac{exp[-\frac{1}{2}(\frac{x-6.89}{1.74})^2]}{\sqrt{2\pi}1.74}}{0.1334}I_{(8,1.74)}\] Finalmente tenemos la siguiente funciĂłn de densidad:

\[f(x)=0.5817*exp[-\frac{1}{2}(\frac{x-6.89}{1.74})^2]I_{(8,1.74)}\]

GRÁFICA


Pregunta 3

Una aplicaciĂłn de distribuciĂłn de una funciĂłn con una variable aleatoria mixta:

En la cuenca del rĂ­o Rimac encontraron elevadas cantidades de mercurio, el cual contamina la pesca provocando la disminuciĂłn de enzimatica de los peces.Se desea saber si los peces son aptos para consumo humano, por ello usaremos la base de datos de la libreria gamlss.mx, la cual nos indicarĂĄ que distribuciĂłn de probabilidad sigue la variable mixta de las enzimas.

DESARROLLO

LIBRERIAS USADAS

library(gamlss.mx)
library(ggplot2)

IMPORTANDO DATOS

data(enzyme)

GRAFICA 1

DISTRIBUCIÓN ACTIVIDAD ENZIMÁTICA

ggplot(data = enzyme, aes(x = act)) +
  geom_histogram(color = "black", alpha = 0.3, bins = 50) +
  geom_rug() +
  labs(title = "DistribuciĂłn actividad enzimĂĄtica") +
  theme_bw()

AJUSTE DEL MODELO MIXTO CON DOS COMPONENTES

modelo_mx <- gamlssMX(
  formula = act ~ 1,
  data    = enzyme,
  family  = RG,
  K       = 2,
  control = MX.control(plot = FALSE)
)
modelo_mx
## 
## Mixing Family:  c("RG", "RG") 
## 
## Fitting method: EM algorithm 
## 
## Call:  gamlssMX(formula = act ~ 1, family = RG, K = 2, data = enzyme,  
##     control = MX.control(plot = FALSE)) 
## 
## Mu Coefficients for model: 1 
## (Intercept)  
##       1.127  
## Sigma Coefficients for model: 1 
## (Intercept)  
##      -1.091  
## Mu Coefficients for model: 2 
## (Intercept)  
##      0.1557  
## Sigma Coefficients for model: 2 
## (Intercept)  
##      -2.641  
## 
## Estimated probabilities: 0.3760176 0.6239824 
## 
## Degrees of Freedom for the fit: 5 Residual Deg. of Freedom   240 
## Global Deviance:     86.2916 
##             AIC:     96.2916 
##             SBC:     113.798

CALCULANDO LA DENSIDAD ESTIMADA

d_modelo_mx <- getpdfMX(modelo_mx)
d_modelo_mx(y = 2)
## [1] 0.07719913

GRAFICA 2

DISTRIBUCION ESTIMADA POR MODELO MIXTO DE DOS COMPONENTES

ggplot(data = enzyme) +
  geom_histogram(
    aes(x = act, y = after_stat(density)),
    color = "black",
    alpha = 0.3) +
  stat_function(
    fun   = function(.x){d_modelo_mx(y = .x)},
    color = "darkblue",
    size  = 1) +
  labs(title = "DistribuciĂłn estimada por modelo mixto de dos componentes") +
  theme_bw()

AJUSTE DEL MODELO 10 VECES

modelo_mx <- gamlssMXfits(
  n       = 10,
  formula = act ~ 1,
  data    = enzyme,
  family  = RG,
  K       = 2,
  control = MX.control(plot = FALSE)
)

## model= 1 
## model= 2 
## model= 3 
## model= 4 
## model= 5 
## model= 6 
## model= 7 
## model= 8 
## model= 9 
## model= 10

Pregunta 4

Una aplicaciĂłn de distribuciones bivariadas discretas:

En una investigación realizada por un estudiante de Ingeniería ambiental de la UNALM sobre la “Evaluación de la calidad de aguas superficiales en la cuenca del río Rímac”, se tiene un total de 25 estaciones las cuales conforman una red de monitoreo en el río Rímac. Donde 12 estaciones se ubican en los tributarios o afluentes a la cuenca, 7 estaciones se ubican alrededor de las bocatomas y el resto en la sub cuenca Santa Eulalia. Si se eligen 10 estaciones al azar, con reemplazo y sin considerar el orden para realizar una inspección en la calidad del agua, calcular la probabilidad de que 3 sean de las estaciones de afluentes de cuenca,5 de las estaciones alrededor de las bocatomas y el resto de las estaciones de la sub cuenca Santa Eulalia.

  • X= {nĂşmero de estaciones de afluentes de cuenca en la muestra de tamaĂąo 10}

  • Y= {nĂşmero de estaciones alrededor de las bocatomas en la muestra de tamaĂąo 10}

DATOS

  • A=12 estaciones comunes en afluentes a la cuenca.

  • B=7 estaciones comunes alrededor de las bocatomas.

  • X=3 estaciones comunes de afluentes de cuenca en la muestra.

  • Y=5 estaciones comunes alrededor de las bocatomas en la muestra.

  • n= 10 estaciones comunes seleccionados al azar, con reemplazo y sin considerar el orden.

SOLUCIÓN

\[(X,Y)\sim V Bivariada(N=25,n=10,A=12,B=7)\]

\[para: 0\leqslant X\leqslant 10 , \ 0\leqslant Y\leqslant 10 , \ 0\leqslant X+Y \leqslant 10 \]

\[f(x,y)=\frac{\binom{12+x-1}{x}\binom{7+y-1}{y}\binom{6+(10-x-y)-1}{10-x-y}}{\binom{25+10-1}{10}}\]

\[ f(x,y)=\frac{\binom{12+3-1}{3}\binom{7+5-1}{5}\binom{6+(10-3-5)-1}{10-3-5}}{\binom{25+10-1}{10}}=\frac{\binom{12+3-1}{3}\binom{7+5-1}{5}\binom{6+(2)-1}{2}}{\binom{25+10-1}{10}}=0.02693\]


Pregunta 5

Una aplicaciĂłn de distribuciones bivariadas continuas.

Sea x el contenido del metal pesado Hierro(Fe) . y el contenido de Aluminio(Al). Para una muestra de 100 ml del río Rímac . Por anteriores estudios se sabe que (x,y) siguen una distribución normal bivariada. Se sabe que Cov(x,y) = 0.60 y σx*σy= 3.00

Halle ρ(xy) :

SOLUCIÓN

Se sabe

\[\rho_{xy}=\frac{cov_{xy}}{\sigma_{x}\sigma_{y}}\] Por lo tanto el coeficiente de correlación: ρ(xy) = 0.2 . Cómo es un valor cercano a 0 se dice que existe una pobre correlación entre los niveles de hierro y aluminio.

GRÁFICA

distribuciĂłn normal bivariada para niveles de Fe y Al:

Considerando:

  • \(\mu_x\) = 1
  • \(\mu_y\) = 2
  • \(sd_x\) = 3
  • \(sd_y\) = 1
  • \(\rho\) = 0.2
######################################################
# Ploteo de distribucion bivariada para Fe y Al
######################################################
library("MASS")
rm(list=ls())
### Densidad normal bivariada
h <- function(x,y,mx,my,sx,sy,p) { (1/(2*pi*sx*sy*sqrt((1-p^2))))*exp((-1/(2*(1-p^2)))*{(x-mx)^2/sx^2 - 2*p*((x-mx)/sx)*((y-my)/sy) + (y-my)^2/sy^2})}

### funcion para hallar las probabilidades
bvn.prob<-function(mx,my,sx,sy,p,x.llim,x.ulim,y.llim,y.ulim) {
  integrate(function(y){ sapply(y,function(y){
    integrate(function(x) h(x,y,mx,my,sx,sy,p) ,x.llim,x.ulim)$value})},y.llim,y.ulim)$value }

### Cargar valores para la simulacion
mux<-1;muy<-2;sdx<-3;sdy<-1;rho<- 0.2
### calcular la matriz de varianzas y covarianzas
(Sigma <- matrix(c(sdx^2,sdx*sdy*rho,sdx*sdy*rho,sdy^2),2,2))
##      [,1] [,2]
## [1,]  9.0  0.6
## [2,]  0.6  1.0
### Vector de medias
Mu<- c(mux,muy)

### tamaĂąo de muestra 1 millĂłn para estimacion de probabilidades en cuadrantes
n<-1000000
y<-mvrnorm(n, Mu, Sigma)
tmp1<-sum((y[,1]>0)*(y[,2]>0))/n
tmp2<-sum((y[,1]<0)*(y[,2]>0))/n
tmp3<-sum((y[,1]<0)*(y[,2]<0))/n
tmp4<-sum((y[,1]>0)*(y[,2]<0))/n

cbind(
  Simulation=c(tmp1,tmp2,tmp3,tmp4),
  Calculation=c(
    bvn.prob(mux,muy,sdx,sdy,rho,0,Inf,0,Inf),
    bvn.prob(mux,muy,sdx,sdy,rho,-Inf,0,0,Inf),
    bvn.prob(mux,muy,sdx,sdy,rho,-Inf,0,-Inf,0),
    bvn.prob(mux,muy,sdx,sdy,rho,0,Inf,-Inf,0)))
##      Simulation Calculation
## [1,]   0.620096  0.62048431
## [2,]   0.357101  0.35676558
## [3,]   0.012663  0.01267602
## [4,]   0.010140  0.01007441
### Ploteo de la densidad normal bivariada
x<-seq(-3,3,.1)
y<-seq(-3,3,.1)
f<-function(x,y) h(x,y,0,0,1,1,0.2)
res<-persp(x,y,outer(x,y,f),theta = 45, phi = 20)


Pregunta 6

Una aplicaciĂłn de variables aleatorias con coordenadas mixtas.

Suponga que x es el porcentaje Aluminio almacenado en la cuenca del Rio Rimac en un determinado tiempo e Y es el porcentaje del metal de Hierro almacenado en esta misma cuenca del Rio Rimac en ese mismo tiempo. Se sabe que X tiene una distribuciĂłn Uniforme discreta en {13, 17,21} y dado X=x, Y es Uniforme continua en el intervalo [0, x].

PREGUNTA a

  • obtenga \(f(x,y)\)

SOLUCION

\(f(x,y)=f(x)f(y/x)=(1/3)(1/x)=1/3x\),x=13,17,21; \(y∈[0,x]\)

\(f(x,y)=\left\{\begin{matrix} & 1/39, x=13, 0<y<13 & \\ & 1/51, x=17, 0<y<17 & \\ & 1/63, x=21, 0<y<21 & \end{matrix}\right.\)

f(x,y) Y
0<y<13 0<y<17 0<y<21
13 1/39 0 0
x 17 0 1/51 0
21 0 0 1/63

\(f(x,y)\)=\(1/39 I_({13}) xI_([0,13]) y+1/51 I_({17}) xI_([0,17]) y+1/63 I_({21}) xI_([0,21]) y\)

PREGUNTA b

  • ÂżEs f una densidad mixta conjunta? Considere S={13,17,21} y T=[0,21]

SOLUCIÓN

Se debe proceder a integrar para comprobar si es una densidad mixta conjunta:

\(\sum_{x \epsilon S}\int_{t}f(x,y)dy= \int_{13}^{0}1/39dy+ \int_{17}^{0}1/51dy+ \int_{21}^{0}1/63dy\)

\(=1/3+1/3+1/3=1\)

  • Concluimos que \(f(x,y)\) es una densidad mixta conjunta, ya que la sumatoria es igual a uno.

FUENTES

  • Marleni Beatriz, A. M. (2022). EvaluaciĂłn de la calidad de aguas superficiales en la cuenca del rio RĂ­mac mediante anĂĄlisis multivariado para el periodo 2011-2018 (Licenciado). Universidad Nacional Agraria La Molina. Tesis

  • Miranda FernĂĄndez. (2017). CĂĄlculo de Probabilidades con GrĂĄficos en R. Primera EdiciĂłn. Lima, PerĂş. Q&P Impresores S.R.L.


ANEXO

EstadĂ­sticos descriptiva de los 21 parĂĄmetros de calidad de agua

LS0tDQp0aXRsZTogIlRSQUJBSk8gSU5URUdSQURPUiAtIEPDgUxDVUxPIERFIFBST0JBQklMSURBREVTIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICB0aGVtZTogImNvc21vIg0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQohW10obG9nby11bmFsbS5wbmcpDQoNCioqVGVtYTogRXZhbHVhY2nDs24gZGUgbGEgY2FsaWRhZCBkZSBhZ3VhcyBzdXBlcmZpY2lhbGVzIGVuIGxhIGN1ZW5jYSBkZWwgcmlvIFLDrW1hYyBtZWRpYW50ZSBhbsOhbGlzaXMgbXVsdGl2YXJpYWRvIHBhcmEgZWwgcGVyaW9kbyAyMDExLTIwMTgqKg0KDQoqKlByb2Zlc29yZXMqKg0KDQotIE1hdXJpY2lvIEFsYmVydG8gTWFndWnDsWEgTWVsZ2FyDQotIENsb2RvbWlybyBGZXJuYW5kbyBNaXJhbmRhIFZpbGxhZ29tZXoNCiAgDQoqKkludGVncmFudGVzKioNCg0KLSAgIFJhbW9zIFRhcGlhLCBHaWFuZWxsYSBQYXVsaW5hDQotICAgUmFtb3MgQXltYQ0KLSAgIE1hbHBhcnRpZGEgUmFtaXJleiwgTGVvbmFyZG8gRGFuaWVsDQotICAgT2xpdmFzIFPDoW5jaGV6LCBWYWxlbnRpbmENCi0gICBMbGFsbGUgQ29ycmVhIERhbml4YQ0KLSAgIEt1d2F5IENoZXJvIEdpYW5jYXJsbw0KLSAgIEZhcmbDoW4gRmxvcmnDoW4gRXJpayBEYXZpZA0KLSAgIE7DusOxZXogQ2FtcG9zLCBIaWxhcnkNCi0gICBWZWxhc3F1ZXogR29uemFsZXMsIFBlZHJvIERhbmllbA0KLSAgIFJhbW9zIMORYXVwYXJpICwgRGllZ28gRmVybmFuZG8NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgSU5UUk9EVUNDScOTTg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBERVNBUlJPTExPDQoNCiMjICoqUHJlZ3VudGEgMSoqDQoNCioqVW5hIGFwbGljYWNpw7NuIGRlIGRpc3RyaWJ1Y2nDs24gdHJ1bmNhZGEgY29uIHVuYSB2YXJpYWJsZSBkaXNjcmV0YSBjb25vY2lkYS4qKg0KDQpVbm8gZGUgbG9zIGZhY3RvcmVzIHF1ZSBsaW1pdGEgZWwgw6l4aXRvIGRlIGxhIGZpdG9ycmVtZWRpYWNpw7NuLCB5IHF1ZSBzZSBjb252aWVydGUgZW4gdW5hIGRlIHN1cyBsaW1pdGFudGVzIGVzIGVsIGdyYWRvIGRlIGNvbnRhbWluYWNpw7NuIGVuIGVsIHN1ZWxvLCBwYXJhIGFuYWxpemFyIGVzdGUgZ3JhZG8gc2UgdXNhcmFuIGFsZ3VuYXMgaW52ZXN0aWdhY2lvbmVzIGhlY2hhcyBjb24gcGVyZWppbCAoUGV0cm9zZWxpbnVtIGNyaXNwdW0pIHlhIHF1ZSBlbCBjcmVjaW1pZW50byBkZSBsYXMgcGxhbnRhcyBubyBlcyBtdXkgdmlhYmxlIGVuIHN1ZWxvcyBhbHRhbWVudGUgY29udGFtaW5hZG9zLiBVdGlsaXphcmVtb3MgdW5hIG11ZXN0cmEgNSBwbGFudGFzIGRlIHBlcmVqaWwgcGFyYSBhbmFsaXphciBsYSB2YXJpYWJsZSBYIGRlZmluaWRhIGNvbW8gZWwgbsO6bWVybyBkZSBwbGFudGFzIGRlIHBlcmVqaWwgcXVlIHZhcmlhcm9uIHN1IGNyZWNpbWllbnRvIGRlIHVuIDYwJSBhIHVuIDMzJSBjb24gcmVzcGVjdG8gYWwgY3VsdGl2byBjb250cm9sLCBzaSBzZSBzYWJlIHF1ZSBlbCA4MCUgZGUgcGxhbnRhcyB2YXJpYXJvbiBzdSBjcmVjaW1pZW50byBkZSB1biA2MCUgYSB1biAzMyUuDQoNCiMjIyBQSURFTg0KDQoqKkhhbGxhciBsYSBmdW5jacOzbiBkZSBQcm9iYWJpbGlkYWQgWCBzaSBubyBzZSBjb25zaWRlcmEgbGEgcG9zaWJpbGlkYWQgZGUgNCBwb3JjaW9uZXMgY29uIHVuYSB2YXJpYWNpw7NuIGRlIHN1IGNyZWNpbWllbnRvIGRlIHVuIDYwJSBhIHVuIDMzJSBjb24gcmVzcGVjdG8gYWwgY3VsdGl2byBjb250cm9sKioNCg0KIyMjIEVOVE9OQ0VTDQoNCiQkWFxzaW0gQmlub20oNSwwLjgpJCQgJCRmKHgpPVxiaW5vbXtufXt4fVxwaSBee3h9KDEtXHBpIClee24teH0kJA0KDQokJGYoeCk9XGJpbm9tezV9e3h9MC44Xnt4fSgwLjIpXns1LXh9SV97MCwxLC4uLiw1IH0kJA0KDQoqKlByb2JhYmlsaWRhZCBwYXJhIFg9MCwxLDIsMyw1KioNCg0KYGBge3J9DQoNCnAwPWRiaW5vbSgwLDUsMC44KTtwMA0KcDE9ZGJpbm9tKDEsNSwwLjgpO3AxDQpwMj1kYmlub20oMiw1LDAuOCk7cDINCnAzPWRiaW5vbSgzLDUsMC44KTtwMw0KcDQ9ZGJpbm9tKDQsNSwwLjgpO3A0DQpwNT1kYmlub20oNSw1LDAuOCk7cDUNCg0KYGBgDQoNCiQkZih4KT1cYmlub217NX17eH0wLjhee3h9KDAuMileezUteH1JX3swLDEsLi4uLDUgfVxyaWdodGFycm93IFxiZWdpbntjYXNlc30NCiAmIFx0ZXh0ezAuMDAwMzIgIH0sICAgeD0gMFxcIA0KICYgXHRleHR7MC4wMDY0IH0sICAgeD0gMSBcXCANCiAmIFx0ZXh0ezAuMDUxMiB9LCAgeD0gMlxcIA0KICYgXHRleHR7MC4yMDQ4ICB9LCAgeD0gMyBcXCANCiAmIFx0ZXh0ezAuNDA5NiAgfSwgIHg9IDRcXCANCiAmIFx0ZXh0ezAuMzI3NjggfSwgIHg9IDUNClxlbmR7Y2FzZXN9JCQNCg0KYGBge3J9DQpQPC0ocDArcDErcDIrcDMrcDUpDQpQDQpgYGANCg0KJCRQKGNvbmRpY2lvbik9UChYXG5lcSA0KT1QKFg9MCkrUChYPTEpK1AoWD0yKStQKFg9MykrUChYPTUpPTAuNTkwNCQkDQoNCmBgYHtyfQ0KUDA9cDAvUDtQMA0KUDE9cDEvUDtQMQ0KUDI9cDIvUDtQMg0KUDM9cDMvUDtQMw0KUDU9cDUvUDtQNQ0KYGBgDQoNCioqRlVOQ0nDk04gQUNVTVVMQURBKioNCg0KJCRmX3soeC94XG5lcTQpfSh4KT1cYmVnaW57Y2FzZXN9DQogJiBcdGV4dHsgMC4wMDA1NDIwMSB9LCB4PSAwXFwgDQogJiBcdGV4dHsgMC4wMTA4NDAxMSB9LCB4PSAxXFwgDQogJiBcdGV4dHsgMC4wODY3MjA4NyB9ICwgeD0gMlxcIA0KICYgXHRleHR7IDAuMzQ2ODgzNX0gLCB4PSAzXFwgDQogJiBcdGV4dHsgMC41NTUwMTM2IH0gLCB4PSA1DQpcZW5ke2Nhc2VzfSQkDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlByZWd1bnRhIDIqKg0KDQoqKlVuYSBhcGxpY2FjacOzbiBkZSBkaXN0cmlidWNpw7NuIHRydW5jYWRhIGNvbiB1bmEgdmFyaWFibGUgY29udGludWEgY29ub2NpZGE6KioNCg0KRWwgb3hpZ2VubyBkaXN1ZWx0byBvIHBvciBzdXMgc2lnbGFzIChPRCkgZXMgdW5vIGRlIGxvcyAyNCBwYXJhbWV0cm9zIGRlIGNhbGlkYWQgYW1iaWVudGFsLCBsb3MgY3VhbHMgZnVlcm9uIGV2YWx1YWRvcyBlbnRyZSBlbCBwZXJpb2RvIGRlbCAyMDExIHkgMjAxOC4gRXN0ZSBwYXJhbWV0cm8gY3VlbnRhIGNvbiB1bmEgZGlzdHJpYnVjaW9uIG5vcm1hbCB5IHN1IHJhbmdvIGVzdGEgZW50cmUgMC41NCBhIDEyLjAzIG1nL0wsIG1lZGlhIDYuODkgbWcvTCB5IHVuYSBkZXN2aWFjaW9uIGVzdGFuZGFyIGRlIDEuNzQgbWcvTC4gU2UgZGVzZWEgZGV0ZXJtaW5hciBsYSBmdW5jaW9uIGRlIGRlbnNpZGFkIGVuIGxhIHF1ZSBlbCBhZ3VhIHRpZW5lIGJ1ZW5hIGNhbGlkYWQsIGNvbnRhbmRvIGNvbiBsb3Mgc2lndWllbnRlcyB2YWxvcmVzIGVzdGFibGVjaWRvcyBwb3IgZWwgbWluc2E6IFNlIGNvbnNpZGVyYSBhZ3VhIGRlIG1hbGEgY2FsaWRhZCBkZSAwIC0tIDQgcHBtIHkgZXMgYWNlcHRhYmxlIGVudHJlIGxvcyB2YWxvcmVzIDQuMSAtLSA3LjkgcHBtIHkgZGUgYnVlbmEgY2FsaWRhZCBkZSA4IC0tIDEyIHBwbSwgbWFzIGRlIDEyIHBwbSBkZWJlIHJlcGV0aXJzZSBsYSBwcnVlYmEuIFtGdWVudGUgZGVsIE1JTlNBXShodHRwczovL3d3dy51Y20uZXMvZGF0YS9jb250L2RvY3MvOTUyLTIwMTUtMDItMTQtT3hpZ2VubyUyMGRpc3VlbHRvJTIwZi5wZGYpDQoNCk5vdGE6IDFwcG0gXDxcPiAxbWcvTC4NCg0KLSAgIFggPSB7bml2ZWxlcyBkZSBveGlnZW5vIGRpc3VlbHRvIHF1ZSBpbmRpY2FuIGFndWEgZGUgYnVlbmEgY2FsaWRhZH0NCg0KIyMjIERBVE9TDQoNCi0gICBWYWxvciBtaW5pbW8gZGUgbGEgdGVzaXM6IDAuNTQgbWcvTA0KLSAgIFZhbG9yIG1heGltbyBkZSBsYSB0ZXNpczogMTIuMDMgbWcvTA0KLSAgIFZhbG9yZXMgZGUgYnVlbmEgY2FsaWRhZCBzZWd1biBsYSBtaXNtYTogOCBhIDEyIHBwbQ0KLSAgICRcbXUkPTYuODkgbWcvTA0KLSAgICRcc2lnbWEkPTEuNzQgbWcvTA0KDQojIyMgU09MVUNJw5NODQoNCiQkZl97KFxhbHBoYSxcYmV0YSl9KHgpPVxmcmFje2YoeCl9e0YoXGJldGEpLUYoXGFscGhhKX1JX3soXGFscGhhLFxiZXRhXX0oeCk9XGZyYWN7Zih4KX17UChYXGxlcSBcYmV0YSktUChYXGxlcVxhbHBoYSl9SV97KFxhbHBoYSxcYmV0YSl9KHgpJCQNCg0KJCRmKHgpPVxmcmFje2V4cFstXGZyYWN7MX17Mn0oXGZyYWN7eC1cbXV9e1xzaWdtYX0pXjJdfXtcc3FydHsyXHBpfSBcc2lnbWF9PSBcZnJhY3tleHBbLVxmcmFjezF9ezJ9KFxmcmFje3gtNi44OX17MSw3NH0pXjJdfXtcc3FydHsyXHBpfTEsNzR9JCQgJCRmX3soOCwxMi4wMyl9KHgpPVxmcmFje2YoeCl9e0YoMTIuMDMpLUYoOCl9SV97KDgsMTIuMDNdfSh4KSQkDQoNCmBgYHtyfQ0KRl8xMj1wbm9ybSgxMi4wMyw2Ljg5LDEsNzQpDQoNCkZfND1wbm9ybSg4LDYuODksMSw3NCkNCg0KcD1GXzEyLUZfNA0KcA0KYGBgDQoNCiQkZih4KT1cZnJhY3tcZnJhY3tleHBbLVxmcmFjezF9ezJ9KFxmcmFje3gtNi44OX17MS43NH0pXjJdfXtcc3FydHsyXHBpfTEuNzR9fXswLjEzMzR9SV97KDgsMS43NCl9JCQgRmluYWxtZW50ZSB0ZW5lbW9zIGxhIHNpZ3VpZW50ZSBmdW5jacOzbiBkZSBkZW5zaWRhZDoNCg0KJCRmKHgpPTAuNTgxNypleHBbLVxmcmFjezF9ezJ9KFxmcmFje3gtNi44OX17MS43NH0pXjJdSV97KDgsMS43NCl9JCQNCg0KIyMjIEdSw4FGSUNBDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBhY21hbikNCnBfbG9hZChkcGx5cixnZ3Bsb3QyLGdndGhlbWVzLHJlc2hhcGUyLGdncHVicikNCg0KDQpkYXRhLmZyYW1lKHg9Yyg4LDEyLjAzKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHgpKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIG4gPSAxMDAwLCBhcmdzID0gbGlzdChtZWFuID0gNi44OSwgc2QgPSAxLjc0KSwgDQogICAgICAgICAgICAgICAgY29sb3IgPSAib3JhbmdlIiwgDQogICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHlsYWIoIiIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIE5vcm1hbCBUcnVuY2FkYSIsDQogICAgICAgc3VidGl0bGUgPSAiKHNkID0gMS43NCkiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICB5ID0gIiIpICsNCiAgZ3VpZGVzKGZpbGwgPSBGQUxTRSkgKw0KICB0aGVtZV9nZG9jcygpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlByZWd1bnRhIDMqKg0KDQoqKlVuYSBhcGxpY2FjacOzbiBkZSBkaXN0cmlidWNpw7NuIGRlIHVuYSBmdW5jacOzbiBjb24gdW5hIHZhcmlhYmxlIGFsZWF0b3JpYSBtaXh0YToqKg0KDQpFbiBsYSBjdWVuY2EgZGVsIHLDrW8gUmltYWMgZW5jb250cmFyb24gZWxldmFkYXMgY2FudGlkYWRlcyBkZSBtZXJjdXJpbywgZWwgY3VhbCBjb250YW1pbmEgIGxhIHBlc2NhICBwcm92b2NhbmRvIGxhIGRpc21pbnVjacOzbiBkZSAgZW56aW1hdGljYSBkZSBsb3MgcGVjZXMuU2UgIGRlc2VhIHNhYmVyIHNpIGxvcyBwZWNlcyBzb24gYXB0b3MgcGFyYSBjb25zdW1vIGh1bWFubywgcG9yIGVsbG8gdXNhcmVtb3MgbGEgYmFzZSBkZSBkYXRvcyBkZSBsYSBsaWJyZXJpYSBnYW1sc3MubXgsIGxhIGN1YWwgbm9zIGluZGljYXLDoSBxdWUgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWQgc2lndWUgbGEgdmFyaWFibGUgbWl4dGEgZGUgbGFzIGVuemltYXMuDQoNCiMjIyBERVNBUlJPTExPDQoNCioqTElCUkVSSUFTIFVTQURBUyoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdob2xkJywgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2FtbHNzLm14KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCioqSU1QT1JUQU5ETyBEQVRPUyoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdob2xkJywgd2FybmluZz1GQUxTRX0NCmRhdGEoZW56eW1lKQ0KYGBgDQoNCiMjIyBHUkFGSUNBIDENCg0KKipESVNUUklCVUNJw5NOIEFDVElWSURBRCBFTlpJTcOBVElDQSoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdob2xkJywgd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gZW56eW1lLCBhZXMoeCA9IGFjdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMywgYmlucyA9IDUwKSArDQogIGdlb21fcnVnKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gYWN0aXZpZGFkIGVuemltw6F0aWNhIikgKw0KICB0aGVtZV9idygpDQpgYGANCg0KKipBSlVTVEUgREVMIE1PREVMTyBNSVhUTyBDT04gRE9TIENPTVBPTkVOVEVTKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hvbGQnLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvX214IDwtIGdhbWxzc01YKA0KICBmb3JtdWxhID0gYWN0IH4gMSwNCiAgZGF0YSAgICA9IGVuenltZSwNCiAgZmFtaWx5ICA9IFJHLA0KICBLICAgICAgID0gMiwNCiAgY29udHJvbCA9IE1YLmNvbnRyb2wocGxvdCA9IEZBTFNFKQ0KKQ0KbW9kZWxvX214DQpgYGANCg0KKipDQUxDVUxBTkRPIExBIERFTlNJREFEIEVTVElNQURBKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hvbGQnLCB3YXJuaW5nPUZBTFNFfQ0KZF9tb2RlbG9fbXggPC0gZ2V0cGRmTVgobW9kZWxvX214KQ0KZF9tb2RlbG9fbXgoeSA9IDIpDQpgYGANCg0KIyMjIEdSQUZJQ0EgMg0KDQoqKkRJU1RSSUJVQ0lPTiBFU1RJTUFEQSBQT1IgTU9ERUxPIE1JWFRPIERFIERPUyBDT01QT05FTlRFUyoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdob2xkJywgd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gZW56eW1lKSArDQogIGdlb21faGlzdG9ncmFtKA0KICAgIGFlcyh4ID0gYWN0LCB5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSksDQogICAgY29sb3IgPSAiYmxhY2siLA0KICAgIGFscGhhID0gMC4zKSArDQogIHN0YXRfZnVuY3Rpb24oDQogICAgZnVuICAgPSBmdW5jdGlvbigueCl7ZF9tb2RlbG9fbXgoeSA9IC54KX0sDQogICAgY29sb3IgPSAiZGFya2JsdWUiLA0KICAgIHNpemUgID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZXN0aW1hZGEgcG9yIG1vZGVsbyBtaXh0byBkZSBkb3MgY29tcG9uZW50ZXMiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQoqKkFKVVNURSBERUwgTU9ERUxPIDEwIFZFQ0VTKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hvbGQnLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxvX214IDwtIGdhbWxzc01YZml0cygNCiAgbiAgICAgICA9IDEwLA0KICBmb3JtdWxhID0gYWN0IH4gMSwNCiAgZGF0YSAgICA9IGVuenltZSwNCiAgZmFtaWx5ICA9IFJHLA0KICBLICAgICAgID0gMiwNCiAgY29udHJvbCA9IE1YLmNvbnRyb2wocGxvdCA9IEZBTFNFKQ0KKQ0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlByZWd1bnRhIDQqKg0KDQoqKlVuYSBhcGxpY2FjacOzbiBkZSBkaXN0cmlidWNpb25lcyBiaXZhcmlhZGFzIGRpc2NyZXRhczoqKg0KDQpFbiB1bmEgaW52ZXN0aWdhY2nDs24gcmVhbGl6YWRhIHBvciB1biBlc3R1ZGlhbnRlIGRlIEluZ2VuaWVyw61hIGFtYmllbnRhbCBkZSBsYSBVTkFMTSBzb2JyZSBsYSAiRXZhbHVhY2nDs24gZGUgbGEgY2FsaWRhZCBkZSBhZ3VhcyBzdXBlcmZpY2lhbGVzIGVuIGxhIGN1ZW5jYSBkZWwgcsOtbyBSw61tYWMiLCBzZSB0aWVuZSB1biB0b3RhbCBkZSAyNSBlc3RhY2lvbmVzIGxhcyBjdWFsZXMgY29uZm9ybWFuIHVuYSByZWQgZGUgbW9uaXRvcmVvIGVuIGVsIHLDrW8gUsOtbWFjLiBEb25kZSAxMiBlc3RhY2lvbmVzIHNlIHViaWNhbiBlbiBsb3MgdHJpYnV0YXJpb3MgbyBhZmx1ZW50ZXMgYSBsYSBjdWVuY2EsIDcgZXN0YWNpb25lcyBzZSB1YmljYW4gYWxyZWRlZG9yIGRlIGxhcyBib2NhdG9tYXMgeSBlbCByZXN0byBlbiBsYSBzdWIgY3VlbmNhIFNhbnRhIEV1bGFsaWEuIFNpIHNlIGVsaWdlbiAxMCBlc3RhY2lvbmVzIGFsIGF6YXIsIGNvbiByZWVtcGxhem8geSBzaW4gY29uc2lkZXJhciBlbCBvcmRlbiBwYXJhIHJlYWxpemFyIHVuYSBpbnNwZWNjacOzbiBlbiBsYSBjYWxpZGFkIGRlbCBhZ3VhLCBjYWxjdWxhciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIDMgc2VhbiBkZSBsYXMgZXN0YWNpb25lcyBkZSBhZmx1ZW50ZXMgZGUgY3VlbmNhLDUgZGUgbGFzIGVzdGFjaW9uZXMgYWxyZWRlZG9yIGRlIGxhcyBib2NhdG9tYXMgeSBlbCByZXN0byBkZSBsYXMgZXN0YWNpb25lcyBkZSBsYSBzdWIgY3VlbmNhIFNhbnRhIEV1bGFsaWEuDQoNCi0gICBYPSB7bsO6bWVybyBkZSBlc3RhY2lvbmVzIGRlIGFmbHVlbnRlcyBkZSBjdWVuY2EgZW4gbGEgbXVlc3RyYSBkZSB0YW1hw7FvIDEwfQ0KDQotICAgWT0ge27Dum1lcm8gZGUgZXN0YWNpb25lcyBhbHJlZGVkb3IgZGUgbGFzIGJvY2F0b21hcyBlbiBsYSBtdWVzdHJhIGRlIHRhbWHDsW8gMTB9DQoNCiMjIyBEQVRPUw0KDQotICAgQT0xMiBlc3RhY2lvbmVzIGNvbXVuZXMgZW4gYWZsdWVudGVzIGEgbGEgY3VlbmNhLg0KDQotICAgQj03IGVzdGFjaW9uZXMgY29tdW5lcyBhbHJlZGVkb3IgZGUgbGFzIGJvY2F0b21hcy4NCg0KLSAgIFg9MyBlc3RhY2lvbmVzIGNvbXVuZXMgZGUgYWZsdWVudGVzIGRlIGN1ZW5jYSBlbiBsYSBtdWVzdHJhLg0KDQotICAgWT01IGVzdGFjaW9uZXMgY29tdW5lcyBhbHJlZGVkb3IgZGUgbGFzIGJvY2F0b21hcyBlbiBsYSBtdWVzdHJhLg0KDQotICAgbj0gMTAgZXN0YWNpb25lcyBjb211bmVzIHNlbGVjY2lvbmFkb3MgYWwgYXphciwgY29uIHJlZW1wbGF6byB5IHNpbiBjb25zaWRlcmFyIGVsIG9yZGVuLg0KDQojIyMgU09MVUNJw5NODQoNCiQkKFgsWSlcc2ltIFYgQml2YXJpYWRhKE49MjUsbj0xMCxBPTEyLEI9NykkJA0KDQokJHBhcmE6IDBcbGVxc2xhbnQgWFxsZXFzbGFudCAxMCAsIFwgMFxsZXFzbGFudCBZXGxlcXNsYW50IDEwICwgXCAgMFxsZXFzbGFudCBYK1kgXGxlcXNsYW50IDEwICQkDQoNCiQkZih4LHkpPVxmcmFje1xiaW5vbXsxMit4LTF9e3h9XGJpbm9tezcreS0xfXt5fVxiaW5vbXs2KygxMC14LXkpLTF9ezEwLXgteX19e1xiaW5vbXsyNSsxMC0xfXsxMH19JCQNCg0KJCQgZih4LHkpPVxmcmFje1xiaW5vbXsxMiszLTF9ezN9XGJpbm9tezcrNS0xfXs1fVxiaW5vbXs2KygxMC0zLTUpLTF9ezEwLTMtNX19e1xiaW5vbXsyNSsxMC0xfXsxMH19PVxmcmFje1xiaW5vbXsxMiszLTF9ezN9XGJpbm9tezcrNS0xfXs1fVxiaW5vbXs2KygyKS0xfXsyfX17XGJpbm9tezI1KzEwLTF9ezEwfX09MC4wMjY5MyQkDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlByZWd1bnRhIDUqKg0KDQoqKlVuYSBhcGxpY2FjacOzbiBkZSBkaXN0cmlidWNpb25lcyBiaXZhcmlhZGFzIGNvbnRpbnVhcy4qKg0KDQpTZWEgeCBlbCBjb250ZW5pZG8gZGVsIG1ldGFsIHBlc2FkbyBIaWVycm8oRmUpIC4geSBlbCBjb250ZW5pZG8gZGUgQWx1bWluaW8oQWwpLiBQYXJhIHVuYSBtdWVzdHJhIGRlIDEwMCBtbCBkZWwgcsOtbyBSw61tYWMgLiBQb3IgYW50ZXJpb3JlcyBlc3R1ZGlvcyBzZSBzYWJlIHF1ZSAoeCx5KSBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGJpdmFyaWFkYS4gU2Ugc2FiZSBxdWUgQ292KHgseSkgPSAwLjYwIHkgz4N4XCrPg3k9IDMuMDANCg0KSGFsbGUgz4EoeHkpIDoNCg0KIyMjIFNPTFVDScOTTg0KDQpTZSBzYWJlDQoNCiQkXHJob197eHl9PVxmcmFje2Nvdl97eHl9fXtcc2lnbWFfe3h9XHNpZ21hX3t5fX0kJCBQb3IgbG8gdGFudG8gZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuOiDPgSh4eSkgPSAwLjIgLiBDw7NtbyBlcyB1biB2YWxvciBjZXJjYW5vIGEgMCBzZSBkaWNlIHF1ZSBleGlzdGUgdW5hIHBvYnJlIGNvcnJlbGFjacOzbiBlbnRyZSBsb3Mgbml2ZWxlcyBkZSBoaWVycm8geSBhbHVtaW5pby4NCg0KIyMjIEdSw4FGSUNBDQoNCmRpc3RyaWJ1Y2nDs24gbm9ybWFsIGJpdmFyaWFkYSBwYXJhIG5pdmVsZXMgZGUgRmUgeSBBbDoNCg0KQ29uc2lkZXJhbmRvOg0KDQotICAgJFxtdV94JCA9IDENCi0gICAkXG11X3kkID0gMg0KLSAgICRzZF94JCA9IDMNCi0gICAkc2RfeSQgPSAxDQotICAgJFxyaG8kID0gMC4yDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgUGxvdGVvIGRlIGRpc3RyaWJ1Y2lvbiBiaXZhcmlhZGEgcGFyYSBGZSB5IEFsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmxpYnJhcnkoIk1BU1MiKQ0Kcm0obGlzdD1scygpKQ0KIyMjIERlbnNpZGFkIG5vcm1hbCBiaXZhcmlhZGENCmggPC0gZnVuY3Rpb24oeCx5LG14LG15LHN4LHN5LHApIHsgKDEvKDIqcGkqc3gqc3kqc3FydCgoMS1wXjIpKSkpKmV4cCgoLTEvKDIqKDEtcF4yKSkpKnsoeC1teCleMi9zeF4yIC0gMipwKigoeC1teCkvc3gpKigoeS1teSkvc3kpICsgKHktbXkpXjIvc3leMn0pfQ0KDQojIyMgZnVuY2lvbiBwYXJhIGhhbGxhciBsYXMgcHJvYmFiaWxpZGFkZXMNCmJ2bi5wcm9iPC1mdW5jdGlvbihteCxteSxzeCxzeSxwLHgubGxpbSx4LnVsaW0seS5sbGltLHkudWxpbSkgew0KICBpbnRlZ3JhdGUoZnVuY3Rpb24oeSl7IHNhcHBseSh5LGZ1bmN0aW9uKHkpew0KICAgIGludGVncmF0ZShmdW5jdGlvbih4KSBoKHgseSxteCxteSxzeCxzeSxwKSAseC5sbGltLHgudWxpbSkkdmFsdWV9KX0seS5sbGltLHkudWxpbSkkdmFsdWUgfQ0KDQojIyMgQ2FyZ2FyIHZhbG9yZXMgcGFyYSBsYSBzaW11bGFjaW9uDQptdXg8LTE7bXV5PC0yO3NkeDwtMztzZHk8LTE7cmhvPC0gMC4yDQojIyMgY2FsY3VsYXIgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzDQooU2lnbWEgPC0gbWF0cml4KGMoc2R4XjIsc2R4KnNkeSpyaG8sc2R4KnNkeSpyaG8sc2R5XjIpLDIsMikpDQojIyMgVmVjdG9yIGRlIG1lZGlhcw0KTXU8LSBjKG11eCxtdXkpDQoNCiMjIyB0YW1hw7FvIGRlIG11ZXN0cmEgMSBtaWxsw7NuIHBhcmEgZXN0aW1hY2lvbiBkZSBwcm9iYWJpbGlkYWRlcyBlbiBjdWFkcmFudGVzDQpuPC0xMDAwMDAwDQp5PC1tdnJub3JtKG4sIE11LCBTaWdtYSkNCnRtcDE8LXN1bSgoeVssMV0+MCkqKHlbLDJdPjApKS9uDQp0bXAyPC1zdW0oKHlbLDFdPDApKih5WywyXT4wKSkvbg0KdG1wMzwtc3VtKCh5WywxXTwwKSooeVssMl08MCkpL24NCnRtcDQ8LXN1bSgoeVssMV0+MCkqKHlbLDJdPDApKS9uDQoNCmNiaW5kKA0KICBTaW11bGF0aW9uPWModG1wMSx0bXAyLHRtcDMsdG1wNCksDQogIENhbGN1bGF0aW9uPWMoDQogICAgYnZuLnByb2IobXV4LG11eSxzZHgsc2R5LHJobywwLEluZiwwLEluZiksDQogICAgYnZuLnByb2IobXV4LG11eSxzZHgsc2R5LHJobywtSW5mLDAsMCxJbmYpLA0KICAgIGJ2bi5wcm9iKG11eCxtdXksc2R4LHNkeSxyaG8sLUluZiwwLC1JbmYsMCksDQogICAgYnZuLnByb2IobXV4LG11eSxzZHgsc2R5LHJobywwLEluZiwtSW5mLDApKSkNCg0KIyMjIFBsb3RlbyBkZSBsYSBkZW5zaWRhZCBub3JtYWwgYml2YXJpYWRhDQp4PC1zZXEoLTMsMywuMSkNCnk8LXNlcSgtMywzLC4xKQ0KZjwtZnVuY3Rpb24oeCx5KSBoKHgseSwwLDAsMSwxLDAuMikNCnJlczwtcGVyc3AoeCx5LG91dGVyKHgseSxmKSx0aGV0YSA9IDQ1LCBwaGkgPSAyMCkNCg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyAqKlByZWd1bnRhIDYqKg0KDQoqKlVuYSBhcGxpY2FjacOzbiBkZSB2YXJpYWJsZXMgYWxlYXRvcmlhcyBjb24gY29vcmRlbmFkYXMgbWl4dGFzLioqDQoNClN1cG9uZ2EgcXVlIHggZXMgZWwgcG9yY2VudGFqZSBBbHVtaW5pbyBhbG1hY2VuYWRvIGVuIGxhIGN1ZW5jYSBkZWwgUmlvIFJpbWFjICBlbiB1biBkZXRlcm1pbmFkbyB0aWVtcG8gZSBZIGVzIGVsIHBvcmNlbnRhamUgZGVsIG1ldGFsIGRlIEhpZXJybyBhbG1hY2VuYWRvIGVuIGVzdGEgbWlzbWEgY3VlbmNhIGRlbCBSaW8gUmltYWMgIGVuIGVzZSBtaXNtbyB0aWVtcG8uIFNlIHNhYmUgcXVlIFggdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gVW5pZm9ybWUgZGlzY3JldGEgZW4gezEzLCAxNywyMX0geSBkYWRvIFg9eCwgWSBlcyBVbmlmb3JtZSBjb250aW51YSBlbiBlbCBpbnRlcnZhbG8gWzAsIHhdLg0KDQojIyMgUFJFR1VOVEEgYQ0KDQotIG9idGVuZ2EgJGYoeCx5KSQNCg0KIyMjIFNPTFVDSU9ODQokZih4LHkpPWYoeClmKHkveCk9KDEvMykoMS94KT0xLzN4JCx4PTEzLDE3LDIxOyAkeeKIiFswLHhdJA0KDQokZih4LHkpPVxsZWZ0XHtcYmVnaW57bWF0cml4fQ0KICYgMS8zOSwgeD0xMywgIDA8eTwxMyAmIFxcIA0KICYgMS81MSwgeD0xNywgIDA8eTwxNyAmIFxcIA0KICYgMS82MywgeD0yMSwgIDA8eTwyMSAmIA0KXGVuZHttYXRyaXh9XHJpZ2h0LiQNCg0KDQp8IGYoeCx5KSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICBZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfA0KfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IDA8eTwxMyAgICAgICAgfCAwPHk8MTcgICAgICAgfDA8eTwyMSAgICAgICB8DQp8ICAgICAgICAgICAgICAgICAgIHwgMTMgICAgICAgICAgIHwgMS8zOSAgICAgICAgICB8IDAgICAgICAgICAgICB8MCAgICAgICAgICAgIHwNCnwgIHggICAgICAgICAgICAgICAgfCAxNyAgICAgICAgICAgfCAwICAgICAgICAgICAgIHwgMS81MSAgICAgICAgIHwwICAgICAgICAgICAgfA0KfCAgICAgICAgICAgICAgICAgICB8IDIxICAgICAgICAgICB8IDAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgfDEvNjMgICAgICAgICB8DQoNCg0KJGYoeCx5KSQ9JDEvMzkgSV8oezEzfSkgeElfKFswLDEzXSkgeSsxLzUxIElfKHsxN30pIHhJXyhbMCwxN10pIHkrMS82MyBJXyh7MjF9KSB4SV8oWzAsMjFdKSB5JA0KDQoNCiMjIyBQUkVHVU5UQSBiDQoNCi0gwr9FcyBmIHVuYSBkZW5zaWRhZCBtaXh0YSBjb25qdW50YT8gQ29uc2lkZXJlICpTPXsxMywxNywyMX0qIHkgICpUPVswLDIxXSoNCg0KIyMjIFNPTFVDScOTTg0KU2UgZGViZSBwcm9jZWRlciBhIGludGVncmFyIHBhcmEgY29tcHJvYmFyIHNpIGVzIHVuYSBkZW5zaWRhZCBtaXh0YSBjb25qdW50YToNCg0KJFxzdW1fe3ggXGVwc2lsb24gU31caW50X3t0fWYoeCx5KWR5PSBcaW50X3sxM31eezB9MS8zOWR5KyBcaW50X3sxN31eezB9MS81MWR5KyBcaW50X3syMX1eezB9MS82M2R5JA0KDQokPTEvMysxLzMrMS8zPTEkDQoNCi0gQ29uY2x1aW1vcyBxdWUgJGYoeCx5KSQgZXMgdW5hIGRlbnNpZGFkIG1peHRhIGNvbmp1bnRhLCB5YSBxdWUgbGEgc3VtYXRvcmlhIGVzIGlndWFsIGEgdW5vLg0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEZVRU5URVMNCg0KLSBNYXJsZW5pIEJlYXRyaXosIEEuIE0uICgyMDIyKS4gKkV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQgZGUgYWd1YXMgc3VwZXJmaWNpYWxlcyBlbiBsYSBjdWVuY2EgZGVsIHJpbyBSw61tYWMgbWVkaWFudGUgYW7DoWxpc2lzIG11bHRpdmFyaWFkbyBwYXJhIGVsIHBlcmlvZG8gMjAxMS0yMDE4KiAoTGljZW5jaWFkbykuIFVuaXZlcnNpZGFkIE5hY2lvbmFsIEFncmFyaWEgTGEgTW9saW5hLiBbVGVzaXNdKGh0dHBzOi8vcmVwb3NpdG9yaW8ubGFtb2xpbmEuZWR1LnBlL2JpdHN0cmVhbS9oYW5kbGUvMjAuNTAwLjEyOTk2LzUzNjAvYWxkZXJldGUtbWFscGFydGlkYS1tYXJsZW5pLWJlYXRyaXoucGRmP3NlcXVlbmNlPTEmaXNBbGxvd2VkPXkpDQoNCi0gTWlyYW5kYSBGZXJuw6FuZGV6LiAoMjAxNykuICpDw6FsY3VsbyBkZSBQcm9iYWJpbGlkYWRlcyBjb24gR3LDoWZpY29zIGVuIFIuKg0KUHJpbWVyYSBFZGljacOzbi4gTGltYSwgUGVyw7ouIFEmUCBJbXByZXNvcmVzIFMuUi5MLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBBTkVYTw0KDQpFc3RhZMOtc3RpY29zIGRlc2NyaXB0aXZhIGRlIGxvcyAyMSBwYXLDoW1ldHJvcyBkZSBjYWxpZGFkIGRlIGFndWENCg0KIVtdKGltYWdlbi5wbmcpDQo=