R packages

if (!require(tidyverse)) install.packages("tidyverse")
if (!require(googlesheets4)) install.packages("googlesheets4")
if (!require(googledrive)) install.packages("googledrive")
if (!require(plotly)) install.packages("plotly")
if (!require(lme4)) install.packages("lme4")
if (!require(fitdistrplus)) install.packages("fitdistrplus")
if (!require(goft)) install.packages("goft")
if (!require(data.table)) install.packages("data.table")
if (!require(scales)) install.packages("scales")
if (!require(ggbreak)) install.packages("ggbreak")
if (!require(arm)) install.packages("arm")
if (!require(splines)) install.packages("splines")
if (!require(DT)) install.packages("DT")
if (!require(binom)) install.packages("binom")
##
library(DT)
library(binom)
library(splines)
library(arm)
library(ggbreak)
library(scales)
library(tidyverse)
library(googlesheets4)
library(googledrive)
library(plotly)
library(lme4)
library(fitdistrplus)
library(goft)
library(data.table)

Data

ss= "https://docs.google.com/spreadsheets/d/1fLePbF3flzafwVH_kOZh6o2_g5htf0nmrOB2TpSdZ_M/edit?usp=sharing"
hoja = "lico_1"
rango = "B2:I1188"
ss= "https://docs.google.com/spreadsheets/d/1fLePbF3flzafwVH_kOZh6o2_g5htf0nmrOB2TpSdZ_M/edit?usp=sharing"
hoja = 1
rango = "B2:I1188"
df <- read_sheet(ss,
                  sheet = hoja,
                  range = rango,
                  col_names = TRUE
                  )
✔ Reading from Copia de pesaje de pollos.
✔ Range ''lico_1'!B2:I1188'.
df <- data.frame(df)
df$g <- as.numeric(df$g)
df$grupo <- as.factor(df$grupo)
df$replica <- as.factor(df$replica)
df$pseudo.r.dia <- as.factor(df$pseudo.r.dia)
df$dia.grupo <- as.factor(df$dia.grupo)
df$dia.replica <- as.factor(df$dia.replica)
#########################
ss= "https://docs.google.com/spreadsheets/d/1fLePbF3flzafwVH_kOZh6o2_g5htf0nmrOB2TpSdZ_M/edit?usp=sharing"
hoja = 1
rango = "A1193:F1229"
df2 <- read_sheet(ss,
                  sheet = hoja,
                  range = rango,
                  col_names = TRUE
                  )
✔ Reading from Copia de pesaje de pollos.
✔ Range ''lico_1'!A1193:F1229'.
df2$grupo <- as.factor(df2$grupo)

Peso (g): Serie de tiempo

p <- ggplot(data= df,
            aes(x= dia, y= g)
            )
p <- p +
#  geom_boxplot( aes(col= pseudo.r), fill= NA,
 #              position = position_dodge(1),
  #             show.legend = FALSE) +
#   geom_point(aes(col= grupo), size = 1,
 #            position = position_jitterdodge(jitter.height = 0.01,
  #                                           jitter.width = 0.2,
   #                                          dodge.width = 1),
    #         show.legend = FALSE) +
  geom_smooth(aes(col=grupo),
              method = "glm", linewidth = 0.4,
              formula= y ~ bs(x, 3),
              method.args = list(family="gaussian"),
              show.legend = TRUE) +
  
  stat_summary(aes(fill= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.2,
               col= "darkslategray", linewidth = 0.9,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 1),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = "peso (g)",
       x= "dia",
       title = "Peso (g) de pollos .....") +
  scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
                     labels = levels(as.factor((df$dia))))
ggplotly(p)

Dias 21-35

df. <- df[df$dia>14,]
p <- ggplot(data= df.,
            aes(x= dia, y= g)
            )
p <- p +
  geom_boxplot( aes(col= pseudo.r.dia), fill= NA,
               position = position_dodge(6),
               show.legend = TRUE) +
   geom_point(aes(col= pseudo.r.dia), size = 1,
             position = position_jitterdodge(jitter.height = 0.01,
                                             jitter.width = 0.2,
                                             dodge.width = 6),
             show.legend = FALSE) +
#  stat_summary(aes(fill= pseudo.r.dia), fun.data = 'mean_cl_normal' , 
 #              geom = , size= 0.05, linewidth = 0.6,
  #             position = position_jitterdodge(jitter.height = 0,
   #                                            jitter.width = 0,
    #                                           dodge.width = 6),
     #          show.legend = FALSE) +
#  geom_smooth(aes(col=grupo),
 #             method = "glm", linewidth = 0.4,
  #            formula= y ~ bs(x, 3), se= FALSE,
   #           method.args = list(family="gaussian"),
    #          show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = "peso (g)",
       x= "dia",
       title = "Peso (g) de pollos .....") +
  scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
                     labels = levels(as.factor((df$dia))))
#ggplotly(p)
p

COVARIANZA : GRUPO X DIA

mod1 <-lm(formula = g ~ grupo * dia ,
           #family = gaussian,
           data = df)

summary(mod1)

Call:
lm(formula = g ~ grupo * dia, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-420.75 -149.74  -31.98  150.47  750.49 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -268.2086    13.0008 -20.630   <2e-16 ***
grupoE       -17.6211    18.4379  -0.956   0.3394    
dia           65.5620     0.6739  97.292   <2e-16 ***
grupoE:dia     2.1607     0.9652   2.239   0.0254 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 178.6 on 1182 degrees of freedom
Multiple R-squared:  0.9416,    Adjusted R-squared:  0.9415 
F-statistic:  6357 on 3 and 1182 DF,  p-value: < 2.2e-16
  • La pendiente de aumento de peso (positiva) es mayor para el grupo experimental que para el control. Esto se evidencia por la interacción positiva en el glm arriba. Incluso tomando en cuenta el efecto aleatorio de los tres subgrupos por grupo (modelo con efectos aleatorios abajo), el patrón se mantiene.
mod2 <-lmer(formula = g ~ grupo * dia + (1|dia/replica),
           #family = gaussian,
           data = df)
boundary (singular) fit: see help('isSingular')
summary(mod2)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo * dia + (1 | dia/replica)
   Data: df

REML criterion at convergence: 14440.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.3950 -0.2567 -0.0221  0.2312  5.5860 

Random effects:
 Groups      Name        Variance Std.Dev.
 replica:dia (Intercept)     0      0.0   
 dia         (Intercept) 28086    167.6   
 Residual                11203    105.8   
Number of obs: 1186, groups:  replica:dia, 21; dia, 7

Fixed effects:
             Estimate Std. Error t value
(Intercept) -273.9727   114.8050  -2.386
grupoE       -20.8032    10.9271  -1.904
dia           66.1618     5.7240  11.559
grupoE:dia     2.5071     0.5721   4.382

Correlation of Fixed Effects:
           (Intr) grupoE dia   
grupoE     -0.047              
dia        -0.833  0.041       
grupoE:dia  0.039 -0.827 -0.049
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
##################################
p <- ggplot(data= df,
            aes(x= dia, y= g)
            )
p <- p +
  geom_boxplot( aes(col= dia.grupo), fill= NA,
               position = position_dodge(1),
               show.legend = TRUE) +
#  geom_point(aes(col= dia.grupo), size = 0.7,
 #            position = position_jitterdodge(jitter.height = 0.01,
  #                                           jitter.width = 0.2,
   #                                          dodge.width = 1),
    #         show.legend = FALSE) +
  geom_smooth(aes(group=grupo),
              method = "lm", linewidth= 0.2,
              formula= y ~ bs(x, 3), se= FALSE,
              method.args = list(family="poisson"),
              show.legend = FALSE) +
  
  stat_summary(aes(fill= dia.grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.2,
               col= "darkslategray", linewidth = 0.9,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 1),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = "peso (g)",
       x= "dia",
       title = "Peso (g) de pollos .....") +
  scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
                     labels = levels(as.factor((df$dia))))
