paquetes

  library(knitr)
package 㤼㸱knitr㤼㸲 was built under R version 3.6.3

importo la data ya normalizada y emprolijada

clindata = readRDS('clin_data_lista_2020')
norm_counts = readRDS("norm_counts_lista_2020")

vamos a estudiar los genes x1, x2, x3, Estan todos esos genes en el dataset?

genes.quiero = c('KPNA1','KPNA2','KPNA3','KPNA4','KPNA5','KPNA6','KPNA7', 'KPNB1','RAC1', 'RHOA','CDC42','PGP','ABCB1', 'ABCC1','ABCC2','ABCC3','ABCC4','ABCC5','ABCC6','ABCC10','ABCC11', 'DKC1', 'TP53')

if( all(genes.quiero %in% row.names(norm_counts))){
    print('todos los genes estan en el dataset')} else {
      faltantes = genes.quiero[which(!genes.quiero %in% row.names(norm_counts))]
      print(paste('el o los genes que faltan:', faltantes))
}
[1] "todos los genes estan en el dataset"
  

graficar

#DEG

genes_int = genes.quiero

genes=c()
pval1=c()
pval2=c()
pval3=c()
pval4=c()
pval5=c()
pval6=c()
exp.norm=c()
exp.l.norm=c()
igual.var = c()
igual.var.l=c()


for (i in 1:length(genes_int)){
  gen = genes_int[i]
  exp = as.vector(norm_counts[paste(gen),]+1)
  exp.l = as.vector(log2(t(norm_counts[paste(gen),]+1)))
  positivity = clindata$positivity
  datitos = data.frame(positivity, exp, exp.l )
  genstat = wilcox.test(exp ~ positivity, paired = FALSE)
  
  ploteo = ggplot(data = datitos, aes(x=positivity, y=exp.l )) +
         geom_jitter(aes(shape=positivity, color=positivity), size=3)+
         xlab(NULL) +
         ylab(paste(gen, "expression \n log2 (norm counts +1)")) +
         theme(legend.position = "bottom") +
         theme_bw() +
         theme(axis.text = element_text(size = 15),
          axis.title = element_text(size = 15),
          plot.title =element_text(size = 25),
          legend.position = 'none') +
         stat_summary(fun=mean,
                  geom="point",
                 shape= '_',
                 size=14,
                 colour= c('#b53d35', '#066e70'))
         
     
  print(ploteo  + ggplot2::annotate("text", x = 1.5, y = max(exp.l), label = paste(round(genstat$p.value, digits = 4)), size = 6))  
  assign(paste(gen,'ploteo_DGE', sep = '_'), ploteo  )
  
genes[i]=gen

tt = t.test(exp ~ positivity)
pval1[i]=tt$p.value

tt =t.test(exp.l ~ positivity)
pval2[i]=tt$p.value

tt =t.test(exp ~ positivity, var.equal = T)
pval3[i]=tt$p.value

tt =t.test(exp.l ~ positivity, var.equal = T)
pval4[i]=tt$p.value

tt =wilcox.test(exp ~ positivity)
pval5[i]=tt$p.value

tt =wilcox.test(exp.l ~ positivity)
pval6[i]=tt$p.value  


nor = shapiro.test(exp) #El p me tiene que dar mayor a 0.05  

nor.l = shapiro.test(exp.l)



# 3. LAS DOS POBLACIONES TIENEN LA MISMA VARIANZA?
res.ftest <- var.test(exp ~ positivity) # El p me tiene que dar mayor a 0.05  
res.ftest.l <- var.test(exp.l ~ positivity)

exp.norm[i]=nor$p.value>0.05
exp.l.norm[i]=nor.l$p.value>0.05
igual.var[i] = res.ftest$p.value > 0.05
igual.var.l[i]= res.ftest.l$p.value > 0.05


}



