ALL IMPORTED FILES MUST BE IN THE SAME DIRECTORY AS THIS SCRIPT

Load tidyverse package

library("tidyverse")

Import raw vcf data from “masterfile” (vcf file output from alignment, variant caller and annotation pipeline- available from authors on reasonable request) and exclude variants with GnomAD non-cancer AF > 0.005

masterfile_eoc <- read.delim("masterfile.tsv", header=TRUE, row.names=NULL, na.strings = ".", stringsAsFactors=FALSE) %>% 
  dplyr::rename("Sample"="X.Sample") %>% 
  filter(GnomAD_v2.1_non_cancer_AF<=0.005)

Append patient pathology data (available from authors on reasonable request)

OvCa_Path_Data <- read.delim("OvCa_Path_Data.txt", header=TRUE, row.names=NULL, stringsAsFactors=FALSE) %>%
  dplyr::rename("Sample"=Exome.ID)
masterfile_eoc2 <- left_join(masterfile_eoc,OvCa_Path_Data,by="Sample",copy=FALSE)
rm(OvCa_Path_Data)

Exclude low-quality variants and GnomAD RF/InbreedingCoeff-flagged variants

masterfile_eoc_goodQ <- filter(masterfile_eoc2, (QUAL>=30)&
                                 (Identified!="FilteredInAll")&
                                 (Sample.PMCDP>=10)&
                                 (Sample.PMCFREQ>=0.25)) %>% 
                                 filter((!str_detect(GnomAD_v2.1_FILTER_exome,"InbreedingCoeff")&
                                           !str_detect(GnomAD_v2.1_FILTER_exome,"RF"))|
                                       is.na(GnomAD_v2.1_FILTER_exome)) %>% 
  filter((!str_detect(GnomAD_v2.1_FILTER_genome,"InbreedingCoeff")&
            !str_detect(GnomAD_v2.1_FILTER_genome,"RF"))|
           is.na(GnomAD_v2.1_FILTER_genome))

Exclude other mutation +ve samples (MLH1/MSH2/MSH6/PMS2, TP53, RAD51C/D, BRIP1)

masterfile_eoc_goodQ2 <- filter(masterfile_eoc_goodQ,
                                (Sample!="PUB-P1RUC")&
                                  (Sample!="PUB-06NJ4")&
                                  (Sample!="PUB-4WIFF")&
                                  (Sample!="PUB-JYFJG")&
                                  (Sample!="PUB-KJM27")&
                                  (Sample!="PUB-RT7RU"))

Exclude VEP MODERATE impact variants

masterfile_eoc_goodQ2_HIGH <- filter(masterfile_eoc_goodQ2, IMPACT=="HIGH")

Separate Ensembl canonical variants

masterfile_eoc_goodQ2_HIGH_ENSTcanonical <- filter(masterfile_eoc_goodQ2_HIGH,CANONICAL=="YES") 

Sample variant counts and AFs

variants_heterozygous <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical %>% 
  select(HGVSc,Sample.GT) %>% 
  group_by(HGVSc,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT%in%c("'0/1","'1/0"))) %>% 
  rename(alleles = "n()") %>% 
  group_by(HGVSc) %>% 
  summarise(sum(alleles))
variants_homozygous <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical %>% 
  select(HGVSc,Sample.GT) %>% 
  group_by(HGVSc,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT!="'0/1")&(Sample.GT!="'1/0")) %>% 
  mutate(alleles = `n()`*2) %>% 
  select(-`n()`) %>% 
  group_by(HGVSc) %>% 
  summarise(sum(alleles))
variants <- full_join(variants_heterozygous,variants_homozygous,by="HGVSc",copy=FALSE,suffix=c(".x",".y")) %>%
  mutate_all(funs(replace(., is.na(.), 0))) %>% 
  mutate(Total_Allele_Count=`sum(alleles).x`+`sum(alleles).y`) %>% 
  mutate(Sample_AF=Total_Allele_Count/(n_distinct(masterfile_eoc_goodQ2$Sample)*2))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_2 <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical,variants[,c(1,4:5)],by="HGVSc",copy=FALSE)

Exclude variants with sample AF > 0.01̛

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01 <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_2,Sample_AF < 0.01)

Sample gene counts and frequencies

genes_oneVarAllele <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01 %>%
  select(SYMBOL,Gene,Sample.GT) %>% 
  group_by(Gene,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT%in%c("'0/1","'1/0"))) %>% 
  rename(gene_Var = "n()") %>% 
  group_by(Gene) %>% 
  summarise(sum(gene_Var))
genes_twoVarAllele <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01 %>%
  select(SYMBOL,Gene,Sample.GT) %>% 
  group_by(Gene,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT!="'0/1")&(Sample.GT!="'1/0")) %>% 
  mutate(gene_Var = `n()`*2) %>% 
  select(-`n()`) %>% 
  group_by(Gene) %>% 
  summarise(sum(gene_Var))
genes <- full_join(genes_oneVarAllele,genes_twoVarAllele,by="Gene",copy=FALSE,suffix=c(".x",".y")) %>% 
  mutate_all(funs(replace(., is.na(.), 0))) %>% 
  mutate(Total_Gene_Count=`sum(gene_Var).x`+`sum(gene_Var).y`) %>% 
  mutate(Sample_Gene_Freq=Total_Gene_Count/(n_distinct(masterfile_eoc_goodQ2$Sample)*2))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_2 <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01, genes[,c(1,4:5)],by="Gene",copy=FALSE)

Add GnomAD aggregated gene-level variant frequency data (available from authors on reasonable request)

GnomAD_stats_LOF_VEP <- read.delim("GnomAD_stats_LOF_VEP.tsv", header=TRUE, row.names=NULL, stringsAsFactors=FALSE)

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_2, GnomAD_stats_LOF_VEP[,c(2,30:41)],by="Feature",copy=FALSE) 
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats2 <- mutate_at(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats,vars(starts_with("FILTER_")),funs(replace(., is.na(.), 0))) %>% 
  mutate_if(grepl("popmax$", names(.)),funs(ifelse(. == "NA", 0, as.numeric(.)))) %>% 
  mutate_at(vars(ends_with("popmax")),funs(replace(., is.na(.), 0)))

Calculate Sample/GnomAD gene frequency ratios for total and NFE GnomAD figures, including and excluding variants with AF > 0.005

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios <- 
  mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats2, 
         "Sample_Gene_LOF_Freq_Ratio_GnomAD"=Sample_Gene_Freq/FILTER_RF_LOF_HIGHIMPACT_AF_1.0_ADJ,
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_0.005"=Sample_Gene_Freq/FILTER_RF_LOF_HIGHIMPACT_AF_0.005_ADJ,
         "Ratio_Difference"=Sample_Gene_LOF_Freq_Ratio_GnomAD_0.005-Sample_Gene_LOF_Freq_Ratio_GnomAD, 
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE"=Sample_Gene_Freq/FILTER_RF_LOF_HIGHIMPACT_AF_1.0_NFE_ADJ,
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE_0.005"=Sample_Gene_Freq/FILTER_RF_LOF_HIGHIMPACT_AF_0.005_NFE_ADJ,
         "Ratio_Difference_NFE"=Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE_0.005-Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE)

Calculate Sample/GnomAD allele frequency ratios

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2 <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios, "Sample_Gene_LOF_AF_Ratio"=Sample_AF/GnomAD_v2.1_non_cancer_AF, 
"Sample_Gene_LOF_AF_Ratio_NFE"=Sample_AF/GnomAD_v2.1_non_cancer_AF_nfe)

Create data frames with Agilent SureSelect whole exome genes (all ENST, protein-coding only and non-protein-coding- files available from authors on reasonable request) for waterfall plot

ensembl_biotypes <- read.delim("ensembl_biotypes.tsv", stringsAsFactors=FALSE) %>% 
  select(ensembl_transcript_id,transcript_biotype) %>% 
  dplyr::rename("Feature"="ensembl_transcript_id","BIOTYPE"="transcript_biotype")
GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_all <- read.delim("GnomAD.gene.stats.v2.RF.only.agilent.v6.only.tsv", header=TRUE, row.names=NULL, stringsAsFactors=FALSE) %>% 
  filter(CANONICAL=="YES") %>% 
  dplyr::rename("SYMBOL"="X.Symbol") %>% 
  dplyr::rename("Gene"="ENSG") %>% 
  left_join(ensembl_biotypes,by="Feature",copy=FALSE)
GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_protein_coding <- read.delim("GnomAD.gene.stats.v2.RF.only.agilent.v6.only.tsv", header=TRUE, row.names=NULL, stringsAsFactors=FALSE) %>% 
  filter(CANONICAL=="YES") %>% 
  dplyr::rename("SYMBOL"="X.Symbol") %>% 
  dplyr::rename("Gene"="ENSG") %>% 
  left_join(ensembl_biotypes,by="Feature",copy=FALSE) %>% 
  filter(BIOTYPE%in%c("protein_coding"))
GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_non_protein_coding <- read.delim("GnomAD.gene.stats.v2.RF.only.agilent.v6.only.tsv", header=TRUE, row.names=NULL, stringsAsFactors=FALSE) %>% 
  filter(CANONICAL=="YES") %>% 
  dplyr::rename("SYMBOL"="X.Symbol") %>% 
  dplyr::rename("Gene"="ENSG") %>% 
  left_join(ensembl_biotypes,by="Feature",copy=FALSE) %>% 
  filter(!BIOTYPE%in%c("protein_coding"))

allGenes_AgilentSSv6_list <- tibble("SYMBOL"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_all$SYMBOL,"Gene"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_all$Gene,"Feature"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_all$Feature) %>% 
  distinct(.keep_all=TRUE) %>% 
  arrange(SYMBOL)
allGenes_AgilentSSv6_list_protein_coding_only <- tibble("SYMBOL"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_protein_coding$SYMBOL,"Gene"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_protein_coding$Gene,"Feature"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_protein_coding$Feature) %>% 
  distinct(.keep_all=TRUE) %>% 
  arrange(SYMBOL)
allGenes_AgilentSSv6_list_non_protein_coding_only <- tibble("SYMBOL"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_non_protein_coding$SYMBOL,"Gene"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_non_protein_coding$Gene,"Feature"=GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_non_protein_coding$Feature) %>% 
  distinct(.keep_all=TRUE) %>% 
  arrange(SYMBOL)

allGenes_masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_list <- tibble("SYMBOL"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$SYMBOL,"Gene"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$Gene,"BIOTYPE"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$BIOTYPE) %>% 
  distinct(.keep_all=TRUE) %>% 
  arrange(SYMBOL)
allGenes_masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_list <- tibble("SYMBOL"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$SYMBOL,"Gene"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$Gene,"BIOTYPE"=masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2$BIOTYPE) %>% 
  distinct(.keep_all=TRUE) %>% 
  filter(BIOTYPE%in%c("protein_coding")) %>% 
  arrange(SYMBOL)

waterfall_sampleAF0.01_allGenes <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2 %>% 
  mutate(Total_Case_Alleles=(n_distinct(masterfile_eoc_goodQ2$Sample)*2)) %>% 
  select(SYMBOL,Gene,Total_Gene_Count,Total_Case_Alleles) %>% 
  distinct(SYMBOL,Gene,Total_Gene_Count,Total_Case_Alleles) 
waterfall_sampleAF0.01_allGenes2 <- bind_rows(waterfall_sampleAF0.01_allGenes, anti_join(allGenes_AgilentSSv6_list,waterfall_sampleAF0.01_allGenes,by="Gene")) %>% 
  mutate_at(vars("Total_Gene_Count"),funs(replace(., is.na(.), 0))) %>% 
  mutate_at(vars("Total_Case_Alleles"),funs(replace(., is.na(.), n_distinct(masterfile_eoc_goodQ2$Sample)*2)))
waterfall_sampleAF0.01_allGenes3 <- right_join(
  waterfall_sampleAF0.01_allGenes2,
  GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_all,
  by="Gene",copy=FALSE) %>% 
  select("SYMBOL.x","Gene","Total_Gene_Count","Total_Case_Alleles","FILTER_RF_LOF_HIGHIMPACT_AC_0.005","FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE","MAX_AN","MAX_AN_NFE","FILTER_RF_LOF_HIGHIMPACT_AF_0.005_ADJ","FILTER_RF_LOF_HIGHIMPACT_AF_0.005_NFE_ADJ") %>% 
  dplyr::rename("SYMBOL"="SYMBOL.x") %>%
  mutate(FILTER_RF_LOF_HIGHIMPACT_AC_0.005_ADJ=round((MAX_AN*FILTER_RF_LOF_HIGHIMPACT_AF_0.005_ADJ))) %>% 
  mutate(FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE_ADJ=round((MAX_AN_NFE*FILTER_RF_LOF_HIGHIMPACT_AF_0.005_NFE_ADJ))) %>% 
  distinct(.keep_all=TRUE)

waterfall_sampleAF0.01_biotype_allGenes <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2 %>% 
  mutate(Total_Case_Alleles=(n_distinct(masterfile_eoc_goodQ2$Sample)*2)) %>% 
  filter(BIOTYPE%in%c("protein_coding")) %>% 
  select(SYMBOL,Gene,Total_Gene_Count,Total_Case_Alleles) %>% 
  distinct(SYMBOL,Gene,Total_Gene_Count,Total_Case_Alleles) 
waterfall_sampleAF0.01_biotype_allGenes2 <- bind_rows(waterfall_sampleAF0.01_biotype_allGenes, anti_join(allGenes_AgilentSSv6_list_protein_coding_only,waterfall_sampleAF0.01_biotype_allGenes,by="Gene")) %>% 
  mutate_at(vars("Total_Gene_Count"),funs(replace(., is.na(.), 0))) %>% 
  mutate_at(vars("Total_Case_Alleles"),funs(replace(., is.na(.), n_distinct(masterfile_eoc_goodQ2$Sample)*2)))
waterfall_sampleAF0.01_biotype_allGenes3 <- right_join(
  waterfall_sampleAF0.01_biotype_allGenes2,
  GnomAD_stats_AgilentSSv6_LOF_VEP_ENSTcanonical_protein_coding,
  by="Gene",copy=FALSE) %>% 
  select("SYMBOL.x","Gene","Total_Gene_Count","Total_Case_Alleles","FILTER_RF_LOF_HIGHIMPACT_AC_0.005","FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE","MAX_AN","MAX_AN_NFE","FILTER_RF_LOF_HIGHIMPACT_AF_0.005_ADJ","FILTER_RF_LOF_HIGHIMPACT_AF_0.005_NFE_ADJ") %>% 
  dplyr::rename("SYMBOL"="SYMBOL.x") %>% 
  mutate(FILTER_RF_LOF_HIGHIMPACT_AC_0.005_ADJ=round((MAX_AN*FILTER_RF_LOF_HIGHIMPACT_AF_0.005_ADJ))) %>% 
  mutate(FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE_ADJ=round((MAX_AN_NFE*FILTER_RF_LOF_HIGHIMPACT_AF_0.005_NFE_ADJ))) %>% 
  distinct(.keep_all=TRUE)

Calculate Fisher’s test values

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios2,Total_Case_Alleles=(n_distinct(masterfile_eoc_goodQ2$Sample)*2)) %>% 
  left_join(GnomAD_stats_LOF_VEP[,c(2,6,10,14:29)],by="Feature",copy=FALSE) 
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2 <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults, MAX_AN=replace(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults$MAX_AN, is.na(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults$MAX_AN), max(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults$MAX_AN, na.rm=TRUE))) %>% 
  mutate(MAX_AN_NFE=replace(.$MAX_AN_NFE, is.na(.$MAX_AN_NFE), max(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults$MAX_AN_NFE, na.rm=TRUE)))

