# El aguacate necesita grandes cantidades de potasio y manganeso. Este cultivo es sensible al sodio y a los cloruros. La toxicidad por cloruros disminuye enormemente el crecimiento y engorde de las frutas, y causa necrosis de los márgenes de las hojas. La toxicidad del sodio produce clorosis y necrosis en las hojas. El árbol del aguacate es extraordinariamente versátil en su adaptación al tipo de suelo, se comporta bien en diferentes tipos, como los de arcillas rojas, arenas, margas volcánicas o suelos calcáreos. El valor deseable del pH en el suelo es, por lo general, de entre 6 y 7. La prioridad del árbol es contar con un buen drenaje. No aguanta la humedad excesiva del suelo ni la anegación temporal. (Tomado de ICL https://icl-sf.com/es-es/product-guide/cultivo-fruta-tropical/aguacate/)

# Por lo tanto, la aplicacion de fertilizantes foliares que contribuyan a promover un buen desarrollo del fruto, asi como el buen manejo del riego, es fundamental para analizar el rendimiento del cultivo. A continuacion se presenta el analisis estadistico de un diseño factorial incompleto en parcelas dividas, para estudiar y concluir el efecto de varios factores (Riego, Fertilizacion) sobre la variable respuesta.
library(readxl)
datos_hass <- read_excel("C:/Users/User/Desktop/AvoHass.xlsx")

datos_hass <- within(datos_hass, SoliF <- factor(Soli))
head(datos_hass)
Soli <- factor(datos_hass$Solinure)
Riego <- factor(datos_hass$Riego)
Bloque <-factor(datos_hass$Bloque)
Rto <-as.vector(datos_hass$Rto)
Re1 <-as.numeric(Rto)
library(collapsibleTree)
Re1 = datos_hass$Rto
Riego = datos_hass$Riego
SoliF= datos_hass$Soli
Warning: Unknown or uninitialised column: `Soli`.
dfsp<-data.frame(Rto = datos_hass$Rto,Riego = datos_hass$Riego, SoliF = datos_hass$SoliF)
dfsp
collapsibleTree::collapsibleTree(dfsp,c("Riego","SoliF"))
library(agricolae)
fran.anova <-strip.plot(Bloque, Soli, Riego, Re1)

ANALYSIS STRIP PLOT:  Re1 
Class level information

Soli    :  0 25 50 
Riego   :  Bajo Alto 
Bloque  :  1 2 3 4 

Number of observations:  24 

model Y: Re1 ~ Bloque + Soli + Ea + Riego + Eb + Riego:Soli + Ec 

Analysis of Variance Table

Response: Re1
           Df  Sum Sq Mean Sq F value  Pr(>F)  
Bloque      3 214.026  71.342                  
Soli        2  43.178  21.589  0.8473 0.47414  
Ea          6 152.884  25.481                  
Riego       1  17.428  17.428  5.3603 0.10353  
Eb          3   9.754   3.251                  
Riego:Soli  2 188.103  94.051  8.8878 0.01607 *
Ec          6  63.493  10.582                  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

cv(a) = 5 %, cv(b) = 1.8 %, cv(c) = 3.2 %, Mean = 100.667 
fran.anova
$data

$ANOVA
Analysis of Variance Table

Response: Re1
           Df  Sum Sq Mean Sq F value  Pr(>F)  
Bloque      3 214.026  71.342                  
Soli        2  43.178  21.589  0.8473 0.47414  
Ea          6 152.884  25.481                  
Riego       1  17.428  17.428  5.3603 0.10353  
Eb          3   9.754   3.251                  
Riego:Soli  2 188.103  94.051  8.8878 0.01607 *
Ec          6  63.493  10.582                  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

$gl.a
[1] 6

$gl.b
[1] 3

$gl.c
[1] 6

$Ea
[1] 25.48065

$Eb
[1] 3.251329