# # tabla para correlaciones y edad
# 
# exp.gen = as.data.frame(t(norm_counts[genes.quiero,]))
# 
# 
# tabla = merge(clindata, exp.gen, by = 0)
# #emprolijo
# rownames(tabla)=tabla[,1]
# tabla = tabla[,-1]
# tabla$ct = as.numeric(tabla$ct)
# tabla$age_cat = factor(tabla$age_cat, levels = c("< 30", "30s", '40s', '50s', '60s', '70+'), ordered = TRUE)
# 
# # correlac ct
# 
# tabla.cor = tabla[tabla$positivity == 'COVID19' & !is.na(tabla$ct),]
# for (i in 1:length(genes.quiero)){
#   gen = genes.quiero[i]
#   exp = log2(tabla.cor[,gen]+1)
#   carga = -tabla.cor$ct
#   stat= cor.test(exp, carga, method = "spearman", use = "complete.obs", exact = FALSE)
#   datitos = data.frame(exp, carga)
#   
#   ploteo= ggplot(datitos, aes(x = carga, y =exp)) +
#     geom_point(size = 2, na.rm = TRUE, color = '#00BFC4', shape = 17) +
#     ylab(paste(gen, "expression \n log2 (norm counts +1)")) +
#     xlab( " Viral load (-ct N1)") +
#     #ylim(min(exp)-1,max(exp)+4) +
#     coord_cartesian(ylim = c(min(exp)-1,max(exp)+4))+
#     theme_bw() +
#     theme(axis.text = element_text(size = 15),
#           axis.title = element_text(size = 15),
#           plot.title =element_text(size = 25),
#           legend.position = 'none') +
#     geom_smooth(method="lm", col="black") 
#   ploteo
#   r = round(as.numeric(stat$estimate), digits = 4)
#   p = round(as.numeric(stat$p.value), digits = 4)
#   print(ploteo  + ggplot2::annotate("text", x = -20, y = max(exp)+3, label = paste('Correlacion Spearman:', r, '\np valor:', p), size = 5))  
#   assign(paste(gen,'ploteo_cor_ct', sep = '_'), ploteo  )
#   
# }
# 
# 
# # graficos por edad
# 
# tabla$grupo = paste(tabla$age_cat, '\n', tabla$positivity)
# #levels(as.factor(tabla$grupo))
# tabla$grupo <- factor(tabla$grupo, levels = c("< 30 \n HEALTHY", "30s \n HEALTHY", "40s \n HEALTHY", "50s \n HEALTHY", "60s \n HEALTHY", "70+ \n HEALTHY", "< 30 \n COVID19", "30s \n COVID19", "40s \n COVID19", "50s \n COVID19", "60s \n COVID19", "70+ \n COVID19"), ordered = TRUE)
# #levels(tabla$grupo)
# 
# 
# tabla.grupo = tabla[!is.na(tabla$age_cat), ]
# 
# 
# for (i in 1:length(genes.quiero)){
#   gen = genes.quiero[i]
#   exp = log2(tabla.grupo[,gen]+1)
#   grupito= tabla.grupo$grupo
#   positividad = tabla.grupo$positivity
#   stat.c.i= jonckheere.test(x= exp[positividad == 'COVID19'],
#                             g= grupito[positividad == 'COVID19'],
#                             alternative = 'increasing',
#                             nperm = 500)
#   stat.c.d= jonckheere.test(x= exp[positividad == 'COVID19'],
#                             g= grupito[positividad == 'COVID19'],
#                             alternative = 'decreasing',
#                             nperm = 500)
#   stat.c.t= jonckheere.test(x= exp[positividad == 'COVID19'],
#                             g= grupito[positividad == 'COVID19'],
#                             alternative = 'two.sided',
#                             nperm = 500)
#   stat.h.i= jonckheere.test(x= exp[positividad == 'HEALTHY'],
#                             g= grupito[positividad == 'HEALTHY'],
#                             alternative = 'increasing',
#                             nperm = 500)
#   stat.h.d= jonckheere.test(x= exp[positividad == 'HEALTHY'],
#                             g= grupito[positividad == 'HEALTHY'],
#                             alternative = 'decreasing',
#                             nperm = 500)
#   stat.h.t= jonckheere.test(x= exp[positividad == 'HEALTHY'],
#                             g= grupito[positividad == 'HEALTHY'],
#                             alternative = 'two.sided',
#                             nperm = 500)
#   
#   
#   datitos = data.frame(exp, grupito, positividad)
#   
#   ploteo = ggplot(datitos, aes(x = grupito, y = exp)) +
#     geom_jitter( width = 0.2 , aes(shape= positividad, color = positividad), size = 2)+
#     xlab(NULL) +
#     ylab(paste(gen,'expression RNA-seq \n log2 (norm counts +1)')) +
#     theme(legend.position = "bottom") +
#     #ylim(-0.01, max(log2(tabla.grupo[,'PGP']+1)+5)) +
#     coord_cartesian(ylim =c(-0.01, max(log2(tabla.grupo[,gen]+1)+5))) +
#     theme_bw() +
#     theme(axis.text = element_text(size = 7),
#           axis.title = element_text(size = 15),
#           plot.title =element_text(size = 25),
#           legend.position = 'none') +
#     stat_summary(fun=mean,
#                  geom="point",
#                  shape= '_',
#                  size=8 ) #,
#   #colour= c('#b53d35', '#066e70'))
# 
#   stat.izq = paste("p.trend increasing: ",stat.h.i$p.value,
#                    '\np.trend decreasing: ',stat.h.d$p.value,
#                    '\np.trend two.sided: ',stat.h.t$p.value, sep = '')
#   stat.der = paste("p.trend increasing: ",stat.c.i$p.value,
#                    '\np.trend decreasing: ',stat.c.d$p.value,
#                    '\np.trend two.sided: ',stat.c.t$p.value, sep = '')
#   
#   stat.izq.simp = paste("p.trend increasing: ",stat.h.i$p.value,
#                    '\np.trend decreasing: ',stat.h.d$p.value, sep = '')
#   stat.der.simp = paste("p.trend increasing: ",stat.c.i$p.value,
#                    '\np.trend decreasing: ',stat.c.d$p.value, sep = '')
#   
#   print(ploteo  + ggplot2::annotate("text", x = c(3,9), y = max(exp)+2, label = c(stat.izq.simp, stat.der.simp), size = 5))  
#   assign(paste(gen,'ploteo_grupo', sep = '_'), ploteo  )
# }
# 