p

AOV (GLM) por DIA

DIA 1

dia = 1
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)
boundary (singular) fit: see help('isSingular')
summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 790.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.2708 -0.8206  0.2154  0.8419  1.8028 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept) 0.000    0.000   
 Residual             4.717    2.172   
Number of obs: 180, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept) 35.13222    0.22895 153.451
grupoE      -0.04778    0.32378  -0.148

Correlation of Fixed Effects:
       (Intr)
grupoE -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = paste("Peso (g) de pollos al dia", dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia", dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 7

dia = 7
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)
boundary (singular) fit: see help('isSingular')
summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 1555.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.49623 -0.66986  0.06682  0.68165  2.25275 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)   0       0.00   
 Residual             347      18.63   
Number of obs: 180, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  177.803      1.963  90.555
grupoE        -8.845      2.777  -3.185

Correlation of Fixed Effects:
       (Intr)
grupoE -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = paste("Peso (g) de pollos al dia", dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia", dia)) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 11

dia = 11
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)
boundary (singular) fit: see help('isSingular')
summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 1672.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.18134 -0.71277  0.01036  0.62419  2.90324 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)   0.0     0.00   
 Residual             669.3    25.87   
Number of obs: 180, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  292.292      2.727 107.185
grupoE        -6.837      3.857  -1.773

Correlation of Fixed Effects:
       (Intr)
grupoE -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = paste("Peso (g) de pollos al dia",dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia",dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 14

dia = 14
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)
boundary (singular) fit: see help('isSingular')
summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 1836.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0417 -0.6040 -0.0234  0.6610  3.1837 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)    0      0.00   
 Residual             1682     41.02   
Number of obs: 180, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  496.502      4.323 114.840
grupoE         7.938      6.114   1.298

Correlation of Fixed Effects:
       (Intr)
grupoE -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
   labs(y = paste("Peso (g) de pollos al dia",dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia",dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 21

dia = 21
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)

summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 2123.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.9771 -0.8093  0.0054  0.7608  2.4606 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)   99.72   9.986  
 Residual             8961.76  94.667  
Number of obs: 179, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  1050.61      11.57  90.779
grupoE         26.11      14.15   1.845

Correlation of Fixed Effects:
       (Intr)
grupoE -0.615
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
  labs(y = paste("Peso (g) de pollos al dia",dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia",dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 28

dia = 28
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)

summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 1838.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3974 -0.7758 -0.1284  0.8951  1.9984 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)   184.2   13.57  
 Residual             22979.1  151.59  
Number of obs: 144, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  1594.82      19.21  83.006
grupoE         60.04      25.52   2.352

Correlation of Fixed Effects:
       (Intr)