$Ec
[1] 10.58211
### Se observa que como el P valor de la interaccion es menor al Nivel de significancia, 0.05 si existe una interaccion entre la fertilizacion con Solinure y el tipo de Riego (Alto o bajo), por lo cual aplicamos el HSD Test (Tukey)

Factor1 <- HSD.test(Re1, Soli, fran.anova$gl.a, fran.anova$Ea); Factor1
$statistics
   MSerror Df    Mean       CV      MSD
  25.48065  6 100.667 5.014391 7.744074

$parameters
   test name.t ntr StudentizedRange alpha
  Tukey   Soli   3         4.339195  0.05

$means
         Re1      std r      Min      Max      Q25
0  100.57809 6.306749 8 93.09131 110.5291 94.96896
25 102.35236 5.703283 8 92.12843 109.5361 99.17359
50  99.07049 4.465256 8 90.46573 106.5962 98.32769
         Q50      Q75
0   99.81995 105.5431
25 103.67415 106.3182
50  99.13017 100.0139

$comparison
NULL

$groups
         Re1 groups
25 102.35236      a
0  100.57809      a
50  99.07049      a

attr(,"class")
[1] "group"

Factor2 <- HSD.test(Re1, Riego, fran.anova$gl.b, fran.anova$Eb); Factor2

# Para Dosis de Fertilizacion con Niveles de Riego
# Interacciones entre Aplicaciones de Solinure y Tipos de Riego para Aguacate Hass

Factor12<-HSD.test(Re1,Riego:Soli,fran.anova$gl.c,fran.anova$Ec);Factor12
$statistics
   MSerror Df    Mean       CV     MSD
  10.58211  6 100.667 3.231462 9.15456

$parameters
   test     name.t ntr StudentizedRange alpha
  Tukey Riego:Soli   6         5.628353  0.05

$means
              Re1      std r       Min       Max
Alto:0   99.80117 7.898867 4  93.09131 110.52914
Alto:25  98.03444 4.634454 4  92.12843 103.06011
Alto:50 101.60886 3.519706 4  99.09645 106.59625
Bajo:0  101.35500 5.367199 4  95.05510 106.31181
Bajo:25 106.67029 2.168065 4 104.28818 109.53609
Bajo:50  96.53213 4.117371 4  90.46573  99.49227
              Q25       Q50       Q75
Alto:0   94.30573  97.79212 103.28757
Alto:25  95.83958  98.47460 100.66946
Alto:50  99.14703 100.37136 102.83319
Bajo:0   97.83842 102.02655 105.54313
Bajo:25 105.72798 106.42845 107.37075
Bajo:50  95.81672  98.08526  98.80066

$comparison
NULL

$groups
              Re1 groups
Bajo:25 106.67029      a
Alto:50 101.60886     ab
Bajo:0  101.35500     ab
Alto:0   99.80117     ab
Alto:25  98.03444     ab
Bajo:50  96.53213      b

attr(,"class")
[1] "group"
# Comparaciones de medias y graficas de barras

## Tuker para Dosis de Solinure


out1<-with(fran.anova,HSD.test(Re1,Soli,fran.anova$gl.a,fran.anova$Ea));out1
$statistics
   MSerror Df    Mean       CV      MSD
  25.48065  6 100.667 5.014391 7.744074

$parameters
   test name.t ntr StudentizedRange alpha
  Tukey   Soli   3         4.339195  0.05

$means
         Re1      std r      Min      Max      Q25
0  100.57809 6.306749 8 93.09131 110.5291 94.96896
25 102.35236 5.703283 8 92.12843 109.5361 99.17359
50  99.07049 4.465256 8 90.46573 106.5962 98.32769
         Q50      Q75
0   99.81995 105.5431
25 103.67415 106.3182
50  99.13017 100.0139

$comparison
NULL

$groups
         Re1 groups
25 102.35236      a
0  100.57809      a
50  99.07049      a

attr(,"class")
[1] "group"
bar.err(out1$means, variation ="SE", ylim=c(0,120), xlab="Aplicaciones de Solinure", ylab="Rto")