resultados = data.frame(genes, pval1, pval2, pval3, pval4, pval5, pval6)
resultados[,-1] = round(resultados[,-1], 4)

presup = data.frame(exp.norm, exp.l.norm, igual.var, igual.var.l)

conflict = (resultados$pval2 < 0.05 & resultados$pval6 > 0.05) | (resultados$pval2 > 0.05 & resultados$pval6 < 0.05)
resultados$conflicto = conflict

final = cbind(resultados, presup)

colnames(final)[2:7] = c('Welch', 'Welch.log', 'student', 'student.log', 'wilcox', 'wilcox.log')

kable(final)

genes Welch Welch.log student student.log wilcox wilcox.log conflicto exp.norm exp.l.norm igual.var igual.var.l
KPNA1 0.9687 0.8031 0.9727 0.7977 0.5951 0.5951 FALSE FALSE FALSE TRUE TRUE
KPNA2 0.5762 0.9005 0.6768 0.8966 0.7504 0.7504 FALSE FALSE FALSE FALSE TRUE
KPNA3 0.0630 0.1146 0.0104 0.0855 0.0526 0.0526 FALSE FALSE FALSE FALSE TRUE
KPNA4 0.5923 0.8815 0.6220 0.8585 0.3881 0.3881 FALSE FALSE FALSE TRUE FALSE
KPNA5 0.1234 0.0031 0.5844 0.0012 0.0025 0.0025 FALSE FALSE FALSE FALSE TRUE
KPNA6 0.8109 0.6546 0.8383 0.6415 0.6547 0.6547 FALSE FALSE FALSE TRUE TRUE
KPNA7 0.0210 0.0043 0.0136 0.0003 0.0017 0.0017 FALSE FALSE FALSE TRUE FALSE
KPNB1 0.0598 0.0790 0.1214 0.0987 0.0540 0.0540 FALSE FALSE FALSE FALSE TRUE
RAC1 0.7876 0.9544 0.7969 0.9546 0.8830 0.8830 FALSE FALSE FALSE TRUE TRUE
RHOA 0.2164 0.0355 0.1670 0.0512 0.0587 0.0587 TRUE FALSE TRUE TRUE TRUE
CDC42 0.0188 0.0632 0.0004 0.0267 0.0044 0.0044 TRUE FALSE FALSE FALSE FALSE
PGP 0.0044 0.0000 0.0438 0.0000 0.0000 0.0000 FALSE FALSE FALSE FALSE FALSE
ABCB1 0.8017 0.3732 0.8795 0.3641 0.1925 0.1925 FALSE FALSE FALSE FALSE TRUE
ABCC1 0.0220 0.0002 0.0370 0.0002 0.0001 0.0001 FALSE FALSE FALSE TRUE TRUE
ABCC2 0.0124 0.1881 0.3694 0.3559 0.9680 0.9680 FALSE FALSE FALSE FALSE FALSE
ABCC3 0.4228 0.0048 0.6183 0.0005 0.0025 0.0025 FALSE FALSE FALSE FALSE FALSE
ABCC4 0.2273 0.2628 0.1585 0.2104 0.3221 0.3221 FALSE FALSE FALSE TRUE TRUE
ABCC5 0.0055 0.0000 0.0001 0.0000 0.0000 0.0000 FALSE FALSE FALSE FALSE TRUE
ABCC6 0.0576 0.9899 0.4092 0.9906 0.7363 0.7363 FALSE FALSE FALSE FALSE TRUE
ABCC10 0.6876 0.0033 0.8254 0.0029 0.0007 0.0007 FALSE FALSE FALSE FALSE TRUE
ABCC11 0.1107 0.3499 0.5133 0.4471 0.0055 0.0055 TRUE FALSE FALSE FALSE FALSE
DKC1 0.1701 0.2015 0.0993 0.1826 0.1117 0.1117 FALSE FALSE FALSE FALSE TRUE
TP53 0.7505 0.5495 0.7687 0.5598 0.3834 0.3834 FALSE FALSE FALSE TRUE TRUE

NA

imprimir una tabla con formato condicional

#library(DT)


datatable(final) %>% formatStyle(
  c('Welch', 'Welch.log', 'student', 'student.log', 'wilcox', 'wilcox.log'),
  backgroundColor = styleInterval(0.05001, c('yellow', 'white'))) %>% 
   formatStyle(columns = c(8:12), backgroundColor = styleEqual(c(TRUE, FALSE), c('green', 'white'))
)