grupoE -0.632
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
    labs(y = paste("Peso (g) de pollos al dia",dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia",dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

DIA 35

dia = 35
df. <- df[df$dia==dia,]

mod1 <-lmer(formula = g ~ grupo + (1|replica),
           #family = gaussian,
           data = df.)
boundary (singular) fit: see help('isSingular')
summary(mod1)
Linear mixed model fit by REML ['lmerMod']
Formula: g ~ grupo + (1 | replica)
   Data: df.

REML criterion at convergence: 1948.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4249 -0.7270 -0.1096  0.8189  2.5071 

Random effects:
 Groups   Name        Variance Std.Dev.
 replica  (Intercept)     0      0.0   
 Residual             55268    235.1   
Number of obs: 143, groups:  replica, 3

Fixed effects:
            Estimate Std. Error t value
(Intercept)  2175.79      27.15  80.152
grupoE         69.76      39.37   1.772

Correlation of Fixed Effects:
       (Intr)
grupoE -0.690
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
#############  AOV ######################

p <- ggplot(data= df.,
            aes(x= grupo, y= g)
            )
p <- p +
  geom_violin( aes(group=grupo), fill= NA,
               position = position_dodge(1), 
               show.legend = FALSE) +
  geom_point(aes(col= pseudo.r.dia), size = 1.5,
             position = position_jitterdodge(jitter.height = 0,
                                             jitter.width = 2,
                                             dodge.width =0.5),
             show.legend = TRUE) +
#  geom_smooth(aes(col=grupo),
 #             method = "lm",
  #            formula= y ~ bs(x, 3),
   #           method.args = list(family="poisson"),
    #          show.legend = TRUE) +
  
  stat_summary(aes(shape= grupo), fun.data = 'mean_cl_normal' , 
               geom = , size= 0.4,
               col= "darkslategray", linewidth = 1.4,
               position = position_jitterdodge(jitter.height = 0,
                                               jitter.width = 0,
                                               dodge.width = 0.8),
               show.legend = FALSE) +
#  stat_summary(aes(shape= grupo), col= "darkslategray",
 #              fun = median, geom = "point", size = 3,
  #             position = position_jitterdodge(jitter.height = 0.2,
   #                                            jitter.width = 0.2,
    #                                           dodge.width = 1),
     #          show.legend = FALSE) +
  labs(y = paste("Peso (g) de pollos al dia",dia),
        x = "Grupo",
       title = paste("Peso (g) de pollos al dia",dia) ) 
  #scale_x_continuous(breaks= c(1,7,11, 14,21,28,35),
   #                  labels = levels(as.factor((df$dia))))
p

Mortalidad

#dia = 35
#df. <- df[df$dia==dia,]
### Pooled tables

## pooled by DIA
by_grupo <- df2 %>% group_by(grupo)
mort_by_grupo<- as.data.frame(by_grupo %>% summarise( muertes = sum(muertes), n = sum(n)))
#
by_dia <- df2 %>% group_by(d)
mort_by_dia<- as.data.frame(by_dia %>% summarise( muertes = sum(muertes), n = sum(n)))
#
by_grupo.dia <- df2 %>% group_by(d, grupo)
mort_by_grupo.dia <- as.data.frame(by_grupo.dia %>% summarise(muertes = sum(muertes), n= sum(n)))
`summarise()` has grouped output by 'd'. You can override using the `.groups`
argument.
mort_by_grupo.dia$Pr.mortal <- mort_by_grupo.dia$muertes/ 
  (mort_by_grupo.dia$muertes + mort_by_grupo.dia$n)

CIs <- binom.confint(x= mort_by_grupo.dia$muertes, n= mort_by_grupo.dia$n + mort_by_grupo.dia$muertes, methods="wilson")
mort_by_grupo.dia$lower <- CIs[,5]
mort_by_grupo.dia$upper<- CIs[,6]
datatable(mort_by_grupo.dia)

size= 3
width = 1

p <- ggplot(aes(x=d , y=Pr.mortal, 
                col=grupo, ymin = lower, ymax = upper), 
            data= mort_by_grupo.dia)
p <- p +
  geom_hline(yintercept = mort_by_grupo.dia$lower[9],
               linetype= "dashed", col="dark gray") +
  geom_point(position= position_dodge(width=width), 
               size=size) +
  geom_linerange(position = position_dodge(width=width)) +
  scale_x_continuous(n.breaks= 6,
                     breaks= c(1,7,11,21,28,35),
                     labels= levels(as.factor(mort_by_grupo.dia$d)),
                     name= "Día") +
  scale_y_continuous(n.breaks = 5, 
                     breaks=c(0, 0.25, 0.50,0.75, 1), limits = c(0,1),
                     labels=c("0%","25%", "50%", "75%", "100%"),
                     name= "Mortalidad (%)") +
  labs(title= "Mortalidad (%) de pollos (IC.95% de Wilson)") +
  ylim(0,0.5) +
  scale_colour_grey(start=0, end=0.6) + 
  theme_bw(base_size = 14)
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
p

### ######
Y <- cbind(mort_by_grupo.dia$muertes, mort_by_grupo.dia$n)
mod1 <-glm(formula = Y ~ d * grupo,
           family = binomial,
           data = mort_by_grupo.dia)

summary(mod1)

Call:
glm(formula = Y ~ d * grupo, family = binomial, data = mort_by_grupo.dia)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -5.515906   0.816304  -6.757 1.41e-11 ***
d            0.086616   0.028287   3.062   0.0022 ** 
grupoe       0.209388   1.082033   0.194   0.8466    
d:grupoe     0.007278   0.037363   0.195   0.8456    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 133.483  on 11  degrees of freedom
Residual deviance:  99.518  on  8  degrees of freedom
AIC: 118.48

Number of Fisher Scoring iterations: 6

  • la mortalidad ocurrió mayormente entre los dias 21 y 28, y aunque numéricamente, fue mayor para el grupo experimental, esa diferencia no es “significativa”. no se logra encontrar diferencias entre esas dos proporciones, se ve que algo ocurrió para el grupo control también, no solo para el experimental. *
LS0tDQp0aXRsZTogIkEuR29tZXpfcG9sbG9zX3Blc29zIg0KYXV0aG9yOiAiRmVkZXJpY28gSi4gVmlsbGF0b3JvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IEZBTFNFDQogICAgdG9jX2RlcHRoOiA2DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KCWluY2x1ZGUgPSBUUlVFDQopDQpgYGANCg0KUiBwYWNrYWdlcw0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppZiAoIXJlcXVpcmUodGlkeXZlcnNlKSkgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmlmICghcmVxdWlyZShnb29nbGVzaGVldHM0KSkgaW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlc2hlZXRzNCIpDQppZiAoIXJlcXVpcmUoZ29vZ2xlZHJpdmUpKSBpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVkcml2ZSIpDQppZiAoIXJlcXVpcmUocGxvdGx5KSkgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCmlmICghcmVxdWlyZShsbWU0KSkgaW5zdGFsbC5wYWNrYWdlcygibG1lNCIpDQppZiAoIXJlcXVpcmUoZml0ZGlzdHJwbHVzKSkgaW5zdGFsbC5wYWNrYWdlcygiZml0ZGlzdHJwbHVzIikNCmlmICghcmVxdWlyZShnb2Z0KSkgaW5zdGFsbC5wYWNrYWdlcygiZ29mdCIpDQppZiAoIXJlcXVpcmUoZGF0YS50YWJsZSkpIGluc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKQ0KaWYgKCFyZXF1aXJlKHNjYWxlcykpIGluc3RhbGwucGFja2FnZXMoInNjYWxlcyIpDQppZiAoIXJlcXVpcmUoZ2dicmVhaykpIGluc3RhbGwucGFja2FnZXMoImdnYnJlYWsiKQ0KaWYgKCFyZXF1aXJlKGFybSkpIGluc3RhbGwucGFja2FnZXMoImFybSIpDQppZiAoIXJlcXVpcmUoc3BsaW5lcykpIGluc3RhbGwucGFja2FnZXMoInNwbGluZXMiKQ0KaWYgKCFyZXF1aXJlKERUKSkgaW5zdGFsbC5wYWNrYWdlcygiRFQiKQ0KaWYgKCFyZXF1aXJlKGJpbm9tKSkgaW5zdGFsbC5wYWNrYWdlcygiYmlub20iKQ0KYGBgICAgDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GfQ0KIyMNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGJpbm9tKQ0KbGlicmFyeShzcGxpbmVzKQ0KbGlicmFyeShhcm0pDQpsaWJyYXJ5KGdnYnJlYWspDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnb29nbGVzaGVldHM0KQ0KbGlicmFyeShnb29nbGVkcml2ZSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeShmaXRkaXN0cnBsdXMpDQpsaWJyYXJ5KGdvZnQpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpgYGANCg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCmdzNF9hdXRoKCkNCmBgYA0KDQojIyMgRGF0YQ0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0Kc3M9ICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xZkxlUGJGM2ZsemFmd1ZIX2tPWmg2bzJfZzVodGYwbm1yT0IyVHBTZFpfTS9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9ICJsaWNvXzEiDQpyYW5nbyA9ICJCMjpJMTE4OCINCmBgYCAgDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRX0NCnNzPSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWZMZVBiRjNmbHphZndWSF9rT1poNm8yX2c1aHRmMG5tck9CMlRwU2RaX00vZWRpdD91c3A9c2hhcmluZyINCmhvamEgPSAxDQpyYW5nbyA9ICJCMjpJMTE4OCINCmRmIDwtIHJlYWRfc2hlZXQoc3MsDQogICAgICAgICAgICAgICAgICBzaGVldCA9IGhvamEsDQogICAgICAgICAgICAgICAgICByYW5nZSA9IHJhbmdvLA0KICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRQ0KICAgICAgICAgICAgICAgICAgKQ0KZGYgPC0gZGF0YS5mcmFtZShkZikNCmRmJGcgPC0gYXMubnVtZXJpYyhkZiRnKQ0KZGYkZ3J1cG8gPC0gYXMuZmFjdG9yKGRmJGdydXBvKQ0KZGYkcmVwbGljYSA8LSBhcy5mYWN0b3IoZGYkcmVwbGljYSkNCmRmJHBzZXVkby5yLmRpYSA8LSBhcy5mYWN0b3IoZGYkcHNldWRvLnIuZGlhKQ0KZGYkZGlhLmdydXBvIDwtIGFzLmZhY3RvcihkZiRkaWEuZ3J1cG8pDQpkZiRkaWEucmVwbGljYSA8LSBhcy5mYWN0b3IoZGYkZGlhLnJlcGxpY2EpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzcz0gImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFmTGVQYkYzZmx6YWZ3Vkhfa09aaDZvMl9nNWh0ZjBubXJPQjJUcFNkWl9NL2VkaXQ/dXNwPXNoYXJpbmciDQpob2phID0gMQ0KcmFuZ28gPSAiQTExOTM6RjEyMjkiDQpkZjIgPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gaG9qYSwNCiAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ28sDQogICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFDQogICAgICAgICAgICAgICAgICApDQpkZjIkZ3J1cG8gPC0gYXMuZmFjdG9yKGRmMiRncnVwbykNCg0KYGBgICANCg0KIyMjIFBlc28gKGcpOiBTZXJpZSBkZSB0aWVtcG8NCmBgYHtyIGZpZy53aWR0aD0gMTIsIGZpZy5oZWlnaHQ9OX0NCnAgPC0gZ2dwbG90KGRhdGE9IGRmLA0KICAgICAgICAgICAgYWVzKHg9IGRpYSwgeT0gZykNCiAgICAgICAgICAgICkNCnAgPC0gcCArDQojICBnZW9tX2JveHBsb3QoIGFlcyhjb2w9IHBzZXVkby5yKSwgZmlsbD0gTkEsDQogIyAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwNCiAgIyAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICAgZ2VvbV9wb2ludChhZXMoY29sPSBncnVwbyksIHNpemUgPSAxLA0KICMgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLjAxLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDEpLA0KICAgICMgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICAgICAgICAgICAgICBtZXRob2QgPSAiZ2xtIiwgbGluZXdpZHRoID0gMC40LA0KICAgICAgICAgICAgICBmb3JtdWxhPSB5IH4gYnMoeCwgMyksDQogICAgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHk9ImdhdXNzaWFuIiksDQogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICANCiAgc3RhdF9zdW1tYXJ5KGFlcyhmaWxsPSBncnVwbyksIGZ1bi5kYXRhID0gJ21lYW5fY2xfbm9ybWFsJyAsIA0KICAgICAgICAgICAgICAgZ2VvbSA9ICwgc2l6ZT0gMC4yLA0KICAgICAgICAgICAgICAgY29sPSAiZGFya3NsYXRlZ3JheSIsIGxpbmV3aWR0aCA9IDAuOSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgbGFicyh5ID0gInBlc28gKGcpIiwNCiAgICAgICB4PSAiZGlhIiwNCiAgICAgICB0aXRsZSA9ICJQZXNvIChnKSBkZSBwb2xsb3MgLi4uLi4iKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9IGMoMSw3LDExLCAxNCwyMSwyOCwzNSksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoYXMuZmFjdG9yKChkZiRkaWEpKSkpDQpnZ3Bsb3RseShwKQ0KYGBgICANCiMjIyMgRGlhcyAyMS0zNQ0KYGBge3IgZmlnLndpZHRoPSAxMiwgZmlnLmhlaWdodD05fQ0KZGYuIDwtIGRmW2RmJGRpYT4xNCxdDQpwIDwtIGdncGxvdChkYXRhPSBkZi4sDQogICAgICAgICAgICBhZXMoeD0gZGlhLCB5PSBnKQ0KICAgICAgICAgICAgKQ0KcCA8LSBwICsNCiAgZ2VvbV9ib3hwbG90KCBhZXMoY29sPSBwc2V1ZG8uci5kaWEpLCBmaWxsPSBOQSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoNiksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbD0gcHNldWRvLnIuZGlhKSwgc2l6ZSA9IDEsDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMC4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gNiksDQogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KIyAgc3RhdF9zdW1tYXJ5KGFlcyhmaWxsPSBwc2V1ZG8uci5kaWEpLCBmdW4uZGF0YSA9ICdtZWFuX2NsX25vcm1hbCcgLCANCiAjICAgICAgICAgICAgICBnZW9tID0gLCBzaXplPSAwLjA1LCBsaW5ld2lkdGggPSAwLjYsDQogICMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMCwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDYpLA0KICAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiMgIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICMgICAgICAgICAgICAgbWV0aG9kID0gImdsbSIsIGxpbmV3aWR0aCA9IDAuNCwNCiAgIyAgICAgICAgICAgIGZvcm11bGE9IHkgfiBicyh4LCAzKSwgc2U9IEZBTFNFLA0KICAgIyAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT0iZ2F1c3NpYW4iKSwNCiAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiMgIHN0YXRfc3VtbWFyeShhZXMoc2hhcGU9IGdydXBvKSwgY29sPSAiZGFya3NsYXRlZ3JheSIsDQogIyAgICAgICAgICAgICAgZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDMsDQogICMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMC4yLA0KICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yLA0KICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAxKSwNCiAgICAgIyAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICBsYWJzKHkgPSAicGVzbyAoZykiLA0KICAgICAgIHg9ICJkaWEiLA0KICAgICAgIHRpdGxlID0gIlBlc28gKGcpIGRlIHBvbGxvcyAuLi4uLiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0gYygxLDcsMTEsIDE0LDIxLDI4LDM1KSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhhcy5mYWN0b3IoKGRmJGRpYSkpKSkNCiNnZ3Bsb3RseShwKQ0KcA0KYGBgICANCg0KIyMjIENPVkFSSUFOWkEgOiBHUlVQTyBYIERJQSANCg0KYGBge3J9DQptb2QxIDwtbG0oZm9ybXVsYSA9IGcgfiBncnVwbyAqIGRpYSAsDQogICAgICAgICAgICNmYW1pbHkgPSBnYXVzc2lhbiwNCiAgICAgICAgICAgZGF0YSA9IGRmKQ0KDQpzdW1tYXJ5KG1vZDEpDQpgYGAgIA0KDQoqIExhIHBlbmRpZW50ZSBkZSBhdW1lbnRvIGRlIHBlc28gKHBvc2l0aXZhKSBlcyBtYXlvciBwYXJhIGVsIGdydXBvIGV4cGVyaW1lbnRhbCBxdWUgcGFyYSBlbCBjb250cm9sLiBFc3RvIHNlIGV2aWRlbmNpYSAgcG9yIGxhIGludGVyYWNjacOzbiBwb3NpdGl2YSBlbiBlbCBnbG0gYXJyaWJhLiBJbmNsdXNvIHRvbWFuZG8gZW4gY3VlbnRhIGVsIGVmZWN0byBhbGVhdG9yaW8gZGUgbG9zIHRyZXMgc3ViZ3J1cG9zIHBvciBncnVwbyAobW9kZWxvIGNvbiBlZmVjdG9zIGFsZWF0b3Jpb3MgYWJham8pLCBlbCBwYXRyw7NuIHNlIG1hbnRpZW5lLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kMiA8LWxtZXIoZm9ybXVsYSA9IGcgfiBncnVwbyAqIGRpYSArICgxfGRpYS9yZXBsaWNhKSwNCiAgICAgICAgICAgI2ZhbWlseSA9IGdhdXNzaWFuLA0KICAgICAgICAgICBkYXRhID0gZGYpDQpgYGAgIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3VtbWFyeShtb2QyKQ0KYGBgICANCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpwIDwtIGdncGxvdChkYXRhPSBkZiwNCiAgICAgICAgICAgIGFlcyh4PSBkaWEsIHk9IGcpDQogICAgICAgICAgICApDQpwIDwtIHAgKw0KICBnZW9tX2JveHBsb3QoIGFlcyhjb2w9IGRpYS5ncnVwbyksIGZpbGw9IE5BLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwNCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KIyAgZ2VvbV9wb2ludChhZXMoY29sPSBkaWEuZ3J1cG8pLCBzaXplID0gMC43LA0KICMgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLjAxLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDEpLA0KICAgICMgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fc21vb3RoKGFlcyhncm91cD1ncnVwbyksDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGxpbmV3aWR0aD0gMC4yLA0KICAgICAgICAgICAgICBmb3JtdWxhPSB5IH4gYnMoeCwgMyksIHNlPSBGQUxTRSwNCiAgICAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT0icG9pc3NvbiIpLA0KICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIA0KICBzdGF0X3N1bW1hcnkoYWVzKGZpbGw9IGRpYS5ncnVwbyksIGZ1bi5kYXRhID0gJ21lYW5fY2xfbm9ybWFsJyAsIA0KICAgICAgICAgICAgICAgZ2VvbSA9ICwgc2l6ZT0gMC4yLA0KICAgICAgICAgICAgICAgY29sPSAiZGFya3NsYXRlZ3JheSIsIGxpbmV3aWR0aCA9IDAuOSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgbGFicyh5ID0gInBlc28gKGcpIiwNCiAgICAgICB4PSAiZGlhIiwNCiAgICAgICB0aXRsZSA9ICJQZXNvIChnKSBkZSBwb2xsb3MgLi4uLi4iKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3M9IGMoMSw3LDExLCAxNCwyMSwyOCwzNSksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoYXMuZmFjdG9yKChkZiRkaWEpKSkpDQpwDQpgYGAgIA0KDQojIyMgQU9WIChHTE0pIHBvciBESUENCg0KIyMjIyBESUEgMQ0KYGBge3J9DQpkaWEgPSAxDQpkZi4gPC0gZGZbZGYkZGlhPT1kaWEsXQ0KDQptb2QxIDwtbG1lcihmb3JtdWxhID0gZyB+IGdydXBvICsgKDF8cmVwbGljYSksDQogICAgICAgICAgICNmYW1pbHkgPSBnYXVzc2lhbiwNCiAgICAgICAgICAgZGF0YSA9IGRmLikNCg0Kc3VtbWFyeShtb2QxKQ0KIyMjIyMjIyMjIyMjIyAgQU9WICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcCA8LSBnZ3Bsb3QoZGF0YT0gZGYuLA0KICAgICAgICAgICAgYWVzKHg9IGdydXBvLCB5PSBnKQ0KICAgICAgICAgICAgKQ0KcCA8LSBwICsNCiAgZ2VvbV92aW9saW4oIGFlcyhncm91cD1ncnVwbyksIGZpbGw9IE5BLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbD0gcHNldWRvLnIuZGlhKSwgc2l6ZSA9IDEuNSwNCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0wLjUpLA0KICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KIyAgZ2VvbV9zbW9vdGgoYWVzKGNvbD1ncnVwbyksDQogIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLA0KICAjICAgICAgICAgICAgZm9ybXVsYT0geSB+IGJzKHgsIDMpLA0KICAgIyAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT0icG9pc3NvbiIpLA0KICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIA0KICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGZ1bi5kYXRhID0gJ21lYW5fY2xfbm9ybWFsJyAsIA0KICAgICAgICAgICAgICAgZ2VvbSA9ICwgc2l6ZT0gMC40LA0KICAgICAgICAgICAgICAgY29sPSAiZGFya3NsYXRlZ3JheSIsIGxpbmV3aWR0aCA9IDEuNCwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiMgIHN0YXRfc3VtbWFyeShhZXMoc2hhcGU9IGdydXBvKSwgY29sPSAiZGFya3NsYXRlZ3JheSIsDQogIyAgICAgICAgICAgICAgZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDMsDQogICMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMC4yLA0KICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yLA0KICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAxKSwNCiAgICAgIyAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICBsYWJzKHkgPSBwYXN0ZSgiUGVzbyAoZykgZGUgcG9sbG9zIGFsIGRpYSIsIGRpYSksDQogICAgICAgIHggPSAiR3J1cG8iLA0KICAgICAgIHRpdGxlID0gcGFzdGUoIlBlc28gKGcpIGRlIHBvbGxvcyBhbCBkaWEiLCBkaWEpICkgDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPSBjKDEsNywxMSwgMTQsMjEsMjgsMzUpLA0KICAgIyAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhhcy5mYWN0b3IoKGRmJGRpYSkpKSkNCnANCmBgYA0KDQoNCiMjIyMgRElBIDcNCmBgYHtyfQ0KZGlhID0gNw0KZGYuIDwtIGRmW2RmJGRpYT09ZGlhLF0NCg0KbW9kMSA8LWxtZXIoZm9ybXVsYSA9IGcgfiBncnVwbyArICgxfHJlcGxpY2EpLA0KICAgICAgICAgICAjZmFtaWx5ID0gZ2F1c3NpYW4sDQogICAgICAgICAgIGRhdGEgPSBkZi4pDQoNCnN1bW1hcnkobW9kMSkNCiMjIyMjIyMjIyMjIyMgIEFPViAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnAgPC0gZ2dwbG90KGRhdGE9IGRmLiwNCiAgICAgICAgICAgIGFlcyh4PSBncnVwbywgeT0gZykNCiAgICAgICAgICAgICkNCnAgPC0gcCArDQogIGdlb21fdmlvbGluKCBhZXMoZ3JvdXA9Z3J1cG8pLCBmaWxsPSBOQSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMSksIA0KICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2w9IHBzZXVkby5yLmRpYSksIHNpemUgPSAxLjUsDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9MC41KSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiMgIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwNCiAgIyAgICAgICAgICAgIGZvcm11bGE9IHkgfiBicyh4LCAzKSwNCiAgICMgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHk9InBvaXNzb24iKSwNCiAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICANCiAgc3RhdF9zdW1tYXJ5KGFlcyhzaGFwZT0gZ3J1cG8pLCBmdW4uZGF0YSA9ICdtZWFuX2NsX25vcm1hbCcgLCANCiAgICAgICAgICAgICAgIGdlb20gPSAsIHNpemU9IDAuNCwNCiAgICAgICAgICAgICAgIGNvbD0gImRhcmtzbGF0ZWdyYXkiLCBsaW5ld2lkdGggPSAxLjQsDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgbGFicyh5ID0gcGFzdGUoIlBlc28gKGcpIGRlIHBvbGxvcyBhbCBkaWEiLCBkaWEpLA0KICAgICAgICB4ID0gIkdydXBvIiwNCiAgICAgICB0aXRsZSA9IHBhc3RlKCJQZXNvIChnKSBkZSBwb2xsb3MgYWwgZGlhIiwgZGlhKSkgDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPSBjKDEsNywxMSwgMTQsMjEsMjgsMzUpLA0KICAgIyAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhhcy5mYWN0b3IoKGRmJGRpYSkpKSkNCnANCmBgYCAgDQoNCiMjIyMgRElBIDExDQpgYGB7cn0NCmRpYSA9IDExDQpkZi4gPC0gZGZbZGYkZGlhPT1kaWEsXQ0KDQptb2QxIDwtbG1lcihmb3JtdWxhID0gZyB+IGdydXBvICsgKDF8cmVwbGljYSksDQogICAgICAgICAgICNmYW1pbHkgPSBnYXVzc2lhbiwNCiAgICAgICAgICAgZGF0YSA9IGRmLikNCg0Kc3VtbWFyeShtb2QxKQ0KIyMjIyMjIyMjIyMjIyAgQU9WICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcCA8LSBnZ3Bsb3QoZGF0YT0gZGYuLA0KICAgICAgICAgICAgYWVzKHg9IGdydXBvLCB5PSBnKQ0KICAgICAgICAgICAgKQ0KcCA8LSBwICsNCiAgZ2VvbV92aW9saW4oIGFlcyhncm91cD1ncnVwbyksIGZpbGw9IE5BLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbD0gcHNldWRvLnIuZGlhKSwgc2l6ZSA9IDEuNSwNCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0wLjUpLA0KICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KIyAgZ2VvbV9zbW9vdGgoYWVzKGNvbD1ncnVwbyksDQogIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLA0KICAjICAgICAgICAgICAgZm9ybXVsYT0geSB+IGJzKHgsIDMpLA0KICAgIyAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT0icG9pc3NvbiIpLA0KICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIA0KICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGZ1bi5kYXRhID0gJ21lYW5fY2xfbm9ybWFsJyAsIA0KICAgICAgICAgICAgICAgZ2VvbSA9ICwgc2l6ZT0gMC40LA0KICAgICAgICAgICAgICAgY29sPSAiZGFya3NsYXRlZ3JheSIsIGxpbmV3aWR0aCA9IDEuNCwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiMgIHN0YXRfc3VtbWFyeShhZXMoc2hhcGU9IGdydXBvKSwgY29sPSAiZGFya3NsYXRlZ3JheSIsDQogIyAgICAgICAgICAgICAgZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDMsDQogICMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMC4yLA0KICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yLA0KICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAxKSwNCiAgICAgIyAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICBsYWJzKHkgPSBwYXN0ZSgiUGVzbyAoZykgZGUgcG9sbG9zIGFsIGRpYSIsZGlhKSwNCiAgICAgICAgeCA9ICJHcnVwbyIsDQogICAgICAgdGl0bGUgPSBwYXN0ZSgiUGVzbyAoZykgZGUgcG9sbG9zIGFsIGRpYSIsZGlhKSApIA0KICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0gYygxLDcsMTEsIDE0LDIxLDI4LDM1KSwNCiAgICMgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoYXMuZmFjdG9yKChkZiRkaWEpKSkpDQpwDQpgYGAgIA0KDQojIyMjIERJQSAxNA0KYGBge3J9DQpkaWEgPSAxNA0KZGYuIDwtIGRmW2RmJGRpYT09ZGlhLF0NCg0KbW9kMSA8LWxtZXIoZm9ybXVsYSA9IGcgfiBncnVwbyArICgxfHJlcGxpY2EpLA0KICAgICAgICAgICAjZmFtaWx5ID0gZ2F1c3NpYW4sDQogICAgICAgICAgIGRhdGEgPSBkZi4pDQoNCnN1bW1hcnkobW9kMSkNCiMjIyMjIyMjIyMjIyMgIEFPViAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnAgPC0gZ2dwbG90KGRhdGE9IGRmLiwNCiAgICAgICAgICAgIGFlcyh4PSBncnVwbywgeT0gZykNCiAgICAgICAgICAgICkNCnAgPC0gcCArDQogIGdlb21fdmlvbGluKCBhZXMoZ3JvdXA9Z3J1cG8pLCBmaWxsPSBOQSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMSksIA0KICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2w9IHBzZXVkby5yLmRpYSksIHNpemUgPSAxLjUsDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9MC41KSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiMgIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwNCiAgIyAgICAgICAgICAgIGZvcm11bGE9IHkgfiBicyh4LCAzKSwNCiAgICMgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHk9InBvaXNzb24iKSwNCiAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICANCiAgc3RhdF9zdW1tYXJ5KGFlcyhzaGFwZT0gZ3J1cG8pLCBmdW4uZGF0YSA9ICdtZWFuX2NsX25vcm1hbCcgLCANCiAgICAgICAgICAgICAgIGdlb20gPSAsIHNpemU9IDAuNCwNCiAgICAgICAgICAgICAgIGNvbD0gImRhcmtzbGF0ZWdyYXkiLCBsaW5ld2lkdGggPSAxLjQsDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgbGFicyh5ID0gcGFzdGUoIlBlc28gKGcpIGRlIHBvbGxvcyBhbCBkaWEiLGRpYSksDQogICAgICAgIHggPSAiR3J1cG8iLA0KICAgICAgIHRpdGxlID0gcGFzdGUoIlBlc28gKGcpIGRlIHBvbGxvcyBhbCBkaWEiLGRpYSkgKSANCiAgI3NjYWxlX3hfY29udGludW91cyhicmVha3M9IGMoMSw3LDExLCAxNCwyMSwyOCwzNSksDQogICAjICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGV2ZWxzKGFzLmZhY3RvcigoZGYkZGlhKSkpKQ0KcA0KYGBgICANCg0KDQojIyMjIERJQSAyMQ0KYGBge3J9DQpkaWEgPSAyMQ0KZGYuIDwtIGRmW2RmJGRpYT09ZGlhLF0NCg0KbW9kMSA8LWxtZXIoZm9ybXVsYSA9IGcgfiBncnVwbyArICgxfHJlcGxpY2EpLA0KICAgICAgICAgICAjZmFtaWx5ID0gZ2F1c3NpYW4sDQogICAgICAgICAgIGRhdGEgPSBkZi4pDQoNCnN1bW1hcnkobW9kMSkNCiMjIyMjIyMjIyMjIyMgIEFPViAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnAgPC0gZ2dwbG90KGRhdGE9IGRmLiwNCiAgICAgICAgICAgIGFlcyh4PSBncnVwbywgeT0gZykNCiAgICAgICAgICAgICkNCnAgPC0gcCArDQogIGdlb21fdmlvbGluKCBhZXMoZ3JvdXA9Z3J1cG8pLCBmaWxsPSBOQSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMSksIA0KICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2w9IHBzZXVkby5yLmRpYSksIHNpemUgPSAxLjUsDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9MC41KSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiMgIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwNCiAgIyAgICAgICAgICAgIGZvcm11bGE9IHkgfiBicyh4LCAzKSwNCiAgICMgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHk9InBvaXNzb24iKSwNCiAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICANCiAgc3RhdF9zdW1tYXJ5KGFlcyhzaGFwZT0gZ3J1cG8pLCBmdW4uZGF0YSA9ICdtZWFuX2NsX25vcm1hbCcgLCANCiAgICAgICAgICAgICAgIGdlb20gPSAsIHNpemU9IDAuNCwNCiAgICAgICAgICAgICAgIGNvbD0gImRhcmtzbGF0ZWdyYXkiLCBsaW5ld2lkdGggPSAxLjQsDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBsYWJzKHkgPSBwYXN0ZSgiUGVzbyAoZykgZGUgcG9sbG9zIGFsIGRpYSIsZGlhKSwNCiAgICAgICAgeCA9ICJHcnVwbyIsDQogICAgICAgdGl0bGUgPSBwYXN0ZSgiUGVzbyAoZykgZGUgcG9sbG9zIGFsIGRpYSIsZGlhKSApIA0KICAjc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz0gYygxLDcsMTEsIDE0LDIxLDI4LDM1KSwNCiAgICMgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoYXMuZmFjdG9yKChkZiRkaWEpKSkpDQpwDQpgYGAgIA0KDQojIyMjIERJQSAyOA0KYGBge3J9DQpkaWEgPSAyOA0KZGYuIDwtIGRmW2RmJGRpYT09ZGlhLF0NCg0KbW9kMSA8LWxtZXIoZm9ybXVsYSA9IGcgfiBncnVwbyArICgxfHJlcGxpY2EpLA0KICAgICAgICAgICAjZmFtaWx5ID0gZ2F1c3NpYW4sDQogICAgICAgICAgIGRhdGEgPSBkZi4pDQoNCnN1bW1hcnkobW9kMSkNCiMjIyMjIyMjIyMjIyMgIEFPViAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnAgPC0gZ2dwbG90KGRhdGE9IGRmLiwNCiAgICAgICAgICAgIGFlcyh4PSBncnVwbywgeT0gZykNCiAgICAgICAgICAgICkNCnAgPC0gcCArDQogIGdlb21fdmlvbGluKCBhZXMoZ3JvdXA9Z3J1cG8pLCBmaWxsPSBOQSwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMSksIA0KICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2w9IHBzZXVkby5yLmRpYSksIHNpemUgPSAxLjUsDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9MC41KSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiMgIGdlb21fc21vb3RoKGFlcyhjb2w9Z3J1cG8pLA0KICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwNCiAgIyAgICAgICAgICAgIGZvcm11bGE9IHkgfiBicyh4LCAzKSwNCiAgICMgICAgICAgICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHk9InBvaXNzb24iKSwNCiAgICAjICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICANCiAgc3RhdF9zdW1tYXJ5KGFlcyhzaGFwZT0gZ3J1cG8pLCBmdW4uZGF0YSA9ICdtZWFuX2NsX25vcm1hbCcgLCANCiAgICAgICAgICAgICAgIGdlb20gPSAsIHNpemU9IDAuNCwNCiAgICAgICAgICAgICAgIGNvbD0gImRhcmtzbGF0ZWdyYXkiLCBsaW5ld2lkdGggPSAxLjQsDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQojICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGNvbD0gImRhcmtzbGF0ZWdyYXkiLA0KICMgICAgICAgICAgICAgIGZ1biA9IG1lZGlhbiwgZ2VvbSA9ICJwb2ludCIsIHNpemUgPSAzLA0KICAjICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAuMiwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMiwNCiAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMSksDQogICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAgIGxhYnMoeSA9IHBhc3RlKCJQZXNvIChnKSBkZSBwb2xsb3MgYWwgZGlhIixkaWEpLA0KICAgICAgICB4ID0gIkdydXBvIiwNCiAgICAgICB0aXRsZSA9IHBhc3RlKCJQZXNvIChnKSBkZSBwb2xsb3MgYWwgZGlhIixkaWEpICkgDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPSBjKDEsNywxMSwgMTQsMjEsMjgsMzUpLA0KICAgIyAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhhcy5mYWN0b3IoKGRmJGRpYSkpKSkNCnANCmBgYCAgDQoNCiMjIyMgRElBIDM1DQpgYGB7cn0NCmRpYSA9IDM1DQpkZi4gPC0gZGZbZGYkZGlhPT1kaWEsXQ0KDQptb2QxIDwtbG1lcihmb3JtdWxhID0gZyB+IGdydXBvICsgKDF8cmVwbGljYSksDQogICAgICAgICAgICNmYW1pbHkgPSBnYXVzc2lhbiwNCiAgICAgICAgICAgZGF0YSA9IGRmLikNCg0Kc3VtbWFyeShtb2QxKQ0KIyMjIyMjIyMjIyMjIyAgQU9WICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcCA8LSBnZ3Bsb3QoZGF0YT0gZGYuLA0KICAgICAgICAgICAgYWVzKHg9IGdydXBvLCB5PSBnKQ0KICAgICAgICAgICAgKQ0KcCA8LSBwICsNCiAgZ2VvbV92aW9saW4oIGFlcyhncm91cD1ncnVwbyksIGZpbGw9IE5BLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgDQogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbD0gcHNldWRvLnIuZGlhKSwgc2l6ZSA9IDEuNSwNCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci5oZWlnaHQgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0wLjUpLA0KICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KIyAgZ2VvbV9zbW9vdGgoYWVzKGNvbD1ncnVwbyksDQogIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLA0KICAjICAgICAgICAgICAgZm9ybXVsYT0geSB+IGJzKHgsIDMpLA0KICAgIyAgICAgICAgICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT0icG9pc3NvbiIpLA0KICAgICMgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIA0KICBzdGF0X3N1bW1hcnkoYWVzKHNoYXBlPSBncnVwbyksIGZ1bi5kYXRhID0gJ21lYW5fY2xfbm9ybWFsJyAsIA0KICAgICAgICAgICAgICAgZ2VvbSA9ICwgc2l6ZT0gMC40LA0KICAgICAgICAgICAgICAgY29sPSAiZGFya3NsYXRlZ3JheSIsIGxpbmV3aWR0aCA9IDEuNCwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLmhlaWdodCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiMgIHN0YXRfc3VtbWFyeShhZXMoc2hhcGU9IGdydXBvKSwgY29sPSAiZGFya3NsYXRlZ3JheSIsDQogIyAgICAgICAgICAgICAgZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2l6ZSA9IDMsDQogICMgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIuaGVpZ2h0ID0gMC4yLA0KICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLndpZHRoID0gMC4yLA0KICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSAxKSwNCiAgICAgIyAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGxhYnMoeSA9IHBhc3RlKCJQZXNvIChnKSBkZSBwb2xsb3MgYWwgZGlhIixkaWEpLA0KICAgICAgICB4ID0gIkdydXBvIiwNCiAgICAgICB0aXRsZSA9IHBhc3RlKCJQZXNvIChnKSBkZSBwb2xsb3MgYWwgZGlhIixkaWEpICkgDQogICNzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPSBjKDEsNywxMSwgMTQsMjEsMjgsMzUpLA0KICAgIyAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhhcy5mYWN0b3IoKGRmJGRpYSkpKSkNCnANCmBgYCAgDQojIyMjIE1vcnRhbGlkYWQNCmBgYHtyfQ0KI2RpYSA9IDM1DQojZGYuIDwtIGRmW2RmJGRpYT09ZGlhLF0NCiMjIyBQb29sZWQgdGFibGVzDQoNCiMjIHBvb2xlZCBieSBESUENCmJ5X2dydXBvIDwtIGRmMiAlPiUgZ3JvdXBfYnkoZ3J1cG8pDQptb3J0X2J5X2dydXBvPC0gYXMuZGF0YS5mcmFtZShieV9ncnVwbyAlPiUgc3VtbWFyaXNlKCBtdWVydGVzID0gc3VtKG11ZXJ0ZXMpLCBuID0gc3VtKG4pKSkNCiMNCmJ5X2RpYSA8LSBkZjIgJT4lIGdyb3VwX2J5KGQpDQptb3J0X2J5X2RpYTwtIGFzLmRhdGEuZnJhbWUoYnlfZGlhICU+JSBzdW1tYXJpc2UoIG11ZXJ0ZXMgPSBzdW0obXVlcnRlcyksIG4gPSBzdW0obikpKQ0KIw0KYnlfZ3J1cG8uZGlhIDwtIGRmMiAlPiUgZ3JvdXBfYnkoZCwgZ3J1cG8pDQptb3J0X2J5X2dydXBvLmRpYSA8LSBhcy5kYXRhLmZyYW1lKGJ5X2dydXBvLmRpYSAlPiUgc3VtbWFyaXNlKG11ZXJ0ZXMgPSBzdW0obXVlcnRlcyksIG49IHN1bShuKSkpDQoNCm1vcnRfYnlfZ3J1cG8uZGlhJFByLm1vcnRhbCA8LSBtb3J0X2J5X2dydXBvLmRpYSRtdWVydGVzLyANCiAgKG1vcnRfYnlfZ3J1cG8uZGlhJG11ZXJ0ZXMgKyBtb3J0X2J5X2dydXBvLmRpYSRuKQ0KDQpDSXMgPC0gYmlub20uY29uZmludCh4PSBtb3J0X2J5X2dydXBvLmRpYSRtdWVydGVzLCBuPSBtb3J0X2J5X2dydXBvLmRpYSRuICsgbW9ydF9ieV9ncnVwby5kaWEkbXVlcnRlcywgbWV0aG9kcz0id2lsc29uIikNCm1vcnRfYnlfZ3J1cG8uZGlhJGxvd2VyIDwtIENJc1ssNV0NCm1vcnRfYnlfZ3J1cG8uZGlhJHVwcGVyPC0gQ0lzWyw2XQ0KZGF0YXRhYmxlKG1vcnRfYnlfZ3J1cG8uZGlhKQ0KDQpzaXplPSAzDQp3aWR0aCA9IDENCg0KcCA8LSBnZ3Bsb3QoYWVzKHg9ZCAsIHk9UHIubW9ydGFsLCANCiAgICAgICAgICAgICAgICBjb2w9Z3J1cG8sIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwgDQogICAgICAgICAgICBkYXRhPSBtb3J0X2J5X2dydXBvLmRpYSkNCnAgPC0gcCArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vcnRfYnlfZ3J1cG8uZGlhJGxvd2VyWzldLA0KICAgICAgICAgICAgICAgbGluZXR5cGU9ICJkYXNoZWQiLCBjb2w9ImRhcmsgZ3JheSIpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9d2lkdGgpLCANCiAgICAgICAgICAgICAgIHNpemU9c2l6ZSkgKw0KICBnZW9tX2xpbmVyYW5nZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPXdpZHRoKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobi5icmVha3M9IDYsDQogICAgICAgICAgICAgICAgICAgICBicmVha3M9IGMoMSw3LDExLDIxLDI4LDM1KSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz0gbGV2ZWxzKGFzLmZhY3Rvcihtb3J0X2J5X2dydXBvLmRpYSRkKSksDQogICAgICAgICAgICAgICAgICAgICBuYW1lPSAiRMOtYSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG4uYnJlYWtzID0gNSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3M9YygwLCAwLjI1LCAwLjUwLDAuNzUsIDEpLCBsaW1pdHMgPSBjKDAsMSksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiMCUiLCIyNSUiLCAiNTAlIiwgIjc1JSIsICIxMDAlIiksDQogICAgICAgICAgICAgICAgICAgICBuYW1lPSAiTW9ydGFsaWRhZCAoJSkiKSArDQogIGxhYnModGl0bGU9ICJNb3J0YWxpZGFkICglKSBkZSBwb2xsb3MgKElDLjk1JSBkZSBXaWxzb24pIikgKw0KICB5bGltKDAsMC41KSArDQogIHNjYWxlX2NvbG91cl9ncmV5KHN0YXJ0PTAsIGVuZD0wLjYpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KQ0KcA0KIyMjICMjIyMjIw0KWSA8LSBjYmluZChtb3J0X2J5X2dydXBvLmRpYSRtdWVydGVzLCBtb3J0X2J5X2dydXBvLmRpYSRuKQ0KbW9kMSA8LWdsbShmb3JtdWxhID0gWSB+IGQgKiBncnVwbywNCiAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwsDQogICAgICAgICAgIGRhdGEgPSBtb3J0X2J5X2dydXBvLmRpYSkNCg0Kc3VtbWFyeShtb2QxKQ0KYGBgICANCiMjIyMNCiogbGEgbW9ydGFsaWRhZCBvY3VycmnDsyBtYXlvcm1lbnRlIGVudHJlIGxvcyBkaWFzIDIxIHkgMjgsIHkgYXVucXVlIG51bcOpcmljYW1lbnRlLCBmdWUgbWF5b3IgcGFyYSBlbCBncnVwbyBleHBlcmltZW50YWwsIGVzYSBkaWZlcmVuY2lhIG5vIGVzICJzaWduaWZpY2F0aXZhIi4gbm8gc2UgbG9ncmEgZW5jb250cmFyIGRpZmVyZW5jaWFzIGVudHJlIGVzYXMgZG9zIHByb3BvcmNpb25lcywgc2UgdmUgcXVlIGFsZ28gb2N1cnJpw7MgcGFyYSBlbCBncnVwbyBjb250cm9sIHRhbWJpw6luLCBubyBzb2xvIHBhcmEgZWwgZXhwZXJpbWVudGFsLiAqDQoNCg0K