Asignacion de los posibles valores que pueden tomar las variables

library(dplyr)
valores_ABC <- c(-1,-1,-1,
                 1,-1,-1,
                -1,1,-1,
                 1,1,-1,
                -1,-1,1,
                 1,-1,1,
                -1,1,1,
                 1,1,1,
                -1,-1,-1,
                 1,-1,-1,
                -1,1,-1,
                 1,1,-1,
                -1,-1,1,
                 1,-1,1,
                -1,1,1,
                 1,1,1)
valores_ABC <- matrix(ABC_values, ncol = 3, byrow = TRUE)
valores_ABC
      [,1] [,2] [,3]
 [1,]   -1    1   -1
 [2,]    1   -1    1
 [3,]   -1    1   -1
 [4,]    1   -1    1
 [5,]   -1    1   -1
 [6,]    1   -1   -1
 [7,]    1    1   -1
 [8,]   -1    1    1
 [9,]   -1   -1    1
[10,]    1   -1   -1
[11,]    1    1   -1
[12,]   -1   -1   -1
[13,]    1    1    1
[14,]    1   -1   -1
[15,]   -1   -1    1
[16,]    1    1    1

Asignacion de valores a las replicas del experimento

rep_exp <- c(247,470,429,435,837,551,775,660,400,446,405,445,850,670,865,530)
rep_exp
 [1] 247 470 429 435 837 551 775 660 400 446 405 445 850 670 865 530
plasma <- data.frame(cbind(A = valores_ABC[,1], B = valores_ABC[,2], C = valores_ABC[,3],  replica = rep_exp))
head(plasma)

Valores totales asignados a las replicas

val_total <- c(647,916,834,880,1687,1221,1640,1190)
val_total <- matrix(val_total)
rownames(val_total) <- c("(1)","a","b","ab","c","ac","bc","abc")
val_total
    [,1]
(1)  647
a    916
b    834
ab   880
c   1687
ac  1221
bc  1640
abc 1190

El efecto promedio de A, donde \(n\) es la cantidad de replicas. para este laboratorio son 2. Las cantidades dentro de los corchetes \([\hspace{0.1cm}]\) son los contrastes. \[A = \frac{1}{4n}[a + ab + ac + abc - (1) - b - c - bc]\]

\[B = \frac{1}{4n}[b + ab + bc + abc - (1) - a - c - ac]\]

\[C = \frac{1}{4n}[c + ac + bc + abc - (1) - a - c - ab]\]

Calculamos los efectos #### A

numero_rep <- 2
A_cont <- val_total["a",] + val_total["ab",] + val_total["ac",] + val_total["abc",] - val_total["(1)",] - val_total["b",] - val_total["c",] - val_total["bc",]
A_cont
   a 
-601 
A_effecto <- (1/(4*rep_num)) * A_cont
A_effecto
      a 
-75.125 

B

B_cont <- val_total["b",] + val_total["ab",] + val_total["bc",] + val_total["abc",] - val_total["(1)",] - val_total["a",] - val_total["c",] - val_total["ac",]
B_cont
 b 
73 
B_effecto <- (1/(4*rep_num)) * B_cont
B_effecto
    b 
9.125 

C

C_cont <- val_total["c",] + val_total["ac",] + val_total["bc",] + val_total["abc",] - val_total["(1)",] - val_total["a",] - val_total["b",] - val_total["ab",]
C_cont
   c 
2461 
C_effecto <- (1/(4*rep_num)) * C_cont
C_effecto
      c 
307.625 

Interacion AB es la diferencia en los promedios entre las corridas de dos planos diagonales \[AB = \frac{1}{4n}[abc + ab + c + (1) - bc - b - ac - a]\]

\[AC = \frac{1}{4n}[(1) + b + ac + abc - a - ab - c - bc]\]

\[BC = \frac{1}{4n}[(1) + a + bc + abc - b - ab - c - ac]\]

AB_cont <- val_total["abc",] + val_total["ab",] + val_total["c",] + val_total["(1)",] - val_total["bc",] - val_total["b",] - val_total["ac",] - val_total["a",]
AB_cont
 abc 
-207 
AB_effecto <- (1/(4*rep_num)) * AB_cont
AB_effecto
    abc 