out2<-with(fran.anova,HSD.test(Re1,Riego,fran.anova$gl.b,fran.anova$Eb));out2
$statistics
   MSerror Df    Mean       CV      MSD
  3.251329  3 100.667 1.791197 2.342696

$parameters
   test name.t ntr StudentizedRange alpha
  Tukey  Riego   2         4.500659  0.05

$means
           Re1     std  r      Min      Max      Q25
Alto  99.81482 5.34560 12 92.12843 110.5291 96.48510
Bajo 101.51914 5.69774 12 90.46573 109.5361 98.32769
           Q50      Q75
Alto  99.51824 101.9492
Bajo 101.89022 106.2339

$comparison
NULL

$groups
           Re1 groups
Bajo 101.51914      a
Alto  99.81482      a

attr(,"class")
[1] "group"
bar.err(out2$means, variation ="SE", ylim=c(0,120), xlab="Riego", ylab="Rto")

# Prueba de Tukey para Interaccion

out3<-with(fran.anova,HSD.test(Re1,Riego:Soli,fran.anova$gl.c,fran.anova$Ec));out3
$statistics
   MSerror Df    Mean       CV     MSD
  10.58211  6 100.667 3.231462 9.15456

$parameters
   test     name.t ntr StudentizedRange alpha
  Tukey Riego:Soli   6         5.628353  0.05

$means
              Re1      std r       Min       Max       Q25       Q50       Q75
Alto:0   99.80117 7.898867 4  93.09131 110.52914  94.30573  97.79212 103.28757
Alto:25  98.03444 4.634454 4  92.12843 103.06011  95.83958  98.47460 100.66946
Alto:50 101.60886 3.519706 4  99.09645 106.59625  99.14703 100.37136 102.83319
Bajo:0  101.35500 5.367199 4  95.05510 106.31181  97.83842 102.02655 105.54313
Bajo:25 106.67029 2.168065 4 104.28818 109.53609 105.72798 106.42845 107.37075
Bajo:50  96.53213 4.117371 4  90.46573  99.49227  95.81672  98.08526  98.80066

$comparison
NULL

$groups
              Re1 groups
Bajo:25 106.67029      a
Alto:50 101.60886     ab
Bajo:0  101.35500     ab
Alto:0   99.80117     ab
Alto:25  98.03444     ab
Bajo:50  96.53213      b

attr(,"class")
[1] "group"
bar.err(out3$means, variation ="SE", ylim=c(0,120), xlab="Riego por Solinure", ylab="Rto")

interaction.plot(Soli,Riego,Re1, fixed=T, xlab="Aplicacion de Solinure", ylab="Rto", pch = c(20,21),type = "b") 

### Si se observa que hay una interaccion entre el Rendimiento del Aguacate Hass por causa de la Aplicacion del Fertilzante Solinure y el tipo de Riego.

#  Con la grafica obtenida de los datos manejados se puede concluir que los mayores rendimientos se dan con la Aplicacion de la Dosis de 25g y el tipo de riego bajo, siendo mas eficientes con los recursos y con costos mas bajos. 

# Por otro lado, se confirma que la aplicacion de dosis de 50g para aguacate con riego bajo, causa una baja de rendimiento considerable, siendo el peor tratamiento de todos.
## Despues de analizar la interaccion entre los factores y el rendimiento, podemos ver el efecto de cada uno por separado.
A<-fran.anova$data

a<-nlevels(A$Soli)

b<-nlevels(A$Riego)

r<-nlevels(A$BLOF)

Ea<-fran.anova$Ea; Eb<-fran.anova$Eb; Ec<-fran.anova$Ec

gla<-fran.anova$gl.a; glb<-fran.anova$gl.b; glc<-fran.anova$gl.c
## Medias (Interacciones)