fisherresults_ENST <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2[,c(221,229,243,244)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$P_value_Fisher_0.005 = sapply(fisherresults_ENST,function(x) round(x$p.value,12))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$OR_0.005 = sapply(fisherresults_ENST,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$`95%CI_0.005` = sapply(fisherresults_ENST,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults2_ENST <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2[,c(221,232,243,245)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$P_value_Fisher_0.005_NFE = sapply(fisherresults2_ENST,function(x) round(x$p.value,12))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$OR_0.005_NFE = sapply(fisherresults2_ENST,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2$`95%CI_0.005_NFE` = sapply(fisherresults2_ENST,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

Calculate Fisher’s test values (waterfall plot)

fisherresults_allGenes_waterfall <- apply(waterfall_sampleAF0.01_allGenes3[,c(3,5,4,7)],1,function(x) {fisher.test(rbind(x[1:2],c(abs(x[3]-x[1]),abs(x[4]-x[2]))))})

waterfall_sampleAF0.01_allGenes3$P_value_Fisher_0.005 = sapply(fisherresults_allGenes_waterfall,function(x) round(x$p.value,15))
waterfall_sampleAF0.01_allGenes3$OR_0.005 = sapply(fisherresults_allGenes_waterfall,function(x) round(x$estimate,15))
waterfall_sampleAF0.01_allGenes3$`95%CI_0.005` = sapply(fisherresults_allGenes_waterfall,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_NFE_waterfall <- apply(waterfall_sampleAF0.01_allGenes3[,c(3,6,4,8)],1,function(x) {fisher.test(rbind(x[1:2],c(abs(x[3]-x[1]),abs(x[4]-x[2]))))})

waterfall_sampleAF0.01_allGenes3$P_value_Fisher_0.005_NFE = sapply(fisherresults_NFE_waterfall,function(x) round(x$p.value,15))
waterfall_sampleAF0.01_allGenes3$OR_0.005_NFE = sapply(fisherresults_NFE_waterfall,function(x) round(x$estimate,15))
waterfall_sampleAF0.01_allGenes3$`95%CI_0.005_NFE` = sapply(fisherresults_NFE_waterfall,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_biotype_allGenes_waterfall <- apply(waterfall_sampleAF0.01_biotype_allGenes3[,c(3,5,4,7)],1,function(x) {fisher.test(rbind(x[1:2],c(abs(x[3]-x[1]),abs(x[4]-x[2]))))})

waterfall_sampleAF0.01_biotype_allGenes3$P_value_Fisher_0.005 = sapply(fisherresults_biotype_allGenes_waterfall,function(x) round(x$p.value,15))
waterfall_sampleAF0.01_biotype_allGenes3$OR_0.005 = sapply(fisherresults_biotype_allGenes_waterfall,function(x) round(x$estimate,15))
waterfall_sampleAF0.01_biotype_allGenes3$`95%CI_0.005` = sapply(fisherresults_biotype_allGenes_waterfall,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_biotype_NFE_waterfall <- apply(waterfall_sampleAF0.01_biotype_allGenes3[,c(3,6,4,8)],1,function(x) {fisher.test(rbind(x[1:2],c(abs(x[3]-x[1]),abs(x[4]-x[2]))))})

waterfall_sampleAF0.01_biotype_allGenes3$P_value_Fisher_0.005_NFE = sapply(fisherresults_biotype_NFE_waterfall,function(x) round(x$p.value,15))
waterfall_sampleAF0.01_biotype_allGenes3$OR_0.005_NFE = sapply(fisherresults_biotype_NFE_waterfall,function(x) round(x$estimate,15))
waterfall_sampleAF0.01_biotype_allGenes3$`95%CI_0.005_NFE` = sapply(fisherresults_biotype_NFE_waterfall,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

Annotate variants with filtering AF > maximum credible population AF in GnomAD for hereditary OvCa (0.000181), calculated using alleleFrequencyApp (http://cardiodb.org/allelefrequencyapp/)

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults3 <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults2, FilteringAF_95_Exceeds_MaxCredPopAF=((GnomAD_v2.1_non_cancer_Filtering_AF_95)>0.000181)) %>% 
  mutate(FilteringAF_95_NFE_Exceeds_MaxCredPopAF=((GnomAD_v2.1_non_cancer_Filtering_AF_95_nfe)>0.000181))

Annotate variants that PASS/FAIL the LOFTEE 50bp rule

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults4 <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults3,LoF_50_BP_RULE = ifelse(grepl("50_BP_RULE:PASS", LoF_info), TRUE, ifelse(grepl("50_BP_RULE:FAIL", LoF_info), FALSE, NA)))

Import NMD depleted gene list (available from authors on reasonable request) and annotate variants accordingly

NMD_depleted_gene_list <- read.csv("NMD_depleted_gene_list.csv", stringsAsFactors=FALSE) %>% 
  rename("SYMBOL" = gene) %>% 
  rename("Feature" = txnames) %>% 
  rename("NMD_predictor_rank" = min.rank)

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults5 <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults4, NMD_depleted_gene_list[,c(2:3)],by="Feature",copy=FALSE) 

Output data (pre-prioritisation) and ranked p-value list used for Benjamini-Hochberg adjustment

write_excel_csv(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults5,path="masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01.csv",na=".",append=FALSE,col_names=TRUE)

select(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults5,SYMBOL,Gene,P_value_Fisher_0.005_NFE) %>% 
  arrange(P_value_Fisher_0.005_NFE) %>% 
  unique() %>% 
  write_tsv(path="HIGH_ENSTcanonical_BH_p_values.tsv")

Calculate total LoF variants in sample vs total LoF variants in GnomAD non-cancer (all/NFE-only) for all genes and protein-coding-only genes, and use for chi-squared test

a <- sum(waterfall_sampleAF0.01_allGenes3$Total_Gene_Count) %>% as.numeric()
b <- n_distinct(masterfile_eoc_goodQ2$Sample)*2*(nrow(allGenes_AgilentSSv6_list)) %>% as.numeric()
b1 <- b-a %>% as.numeric()
c <- sum(waterfall_sampleAF0.01_allGenes3$FILTER_RF_LOF_HIGHIMPACT_AC_0.005) %>% as.numeric()
d <- (max(waterfall_sampleAF0.01_allGenes3$MAX_AN))*nrow(allGenes_AgilentSSv6_list) %>% as.numeric()
d1 <- d-c %>% as.numeric()
e <- sum(waterfall_sampleAF0.01_allGenes3$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE) %>% as.numeric()
f <- (max(waterfall_sampleAF0.01_allGenes3$MAX_AN_NFE))*nrow(allGenes_AgilentSSv6_list) %>% as.numeric()
f1 <- f-e %>% as.numeric()

g <- sum(waterfall_sampleAF0.01_biotype_allGenes3$Total_Gene_Count) %>% as.numeric()
h <- n_distinct(masterfile_eoc_goodQ2$Sample)*2*(nrow(allGenes_AgilentSSv6_list_protein_coding_only)) %>% as.numeric()
h1 <- h-g %>% as.numeric()
i <- sum(waterfall_sampleAF0.01_biotype_allGenes3$FILTER_RF_LOF_HIGHIMPACT_AC_0.005) %>% as.numeric()
j <- (max(waterfall_sampleAF0.01_biotype_allGenes3$MAX_AN))*nrow(allGenes_AgilentSSv6_list_protein_coding_only) %>% as.numeric()
j1 <- j-i %>% as.numeric()
k <- sum(waterfall_sampleAF0.01_biotype_allGenes3$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE) %>% as.numeric()
l <- (max(waterfall_sampleAF0.01_biotype_allGenes3$MAX_AN_NFE))*nrow(allGenes_AgilentSSv6_list_protein_coding_only) %>% as.numeric()
l1 <- l-k %>% as.numeric()

chiX2_0.005 <- matrix(c(a,b1,c,d1),nrow=2,byrow=TRUE)
chiX2_0.005_NFE <- matrix(c(a,b1,e,f1),nrow=2,byrow=TRUE)
chisq.test(chiX2_0.005,correct=FALSE)
chisq.test(chiX2_0.005_NFE,correct=FALSE)

chiX2_0.005_biotype <- matrix(c(g,h1,i,j1),nrow=2,byrow=TRUE)
chiX2_0.005_NFE_biotype <- matrix(c(g,h1,k,l1),nrow=2,byrow=TRUE)
chisq.test(chiX2_0.005_biotype,correct=FALSE)
chisq.test(chiX2_0.005_NFE_biotype,correct=FALSE)

Remove variants with non-protein-coding biotypes

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_fisherresults5,BIOTYPE%in%c("protein_coding"))

Remove variants with GnomAD PopMax AF > 0.005

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005 <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype,
GnomAD_v2.1_non_cancer_AF_popmax<=0.005)

Remove variants with ratio < 3

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005_ratio3 <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005,Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE_0.005>3) 

Remove variants with gene counts < 3

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005_ratio3_geneCount3 <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005_ratio3,
Total_Gene_Count>2)

Output data (post-prioritisation)

write_excel_csv(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005_ratio3_geneCount3,path="masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_biotype_GnomADpopmax0.005_ratio3_geneCount3.csv",na=".",append=FALSE,col_names=TRUE)

Output data for log p-value waterfall plots (all genes and protein-coding-only genes)

waterfall_sampleAF0.01_allGenes4 <- mutate(waterfall_sampleAF0.01_allGenes3,"Log10_P-value_Fisher_0.005_NFE" = log10(P_value_Fisher_0.005_NFE)) %>% 
  arrange(desc(OR_0.005_NFE)) %>% 
  mutate("Plotted_Log10_P-value_Fisher_0.005_NFE"= 
  if_else (OR_0.005_NFE>=1, `Log10_P-value_Fisher_0.005_NFE`*-1, `Log10_P-value_Fisher_0.005_NFE`, missing=NULL)) %>% 
  arrange(desc(`Plotted_Log10_P-value_Fisher_0.005_NFE`),desc(OR_0.005_NFE)) %>% 
  write_excel_csv(path="waterfall_sampleAF0.01_allGenes_v6.csv",na=".",append=FALSE,col_names=TRUE)

waterfall_sampleAF0.01_biotype_allGenes4 <- mutate(waterfall_sampleAF0.01_biotype_allGenes3,"Log10_P-value_Fisher_0.005_NFE" = log10(P_value_Fisher_0.005_NFE)) %>% 
  arrange(desc(OR_0.005_NFE)) %>% 
  mutate("Plotted_Log10_P-value_Fisher_0.005_NFE"= 
  if_else (OR_0.005_NFE>=1, `Log10_P-value_Fisher_0.005_NFE`*-1, `Log10_P-value_Fisher_0.005_NFE`, missing=NULL)) %>% 
  arrange(desc(`Plotted_Log10_P-value_Fisher_0.005_NFE`),desc(OR_0.005_NFE)) %>% 
  write_excel_csv(path="waterfall_sampleAF0.01_biotype_allGenes_v6.csv",na=".",append=FALSE,col_names=TRUE)

Remove redundant c.2208T>G stopgain BLM variant from PUB-1G5DH (in cis with c.2206dupT variant in this individual) and recalculate gene counts/frequencies and ratios for DNA repair gene analysis

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_a <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01, HGVSc!="ENST00000355112.3:c.2208T>G")

genes_oneVarAllele <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_a %>% 
  select(SYMBOL,Sample.GT) %>% 
  group_by(SYMBOL,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT%in%c("'0/1","'1/0"))) %>% 
  rename(gene_Var = "n()") %>% 
  group_by(SYMBOL) %>% 
  summarise(sum(gene_Var))
genes_twoVarAllele <- masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_a %>% 
  select(SYMBOL,Sample.GT) %>% 
  group_by(SYMBOL,Sample.GT) %>% 
  summarise(n()) %>% 
  filter((Sample.GT!="'0/1")&(Sample.GT!="'1/0")) %>% 
  mutate(gene_Var = `n()`*2) %>% 
  select(-`n()`) %>% 
  group_by(SYMBOL) %>% 
  summarise(sum(gene_Var))
genes <- full_join(genes_oneVarAllele,genes_twoVarAllele,by="SYMBOL",copy=FALSE,suffix=c(".x",".y")) %>% 
  mutate_all(funs(replace(., is.na(.), 0))) %>% 
  mutate(Total_Gene_Count=`sum(gene_Var).x`+`sum(gene_Var).y`) %>% 
  mutate(Sample_Gene_Freq=Total_Gene_Count/(n_distinct(masterfile_eoc_goodQ2$Sample)*2))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_2a <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_a, genes[,c(1,4:5)],by="SYMBOL",copy=FALSE)

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_a <- left_join(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_2a, GnomAD_stats_LOF_VEP[,c(2,30:41)],by="Feature",copy=FALSE) 
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a <- mutate_at(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_a,vars(starts_with("FILTER_")),funs(replace(., is.na(.), 0))) %>% 
  mutate_if(grepl("popmax$", names(.)),funs(ifelse(. == "NA", 0, as.numeric(.)))) %>% 
  mutate_at(vars(ends_with("popmax")),funs(replace(., is.na(.), 0)))

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_a <- 
  mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a,
         "Sample_Gene_LOF_Freq_Ratio_GnomAD"=Sample_Gene_Freq/masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a[,225],
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_0.005"=Sample_Gene_Freq/masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a[,231],
         "Ratio_Difference"=Sample_Gene_LOF_Freq_Ratio_GnomAD_0.005-Sample_Gene_LOF_Freq_Ratio_GnomAD, 
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE"=Sample_Gene_Freq/masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a[,228],
         "Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE_0.005"=Sample_Gene_Freq/masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_2a[,234],
         "Ratio_Difference_NFE"=Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE_0.005-Sample_Gene_LOF_Freq_Ratio_GnomAD_NFE) %>% 
  mutate(
    "Sample_Gene_LOF_AF_Ratio"=Sample_AF/GnomAD_v2.1_non_cancer_AF, 
    "Sample_Gene_LOF_AF_Ratio_NFE"=Sample_AF/GnomAD_v2.1_non_cancer_AF_nfe)

Attach other GnomAD data for DNA repair genes analysis

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_a,Total_Case_Alleles=(n_distinct(masterfile_eoc_goodQ2$Sample)*2)) %>% 
  left_join(GnomAD_stats_LOF_VEP[,c(2,6,10,14:29)],by="Feature",copy=FALSE) 
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_3a <- mutate(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a, MAX_AN=replace(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a$MAX_AN, is.na(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a$MAX_AN), max(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a$MAX_AN, na.rm=TRUE))) %>% 
  mutate(MAX_AN_NFE=replace(.$MAX_AN_NFE, is.na(.$MAX_AN_NFE), max(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_2a$MAX_AN_NFE, na.rm=TRUE)))

Extract DNA repair gene variants from sample data by repair pathway, and combine into one table

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_3a,
GnomAD_v2.1_non_cancer_AF_popmax<=0.005)
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_BER <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","XRCC1","PCNA","PARP1","PARP2","APEX1","FEN1","POLE","POLD1","LIG3","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","LIG1"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_MMR <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","POLD1"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_NER <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("RPA1","RPA2","RPA3","RPA4","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC1","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_HR <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","PALB2","MUS81","EME1","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_FA <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_NHEJ <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DR <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("MGMT","ALKBH2","ALKBH3"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_ALLrepair <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("XRCC1","PARP1","PARP2","APEX1","FEN1","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19","ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1","ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1","XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1","MGMT","ALKBH2","ALKBH3"))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_OTHER <- filter(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_a,SYMBOL%in%c("PAXIP1","BLM","KMT2C","CRIP1","CDK12","BAP1","BARD1","WRN","BUB1","CENPE","ZW10","TTK","KNTC1","AURKB","POLB","POLH","POLQ","TDP1","TDP2","NUDT1","DUT","RRM2B","POLG","REV3L","MAD2L2","REV1","POLI","POLK","POLL","POLM","POLN","TREX1","TREX2","APTX","SPO11","ENDOV","UBE2A","UBE2B","RAD18","SHPRH","HLTF","RNF168","SPRTN","RNF8","RNF4","UBE2V2","UBE2N","H2AFX","CHAF1A","SETMAR","RECQL4","MPLKIP","DCLRE1A","DCLRE1B","PRPF19","RECQL","RECQL5","HELQ","RDM1","NABP2","ATRIP","MDC1","RAD1","RAD9A","HUS1","RAD17","TP53","TP53BP1","TOPBP1","CLK2","PER1"))
DNArepair_other_list <- tibble("SYMBOL"=c("XRCC1","PARP1","PARP2","APEX1","FEN1","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19","ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1","ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86","C19orf40","MUS81","EME1","XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1","MGMT","ALKBH2","ALKBH3","PAXIP1","BLM","KMT2C","CRIP1","CDK12","BAP1","BARD1","WRN","BUB1","CENPE","ZW10","TTK","KNTC1","AURKB","POLB","POLH","POLQ","TDP1","TDP2","NUDT1","DUT","RRM2B","POLG","REV3L","MAD2L2","REV1","POLI","POLK","POLL","POLM","POLN","TREX1","TREX2","APTX","SPO11","ENDOV","UBE2A","UBE2B","RAD18","SHPRH","HLTF","RNF168","SPRTN","RNF8","RNF4","UBE2V2","UBE2N","H2AFX","CHAF1A","SETMAR","RECQL4","MPLKIP","DCLRE1A","DCLRE1B","PRPF19","RECQL","RECQL5","HELQ","RDM1","NABP2","ATRIP","MDC1","RAD1","RAD9A","HUS1","RAD17","TP53","TP53BP1","TOPBP1","CLK2","PER1"))
                                                                                                           masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other <- bind_rows(
  masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_ALLrepair,
  masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_OTHER) 

Extract DNA repair gene counts from sample data by repair pathway

genes_BER <- filter(genes,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","XRCC1","PCNA","PARP1","PARP2","APEX1","FEN1","POLE","POLD1","LIG3","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","LIG1"))
genes_MMR <- filter(genes,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","POLD1"))
genes_NER <- filter(genes,SYMBOL%in%c("RPA1","RPA2","RPA3","RPA4","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC1","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19"))
genes_HR <- filter(genes,SYMBOL%in%c("ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","PALB2","MUS81","EME1","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1"))
genes_FA <- filter(genes,SYMBOL%in%c("ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1"))
genes_NHEJ <- filter(genes,SYMBOL%in%c("XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1"))
genes_DR <- filter(genes,SYMBOL%in%c("MGMT","ALKBH2","ALKBH3"))
genes_ALLrepair <- filter(genes,SYMBOL%in%c("XRCC1","PARP1","PARP2","APEX1","FEN1","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19","ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1","ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1","XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1","MGMT","ALKBH2","ALKBH3"))
genes_OTHER <- filter(genes,SYMBOL%in%c("PAXIP1","BLM","KMT2C","CRIP1","CDK12","BAP1","BARD1","WRN","BUB1","CENPE","ZW10","TTK","KNTC1","AURKB","POLB","POLH","POLQ","TDP1","TDP2","NUDT1","DUT","RRM2B","POLG","REV3L","MAD2L2","REV1","POLI","POLK","POLL","POLM","POLN","TREX1","TREX2","APTX","SPO11","ENDOV","UBE2A","UBE2B","RAD18","SHPRH","HLTF","RNF168","SPRTN","RNF8","RNF4","UBE2V2","UBE2N","H2AFX","CHAF1A","SETMAR","RECQL4","MPLKIP","DCLRE1A","DCLRE1B","PRPF19","RECQL","RECQL5","HELQ","RDM1","NABP2","ATRIP","MDC1","RAD1","RAD9A","HUS1","RAD17","TP53","TP53BP1","TOPBP1","CLK2","PER1"))

Extract DNA repair genes from GnomAD data by repair pathway

GnomAD_stats_LOF_VEP_ENSTcanonical_BER <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","XRCC1","PCNA","PARP1","PARP2","APEX1","FEN1","POLE","POLD1","LIG3","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","LIG1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_MMR <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","POLD1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_NER <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("RPA1","RPA2","RPA3","RPA4","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC1","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_HR <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","PALB2","MUS81","EME1","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_FA <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_DR <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("MGMT","ALKBH2","ALKBH3")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("XRCC1","PARP1","PARP2","APEX1","FEN1","OGG1","UNG","SMUG1","MBD4","TDG","MUTYH","NTHL1","MPG","NEIL1","NEIL2","NEIL3","APEX2","PNKP","APLF","PARP3","MSH3","MSH4","MSH5","MLH3","PMS1","PMS2P3","EXO1","RFC1","RFC2","RFC3","RFC4","RFC5","PCNA","ERCC4","ERCC2","ERCC5","XPC","ERCC6","GTF2H2","ERCC3","XPA","RAD23B","POLE","POLD1","RAD23A","LIG3","CETN2","DDB1","DDB2","GTF2H1","GTF2H3","GTF2H4","GTF2H5","CDK7","CCNH","MNAT1","LIG1","ERCC8","UVSSA","XAB2","MMS19","ATM","RPA1","RPA2","RPA3","RPA4","RAD51","NBN","RAD50","CHEK2","MRE11A","RAD52","RAD51B","DMC1","XRCC2","XRCC3","RAD54L","RAD54B","SHFM1","RBBP8","SLX1A","SLX1B","GEN1","ATR","ERCC1","FANCA","FANCB","FANCC","FANCD2","FANCE","FANCF","FANCG","FANCI","FANCL","FANCM","PALB2","CHEK1","SLX4","FAN1","C1orf86"," C19orf40","MUS81","EME1","XRCC6","XRCC5","PRKDC","LIG4","XRCC4","DCLRE1C","NHEJ1","MGMT","ALKBH2","ALKBH3")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER <- filter(GnomAD_stats_LOF_VEP,SYMBOL%in%c("PAXIP1","BLM","KMT2C","CRIP1","CDK12","BAP1","BARD1","WRN","BUB1","CENPE","ZW10","TTK","KNTC1","AURKB","POLB","POLH","POLQ","TDP1","TDP2","NUDT1","DUT","RRM2B","POLG","REV3L","MAD2L2","REV1","POLI","POLK","POLL","POLM","POLN","TREX1","TREX2","APTX","SPO11","ENDOV","UBE2A","UBE2B","RAD18","SHPRH","HLTF","RNF168","SPRTN","RNF8","RNF4","UBE2V2","UBE2N","H2AFX","CHAF1A","SETMAR","RECQL4","MPLKIP","DCLRE1A","DCLRE1B","PRPF19","RECQL","RECQL5","HELQ","RDM1","NABP2","ATRIP","MDC1","RAD1","RAD9A","HUS1","RAD17","TP53","TP53BP1","TOPBP1","CLK2","PER1")) %>% filter(CANONICAL=="YES")
GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair_OTHER <- bind_rows(
  GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair,
  GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER)

Calculate sample and GnomAD totals for DNA repair genes and extract into new data frame

a <- c("BER","MMR","NER","HR","FA","NHEJ","DR","ALL","OTHER")
b <- c(sum(genes_BER$Total_Gene_Count),
       sum(genes_MMR$Total_Gene_Count),
       sum(genes_NER$Total_Gene_Count),
       sum(genes_HR$Total_Gene_Count),
       sum(genes_FA$Total_Gene_Count),
       sum(genes_NHEJ$Total_Gene_Count),
       sum(genes_DR$Total_Gene_Count),
       sum(genes_ALLrepair$Total_Gene_Count),
       sum(genes_OTHER$Total_Gene_Count))
c <- c((n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_BER)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_MMR)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_NER)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_HR)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_FA)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_DR)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair)),
       (n_distinct(masterfile_eoc_goodQ2$Sample)*2*nrow(GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER)))