-25.875 
AC_cont <- val_total["(1)",] + val_total["b",] + val_total["ac",] + val_total["abc",] - val_total["a",] - val_total["ab",] - val_total["c",] - val_total["bc",]
AC_cont
  (1) 
-1231 
AC_effecto <- (1/(4*rep_num)) * AC_cont
AC_effecto
     (1) 
-153.875 
BC_cont <- val_total["(1)",] + val_total["a",] + val_total["bc",] + val_total["abc",] - val_total["b",] - val_total["ab",] - val_total["c",] - val_total["ac",]
BC_cont
 (1) 
-229 
BC_effecto <- (1/(4*rep_num)) * BC_cont
BC_effecto
    (1) 
-28.625 

Interaccion ABC es la diferencia de dos promedios, AB - C

ABC_cont <- val_total["abc",] + val_total["c",] + val_total["b",] + val_total["a",] - val_total["bc",] - val_total["ac",] - val_total["ab",] - val_total["(1)",]
ABC_cont
abc 
239 
ABC_effecto <- (1/(4*rep_num)) * ABC_cont
ABC_effecto
   abc 
29.875 

calculamos la suma de los cuadrados de los efectos de la siguiente manera \[SS = \frac{(contrast)^2}{8n}\]

A_ss <- (A_cont^2)/(8*numero_rep)
B_ss <- (B_cont^2)/(8*numero_rep)
C_ss <- (C_cont^2)/(8*numero_rep)
AB_ss <- (AB_cont^2)/(8*numero_rep)
AC_ss <- (AC_cont^2)/(8*numero_rep)
BC_ss <- (BC_cont^2)/(8*numero_rep)
ABC_ss <- (ABC_cont^2)/(8*numero_rep)
c(A_ss,B_ss,C_ss,AB_ss,AC_ss,BC_ss,ABC_ss)
          a           b           c         abc         (1)         (1)         abc 
 22575.0625    333.0625 378532.5625   2678.0625  94710.0625   3277.5625   3570.0625 

Analizaremos la varianza, encontraremos los P-values y se encontraremos los factores estadisticamente significativos. Utilizaremos anova() Analysis of Variance, la cual recibe una regresion, y por ende utilizaremos todos los efectos: A, B, C, AB, AC, BC y ABC.

fit_AOV <- lm(replica ~ A + B + C + (A*B) + (A*C) + (B*C) + (A*B*C), data = plasma)
anova(fit_AOV)
Analysis of Variance Table

Response: replica
          Df Sum Sq Mean Sq F value Pr(>F)
A          1    947     947  0.0174 0.8984
B          1  13821   13821  0.2536 0.6281
C          1  22325   22325  0.4096 0.5401
A:B        1  13271   13271  0.2435 0.6350
A:C        1  28377   28377  0.5206 0.4911
B:C        1  11038   11038  0.2025 0.6646
A:B:C      1  11834   11834  0.2171 0.6537
Residuals  8 436058   54507               

En Sum Sq se observa los mismos datos obtenidos en la suma de cuadrados. El error es de \(31,996\). Las variables mas significativas para la regresion son: A, C y AC.

plasma_fit <- lm(replica ~ A + C + (A*C), data = plasma)
summary(plasma_fit)

Call:
lm(formula = replica ~ A + C + (A * C), data = plasma)

Residuals:
    Min      1Q  Median      3Q     Max 
-242.50 -126.61  -42.88  126.85  347.50 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  567.954     51.720  10.981 1.29e-07 ***
A              2.371     51.720   0.046    0.964    
C             38.504     51.720   0.744    0.471    
A:C          -37.579     51.720  -0.727    0.481    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 203.5 on 12 degrees of freedom
Multiple R-squared:  0.0756,    Adjusted R-squared:  -0.1555 
F-statistic: 0.3271 on 3 and 12 DF,  p-value: 0.8058
plasma_fit$coefficients
(Intercept)           A           C         A:C 
 567.954167    2.370833   38.504167  -37.579167 

Otra forma para determinar las variables mas significativas es calculando el error estandar de los efectos \[Var(Effect) = Var\bigg(\frac{Contrast}{n2^{k-1}}\bigg) = \frac{1}{(n2^{k-1})^2}Var(Contrast)\]

Cada constraste es una combinacion lineal de los 2K totales de los tratamientos, y cada total consta de n observaciones \[Var(Contrast) = n2^k\sigma^2\]

