Calibration Curve Co-60

# Integral simples dos espectros
# ref.  http://stackoverflow.com/questions/30969034/how-can-i-do-vector-integral-in-r #Jellen Vermeir
discreteIntegrationTrapeziumRule <- function(v,lower=1,upper=length(v),stepsize=1)
{
  if(upper > length(v))
    upper=length(v)
  if(lower < 1)
    lower=1
  integrand <- v[lower:upper]
  l <- length(integrand)
  stepsize*(0.5*integrand[1]+sum(integrand[2:(l-1)])+0.5*v[l])
}
############
  1. Espectro Alanina-Gs (d141.DSC, d142.DSC, d143.DSC, d144.DSC, d145.DSC, d146.DSC, d147.DSC, d148.DSC, d149.DSC, d150.DSC, d151.DSC, d152.DSC, d153.DSC, d154.DSC, d155.DSC, d156.DSC, d157.DSC, d158.DSC, d159.DSC, d160.DSC, d161.DSC, d162.DSC, d163.DSC, d164.DSC, d165.DSC, d166.DSC, d167.DSC, d168.DSC, d169 50kGy.DSC, d169.DSC, d170 50kGy.DSC, d170.DSC, d171 50kGy.DSC, d171.DSC, d172 50kGy.DSC, d172.DSC, d173 100kGy.DSC, d174 100kGy.DSC, d175 100kGy.DSC, d176 100kGy.DSC)
library(baseline)
#carregando a lista de arquivos DSC do dir
fileDSC<-list.files(pattern="*.DSC$")
fileDTA<-list.files(pattern="*.DTA$")
nn<-length(fileDSC)
length(fileDTA)
[1] 40
fileDSC
 [1] "d141.DSC"        "d142.DSC"        "d143.DSC"        "d144.DSC"        "d145.DSC"       
 [6] "d146.DSC"        "d147.DSC"        "d148.DSC"        "d149.DSC"        "d150.DSC"       
