rm(list=ls(all=TRUE))
setwd("~/Desktop/R/ad4")
library(dplyr)
library(matchingMarkets)
library(ggplot2)
library(reshape2)
library(scales)

Setup

1. 500students

2. 50schools

3. list:10

4. Waiting list:15

finaldf <- list()

for(times in 1:100){
  if(times>1){
    rm(list=ls()[c(-6,-33)])
    if(times%%10==0){
      print(times)
    }
  }
  examscore <- c(rep(0,500))
  for(i in 1:500){
    score <- 0
    for(j in 1:5){
      k <- sample(1:15,1)
      score=k+score
    }
    examscore[i]=score
  }
  examscore <- sort(examscore,decreasing = TRUE)
  examscore.df <- data.frame(score=examscore)
  examscore.df$rank <- c(1:500)
  
  for (i in 1:499){
    if(examscore.df$score[i]==examscore.df$score[i+1]){
      if(examscore.df$rank[i] < examscore.df$rank[i+1]){
        examscore.df$rank[i+1] <- examscore.df$rank[i]
      }
    }
  }
  
  #School Preference
  ranking <- c(1:500)
  school <- matrix(rep(ranking,50),nrow = 500)
  
  #Student Preference
  
  examscore.df$pred <- (examscore.df$rank%/%10)+1
  examscore.df$pred[examscore.df$pred>50] <- 50
  
  student <- matrix(rep(0,2500),nrow = 5)
  
  for( i in 1:500){
    if(examscore.df$pred[i]<3){
      student[,i] <- c(1:5)
    }else if(examscore.df$pred[i]>48){
      student[,i] <- c(46:50)
    }else{
      k <- examscore.df$pred[i]-2
      student[,i] <- c(k:(k+4))
    }
  }
  
  student_full <- matrix(rep(c(1:50),500),nrow=50)
  
  #match matrix
  match <- matrix(rep(0,25000),nrow = 500)
  for(i in 1:500){
    for(j in 1:5){
      k <- student[j,i]
      match[i,k] <- 1
    }
  }
  for(i in 1:50){
    n=0
    for(j in 1:500){
      if(match[j,i]==1){
        n=n+1
      }
      if(n>25){
        if(examscore.df$score[j-1]>examscore.df$score[j]){
          for(k in j:500){
            match[k,i] <- 0
          }
        }
      }
    }
  }
  #update
  
  student2 <- student
  school2 <- school
  
  for(i in 1:500){
    for(j in 1:5){
      k <- student[j,i]
      if(match[i,k]==0){
        student2[j,i] <- 9999
      }
    }
  }
  
  for(i in 1:50){
    for(j in 1:500){
      k <- school[j,i]
      if(match[k,i]==0){
        school2[j,i] <- 9999
      }
    }
  }
  
  student2[student2==9999] <- 0
  school2[school2==9999] <- 0
  
  #DA
  res <- hri(s.prefs = student2,c.prefs = school2,nSlots = rep(10,50))
  res.df <- res$matchings
  res.df <- as.data.frame(filter(res.df,sOptimal==1,matching==1))
  
  #analyze result
  student_res <- student
  for(j in 1:nrow(res.df)){
    st <- res.df$student[j]
    sc <- res.df$college[j]
    sl <- student_res[,st]
    for(i in 1:5){
      if(sl[i]!=sc){
        sl[i] <- 0
      }
    }
    student_res[,st] <- sl
  }
  
  for(i in 1:ncol(student_res)){
    if(sum(student_res[,i] != 0)!=1){
      student_res[,i] <- rep(0,5)
    }
  }
  
  wel1 <- c(rep(0,500))
  for(i in 1:ncol(student_res)){
    for(j in 1:nrow(student_res)){
      if(student_res[j,i]!=0){
        wel1[i] <- j
      }
    }
  }
  #DA
  res2 <- hri(s.prefs = student,c.prefs = school,nSlots = rep(10,50))
  res2.df <- res2$matchings
  res2.df <- as.data.frame(filter(res2.df,sOptimal==1,matching==1))
  
  #analyze result
  student_res2 <- student
  for(j in 1:nrow(res2.df)){
    st <- res2.df$student[j]
    sc <- res2.df$college[j]
    sl <- student_res2[,st]
    for(i in 1:5){
      if(sl[i]!=sc){
        sl[i] <- 0
      }
    }
    student_res2[,st] <- sl
  }
  
  for(i in 1:ncol(student_res2)){
    if(sum(student_res2[,i] != 0)!=1){
      student_res2[,i] <- rep(0,5)
    }
  }
  
  wel2 <- c(rep(0,500))
  for(i in 1:ncol(student_res2)){
    for(j in 1:nrow(student_res2)){
      if(student_res2[j,i]!=0){
        wel2[i] <- j
      }
    }
  }
  #DA
  resf <- hri(s.prefs = student_full,c.prefs = school,nSlots = rep(10,50))
  resf.df <- resf$matchings
  resf.df <- as.data.frame(filter(resf.df,sOptimal==1,matching==1))
  
  #analyze result
  student_resf <- student_full
  for(j in 1:nrow(resf.df)){
    st <- resf.df$student[j]
    sc <- resf.df$college[j]
    sl <- student_resf[,st]
    for(i in 1:nrow(student_resf)){
      if(sl[i]!=sc){
        sl[i] <- 0
      }
    }
    student_resf[,st] <- sl
  }
  
  for(i in 1:ncol(student_resf)){
    if(sum(student_resf[,i] != 0)!=1){
      student_resf[,i] <- rep(0,5)
    }
  }
  comp <- data.frame(res=c(rep(0,500)),
                     res2=c(rep(0,500)),
                     resf=c(rep(0,500)))
  for(i in 1:ncol(student_resf)){
    for(j in 1:nrow(student_res)){
      if(student_res[j,i]!=0){
        comp$res[i] <- student_res[j,i]
      }
    }
    for(m in 1:nrow(student_res2)){
      if(student_res2[m,i]!=0){
        comp$res2[i] <- student_res2[m,i]
      }
    }
    for(n in 1:nrow(student_resf)){
      if(student_resf[n,i]!=0){
        comp$resf[i] <- student_resf[n,i]
      }
    }
  }
  comp$dires <- 0
  comp$dires2 <- 0
  for(i in 1:ncol(student_resf)){
    if(comp$res[i]!=0){
      comp$dires[i] <- comp$resf[i]-comp$res[i]
    }else{
      comp$dires[i] <- NA
    }
    if(comp$res2[i]!=0){
      comp$dires2[i] <- comp$resf[i]-comp$res2[i]
    }else{
      comp$dires2[i] <- NA
    }
  }
  compdires.df <- as.data.frame(count(comp,dires))
  colnames(compdires.df) <- c("type","count")
  compdires2.df <- as.data.frame(count(comp,dires2))
  colnames(compdires2.df) <- c("type","count")
  finalres <- merge(compdires.df,compdires2.df,by="type",all = TRUE)
  finaldf <- append(finaldf,list(finalres))
  if(times%%10==0){
    print(times)
  }
}