se puede reescribir la ecuacion del error como \[Var(Effect)=\frac{1}{(n2^{k-1})^2}n2^k\sigma^2 = \frac{1}{n2^{k-2}}\sigma^2\]

El error estimado se encuentra como: \[se(Effect) =\sqrt{\frac{1}{n2^{k-2}}s^2}\]

el valor estimado del error de minimos cuadrados se obtiene de la columna mean sq, por lo que:

MSE <- anova(fit_AOV)$`Mean Sq`[8]
MSE
[1] 54507.29
se_effecto <- sqrt(1/(numero_rep*(2^(3-2)))*(MSE))
se_effecto
[1] 116.734

para calcular los limites de los errores en el estimado de los efectos con dos desviaciones estandar son:

lim <- c(A_effecto - (2*se_effecto), A_effecto + (2*se_effecto),
            B_effecto - (2*se_effecto), B_effecto + (2*se_effecto),
            C_effecto - (2*se_effecto), C_effecto + (2*se_effecto),
            AB_effecto - (2*se_effecto), AB_effecto + (2*se_effecto),
            AC_effecto - (2*se_effecto), AC_effecto + (2*se_effecto),
            BC_effecto - (2*se_effecto), BC_effecto + (2*se_effecto),
            ABC_effecto - (2*se_effecto), ABC_effecto + (2*se_effecto))
lim <- matrix(lim, ncol = 2, byrow = TRUE)
rownames(lim) <- c("A","B","C","AB","AC","BC","ABC")
colnames(lim) <- c("low", "high")
lim
           low      high