B <-tapply.stat(A[,4],A[,2:3],mean);B
NA
NA
# Error estandar de las medias de las interacciones
std<-tapply.stat(A[,4],A[,2:3],function(x) sd(x)/sqrt(length(x)));std
# Cabe resaltar que los datos fueron creados en Excel, con distribucion normal
LS0tDQp0aXRsZTogIkFuYWxpc2lzIGVzdGFkaXN0aWNvIC0gUGFyY2VsYXMgRGl2LiBSZW5kaW1pZW50byBBZ3VhY2F0ZSBIYXNzIC0gSnVhbiBTZWJhc3RpYW4gQ2FtZWxvIDAyLzEyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQojIEVsIGFndWFjYXRlIG5lY2VzaXRhIGdyYW5kZXMgY2FudGlkYWRlcyBkZSBwb3Rhc2lvIHkgbWFuZ2FuZXNvLiBFc3RlIGN1bHRpdm8gZXMgc2Vuc2libGUgYWwgc29kaW8geSBhIGxvcyBjbG9ydXJvcy4gTGEgdG94aWNpZGFkIHBvciBjbG9ydXJvcyBkaXNtaW51eWUgZW5vcm1lbWVudGUgZWwgY3JlY2ltaWVudG8geSBlbmdvcmRlIGRlIGxhcyBmcnV0YXMsIHkgY2F1c2EgbmVjcm9zaXMgZGUgbG9zIG3DoXJnZW5lcyBkZSBsYXMgaG9qYXMuIExhIHRveGljaWRhZCBkZWwgc29kaW8gcHJvZHVjZSBjbG9yb3NpcyB5IG5lY3Jvc2lzIGVuIGxhcyBob2phcy4gRWwgw6FyYm9sIGRlbCBhZ3VhY2F0ZSBlcyBleHRyYW9yZGluYXJpYW1lbnRlIHZlcnPDoXRpbCBlbiBzdSBhZGFwdGFjacOzbiBhbCB0aXBvIGRlIHN1ZWxvLCBzZSBjb21wb3J0YSBiaWVuIGVuIGRpZmVyZW50ZXMgdGlwb3MsIGNvbW8gbG9zIGRlIGFyY2lsbGFzIHJvamFzLCBhcmVuYXMsIG1hcmdhcyB2b2xjw6FuaWNhcyBvIHN1ZWxvcyBjYWxjw6FyZW9zLiBFbCB2YWxvciBkZXNlYWJsZSBkZWwgcEggZW4gZWwgc3VlbG8gZXMsIHBvciBsbyBnZW5lcmFsLCBkZSBlbnRyZSA2IHkgNy4gTGEgcHJpb3JpZGFkIGRlbCDDoXJib2wgZXMgY29udGFyIGNvbiB1biBidWVuIGRyZW5hamUuIE5vIGFndWFudGEgbGEgaHVtZWRhZCBleGNlc2l2YSBkZWwgc3VlbG8gbmkgbGEgYW5lZ2FjacOzbiB0ZW1wb3JhbC4gKFRvbWFkbyBkZSBJQ0wgaHR0cHM6Ly9pY2wtc2YuY29tL2VzLWVzL3Byb2R1Y3QtZ3VpZGUvY3VsdGl2by1mcnV0YS10cm9waWNhbC9hZ3VhY2F0ZS8pDQoNCiMgUG9yIGxvIHRhbnRvLCBsYSBhcGxpY2FjaW9uIGRlIGZlcnRpbGl6YW50ZXMgZm9saWFyZXMgcXVlIGNvbnRyaWJ1eWFuIGEgcHJvbW92ZXIgdW4gYnVlbiBkZXNhcnJvbGxvIGRlbCBmcnV0bywgYXNpIGNvbW8gZWwgYnVlbiBtYW5lam8gZGVsIHJpZWdvLCBlcyBmdW5kYW1lbnRhbCBwYXJhIGFuYWxpemFyIGVsIHJlbmRpbWllbnRvIGRlbCBjdWx0aXZvLiBBIGNvbnRpbnVhY2lvbiBzZSBwcmVzZW50YSBlbCBhbmFsaXNpcyBlc3RhZGlzdGljbyBkZSB1biBkaXNlw7FvIGZhY3RvcmlhbCBpbmNvbXBsZXRvIGVuIHBhcmNlbGFzIGRpdmlkYXMsIHBhcmEgZXN0dWRpYXIgeSBjb25jbHVpciBlbCBlZmVjdG8gZGUgdmFyaW9zIGZhY3RvcmVzIChSaWVnbywgRmVydGlsaXphY2lvbikgc29icmUgbGEgdmFyaWFibGUgcmVzcHVlc3RhLg0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdG9zX2hhc3MgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvVXNlci9EZXNrdG9wL0F2b0hhc3MueGxzeCIpDQoNCmRhdG9zX2hhc3MgPC0gd2l0aGluKGRhdG9zX2hhc3MsIFNvbGlGIDwtIGZhY3RvcihTb2xpKSkNCmhlYWQoZGF0b3NfaGFzcykNCmBgYA0KDQpgYGB7cn0NClNvbGkgPC0gZmFjdG9yKGRhdG9zX2hhc3MkU29saW51cmUpDQpSaWVnbyA8LSBmYWN0b3IoZGF0b3NfaGFzcyRSaWVnbykNCkJsb3F1ZSA8LWZhY3RvcihkYXRvc19oYXNzJEJsb3F1ZSkNClJ0byA8LWFzLnZlY3RvcihkYXRvc19oYXNzJFJ0bykNClJlMSA8LWFzLm51bWVyaWMoUnRvKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShjb2xsYXBzaWJsZVRyZWUpDQpSZTEgPSBkYXRvc19oYXNzJFJ0bw0KUmllZ28gPSBkYXRvc19oYXNzJFJpZWdvDQpTb2xpRj0gZGF0b3NfaGFzcyRTb2xpDQoNCmRmc3A8LWRhdGEuZnJhbWUoUnRvID0gZGF0b3NfaGFzcyRSdG8sUmllZ28gPSBkYXRvc19oYXNzJFJpZWdvLCBTb2xpRiA9IGRhdG9zX2hhc3MkU29saUYpDQpkZnNwDQpgYGANCg0KDQpgYGB7cn0NCmNvbGxhcHNpYmxlVHJlZTo6Y29sbGFwc2libGVUcmVlKGRmc3AsYygiUmllZ28iLCJTb2xpRiIpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoYWdyaWNvbGFlKQ0KYGBgDQoNCmBgYHtyfQ0KZnJhbi5hbm92YSA8LXN0cmlwLnBsb3QoQmxvcXVlLCBTb2xpLCBSaWVnbywgUmUxKQ0KYGBgDQpgYGB7cn0NCmZyYW4uYW5vdmENCmBgYA0KYGBge3J9DQojIyMgU2Ugb2JzZXJ2YSBxdWUgY29tbyBlbCBQIHZhbG9yIGRlIGxhIGludGVyYWNjaW9uIGVzIG1lbm9yIGFsIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEsIDAuMDUgc2kgZXhpc3RlIHVuYSBpbnRlcmFjY2lvbiBlbnRyZSBsYSBmZXJ0aWxpemFjaW9uIGNvbiBTb2xpbnVyZSB5IGVsIHRpcG8gZGUgUmllZ28gKEFsdG8gbyBiYWpvKSwgcG9yIGxvIGN1YWwgYXBsaWNhbW9zIGVsIEhTRCBUZXN0IChUdWtleSkNCmBgYA0KDQpgYGB7cn0NCg0KRmFjdG9yMSA8LSBIU0QudGVzdChSZTEsIFNvbGksIGZyYW4uYW5vdmEkZ2wuYSwgZnJhbi5hbm92YSRFYSk7IEZhY3RvcjENCg0KIyBQYXJhIERvc2lzIGRlIEZlcnRpbGl6YWNpb24gY29uIFNvbGludXJlDQoNCmBgYA0KDQpgYGB7cn0NCg0KRmFjdG9yMiA8LSBIU0QudGVzdChSZTEsIFJpZWdvLCBmcmFuLmFub3ZhJGdsLmIsIGZyYW4uYW5vdmEkRWIpOyBGYWN0b3IyDQoNCiMgUGFyYSBEb3NpcyBkZSBGZXJ0aWxpemFjaW9uIGNvbiBOaXZlbGVzIGRlIFJpZWdvDQoNCmBgYA0KDQpgYGB7cn0NCiMgSW50ZXJhY2Npb25lcyBlbnRyZSBBcGxpY2FjaW9uZXMgZGUgU29saW51cmUgeSBUaXBvcyBkZSBSaWVnbyBwYXJhIEFndWFjYXRlIEhhc3MNCg0KRmFjdG9yMTI8LUhTRC50ZXN0KFJlMSxSaWVnbzpTb2xpLGZyYW4uYW5vdmEkZ2wuYyxmcmFuLmFub3ZhJEVjKTtGYWN0b3IxMg0KDQpgYGANCmBgYHtyfQ0KIyBDb21wYXJhY2lvbmVzIGRlIG1lZGlhcyB5IGdyYWZpY2FzIGRlIGJhcnJhcw0KDQojIyBUdWtlciBwYXJhIERvc2lzIGRlIFNvbGludXJlDQoNCg0Kb3V0MTwtd2l0aChmcmFuLmFub3ZhLEhTRC50ZXN0KFJlMSxTb2xpLGZyYW4uYW5vdmEkZ2wuYSxmcmFuLmFub3ZhJEVhKSk7b3V0MQ0KDQpgYGANCmBgYHtyfQ0KYmFyLmVycihvdXQxJG1lYW5zLCB2YXJpYXRpb24gPSJTRSIsIHlsaW09YygwLDEyMCksIHhsYWI9IkFwbGljYWNpb25lcyBkZSBTb2xpbnVyZSIsIHlsYWI9IlJ0byIpDQpgYGANCg0KYGBge3J9DQpvdXQyPC13aXRoKGZyYW4uYW5vdmEsSFNELnRlc3QoUmUxLFJpZWdvLGZyYW4uYW5vdmEkZ2wuYixmcmFuLmFub3ZhJEViKSk7b3V0Mg0KDQpiYXIuZXJyKG91dDIkbWVhbnMsIHZhcmlhdGlvbiA9IlNFIiwgeWxpbT1jKDAsMTIwKSwgeGxhYj0iUmllZ28iLCB5bGFiPSJSdG8iKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQcnVlYmEgZGUgVHVrZXkgcGFyYSBJbnRlcmFjY2lvbg0KDQpvdXQzPC13aXRoKGZyYW4uYW5vdmEsSFNELnRlc3QoUmUxLFJpZWdvOlNvbGksZnJhbi5hbm92YSRnbC5jLGZyYW4uYW5vdmEkRWMpKTtvdXQzDQoNCmJhci5lcnIob3V0MyRtZWFucywgdmFyaWF0aW9uID0iU0UiLCB5bGltPWMoMCwxMjApLCB4bGFiPSJSaWVnbyBwb3IgU29saW51cmUiLCB5bGFiPSJSdG8iKQ0KDQpgYGANCmBgYHtyfQ0KaW50ZXJhY3Rpb24ucGxvdChTb2xpLFJpZWdvLFJlMSwgZml4ZWQ9VCwgeGxhYj0iQXBsaWNhY2lvbiBkZSBTb2xpbnVyZSIsIHlsYWI9IlJ0byIsIHBjaCA9IGMoMjAsMjEpLHR5cGUgPSAiYiIpIA0KYGBgDQoNCmBgYHtyfQ0KIyMjIFNpIHNlIG9ic2VydmEgcXVlIGhheSB1bmEgaW50ZXJhY2Npb24gZW50cmUgZWwgUmVuZGltaWVudG8gZGVsIEFndWFjYXRlIEhhc3MgcG9yIGNhdXNhIGRlIGxhIEFwbGljYWNpb24gZGVsIEZlcnRpbHphbnRlIFNvbGludXJlIHkgZWwgdGlwbyBkZSBSaWVnby4NCg0KIyAgQ29uIGxhIGdyYWZpY2Egb2J0ZW5pZGEgZGUgbG9zIGRhdG9zIG1hbmVqYWRvcyBzZSBwdWVkZSBjb25jbHVpciBxdWUgbG9zIG1heW9yZXMgcmVuZGltaWVudG9zIHNlIGRhbiBjb24gbGEgQXBsaWNhY2lvbiBkZSBsYSBEb3NpcyBkZSAyNWcgeSBlbCB0aXBvIGRlIHJpZWdvIGJham8sIHNpZW5kbyBtYXMgZWZpY2llbnRlcyBjb24gbG9zIHJlY3Vyc29zIHkgY29uIGNvc3RvcyBtYXMgYmFqb3MuIA0KDQojIFBvciBvdHJvIGxhZG8sIHNlIGNvbmZpcm1hIHF1ZSBsYSBhcGxpY2FjaW9uIGRlIGRvc2lzIGRlIDUwZyBwYXJhIGFndWFjYXRlIGNvbiByaWVnbyBiYWpvLCBjYXVzYSB1bmEgYmFqYSBkZSByZW5kaW1pZW50byBjb25zaWRlcmFibGUsIHNpZW5kbyBlbCBwZW9yIHRyYXRhbWllbnRvIGRlIHRvZG9zLg0KDQpgYGANCg0KDQpgYGB7cn0NCiMjIERlc3B1ZXMgZGUgYW5hbGl6YXIgbGEgaW50ZXJhY2Npb24gZW50cmUgbG9zIGZhY3RvcmVzIHkgZWwgcmVuZGltaWVudG8sIHBvZGVtb3MgdmVyIGVsIGVmZWN0byBkZSBjYWRhIHVubyBwb3Igc2VwYXJhZG8uDQpgYGANCg0KYGBge3J9DQpBPC1mcmFuLmFub3ZhJGRhdGENCmE8LW5sZXZlbHMoQSRTb2xpKQ0KYjwtbmxldmVscyhBJFJpZWdvKQ0KcjwtbmxldmVscyhBJEJMT0YpDQpFYTwtZnJhbi5hbm92YSRFYTsgRWI8LWZyYW4uYW5vdmEkRWI7IEVjPC1mcmFuLmFub3ZhJEVjDQpnbGE8LWZyYW4uYW5vdmEkZ2wuYTsgZ2xiPC1mcmFuLmFub3ZhJGdsLmI7IGdsYzwtZnJhbi5hbm92YSRnbC5jDQpgYGANCg0KYGBge3J9DQojIyBNZWRpYXMgKEludGVyYWNjaW9uZXMpDQpCIDwtdGFwcGx5LnN0YXQoQVssNF0sQVssMjozXSxtZWFuKTtCDQpgYGANCg0KYGBge3J9DQojIEVycm9yIGVzdGFuZGFyIGRlIGxhcyBtZWRpYXMgZGUgbGFzIGludGVyYWNjaW9uZXMNCnN0ZDwtdGFwcGx5LnN0YXQoQVssNF0sQVssMjozXSxmdW5jdGlvbih4KSBzZCh4KS9zcXJ0KGxlbmd0aCh4KSkpO3N0ZA0KYGBgDQoNCmBgYHtyfQ0KIyBDYWJlIHJlc2FsdGFyIHF1ZSBsb3MgZGF0b3MgZnVlcm9uIGNyZWFkb3MgZW4gRXhjZWwsIGNvbiBkaXN0cmlidWNpb24gbm9ybWFsDQoNCmBgYA0KDQo=