d <- c(sum(GnomAD_stats_LOF_VEP_ENSTcanonical_BER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_MMR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_HR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_FA$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_DR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair$FILTER_RF_LOF_HIGHIMPACT_AC_0.005),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005))
e <- c(sum(GnomAD_stats_LOF_VEP_ENSTcanonical_BER$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_MMR$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NER$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_HR$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_FA$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_DR$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair$MAX_AN),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER$MAX_AN))
f <- c(sum(GnomAD_stats_LOF_VEP_ENSTcanonical_BER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_MMR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_HR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_FA$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_DR$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER$FILTER_RF_LOF_HIGHIMPACT_AC_0.005_NFE))
g <- c(sum(GnomAD_stats_LOF_VEP_ENSTcanonical_BER$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_MMR$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NER$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_HR$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_FA$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_NHEJ$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_DR$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_ALLrepair$MAX_AN_NFE),
       sum(GnomAD_stats_LOF_VEP_ENSTcanonical_OTHER$MAX_AN_NFE))

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary <- tibble("DNA_Repair_Pathway"=a,
                                                                                                            "Sample_Variant_Count"=b,
                                                                                                            "Total_Number_of_Sample_Alleles"=c,
                                                                                                            "GnomAD_Variant_Count"=d,
                                                                                                            "Total_Number_of_GnomAD_Variant_Alleles"=e,
                                                                                                            "GnomAD_Variant_Count_NFE"=f,
                                                                                                            "Total_Number_of_GnomAD_Variant_Alleles_NFE"=g)
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2 <-  add_row(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary,
        DNA_Repair_Pathway="TOTAL",
        Sample_Variant_Count=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,2]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,2]),
        Total_Number_of_Sample_Alleles=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,3]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,3]),
        GnomAD_Variant_Count=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,4]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,4]),
        Total_Number_of_GnomAD_Variant_Alleles=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,5]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,5]),
        GnomAD_Variant_Count_NFE=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,6]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,6]),
        Total_Number_of_GnomAD_Variant_Alleles_NFE=as.numeric(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[8,7]+masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary[9,7]))

Calculate Fisher’s test values for DNA repair genes