Result

finaldfres <- finaldf[[1]][-3]
for(i in 1:99){
  finaldfres <- merge(finaldfres,finaldf[[i+1]][-3],by="type",all = TRUE)
}
finaldfres1 <- as.data.frame(finaldfres)
finaldfres <- finaldf[[1]][-2]
for(i in 1:99){
  finaldfres <- merge(finaldfres,finaldf[[i+1]][-2],by="type",all = TRUE)
}
finaldfres2 <- as.data.frame(finaldfres)
rownames(finaldfres1) <- as.character(c(finaldfres1[1:6,1],"NA"))
rownames(finaldfres2) <- as.character(c(finaldfres2[1:6,1],"NA"))
finaldfres1 <- finaldfres1[,2:101]
finaldfres2 <- finaldfres2[,2:101]
finaldfres1[is.na(finaldfres1)] <- 0
finaldfres2[is.na(finaldfres2)] <- 0
finaldfres1$sum <- rowSums(finaldfres1)
finaldfres2$sum <- rowSums(finaldfres2)
finaldfresmean <- data.frame(type=c(rownames(finaldfres1)),
                             with_step=finaldfres1$sum/50000,
                             with_out_step=finaldfres2$sum/50000)
level_order <- as.character(finaldfresmean$type)
brk <- c(0,0.25,0.50,0.75,1)
forgr <- melt(finaldfresmean)
resgr <- ggplot(forgr, aes(x = factor(type,level=level_order),y = value)) +
  facet_wrap(~variable, nrow=2, ncol=1) +
  scale_x_discrete()+
  scale_y_continuous(breaks=brk,labels = percent(brk))+
  geom_bar(stat = "identity",fill="lightseagreen")+
  geom_text(aes(y = value + .05, label = percent(value)),colour = "gray28")+
  geom_text(aes(y = value + .15,label=(value)*500),colour = "gray50")+
  xlab("Comparing to full DA")+
  ylab("percentage")+
  theme_gray()