A   -308.59297 158.34297
B   -224.34297 242.59297
C     74.15703 541.09297
AB  -259.34297 207.59297
AC  -387.34297  79.59297
BC  -262.09297 204.84297
ABC -203.59297 263.34297
LS0tDQp0aXRsZTogIkxhYm9yYXRvcmlvICMyIC0gSW1wbGVtZW50YWNpb24gRGlzZfFvIEZhY3RvcmlhbCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkFzaWduYWNpb24gZGUgbG9zIHBvc2libGVzIHZhbG9yZXMgcXVlIHB1ZWRlbiB0b21hciBsYXMgdmFyaWFibGVzIA0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQp2YWxvcmVzX0FCQyA8LSBjKC0xLC0xLC0xLA0KICAgICAgICAgICAgICAgICAxLC0xLC0xLA0KICAgICAgICAgICAgICAgIC0xLDEsLTEsDQogICAgICAgICAgICAgICAgIDEsMSwtMSwNCiAgICAgICAgICAgICAgICAtMSwtMSwxLA0KICAgICAgICAgICAgICAgICAxLC0xLDEsDQogICAgICAgICAgICAgICAgLTEsMSwxLA0KICAgICAgICAgICAgICAgICAxLDEsMSwNCiAgICAgICAgICAgICAgICAtMSwtMSwtMSwNCiAgICAgICAgICAgICAgICAgMSwtMSwtMSwNCiAgICAgICAgICAgICAgICAtMSwxLC0xLA0KICAgICAgICAgICAgICAgICAxLDEsLTEsDQogICAgICAgICAgICAgICAgLTEsLTEsMSwNCiAgICAgICAgICAgICAgICAgMSwtMSwxLA0KICAgICAgICAgICAgICAgIC0xLDEsMSwNCiAgICAgICAgICAgICAgICAgMSwxLDEpDQoNCnZhbG9yZXNfQUJDIDwtIG1hdHJpeChBQkNfdmFsdWVzLCBuY29sID0gMywgYnlyb3cgPSBUUlVFKQ0KdmFsb3Jlc19BQkMNCmBgYA0KDQpBc2lnbmFjaW9uIGRlIHZhbG9yZXMgYSBsYXMgcmVwbGljYXMgZGVsIGV4cGVyaW1lbnRvIA0KDQpgYGB7cn0NCnJlcF9leHAgPC0gYygyNDcsNDcwLDQyOSw0MzUsODM3LDU1MSw3NzUsNjYwLDQwMCw0NDYsNDA1LDQ0NSw4NTAsNjcwLDg2NSw1MzApDQpyZXBfZXhwDQpgYGANCg0KYGBge3J9DQpwbGFzbWEgPC0gZGF0YS5mcmFtZShjYmluZChBID0gdmFsb3Jlc19BQkNbLDFdLCBCID0gdmFsb3Jlc19BQkNbLDJdLCBDID0gdmFsb3Jlc19BQkNbLDNdLCAgcmVwbGljYSA9IHJlcF9leHApKQ0KaGVhZChwbGFzbWEpDQpgYGANCg0KVmFsb3JlcyB0b3RhbGVzIGFzaWduYWRvcyBhIGxhcyByZXBsaWNhcw0KDQpgYGB7cn0NCnZhbF90b3RhbCA8LSBjKDY0Nyw5MTYsODM0LDg4MCwxNjg3LDEyMjEsMTY0MCwxMTkwKQ0KdmFsX3RvdGFsIDwtIG1hdHJpeCh2YWxfdG90YWwpDQpyb3duYW1lcyh2YWxfdG90YWwpIDwtIGMoIigxKSIsImEiLCJiIiwiYWIiLCJjIiwiYWMiLCJiYyIsImFiYyIpDQp2YWxfdG90YWwNCmBgYA0KDQpFbCBlZmVjdG8gcHJvbWVkaW8gZGUgQSwgZG9uZGUgJG4kIGVzIGxhIGNhbnRpZGFkIGRlIHJlcGxpY2FzLiBwYXJhIGVzdGUgbGFib3JhdG9yaW8gc29uIDIuIExhcyBjYW50aWRhZGVzIGRlbnRybyBkZSBsb3MgY29yY2hldGVzICRbXGhzcGFjZXswLjFjbX1dJCBzb24gbG9zIGNvbnRyYXN0ZXMuDQokJEEgPSBcZnJhY3sxfXs0bn1bYSArIGFiICsgYWMgKyBhYmMgLSAoMSkgLSBiIC0gYyAtIGJjXSQkDQoNCiQkQiA9IFxmcmFjezF9ezRufVtiICsgYWIgKyBiYyArIGFiYyAtICgxKSAtIGEgLSBjIC0gYWNdJCQNCg0KJCRDID0gXGZyYWN7MX17NG59W2MgKyBhYyArIGJjICsgYWJjIC0gKDEpIC0gYSAtIGMgLSBhYl0kJA0KDQoNCkNhbGN1bGFtb3MgbG9zIGVmZWN0b3MNCiMjIyMgQQ0KYGBge3J9DQpudW1lcm9fcmVwIDwtIDINCkFfY29udCA8LSB2YWxfdG90YWxbImEiLF0gKyB2YWxfdG90YWxbImFiIixdICsgdmFsX3RvdGFsWyJhYyIsXSArIHZhbF90b3RhbFsiYWJjIixdIC0gdmFsX3RvdGFsWyIoMSkiLF0gLSB2YWxfdG90YWxbImIiLF0gLSB2YWxfdG90YWxbImMiLF0gLSB2YWxfdG90YWxbImJjIixdDQpBX2NvbnQNCkFfZWZmZWN0byA8LSAoMS8oNCpyZXBfbnVtKSkgKiBBX2NvbnQNCkFfZWZmZWN0bw0KDQpgYGANCg0KIyMjIyBCDQoNCmBgYHtyfQ0KQl9jb250IDwtIHZhbF90b3RhbFsiYiIsXSArIHZhbF90b3RhbFsiYWIiLF0gKyB2YWxfdG90YWxbImJjIixdICsgdmFsX3RvdGFsWyJhYmMiLF0gLSB2YWxfdG90YWxbIigxKSIsXSAtIHZhbF90b3RhbFsiYSIsXSAtIHZhbF90b3RhbFsiYyIsXSAtIHZhbF90b3RhbFsiYWMiLF0NCkJfY29udA0KQl9lZmZlY3RvIDwtICgxLyg0KnJlcF9udW0pKSAqIEJfY29udA0KQl9lZmZlY3RvDQpgYGANCg0KIyMjIyBDDQoNCmBgYHtyfQ0KQ19jb250IDwtIHZhbF90b3RhbFsiYyIsXSArIHZhbF90b3RhbFsiYWMiLF0gKyB2YWxfdG90YWxbImJjIixdICsgdmFsX3RvdGFsWyJhYmMiLF0gLSB2YWxfdG90YWxbIigxKSIsXSAtIHZhbF90b3RhbFsiYSIsXSAtIHZhbF90b3RhbFsiYiIsXSAtIHZhbF90b3RhbFsiYWIiLF0NCkNfY29udA0KQ19lZmZlY3RvIDwtICgxLyg0KnJlcF9udW0pKSAqIENfY29udA0KQ19lZmZlY3RvDQpgYGANCg0KSW50ZXJhY2lvbiBBQiBlcyBsYSBkaWZlcmVuY2lhIGVuIGxvcyBwcm9tZWRpb3MgZW50cmUgbGFzIGNvcnJpZGFzIGRlIGRvcyBwbGFub3MgZGlhZ29uYWxlcyANCiQkQUIgPSBcZnJhY3sxfXs0bn1bYWJjICsgYWIgKyBjICsgKDEpIC0gYmMgLSBiIC0gYWMgLSBhXSQkDQoNCiQkQUMgPSBcZnJhY3sxfXs0bn1bKDEpICsgYiArIGFjICsgYWJjIC0gYSAtIGFiIC0gYyAtIGJjXSQkDQoNCiQkQkMgPSBcZnJhY3sxfXs0bn1bKDEpICsgYSArIGJjICsgYWJjIC0gYiAtIGFiIC0gYyAtIGFjXSQkDQoNCg0KDQoNCmBgYHtyfQ0KQUJfY29udCA8LSB2YWxfdG90YWxbImFiYyIsXSArIHZhbF90b3RhbFsiYWIiLF0gKyB2YWxfdG90YWxbImMiLF0gKyB2YWxfdG90YWxbIigxKSIsXSAtIHZhbF90b3RhbFsiYmMiLF0gLSB2YWxfdG90YWxbImIiLF0gLSB2YWxfdG90YWxbImFjIixdIC0gdmFsX3RvdGFsWyJhIixdDQpBQl9jb250DQpBQl9lZmZlY3RvIDwtICgxLyg0KnJlcF9udW0pKSAqIEFCX2NvbnQNCkFCX2VmZmVjdG8NCmBgYA0KDQpgYGB7cn0NCkFDX2NvbnQgPC0gdmFsX3RvdGFsWyIoMSkiLF0gKyB2YWxfdG90YWxbImIiLF0gKyB2YWxfdG90YWxbImFjIixdICsgdmFsX3RvdGFsWyJhYmMiLF0gLSB2YWxfdG90YWxbImEiLF0gLSB2YWxfdG90YWxbImFiIixdIC0gdmFsX3RvdGFsWyJjIixdIC0gdmFsX3RvdGFsWyJiYyIsXQ0KQUNfY29udA0KQUNfZWZmZWN0byA8LSAoMS8oNCpyZXBfbnVtKSkgKiBBQ19jb250DQpBQ19lZmZlY3RvDQpgYGANCg0KYGBge3J9DQpCQ19jb250IDwtIHZhbF90b3RhbFsiKDEpIixdICsgdmFsX3RvdGFsWyJhIixdICsgdmFsX3RvdGFsWyJiYyIsXSArIHZhbF90b3RhbFsiYWJjIixdIC0gdmFsX3RvdGFsWyJiIixdIC0gdmFsX3RvdGFsWyJhYiIsXSAtIHZhbF90b3RhbFsiYyIsXSAtIHZhbF90b3RhbFsiYWMiLF0NCkJDX2NvbnQNCkJDX2VmZmVjdG8gPC0gKDEvKDQqcmVwX251bSkpICogQkNfY29udA0KQkNfZWZmZWN0bw0KYGBgDQoNCkludGVyYWNjaW9uIEFCQyBlcyBsYSBkaWZlcmVuY2lhIGRlIGRvcyBwcm9tZWRpb3MsIEFCIC0gQyANCg0KYGBge3J9DQpBQkNfY29udCA8LSB2YWxfdG90YWxbImFiYyIsXSArIHZhbF90b3RhbFsiYyIsXSArIHZhbF90b3RhbFsiYiIsXSArIHZhbF90b3RhbFsiYSIsXSAtIHZhbF90b3RhbFsiYmMiLF0gLSB2YWxfdG90YWxbImFjIixdIC0gdmFsX3RvdGFsWyJhYiIsXSAtIHZhbF90b3RhbFsiKDEpIixdDQpBQkNfY29udA0KQUJDX2VmZmVjdG8gPC0gKDEvKDQqcmVwX251bSkpICogQUJDX2NvbnQNCkFCQ19lZmZlY3RvDQpgYGANCg0KY2FsY3VsYW1vcyBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbG9zIGVmZWN0b3MgZGUgbGEgc2lndWllbnRlIG1hbmVyYSANCiQkU1MgPSBcZnJhY3soY29udHJhc3QpXjJ9ezhufSQkDQoNCmBgYHtyfQ0KQV9zcyA8LSAoQV9jb250XjIpLyg4Km51bWVyb19yZXApDQpCX3NzIDwtIChCX2NvbnReMikvKDgqbnVtZXJvX3JlcCkNCkNfc3MgPC0gKENfY29udF4yKS8oOCpudW1lcm9fcmVwKQ0KQUJfc3MgPC0gKEFCX2NvbnReMikvKDgqbnVtZXJvX3JlcCkNCkFDX3NzIDwtIChBQ19jb250XjIpLyg4Km51bWVyb19yZXApDQpCQ19zcyA8LSAoQkNfY29udF4yKS8oOCpudW1lcm9fcmVwKQ0KQUJDX3NzIDwtIChBQkNfY29udF4yKS8oOCpudW1lcm9fcmVwKQ0KDQpjKEFfc3MsQl9zcyxDX3NzLEFCX3NzLEFDX3NzLEJDX3NzLEFCQ19zcykNCmBgYA0KDQpBbmFsaXphcmVtb3MgbGEgdmFyaWFuemEsIGVuY29udHJhcmVtb3MgbG9zIFAtdmFsdWVzIHkgc2UgZW5jb250cmFyZW1vcyBsb3MgZmFjdG9yZXMgZXN0YWRpc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvcy4gVXRpbGl6YXJlbW9zIGBhbm92YSgpYCBBbmFseXNpcyBvZiBWYXJpYW5jZSwgbGEgY3VhbCByZWNpYmUgdW5hIHJlZ3Jlc2lvbiwgeSBwb3IgZW5kZSB1dGlsaXphcmVtb3MgdG9kb3MgbG9zIGVmZWN0b3M6IEEsIEIsIEMsIEFCLCBBQywgQkMgeSBBQkMuDQoNCmBgYHtyfQ0KZml0X0FPViA8LSBsbShyZXBsaWNhIH4gQSArIEIgKyBDICsgKEEqQikgKyAoQSpDKSArIChCKkMpICsgKEEqQipDKSwgZGF0YSA9IHBsYXNtYSkNCmFub3ZhKGZpdF9BT1YpDQoNCmBgYA0KDQpFbiBgU3VtIFNxYCBzZSBvYnNlcnZhICBsb3MgbWlzbW9zIGRhdG9zIG9idGVuaWRvcyBlbiBsYSBzdW1hIGRlIGN1YWRyYWRvcy4gRWwgZXJyb3IgZXMgZGUgJDMxLDk5NiQuDQpMYXMgdmFyaWFibGVzIG1hcyBzaWduaWZpY2F0aXZhcyBwYXJhIGxhIHJlZ3Jlc2lvbiBzb246IEEsIEMgeSBBQy4NCg0KYGBge3J9DQpwbGFzbWFfZml0IDwtIGxtKHJlcGxpY2EgfiBBICsgQyArIChBKkMpLCBkYXRhID0gcGxhc21hKQ0Kc3VtbWFyeShwbGFzbWFfZml0KQ0KcGxhc21hX2ZpdCRjb2VmZmljaWVudHMNCmBgYA0KDQoNCk90cmEgZm9ybWEgcGFyYSBkZXRlcm1pbmFyIGxhcyB2YXJpYWJsZXMgbWFzIHNpZ25pZmljYXRpdmFzIGVzIGNhbGN1bGFuZG8gZWwgZXJyb3IgZXN0YW5kYXIgZGUgbG9zIGVmZWN0b3MNCiQkVmFyKEVmZmVjdCkgPSBWYXJcYmlnZyhcZnJhY3tDb250cmFzdH17bjJee2stMX19XGJpZ2cpID0gXGZyYWN7MX17KG4yXntrLTF9KV4yfVZhcihDb250cmFzdCkkJA0KDQpDYWRhIGNvbnN0cmFzdGUgZXMgdW5hIGNvbWJpbmFjaW9uIGxpbmVhbCBkZSBsb3MgMksgdG90YWxlcyBkZSBsb3MgdHJhdGFtaWVudG9zLCB5IGNhZGEgdG90YWwgY29uc3RhIGRlIG4gb2JzZXJ2YWNpb25lcyANCiQkVmFyKENvbnRyYXN0KSA9IG4yXmtcc2lnbWFeMiQkDQoNCnNlIHB1ZWRlIHJlZXNjcmliaXIgbGEgZWN1YWNpb24gZGVsIGVycm9yIGNvbW8gDQokJFZhcihFZmZlY3QpPVxmcmFjezF9eyhuMl57ay0xfSleMn1uMl5rXHNpZ21hXjIgPSBcZnJhY3sxfXtuMl57ay0yfX1cc2lnbWFeMiQkDQoNCkVsIGVycm9yIGVzdGltYWRvIHNlIGVuY3VlbnRyYSBjb21vOg0KJCRzZShFZmZlY3QpID1cc3FydHtcZnJhY3sxfXtuMl57ay0yfX1zXjJ9JCQNCg0KZWwgdmFsb3IgZXN0aW1hZG8gZGVsIGVycm9yIGRlIG1pbmltb3MgY3VhZHJhZG9zIHNlIG9idGllbmUgZGUgbGEgY29sdW1uYSBtZWFuIHNxLCBwb3IgbG8gcXVlOg0KYGBge3J9DQpNU0UgPC0gYW5vdmEoZml0X0FPVikkYE1lYW4gU3FgWzhdDQpNU0UNCnNlX2VmZmVjdG8gPC0gc3FydCgxLyhudW1lcm9fcmVwKigyXigzLTIpKSkqKE1TRSkpDQpzZV9lZmZlY3RvDQpgYGANCg0KcGFyYSBjYWxjdWxhciBsb3MgbGltaXRlcyBkZSBsb3MgZXJyb3JlcyBlbiBlbCBlc3RpbWFkbyBkZSBsb3MgZWZlY3RvcyBjb24gZG9zIGRlc3ZpYWNpb25lcyBlc3RhbmRhciBzb246DQoNCmBgYHtyfQ0KbGltIDwtIGMoQV9lZmZlY3RvIC0gKDIqc2VfZWZmZWN0byksIEFfZWZmZWN0byArICgyKnNlX2VmZmVjdG8pLA0KICAgICAgICAgICAgQl9lZmZlY3RvIC0gKDIqc2VfZWZmZWN0byksIEJfZWZmZWN0byArICgyKnNlX2VmZmVjdG8pLA0KICAgICAgICAgICAgQ19lZmZlY3RvIC0gKDIqc2VfZWZmZWN0byksIENfZWZmZWN0byArICgyKnNlX2VmZmVjdG8pLA0KICAgICAgICAgICAgQUJfZWZmZWN0byAtICgyKnNlX2VmZmVjdG8pLCBBQl9lZmZlY3RvICsgKDIqc2VfZWZmZWN0byksDQogICAgICAgICAgICBBQ19lZmZlY3RvIC0gKDIqc2VfZWZmZWN0byksIEFDX2VmZmVjdG8gKyAoMipzZV9lZmZlY3RvKSwNCiAgICAgICAgICAgIEJDX2VmZmVjdG8gLSAoMipzZV9lZmZlY3RvKSwgQkNfZWZmZWN0byArICgyKnNlX2VmZmVjdG8pLA0KICAgICAgICAgICAgQUJDX2VmZmVjdG8gLSAoMipzZV9lZmZlY3RvKSwgQUJDX2VmZmVjdG8gKyAoMipzZV9lZmZlY3RvKSkNCmxpbSA8LSBtYXRyaXgobGltLCBuY29sID0gMiwgYnlyb3cgPSBUUlVFKQ0Kcm93bmFtZXMobGltKSA8LSBjKCJBIiwiQiIsIkMiLCJBQiIsIkFDIiwiQkMiLCJBQkMiKQ0KY29sbmFtZXMobGltKSA8LSBjKCJsb3ciLCAiaGlnaCIpDQpsaW0NCmBgYA0KDQoNCg0K