[11] "d151.DSC"        "d152.DSC"        "d153.DSC"        "d154.DSC"        "d155.DSC"       
[16] "d156.DSC"        "d157.DSC"        "d158.DSC"        "d159.DSC"        "d160.DSC"       
[21] "d161.DSC"        "d162.DSC"        "d163.DSC"        "d164.DSC"        "d165.DSC"       
[26] "d166.DSC"        "d167.DSC"        "d168.DSC"        "d169 50kGy.DSC"  "d169.DSC"       
[31] "d170 50kGy.DSC"  "d170.DSC"        "d171 50kGy.DSC"  "d171.DSC"        "d172 50kGy.DSC" 
[36] "d172.DSC"        "d173 100kGy.DSC" "d174 100kGy.DSC" "d175 100kGy.DSC" "d176 100kGy.DSC"
df<-data.frame(Arq=character(nn),Pos=character(nn),Dose=double(nn),Hpap=double(nn),In=double(nn),Irb=double(nn),IIRB=double(nn),stringsAsFactors = FALSE)
nome<-vector(mode="numeric", length=nn)
hpap<-vector(mode = "double",length = nn)
i1<-vector(mode="double",length = nn)
irb<-vector(mode="double",length = nn)
iirb<-vector(mode="double",length = nn)
pos<-vector(mode="character",length=nn)
for (i in 1:nn)
  {
  dsc <- readLines(fileDSC[i],encoding="UTF-8")
  #
  nome<-(strsplit(fileDSC[i],"\\."))[[1]]
  df$Arq[i]<-nome[1]
  #
  fileDTA<-paste0(nome[1],".DTA")
  pontos<-grep("XPTS",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];XPTS<-as.numeric(campos[2])
  pontos<-grep("XMIN",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];XMIN<-as.numeric(campos[2])
  pontos<-grep("XWID",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];XWID<-as.numeric(campos[2])
  pontos<-grep("MWFQ",dsc,value=T);campos<-strsplit(pontos,'    ')[[1]];MF<-as.numeric(campos[2])/1e9#GHz
  pontos<-grep("RCAG",dsc,value=T);campos<-strsplit(pontos,'    ')[[1]];RG<-as.numeric(campos[2])
  pontos<-grep("SPTP",dsc,value=T);campos<-strsplit(pontos,'    ')[[1]];CT<-as.numeric(campos[2])*1000#ms
  pontos<-grep("AVGS",dsc,value=T);campos<-strsplit(pontos,'    ')[[1]];SCAN<-as.numeric(campos[2])
  info<-grep("DATE", dsc,value=T);campos<-strsplit(info,'    ')[[1]];data1<-(campos[2])
  passo<-round(XWID/XPTS,1)
  b<-seq(1:XPTS)
  for(j in 1:XPTS){
    b[j]<-XMIN+(passo*(j-1))
  }
  b<-data.frame(b)
  g<-714.55*MF/b
  s<-readBin(fileDTA, double(), n = XPTS, size = 8, endian = "big");s<-data.frame(s);
  #Data normalization - Bruker Manual cap.5.6
  sn<-s/(CT*SCAN*20*10^(RG/20))
  #
  dados<-cbind(b,g,s,sn);colnames(dados)[2] <- "g";colnames(dados)[4] <- "sn"
  #
  df$Hpap[i]<-max(dados[,4])-min(dados[,4])
  df$In[i] <- discreteIntegrationTrapeziumRule(dados$sn,stepsize = 0.1)
  #
  #
  # Para a correção da linha de base foi utilizada a biblioteca "baseline"
  sn1t<-t(dados$sn)#
  #b1 <- baseline(sn1t[1,,drop=FALSE],method='irls')
  #b1 <- baseline(sn1t[1,, drop=FALSE], method='lowpass')#nao funciona
  #b1 <- baseline(sn1t[1,, drop=FALSE], method='rfbaseline',span=NULL, NoXP=1000)
  b1 <- baseline(sn1t[1,, drop=FALSE], hwm=300, method='medianWindow')
  #b1 <- baseline(sn1t[1,, drop=FALSE], lambda=10, method='als')
  #b1 <- baseline(sn1t[1,, drop=FALSE], method='modpolyfit', deg=6)
  #b1 <- baseline(sn1t[1,, drop=FALSE], wm=20,ws=20,method='rollingBall')#não serve
  #
  cor1<-t(getCorrected(b1))
  soma1<-data.frame(cumsum(cor1))
  df$Irb[i] <- discreteIntegrationTrapeziumRule(soma1$cumsum.cor1.,stepsize = 0.1)  
  #
  sn2<-data.frame(cumsum(dados$sn))
  sn2t<-t(sn2$cumsum.dados.sn.)
  #b2<-baseline(sn2t)
  #b2 <- baseline(sn2t[1,, drop=FALSE], method='lowpass')#nao funciona
  #b2 <- baseline(sn2t[1,, drop=FALSE], method='rfbaseline',span=NULL, NoXP=1000)
  b2 <- baseline(sn2t[1,, drop=FALSE], hwm=300, method='medianWindow')
  #b2 <- baseline(sn2t[1,, drop=FALSE], lambda=10, method='als')
  #b2 <- baseline(sn2t[1,, drop=FALSE], method='modpolyfit', deg=6)
  #b2<-b2mpol
  #
  cor2<-t(getCorrected(b2))
  df$IIRB[i] <- discreteIntegrationTrapeziumRule(cor2,stepsize = 0.1)  
}
df$Dose[1:4]<-1
df$Dose[5:8]<-10
df$Dose[9:12]<-50
df$Dose[13:16]<-100
df$Dose[17:20]<-500
df$Dose[21:24]<-1000
df$Dose[25:28]<-10000
df$Dose[29]<-50000
df$Dose[31]<-50000
df$Dose[33]<-50000
df$Dose[35]<-50000
df$Dose[37:40]<-100000
# retirado do set de irradiacoes no ACC
df$Dose[30]<-0
df$Dose[32]<-0
df$Dose[34]<-0
df$Dose[36]<-0
#pos
pos<-c("A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","A","B","B","C","C","D","D","A","B","C","D")
df$Pos<-pos
plot(df$Hpap,df$In,col="blue")

plot(df$Hpap,df$Irb,col="blue",log="xy")
3 y values <= 0 omitted from logarithmic plot
points(df$Hpap,df$IIRB,col="red")
points(df$Hpap,df$In,col="green")

pairs(data.matrix(df[3:6]))

plot(df$Hpap,df$Irb,col="blue")

plot(df$Hpap,df$IIRB,col="green")

plot(df$Hpap,df$In,col="red")