NA
NA
LS0tDQp0aXRsZTogInAgdmFsb3JlcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KcGFxdWV0ZXMNCg0KYGBge3IgcGFxdWV0ZXN9DQoNCnsNCiAgIGxpYnJhcnkoZ2dwbG90MikNCiAgbGlicmFyeShjbGluZnVuKQ0KICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KDQpgYGANCg0KDQppbXBvcnRvIGxhIGRhdGEgeWEgbm9ybWFsaXphZGEgeSBlbXByb2xpamFkYQ0KYGBge3J9DQpjbGluZGF0YSA9IHJlYWRSRFMoJ2NsaW5fZGF0YV9saXN0YV8yMDIwJykNCm5vcm1fY291bnRzID0gcmVhZFJEUygibm9ybV9jb3VudHNfbGlzdGFfMjAyMCIpDQpgYGANCg0KdmFtb3MgYSBlc3R1ZGlhciBsb3MgZ2VuZXMNCngxLCB4MiwgeDMsDQpFc3RhbiB0b2RvcyBlc29zIGdlbmVzIGVuIGVsIGRhdGFzZXQ/DQoNCmBgYHtyfQ0KZ2VuZXMucXVpZXJvID0gYygnS1BOQTEnLCdLUE5BMicsJ0tQTkEzJywnS1BOQTQnLCdLUE5BNScsJ0tQTkE2JywnS1BOQTcnLCAnS1BOQjEnLCdSQUMxJywgJ1JIT0EnLCdDREM0MicsJ1BHUCcsJ0FCQ0IxJywgJ0FCQ0MxJywnQUJDQzInLCdBQkNDMycsJ0FCQ0M0JywnQUJDQzUnLCdBQkNDNicsJ0FCQ0MxMCcsJ0FCQ0MxMScsICdES0MxJywgJ1RQNTMnKQ0KDQppZiggYWxsKGdlbmVzLnF1aWVybyAlaW4lIHJvdy5uYW1lcyhub3JtX2NvdW50cykpKXsNCiAgICBwcmludCgndG9kb3MgbG9zIGdlbmVzIGVzdGFuIGVuIGVsIGRhdGFzZXQnKX0gZWxzZSB7DQogICAgICBmYWx0YW50ZXMgPSBnZW5lcy5xdWllcm9bd2hpY2goIWdlbmVzLnF1aWVybyAlaW4lIHJvdy5uYW1lcyhub3JtX2NvdW50cykpXQ0KICAgICAgcHJpbnQocGFzdGUoJ2VsIG8gbG9zIGdlbmVzIHF1ZSBmYWx0YW46JywgZmFsdGFudGVzKSkNCn0NCiAgDQpgYGANCmdyYWZpY2FyDQpgYGB7cn0NCiNERUcNCg0KZ2VuZXNfaW50ID0gZ2VuZXMucXVpZXJvDQoNCmdlbmVzPWMoKQ0KcHZhbDE9YygpDQpwdmFsMj1jKCkNCnB2YWwzPWMoKQ0KcHZhbDQ9YygpDQpwdmFsNT1jKCkNCnB2YWw2PWMoKQ0KZXhwLm5vcm09YygpDQpleHAubC5ub3JtPWMoKQ0KaWd1YWwudmFyID0gYygpDQppZ3VhbC52YXIubD1jKCkNCg0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoZ2VuZXNfaW50KSl7DQogIGdlbiA9IGdlbmVzX2ludFtpXQ0KICBleHAgPSBhcy52ZWN0b3Iobm9ybV9jb3VudHNbcGFzdGUoZ2VuKSxdKzEpDQogIGV4cC5sID0gYXMudmVjdG9yKGxvZzIodChub3JtX2NvdW50c1twYXN0ZShnZW4pLF0rMSkpKQ0KICBwb3NpdGl2aXR5ID0gY2xpbmRhdGEkcG9zaXRpdml0eQ0KICBkYXRpdG9zID0gZGF0YS5mcmFtZShwb3NpdGl2aXR5LCBleHAsIGV4cC5sICkNCiAgZ2Vuc3RhdCA9IHdpbGNveC50ZXN0KGV4cCB+IHBvc2l0aXZpdHksIHBhaXJlZCA9IEZBTFNFKQ0KICANCiAgcGxvdGVvID0gZ2dwbG90KGRhdGEgPSBkYXRpdG9zLCBhZXMoeD1wb3NpdGl2aXR5LCB5PWV4cC5sICkpICsNCiAgICAgICAgIGdlb21faml0dGVyKGFlcyhzaGFwZT1wb3NpdGl2aXR5LCBjb2xvcj1wb3NpdGl2aXR5KSwgc2l6ZT0zKSsNCiAgICAgICAgIHhsYWIoTlVMTCkgKw0KICAgICAgICAgeWxhYihwYXN0ZShnZW4sICJleHByZXNzaW9uIFxuIGxvZzIgKG5vcm0gY291bnRzICsxKSIpKSArDQogICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgICAgICAgdGhlbWVfYncoKSArDQogICAgICAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksDQogICAgICAgICAgcGxvdC50aXRsZSA9ZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQogICAgICAgICBzdGF0X3N1bW1hcnkoZnVuPW1lYW4sDQogICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludCIsDQogICAgICAgICAgICAgICAgIHNoYXBlPSAnXycsDQogICAgICAgICAgICAgICAgIHNpemU9MTQsDQogICAgICAgICAgICAgICAgIGNvbG91cj0gYygnI2I1M2QzNScsICcjMDY2ZTcwJykpDQogICAgICAgICANCiAgICAgDQogIHByaW50KHBsb3RlbyAgKyBnZ3Bsb3QyOjphbm5vdGF0ZSgidGV4dCIsIHggPSAxLjUsIHkgPSBtYXgoZXhwLmwpLCBsYWJlbCA9IHBhc3RlKHJvdW5kKGdlbnN0YXQkcC52YWx1ZSwgZGlnaXRzID0gNCkpLCBzaXplID0gNikpICANCiAgYXNzaWduKHBhc3RlKGdlbiwncGxvdGVvX0RHRScsIHNlcCA9ICdfJyksIHBsb3RlbyAgKQ0KICANCmdlbmVzW2ldPWdlbg0KDQp0dCA9IHQudGVzdChleHAgfiBwb3NpdGl2aXR5KQ0KcHZhbDFbaV09dHQkcC52YWx1ZQ0KDQp0dCA9dC50ZXN0KGV4cC5sIH4gcG9zaXRpdml0eSkNCnB2YWwyW2ldPXR0JHAudmFsdWUNCg0KdHQgPXQudGVzdChleHAgfiBwb3NpdGl2aXR5LCB2YXIuZXF1YWwgPSBUKQ0KcHZhbDNbaV09dHQkcC52YWx1ZQ0KDQp0dCA9dC50ZXN0KGV4cC5sIH4gcG9zaXRpdml0eSwgdmFyLmVxdWFsID0gVCkNCnB2YWw0W2ldPXR0JHAudmFsdWUNCg0KdHQgPXdpbGNveC50ZXN0KGV4cCB+IHBvc2l0aXZpdHkpDQpwdmFsNVtpXT10dCRwLnZhbHVlDQoNCnR0ID13aWxjb3gudGVzdChleHAubCB+IHBvc2l0aXZpdHkpDQpwdmFsNltpXT10dCRwLnZhbHVlICANCg0KDQpub3IgPSBzaGFwaXJvLnRlc3QoZXhwKSAjRWwgcCBtZSB0aWVuZSBxdWUgZGFyIG1heW9yIGEgMC4wNSAgDQoNCm5vci5sID0gc2hhcGlyby50ZXN0KGV4cC5sKQ0KDQoNCg0KIyAzLiBMQVMgRE9TIFBPQkxBQ0lPTkVTIFRJRU5FTiBMQSBNSVNNQSBWQVJJQU5aQT8NCnJlcy5mdGVzdCA8LSB2YXIudGVzdChleHAgfiBwb3NpdGl2aXR5KSAjIEVsIHAgbWUgdGllbmUgcXVlIGRhciBtYXlvciBhIDAuMDUgIA0KcmVzLmZ0ZXN0LmwgPC0gdmFyLnRlc3QoZXhwLmwgfiBwb3NpdGl2aXR5KQ0KDQpleHAubm9ybVtpXT1ub3IkcC52YWx1ZT4wLjA1DQpleHAubC5ub3JtW2ldPW5vci5sJHAudmFsdWU+MC4wNQ0KaWd1YWwudmFyW2ldID0gcmVzLmZ0ZXN0JHAudmFsdWUgPiAwLjA1DQppZ3VhbC52YXIubFtpXT0gcmVzLmZ0ZXN0LmwkcC52YWx1ZSA+IDAuMDUNCg0KDQp9DQoNCg0KIyAjIHRhYmxhIHBhcmEgY29ycmVsYWNpb25lcyB5IGVkYWQNCiMgDQojIGV4cC5nZW4gPSBhcy5kYXRhLmZyYW1lKHQobm9ybV9jb3VudHNbZ2VuZXMucXVpZXJvLF0pKQ0KIyANCiMgDQojIHRhYmxhID0gbWVyZ2UoY2xpbmRhdGEsIGV4cC5nZW4sIGJ5ID0gMCkNCiMgI2VtcHJvbGlqbw0KIyByb3duYW1lcyh0YWJsYSk9dGFibGFbLDFdDQojIHRhYmxhID0gdGFibGFbLC0xXQ0KIyB0YWJsYSRjdCA9IGFzLm51bWVyaWModGFibGEkY3QpDQojIHRhYmxhJGFnZV9jYXQgPSBmYWN0b3IodGFibGEkYWdlX2NhdCwgbGV2ZWxzID0gYygiPCAzMCIsICIzMHMiLCAnNDBzJywgJzUwcycsICc2MHMnLCAnNzArJyksIG9yZGVyZWQgPSBUUlVFKQ0KIyANCiMgIyBjb3JyZWxhYyBjdA0KIyANCiMgdGFibGEuY29yID0gdGFibGFbdGFibGEkcG9zaXRpdml0eSA9PSAnQ09WSUQxOScgJiAhaXMubmEodGFibGEkY3QpLF0NCiMgZm9yIChpIGluIDE6bGVuZ3RoKGdlbmVzLnF1aWVybykpew0KIyAgIGdlbiA9IGdlbmVzLnF1aWVyb1tpXQ0KIyAgIGV4cCA9IGxvZzIodGFibGEuY29yWyxnZW5dKzEpDQojICAgY2FyZ2EgPSAtdGFibGEuY29yJGN0DQojICAgc3RhdD0gY29yLnRlc3QoZXhwLCBjYXJnYSwgbWV0aG9kID0gInNwZWFybWFuIiwgdXNlID0gImNvbXBsZXRlLm9icyIsIGV4YWN0ID0gRkFMU0UpDQojICAgZGF0aXRvcyA9IGRhdGEuZnJhbWUoZXhwLCBjYXJnYSkNCiMgICANCiMgICBwbG90ZW89IGdncGxvdChkYXRpdG9zLCBhZXMoeCA9IGNhcmdhLCB5ID1leHApKSArDQojICAgICBnZW9tX3BvaW50KHNpemUgPSAyLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJyMwMEJGQzQnLCBzaGFwZSA9IDE3KSArDQojICAgICB5bGFiKHBhc3RlKGdlbiwgImV4cHJlc3Npb24gXG4gbG9nMiAobm9ybSBjb3VudHMgKzEpIikpICsNCiMgICAgIHhsYWIoICIgVmlyYWwgbG9hZCAoLWN0IE4xKSIpICsNCiMgICAgICN5bGltKG1pbihleHApLTEsbWF4KGV4cCkrNCkgKw0KIyAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKG1pbihleHApLTEsbWF4KGV4cCkrNCkpKw0KIyAgICAgdGhlbWVfYncoKSArDQojICAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiMgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiMgICAgICAgICAgIHBsb3QudGl0bGUgPWVsZW1lbnRfdGV4dChzaXplID0gMjUpLA0KIyAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArDQojICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sPSJibGFjayIpIA0KIyAgIHBsb3Rlbw0KIyAgIHIgPSByb3VuZChhcy5udW1lcmljKHN0YXQkZXN0aW1hdGUpLCBkaWdpdHMgPSA0KQ0KIyAgIHAgPSByb3VuZChhcy5udW1lcmljKHN0YXQkcC52YWx1ZSksIGRpZ2l0cyA9IDQpDQojICAgcHJpbnQocGxvdGVvICArIGdncGxvdDI6OmFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yMCwgeSA9IG1heChleHApKzMsIGxhYmVsID0gcGFzdGUoJ0NvcnJlbGFjaW9uIFNwZWFybWFuOicsIHIsICdcbnAgdmFsb3I6JywgcCksIHNpemUgPSA1KSkgIA0KIyAgIGFzc2lnbihwYXN0ZShnZW4sJ3Bsb3Rlb19jb3JfY3QnLCBzZXAgPSAnXycpLCBwbG90ZW8gICkNCiMgICANCiMgfQ0KIyANCiMgDQojICMgZ3JhZmljb3MgcG9yIGVkYWQNCiMgDQojIHRhYmxhJGdydXBvID0gcGFzdGUodGFibGEkYWdlX2NhdCwgJ1xuJywgdGFibGEkcG9zaXRpdml0eSkNCiMgI2xldmVscyhhcy5mYWN0b3IodGFibGEkZ3J1cG8pKQ0KIyB0YWJsYSRncnVwbyA8LSBmYWN0b3IodGFibGEkZ3J1cG8sIGxldmVscyA9IGMoIjwgMzAgXG4gSEVBTFRIWSIsICIzMHMgXG4gSEVBTFRIWSIsICI0MHMgXG4gSEVBTFRIWSIsICI1MHMgXG4gSEVBTFRIWSIsICI2MHMgXG4gSEVBTFRIWSIsICI3MCsgXG4gSEVBTFRIWSIsICI8IDMwIFxuIENPVklEMTkiLCAiMzBzIFxuIENPVklEMTkiLCAiNDBzIFxuIENPVklEMTkiLCAiNTBzIFxuIENPVklEMTkiLCAiNjBzIFxuIENPVklEMTkiLCAiNzArIFxuIENPVklEMTkiKSwgb3JkZXJlZCA9IFRSVUUpDQojICNsZXZlbHModGFibGEkZ3J1cG8pDQojIA0KIyANCiMgdGFibGEuZ3J1cG8gPSB0YWJsYVshaXMubmEodGFibGEkYWdlX2NhdCksIF0NCiMgDQojIA0KIyBmb3IgKGkgaW4gMTpsZW5ndGgoZ2VuZXMucXVpZXJvKSl7DQojICAgZ2VuID0gZ2VuZXMucXVpZXJvW2ldDQojICAgZXhwID0gbG9nMih0YWJsYS5ncnVwb1ssZ2VuXSsxKQ0KIyAgIGdydXBpdG89IHRhYmxhLmdydXBvJGdydXBvDQojICAgcG9zaXRpdmlkYWQgPSB0YWJsYS5ncnVwbyRwb3NpdGl2aXR5DQojICAgc3RhdC5jLmk9IGpvbmNraGVlcmUudGVzdCh4PSBleHBbcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc9IGdydXBpdG9bcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gJ2luY3JlYXNpbmcnLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnBlcm0gPSA1MDApDQojICAgc3RhdC5jLmQ9IGpvbmNraGVlcmUudGVzdCh4PSBleHBbcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc9IGdydXBpdG9bcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gJ2RlY3JlYXNpbmcnLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnBlcm0gPSA1MDApDQojICAgc3RhdC5jLnQ9IGpvbmNraGVlcmUudGVzdCh4PSBleHBbcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc9IGdydXBpdG9bcG9zaXRpdmlkYWQgPT0gJ0NPVklEMTknXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gJ3R3by5zaWRlZCcsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucGVybSA9IDUwMCkNCiMgICBzdGF0LmguaT0gam9uY2toZWVyZS50ZXN0KHg9IGV4cFtwb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZz0gZ3J1cGl0b1twb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAnaW5jcmVhc2luZycsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucGVybSA9IDUwMCkNCiMgICBzdGF0LmguZD0gam9uY2toZWVyZS50ZXN0KHg9IGV4cFtwb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZz0gZ3J1cGl0b1twb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAnZGVjcmVhc2luZycsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucGVybSA9IDUwMCkNCiMgICBzdGF0LmgudD0gam9uY2toZWVyZS50ZXN0KHg9IGV4cFtwb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZz0gZ3J1cGl0b1twb3NpdGl2aWRhZCA9PSAnSEVBTFRIWSddLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAndHdvLnNpZGVkJywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wZXJtID0gNTAwKQ0KIyAgIA0KIyAgIA0KIyAgIGRhdGl0b3MgPSBkYXRhLmZyYW1lKGV4cCwgZ3J1cGl0bywgcG9zaXRpdmlkYWQpDQojICAgDQojICAgcGxvdGVvID0gZ2dwbG90KGRhdGl0b3MsIGFlcyh4ID0gZ3J1cGl0bywgeSA9IGV4cCkpICsNCiMgICAgIGdlb21faml0dGVyKCB3aWR0aCA9IDAuMiAsIGFlcyhzaGFwZT0gcG9zaXRpdmlkYWQsIGNvbG9yID0gcG9zaXRpdmlkYWQpLCBzaXplID0gMikrDQojICAgICB4bGFiKE5VTEwpICsNCiMgICAgIHlsYWIocGFzdGUoZ2VuLCdleHByZXNzaW9uIFJOQS1zZXEgXG4gbG9nMiAobm9ybSBjb3VudHMgKzEpJykpICsNCiMgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQojICAgICAjeWxpbSgtMC4wMSwgbWF4KGxvZzIodGFibGEuZ3J1cG9bLCdQR1AnXSsxKSs1KSkgKw0KIyAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPWMoLTAuMDEsIG1heChsb2cyKHRhYmxhLmdydXBvWyxnZW5dKzEpKzUpKSkgKw0KIyAgICAgdGhlbWVfYncoKSArDQojICAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLA0KIyAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KIyAgICAgICAgICAgcGxvdC50aXRsZSA9ZWxlbWVudF90ZXh0KHNpemUgPSAyNSksDQojICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsNCiMgICAgIHN0YXRfc3VtbWFyeShmdW49bWVhbiwNCiMgICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludCIsDQojICAgICAgICAgICAgICAgICAgc2hhcGU9ICdfJywNCiMgICAgICAgICAgICAgICAgICBzaXplPTggKSAjLA0KIyAgICNjb2xvdXI9IGMoJyNiNTNkMzUnLCAnIzA2NmU3MCcpKQ0KIyANCiMgICBzdGF0Lml6cSA9IHBhc3RlKCJwLnRyZW5kIGluY3JlYXNpbmc6ICIsc3RhdC5oLmkkcC52YWx1ZSwNCiMgICAgICAgICAgICAgICAgICAgICdcbnAudHJlbmQgZGVjcmVhc2luZzogJyxzdGF0LmguZCRwLnZhbHVlLA0KIyAgICAgICAgICAgICAgICAgICAgJ1xucC50cmVuZCB0d28uc2lkZWQ6ICcsc3RhdC5oLnQkcC52YWx1ZSwgc2VwID0gJycpDQojICAgc3RhdC5kZXIgPSBwYXN0ZSgicC50cmVuZCBpbmNyZWFzaW5nOiAiLHN0YXQuYy5pJHAudmFsdWUsDQojICAgICAgICAgICAgICAgICAgICAnXG5wLnRyZW5kIGRlY3JlYXNpbmc6ICcsc3RhdC5jLmQkcC52YWx1ZSwNCiMgICAgICAgICAgICAgICAgICAgICdcbnAudHJlbmQgdHdvLnNpZGVkOiAnLHN0YXQuYy50JHAudmFsdWUsIHNlcCA9ICcnKQ0KIyAgIA0KIyAgIHN0YXQuaXpxLnNpbXAgPSBwYXN0ZSgicC50cmVuZCBpbmNyZWFzaW5nOiAiLHN0YXQuaC5pJHAudmFsdWUsDQojICAgICAgICAgICAgICAgICAgICAnXG5wLnRyZW5kIGRlY3JlYXNpbmc6ICcsc3RhdC5oLmQkcC52YWx1ZSwgc2VwID0gJycpDQojICAgc3RhdC5kZXIuc2ltcCA9IHBhc3RlKCJwLnRyZW5kIGluY3JlYXNpbmc6ICIsc3RhdC5jLmkkcC52YWx1ZSwNCiMgICAgICAgICAgICAgICAgICAgICdcbnAudHJlbmQgZGVjcmVhc2luZzogJyxzdGF0LmMuZCRwLnZhbHVlLCBzZXAgPSAnJykNCiMgICANCiMgICBwcmludChwbG90ZW8gICsgZ2dwbG90Mjo6YW5ub3RhdGUoInRleHQiLCB4ID0gYygzLDkpLCB5ID0gbWF4KGV4cCkrMiwgbGFiZWwgPSBjKHN0YXQuaXpxLnNpbXAsIHN0YXQuZGVyLnNpbXApLCBzaXplID0gNSkpICANCiMgICBhc3NpZ24ocGFzdGUoZ2VuLCdwbG90ZW9fZ3J1cG8nLCBzZXAgPSAnXycpLCBwbG90ZW8gICkNCiMgfQ0KIyANCg0KcmVzdWx0YWRvcyA9IGRhdGEuZnJhbWUoZ2VuZXMsIHB2YWwxLCBwdmFsMiwgcHZhbDMsIHB2YWw0LCBwdmFsNSwgcHZhbDYpDQpyZXN1bHRhZG9zWywtMV0gPSByb3VuZChyZXN1bHRhZG9zWywtMV0sIDQpDQoNCnByZXN1cCA9IGRhdGEuZnJhbWUoZXhwLm5vcm0sIGV4cC5sLm5vcm0sIGlndWFsLnZhciwgaWd1YWwudmFyLmwpDQoNCmNvbmZsaWN0ID0gKHJlc3VsdGFkb3MkcHZhbDIgPCAwLjA1ICYgcmVzdWx0YWRvcyRwdmFsNiA+IDAuMDUpIHwgKHJlc3VsdGFkb3MkcHZhbDIgPiAwLjA1ICYgcmVzdWx0YWRvcyRwdmFsNiA8IDAuMDUpDQpyZXN1bHRhZG9zJGNvbmZsaWN0byA9IGNvbmZsaWN0DQoNCmZpbmFsID0gY2JpbmQocmVzdWx0YWRvcywgcHJlc3VwKQ0KDQpjb2xuYW1lcyhmaW5hbClbMjo3XSA9IGMoJ1dlbGNoJywgJ1dlbGNoLmxvZycsICdzdHVkZW50JywgJ3N0dWRlbnQubG9nJywgJ3dpbGNveCcsICd3aWxjb3gubG9nJykNCg0Ka2FibGUoZmluYWwpDQoNCmBgYA0KDQoNCg0KaW1wcmltaXIgdW5hIHRhYmxhIGNvbiBmb3JtYXRvIGNvbmRpY2lvbmFsDQpgYGB7cn0NCiNsaWJyYXJ5KERUKQ0KDQoNCmRhdGF0YWJsZShmaW5hbCkgJT4lIGZvcm1hdFN0eWxlKA0KICBjKCdXZWxjaCcsICdXZWxjaC5sb2cnLCAnc3R1ZGVudCcsICdzdHVkZW50LmxvZycsICd3aWxjb3gnLCAnd2lsY294LmxvZycpLA0KICBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUludGVydmFsKDAuMDUwMDEsIGMoJ3llbGxvdycsICd3aGl0ZScpKSkgJT4lIA0KICAgZm9ybWF0U3R5bGUoY29sdW1ucyA9IGMoODoxMiksIGJhY2tncm91bmRDb2xvciA9IHN0eWxlRXF1YWwoYyhUUlVFLCBGQUxTRSksIGMoJ2dyZWVuJywgJ3doaXRlJykpDQopDQoNCg0KYGBgDQoNCg==