resgr


LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kcm0obGlzdD1scyhhbGw9VFJVRSkpCnNldHdkKCJ+L0Rlc2t0b3AvUi9hZDQiKQoKbGlicmFyeShkcGx5cikKbGlicmFyeShtYXRjaGluZ01hcmtldHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShzY2FsZXMpCmBgYAojU2V0dXAKCiMjIzEuIDUwMHN0dWRlbnRzCiMjIzIuIDUwc2Nob29scwojIyMzLiBsaXN0OjEwCiMjIzQuIFdhaXRpbmcgbGlzdDoxNQoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbmFsZGYgPC0gbGlzdCgpCgpmb3IodGltZXMgaW4gMToxMDApewogIGlmKHRpbWVzPjEpewogICAgcm0obGlzdD1scygpW2MoLTYsLTMzKV0pCiAgICBpZih0aW1lcyUlMTA9PTApewogICAgICBwcmludCh0aW1lcykKICAgIH0KICB9CiAgZXhhbXNjb3JlIDwtIGMocmVwKDAsNTAwKSkKICBmb3IoaSBpbiAxOjUwMCl7CiAgICBzY29yZSA8LSAwCiAgICBmb3IoaiBpbiAxOjUpewogICAgICBrIDwtIHNhbXBsZSgxOjE1LDEpCiAgICAgIHNjb3JlPWsrc2NvcmUKICAgIH0KICAgIGV4YW1zY29yZVtpXT1zY29yZQogIH0KICBleGFtc2NvcmUgPC0gc29ydChleGFtc2NvcmUsZGVjcmVhc2luZyA9IFRSVUUpCiAgZXhhbXNjb3JlLmRmIDwtIGRhdGEuZnJhbWUoc2NvcmU9ZXhhbXNjb3JlKQogIGV4YW1zY29yZS5kZiRyYW5rIDwtIGMoMTo1MDApCiAgCiAgZm9yIChpIGluIDE6NDk5KXsKICAgIGlmKGV4YW1zY29yZS5kZiRzY29yZVtpXT09ZXhhbXNjb3JlLmRmJHNjb3JlW2krMV0pewogICAgICBpZihleGFtc2NvcmUuZGYkcmFua1tpXSA8IGV4YW1zY29yZS5kZiRyYW5rW2krMV0pewogICAgICAgIGV4YW1zY29yZS5kZiRyYW5rW2krMV0gPC0gZXhhbXNjb3JlLmRmJHJhbmtbaV0KICAgICAgfQogICAgfQogIH0KICAKICAjU2Nob29sIFByZWZlcmVuY2UKICByYW5raW5nIDwtIGMoMTo1MDApCiAgc2Nob29sIDwtIG1hdHJpeChyZXAocmFua2luZyw1MCksbnJvdyA9IDUwMCkKICAKICAjU3R1ZGVudCBQcmVmZXJlbmNlCiAgCiAgZXhhbXNjb3JlLmRmJHByZWQgPC0gKGV4YW1zY29yZS5kZiRyYW5rJS8lMTApKzEKICBleGFtc2NvcmUuZGYkcHJlZFtleGFtc2NvcmUuZGYkcHJlZD41MF0gPC0gNTAKICAKICBzdHVkZW50IDwtIG1hdHJpeChyZXAoMCwyNTAwKSxucm93ID0gNSkKICAKICBmb3IoIGkgaW4gMTo1MDApewogICAgaWYoZXhhbXNjb3JlLmRmJHByZWRbaV08Myl7CiAgICAgIHN0dWRlbnRbLGldIDwtIGMoMTo1KQogICAgfWVsc2UgaWYoZXhhbXNjb3JlLmRmJHByZWRbaV0+NDgpewogICAgICBzdHVkZW50WyxpXSA8LSBjKDQ2OjUwKQogICAgfWVsc2V7CiAgICAgIGsgPC0gZXhhbXNjb3JlLmRmJHByZWRbaV0tMgogICAgICBzdHVkZW50WyxpXSA8LSBjKGs6KGsrNCkpCiAgICB9CiAgfQogIAogIHN0dWRlbnRfZnVsbCA8LSBtYXRyaXgocmVwKGMoMTo1MCksNTAwKSxucm93PTUwKQogIAogICNtYXRjaCBtYXRyaXgKICBtYXRjaCA8LSBtYXRyaXgocmVwKDAsMjUwMDApLG5yb3cgPSA1MDApCiAgZm9yKGkgaW4gMTo1MDApewogICAgZm9yKGogaW4gMTo1KXsKICAgICAgayA8LSBzdHVkZW50W2osaV0KICAgICAgbWF0Y2hbaSxrXSA8LSAxCiAgICB9CiAgfQogIGZvcihpIGluIDE6NTApewogICAgbj0wCiAgICBmb3IoaiBpbiAxOjUwMCl7CiAgICAgIGlmKG1hdGNoW2osaV09PTEpewogICAgICAgIG49bisxCiAgICAgIH0KICAgICAgaWYobj4yNSl7CiAgICAgICAgaWYoZXhhbXNjb3JlLmRmJHNjb3JlW2otMV0+ZXhhbXNjb3JlLmRmJHNjb3JlW2pdKXsKICAgICAgICAgIGZvcihrIGluIGo6NTAwKXsKICAgICAgICAgICAgbWF0Y2hbayxpXSA8LSAwCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogICN1cGRhdGUKICAKICBzdHVkZW50MiA8LSBzdHVkZW50CiAgc2Nob29sMiA8LSBzY2hvb2wKICAKICBmb3IoaSBpbiAxOjUwMCl7CiAgICBmb3IoaiBpbiAxOjUpewogICAgICBrIDwtIHN0dWRlbnRbaixpXQogICAgICBpZihtYXRjaFtpLGtdPT0wKXsKICAgICAgICBzdHVkZW50MltqLGldIDwtIDk5OTkKICAgICAgfQogICAgfQogIH0KICAKICBmb3IoaSBpbiAxOjUwKXsKICAgIGZvcihqIGluIDE6NTAwKXsKICAgICAgayA8LSBzY2hvb2xbaixpXQogICAgICBpZihtYXRjaFtrLGldPT0wKXsKICAgICAgICBzY2hvb2wyW2osaV0gPC0gOTk5OQogICAgICB9CiAgICB9CiAgfQogIAogIHN0dWRlbnQyW3N0dWRlbnQyPT05OTk5XSA8LSAwCiAgc2Nob29sMltzY2hvb2wyPT05OTk5XSA8LSAwCiAgCiAgI0RBCiAgcmVzIDwtIGhyaShzLnByZWZzID0gc3R1ZGVudDIsYy5wcmVmcyA9IHNjaG9vbDIsblNsb3RzID0gcmVwKDEwLDUwKSkKICByZXMuZGYgPC0gcmVzJG1hdGNoaW5ncwogIHJlcy5kZiA8LSBhcy5kYXRhLmZyYW1lKGZpbHRlcihyZXMuZGYsc09wdGltYWw9PTEsbWF0Y2hpbmc9PTEpKQogIAogICNhbmFseXplIHJlc3VsdAogIHN0dWRlbnRfcmVzIDwtIHN0dWRlbnQKICBmb3IoaiBpbiAxOm5yb3cocmVzLmRmKSl7CiAgICBzdCA8LSByZXMuZGYkc3R1ZGVudFtqXQogICAgc2MgPC0gcmVzLmRmJGNvbGxlZ2Vbal0KICAgIHNsIDwtIHN0dWRlbnRfcmVzWyxzdF0KICAgIGZvcihpIGluIDE6NSl7CiAgICAgIGlmKHNsW2ldIT1zYyl7CiAgICAgICAgc2xbaV0gPC0gMAogICAgICB9CiAgICB9CiAgICBzdHVkZW50X3Jlc1ssc3RdIDwtIHNsCiAgfQogIAogIGZvcihpIGluIDE6bmNvbChzdHVkZW50X3JlcykpewogICAgaWYoc3VtKHN0dWRlbnRfcmVzWyxpXSAhPSAwKSE9MSl7CiAgICAgIHN0dWRlbnRfcmVzWyxpXSA8LSByZXAoMCw1KQogICAgfQogIH0KICAKICB3ZWwxIDwtIGMocmVwKDAsNTAwKSkKICBmb3IoaSBpbiAxOm5jb2woc3R1ZGVudF9yZXMpKXsKICAgIGZvcihqIGluIDE6bnJvdyhzdHVkZW50X3JlcykpewogICAgICBpZihzdHVkZW50X3Jlc1tqLGldIT0wKXsKICAgICAgICB3ZWwxW2ldIDwtIGoKICAgICAgfQogICAgfQogIH0KICAjREEKICByZXMyIDwtIGhyaShzLnByZWZzID0gc3R1ZGVudCxjLnByZWZzID0gc2Nob29sLG5TbG90cyA9IHJlcCgxMCw1MCkpCiAgcmVzMi5kZiA8LSByZXMyJG1hdGNoaW5ncwogIHJlczIuZGYgPC0gYXMuZGF0YS5mcmFtZShmaWx0ZXIocmVzMi5kZixzT3B0aW1hbD09MSxtYXRjaGluZz09MSkpCiAgCiAgI2FuYWx5emUgcmVzdWx0CiAgc3R1ZGVudF9yZXMyIDwtIHN0dWRlbnQKICBmb3IoaiBpbiAxOm5yb3cocmVzMi5kZikpewogICAgc3QgPC0gcmVzMi5kZiRzdHVkZW50W2pdCiAgICBzYyA8LSByZXMyLmRmJGNvbGxlZ2Vbal0KICAgIHNsIDwtIHN0dWRlbnRfcmVzMlssc3RdCiAgICBmb3IoaSBpbiAxOjUpewogICAgICBpZihzbFtpXSE9c2MpewogICAgICAgIHNsW2ldIDwtIDAKICAgICAgfQogICAgfQogICAgc3R1ZGVudF9yZXMyWyxzdF0gPC0gc2wKICB9CiAgCiAgZm9yKGkgaW4gMTpuY29sKHN0dWRlbnRfcmVzMikpewogICAgaWYoc3VtKHN0dWRlbnRfcmVzMlssaV0gIT0gMCkhPTEpewogICAgICBzdHVkZW50X3JlczJbLGldIDwtIHJlcCgwLDUpCiAgICB9CiAgfQogIAogIHdlbDIgPC0gYyhyZXAoMCw1MDApKQogIGZvcihpIGluIDE6bmNvbChzdHVkZW50X3JlczIpKXsKICAgIGZvcihqIGluIDE6bnJvdyhzdHVkZW50X3JlczIpKXsKICAgICAgaWYoc3R1ZGVudF9yZXMyW2osaV0hPTApewogICAgICAgIHdlbDJbaV0gPC0gagogICAgICB9CiAgICB9CiAgfQogICNEQQogIHJlc2YgPC0gaHJpKHMucHJlZnMgPSBzdHVkZW50X2Z1bGwsYy5wcmVmcyA9IHNjaG9vbCxuU2xvdHMgPSByZXAoMTAsNTApKQogIHJlc2YuZGYgPC0gcmVzZiRtYXRjaGluZ3MKICByZXNmLmRmIDwtIGFzLmRhdGEuZnJhbWUoZmlsdGVyKHJlc2YuZGYsc09wdGltYWw9PTEsbWF0Y2hpbmc9PTEpKQogIAogICNhbmFseXplIHJlc3VsdAogIHN0dWRlbnRfcmVzZiA8LSBzdHVkZW50X2Z1bGwKICBmb3IoaiBpbiAxOm5yb3cocmVzZi5kZikpewogICAgc3QgPC0gcmVzZi5kZiRzdHVkZW50W2pdCiAgICBzYyA8LSByZXNmLmRmJGNvbGxlZ2Vbal0KICAgIHNsIDwtIHN0dWRlbnRfcmVzZlssc3RdCiAgICBmb3IoaSBpbiAxOm5yb3coc3R1ZGVudF9yZXNmKSl7CiAgICAgIGlmKHNsW2ldIT1zYyl7CiAgICAgICAgc2xbaV0gPC0gMAogICAgICB9CiAgICB9CiAgICBzdHVkZW50X3Jlc2ZbLHN0XSA8LSBzbAogIH0KICAKICBmb3IoaSBpbiAxOm5jb2woc3R1ZGVudF9yZXNmKSl7CiAgICBpZihzdW0oc3R1ZGVudF9yZXNmWyxpXSAhPSAwKSE9MSl7CiAgICAgIHN0dWRlbnRfcmVzZlssaV0gPC0gcmVwKDAsNSkKICAgIH0KICB9CiAgY29tcCA8LSBkYXRhLmZyYW1lKHJlcz1jKHJlcCgwLDUwMCkpLAogICAgICAgICAgICAgICAgICAgICByZXMyPWMocmVwKDAsNTAwKSksCiAgICAgICAgICAgICAgICAgICAgIHJlc2Y9YyhyZXAoMCw1MDApKSkKICBmb3IoaSBpbiAxOm5jb2woc3R1ZGVudF9yZXNmKSl7CiAgICBmb3IoaiBpbiAxOm5yb3coc3R1ZGVudF9yZXMpKXsKICAgICAgaWYoc3R1ZGVudF9yZXNbaixpXSE9MCl7CiAgICAgICAgY29tcCRyZXNbaV0gPC0gc3R1ZGVudF9yZXNbaixpXQogICAgICB9CiAgICB9CiAgICBmb3IobSBpbiAxOm5yb3coc3R1ZGVudF9yZXMyKSl7CiAgICAgIGlmKHN0dWRlbnRfcmVzMlttLGldIT0wKXsKICAgICAgICBjb21wJHJlczJbaV0gPC0gc3R1ZGVudF9yZXMyW20saV0KICAgICAgfQogICAgfQogICAgZm9yKG4gaW4gMTpucm93KHN0dWRlbnRfcmVzZikpewogICAgICBpZihzdHVkZW50X3Jlc2ZbbixpXSE9MCl7CiAgICAgICAgY29tcCRyZXNmW2ldIDwtIHN0dWRlbnRfcmVzZltuLGldCiAgICAgIH0KICAgIH0KICB9CiAgY29tcCRkaXJlcyA8LSAwCiAgY29tcCRkaXJlczIgPC0gMAogIGZvcihpIGluIDE6bmNvbChzdHVkZW50X3Jlc2YpKXsKICAgIGlmKGNvbXAkcmVzW2ldIT0wKXsKICAgICAgY29tcCRkaXJlc1tpXSA8LSBjb21wJHJlc2ZbaV0tY29tcCRyZXNbaV0KICAgIH1lbHNlewogICAgICBjb21wJGRpcmVzW2ldIDwtIE5BCiAgICB9CiAgICBpZihjb21wJHJlczJbaV0hPTApewogICAgICBjb21wJGRpcmVzMltpXSA8LSBjb21wJHJlc2ZbaV0tY29tcCRyZXMyW2ldCiAgICB9ZWxzZXsKICAgICAgY29tcCRkaXJlczJbaV0gPC0gTkEKICAgIH0KICB9CiAgY29tcGRpcmVzLmRmIDwtIGFzLmRhdGEuZnJhbWUoY291bnQoY29tcCxkaXJlcykpCiAgY29sbmFtZXMoY29tcGRpcmVzLmRmKSA8LSBjKCJ0eXBlIiwiY291bnQiKQogIGNvbXBkaXJlczIuZGYgPC0gYXMuZGF0YS5mcmFtZShjb3VudChjb21wLGRpcmVzMikpCiAgY29sbmFtZXMoY29tcGRpcmVzMi5kZikgPC0gYygidHlwZSIsImNvdW50IikKICBmaW5hbHJlcyA8LSBtZXJnZShjb21wZGlyZXMuZGYsY29tcGRpcmVzMi5kZixieT0idHlwZSIsYWxsID0gVFJVRSkKICBmaW5hbGRmIDwtIGFwcGVuZChmaW5hbGRmLGxpc3QoZmluYWxyZXMpKQogIGlmKHRpbWVzJSUxMD09MCl7CiAgICBwcmludCh0aW1lcykKICB9Cn0KYGBgCiNSZXN1bHQKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbmFsZGZyZXMgPC0gZmluYWxkZltbMV1dWy0zXQpmb3IoaSBpbiAxOjk5KXsKICBmaW5hbGRmcmVzIDwtIG1lcmdlKGZpbmFsZGZyZXMsZmluYWxkZltbaSsxXV1bLTNdLGJ5PSJ0eXBlIixhbGwgPSBUUlVFKQp9CmZpbmFsZGZyZXMxIDwtIGFzLmRhdGEuZnJhbWUoZmluYWxkZnJlcykKZmluYWxkZnJlcyA8LSBmaW5hbGRmW1sxXV1bLTJdCmZvcihpIGluIDE6OTkpewogIGZpbmFsZGZyZXMgPC0gbWVyZ2UoZmluYWxkZnJlcyxmaW5hbGRmW1tpKzFdXVstMl0sYnk9InR5cGUiLGFsbCA9IFRSVUUpCn0KZmluYWxkZnJlczIgPC0gYXMuZGF0YS5mcmFtZShmaW5hbGRmcmVzKQpyb3duYW1lcyhmaW5hbGRmcmVzMSkgPC0gYXMuY2hhcmFjdGVyKGMoZmluYWxkZnJlczFbMTo2LDFdLCJOQSIpKQpyb3duYW1lcyhmaW5hbGRmcmVzMikgPC0gYXMuY2hhcmFjdGVyKGMoZmluYWxkZnJlczJbMTo2LDFdLCJOQSIpKQpmaW5hbGRmcmVzMSA8LSBmaW5hbGRmcmVzMVssMjoxMDFdCmZpbmFsZGZyZXMyIDwtIGZpbmFsZGZyZXMyWywyOjEwMV0KZmluYWxkZnJlczFbaXMubmEoZmluYWxkZnJlczEpXSA8LSAwCmZpbmFsZGZyZXMyW2lzLm5hKGZpbmFsZGZyZXMyKV0gPC0gMApmaW5hbGRmcmVzMSRzdW0gPC0gcm93U3VtcyhmaW5hbGRmcmVzMSkKZmluYWxkZnJlczIkc3VtIDwtIHJvd1N1bXMoZmluYWxkZnJlczIpCmZpbmFsZGZyZXNtZWFuIDwtIGRhdGEuZnJhbWUodHlwZT1jKHJvd25hbWVzKGZpbmFsZGZyZXMxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aF9zdGVwPWZpbmFsZGZyZXMxJHN1bS81MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoX291dF9zdGVwPWZpbmFsZGZyZXMyJHN1bS81MDAwMCkKbGV2ZWxfb3JkZXIgPC0gYXMuY2hhcmFjdGVyKGZpbmFsZGZyZXNtZWFuJHR5cGUpCmJyayA8LSBjKDAsMC4yNSwwLjUwLDAuNzUsMSkKZm9yZ3IgPC0gbWVsdChmaW5hbGRmcmVzbWVhbikKcmVzZ3IgPC0gZ2dwbG90KGZvcmdyLCBhZXMoeCA9IGZhY3Rvcih0eXBlLGxldmVsPWxldmVsX29yZGVyKSx5ID0gdmFsdWUpKSArCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUsIG5yb3c9MiwgbmNvbD0xKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YnJrLGxhYmVscyA9IHBlcmNlbnQoYnJrKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsZmlsbD0ibGlnaHRzZWFncmVlbiIpKwogIGdlb21fdGV4dChhZXMoeSA9IHZhbHVlICsgLjA1LCBsYWJlbCA9IHBlcmNlbnQodmFsdWUpKSxjb2xvdXIgPSAiZ3JheTI4IikrCiAgZ2VvbV90ZXh0KGFlcyh5ID0gdmFsdWUgKyAuMTUsbGFiZWw9KHZhbHVlKSo1MDApLGNvbG91ciA9ICJncmF5NTAiKSsKICB4bGFiKCJDb21wYXJpbmcgdG8gZnVsbCBEQSIpKwogIHlsYWIoInBlcmNlbnRhZ2UiKSsKICB0aGVtZV9ncmF5KCkKcmVzZ3IKYGBgCgoqKio=