cores<-c(A="red",B="blue",C="green",D="yellow")
plot(df$Hpap,df$Irb,col="blue",log="xy")
3 y values <= 0 omitted from logarithmic plot

plot(df$Hpap,df$IIRB,col="green",log="xy")

plot(df$Hpap,df$In,col="red",log="xy")
39 y values <= 0 omitted from logarithmic plot

cores
       A        B        C        D 
   "red"   "blue"  "green" "yellow" 
x1<-jitter(df$Irb,2,2)/10000
x2<-jitter(df$In,1,2)
plot(x1,x2,type="n")
text(x1,x2,labels = df$Pos)

# ordenando pela dose
df2<-df[order(df$Dose),]
library(data.table)
as.data.table(df2)[,mean(Hpap), by=.(Dose)]
as.data.table(df2)[,sd(Hpap), by=.(Dose)]
df3<-data.frame(as.data.table(df2)[,mean(Hpap), by=.(Dose)])
df3<-cbind(df3,as.data.table(df2)[,sd(Hpap), by=.(Dose)][,2])
colnames(df3)[1]<-"Dose"
colnames(df3)[2]<-"Hpapm"
colnames(df3)[3]<-"sd"
df3["sdr"]<-df3$sd/df3$Hpapm*100
library(ggplot2)
boxplot(df3$sdr~df3$Dose,
        xlab = "Dose",
        ylab = "Desvio Padrão Relativo (%)")

# library(wordcloud)
# library (calibrate)
# plot(log(df$Dose),log(df$Hpap),col="blue")
# plot(df$Dose,df$Hpap,col="red")
# plot(df$Dose,df$Hpap,col="green",log="xy")
# 
# j1<-df$Dose#jitter(df$Dose)
# j2<-df$Hpap# jitter(df$Hpap)
# plot(j1,j2,col="red",cex=4,xlim=c(0,2),ylim=c(0,0.5))
# 
# plot(jitter(df$Dose),jitter(df$Hpap),col="red",cex=4,xlim=c(0,100),ylim=c(0,15))
# text(df$Dose,df$Hpap,df$Arq,xlim=c(0,2),ylim=c(0,0.5))
#plot(NA, xlim=c(0,10), ylim=c(1, 10^4), xlab="x", ylab="y", log="y", yaxt="n")
#at.y <- outer(1:9, 10^(0:4))
#lab.y <- ifelse(log10(at.y) %% 1 == 0, at.y, NA)
#axis(2, at=at.y, labels=lab.y, las=1)

Orlando (nov/2016)