fisherresults_DNArepair <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2[,c(2,3,4,5)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$P_value_Fisher_0.005 = sapply(fisherresults_DNArepair,function(x) round(x$p.value,25))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$OR_0.005 = sapply(fisherresults_DNArepair,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$`95%CI_0.005` = sapply(fisherresults_DNArepair,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_DNArepair_NFE <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2[,c(2,3,6,7)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$P_value_Fisher_0.005_NFE = sapply(fisherresults_DNArepair_NFE,function(x) round(x$p.value,25))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$OR_0.005_NFE = sapply(fisherresults_DNArepair_NFE,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2$`95%CI_0.005_NFE` = sapply(fisherresults_DNArepair_NFE,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_DNArepair_other <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other[,c(221,229,243,244)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$P_value_Fisher_0.005 = sapply(fisherresults_DNArepair_other,function(x) round(x$p.value,12))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$OR_0.005 = sapply(fisherresults_DNArepair_other,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$`95%CI_0.005` = sapply(fisherresults_DNArepair_other,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

fisherresults_DNArepair_other_NFE <- apply(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other[,c(221,232,243,245)],1,function(x) {fisher.test(rbind(x[1:2],c(x[3]-x[1],x[4]-x[2])))})

masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$P_value_Fisher_0.005_NFE = sapply(fisherresults_DNArepair_other_NFE,function(x) round(x$p.value,12))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$OR_0.005_NFE = sapply(fisherresults_DNArepair_other_NFE,function(x) round(x$estimate,4))
masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other$`95%CI_0.005_NFE` = sapply(fisherresults_DNArepair_other_NFE,function(x) paste(round(x$conf.int[1:2],2),collapse="~"))

Remove redundant data objects and output variants and summary results table for DNA repair genes

rm(list=(ls(pattern="^genes")))
rm(list=(ls(pattern="^variants")))
rm(list=(ls(pattern="^fisherresults")))

write_excel_csv(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other,path="masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_other.csv",na=".",append=FALSE,col_names=TRUE)
write_excel_csv(masterfile_eoc_goodQ2_HIGH_ENSTcanonical_sampleAF0.01_withGnomADstats_ratios_popmax0.005_DNArepair_summary2,path="masterfile_eoc_DNArepair_fisherresults.csv",na=".",append=FALSE,col_names=TRUE)
LS0tCnRpdGxlOiAiRmlsdGVyaW5nIGFuZCByYW5raW5nIFIgc2NyaXB0IGZvciAnRXhvbWUgc2VxdWVuY2luZyBvZiBmYW1pbGlhbCBoaWdoLWdyYWRlIHNlcm91cyBvdmFyaWFuIGNhcmNpbm9tYSByZXZlYWxzIGhldGVyb2dlbmVpdHkgZm9yIHJhcmUgY2FuZGlkYXRlIHN1c2NlcHRpYmlsaXR5IGdlbmVzJyAoU3VicmFtYW5pYW4gZXQgYWwuLCBOYXR1cmUgQ29tbXVuaWNhdGlvbnMsIDIwMjApIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpBTEwgSU1QT1JURUQgRklMRVMgTVVTVCBCRSBJTiBUSEUgU0FNRSBESVJFQ1RPUlkgQVMgVEhJUyBTQ1JJUFQKCkxvYWQgdGlkeXZlcnNlIHBhY2thZ2UKYGBge3J9CmxpYnJhcnkoInRpZHl2ZXJzZSIpCmBgYAoKSW1wb3J0IHJhdyB2Y2YgZGF0YSBmcm9tICJtYXN0ZXJmaWxlIiAodmNmIGZpbGUgb3V0cHV0IGZyb20gYWxpZ25tZW50LCB2YXJpYW50IGNhbGxlciBhbmQgYW5ub3RhdGlvbiBwaXBlbGluZS0gYXZhaWxhYmxlIGZyb20gYXV0aG9ycyBvbiByZWFzb25hYmxlIHJlcXVlc3QpIGFuZCBleGNsdWRlIHZhcmlhbnRzIHdpdGggR25vbUFEIG5vbi1jYW5jZXIgQUYgPiAwLjAwNQpgYGB7cn0KbWFzdGVyZmlsZV9lb2MgPC0gcmVhZC5kZWxpbSgibWFzdGVyZmlsZS50c3YiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPU5VTEwsIG5hLnN0cmluZ3MgPSAiLiIsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpICU+JSAKICBkcGx5cjo6cmVuYW1lKCJTYW1wbGUiPSJYLlNhbXBsZSIpICU+JSAKICBmaWx0ZXIoR25vbUFEX3YyLjFfbm9uX2NhbmNlcl9BRjw9MC4wMDUpCmBgYAoKQXBwZW5kIHBhdGllbnQgcGF0aG9sb2d5IGRhdGEgKGF2YWlsYWJsZSBmcm9tIGF1dGhvcnMgb24gcmVhc29uYWJsZSByZXF1ZXN0KQpgYGB7cn0KT3ZDYV9QYXRoX0RhdGEgPC0gcmVhZC5kZWxpbSgiT3ZDYV9QYXRoX0RhdGEudHh0IiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz1OVUxMLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJTYW1wbGUiPUV4b21lLklEKQptYXN0ZXJmaWxlX2VvYzIgPC0gbGVmdF9qb2luKG1hc3RlcmZpbGVfZW9jLE92Q2FfUGF0aF9EYXRhLGJ5PSJTYW1wbGUiLGNvcHk9RkFMU0UpCnJtKE92Q2FfUGF0aF9EYXRhKQpgYGAKCkV4Y2x1ZGUgbG93LXF1YWxpdHkgdmFyaWFudHMgYW5kIEdub21BRCBSRi9JbmJyZWVkaW5nQ29lZmYtZmxhZ2dlZCB2YXJpYW50cwpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jMiwgKFFVQUw+PTMwKSYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElkZW50aWZpZWQhPSJGaWx0ZXJlZEluQWxsIikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTYW1wbGUuUE1DRFA+PTEwKSYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNhbXBsZS5QTUNGUkVRPj0wLjI1KSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCFzdHJfZGV0ZWN0KEdub21BRF92Mi4xX0ZJTFRFUl9leG9tZSwiSW5icmVlZGluZ0NvZWZmIikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyX2RldGVjdChHbm9tQURfdjIuMV9GSUxURVJfZXhvbWUsIlJGIikpfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShHbm9tQURfdjIuMV9GSUxURVJfZXhvbWUpKSAlPiUgCiAgZmlsdGVyKCghc3RyX2RldGVjdChHbm9tQURfdjIuMV9GSUxURVJfZ2Vub21lLCJJbmJyZWVkaW5nQ29lZmYiKSYKICAgICAgICAgICAgIXN0cl9kZXRlY3QoR25vbUFEX3YyLjFfRklMVEVSX2dlbm9tZSwiUkYiKSl8CiAgICAgICAgICAgaXMubmEoR25vbUFEX3YyLjFfRklMVEVSX2dlbm9tZSkpCmBgYAoKRXhjbHVkZSBvdGhlciBtdXRhdGlvbiArdmUgc2FtcGxlcyAoTUxIMS9NU0gyL01TSDYvUE1TMiwgVFA1MywgUkFENTFDL0QsIEJSSVAxKQpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyIDwtIGZpbHRlcihtYXN0ZXJmaWxlX2VvY19nb29kUSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLVAxUlVDIikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLTA2Tko0IikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLTRXSUZGIikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLUpZRkpHIikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLUtKTTI3IikmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2FtcGxlIT0iUFVCLVJUN1JVIikpCmBgYAoKRXhjbHVkZSBWRVAgTU9ERVJBVEUgaW1wYWN0IHZhcmlhbnRzCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSCA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyLCBJTVBBQ1Q9PSJISUdIIikKYGBgCgpTZXBhcmF0ZSBFbnNlbWJsIGNhbm9uaWNhbCB2YXJpYW50cwpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbCA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0gsQ0FOT05JQ0FMPT0iWUVTIikgCmBgYAoKU2FtcGxlIHZhcmlhbnQgY291bnRzIGFuZCBBRnMKYGBge3J9CnZhcmlhbnRzX2hldGVyb3p5Z291cyA8LSBtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsICU+JSAKICBzZWxlY3QoSEdWU2MsU2FtcGxlLkdUKSAlPiUgCiAgZ3JvdXBfYnkoSEdWU2MsU2FtcGxlLkdUKSAlPiUgCiAgc3VtbWFyaXNlKG4oKSkgJT4lIAogIGZpbHRlcigoU2FtcGxlLkdUJWluJWMoIicwLzEiLCInMS8wIikpKSAlPiUgCiAgcmVuYW1lKGFsbGVsZXMgPSAibigpIikgJT4lIAogIGdyb3VwX2J5KEhHVlNjKSAlPiUgCiAgc3VtbWFyaXNlKHN1bShhbGxlbGVzKSkKdmFyaWFudHNfaG9tb3p5Z291cyA8LSBtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsICU+JSAKICBzZWxlY3QoSEdWU2MsU2FtcGxlLkdUKSAlPiUgCiAgZ3JvdXBfYnkoSEdWU2MsU2FtcGxlLkdUKSAlPiUgCiAgc3VtbWFyaXNlKG4oKSkgJT4lIAogIGZpbHRlcigoU2FtcGxlLkdUIT0iJzAvMSIpJihTYW1wbGUuR1QhPSInMS8wIikpICU+JSAKICBtdXRhdGUoYWxsZWxlcyA9IGBuKClgKjIpICU+JSAKICBzZWxlY3QoLWBuKClgKSAlPiUgCiAgZ3JvdXBfYnkoSEdWU2MpICU+JSAKICBzdW1tYXJpc2Uoc3VtKGFsbGVsZXMpKQp2YXJpYW50cyA8LSBmdWxsX2pvaW4odmFyaWFudHNfaGV0ZXJvenlnb3VzLHZhcmlhbnRzX2hvbW96eWdvdXMsYnk9IkhHVlNjIixjb3B5PUZBTFNFLHN1ZmZpeD1jKCIueCIsIi55IikpICU+JQogIG11dGF0ZV9hbGwoZnVucyhyZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSkpICU+JSAKICBtdXRhdGUoVG90YWxfQWxsZWxlX0NvdW50PWBzdW0oYWxsZWxlcykueGArYHN1bShhbGxlbGVzKS55YCkgJT4lIAogIG11dGF0ZShTYW1wbGVfQUY9VG90YWxfQWxsZWxlX0NvdW50LyhuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsXzIgPC0gbGVmdF9qb2luKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWwsdmFyaWFudHNbLGMoMSw0OjUpXSxieT0iSEdWU2MiLGNvcHk9RkFMU0UpCmBgYAoKRXhjbHVkZSB2YXJpYW50cyB3aXRoIHNhbXBsZSBBRiA+IDAuMDHMmwpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDEgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfMixTYW1wbGVfQUYgPCAwLjAxKQpgYGAKClNhbXBsZSBnZW5lIGNvdW50cyBhbmQgZnJlcXVlbmNpZXMKYGBge3J9CmdlbmVzX29uZVZhckFsbGVsZSA8LSBtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMSAlPiUKICBzZWxlY3QoU1lNQk9MLEdlbmUsU2FtcGxlLkdUKSAlPiUgCiAgZ3JvdXBfYnkoR2VuZSxTYW1wbGUuR1QpICU+JSAKICBzdW1tYXJpc2UobigpKSAlPiUgCiAgZmlsdGVyKChTYW1wbGUuR1QlaW4lYygiJzAvMSIsIicxLzAiKSkpICU+JSAKICByZW5hbWUoZ2VuZV9WYXIgPSAibigpIikgJT4lIAogIGdyb3VwX2J5KEdlbmUpICU+JSAKICBzdW1tYXJpc2Uoc3VtKGdlbmVfVmFyKSkKZ2VuZXNfdHdvVmFyQWxsZWxlIDwtIG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxICU+JQogIHNlbGVjdChTWU1CT0wsR2VuZSxTYW1wbGUuR1QpICU+JSAKICBncm91cF9ieShHZW5lLFNhbXBsZS5HVCkgJT4lIAogIHN1bW1hcmlzZShuKCkpICU+JSAKICBmaWx0ZXIoKFNhbXBsZS5HVCE9IicwLzEiKSYoU2FtcGxlLkdUIT0iJzEvMCIpKSAlPiUgCiAgbXV0YXRlKGdlbmVfVmFyID0gYG4oKWAqMikgJT4lIAogIHNlbGVjdCgtYG4oKWApICU+JSAKICBncm91cF9ieShHZW5lKSAlPiUgCiAgc3VtbWFyaXNlKHN1bShnZW5lX1ZhcikpCmdlbmVzIDwtIGZ1bGxfam9pbihnZW5lc19vbmVWYXJBbGxlbGUsZ2VuZXNfdHdvVmFyQWxsZWxlLGJ5PSJHZW5lIixjb3B5PUZBTFNFLHN1ZmZpeD1jKCIueCIsIi55IikpICU+JSAKICBtdXRhdGVfYWxsKGZ1bnMocmVwbGFjZSguLCBpcy5uYSguKSwgMCkpKSAlPiUgCiAgbXV0YXRlKFRvdGFsX0dlbmVfQ291bnQ9YHN1bShnZW5lX1ZhcikueGArYHN1bShnZW5lX1ZhcikueWApICU+JSAKICBtdXRhdGUoU2FtcGxlX0dlbmVfRnJlcT1Ub3RhbF9HZW5lX0NvdW50LyhuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV8yIDwtIGxlZnRfam9pbihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMSwgZ2VuZXNbLGMoMSw0OjUpXSxieT0iR2VuZSIsY29weT1GQUxTRSkKYGBgCgpBZGQgR25vbUFEIGFnZ3JlZ2F0ZWQgZ2VuZS1sZXZlbCB2YXJpYW50IGZyZXF1ZW5jeSBkYXRhIChhdmFpbGFibGUgZnJvbSBhdXRob3JzIG9uIHJlYXNvbmFibGUgcmVxdWVzdCkKYGBge3J9Ckdub21BRF9zdGF0c19MT0ZfVkVQIDwtIHJlYWQuZGVsaW0oIkdub21BRF9zdGF0c19MT0ZfVkVQLnRzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9TlVMTCwgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkKCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0cyA8LSBsZWZ0X2pvaW4obWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfMiwgR25vbUFEX3N0YXRzX0xPRl9WRVBbLGMoMiwzMDo0MSldLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKSAKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzMiA8LSBtdXRhdGVfYXQobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzLHZhcnMoc3RhcnRzX3dpdGgoIkZJTFRFUl8iKSksZnVucyhyZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSkpICU+JSAKICBtdXRhdGVfaWYoZ3JlcGwoInBvcG1heCQiLCBuYW1lcyguKSksZnVucyhpZmVsc2UoLiA9PSAiTkEiLCAwLCBhcy5udW1lcmljKC4pKSkpICU+JSAKICBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoInBvcG1heCIpKSxmdW5zKHJlcGxhY2UoLiwgaXMubmEoLiksIDApKSkKYGBgCgpDYWxjdWxhdGUgU2FtcGxlL0dub21BRCBnZW5lIGZyZXF1ZW5jeSByYXRpb3MgZm9yIHRvdGFsIGFuZCBORkUgR25vbUFEIGZpZ3VyZXMsIGluY2x1ZGluZyBhbmQgZXhjbHVkaW5nIHZhcmlhbnRzIHdpdGggQUYgPiAwLjAwNQpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvcyA8LSAKICBtdXRhdGUobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzMiwgCiAgICAgICAgICJTYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQUQiPVNhbXBsZV9HZW5lX0ZyZXEvRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzEuMF9BREosCiAgICAgICAgICJTYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQURfMC4wMDUiPVNhbXBsZV9HZW5lX0ZyZXEvRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzAuMDA1X0FESiwKICAgICAgICAgIlJhdGlvX0RpZmZlcmVuY2UiPVNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRF8wLjAwNS1TYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQUQsIAogICAgICAgICAiU2FtcGxlX0dlbmVfTE9GX0ZyZXFfUmF0aW9fR25vbUFEX05GRSI9U2FtcGxlX0dlbmVfRnJlcS9GSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUZfMS4wX05GRV9BREosCiAgICAgICAgICJTYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQURfTkZFXzAuMDA1Ij1TYW1wbGVfR2VuZV9GcmVxL0ZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BRl8wLjAwNV9ORkVfQURKLAogICAgICAgICAiUmF0aW9fRGlmZmVyZW5jZV9ORkUiPVNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRF9ORkVfMC4wMDUtU2FtcGxlX0dlbmVfTE9GX0ZyZXFfUmF0aW9fR25vbUFEX05GRSkKYGBgCgpDYWxjdWxhdGUgU2FtcGxlL0dub21BRCBhbGxlbGUgZnJlcXVlbmN5IHJhdGlvcyAKYGBge3J9Cm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3MyIDwtIG11dGF0ZShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zLCAiU2FtcGxlX0dlbmVfTE9GX0FGX1JhdGlvIj1TYW1wbGVfQUYvR25vbUFEX3YyLjFfbm9uX2NhbmNlcl9BRiwgCiJTYW1wbGVfR2VuZV9MT0ZfQUZfUmF0aW9fTkZFIj1TYW1wbGVfQUYvR25vbUFEX3YyLjFfbm9uX2NhbmNlcl9BRl9uZmUpCmBgYAoKQ3JlYXRlIGRhdGEgZnJhbWVzIHdpdGggQWdpbGVudCBTdXJlU2VsZWN0IHdob2xlIGV4b21lIGdlbmVzIChhbGwgRU5TVCwgcHJvdGVpbi1jb2Rpbmcgb25seSBhbmQgbm9uLXByb3RlaW4tY29kaW5nLSBmaWxlcyBhdmFpbGFibGUgZnJvbSBhdXRob3JzIG9uIHJlYXNvbmFibGUgcmVxdWVzdCkgZm9yIHdhdGVyZmFsbCBwbG90CmBgYHtyfQplbnNlbWJsX2Jpb3R5cGVzIDwtIHJlYWQuZGVsaW0oImVuc2VtYmxfYmlvdHlwZXMudHN2Iiwgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkgJT4lIAogIHNlbGVjdChlbnNlbWJsX3RyYW5zY3JpcHRfaWQsdHJhbnNjcmlwdF9iaW90eXBlKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiRmVhdHVyZSI9ImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsIkJJT1RZUEUiPSJ0cmFuc2NyaXB0X2Jpb3R5cGUiKQpHbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX2FsbCA8LSByZWFkLmRlbGltKCJHbm9tQUQuZ2VuZS5zdGF0cy52Mi5SRi5vbmx5LmFnaWxlbnQudjYub25seS50c3YiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPU5VTEwsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpICU+JSAKICBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIlNZTUJPTCI9IlguU3ltYm9sIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIkdlbmUiPSJFTlNHIikgJT4lIAogIGxlZnRfam9pbihlbnNlbWJsX2Jpb3R5cGVzLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKQpHbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX3Byb3RlaW5fY29kaW5nIDwtIHJlYWQuZGVsaW0oIkdub21BRC5nZW5lLnN0YXRzLnYyLlJGLm9ubHkuYWdpbGVudC52Ni5vbmx5LnRzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9TlVMTCwgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSkgJT4lIAogIGZpbHRlcihDQU5PTklDQUw9PSJZRVMiKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiU1lNQk9MIj0iWC5TeW1ib2wiKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiR2VuZSI9IkVOU0ciKSAlPiUgCiAgbGVmdF9qb2luKGVuc2VtYmxfYmlvdHlwZXMsYnk9IkZlYXR1cmUiLGNvcHk9RkFMU0UpICU+JSAKICBmaWx0ZXIoQklPVFlQRSVpbiVjKCJwcm90ZWluX2NvZGluZyIpKQpHbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX25vbl9wcm90ZWluX2NvZGluZyA8LSByZWFkLmRlbGltKCJHbm9tQUQuZ2VuZS5zdGF0cy52Mi5SRi5vbmx5LmFnaWxlbnQudjYub25seS50c3YiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPU5VTEwsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpICU+JSAKICBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIlNZTUJPTCI9IlguU3ltYm9sIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIkdlbmUiPSJFTlNHIikgJT4lIAogIGxlZnRfam9pbihlbnNlbWJsX2Jpb3R5cGVzLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKSAlPiUgCiAgZmlsdGVyKCFCSU9UWVBFJWluJWMoInByb3RlaW5fY29kaW5nIikpCgphbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0IDwtIHRpYmJsZSgiU1lNQk9MIj1Hbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX2FsbCRTWU1CT0wsIkdlbmUiPUdub21BRF9zdGF0c19BZ2lsZW50U1N2Nl9MT0ZfVkVQX0VOU1RjYW5vbmljYWxfYWxsJEdlbmUsIkZlYXR1cmUiPUdub21BRF9zdGF0c19BZ2lsZW50U1N2Nl9MT0ZfVkVQX0VOU1RjYW5vbmljYWxfYWxsJEZlYXR1cmUpICU+JSAKICBkaXN0aW5jdCgua2VlcF9hbGw9VFJVRSkgJT4lIAogIGFycmFuZ2UoU1lNQk9MKQphbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0X3Byb3RlaW5fY29kaW5nX29ubHkgPC0gdGliYmxlKCJTWU1CT0wiPUdub21BRF9zdGF0c19BZ2lsZW50U1N2Nl9MT0ZfVkVQX0VOU1RjYW5vbmljYWxfcHJvdGVpbl9jb2RpbmckU1lNQk9MLCJHZW5lIj1Hbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX3Byb3RlaW5fY29kaW5nJEdlbmUsIkZlYXR1cmUiPUdub21BRF9zdGF0c19BZ2lsZW50U1N2Nl9MT0ZfVkVQX0VOU1RjYW5vbmljYWxfcHJvdGVpbl9jb2RpbmckRmVhdHVyZSkgJT4lIAogIGRpc3RpbmN0KC5rZWVwX2FsbD1UUlVFKSAlPiUgCiAgYXJyYW5nZShTWU1CT0wpCmFsbEdlbmVzX0FnaWxlbnRTU3Y2X2xpc3Rfbm9uX3Byb3RlaW5fY29kaW5nX29ubHkgPC0gdGliYmxlKCJTWU1CT0wiPUdub21BRF9zdGF0c19BZ2lsZW50U1N2Nl9MT0ZfVkVQX0VOU1RjYW5vbmljYWxfbm9uX3Byb3RlaW5fY29kaW5nJFNZTUJPTCwiR2VuZSI9R25vbUFEX3N0YXRzX0FnaWxlbnRTU3Y2X0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9ub25fcHJvdGVpbl9jb2RpbmckR2VuZSwiRmVhdHVyZSI9R25vbUFEX3N0YXRzX0FnaWxlbnRTU3Y2X0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9ub25fcHJvdGVpbl9jb2RpbmckRmVhdHVyZSkgJT4lIAogIGRpc3RpbmN0KC5rZWVwX2FsbD1UUlVFKSAlPiUgCiAgYXJyYW5nZShTWU1CT0wpCgphbGxHZW5lc19tYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9saXN0IDwtIHRpYmJsZSgiU1lNQk9MIj1tYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zMiRTWU1CT0wsIkdlbmUiPW1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3MyJEdlbmUsIkJJT1RZUEUiPW1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3MyJEJJT1RZUEUpICU+JSAKICBkaXN0aW5jdCgua2VlcF9hbGw9VFJVRSkgJT4lIAogIGFycmFuZ2UoU1lNQk9MKQphbGxHZW5lc19tYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2xpc3QgPC0gdGliYmxlKCJTWU1CT0wiPW1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3MyJFNZTUJPTCwiR2VuZSI9bWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvczIkR2VuZSwiQklPVFlQRSI9bWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvczIkQklPVFlQRSkgJT4lIAogIGRpc3RpbmN0KC5rZWVwX2FsbD1UUlVFKSAlPiUgCiAgZmlsdGVyKEJJT1RZUEUlaW4lYygicHJvdGVpbl9jb2RpbmciKSkgJT4lIAogIGFycmFuZ2UoU1lNQk9MKQoKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lcyA8LSBtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zMiAlPiUgCiAgbXV0YXRlKFRvdGFsX0Nhc2VfQWxsZWxlcz0obl9kaXN0aW5jdChtYXN0ZXJmaWxlX2VvY19nb29kUTIkU2FtcGxlKSoyKSkgJT4lIAogIHNlbGVjdChTWU1CT0wsR2VuZSxUb3RhbF9HZW5lX0NvdW50LFRvdGFsX0Nhc2VfQWxsZWxlcykgJT4lIAogIGRpc3RpbmN0KFNZTUJPTCxHZW5lLFRvdGFsX0dlbmVfQ291bnQsVG90YWxfQ2FzZV9BbGxlbGVzKSAKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lczIgPC0gYmluZF9yb3dzKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMsIGFudGlfam9pbihhbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0LHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMsYnk9IkdlbmUiKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKCJUb3RhbF9HZW5lX0NvdW50IiksZnVucyhyZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSkpICU+JSAKICBtdXRhdGVfYXQodmFycygiVG90YWxfQ2FzZV9BbGxlbGVzIiksZnVucyhyZXBsYWNlKC4sIGlzLm5hKC4pLCBuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIpKSkKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lczMgPC0gcmlnaHRfam9pbigKICB3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2FsbEdlbmVzMiwKICBHbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX2FsbCwKICBieT0iR2VuZSIsY29weT1GQUxTRSkgJT4lIAogIHNlbGVjdCgiU1lNQk9MLngiLCJHZW5lIiwiVG90YWxfR2VuZV9Db3VudCIsIlRvdGFsX0Nhc2VfQWxsZWxlcyIsIkZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNSIsIkZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9ORkUiLCJNQVhfQU4iLCJNQVhfQU5fTkZFIiwiRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzAuMDA1X0FESiIsIkZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BRl8wLjAwNV9ORkVfQURKIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoIlNZTUJPTCI9IlNZTUJPTC54IikgJT4lCiAgbXV0YXRlKEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9BREo9cm91bmQoKE1BWF9BTipGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUZfMC4wMDVfQURKKSkpICU+JSAKICBtdXRhdGUoRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRV9BREo9cm91bmQoKE1BWF9BTl9ORkUqRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzAuMDA1X05GRV9BREopKSkgJT4lIAogIGRpc3RpbmN0KC5rZWVwX2FsbD1UUlVFKQoKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzIDwtIG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3MyICU+JSAKICBtdXRhdGUoVG90YWxfQ2FzZV9BbGxlbGVzPShuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIpKSAlPiUgCiAgZmlsdGVyKEJJT1RZUEUlaW4lYygicHJvdGVpbl9jb2RpbmciKSkgJT4lIAogIHNlbGVjdChTWU1CT0wsR2VuZSxUb3RhbF9HZW5lX0NvdW50LFRvdGFsX0Nhc2VfQWxsZWxlcykgJT4lIAogIGRpc3RpbmN0KFNZTUJPTCxHZW5lLFRvdGFsX0dlbmVfQ291bnQsVG90YWxfQ2FzZV9BbGxlbGVzKSAKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMiA8LSBiaW5kX3Jvd3Mod2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzLCBhbnRpX2pvaW4oYWxsR2VuZXNfQWdpbGVudFNTdjZfbGlzdF9wcm90ZWluX2NvZGluZ19vbmx5LHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lcyxieT0iR2VuZSIpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoIlRvdGFsX0dlbmVfQ291bnQiKSxmdW5zKHJlcGxhY2UoLiwgaXMubmEoLiksIDApKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKCJUb3RhbF9DYXNlX0FsbGVsZXMiKSxmdW5zKHJlcGxhY2UoLiwgaXMubmEoLiksIG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMikpKQp3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfYWxsR2VuZXMzIDwtIHJpZ2h0X2pvaW4oCiAgd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMiwKICBHbm9tQURfc3RhdHNfQWdpbGVudFNTdjZfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX3Byb3RlaW5fY29kaW5nLAogIGJ5PSJHZW5lIixjb3B5PUZBTFNFKSAlPiUgCiAgc2VsZWN0KCJTWU1CT0wueCIsIkdlbmUiLCJUb3RhbF9HZW5lX0NvdW50IiwiVG90YWxfQ2FzZV9BbGxlbGVzIiwiRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1IiwiRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRSIsIk1BWF9BTiIsIk1BWF9BTl9ORkUiLCJGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUZfMC4wMDVfQURKIiwiRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzAuMDA1X05GRV9BREoiKSAlPiUgCiAgZHBseXI6OnJlbmFtZSgiU1lNQk9MIj0iU1lNQk9MLngiKSAlPiUgCiAgbXV0YXRlKEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9BREo9cm91bmQoKE1BWF9BTipGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUZfMC4wMDVfQURKKSkpICU+JSAKICBtdXRhdGUoRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRV9BREo9cm91bmQoKE1BWF9BTl9ORkUqRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FGXzAuMDA1X05GRV9BREopKSkgJT4lIAogIGRpc3RpbmN0KC5rZWVwX2FsbD1UUlVFKQpgYGAKCkNhbGN1bGF0ZSBGaXNoZXIncyB0ZXN0IHZhbHVlcwpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19maXNoZXJyZXN1bHRzIDwtIG11dGF0ZShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zMixUb3RhbF9DYXNlX0FsbGVsZXM9KG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMikpICU+JSAKICBsZWZ0X2pvaW4oR25vbUFEX3N0YXRzX0xPRl9WRVBbLGMoMiw2LDEwLDE0OjI5KV0sYnk9IkZlYXR1cmUiLGNvcHk9RkFMU0UpIAptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyIDwtIG11dGF0ZShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMsIE1BWF9BTj1yZXBsYWNlKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0cyRNQVhfQU4sIGlzLm5hKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0cyRNQVhfQU4pLCBtYXgobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19maXNoZXJyZXN1bHRzJE1BWF9BTiwgbmEucm09VFJVRSkpKSAlPiUgCiAgbXV0YXRlKE1BWF9BTl9ORkU9cmVwbGFjZSguJE1BWF9BTl9ORkUsIGlzLm5hKC4kTUFYX0FOX05GRSksIG1heChtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMkTUFYX0FOX05GRSwgbmEucm09VFJVRSkpKQoKZmlzaGVycmVzdWx0c19FTlNUIDwtIGFwcGx5KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0czJbLGMoMjIxLDIyOSwyNDMsMjQ0KV0sMSxmdW5jdGlvbih4KSB7ZmlzaGVyLnRlc3QocmJpbmQoeFsxOjJdLGMoeFszXS14WzFdLHhbNF0teFsyXSkpKX0pCgptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyJFBfdmFsdWVfRmlzaGVyXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRU5TVCxmdW5jdGlvbih4KSByb3VuZCh4JHAudmFsdWUsMTIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyJE9SXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRU5TVCxmdW5jdGlvbih4KSByb3VuZCh4JGVzdGltYXRlLDQpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyJGA5NSVDSV8wLjAwNWAgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19FTlNULGZ1bmN0aW9uKHgpIHBhc3RlKHJvdW5kKHgkY29uZi5pbnRbMToyXSwyKSxjb2xsYXBzZT0ifiIpKQoKZmlzaGVycmVzdWx0czJfRU5TVCA8LSBhcHBseShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyWyxjKDIyMSwyMzIsMjQzLDI0NSldLDEsZnVuY3Rpb24oeCkge2Zpc2hlci50ZXN0KHJiaW5kKHhbMToyXSxjKHhbM10teFsxXSx4WzRdLXhbMl0pKSl9KQoKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19maXNoZXJyZXN1bHRzMiRQX3ZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUgPSBzYXBwbHkoZmlzaGVycmVzdWx0czJfRU5TVCxmdW5jdGlvbih4KSByb3VuZCh4JHAudmFsdWUsMTIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMyJE9SXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzMl9FTlNULGZ1bmN0aW9uKHgpIHJvdW5kKHgkZXN0aW1hdGUsNCkpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0czIkYDk1JUNJXzAuMDA1X05GRWAgPSBzYXBwbHkoZmlzaGVycmVzdWx0czJfRU5TVCxmdW5jdGlvbih4KSBwYXN0ZShyb3VuZCh4JGNvbmYuaW50WzE6Ml0sMiksY29sbGFwc2U9In4iKSkKYGBgCgpDYWxjdWxhdGUgRmlzaGVyJ3MgdGVzdCB2YWx1ZXMgKHdhdGVyZmFsbCBwbG90KQpgYGB7cn0KZmlzaGVycmVzdWx0c19hbGxHZW5lc193YXRlcmZhbGwgPC0gYXBwbHkod2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lczNbLGMoMyw1LDQsNyldLDEsZnVuY3Rpb24oeCkge2Zpc2hlci50ZXN0KHJiaW5kKHhbMToyXSxjKGFicyh4WzNdLXhbMV0pLGFicyh4WzRdLXhbMl0pKSkpfSkKCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJFBfdmFsdWVfRmlzaGVyXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfYWxsR2VuZXNfd2F0ZXJmYWxsLGZ1bmN0aW9uKHgpIHJvdW5kKHgkcC52YWx1ZSwxNSkpCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJE9SXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfYWxsR2VuZXNfd2F0ZXJmYWxsLGZ1bmN0aW9uKHgpIHJvdW5kKHgkZXN0aW1hdGUsMTUpKQp3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2FsbEdlbmVzMyRgOTUlQ0lfMC4wMDVgID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfYWxsR2VuZXNfd2F0ZXJmYWxsLGZ1bmN0aW9uKHgpIHBhc3RlKHJvdW5kKHgkY29uZi5pbnRbMToyXSwyKSxjb2xsYXBzZT0ifiIpKQoKZmlzaGVycmVzdWx0c19ORkVfd2F0ZXJmYWxsIDwtIGFwcGx5KHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzWyxjKDMsNiw0LDgpXSwxLGZ1bmN0aW9uKHgpIHtmaXNoZXIudGVzdChyYmluZCh4WzE6Ml0sYyhhYnMoeFszXS14WzFdKSxhYnMoeFs0XS14WzJdKSkpKX0pCgp3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2FsbEdlbmVzMyRQX3ZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19ORkVfd2F0ZXJmYWxsLGZ1bmN0aW9uKHgpIHJvdW5kKHgkcC52YWx1ZSwxNSkpCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJE9SXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX05GRV93YXRlcmZhbGwsZnVuY3Rpb24oeCkgcm91bmQoeCRlc3RpbWF0ZSwxNSkpCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJGA5NSVDSV8wLjAwNV9ORkVgID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfTkZFX3dhdGVyZmFsbCxmdW5jdGlvbih4KSBwYXN0ZShyb3VuZCh4JGNvbmYuaW50WzE6Ml0sMiksY29sbGFwc2U9In4iKSkKCmZpc2hlcnJlc3VsdHNfYmlvdHlwZV9hbGxHZW5lc193YXRlcmZhbGwgPC0gYXBwbHkod2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzM1ssYygzLDUsNCw3KV0sMSxmdW5jdGlvbih4KSB7ZmlzaGVyLnRlc3QocmJpbmQoeFsxOjJdLGMoYWJzKHhbM10teFsxXSksYWJzKHhbNF0teFsyXSkpKSl9KQoKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMyRQX3ZhbHVlX0Zpc2hlcl8wLjAwNSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX2Jpb3R5cGVfYWxsR2VuZXNfd2F0ZXJmYWxsLGZ1bmN0aW9uKHgpIHJvdW5kKHgkcC52YWx1ZSwxNSkpCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczMkT1JfMC4wMDUgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19iaW90eXBlX2FsbEdlbmVzX3dhdGVyZmFsbCxmdW5jdGlvbih4KSByb3VuZCh4JGVzdGltYXRlLDE1KSkKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMyRgOTUlQ0lfMC4wMDVgID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfYmlvdHlwZV9hbGxHZW5lc193YXRlcmZhbGwsZnVuY3Rpb24oeCkgcGFzdGUocm91bmQoeCRjb25mLmludFsxOjJdLDIpLGNvbGxhcHNlPSJ+IikpCgpmaXNoZXJyZXN1bHRzX2Jpb3R5cGVfTkZFX3dhdGVyZmFsbCA8LSBhcHBseSh3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfYWxsR2VuZXMzWyxjKDMsNiw0LDgpXSwxLGZ1bmN0aW9uKHgpIHtmaXNoZXIudGVzdChyYmluZCh4WzE6Ml0sYyhhYnMoeFszXS14WzFdKSxhYnMoeFs0XS14WzJdKSkpKX0pCgp3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfYWxsR2VuZXMzJFBfdmFsdWVfRmlzaGVyXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX2Jpb3R5cGVfTkZFX3dhdGVyZmFsbCxmdW5jdGlvbih4KSByb3VuZCh4JHAudmFsdWUsMTUpKQp3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfYWxsR2VuZXMzJE9SXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX2Jpb3R5cGVfTkZFX3dhdGVyZmFsbCxmdW5jdGlvbih4KSByb3VuZCh4JGVzdGltYXRlLDE1KSkKd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMyRgOTUlQ0lfMC4wMDVfTkZFYCA9IHNhcHBseShmaXNoZXJyZXN1bHRzX2Jpb3R5cGVfTkZFX3dhdGVyZmFsbCxmdW5jdGlvbih4KSBwYXN0ZShyb3VuZCh4JGNvbmYuaW50WzE6Ml0sMiksY29sbGFwc2U9In4iKSkKYGBgCgpBbm5vdGF0ZSB2YXJpYW50cyB3aXRoIGZpbHRlcmluZyBBRiA+IG1heGltdW0gY3JlZGlibGUgcG9wdWxhdGlvbiBBRiBpbiBHbm9tQUQgZm9yIGhlcmVkaXRhcnkgT3ZDYSAoMC4wMDAxODEpLCBjYWxjdWxhdGVkIHVzaW5nIGFsbGVsZUZyZXF1ZW5jeUFwcCAoaHR0cDovL2NhcmRpb2RiLm9yZy9hbGxlbGVmcmVxdWVuY3lhcHAvKQpgYGB7cn0KbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19maXNoZXJyZXN1bHRzMyA8LSBtdXRhdGUobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19maXNoZXJyZXN1bHRzMiwgRmlsdGVyaW5nQUZfOTVfRXhjZWVkc19NYXhDcmVkUG9wQUY9KChHbm9tQURfdjIuMV9ub25fY2FuY2VyX0ZpbHRlcmluZ19BRl85NSk+MC4wMDAxODEpKSAlPiUgCiAgbXV0YXRlKEZpbHRlcmluZ0FGXzk1X05GRV9FeGNlZWRzX01heENyZWRQb3BBRj0oKEdub21BRF92Mi4xX25vbl9jYW5jZXJfRmlsdGVyaW5nX0FGXzk1X25mZSk+MC4wMDAxODEpKQpgYGAKCkFubm90YXRlIHZhcmlhbnRzIHRoYXQgUEFTUy9GQUlMIHRoZSBMT0ZURUUgNTBicCBydWxlCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHM0IDwtIG11dGF0ZShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHMzLExvRl81MF9CUF9SVUxFID0gaWZlbHNlKGdyZXBsKCI1MF9CUF9SVUxFOlBBU1MiLCBMb0ZfaW5mbyksIFRSVUUsIGlmZWxzZShncmVwbCgiNTBfQlBfUlVMRTpGQUlMIiwgTG9GX2luZm8pLCBGQUxTRSwgTkEpKSkKYGBgCgpJbXBvcnQgTk1EIGRlcGxldGVkIGdlbmUgbGlzdCAoYXZhaWxhYmxlIGZyb20gYXV0aG9ycyBvbiByZWFzb25hYmxlIHJlcXVlc3QpIGFuZCBhbm5vdGF0ZSB2YXJpYW50cyBhY2NvcmRpbmdseQpgYGB7cn0KTk1EX2RlcGxldGVkX2dlbmVfbGlzdCA8LSByZWFkLmNzdigiTk1EX2RlcGxldGVkX2dlbmVfbGlzdC5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKSAlPiUgCiAgcmVuYW1lKCJTWU1CT0wiID0gZ2VuZSkgJT4lIAogIHJlbmFtZSgiRmVhdHVyZSIgPSB0eG5hbWVzKSAlPiUgCiAgcmVuYW1lKCJOTURfcHJlZGljdG9yX3JhbmsiID0gbWluLnJhbmspCgptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHM1IDwtIGxlZnRfam9pbihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHM0LCBOTURfZGVwbGV0ZWRfZ2VuZV9saXN0WyxjKDI6MyldLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKSAKYGBgCgpPdXRwdXQgZGF0YSAocHJlLXByaW9yaXRpc2F0aW9uKSBhbmQgcmFua2VkIHAtdmFsdWUgbGlzdCB1c2VkIGZvciBCZW5qYW1pbmktSG9jaGJlcmcgYWRqdXN0bWVudApgYGB7cn0Kd3JpdGVfZXhjZWxfY3N2KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0czUscGF0aD0ibWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDEuY3N2IixuYT0iLiIsYXBwZW5kPUZBTFNFLGNvbF9uYW1lcz1UUlVFKQoKc2VsZWN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfZmlzaGVycmVzdWx0czUsU1lNQk9MLEdlbmUsUF92YWx1ZV9GaXNoZXJfMC4wMDVfTkZFKSAlPiUgCiAgYXJyYW5nZShQX3ZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUpICU+JSAKICB1bmlxdWUoKSAlPiUgCiAgd3JpdGVfdHN2KHBhdGg9IkhJR0hfRU5TVGNhbm9uaWNhbF9CSF9wX3ZhbHVlcy50c3YiKQpgYGAKCkNhbGN1bGF0ZSB0b3RhbCBMb0YgdmFyaWFudHMgaW4gc2FtcGxlIHZzIHRvdGFsIExvRiB2YXJpYW50cyBpbiBHbm9tQUQgbm9uLWNhbmNlciAoYWxsL05GRS1vbmx5KSBmb3IgYWxsIGdlbmVzIGFuZCBwcm90ZWluLWNvZGluZy1vbmx5IGdlbmVzLCBhbmQgdXNlIGZvciBjaGktc3F1YXJlZCB0ZXN0CmBgYHtyfQphIDwtIHN1bSh3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2FsbEdlbmVzMyRUb3RhbF9HZW5lX0NvdW50KSAlPiUgYXMubnVtZXJpYygpCmIgPC0gbl9kaXN0aW5jdChtYXN0ZXJmaWxlX2VvY19nb29kUTIkU2FtcGxlKSoyKihucm93KGFsbEdlbmVzX0FnaWxlbnRTU3Y2X2xpc3QpKSAlPiUgYXMubnVtZXJpYygpCmIxIDwtIGItYSAlPiUgYXMubnVtZXJpYygpCmMgPC0gc3VtKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNSkgJT4lIGFzLm51bWVyaWMoKQpkIDwtIChtYXgod2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lczMkTUFYX0FOKSkqbnJvdyhhbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0KSAlPiUgYXMubnVtZXJpYygpCmQxIDwtIGQtYyAlPiUgYXMubnVtZXJpYygpCmUgPC0gc3VtKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9ORkUpICU+JSBhcy5udW1lcmljKCkKZiA8LSAobWF4KHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzJE1BWF9BTl9ORkUpKSpucm93KGFsbEdlbmVzX0FnaWxlbnRTU3Y2X2xpc3QpICU+JSBhcy5udW1lcmljKCkKZjEgPC0gZi1lICU+JSBhcy5udW1lcmljKCkKCmcgPC0gc3VtKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczMkVG90YWxfR2VuZV9Db3VudCkgJT4lIGFzLm51bWVyaWMoKQpoIDwtIG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMioobnJvdyhhbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0X3Byb3RlaW5fY29kaW5nX29ubHkpKSAlPiUgYXMubnVtZXJpYygpCmgxIDwtIGgtZyAlPiUgYXMubnVtZXJpYygpCmkgPC0gc3VtKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczMkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1KSAlPiUgYXMubnVtZXJpYygpCmogPC0gKG1heCh3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfYWxsR2VuZXMzJE1BWF9BTikpKm5yb3coYWxsR2VuZXNfQWdpbGVudFNTdjZfbGlzdF9wcm90ZWluX2NvZGluZ19vbmx5KSAlPiUgYXMubnVtZXJpYygpCmoxIDwtIGotaSAlPiUgYXMubnVtZXJpYygpCmsgPC0gc3VtKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczMkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRSkgJT4lIGFzLm51bWVyaWMoKQpsIDwtIChtYXgod2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9iaW90eXBlX2FsbEdlbmVzMyRNQVhfQU5fTkZFKSkqbnJvdyhhbGxHZW5lc19BZ2lsZW50U1N2Nl9saXN0X3Byb3RlaW5fY29kaW5nX29ubHkpICU+JSBhcy5udW1lcmljKCkKbDEgPC0gbC1rICU+JSBhcy5udW1lcmljKCkKCmNoaVgyXzAuMDA1IDwtIG1hdHJpeChjKGEsYjEsYyxkMSksbnJvdz0yLGJ5cm93PVRSVUUpCmNoaVgyXzAuMDA1X05GRSA8LSBtYXRyaXgoYyhhLGIxLGUsZjEpLG5yb3c9MixieXJvdz1UUlVFKQpjaGlzcS50ZXN0KGNoaVgyXzAuMDA1LGNvcnJlY3Q9RkFMU0UpCmNoaXNxLnRlc3QoY2hpWDJfMC4wMDVfTkZFLGNvcnJlY3Q9RkFMU0UpCgpjaGlYMl8wLjAwNV9iaW90eXBlIDwtIG1hdHJpeChjKGcsaDEsaSxqMSksbnJvdz0yLGJ5cm93PVRSVUUpCmNoaVgyXzAuMDA1X05GRV9iaW90eXBlIDwtIG1hdHJpeChjKGcsaDEsayxsMSksbnJvdz0yLGJ5cm93PVRSVUUpCmNoaXNxLnRlc3QoY2hpWDJfMC4wMDVfYmlvdHlwZSxjb3JyZWN0PUZBTFNFKQpjaGlzcS50ZXN0KGNoaVgyXzAuMDA1X05GRV9iaW90eXBlLGNvcnJlY3Q9RkFMU0UpCmBgYAoKUmVtb3ZlIHZhcmlhbnRzIHdpdGggbm9uLXByb3RlaW4tY29kaW5nIGJpb3R5cGVzCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9iaW90eXBlIDwtIGZpbHRlcihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2Zpc2hlcnJlc3VsdHM1LEJJT1RZUEUlaW4lYygicHJvdGVpbl9jb2RpbmciKSkKYGBgCgpSZW1vdmUgdmFyaWFudHMgd2l0aCBHbm9tQUQgUG9wTWF4IEFGID4gMC4wMDUKYGBge3J9Cm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfR25vbUFEcG9wbWF4MC4wMDUgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2Jpb3R5cGUsCkdub21BRF92Mi4xX25vbl9jYW5jZXJfQUZfcG9wbWF4PD0wLjAwNSkKYGBgCgpSZW1vdmUgdmFyaWFudHMgd2l0aCByYXRpbyA8IDMKYGBge3J9Cm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfR25vbUFEcG9wbWF4MC4wMDVfcmF0aW8zIDwtIGZpbHRlcihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9iaW90eXBlX0dub21BRHBvcG1heDAuMDA1LFNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRF9ORkVfMC4wMDU+MykgCmBgYAoKUmVtb3ZlIHZhcmlhbnRzIHdpdGggZ2VuZSBjb3VudHMgPCAzCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9iaW90eXBlX0dub21BRHBvcG1heDAuMDA1X3JhdGlvM19nZW5lQ291bnQzIDwtIGZpbHRlcihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV9iaW90eXBlX0dub21BRHBvcG1heDAuMDA1X3JhdGlvMywKVG90YWxfR2VuZV9Db3VudD4yKQpgYGAKCk91dHB1dCBkYXRhIChwb3N0LXByaW9yaXRpc2F0aW9uKQpgYGB7cn0Kd3JpdGVfZXhjZWxfY3N2KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2Jpb3R5cGVfR25vbUFEcG9wbWF4MC4wMDVfcmF0aW8zX2dlbmVDb3VudDMscGF0aD0ibWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9Hbm9tQURwb3BtYXgwLjAwNV9yYXRpbzNfZ2VuZUNvdW50My5jc3YiLG5hPSIuIixhcHBlbmQ9RkFMU0UsY29sX25hbWVzPVRSVUUpCmBgYAoKT3V0cHV0IGRhdGEgZm9yIGxvZyBwLXZhbHVlIHdhdGVyZmFsbCBwbG90cyAoYWxsIGdlbmVzIGFuZCBwcm90ZWluLWNvZGluZy1vbmx5IGdlbmVzKQpgYGB7cn0Kd2F0ZXJmYWxsX3NhbXBsZUFGMC4wMV9hbGxHZW5lczQgPC0gbXV0YXRlKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYWxsR2VuZXMzLCJMb2cxMF9QLXZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUiID0gbG9nMTAoUF92YWx1ZV9GaXNoZXJfMC4wMDVfTkZFKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhPUl8wLjAwNV9ORkUpKSAlPiUgCiAgbXV0YXRlKCJQbG90dGVkX0xvZzEwX1AtdmFsdWVfRmlzaGVyXzAuMDA1X05GRSI9IAogIGlmX2Vsc2UgKE9SXzAuMDA1X05GRT49MSwgYExvZzEwX1AtdmFsdWVfRmlzaGVyXzAuMDA1X05GRWAqLTEsIGBMb2cxMF9QLXZhbHVlX0Zpc2hlcl8wLjAwNV9ORkVgLCBtaXNzaW5nPU5VTEwpKSAlPiUgCiAgYXJyYW5nZShkZXNjKGBQbG90dGVkX0xvZzEwX1AtdmFsdWVfRmlzaGVyXzAuMDA1X05GRWApLGRlc2MoT1JfMC4wMDVfTkZFKSkgJT4lIAogIHdyaXRlX2V4Y2VsX2NzdihwYXRoPSJ3YXRlcmZhbGxfc2FtcGxlQUYwLjAxX2FsbEdlbmVzX3Y2LmNzdiIsbmE9Ii4iLGFwcGVuZD1GQUxTRSxjb2xfbmFtZXM9VFJVRSkKCndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczQgPC0gbXV0YXRlKHdhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lczMsIkxvZzEwX1AtdmFsdWVfRmlzaGVyXzAuMDA1X05GRSIgPSBsb2cxMChQX3ZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUpKSAlPiUgCiAgYXJyYW5nZShkZXNjKE9SXzAuMDA1X05GRSkpICU+JSAKICBtdXRhdGUoIlBsb3R0ZWRfTG9nMTBfUC12YWx1ZV9GaXNoZXJfMC4wMDVfTkZFIj0gCiAgaWZfZWxzZSAoT1JfMC4wMDVfTkZFPj0xLCBgTG9nMTBfUC12YWx1ZV9GaXNoZXJfMC4wMDVfTkZFYCotMSwgYExvZzEwX1AtdmFsdWVfRmlzaGVyXzAuMDA1X05GRWAsIG1pc3Npbmc9TlVMTCkpICU+JSAKICBhcnJhbmdlKGRlc2MoYFBsb3R0ZWRfTG9nMTBfUC12YWx1ZV9GaXNoZXJfMC4wMDVfTkZFYCksZGVzYyhPUl8wLjAwNV9ORkUpKSAlPiUgCiAgd3JpdGVfZXhjZWxfY3N2KHBhdGg9IndhdGVyZmFsbF9zYW1wbGVBRjAuMDFfYmlvdHlwZV9hbGxHZW5lc192Ni5jc3YiLG5hPSIuIixhcHBlbmQ9RkFMU0UsY29sX25hbWVzPVRSVUUpCmBgYAoKUmVtb3ZlIHJlZHVuZGFudCBjLjIyMDhUPkcgc3RvcGdhaW4gQkxNIHZhcmlhbnQgZnJvbSBQVUItMUc1REggKGluIGNpcyB3aXRoIGMuMjIwNmR1cFQgdmFyaWFudCBpbiB0aGlzIGluZGl2aWR1YWwpIGFuZCByZWNhbGN1bGF0ZSBnZW5lIGNvdW50cy9mcmVxdWVuY2llcyBhbmQgcmF0aW9zIGZvciBETkEgcmVwYWlyIGdlbmUgYW5hbHlzaXMKYGBge3J9Cm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2EgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxLCBIR1ZTYyE9IkVOU1QwMDAwMDM1NTExMi4zOmMuMjIwOFQ+RyIpCgpnZW5lc19vbmVWYXJBbGxlbGUgPC0gbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfYSAlPiUgCiAgc2VsZWN0KFNZTUJPTCxTYW1wbGUuR1QpICU+JSAKICBncm91cF9ieShTWU1CT0wsU2FtcGxlLkdUKSAlPiUgCiAgc3VtbWFyaXNlKG4oKSkgJT4lIAogIGZpbHRlcigoU2FtcGxlLkdUJWluJWMoIicwLzEiLCInMS8wIikpKSAlPiUgCiAgcmVuYW1lKGdlbmVfVmFyID0gIm4oKSIpICU+JSAKICBncm91cF9ieShTWU1CT0wpICU+JSAKICBzdW1tYXJpc2Uoc3VtKGdlbmVfVmFyKSkKZ2VuZXNfdHdvVmFyQWxsZWxlIDwtIG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2EgJT4lIAogIHNlbGVjdChTWU1CT0wsU2FtcGxlLkdUKSAlPiUgCiAgZ3JvdXBfYnkoU1lNQk9MLFNhbXBsZS5HVCkgJT4lIAogIHN1bW1hcmlzZShuKCkpICU+JSAKICBmaWx0ZXIoKFNhbXBsZS5HVCE9IicwLzEiKSYoU2FtcGxlLkdUIT0iJzEvMCIpKSAlPiUgCiAgbXV0YXRlKGdlbmVfVmFyID0gYG4oKWAqMikgJT4lIAogIHNlbGVjdCgtYG4oKWApICU+JSAKICBncm91cF9ieShTWU1CT0wpICU+JSAKICBzdW1tYXJpc2Uoc3VtKGdlbmVfVmFyKSkKZ2VuZXMgPC0gZnVsbF9qb2luKGdlbmVzX29uZVZhckFsbGVsZSxnZW5lc190d29WYXJBbGxlbGUsYnk9IlNZTUJPTCIsY29weT1GQUxTRSxzdWZmaXg9YygiLngiLCIueSIpKSAlPiUgCiAgbXV0YXRlX2FsbChmdW5zKHJlcGxhY2UoLiwgaXMubmEoLiksIDApKSkgJT4lIAogIG11dGF0ZShUb3RhbF9HZW5lX0NvdW50PWBzdW0oZ2VuZV9WYXIpLnhgK2BzdW0oZ2VuZV9WYXIpLnlgKSAlPiUgCiAgbXV0YXRlKFNhbXBsZV9HZW5lX0ZyZXE9VG90YWxfR2VuZV9Db3VudC8obl9kaXN0aW5jdChtYXN0ZXJmaWxlX2VvY19nb29kUTIkU2FtcGxlKSoyKSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfMmEgPC0gbGVmdF9qb2luKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX2EsIGdlbmVzWyxjKDEsNDo1KV0sYnk9IlNZTUJPTCIsY29weT1GQUxTRSkKCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19hIDwtIGxlZnRfam9pbihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV8yYSwgR25vbUFEX3N0YXRzX0xPRl9WRVBbLGMoMiwzMDo0MSldLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKSAKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzXzJhIDwtIG11dGF0ZV9hdChtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfYSx2YXJzKHN0YXJ0c193aXRoKCJGSUxURVJfIikpLGZ1bnMocmVwbGFjZSguLCBpcy5uYSguKSwgMCkpKSAlPiUgCiAgbXV0YXRlX2lmKGdyZXBsKCJwb3BtYXgkIiwgbmFtZXMoLikpLGZ1bnMoaWZlbHNlKC4gPT0gIk5BIiwgMCwgYXMubnVtZXJpYyguKSkpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJwb3BtYXgiKSksZnVucyhyZXBsYWNlKC4sIGlzLm5hKC4pLCAwKSkpCgptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2EgPC0gCiAgbXV0YXRlKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c18yYSwKICAgICAgICAgIlNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRCI9U2FtcGxlX0dlbmVfRnJlcS9tYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfMmFbLDIyNV0sCiAgICAgICAgICJTYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQURfMC4wMDUiPVNhbXBsZV9HZW5lX0ZyZXEvbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzXzJhWywyMzFdLAogICAgICAgICAiUmF0aW9fRGlmZmVyZW5jZSI9U2FtcGxlX0dlbmVfTE9GX0ZyZXFfUmF0aW9fR25vbUFEXzAuMDA1LVNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRCwgCiAgICAgICAgICJTYW1wbGVfR2VuZV9MT0ZfRnJlcV9SYXRpb19Hbm9tQURfTkZFIj1TYW1wbGVfR2VuZV9GcmVxL21hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c18yYVssMjI4XSwKICAgICAgICAgIlNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRF9ORkVfMC4wMDUiPVNhbXBsZV9HZW5lX0ZyZXEvbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzXzJhWywyMzRdLAogICAgICAgICAiUmF0aW9fRGlmZmVyZW5jZV9ORkUiPVNhbXBsZV9HZW5lX0xPRl9GcmVxX1JhdGlvX0dub21BRF9ORkVfMC4wMDUtU2FtcGxlX0dlbmVfTE9GX0ZyZXFfUmF0aW9fR25vbUFEX05GRSkgJT4lIAogIG11dGF0ZSgKICAgICJTYW1wbGVfR2VuZV9MT0ZfQUZfUmF0aW8iPVNhbXBsZV9BRi9Hbm9tQURfdjIuMV9ub25fY2FuY2VyX0FGLCAKICAgICJTYW1wbGVfR2VuZV9MT0ZfQUZfUmF0aW9fTkZFIj1TYW1wbGVfQUYvR25vbUFEX3YyLjFfbm9uX2NhbmNlcl9BRl9uZmUpCmBgYAoKQXR0YWNoIG90aGVyIEdub21BRCBkYXRhIGZvciBETkEgcmVwYWlyIGdlbmVzIGFuYWx5c2lzCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zXzJhIDwtIG11dGF0ZShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX2EsVG90YWxfQ2FzZV9BbGxlbGVzPShuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIpKSAlPiUgCiAgbGVmdF9qb2luKEdub21BRF9zdGF0c19MT0ZfVkVQWyxjKDIsNiwxMCwxNDoyOSldLGJ5PSJGZWF0dXJlIixjb3B5PUZBTFNFKSAKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc18zYSA8LSBtdXRhdGUobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc18yYSwgTUFYX0FOPXJlcGxhY2UobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc18yYSRNQVhfQU4sIGlzLm5hKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfMmEkTUFYX0FOKSwgbWF4KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfMmEkTUFYX0FOLCBuYS5ybT1UUlVFKSkpICU+JSAKICBtdXRhdGUoTUFYX0FOX05GRT1yZXBsYWNlKC4kTUFYX0FOX05GRSwgaXMubmEoLiRNQVhfQU5fTkZFKSwgbWF4KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfMmEkTUFYX0FOX05GRSwgbmEucm09VFJVRSkpKQpgYGAKCkV4dHJhY3QgRE5BIHJlcGFpciBnZW5lIHZhcmlhbnRzIGZyb20gc2FtcGxlIGRhdGEgYnkgcmVwYWlyIHBhdGh3YXksIGFuZCBjb21iaW5lIGludG8gb25lIHRhYmxlCmBgYHtyfQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X2EgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfM2EsCkdub21BRF92Mi4xX25vbl9jYW5jZXJfQUZfcG9wbWF4PD0wLjAwNSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9CRVIgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfYSxTWU1CT0wlaW4lYygiUkZDMSIsIlJGQzIiLCJSRkMzIiwiUkZDNCIsIlJGQzUiLCJYUkNDMSIsIlBDTkEiLCJQQVJQMSIsIlBBUlAyIiwiQVBFWDEiLCJGRU4xIiwiUE9MRSIsIlBPTEQxIiwiTElHMyIsIk9HRzEiLCJVTkciLCJTTVVHMSIsIk1CRDQiLCJUREciLCJNVVRZSCIsIk5USEwxIiwiTVBHIiwiTkVJTDEiLCJORUlMMiIsIk5FSUwzIiwiQVBFWDIiLCJQTktQIiwiQVBMRiIsIlBBUlAzIiwiTElHMSIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X01NUiA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9hLFNZTUJPTCVpbiVjKCJSRkMxIiwiUkZDMiIsIlJGQzMiLCJSRkM0IiwiUkZDNSIsIlBDTkEiLCJNU0gzIiwiTVNINCIsIk1TSDUiLCJNTEgzIiwiUE1TMSIsIlBNUzJQMyIsIkVYTzEiLCJQT0xEMSIpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X05FUiA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9hLFNZTUJPTCVpbiVjKCJSUEExIiwiUlBBMiIsIlJQQTMiLCJSUEE0IiwiUkZDMSIsIlJGQzIiLCJSRkMzIiwiUkZDNCIsIlJGQzUiLCJQQ05BIiwiRVJDQzEiLCJFUkNDNCIsIkVSQ0MyIiwiRVJDQzUiLCJYUEMiLCJFUkNDNiIsIkdURjJIMiIsIkVSQ0MzIiwiWFBBIiwiUkFEMjNCIiwiUE9MRSIsIlBPTEQxIiwiUkFEMjNBIiwiTElHMyIsIkNFVE4yIiwiRERCMSIsIkREQjIiLCJHVEYySDEiLCJHVEYySDMiLCJHVEYySDQiLCJHVEYySDUiLCJDREs3IiwiQ0NOSCIsIk1OQVQxIiwiTElHMSIsIkVSQ0M4IiwiVVZTU0EiLCJYQUIyIiwiTU1TMTkiKSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9IUiA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9hLFNZTUJPTCVpbiVjKCJBVE0iLCJSUEExIiwiUlBBMiIsIlJQQTMiLCJSUEE0IiwiUkFENTEiLCJOQk4iLCJSQUQ1MCIsIkNIRUsyIiwiUEFMQjIiLCJNVVM4MSIsIkVNRTEiLCJNUkUxMUEiLCJSQUQ1MiIsIlJBRDUxQiIsIkRNQzEiLCJYUkNDMiIsIlhSQ0MzIiwiUkFENTRMIiwiUkFENTRCIiwiU0hGTTEiLCJSQkJQOCIsIlNMWDFBIiwiU0xYMUIiLCJHRU4xIikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRkEgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfYSxTWU1CT0wlaW4lYygiQVRSIiwiRVJDQzEiLCJGQU5DQSIsIkZBTkNCIiwiRkFOQ0MiLCJGQU5DRDIiLCJGQU5DRSIsIkZBTkNGIiwiRkFOQ0ciLCJGQU5DSSIsIkZBTkNMIiwiRkFOQ00iLCJQQUxCMiIsIkNIRUsxIiwiU0xYNCIsIkZBTjEiLCJDMW9yZjg2IiwiIEMxOW9yZjQwIiwiTVVTODEiLCJFTUUxIikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfTkhFSiA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9hLFNZTUJPTCVpbiVjKCJYUkNDNiIsIlhSQ0M1IiwiUFJLREMiLCJMSUc0IiwiWFJDQzQiLCJEQ0xSRTFDIiwiTkhFSjEiKSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9EUiA8LSBmaWx0ZXIobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9hLFNZTUJPTCVpbiVjKCJNR01UIiwiQUxLQkgyIiwiQUxLQkgzIikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfQUxMcmVwYWlyIDwtIGZpbHRlcihtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X2EsU1lNQk9MJWluJWMoIlhSQ0MxIiwiUEFSUDEiLCJQQVJQMiIsIkFQRVgxIiwiRkVOMSIsIk9HRzEiLCJVTkciLCJTTVVHMSIsIk1CRDQiLCJUREciLCJNVVRZSCIsIk5USEwxIiwiTVBHIiwiTkVJTDEiLCJORUlMMiIsIk5FSUwzIiwiQVBFWDIiLCJQTktQIiwiQVBMRiIsIlBBUlAzIiwiTVNIMyIsIk1TSDQiLCJNU0g1IiwiTUxIMyIsIlBNUzEiLCJQTVMyUDMiLCJFWE8xIiwiUkZDMSIsIlJGQzIiLCJSRkMzIiwiUkZDNCIsIlJGQzUiLCJQQ05BIiwiRVJDQzQiLCJFUkNDMiIsIkVSQ0M1IiwiWFBDIiwiRVJDQzYiLCJHVEYySDIiLCJFUkNDMyIsIlhQQSIsIlJBRDIzQiIsIlBPTEUiLCJQT0xEMSIsIlJBRDIzQSIsIkxJRzMiLCJDRVROMiIsIkREQjEiLCJEREIyIiwiR1RGMkgxIiwiR1RGMkgzIiwiR1RGMkg0IiwiR1RGMkg1IiwiQ0RLNyIsIkNDTkgiLCJNTkFUMSIsIkxJRzEiLCJFUkNDOCIsIlVWU1NBIiwiWEFCMiIsIk1NUzE5IiwiQVRNIiwiUlBBMSIsIlJQQTIiLCJSUEEzIiwiUlBBNCIsIlJBRDUxIiwiTkJOIiwiUkFENTAiLCJDSEVLMiIsIk1SRTExQSIsIlJBRDUyIiwiUkFENTFCIiwiRE1DMSIsIlhSQ0MyIiwiWFJDQzMiLCJSQUQ1NEwiLCJSQUQ1NEIiLCJTSEZNMSIsIlJCQlA4IiwiU0xYMUEiLCJTTFgxQiIsIkdFTjEiLCJBVFIiLCJFUkNDMSIsIkZBTkNBIiwiRkFOQ0IiLCJGQU5DQyIsIkZBTkNEMiIsIkZBTkNFIiwiRkFOQ0YiLCJGQU5DRyIsIkZBTkNJIiwiRkFOQ0wiLCJGQU5DTSIsIlBBTEIyIiwiQ0hFSzEiLCJTTFg0IiwiRkFOMSIsIkMxb3JmODYiLCIgQzE5b3JmNDAiLCJNVVM4MSIsIkVNRTEiLCJYUkNDNiIsIlhSQ0M1IiwiUFJLREMiLCJMSUc0IiwiWFJDQzQiLCJEQ0xSRTFDIiwiTkhFSjEiLCJNR01UIiwiQUxLQkgyIiwiQUxLQkgzIikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfT1RIRVIgPC0gZmlsdGVyKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfYSxTWU1CT0wlaW4lYygiUEFYSVAxIiwiQkxNIiwiS01UMkMiLCJDUklQMSIsIkNESzEyIiwiQkFQMSIsIkJBUkQxIiwiV1JOIiwiQlVCMSIsIkNFTlBFIiwiWlcxMCIsIlRUSyIsIktOVEMxIiwiQVVSS0IiLCJQT0xCIiwiUE9MSCIsIlBPTFEiLCJURFAxIiwiVERQMiIsIk5VRFQxIiwiRFVUIiwiUlJNMkIiLCJQT0xHIiwiUkVWM0wiLCJNQUQyTDIiLCJSRVYxIiwiUE9MSSIsIlBPTEsiLCJQT0xMIiwiUE9MTSIsIlBPTE4iLCJUUkVYMSIsIlRSRVgyIiwiQVBUWCIsIlNQTzExIiwiRU5ET1YiLCJVQkUyQSIsIlVCRTJCIiwiUkFEMTgiLCJTSFBSSCIsIkhMVEYiLCJSTkYxNjgiLCJTUFJUTiIsIlJORjgiLCJSTkY0IiwiVUJFMlYyIiwiVUJFMk4iLCJIMkFGWCIsIkNIQUYxQSIsIlNFVE1BUiIsIlJFQ1FMNCIsIk1QTEtJUCIsIkRDTFJFMUEiLCJEQ0xSRTFCIiwiUFJQRjE5IiwiUkVDUUwiLCJSRUNRTDUiLCJIRUxRIiwiUkRNMSIsIk5BQlAyIiwiQVRSSVAiLCJNREMxIiwiUkFEMSIsIlJBRDlBIiwiSFVTMSIsIlJBRDE3IiwiVFA1MyIsIlRQNTNCUDEiLCJUT1BCUDEiLCJDTEsyIiwiUEVSMSIpKQpETkFyZXBhaXJfb3RoZXJfbGlzdCA8LSB0aWJibGUoIlNZTUJPTCI9YygiWFJDQzEiLCJQQVJQMSIsIlBBUlAyIiwiQVBFWDEiLCJGRU4xIiwiT0dHMSIsIlVORyIsIlNNVUcxIiwiTUJENCIsIlRERyIsIk1VVFlIIiwiTlRITDEiLCJNUEciLCJORUlMMSIsIk5FSUwyIiwiTkVJTDMiLCJBUEVYMiIsIlBOS1AiLCJBUExGIiwiUEFSUDMiLCJNU0gzIiwiTVNINCIsIk1TSDUiLCJNTEgzIiwiUE1TMSIsIlBNUzJQMyIsIkVYTzEiLCJSRkMxIiwiUkZDMiIsIlJGQzMiLCJSRkM0IiwiUkZDNSIsIlBDTkEiLCJFUkNDNCIsIkVSQ0MyIiwiRVJDQzUiLCJYUEMiLCJFUkNDNiIsIkdURjJIMiIsIkVSQ0MzIiwiWFBBIiwiUkFEMjNCIiwiUE9MRSIsIlBPTEQxIiwiUkFEMjNBIiwiTElHMyIsIkNFVE4yIiwiRERCMSIsIkREQjIiLCJHVEYySDEiLCJHVEYySDMiLCJHVEYySDQiLCJHVEYySDUiLCJDREs3IiwiQ0NOSCIsIk1OQVQxIiwiTElHMSIsIkVSQ0M4IiwiVVZTU0EiLCJYQUIyIiwiTU1TMTkiLCJBVE0iLCJSUEExIiwiUlBBMiIsIlJQQTMiLCJSUEE0IiwiUkFENTEiLCJOQk4iLCJSQUQ1MCIsIkNIRUsyIiwiTVJFMTFBIiwiUkFENTIiLCJSQUQ1MUIiLCJETUMxIiwiWFJDQzIiLCJYUkNDMyIsIlJBRDU0TCIsIlJBRDU0QiIsIlNIRk0xIiwiUkJCUDgiLCJTTFgxQSIsIlNMWDFCIiwiR0VOMSIsIkFUUiIsIkVSQ0MxIiwiRkFOQ0EiLCJGQU5DQiIsIkZBTkNDIiwiRkFOQ0QyIiwiRkFOQ0UiLCJGQU5DRiIsIkZBTkNHIiwiRkFOQ0kiLCJGQU5DTCIsIkZBTkNNIiwiUEFMQjIiLCJDSEVLMSIsIlNMWDQiLCJGQU4xIiwiQzFvcmY4NiIsIkMxOW9yZjQwIiwiTVVTODEiLCJFTUUxIiwiWFJDQzYiLCJYUkNDNSIsIlBSS0RDIiwiTElHNCIsIlhSQ0M0IiwiRENMUkUxQyIsIk5IRUoxIiwiTUdNVCIsIkFMS0JIMiIsIkFMS0JIMyIsIlBBWElQMSIsIkJMTSIsIktNVDJDIiwiQ1JJUDEiLCJDREsxMiIsIkJBUDEiLCJCQVJEMSIsIldSTiIsIkJVQjEiLCJDRU5QRSIsIlpXMTAiLCJUVEsiLCJLTlRDMSIsIkFVUktCIiwiUE9MQiIsIlBPTEgiLCJQT0xRIiwiVERQMSIsIlREUDIiLCJOVURUMSIsIkRVVCIsIlJSTTJCIiwiUE9MRyIsIlJFVjNMIiwiTUFEMkwyIiwiUkVWMSIsIlBPTEkiLCJQT0xLIiwiUE9MTCIsIlBPTE0iLCJQT0xOIiwiVFJFWDEiLCJUUkVYMiIsIkFQVFgiLCJTUE8xMSIsIkVORE9WIiwiVUJFMkEiLCJVQkUyQiIsIlJBRDE4IiwiU0hQUkgiLCJITFRGIiwiUk5GMTY4IiwiU1BSVE4iLCJSTkY4IiwiUk5GNCIsIlVCRTJWMiIsIlVCRTJOIiwiSDJBRlgiLCJDSEFGMUEiLCJTRVRNQVIiLCJSRUNRTDQiLCJNUExLSVAiLCJEQ0xSRTFBIiwiRENMUkUxQiIsIlBSUEYxOSIsIlJFQ1FMIiwiUkVDUUw1IiwiSEVMUSIsIlJETTEiLCJOQUJQMiIsIkFUUklQIiwiTURDMSIsIlJBRDEiLCJSQUQ5QSIsIkhVUzEiLCJSQUQxNyIsIlRQNTMiLCJUUDUzQlAxIiwiVE9QQlAxIiwiQ0xLMiIsIlBFUjEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9vdGhlciA8LSBiaW5kX3Jvd3MoCiAgbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9BTExyZXBhaXIsCiAgbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9PVEhFUikgCmBgYAoKRXh0cmFjdCBETkEgcmVwYWlyIGdlbmUgY291bnRzIGZyb20gc2FtcGxlIGRhdGEgYnkgcmVwYWlyIHBhdGh3YXkKYGBge3J9CmdlbmVzX0JFUiA8LSBmaWx0ZXIoZ2VuZXMsU1lNQk9MJWluJWMoIlJGQzEiLCJSRkMyIiwiUkZDMyIsIlJGQzQiLCJSRkM1IiwiWFJDQzEiLCJQQ05BIiwiUEFSUDEiLCJQQVJQMiIsIkFQRVgxIiwiRkVOMSIsIlBPTEUiLCJQT0xEMSIsIkxJRzMiLCJPR0cxIiwiVU5HIiwiU01VRzEiLCJNQkQ0IiwiVERHIiwiTVVUWUgiLCJOVEhMMSIsIk1QRyIsIk5FSUwxIiwiTkVJTDIiLCJORUlMMyIsIkFQRVgyIiwiUE5LUCIsIkFQTEYiLCJQQVJQMyIsIkxJRzEiKSkKZ2VuZXNfTU1SIDwtIGZpbHRlcihnZW5lcyxTWU1CT0wlaW4lYygiUkZDMSIsIlJGQzIiLCJSRkMzIiwiUkZDNCIsIlJGQzUiLCJQQ05BIiwiTVNIMyIsIk1TSDQiLCJNU0g1IiwiTUxIMyIsIlBNUzEiLCJQTVMyUDMiLCJFWE8xIiwiUE9MRDEiKSkKZ2VuZXNfTkVSIDwtIGZpbHRlcihnZW5lcyxTWU1CT0wlaW4lYygiUlBBMSIsIlJQQTIiLCJSUEEzIiwiUlBBNCIsIlJGQzEiLCJSRkMyIiwiUkZDMyIsIlJGQzQiLCJSRkM1IiwiUENOQSIsIkVSQ0MxIiwiRVJDQzQiLCJFUkNDMiIsIkVSQ0M1IiwiWFBDIiwiRVJDQzYiLCJHVEYySDIiLCJFUkNDMyIsIlhQQSIsIlJBRDIzQiIsIlBPTEUiLCJQT0xEMSIsIlJBRDIzQSIsIkxJRzMiLCJDRVROMiIsIkREQjEiLCJEREIyIiwiR1RGMkgxIiwiR1RGMkgzIiwiR1RGMkg0IiwiR1RGMkg1IiwiQ0RLNyIsIkNDTkgiLCJNTkFUMSIsIkxJRzEiLCJFUkNDOCIsIlVWU1NBIiwiWEFCMiIsIk1NUzE5IikpCmdlbmVzX0hSIDwtIGZpbHRlcihnZW5lcyxTWU1CT0wlaW4lYygiQVRNIiwiUlBBMSIsIlJQQTIiLCJSUEEzIiwiUlBBNCIsIlJBRDUxIiwiTkJOIiwiUkFENTAiLCJDSEVLMiIsIlBBTEIyIiwiTVVTODEiLCJFTUUxIiwiTVJFMTFBIiwiUkFENTIiLCJSQUQ1MUIiLCJETUMxIiwiWFJDQzIiLCJYUkNDMyIsIlJBRDU0TCIsIlJBRDU0QiIsIlNIRk0xIiwiUkJCUDgiLCJTTFgxQSIsIlNMWDFCIiwiR0VOMSIpKQpnZW5lc19GQSA8LSBmaWx0ZXIoZ2VuZXMsU1lNQk9MJWluJWMoIkFUUiIsIkVSQ0MxIiwiRkFOQ0EiLCJGQU5DQiIsIkZBTkNDIiwiRkFOQ0QyIiwiRkFOQ0UiLCJGQU5DRiIsIkZBTkNHIiwiRkFOQ0kiLCJGQU5DTCIsIkZBTkNNIiwiUEFMQjIiLCJDSEVLMSIsIlNMWDQiLCJGQU4xIiwiQzFvcmY4NiIsIiBDMTlvcmY0MCIsIk1VUzgxIiwiRU1FMSIpKQpnZW5lc19OSEVKIDwtIGZpbHRlcihnZW5lcyxTWU1CT0wlaW4lYygiWFJDQzYiLCJYUkNDNSIsIlBSS0RDIiwiTElHNCIsIlhSQ0M0IiwiRENMUkUxQyIsIk5IRUoxIikpCmdlbmVzX0RSIDwtIGZpbHRlcihnZW5lcyxTWU1CT0wlaW4lYygiTUdNVCIsIkFMS0JIMiIsIkFMS0JIMyIpKQpnZW5lc19BTExyZXBhaXIgPC0gZmlsdGVyKGdlbmVzLFNZTUJPTCVpbiVjKCJYUkNDMSIsIlBBUlAxIiwiUEFSUDIiLCJBUEVYMSIsIkZFTjEiLCJPR0cxIiwiVU5HIiwiU01VRzEiLCJNQkQ0IiwiVERHIiwiTVVUWUgiLCJOVEhMMSIsIk1QRyIsIk5FSUwxIiwiTkVJTDIiLCJORUlMMyIsIkFQRVgyIiwiUE5LUCIsIkFQTEYiLCJQQVJQMyIsIk1TSDMiLCJNU0g0IiwiTVNINSIsIk1MSDMiLCJQTVMxIiwiUE1TMlAzIiwiRVhPMSIsIlJGQzEiLCJSRkMyIiwiUkZDMyIsIlJGQzQiLCJSRkM1IiwiUENOQSIsIkVSQ0M0IiwiRVJDQzIiLCJFUkNDNSIsIlhQQyIsIkVSQ0M2IiwiR1RGMkgyIiwiRVJDQzMiLCJYUEEiLCJSQUQyM0IiLCJQT0xFIiwiUE9MRDEiLCJSQUQyM0EiLCJMSUczIiwiQ0VUTjIiLCJEREIxIiwiRERCMiIsIkdURjJIMSIsIkdURjJIMyIsIkdURjJINCIsIkdURjJINSIsIkNESzciLCJDQ05IIiwiTU5BVDEiLCJMSUcxIiwiRVJDQzgiLCJVVlNTQSIsIlhBQjIiLCJNTVMxOSIsIkFUTSIsIlJQQTEiLCJSUEEyIiwiUlBBMyIsIlJQQTQiLCJSQUQ1MSIsIk5CTiIsIlJBRDUwIiwiQ0hFSzIiLCJNUkUxMUEiLCJSQUQ1MiIsIlJBRDUxQiIsIkRNQzEiLCJYUkNDMiIsIlhSQ0MzIiwiUkFENTRMIiwiUkFENTRCIiwiU0hGTTEiLCJSQkJQOCIsIlNMWDFBIiwiU0xYMUIiLCJHRU4xIiwiQVRSIiwiRVJDQzEiLCJGQU5DQSIsIkZBTkNCIiwiRkFOQ0MiLCJGQU5DRDIiLCJGQU5DRSIsIkZBTkNGIiwiRkFOQ0ciLCJGQU5DSSIsIkZBTkNMIiwiRkFOQ00iLCJQQUxCMiIsIkNIRUsxIiwiU0xYNCIsIkZBTjEiLCJDMW9yZjg2IiwiIEMxOW9yZjQwIiwiTVVTODEiLCJFTUUxIiwiWFJDQzYiLCJYUkNDNSIsIlBSS0RDIiwiTElHNCIsIlhSQ0M0IiwiRENMUkUxQyIsIk5IRUoxIiwiTUdNVCIsIkFMS0JIMiIsIkFMS0JIMyIpKQpnZW5lc19PVEhFUiA8LSBmaWx0ZXIoZ2VuZXMsU1lNQk9MJWluJWMoIlBBWElQMSIsIkJMTSIsIktNVDJDIiwiQ1JJUDEiLCJDREsxMiIsIkJBUDEiLCJCQVJEMSIsIldSTiIsIkJVQjEiLCJDRU5QRSIsIlpXMTAiLCJUVEsiLCJLTlRDMSIsIkFVUktCIiwiUE9MQiIsIlBPTEgiLCJQT0xRIiwiVERQMSIsIlREUDIiLCJOVURUMSIsIkRVVCIsIlJSTTJCIiwiUE9MRyIsIlJFVjNMIiwiTUFEMkwyIiwiUkVWMSIsIlBPTEkiLCJQT0xLIiwiUE9MTCIsIlBPTE0iLCJQT0xOIiwiVFJFWDEiLCJUUkVYMiIsIkFQVFgiLCJTUE8xMSIsIkVORE9WIiwiVUJFMkEiLCJVQkUyQiIsIlJBRDE4IiwiU0hQUkgiLCJITFRGIiwiUk5GMTY4IiwiU1BSVE4iLCJSTkY4IiwiUk5GNCIsIlVCRTJWMiIsIlVCRTJOIiwiSDJBRlgiLCJDSEFGMUEiLCJTRVRNQVIiLCJSRUNRTDQiLCJNUExLSVAiLCJEQ0xSRTFBIiwiRENMUkUxQiIsIlBSUEYxOSIsIlJFQ1FMIiwiUkVDUUw1IiwiSEVMUSIsIlJETTEiLCJOQUJQMiIsIkFUUklQIiwiTURDMSIsIlJBRDEiLCJSQUQ5QSIsIkhVUzEiLCJSQUQxNyIsIlRQNTMiLCJUUDUzQlAxIiwiVE9QQlAxIiwiQ0xLMiIsIlBFUjEiKSkKYGBgCgpFeHRyYWN0IEROQSByZXBhaXIgZ2VuZXMgZnJvbSBHbm9tQUQgZGF0YSBieSByZXBhaXIgcGF0aHdheQpgYGB7cn0KR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9CRVIgPC0gZmlsdGVyKEdub21BRF9zdGF0c19MT0ZfVkVQLFNZTUJPTCVpbiVjKCJSRkMxIiwiUkZDMiIsIlJGQzMiLCJSRkM0IiwiUkZDNSIsIlhSQ0MxIiwiUENOQSIsIlBBUlAxIiwiUEFSUDIiLCJBUEVYMSIsIkZFTjEiLCJQT0xFIiwiUE9MRDEiLCJMSUczIiwiT0dHMSIsIlVORyIsIlNNVUcxIiwiTUJENCIsIlRERyIsIk1VVFlIIiwiTlRITDEiLCJNUEciLCJORUlMMSIsIk5FSUwyIiwiTkVJTDMiLCJBUEVYMiIsIlBOS1AiLCJBUExGIiwiUEFSUDMiLCJMSUcxIikpICU+JSBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikKR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9NTVIgPC0gZmlsdGVyKEdub21BRF9zdGF0c19MT0ZfVkVQLFNZTUJPTCVpbiVjKCJSRkMxIiwiUkZDMiIsIlJGQzMiLCJSRkM0IiwiUkZDNSIsIlBDTkEiLCJNU0gzIiwiTVNINCIsIk1TSDUiLCJNTEgzIiwiUE1TMSIsIlBNUzJQMyIsIkVYTzEiLCJQT0xEMSIpKSAlPiUgZmlsdGVyKENBTk9OSUNBTD09IllFUyIpCkdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTkVSIDwtIGZpbHRlcihHbm9tQURfc3RhdHNfTE9GX1ZFUCxTWU1CT0wlaW4lYygiUlBBMSIsIlJQQTIiLCJSUEEzIiwiUlBBNCIsIlJGQzEiLCJSRkMyIiwiUkZDMyIsIlJGQzQiLCJSRkM1IiwiUENOQSIsIkVSQ0MxIiwiRVJDQzQiLCJFUkNDMiIsIkVSQ0M1IiwiWFBDIiwiRVJDQzYiLCJHVEYySDIiLCJFUkNDMyIsIlhQQSIsIlJBRDIzQiIsIlBPTEUiLCJQT0xEMSIsIlJBRDIzQSIsIkxJRzMiLCJDRVROMiIsIkREQjEiLCJEREIyIiwiR1RGMkgxIiwiR1RGMkgzIiwiR1RGMkg0IiwiR1RGMkg1IiwiQ0RLNyIsIkNDTkgiLCJNTkFUMSIsIkxJRzEiLCJFUkNDOCIsIlVWU1NBIiwiWEFCMiIsIk1NUzE5IikpICU+JSBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikKR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9IUiA8LSBmaWx0ZXIoR25vbUFEX3N0YXRzX0xPRl9WRVAsU1lNQk9MJWluJWMoIkFUTSIsIlJQQTEiLCJSUEEyIiwiUlBBMyIsIlJQQTQiLCJSQUQ1MSIsIk5CTiIsIlJBRDUwIiwiQ0hFSzIiLCJQQUxCMiIsIk1VUzgxIiwiRU1FMSIsIk1SRTExQSIsIlJBRDUyIiwiUkFENTFCIiwiRE1DMSIsIlhSQ0MyIiwiWFJDQzMiLCJSQUQ1NEwiLCJSQUQ1NEIiLCJTSEZNMSIsIlJCQlA4IiwiU0xYMUEiLCJTTFgxQiIsIkdFTjEiKSkgJT4lIGZpbHRlcihDQU5PTklDQUw9PSJZRVMiKQpHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0ZBIDwtIGZpbHRlcihHbm9tQURfc3RhdHNfTE9GX1ZFUCxTWU1CT0wlaW4lYygiQVRSIiwiRVJDQzEiLCJGQU5DQSIsIkZBTkNCIiwiRkFOQ0MiLCJGQU5DRDIiLCJGQU5DRSIsIkZBTkNGIiwiRkFOQ0ciLCJGQU5DSSIsIkZBTkNMIiwiRkFOQ00iLCJQQUxCMiIsIkNIRUsxIiwiU0xYNCIsIkZBTjEiLCJDMW9yZjg2IiwiIEMxOW9yZjQwIiwiTVVTODEiLCJFTUUxIikpICU+JSBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikKR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9OSEVKIDwtIGZpbHRlcihHbm9tQURfc3RhdHNfTE9GX1ZFUCxTWU1CT0wlaW4lYygiWFJDQzYiLCJYUkNDNSIsIlBSS0RDIiwiTElHNCIsIlhSQ0M0IiwiRENMUkUxQyIsIk5IRUoxIikpICU+JSBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikKR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9EUiA8LSBmaWx0ZXIoR25vbUFEX3N0YXRzX0xPRl9WRVAsU1lNQk9MJWluJWMoIk1HTVQiLCJBTEtCSDIiLCJBTEtCSDMiKSkgJT4lIGZpbHRlcihDQU5PTklDQUw9PSJZRVMiKQpHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0FMTHJlcGFpciA8LSBmaWx0ZXIoR25vbUFEX3N0YXRzX0xPRl9WRVAsU1lNQk9MJWluJWMoIlhSQ0MxIiwiUEFSUDEiLCJQQVJQMiIsIkFQRVgxIiwiRkVOMSIsIk9HRzEiLCJVTkciLCJTTVVHMSIsIk1CRDQiLCJUREciLCJNVVRZSCIsIk5USEwxIiwiTVBHIiwiTkVJTDEiLCJORUlMMiIsIk5FSUwzIiwiQVBFWDIiLCJQTktQIiwiQVBMRiIsIlBBUlAzIiwiTVNIMyIsIk1TSDQiLCJNU0g1IiwiTUxIMyIsIlBNUzEiLCJQTVMyUDMiLCJFWE8xIiwiUkZDMSIsIlJGQzIiLCJSRkMzIiwiUkZDNCIsIlJGQzUiLCJQQ05BIiwiRVJDQzQiLCJFUkNDMiIsIkVSQ0M1IiwiWFBDIiwiRVJDQzYiLCJHVEYySDIiLCJFUkNDMyIsIlhQQSIsIlJBRDIzQiIsIlBPTEUiLCJQT0xEMSIsIlJBRDIzQSIsIkxJRzMiLCJDRVROMiIsIkREQjEiLCJEREIyIiwiR1RGMkgxIiwiR1RGMkgzIiwiR1RGMkg0IiwiR1RGMkg1IiwiQ0RLNyIsIkNDTkgiLCJNTkFUMSIsIkxJRzEiLCJFUkNDOCIsIlVWU1NBIiwiWEFCMiIsIk1NUzE5IiwiQVRNIiwiUlBBMSIsIlJQQTIiLCJSUEEzIiwiUlBBNCIsIlJBRDUxIiwiTkJOIiwiUkFENTAiLCJDSEVLMiIsIk1SRTExQSIsIlJBRDUyIiwiUkFENTFCIiwiRE1DMSIsIlhSQ0MyIiwiWFJDQzMiLCJSQUQ1NEwiLCJSQUQ1NEIiLCJTSEZNMSIsIlJCQlA4IiwiU0xYMUEiLCJTTFgxQiIsIkdFTjEiLCJBVFIiLCJFUkNDMSIsIkZBTkNBIiwiRkFOQ0IiLCJGQU5DQyIsIkZBTkNEMiIsIkZBTkNFIiwiRkFOQ0YiLCJGQU5DRyIsIkZBTkNJIiwiRkFOQ0wiLCJGQU5DTSIsIlBBTEIyIiwiQ0hFSzEiLCJTTFg0IiwiRkFOMSIsIkMxb3JmODYiLCIgQzE5b3JmNDAiLCJNVVM4MSIsIkVNRTEiLCJYUkNDNiIsIlhSQ0M1IiwiUFJLREMiLCJMSUc0IiwiWFJDQzQiLCJEQ0xSRTFDIiwiTkhFSjEiLCJNR01UIiwiQUxLQkgyIiwiQUxLQkgzIikpICU+JSBmaWx0ZXIoQ0FOT05JQ0FMPT0iWUVTIikKR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9PVEhFUiA8LSBmaWx0ZXIoR25vbUFEX3N0YXRzX0xPRl9WRVAsU1lNQk9MJWluJWMoIlBBWElQMSIsIkJMTSIsIktNVDJDIiwiQ1JJUDEiLCJDREsxMiIsIkJBUDEiLCJCQVJEMSIsIldSTiIsIkJVQjEiLCJDRU5QRSIsIlpXMTAiLCJUVEsiLCJLTlRDMSIsIkFVUktCIiwiUE9MQiIsIlBPTEgiLCJQT0xRIiwiVERQMSIsIlREUDIiLCJOVURUMSIsIkRVVCIsIlJSTTJCIiwiUE9MRyIsIlJFVjNMIiwiTUFEMkwyIiwiUkVWMSIsIlBPTEkiLCJQT0xLIiwiUE9MTCIsIlBPTE0iLCJQT0xOIiwiVFJFWDEiLCJUUkVYMiIsIkFQVFgiLCJTUE8xMSIsIkVORE9WIiwiVUJFMkEiLCJVQkUyQiIsIlJBRDE4IiwiU0hQUkgiLCJITFRGIiwiUk5GMTY4IiwiU1BSVE4iLCJSTkY4IiwiUk5GNCIsIlVCRTJWMiIsIlVCRTJOIiwiSDJBRlgiLCJDSEFGMUEiLCJTRVRNQVIiLCJSRUNRTDQiLCJNUExLSVAiLCJEQ0xSRTFBIiwiRENMUkUxQiIsIlBSUEYxOSIsIlJFQ1FMIiwiUkVDUUw1IiwiSEVMUSIsIlJETTEiLCJOQUJQMiIsIkFUUklQIiwiTURDMSIsIlJBRDEiLCJSQUQ5QSIsIkhVUzEiLCJSQUQxNyIsIlRQNTMiLCJUUDUzQlAxIiwiVE9QQlAxIiwiQ0xLMiIsIlBFUjEiKSkgJT4lIGZpbHRlcihDQU5PTklDQUw9PSJZRVMiKQpHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0FMTHJlcGFpcl9PVEhFUiA8LSBiaW5kX3Jvd3MoCiAgR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9BTExyZXBhaXIsCiAgR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9PVEhFUikKYGBgCgpDYWxjdWxhdGUgc2FtcGxlIGFuZCBHbm9tQUQgdG90YWxzIGZvciBETkEgcmVwYWlyIGdlbmVzIGFuZCBleHRyYWN0IGludG8gbmV3IGRhdGEgZnJhbWUKYGBge3J9CmEgPC0gYygiQkVSIiwiTU1SIiwiTkVSIiwiSFIiLCJGQSIsIk5IRUoiLCJEUiIsIkFMTCIsIk9USEVSIikKYiA8LSBjKHN1bShnZW5lc19CRVIkVG90YWxfR2VuZV9Db3VudCksCiAgICAgICBzdW0oZ2VuZXNfTU1SJFRvdGFsX0dlbmVfQ291bnQpLAogICAgICAgc3VtKGdlbmVzX05FUiRUb3RhbF9HZW5lX0NvdW50KSwKICAgICAgIHN1bShnZW5lc19IUiRUb3RhbF9HZW5lX0NvdW50KSwKICAgICAgIHN1bShnZW5lc19GQSRUb3RhbF9HZW5lX0NvdW50KSwKICAgICAgIHN1bShnZW5lc19OSEVKJFRvdGFsX0dlbmVfQ291bnQpLAogICAgICAgc3VtKGdlbmVzX0RSJFRvdGFsX0dlbmVfQ291bnQpLAogICAgICAgc3VtKGdlbmVzX0FMTHJlcGFpciRUb3RhbF9HZW5lX0NvdW50KSwKICAgICAgIHN1bShnZW5lc19PVEhFUiRUb3RhbF9HZW5lX0NvdW50KSkKYyA8LSBjKChuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIqbnJvdyhHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0JFUikpLAogICAgICAgKG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMipucm93KEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTU1SKSksCiAgICAgICAobl9kaXN0aW5jdChtYXN0ZXJmaWxlX2VvY19nb29kUTIkU2FtcGxlKSoyKm5yb3coR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9ORVIpKSwKICAgICAgIChuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIqbnJvdyhHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0hSKSksCiAgICAgICAobl9kaXN0aW5jdChtYXN0ZXJmaWxlX2VvY19nb29kUTIkU2FtcGxlKSoyKm5yb3coR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9GQSkpLAogICAgICAgKG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMipucm93KEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTkhFSikpLAogICAgICAgKG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMipucm93KEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRFIpKSwKICAgICAgIChuX2Rpc3RpbmN0KG1hc3RlcmZpbGVfZW9jX2dvb2RRMiRTYW1wbGUpKjIqbnJvdyhHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0FMTHJlcGFpcikpLAogICAgICAgKG5fZGlzdGluY3QobWFzdGVyZmlsZV9lb2NfZ29vZFEyJFNhbXBsZSkqMipucm93KEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfT1RIRVIpKSkKZCA8LSBjKHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0JFUiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTU1SJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9ORVIkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1KSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0hSJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9GQSRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTkhFSiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRFIkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1KSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0FMTHJlcGFpciRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfT1RIRVIkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1KSkKZSA8LSBjKHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0JFUiRNQVhfQU4pLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTU1SJE1BWF9BTiksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9ORVIkTUFYX0FOKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0hSJE1BWF9BTiksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9GQSRNQVhfQU4pLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfTkhFSiRNQVhfQU4pLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRFIkTUFYX0FOKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0FMTHJlcGFpciRNQVhfQU4pLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfT1RIRVIkTUFYX0FOKSkKZiA8LSBjKHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0JFUiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDVfTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX01NUiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDVfTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX05FUiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDVfTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0hSJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9ORkUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRkEkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9OSEVKJEZJTFRFUl9SRl9MT0ZfSElHSElNUEFDVF9BQ18wLjAwNV9ORkUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRFIkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9BTExyZXBhaXIkRklMVEVSX1JGX0xPRl9ISUdISU1QQUNUX0FDXzAuMDA1X05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9PVEhFUiRGSUxURVJfUkZfTE9GX0hJR0hJTVBBQ1RfQUNfMC4wMDVfTkZFKSkKZyA8LSBjKHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0JFUiRNQVhfQU5fTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX01NUiRNQVhfQU5fTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX05FUiRNQVhfQU5fTkZFKSwKICAgICAgIHN1bShHbm9tQURfc3RhdHNfTE9GX1ZFUF9FTlNUY2Fub25pY2FsX0hSJE1BWF9BTl9ORkUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRkEkTUFYX0FOX05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9OSEVKJE1BWF9BTl9ORkUpLAogICAgICAgc3VtKEdub21BRF9zdGF0c19MT0ZfVkVQX0VOU1RjYW5vbmljYWxfRFIkTUFYX0FOX05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9BTExyZXBhaXIkTUFYX0FOX05GRSksCiAgICAgICBzdW0oR25vbUFEX3N0YXRzX0xPRl9WRVBfRU5TVGNhbm9uaWNhbF9PVEhFUiRNQVhfQU5fTkZFKSkKCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnkgPC0gdGliYmxlKCJETkFfUmVwYWlyX1BhdGh3YXkiPWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVfVmFyaWFudF9Db3VudCI9YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdGFsX051bWJlcl9vZl9TYW1wbGVfQWxsZWxlcyI9YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdub21BRF9WYXJpYW50X0NvdW50Ij1kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWxfTnVtYmVyX29mX0dub21BRF9WYXJpYW50X0FsbGVsZXMiPWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHbm9tQURfVmFyaWFudF9Db3VudF9ORkUiPWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbF9OdW1iZXJfb2ZfR25vbUFEX1ZhcmlhbnRfQWxsZWxlc19ORkUiPWcpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnkyIDwtICBhZGRfcm93KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnksCiAgICAgICAgRE5BX1JlcGFpcl9QYXRod2F5PSJUT1RBTCIsCiAgICAgICAgU2FtcGxlX1ZhcmlhbnRfQ291bnQ9YXMubnVtZXJpYyhtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5WzgsMl0rbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeVs5LDJdKSwKICAgICAgICBUb3RhbF9OdW1iZXJfb2ZfU2FtcGxlX0FsbGVsZXM9YXMubnVtZXJpYyhtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5WzgsM10rbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeVs5LDNdKSwKICAgICAgICBHbm9tQURfVmFyaWFudF9Db3VudD1hcy5udW1lcmljKG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnlbOCw0XSttYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5WzksNF0pLAogICAgICAgIFRvdGFsX051bWJlcl9vZl9Hbm9tQURfVmFyaWFudF9BbGxlbGVzPWFzLm51bWVyaWMobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeVs4LDVdK21hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnlbOSw1XSksCiAgICAgICAgR25vbUFEX1ZhcmlhbnRfQ291bnRfTkZFPWFzLm51bWVyaWMobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeVs4LDZdK21hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnlbOSw2XSksCiAgICAgICAgVG90YWxfTnVtYmVyX29mX0dub21BRF9WYXJpYW50X0FsbGVsZXNfTkZFPWFzLm51bWVyaWMobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeVs4LDddK21hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnlbOSw3XSkpCmBgYAoKQ2FsY3VsYXRlIEZpc2hlcidzIHRlc3QgdmFsdWVzIGZvciBETkEgcmVwYWlyIGdlbmVzCmBgYHtyfQpmaXNoZXJyZXN1bHRzX0ROQXJlcGFpciA8LSBhcHBseShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5MlssYygyLDMsNCw1KV0sMSxmdW5jdGlvbih4KSB7ZmlzaGVyLnRlc3QocmJpbmQoeFsxOjJdLGMoeFszXS14WzFdLHhbNF0teFsyXSkpKX0pCgptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5MiRQX3ZhbHVlX0Zpc2hlcl8wLjAwNSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcixmdW5jdGlvbih4KSByb3VuZCh4JHAudmFsdWUsMjUpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5MiRPUl8wLjAwNSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcixmdW5jdGlvbih4KSByb3VuZCh4JGVzdGltYXRlLDQpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5MiRgOTUlQ0lfMC4wMDVgID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRE5BcmVwYWlyLGZ1bmN0aW9uKHgpIHBhc3RlKHJvdW5kKHgkY29uZi5pbnRbMToyXSwyKSxjb2xsYXBzZT0ifiIpKQoKZmlzaGVycmVzdWx0c19ETkFyZXBhaXJfTkZFIDwtIGFwcGx5KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnkyWyxjKDIsMyw2LDcpXSwxLGZ1bmN0aW9uKHgpIHtmaXNoZXIudGVzdChyYmluZCh4WzE6Ml0sYyh4WzNdLXhbMV0seFs0XS14WzJdKSkpfSkKCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnkyJFBfdmFsdWVfRmlzaGVyXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcl9ORkUsZnVuY3Rpb24oeCkgcm91bmQoeCRwLnZhbHVlLDI1KSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfc3VtbWFyeTIkT1JfMC4wMDVfTkZFID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRE5BcmVwYWlyX05GRSxmdW5jdGlvbih4KSByb3VuZCh4JGVzdGltYXRlLDQpKQptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9zdW1tYXJ5MiRgOTUlQ0lfMC4wMDVfTkZFYCA9IHNhcHBseShmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcl9ORkUsZnVuY3Rpb24oeCkgcGFzdGUocm91bmQoeCRjb25mLmludFsxOjJdLDIpLGNvbGxhcHNlPSJ+IikpCgpmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcl9vdGhlciA8LSBhcHBseShtYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9vdGhlclssYygyMjEsMjI5LDI0MywyNDQpXSwxLGZ1bmN0aW9uKHgpIHtmaXNoZXIudGVzdChyYmluZCh4WzE6Ml0sYyh4WzNdLXhbMV0seFs0XS14WzJdKSkpfSkKCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyJFBfdmFsdWVfRmlzaGVyXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRE5BcmVwYWlyX290aGVyLGZ1bmN0aW9uKHgpIHJvdW5kKHgkcC52YWx1ZSwxMikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyJE9SXzAuMDA1ID0gc2FwcGx5KGZpc2hlcnJlc3VsdHNfRE5BcmVwYWlyX290aGVyLGZ1bmN0aW9uKHgpIHJvdW5kKHgkZXN0aW1hdGUsNCkpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyJGA5NSVDSV8wLjAwNWAgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19ETkFyZXBhaXJfb3RoZXIsZnVuY3Rpb24oeCkgcGFzdGUocm91bmQoeCRjb25mLmludFsxOjJdLDIpLGNvbGxhcHNlPSJ+IikpCgpmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcl9vdGhlcl9ORkUgPC0gYXBwbHkobWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfb3RoZXJbLGMoMjIxLDIzMiwyNDMsMjQ1KV0sMSxmdW5jdGlvbih4KSB7ZmlzaGVyLnRlc3QocmJpbmQoeFsxOjJdLGMoeFszXS14WzFdLHhbNF0teFsyXSkpKX0pCgptYXN0ZXJmaWxlX2VvY19nb29kUTJfSElHSF9FTlNUY2Fub25pY2FsX3NhbXBsZUFGMC4wMV93aXRoR25vbUFEc3RhdHNfcmF0aW9zX3BvcG1heDAuMDA1X0ROQXJlcGFpcl9vdGhlciRQX3ZhbHVlX0Zpc2hlcl8wLjAwNV9ORkUgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19ETkFyZXBhaXJfb3RoZXJfTkZFLGZ1bmN0aW9uKHgpIHJvdW5kKHgkcC52YWx1ZSwxMikpCm1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyJE9SXzAuMDA1X05GRSA9IHNhcHBseShmaXNoZXJyZXN1bHRzX0ROQXJlcGFpcl9vdGhlcl9ORkUsZnVuY3Rpb24oeCkgcm91bmQoeCRlc3RpbWF0ZSw0KSkKbWFzdGVyZmlsZV9lb2NfZ29vZFEyX0hJR0hfRU5TVGNhbm9uaWNhbF9zYW1wbGVBRjAuMDFfd2l0aEdub21BRHN0YXRzX3JhdGlvc19wb3BtYXgwLjAwNV9ETkFyZXBhaXJfb3RoZXIkYDk1JUNJXzAuMDA1X05GRWAgPSBzYXBwbHkoZmlzaGVycmVzdWx0c19ETkFyZXBhaXJfb3RoZXJfTkZFLGZ1bmN0aW9uKHgpIHBhc3RlKHJvdW5kKHgkY29uZi5pbnRbMToyXSwyKSxjb2xsYXBzZT0ifiIpKQpgYGAKClJlbW92ZSByZWR1bmRhbnQgZGF0YSBvYmplY3RzIGFuZCBvdXRwdXQgdmFyaWFudHMgYW5kIHN1bW1hcnkgcmVzdWx0cyB0YWJsZSBmb3IgRE5BIHJlcGFpciBnZW5lcwpgYGB7cn0Kcm0obGlzdD0obHMocGF0dGVybj0iXmdlbmVzIikpKQpybShsaXN0PShscyhwYXR0ZXJuPSJedmFyaWFudHMiKSkpCnJtKGxpc3Q9KGxzKHBhdHRlcm49Il5maXNoZXJyZXN1bHRzIikpKQoKd3JpdGVfZXhjZWxfY3N2KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyLHBhdGg9Im1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX290aGVyLmNzdiIsbmE9Ii4iLGFwcGVuZD1GQUxTRSxjb2xfbmFtZXM9VFJVRSkKd3JpdGVfZXhjZWxfY3N2KG1hc3RlcmZpbGVfZW9jX2dvb2RRMl9ISUdIX0VOU1RjYW5vbmljYWxfc2FtcGxlQUYwLjAxX3dpdGhHbm9tQURzdGF0c19yYXRpb3NfcG9wbWF4MC4wMDVfRE5BcmVwYWlyX3N1bW1hcnkyLHBhdGg9Im1hc3RlcmZpbGVfZW9jX0ROQXJlcGFpcl9maXNoZXJyZXN1bHRzLmNzdiIsbmE9Ii4iLGFwcGVuZD1GQUxTRSxjb2xfbmFtZXM9VFJVRSkKYGBg