LS0tDQp0aXRsZTogIkVQUiBTcGVjdHJhIERhdGEgQW5hbHlzaXMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCkNhbGlicmF0aW9uIEN1cnZlIENvLTYwDQoNCmBgYHtyfQ0KIyBJbnRlZ3JhbCBzaW1wbGVzIGRvcyBlc3BlY3Ryb3MNCiMgcmVmLiAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDk2OTAzNC9ob3ctY2FuLWktZG8tdmVjdG9yLWludGVncmFsLWluLXIgI0plbGxlbiBWZXJtZWlyDQpkaXNjcmV0ZUludGVncmF0aW9uVHJhcGV6aXVtUnVsZSA8LSBmdW5jdGlvbih2LGxvd2VyPTEsdXBwZXI9bGVuZ3RoKHYpLHN0ZXBzaXplPTEpDQp7DQogIGlmKHVwcGVyID4gbGVuZ3RoKHYpKQ0KICAgIHVwcGVyPWxlbmd0aCh2KQ0KICBpZihsb3dlciA8IDEpDQogICAgbG93ZXI9MQ0KDQogIGludGVncmFuZCA8LSB2W2xvd2VyOnVwcGVyXQ0KICBsIDwtIGxlbmd0aChpbnRlZ3JhbmQpDQogIHN0ZXBzaXplKigwLjUqaW50ZWdyYW5kWzFdK3N1bShpbnRlZ3JhbmRbMjoobC0xKV0pKzAuNSp2W2xdKQ0KfQ0KIyMjIyMjIyMjIyMjDQpgYGANCg0KMSkgRXNwZWN0cm8gQWxhbmluYS1HcyAoYHIgZmlsZURTQ2ApDQoqIEVzcGVjdHJvIGRlIEVQUiBub3JtYWxpemFkbyB1dGlsaXphbmRvIGEgZXF1YefjbyBkYSBCcnVrZXIuDQpgYGB7cixmaWcud2lkdGg9OSxmaWcuaGVpZ2h0PTV9DQpsaWJyYXJ5KGJhc2VsaW5lKQ0KI2NhcnJlZ2FuZG8gYSBsaXN0YSBkZSBhcnF1aXZvcyBEU0MgZG8gZGlyDQpmaWxlRFNDPC1saXN0LmZpbGVzKHBhdHRlcm49IiouRFNDJCIpDQpmaWxlRFRBPC1saXN0LmZpbGVzKHBhdHRlcm49IiouRFRBJCIpDQpubjwtbGVuZ3RoKGZpbGVEU0MpDQpsZW5ndGgoZmlsZURUQSkNCmZpbGVEU0MNCg0KZGY8LWRhdGEuZnJhbWUoQXJxPWNoYXJhY3RlcihubiksUG9zPWNoYXJhY3RlcihubiksRG9zZT1kb3VibGUobm4pLEhwYXA9ZG91YmxlKG5uKSxJbj1kb3VibGUobm4pLElyYj1kb3VibGUobm4pLElJUkI9ZG91YmxlKG5uKSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpub21lPC12ZWN0b3IobW9kZT0ibnVtZXJpYyIsIGxlbmd0aD1ubikNCmhwYXA8LXZlY3Rvcihtb2RlID0gImRvdWJsZSIsbGVuZ3RoID0gbm4pDQppMTwtdmVjdG9yKG1vZGU9ImRvdWJsZSIsbGVuZ3RoID0gbm4pDQppcmI8LXZlY3Rvcihtb2RlPSJkb3VibGUiLGxlbmd0aCA9IG5uKQ0KaWlyYjwtdmVjdG9yKG1vZGU9ImRvdWJsZSIsbGVuZ3RoID0gbm4pDQpwb3M8LXZlY3Rvcihtb2RlPSJjaGFyYWN0ZXIiLGxlbmd0aD1ubikNCg0KZm9yIChpIGluIDE6bm4pDQogIHsNCiAgZHNjIDwtIHJlYWRMaW5lcyhmaWxlRFNDW2ldLGVuY29kaW5nPSJVVEYtOCIpDQogICMNCiAgbm9tZTwtKHN0cnNwbGl0KGZpbGVEU0NbaV0sIlxcLiIpKVtbMV1dDQogIGRmJEFycVtpXTwtbm9tZVsxXQ0KICAjDQogIGZpbGVEVEE8LXBhc3RlMChub21lWzFdLCIuRFRBIikNCiAgcG9udG9zPC1ncmVwKCJYUFRTIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJ1x0JylbWzFdXTtYUFRTPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgcG9udG9zPC1ncmVwKCJYTUlOIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJ1x0JylbWzFdXTtYTUlOPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgcG9udG9zPC1ncmVwKCJYV0lEIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJ1x0JylbWzFdXTtYV0lEPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgcG9udG9zPC1ncmVwKCJNV0ZRIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJyAgICAnKVtbMV1dO01GPC1hcy5udW1lcmljKGNhbXBvc1syXSkvMWU5I0dIeg0KICBwb250b3M8LWdyZXAoIlJDQUciLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07Ukc8LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIlNQVFAiLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07Q1Q8LWFzLm51bWVyaWMoY2FtcG9zWzJdKSoxMDAwI21zDQogIHBvbnRvczwtZ3JlcCgiQVZHUyIsZHNjLHZhbHVlPVQpO2NhbXBvczwtc3Ryc3BsaXQocG9udG9zLCcgICAgJylbWzFdXTtTQ0FOPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgaW5mbzwtZ3JlcCgiREFURSIsIGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KGluZm8sJyAgICAnKVtbMV1dO2RhdGExPC0oY2FtcG9zWzJdKQ0KICBwYXNzbzwtcm91bmQoWFdJRC9YUFRTLDEpDQogIGI8LXNlcSgxOlhQVFMpDQogIGZvcihqIGluIDE6WFBUUyl7DQogICAgYltqXTwtWE1JTisocGFzc28qKGotMSkpDQogIH0NCiAgYjwtZGF0YS5mcmFtZShiKQ0KICBnPC03MTQuNTUqTUYvYg0KICBzPC1yZWFkQmluKGZpbGVEVEEsIGRvdWJsZSgpLCBuID0gWFBUUywgc2l6ZSA9IDgsIGVuZGlhbiA9ICJiaWciKTtzPC1kYXRhLmZyYW1lKHMpOw0KICAjRGF0YSBub3JtYWxpemF0aW9uIC0gQnJ1a2VyIE1hbnVhbCBjYXAuNS42DQogIHNuPC1zLyhDVCpTQ0FOKjIwKjEwXihSRy8yMCkpDQogICMNCiAgZGFkb3M8LWNiaW5kKGIsZyxzLHNuKTtjb2xuYW1lcyhkYWRvcylbMl0gPC0gImciO2NvbG5hbWVzKGRhZG9zKVs0XSA8LSAic24iDQogICMNCiAgZGYkSHBhcFtpXTwtbWF4KGRhZG9zWyw0XSktbWluKGRhZG9zWyw0XSkNCiAgZGYkSW5baV0gPC0gZGlzY3JldGVJbnRlZ3JhdGlvblRyYXBleml1bVJ1bGUoZGFkb3Mkc24sc3RlcHNpemUgPSAwLjEpDQogICMNCiAgIw0KICAjIFBhcmEgYSBjb3JyZefjbyBkYSBsaW5oYSBkZSBiYXNlIGZvaSB1dGlsaXphZGEgYSBiaWJsaW90ZWNhICJiYXNlbGluZSINCiAgc24xdDwtdChkYWRvcyRzbikjDQogICNiMSA8LSBiYXNlbGluZShzbjF0WzEsLGRyb3A9RkFMU0VdLG1ldGhvZD0naXJscycpDQogICNiMSA8LSBiYXNlbGluZShzbjF0WzEsLCBkcm9wPUZBTFNFXSwgbWV0aG9kPSdsb3dwYXNzJykjbmFvIGZ1bmNpb25hDQogICNiMSA8LSBiYXNlbGluZShzbjF0WzEsLCBkcm9wPUZBTFNFXSwgbWV0aG9kPSdyZmJhc2VsaW5lJyxzcGFuPU5VTEwsIE5vWFA9MTAwMCkNCiAgYjEgPC0gYmFzZWxpbmUoc24xdFsxLCwgZHJvcD1GQUxTRV0sIGh3bT0zMDAsIG1ldGhvZD0nbWVkaWFuV2luZG93JykNCiAgI2IxIDwtIGJhc2VsaW5lKHNuMXRbMSwsIGRyb3A9RkFMU0VdLCBsYW1iZGE9MTAsIG1ldGhvZD0nYWxzJykNCiAgI2IxIDwtIGJhc2VsaW5lKHNuMXRbMSwsIGRyb3A9RkFMU0VdLCBtZXRob2Q9J21vZHBvbHlmaXQnLCBkZWc9NikNCiAgI2IxIDwtIGJhc2VsaW5lKHNuMXRbMSwsIGRyb3A9RkFMU0VdLCB3bT0yMCx3cz0yMCxtZXRob2Q9J3JvbGxpbmdCYWxsJykjbuNvIHNlcnZlDQogICMNCiAgY29yMTwtdChnZXRDb3JyZWN0ZWQoYjEpKQ0KICBzb21hMTwtZGF0YS5mcmFtZShjdW1zdW0oY29yMSkpDQogIGRmJElyYltpXSA8LSBkaXNjcmV0ZUludGVncmF0aW9uVHJhcGV6aXVtUnVsZShzb21hMSRjdW1zdW0uY29yMS4sc3RlcHNpemUgPSAwLjEpICANCiAgIw0KICBzbjI8LWRhdGEuZnJhbWUoY3Vtc3VtKGRhZG9zJHNuKSkNCiAgc24ydDwtdChzbjIkY3Vtc3VtLmRhZG9zLnNuLikNCiAgI2IyPC1iYXNlbGluZShzbjJ0KQ0KICAjYjIgPC0gYmFzZWxpbmUoc24ydFsxLCwgZHJvcD1GQUxTRV0sIG1ldGhvZD0nbG93cGFzcycpI25hbyBmdW5jaW9uYQ0KICAjYjIgPC0gYmFzZWxpbmUoc24ydFsxLCwgZHJvcD1GQUxTRV0sIG1ldGhvZD0ncmZiYXNlbGluZScsc3Bhbj1OVUxMLCBOb1hQPTEwMDApDQogIGIyIDwtIGJhc2VsaW5lKHNuMnRbMSwsIGRyb3A9RkFMU0VdLCBod209MzAwLCBtZXRob2Q9J21lZGlhbldpbmRvdycpDQogICNiMiA8LSBiYXNlbGluZShzbjJ0WzEsLCBkcm9wPUZBTFNFXSwgbGFtYmRhPTEwLCBtZXRob2Q9J2FscycpDQogICNiMiA8LSBiYXNlbGluZShzbjJ0WzEsLCBkcm9wPUZBTFNFXSwgbWV0aG9kPSdtb2Rwb2x5Zml0JywgZGVnPTYpDQogICNiMjwtYjJtcG9sDQogICMNCiAgY29yMjwtdChnZXRDb3JyZWN0ZWQoYjIpKQ0KICBkZiRJSVJCW2ldIDwtIGRpc2NyZXRlSW50ZWdyYXRpb25UcmFwZXppdW1SdWxlKGNvcjIsc3RlcHNpemUgPSAwLjEpICANCn0NCg0KZGYkRG9zZVsxOjRdPC0xDQpkZiREb3NlWzU6OF08LTEwDQpkZiREb3NlWzk6MTJdPC01MA0KZGYkRG9zZVsxMzoxNl08LTEwMA0KZGYkRG9zZVsxNzoyMF08LTUwMA0KZGYkRG9zZVsyMToyNF08LTEwMDANCmRmJERvc2VbMjU6MjhdPC0xMDAwMA0KZGYkRG9zZVsyOV08LTUwMDAwDQpkZiREb3NlWzMxXTwtNTAwMDANCmRmJERvc2VbMzNdPC01MDAwMA0KZGYkRG9zZVszNV08LTUwMDAwDQpkZiREb3NlWzM3OjQwXTwtMTAwMDAwDQojIHJldGlyYWRvIGRvIHNldCBkZSBpcnJhZGlhY29lcyBubyBBQ0MNCmRmJERvc2VbMzBdPC0wDQpkZiREb3NlWzMyXTwtMA0KZGYkRG9zZVszNF08LTANCmRmJERvc2VbMzZdPC0wDQojcG9zDQpwb3M8LWMoIkEiLCJCIiwiQyIsIkQiLCJBIiwiQiIsIkMiLCJEIiwiQSIsIkIiLCJDIiwiRCIsIkEiLCJCIiwiQyIsIkQiLCJBIiwiQiIsIkMiLCJEIiwiQSIsIkIiLCJDIiwiRCIsIkEiLCJCIiwiQyIsIkQiLCJBIiwiQSIsIkIiLCJCIiwiQyIsIkMiLCJEIiwiRCIsIkEiLCJCIiwiQyIsIkQiKQ0KZGYkUG9zPC1wb3MNCg0KcGxvdChkZiRIcGFwLGRmJEluLGNvbD0iYmx1ZSIpDQpwbG90KGRmJEhwYXAsZGYkSXJiLGNvbD0iYmx1ZSIsbG9nPSJ4eSIpDQpwb2ludHMoZGYkSHBhcCxkZiRJSVJCLGNvbD0icmVkIikNCnBvaW50cyhkZiRIcGFwLGRmJEluLGNvbD0iZ3JlZW4iKQ0KDQpwYWlycyhkYXRhLm1hdHJpeChkZlszOjZdKSkNCg0KcGxvdChkZiRIcGFwLGRmJElyYixjb2w9ImJsdWUiKQ0KcGxvdChkZiRIcGFwLGRmJElJUkIsY29sPSJncmVlbiIpDQpwbG90KGRmJEhwYXAsZGYkSW4sY29sPSJyZWQiKQ0KY29yZXM8LWMoQT0icmVkIixCPSJibHVlIixDPSJncmVlbiIsRD0ieWVsbG93IikNCnBsb3QoZGYkSHBhcCxkZiRJcmIsY29sPSJibHVlIixsb2c9Inh5IikNCnBsb3QoZGYkSHBhcCxkZiRJSVJCLGNvbD0iZ3JlZW4iLGxvZz0ieHkiKQ0KcGxvdChkZiRIcGFwLGRmJEluLGNvbD0icmVkIixsb2c9Inh5IikNCmNvcmVzDQoNCngxPC1qaXR0ZXIoZGYkSXJiLDIsMikvMTAwMDANCngyPC1qaXR0ZXIoZGYkSW4sMSwyKQ0KcGxvdCh4MSx4Mix0eXBlPSJuIikNCnRleHQoeDEseDIsbGFiZWxzID0gZGYkUG9zKQ0KDQojIG9yZGVuYW5kbyBwZWxhIGRvc2UNCmRmMjwtZGZbb3JkZXIoZGYkRG9zZSksXQ0KDQpsaWJyYXJ5KGRhdGEudGFibGUpDQphcy5kYXRhLnRhYmxlKGRmMilbLG1lYW4oSHBhcCksIGJ5PS4oRG9zZSldDQphcy5kYXRhLnRhYmxlKGRmMilbLHNkKEhwYXApLCBieT0uKERvc2UpXQ0KDQpkZjM8LWRhdGEuZnJhbWUoYXMuZGF0YS50YWJsZShkZjIpWyxtZWFuKEhwYXApLCBieT0uKERvc2UpXSkNCmRmMzwtY2JpbmQoZGYzLGFzLmRhdGEudGFibGUoZGYyKVssc2QoSHBhcCksIGJ5PS4oRG9zZSldWywyXSkNCmNvbG5hbWVzKGRmMylbMV08LSJEb3NlIg0KY29sbmFtZXMoZGYzKVsyXTwtIkhwYXBtIg0KY29sbmFtZXMoZGYzKVszXTwtInNkIg0KDQpkZjNbInNkciJdPC1kZjMkc2QvZGYzJEhwYXBtKjEwMA0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmJveHBsb3QoZGYzJHNkcn5kZjMkRG9zZSwNCiAgICAgICAgeGxhYiA9ICJEb3NlIiwNCiAgICAgICAgeWxhYiA9ICJEZXN2aW8gUGFkcuNvIFJlbGF0aXZvICglKSIpDQoNCmBgYA0KDQogIA0KICAgIA0KICAgICAgIA0KICAgICAgIA0KYGBge3J9DQoNCiMgbGlicmFyeSh3b3JkY2xvdWQpDQojIGxpYnJhcnkgKGNhbGlicmF0ZSkNCiMgcGxvdChsb2coZGYkRG9zZSksbG9nKGRmJEhwYXApLGNvbD0iYmx1ZSIpDQojIHBsb3QoZGYkRG9zZSxkZiRIcGFwLGNvbD0icmVkIikNCiMgcGxvdChkZiREb3NlLGRmJEhwYXAsY29sPSJncmVlbiIsbG9nPSJ4eSIpDQojIA0KIyBqMTwtZGYkRG9zZSNqaXR0ZXIoZGYkRG9zZSkNCiMgajI8LWRmJEhwYXAjIGppdHRlcihkZiRIcGFwKQ0KIyBwbG90KGoxLGoyLGNvbD0icmVkIixjZXg9NCx4bGltPWMoMCwyKSx5bGltPWMoMCwwLjUpKQ0KIyANCiMgcGxvdChqaXR0ZXIoZGYkRG9zZSksaml0dGVyKGRmJEhwYXApLGNvbD0icmVkIixjZXg9NCx4bGltPWMoMCwxMDApLHlsaW09YygwLDE1KSkNCiMgdGV4dChkZiREb3NlLGRmJEhwYXAsZGYkQXJxLHhsaW09YygwLDIpLHlsaW09YygwLDAuNSkpDQoNCg0KI3Bsb3QoTkEsIHhsaW09YygwLDEwKSwgeWxpbT1jKDEsIDEwXjQpLCB4bGFiPSJ4IiwgeWxhYj0ieSIsIGxvZz0ieSIsIHlheHQ9Im4iKQ0KI2F0LnkgPC0gb3V0ZXIoMTo5LCAxMF4oMDo0KSkNCiNsYWIueSA8LSBpZmVsc2UobG9nMTAoYXQueSkgJSUgMSA9PSAwLCBhdC55LCBOQSkNCiNheGlzKDIsIGF0PWF0LnksIGxhYmVscz1sYWIueSwgbGFzPTEpDQpgYGANCg0KT3JsYW5kbyAobm92LzIwMTYpDQoNCg0KDQo=