tissue_of_interest = "Liver"
library(here)
source("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/boilerplate.R")
#tiss = load_tissue_droplet(tissue_of_interest)
#library(scater)
library(dplyr)
library(Seurat)
library(cowplot)
#library(MAST)
require(stringr)
require(reshape2)
require(ggplot2)
require(MASS)
library(tools)
require(data.table)
library(ggfortify)
library(tidyverse)
require(dplyr)
library(miscTools)
library(caret)
library(Rtsne)
library(ggrepel)
library(reticulate) # to import anndata use low version of gcc/5.50 in enviroenm sccloud.
# demux results from demuxEM
# source : https://cumulus-doc.readthedocs.io/en/latest/hashing_cite_seq.html#load-demultiplexing-results-into-python-and-r
ad1 <- import("pytz'", convert = FALSE)

ad <- import("anndata", convert = FALSE)
#data <- ad$read_h5ad("output_name_demux.h5ad")
data <- ad$read_h5ad("/restricted/projectnb/waxmanlab/kkarri/G172_demux/G172_demuxEM_citeUMI_demux.h5ad")
adtdata <- ad$read_h5ad("/restricted/projectnb/waxmanlab/kkarri/G172_demux/G172_demuxEM_citeUMI_ADTs.h5ad")
scdata <- ad$read_h5ad("/restricted/projectnb/waxmanlab/kkarri/G172_demux/G172_demuxEM_citeUMI_demux.h5sc")

data <- ad$read_h5ad("/restricted/projectnb/waxmanlab/kkarri/software/Xist_ChrY/G172_M2-M4_Output_demux.h5ad")


#import the anndata predictions from python to R and then to a csv
rdata_obs <- py_to_r(data$obs)
write.table(as.data.frame(rdata_obs), "/restricted/projectnb/waxmanlab/kkarri/G172_demux/results/G172_demux_classification")

write.table(as.data.frame(rdata_obs), "/restricted/projectnb/waxmanlab/kkarri/software/Xist_ChrY/G172_M2-M4_Xist-chrY_demux_classification", sep="\t")

#G172.umis <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/10X_TCPO_premRNA_Transcript/outs/filtered_feature_bc_matrix")

G172.umis <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/10X_TCPO_premRNA_Gene/outs/filtered_feature_bc_matrix")


ncRNA <- grep(pattern = "^ncRNA", x = rownames(x = G172.umis), value = TRUE)
lncRNA <- Matrix::colSums(G172.umis[ncRNA, ]>0)

#G172.umis.raw <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/10X_TCPO_premRNA_Transcript/outs/raw_feature_bc_matrix/")

G172.htos <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/HASH_Citeseq/HASH_Results_filtered-10X-BC/umi_count", gene.column=1)

G172.Xist.ChrY <- read.csv("/restricted/projectnb/waxmanlab/kkarri/software/Xist_ChrY/G172_M2_M4_nonzero.csv", header = T, row.names = "X")


G172.htos <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/HASH_Citeseq/HASH_Results_raw-10X-BC/umi_count", gene.column=1)


G172.demux.htos <- ReadH5AD("/restricted/projectnb/waxmanlab/kkarri/G172_demux/G172_demuxEM_citeUMI_ADTs.h5ad")
#G172top <- read.table("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/G172_Top_M1.txt", header = T, row.names = "cellbarcode") ### this is only for M1 top
G172.hash.metadata <- read.table("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/Top_Bottom_Metadata.txt",header = T, sep = "\t", row.names = "cellbarcode")

G172.hash.metadata$cellbarcode <- rownames(G172.hash.metadata)

G172top <- G172.hash.metadata[grep("Top",G172.hash.metadata$Top.Bottom),]
G172.top.M1 <- G172top[grep("M1",G172top$hash.ID),]
G172.top.M2 <- G172top[grep("M2",G172top$hash.ID),]
#G172bottom <- read.table("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/G172_Bottom_M1.txt", header = T, row.names = "cellbarcode") ## this is ont for M1 bottom
G172bottom <- G172.hash.metadata[grep("Bottom",G172.hash.metadata$Top.Bottom),]
G172.bottom.M1 <- G172bottom[grep("M1",G172bottom$hash.ID),]
G172.bottom.M2 <- G172bottom[grep("M2",G172bottom$hash.ID),]

############################ All pre-labelled samples from demuxEM and HTodemux (Seurat) ###################
M1_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M1_both_2656.txt", row.names = "ID")
M2_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M2_both_2868.txt", row.names = "ID")
M3_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M3_both_2376.txt", row.names = "ID")
M4_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M4_both_2679.txt", row.names = "ID")
M1_demuxEM <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M1_demuxEM_1149.txt", row.names = "ID")
M2_demuxEM <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M2_demuxEM_3880.txt", row.names = "ID")
M3_demuxEM <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M3_demuxEM_1276.txt", row.names = "ID")
M4_demuxEM <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M4_demuxEM_1076.txt", row.names = "ID")
M1_HTOdemux <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M1_HTOdemux_827.txt", row.names = "ID")
M2_HTOdemux <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M2_HTOdemux_125.txt", row.names = "ID")
M3_HTOdemux <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M3_HTOdemux_827.txt", row.names = "ID")
M4_HTOdemux <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M4_HTOdemux_889.txt", row.names = "ID")

M1_clean_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M1_clean_both_782.txt", row.names = "ID")

M2_clean_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M2_clean_both_950.txt", row.names = "ID")

M3_clean_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M3_clean_both_852.txt", row.names = "ID")

M4_clean_both <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M4_clean_both_965.txt", row.names = "ID")



M1_both_top80 <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M1_both_top80.txt", row.names = "ID")

M2_both_top80 <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M2_both_top80.txt", row.names = "ID")

M3_both_top80 <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M3_both_top80.txt", row.names = "ID")

M4_both_top80 <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/demuxEM_HTodemux_analysis/M4_both_top80.txt", row.names = "ID")

#############################################################################

  
# Select cell barcodes detected by both RNA and HTO In the example datasets we have already
# filtered the cells for you, but perform this step for clarity.
joint.bcs <- intersect(colnames(G172.umis), colnames(G172.htos))
joint.bcs.top <- intersect(colnames(G172.umis), rownames(G172top))
joint.bcs.bottom <- intersect(colnames(G172.umis), rownames(G172bottom))
joint.demux <- intersect(colnames(G172.umis), colnames(G172.))
joint.xist.chrY <- intersect(colnames(G172.umis), colnames(G172.Xist.ChrY))

# Subset RNA and HTO counts by joint cell barcodes
joint_cite1_cite2 <- intersect(colnames(G172.htos), colnames(df2))
G172.umis <- G172.umis[, joint.bcs]
G172.umis <- G172.umis[, joint.xist.chrY]

G172.htos <- as.matrix(G172.htos[, joint.bcs])
G172.htos <- G172.htos[-5,]
G172.Xist.ChrY <- as.matrix(G172.Xist.ChrY[, joint.xist.chrY])


################################ joint barcodes for preloaded barcodes ###################
joint.bcs.M1.both <- intersect(colnames(G172.umis), rownames(M1_both))
joint.bcs.M2.both <- intersect(colnames(G172.umis), rownames(M2_both))
joint.bcs.M3.both <- intersect(colnames(G172.umis), rownames(M3_both))
joint.bcs.M4.both <- intersect(colnames(G172.umis), rownames(M4_both))
joint.bcs <- c(joint.bcs.M1.both, joint.bcs.M2.both,joint.bcs.M3.both,joint.bcs.M4.both)

joint.bcs.M1.demuxEM <- intersect(colnames(G172.umis), rownames(M1_demuxEM))
joint.bcs.M2.demuxEM <- intersect(colnames(G172.umis), rownames(M2_demuxEM))
joint.bcs.M3.demuxEM <- intersect(colnames(G172.umis), rownames(M3_demuxEM))
joint.bcs.M4.demuxEM <- intersect(colnames(G172.umis), rownames(M4_demuxEM))

joint.bcs.M1.HTOdemux <- intersect(colnames(G172.umis), rownames(M1_HTOdemux))
joint.bcs.M2.HTOdemux <- intersect(colnames(G172.umis), rownames(M2_HTOdemux))
joint.bcs.M3.HTOdemux <- intersect(colnames(G172.umis), rownames(M3_HTOdemux))
joint.bcs.M4.HTOdemux <- intersect(colnames(G172.umis), rownames(M4_HTOdemux))


joint.bcs.M1.top <- intersect(colnames(G172.umis), rownames(G172.top.M1))
joint.bcs.M2.top <- intersect(colnames(G172.umis), rownames(G172.top.M2))
joint.bcs.M1.bottom <- intersect(colnames(G172.umis), rownames(G172.bottom.M1))
joint.bcs.M2.bottom <- intersect(colnames(G172.umis), rownames(G172.bottom.M2))


joint.bcs.M1.clean.both <- intersect(colnames(G172.umis), rownames(M1_clean_both))
joint.bcs.M2.clean.both <- intersect(colnames(G172.umis), rownames(M2_clean_both))
joint.bcs.M3.clean.both <- intersect(colnames(G172.umis), rownames(M3_clean_both))
joint.bcs.M4.clean.both <- intersect(colnames(G172.umis), rownames(M4_clean_both))



joint.bcs.M1.both.top80 <- intersect(colnames(G172.umis), rownames(M1_both_top80))
joint.bcs.M2.both.top80 <- intersect(colnames(G172.umis), rownames(M2_both_top80))
joint.bcs.M3.both.top80 <- intersect(colnames(G172.umis), rownames(M3_both_top80))
joint.bcs.M4.both.top80 <- intersect(colnames(G172.umis), rownames(M4_both_top80))

  #colnames(raw.data) <- lapply(colnames(raw.data), function(x) paste0(tissue_metadata$channel[1],'_',x))
  
# Confirm that the HTO have the correct names
rownames(G172.htos)
#################### Before making a Seurat object remove sex-biased genes or TCPO-induced genes####################
# Remove ERCC from count.data
#All.sex.index <- grep(c("Alb|Cyp2b10"), x = rownames(count.data), value = FALSE) 
x1 <- grep(c("1810046K07Rik|2700097O09Rik|A1bg|Abcb1a|Abcc1|Abcc4|Abcd2|Abhd2|Acnat2|Acot2|Acot3|Acot4|Acot6|Acss2|Acss3|Actg1|Adcy1|Adrb2|Aif1|Akna|Akr1b7|Akr1c18|Akr1c20|Akr1d1|Aldh1b1|Aldh3a2|Amigo2|Ankrd55|Anxa6|Ar|Arhgap30|Arhgef19|Arhgef37|Arl13b|Arrdc4|Asb2|Atf3|Atp2b2|Atp6v0d2|Atp8a1|B3galnt1|B430306N03Rik|Batf2|Bche|Bin2|Bmper|C5ar1|Cables1|Camk1d|Camkk2|Cbr1|Ccbe1|Ccdc141|Ccdc68|Cchcr1|Ccl2|Ccl5|Ccnd1|Cd14|Cd163|Cd274|Cd300e|Cd36|Cd3e|Cd44|Cd52|Cd53|Cd72|Cd74|Cd83|Cdcp1|Cdkn1c|Cdx4|Cdyl2|Cenpm|Cep152|Cers6|Ces1b|Ces1c|Cfp|Chic1|Chrna4|Clec12a|Clic3|Cmklr1|Cmpk2|Cnst|Corin|Crls1|Csf1|Ctbp2|Cth|Ctsc|Ctss|Cux2|Cxcl10|Cxcl13|Cxcl9|Cyba|Cybb|Cyp17a1|Cyp2a22|Cyp2a4|Cyp2a5|Cyp2b10|Cyp2b13|Cyp2b9|Cyp2c37|Cyp2c38|Cyp2c39|Cyp2c40|Cyp2c50|Cyp2c54|Cyp2c69|Cyp2g1|Cyp39a1|Cyp3a16|Cyp3a41a|Cyp3a41b|Cyp3a44|Cyp46a1|Cyp4a10|Cyp4a14|Cyp4a31|Cyp4f16|Cyp7a1|D130043K22Rik|Dapk1|Dct|Ddah1|Dhrs7|Dlg4|Dll1|Dntt|Dock10|Dock7|Dqx1|Dram1|Dusp6|Echdc3|Eci3|Eif2s3x|Eif4e3|Elf4|Emp2|Enpp1|Esr1|Esrrg|Evc|Evc2|Evi2a|Fabp7|Fam126a|Fam49a|Fam84b|Fam89a|Fancc|Far1|Fbxl21|Fcer1g|Fgd2|Fibin|Fign|Fmn1|Fmo1|Fmo2|Fmo3|Fmo4|Folr2|Fpr1|Fpr2|Fut8|Fyb|G6pdx|Gadd45b|Gas1|Gas6|Gbp10|Gbp2|Gbp3|Gbp4|Gbp5|Gbp6|Gbp7|Gbp8|Gimap8|Gm11437|Gm4841|Golt1a|Got1|Gpr65|Gpsm1|Gpx7|Grid1|Gsto2|Gstt1|Gstt3|Gypc|Gzmb|H2-Aa|H2-Ab1|H2-DMb1|H2-Eb1|H2-Q1|H2-Q4|H2-T24|Hacl1|Hamp|Hamp2|Hao2|Hbegf|Hck|Hcls1|Hexb|Hist1h4i|Hk3|Hpd|Hsd3b1|Htra4|Id1|Ifi202b|Ifi204|Ifi205|Ifi27l2b|Ifit1|Ifit2|Ifit3|Igfbp1|Igfbp3|Igsf6|Igtp|Il10ra|Il15|Il18bp|Il1b|Il2rg|Il7|Ildr2|Irgm1|Isg15|Itga4|Itga6|Itgal|Itgb2|Jazf1|Kcnj10|Kitl|Klf6|Klhl13|Klra2|Lacc1|Lck|Lect2|Lgals1|Lgr5|Lhpp|Lig1|Lrrc24|Lrrc25|Lrtm1|Lyz2|Maob|Marcksl1|Marco|Mat1a|Mbl2|Mdm1|Me2|Mest|Mfsd2a|Mgst3|Mkx|Mllt3|Mmd2|Mme|Mmrn2|Mpc1|Mroh6|Ms4a4d|Ms4a6c|Myo1f|N4bp2l1|Ncald|Ncf1|Ncf2|Ncf4|Ncmap|Ndrg1|Nfkb2|Ngfr|Nipal1|Nlrp3|Nnmt|Npas2|Nqo1|Nr4a1|Nrp2|Nt5e|Ntrk2|Oasl2|Oat|Orm3|P2ry4|Papss2|Parp11|Pbx1|Pced1b|Pcp4l1|Pcsk5|Pde1a|Pde4d|Pdk4|Pgm5|Pik3r5|Pira2|Pla1a|Pla2g4b|Plek|Plgrkt|Plscr2|Pnpla3|Pola1|Ppl|Prex1|Prlr|Prom1|Prom2|Psd|Psmb8|Psmb9|Ptgds|Ptpdc1|Ptprc|Pygo1|Rab27a|Rab30|Rac2|Raet1e|Rbl1|Rcan2|Rcan3|Rdh16|Ren1|Rfx4|Rgn|Rgs12|Rnd1|Rsph4a|Rtn4|S100a13|Sall1|Samd9l|Sbk1|Sdc1|Sept1|Serpina3g|Serpina6|Serpinb1a|Serpinb8|Serpine3|Setd4|Sgsm1|Sgsm2|Sh2d4a|Sh3bgrl3|Sh3yl1|Shroom1|Ski|Slc13a3|Slc15a3|Slc16a5|Slc16a7|Slc17a4|Slc22a26|Slc22a27|Slc22a29|Slc25a21|Slc25a24|Slc25a27|Slc25a34|Slc26a10|Slc34a2|Slc39a5|Slc47a1|Slc4a4|Slc6a12|Slco1a4|Slfn8|Smim24|Smtnl2|Snai2|Snx12|Sorl1|Sox7|Sparcl1|Spic|Spice1|Spred1|Src|Srgap3|Srl|Srrm4|St6galnac4|Stambpl1|Stat1|Stk39|Sult1a1|Sult1c2|Sult1d1|Sult1e1|Sult2a1|Sult2a2|Sult2a3|Sult2a5|Sult2a6|Sult3a1|Sybu|Syk|Sytl5|Tbc1d8|Tcf7|Tcn2|Tead1|Tenm3|Tgm1|Tgtp1|Tgtp2|Thbs2|Thy1|Timd4|Tlr13|Tm4sf4|Tm6sf2|Tmem173|Tmem200b|Tmem26|Tmem98|Tmsb4x|Tnfaip8|Tnfaip8l3|Tnfsf10|Tnik|Tox|Treml4|Trim13|Trim24|Trim30a|Trim80|Tspyl4|Ttc21b|Txndc16|Tyrobp|Uba7|Ugt1a1|Ugt1a5|Ugt2b37|Utp14b|Vcam1|Vldlr|Wfdc15b|Wfdc17|Wfdc2|Zap70|Zbp1|Zc2hc1a|Zc3h12d|Zfp292|Zfp36l1|Zfp429|Zfp820|Zfp947|Zfp960|1810055G02Rik|2010003K11Rik|2200002D01Rik|3110082I17Rik|9130409I23Rik|A2m|Aadat|Abcb10|Abcg2|Abhd17b|Abhd5|Acsf2|Acsm2|Adamtsl2|Adarb2|Adora1|Adrb3|Ak4|Alas2|Aldoc|Alpl|Aox1|Aox3|Apoa1|Apoc2|Apol10a|Aqp4|Arhgap44|Arl6ip1|Arsa|Arsg|Asns|Atg16l2|Atp8b4|B3galt1|B4galnt3|Bcl6|Bik|Bmp4|Bmyc|Bok|C6|C7|C8a|C8b|C9|Cad|Caln1|Camk2b|Capn8|Cblc|Ccdc171|Ccne1|Ccnf|Ces1e|Ces2b|Ces2c|Ces3a|Ces3b|Ces4a|Chac1|Chpt1|Chrna2|Ciart|Cib3|Cidec|Clec2h|Clstn3|Col27a1|Col5a3|Comt|Cpne2|Cpne8|Cpsf4l|Crlf2|Crybb3|Csad|Cspg5|Ctps|Cxcl14|Cyp21a1|Cyp2c67|Cyp2d40|Cyp2d9|Cyp2f2|Cyp2j9|Cyp2u1|Cyp3a11|Cyp4a12a|Cyp4a12b|Cyp4a32|Cyp4v3|Cyp7b1|Cyp8b1|Cys1|Dbp|Ddx3y|Derl3|Dirc2|Dnaic1|Dnajc12|Dpy19l1|Dpy19l3|Dsg1c|Efna3|Egfr|Eif2s3y|Eif4ebp3|Elovl3|Enpp2|Enpp3|Ephx1|Ephx2|Eps8l2|Erc2|Ero1lb|F2r|F830016B08Rik"),x = rownames(G172.umis), value = FALSE)
x2 <- grep(c("Fabp5|Fam171b|Fam222a|Fam47e|Fbxo21|Fgf21|Fitm1|Fkbp11|Fmn2|Fst|Gcnt4|Gde1|Gdpd1|Gjc3|Glo1|Gm7694|Gna12|Gna14|Gpc1|Gpr12|Grem2|Grhpr|Grm8|Gse1|Gsta2|Gstm3|Gstp1|Gstp2|Gtf2b|Gys2|H1fx|H6pd|Hao1|Haus4|Hba-a1|Hba-a2|Hbb-bs|Hc|Hes6|Hp|Hpx|Hsbp1l1|Hsd3b2|Hsd3b5|Hspa1b|Hspb1|Hspb6|Hunk|Igsf23|Ihh|Ikbkg|Il12rb1|Il1r1|Impa2|Insc|Isyna1|Kctd15|Kdm5d|Keg1|Klhdc7a|Lama3|Lcn2|Ldhd|Lhx6|Lpl|Lrg1|Lrrc20|Magee1|Maml3|Mas1|Mcm10|Mmp15|Mn1|Mrgpre|Mri1|Mrvi1|Mthfd1l|Mthfd2|Mtmr7|Mtnr1a|Mug1|Mup1|Mup10|Mup11|Mup12|Mup13|Mup14|Mup15|Mup16|Mup17|Mup19|Mup20|Mup21|Mup3|Mup5|Mup6|Mup7|Mup9|Mycn|Myef2|Nat8|Nek2|Nhej1|Nlrp12|Nox4|Nudt7|Nuggc|Obp2a|Ociad2|Olfm3|Olfr613|Omd|Orm1|Orm2|Osgin1|Paqr7|Pard3b|Pdilt|Per2|Pfkfb3|Pgp|Pitx3|Pkdrej|Plekha1|Pnlip|Podn|Ppp1r1b|Proca1|Prss8|Prtn3|Rab34|Rarres1|Rassf3|Rbbp4|Retsat|Rnase13|Rnaseh2a|Rnaseh2b|Saa1|Saa2|Saa3|Scara5|Scp2|Sdr16c5|Sebox|Sel1l3|Selenbp2|Serinc2|Serpina11|Serpina12|Serpina1a|Serpina1c|Serpina1d|Serpina3a|Serpina3k|Serpina5|Serpina7|Serpina9|Serpine2|Slc12a4|Slc13a5|Slc15a5|Slc17a8|Slc22a28|Slc22a7|Slc25a33|Slc35e3|Slc41a2|Slc6a8|Slco1a1|Smpd3|Snhg11|Snx29|Sort1|Sox12|Spatc1l|Spon2|Spp1|Srd5a1|Stbd1|Stk19|Susd4|Sycp3|Tcaim|Tdo2|Tff3|Tmc7|Tmem41a|Tnfrsf12a|Tpmt|Tram2|Treh|Trip4|Tsku|Tspan33|Tspan4|Ttc39a|Ttc39c|Uba5|Ugdh|Ugt1a6b|Ugt2b1|Ugt2b35|Ugt2b38|Ugt2b5|Unc119|Unc13b|Unc5b|Usp2|Uty|Vmo1|Wee1|Wipi1|Wnk4|Xlr3a|Zbtb7c|Zdhhc2|Zfp445|Zfp687|Zfp809|Zfp872|Gm47283"),x = rownames(G172.umis), value = FALSE)
x3 <- grep(c("ncRNA_as_chr10_9385|ncRNA_as_chr11_10058|ncRNA_as_chr11_10170|ncRNA_as_chr14_11846|ncRNA_as_chr15_12679|ncRNA_as_chr15_12957|ncRNA_as_chr16_13512|ncRNA_as_chr17_13628|ncRNA_as_chr1_757|ncRNA_as_chr2_1125|ncRNA_as_chr2_1343|ncRNA_as_chr4_3230|ncRNA_as_chr4_3843|ncRNA_as_chr5_4731|ncRNA_as_chr5_4745|ncRNA_as_chr7_6007|ncRNA_as_chr8_7290|ncRNA_as_chr8_7332|ncRNA_as_chr9_7824|ncRNA_as_chrx_15546|ncRNA_inter_chr10_9183|ncRNA_inter_chr10_9222|ncRNA_inter_chr10_9223|ncRNA_inter_chr10_9224|ncRNA_inter_chr12_10681|ncRNA_inter_chr12_10922|ncRNA_inter_chr1_290|ncRNA_inter_chr13_11189|ncRNA_inter_chr13_11437|ncRNA_inter_chr13_11438|ncRNA_inter_chr1_341|ncRNA_inter_chr14_11978|ncRNA_inter_chr14_12237|ncRNA_inter_chr15_12585|ncRNA_inter_chr15_12683|ncRNA_inter_chr15_12684|ncRNA_inter_chr16_13062|ncRNA_inter_chr16_13225|ncRNA_inter_chr16_13428|ncRNA_inter_chr16_13510|ncRNA_inter_chr18_14392|ncRNA_inter_chr18_14432|ncRNA_inter_chr18_14590|ncRNA_inter_chr19_14770|ncRNA_inter_chr19_14802|ncRNA_inter_chr1_977|ncRNA_inter_chr2_1422|ncRNA_inter_chr2_1424|ncRNA_inter_chr2_1430|ncRNA_inter_chr2_1432|ncRNA_inter_chr2_2012|ncRNA_inter_chr2_2016|ncRNA_inter_chr2_2017|ncRNA_inter_chr2_2085|ncRNA_inter_chr3_2743|ncRNA_inter_chr3_2915|ncRNA_inter_chr3_2937|ncRNA_inter_chr3_3002|ncRNA_inter_chr4_3141|ncRNA_inter_chr4_3177|ncRNA_inter_chr4_3344|ncRNA_inter_chr5_4115|ncRNA_inter_chr5_4116|ncRNA_inter_chr5_4365|ncRNA_inter_chr5_4527|ncRNA_inter_chr5_4763|ncRNA_inter_chr5_4764|ncRNA_inter_chr6_5138|ncRNA_inter_chr6_5253|ncRNA_inter_chr6_5691|ncRNA_inter_chr7_6113|ncRNA_inter_chr8_6766|ncRNA_inter_chr8_6946|ncRNA_inter_chr8_7105|ncRNA_inter_chr8_7334|ncRNA_inter_chr8_7684|ncRNA_inter_chr9_7878|ncRNA_inter_chr9_8015|ncRNA_inter_chr9_8249"),x=rownames(G172.umis),value=FALSE)
x4 <- grep(c("ncRNA_inter_chrX_15376|ncRNA_inter_chrX_15394|ncRNA_inter_chrX_15549|ncRNA_intra_chr15_12674|ncRNA_intra_chr15_12675|ncRNA_intra_chr19_15008|ncRNA_intra_chr19_15009|ncRNA_intra_chr19_15014|ncRNA_intra_chr5_4726|ncRNA_intra_chr5_4728|ncRNA_intra_chr5_4730|ncRNA_intra_chr7_5920|ncRNA_intra_chr7_6001|ncRNA_intra_chr8_7308|ncRNA_intra_chr8_7310|ncRNA_as_chr10_9240|ncRNA_as_chr1_231|ncRNA_as_chr14_12074|ncRNA_as_chr15_12874|ncRNA_as_chr19_14711|ncRNA_as_chr19_15054|ncRNA_as_chr3_2192|ncRNA_as_chr3_2800|ncRNA_as_chr4_3297|ncRNA_as_chr6_5601|ncRNA_as_chr6_5851|ncRNA_as_chr7_6302|ncRNA_as_chr8_7087|ncRNA_as_chr9_8142|ncRNA_as_chr9_8420|ncRNA_as_chrX_15318|ncRNA_inter_chr10_8466|ncRNA_inter_chr10_8767|ncRNA_inter_chr10_8829|ncRNA_inter_chr10_8999|ncRNA_inter_chr10_9123|ncRNA_inter_chr10_9138|ncRNA_inter_chr10_9245|ncRNA_inter_chr10_9313|ncRNA_inter_chr10_9349|ncRNA_inter_chr10_9351|ncRNA_inter_chr11_10078|ncRNA_inter_chr11_10159|ncRNA_inter_chr11_10162|ncRNA_inter_chr1_115|ncRNA_inter_chr11_9925|ncRNA_inter_chr12_10423|ncRNA_inter_chr12_10454|ncRNA_inter_chr12_10458|ncRNA_inter_chr12_10562|ncRNA_inter_chr12_10910|ncRNA_inter_chr1_234|ncRNA_inter_chr13_11222|ncRNA_inter_chr13_11553|ncRNA_inter_chr13_11670|ncRNA_inter_chr13_11782|ncRNA_inter_chr1_406|ncRNA_inter_chr14_11858|ncRNA_inter_chr14_11989|ncRNA_inter_chr14_12201|ncRNA_inter_chr1_420|ncRNA_inter_chr1_477|ncRNA_inter_chr15_12341|ncRNA_inter_chr15_12609|ncRNA_inter_chr15_12937|ncRNA_inter_chr16_13170|ncRNA_inter_chr16_13173|ncRNA_inter_chr16_13176|ncRNA_inter_chr16_13177|ncRNA_inter_chr16_13349|ncRNA_inter_chr16_13451|ncRNA_inter_chr16_13470|ncRNA_inter_chr16_13471|ncRNA_inter_chr1_630|ncRNA_inter_chr17_13817|ncRNA_inter_chr17_13827|ncRNA_inter_chr17_13938|ncRNA_inter_chr17_13940|ncRNA_inter_chr17_13983"),x=rownames(G172.umis),value=FALSE)
x5 <- grep(c("ncRNA_inter_chr17_13986|ncRNA_inter_chr17_14028|ncRNA_inter_chr17_14151|ncRNA_inter_chr1_734|ncRNA_inter_chr18_14223|ncRNA_inter_chr19_14853|ncRNA_inter_chr19_14873|ncRNA_inter_chr1_931|ncRNA_inter_chr2_1156|ncRNA_inter_chr2_1157|ncRNA_inter_chr2_1232|ncRNA_inter_chr2_1233|ncRNA_inter_chr2_1462|ncRNA_inter_chr2_1471|ncRNA_inter_chr2_1479|ncRNA_inter_chr2_1502|ncRNA_inter_chr2_1689|ncRNA_inter_chr2_2002|ncRNA_inter_chr2_2037|ncRNA_inter_chr3_2314|ncRNA_inter_chr3_2504|ncRNA_inter_chr3_2786|ncRNA_inter_chr3_2935|ncRNA_inter_chr4_3079|ncRNA_inter_chr4_3468|ncRNA_inter_chr4_3723|ncRNA_inter_chr5_4681|ncRNA_inter_chr5_4787|ncRNA_inter_chr5_4819|ncRNA_inter_chr6_5023|ncRNA_inter_chr6_5248|ncRNA_inter_chr6_5309|ncRNA_inter_chr6_5316|ncRNA_inter_chr6_5551|ncRNA_inter_chr6_5595|ncRNA_inter_chr7_5922|ncRNA_inter_chr7_6087|ncRNA_inter_chr7_6220|ncRNA_inter_chr7_6222|ncRNA_inter_chr7_6509|ncRNA_inter_chr8_6739|ncRNA_inter_chr8_6741|ncRNA_inter_chr8_6876|ncRNA_inter_chr8_6971|ncRNA_inter_chr8_7280|ncRNA_inter_chr8_7420|ncRNA_inter_chr8_7423|ncRNA_inter_chr8_7430|ncRNA_inter_chr9_7753|ncRNA_inter_chr9_8099|ncRNA_inter_chr9_8122|ncRNA_inter_chr9_8383|ncRNA_intra_chr12_10856|ncRNA_intra_chr12_10872|ncRNA_intra_chr15_12911|ncRNA_intra_chr18_14533|ncRNA_intra_chr19_14773|ncRNA_inter_chrX_15394"),x = rownames(G172.umis), value = FALSE)


TCPO1 <- grep(c("Corin|Ppp1r3c|Xlr3a|Xlr3b|Cyp2a5|Ikbke|Gdf15|Anln|Rarb|Cdca2|Gna14|Kif20b|Tpx2|Cenpe|Arhgef39|Kif2c|Cxcl1|Mmd2|Ephb6|Wipf3|Gprc5d|Ttyh1|Atp4a|Plekha4|Mrgprb3|Bcl7c|Prr36|Fgl1|Slc18a1|Fcho1|Gm10638|St3gal4|Qsox1|Armc2|Dnajc12|Avpr1a|Kif5a|Camk2b|Olfr1393|Sgsm2|Capn8|Gpx6|Dcdc2a|Cxcl14|Lrit2|Sftpa1|Slc39a2|Tspyl5|Cpne8|Npff|Gp5|Prr18|Caskin1|Fam129b|Zfp811|Abcg5|Abcg8|Zbtb7c|Rom1|Cnnm1|Timp1|Xlr3c|Slc1a2|Spag4|Gm826|Rbpjl|Satb2|Gm6525|Ankrd6|Tmem169|Ttll10|Crot|Zfyve28|Ncapg|Ccdc18|Trpm8|Ugt1a5|Rph3a|Fzd10|Akr1d1|Zfp398|Gprin3|Mad2l1|Bmp10|Kbtbd12|Fancd2|Cdca3|Rad51ap1|Foxm1|Ptpn4|Bhlhe41|Lig1|Cyp2g1|Nphs1|Ccne1|Ticrr|Gsta3|Fzd4|Cdk18|Plk1|Kif22|Chid1|Shcbp1|Kif14|Cenpu|Neil3|Aspm|Ankle1|Pdp2|Gins2|Sipa1l2|Mmp12|Sesn3|Fam129a|Ccdc15|Cbl|H2afx|Apoa4|Cyp1a1|Kif23|Zwilch|Pif1|Traip|Fam198a|Kif15|Adgb|Sult3a1|Cdk1|Parpbp|Gas2l3|Kitl|Syt1|Nuf2|Cobl|Uhmk1|Fbxo48|Spdl1|Hmmr|Olfr16|Aurkb|Spag5|Exo1|Ska2|Lrrc46|Brca1|BC030867|Kif18b|Birc5|Rrm2|Rdh11|Plekhh1|Serpina6|Ncapg2|Adarb2|Zfp184|Hist1h2bk|Hist1h2be|Ppp1r3g|Atf3|Zfp369|Cenph|Meig1|Wnt5a|Cdkn3|Dlgap5|Tnfrsf19|Pbk|Klf12|Lmbrd2|Nebl|Recql4|Troap|Sapcd2|Cdc45|Polq|C330027C09Rik|Epha3|Ncam2|Cyyr1|Zfp97|Pkmyt1|Chtf18|Neurl1B|Kifc5b|Kifc1|Emilin2|Ndc80|Strn|Fzd8|Mib1|Stard4|Cdc25c|Kif20a|Ldlrad4|Mc5r|Ska1|Cfap53|Cyb5a|Gstp2|Incenp|Fen1|Ptar1|Kif11|Cep55|Cyp2c66|Lcor|4933411K16Rik|Slc9a7|Kif4|Fancb|Kif18a|Arhgap11a|Bub1b|Ncaph|Bub1|Wfdc16|Ube2c|Aurka|Gm14440|Ccna2|Plk4|Trim59|Tlr2|Iqgap3|Them5|Hist2h2bb|Nbeal1|Psrc1|Pard3b|Depdc1a|Mms22l|Melk|Smc2|Ptgr1|Mup19|Mup5|Mup21|Mup11|Mup15|Acot11|Orc1|Cdkn2c|Stil|Rad54l|Ptch2|Cdca8|Clspn|Aunip"),x = rownames(G172.umis), value = FALSE)
TCPO2 <- grep(c("Megf6|Vwa1|Cgref1|Sult5a1|Dio1|Ren1|Slc15a2|A1bg|Mup17|Trpv1|Klhl25|Cbr1|Gpcpd1|A2m|Cadm4|Ppp1r14a|Saa3|Rad51b|Fos|Dsg1c|Tchh|Crym|Gmnn|Bik|Trib3|Nnmt|E2f2|Sult1d1|Por|Mad1l1|Cyp3a11|Gadd45a|Cyp2b10|Tsku|Ces2a|4931406C07Rik|Alas1|Gadd45b|9130409I23Rik|Pnpla3|Dtx4|Cyp2c55|Cyp2c29|Rarres1|Gstm3|Pla2g12a|Rdh16|Gadd45g|Ttll13|Rnf186|Tmub1|Fabp2|Sult1e1|Katna1|Cyp21a1|Cyp3a44|Cyp2c40|Cyp2c69|Rdh9|Dbp|Atp2b2|Cdc20|Slc34a2|Akr1b7|Taf1d|Trmt61a|Nedd9|Pfkfb3|Gm14295|Gm14403|Exosc8|D630039A03Rik|Mug2|Pkp3|Derl3|Ndufa4l2|Slc16a11|Sema5b|Bmf|Ell3|Dnaic1|Cyp4a14|Cyp4a10|Azin2|Mt2|Mt1|Fbxo31|Igfbp1|Slc13a5|Pole|Ckap2|Apol10a|Sult1c2|Tcp11l1|Hao2|Mup12|Slc10a2|Colgalt2|Psmc3ip|Ttll8|Ptges|Gstm2|Gstm1|Ctps|Chka|Gjb4|Cdkn1a|Mki67|Cenpf|Ccnb1|Espl1|Knstrn|Thrsp|Shroom1|Hspa2|Pusl1|Hmgn3|Btnl9|Barhl1|Ttbk1|Stk36|Ihh|Saa2|Sebox|Cyb561|Slc7a15|Adamtsl2|Rbm20|Map3k6|Sc5d|Mis18bp1|Mastl|Chaf1a|Slc22a26|Slco1a4|Myc|Mbd1|Orm3|Fgf21|Adrb3|Serpina3n|Arid5a|Apol10b|Mup16|Vps37b|Rhbdd2|Papss2|Cyp26a1|Prss22|E030018B13Rik|Socs2|Upp2|Lnx1|Cux2|Zbed5|Slc12a9|Nxpe5|Sun1|3110082I17Rik|Tmem184a|Cyp3a16|Gpr12|Pon1|Hes6|Akr1b8|Trim24|Atoh8|Pparg|Gucy2c|Gys2|Ldhb|Rep15|Zfp773|Grik5|Phldb3|Lgi4|Nupr1|Adora1|Oat|B4galnt4|Lrrc56|Slc25a22|Cdkn1c|Ano1|Eif4ebp1|Rfxank|Pbx4|Slc27a1|Klf1|Hook2|Spata2L|Agt|Fam89a|Ccdc151|Oaf|1810046K07Rik|Pcbp4|Gnat1|Slc38a3|Mst1r|Col7a1|Plxnb1|Tmie|Acaa1a|Acvr2b|Cyp8b1|Tpd52l1|Fmo3|Col18a1|Tle2|Mterf2|Mgst3|Lrp1|B4galnt1|Itga7|Gls2|Tbc1d10a|Srebf1|Trp53i13|Rara|Arl4d|Rundc3a|Slc16a5|Llgl2|Tmc6|Plekhg3|Acot3|Rps6kl1|Eml1|D130043K22Rik|Foxq1|Fbp1|Ube2ql1|Slc12a7|Ccno|Mcm10|Il17rb|Rpgrip1|Rabggta|Tgm1|Irf9|Gulo|Sorbs3|Dct|Kifc2|Pdxp|Pmm1|Cenpm|Arhgap8|Celsr1|Chkb|Rnd1|Lmbr1l|Csad|Smim22|Dexi|Prodh|Clcn2|Agpat2|Sardh|Crat|Gm9992|Slc22a3|Unc93a|Ass1|Pim1|Slc25a25|St6galnac6|Cyp4f16|Gnmt|Plin5|Egr1|Gnpda1|Ppargc1b|Arhgef37|Pcyox1l|Bad|Macrod1|Slc22a29|Rab3il1|Trpm6|Got1|Col17a1|Gsto1|Plekhs1|Slc7a3|Mum1l1|Pdk1|Pla2g4f|Prom2|Acss2|Neurl2|Slc2a2|Thbs3"),x = rownames(G172.umis), value = FALSE)
TCPO3 <- grep(c("Il6ra|Selenbp1|Anxa9|Ctsk|Alpk1|Cth|Col27a1|Ccdc30|Hpca|Ptpru|Tmem200b|Cnksr1|Paqr7|Ifnlr1|Alpl|Rap1gap|Klhdc7a|Ugt2b35|Mob1b|Dr1|Ugt1a9|Hsph1|C1galt1|Grm8|Zfp212|Kbtbd8|B4galnt3|Slc15a5|Pla2g4c|Zfp619|Gas2|Cd55|Yod1|Prss23|Acer3|Ipo7|Mrvi1|Dkk3|Mical2|Psma1|Pde3b|Pdilt|Zfp768|Tnks|Ppp1r3b|Zfp617|Calr|Edem3|Swsap1|Zfp872|Hspa8|Tagln|Tex12|Arpp19|Pgm3|Spsb4|Poc1a|Manf|Prkar2a|Epm2aip1|Higd1a|Abhd5|Ginm1|Cacybp|Ddx21|Timp3|Creg1|Arl1|Dusp6|Wif1|Prim1|Irgm1|Hnrnpab|Bcl6b|Psmd11|Pigw|Rad51c|Nme1|Gm11541|Lsm12|Efcab3|Kpna2|Desi2|Zfp750|Rsad2|Dnajb9|Pygl|Pigh|Adam4|Tmed8|Alkbh1|Tc2n|Hsp90aa1|Tnfaip2|Nid1|Inhba|Rnf144b|Lysmd3|F2r|Itga1|Spryd7|Slc25a30|Lifr|Atad2|Ndrg1|St3gal1|Cyp2d9|Cyp2d12|Klhdc7b|Ankrd39|Fgd4|Sdf2l1|Tubb4b|Alg3|Map3k13|Lrrc58|Naa50|Dzip3|Rab44|Glo1|Ppp1r10|Enpp4|Catsperd|Nudt12|Srd5a2|Yipf4|Zbtb26|Psma8|Scai|Rnf125|Tmed7|Slc22a28|Ms4a4d|Mamdc2|Pik3ap1|Cox15|Xk|Pgrmc1|Zbtb33|Klhl15|Yipf6|Cdx4|Chic1|Npas2|Reps2|Mospd2|Cwc22|Sppl2a|Atrn|Pcna|4921509C19Rik|Rbl1|Zgpat|Il7|Supt20|Tcf24|Serp1|P2ry12|Ssr3|Aox1|S100a10|Nop58|Gstm4|5330417C22Rik|Prdm14|Xkr9|Rnpc3|Tmem56|Alg14|Fubp1|Fzd5|Ndufaf4|Mup3|Mup1|Mup10|Dph2|Akirin1|AW011738|Keg1|Per3|Insc|Nrg4|Ptp4a1|Abcc3|1810032O08Rik|Slc46a3|Rnf152|Steap3|Bbc3|Cyp2a4|Cyp2a22|Sh2d4a|Gamt|Tbc1d30|1810010H24Rik|Ccdc57|Syne3|Zfp395|Apol7a|Tef|Igfals|Slc22a7|Hsd3b3|Slc44a3|Uox|Cyp7a1|Enho|Tcea3|Arhgef19|Fam131c|Slc2a5|Lrg1|Cxcl10|Abhd2|Mycn|Nrep|P2ry4|Padi4|Insig2|Prg4|Leap2|Crp|Mal2|Rapgef4|Fam110a|Jun|8430408G22Rik|Lad1|Ces3a|Arrdc3|G0s2|Hsd3b5|Hsd3b2|Cyp2u1|Mreg|Il22ra1|Cyp3a59|Rgs1|Ddit4|Lcn2|1810055G02Rik|Rgs12|Cc2d2a|Ppargc1a|Nipal1|Ugt2b5|Afp|Gbp10|Gbp6|Fgfrl1|Sgsm1|2610524H06Rik|Oasl1|Fbxo21|Tbx3|Oas1c|Stx2|Cyp3a41a|Per2|Irf5|Pask|Zfp467|Avl9|Nat8|Serpinb8|Rassf4|Usp18|Clstn3|Clec2h|Ceacam2|Cd79a|Cyp2b9|Sertad3|Cd22|Tulp2|Svip|Wee1|Eef2k|Aqp8|Cd19|Fcer2a|Cd209c|Htra4|Mtnr1a|Klkb1|Lrp2bp|Nr3c2|Ces1f|Mmp15|Ces2h|Ces3b|Slc9a5|Mvd|Tmem218|Nxpe2|Cd276|Gclc|Nt5e|6430571L13Rik|Acaa1b|Dlec1|Wisp3|Tube1|Chst3|Fmo4|Fmo1|Rab36|Gstt2|Lss|Izumo4|Tjp3|Lin7a|Inhbe|Nab2|Mettl7b|Slc39a5|Osbp2|Ddc|Snrnp25|Pcp4l1|Pttg1|D930048N14Rik|Pctp|Tob1|Nr1d1|Krt23|Abca8a|Cbx8|Cbx4|Cbx2|Fn3k|Psen2|Cys1|Cmpk2|Atxn7l1|Acot4|Zc2hc1c|Serpina9|Akr1c19|Dsp|Rd3|Tppp|Mblac2|Adamts6|Pde4d|Fst|4930452B06Rik|Lrtm1|Lrit1|Fdft1|Chrna2|C1ql3|Prlr|Apol9a|Apol9b|Fam227a|Arsa|Entpd2|Nit2|Hunk|Ccnf|Pde9a|Cyp4f14|Tcf19|Zbtb12"),x = rownames(G172.umis), value = FALSE)
TCPO4 <- grep(c("Dnph1|Aqp4|Dsg2|Lipg|Cacnb4|Hsbp1l1|Acy3|Snx32|Chrm1|Fads3|Kank1|Vldlr|Hhex|Pde6c|Cyp2c38|Mid1ip1|Fign|Sytl4|Bhlhb9|Kantr|Klhl41|Madd|Abtb2|Elf5|Pak6|Itpka|Wdr76|Sord|Nabp1|Rbm38|Slc17a9|Pgap1|Pfn2|Sucnr1|Bche|Aox3|Mab21l2|Hcn3|Fdps|Car14|Hist2h2be|Trim45|Gnat2|Adh4|Ddah1|Coro2a|Col15a1|Mup8|Mpdz|Igfbp5|2610528J11Rik|Ncmap|Gale|Arhgef16|Insig1|Sh3bp2|Stx18|Adamts3|Slc10a6|Mfsd7a|Crybb3|Ung|Glt1d1|Asl|Crcp|Serpine1|Cyp3a57|Cyp3a25|Aass|Lmod2|Atp6v0a4|Snx10|St3gal5|Podxl2|Nop2|Inhbb|Clec9a|Gprc5a|Pik3c2g|Amn1|Nlrp12|Hif3a|Saa1|Klf13|Slc45a3|Adm|Rassf10|Sult1a1|Tacc2|Dmbt1|Ifitm5|Lrrc8e|Irs2|Enpp6|Hp|Tat|Wwox|Map1lc3b|Cdh15|Mmp8|Ppan|Cnn1|Bmper|Adamts15|Ubash3b|Rgs16|Zbtb16|Zkscan7|Map3k5|Ctgf|Adamts14|Slc19a1|Slc35e3|Adcy1|Lgalsl|Rasd1|Apcs|Ccl6|Ypel2|Etv4|Grn|Gfap|Itgb3|H3f3b|Tha1|Lpin1|Prps1l1|Susd6|Ppp4r4|Serpina3i|Serpina3m|Serpina3f|Serpina3g|Slc25a47|Simc1|Klhl3|Ctsl|Rpp38|Hspa14|Itga2|Gnl3|Itih4|Fam35a|Apex1|Zc3h13|Farp1|Nrbp2|Eppk1|Maff|Pim3|Slc38a2|Dnaja3|Socs1|Cebpd|Obp2a|Nr1i2|Cldn14|Dopey2|Rpl10a|Fkbp5|Rsph1|Angptl4|Rpl12|Supt3|Cyp39a1|Fsd1|Mpnd|Dpp9|Myom1|Rbbp8|Nr6a1|Fbn2|Ablim3|2010003K11Rik|Ms4a8a|Sgms1|Acta2|Cyp26c1|Cyp2c70|Rrp12|Ablim1|Gfra1|6030498E09Rik|B3galt1|Il1r1|Mtch2|Thbs1|Tmem87b|Nop56|Thbd|Bcl2l1|Kcnb1|Cebpb|Arhgef26|Tiparp|Gpatch4|Adamtsl4|Trp53inp1|Slc25a51|Tomm5|Ambp|Orm1|Lurap1l|Cyp2j8|Prkag3|Cyp27a1|Mfsd2a|Gja4|Tmem51|Steap4|Abcb1a|Serpina7|Ugt2b34|Stbd1|Fam47e|Prss8|Smpd3|Gstt3|Gstt1|Fam110c|Chaf1b|Cyp2c54|Cyp2c37|Cyp2c50|Podn|Lgr5|Ang|Chac1|Ugt1a1|Tfcp2l1|Tomt|Cyp1a2|Gas1|Ppp1r42|Mup9|Inmt|Ces1d|Setd4|Susd4|Tifa|Fam222a|Cyp26b1|Prtn3|Rtn4rl1|Bhmt|Dntt|Fosl2|Prom1|Nfe2l3|Prc1|Ccnd1|Ces1c|Slc13a2|Ccl9|Top2a|Fam84a|Ahr|Klhl33|Slc25a37|Aldh1a7|Ermn|Elovl3|Timm8a1|Ckap2l|Slc23a2|Fam83d|Ect2|Hgfac|Lgals4|Syt3|Fut1|Rab30|Gas6|Rnf122|6430573F11Rik|Isyna1|Junb|Rfx4|Hsd17b6|Sun3|Per1|Socs3|Ltbp2|Cyp46a1|Nfil3|Lamb3|Itih3|Mat1a|Rnase4|Nuggc|Scara5|Sybu|Aifm3|Mas1|Cables1|Awat2|Ripply1|Slc43a1|Myh7b|D630003M21Rik|Pck1|Fabp5|Lingo4|Etnppl|Sytl1|Extl1|Ugt2b1|Ugt2b36|Ugt2a1|Prkg2|Hrk|Kntc1|Nup205|Jazf1|Reep1|Mob1a|Mcm2|Atg7|Mcm3|Nudt19|Acmsd|Mcm6|Mctp2|Fanci|Acsm2|Zbed6|Nrg1|Lpl|Calr3|Mcm5|Asf1b|Ces2c|Fanca|Lamc2|Aph1b|Bmp5|Ttk|Xirp1|Echdc1|Sgpl1|H2afy2|BC055324|Fignl1|Tgtp2|Sar1b|9530068E07Rik|Slfn9|Cdc6|Ern1|Foxa1|Klhl28|Ifi27l2b|Serpina1d|Serpina1e|Serpina1a|Idi1|Dtl|Nek2|Lect2|Depdc1b|Wdhd1|Socs4|Esco2|Abcc4|Tmtc4|Pdzd2|Arl5b|Ncald|Wisp1|Alg10b|Scn8a|Krt4|Krt79|Mcm4|Sidt1|Hspa13|Nrip1"),x = rownames(G172.umis), value = FALSE)
TCPO5 <- grep(c("Adamts1|Uhrf1|Ston1|Pcdhgc3|Prelid2|Clcf1|Fads1|Aldh1a1|Dock8|A1cf|Hells|Cyp2c65|Abcc2|Sorcs3|Pnliprp1|Sytl5|Pola1|Ercc6l|Cenpi|Rad51|Nusap1|Mybl1|Zfp931|Chrna4|Slc10a5|Zfp687|Chd1l|Prok1|Lactb2|Agl|Impad1|Ccne2|Alg2|Mup13|Mup2|Mup7|Mup14|Ttc39b|Adamtsl1|Fndc5|Irs1|Sowahb|Klhl8|Nudt7|Slc16a13|Rab11fip4|Sntg2|Acot6|Sgcg|C9|Fam171b|Gpat2|Srms|Itgb3bp|Ube2u|A630001G21Rik|Shisa3|Ugt2b37|Cxcl13|Gbp8|Slc15a4|Ybx3|Sult2a5|Sult2a2|Sult2a1|Sult2a4|Etnk2|Dpep1|9530077C05Rik|Uck2|Rims2|Cyp4f15|H2-Eb1|Notch4|H2-Q2|Dock11|Rnf24|Tgm2|Coq10b|Kcna2|Gbp2b|Igfbp2|Myom3|Col4a3"),x = rownames(G172.umis), value = FALSE)

TCPO6 <- grep(c("ncRNA_inter_chr16_13412|ncRNA_inter_chr2_1923|ncRNA_inter_chr5_4197|ncRNA_inter_chr9_8103|ncRNA_inter_chr10_9254|ncRNA_inter_chr18_14655|ncRNA_inter_chr6_5137|ncRNA_as_chr1_369|ncRNA_inter_chr5_4424|ncRNA_inter_chr5_4619|ncRNA_as_chr5_4731|ncRNA_as_chr5_4745|ncRNA_inter_chr5_4781|ncRNA_as_chr6_5038|ncRNA_inter_chr6_5610|ncRNA_inter_chr7_5913|ncRNA_inter_chr7_5914|ncRNA_as_chr7_6050|ncRNA_inter_chr7_6074|ncRNA_inter_chr7_6411|ncRNA_inter_chr1_552|ncRNA_inter_chr1_547|ncRNA_inter_chr8_6741|ncRNA_inter_chr8_6944|ncRNA_inter_chr8_6955|ncRNA_inter_chr9_7766|ncRNA_as_chr9_7843|ncRNA_as_chr9_7880|ncRNA_inter_chr9_7881|ncRNA_inter_chr9_7938|ncRNA_inter_chr9_7994|ncRNA_inter_chr9_7992|ncRNA_as_chr9_8419|ncRNA_inter_chr10_8796|ncRNA_inter_chr10_9195|ncRNA_as_chr10_9385|ncRNA_as_chr10_9411|ncRNA_inter_chr11_9543|ncRNA_inter_chr11_10206|ncRNA_as_chr12_10281|ncRNA_inter_chr12_10630|ncRNA_inter_chr12_10754|ncRNA_as_chr12_10762|ncRNA_inter_chr12_10814|ncRNA_inter_chr12_10916|ncRNA_inter_chr12_10938|ncRNA_inter_chr13_11125|ncRNA_inter_chr13_11153|ncRNA_inter_chr13_11203|ncRNA_inter_chr13_11204|ncRNA_inter_chr13_11201|ncRNA_inter_chr13_11412|ncRNA_inter_chr13_11602|ncRNA_as_chr14_11908|ncRNA_as_chr14_11919|ncRNA_as_chr14_11991|ncRNA_inter_chr14_12061|ncRNA_inter_chr15_12776|ncRNA_inter_chr15_12819|ncRNA_inter_chr16_13477|ncRNA_inter_chr17_14011|ncRNA_as_chr18_14302|ncRNA_as_chr18_14461|ncRNA_inter_chr18_14589|ncRNA_as_chr18_14689|ncRNA_as_chr19_14883|ncRNA_inter_chr19_14949|ncRNA_as_chr19_15129|ncRNA_inter_chr2_1477|ncRNA_as_chr2_1652|ncRNA_inter_chr2_1990|ncRNA_inter_chr3_2232|ncRNA_inter_chr3_2551|ncRNA_inter_chr3_2550|ncRNA_inter_chr3_2629|ncRNA_inter_chr1_66|ncRNA_inter_chr1_63|ncRNA_inter_chr1_62|ncRNA_as_chr3_2878|ncRNA_inter_chr3_2901|ncRNA_inter_chr3_3003|ncRNA_inter_chr4_3157|ncRNA_as_chr4_3800|ncRNA_inter_chr4_3862|ncRNA_inter_chr4_3863|ncRNA_inter_chr5_3988|ncRNA_inter_chr5_4315|ncRNA_inter_chr5_4322|ncRNA_inter_chr5_4335|ncRNA_as_chr1_400|ncRNA_intra_chr5_4728|ncRNA_inter_chr6_4886|ncRNA_as_chr6_5132|ncRNA_inter_chr6_5310|ncRNA_inter_chr6_5421|ncRNA_inter_chr6_5502|ncRNA_inter_chr6_5721"), x = rownames(G172.umis), value = FALSE)

TCPO6.2 <- grep(c("ncRNA_inter_chr6_5817|ncRNA_as_chr7_5955|ncRNA_inter_chr7_6085|ncRNA_as_chr7_6192|ncRNA_inter_chr7_6367|ncRNA_inter_chr7_6392|ncRNA_inter_chr7_6508|ncRNA_inter_chr7_6510|ncRNA_inter_chr1_570|ncRNA_inter_chr1_571|ncRNA_inter_chr1_566|ncRNA_inter_chr1_568|ncRNA_inter_chr1_567|ncRNA_inter_chr8_6775|ncRNA_inter_chr1_590|ncRNA_as_chr8_7071|ncRNA_inter_chr8_7141|ncRNA_inter_chr1_610|ncRNA_intra_chr1_611|ncRNA_inter_chr8_7169|ncRNA_intra_chr8_7312|ncRNA_intra_chr8_7310|ncRNA_inter_chr1_633|ncRNA_as_chr8_7521|ncRNA_as_chr8_7528|ncRNA_inter_chr8_7612|ncRNA_inter_chr8_7683|ncRNA_inter_chr9_8105|ncRNA_inter_chr9_8099|ncRNA_inter_chr9_8104|ncRNA_as_chr9_8172|ncRNA_inter_chr9_8279|ncRNA_as_chr9_8334|ncRNA_inter_chr9_8350|ncRNA_inter_chr10_8999|ncRNA_inter_chr10_9000|ncRNA_inter_chr10_9222|ncRNA_intra_chr11_9593|ncRNA_inter_chr11_9636|ncRNA_as_chr11_9787|ncRNA_as_chr11_9790|ncRNA_inter_chr11_9995|ncRNA_inter_chr12_10421|ncRNA_inter_chr12_10476|ncRNA_inter_chr12_10549|ncRNA_inter_chr12_10672|ncRNA_intra_chr12_10866|ncRNA_intra_chr12_10859|ncRNA_intra_chr12_10851|ncRNA_inter_chr12_10949|ncRNA_inter_chr13_11074|ncRNA_inter_chr13_11070|ncRNA_inter_chr13_11399|ncRNA_inter_chr13_11438|ncRNA_inter_chr13_11440|ncRNA_inter_chr14_11853|ncRNA_inter_chr14_11911|ncRNA_inter_chr14_11987|ncRNA_inter_chr14_12058|ncRNA_as_chr14_12074|ncRNA_inter_chr14_12191|ncRNA_inter_chr14_12193|ncRNA_inter_chr14_12205|ncRNA_inter_chr14_12291|ncRNA_inter_chr14_12297|ncRNA_inter_chr15_12606|ncRNA_as_chr15_12697|ncRNA_intra_chr15_12771|ncRNA_inter_chr15_12777|ncRNA_inter_chr16_12998|ncRNA_inter_chr16_13190|ncRNA_inter_chr16_13349|ncRNA_inter_chr17_13743|ncRNA_inter_chr17_13808|ncRNA_as_chr17_13828|ncRNA_inter_chr17_13841|ncRNA_inter_chr17_13842|ncRNA_inter_chr17_13876|ncRNA_inter_chr17_13919|ncRNA_inter_chr17_14015|ncRNA_inter_chr17_14085|ncRNA_inter_chr17_14129|ncRNA_inter_chr18_14339|ncRNA_inter_chr18_14656|ncRNA_inter_chr19_14717|ncRNA_inter_chr19_14856|ncRNA_inter_chr19_14854|ncRNA_inter_chr19_14953|ncRNA_inter_chr19_14952|ncRNA_inter_chr2_1436|ncRNA_inter_chr2_1492|ncRNA_inter_chr2_1577|ncRNA_inter_chr2_1821|ncRNA_inter_chr2_1826|ncRNA_inter_chr2_1827|ncRNA_inter_chr3_2764|ncRNA_as_chr3_2936|ncRNA_inter_chr3_2983|ncRNA_inter_chr4_3142|ncRNA_inter_chr4_3306|ncRNA_inter_chr4_3512|ncRNA_inter_chr4_3521|ncRNA_inter_chr4_3673|ncRNA_inter_chr4_3732|ncRNA_inter_chr4_3778|ncRNA_as_chr4_3843|ncRNA_as_chr10_9015|ncRNA_inter_chr19_14873|ncRNA_inter_chr3_2165|ncRNA_inter_chr10_8471|ncRNA_inter_chr19_15097|ncRNA_inter_chr11_10188|ncRNA_inter_chr1_420|ncRNA_inter_chr8_7363|ncRNA_inter_chr8_7423|ncRNA_inter_chr8_7430|ncRNA_inter_chr11_9864"),x = rownames(G172.umis), value = FALSE)


TCPO6.1 <-  grep(c("ncRNA_inter_chr11_9925|ncRNA_inter_chr11_9968|ncRNA_inter_chr1_914|ncRNA_inter_chr16_13176|ncRNA_as_chr18_14602|ncRNA_inter_chr3_2162|ncRNA_inter_chr3_2504|ncRNA_as_chr4_3300|ncRNA_inter_chr6_5793|ncRNA_inter_chr8_7610|ncRNA_as_chr9_7959|ncRNA_inter_chr15_12869|ncRNA_inter_chr18_14442|ncRNA_inter_chr19_15169|ncRNA_inter_chr19_15179|ncRNA_inter_chr19_15177|ncRNA_inter_chr19_15171|ncRNA_inter_chr2_1725|ncRNA_inter_chr3_2543|ncRNA_inter_chr4_3120|ncRNA_as_chr5_4655|ncRNA_inter_chr5_4654|ncRNA_as_chr6_5335|ncRNA_inter_chr7_5998|ncRNA_inter_chr9_8301|ncRNA_as_chr10_8460|ncRNA_as_chr11_9709|ncRNA_inter_chr1_931|ncRNA_inter_chr15_12834|ncRNA_inter_chr16_13509|ncRNA_inter_chr16_13510|ncRNA_as_chr16_13512|ncRNA_inter_chr18_14690|ncRNA_inter_chr19_15002|ncRNA_inter_chr19_15004|ncRNA_inter_chr16_13225|ncRNA_inter_chr2_2017|ncRNA_inter_chr6_5253|ncRNA_inter_chr9_7763|ncRNA_inter_chr5_4777|ncRNA_inter_chr6_5551|ncRNA_inter_chr14_11945|ncRNA_as_chr9_8142|ncRNA_inter_chr2_1471|ncRNA_inter_chr11_10185|ncRNA_inter_chr9_8000|ncRNA_inter_chr4_3282|ncRNA_inter_chr5_4499|ncRNA_inter_chr1_496|ncRNA_inter_chr8_6894|ncRNA_inter_chr8_6896|ncRNA_inter_chr15_12836|ncRNA_inter_chr19_14947|ncRNA_as_chr7_6065|ncRNA_inter_chr13_11031|ncRNA_inter_chr4_3156|ncRNA_inter_chr9_7809|ncRNA_inter_chr13_11385|ncRNA_inter_chr6_5248|ncRNA_inter_chr9_7875|ncRNA_inter_chr1_775|ncRNA_intra_chr11_9594|ncRNA_as_chr15_12959|ncRNA_inter_chr5_4316|ncRNA_inter_chr11_9635|ncRNA_inter_chr13_11100|ncRNA_inter_chr16_13428|ncRNA_inter_chr17_14130|ncRNA_inter_chr3_2721|ncRNA_inter_chr7_6113|ncRNA_as_chr5_4372|ncRNA_inter_chr5_4773|ncRNA_as_chr7_5921|ncRNA_inter_chr7_5935|ncRNA_as_chr7_6007|ncRNA_inter_chr7_6070"),x = rownames(G172.umis), value = FALSE)

TCPO7 <- grep(c("ncRNA_inter_chr9_7989|ncRNA_inter_chr9_8417|ncRNA_as_chr10_9016|ncRNA_inter_chr10_9418|ncRNA_inter_chr13_11163|ncRNA_inter_chr15_12319|ncRNA_inter_chr16_13050|ncRNA_inter_chr16_13211|ncRNA_inter_chr17_14188|ncRNA_inter_chr19_14987|ncRNA_as_chr2_1343|ncRNA_inter_chr2_1594|ncRNA_as_chr3_2968|ncRNA_as_chr8_7332|ncRNA_inter_chr11_9965|ncRNA_inter_chr13_11622|ncRNA_inter_chr2_1996|ncRNA_as_chr5_4325|ncRNA_inter_chr7_6087|ncRNA_inter_chr7_6094|ncRNA_inter_chr7_6692|ncRNA_inter_chr1_591|ncRNA_inter_chr9_7878|ncRNA_inter_chr9_8118|ncRNA_inter_chr10_9123|ncRNA_inter_chr10_9313|ncRNA_inter_chr12_10454|ncRNA_inter_chr13_11437|ncRNA_inter_chr17_13889|ncRNA_inter_chr2_2037|ncRNA_inter_chr3_2168|ncRNA_inter_chr4_3549|ncRNA_inter_chr9_8302|ncRNA_inter_chr10_9256|ncRNA_inter_chr11_9442|ncRNA_as_chr19_14777|ncRNA_as_chr19_14779|ncRNA_inter_chr19_14967|ncRNA_inter_chr2_1430|ncRNA_inter_chr4_3618|ncRNA_as_chr19_14976|ncRNA_inter_chr5_4338|ncRNA_as_chr7_5999|ncRNA_as_chr8_7359|ncRNA_inter_chr3_2988|ncRNA_inter_chr2_2016|ncRNA_inter_chr6_5316|ncRNA_inter_chr1_290|ncRNA_inter_chr5_4775|ncRNA_inter_chr7_6220|ncRNA_inter_chr7_6222|ncRNA_inter_chr9_8122|ncRNA_inter_chr11_9599|ncRNA_inter_chr12_10910|ncRNA_as_chr15_12920|ncRNA_inter_chr16_13170|ncRNA_inter_chr16_13177|ncRNA_inter_chr17_14151|ncRNA_inter_chr17_14162|ncRNA_inter_chr3_2166|ncRNA_inter_chr4_3651|ncRNA_inter_chr5_3974|ncRNA_inter_chr9_8067|ncRNA_inter_chr10_9181|ncRNA_inter_chr1_129|ncRNA_inter_chr15_12796|ncRNA_as_chr2_1207|ncRNA_inter_chr19_15175|ncRNA_inter_chr2_2012|ncRNA_inter_chr2_2011|ncRNA_inter_chr1_365|ncRNA_inter_chr5_4491|ncRNA_as_chr6_5635|ncRNA_inter_chr6_5710|ncRNA_inter_chr7_6110|ncRNA_inter_chr7_6489|ncRNA_inter_chr7_6587|ncRNA_inter_chr7_6639|ncRNA_inter_chr8_6738|ncRNA_inter_chr8_6759|ncRNA_inter_chr8_6766|ncRNA_inter_chr8_6942|ncRNA_inter_chr8_6946|ncRNA_inter_chr8_7074|ncRNA_inter_chr8_7180|ncRNA_inter_chr8_7432|ncRNA_inter_chr9_7691|ncRNA_inter_chr9_7819|ncRNA_inter_chr9_7813|ncRNA_inter_chr1_113|ncRNA_inter_chr9_7885|ncRNA_as_chr9_8043|ncRNA_inter_chr9_8049|ncRNA_as_chr9_8317|ncRNA_inter_chr10_8697"),x = rownames(G172.umis), value = FALSE)

TCPO7.1  <- grep(c("ncRNA_inter_chr10_8776|ncRNA_inter_chr10_9125|ncRNA_inter_chr10_9366|ncRNA_inter_chr10_9363|ncRNA_intra_chr11_9623|ncRNA_as_chr1_814|ncRNA_inter_chr11_9743|ncRNA_inter_chr1_913|ncRNA_inter_chr12_10509|ncRNA_inter_chr12_10539|ncRNA_inter_chr12_10713|ncRNA_inter_chr12_10943|ncRNA_as_chr13_11127|ncRNA_as_chr1_978|ncRNA_inter_chr13_11222|ncRNA_inter_chr13_11361|ncRNA_inter_chr13_11572|ncRNA_as_chr13_11787|ncRNA_inter_chr2_1050|ncRNA_inter_chr14_11938|ncRNA_as_chr14_11957|ncRNA_inter_chr14_12034|ncRNA_inter_chr14_12032|ncRNA_inter_chr14_12031|ncRNA_inter_chr15_12446|ncRNA_as_chr15_12818|ncRNA_inter_chr15_12890|ncRNA_as_chr15_12942|ncRNA_inter_chr16_13173|ncRNA_as_chr1_153|ncRNA_inter_chr17_13857|ncRNA_inter_chr17_13924|ncRNA_inter_chr17_13983|ncRNA_inter_chr17_14026|ncRNA_as_chr17_14041|ncRNA_inter_chr17_14102|ncRNA_as_chr18_14369|ncRNA_as_chr19_14782|ncRNA_inter_chr2_1310|ncRNA_inter_chr19_14874|ncRNA_inter_chr19_14880|ncRNA_inter_chrX_15449|ncRNA_inter_chr2_1423|ncRNA_inter_chr2_1497|ncRNA_inter_chr2_1501|ncRNA_inter_chr1_31|ncRNA_inter_chr2_1829|ncRNA_as_chr2_1870|ncRNA_inter_chr2_1958|ncRNA_inter_chr2_2124|ncRNA_inter_chr3_2140|ncRNA_inter_chr3_2311|ncRNA_inter_chr3_2505|ncRNA_inter_chr3_2743|ncRNA_inter_chr3_2940|ncRNA_inter_chr4_3009|ncRNA_inter_chr4_3010|ncRNA_inter_chr4_3163|ncRNA_as_chr4_3654|ncRNA_inter_chr4_3689|ncRNA_inter_chr4_3867|ncRNA_inter_chr5_4010|ncRNA_inter_chr5_4123|ncRNA_inter_chr5_4138|ncRNA_inter_chr5_4336|ncRNA_inter_chr5_4337|ncRNA_inter_chr5_4656|ncRNA_inter_chr5_4685|ncRNA_as_chr5_4687|ncRNA_inter_chr6_4828|ncRNA_inter_chr6_5154|ncRNA_inter_chr6_5675|ncRNA_inter_chr6_5684|ncRNA_inter_chr6_5723|ncRNA_as_chr6_5861|ncRNA_inter_chr7_6097|ncRNA_as_chr7_6384|ncRNA_inter_chr7_6559|ncRNA_inter_chr7_6709|ncRNA_inter_chr8_6887|ncRNA_inter_chr8_7072|ncRNA_inter_chr8_7105"),x = rownames(G172.umis), value = FALSE)
TCPO7.2 <-  grep(c("ncRNA_as_chr8_7190|ncRNA_intra_chr8_7324|ncRNA_inter_chr1_635|ncRNA_inter_chr1_630|ncRNA_inter_chr8_7512|ncRNA_inter_chr1_648|ncRNA_inter_chr1_678|ncRNA_inter_chr9_7996|ncRNA_inter_chr9_7995|ncRNA_inter_chr9_8022|ncRNA_inter_chr9_8100|ncRNA_intra_chr9_8171|ncRNA_inter_chr10_9128|ncRNA_inter_chr10_9199|ncRNA_intra_chr11_9595|ncRNA_inter_chr11_9600|ncRNA_inter_chr11_9651|ncRNA_as_chr11_9663|ncRNA_as_chr11_9684|ncRNA_inter_chr11_9780|ncRNA_inter_chr11_9784|ncRNA_inter_chr11_9991|ncRNA_inter_chr11_10051|ncRNA_inter_chr12_10415|ncRNA_intra_chr12_10508|ncRNA_inter_chr12_10543|ncRNA_inter_chr12_10628|ncRNA_intra_chr12_10870|ncRNA_intra_chr12_10872|ncRNA_intra_chr12_10863|ncRNA_intra_chr12_10854|ncRNA_intra_chr12_10856|ncRNA_intra_chr12_10857|ncRNA_inter_chr12_10895|ncRNA_inter_chr12_10978|ncRNA_inter_chr13_11199|ncRNA_inter_chr14_11851|ncRNA_inter_chr14_12016|ncRNA_inter_chr14_12145|ncRNA_inter_chr14_12154|ncRNA_inter_chr14_12239|ncRNA_inter_chr14_12290|ncRNA_as_chr14_12314|ncRNA_inter_chr15_12368|ncRNA_inter_chr2_1097|ncRNA_as_chr2_1101|ncRNA_as_chr15_12682|ncRNA_as_chr16_13145|ncRNA_inter_chr16_13270|ncRNA_inter_chr16_13316|ncRNA_inter_chr16_13317|ncRNA_inter_chr17_13539|ncRNA_as_chr17_13731|ncRNA_inter_chr17_14132|ncRNA_inter_chr18_14338|ncRNA_inter_chr18_14336|ncRNA_inter_chr18_14337|ncRNA_inter_chr18_14674|ncRNA_inter_chr19_14790|ncRNA_inter_chr19_14892|ncRNA_inter_chr19_14999|ncRNA_inter_chr19_15136|ncRNA_inter_chrX_15248|ncRNA_inter_chrX_15240|ncRNA_inter_chrX_15389|ncRNA_inter_chr2_1686|ncRNA_inter_chr2_1736|ncRNA_intra_chr2_1796|ncRNA_inter_chr2_2112|ncRNA_inter_chr3_2574|ncRNA_inter_chr4_3161|ncRNA_inter_chr4_3184|ncRNA_as_chr4_3206|ncRNA_as_chr4_3310|ncRNA_inter_chr4_3424|ncRNA_inter_chr4_3422|ncRNA_inter_chr4_3723|ncRNA_as_chr8_7333|ncRNA_as_chr5_4744|ncRNA_inter_chr5_4746|ncRNA_inter_chr6_5638|ncRNA_inter_chr7_6108|ncRNA_inter_chr7_6109|ncRNA_as_chr13_11025|ncRNA_inter_chr14_12201|ncRNA_inter_chr15_12439|ncRNA_inter_chr15_12815|ncRNA_inter_chr18_14223|ncRNA_as_chr1_222|ncRNA_inter_chr8_6744|ncRNA_inter_chr8_7334|ncRNA_inter_chr2_1425|ncRNA_inter_chr2_1426|ncRNA_inter_chr3_2413|ncRNA_inter_chr3_2410|ncRNA_inter_chr3_2411|ncRNA_inter_chr5_4407|ncRNA_inter_chr6_5249|ncRNA_inter_chr8_7511|ncRNA_inter_chr9_7874|ncRNA_inter_chr9_8056|ncRNA_as_chr9_8393|ncRNA_inter_chr13_11254|ncRNA_intra_chr2_1057|ncRNA_as_chr14_12315|ncRNA_inter_chr15_12684|ncRNA_inter_chr15_12937|ncRNA_inter_chr17_13692|ncRNA_inter_chr17_14175|ncRNA_inter_chr18_14688|ncRNA_intra_chr19_14773|ncRNA_inter_chr3_2169|ncRNA_as_chr4_3537"),x = rownames(G172.umis), value = FALSE)

TCPO8 <- grep(c("ncRNA_inter_chr5_4750|ncRNA_inter_chr7_6390|ncRNA_inter_chr9_8300|ncRNA_inter_chr13_11116|ncRNA_inter_chr15_12835|ncRNA_inter_chr6_5318|ncRNA_inter_chr11_9914|ncRNA_as_chr12_10974|ncRNA_inter_chr14_12199|ncRNA_inter_chr15_12824|ncRNA_intra_chr19_15008|ncRNA_as_chr17_13834|ncRNA_inter_chr19_14946|ncRNA_inter_chr5_4150|ncRNA_inter_chr5_4149|ncRNA_as_chr5_4157|ncRNA_as_chr5_4156|ncRNA_inter_chr5_4180|ncRNA_inter_chr5_4242|ncRNA_inter_chr1_366|ncRNA_inter_chr5_4273|ncRNA_as_chr5_4276|ncRNA_as_chr5_4370|ncRNA_intra_chr5_4388|ncRNA_inter_chr5_4402|ncRNA_inter_chr5_4507|ncRNA_inter_chr5_4532|ncRNA_inter_chr5_4564|ncRNA_inter_chr5_4560|ncRNA_as_chr1_404|ncRNA_as_chr5_4712|ncRNA_inter_chr5_4774|ncRNA_inter_chr5_4776|ncRNA_inter_chr5_4785|ncRNA_inter_chr5_4784|ncRNA_inter_chr5_4783|ncRNA_as_chr6_5114|ncRNA_inter_chr6_5117|ncRNA_inter_chr6_5125|ncRNA_inter_chr6_5127|ncRNA_inter_chr6_5159|ncRNA_inter_chr1_444|ncRNA_as_chr6_5250|ncRNA_inter_chr1_463|ncRNA_inter_chr6_5304|ncRNA_inter_chr6_5313|ncRNA_inter_chr6_5323|ncRNA_inter_chr6_5370|ncRNA_inter_chr6_5429|ncRNA_inter_chr6_5552|ncRNA_inter_chr6_5557|ncRNA_inter_chr6_5563|ncRNA_inter_chr6_5582|ncRNA_as_chr6_5587|ncRNA_inter_chr6_5630|ncRNA_inter_chr6_5673|ncRNA_as_chr7_5939|ncRNA_inter_chr7_5990|ncRNA_as_chr7_6012|ncRNA_inter_chr7_6022|ncRNA_inter_chr7_6101|ncRNA_inter_chr7_6118|ncRNA_inter_chr7_6115|ncRNA_inter_chr7_6119|ncRNA_inter_chr7_6121|ncRNA_inter_chr7_6114|ncRNA_inter_chr7_6223|ncRNA_inter_chr7_6221|ncRNA_as_chr7_6288|ncRNA_inter_chr7_6338|ncRNA_inter_chr8_6861|ncRNA_as_chr8_6963|ncRNA_inter_chr8_7012|ncRNA_inter_chr8_7256|ncRNA_inter_chr8_7280|ncRNA_as_chr8_7331|ncRNA_inter_chr8_7330|ncRNA_inter_chr8_7362|ncRNA_as_chr8_7369|ncRNA_inter_chr8_7394|ncRNA_inter_chr8_7424|ncRNA_inter_chr8_7603|ncRNA_inter_chr8_7649|ncRNA_inter_chr8_7650|ncRNA_inter_chr9_7754|ncRNA_inter_chr9_7873|ncRNA_as_chr9_7931|ncRNA_as_chr9_7947|ncRNA_as_chr9_7949|ncRNA_inter_chr9_8016|ncRNA_inter_chr9_8015|ncRNA_inter_chr9_8117|ncRNA_inter_chr9_8123|ncRNA_inter_chr9_8121|ncRNA_inter_chr9_8132|ncRNA_as_chr9_8271|ncRNA_inter_chr9_8396|ncRNA_inter_chr1_115|ncRNA_inter_chr1_14|ncRNA_inter_chr10_8829|ncRNA_inter_chr10_8950|ncRNA_inter_chr10_8951|ncRNA_inter_chr10_9011|ncRNA_as_chr10_9007|ncRNA_as_chr10_9023|ncRNA_inter_chr10_9138|ncRNA_as_chr10_9240|ncRNA_inter_chr10_9245|ncRNA_as_chr10_9389|ncRNA_inter_chr10_9409|ncRNA_inter_chr11_9670|ncRNA_inter_chr11_9674|ncRNA_as_chr11_9688|ncRNA_as_chr11_9692|ncRNA_inter_chr11_9833|ncRNA_inter_chr11_9862|ncRNA_inter_chr11_9873|ncRNA_inter_chr11_9926|ncRNA_as_chr11_9928|ncRNA_inter_chr11_9938|ncRNA_as_chr11_9940|ncRNA_inter_chr11_9939|ncRNA_inter_chr1_889"),x = rownames(G172.umis), value = FALSE)

TCPO8.1 <- grep(c("ncRNA_inter_chr11_10087|ncRNA_as_chr11_10132|ncRNA_inter_chr11_10148|ncRNA_as_chr11_10149|ncRNA_inter_chr11_10202|ncRNA_inter_chr11_10201|ncRNA_inter_chr11_10211|ncRNA_inter_chr1_915|ncRNA_inter_chr12_10412|ncRNA_inter_chr12_10411|ncRNA_inter_chr1_928|ncRNA_inter_chr12_10573|ncRNA_inter_chr12_10629|ncRNA_as_chr12_10655|ncRNA_inter_chr12_10657|ncRNA_inter_chr12_10665|ncRNA_inter_chr12_10681|ncRNA_as_chr12_10764|ncRNA_inter_chr1_948|ncRNA_inter_chr1_949|ncRNA_inter_chr12_10819|ncRNA_inter_chr12_10881|ncRNA_inter_chr12_10893|ncRNA_as_chr13_11068|ncRNA_inter_chr13_11069|ncRNA_inter_chr13_11237|ncRNA_inter_chr13_11236|ncRNA_inter_chr13_11216|ncRNA_inter_chr13_11242|ncRNA_inter_chr13_11255|ncRNA_inter_chr1_1000|ncRNA_inter_chr13_11439|ncRNA_as_chr13_11486|ncRNA_inter_chr13_11651|ncRNA_inter_chr13_11752|ncRNA_inter_chr13_11771|ncRNA_inter_chr2_1049|ncRNA_inter_chr14_11950|ncRNA_inter_chr14_11944|ncRNA_inter_chr14_11946|ncRNA_inter_chr14_11949|ncRNA_inter_chr14_11989|ncRNA_inter_chr14_11998|ncRNA_inter_chr14_11999|ncRNA_as_chr14_12111|ncRNA_as_chr14_12166|ncRNA_inter_chr14_12198|ncRNA_inter_chr14_12200|ncRNA_inter_chr2_1077|ncRNA_inter_chr2_1078|ncRNA_inter_chr15_12338|ncRNA_inter_chr15_12489|ncRNA_inter_chr15_12514|ncRNA_as_chr15_12542|ncRNA_inter_chr15_12633|ncRNA_as_chr15_12677|ncRNA_inter_chr15_12685|ncRNA_as_chr15_12706|ncRNA_intra_chr15_12715|ncRNA_inter_chr15_12719|ncRNA_inter_chr15_12718"),x = rownames(G172.umis), value = FALSE)

TCPO8.2 <- grep(c("ncRNA_inter_chr15_12720|ncRNA_as_chr15_12721|ncRNA_inter_chr15_12745|ncRNA_inter_chr15_12823|ncRNA_inter_chr15_12875|ncRNA_inter_chr15_12916|ncRNA_inter_chr15_12936|ncRNA_inter_chr15_12953|ncRNA_inter_chr15_12954|ncRNA_inter_chr16_13049|ncRNA_inter_chr16_13171|ncRNA_as_chr16_13227|ncRNA_inter_chr16_13340|ncRNA_inter_chr16_13434|ncRNA_inter_chr16_13470|ncRNA_inter_chr17_13681|ncRNA_intra_chr17_13894|ncRNA_as_chr17_13905|ncRNA_inter_chr17_13939|ncRNA_inter_chr17_13938|ncRNA_inter_chr17_14163|ncRNA_as_chr17_14173|ncRNA_inter_chr17_14176|ncRNA_inter_chr18_14317|ncRNA_inter_chr18_14321|ncRNA_inter_chr18_14323|ncRNA_inter_chr18_14331|ncRNA_inter_chr18_14330|ncRNA_inter_chr18_14328|ncRNA_inter_chr18_14324|ncRNA_as_chr18_14408|ncRNA_inter_chr18_14534|ncRNA_inter_chr18_14590|ncRNA_inter_chr18_14650|ncRNA_inter_chr2_1303|ncRNA_as_chr2_1305|ncRNA_inter_chr2_1302|ncRNA_inter_chr19_14802|ncRNA_as_chr19_14823|ncRNA_inter_chr19_14822|ncRNA_inter_chr19_14991|ncRNA_inter_chr19_14990|ncRNA_intra_chr19_15006|ncRNA_as_chr19_15010|ncRNA_as_chr19_15007|ncRNA_as_chrX_15387|ncRNA_inter_chrX_15422|ncRNA_inter_chrX_15550|ncRNA_inter_chr2_1481|ncRNA_inter_chr2_1502|ncRNA_inter_chr2_1528|ncRNA_inter_chr2_1600|ncRNA_inter_chr2_1782|ncRNA_inter_chr2_1792|ncRNA_inter_chr2_1790|ncRNA_inter_chr2_1793|ncRNA_inter_chr1_196|ncRNA_inter_chr1_195|ncRNA_inter_chr2_1989|ncRNA_inter_chr2_2038|ncRNA_inter_chr3_2167|ncRNA_inter_chr1_44|ncRNA_inter_chr3_2407|ncRNA_inter_chr3_2437|ncRNA_as_chr1_221|ncRNA_inter_chr3_2507|ncRNA_inter_chr3_2546|ncRNA_as_chr3_2544|ncRNA_inter_chr1_238|ncRNA_as_chr3_2603|ncRNA_inter_chr3_2636|ncRNA_inter_chr3_2768|ncRNA_as_chr3_2781|ncRNA_as_chr3_2778|ncRNA_inter_chr3_2790|ncRNA_inter_chr3_2791|ncRNA_inter_chr3_2798|ncRNA_inter_chr3_2889|ncRNA_inter_chr3_2896|ncRNA_as_chr3_2894|ncRNA_inter_chr3_2904|ncRNA_inter_chr4_3027|ncRNA_as_chr4_3224|ncRNA_inter_chr4_3308|ncRNA_inter_chr4_3350|ncRNA_inter_chr4_3381|ncRNA_inter_chr4_3380|ncRNA_inter_chr4_3389|ncRNA_inter_chr4_3391|ncRNA_inter_chr4_3390|ncRNA_as_chr1_86|ncRNA_inter_chr4_3575|ncRNA_inter_chr4_3652|ncRNA_inter_chr4_3690|ncRNA_inter_chr4_3764|ncRNA_inter_chr4_3775|ncRNA_inter_chr4_3905|ncRNA_as_chr4_3910|ncRNA_inter_chr4_3923|ncRNA_inter_chr5_4066|ncRNA_inter_chr5_4067|ncRNA_inter_chr5_4065|ncRNA_inter_chr5_4116|ncRNA_inter_chr5_4472|ncRNA_inter_chr5_4500|ncRNA_as_chr5_4627|ncRNA_inter_chr5_4749|ncRNA_inter_chr6_4993|ncRNA_inter_chr6_5281|ncRNA_inter_chr6_5282|ncRNA_as_chr6_5722|ncRNA_inter_chr1_494|ncRNA_inter_chr1_495|ncRNA_as_chr7_5880|ncRNA_inter_chr7_6091|ncRNA_inter_chr7_6090|ncRNA_inter_chr7_6080|ncRNA_as_chr7_6174|ncRNA_inter_chr1_520|ncRNA_as_chr7_6377|ncRNA_as_chr7_6389|ncRNA_inter_chr7_6415|ncRNA_inter_chr7_6433|ncRNA_as_chr7_6467"),x = rownames(G172.umis), value = FALSE)

TCPO9 <- grep(c("ncRNA_as_chr7_6656|ncRNA_inter_chr8_6742|ncRNA_as_chr8_6747|ncRNA_inter_chr8_6740|ncRNA_inter_chr8_6743|ncRNA_inter_chr8_6895|ncRNA_inter_chr8_6953|ncRNA_inter_chr8_6989|ncRNA_inter_chr8_6990|ncRNA_inter_chr8_7336|ncRNA_inter_chr8_7399|ncRNA_inter_chr8_7398|ncRNA_as_chr8_7632|ncRNA_as_chr9_7778|ncRNA_inter_chr9_7810|ncRNA_inter_chr9_7923|ncRNA_as_chr9_7924|ncRNA_inter_chr9_8169|ncRNA_inter_chr9_8299|ncRNA_inter_chr9_8297|ncRNA_inter_chr9_8387|ncRNA_inter_chr10_8469|ncRNA_inter_chr10_8777|ncRNA_as_chr10_9182|ncRNA_inter_chr10_9193|ncRNA_inter_chr10_9209|ncRNA_inter_chr10_9210|ncRNA_inter_chr1_792|ncRNA_inter_chr10_9351|ncRNA_as_chr11_9447|ncRNA_as_chr11_9449|ncRNA_inter_chr1_125|ncRNA_inter_chr1_126|ncRNA_inter_chr11_9693|ncRNA_inter_chr1_842|ncRNA_inter_chr11_9894|ncRNA_inter_chr11_9960|ncRNA_inter_chr11_9967|ncRNA_inter_chr11_9966|ncRNA_inter_chr11_10019|ncRNA_inter_chr11_10091|ncRNA_as_chr11_10193|ncRNA_inter_chr12_10324|ncRNA_inter_chr12_10322|ncRNA_inter_chr12_10477|ncRNA_inter_chr12_10562|ncRNA_as_chr12_10847|ncRNA_as_chr12_10889|ncRNA_as_chr12_10887|ncRNA_as_chr12_10885|ncRNA_intra_chr12_10888|ncRNA_as_chr12_10852|ncRNA_intra_chr12_10886|ncRNA_inter_chr12_10988|ncRNA_inter_chr13_11071|ncRNA_inter_chr13_11128|ncRNA_inter_chr13_11381|ncRNA_inter_chr13_11386|ncRNA_inter_chr13_11425|ncRNA_as_chr13_11491|ncRNA_inter_chr13_11490|ncRNA_inter_chr13_11603|ncRNA_as_chr13_11785|ncRNA_as_chr13_11784|ncRNA_inter_chr14_12018|ncRNA_inter_chr2_1072|ncRNA_as_chr15_12330|ncRNA_inter_chr15_12644|ncRNA_inter_chr15_12695|ncRNA_inter_chr15_12830|ncRNA_as_chr15_12837|ncRNA_inter_chr15_12832|ncRNA_inter_chr15_12831|ncRNA_inter_chr15_12833|ncRNA_inter_chr15_12849|ncRNA_as_chr16_13514|ncRNA_inter_chr17_13787|ncRNA_inter_chr17_13875|ncRNA_inter_chr17_14006|ncRNA_inter_chr17_14023|ncRNA_inter_chr17_14125|ncRNA_as_chr19_14728|ncRNA_intra_chr19_15028|ncRNA_as_chr19_15027|ncRNA_inter_chr19_15058|ncRNA_inter_chr19_15187|ncRNA_as_chr19_15188|ncRNA_as_chrX_15318|ncRNA_inter_chr2_1427|ncRNA_inter_chr2_1419|ncRNA_inter_chr2_1421|ncRNA_inter_chr2_1420|ncRNA_inter_chr2_1424|ncRNA_inter_chr2_1422|ncRNA_inter_chr2_1432|ncRNA_inter_chr2_1431|ncRNA_as_chr1_173|ncRNA_inter_chr1_171|ncRNA_inter_chr1_169|ncRNA_inter_chr2_1851|ncRNA_intra_chr2_1852|ncRNA_inter_chr2_1877|ncRNA_inter_chr2_1883|ncRNA_inter_chr2_1887|ncRNA_inter_chr2_1888|ncRNA_inter_chr2_1926|ncRNA_inter_chr2_2009|ncRNA_inter_chr2_2078|ncRNA_inter_chr2_2079|ncRNA_inter_chr2_2084|ncRNA_inter_chr2_2085|ncRNA_inter_chr3_2207|ncRNA_as_chr3_2409|ncRNA_as_chr3_2418|ncRNA_inter_chr3_2481|ncRNA_inter_chr3_2549|ncRNA_inter_chr3_2579|ncRNA_inter_chr1_256|ncRNA_inter_chr1_257|ncRNA_inter_chr3_2705|ncRNA_inter_chr3_2887|ncRNA_inter_chr4_3056|ncRNA_inter_chr4_3079|ncRNA_as_chr4_3210|ncRNA_as_chr4_3275|ncRNA_as_chr4_3313"),x = rownames(G172.umis), value = FALSE)

TCPO10 <-  grep(c("ncRNA_as_chr1_312|ncRNA_inter_chr4_3534|ncRNA_inter_chr4_3584|ncRNA_inter_chr4_3685|ncRNA_inter_chr4_3884|ncRNA_as_chr7_6302|ncRNA_intra_chr8_7322|ncRNA_intra_chr8_7321|ncRNA_intra_chr8_7319|ncRNA_intra_chr8_7317|ncRNA_intra_chr8_7314|ncRNA_intra_chr8_7313|ncRNA_intra_chr8_7323|ncRNA_inter_chr10_8461|ncRNA_as_chr1_782|ncRNA_inter_chr12_10621|ncRNA_inter_chr12_10715|ncRNA_as_chr16_13511|ncRNA_inter_chr18_14691|ncRNA_inter_chr19_15003|ncRNA_intra_chr19_15014|ncRNA_intra_chr19_15011|ncRNA_as_chr9_7767|ncRNA_as_chr19_14977|ncRNA_as_chr2_1965|ncRNA_as_chr1_483|ncRNA_inter_chr8_6961|ncRNA_inter_chr13_11436|ncRNA_inter_chr2_1098|ncRNA_inter_chr3_2269|ncRNA_inter_chr4_3183|ncRNA_as_chr5_4694|ncRNA_as_chr15_12817|ncRNA_as_chr19_15130|ncRNA_inter_chr2_1963|ncRNA_inter_chr4_3468|ncRNA_intra_chr7_5920|ncRNA_inter_chr3_2137|ncRNA_inter_chr14_12024|ncRNA_inter_chr1_401|ncRNA_inter_chr6_5138|ncRNA_inter_chr6_5824|ncRNA_inter_chr7_6511|ncRNA_inter_chr9_8249|ncRNA_inter_chr10_8767|ncRNA_as_chr10_8927|ncRNA_inter_chr19_14853|ncRNA_inter_chr4_3052|ncRNA_inter_chr5_4577|ncRNA_inter_chr5_4578|ncRNA_inter_chr8_6816|ncRNA_inter_chr9_7993|ncRNA_as_chr9_8050|ncRNA_inter_chr9_8147|ncRNA_as_chr11_10151|ncRNA_inter_chr11_10195|ncRNA_inter_chr12_10942|ncRNA_inter_chr1_987|ncRNA_inter_chr14_12026|ncRNA_inter_chr18_14293|ncRNA_inter_chr18_14604|ncRNA_inter_chr19_14979|ncRNA_inter_chrX_15549|ncRNA_inter_chr1_73|ncRNA_inter_chr1_51|ncRNA_inter_chr1_53|ncRNA_inter_chr1_47|ncRNA_inter_chr1_56|ncRNA_as_chr4_3235|ncRNA_inter_chr11_9996|ncRNA_inter_chr2_1498|ncRNA_inter_chr2_1491|ncRNA_inter_chr4_3178|ncRNA_inter_chr5_4137|ncRNA_inter_chr5_4192|ncRNA_inter_chr5_4330|ncRNA_inter_chr5_4329|ncRNA_as_chr5_4662|ncRNA_inter_chr5_4674|ncRNA_inter_chr6_5118|ncRNA_inter_chr6_5131|ncRNA_as_chr6_5336|ncRNA_inter_chr6_5595|ncRNA_inter_chr6_5822|ncRNA_inter_chr7_6343|ncRNA_inter_chr7_6391|ncRNA_inter_chr7_6509|ncRNA_inter_chr7_6522|ncRNA_inter_chr7_6523|ncRNA_inter_chr7_6524|ncRNA_inter_chr7_6534|ncRNA_inter_chr8_6757|ncRNA_intra_chr1_604|ncRNA_intra_chr8_7327|ncRNA_inter_chr1_631|ncRNA_inter_chr8_7605|ncRNA_inter_chr8_7606|ncRNA_as_chr9_8401|ncRNA_inter_chr11_9433|ncRNA_inter_chr11_9655|ncRNA_inter_chr12_10459|ncRNA_as_chr12_10896|ncRNA_inter_chr12_10979|ncRNA_inter_chr13_11120|ncRNA_inter_chr13_11294|ncRNA_as_chr13_11596|ncRNA_inter_chr14_12214|ncRNA_inter_chr14_12250|ncRNA_inter_chr2_1099|ncRNA_inter_chr15_12609|ncRNA_inter_chr15_12752|ncRNA_inter_chr15_12774|ncRNA_inter_chr15_12793|ncRNA_inter_chr15_12792|ncRNA_inter_chr16_13508|ncRNA_inter_chr19_14851|ncRNA_inter_chr19_14855|ncRNA_inter_chr19_15030|ncRNA_as_chr19_15054|ncRNA_inter_chr19_15190|ncRNA_as_chr2_1457|ncRNA_inter_chr3_2303|ncRNA_as_chr3_2567|ncRNA_inter_chr3_2722|ncRNA_inter_chr3_2937|ncRNA_inter_chr4_3307|ncRNA_inter_chr4_3425|ncRNA_inter_chr4_3779|ncRNA_inter_chr11_9631|ncRNA_inter_chr13_11122|ncRNA_inter_chr13_11383|ncRNA_inter_chr15_12855|ncRNA_as_chr18_14310|ncRNA_inter_chr3_2488|ncRNA_inter_chr3_2744|ncRNA_inter_chr4_3859|ncRNA_inter_chr5_4115|ncRNA_as_chr6_5601|ncRNA_inter_chr1_670|ncRNA_inter_chr10_9183|ncRNA_inter_chr11_10217|ncRNA_as_chr12_10618|ncRNA_inter_chr16_13137|ncRNA_inter_chr4_3285|ncRNA_inter_chr4_3286"),x = rownames(G172.umis), value = FALSE)

G172M1M3 is the correct batch DE geens

DE1.M1M3.0.1 <- grep(c("ncRNA_as_chr7_5999|ncRNA_as_chr15_12340|ncRNA_inter_chrX_15446|ncRNA_inter_chr2_1419|ncRNA_inter_chr19_14746|ncRNA_inter_chr17_13909|ncRNA_as_chr8_7528|ncRNA_inter_chr9_7809|ncRNA_as_chr4_3532|ncRNA_as_chr19_14823|ncRNA_as_chr19_14883|ncRNA_as_chr8_7521|ncRNA_inter_chr10_8697|ncRNA_intra_chr6_5593|ncRNA_as_chr6_5589|ncRNA_as_chr8_6954|ncRNA_inter_chr5_3974|ncRNA_as_chr5_4325|ncRNA_inter_chr8_6743|ncRNA_as_chr12_10281|ncRNA_as_chr7_6166|ncRNA_as_chr12_10697|ncRNA_inter_chr11_9512|ncRNA_as_chr14_12038|ncRNA_inter_chr5_4221|ncRNA_as_chr5_4744|ncRNA_inter_chr3_2988|ncRNA_inter_chr17_13928|ncRNA_inter_chr13_11227|ncRNA_inter_chr15_12608|ncRNA_inter_chr12_10270|ncRNA_inter_chr4_3436|ncRNA_inter_chr2_1302|ncRNA_inter_chr2_1077|ncRNA_inter_chr1_292|ncRNA_as_chr1_373|ncRNA_as_chr19_14977|ncRNA_as_chr1_625|ncRNA_intra_chr14_11961|ncRNA_as_chr5_4334|ncRNA_as_chr10_8962|ncRNA_inter_chr2_1491|ncRNA_inter_chr13_11070|ncRNA_as_chr6_5634|ncRNA_as_chrX_15320|ncRNA_inter_chr10_9000|ncRNA_inter_chr5_4220|ncRNA_inter_chr11_9434|ncRNA_inter_chr10_9264|ncRNA_as_chr15_12817|ncRNA_as_chr9_7702|ncRNA_as_chr11_10075|ncRNA_as_chr19_14882|ncRNA_inter_chr3_2156|ncRNA_as_chr7_6192|ncRNA_inter_chr8_7363|ncRNA_inter_chr10_9193|ncRNA_inter_chr13_11752|ncRNA_inter_chr5_4395|ncRNA_as_chr17_13708|ncRNA_as_chr3_2894|ncRNA_inter_chr15_12365|ncRNA_inter_chr14_11945|ncRNA_inter_chrX_15437|ncRNA_inter_chr10_9086|ncRNA_as_chr18_14602|ncRNA_as_chr1_252|ncRNA_inter_chr8_6726|ncRNA_inter_chr13_11602|ncRNA_as_chr4_3083|ncRNA_inter_chr5_4593|ncRNA_as_chr17_14018|ncRNA_inter_chr12_10880|ncRNA_inter_chr3_2768|ncRNA_as_chr12_10521|ncRNA_inter_chr4_3294|ncRNA_as_chr8_7632|ncRNA_as_chr2_1440|ncRNA_inter_chr8_6759|ncRNA_as_chr2_1543|ncRNA_inter_chr11_9922|ncRNA_as_chr2_1884|ncRNA_as_chr17_13683|ncRNA_as_chr1_978|ncRNA_as_chr7_6467|ncRNA_inter_chr17_14026|ncRNA_inter_chr17_13801|ncRNA_inter_chr12_10476|ncRNA_as_chr4_3235|ncRNA_as_chr7_5921|ncRNA_inter_chr1_291|ncRNA_inter_chr1_161|ncRNA_inter_chr5_4052|ncRNA_inter_chr11_9911|ncRNA_inter_chr7_6501|ncRNA_as_chr4_3559|ncRNA_as_chr6_5860|ncRNA_inter_chr7_6318|ncRNA_as_chr1_222|ncRNA_inter_chr10_8469|ncRNA_as_chr5_4281|ncRNA_as_chr11_9956|ncRNA_as_chr2_1695|ncRNA_as_chr4_3224|ncRNA_as_chr15_12467|ncRNA_as_chr17_13834|ncRNA_as_chr10_9389|ncRNA_inter_chr7_6369|ncRNA_inter_chr11_9926|ncRNA_as_chr15_12818|ncRNA_inter_chr1_496|ncRNA_inter_chr6_5862|ncRNA_as_chr1_400|ncRNA_inter_chr10_9208|ncRNA_inter_chr17_14128|ncRNA_as_chr8_7331|ncRNA_as_chr6_5722|ncRNA_as_chr19_14782|ncRNA_inter_chr3_2697|ncRNA_inter_chr12_10462|ncRNA_inter_chr11_9923|ncRNA_inter_chr1_846|ncRNA_inter_chr2_2079|ncRNA_inter_chr9_7999|ncRNA_inter_chr4_3458|ncRNA_inter_chr8_7654|ncRNA_as_chr18_14332|ncRNA_inter_chr3_2166|ncRNA_as_chr2_1439|ncRNA_as_chr19_14976|ncRNA_as_chr12_10245|ncRNA_inter_chr5_3975|ncRNA_inter_chr1_840|ncRNA_as_chr4_3298|ncRNA_inter_chr6_4980|ncRNA_as_chr1_762|ncRNA_inter_chr7_6189|ncRNA_inter_chr19_14990|ncRNA_as_chr13_11068|ncRNA_inter_chr19_14880|ncRNA_inter_chr11_9948|ncRNA_inter_chr6_4887|ncRNA_as_chr13_11149|ncRNA_as_chr2_1550|ncRNA_inter_chr4_3698|ncRNA_inter_chr10_9366|ncRNA_inter_chr5_4065|ncRNA_as_chr8_7375|ncRNA_as_chr19_14713|ncRNA_inter_chr9_8121|ncRNA_as_chr2_1677|ncRNA_inter_chr5_4022|ncRNA_as_chr2_1966|ncRNA_as_chr19_15130|ncRNA_inter_chr12_10561|ncRNA_inter_chr4_3819|ncRNA_as_chr19_14732|ncRNA_inter_chrX_15297|ncRNA_inter_chr11_9635|ncRNA_as_chr1_221|ncRNA_inter_chr8_6878|ncRNA_inter_chr9_7885|ncRNA_as_chr11_9990|ncRNA_inter_chr14_11845|ncRNA_as_chr11_10222|ncRNA_inter_chr3_2161|ncRNA_inter_chr2_1958|ncRNA_inter_chr11_10189|ncRNA_intra_chr8_6800|ncRNA_inter_chr1_852|ncRNA_as_chr7_6161|ncRNA_inter_chr1_109|ncRNA_inter_chr16_13456|ncRNA_inter_chr19_15132"),x = rownames(G172.umis), value = FALSE)
DE2.M1M3.0.1 <- grep(c("ncRNA_inter_chr19_14954|ncRNA_inter_chr3_2411|ncRNA_inter_chr16_13190|ncRNA_inter_chr15_12770|ncRNA_as_chr5_4384|ncRNA_inter_chr6_5510|ncRNA_as_chr11_10149|ncRNA_inter_chr9_8350|ncRNA_as_chr2_1145|ncRNA_inter_chr6_5542|ncRNA_inter_chrX_15278|ncRNA_inter_chr13_11385|ncRNA_as_chr2_1579|ncRNA_inter_chr6_4875|ncRNA_as_chr10_9365|ncRNA_inter_chr7_6338|ncRNA_as_chr8_7096|ncRNA_inter_chr14_12199|ncRNA_inter_chr1_812|ncRNA_inter_chr14_11979|ncRNA_as_chr17_14069|ncRNA_inter_chr1_120|ncRNA_as_chr17_13658|ncRNA_as_chr14_12055|ncRNA_as_chr16_13150|ncRNA_inter_chr6_5310|ncRNA_as_chr9_7957|ncRNA_inter_chr1_119|ncRNA_inter_chr2_2066|ncRNA_intra_chr7_5919|ncRNA_inter_chr14_12030|ncRNA_inter_chr17_13792|ncRNA_as_chr14_11948|ncRNA_as_chr2_1073|ncRNA_inter_chr8_6742|ncRNA_inter_chr6_5610|ncRNA_inter_chr7_6334|ncRNA_inter_chr10_9320|ncRNA_as_chr7_6032|ncRNA_as_chr6_5508|ncRNA_as_chr5_3947|ncRNA_inter_chr6_4981|ncRNA_inter_chrX_15240|ncRNA_as_chr13_11779|ncRNA_inter_chr4_3793|ncRNA_inter_chr10_8794|ncRNA_as_chr11_10121|ncRNA_as_chr9_8224|ncRNA_as_chr4_3820|ncRNA_as_chr19_15151|ncRNA_inter_chr15_12845|ncRNA_as_chr11_9812|ncRNA_inter_chr6_5318|ncRNA_as_chr2_2108|ncRNA_inter_chr13_11254|ncRNA_inter_chr12_10973|ncRNA_inter_chr19_14964|ncRNA_inter_chr6_5582|ncRNA_as_chr10_9147|ncRNA_as_chr15_12321|ncRNA_inter_chr2_1171|ncRNA_inter_chr3_2165|ncRNA_as_chr11_9897|ncRNA_intra_chr8_6802|ncRNA_inter_chr8_6788|ncRNA_inter_chr16_13443|ncRNA_as_chr1_253|ncRNA_as_chr8_7410|ncRNA_inter_chr12_10269|ncRNA_as_chr7_6655|ncRNA_inter_chr8_7682|ncRNA_as_chr9_8316|ncRNA_inter_chr8_7267|ncRNA_inter_chr2_1237|ncRNA_inter_chr17_13939|ncRNA_inter_chr11_10233|ncRNA_as_chr11_9838|ncRNA_inter_chr9_8000|ncRNA_inter_chr13_11669|ncRNA_inter_chr19_14774|ncRNA_inter_chr10_9210|ncRNA_inter_chr4_3549|ncRNA_as_chr8_6874|ncRNA_inter_chr16_13171|ncRNA_as_chr3_2545|ncRNA_inter_chr6_5045|ncRNA_inter_chr10_9263|ncRNA_as_chr10_9048|ncRNA_inter_chr7_6182|ncRNA_inter_chrX_15244|ncRNA_inter_chr12_10649|ncRNA_as_chr18_14628|ncRNA_as_chr9_8428|ncRNA_as_chr19_15065|ncRNA_inter_chr3_2572|ncRNA_as_chr5_4771|ncRNA_inter_chr17_14187|ncRNA_inter_chr12_10411|ncRNA_inter_chr19_14874|ncRNA_as_chr11_9767|ncRNA_as_chr16_13458|ncRNA_as_chr8_7367|ncRNA_as_chr7_6293|ncRNA_inter_chr15_12653|ncRNA_inter_chr11_10211|ncRNA_as_chr17_13856|ncRNA_as_chr2_1542|ncRNA_inter_chr4_3285|ncRNA_inter_chr3_2653|ncRNA_inter_chr7_6397|ncRNA_inter_chr9_8104|ncRNA_as_chr3_2554|ncRNA_as_chr14_12134|ncRNA_inter_chr17_13551|ncRNA_as_chr8_7523|ncRNA_as_chr15_12460|ncRNA_as_chr2_1101|ncRNA_inter_chr8_7519|ncRNA_as_chr17_13822|ncRNA_inter_chr4_3738|ncRNA_inter_chr2_1830|ncRNA_inter_chr5_4321|ncRNA_as_chr2_1694|ncRNA_inter_chr17_14182|ncRNA_inter_chr16_13352|ncRNA_inter_chr3_2742|ncRNA_inter_chr11_9503|ncRNA_inter_chr6_5724|ncRNA_inter_chr1_591|ncRNA_inter_chr13_11523|ncRNA_as_chr4_3316|ncRNA_inter_chr3_2345|ncRNA_as_chr3_2544"),x=rownames(G172.umis),value=FALSE)

DE3.M1M3.0.1 <- grep(c("Gm26992|Dpyd|Cwc22|Cps1|Upp2|Rad51b|Carmil1|Clpx|Fgb|Ang4|Fga|Gclc|Fgg|Fam13a|Sult3a2|Abcc2|Gsta3|Kcnt2|Irf9|Meiob|Crot|Gadd45g|G6pc|Pzp|Fgl1|Chrm3|Cfh|Etfbkmt|Sntg2|Cxcl1|Setbp1|Tymp|Crtc3|Pah|Kmo|Vmp1|Nfia|Rbpms|Slc7a2|Fam210b|Slc16a10|Plin2|St3gal1|Sox5|Ly6e|Sc5d|Wwox|mt-Atp6|Tacc2|Chka|Qsox1|Ass1|Pxmp4|Fam214a|Rnf125|Adgrv1|Por|Mbl1|Zbtb16|Adk|mt-Co3|Rrbp1|Map2k6|Pdgfc|Nfib|2810459M11Rik|Slc25a30|Adck5|Mindy3|Ypel2|Nrp1|Cryl1|mt-Cytb|Fbf1|Gas2|Otc|C4bp|Ldha|Aldh1l1|Garem1|Adh4|mt-Nd4|Inmt|mt-Nd2|Gm42906|Slc38a3|St3gal4|Ugt2b36|Ptprd|Insig1|Immp2l|Gon4l|Desi2|Tacc1|Cyb5a|Vwa8|Klf12|Gnmt|Prpf6|Cfi|Pter|Rapgef4|Fggy|Pitpnc1|Lbp|Peak1|Cdo1|Diaph2|Adh1|Mapk15|Slc30a10|Sdr9c7|Mamdc2|Rims2|Litaf|Ahcyl2|Abcb11|mt-Co2|Cyp2c29|Crp|Slc25a47|Slc37a1|Pnrc1|Hgd|Rai14|Prg4|Gcnt7|mt-Nd3|Rint1|Fgfr2|Gclm|Glt1d1|Ddc|Vtn|Eva1a|Trpm3|Zc3h13|Trp53inp2|Saa4|Nr3c2|Zbtb20|Cebpb|Cpb2|Nr2c2ap|Gsap|Itih3|Suds3|Insig2|Igf1|Hhex|Lnx2|Vcl|Sugct|Tmem243|mt-Nd4l|Chn2|Clock|Mthfr|Agmo|Pid1|Fech|Gm4952|Skap2|Pdia5|Onecut1|Acat1|Kynu|Tmed5|mt-Nd1|Nos1ap|Acaca|Serpina10|Ptpn3|Tifa|Bhmt|Clec2d|Nfil3|Abca6|Ern1|Ces1d|Pcyt2|Ftcd|Slc38a4|Gspt1|Inhba|Larp4b|Simc1|Traf5|Gtpbp4|Pik3c2g|Phf20l1|Timm23|Rpl36|Senp5|Slc17a5|Fabp1|Gldc|Ripor2|Lrpprc|Tab2|Zpr1|Etfdh|Thrsp|Ube2f|Peg3|Slc24a5|Gm3839|Tgoln1|Agmat|Kpna4|Fetub|St5|Ypel3|Sf3b3|Rlf|Pkhd1|Slco1b2|Gfod2|Ccdc12|Sco2|Exoc5|Ftl1|Zfp697|Eif2s2|Fnbp1|Nek6|Txndc15|Mastl|Bach2|Wsb1|Map3k14|Abcg8|Zbtb7a|Pawr|Tmem219|Gpd1|Erlin1|Gpc4|Fpgs|Eif1|Ap3s1|Akr1a1|Macrod2|mt-Co1|Slc25a17|Pck1|A230050P20Rik|Zkscan1|Cxadr|Gm6614|Ldah|Ppp1r3c|B3gat3|Fermt2|Cpn1|Mpp6|D430042O09Rik|Rtf2|Itih4|Dbi|Prodh|Lgals9|Bend7|Tstd1|Gm4756|Ptges3|Hsd17b13|March2|Fam210a|Cox8a|Lars2|Hsd17b12|Sqstm1|Col6a6|Etnppl|Ppfia1|Tbc1d5|Zc3h15|Calr|Sigmar1|Ptpn1|Iscu|Tmem248|Tecpr2|Ccdc152|Gabarapl1|Mrpl38|Cep44|2810474O19Rik|Ftl1-ps1|Grina|Lars|Serinc1|Slc25a51|Slc25a25|Ppp4r3b|Nsd3|Lcp1|Socs3|Usp6nl|Fth1|Pms1|Hmgcl|Sik1|Clpp|Ech1|Kifc3|Ssu72|Clic4|Dnajc3|Ei24|Stx16|Prr16|Rffl|Rasal2|Cfap54|Scai|Serping1|Mettl26|C4b|Hspa4|4931406P16Rik|Dnmt3b|Chd4|Cul1|Mal2|Ncoa5|Scarb1|Dcaf5|Akap8|Plk3|Tor1aip1|Strbp|Inhbc|Zfp410|Nedd4l|Gm11639|Catspere2|Sh3bgrl2|1600014C10Rik|Slc11a2|Creb3l3|Atp7a|Taok3|Ank3|Dab1|Zfp141|Nr1i3|Dmgdh|Ube2k|Clcn3|Amn1|Retreg3|Etnk1|Ergic1|Gata4|Coq3|Coq10b|Eif3c|Rpl24|Pfn1|Hint1|Trmt112|Brip1|Ifi35|Serpina3n|Helz2|Saysd1|Msmo1|Atox1|Cox19|Lactb|Errfi1|Rabac1|Fam168b|Ndufa4l2|Cyp2e1|Slc15a4|Sntb1|Glyat|Ranbp2|Tpd52l2|Hectd2|Dcaf7|Cox7a2l|Pcsk7|Kdm5b|Rb1|Mcl1|mt-Nd5|Fam135a|Pnkd|Zfhx2|Dcaf6|Nasp|Timm9|Kras|Cox6a1|Ifrd1|Adap2|Plpp3|Znrf2|Rexo1|Eif4e|Nckap5|Pxmp2|Ddx39b|Gm28305|Krt18|5830473C10Rik|Lrig1|Amacr|Agpat2|Sod2|Dhrs4|Slc25a20|Cggbp1|Irak4|Tm9sf2|Traf6|Ghr|Myo10|Serp1|Wdr37|Atp1a1|Nr2f2|Nck1|Prpf4b|Frrs1|Gnas|Tmem30a|Ndrg3|Ttc7b|Abhd17c|Cpeb4|Drg1|Fam160a2|Zmynd8|Smim13|Gfer|Otulin|Ahsa2|Mphosph8|Nedd8|Rc3h1|Slc25a42|Creld1|Lap3|Gsdme|Fn1|Exd1|Nrbp2|Serf2|Abhd14b|Nars2|Cdh1|Caprin1|Fam162a|Akirin1|Selenot|Eps15|Dtnbp1|Syvn1|Luzp1|Cebpz|Slk|Plbd2|Lsm6|Prr3|Eif4e2|Ghitm|Ggps1|Rpl6|Pigl|Neb|Cabyr|Park7|Cab39|Creg1|Chd7|Elavl1|Hspa5|Fem1c|Plcxd2|Gtf2ird1|Nup98|Hdlbp|C1ra|AI182371|Psmd11|Srsf7|Cyp2c23|Cyp3a25|Pycrl|Nostrin|Bag3|Apobec1|Nipa2|Uqcr10|Alkbh5|Susd1|Tra2b|C8g|Sdf2|Baiap2l1|Gbe1|Plcb1|Tmed2|Ttr|2210408I21Rik|Dnm1l|Sema6b|Aldh1a1|Eif4h|Cyp2j6|Gm37240|Palld|Sat1|Wdr20|Pnpla7|Parva|Urgcp|Top1|Rab6a|Cyp2j5|B4galt5|Cp|Zfp970|Elob|Dnaja2|Ndufa4|B4galt1|Gltpd2|Lasp1|Nufip2|Sftpd|Pak2|Nup54|Mtfr1|Slc10a2|Cep170|Midn|Rnf11|Micall1|1110008F13Rik|Sardh|Peli1|Tmem238|Slc30a9|Polr2a|Sgpl1|Ormdl3|Slc3a1|Aldh1a7|Etv6|Hmgcs2|Xbp1|Nectin2|Rap1b|Gatad2a|Acsl1|Golga5|Bcl7c|Fam111a|Mapkapk2|Polr2j|Rtp3|Inpp5a|Frmd4b|Slc35b3|Naca|Mical2|Ppm1g|Mapre3|Id2|Srpr|Cpox|Eif4b|Ntan1|Zfp810"),x = rownames(G172.umis), value = FALSE)
DE4.M1M3.0.1 <- grep(c("Cox7a2|Astn2|Smad1|Serbp1|Rusc2|Foxa3|Ergic2|Spin1|Cela1|Nudt12|Rnf24|Tex2|Chdh|Zkscan3|Shtn1|Slc35d1|Cd81|Zfp799|Vcp|Akap1|Chuk|Gphn|Lonp2|Etf1|Bace1|Slc39a11|Dnah8|Ccni|Alkbh1|Mpp7|Hook2|Yy1|Mob4|Scyl2|Gatad1|Rere|Parg|Zfp182|Il6st|Ap1ar|Acadvl|Atxn7l3b|Stra6l|Btbd1|Yaf2|Brd1|Vtcn1|Rpl11|Orc3|Ndufv3|Hibadh|Hsd17b6|Tmx4|Ppp2ca|Ubr4|Nek1|Morn1|Herc4|Ubqln1|Gm10563|Dzip3|Tank|Farp1|Tcta|Papola|Bmpr1a|Hspa9|Eif5|Tmem131|Bri3|Pank1|Mttp|1110059E24Rik|Lrfn3|Hivep1|Neu1|Tbce|Efna5|Zcchc6|Actr2|Slc16a1|Sec22b|Ythdf2|Tef|Ybx1|Preb|Zbtb1|Pld1|F9|Rarb|Gmeb2|Rad23b|Rcc2|Gorasp2|Lztfl1|Fam104a|Sfpq|Smagp|Ppil4|Edf1|Nhsl1|Ints7|Zfp385b|Psmb1|Timm13|Zfp652|Itsn1|Mrps34|Eef1b2|Lurap1l|Gsr|Ddx50|Wdr53|Sec62|Gls2|Cnot7|Xdh|Cluh|Atxn7l1|Tmem150a|Net1|Senp6|Fam120c|Gpx4|Ethe1|Commd7|Fbxo42|Mrps26|Cltb|Car1|Kansl3|Pspc1|Tbc1d22a|Pex13|Rnf2|B230219D22Rik|Dclre1c|1700019A02Rik|Acox1|Wipi2|Vezt|Dpf3|Gm14403|Gmcl1|Hsdl2|Eif2b1|Emc3|Rap1gap|Trit1|Pqlc1|Nf1|Scaf8|Shq1|Larp4|Ngrn|Ubb|Vcpip1|Ube2j2|Lrrc29|Snx3|Mast2|Atp5l|Rnf19a|Atp6v1f|Eif4g2|Klhl2|Slc7a7|Cox7b|Adam11|Mbd1|Yap1|Grb10|Mprip|Lin7c|Zbtb11|Pura|Gabarap|Srsf6|8430408G22Rik|Oma1|Akr1c19|H2-T23|Szrd1|Mrnip|Nsd2|Usmg5|Rab18|Sppl2a|Mcm7|Kif5b|Thrap3|Tpst2|Blvrb|Samm50|Fbxw8|Lztr1|Ppp2r2d|Actl6a|Btaf1|Bcl3|Atr|Clu|Erp29|Pla2g12b|Csnk2a2|Sdf4|Sdr42e1|Ttpal|Rsbn1l|Gm379|Ubxn1|Ythdc1|H2afj|Prickle1|Abat|Nolc1|Nrip1|Acbd5|Spata24|Ror1|Mtmr14|Igfals|Map7d1|Plin5|Casp8ap2|Rnf10|Gin1|Tc2n|Nr2f6|Acp5|Tgfa|Zfp24|Gpx1|Dnaja3|Ifitm3|Usp16|1700037C18Rik|Idnk|Rp9|Cdip1|Rpn1|Cdv3|Eif4a1|Hmgcs1|Smad9|9030624G23Rik|Sult5a1|Oplah|Zfp106|Mtmr1|Colgalt2|Rai1|Dgkh|Ppp4r3a|Ddx23|Dstn|Stat5a|Hmces|Ythdf1|Adipor2|Dynll2|Gcgr|Dhx9|Asb13|Eci1|Zhx2|Eif2b4|Upb1|Psmb2|Foxn2|Zbtb5|Rad54l2|Cpeb2|Tmed4|Kdm3a|Metap1|Ankrd46|Akirin2|Lpin2|Mrps7|Nprl3|Ctsz|Soat2|Atp6v1h|Caml|Upf3b|Map4k5|Pdia3|4932438A13Rik|Dnajb11|Smurf2|Mtif2|Cyp4f17|Paip2|Slc29a1|Tars|Vamp8|G3bp1|Adh7|Vwce|Anapc16|Scyl3|Cops6|Snw1|Ranbp9|Gosr2|Chordc1|Mrps10|Ncam2|E130311K13Rik|Wars|Eif5b|Znhit1|Actb|Gmfb|Crk|Hipk2|Crem|Nr0b2|Dusp1|Sdf2l1|Hadha|Atp11a|Ddb1|Prkd3|Htatip2|Ints8|Qprt|Rcbtb2|Greb1l|Klf9|Pithd1|Ugt3a1|Mrpl52|Psmd4|Ppib|Clns1a|Rad54b|Smarcad1|Vps72|Ttc14|Hadhb|Xiap|Ceacam1|Sec63|Cox11|Clptm1|Atp11b|Cox7c|Shmt1|Abl2|Ngef|Mgat2|Dus1l|Serpina3c|Tmem259|Rhoa|Rpl27a|Ndufb11|Brwd3|Fam53a|Hmgcr|2310030G06Rik|Med13|Fer|Reln|Uxt|Junb|Pdia6|P4ha1|Ndufa10|Atp5c1|C1s2|Wdr4|Cebpg|Stk38|Nadsyn1|Dexi|Fam120b|Trabd|Elmo1|Ahnak|Tmem234|Stk24|Ywhaz|Ppdpf|Tpp2|Mreg|Nphp3|Gpkow|Prelid2|Slc30a5|Derl1|Stx5a|Stat3|Pyurf|Ppp2r1b|Tbca|Phrf1|Utp14a|Tmed7|Patl1|Pebp1|Vps50|Caap1|Ssb|Pdrg1|Gnl3|Farsa|Ufc1|Tubb4b|Foxj3|Ubn1|Cox6c|Rspry1|Kpna1|Btd|Dcaf10|Mbd2|4921524J17Rik|Uqcrq|Pdia4|Paip1|Shpk|Stard13|Plxnb2|Utp4|Bsg|Rnf114|Cfap97|Tmem127|Rnps1|Map3k10|Riok1|Nop58|Gcsh|Rac1|Fyco1|Trappc4|Bclaf1|Ptpn2|Ddx19b|Hs2st1|Zswim8|Gm5617|Dcun1d3|Actn1|4930556J24Rik|Lrp5|Cdk7|Asgr1|Supt5|Pabpc1|Hnrnpl|Lamp1|Emc6|R3hdm1|Bckdhb|Srsf11|Wdr7|Tmem143|Aatf|Pef1|Acad8|Togaram1|Sympk|Mrpl34|Myl12b|C1galt1|Sync|Zfp867|Snap47|Tma7|Mtss1|Rest|Tssc4|Creb1|Fkbp8|Large1|Imp3|Sdsl|Eif3e|Rpl10a|Atp6v0b|Prpsap1|Cdc42bpb|Actr1a|Mocos|Rab2b|Lcat|Scaf1|Sf3b6|Atp13a1|Ndufb5|Mat2a|Igf2bp3|Prdx5|Hnmt|Cox5a|Ighmbp2|Setdb2|Tmem19|Actn4|Oxld1|Maged1|Sox6|Gjb2|Lsm12|Sec61a1|Baz1b|Psmd5|1190002N15Rik|Ndufb9|Abhd3|Dicer1|Cldn1|Mindy1|Acads|Dhps|Rpl19|Baz1a|Iws1|Supt16|Ccnt1|Atg2a|Fbxw7|Rps3a1|Wdr45b|Dock4|Fam25c|Sdhaf3|Swt1|Serpinc1|Gan|Sbds|Med6|Pcf11|Coq10a|Smap1|Gpr68|Psmd8|Txn2|Ascc2|Fbxo31|Vti1b|Taf11|Fam222b|Ldlr|Tle3|Acbd3|Lrrc58|Sirt1|Lmna|Slc40a1|Gpt|Ccdc122|Tex30|Cpsf1|Mrpl2|Esco1|Cdc42bpa|Xylt2|Nlrp6|Mrpl57|Zfp451|Gpatch2l|4833439L19Rik|Prpf31|Csnk1d|Rabep2|Gria3|Ndufs3|Rapgef5|Shoc2|Rnf217|Chd9|Rbm4b|Ap2a2|Myl6|Cars|Mlxip|Tbc1d20|Calm1|Col4a1|Fam207a"),x = rownames(G172.umis), value = FALSE)
DE5.M1M3.0.1 <- grep(c("Ppard|Rps11|Wdtc1|Vapa|Neto2|Kpna3|Mrpl4|Nf2|Mtor|Tm9sf4|Wdr82|Cox18|Nrn1|Zfp444|Mrpl17|Tm2d1|Angptl4|Prok1|Mcph1|Ulk1|Tmem214|Taf1a|Sem1|Fndc3b|Fchsd2|Olfm2|Gm11808|Tpk1|Itgb1|Mkl1|Fbxo38|Rras2|Rnf111|Tsc22d2|Tmem216|Nr2c2|Aaed1|Apoo|Hyal2|Atp2c1|Pi4kb|Slc39a14|Tst|Kdelr1|Ube2a|Clpb|Coa3|Ap5z1|Ddx21|Nop10|Gimap9|Wsb2|Abce1|Ccar1|Inca1|Tgm2|Ogfod1|Mthfs|Bdp1|Il13ra1|Rdh14|Cgrrf1|Hnrnpk|Zfp830|Stk16|Vav2|Gm7298|Trp53inp1|Dpagt1|Rnf138|Tcim|Sec11a|Cdkn1a|Ttc19|Faf2|Atg14|H3f3a|Thumpd3|Mrpl49|Cdc123|Srp9|Lrp1|Rabgef1|Spcs2|Lamp2|Sfr1|Rexo2|Anxa7|Pcgf6|Bbox1|Ube2d2a|Nploc4|Lonrf3|Car14|Psmc3|Malsu1|Ints6|Dnajc15|Sec13|Lpar6|Fbxw4|Zfp512|Heatr1|Cdkn2aip|Ganab|Bbs9|Pla2g6|Tmem141|Manba|D17Wsu92e|Cpt2|Cldn2|Thoc7|Clta|Gtf2a2|Grpel1|Atg2b|Hdac4|Sec24c|Snrnp48|Zfp773|Atp5a1|Zfp664|Cmah|Mogs|Ddost|Cyp26a1|Trrap|Ext2|Eif3a|Canx|Rplp1|Mul1|Nudt5|Nono|Slc35a2|Irak2|Fkrp|Lrig2|Brms1l|Dek|Heatr6|Morf4l1|Ddhd1|Zcchc11|Tbl1x|Mcfd2|Map3k20|Ston1|Rabggtb|Steap4|Minos1|U2af1|Bmt2|Crip2|March5|Gtf2e1|Snrnp70|Edem3|Ehd1|Cyc1|Rbm10|Ing4|Xpo4|Sidt2|Ankrd11|Rbm18|Vps37a|Mob1b|Abcf2|Ginm1|Tmem68|Zcchc14|C1rl|Dad1|Usp15|Ube2v2|Ssfa2|Kxd1|Ttll4|Zdhhc18|Tmem163|Hfe|Pex6|Ezh2|Mapk1|Scarb2|Ostc|Brix1|Atp6ap2|Ddhd2|Apcs|Spint2|Tbck|Tsen34|Rpl5|Nat10|Mtfr1l|Ninj1|Ano6|Fnta|Fgfr4|Pgk1|Ccdc28a|Nipsnap2|Nudt13|Xpr1|Cct2|Ppm1d|Atp9a|Upf2|Gak|Kdm3b|Hnrnph1|Trim44|Agrn|Csde1|Olfr16|Ppip5k2|Dennd5b|Pdcd6ip|Pop1|Tmem176b|Efl1|Eif5a|Otud5|Hist1h2bc|Zfp740|Dip2b|Alkbh8|Pfdn5|Npc1|Gabarapl2|Ppil2|Tmem167|Calm2|Ppp1r13b|Abca8b|Mcm9|Proc|Mrps21|Cnot8|Pxylp1|Alkbh2|Ptpn11|Zfand5|Tom1l2|Tspo|Sra1|Rps10|Fam76b|Zfp131|Cldn3|Mrps12|Ifnar2|Ces1f|Nfe2l1|Ube2n|0610030E20Rik|Cog4|Mbnl2|Camk2n1|Gatad2b|H2afy|Vezf1|Pkd2|Ddx1|Trappc8|Wwc2|Rnf38|Aak1|Atp5o|Hmgxb3|Slx4ip|Capza1|mt-Atp8|Mon1a|Smim10l1|Gspt2|Baz2a|Snx16|Cenpa|Riok3|Rrn3|Cwc15|Susd6|Oxsm|Apol9b|Ccm2|Cpq|Ccdc47|Fdft1|Cope|Mtf2|Zc3h7a|Psmg2|Tedc2|Tert|Rab11a|Rps13|Slc25a15|Fbxw2|Ercc4|Atg12|Ciapin1|Efr3a|Atp6v0a2|1110032A03Rik|Osbp|Fam118b|Pphln1|Pex19|Erbin|Aff4|Mlec|mt-Nd6|Trpc4ap|Zfp568|Zcchc24|Fnbp1l|Fam213b|Aimp1|Vac14|Ncor1|Akr7a5|Atp8b1|Cldn14|Ccdc25|Phf3|Supt6|Heatr5a|Jade2|Mif|Usf2|Tmem64|Chid1|Psmd7|Scaf11|Tex12|Mettl2|Gm11273|Rpl18|Alg11|Spsb2|Ube2z|Xrn2|Icam1|Ddx46|Sephs1|Slc35a3|Tram1|Bcl7b|Med27|Nrf1|Cntrl|Sec24b|Nol8|Xrcc4|Sumf1|Ier2|Hdac1|Heatr3|Mfn1|Ccdc91|Ssna1|Eif2s1|Nars|Cyp2j8|Cacybp|Txndc9|Spaca6|Zdhhc14|Samd8|Elmod3|Erh|Naa50|Oaz1|Me1|Glmp|Apon|Acbd4|Ngdn|Ufd1|Pou6f1|Prkar1a|Coq5|Eif3j1|Hspe1|Grpel2|Fxr2|Rab5a|Spata5|Senp2|Atp6v1a|Eri3|Xylb|Ago3|Agt|Tmem131l|Pllp|Atp6v1e1|Scand1|Tmem56|Gstm1|Psmd3|Tbc1d14|Faim|2210016F16Rik|Tmem208|Zfp768|Atat1|Timm8b|Crebzf|Pdhx|Copb2|Prkag2|Slc30a7|Timm17a|Dhx33|Nlk|Ppp1cb|Acbd6|Zfp326|Pqlc2|Leng9|Stk38l|Tmem126a|Hdgfl2|Slc25a26|Flii|Higd2a|C1s1|Lsg1|Puf60|Zfp655|Ribc1|Dhx40|Ppp1r37|Hoga1|Paqr9|Ccs|Nxf1|Ssr1|Fhit|Nme7|Pnpo|Kctd20|Eapp|Nras|Hectd1|Zfr2|Krt8|Ttf1|Ecd|Vps54|Mical3|Rprd1b|Zfx|Pcbp2|Ankrd13c|Cry1|Ikbkap|Agpat3|Mrpl40|Tat|Rtraf|Cdc26|Mrfap1|Ppp1r2|Vnn1|Ivns1abp|Alg14|Mrpl50|Gchfr|Cnpy3|Ost4|Ppp1r42|Dnase2a|Mrpl43|Vkorc1l1|Clp1|Slc25a5|Gm49356|Snip1|Slc35f5|Acad11|Polr3h|Tmem29|Zfc3h1|Usp9x|Utp11|Eny2|Irgm2|Ilf2|Zfp654|Anxa5|Klf3|Prpf19|Bcas3|Ccnl1|Pcbd1|Mospd3|Ctbs|Gm17660|Tprkb|Camta2|Mrpl20|Dusp11|Zfp513|Rlim|Mif4gd|Foxq1|Inppl1|Prr14|Cyb561|Chd8|Rab40c|Fbxw11|Dna2|Usp3|Klhdc8b|Cmas|Proser1|Nvl|Rrp1|Synj1|Sin3a|Hnrnpll|Taf2|Slc39a1|Cpsf2|Slain2|Ndufs7|Uqcrc1|Cmtm6|Hnrnpf|Mat2b|Ndst2|Gtf3c1|2410015M20Rik|Tomm22|AA986860|Immp1l|Top1mt|Qrich1|Ubc|Pex11a|Slc6a9|Mink1|Ppp2cb|Eif1a|Mrps24|BC005561|Slc26a1|Ctnnbl1|Rrp8|Pon1|Mrpl14|Tirap|Echdc2|Ppp4c|Hnf1b|Uso1|Carhsp1|Pcm1|Hspa13|Ehmt1|Dnajb4|Ep300|Apopt1|Atp2a2|Polk|Usp12|Pde3b|Tspan31|Qtrt1|Golim4|Tfr2|Zfp511|Hmbox1|Snx13|Atraid|Lyrm2|Paxx|Rps15"),x = rownames(G172.umis), value = FALSE)
DE6.M1M3.0.1 <- grep(c("Smim4|Prdm2|Pdss2|Vps53|Usp50|Acin1|Zbtb44|Atp6v1g1|Ppp2r5c|Ilvbl|Kdm5a|Wdr91|Oaz2|Pskh1|Sharpin|Fabp2|Suclg1|Slc39a10|Rab22a|3110043O21Rik|Med28|Lyrm1|Xpo7|Leprotl1|Zfr|Atf1|Tkfc|Tmed9|Mettl7a1|Dhx32|Tcp11l2|Tfeb|Acyp1|Ppp6c|Golga3|Pdpk1|Ptov1|Pfdn6|Snd1|Rps6ka1|Cul5|Rad17|Dnajb12|Emc7|Phf11c|Stt3b|Zfp592|Hist1h1c|Tdrd7|Ttyh2|Timp3|Rsf1|Lrrc28|Cdk17|Immt|Dnajc11|Cfap20|S100pbp|Btg1|Ube2e1|March7|Asap3|Fam98a|Naa30|Taf13|Tipin|Pip5k1c|Pole4|Gucd1|Smim14|Pcgf2|Maf|Mrps33|Ssr2|Fgfr1|Rnh1|Rpusd3|Igsf5|Pom121|Utp20|Lyn|E2f4|Cbfb|Lpgat1|Ncaph2|Spop|Srp19|Uox|3110021N24Rik|Atp5f1|Myo6|Farsb|Lsm1|Rpl18a|Ndufaf7|Selenof|Thoc1|Lypla2|Tgfbr1|Gm43064|Mtpn|Mrps18a|Aars|Cirbp|Tcp1|Phkg1|Slc25a39|Epn1|Ranbp17|Casd1|Mapk1ip1l|Pkdcc|Sept7|Cand1|a|Pitpnb|Lrpap1|Tmem186|Yme1l1|Gpbp1l1|Sirpa|Rpl23|Commd3|Vps28|Adam10|Gmps|Sec23ip|Naa25|Tgfbrap1|Pecr|Mars|Sgf29|Slc25a46|Rfc2|Hnrnpa1|Psma7|Foxp4|Parn|Txnrd1|4930453N24Rik|Prorsd1|Atg4a|Aqp8|Znrf1|Cdk11b|Man2a2|Sgta|Btbd10|Ddx31|Eci2|Spr|Iars2|Cast|Med15|Zranb2|Trim11|Psmc6|Rex1bd|Tspan12|Ankrd36|Pdcd7|Tut1|Rnf126|Dnajc5|Mroh1|Plcg1|Nucks1|Cct7|Bid|Cdadc1|Cmtm4|Exosc7|Abcf1|Tbc1d12|Zbtb43|Kif1c|Sbno1|Srpk1|Myh9|Plaa|Rack1|Akr1c6|Rps16|Phc3|Nmnat1|Ogdh|Uggt1|Epb41l4b|Herpud2|Mfap3|Cactin|Ddx42|Cxxc1|Mctp2|2310039H08Rik|Tm9sf3|Rps5|Trim25|Mrps11|Uckl1|Aes|Wdr12|Zfp367|Nudcd1|Pigyl|Hnrnpa0|Ep400|Flcn|Serpina1b|1110065P20Rik|Phf8|Eif2ak1|Cops3|Pdzrn3|Nr5a2|2010107E04Rik|Tmem175|Rin2|Usp39|Eef1d|Psmf1|1700123O20Rik|Trub2|Atp5h|Mad2l2|Lrrc3|Smdt1|Zbtb24|Wdr89|Ublcp1|Epas1|Fermt1|Tuba4a|Rps19|Abi2|Ccdc82|Zkscan7|Srrm2|Wdr61|Txlng|Ntmt1|Nfs1|Uros|Ccdc77|1700017B05Rik|Ubap2|Ppp1r15b|Cct4|Mt1|BC031181|Rnf216|Dhx29|Ablim3|Synrg|Zfp263|Nol9|Nup153|Habp2|Mphosph10|Rad50|Rpsa|C87436|Mocs1|Fastkd1|Dcaf17|Lmbrd1|Foxk2|Ccdc107|Epg5|Hars|Eif2ak2|Hras|Stt3a|Epo|Efna1|Uri1|Epc2|Stx8|Hyou1|Zfp646|1700109H08Rik|Dnajc21|Klhdc10|Ap4m1|Tmem70|Dync2h1|Mtmr10|Mob1a|Bop1|Alas1|P2rx4|Thap2|Mylip|H13|Ndufb10|Nelfa|Prelid1|Iqcb1|Snx33|Zhx3|Nup155|Mrap|Gm14325|Clk2|Eml3|Suz12|Necap1|Tmem123|Map3k7|Taz|Rab3gap1|Lrrc51|Fam32a|Wars2|Skp1a|Vipas39|Pcif1|Slc16a4|Ndufa8|Cyp2d26|Jmy|Tmem222|Tigd2|Eef2|Nabp1|Ssrp1|Thnsl2|Dhx16|Pgam5|Tsfm|Syn3|Pnkp|Uxs1|B3galnt2|Ggnbp2|Apmap|Cdc42se2|Lss|Mrpl27|Kctd2|Lsm4|Polr3f|Atp5d|Rps17|Trim33|Wdcp|Rpl32|Rab9|Slc18a1|Rab11b|Nceh1|Clec16a|Pepd|Trappc13|Rabgap1l|Psmc1|Nectin1|Ascc3|Aftph|Mtch2|Grip1|Map1lc3a|Fancl|Gemin5|Shprh|Adam19|Lage3|Nom1|Dnajc24|Pgs1|Prrg2|Ctdspl2|Grk5|Pik3c3|Slc35e2|Stap2|Uvssa|Mvb12a|Slc8b1|Rhbdd1|Ptpn9|Nck2|Csnk1g2|Laptm4a|Pus10|Ube2g2|Pir|Wrap53|Idh3g|Med8|Pomp|BC005624|Pcbp1|Polr2c|Klc4|F8|Ywhae|Brd7|Ppp4r1|Adnp2|Dennd5a|Prrc1|Ino80d|Zswim5|Rnf6|Otud4|Prr14l|Tmem106a|Cdc37|Col4a3bp|Tbc1d15|Sprtn|Phtf1|Bbs7|Mapk8ip3|Sugp1|Depdc7|Yipf5|Gpd2|Calu|Wbp2|Pnldc1|Slc35d2|Sf3b1|Tmem258|Gpr89|Pank2|Rps2|Ip6k1|Dolk|Ube2m|Smc5|Mrpl48|Cmc4|Maml1|Ccdc138|Rps4x|Pik3c2a|Emsy|Med4|Gng5|Rps26|Mettl27|Pak7|Psmb5|Poc1b|Cideb|Ppp1r10|Cbwd1|Ddx10|Lman2l|Dld|Mecr|Ptgr2|Cep57|Phb2|Cnpy2|Scamp2|Mdn1|Fip1l1|Parp4|Pxk|Bola3|Ube2j1|Stxbp3|Ahsg|Dgkq|Zcchc9|Mfsd11|Sh3gl1|Tpi1|Sdccag3|Tdrd3|Hnf4g|Polr1d|Hopx|Gid4|Tmod3|Rpl12|Safb|Btbd9|Vdac3|Akap9|Cep97|Rfwd3|March8|Smim12|Ccdc117|Abraxas1|Hbp1|Pdzd8|Fbxw9|Gapvd1|Thap3|Kat6a|Setdb1|Fam241a|Dph5|Slc25a13|Trim6|Abcf3|Tnfrsf1b|Desi1|Paxbp1|Slc38a10|Nedd1|AU040320|H2-Ke6|Tmem161b|Surf4|Cul2|Fat1|Adcy6|Trim41|Naa15|Rtf1|Dnajb6|Csnk2b|Cep350|Grn|Zfp282|Zfp346|Amdhd1|Acox3|Ubxn7|Tardbp|E130308A19Rik|Selenok|Eif3b|Vegfd|Pcnp|Irf3|Api5|Ndufv1|Zbtb41|Dcaf8|2510039O18Rik|Nfic|Dalrd3|Smarcc1|Ino80b|Abcc6|Sft2d3|Sipa1l3|Cpn2|Ola1|Gnb1|Galc|Ube2q2|Ncbp2|Vps26a|Prr13|Hace1|Zfp260|Coq7|Hagh|Mief1|Lias|Elf2"),x = rownames(G172.umis), value = FALSE)
DE1.M2M4.0.1 <- grep(c("Gm26992|Etfbkmt|ncRNA-inter-chrX-15446|ncRNA-inter-chr8-6726|Sult3a2|ncRNA-as-chr6-5589|ncRNA-intra-chr6-5593|Gm3839|Acsl1|ncRNA-inter-chr3-2156|Tymp|Errfi1|Ghr|Carmil1|ncRNA-as-chr15-12340|Cyp2c23|Pkhd1|Car1|G6pc|Adgrv1|ncRNA-as-chr4-3532|Dpyd|ncRNA-inter-chr11-9512|Alb|ncRNA-as-chr15-12321|Gm4756|C3|Apoe|Sugct|Dlgap1|Pbld1|Fga|Slc7a2|Vwa8|Nckap5|Klf9|Gm6614|Nfia|Rbpms|Hmgcs1|Mtif2|Peak1|ncRNA-inter-chr17-13909|Sult2a8|Clpx|Syne1|Baiap2l1|ncRNA-as-chr10-8791|ncRNA-inter-chr18-14605|Zfp697|ncRNA-as-chr2-1904|Cxadr|Sox5|Mapk15|Gm5934|Gm28305|ncRNA-inter-chr15-12608|Gm42906|Lpin2|Abcb11|Echdc2|ncRNA-as-chrX-15320|Abhd14b|Hmgcs2|ncRNA-as-chr15-12323|Tmem219|Gm37240|ncRNA-as-chr6-5860|ncRNA-as-chr19-14772|Eva1a|Glud1|Adra1b|Bri3|Acat1|ncRNA-as-chr4-3298|Fgfr4|Mrnip|Adh1|Fmo5|Iigp1|Sdr9c7|Slc39a14|Ttc7b|Suds3|ncRNA-inter-chr5-4221|Igf2bp3|ncRNA-inter-chr11-9948|Adck5|Sirt3|Col6a6|Chrm3|ncRNA-inter-chr4-3819|Fgfr2|Iah1|Immp2l|ncRNA-as-chr8-6954|Rint1|Saa4|Nhsl1|Gcnt7|Abcb4|Sh3d19|ncRNA-inter-chr3-2161|ncRNA-as-chr10-8962|Slc10a1|Timm9|ncRNA-as-chr2-1543|Tmem126a|ncRNA-inter-chr6-4887|Gbe1|Fam214a|Trp53inp2|Fech|Thnsl2|ncRNA-as-chr16-13178|Tmem150a|Eif1|Neb|Vmp1|ncRNA-as-chr17-13683|Nfib|Gm33543|ncRNA-as-chr7-6547|Herpud1|ncRNA-intra-chr6-5591|Cps1|Zbtb20|Zfp707|Ap3m1|Mettl23|Atp5o|Blm|Sdr42e1|Vcl|Ppara|Mab21l3|Prpf4b|Igf1|Preb|Tshz2|Shtn1|Nedd4l|Cabyr|ncRNA-as-chr4-3500|Zdhhc14|ncRNA-as-chr9-7702|Slc25a42|ncRNA-inter-chr13-11227|Stim2|Gm4952|ncRNA-intra-chr7-5919|Mecr|ncRNA-inter-chr12-10880|ncRNA-inter-chr4-3698|St3gal3|Hsd17b13|Plin2|Strbp|4833420G17Rik|Thap2|Fbf1|Zfand6|Ugt2a3|Olfr56|ncRNA-as-chr5-4334|Sco2|Numb|Bmp1|Dab1|ncRNA-as-chr2-1884|Adipor2|Irgm2|ncRNA-as-chr2-1145|ncRNA-as-chr12-10521|ncRNA-as-chr11-10075|Rnf25|Atr|Etfdh|F11|ncRNA-inter-chr10-9264|Bcas3|Acox2|Kyat1|ncRNA-inter-chr4-3294|Sqstm1|Proser1|Tmem243|Pid1|Btbd9|Me1|ncRNA-as-chr16-13380|Smad9|Smim13|Gucd1|Drg1|Phyh|Pde4c|ncRNA-inter-chr10-8794|Nr1h4|Mtss1|Elovl5|Slc37a4|Lztfl1|Stard5|Dnase2b|C1rl|Xiap|Msmo1|Ypel3|ncRNA-as-chr17-14018|Aaed1|Ggact|ncRNA-inter-chr1-846|ncRNA-inter-chr1-161|Ces1g|Sdc4|Ppp1r9a|Ap3s1|Mettl26|Trim7|Dhps|Rbfox1|Trim28|ncRNA-inter-chr11-10189|Eci2|Stx16|Gm10563|Dhrs4|Slc27a2|Gin1|Atp6v0b|Cpt1a|Nrp1|ncRNA-as-chr18-14628|Pxmp4|Rora|ncRNA-as-chr7-6161|ncRNA-inter-chr11-9922|Ttc14|Tfr2|Ifnk|Oxld1|Hadha|Nos1ap|Sf3b3|ncRNA-inter-chr12-10595|ncRNA-inter-chr15-12365|Fyco1|ncRNA-inter-chr12-10270"),x = rownames(G172.umis), value = FALSE)
DE2.M2M4.0.1  <- grep(c("Fam210b|ncRNA-as-chr1-979|Aldh1l1|ncRNA-inter-chr8-6975|ncRNA-inter-chr17-13928|Dnaja2|Plcb1|Net1|ncRNA-inter-chr6-5862|Lonp2|ncRNA-as-chr9-8316|Peli1|Them4|2810474O19Rik|Gclm|Zpr1|ncRNA-as-chr9-7825|ncRNA-inter-chr12-10561|Gria3|ncRNA-inter-chr13-11669|Ackr4|Rnf169|Ttpa|Gsdme|ncRNA-inter-chr12-10555|Slc7a8|Ggps1|1810022K09Rik|Slc24a5|ncRNA-as-chr4-3083|Rtp3|Son|Ddhd2|Dclre1c|ncRNA-as-chr19-15060|ncRNA-inter-chr5-4395|ncRNA-as-chr2-1439|Astn2|Traf6|Ssbp2|Slc35e2|ncRNA-as-chr6-5261|Ror1|Osbpl9|Pdrg1|ncRNA-as-chr11-10136|Nme7|1700037C18Rik|Cdip1|ncRNA-inter-chr1-109|Lims2|Hopx|Eef1akmt1|Pld1|Slc38a4|Esco1|Cox19|ncRNA-inter-chrX-15437|Ppdpf|Mrps10|Inca1|Bet1|ncRNA-inter-chr15-12713|ncRNA-as-chr1-373|Apobec1|Plcxd2|Sash1|Zfp385b|ncRNA-inter-chr1-292|Ocel1|ncRNA-inter-chr17-14182|Aldh9a1|Oaz1|Stat3|Tpk1|Zkscan1|Fbxl20|Mettl7a1|ncRNA-inter-chr11-9911|P2ry14|Pycrl|Prkd3|ncRNA-as-chr6-5634|Sigmar1|ncRNA-as-chr7-6100|ncRNA-as-chr11-9956|Myo6|Lpp|ncRNA-inter-chr4-3458|Slc16a4|Acsm3|ncRNA-as-chr2-1073|Dmac2|Zfr2|Rbp4|Gpt2|Agmo|ncRNA-inter-chr19-14876|ncRNA-as-chr17-14065|Rsph3b|Nek1|Slc25a20|Aacs|Tap1|Gm11639|Akr1c6|2810459M11Rik|ncRNA-inter-chr19-14746|ncRNA-inter-chr6-5561|Stk16|Dlat|Psmd7|Pibf1|Phlpp1|ncRNA-inter-chr19-15180|Nfx1|Ip6k2|Abi2|Zfp951|Gon4l|Gm12185|Mettl27|Lactb|Chdh|9030624G23Rik|ncRNA-inter-chr4-3352|Gpat3|Ppp3cc|Nr2c2ap|Tlcd1|Morn1|ncRNA-inter-chr5-4052|Catspere2|Zfp646|Adam11|ncRNA-inter-chr17-14128|Spg20|Cenpv|B4galt5|ncRNA-inter-chr3-2128|Ncoa5|BC049762|Zscan26|Apob|Fuca1|Sirpa|Rnps1|Pawr|Vps9d1|Ddx39b|Crebzf|Vwce|ncRNA-as-chr1-252|Rnf4|Cfap54|Snw1|Evi5|Mib2|Pex19|Ak2|Pura|ncRNA-inter-chr4-3707|Yipf5|Ergic2|Plpp3|Ifi35|Rab11b|ncRNA-as-chr5-3947|Ptprg|Tmem106a|Polr1a|Amacr|Prpsap1|ncRNA-inter-chr6-4853|Crtc3|ncRNA-inter-chr3-2134|Dip2c|Gm7298|Saysd1|Deptor|Dpf3|H2-D1|ncRNA-inter-chr19-15138|ncRNA-as-chr13-11149|Apoh|Pdcd4|Mpp1|Apbb2|Slc16a10|Timm23|Wsb1|ncRNA-as-chr15-12821|2310039H08Rik|Phf7|Scamp1|B3gat3|ncRNA-as-chr2-1550|Pan3|Gch1|Hmgcl|Tom1l2|Srsf7|ncRNA-inter-chr1-120|Ttc19|ncRNA-as-chr4-3023|Fam111a|Slc35b3|ncRNA-inter-chr1-840|Pls3|ncRNA-as-chr5-4079|Asic5|ncRNA-inter-chr8-6878|ncRNA-inter-chr12-10462|Serf2|Hibadh|Ndfip1|Trpm3|A230050P20Rik|Zfp799|Akap8l|ncRNA-inter-chr12-10403|Leng8|Mat2a|Lars2|ncRNA-as-chr6-5726|Zfp141|Slc22a23|AI182371|Pqlc1|ncRNA-inter-chr6-5510|Ulk2|ncRNA-as-chr10-9073|ncRNA-inter-chr2-1959|Ppil2|ncRNA-inter-chr12-10973|Herc6|Ocln|Uvrag|ncRNA-inter-chr5-4278"),x = rownames(G172.umis), value = FALSE)
DE3.M2M4.0.1  <- grep(c("Mfsd11|Clock|Dcakd|ncRNA-as-chr18-14332|ncRNA-inter-chr6-5384|Gm765|Atp11b|ncRNA-inter-chr12-10930|Senp5|ncRNA-as-chr6-5266|Palmd|D230025D16Rik|Zc3h15|ncRNA-as-chr5-4281|Tuft1|Cyp4f13|Nmnat3|Ccdc174|Dact2|Gne|mt-Co3|ncRNA-intra-chr19-15016|Dido1|Itpr2|ncRNA-as-chr5-4600|Tkfc|ncRNA-as-chr16-13310|Myo1e|ncRNA-inter-chr1-119|Hnrnpl|Brd1|Aven|Dnah7a|AC149090.1|Fpgs|Ddx50|Hmces|Sec24c|Eci1|Paip2|Thoc1|Mylk|Klhl2|Zc3h6|Dnase2a|Fahd1|Acbd5|Nudcd2|Rmdn1|Wdr82|Myo10|Fbxw9|Slc17a5|Sharpin|Cabin1|Txndc15|AU022252|Srek1|Coq3|ncRNA-inter-chr14-11988|Irf3|Zcchc6|Slc25a13|Mrpl18|Pdia5|Ldlr|Tmed9|Klhdc8b|Rcbtb1|Adap2|B2m|Klhl24|Lbp|ncRNA-as-chr8-7337|ncRNA-as-chr10-8953|Sf3b6|Slc33a1|Lrpprc|Srsf4|Mindy3|Gstp3|Vps37a|Dnajb4|ncRNA-as-chr19-15065|Mast3|Skp1a|Zbtb1|Ndufa10|Psip1|ncRNA-as-chr8-7367|ncRNA-inter-chr11-9923|Btbd1|Slc38a11|Sema6b|ncRNA-inter-chr5-4321|Hsf2|Zmynd8|Luzp1|Pdgfa|ncRNA-inter-chr4-3038|Ube2b|Lamp2|Atl3|Prdx6|Ei24|Cecr2|Zc3h14|Cdc40|Ccdc125|Gspt2|Gpd1|ncRNA-as-chr5-4384|mt-Nd2|Casc3|Ell2|Rpl36|Sh3rf1|Lrrc29|Edf1|ncRNA-as-chr10-8939|A430033K04Rik|Lrig1|Ctsh|ncRNA-as-chr11-10222|Smap1|Ntan1|Clint1|Atxn1|Thap3|Irak4|Ugt3a1|Hnrnph3|Pja1|Btg1|Tgfbr2|Cox11|Tmem29|Brap|Gdap2|Rnf214|F13b|ncRNA-as-chr16-13146|Tpst2|Pik3c2a|ncRNA-inter-chr19-14964|Bcdin3d|Ahnak|Smim4|Commd7|Top2b|ncRNA-inter-chr11-10215|ncRNA-inter-chr13-11374|ncRNA-as-chr16-13153|ncRNA-as-chr8-7096|ncRNA-as-chr4-3820|Kxd1|Mzt1|Tmem143|Eif4ebp2|Mbtd1|Rbm47|Nipsnap3b|ncRNA-as-chr10-9130|ncRNA-inter-chr17-14177|Dhx40|Akap8|Pls1|Srsf11|Pex13|Cldn2|Osbpl1a|Cfap20|Mrpl52|ncRNA-as-chr7-6300|Zfp933|1110059E24Rik|Tab2|Gle1|Yaf2|Kmo|Lcp1|Gnl2|ncRNA-as-chr15-12467|Lsm6|Eps15|ncRNA-inter-chr17-14187|ncRNA-as-chr19-14904|Ighmbp2|ncRNA-as-chr2-1542|Atat1|Mtmr1|ncRNA-as-chr8-7410|Depdc7|Ccs|Scyl2|mt-Co2|Lars|Pts|Rexo1|Tssc4|Usp53|ncRNA-as-chr4-3559|Gfod1|Nars2|ncRNA-inter-chr4-3579|Eif3j1|ncRNA-as-chr1-795|ncRNA-inter-chr8-6981|Pde4a|ncRNA-inter-chr3-2881|Slc39a10|E030030I06Rik|Camk1|Ppp2r1b|Amot|ncRNA-inter-chr17-14010|Cntn5|Ube2h|Fbxo36|Wbp1l|ncRNA-as-chr2-2108|Zbtb44|Hectd2|Mgrn1"),x = rownames(G172.umis), value = FALSE)
All.sex.index <- c(x1,x2,x3,x4,x5)
All.sex.TCPO.index <- c(x1,x2,x3,x4,x5, TCPO1, TCPO2, TCPO3,TCPO4, TCPO5, TCPO6,TCPO6.1, TCPO6.2, TCPO7,TCPO7.1, TCPO7.2, TCPO8,TCPO8.1,TCPO8.2,TCPO9, TCPO10)

DE.G172M1M3.0.1 <- c(DE1.M1M3.0.1,DE2.M1M3.0.1,DE3.M1M3.0.1,DE4.M1M3.0.1,DE5.M1M3.0.1,DE6.M1M3.0.1,DE7.M1M3.0.1,DE8.M1M3.0.1,DE9.M1M3.0.1,DE10.M1M3.0.1)
All.sex.index.batch <- c(x1,x2,x3,x4,x5,DE1.M1M3.0.1,DE2.M1M3.0.1,DE3.M1M3.0.1,DE4.M1M3.0.1,DE5.M1M3.0.1,DE6.M1M3.0.1)
G172.umis.sex <- G172.umis[-All.sex.index, ]
G172.umis.sex.batch <- G172.umis[-All.sex.index.batch, ]


DE.G172M2M4.0.1 <- c(DE1.M2M4.0.1,DE2.M2M4.0.1,DE3.M2M4.0.1)
All.sex.TCPO.index.batch <- c(All.sex.TCPO.index ,DE.G172M2M4.0.1) 
G172.umis.sex.TCPO.batch <- G172.umis[-All.sex.TCPO.index.batch, ]

G172.umis.sex.TCPO <- G172.umis[-All.sex.TCPO.index, ]

# Setup Seurat object
#G172.hashtag <- CreateSeuratObject(counts = G172.umis.sex)

G172.hashtag <- CreateSeuratObject(counts = G172.umis)
G172.hashtag <- AddMetaData(object = G172.hashtag,  metadata = lncRNA, col.name = "nlncRNA") 
#G172.hashtag <- AddMetaData(object = G172.hashtag, meta.data0.5) 

 
G172.hashtag.sex.batch <- CreateSeuratObject(counts = G172.umis.sex.batch)



G172.hashtag.TCPO <- CreateSeuratObject(counts = G172.umis.sex.TCPO)
G172.hashtag.sex.TCPO.batch <- CreateSeuratObject(counts = G172.umis.sex.TCPO.batch)


# Normalize RNA data with log normalization

#G172.hashtag <- AddMetaData(object = G172.hashtag) 
G172.hashtag <- NormalizeData(G172.hashtag)
# Find and scale variable features
G172.hashtag <- FindVariableFeatures(G172.hashtag, selection.method = "vst", nfeatures = 2000)
#G172.hashtag <- FindVariableFeatures(G172.hashtag, selection.method = "mean.var.plot")
G172.hashtag <- ScaleData(G172.hashtag, features = VariableFeatures(G172.hashtag))
G172.hashtag <- RunPCA(G172.hashtag,npcs = 30, features = VariableFeatures(G172.hashtag))
G172.hashtag <- RunUMAP(G172.hashtag, reduction = "pca", dims = 1:30)
G172.hashtag <- FindNeighbors(G172.hashtag, reduction = "pca", dims = 1:30)
G172.hashtag <- FindClusters(G172.hashtag, resolution = 0.25)   
G172.hashtag.p1<- UMAPPlot(G172.hashtag, reduction = "umap", label=TRUE, label.size=5)
G172.hashtag.p1
DefaultAssay(G172.hashtag) <- "RNA"
G172.hashtag <- NormalizeData(G172.hashtag, verbose = TRUE)
d1 <- DotPlot(G172.hashtag, features = All_)+RotatedAxis()
plot_grid(G172.M1.p1,d1)
FeaturePlot(G172.hashtag, features = "Cyp2c55")
FeaturePlot(G172.hashtag, features = "ncRNA-inter-chrX-15394")

# Add HTO data as a new assay independent from RNA
#G172.hashtag[["HTO"]] <- CreateAssayObject(counts = G172.htos)
G172.hashtag[["HTO"]] <- CreateAssayObject(counts = G172.Xist.ChrY)

# Normalize HTO data, here we use centered log-ratio (CLR) transformation
G172.hashtag <- NormalizeData(G172.hashtag, assay = "HTO", normalization.method = "CLR")

# If you have a very large dataset we suggest using k_function = 'clara'. This is a k-medoid
# clustering function for large applications You can also play with additional parameters (see
# documentation for HTODemux()) to adjust the threshold for classification Here we are using the
# default settings
G172.hashtag <- HTODemux(G172.hashtag, assay = "HTO", positive.quantile = 0.99, kfunc = 'clara')
# Global classification results
table(G172.hashtag$HTO_classification.global)
table(G172.hashtag$hash.ID)

# Group cells based on the max HTO signal
Idents(G172.hashtag) <- "hash.ID"
RidgePlot(G172.hashtag, assay = "HTO", features = rownames(G172.hashtag[["HTO"]])[1:4], ncol = 2, nrow=2)
G172.hashtag$HTO_classification <- G172.hashtag$hash.ID
#Idents(G172.hashtag) <- "HTO_classification.global"

G172.hashtag.subset <- G172.hashtag
# First, we will remove negative cells from the object
G172.hashtag.subset <- subset(G172.hashtag, idents =c("Negative","Doublet"), invert = TRUE)

## Feature scatterplot for hastags IDs ########
FeatureScatter(G172.hashtag.subset, feature1 = "M1-ATGATGAACAGCCAG", feature2 = "M2-TGACGCCGTTGTTGT")
FeatureScatter(G172.hashtag.subset, feature1 = "M1-ATGATGAACAGCCAG", feature2 = "M3-GCCTAGTATGATCCA")
FeatureScatter(G172.hashtag.subset, feature1 = "M1-ATGATGAACAGCCAG", feature2 = "M4-AGTCACAGTATTCCA")
FeatureScatter(G172.hashtag.subset, feature1 = "M2-TGACGCCGTTGTTGT", feature2 = "M3-GCCTAGTATGATCCA")
FeatureScatter(G172.hashtag.subset, feature1 = "M2-TGACGCCGTTGTTGT", feature2 = "M4-AGTCACAGTATTCCA")
FeatureScatter(G172.hashtag.subset, feature1 = "M3-GCCTAGTATGATCCA", feature2 = "M4-AGTCACAGTATTCCA")


# Calculate a distance matrix using HTO
hto.dist.mtx <- as.matrix(dist(t(GetAssayData(object = G172.hashtag.subset, assay = "HTO"))))


G172.hashtag.subset <- NormalizeData(G172.hashtag.subset)
# Find and scale variable features
G172.hashtag.subset <- FindVariableFeatures(G172.hashtag.subset, selection.method = "mean.var.plot")
G172.hashtag.subset <- ScaleData(G172.hashtag.subset, features = VariableFeatures(G172.hashtag.subset))
G172.hashtag.subset <- RunPCA(G172.hashtag.subset,npcs = 30, features = VariableFeatures(G172.hashtag.subset))

# Calculate tSNE embeddings with a distance matrix
G172.hashtag.subset <- RunTSNE(G172.hashtag.subset, distance.matrix = hto.dist.mtx, perplexity = 100)
DimPlot(G172.hashtag.subset)
HTOHeatmap(G172.hashtag, assay = "HTO", ncells = 3030)


########################## Rescue doublets ########################
G172.doublet <- subset(G172.hashtag, idents = "Negative")
G172.doublet.rescue <- HTODemux(G172.doublet, assay = "HTO", positive.quantile = 0.99, kfunc = 'clara')
Idents(G172.doublet.rescue) <- "hash.ID"
RidgePlot(G172.doublet.rescue, assay = "HTO", features = rownames(G172.doublet.rescue[["HTO"]])[1:4], ncol = 2, nrow=2)
###############################################################################


# Extract the singlets M1 #############3
G172.M1 <- subset(G172.hashtag.subset, idents = "M1-ATGATGAACAGCCAG", subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M1 <- subset(G172.hashtag.subset, idents = "M1-ATGATGAACAGCCAG")

#G172.M1 <- G172.hashtag
G172.M1$stim  <- "G172M1"
DefaultAssay(G172.M1) <- "RNA"
G172.M1 <- SCTransform(G172.M1,verbose =TRUE)
# Select the top 1000 most variable features
G172.M1 <- NormalizeData(G172.M1, verbose = FALSE)
G172.M1 <- FindVariableFeatures(G172.M1, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M1 <- ScaleData(G172.M1, features = VariableFeatures(G172.M1))
# Run PCA
G172.M1 <- RunPCA(G172.M1,npcs = 30, features = VariableFeatures(G172.M1))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M1 <- RunUMAP(G172.M1, reduction = "pca", dims = 1:25)
G172.M1 <- FindNeighbors(G172.M1, reduction = "pca", dims = 1:25)
G172.M1 <- FindClusters(G172.M1, resolution = 0.5)   
G172.M1.p1<- UMAPPlot(G172.M1, reduction = "umap", label=TRUE, label.size=5)
G172.M1.p1


DefaultAssay(G172.M1) <- "RNA"
G172.M1 <- NormalizeData(G172.M1, verbose = TRUE)
d1 <- DotPlot(G172.M1, features = all_genes)+RotatedAxis()
plot_grid(G172.M1.p1,d1)


 for(i in 0:(length(levels(G172.M1@meta.data$seurat_clusters))-1))
 {
 label <- paste("p", i, sep="") 
 assign(label, subset(G172.M1, idents = i))}
#label1 <- paste("df", i, sep="") 
##paste0("p",i,"@assays$RNA@counts")
# assign(label1,split.default((as.data.frame(eval(parse(text=(paste0((as.name(label)),"@assays$RNA@counts")))))),0:(length(as.data.frame(e val(parse(text=(paste0((as.name(label)),"@assays$RNA@counts")))))-1)%/%5), rowSums))
# 
# colnames(as.name(label1)) <- paste("C",i, colnames(as.name(label1)), sep = "_") }

mydf0 <- sapply(split.default(as.data.frame(p0@assays$RNA@counts), 0:(length(as.data.frame(p0@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf0) <- paste("C0", colnames(mydf0), sep = "_")

mydf1 <- sapply(split.default(as.data.frame(p1@assays$RNA@counts), 0:(length(as.data.frame(p1@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf1) <- paste("C1", colnames(mydf1), sep = "_")

mydf2 <- sapply(split.default(as.data.frame(p2@assays$RNA@counts), 0:(length(as.data.frame(p2@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf2) <- paste("C2", colnames(mydf2), sep = "_")

mydf3 <- sapply(split.default(as.data.frame(p3@assays$RNA@counts), 0:(length(as.data.frame(p3@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf3) <- paste("C3", colnames(mydf3), sep = "_")

mydf4 <- sapply(split.default(as.data.frame(p4@assays$RNA@counts), 0:(length(as.data.frame(p4@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf4) <- paste("C4", colnames(mydf4), sep = "_")

mydf5 <- sapply(split.default(as.data.frame(p5@assays$RNA@counts), 0:(length(as.data.frame(p5@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf5) <- paste("C5", colnames(mydf5), sep = "_")

mydf6 <- sapply(split.default(as.data.frame(p6@assays$RNA@counts), 0:(length(as.data.frame(p6@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf6) <- paste("C6", colnames(mydf6), sep = "_")

mydf7 <- sapply(split.default(as.data.frame(p7@assays$RNA@counts), 0:(length(as.data.frame(p7@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf7) <- paste("C7", colnames(mydf7), sep = "_")

mydf8 <- sapply(split.default(as.data.frame(p8@assays$RNA@counts), 0:(length(as.data.frame(p8@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf8) <- paste("C8", colnames(mydf8), sep = "_")

mydf9 <- sapply(split.default(as.data.frame(p9@assays$RNA@counts), 0:(length(as.data.frame(p9@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(mydf9) <- paste("C9", colnames(mydf9), sep = "_")

merge_df <- cbind(mydf0,mydf1,mydf2,mydf3,mydf4,mydf5,mydf6,mydf7,mydf8,mydf9)


G172.M1.merge <- CreateSeuratObject(counts = merge_df)
DefaultAssay(G172.M1) <- "RNA"
G172.M1.merge <- SCTransform(G172.M1.merge,verbose =TRUE)
# Select the top 1000 most variable features
G172.M1.merge <- NormalizeData(G172.M1.merge, verbose = FALSE)
G172.M1.merge <- FindVariableFeatures(G172.M1.merge, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M1.merge <- ScaleData(G172.M1.merge, features = VariableFeatures(G172.M1.merge))
# Run PCA
G172.M1.merge <- RunPCA(G172.M1.merge,npcs = 30, features = VariableFeatures(G172.M1.merge))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M1.merge <- RunUMAP(G172.M1.merge, reduction = "pca", dims = 1:25)
G172.M1.merge <- FindNeighbors(G172.M1.merge, reduction = "pca", dims = 1:25)
G172.M1.merge <- FindClusters(G172.M1.merge, resolution = 0.5 )   
G172.M1.p1.merge<- UMAPPlot(G172.M1.merge, reduction = "umap", label=TRUE, label.size=5)
G172.M1.p1.merge


DefaultAssay(G172.M1.merge) <- "RNA"
G172.M1.merge <- NormalizeData(G172.M1.merge, verbose = TRUE)
d1 <- DotPlot(G172.M1.merge, features = all_genes, cols=c('white','blue'))+RotatedAxis()
plot_grid(G172.M1.p1.merge,d1)

################################## Extract the singlet for M2 ################################################
G172.M2 <- subset(G172.hashtag, idents = "M2-TGACGCCGTTGTTGT", subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M2$stim  <- "G172M2"
DefaultAssay(G172.M2) <- "RNA"
G172.M2 <- SCTransform(G172.M2,verbose =TRUE)
# Select the top 1000 most variable features
G172.M2 <- NormalizeData(G172.M2, verbose = FALSE)
G172.M2 <- FindVariableFeatures(G172.M2, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M2 <- ScaleData(G172.M2, features = VariableFeatures(G172.M2))
# Run PCA
G172.M2 <- RunPCA(G172.M2,npcs = 30, features = VariableFeatures(G172.M2))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M2 <- RunUMAP(G172.M2, reduction = "pca", dims = 1:25)
G172.M2 <- FindNeighbors(G172.M2, reduction = "pca", dims = 1:25)
G172.M2 <- FindClusters(G172.M2, resolution = 0.5 )   
G172.M2.p1<- UMAPPlot(G172.M2, reduction = "umap", label=TRUE, label.size=5)
G172.M2.p1
DefaultAssay(G172.M2) <- "RNA"
G172.M2 <- NormalizeData(G172.M2, verbose = TRUE)
d2 <- DotPlot(G172.M2, features = all_genes)+RotatedAxis()
plot_grid(G172.M2.p1,d2)

for(i in 0:(length(levels(G172.M2@meta.data$seurat_clusters))-1))
 {
 label <- paste("q", i, sep="") 
 assign(label, subset(G172.M2, idents = i))}
# label1 <- paste("df", i, sep="") 
#
dfq0 <- sapply(split.default(as.data.frame(q0@assays$RNA@counts), 0:(length(as.data.frame(q0@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq0) <- paste("Q0", colnames(dfq0), sep = "_")

dfq1 <- sapply(split.default(as.data.frame(q1@assays$RNA@counts), 0:(length(as.data.frame(q1@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq1) <- paste("Q1", colnames(dfq1), sep = "_")

dfq2 <- sapply(split.default(as.data.frame(q2@assays$RNA@counts), 0:(length(as.data.frame(q2@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq2) <- paste("Q2", colnames(dfq2), sep = "_")

dfq3 <- sapply(split.default(as.data.frame(q3@assays$RNA@counts), 0:(length(as.data.frame(q3@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq3) <- paste("Q3", colnames(dfq3), sep = "_")

dfq4 <- sapply(split.default(as.data.frame(q4@assays$RNA@counts), 0:(length(as.data.frame(q4@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq4) <- paste("Q4", colnames(dfq4), sep = "_")

dfq5 <- sapply(split.default(as.data.frame(q5@assays$RNA@counts), 0:(length(as.data.frame(q5@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq5) <- paste("Q5", colnames(dfq5), sep = "_")

dfq6 <- sapply(split.default(as.data.frame(q6@assays$RNA@counts), 0:(length(as.data.frame(q6@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq6) <- paste("Q6", colnames(dfq6), sep = "_")

dfq7 <- sapply(split.default(as.data.frame(q7@assays$RNA@counts), 0:(length(as.data.frame(q7@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq7) <- paste("Q7", colnames(dfq7), sep = "_")

dfq8 <- sapply(split.default(as.data.frame(q8@assays$RNA@counts), 0:(length(as.data.frame(q8@assays$RNA@counts))-1) %/% 5), rowSums)
colnames(dfq8) <- paste("C8", colnames(dfq8), sep = "_")


merge_df2 <- cbind(dfq0,dfq1,dfq2,dfq3,dfq4,dfq5,dfq6,dfq7,dfq8)
G172.M2.merge <- CreateSeuratObject(counts = merge_df2)
DefaultAssay(G172.M2) <- "RNA"
G172.M2.merge <- SCTransform(G172.M2.merge,verbose =TRUE)
# Select the top 1000 most variable features
G172.M2.merge <- NormalizeData(G172.M2.merge, verbose = FALSE)
G172.M2.merge <- FindVariableFeatures(G172.M2.merge, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M2.merge <- ScaleData(G172.M2.merge, features = VariableFeatures(G172.M2.merge))
# Run PCA
G172.M2.merge <- RunPCA(G172.M2.merge,npcs = 30, features = VariableFeatures(G172.M2.merge))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M2.merge <- RunUMAP(G172.M2.merge, reduction = "pca", dims = 1:25)
G172.M2.merge <- FindNeighbors(G172.M2.merge, reduction = "pca", dims = 1:25)
G172.M2.merge <- FindClusters(G172.M2.merge, resolution = 0.5 )   
G172.M2.p1.merge<- UMAPPlot(G172.M2.merge, reduction = "umap", label=TRUE, label.size=5)
G172.M2.p1.merge

DefaultAssay(G172.M2.merge) <- "RNA"
G172.M2.merge <- NormalizeData(G172.M2.merge, verbose = TRUE)
d1 <- DotPlot(G172.M2.merge, features = all_genes, cols=c('white','blue'))+RotatedAxis()
plot_grid(G172.M2.p1.merge,d1)

#######################################################################################


############################# Extract the singlet for M3 ##############################

G172.M3 <- subset(G172.hashtag, idents = "M3-GCCTAGTATGATCCA", subset = nFeature_RNA > 500 & nCount_RNA > 1000)
DefaultAssay(G172.M3) <- "RNA"
G172.M3 <- SCTransform(G172.M3,verbose =TRUE)
# Select the top 1000 most variable features
G172.M3 <- NormalizeData(G172.M3, verbose = FALSE)
G172.M3 <- FindVariableFeatures(G172.M3, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M3 <- ScaleData(G172.M3, features = VariableFeatures(G172.M3))
# Run PCA
G172.M3 <- RunPCA(G172.M3,npcs = 30, features = VariableFeatures(G172.M3))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M3 <- RunUMAP(G172.M3, reduction = "pca", dims = 1:25)
G172.M3 <- FindNeighbors(G172.M3, reduction = "pca", dims = 1:25)
G172.M3 <- FindClusters(G172.M3, resolution = 0.5 )   
G172.M3.p1<- UMAPPlot(G172.M3, reduction = "umap", label=TRUE, label.size=5)
G172.M3.p1
DefaultAssay(G172.M3) <- "RNA"
G172.M3 <- NormalizeData(G172.M3, verbose = TRUE)
d3 <- DotPlot(G172.M3, features = all_genes)+RotatedAxis()
plot_grid(G172.M3.p1,d3)




##### Extract the singlet for M4 #####
G172.M4 <- subset(G172.hashtag, idents = "M4-AGTCACAGTATTCCA", subset = nFeature_RNA > 500 & nCount_RNA > 1000)
DefaultAssay(G172.M4) <- "RNA"
G172.M4 <- SCTransform(G172.M4,verbose =TRUE)
# Select the top 1000 most variable features
G172.M4 <- NormalizeData(G172.M4, verbose = FALSE)
G172.M4 <- FindVariableFeatures(G172.M4, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M4 <- ScaleData(G172.M4, features = VariableFeatures(G172.M4))
# Run PCA
G172.M4 <- RunPCA(G172.M4,npcs = 30, features = VariableFeatures(G172.M4))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M4 <- RunUMAP(G172.M4, reduction = "pca", dims = 1:25)
G172.M4 <- FindNeighbors(G172.M4, reduction = "pca", dims = 1:25)
G172.M4 <- FindClusters(G172.M4, resolution = 0.5 )   
G172.M4.p1<- UMAPPlot(G172.M4, reduction = "umap", label=TRUE, label.size=5)
G172.M4.p1
DefaultAssay(G172.M4) <- "RNA"
G172.M4 <- NormalizeData(G172.M4, verbose = TRUE)
d4 <- DotPlot(G172.M4, features = all_genes)+RotatedAxis()
plot_grid(G172.M4.p1,d4)


############## Combined ####################33
G172.M5 <- subset(G172.hashtag, idents = c("M1-ATGATGAACAGCCAG","M2-TGACGCCGTTGTTGT","M3-GCCTAGTATGATCCA","M4-AGTCACAGTATTCCA"), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
DefaultAssay(G172.M5) <- "RNA"
G172.M5 <- SCTransform(G172.M5,verbose =TRUE)
# Select the top 1000 most variable features
G172.M5 <- NormalizeData(G172.M5, verbose = FALSE)
G172.M5 <- FindVariableFeatures(G172.M5, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M5 <- ScaleData(G172.M5, features = VariableFeatures(G172.M5))
# Run PCA
G172.M5 <- RunPCA(G172.M5,npcs = 30, features = VariableFeatures(G172.M5))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M5 <- RunUMAP(G172.M5, reduction = "pca", dims = 1:25)
G172.M5 <- FindNeighbors(G172.M5, reduction = "pca", dims = 1:25)
G172.M5 <- FindClusters(G172.M5, resolution = 0.5 )   
G172.M5.p1<- UMAPPlot(G172.M5, reduction = "umap", label=TRUE, label.size=5)
G172.M5.p1
DefaultAssay(G172.M5) <- "RNA"
G172.M5 <- NormalizeData(G172.M5, verbose = TRUE)
d5 <- DotPlot(G172.M5, features = c(all_genes,'Cyp2b10','Cyp2d9'))+RotatedAxis()
plot_grid(G172.M5.p1,d5)


### control 
G172.M6 <- subset(G172.hashtag.subset, idents = c("M1-ATGATGAACAGCCAG","M3-GCCTAGTATGATCCA"), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
DefaultAssay(G172.M6) <- "RNA"
#G172.M6 <- SCTransform(G172.M6,verbose =TRUE)
# Select the top 1000 most variable features
G172.M6 <- NormalizeData(G172.M6, verbose = FALSE)
G172.M6 <- FindVariableFeatures(G172.M6, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M6 <- ScaleData(G172.M6, features = VariableFeatures(G172.M6))
# Run PCA
G172.M6 <- RunPCA(G172.M6,npcs = 30, features = VariableFeatures(G172.M6))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M6 <- RunUMAP(G172.M6, reduction = "pca", dims = 1:25)
G172.M6 <- FindNeighbors(G172.M6, reduction = "pca", dims = 1:25)
G172.M6 <- FindClusters(G172.M6, resolution = 0.5 )   
G172.M6.p1<- UMAPPlot(G172.M6, reduction = "umap", label=TRUE, label.size=5)
G172.M6.p1
DefaultAssay(G172.M6) <- "RNA"
G172.M6 <- NormalizeData(G172.M6, verbose = TRUE)
d6 <- DotPlot(G172.M6, features = c(all_genes,'Cyp2b10','Cyp2d9'))+RotatedAxis()
plot_grid(G172.M6.p1,d6)


#### TCPO 
G172.M7 <- subset(G172.hashtag, idents = c("M2-TGACGCCGTTGTTGT","M4-AGTCACAGTATTCCA"), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
DefaultAssay(G172.M7) <- "RNA"
G172.M7 <- SCTransform(G172.M7,verbose =TRUE)
# Select the top 1000 most variable features
G172.M7 <- NormalizeData(G172.M7, verbose = FALSE)
G172.M7 <- FindVariableFeatures(G172.M7, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M7 <- ScaleData(G172.M7, features = VariableFeatures(G172.M7))
# Run PCA
G172.M7 <- RunPCA(G172.M7,npcs = 30, features = VariableFeatures(G172.M7))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M7 <- RunUMAP(G172.M7, reduction = "pca", dims = 1:25)
G172.M7 <- FindNeighbors(G172.M7, reduction = "pca", dims = 1:25)
G172.M7 <- FindClusters(G172.M7, resolution = 0.5 )   
G172.M7.p1<- UMAPPlot(G172.M7, reduction = "umap", label=TRUE, label.size=5)
G172.M7.p1
DefaultAssay(G172.M7) <- "RNA"
G172.M7 <- NormalizeData(G172.M7, verbose = TRUE)
d7 <- DotPlot(G172.M7, features = c(all_genes,'Cyp2b10','Cyp2d9'))+RotatedAxis()
plot_grid(G172.M7.p1,d7, nrow=2)

G172 classified cells already labelled by demuxEM or HTOdemux (Seurat) to calculate TPM


G172.M1.both <- subset(G172.hashtag,  cells= joint.bcs.M1.both)
G172.M2.both <- subset(G172.hashtag,  cells= joint.bcs.M2.both)
G172.M3.both <- subset(G172.hashtag,  cells= joint.bcs.M3.both)
G172.M4.both <- subset(G172.hashtag,  cells= joint.bcs.M4.both)

G172.M1.demuxEM <- subset(G172.hashtag,  cells= joint.bcs.M1.demuxEM)
G172.M2.demuxEM <- subset(G172.hashtag,  cells= joint.bcs.M2.demuxEM)
G172.M3.demuxEM <- subset(G172.hashtag,  cells= joint.bcs.M4.demuxEM)
G172.M4.demuxEM <- subset(G172.hashtag,  cells= joint.bcs.M4.demuxEM)


G172.M1.HTOdemux <- subset(G172.hashtag,  cells= joint.bcs.M1.HTOdemux)
G172.M2.HTOdemux <- subset(G172.hashtag,  cells= joint.bcs.M2.HTOdemux)
G172.M3.HTOdemux <- subset(G172.hashtag,  cells= joint.bcs.M3.HTOdemux)
G172.M4.HTOdemux <- subset(G172.hashtag,  cells= joint.bcs.M4.HTOdemux)


G172.M1.both  <- NormalizeData(G172.M1.both,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M2.both  <- NormalizeData(G172.M2.both,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M3.both  <- NormalizeData(G172.M3.both,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M4.both  <- NormalizeData(G172.M4.both,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)

G172.M1.both.avg  <- rowMeans(as.matrix(G172.M1.both@assays$RNA@data))
G172.M2.both.avg  <- rowMeans(as.matrix(G172.M2.both@assays$RNA@data))
G172.M3.both.avg  <- rowMeans(as.matrix(G172.M3.both@assays$RNA@data))
G172.M4.both.avg  <- rowMeans(as.matrix(G172.M4.both@assays$RNA@data))


G172.M1.demuxEM  <- NormalizeData(G172.M1.demuxEM,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M2.demuxEM  <- NormalizeData(G172.M2.demuxEM,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M3.demuxEM  <- NormalizeData(G172.M3.demuxEM,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M4.demuxEM  <- NormalizeData(G172.M4.demuxEM,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)

G172.M1.demuxEM.avg  <- rowMeans(as.matrix(G172.M1.demuxEM@assays$RNA@data))
G172.M2.demuxEM.avg  <- rowMeans(as.matrix(G172.M2.demuxEM@assays$RNA@data))
G172.M3.demuxEM.avg  <- rowMeans(as.matrix(G172.M3.demuxEM@assays$RNA@data))
G172.M4.demuxEM.avg  <- rowMeans(as.matrix(G172.M4.demuxEM@assays$RNA@data))


G172.M1.HTOdemux  <- NormalizeData(G172.M1.HTOdemux,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M2.HTOdemux  <- NormalizeData(G172.M2.HTOdemux,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M3.HTOdemux  <- NormalizeData(G172.M3.HTOdemux,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M4.HTOdemux  <- NormalizeData(G172.M4.HTOdemux,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)

G172.M1.HTOdemux.avg  <- rowMeans(as.matrix(G172.M1.HTOdemux@assays$RNA@data))
G172.M2.HTOdemux.avg  <- rowMeans(as.matrix(G172.M2.HTOdemux@assays$RNA@data))
G172.M3.HTOdemux.avg  <- rowMeans(as.matrix(G172.M3.HTOdemux@assays$RNA@data))
G172.M4.HTOdemux.avg  <- rowMeans(as.matrix(G172.M4.HTOdemux@assays$RNA@data))

G172.M1.Top <- subset(G172.hashtag,  cells= joint.bcs.M1.top)
G172.M2.Top <- subset(G172.hashtag,  cells= joint.bcs.M2.top)

G172.M1.Top  <- NormalizeData(G172.M1.Top,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M2.Top  <- NormalizeData(G172.M2.Top,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)

G172.M1.bottom <- subset(G172.hashtag,  cells= joint.bcs.M1.bottom)
G172.M2.bottom <- subset(G172.hashtag,  cells= joint.bcs.M2.bottom)

G172.M1.bottom  <- NormalizeData(G172.M1.bottom,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)
G172.M2.bottom  <- NormalizeData(G172.M2.bottom,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)

G172_TPM_M1_Top <- cbind(as.matrix(G172.M1.Top@assays$RNA@counts)) 
G172_TPM_M2_Top <- cbind(as.matrix(G172.M2.Top@assays$RNA@counts)) 
G172_TPM_M1_bottom <- cbind(as.matrix(G172.M1.bottom@assays$RNA@counts)) 
G172_TPM_M2_bottom <- cbind(as.matrix(G172.M2.bottom@assays$RNA@counts)) 


G172_counts_M1_Top <- cbind(as.matrix(G172.M1.Top@assays$RNA@counts)) 
G172_counts_M2_Top <- cbind(as.matrix(G172.M2.Top@assays$RNA@counts)) 
G172_counts_M1_bottom <- cbind(as.matrix(G172.M1.bottom@assays$RNA@counts)) 
G172_counts_M2_bottom <- cbind(as.matrix(G172.M2.bottom@assays$RNA@counts)) 

write.table(G172_TPM_M1_Top, "demuxEM_HTodemux_analysis/G172_TPM_M1_Top")
write.table(G172_TPM_M2_Top, "demuxEM_HTodemux_analysis/G172_TPM_M2_Top")
write.table(G172_TPM_M1_bottom, "demuxEM_HTodemux_analysis/G172_TPM_M1_bottom")
write.table(G172_TPM_M2_bottom, "demuxEM_HTodemux_analysis/G172_TPM_M2_bottom")


write.table(G172_counts_M1_Top, "demuxEM_HTodemux_analysis/G172_counts_M1_Top")
write.table(G172_counts_M2_Top, "demuxEM_HTodemux_analysis/G172_counts_M2_Top")
write.table(G172_counts_M1_bottom, "demuxEM_HTodemux_analysis/G172_counts_M1_bottom")
write.table(G172_counts_M2_bottom, "demuxEM_HTodemux_analysis/G172_counts_M2_bottom")


combined_avg_prelabelled <- cbind(G172.M1.both.avg, G172.M2.both.avg,G172.M3.both.avg,G172.M4.both.avg, G172.M1.demuxEM.avg,G172.M2.demuxEM.avg, G172.M3.demuxEM.avg, G172.M4.demuxEM.avg, G172.M1.HTOdemux.avg, G172.M2.HTOdemux.avg, G172.M3.HTOdemux.avg, G172.M4.HTOdemux.avg) 

write.table(combined_avg_prelabelled, "demuxEM_HTodemux_analysis/combined_avgTPM_prelabelled")

combined_M1_M2 <- cbind(as.matrix(G172.M1.both@assays$RNA@data), as.matrix(G172.M1.both@assays$RNA@data)) 

G172.M1.both <- subset(G172.hashtag, cells= joint.bcs.M1.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
#G172.M1.both <- subset(G172.hashtag.sex.batch, cells= joint.bcs.M1.both)
#G172.M1.both <- subset(G172.hashtag, cells= joint.bcs.M1.both)
G172.M1.both$stim  <- "G172M1_both"
DefaultAssay(G172.M1.both) <- "RNA"
G172.M1.both <- SCTransform(G172.M1.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M1.both <- NormalizeData(G172.M1.both, verbose = FALSE)
G172.M1.both <- FindVariableFeatures(G172.M1.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M1.both <- ScaleData(G172.M1.both, features = VariableFeatures(G172.M1.both))
# Run PCA
G172.M1.both <- RunPCA(G172.M1.both,npcs = 30, features = VariableFeatures(G172.M1.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M1.both <- RunUMAP(G172.M1.both, reduction = "pca", dims = 1:30)
G172.M1.both <- FindNeighbors(G172.M1.both, reduction = "pca", dims = 1:30)
G172.M1.both <- FindClusters(G172.M1.both, resolution = 0.25)   
G172.M1.both.p1<- UMAPPlot(G172.M1.both, reduction = "umap", label=TRUE, label.size=5)
G172.M1.both.p1
DefaultAssay(G172.M1.both) <- "RNA"
G172.M1.both <- NormalizeData(G172.M1.both, verbose = TRUE)
d2 <- DotPlot(G172.M1.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M1.both.p1,d2)

################### clean hepatocytes ##################

G172.M1.clean.both <- subset(G172.hashtag, cells= joint.bcs.M1.clean.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M1.clean.both$stim  <- "G172M1_clean_both"
DefaultAssay(G172.M1.clean.both) <- "RNA"
G172.M1.clean.both <- SCTransform(G172.M1.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M1.clean.both <- NormalizeData(G172.M1.clean.both, verbose = FALSE)
G172.M1.clean.both <- FindVariableFeatures(G172.M1.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M1.clean.both <- ScaleData(G172.M1.clean.both, features = VariableFeatures(G172.M1.clean.both))
# Run PCA
G172.M1.clean.both <- RunPCA(G172.M1.clean.both,npcs = 30, features = VariableFeatures(G172.M1.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M1.clean.both <- RunUMAP(G172.M1.clean.both, reduction = "pca", dims = 1:30)
G172.M1.clean.both <- FindNeighbors(G172.M1.clean.both, reduction = "pca", dims = 1:30)
G172.M1.clean.both <- FindClusters(G172.M1.clean.both, resolution = 0.5 )   
G172.M1.clean.both.p1<- UMAPPlot(G172.M1.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M1.clean.both.p1
DefaultAssay(G172.M1.clean.both) <- "RNA"
G172.M1.clean.both <- NormalizeData(G172.M1.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M1.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M1.clean.both.p1,d2)

################ both top80 M1
G172.M1.both.top80 <- subset(G172.hashtag, cells= joint.bcs.M1.both.top80, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M1.both.top80$stim  <- "G172M1_both_top80"
DefaultAssay(G172.M1.both.top80) <- "RNA"
G172.M1.both.top80 <- SCTransform(G172.M1.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M1.both.top80 <- NormalizeData(G172.M1.both.top80, verbose = FALSE)
G172.M1.both.top80 <- FindVariableFeatures(G172.M1.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M1.both.top80 <- ScaleData(G172.M1.both.top80, features = VariableFeatures(G172.M1.both.top80))
# Run PCA
G172.M1.both.top80 <- RunPCA(G172.M1.both.top80,npcs = 30, features = VariableFeatures(G172.M1.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M1.both.top80 <- RunUMAP(G172.M1.both.top80, reduction = "pca", dims = 1:25)
G172.M1.both.top80 <- FindNeighbors(G172.M1.both.top80, reduction = "pca", dims = 1:25)
G172.M1.both.top80 <- FindClusters(G172.M1.both.top80, resolution = 0.25 )   
G172.M1.both.top80.p1<- UMAPPlot(G172.M1.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M1.both.top80.p1
DefaultAssay(G172.M1.both.top80) <- "RNA"
G172.M1.both.top80 <- NormalizeData(G172.M1.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M1.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M1.both.top80.p1,d2)



############################################## G172 M2 both ######################

#G172.M2.both <- subset(G172.hashtag, cells= joint.bcs.M2.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M2.both <- subset(G172.hashtag, cells= joint.bcs.M2.both)
#G172.M2.both <- subset(G172.hashtag.TCPO, cells= joint.bcs.M2.both)
#G172.M2.both <- subset(G172.hashtag.sex.TCPO.batch, cells= joint.bcs.M2.both)
G172.M2.both$stim  <- "G172M2_both"
DefaultAssay(G172.M2.both) <- "RNA"
G172.M2.both <- SCTransform(G172.M2.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M2.both <- NormalizeData(G172.M2.both, verbose = FALSE)
G172.M2.both <- FindVariableFeatures(G172.M2.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M2.both <- ScaleData(G172.M2.both, features = VariableFeatures(G172.M2.both))
# Run PCA
G172.M2.both <- RunPCA(G172.M2.both,npcs = 30, features = VariableFeatures(G172.M2.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M2.both <- RunUMAP(G172.M2.both, reduction = "pca", dims = 1:20)
G172.M2.both <- FindNeighbors(G172.M2.both, reduction = "pca", dims = 1:20)
G172.M2.both <- FindClusters(G172.M2.both, resolution = 0.35)   
G172.M2.both.p1<- UMAPPlot(G172.M2.both, reduction = "umap", label=TRUE, label.size=5)
G172.M2.both.p1
DefaultAssay(G172.M2.both) <- "RNA"
G172.M2.both <- NormalizeData(G172.M2.both, verbose = TRUE)
d2 <- DotPlot(G172.M2.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M2.both.p1,d2)

############# clean M2 ########################
G172.M2.clean.both <- subset(G172.hashtag, cells= joint.bcs.M2.clean.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M2.clean.both$stim  <- "G172M2_both"
DefaultAssay(G172.M2.clean.both) <- "RNA"
G172.M2.clean.both <- SCTransform(G172.M2.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M2.clean.both <- NormalizeData(G172.M2.clean.both, verbose = FALSE)
G172.M2.clean.both <- FindVariableFeatures(G172.M2.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M2.clean.both <- ScaleData(G172.M2.clean.both, features = VariableFeatures(G172.M2.clean.both))
# Run PCA
G172.M2.clean.both <- RunPCA(G172.M2.clean.both,npcs = 30, features = VariableFeatures(G172.M2.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M2.clean.both <- RunUMAP(G172.M2.clean.both, reduction = "pca", dims = 1:30)
G172.M2.clean.both <- FindNeighbors(G172.M2.clean.both, reduction = "pca", dims = 1:30)
G172.M2.clean.both <- FindClusters(G172.M2.clean.both, resolution = 0.35)   
G172.M2.clean.both.p1<- UMAPPlot(G172.M2.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M2.clean.both.p1
DefaultAssay(G172.M2.clean.both) <- "RNA"
G172.M2.clean.both <- NormalizeData(G172.M2.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M2.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M2.clean.both.p1,d2)

################# both top 80 M2 ################
G172.M2.both.top80 <- subset(G172.hashtag, cells= joint.bcs.M2.both.top80, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M2.both.top80$stim  <- "G172M2_both"
DefaultAssay(G172.M2.both.top80) <- "RNA"
G172.M2.both.top80 <- SCTransform(G172.M2.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M2.both.top80 <- NormalizeData(G172.M2.both.top80, verbose = FALSE)
G172.M2.both.top80 <- FindVariableFeatures(G172.M2.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M2.both.top80 <- ScaleData(G172.M2.both.top80, features = VariableFeatures(G172.M2.both.top80))
# Run PCA
G172.M2.both.top80 <- RunPCA(G172.M2.both.top80,npcs = 30, features = VariableFeatures(G172.M2.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M2.both.top80 <- RunUMAP(G172.M2.both.top80, reduction = "pca", dims = 1:30)
G172.M2.both.top80 <- FindNeighbors(G172.M2.both.top80, reduction = "pca", dims = 1:30)
G172.M2.both.top80 <- FindClusters(G172.M2.both.top80, resolution = 0.35)   
G172.M2.both.top80.p1<- UMAPPlot(G172.M2.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M2.both.top80.p1
DefaultAssay(G172.M2.both.top80) <- "RNA"
G172.M2.both.top80 <- NormalizeData(G172.M2.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M2.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M2.both.top80.p1,d2)


############# both M3 #############
G172.M3.both <- subset(G172.hashtag, cells= joint.bcs.M3.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
#G172.M3.both <- subset(G172.hashtag.sex.batch, cells= joint.bcs.M3.both)
G172.M3.both <- subset(G172.hashtag, cells= joint.bcs.M3.both)
G172.M3.both$stim  <- "G172M3_both"
DefaultAssay(G172.M3.both) <- "RNA"
G172.M3.both <- SCTransform(G172.M3.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M3.both <- NormalizeData(G172.M3.both, verbose = FALSE)
G172.M3.both <- FindVariableFeatures(G172.M3.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M3.both <- ScaleData(G172.M3.both, features = VariableFeatures(G172.M3.both))
# Run PCA
G172.M3.both <- RunPCA(G172.M3.both,npcs = 30, features = VariableFeatures(G172.M3.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M3.both <- RunUMAP(G172.M3.both, reduction = "pca", dims = 1:30)
G172.M3.both <- FindNeighbors(G172.M3.both, reduction = "pca", dims = 1:30)
G172.M3.both <- FindClusters(G172.M3.both, resolution = 0.35)   
G172.M3.both.p1<- UMAPPlot(G172.M3.both, reduction = "umap", label=TRUE, label.size=5)
G172.M3.both.p1
DefaultAssay(G172.M3.both) <- "RNA"
G172.M3.both <- NormalizeData(G172.M3.both, verbose = TRUE)
d2 <- DotPlot(G172.M3.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M3.both.p1,d2)

################### clean M3 ##########################
G172.M3.clean.both <- subset(G172.hashtag, cells= joint.bcs.M3.clean.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M3.clean.both$stim  <- "G172M3_both"
DefaultAssay(G172.M3.clean.both) <- "RNA"
G172.M3.clean.both <- SCTransform(G172.M3.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M3.clean.both <- NormalizeData(G172.M3.clean.both, verbose = FALSE)
G172.M3.clean.both <- FindVariableFeatures(G172.M3.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M3.clean.both <- ScaleData(G172.M3.clean.both, features = VariableFeatures(G172.M3.clean.both))
# Run PCA
G172.M3.clean.both <- RunPCA(G172.M3.clean.both,npcs = 30, features = VariableFeatures(G172.M3.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M3.clean.both <- RunUMAP(G172.M3.clean.both, reduction = "pca", dims = 1:30)
G172.M3.clean.both <- FindNeighbors(G172.M3.clean.both, reduction = "pca", dims = 1:30)
G172.M3.clean.both <- FindClusters(G172.M3.clean.both, resolution = 0.4)   
G172.M3.clean.both.p1<- UMAPPlot(G172.M3.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M3.clean.both.p1
DefaultAssay(G172.M3.clean.both) <- "RNA"
G172.M3.clean.both <- NormalizeData(G172.M3.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M3.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M3.clean.both.p1,d2)

######################## both top80 M3 #################3
G172.M3.both.top80 <- subset(G172.hashtag, cells= joint.bcs.M3.both.top80, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M3.both.top80$stim  <- "G172M3_both"
DefaultAssay(G172.M3.both.top80) <- "RNA"
G172.M3.both.top80 <- SCTransform(G172.M3.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M3.both.top80 <- NormalizeData(G172.M3.both.top80, verbose = FALSE)
G172.M3.both.top80 <- FindVariableFeatures(G172.M3.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M3.both.top80 <- ScaleData(G172.M3.both.top80, features = VariableFeatures(G172.M3.both.top80))
# Run PCA
G172.M3.both.top80 <- RunPCA(G172.M3.both.top80,npcs = 30, features = VariableFeatures(G172.M3.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M3.both.top80 <- RunUMAP(G172.M3.both.top80, reduction = "pca", dims = 1:30)
G172.M3.both.top80 <- FindNeighbors(G172.M3.both.top80, reduction = "pca", dims = 1:30)
G172.M3.both.top80 <- FindClusters(G172.M3.both.top80, resolution = 0.4)   
G172.M3.both.top80.p1<- UMAPPlot(G172.M3.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M3.both.top80.p1
DefaultAssay(G172.M3.both.top80) <- "RNA"
G172.M3.both.top80 <- NormalizeData(G172.M3.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M3.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M3.both.top80.p1,d2)


############################
#G172.M4.both <- subset(G172.hashtag, cells= joint.bcs.M4.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
#G172.M4.both <- subset(G172.hashtag.TCPO, cells= joint.bcs.M4.both)
G172.M4.both <- subset(G172.hashtag.sex.TCPO.batch, cells= joint.bcs.M4.both)
G172.M4.both$stim  <- "G172M4_both"
DefaultAssay(G172.M4.both) <- "RNA"
G172.M4.both <- SCTransform(G172.M4.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M4.both <- NormalizeData(G172.M4.both, verbose = FALSE)
G172.M4.both <- FindVariableFeatures(G172.M4.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M4.both <- ScaleData(G172.M4.both, features = VariableFeatures(G172.M4.both))
# Run PCA
G172.M4.both <- RunPCA(G172.M4.both,npcs = 30, features = VariableFeatures(G172.M4.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M4.both <- RunUMAP(G172.M4.both, reduction = "pca", dims = 1:25)
G172.M4.both <- FindNeighbors(G172.M4.both, reduction = "pca", dims = 1:25)
G172.M4.both <- FindClusters(G172.M4.both, resolution = 0.35)   
G172.M4.both.p1<- UMAPPlot(G172.M4.both, reduction = "umap", label=TRUE, label.size=5)
G172.M4.both.p1
DefaultAssay(G172.M4.both) <- "RNA"
G172.M4.both <- NormalizeData(G172.M4.both, verbose = TRUE)
d2 <- DotPlot(G172.M4.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M4.both.p1,d2)


################################ clean M4 ##############
G172.M4.clean.both <- subset(G172.hashtag, cells= joint.bcs.M4.clean.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M4.clean.both$stim  <- "G172M4_both"
DefaultAssay(G172.M4.clean.both) <- "RNA"
G172.M4.clean.both <- SCTransform(G172.M4.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M4.clean.both <- NormalizeData(G172.M4.clean.both, verbose = FALSE)
G172.M4.clean.both <- FindVariableFeatures(G172.M4.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M4.clean.both <- ScaleData(G172.M4.clean.both, features = VariableFeatures(G172.M4.clean.both))
# Run PCA
G172.M4.clean.both <- RunPCA(G172.M4.clean.both,npcs = 30, features = VariableFeatures(G172.M4.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M4.clean.both <- RunUMAP(G172.M4.clean.both, reduction = "pca", dims = 1:30)
G172.M4.clean.both <- FindNeighbors(G172.M4.clean.both, reduction = "pca", dims = 1:30)
G172.M4.clean.both <- FindClusters(G172.M4.clean.both, resolution = 0.25)   
G172.M4.clean.both.p1<- UMAPPlot(G172.M4.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M4.clean.both.p1
DefaultAssay(G172.M4.clean.both) <- "RNA"
G172.M4.clean.both <- NormalizeData(G172.M4.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M4.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M4.clean.both.p1,d2)

############# M4 top 80 ###########3
G172.M4.both.top80 <- subset(G172.hashtag, cells= joint.bcs.M4.both.top80, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M4.both.top80$stim  <- "G172M4_both"
DefaultAssay(G172.M4.both.top80) <- "RNA"
G172.M4.both.top80 <- SCTransform(G172.M4.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M4.both.top80 <- NormalizeData(G172.M4.both.top80, verbose = FALSE)
G172.M4.both.top80 <- FindVariableFeatures(G172.M4.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M4.both.top80 <- ScaleData(G172.M4.both.top80, features = VariableFeatures(G172.M4.both.top80))
# Run PCA
G172.M4.both.top80 <- RunPCA(G172.M4.both.top80,npcs = 30, features = VariableFeatures(G172.M4.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M4.both.top80 <- RunUMAP(G172.M4.both.top80, reduction = "pca", dims = 1:25)
G172.M4.both.top80 <- FindNeighbors(G172.M4.both.top80, reduction = "pca", dims = 1:25)
G172.M4.both.top80 <- FindClusters(G172.M4.both.top80, resolution = 0.25)   
G172.M4.both.top80.p1<- UMAPPlot(G172.M4.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M4.both.top80.p1
DefaultAssay(G172.M4.both.top80) <- "RNA"
G172.M4.both.top80 <- NormalizeData(G172.M4.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M4.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M4.both.top80.p1,d2)



############### both M1 + m3 ###########33

G172.M6.both <- subset(G172.hashtag, cells = c(joint.bcs.M1.both,joint.bcs.M3.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M6.both <- merge(G172.M1.both, G172.M3.both)
DefaultAssay(G172.M6.both) <- "RNA"
#G172.M6.both <- SCTransform(G172.M6.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M6.both <- NormalizeData(G172.M6.both, verbose = FALSE)
G172.M6.both <- FindVariableFeatures(G172.M6.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M6.both <- ScaleData(G172.M6.both, features = VariableFeatures(G172.M6.both))
# Run PCA
G172.M6.both <- RunPCA(G172.M6.both,npcs = 30, features = VariableFeatures(G172.M6.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M6.both <- RunUMAP(G172.M6.both, reduction = "pca", dims = 1:30)
G172.M6.both <- FindNeighbors(G172.M6.both, reduction = "pca", dims = 1:30)
G172.M6.both <- FindClusters(G172.M6.both, resolution = 0.25 )   
G172.M6.both.p1<- UMAPPlot(G172.M6.both, reduction = "umap", label=TRUE, label.size=5)
G172.M6.both.p1
G172.M6.both.p2 <- UMAPPlot(G172.M6.both, reduction = "umap", group="stim", label=TRUE, label.size=5)
G172.M6.both.p2
DefaultAssay(G172.M6.both) <- "RNA"
G172.M6.both <- NormalizeData(G172.M6.both, verbose = TRUE)
d6 <- DotPlot(G172.M6.both, features = c(all_genes,'Cyp2b10','Cyp2d9'))+RotatedAxis()
plot_grid(G172.M6.both.p1,d6)

# find markers between the male and female cluster hepatocytes #################
DE.sex.hep <- FindMarkers(G172.M6.both, ident.1 = 0, ident.2 = 1 ,verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
write.table(DE.sex.hep, "DE_Analysis/DE_sex_hep_G173_M1-M3_for_sex_batch_depleted", sep="\t")

###################33 both M2 + M4 ####
G172.M7.both <- subset(G172.hashtag, cells = c(joint.bcs.M2.both,joint.bcs.M4.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M7.both <- merge(G172.M2.both, G172.M4.both)
DefaultAssay(G172.M7.both) <- "RNA"
#G172.M7.both <- SCTransform(G172.M7.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M7.both <- NormalizeData(G172.M7.both, verbose = FALSE)
G172.M7.both <- FindVariableFeatures(G172.M7.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M7.both <- ScaleData(G172.M7.both, features = VariableFeatures(G172.M7.both))
# Run PCA
G172.M7.both <- RunPCA(G172.M7.both,npcs = 30, features = VariableFeatures(G172.M7.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M7.both <- RunUMAP(G172.M7.both, reduction = "pca", dims = 1:25)
G172.M7.both <- FindNeighbors(G172.M7.both, reduction = "pca", dims = 1:25)
G172.M7.both <- FindClusters(G172.M7.both, resolution = 0.3 )   
G172.M7.both.p1<- UMAPPlot(G172.M7.both, reduction = "umap", label=TRUE, label.size=5)
G172.M7.both.p1
G172.M7.both.p2 <- UMAPPlot(G172.M7.both, reduction = "umap", group="stim", label=TRUE, label.size=5)
G172.M7.both.p2
DefaultAssay(G172.M7.both) <- "RNA"
G172.M7.both <- NormalizeData(G172.M7.both, verbose = TRUE)
d7 <- DotPlot(G172.M7.both, features = c(all_genes,'Cyp2b10','Cyp2d9'))+RotatedAxis()
plot_grid(G172.M7.both.p1,d7)
DE.sex.hep.M7 <- FindMarkers(G172.M7.both, ident.1 = 0, ident.2 = 1 ,verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
write.table(DE.sex.hep.M7, "DE_Analysis/DE_sex_hep_G172_M2-M4_for_sexdepleated", sep="\t")


######################## clean M8 (M1+M3) #########################
G172.M8.clean.both <- subset(G172.hashtag, cells= c(joint.bcs.M1.clean.both,joint.bcs.M3.clean.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M8.clean.both$stim  <- "G172M8_both"
DefaultAssay(G172.M8.clean.both) <- "RNA"
G172.M8.clean.both <- SCTransform(G172.M8.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M8.clean.both <- NormalizeData(G172.M8.clean.both, verbose = FALSE)
G172.M8.clean.both <- FindVariableFeatures(G172.M8.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M8.clean.both <- ScaleData(G172.M8.clean.both, features = VariableFeatures(G172.M8.clean.both))
# Run PCA
G172.M8.clean.both <- RunPCA(G172.M8.clean.both,npcs = 30, features = VariableFeatures(G172.M8.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M8.clean.both <- RunUMAP(G172.M8.clean.both, reduction = "pca", dims = 1:30)
G172.M8.clean.both <- FindNeighbors(G172.M8.clean.both, reduction = "pca", dims = 1:30)
G172.M8.clean.both <- FindClusters(G172.M8.clean.both, resolution = 0.25)   
G172.M8.clean.both.p1<- UMAPPlot(G172.M8.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M8.clean.both.p1
DefaultAssay(G172.M8.clean.both) <- "RNA"
G172.M8.clean.both <- NormalizeData(G172.M8.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M8.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M8.clean.both.p1,d2)

#####3 clean M9 (M2+ M4)#####33
G172.M9.clean.both <- subset(G172.hashtag, cells= c(joint.bcs.M2.clean.both,joint.bcs.M4.clean.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M9.clean.both$stim  <- "G172M9_both"
DefaultAssay(G172.M9.clean.both) <- "RNA"
G172.M9.clean.both <- SCTransform(G172.M9.clean.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M9.clean.both <- NormalizeData(G172.M9.clean.both, verbose = FALSE)
G172.M9.clean.both <- FindVariableFeatures(G172.M9.clean.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M9.clean.both <- ScaleData(G172.M9.clean.both, features = VariableFeatures(G172.M9.clean.both))
# Run PCA
G172.M9.clean.both <- RunPCA(G172.M9.clean.both,npcs = 30, features = VariableFeatures(G172.M9.clean.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M9.clean.both <- RunUMAP(G172.M9.clean.both, reduction = "pca", dims = 1:30)
G172.M9.clean.both <- FindNeighbors(G172.M9.clean.both, reduction = "pca", dims = 1:30)
G172.M9.clean.both <- FindClusters(G172.M9.clean.both, resolution = 0.25)   
G172.M9.clean.both.p1<- UMAPPlot(G172.M9.clean.both, reduction = "umap", label=TRUE, label.size=5)
G172.M9.clean.both.p1
DefaultAssay(G172.M9.clean.both) <- "RNA"
G172.M9.clean.both <- NormalizeData(G172.M9.clean.both, verbose = TRUE)
d2 <- DotPlot(G172.M9.clean.both, features = all_genes)+RotatedAxis()
plot_grid(G172.M9.clean.both.p1,d2)

################### M1+ M3 both top 80

G172.M10.both.top80 <- subset(G172.hashtag, cells= c(joint.bcs.M1.both.top80,joint.bcs.M3.both.top80), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M10.both.top80$stim  <- "G172M10_both"
DefaultAssay(G172.M10.both.top80) <- "RNA"
G172.M10.both.top80 <- SCTransform(G172.M10.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M10.both.top80 <- NormalizeData(G172.M10.both.top80, verbose = FALSE)
G172.M10.both.top80 <- FindVariableFeatures(G172.M10.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M10.both.top80 <- ScaleData(G172.M10.both.top80, features = VariableFeatures(G172.M10.both.top80))
# Run PCA
G172.M10.both.top80 <- RunPCA(G172.M10.both.top80,npcs = 30, features = VariableFeatures(G172.M10.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M10.both.top80 <- RunUMAP(G172.M10.both.top80, reduction = "pca", dims = 1:30)
G172.M10.both.top80 <- FindNeighbors(G172.M10.both.top80, reduction = "pca", dims = 1:30)
G172.M10.both.top80 <- FindClusters(G172.M10.both.top80, resolution = 0.25)   
G172.M10.both.top80.p1<- UMAPPlot(G172.M10.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M10.both.top80.p1
DefaultAssay(G172.M10.both.top80) <- "RNA"
G172.M10.both.top80 <- NormalizeData(G172.M10.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M10.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M10.both.top80.p1,d2)


############ M2+ M4 top 80
G172.M11.both.top80 <- subset(G172.hashtag, cells= c(joint.bcs.M2.both.top80,joint.bcs.M4.both.top80), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M11.both.top80$stim  <- "G172M11_both"
DefaultAssay(G172.M11.both.top80) <- "RNA"
G172.M11.both.top80 <- SCTransform(G172.M11.both.top80,verbose =TRUE)
# Select the top 1000 most variable features
G172.M11.both.top80 <- NormalizeData(G172.M11.both.top80, verbose = FALSE)
G172.M11.both.top80 <- FindVariableFeatures(G172.M11.both.top80, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M11.both.top80 <- ScaleData(G172.M11.both.top80, features = VariableFeatures(G172.M11.both.top80))
# Run PCA
G172.M11.both.top80 <- RunPCA(G172.M11.both.top80,npcs = 30, features = VariableFeatures(G172.M11.both.top80))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M11.both.top80 <- RunUMAP(G172.M11.both.top80, reduction = "pca", dims = 1:25)
G172.M11.both.top80 <- FindNeighbors(G172.M11.both.top80, reduction = "pca", dims = 1:25)
G172.M11.both.top80 <- FindClusters(G172.M11.both.top80, resolution = 0.25)   
G172.M11.both.top80.p1<- UMAPPlot(G172.M11.both.top80, reduction = "umap", label=TRUE, label.size=5)
G172.M11.both.top80.p1
DefaultAssay(G172.M11.both.top80) <- "RNA"
G172.M11.both.top80 <- NormalizeData(G172.M11.both.top80, verbose = TRUE)
d2 <- DotPlot(G172.M11.both.top80, features = all_genes)+RotatedAxis()
plot_grid(G172.M11.both.top80.p1,d2)


#################################### M1+M2+M3+M4 sex delpetec genes #########################
#G172.M12.both <- subset(G172.hashtag, cells = c(joint.bcs.M1.both,joint.bcs.M3.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M12.both <- merge(G172.M6.both, G172.M7.both)
#G172.M12.both <- subset(G172.M12.both, subset = nFeature_RNA > 500 & nCount_RNA > 1000)

DefaultAssay(G172.M12.both) <- "RNA"
#G172.M12.both <- SCTransform(G172.M12.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M12.both <- NormalizeData(G172.M12.both, verbose = FALSE)
G172.M12.both <- FindVariableFeatures(G172.M12.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M12.both <- ScaleData(G172.M12.both, features = VariableFeatures(G172.M12.both))
# Run PCA
G172.M12.both <- RunPCA(G172.M12.both,npcs = 30, features = VariableFeatures(G172.M12.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M12.both <- RunUMAP(G172.M12.both, reduction = "pca", dims = 1:30)
G172.M12.both <- FindNeighbors(G172.M12.both, reduction = "pca", dims = 1:30)
G172.M12.both <- FindClusters(G172.M12.both, resolution = 0.25 )   
G172.M12.both.p1<- UMAPPlot(G172.M12.both, reduction = "umap", label=TRUE, label.size=5)
G172.M12.both.p1
G172.M12.both.p2 <- UMAPPlot(G172.M12.both, reduction = "umap", group="stim", label=TRUE, label.size=5)
G172.M12.both.p2
plot_grid(G172.M12.both.p1, G172.M12.both.p2)
FeaturePlot(G172.M12.both, features = "Cyp2c55")
FeaturePlot(G172.M12.both, features = "ncRNA-inter-chrX-15394")
d12 <- DotPlot(G172.M12.both, features = c(all_genes_new))+RotatedAxis()

#################################### G172 M1 +M2+M3+M4 ######################
#G172.M13.both <- subset(G172.hashtag, cells = c(joint.bcs.M1.both,joint.bcs.M3.both,joint.bcs.M2.both,joint.bcs.M4.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M13.both <- subset(G172.hashtag, cells = c(joint.bcs.M1.both,joint.bcs.M3.both,joint.bcs.M2.both,joint.bcs.M4.both), subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G172.M13.both <- subset(G172.hashtag, cells = c(joint.bcs.M1.both,joint.bcs.M3.both,joint.bcs.M2.both,joint.bcs.M4.both))

DefaultAssay(G172.M13.both) <- "RNA"
#G172.M13.both <- SCTransform(G172.M13.both,verbose =TRUE)
# Select the top 1000 most variable features
G172.M13.both <- NormalizeData(G172.M13.both, verbose = FALSE)
G172.M13.both <- FindVariableFeatures(G172.M13.both, selection.method = "vst", nfeatures = 2000)
# Scaling RNA data, we only scale the variable features here for efficiency
G172.M13.both <- ScaleData(G172.M13.both, features = VariableFeatures(G172.M13.both))
# Run PCA
G172.M13.both <- RunPCA(G172.M13.both,npcs = 30, features = VariableFeatures(G172.M13.both))
# We select the top 10 PCs for clustering and tSNE based on PCElbowPlot
G172.M13.both <- RunUMAP(G172.M13.both, reduction = "pca", dims = 1:30)
G172.M13.both <- FindNeighbors(G172.M13.both, reduction = "pca", dims = 1:30)
G172.M13.both <- FindClusters(G172.M13.both, resolution = 0.25 )   
G172.M13.both.p1<- UMAPPlot(G172.M13.both, reduction = "umap", label=TRUE, label.size=5)
plot_grid(G172.M13.both.p1, G172.M13.both.p2)
FeaturePlot(G172.M13.both, features = "Cyp2c55")
FeaturePlot(G172.M13.both, features = "ncRNA-inter-chrX-15394")
d13 <- DotPlot(G172.M13.both, features = c(all_genes_new))+RotatedAxis()
plot_grid(G172.M13.both.p1, d13)
FeaturePlot(G172.M13.both, features = "Cyp2c55")
FeaturePlot(G172.M13.both, features = "ncRNA-inter-chrX-15394")
########## function load_tissue_droplet############
droplet_metadata <- read.csv("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/metadata_droplet_liver.csv", sep=",", header = TRUE)
colnames(droplet_metadata)[1] <- "channel"
tissue_metadata = filter(droplet_metadata, tissue == tissue_of_interest)[,c('channel','tissue','subtissue','mouse.sex', 'mouse.id')]

raw.data <- Read10X("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/Refined_cellmatrices/Liver-10X_P4_2/")
colnames(raw.data) <- lapply(colnames(raw.data), function(x) paste0(tissue_metadata$channel[1],'_',x))
  meta.data1 = data.frame(row.names = colnames(raw.data))
  meta.data1['channel'] = tissue_metadata$channel[1]

  if (length(tissue_metadata$channel) > 1){
    # Some tissues, like Thymus and Heart had only one channel
    for(i in 2:nrow(tissue_metadata)){
subfolder = paste0("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/Refined_cellmatrices/",tissue_of_interest, '-', tissue_metadata$channel[i])
      new.data1 <- Read10X(data.dir = subfolder)
      colnames(new.data1) <- lapply(colnames(new.data1), function(x) paste0(tissue_metadata$channel[i],'_', x))
      
      new.metadata1 = data.frame(row.names = colnames(new.data1))
      new.metadata1['channel'] = tissue_metadata$channel[i]
      
      raw.data = cbind(raw.data, new.data1)
      meta.data1 = rbind(meta.data1, new.metadata1)
    }
  }
  
  rnames = row.names(meta.data1)
  meta.data1 <- merge(meta.data1, tissue_metadata, sort = F)
  row.names(meta.data1) <- rnames
  # Order the cells alphabetically to ensure consistency.
    ordered_cell_names = order(colnames(raw.data))
  raw.data = raw.data[,ordered_cell_names]
  meta.data1 = meta.data1[ordered_cell_names,]
    # Find ERCC's, compute the percent ERCC, and drop them from the raw data.
  erccs <- grep(pattern = "^ERCC-", x = rownames(x = raw.data), value = TRUE)
  percent.ercc <- Matrix::colSums(raw.data[erccs, ])/Matrix::colSums(raw.data)
  ercc.index <- grep(pattern = "^ERCC-", x = rownames(x = raw.data), value = FALSE)
  raw.data <- raw.data[-ercc.index,]
  
  # Create the Seurat object with all the data
  droplet <- CreateSeuratObject(raw.data)   # dropseq
  droplet <- AddMetaData(object = droplet, meta.data1) 
  droplet@meta.data$tech <- "droplet"

#n.pcs = 10
  #droplet <- SubsetData(droplet,subset.names = c("nGene", "nUMI"), low.thresholds = c(500, 1000))  # old version of seurat
droplet <-  subset(droplet, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
droplet <- NormalizeData(droplet, verbose = FALSE)
droplet <- FindVariableFeatures(droplet, selection.method = "vst", nfeatures = 2000)
droplet <- ScaleData(droplet, verbose = FALSE)
#droplet <- RunPCA(droplet, npcs = 10, verbose = FALSE)
droplet$stim <- "droplet"
droplet$cond <- "ctrl"
# droplet <- ScaleData(droplet, verbose = FALSE)
 droplet <- RunPCA(droplet, npcs = 30, verbose = FALSE)
 droplet <- RunUMAP(droplet, reduction = "pca", dims = 1:25)
 droplet <- FindNeighbors(droplet, reduction = "pca", dims = 1:10)
 droplet <- FindClusters(droplet, resolution = 0.5 )   
 p1<- UMAPPlot(droplet, reduction = "umap", group.by = "channel", label=TRUE, label.size=5)
 p2 <- UMAPPlot(droplet, label=TRUE, label.size=6)
 p3<- UMAPPlot(droplet, reduction = "umap", group.by = "mouse.sex", label=TRUE, label.size=5)

res.used <- 1
#droplet <- FindClusters(object = droplet, reduction.type = "pca", dims.use = 1:n.pcs, resolution = res.used, print.output = 0, save.SNN = TRUE, force.recalc = TRUE)

droplet <- RunTSNE(object = droplet, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
TSNEPlot(object = droplet, do.label = T, pt.size = 1.2, label.size = 4)


droplet <- RenameIdents(droplet, `0` = "Hep-Mid-M", `1` = "Hep-PC-F", `2` = "Hep-PP-F",`3` = "Hep-PP-M", `4` = "Hep-Mid-M", `5` = "Hep-PC-M", `6` = "Hep-Mid-F", `7` = "Hep-Mid-F", `8` = "Endo-F", `9` = "Bileduct-F")



### this is tranformation option for develpment SCtransform program #######
droplet <- SCTransform(droplet,verbose =TRUE)


######3 Smartseq #########################

plate_metadata <- read.csv("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/Liver_facs_annotation.csv", sep=",",  header = TRUE)
colnames(plate_metadata)[1] <- "plate.barcode"
  
raw.data = read.csv("/restricted/projectnb/waxmanlab/kkarri/scRNAseq_data_integration/liver_facs_scrna_data.csv", sep=",", row.names=1)
colnames(plate_metadata)[1] <- "plate.barcode"
  
plate.barcodes = lapply(colnames(raw.data), function(x) strsplit(strsplit(x, "_")[[1]][1], '.', fixed=TRUE)[[1]][2])

  barcode.df = t.data.frame(as.data.frame(plate.barcodes))
  
  rownames(barcode.df) = colnames(raw.data)
  barcode.df= cbind(barcode.df, colnames(raw.data))
  colnames(barcode.df) = c('plate.barcode1', 'plate.barcode')
  
  rnames = row.names(barcode.df)
  meta.data <- merge(barcode.df, plate_metadata, by='plate.barcode', sort = F)
  row.names(meta.data) <- rnames
    
  # Sort cells by cell name
  meta.data = meta.data[order(rownames(meta.data)), ]
  raw.data = raw.data[,rownames(meta.data)]
  
  # Create the Seurat object with all the data
  smartseq <- CreateSeuratObject(raw.data)
  smartseq <- AddMetaData(object = smartseq, meta.data)
  #smartseq@meta.data$tech <- "smartseq"
  smartseq$stim <- "smartseq"
  smartseq$cond <- "ctrl"
#smartseq <- SubsetData(smartseq,subset.names = c("nGene", "nUMI"),low.thresholds = c(500, 1000))  #old version of seurat
smartseq<-  subset(smartseq, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
#smartseq <- SCTransform(smartseq)
smartseq <- NormalizeData(smartseq, verbose = FALSE)
smartseq <- FindVariableFeatures(smartseq, selection.method = "vst", nfeatures = 2000)
smartseq <- ScaleData(smartseq, verbose = FALSE)
smartseq <- RunPCA(smartseq, npcs = 30, verbose = FALSE)
smartseq <- RunUMAP(smartseq, reduction = "pca", dims = 1:25)
smartseq <- FindNeighbors(smartseq, reduction = "pca", dims = 1:25)
smartseq <- FindClusters(smartseq, resolution = 0.5 )   
#p4<- UMAPPlot(smartseq, reduction = "umap", group.by = "channel", label=TRUE, label.size=5)
p5 <- UMAPPlot(smartseq, label=TRUE, label.size=6)
p6<- UMAPPlot(smartseq, reduction = "umap", group.by = "mouse.sex", label=TRUE, label.size=5)

########## sctransform ###################3
smartseq <- SCTransform(smartseq)

############################### Integration Regular workflow ############################
anchors <- FindIntegrationAnchors(object.list = c(droplet.list, smartseq.list,G171B.list, G172.M1.list, G172.M2.list), dims = 1:50, anchor.features = 3000)
combined <- IntegrateData(anchorset = anchors, dims = 1:50)    

DefaultAssay(combined) <- "integrated"
# Run the standard workflow for visualization and clustering
combined <- ScaleData(combined, verbose = FALSE)
combined <- RunPCA(combined, npcs = 30, verbose = FALSE)
                                                    
# t-SNE and Clustering
combined <- RunUMAP(combined, reduction = "pca", dims = 1:20)
combined <- FindNeighbors(combined, reduction = "pca", dims = 1:20)
combined <- FindClusters(combined, resolution = 0.5 )   
#combined <- RunTSNE(combined, reduction = "pca", dims = 1:20)
    
 # Visualization
p1 <- DimPlot(combined, reduction = "umap", group.by = "stim")
p2 <- DimPlot(combined, reduction = "umap", group.by = "mouse.sex")
p3 <- DimPlot(combined, reduction = "umap", label = TRUE)
p4 <- UMAPPlot(combined, label=TRUE)
plot_grid(p2, p3,p4) 
DimPlot(combined, reduction = "umap", split.by = "stim")   

p5 <- DimPlot(combined, reduction = "tsne", group.by = "stim")
p6 <- DimPlot(combined, reduction = "tsne", group.by = "mouse.sex")
p7 <- DimPlot(combined, reduction = "tsne", label = TRUE)
p8 <- TSNEPlot(combined, label =T)
plot_grid(p6, p7,p8) 
DimPlot(combined, reduction = "tsne", split.by = "stim") 

#################################### Refernce based Integration ################################
droplet.list <- SplitObject(droplet, split.by = "mouse.sex")
smartseq.list <- SplitObject(smartseq, split.by = "stim")
G172.M1.list <- SplitObject(G172.M1, split.by = "stim")
G172.M2.list <- SplitObject(G172.M2, split.by = "stim")
G172.M6.list <- SplitObject(G172.M6, split.by = "stim")
G171B.list <- SplitObject(G171B, split.by="stim")
ctrl.list1 <- c(droplet.list)
ctrl.list <- c(droplet.list, smartseq.list)

for (i in names(ctrl.list)) {
    ctrl.list[[i]] <- SCTransform(ctrl.list[[i]], verbose =TRUE)
}

ctrl.list1 <- c(ctrl.list, G171B.list)
#dims = 1:50
ref.features <- SelectIntegrationFeatures(object.list = ctrl.list1, dims=1:50, anchor.features = 3000)
ref.list <- PrepSCTIntegration(object.list = ctrl.list1, anchor.features = ref.features)
ref.anchors <- FindIntegrationAnchors(object.list = ref.list, normalization.method = "SCT", anchor.features = ref.features, reference = c(1,2,3))
ref.integrated <- IntegrateData(anchorset = ref.anchors, normalization.method = "SCT")

DefaultAssay(ref.integrated) <- "integrated"
ref.integrated <- ScaleData(ref.integrated, verbose = FALSE)
ref.integrated <- RunPCA(object = ref.integrated, npcs=30,verbose = FALSE)
ref.integrated <- RunUMAP(object = ref.integrated ,dims = 1:30, seed.use = 10, perplexity=30)
ref.integrated <- FindNeighbors(ref.integrated, reduction = "pca", dims = 1:30)
ref.integrated <- FindClusters(ref.integrated, resolution = 0.2 )   

r1 <- UMAPPlot(ref.integrated, split.by="stim")
r2 <- UMAPPlot(ref.integrated, label=TRUE)
r3 <- UMAPPlot(ref.integrated, split.by = c("mouse.sex"))


plots <- lapply(X = plots, FUN = function(x) x + theme(legend.position = "top") + guides(color = guide_legend(nrow = 4, 
    byrow = TRUE, override.aes = list(size = 2.5))))
CombinePlots(plots)


ref.integrated$celltype.stim <- paste(Idents(ref.integrated), ref.integrated$stim, sep = "_")
ref.integrated$seurat_clusters <- Idents(ref.integrated)
Idents(ref.integrated) <- "celltype.stim"

fp <- FeaturePlot(ref.integrated, features = "ncRNA-as-chr10-8460", cols = c("lightgrey","darkred"), order = TRUE,  shape.by = "stim", pt.size = 2)

DefaultAssay(ref.integrated) <-"RNA"
ref.integrated <- NormalizeData(ref.integrated)
ref.integrated <- ScaleData(ref.integrated)

dot1 <- DotPlot(ref.integrated, features= all_genes)+RotatedAxis()
d1 <- DoHeatmap(ref.integrated, features = c(all_genes,"Mup20","Xist"), group.by = "seurat_clusters", assay= 'RNA')
#d1 <- DoHeatmap(ref.integrated, features = highTPM, group.by = "celltype.stim", assay= 'RNA',raster = F, disp.max = 0.5)+scale_fill_gradientn(colors = (RColorBrewer::brewer.pal(n = 9, name = "PuRd")) ) + guides(color=FALSE)


############ merge G172 M1 #############33
droplet.list <- SplitObject(droplet, split.by = "mouse.sex")
smartseq.list <- SplitObject(smartseq, split.by = "stim")
G172.M1.list <- SplitObject(G172.M1, split.by = "stim")
G172.M2.list <- SplitObject(G172.M2, split.by = "stim")
G172.M6.list <- SplitObject(G172.M6, split.by = "stim")
G171B.list <- SplitObject(G171B, split.by="stim")
ctrl.list.2 <- c( G172.M1.list, G172.M2.list)
G172.M1.merge.list <- SplitObject(G172.M1.merge, split.by = "stim")
G172.M2.merge.list <- SplitObject(G172.M2.merge, split.by = "stim")

merged.list <- c(G172.M1.merge.list, G172.M2.merge.list)

for (i in names(ctrl.list.2)) {
    ctrl.list.2[[i]] <- SCTransform(ctrl.list.2[[i]], verbose =TRUE)
}

ref.features.1 <- SelectIntegrationFeatures(object.list = ctrl.list.2, dims = 1:50, anchor.features = 3000)
ref.list.1 <- PrepSCTIntegration(object.list = ctrl.list.2, anchor.features = ref.features.1)


ref.anchors.1 <- FindIntegrationAnchors(object.list = ref.list.1, normalization.method = "SCT", 
    anchor.features = ref.features.1, reference = c(1,2))
ref.integrated.1 <- IntegrateData(anchorset = ref.anchors.1, normalization.method = "SCT")

DefaultAssay(ref.integrated.1) <- "integrated"
ref.integrated.1 <- ScaleData(ref.integrated.1, verbose = FALSE)
ref.integrated.1 <- RunPCA(object = ref.integrated.1, npcs=30,verbose = FALSE)
ref.integrated.1 <- RunUMAP(object = ref.integrated.1, dims = 1:30, seed.use = 10 , perplexity=30)
#ref.integrated.1 <- RunTSNE(object = ref.integrated.1, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
ref.integrated.1 <- FindNeighbors(ref.integrated.1, reduction = "pca", dims = 1:30)
ref.integrated.1 <- FindClusters(ref.integrated.1, resolution = 0.2)   

rG172M1.1 <- UMAPPlot(ref.integrated.1, split.by="stim", label=T)
rG172M1.2 <- UMAPPlot(ref.integrated.1, label=TRUE, combine = FALSE)
rG172M1.3 <- UMAPPlot(ref.integrated.1, split.by = c("mouse.sex"))

rG172M1.4 <- TSNEPlot(ref.integrated.1, split.by="stim")


DefaultAssay(ref.integrated.1) <-"RNA"
ref.integrated.1 <- NormalizeData(ref.integrated.1)
ref.integrated.1 <- ScaleData(ref.integrated.1)

DoHeatmap(ref.integrated.1, features = c(all_genes,'Sox9','Mup20'), group.by = "seurat_clusters", assay= 'RNA' ,raster = F)+scale_fill_gradientn(colors = (RColorBrewer::brewer.pal(n = 9, name = "PuRd")) ) + guides(color=FALSE)


ref.integrated.1$celltype <- RenameIdents(ref.integrated.1, c(`0` = "PP", `1` = "PC", `2` = "Endo",`3` = "HSC", `4` = "Kupffer", `5` = "Dividing", `6` = "Immune", `7` = "B-NK", `8` = "NA"))


ref.integrated.1.markers <- FindAllMarkers(ref.integrated.1, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
ref.integrated.1.markers  %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)

write.csv(ref.integrated.1.markers, "ref_integrated_G172M1-M2_Allmarker")

ref.integrated.1$celltype.stim <- paste(Idents(ref.integrated.1), ref.integrated.1$stim, sep = "_")
ref.integrated.1$celltype <- Idents(ref.integrated.1)
Idents(ref.integrated.1) <- "celltype.stim"

DoHeatmap(ref.integrated.1, features = TPM4, group.by = "seurat_clusters", assay= 'RNA' )

ref.integrated.1.markers <- FindMarkers(ref.integrated.1, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
ref.integrated.1.markers  %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)


##################################################################################################3

for (i in names(merged.list)) {
    merged.list[[i]] <- SCTransform(merged.list[[i]], verbose =TRUE)
}
ref.features.2 <- SelectIntegrationFeatures(object.list = merged.list, dims = 1:50, anchor.features = 3000)
ref.list.2 <- PrepSCTIntegration(object.list = merged.list, anchor.features = ref.features.2)


ref.anchors.2 <- FindIntegrationAnchors(object.list = ref.list.2, normalization.method = "SCT", 
    anchor.features = ref.features.2, reference = 1)
ref.integrated.2 <- IntegrateData(anchorset = ref.anchors.2, normalization.method = "SCT")

DefaultAssay(ref.integrated.2) <- "integrated"
ref.integrated.2 <- ScaleData(ref.integrated.2, verbose = FALSE)
ref.integrated.2 <- RunPCA(object = ref.integrated.2, npcs=30,verbose = FALSE)
ref.integrated.2 <- RunUMAP(object = ref.integrated.2, dims = 1:30, seed.use = 10 , perplexity=30)
ref.integrated.2 <- RunTSNE(object = ref.integrated.2, dims.use = 1:30, seed.use = 10, perplexity=30)
ref.integrated.2 <- FindNeighbors(ref.integrated.2, reduction = "pca", dims = 1:30)
ref.integrated.2 <- FindClusters(ref.integrated.2, resolution = 0.5)   

rG172M1.1 <- UMAPPlot(ref.integrated.2, split.by="stim", label=T)
rG172M1.2 <- UMAPPlot(ref.integrated.2, label=TRUE)
rG172M1.3 <- TSNEPlot(ref.integrated.2, split.by="stim")
rG172M1.4 <- TSNEPlot(ref.integrated.2, label=TRUE)


DefaultAssay(ref.integrated.2) <-"RNA"
ref.integrated.2 <- NormalizeData(ref.integrated.2)
ref.integrated.2 <- ScaleData(ref.integrated.2)
d3 <- DotPlot(ref.integrated.2, features = all_genes)+ RotatedAxis()
plot_grid(rG172M1.2,rG172M1.1 ,d3)
G172.M1.list <- SplitObject(G172.M1.both, split.by = "stim")
G172.M3.list <- SplitObject(G172.M3.both, split.by = "stim")
merged.list <- c(G172.M1.list, G172.M3.list)

for (i in names(merged.list)) {
   merged.list[[i]] <- SCTransform(merged.list[[i]], verbose =TRUE)
}

ref.features.1 <- SelectIntegrationFeatures(object.list = merged.list, dims = 1:50, anchor.features = 2000)
ref.list.1 <- PrepSCTIntegration(object.list = merged.list, anchor.features = ref.features.1)

ref.anchors.1 <- FindIntegrationAnchors(object.list = ref.list.1, normalization.method = "SCT", 
    anchor.features = ref.features.1)
ref.integrated.1 <- IntegrateData(anchorset = ref.anchors.1, normalization.method = "SCT")

DefaultAssay(ref.integrated.1) <- "integrated"
ref.integrated.1 <- ScaleData(ref.integrated.1, verbose = FALSE)
ref.integrated.1 <- RunPCA(object = ref.integrated.1, npcs=30,verbose = FALSE)
ref.integrated.1 <- RunUMAP(object = ref.integrated.1, dims = 1:30, seed.use = 10 , perplexity=30)
#ref.integrated.1 <- RunTSNE(object = ref.integrated.1, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
ref.integrated.1 <- FindNeighbors(ref.integrated.1, reduction = "pca", dims = 1:30)
ref.integrated.1 <- FindClusters(ref.integrated.1, resolution = 0.2)   

rG172M1.1 <- UMAPPlot(ref.integrated.1, group.by="stim")
rG172M1.2 <- UMAPPlot(ref.integrated.1, label=TRUE)
#rG172M1.4 <- TSNEPlot(ref.integrated.1, split.by="stim")

DefaultAssay(ref.integrated.1) <-"RNA"
ref.integrated.1 <- NormalizeData(ref.integrated.1)
ref.integrated.1 <- ScaleData(ref.integrated.1)
d3 <- DotPlot(ref.integrated.1, features = all_genes)+ RotatedAxis()
plot_grid(rG172M1.2,rG172M1.1 ,d3)

##########3 use the standar integration workflow ##################
anchors <- FindIntegrationAnchors(object.list = merged.list, dims = 1:50, anchor.features = 2000)
#anchors <- FindIntegrationAnchors(object.list = list(lnc5998, droplet1), dims = 1:50, anchor.features = 3000)
combined <- IntegrateData(anchorset = anchors, dims = 1:50)    
DefaultAssay(combined) <- "integrated"
# Run the standard workflow for visualization and clustering
combined <- ScaleData(combined, verbose = FALSE)
combined <- RunPCA(combined, npcs = 30, verbose = FALSE)
                                                    
# t-SNE and Clustering
combined <- RunUMAP(combined, reduction = "pca", dims = 1:30)
combined <- FindNeighbors(combined, reduction = "pca", dims = 1:30)
combined <- FindClusters(combined, resolution = 0.2 )   

 # Visualization
p1 <- UMAPPlot(combined, reduction = "umap", group.by = "stim")
p4 <- UMAPPlot(combined, label=TRUE, label.size=6)

DefaultAssay(combined) <-"RNA"
combined <- NormalizeData(combined)
combined <- ScaleData(combined)
d3 <- DotPlot(combined, features = all_genes)+ RotatedAxis()
plot_grid(p1,p4 ,d3)

G172M1 and G172 M2 DE analysis


DE1.1 <- FindMarkers(ref.integrated.1, ident.1 = c("0_G172M1" ,"1_G172M1", "2_G172M1" ,"3_G172M1" ,"4_G172M1" ,"5_G172M1" ,"6_G172M1","7_G172M1", "8_G172M1"), ident.2 = c("0_G172M2" ,"1_G172M2", "2_G172M2" ,"3_G172M2" ,"4_G172M2" ,"5_G172M2" ,"6_G172M2","7_G172M2", "8_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE_All_M1_M2 <- DE1.1 
write.csv(DE_All_M1_M2, "/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/analysis/marker/DE_G172_All_M1_M2")
DE_hep_NPC <- FindMarkers(ref.integrated.1, ident.1 = c("0_G172M2" ,"1_G172M2"), ident.2 = c("2_G172M2" ,"3_G172M2" ,"4_G172M2" ,"5_G172M2" ,"6_G172M2","7_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE_NPC_M1_M2 <- FindMarkers(ref.integrated.1, ident.1 = c( "2_G172M1" ,"3_G172M1" ,"4_G172M1" ,"5_G172M1" ,"6_G172M1","7_G172M1"), ident.2 = c("2_G172M2" ,"3_G172M2" ,"4_G172M2" ,"5_G172M2" ,"6_G172M2","7_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE_Hep0.1_NPC_M2 <- FindMarkers(ref.integrated.1, ident.1 = c( "0_G172M2" ,"1_G172M2"), ident.2 = c("2_G172M2" ,"3_G172M2" ,"4_G172M2" ,"5_G172M2" ,"6_G172M2","7_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

write.csv(DE_Hep0.1_NPC_M2, "G172_markers/DE_Hep01_NPC_M2")

DE0.1 <- FindMarkers(ref.integrated.1, ident.1 = c("0_G172M1"), ident.2 = c("0_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE1.1 <- FindMarkers(ref.integrated.1, ident.1 = c("1_G172M1"), ident.2 = c("1_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE2.1 <- FindMarkers(ref.integrated.1, ident.1 = c("2_G172M1"), ident.2 = c("2_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE3.1 <- FindMarkers(ref.integrated.1, ident.1 = c("3_G172M1"), ident.2 = c("3_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE4.1 <- FindMarkers(ref.integrated.1, ident.1 = c("4_G172M1"), ident.2 = c("4_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE5.1 <- FindMarkers(ref.integrated.1, ident.1 = c("5_G172M1"), ident.2 = c("5_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE6.1 <- FindMarkers(ref.integrated.1, ident.1 = c("6_G172M1"), ident.2 = c("6_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE7.1 <- FindMarkers(ref.integrated.1, ident.1 = c("7_G172M1"), ident.2 = c("7_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DE0.1 <- FindMarkers(ref.integrated.1, ident.1 = c("0_G172M1"), ident.2 = c("0_G172M2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
################# G171 TCPO expsosed ########
G171B_metadata_G171B <- read.csv("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G171/Analysis/G171_metadata_droplet_liver.csv", sep=",", header = TRUE)
colnames(G171B_metadata_G171B)[1] <- "channel"
tissue_metadata_G171B = filter(G171B_metadata_G171B, tissue == tissue_of_interest)[,c('channel','tissue','subtissue','mouse.sex', 'mouse.id')]

raw.data <- Read10X("/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G171/Analysis/Transcript_Refined/Liver-10X_G171B/")
colnames(raw.data) <- lapply(colnames(raw.data), function(x) paste0(tissue_metadata_G171B$channel[1],'_',x))
  meta.data1 = data.frame(row.names = colnames(raw.data))
  meta.data1['channel'] = tissue_metadata_G171B$channel[1]
  
  rnames = row.names(meta.data1)
  meta.data1 <- merge(meta.data1, tissue_metadata_G171B, sort = F)
  row.names(meta.data1) <- rnames
  # Order the cells alphabetically to ensure consistency.
  
  ordered_cell_names = order(colnames(raw.data))
  raw.data = raw.data[,ordered_cell_names]
  meta.data1 = meta.data1[ordered_cell_names,]
  
  # Find ERCC's, compute the percent ERCC, and drop them from the raw data.
  erccs <- grep(pattern = "^ERCC-", x = rownames(x = raw.data), value = TRUE)
  percent.ercc <- Matrix::colSums(raw.data[erccs, ])/Matrix::colSums(raw.data)
  ercc.index <- grep(pattern = "^ERCC-", x = rownames(x = raw.data), value = FALSE)
  raw.data <- raw.data[-ercc.index,]
  
  ncRNA.genes <- grep(pattern = "^ncRNA", x = rownames(x = raw.data), value = TRUE)
  percent.ncRNA <- Matrix::colSums(raw.data[ncRNA.genes, ])/Matrix::colSums(raw.data)
  KRAB.genes <- grep(pattern = "^KRAB", x = rownames(x = raw.data), value = TRUE)
  cherry.genes <- grep(pattern = "^mcherry", x = rownames(x = raw.data), value = TRUE)
  
  # Create the Seurat object with all the data
  G171B <- CreateSeuratObject(raw.data)   # dropseq
  G171B <- AddMetaData(object = G171B, meta.data1) 
  G171B@meta.data$tech <- "G171B"

#G171B <- SubsetData(G171B,subset.names = c("nGene", "nUMI"), low.thresholds = c(500, 1000))  # old version of seurat
#G171B <-  subset(G171B, subset = nFeature_RNA > 500 & nCount_RNA > 1000)
G171B <- NormalizeData(G171B, verbose = FALSE)
G171B <- FindVariableFeatures(G171B, selection.method = "vst", nfeatures = 2000)
G171B$stim <- "G171B"

### this is tranformation option for develpment SCtransform program #######
G171B <- SCTransform(G171B,verbose =TRUE)

diffusion plt code

# Before running MDS, we first calculate a distance matrix between all pairs of cells.  Here we
# use a simple euclidean distance metric on all genes, using scale.data as input
d <- dist(t(GetAssayData(combined, slot = "scale.data")))
# Run the MDS procedure, k determines the number of dimensions
mds <- cmdscale(d = d, k = 2)
# cmdscale returns the cell embeddings, we first label the columns to ensure downstream
# consistency
colnames(mds) <- paste0("MDS_", 1:2)
# We will now store this as a custom dimensional reduction called 'mds'
combined[["mds"]] <- CreateDimReducObject(embeddings = mds, key = "MDS_", assay = DefaultAssay(combined))

# We can now use this as you would any other dimensional reduction in all downstream functions
DimPlot(combined, reduction = "mds", pt.size = 0.5)
genes_hep_main =c('Alb', 'Ttr', 'Apoa1', 'Serpina1c')
genes_hep = c('Alb', 'Ttr', 'Apoa1', 'Serpina1c',
                   'Cyp2e1', 'Glul', 'Oat', 'Gulo',
                   'Ass1', 'Hamp', 'Gstp1', 'Ubb',
                   'Cyp2f2', 'Pck1', 'Hal', 'Cdh1')
genes_endo = c('Pecam1', 'Nrp1', 'Kdr','Oit3','Igfbp7','Aqp1')
genes_kuppfer = c( 'Clec4f', 'Cd68')
genes_nk = c('Il2rb', 'Nkg7', 'Cxcr6', 'Gzma')
genes_b = c('Cd79a', 'Cd79b')
genes_bec = c('Epcam', 'Krt19', 'Krt7')
genes_immune = 'Ptprc'
HSC = c("Dcn","Lama1","Nes")
Dividing = "Top2a"
Bplasma= "Jchain"
Mac= "Csf1r"
Chol="Sox9"

Y_genes <- c("Uty","Ddx3y","Kdm5d","Eif2s3y",   "Gm47283")
sex <- c("Cyp2d9", "ncRNA-inter-chrX-15394","Cyp2c69", 'Mup20', 'Mup1','Mup12', 'Mup21', 'Cyp2d9')
F_sex <- c('Sult3a1', 'A1bg', 'Fmo3', 'Cyp2b9', 'Sult2a1','Cyp2b13')
all_genes = c(genes_hep, genes_endo, genes_kuppfer, Mac,genes_nk, genes_b, genes_bec, genes_immune, HSC, Dividing)
genes_bec_b_immune  = c(genes_bec,genes_b,genes_immune)
genes_zones = c('Cyp2e1', 'Glul', 'Oat', 'Gulo',
              'Ass1', 'Hamp', 'Gstp1', 'Ubb',
              'Cyp2f2', 'Pck1', 'Hal', 'Cdh1')

All_sex_genes <- c('Mup11','Mup7','Elovl3','Cyp4a12a','Tff3','Scara5','Mup14','Gstp2','Cyp4a12b','Mup20','Mup12','Mup21','Cyp2d9','Mup1',
                   'Sult2a5','Sult2a2','Sult2a3','Cyp3a16','Sult2a6','Cyp3a41b','Cyp3a44','Cyp3a41a','Cyp2a4','Slc22a26','Sult3a1',
'Sult2a1','Cyp2b13','A1bg','Fmo3','Cyp2c69','Cyp2b9')

#All_sex_genes <- c('Mup11|Mup7|Elovl3|Cyp4a12a|Tff3|Scara5|Mup14|Gstp2|Cyp4a12b|Mup20|Mup12|Mup21|Cyp2d9|Mup1|
                  # Sult2a5|Sult2a2|Sult2a3|Cyp3a16|Sult2a6|Cyp3a41b|Cyp3a44|Cyp3a41a|Cyp2a4|Slc22a26|Sult3a1|
#Sult2a1|Cyp2b13|A1bg|Fmo3|Cyp2c69|Cyp2b9')


All_sex_genes_all <- c(Y_genes, "ncRNA-inter-chrX-15394", All_sex_genes)

receptor_KO <- c("ncRNA-inter-chr7-5998","Cyp2b10","Nr1i2","Nr1i3","Ppara","Pparg","Ppargc1b","Ppard")
cell <- c("Stab2","Csf1r","Cd3g","Ebf1","Irf8","Sox9","Apoc3","Top2a","Dcn")
TPM4<- c('ncRNA-inter-chr7-6524',
'ncRNA-inter-chr19-14853',
'ncRNA-inter-chr6-5675',
'ncRNA-inter-chr4-3468',
'ncRNA-inter-chr9-8122',
'ncRNA-inter-chr12-10476',
'ncRNA-inter-chr17-14026',
'ncRNA-as-chr2-1457',
'ncRNA-as-chr19-14883',
'ncRNA-as-chr10-8460',
'ncRNA-as-chr5-4325',
'ncRNA-inter-chr7-5998',
'ncRNA-as-chr9-7843',
'ncRNA-as-chr9-8142',
'ncRNA-inter-chr11-9925',
'ncRNA-inter-chr19-14873',
'ncRNA-as-chr9-8172',
'ncRNA-inter-chr4-3779',
'ncRNA-inter-chr3-2504',
'ncRNA-as-chr19-15054',
'ncRNA-inter-chr8-7423',
'ncRNA-as-chr7-6302',
'ncRNA-inter-chr10-9418',
'ncRNA-inter-chr12-10454',
'ncRNA-as-chr7-5999',
'ncRNA-as-chr6-5335',
'ncRNA-inter-chr19-14987',
'ncRNA-inter-chr16-13170',
'ncRNA-inter-chr3-2988',
'ncRNA-inter-chr8-7430',
'ncRNA-inter-chr3-2168',
'ncRNA-inter-chr9-7874',
'ncRNA-inter-chr4-3778',
'ncRNA-inter-chr2-2011',
'ncRNA-inter-chr5-4335',
'ncRNA-inter-chr9-8301',
'ncRNA-inter-chr16-13510',
'ncRNA-as-chr9-8401',
'ncRNA-as-chr16-13512',
'ncRNA-as-chr12-10896',
'ncRNA-as-chr8-7359',
'ncRNA-as-chr5-4744',
'ncRNA-inter-chr5-4499',
'ncRNA-inter-chr16-13509',
'ncRNA-inter-chr17-13692',
'ncRNA-as-chr17-13834',
'ncRNA-inter-chr9-8147',
'ncRNA-inter-chr10-8697',
'ncRNA-inter-chr6-5551',
'ncRNA-as-chr9-8317',
'ncRNA-inter-chr7-6509',
'ncRNA-as-chr19-14977',
'ncRNA-inter-chr6-5318',
'ncRNA-inter-chr5-4578',
'ncRNA-inter-chr12-10509',
'ncRNA-as-chr10-9015',
'ncRNA-inter-chr3-2411',
'ncRNA-inter-chr9-7875',
'ncRNA-inter-chr5-4336',
'ncRNA-inter-chr12-10910',
'ncRNA-as-chr1-782',
'ncRNA-inter-chr17-13924',
'ncRNA-intra-chr7-5920',
'ncRNA-inter-chr16-13225',
'ncRNA-inter-chr3-2269',
'ncRNA-inter-chr14-12016',
'ncRNA-as-chr4-3800',
'ncRNA-as-chr5-4655',
'ncRNA-inter-chr9-7989',
'ncRNA-intra-chr5-4728',
'ncRNA-inter-chrX-15248',
'ncRNA-inter-chr10-8767',
'ncRNA-inter-chr19-14717',
'ncRNA-inter-chr8-6766',
'ncRNA-inter-chr13-11122',
'ncRNA-inter-chr7-6074',
'ncRNA-inter-chr15-12439',
'ncRNA-as-chr11-9787',
'ncRNA-inter-chr2-1827',
'ncRNA-as-chr19-14976',
'ncRNA-inter-chr19-14947',
'ncRNA-inter-chr6-5248',
'ncRNA-inter-chr2-1098',
'ncRNA-inter-chr8-7180',
'ncRNA-inter-chr9-8118',
'ncRNA-inter-chr14-12199',
'ncRNA-as-chr6-5336',
'ncRNA-inter-chr4-3867',
'ncRNA-inter-chr10-9000',
'ncRNA-inter-chr14-12290',
'ncRNA-inter-chr2-1491',
'ncRNA-inter-chr15-12606',
'ncRNA-inter-chr10-9222',
'ncRNA-inter-chr5-4322',
'ncRNA-inter-chr12-10942',
'ncRNA-inter-chr18-14690',
'ncRNA-inter-chr2-1471',
'ncRNA-inter-chr3-2410',
'ncRNA-inter-chr19-14880',
'ncRNA-inter-chr13-11074',
'ncRNA-inter-chr9-8056',
'ncRNA-inter-chr5-4654',
'ncRNA-inter-chr3-2166',
'ncRNA-inter-chr8-6944',
'ncRNA-as-chr7-6065',
'ncRNA-inter-chr8-6896',
'ncRNA-inter-chr2-1963',
'ncRNA-inter-chr4-3425',
'ncRNA-inter-chr13-11385',
'ncRNA-inter-chr9-7885',
'ncRNA-as-chr10-9411',
'ncRNA-as-chr9-8419',
'ncRNA-as-chr12-10618',
'ncRNA-inter-chr7-6390',
'ncRNA-inter-chr17-14151',
'ncRNA-as-chr13-11787',
'ncRNA-as-chr2-1965',
'ncRNA-inter-chr6-5721',
'ncRNA-inter-chr6-5822',
'ncRNA-inter-chr11-9635',
'ncRNA-inter-chr11-9965',
'ncRNA-inter-chr4-3052',
'ncRNA-inter-chr17-13857',
'ncRNA-inter-chr13-11201',
'ncRNA-inter-chr6-5249',
'ncRNA-inter-chr19-14851',
'ncRNA-inter-chr6-5638',
'ncRNA-inter-chr17-14130',
'ncRNA-inter-chr9-7993',
'ncRNA-inter-chr18-14656',
'ncRNA-inter-chr9-7992',
'ncRNA-inter-chr1-566',
'ncRNA-inter-chr12-10715',
'ncRNA-inter-chr17-14102',
'ncRNA-inter-chr4-3010',
'ncRNA-inter-chr3-2764',
'ncRNA-inter-chr4-3306',
'ncRNA-inter-chr19-14979',
'ncRNA-inter-chr1-570',
'ncRNA-inter-chr19-14790',
'ncRNA-inter-chr4-3282',
'ncRNA-inter-chr5-4777',
'ncRNA-inter-chr8-7605',
'ncRNA-inter-chr9-8000',
'ncRNA-as-chr15-12920',
'ncRNA-as-chr1-369',
'ncRNA-inter-chr19-14952',
'ncRNA-as-chr9-8393',
'ncRNA-as-chr14-12074',
'ncRNA-inter-chr12-10415',
'ncRNA-inter-chr7-6559',
'ncRNA-inter-chr1-630',
'ncRNA-inter-chr4-3142',
'ncRNA-inter-chr6-5131',
'ncRNA-inter-chr16-13050',
'ncRNA-inter-chr7-6411',
'ncRNA-inter-chr5-4746',
'ncRNA-inter-chr1-633',
'ncRNA-inter-chr10-8461',
'ncRNA-inter-chr2-2016',
'ncRNA-inter-chr6-5137',
'ncRNA-as-chr4-3300',
'ncRNA-inter-chr4-3009',
'ncRNA-inter-chr2-1923',
'ncRNA-inter-chr1-670',
'ncRNA-inter-chr15-12835',
'ncRNA-inter-chr18-14655',
'ncRNA-inter-chr16-13211',
'ncRNA-as-chr7-6050',
'ncRNA-inter-chr7-6508',
'ncRNA-inter-chr11-10206',
'ncRNA-inter-chr13-11399',
'ncRNA-inter-chr8-6757',
'ncRNA-inter-chr1-129',
'ncRNA-inter-chr12-10459',
'ncRNA-inter-chr7-6709',
'ncRNA-inter-chr12-10713',
'ncRNA-inter-chr7-6523',
'ncRNA-inter-chr2-2017',
'ncRNA-inter-chr7-6343',
'ncRNA-inter-chr1-63',
'ncRNA-as-chr3-2936',
'ncRNA-inter-chr18-14691',
'ncRNA-inter-chr7-6097',
'ncRNA-inter-chr6-5723')
DefaultAssay(droplet) <- "RNA"
#droplet <- NormalizeData(combined, verbose = TRUE, normalization.method = "RC", scale.factor = 1e6)
combined <- NormalizeData(combined, verbose = TRUE)

DotPlot(combined, features = all_genes)
FeaturePlot(combined, features = genes_hep_main, min.cutoff = "q9")
#hepatocytes 
subtissplot <- DotPlot(combined, features = c(genes_hep_main, genes_endo, genes_bec_b_immune, genes_kuppfer, genes_nk))
PC <- DotPlot(combined, features = c(genes_hep_main,genes_zones))
NPC <- DotPlot(combined, features = c(genes_endo,genes_kuppfer, genes_nk))
all <- DotPlot(combined, features=c(all_genes))

### coexpression plots####

f1 <- FeaturePlot(KO.cells, features = c('Cyp2b10','ncRNA-inter-chr7-5998'), reduction = "mds", order = TRUE,split.by = "stim", blend = TRUE,sort.cell = TRUE, max.cutoff = 0.5)


########## this is exact averaging formula ###############33
  x <- (AverageExpression(KO.cells, verbose = TRUE, assays = "RNA" ,slot="counts")$RNA)
   x["ncRNA-inter-chr7-5998",]
#                         G171B    G171C
#ncRNA-inter-chr7-5998 1.871795 1.091463
########
#Idents(combined) <- factor(Idents(combined), levels = c(0,1,12))
markers.to.plot <- c("Alb","ncRNA-inter-chr7-5998")
DotPlot(combined, features = rev(markers.to.plot), cols = c("blue", "red"), dot.scale = 8, 
    split.by = "stim") + RotatedAxis()

FeaturePlot(combined, features = c("Alb", "ncRNA-inter-chr7-5998","Cyp2b10","dSaCas9","KRAB","AAV8-mCherry"), split.by = "stim", max.cutoff = 3, cols = c("grey", "red"))


######################### vlnplot ##########################

plots <- VlnPlot(combined, features = c("Alb", "ncRNA-inter-chr7-5998","Cyp2b10","dSaCas9"), split.by = "stim", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
CombinePlots(plots = plots, ncol = 1)

plots <- VlnPlot(combined, features = c("Lhx4","Dtna","Fam189a1","Galnt16","Kalrn"), split.by = "stim", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
CombinePlots(plots = plots, ncol = 1)


#endothelial
DotPlot(combined, features = genes_endo)

#zones
zones <- DotPlot(combined, features = genes_zones)

f1 <- FeaturePlot(combined, features = c('Cyp2e1','Cyp2f2','Ass1'), min.cutoff = "q9", reduction = "tsne")

DimPlot(combined, label = TRUE)

save(combined, file="Seurat_smart-drop_integrated.Robj")


################# save raw counts from cluster #####################

Idents(combined) <- "stim"

### to avergae out the matrix from KO cells 

combined.raw.data.0.1 <- as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 0,idents = "stim")])
combined.raw.data.1 <- as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 0)])
combined.raw.data.2 <- as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 0)])

#combined.raw.data.[i] <- as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 1)])
#combined.raw.data.12 <-as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 12)])
#combined.raw.data.1 <- as.matrix(GetAssayData(combined, slot = "counts"))
x <- AverageExpression(test.combined,assays = "RNA",add.ident = "stim", slot = "data",use.scale = FALSE, use.counts = FALSE)$RNA

#}######## CAR data 
avg.combined.cells <- (AverageExpression(combined, verbose = FALSE)$RNA) 
avg.combined.cells$gene <- rownames(avg.combined.cells)

CAR_FP <- FeaturePlot(combined, features = c('Cyp2b10','Nr1i3'), reduction = "umap", order = TRUE,split.by = "stim", blend = TRUE,sort.cell = TRUE, max.cutoff = 1, min.cutoff = 0, pt.size = 0.5, repel = TRUE)
CAR_DOT_NR <- DotPlot(combined, features = 'Nr1i3', col.min = 0)

Cyp2b10_FP <- FeaturePlot(combined, features = 'Cyp2b10', reduction = "umap", min.cutoff = 0)
########### tSNE #################################
combined <- NormalizeData(object = combined)
combined <- FindVariableFeatures(combined, selection.method = "vst", nfeatures = 2000)
###### I used these for merged cells ####

G172_TPM_count  <- ref.integrated.2
G172_TPM_count  <- NormalizeData(G172_TPM_count,assay = "RNA", normalization.method = "RC", scale.factor = 1e6)


G172_TPM_count $celltype.stim <- paste(Idents(G172_TPM_count ), G172_TPM_count $stim, sep = "_")
G172_TPM_count $celltype <- Idents(G172_TPM_count )
Idents(G172_TPM_count ) <- "celltype.stim"
G172_TPM_count <- RenameCells(G172_TPM_count, new.names = paste0(colnames(G172_TPM_count),"-",G172_TPM_count$celltype.stim))


KO.cells <- subset(G172_TPM_count, idents = c("0","1","2","3","4","5","6","7"))
Idents(KO.cells) <- "stim"
colnames(KO.cells )
colnames(KO.cells) <- lapply(colnames(KO.cells), function(x) paste0(KO.cells$stim,'_',x))

### to avergae out the matrix from KO cells 
raw.data.0 <- as.matrix(GetAssayData(G172_TPM_count, slot = c("counts","data"))[, WhichCells(G172_TPM_count, ident = 0)])
raw.data.1 <- as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 1)])
raw.data.2 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 2)])
raw.data.3 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 3)])
raw.data.4 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 4)])
raw.data.5 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 5)])
raw.data.6 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 6)])
raw.data.7 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 7)])
raw.data.8 <-as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 8)])


TPMcount0<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '0_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '0_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '0_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '0_MergedM2')]))



TPMcount1<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '1_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '1_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '1_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '1_MergedM2')]))

TPMcount2<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '2_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '2_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '2_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '2_MergedM2')]))

TPMcount3<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '3_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '3_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '3_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '3_MergedM2')]))


TPMcount4<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '4_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '4_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '4_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '4_MergedM2')]))

TPMcount5<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '5_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '5_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '5_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '5_MergedM2')]))


TPMcount6<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '6_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '6_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '6_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '6_MergedM2')]))

TPMcount7<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '7_MergedM1')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '7_MergedM1')]),as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = '7_MergedM2')]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = '7_MergedM2')]))


TPMcountBottom <- cbind(as.matrix(GetAssayData(G172.M1, slot = "counts")), as.matrix(GetAssayData(G172.M1, slot = "data"))) 
write.csv(TPMcountBottom, "CountResult/counts_TPMcountBottom")

TPMcountTop <- cbind(as.matrix(GetAssayData(G172.M1, slot = "counts")), as.matrix(GetAssayData(G172.M1, slot = "data"))) 
write.csv(TPMcountTop, "CountResult/counts_TPMcountTop")

TPMcountTopM2 <- cbind(as.matrix(GetAssayData(G172.M2, slot = "counts")), as.matrix(GetAssayData(G172.M2, slot = "data"))) 
write.csv(TPMcountTopM2, "CountResult/counts_TPMcountTopG172M2")


TPMcountG172M1 <- cbind(as.matrix(GetAssayData(G172.M1, slot = "counts")), as.matrix(GetAssayData(G172.M1, slot = "data"))) 
write.csv(TPMcountG172M1, "CountResult/counts_TPMcountG172M1_Full")

TPMcountG172M2 <-  as.matrix(GetAssayData(G172.M2, slot = "data")) 
write.csv(TPMcountG172M1, "CountResult/counts_TPMcountG172M1_Full")

TPMcountG172M1_merge <-  as.matrix(GetAssayData(G172.M1.merge, slot = "data")) 
write.csv(TPMcountG172M1_merge_avg,"CountResult/PMcountG172M1_merge_avg")


TPMcountG172M2_merge <-  as.matrix(GetAssayData(G172.M2.merge, slot = "data")) 
write.csv(TPMcountG172M2_merge_avg, "CountResult/TPMcountG172M2_merge_avg")

TPMcount1<- cbind(as.matrix(GetAssayData(G172_TPM_count, slot = "counts")[, WhichCells(G172_TPM_count, ident = 1)]), as.matrix(GetAssayData(G172_TPM_count, slot = "data")[, WhichCells(G172_TPM_count, ident = 1)]))

TPMcount2<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 2)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 2)]))

TPMcount3<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 3)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 3)]))

TPMcount4<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 4)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 4)]))

TPMcount5<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 5)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 5)]))

TPMcount6<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 6)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 6)]))

TPMcount7<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 7)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 7)]))

TPMcount8<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 8)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 8)]))

TPMcount9<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 9)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 9)]))

TPMcount10<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 10)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 10)]))

TPMcount11<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 11)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 11)]))

TPMcount12<- cbind(as.matrix(GetAssayData(combined, slot = "counts")[, WhichCells(combined, ident = 12)]), as.matrix(GetAssayData(combined, slot = "data")[, WhichCells(combined, ident = 12)]))




write.csv(TPMcount0, "CountResult/counts_TPMcount0.csv")
write.csv(TPMcount1, "CountResult/counts_TPMcount1.csv")
write.csv(TPMcount2, "CountResult/counts_TPMcount2.csv")
write.csv(TPMcount3, "CountResult/counts_TPMcount3.csv")
write.csv(TPMcount4, "CountResult/counts_TPMcount4.csv")
write.csv(TPMcount5, "CountResult/counts_TPMcount5.csv")
write.csv(TPMcount6, "CountResult/counts_TPMcount6.csv")
write.csv(TPMcount7, "CountResult/counts_TPMcount7.csv")
write.csv(TPMcount8, "CountResult/counts.TPMcount8.csv")
write.csv(TPMcount9, "CountResult/counts.TPMcount9.csv")
write.csv(TPMcount10, "CountResult/counts.TPMcount10.csv")
write.csv(TPMcount11, "CountResult/counts.TPMcount11.csv")
write.csv(TPMcount12, "CountResult/counts.TPMcount12.csv")



#avg.KO.cells <- log1p(AverageExpression(KO.cells, verbose = FALSE)$RNA)  #original code log transformed
avg.KO.cells <- (AverageExpression(KO.cells, verbose = FALSE)$RNA) 
avg.KO.cells$gene <- rownames(avg.KO.cells)

genes.to.label= ("ncRNA-inter-chr7-5998")
#genes.to.label = c("ISG15", "LY6E", "IFI6", "ISG20", "MX1", "IFIT2", "IFIT1", "CXCL10", "CCL8")
p1 <- ggplot(avg.KO.cells, aes(CTRL, STIM)) + geom_point() + ggtitle("CD4 Naive T Cells")
p1 <- LabelPoints(plot = p1, points = genes.to.label, repel = TRUE)
p2 <- ggplot(avg.cd14.mono, aes(CTRL, STIM)) + geom_point() + ggtitle("CD14 Monocytes")
p2 <- LabelPoints(plot = p2, points = genes.to.label, repel = TRUE)
plot_grid(p1, p2)
KO.cells <- RunUMAP(KO.cells, reduction = "pca", dims = 1:20 )
KO.cells <- FindNeighbors(KO.cells, reduction = "pca", dims = 1:20)
KO.cells <- FindClusters(KO.cells, resolution = 0.5 )   
KO.cells <- RunTSNE(KO.cells, reduction = "pca", dims = 1:20)
 

Hep.cells <- RunUMAP(Hep.cells, reduction = "pca", dims = 1:20 )
Hep.cells <- FindNeighbors(Hep.cells, reduction = "pca", dims = 1:20)
Hep.cells <- FindClusters(Hep.cells, resolution = 0.5 )   
Hep.cells <- RunTSNE(Hep.cells, reduction = "pca", dims = 1:20)
 

   
 # Visualization
p1 <- UMAPPlot(KO.cells, reduction = "umap", group.by = "stim")
p2 <- UMAPPlot(KO.cells, reduction = "umap", group.by = "mouse.sex")
p3 <- UMAPPlot(KO.cells, reduction = "umap", label = TRUE)
p4 <- UMAPPlot(KO.cells, label=TRUE)
plot_grid(p1,p4) 
DimPlot(KO.cells, reduction = "umap", split.by = "stim")   


#hepatocyte cells

p5 <- UMAPPlot(Hep.cells, reduction = "umap", group.by = "stim")
p6 <- UMAPPlot(Hep.cells, reduction = "umap", group.by = "mouse.sex")
p7 <- UMAPPlot(Hep.cells, reduction = "umap", label = TRUE)
p8 <- UMAPPlot(Hep.cells, label=TRUE)
plot_grid(p5,p8) 
DimPlot(KO.cells, reduction = "umap", split.by = "stim")   


raw.data.KO.0 <- as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 0)])
raw.data.KO.1 <- as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 1)])
raw.data.KO.2 <-as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 2)])
raw.data.KO.3 <-as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 3)])
raw.data.KO.4 <-as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 4)])
raw.data.KO.5 <-as.matrix(GetAssayData(KO.cells, slot = "counts")[, WhichCells(KO.cells, ident = 5)])


write.csv(raw.data.KO.0, "CountResult/Markers/raw.data.KO.0")
write.csv(raw.data.KO.1, "CountResult/Markers/raw.data.KO.1")
write.csv(raw.data.KO.2, "CountResult/Markers/raw.data.KO.2")
write.csv(raw.data.KO.3, "CountResult/Markers/raw.data.KO.3")
write.csv(raw.data.KO.4, "CountResult/Markers/raw.data.KO.4")
write.csv(raw.data.KO.5, "CountResult/Markers/raw.data.KO.5")



f1 <- FeaturePlot(KO.cells, features = c('ncRNA-inter-chr7-5998'),  reduction = "umap", split.by = "stim")
plot_grid(f1,p1,p4) 

DefaultAssay(KO.cells) <- "RNA"
KO.cells <- NormalizeData(KO.cells, verbose = FALSE)

plots <- VlnPlot(KO.cells, features = c("Alb", "ncRNA-inter-chr7-5998","Cyp2b10","Cyp2e1","Cyp2f2"), split.by = "stim", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
CombinePlots(plots = plots, ncol = 1)

Three_five_six <- subset(KO.cells, idents = c("5","6"))

Three_five_six <- RunUMAP(Three_five_six, reduction = "pca", dims = 1:20 )
Three_five_six <- FindNeighbors(Three_five_six, reduction = "pca", dims = 1:20)
Three_five_six <- FindClusters(Three_five_six, resolution = 1 )   
Three_five_six <- RunTSNE(Three_five_six, reduction = "pca", dims = 1:20)

p1 <- UMAPPlot(Three_five_six, reduction = "umap", group.by = "stim")
p2 <- UMAPPlot(Three_five_six, reduction = "umap", group.by = "mouse.sex")
p3 <- UMAPPlot(Three_five_six, reduction = "umap", label = TRUE)
p4 <- UMAPPlot(Three_five_six, label=TRUE)
plot_grid(p1,p4) 
DimPlot(Three_five_six, reduction = "umap", split.by = "stim")   

f1 <- FeaturePlot(Three_five_six, features = c('ncRNA-inter-chr7-5998'),  reduction = "umap", split.by = "stim")


lnc5998 <- subset(combined, cells = lnc5998.cells, idents = "1")

lnc5998 <- RunUMAP(lnc5998, reduction = "pca", dims = 1:20 )
lnc5998 <- FindNeighbors(lnc5998, reduction = "pca", dims = 1:20)
lnc5998 <- FindClusters(lnc5998, resolution = 1 )   
lnc5998 <- RunTSNE(lnc5998, reduction = "pca", dims = 1:20)
    
 # Visualization
p1 <- UMAPPlot(lnc5998, reduction = "umap", group.by = "stim")
p2 <- UMAPPlot(lnc5998, reduction = "umap", group.by = "mouse.sex")
p3 <- UMAPPlot(lnc5998, reduction = "umap", label = TRUE)
p4 <- UMAPPlot(lnc5998, label=TRUE)
plot_grid(p1,p4) 
DimPlot(lnc5998, reduction = "umap", split.by = "stim")   

lnc5998.cells <- WhichCells(object = combined, expression = "ncRNA-inter-chr7-5998" > 1)
FeaturePlot(lnc5998, features = c("ncRNA-inter-chr7-5998"), split.by = "stim",  
+             cols = c("grey", "red"), cells = lnc5998.cells,min.cutoff = 0.5)


DefaultAssay(lnc5998) <- "RNA"
lnc5998 <- NormalizeData(lnc5998, verbose = FALSE)

plots <- VlnPlot(lnc5998, features = c("Alb", "ncRNA-inter-chr7-5998","Cyp2b10","Cyp2e1","Cyp2f2"), split.by = "stim", group.by = "seurat_clusters", pt.size = 0, combine = FALSE)
CombinePlots(plots = plots, ncol = 1)

 
d <- dist(t(GetAssayData(KO.cells, slot = "scale.data")))
# Run the MDS procedure, k determines the number of dimensions
mds <- cmdscale(d = d, k = 2)
# cmdscale returns the cell embeddings, we first label the columns to ensure downstream
# consistency
colnames(mds) <- paste0("MDS_", 1:2)
# We will now store this as a custom dimensional reduction called 'mds'
KO.cells[["mds"]] <- CreateDimReducObject(embeddings = mds, key = "MDS_", assay = DefaultAssay(KO.cells))

# We can now use this as you would any other dimensional reduction in all downstream functions
DimPlot(KO.cells, reduction = "mds", pt.size = 0.5)

Find differential markers

KO.cells$celltype.stim <- paste(Idents(KO.cells), KO.cells$stim, sep = "_")
KO.cells$celltype <- Idents(KO.cells)
Idents(KO.cells) <- "celltype.stim"
response3 <- FindMarkers(KO.cells, ident.1 = c("1_G171B","0_G171B","2_G171B"), ident.2 = c("1_G171C", "0_G171C","2_G171C"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(response3, n = 15)


#DE1: Compare cluster 0+1+12 (that expressed lnc5998) with Other hepatocyte clusters (2+5+8)
#DE2: compare cluster 1 (showed major effects in the KD) vs Cluster 0 (that showed little KD)
#DE3: For KO.cells that formed five subcluster, compare clusters 3+4+5+1 vs 2+0
#DE4: for KO.cells that formed five clusters. Comapre cluster 4 vs. 2

DE0112.258 <- FindMarkers(combined, ident.1 = c("0","1","12" ), ident.2 = c("2","5","8"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE0112.All <- FindMarkers(combined, ident.1 = c("0","1","12" ), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE1.2 <- FindMarkers(combined, ident.1 = c("1" ), ident.2 = c("2"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE1.5 <- FindMarkers(combined, ident.1 = c("1" ), ident.2 = c("5"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE1.8 <- FindMarkers(combined, ident.1 = c("1" ), ident.2 = c("8"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)


DE2.5 <- FindMarkers(combined, ident.1 = c("2" ), ident.2 = c("5"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE2.8 <- FindMarkers(combined, ident.1 = c("2" ), ident.2 = c("8"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DE5.8 <- FindMarkers(combined, ident.1 = c("5" ), ident.2 = c("8"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)


DEK4351.20 <- FindMarkers(KO.cells, ident.1 = c("3","4","5","1" ), ident.2 = c("2","0"),verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)

DEK4.3 <- FindMarkers(KO.cells, ident.1 = "4", ident.2 = "3",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK4.2 <- FindMarkers(KO.cells, ident.1 = "4", ident.2 = "2",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK4.0 <- FindMarkers(KO.cells, ident.1 = "4", ident.2 = "0",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK4.1 <- FindMarkers(KO.cells, ident.1 = "4", ident.2 = "1",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK4.5 <- FindMarkers(KO.cells, ident.1 = "4", ident.2 = "5",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)



##### comaprison between G171B vs G171C for KO.cell clusters of 0+1+12 ######33

DEK4_C.B <- FindMarkers(KO.cells, ident.1 = "4_G171C", ident.2 = "4_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK3_C.B <- FindMarkers(KO.cells, ident.1 = "3_G171C", ident.2 = "3_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK1_C.B <- FindMarkers(KO.cells, ident.1 = "1_G171C", ident.2 = "1_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK2_C.B <- FindMarkers(KO.cells, ident.1 = "2_G171C", ident.2 = "2_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK0_C.B <- FindMarkers(KO.cells, ident.1 = "0_G171C", ident.2 = "0_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
DEK5_C.B <- FindMarkers(KO.cells, ident.1 = "5_G171C", ident.2 = "5_G171B",verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)


################################### Write the results #########################
write.csv(DE0112.258, "CountResult/Markers/DE0112.258")
write.csv(DE0112.All, "CountResult/Markers/DE0112.All")
write.csv(DE1.2, "CountResult/Markers/DE1.2")
write.csv(DE1.5, "CountResult/Markers/DE1.5")
write.csv(DE1.8, "CountResult/Markers/DE1.8")
write.csv(DE2.5, "CountResult/Markers/DE2.5")
write.csv(DE2.8, "CountResult/Markers/DE2.8")
write.csv(DE5.8, "CountResult/Markers/DE5.8")

write.csv(DEK4351.20, "CountResult/Markers/DEK4351.20")
write.csv(DEK4.3, "CountResult/Markers/DEK4.3")
write.csv(DEK4.2, "CountResult/Markers/DEK4.2")
write.csv(DEK4.0, "CountResult/Markers/DEK4.0")
write.csv(DEK4.1, "CountResult/Markers/DEK4.1")
write.csv(DEK4.5, "CountResult/Markers/DEK4.5")


write.csv(DEK4_C.B, "CountResult/Markers/DEK4_C.B")
write.csv(DEK3_C.B, "CountResult/Markers/DEK3_C.B")
write.csv(DEK1_C.B, "CountResult/Markers/DEK1_C.B")
write.csv(DEK2_C.B, "CountResult/Markers/DEK2_C.B")
write.csv(DEK0_C.B, "CountResult/Markers/DEK0_C.B")
write.csv(DEK5_C.B, "CountResult/Markers/DEK5_C.B")




combined$celltype.stim <- paste(Idents(combined), combined$stim, sep = "_")
combined$celltype <- Idents(combined)
Idents(combined) <- "celltype.stim"


test.combined$celltype.stim <- paste(Idents(test.combined), test.combined$stim, sep = "_")
test.combined$celltype <- Idents(test.combined)
Idents(test.combined) <- "celltype.stim"




Combined_G171B_vs_G171C <- FindMarkers(combined, ident.1 = c("0_G171B","1_G171B","2_G171B","3_G171B","4_G171B","5_G171B","6_G171B","7_G171B","8_G171B","9_G171B","10_G171B","11_G171B","12_G171B" ), ident.2 = c("0_G171C","1_G171C","2_G171C","3_G171C","4_G171C","5_G171C","6_G171C","7_G171C","8_G171C","9_G171C","10_G171C","11_G171C","12_G171C" ), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)


Combined_G171C_vs_G171B_Clust1 <- FindMarkers(combined, ident.1 = c("1_G171C"), ident.2 = c("1_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust0 <- FindMarkers(combined, ident.1 = c("0_G171C"), ident.2 = c("0_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust12 <- FindMarkers(combined, ident.1 = c("12_G171C"), ident.2 = c("12_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust2 <- FindMarkers(combined, ident.1 = c("2_G171C"), ident.2 = c("2_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust5 <- FindMarkers(combined, ident.1 = c("5_G171C"), ident.2 = c("5_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust8 <- FindMarkers(combined, ident.1 = c("8_G171C"), ident.2 = c("8_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)


Combined_G171C_vs_G171B_Clust3 <- FindMarkers(combined, ident.1 = c("3_G171C"), ident.2 = c("3_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust4 <- FindMarkers(combined, ident.1 = c("4_G171C"), ident.2 = c("4_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust6 <- FindMarkers(combined, ident.1 = c("6_G171C"), ident.2 = c("6_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust7 <- FindMarkers(combined, ident.1 = c("7_G171C"), ident.2 = c("7_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust9 <- FindMarkers(combined, ident.1 = c("9_G171C"), ident.2 = c("9_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust10 <- FindMarkers(combined, ident.1 = c("10_G171C"), ident.2 = c("10_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)
Combined_G171C_vs_G171B_Clust11 <- FindMarkers(combined, ident.1 = c("11_G171C"), ident.2 = c("11_G171B"), verbose = TRUE, logfc.threshold = FALSE,min.pct = FALSE)





write.csv(Combined_G171C_vs_G171B_Clust1, "CountResult/Markers/Combined_G171C_vs_G171B_Clust1")
write.csv(Combined_G171C_vs_G171B_Clust0, "CountResult/Markers/Combined_G171C_vs_G171B_Clust0")
write.csv(Combined_G171C_vs_G171B_Clust12, "CountResult/Markers/Combined_G171C_vs_G171B_Clust12")
write.csv(Combined_G171C_vs_G171B_Clust2, "CountResult/Markers/Combined_G171C_vs_G171B_Clust2")
write.csv(Combined_G171C_vs_G171B_Clust5, "CountResult/Markers/Combined_G171C_vs_G171B_Clust5")
write.csv(Combined_G171C_vs_G171B_Clust8, "CountResult/Markers/Combined_G171C_vs_G171B_Clust8")

write.csv(Combined_G171C_vs_G171B_Clust3, "CountResult/Markers/Combined_G171C_vs_G171B_Clust3")
write.csv(Combined_G171C_vs_G171B_Clust4, "CountResult/Markers/Combined_G171C_vs_G171B_Clust4")
write.csv(Combined_G171C_vs_G171B_Clust6, "CountResult/Markers/Combined_G171C_vs_G171B_Clust6")
write.csv(Combined_G171C_vs_G171B_Clust7, "CountResult/Markers/Combined_G171C_vs_G171B_Clust7")
write.csv(Combined_G171C_vs_G171B_Clust9, "CountResult/Markers/Combined_G171C_vs_G171B_Clust9")
write.csv(Combined_G171C_vs_G171B_Clust10, "CountResult/Markers/Combined_G171C_vs_G171B_Clust10")
write.csv(Combined_G171C_vs_G171B_Clust11, "CountResult/Markers/Combined_G171C_vs_G171B_Clust11")





PC_vs_PP_G171B <- FindMarkers(KO.cells, ident.1 = c("4_G171B","3_G171B"), ident.2 = c("0_G171B","2_G171B"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(PC_vs_PP_G171B, n = 15)


PC_vs_PP_G171C <- FindMarkers(KO.cells, ident.1 = c("4_G171C","3_G171C"), ident.2 = c("0_G171C","2_G171C"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(PC_vs_PP_G171C, n = 15)


PC_vs_PP_G171BC <- FindMarkers(KO.cells, ident.1 = c("4_G171B","3_G171B","4_G171C","3_G171C"), ident.2 = c("0_G171B","2_G171B","0_G171C","2_G171C"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(PC_vs_PP_G171C, n = 15)


lnc5998_KO_DE_1 <- FindMarkers(KO.cells, ident.1 = c("4_G171B","3_G171B","5_G171B"), ident.2 = c("4_G171C","3_G171C","5_G171C"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(lnc5998_KO_DE, n = 15)


lnc5998_KO_DE_2 <- FindMarkers(KO.cells, ident.1 = c("4_G171C","3_G171C","5_G171C"), ident.2 =c("4_G171B","3_G171B","5_G171B") , verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(lnc5998_KO_DE, n = 15)

cell.type.genes <- (PC_vs_PP_G171BC[1]) # Takes all the unique cell type specific genes
GOterms = topGOterms(fg.genes = cell.type.genes, bg.genes = rownames(KO.cells@assays$RNA@dataKO.cells@assays$RNA@data), organism = "Mouse")

cell.type.genes <- (PC_vs_PP_G171BC[1]) # Takes all the unique cell type specific genes
GOterms = topGOterms(fg.genes = rownames(cell.type.genes), bg.genes = rownames(KO.cells@assays$RNA@data), organism = "Mouse")
 

AvergeExpression2 <- function (object, assays = NULL, features = NULL, return.seurat = FALSE, 
          add.ident = NULL, slot = "data", use.scale = FALSE, use.counts = FALSE, 
          verbose = TRUE, ...) 
{
    
    fxn.average <- switch(EXPR = slot, data = function(x) {
        return(mean(x = x))
    }, mean)
    object.assays <- FilterObjects(object = object, classes.keep = "Assay")
    assays <- assays %||% object.assays
    ident.orig <- Idents(object = object)
    orig.levels <- levels(x = Idents(object = object))
    ident.new <- c()
    if (!all(assays %in% object.assays)) {
        assays <- assays[assays %in% object.assays]
        if (length(assays) == 0) {
            stop("None of the requested assays are present in the object")
        }
        else {
            warning("Requested assays that do not exist in object. Proceeding with existing assays only.")
        }
    }
    if (!is.null(x = add.ident)) {
        new.data <- FetchData(object = object, vars = add.ident)
        new.ident <- paste(Idents(object)[rownames(x = new.data)], 
                           new.data[, 1], sep = "_")
        Idents(object, cells = rownames(new.data)) <- new.ident
    }
    data.return <- list()
    for (i in 1:length(x = assays)) {
        data.use <- GetAssayData(object = object, assay = assays[i], 
                                 slot = slot)
        features.assay <- features
        if (length(x = intersect(x = features, y = rownames(x = data.use))) < 
            1) {
            features.assay <- rownames(x = data.use)
        }
        data.all <- data.frame(row.names = features.assay)
        for (j in levels(x = Idents(object))) {
            temp.cells <- WhichCells(object = object, idents = j)
            features.assay <- unique(x = intersect(x = features.assay, 
                                                   y = rownames(x = data.use)))
            if (length(x = temp.cells) == 1) {
                data.temp <- (data.use[features.assay, temp.cells])
                if (slot == "data") {
                    data.temp <-  data.temp
                }
            }
            if (length(x = temp.cells) > 1) {
                data.temp <- apply(X = data.use[features.assay, 
                                                temp.cells, drop = FALSE], MARGIN = 1, FUN = fxn.average)
            }
            data.all <- cbind(data.all, data.temp)
            colnames(x = data.all)[ncol(x = data.all)] <- j
            if (verbose) {
                message(paste("Finished averaging", assays[i], 
                              "for cluster", j))
            }
            if (i == 1) {
                ident.new <- c(ident.new, as.character(x = ident.orig[temp.cells[1]]))
            }
        }
        names(x = ident.new) <- levels(x = Idents(object))
        data.return[[i]] <- data.all
        names(x = data.return)[i] <- assays[[i]]
    }
    if (return.seurat) {
        toRet <- CreateSeuratObject(counts = data.return[[1]], 
                                    project = "Average", assay = names(x = data.return)[1], 
                                    ...)
        if (length(x = data.return) > 1) {
            for (i in 2:length(x = data.return)) {
                toRet[[names(x = data.return)[i]]] <- CreateAssayObject(counts = data.return[[i]])
            }
        }
        if (DefaultAssay(object = object) %in% names(x = data.return)) {
            DefaultAssay(object = toRet) <- DefaultAssay(object = object)
        }
        Idents(toRet, cells = colnames(x = toRet)) <- ident.new[colnames(x = toRet)]
        Idents(object = toRet) <- factor(x = Idents(object = toRet), 
                                         levels = as.character(x = orig.levels), ordered = TRUE)
        toRet <- NormalizeData(object = toRet, verbose = verbose)
        toRet <- ScaleData(object = toRet, verbose = verbose)
        return(toRet)
    }
    else {
        return(data.return)
    }
}

Find differential expression markers

combined.markers <- FindAllMarkers(object = combined, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)
combined.markers %>% group_by(cluster) %>% top_n(2, avg_logFC)

KO.markers <- FindAllMarkers(object = KO.cells, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

response3 <- FindMarkers(combined, ident.1 = c("1_G171B","0_G171B","2_G171B"), ident.2 = c("1_G171C", "0_G171C","2_G171C"), verbose = TRUE, test.use = "MAST", logfc.threshold = FALSE,min.pct = FALSE)
head(response3, n = 15)

Visualize top genes in principal components

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = tiss1)

Choose the number of principal components to use.

# Set number of principal components. 
n.pcs = 10

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale. Higher resolution will give more clusters, lower resolution will give fewer.

For the top-level clustering, aim to under-cluster instead of over-cluster. It will be easy to subset groups and further analyze them below.

# Set resolution 
res.used <- 4
tiss1 <- FindClusters(object = tiss1, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE, force.recalc = TRUE)

We use TSNE solely to visualize the data.

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
tiss1 <- RunTSNE(object = tiss1, dims.use = 1:n.pcs, seed.use = 10, perplexity=30)
TSNEPlot(object = tiss1, do.label = T, pt.size = 1.2, label.size = 4)

Compare to previous annotations

previous_annotation = read.csv("/Users/kkarri/Documents/Lab/Single_cell_project/dropseq/Liver_droplet_annotation.csv", stringsAsFactors = FALSE)
cols = c('free_annotation', 'cell_ontology_class')
    for (col in cols){
      previous_col = paste0('previous_', col)
      tiss1@meta.data[, previous_col] <- "NA"
      tiss1@meta.data[as.character(previous_annotation$X), previous_col] <- previous_annotation[, col]
      print(table(tiss1@meta.data[, previous_col]))
      print(table(tiss1@meta.data[, previous_col], tiss@ident))
      
    }
    
tiss1 = compare_previous_annotation(tiss1, tissue_of_interest, "droplet")
TSNEPlot(object = tiss1, do.return = TRUE, group.by = "previous_cell_ontology_class")
table(tiss1@meta.data[, "previous_cell_ontology_class"], tiss@ident)
tiss1 = compare_previous_annotation(tiss1, tissue_of_interest, "droplet")
TSNEPlot(object = tiss1, do.return = TRUE, group.by = "previous_cell_ontology_class")
table(tiss1@meta.data[, "previous_cell_ontology_class"], tiss1@ident)
TSNEPlot(tiss1, group.by="mouse.sex")
TSNEPlot(tiss1, group.by="mouse.id")

Significant genes:

hepatocyte: Alb, Ttr, Apoa1, and Serpina1c pericentral: Cyp2e1, Glul, Oat, Gulo midlobular: Ass1, Hamp, Gstp1, Ubb periportal: Cyp2f2, Pck1, Hal, Cdh1

endothelial cells: Pecam1, Nrp1, Kdr+ and Oit3+ Kuppfer cells: Emr1, Clec4f, Cd68, Irf7 NK/NKT cells: Zap70, Il2rb, Nkg7, Cxcr6, Klr1c, Gzma B cells: Cd79a, Cd79b, Cd74 and Cd19 Immune cells: Ptprc

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest. The radius shows you the percent of cells in that cluster with at least one read sequenced from that gene. The color level indicates the average Z-score of gene expression for cells in that cluster, where the scaling is done over taken over all cells in the sample.

We have various immune cell types in the last cluster

Using the markers above, we can confidentaly label many of the clusters:

19: endothelial cells 20: bile duct epithelial cells 21: immune cells rest are hepatocytes

We will add those cell_ontology_classes to the dataset.

tiss1 <- StashIdent(object = tiss1, save.name = "cluster.ids")
cluster.ids <- c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
free_annotation <- c(
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  NA,
  "bile duct epithelial cells",
  "endothelial cell of hepatic sinusoid",
  NA
  )
cell_ontology_class <- c(
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "hepatocyte",
  "duct epithelial cell",
  "endothelial cell of hepatic sinusoid",
  "hepatocyte")
tiss1 = stash_annotations(tiss1, cluster.ids, free_annotation, cell_ontology_class)

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = tiss1, do.return = TRUE, group.by = "channel")
TSNEPlot(object = tiss1, do.return = TRUE, group.by = "free_annotation")

Subcluster

Let’s drill down on the hepatocytes.

subtiss1 = SubsetData(tiss1, ident.use = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20))
subtiss1 <- subtiss1 %>% ScaleData() %>%
  FindVariableGenes(do.plot = FALSE, x.high.cutoff = Inf, y.cutoff = 0.5) %>%
  RunPCA(do.print = FALSE)
PCHeatmap(object = subtiss1, pc.use = 1:3, cells.use = 20, do.balanced = TRUE, label.columns = FALSE, num.genes = 8)
PCElbowPlot(subtiss1)
sub.n.pcs = 8
sub.res.use = 0.5
subtiss1 <- subtiss1 %>% FindClusters(reduction.type = "pca", dims.use = 1:sub.n.pcs,
    resolution = sub.res.use, print.output = 0, save.SNN = TRUE, force.recalc = TRUE) %>%
    RunTSNE(dims.use = 1:sub.n.pcs, seed.use = 10, perplexity=8)
TSNEPlot(object = subtiss1, do.label = T, pt.size = 1, label.size = 4)
BuildClusterTree(subtiss1)

From these genes, it appears that the clusters represent:

0: midlobular male 1: pericentral female 2: periportal female 3: periportal male 4: midlobular male 5: pericentral male 6: midlobular female 7: midlobular female

The multitude of clusters of each type correspond mostly to individual animals/sexes.

table(FetchData(subtiss1, c('mouse.sex','ident')) %>% droplevels())
sub.cluster.ids <- c(0, 1, 2, 3, 4, 5, 6, 7)
sub.free_annotation <- c("periportal female", "midlobular male", "pericentral female", "periportal male", "midlobular male", "pericentral male", "midlobular female", "midlobular female")
sub.cell_ontology_class <- c("hepatocyte", "hepatocyte", "hepatocyte", "hepatocyte", "hepatocyte", "hepatocyte", "hepatocyte", "hepatocyte")
subtiss1 = stash_annotations(subtiss1, sub.cluster.ids, sub.free_annotation, sub.cell_ontology_class)
tiss1 = stash_subtiss_in_tiss(tiss1, subtiss1)

Liver zonation markers

genes_zones = c('Cyp2e1', 'Glul', 'Oat', 'Gulo',
              'Ass1', 'Hamp', 'Gstp1', 'Ubb',
              'Cyp2f2', 'Pck1', 'Hal', 'Cdh1')

FeaturePlot(subtiss1,c(genes_zones),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)

DotPlot(subtiss1,c(genes_zones), plot.legend = T, col.max = 2.5, do.return = T) + coord_flip()


TSNEPlot(object = subtiss1, do.label = T, pt.size = 1, label.size = 4, group.by="free_annotation")

TSNEPlot(object = tiss1, do.label = T, pt.size = 1, label.size = 4, group.by="free_annotation")

Find cluster markers for lncRNAs


MIN_LOGFOLD_CHANGE = 1 # set to minimum required average log fold change in gene expression.
MIN_PCT_CELLS_EXPR_GENE = 0.1

all.markers = FindAllMarkers(tiss1,
                             min.pct = MIN_PCT_CELLS_EXPR_GENE,
                             logfc.threshold = MIN_LOGFOLD_CHANGE,
                             only.pos = TRUE,
                             test.use="bimod") # likelihood ratio test
lnc_all_markers <- grep(pattern = "^ncRNA", x= rownames(all.markers), value = TRUE)
lnc_all_markers

#[1] "ncRNA_inter_chr10_92081" "ncRNA_intra_chr16_13383" "ncRNA_inter_chr17_13605" "ncRNA_inter_chr14_11815"
#[5] "ncRNA_inter_chr18_14344"

FeaturePlot(subtiss1,c(lnc_all_markers),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)

######################### lncRNA markers- CELL TYPE MARKER ############
markers.hep <- FindMarkers(object = tiss1, ident.1 = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20), ident.2 = c(18,19),only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)
lnc_markers_hep <- grep(pattern = "^ncRNA", x= rownames(markers.hep), value = TRUE)
lnc_markers_hep
FeaturePlot(tiss1,c(lnc_markers_hep),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)
DotPlot(tiss1,lnc_markers_hep, plot.legend = T, col.max = 2.5, do.return = T) + coord_flip()
#[1] "ncRNA_as_chr11_9423"     "ncRNA_as_chr7_6166"      "ncRNA_inter_chr4_3295"   "ncRNA_inter_chr17_14026"
#[5] "ncRNA_inter_chr3_2915"   "ncRNA_inter_chr5_4547"   "ncRNA_inter_chr15_12684"


markers.hep.MAST <- FindMarkers(object = tiss1, ident.1 = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20), ident.2 = c(18,19),only.pos = TRUE, test.use = "MAST")
lnc_markers_hep_MAST_TABLE <- subset(markers.hep.MAST, grepl("^ncRNA", rownames(markers.hep.MAST)))
lnc_markers_hep_MAST <- grep(pattern = "^ncRNA", x= rownames(markers.hep.MAST), value = TRUE)
lnc_markers_hep_MAST



markers.endo <- FindMarkers(object = tiss1, ident.1 = c(18,19),  only.pos = TRUE, min.pct = 0.25, thresh.use = 0.5)
lnc_markers_endo <- grep(pattern = "^ncRNA", x= rownames(markers.endo), value = TRUE)
lnc_markers_endo
FeaturePlot(tiss1,c(lnc_markers_endo),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)
DotPlot(tiss1,lnc_markers_endo, plot.legend = T, col.max = 2.5, do.return = T) + coord_flip()


#"ncRNA_inter_chr15_12770", "ncRNA_inter_chr12_10817", "ncRNA_as_chr13_11451",


markers.endo.MAST <- FindMarkers(object = tiss1, ident.1 = 19, test.use = "MAST" ,only.pos = TRUE)
lnc_markers_endo_MAST_TABLE <- subset(markers.endo.MAST, grepl("^ncRNA", rownames(markers.endo.MAST)))
lnc_markers_endo_MAST <- grep(pattern = "^ncRNA", x= rownames(markers.endo.MAST), value = TRUE)
lnc_markers_endo_MAST


################## lncRNA expression ########################3

# "ncRNA_inter_chr17_13605" , "ncRNA_intra_chr16_13383"

########## Periporal markers- zonation markers ############
markers.pc <- FindMarkers(object = subtiss1, ident.1 = c(2,5), 
                              only.pos = FALSE, min.pct = 0.001, thresh.use = 0.001, test.use = "bimod" )

markers.pc.MAST <- FindMarkers(object = subtiss1, ident.1 = c(2,5), ident.2 = c(0,3), test.use = "MAST" ,only.pos = TRUE)
lnc_markers_pc <- subset(markers.pc, grepl("^ncRNA", rownames(markers.pc)))
lnc_markers_pc <- grep(pattern = "^ncRNA", x= rownames(markers.pc), value = TRUE)
lnc_markers_pc 

markers.pc.MAST <- FindMarkers(object = subtiss1, ident.1 = c(2,5), ident.2 = c(0,3), test.use = "MAST" ,only.pos = TRUE)
lnc_markers_pc_MAST <- subset(markers.pc.MAST, grepl("^ncRNA", rownames(markers.pc.MAST)))
lnc_markers_pc_MAST <- grep(pattern = "^ncRNA", x= rownames(markers.pc.MAST), value = TRUE)
lnc_markers_pc_MAST

DotPlot(tiss1, lnc_markers_pc, plot.legend = T, col.max = 2.5, do.return = T, group.by="free_annotation") + coord_flip()
FeaturePlot(subtiss1,c(lnc_markers_pc),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)


############################### midlobular genes #############

markers.mid <- FindMarkers(object = subtiss1, ident.1 = c(1,4,6,7), 
                              only.pos = FALSE, min.pct = 0.001, thresh.use = 0.05)

lnc_markers_mid <- subset(markers.mid, grepl("^ncRNA", rownames(markers.mid)))
lnc_markers_mid <- grep(pattern = "^ncRNA", x= rownames(markers.mid), value = TRUE)
lnc_markers_mid
DotPlot(tiss1, lnc_markers_mid, plot.legend = T, col.max = 2.5, do.return = T, group.by="free_annotation") + coord_flip()


FeaturePlot(subtiss1,c(lnc_markers_mid),cols.use = c("grey", "red"), pt.size = 1, nCol = 4)



markers.mid.MAST <- FindMarkers(object = subtiss1, ident.1 = c(1,4,6,7),test.use = "MAST",only.pos = TRUE )

lnc_markers_mid_MAST_TABLE <- subset(markers.mid.MAST, grepl("^ncRNA", rownames(markers.mid.MAST)))
lnc_markers_mid_MAST <- grep(pattern = "^ncRNA", x= rownames(markers.mid.MAST), value = TRUE)
lnc_markers_mid_MAST


#####3 periportalmarker genes############3

markers.pp <- FindMarkers(object = subtiss1, ident.1 = c(0,3),
                              only.pos = FALSE, min.pct = 0.001, thresh.use = 0.05)


lnc_markers_pp <- subset(markers.pp, grepl("^ncRNA", rownames(markers.pp)))
lnc_markers_pp <- grep(pattern = "^ncRNA", x= rownames(markers.pp), value = TRUE)
lnc_markers_pp

markers.pp.MAST <- FindMarkers(object = subtiss1, ident.1 = c(0,3), ident.2 = c(2,5),test.use = "MAST",only.pos = TRUE )

lnc_markers_pp_MAST_TABLE <- subset(markers.pp.MAST, grepl("^ncRNA", rownames(markers.pp.MAST)))
lnc_markers_pp_MAST <- grep(pattern = "^ncRNA", x= rownames(markers.pp.MAST), value = TRUE)
lnc_markers_pp_MAST

FeaturePlot(subtiss1,c(lnc_markers_pp),cols.use = c("grey", "red"), pt.size = 1, nCol = 4, max.cutoff = 1)
DotPlot(tiss1, c(lnc_markers_pp,"Cyp2e1","Cyp2f2"), plot.legend = T, col.max = 2.5, do.return = T, group.by= "free_annotation") + coord_flip()


################## amle and female specific ############################

markers.female <- FindMarkers(object = subtiss1, ident.1 = c(0,2,6,7),
                              only.pos = TRUE, min.pct = 0.1, logfc.threshold = 1)

lnc_markers_female <- subset(markers.female, grepl("^ncRNA", rownames(markers.female)))
lnc_markers_female <- grep(pattern = "^ncRNA", x= rownames(markers.female), value = TRUE)
lnc_markers_female

FeaturePlot(subtiss1,c(lnc_markers_female),cols.use = c("grey", "red"), pt.size = 1, nCol = 4, max.cutoff = 1)
DotPlot(tiss1, c(lnc_markers_female,"Cyp2e1","Cyp2f2"), plot.legend = T, col.max = 2.5, do.return = T, group.by= "free_annotation") + coord_flip()



markers.male <- FindMarkers(object = subtiss1, ident.1 = c(1,3,4,5),
                              only.pos = TRUE, min.pct = 0.001, thresh.use = 0.05)

lnc_markers_male <- subset(markers.male, grepl("^ncRNA", rownames(markers.male)))
lnc_markers_male <- grep(pattern = "^ncRNA", x= rownames(markers.male), value = TRUE)
lnc_markers_male

FeaturePlot(subtiss1,c(lnc_markers_male),cols.use = c("grey", "red"), pt.size = 1, nCol = 4, max.cutoff = 1)
DotPlot(tiss1, c(lnc_markers_male,"Cyp2e1","Cyp2f2"), plot.legend = T, col.max = 2.5, do.return = T, group.by= "free_annotation") + coord_flip()


############################ Female zonate specific genes ###################################

markers.pericentral.female <- FindMarkers(object = tiss1, ident.1 = c(6,11,14,20), test.use = "MAST",
                            only.pos = TRUE, min.pct = 0.1, ident.2 = c(2,3,15,12,13,8,5,16), logfc.threshold = 1)

markers.periportal.female <- FindMarkers(object = tiss1, ident.1 = c(2,3,15),
                            only.pos = TRUE, min.pct = 0.1, ident.2 = c(6,11,14,20,12,13,8,5,16), logfc.threshold = 1)


markers.pericentral.male <- FindMarkers(object = tiss1, ident.1 = c(13,12), test.use = "MAST",
                            only.pos = TRUE, min.pct = 0.1, ident.2 = c(2,3,15,8,5,16,6,11,14,20), logfc.threshold = 1)


markers.periportal.male <- FindMarkers(object = tiss1, ident.1 = c(8,5,16), test.use = "MAST",
                            only.pos = TRUE, min.pct = 0.1, ident.2 = c(2,3,15,13,12,6,11,14,20), logfc.threshold = 1)




############### xeno-lncs CAR?RXR ##################

FeaturePlot(tiss1,c("ncRNA_inter_chr15_12684","ncRNA_inter_chr8_7430","ncRNA_inter_chr7_6222"),cols.use = c("grey", "red"), pt.size = 1, nCol = 4, max.cutoff = 1)






#######################################################################

markers.endo.2 <- FindMarkers(object = seurat_drop, logfc.threshold = 2,ident.1 = "Endothelial", 
                              only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

lnc.endo.2 <- grep(pattern = "^ncRNA", x= rownames(markers.endo.2), value = TRUE)
lnc.endo.2

Zonated lncRNAs

pp_zontaed <- c('ncRNA_inter_chr14_12016','ncRNA_as_chr19_15090','ncRNA_inter_chr10_9351','ncRNA_inter_chr16_13170',
'ncRNA_inter_chr3_2697','ncRNA_inter_chr1_274','ncRNA_as_chr6_5518','ncRNA_inter_chr14_12066','ncRNA_intra_chr12_10871',
'ncRNA_inter_chr16_13510','ncRNA_inter_chr3_2314','ncRNA_inter_chr10_9264,'ncRNA_inter_chr9_8122')

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = subtiss1, do.return = TRUE, group.by = "mouse.sex")

Final coloring

Color by cell ontology class on the original TSNE.

TSNEPlot(object = tiss1, do.return = TRUE, group.by = "cell_ontology_class")

Save the Robject for later

filename = here('00_data_ingest', '04_tiss1ue_robj_generated', 
                     paste0("droplet_", tiss1ue_of_interest, "refinedcells_seurat_tiss1.Robj"))
print(filename)
save(tiss1, file=filename)
# To reload a saved object
filename = here('00_data_ingest', '04_tiss1ue_robj_generated',
                      paste0("droplet_", tissue_of_interest, "seurat_smartdrop-integrated-8272019.Robj"))
load(file=filename)

Export the final metadata

save_annotation_csv(tiss1, tiss1ue_of_interest, "droplet")
LS0tCiB0aXRsZTogIkxpdmVyIERyb3BsZXQtIFJhdyBkYXRhIE5vdGVib29rIgogb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgoKYGBge3J9CnRpc3N1ZV9vZl9pbnRlcmVzdCA9ICJMaXZlciIKbGlicmFyeShoZXJlKQpzb3VyY2UoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NjUk5Bc2VxX2RhdGFfaW50ZWdyYXRpb24vYm9pbGVycGxhdGUuUiIpCiN0aXNzID0gbG9hZF90aXNzdWVfZHJvcGxldCh0aXNzdWVfb2ZfaW50ZXJlc3QpCiNsaWJyYXJ5KHNjYXRlcikKbGlicmFyeShkcGx5cikKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoY293cGxvdCkKI2xpYnJhcnkoTUFTVCkKcmVxdWlyZShzdHJpbmdyKQpyZXF1aXJlKHJlc2hhcGUyKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUoTUFTUykKbGlicmFyeSh0b29scykKcmVxdWlyZShkYXRhLnRhYmxlKQpsaWJyYXJ5KGdnZm9ydGlmeSkKbGlicmFyeSh0aWR5dmVyc2UpCnJlcXVpcmUoZHBseXIpCmxpYnJhcnkobWlzY1Rvb2xzKQpsaWJyYXJ5KGNhcmV0KQpsaWJyYXJ5KFJ0c25lKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkocmV0aWN1bGF0ZSkgIyB0byBpbXBvcnQgYW5uZGF0YSB1c2UgbG93IHZlcnNpb24gb2YgZ2NjLzUuNTAgaW4gZW52aXJvZW5tIHNjY2xvdWQuCgpgYGAKCgoKCgpgYGB7cn0KIyBkZW11eCByZXN1bHRzIGZyb20gZGVtdXhFTQojIHNvdXJjZSA6IGh0dHBzOi8vY3VtdWx1cy1kb2MucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2hhc2hpbmdfY2l0ZV9zZXEuaHRtbCNsb2FkLWRlbXVsdGlwbGV4aW5nLXJlc3VsdHMtaW50by1weXRob24tYW5kLXIKYWQxIDwtIGltcG9ydCgicHl0eiciLCBjb252ZXJ0ID0gRkFMU0UpCgphZCA8LSBpbXBvcnQoImFubmRhdGEiLCBjb252ZXJ0ID0gRkFMU0UpCiNkYXRhIDwtIGFkJHJlYWRfaDVhZCgib3V0cHV0X25hbWVfZGVtdXguaDVhZCIpCmRhdGEgPC0gYWQkcmVhZF9oNWFkKCIvcmVzdHJpY3RlZC9wcm9qZWN0bmIvd2F4bWFubGFiL2trYXJyaS9HMTcyX2RlbXV4L0cxNzJfZGVtdXhFTV9jaXRlVU1JX2RlbXV4Lmg1YWQiKQphZHRkYXRhIDwtIGFkJHJlYWRfaDVhZCgiL3Jlc3RyaWN0ZWQvcHJvamVjdG5iL3dheG1hbmxhYi9ra2FycmkvRzE3Ml9kZW11eC9HMTcyX2RlbXV4RU1fY2l0ZVVNSV9BRFRzLmg1YWQiKQpzY2RhdGEgPC0gYWQkcmVhZF9oNWFkKCIvcmVzdHJpY3RlZC9wcm9qZWN0bmIvd2F4bWFubGFiL2trYXJyaS9HMTcyX2RlbXV4L0cxNzJfZGVtdXhFTV9jaXRlVU1JX2RlbXV4Lmg1c2MiKQoKZGF0YSA8LSBhZCRyZWFkX2g1YWQoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NvZnR3YXJlL1hpc3RfQ2hyWS9HMTcyX00yLU00X091dHB1dF9kZW11eC5oNWFkIikKCgojaW1wb3J0IHRoZSBhbm5kYXRhIHByZWRpY3Rpb25zIGZyb20gcHl0aG9uIHRvIFIgYW5kIHRoZW4gdG8gYSBjc3YKcmRhdGFfb2JzIDwtIHB5X3RvX3IoZGF0YSRvYnMpCndyaXRlLnRhYmxlKGFzLmRhdGEuZnJhbWUocmRhdGFfb2JzKSwgIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL0cxNzJfZGVtdXgvcmVzdWx0cy9HMTcyX2RlbXV4X2NsYXNzaWZpY2F0aW9uIikKCndyaXRlLnRhYmxlKGFzLmRhdGEuZnJhbWUocmRhdGFfb2JzKSwgIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NvZnR3YXJlL1hpc3RfQ2hyWS9HMTcyX00yLU00X1hpc3QtY2hyWV9kZW11eF9jbGFzc2lmaWNhdGlvbiIsIHNlcD0iXHQiKQoKYGBgCgpgYGB7cn0KCiNHMTcyLnVtaXMgPC0gUmVhZDEwWCgiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvMTBYX1RDUE9fcHJlbVJOQV9UcmFuc2NyaXB0L291dHMvZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXgiKQoKRzE3Mi51bWlzIDwtIFJlYWQxMFgoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyLzEwWF9UQ1BPX3ByZW1STkFfR2VuZS9vdXRzL2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4IikKCgpuY1JOQSA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeCA9IHJvd25hbWVzKHggPSBHMTcyLnVtaXMpLCB2YWx1ZSA9IFRSVUUpCmxuY1JOQSA8LSBNYXRyaXg6OmNvbFN1bXMoRzE3Mi51bWlzW25jUk5BLCBdPjApCgojRzE3Mi51bWlzLnJhdyA8LSBSZWFkMTBYKCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi8xMFhfVENQT19wcmVtUk5BX1RyYW5zY3JpcHQvb3V0cy9yYXdfZmVhdHVyZV9iY19tYXRyaXgvIikKCkcxNzIuaHRvcyA8LSBSZWFkMTBYKCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9IQVNIX0NpdGVzZXEvSEFTSF9SZXN1bHRzX2ZpbHRlcmVkLTEwWC1CQy91bWlfY291bnQiLCBnZW5lLmNvbHVtbj0xKQoKRzE3Mi5YaXN0LkNoclkgPC0gcmVhZC5jc3YoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NvZnR3YXJlL1hpc3RfQ2hyWS9HMTcyX00yX000X25vbnplcm8uY3N2IiwgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gIlgiKQoKCkcxNzIuaHRvcyA8LSBSZWFkMTBYKCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9IQVNIX0NpdGVzZXEvSEFTSF9SZXN1bHRzX3Jhdy0xMFgtQkMvdW1pX2NvdW50IiwgZ2VuZS5jb2x1bW49MSkKCgpHMTcyLmRlbXV4Lmh0b3MgPC0gUmVhZEg1QUQoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL0cxNzJfZGVtdXgvRzE3Ml9kZW11eEVNX2NpdGVVTUlfQURUcy5oNWFkIikKI0cxNzJ0b3AgPC0gcmVhZC50YWJsZSgiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvRzE3Ml9Ub3BfTTEudHh0IiwgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gImNlbGxiYXJjb2RlIikgIyMjIHRoaXMgaXMgb25seSBmb3IgTTEgdG9wCkcxNzIuaGFzaC5tZXRhZGF0YSA8LSByZWFkLnRhYmxlKCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9Ub3BfQm90dG9tX01ldGFkYXRhLnR4dCIsaGVhZGVyID0gVCwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gImNlbGxiYXJjb2RlIikKCkcxNzIuaGFzaC5tZXRhZGF0YSRjZWxsYmFyY29kZSA8LSByb3duYW1lcyhHMTcyLmhhc2gubWV0YWRhdGEpCgpHMTcydG9wIDwtIEcxNzIuaGFzaC5tZXRhZGF0YVtncmVwKCJUb3AiLEcxNzIuaGFzaC5tZXRhZGF0YSRUb3AuQm90dG9tKSxdCkcxNzIudG9wLk0xIDwtIEcxNzJ0b3BbZ3JlcCgiTTEiLEcxNzJ0b3AkaGFzaC5JRCksXQpHMTcyLnRvcC5NMiA8LSBHMTcydG9wW2dyZXAoIk0yIixHMTcydG9wJGhhc2guSUQpLF0KI0cxNzJib3R0b20gPC0gcmVhZC50YWJsZSgiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvRzE3Ml9Cb3R0b21fTTEudHh0IiwgaGVhZGVyID0gVCwgcm93Lm5hbWVzID0gImNlbGxiYXJjb2RlIikgIyMgdGhpcyBpcyBvbnQgZm9yIE0xIGJvdHRvbQpHMTcyYm90dG9tIDwtIEcxNzIuaGFzaC5tZXRhZGF0YVtncmVwKCJCb3R0b20iLEcxNzIuaGFzaC5tZXRhZGF0YSRUb3AuQm90dG9tKSxdCkcxNzIuYm90dG9tLk0xIDwtIEcxNzJib3R0b21bZ3JlcCgiTTEiLEcxNzJib3R0b20kaGFzaC5JRCksXQpHMTcyLmJvdHRvbS5NMiA8LSBHMTcyYm90dG9tW2dyZXAoIk0yIixHMTcyYm90dG9tJGhhc2guSUQpLF0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQWxsIHByZS1sYWJlbGxlZCBzYW1wbGVzIGZyb20gZGVtdXhFTSBhbmQgSFRvZGVtdXggKFNldXJhdCkgIyMjIyMjIyMjIyMjIyMjIyMjIwpNMV9ib3RoIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00xX2JvdGhfMjY1Ni50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNMl9ib3RoIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00yX2JvdGhfMjg2OC50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNM19ib3RoIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00zX2JvdGhfMjM3Ni50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNNF9ib3RoIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL000X2JvdGhfMjY3OS50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNMV9kZW11eEVNIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00xX2RlbXV4RU1fMTE0OS50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNMl9kZW11eEVNIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00yX2RlbXV4RU1fMzg4MC50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNM19kZW11eEVNIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00zX2RlbXV4RU1fMTI3Ni50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNNF9kZW11eEVNIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL000X2RlbXV4RU1fMTA3Ni50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNMV9IVE9kZW11eCA8LSByZWFkLmNzdigiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9NMV9IVE9kZW11eF84MjcudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKTTJfSFRPZGVtdXggPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTJfSFRPZGVtdXhfMTI1LnR4dCIsIHJvdy5uYW1lcyA9ICJJRCIpCk0zX0hUT2RlbXV4IDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00zX0hUT2RlbXV4XzgyNy50eHQiLCByb3cubmFtZXMgPSAiSUQiKQpNNF9IVE9kZW11eCA8LSByZWFkLmNzdigiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9NNF9IVE9kZW11eF84ODkudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCk0xX2NsZWFuX2JvdGggPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTFfY2xlYW5fYm90aF83ODIudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCk0yX2NsZWFuX2JvdGggPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTJfY2xlYW5fYm90aF85NTAudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCk0zX2NsZWFuX2JvdGggPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTNfY2xlYW5fYm90aF84NTIudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCk00X2NsZWFuX2JvdGggPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTRfY2xlYW5fYm90aF85NjUudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCgoKTTFfYm90aF90b3A4MCA8LSByZWFkLmNzdigiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9NMV9ib3RoX3RvcDgwLnR4dCIsIHJvdy5uYW1lcyA9ICJJRCIpCgpNMl9ib3RoX3RvcDgwIDwtIHJlYWQuY3N2KCIvbmV0L3dheG1hbi1zZXJ2ZXIvbW50L2RhdGEvd2F4bWFubGFidm1faG9tZS9ra2FycmkvRzE3Mi9hbmFseXNpcy9kZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL00yX2JvdGhfdG9wODAudHh0Iiwgcm93Lm5hbWVzID0gIklEIikKCk0zX2JvdGhfdG9wODAgPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcyL2FuYWx5c2lzL2RlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvTTNfYm90aF90b3A4MC50eHQiLCByb3cubmFtZXMgPSAiSUQiKQoKTTRfYm90aF90b3A4MCA8LSByZWFkLmNzdigiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9NNF9ib3RoX3RvcDgwLnR4dCIsIHJvdy5uYW1lcyA9ICJJRCIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAKIyBTZWxlY3QgY2VsbCBiYXJjb2RlcyBkZXRlY3RlZCBieSBib3RoIFJOQSBhbmQgSFRPIEluIHRoZSBleGFtcGxlIGRhdGFzZXRzIHdlIGhhdmUgYWxyZWFkeQojIGZpbHRlcmVkIHRoZSBjZWxscyBmb3IgeW91LCBidXQgcGVyZm9ybSB0aGlzIHN0ZXAgZm9yIGNsYXJpdHkuCmpvaW50LmJjcyA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgY29sbmFtZXMoRzE3Mi5odG9zKSkKam9pbnQuYmNzLnRvcCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoRzE3MnRvcCkpCmpvaW50LmJjcy5ib3R0b20gPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKEcxNzJib3R0b20pKQpqb2ludC5kZW11eCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgY29sbmFtZXMoRzE3Mi4pKQpqb2ludC54aXN0LmNoclkgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIGNvbG5hbWVzKEcxNzIuWGlzdC5DaHJZKSkKCiMgU3Vic2V0IFJOQSBhbmQgSFRPIGNvdW50cyBieSBqb2ludCBjZWxsIGJhcmNvZGVzCmpvaW50X2NpdGUxX2NpdGUyIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLmh0b3MpLCBjb2xuYW1lcyhkZjIpKQpHMTcyLnVtaXMgPC0gRzE3Mi51bWlzWywgam9pbnQuYmNzXQpHMTcyLnVtaXMgPC0gRzE3Mi51bWlzWywgam9pbnQueGlzdC5jaHJZXQoKRzE3Mi5odG9zIDwtIGFzLm1hdHJpeChHMTcyLmh0b3NbLCBqb2ludC5iY3NdKQpHMTcyLmh0b3MgPC0gRzE3Mi5odG9zWy01LF0KRzE3Mi5YaXN0LkNoclkgPC0gYXMubWF0cml4KEcxNzIuWGlzdC5DaHJZWywgam9pbnQueGlzdC5jaHJZXSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBqb2ludCBiYXJjb2RlcyBmb3IgcHJlbG9hZGVkIGJhcmNvZGVzICMjIyMjIyMjIyMjIyMjIyMjIyMKam9pbnQuYmNzLk0xLmJvdGggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE0xX2JvdGgpKQpqb2ludC5iY3MuTTIuYm90aCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTJfYm90aCkpCmpvaW50LmJjcy5NMy5ib3RoIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhNM19ib3RoKSkKam9pbnQuYmNzLk00LmJvdGggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE00X2JvdGgpKQpqb2ludC5iY3MgPC0gYyhqb2ludC5iY3MuTTEuYm90aCwgam9pbnQuYmNzLk0yLmJvdGgsam9pbnQuYmNzLk0zLmJvdGgsam9pbnQuYmNzLk00LmJvdGgpCgpqb2ludC5iY3MuTTEuZGVtdXhFTSA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTFfZGVtdXhFTSkpCmpvaW50LmJjcy5NMi5kZW11eEVNIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhNMl9kZW11eEVNKSkKam9pbnQuYmNzLk0zLmRlbXV4RU0gPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE0zX2RlbXV4RU0pKQpqb2ludC5iY3MuTTQuZGVtdXhFTSA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTRfZGVtdXhFTSkpCgpqb2ludC5iY3MuTTEuSFRPZGVtdXggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE0xX0hUT2RlbXV4KSkKam9pbnQuYmNzLk0yLkhUT2RlbXV4IDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhNMl9IVE9kZW11eCkpCmpvaW50LmJjcy5NMy5IVE9kZW11eCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTNfSFRPZGVtdXgpKQpqb2ludC5iY3MuTTQuSFRPZGVtdXggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE00X0hUT2RlbXV4KSkKCgpqb2ludC5iY3MuTTEudG9wIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhHMTcyLnRvcC5NMSkpCmpvaW50LmJjcy5NMi50b3AgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKEcxNzIudG9wLk0yKSkKam9pbnQuYmNzLk0xLmJvdHRvbSA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoRzE3Mi5ib3R0b20uTTEpKQpqb2ludC5iY3MuTTIuYm90dG9tIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhHMTcyLmJvdHRvbS5NMikpCgoKam9pbnQuYmNzLk0xLmNsZWFuLmJvdGggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE0xX2NsZWFuX2JvdGgpKQpqb2ludC5iY3MuTTIuY2xlYW4uYm90aCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTJfY2xlYW5fYm90aCkpCmpvaW50LmJjcy5NMy5jbGVhbi5ib3RoIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhNM19jbGVhbl9ib3RoKSkKam9pbnQuYmNzLk00LmNsZWFuLmJvdGggPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE00X2NsZWFuX2JvdGgpKQoKCgpqb2ludC5iY3MuTTEuYm90aC50b3A4MCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTFfYm90aF90b3A4MCkpCmpvaW50LmJjcy5NMi5ib3RoLnRvcDgwIDwtIGludGVyc2VjdChjb2xuYW1lcyhHMTcyLnVtaXMpLCByb3duYW1lcyhNMl9ib3RoX3RvcDgwKSkKam9pbnQuYmNzLk0zLmJvdGgudG9wODAgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKEcxNzIudW1pcyksIHJvd25hbWVzKE0zX2JvdGhfdG9wODApKQpqb2ludC5iY3MuTTQuYm90aC50b3A4MCA8LSBpbnRlcnNlY3QoY29sbmFtZXMoRzE3Mi51bWlzKSwgcm93bmFtZXMoTTRfYm90aF90b3A4MCkpCgogICNjb2xuYW1lcyhyYXcuZGF0YSkgPC0gbGFwcGx5KGNvbG5hbWVzKHJhdy5kYXRhKSwgZnVuY3Rpb24oeCkgcGFzdGUwKHRpc3N1ZV9tZXRhZGF0YSRjaGFubmVsWzFdLCdfJyx4KSkKICAKIyBDb25maXJtIHRoYXQgdGhlIEhUTyBoYXZlIHRoZSBjb3JyZWN0IG5hbWVzCnJvd25hbWVzKEcxNzIuaHRvcykKIyMjIyMjIyMjIyMjIyMjIyMjIyMgQmVmb3JlIG1ha2luZyBhIFNldXJhdCBvYmplY3QgcmVtb3ZlIHNleC1iaWFzZWQgZ2VuZXMgb3IgVENQTy1pbmR1Y2VkIGdlbmVzIyMjIyMjIyMjIyMjIyMjIyMjIyMKYGBgCgpgYGB7cn0KIyBSZW1vdmUgRVJDQyBmcm9tIGNvdW50LmRhdGEKI0FsbC5zZXguaW5kZXggPC0gZ3JlcChjKCJBbGJ8Q3lwMmIxMCIpLCB4ID0gcm93bmFtZXMoY291bnQuZGF0YSksIHZhbHVlID0gRkFMU0UpIAp4MSA8LSBncmVwKGMoIjE4MTAwNDZLMDdSaWt8MjcwMDA5N08wOVJpa3xBMWJnfEFiY2IxYXxBYmNjMXxBYmNjNHxBYmNkMnxBYmhkMnxBY25hdDJ8QWNvdDJ8QWNvdDN8QWNvdDR8QWNvdDZ8QWNzczJ8QWNzczN8QWN0ZzF8QWRjeTF8QWRyYjJ8QWlmMXxBa25hfEFrcjFiN3xBa3IxYzE4fEFrcjFjMjB8QWtyMWQxfEFsZGgxYjF8QWxkaDNhMnxBbWlnbzJ8QW5rcmQ1NXxBbnhhNnxBcnxBcmhnYXAzMHxBcmhnZWYxOXxBcmhnZWYzN3xBcmwxM2J8QXJyZGM0fEFzYjJ8QXRmM3xBdHAyYjJ8QXRwNnYwZDJ8QXRwOGExfEIzZ2FsbnQxfEI0MzAzMDZOMDNSaWt8QmF0ZjJ8QmNoZXxCaW4yfEJtcGVyfEM1YXIxfENhYmxlczF8Q2FtazFkfENhbWtrMnxDYnIxfENjYmUxfENjZGMxNDF8Q2NkYzY4fENjaGNyMXxDY2wyfENjbDV8Q2NuZDF8Q2QxNHxDZDE2M3xDZDI3NHxDZDMwMGV8Q2QzNnxDZDNlfENkNDR8Q2Q1MnxDZDUzfENkNzJ8Q2Q3NHxDZDgzfENkY3AxfENka24xY3xDZHg0fENkeWwyfENlbnBtfENlcDE1MnxDZXJzNnxDZXMxYnxDZXMxY3xDZnB8Q2hpYzF8Q2hybmE0fENsZWMxMmF8Q2xpYzN8Q21rbHIxfENtcGsyfENuc3R8Q29yaW58Q3JsczF8Q3NmMXxDdGJwMnxDdGh8Q3RzY3xDdHNzfEN1eDJ8Q3hjbDEwfEN4Y2wxM3xDeGNsOXxDeWJhfEN5YmJ8Q3lwMTdhMXxDeXAyYTIyfEN5cDJhNHxDeXAyYTV8Q3lwMmIxMHxDeXAyYjEzfEN5cDJiOXxDeXAyYzM3fEN5cDJjMzh8Q3lwMmMzOXxDeXAyYzQwfEN5cDJjNTB8Q3lwMmM1NHxDeXAyYzY5fEN5cDJnMXxDeXAzOWExfEN5cDNhMTZ8Q3lwM2E0MWF8Q3lwM2E0MWJ8Q3lwM2E0NHxDeXA0NmExfEN5cDRhMTB8Q3lwNGExNHxDeXA0YTMxfEN5cDRmMTZ8Q3lwN2ExfEQxMzAwNDNLMjJSaWt8RGFwazF8RGN0fERkYWgxfERocnM3fERsZzR8RGxsMXxEbnR0fERvY2sxMHxEb2NrN3xEcXgxfERyYW0xfER1c3A2fEVjaGRjM3xFY2kzfEVpZjJzM3h8RWlmNGUzfEVsZjR8RW1wMnxFbnBwMXxFc3IxfEVzcnJnfEV2Y3xFdmMyfEV2aTJhfEZhYnA3fEZhbTEyNmF8RmFtNDlhfEZhbTg0YnxGYW04OWF8RmFuY2N8RmFyMXxGYnhsMjF8RmNlcjFnfEZnZDJ8RmliaW58RmlnbnxGbW4xfEZtbzF8Rm1vMnxGbW8zfEZtbzR8Rm9scjJ8RnByMXxGcHIyfEZ1dDh8RnlifEc2cGR4fEdhZGQ0NWJ8R2FzMXxHYXM2fEdicDEwfEdicDJ8R2JwM3xHYnA0fEdicDV8R2JwNnxHYnA3fEdicDh8R2ltYXA4fEdtMTE0Mzd8R200ODQxfEdvbHQxYXxHb3QxfEdwcjY1fEdwc20xfEdweDd8R3JpZDF8R3N0bzJ8R3N0dDF8R3N0dDN8R3lwY3xHem1ifEgyLUFhfEgyLUFiMXxIMi1ETWIxfEgyLUViMXxIMi1RMXxIMi1RNHxIMi1UMjR8SGFjbDF8SGFtcHxIYW1wMnxIYW8yfEhiZWdmfEhja3xIY2xzMXxIZXhifEhpc3QxaDRpfEhrM3xIcGR8SHNkM2IxfEh0cmE0fElkMXxJZmkyMDJifElmaTIwNHxJZmkyMDV8SWZpMjdsMmJ8SWZpdDF8SWZpdDJ8SWZpdDN8SWdmYnAxfElnZmJwM3xJZ3NmNnxJZ3RwfElsMTByYXxJbDE1fElsMThicHxJbDFifElsMnJnfElsN3xJbGRyMnxJcmdtMXxJc2cxNXxJdGdhNHxJdGdhNnxJdGdhbHxJdGdiMnxKYXpmMXxLY25qMTB8S2l0bHxLbGY2fEtsaGwxM3xLbHJhMnxMYWNjMXxMY2t8TGVjdDJ8TGdhbHMxfExncjV8TGhwcHxMaWcxfExycmMyNHxMcnJjMjV8THJ0bTF8THl6MnxNYW9ifE1hcmNrc2wxfE1hcmNvfE1hdDFhfE1ibDJ8TWRtMXxNZTJ8TWVzdHxNZnNkMmF8TWdzdDN8TWt4fE1sbHQzfE1tZDJ8TW1lfE1tcm4yfE1wYzF8TXJvaDZ8TXM0YTRkfE1zNGE2Y3xNeW8xZnxONGJwMmwxfE5jYWxkfE5jZjF8TmNmMnxOY2Y0fE5jbWFwfE5kcmcxfE5ma2IyfE5nZnJ8TmlwYWwxfE5scnAzfE5ubXR8TnBhczJ8TnFvMXxOcjRhMXxOcnAyfE50NWV8TnRyazJ8T2FzbDJ8T2F0fE9ybTN8UDJyeTR8UGFwc3MyfFBhcnAxMXxQYngxfFBjZWQxYnxQY3A0bDF8UGNzazV8UGRlMWF8UGRlNGR8UGRrNHxQZ201fFBpazNyNXxQaXJhMnxQbGExYXxQbGEyZzRifFBsZWt8UGxncmt0fFBsc2NyMnxQbnBsYTN8UG9sYTF8UHBsfFByZXgxfFBybHJ8UHJvbTF8UHJvbTJ8UHNkfFBzbWI4fFBzbWI5fFB0Z2RzfFB0cGRjMXxQdHByY3xQeWdvMXxSYWIyN2F8UmFiMzB8UmFjMnxSYWV0MWV8UmJsMXxSY2FuMnxSY2FuM3xSZGgxNnxSZW4xfFJmeDR8UmdufFJnczEyfFJuZDF8UnNwaDRhfFJ0bjR8UzEwMGExM3xTYWxsMXxTYW1kOWx8U2JrMXxTZGMxfFNlcHQxfFNlcnBpbmEzZ3xTZXJwaW5hNnxTZXJwaW5iMWF8U2VycGluYjh8U2VycGluZTN8U2V0ZDR8U2dzbTF8U2dzbTJ8U2gyZDRhfFNoM2JncmwzfFNoM3lsMXxTaHJvb20xfFNraXxTbGMxM2EzfFNsYzE1YTN8U2xjMTZhNXxTbGMxNmE3fFNsYzE3YTR8U2xjMjJhMjZ8U2xjMjJhMjd8U2xjMjJhMjl8U2xjMjVhMjF8U2xjMjVhMjR8U2xjMjVhMjd8U2xjMjVhMzR8U2xjMjZhMTB8U2xjMzRhMnxTbGMzOWE1fFNsYzQ3YTF8U2xjNGE0fFNsYzZhMTJ8U2xjbzFhNHxTbGZuOHxTbWltMjR8U210bmwyfFNuYWkyfFNueDEyfFNvcmwxfFNveDd8U3BhcmNsMXxTcGljfFNwaWNlMXxTcHJlZDF8U3JjfFNyZ2FwM3xTcmx8U3JybTR8U3Q2Z2FsbmFjNHxTdGFtYnBsMXxTdGF0MXxTdGszOXxTdWx0MWExfFN1bHQxYzJ8U3VsdDFkMXxTdWx0MWUxfFN1bHQyYTF8U3VsdDJhMnxTdWx0MmEzfFN1bHQyYTV8U3VsdDJhNnxTdWx0M2ExfFN5YnV8U3lrfFN5dGw1fFRiYzFkOHxUY2Y3fFRjbjJ8VGVhZDF8VGVubTN8VGdtMXxUZ3RwMXxUZ3RwMnxUaGJzMnxUaHkxfFRpbWQ0fFRscjEzfFRtNHNmNHxUbTZzZjJ8VG1lbTE3M3xUbWVtMjAwYnxUbWVtMjZ8VG1lbTk4fFRtc2I0eHxUbmZhaXA4fFRuZmFpcDhsM3xUbmZzZjEwfFRuaWt8VG94fFRyZW1sNHxUcmltMTN8VHJpbTI0fFRyaW0zMGF8VHJpbTgwfFRzcHlsNHxUdGMyMWJ8VHhuZGMxNnxUeXJvYnB8VWJhN3xVZ3QxYTF8VWd0MWE1fFVndDJiMzd8VXRwMTRifFZjYW0xfFZsZGxyfFdmZGMxNWJ8V2ZkYzE3fFdmZGMyfFphcDcwfFpicDF8WmMyaGMxYXxaYzNoMTJkfFpmcDI5MnxaZnAzNmwxfFpmcDQyOXxaZnA4MjB8WmZwOTQ3fFpmcDk2MHwxODEwMDU1RzAyUmlrfDIwMTAwMDNLMTFSaWt8MjIwMDAwMkQwMVJpa3wzMTEwMDgySTE3UmlrfDkxMzA0MDlJMjNSaWt8QTJtfEFhZGF0fEFiY2IxMHxBYmNnMnxBYmhkMTdifEFiaGQ1fEFjc2YyfEFjc20yfEFkYW10c2wyfEFkYXJiMnxBZG9yYTF8QWRyYjN8QWs0fEFsYXMyfEFsZG9jfEFscGx8QW94MXxBb3gzfEFwb2ExfEFwb2MyfEFwb2wxMGF8QXFwNHxBcmhnYXA0NHxBcmw2aXAxfEFyc2F8QXJzZ3xBc25zfEF0ZzE2bDJ8QXRwOGI0fEIzZ2FsdDF8QjRnYWxudDN8QmNsNnxCaWt8Qm1wNHxCbXljfEJva3xDNnxDN3xDOGF8QzhifEM5fENhZHxDYWxuMXxDYW1rMmJ8Q2Fwbjh8Q2JsY3xDY2RjMTcxfENjbmUxfENjbmZ8Q2VzMWV8Q2VzMmJ8Q2VzMmN8Q2VzM2F8Q2VzM2J8Q2VzNGF8Q2hhYzF8Q2hwdDF8Q2hybmEyfENpYXJ0fENpYjN8Q2lkZWN8Q2xlYzJofENsc3RuM3xDb2wyN2ExfENvbDVhM3xDb210fENwbmUyfENwbmU4fENwc2Y0bHxDcmxmMnxDcnliYjN8Q3NhZHxDc3BnNXxDdHBzfEN4Y2wxNHxDeXAyMWExfEN5cDJjNjd8Q3lwMmQ0MHxDeXAyZDl8Q3lwMmYyfEN5cDJqOXxDeXAydTF8Q3lwM2ExMXxDeXA0YTEyYXxDeXA0YTEyYnxDeXA0YTMyfEN5cDR2M3xDeXA3YjF8Q3lwOGIxfEN5czF8RGJwfERkeDN5fERlcmwzfERpcmMyfERuYWljMXxEbmFqYzEyfERweTE5bDF8RHB5MTlsM3xEc2cxY3xFZm5hM3xFZ2ZyfEVpZjJzM3l8RWlmNGVicDN8RWxvdmwzfEVucHAyfEVucHAzfEVwaHgxfEVwaHgyfEVwczhsMnxFcmMyfEVybzFsYnxGMnJ8RjgzMDAxNkIwOFJpayIpLHggPSByb3duYW1lcyhHMTcyLnVtaXMpLCB2YWx1ZSA9IEZBTFNFKQp4MiA8LSBncmVwKGMoIkZhYnA1fEZhbTE3MWJ8RmFtMjIyYXxGYW00N2V8RmJ4bzIxfEZnZjIxfEZpdG0xfEZrYnAxMXxGbW4yfEZzdHxHY250NHxHZGUxfEdkcGQxfEdqYzN8R2xvMXxHbTc2OTR8R25hMTJ8R25hMTR8R3BjMXxHcHIxMnxHcmVtMnxHcmhwcnxHcm04fEdzZTF8R3N0YTJ8R3N0bTN8R3N0cDF8R3N0cDJ8R3RmMmJ8R3lzMnxIMWZ4fEg2cGR8SGFvMXxIYXVzNHxIYmEtYTF8SGJhLWEyfEhiYi1ic3xIY3xIZXM2fEhwfEhweHxIc2JwMWwxfEhzZDNiMnxIc2QzYjV8SHNwYTFifEhzcGIxfEhzcGI2fEh1bmt8SWdzZjIzfEloaHxJa2JrZ3xJbDEycmIxfElsMXIxfEltcGEyfEluc2N8SXN5bmExfEtjdGQxNXxLZG01ZHxLZWcxfEtsaGRjN2F8TGFtYTN8TGNuMnxMZGhkfExoeDZ8THBsfExyZzF8THJyYzIwfE1hZ2VlMXxNYW1sM3xNYXMxfE1jbTEwfE1tcDE1fE1uMXxNcmdwcmV8TXJpMXxNcnZpMXxNdGhmZDFsfE10aGZkMnxNdG1yN3xNdG5yMWF8TXVnMXxNdXAxfE11cDEwfE11cDExfE11cDEyfE11cDEzfE11cDE0fE11cDE1fE11cDE2fE11cDE3fE11cDE5fE11cDIwfE11cDIxfE11cDN8TXVwNXxNdXA2fE11cDd8TXVwOXxNeWNufE15ZWYyfE5hdDh8TmVrMnxOaGVqMXxObHJwMTJ8Tm94NHxOdWR0N3xOdWdnY3xPYnAyYXxPY2lhZDJ8T2xmbTN8T2xmcjYxM3xPbWR8T3JtMXxPcm0yfE9zZ2luMXxQYXFyN3xQYXJkM2J8UGRpbHR8UGVyMnxQZmtmYjN8UGdwfFBpdHgzfFBrZHJlanxQbGVraGExfFBubGlwfFBvZG58UHBwMXIxYnxQcm9jYTF8UHJzczh8UHJ0bjN8UmFiMzR8UmFycmVzMXxSYXNzZjN8UmJicDR8UmV0c2F0fFJuYXNlMTN8Um5hc2VoMmF8Um5hc2VoMmJ8U2FhMXxTYWEyfFNhYTN8U2NhcmE1fFNjcDJ8U2RyMTZjNXxTZWJveHxTZWwxbDN8U2VsZW5icDJ8U2VyaW5jMnxTZXJwaW5hMTF8U2VycGluYTEyfFNlcnBpbmExYXxTZXJwaW5hMWN8U2VycGluYTFkfFNlcnBpbmEzYXxTZXJwaW5hM2t8U2VycGluYTV8U2VycGluYTd8U2VycGluYTl8U2VycGluZTJ8U2xjMTJhNHxTbGMxM2E1fFNsYzE1YTV8U2xjMTdhOHxTbGMyMmEyOHxTbGMyMmE3fFNsYzI1YTMzfFNsYzM1ZTN8U2xjNDFhMnxTbGM2YTh8U2xjbzFhMXxTbXBkM3xTbmhnMTF8U254Mjl8U29ydDF8U294MTJ8U3BhdGMxbHxTcG9uMnxTcHAxfFNyZDVhMXxTdGJkMXxTdGsxOXxTdXNkNHxTeWNwM3xUY2FpbXxUZG8yfFRmZjN8VG1jN3xUbWVtNDFhfFRuZnJzZjEyYXxUcG10fFRyYW0yfFRyZWh8VHJpcDR8VHNrdXxUc3BhbjMzfFRzcGFuNHxUdGMzOWF8VHRjMzljfFViYTV8VWdkaHxVZ3QxYTZifFVndDJiMXxVZ3QyYjM1fFVndDJiMzh8VWd0MmI1fFVuYzExOXxVbmMxM2J8VW5jNWJ8VXNwMnxVdHl8Vm1vMXxXZWUxfFdpcGkxfFduazR8WGxyM2F8WmJ0YjdjfFpkaGhjMnxaZnA0NDV8WmZwNjg3fFpmcDgwOXxaZnA4NzJ8R200NzI4MyIpLHggPSByb3duYW1lcyhHMTcyLnVtaXMpLCB2YWx1ZSA9IEZBTFNFKQp4MyA8LSBncmVwKGMoIm5jUk5BX2FzX2NocjEwXzkzODV8bmNSTkFfYXNfY2hyMTFfMTAwNTh8bmNSTkFfYXNfY2hyMTFfMTAxNzB8bmNSTkFfYXNfY2hyMTRfMTE4NDZ8bmNSTkFfYXNfY2hyMTVfMTI2Nzl8bmNSTkFfYXNfY2hyMTVfMTI5NTd8bmNSTkFfYXNfY2hyMTZfMTM1MTJ8bmNSTkFfYXNfY2hyMTdfMTM2Mjh8bmNSTkFfYXNfY2hyMV83NTd8bmNSTkFfYXNfY2hyMl8xMTI1fG5jUk5BX2FzX2NocjJfMTM0M3xuY1JOQV9hc19jaHI0XzMyMzB8bmNSTkFfYXNfY2hyNF8zODQzfG5jUk5BX2FzX2NocjVfNDczMXxuY1JOQV9hc19jaHI1XzQ3NDV8bmNSTkFfYXNfY2hyN182MDA3fG5jUk5BX2FzX2NocjhfNzI5MHxuY1JOQV9hc19jaHI4XzczMzJ8bmNSTkFfYXNfY2hyOV83ODI0fG5jUk5BX2FzX2NocnhfMTU1NDZ8bmNSTkFfaW50ZXJfY2hyMTBfOTE4M3xuY1JOQV9pbnRlcl9jaHIxMF85MjIyfG5jUk5BX2ludGVyX2NocjEwXzkyMjN8bmNSTkFfaW50ZXJfY2hyMTBfOTIyNHxuY1JOQV9pbnRlcl9jaHIxMl8xMDY4MXxuY1JOQV9pbnRlcl9jaHIxMl8xMDkyMnxuY1JOQV9pbnRlcl9jaHIxXzI5MHxuY1JOQV9pbnRlcl9jaHIxM18xMTE4OXxuY1JOQV9pbnRlcl9jaHIxM18xMTQzN3xuY1JOQV9pbnRlcl9jaHIxM18xMTQzOHxuY1JOQV9pbnRlcl9jaHIxXzM0MXxuY1JOQV9pbnRlcl9jaHIxNF8xMTk3OHxuY1JOQV9pbnRlcl9jaHIxNF8xMjIzN3xuY1JOQV9pbnRlcl9jaHIxNV8xMjU4NXxuY1JOQV9pbnRlcl9jaHIxNV8xMjY4M3xuY1JOQV9pbnRlcl9jaHIxNV8xMjY4NHxuY1JOQV9pbnRlcl9jaHIxNl8xMzA2MnxuY1JOQV9pbnRlcl9jaHIxNl8xMzIyNXxuY1JOQV9pbnRlcl9jaHIxNl8xMzQyOHxuY1JOQV9pbnRlcl9jaHIxNl8xMzUxMHxuY1JOQV9pbnRlcl9jaHIxOF8xNDM5MnxuY1JOQV9pbnRlcl9jaHIxOF8xNDQzMnxuY1JOQV9pbnRlcl9jaHIxOF8xNDU5MHxuY1JOQV9pbnRlcl9jaHIxOV8xNDc3MHxuY1JOQV9pbnRlcl9jaHIxOV8xNDgwMnxuY1JOQV9pbnRlcl9jaHIxXzk3N3xuY1JOQV9pbnRlcl9jaHIyXzE0MjJ8bmNSTkFfaW50ZXJfY2hyMl8xNDI0fG5jUk5BX2ludGVyX2NocjJfMTQzMHxuY1JOQV9pbnRlcl9jaHIyXzE0MzJ8bmNSTkFfaW50ZXJfY2hyMl8yMDEyfG5jUk5BX2ludGVyX2NocjJfMjAxNnxuY1JOQV9pbnRlcl9jaHIyXzIwMTd8bmNSTkFfaW50ZXJfY2hyMl8yMDg1fG5jUk5BX2ludGVyX2NocjNfMjc0M3xuY1JOQV9pbnRlcl9jaHIzXzI5MTV8bmNSTkFfaW50ZXJfY2hyM18yOTM3fG5jUk5BX2ludGVyX2NocjNfMzAwMnxuY1JOQV9pbnRlcl9jaHI0XzMxNDF8bmNSTkFfaW50ZXJfY2hyNF8zMTc3fG5jUk5BX2ludGVyX2NocjRfMzM0NHxuY1JOQV9pbnRlcl9jaHI1XzQxMTV8bmNSTkFfaW50ZXJfY2hyNV80MTE2fG5jUk5BX2ludGVyX2NocjVfNDM2NXxuY1JOQV9pbnRlcl9jaHI1XzQ1Mjd8bmNSTkFfaW50ZXJfY2hyNV80NzYzfG5jUk5BX2ludGVyX2NocjVfNDc2NHxuY1JOQV9pbnRlcl9jaHI2XzUxMzh8bmNSTkFfaW50ZXJfY2hyNl81MjUzfG5jUk5BX2ludGVyX2NocjZfNTY5MXxuY1JOQV9pbnRlcl9jaHI3XzYxMTN8bmNSTkFfaW50ZXJfY2hyOF82NzY2fG5jUk5BX2ludGVyX2NocjhfNjk0NnxuY1JOQV9pbnRlcl9jaHI4XzcxMDV8bmNSTkFfaW50ZXJfY2hyOF83MzM0fG5jUk5BX2ludGVyX2NocjhfNzY4NHxuY1JOQV9pbnRlcl9jaHI5Xzc4Nzh8bmNSTkFfaW50ZXJfY2hyOV84MDE1fG5jUk5BX2ludGVyX2NocjlfODI0OSIpLHg9cm93bmFtZXMoRzE3Mi51bWlzKSx2YWx1ZT1GQUxTRSkKeDQgPC0gZ3JlcChjKCJuY1JOQV9pbnRlcl9jaHJYXzE1Mzc2fG5jUk5BX2ludGVyX2NoclhfMTUzOTR8bmNSTkFfaW50ZXJfY2hyWF8xNTU0OXxuY1JOQV9pbnRyYV9jaHIxNV8xMjY3NHxuY1JOQV9pbnRyYV9jaHIxNV8xMjY3NXxuY1JOQV9pbnRyYV9jaHIxOV8xNTAwOHxuY1JOQV9pbnRyYV9jaHIxOV8xNTAwOXxuY1JOQV9pbnRyYV9jaHIxOV8xNTAxNHxuY1JOQV9pbnRyYV9jaHI1XzQ3MjZ8bmNSTkFfaW50cmFfY2hyNV80NzI4fG5jUk5BX2ludHJhX2NocjVfNDczMHxuY1JOQV9pbnRyYV9jaHI3XzU5MjB8bmNSTkFfaW50cmFfY2hyN182MDAxfG5jUk5BX2ludHJhX2NocjhfNzMwOHxuY1JOQV9pbnRyYV9jaHI4XzczMTB8bmNSTkFfYXNfY2hyMTBfOTI0MHxuY1JOQV9hc19jaHIxXzIzMXxuY1JOQV9hc19jaHIxNF8xMjA3NHxuY1JOQV9hc19jaHIxNV8xMjg3NHxuY1JOQV9hc19jaHIxOV8xNDcxMXxuY1JOQV9hc19jaHIxOV8xNTA1NHxuY1JOQV9hc19jaHIzXzIxOTJ8bmNSTkFfYXNfY2hyM18yODAwfG5jUk5BX2FzX2NocjRfMzI5N3xuY1JOQV9hc19jaHI2XzU2MDF8bmNSTkFfYXNfY2hyNl81ODUxfG5jUk5BX2FzX2NocjdfNjMwMnxuY1JOQV9hc19jaHI4XzcwODd8bmNSTkFfYXNfY2hyOV84MTQyfG5jUk5BX2FzX2NocjlfODQyMHxuY1JOQV9hc19jaHJYXzE1MzE4fG5jUk5BX2ludGVyX2NocjEwXzg0NjZ8bmNSTkFfaW50ZXJfY2hyMTBfODc2N3xuY1JOQV9pbnRlcl9jaHIxMF84ODI5fG5jUk5BX2ludGVyX2NocjEwXzg5OTl8bmNSTkFfaW50ZXJfY2hyMTBfOTEyM3xuY1JOQV9pbnRlcl9jaHIxMF85MTM4fG5jUk5BX2ludGVyX2NocjEwXzkyNDV8bmNSTkFfaW50ZXJfY2hyMTBfOTMxM3xuY1JOQV9pbnRlcl9jaHIxMF85MzQ5fG5jUk5BX2ludGVyX2NocjEwXzkzNTF8bmNSTkFfaW50ZXJfY2hyMTFfMTAwNzh8bmNSTkFfaW50ZXJfY2hyMTFfMTAxNTl8bmNSTkFfaW50ZXJfY2hyMTFfMTAxNjJ8bmNSTkFfaW50ZXJfY2hyMV8xMTV8bmNSTkFfaW50ZXJfY2hyMTFfOTkyNXxuY1JOQV9pbnRlcl9jaHIxMl8xMDQyM3xuY1JOQV9pbnRlcl9jaHIxMl8xMDQ1NHxuY1JOQV9pbnRlcl9jaHIxMl8xMDQ1OHxuY1JOQV9pbnRlcl9jaHIxMl8xMDU2MnxuY1JOQV9pbnRlcl9jaHIxMl8xMDkxMHxuY1JOQV9pbnRlcl9jaHIxXzIzNHxuY1JOQV9pbnRlcl9jaHIxM18xMTIyMnxuY1JOQV9pbnRlcl9jaHIxM18xMTU1M3xuY1JOQV9pbnRlcl9jaHIxM18xMTY3MHxuY1JOQV9pbnRlcl9jaHIxM18xMTc4MnxuY1JOQV9pbnRlcl9jaHIxXzQwNnxuY1JOQV9pbnRlcl9jaHIxNF8xMTg1OHxuY1JOQV9pbnRlcl9jaHIxNF8xMTk4OXxuY1JOQV9pbnRlcl9jaHIxNF8xMjIwMXxuY1JOQV9pbnRlcl9jaHIxXzQyMHxuY1JOQV9pbnRlcl9jaHIxXzQ3N3xuY1JOQV9pbnRlcl9jaHIxNV8xMjM0MXxuY1JOQV9pbnRlcl9jaHIxNV8xMjYwOXxuY1JOQV9pbnRlcl9jaHIxNV8xMjkzN3xuY1JOQV9pbnRlcl9jaHIxNl8xMzE3MHxuY1JOQV9pbnRlcl9jaHIxNl8xMzE3M3xuY1JOQV9pbnRlcl9jaHIxNl8xMzE3NnxuY1JOQV9pbnRlcl9jaHIxNl8xMzE3N3xuY1JOQV9pbnRlcl9jaHIxNl8xMzM0OXxuY1JOQV9pbnRlcl9jaHIxNl8xMzQ1MXxuY1JOQV9pbnRlcl9jaHIxNl8xMzQ3MHxuY1JOQV9pbnRlcl9jaHIxNl8xMzQ3MXxuY1JOQV9pbnRlcl9jaHIxXzYzMHxuY1JOQV9pbnRlcl9jaHIxN18xMzgxN3xuY1JOQV9pbnRlcl9jaHIxN18xMzgyN3xuY1JOQV9pbnRlcl9jaHIxN18xMzkzOHxuY1JOQV9pbnRlcl9jaHIxN18xMzk0MHxuY1JOQV9pbnRlcl9jaHIxN18xMzk4MyIpLHg9cm93bmFtZXMoRzE3Mi51bWlzKSx2YWx1ZT1GQUxTRSkKeDUgPC0gZ3JlcChjKCJuY1JOQV9pbnRlcl9jaHIxN18xMzk4NnxuY1JOQV9pbnRlcl9jaHIxN18xNDAyOHxuY1JOQV9pbnRlcl9jaHIxN18xNDE1MXxuY1JOQV9pbnRlcl9jaHIxXzczNHxuY1JOQV9pbnRlcl9jaHIxOF8xNDIyM3xuY1JOQV9pbnRlcl9jaHIxOV8xNDg1M3xuY1JOQV9pbnRlcl9jaHIxOV8xNDg3M3xuY1JOQV9pbnRlcl9jaHIxXzkzMXxuY1JOQV9pbnRlcl9jaHIyXzExNTZ8bmNSTkFfaW50ZXJfY2hyMl8xMTU3fG5jUk5BX2ludGVyX2NocjJfMTIzMnxuY1JOQV9pbnRlcl9jaHIyXzEyMzN8bmNSTkFfaW50ZXJfY2hyMl8xNDYyfG5jUk5BX2ludGVyX2NocjJfMTQ3MXxuY1JOQV9pbnRlcl9jaHIyXzE0Nzl8bmNSTkFfaW50ZXJfY2hyMl8xNTAyfG5jUk5BX2ludGVyX2NocjJfMTY4OXxuY1JOQV9pbnRlcl9jaHIyXzIwMDJ8bmNSTkFfaW50ZXJfY2hyMl8yMDM3fG5jUk5BX2ludGVyX2NocjNfMjMxNHxuY1JOQV9pbnRlcl9jaHIzXzI1MDR8bmNSTkFfaW50ZXJfY2hyM18yNzg2fG5jUk5BX2ludGVyX2NocjNfMjkzNXxuY1JOQV9pbnRlcl9jaHI0XzMwNzl8bmNSTkFfaW50ZXJfY2hyNF8zNDY4fG5jUk5BX2ludGVyX2NocjRfMzcyM3xuY1JOQV9pbnRlcl9jaHI1XzQ2ODF8bmNSTkFfaW50ZXJfY2hyNV80Nzg3fG5jUk5BX2ludGVyX2NocjVfNDgxOXxuY1JOQV9pbnRlcl9jaHI2XzUwMjN8bmNSTkFfaW50ZXJfY2hyNl81MjQ4fG5jUk5BX2ludGVyX2NocjZfNTMwOXxuY1JOQV9pbnRlcl9jaHI2XzUzMTZ8bmNSTkFfaW50ZXJfY2hyNl81NTUxfG5jUk5BX2ludGVyX2NocjZfNTU5NXxuY1JOQV9pbnRlcl9jaHI3XzU5MjJ8bmNSTkFfaW50ZXJfY2hyN182MDg3fG5jUk5BX2ludGVyX2NocjdfNjIyMHxuY1JOQV9pbnRlcl9jaHI3XzYyMjJ8bmNSTkFfaW50ZXJfY2hyN182NTA5fG5jUk5BX2ludGVyX2NocjhfNjczOXxuY1JOQV9pbnRlcl9jaHI4XzY3NDF8bmNSTkFfaW50ZXJfY2hyOF82ODc2fG5jUk5BX2ludGVyX2NocjhfNjk3MXxuY1JOQV9pbnRlcl9jaHI4XzcyODB8bmNSTkFfaW50ZXJfY2hyOF83NDIwfG5jUk5BX2ludGVyX2NocjhfNzQyM3xuY1JOQV9pbnRlcl9jaHI4Xzc0MzB8bmNSTkFfaW50ZXJfY2hyOV83NzUzfG5jUk5BX2ludGVyX2NocjlfODA5OXxuY1JOQV9pbnRlcl9jaHI5XzgxMjJ8bmNSTkFfaW50ZXJfY2hyOV84MzgzfG5jUk5BX2ludHJhX2NocjEyXzEwODU2fG5jUk5BX2ludHJhX2NocjEyXzEwODcyfG5jUk5BX2ludHJhX2NocjE1XzEyOTExfG5jUk5BX2ludHJhX2NocjE4XzE0NTMzfG5jUk5BX2ludHJhX2NocjE5XzE0NzczfG5jUk5BX2ludGVyX2NoclhfMTUzOTQiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKCgpUQ1BPMSA8LSBncmVwKGMoIkNvcmlufFBwcDFyM2N8WGxyM2F8WGxyM2J8Q3lwMmE1fElrYmtlfEdkZjE1fEFubG58UmFyYnxDZGNhMnxHbmExNHxLaWYyMGJ8VHB4MnxDZW5wZXxBcmhnZWYzOXxLaWYyY3xDeGNsMXxNbWQyfEVwaGI2fFdpcGYzfEdwcmM1ZHxUdHloMXxBdHA0YXxQbGVraGE0fE1yZ3ByYjN8QmNsN2N8UHJyMzZ8RmdsMXxTbGMxOGExfEZjaG8xfEdtMTA2Mzh8U3QzZ2FsNHxRc294MXxBcm1jMnxEbmFqYzEyfEF2cHIxYXxLaWY1YXxDYW1rMmJ8T2xmcjEzOTN8U2dzbTJ8Q2Fwbjh8R3B4NnxEY2RjMmF8Q3hjbDE0fExyaXQyfFNmdHBhMXxTbGMzOWEyfFRzcHlsNXxDcG5lOHxOcGZmfEdwNXxQcnIxOHxDYXNraW4xfEZhbTEyOWJ8WmZwODExfEFiY2c1fEFiY2c4fFpidGI3Y3xSb20xfENubm0xfFRpbXAxfFhscjNjfFNsYzFhMnxTcGFnNHxHbTgyNnxSYnBqbHxTYXRiMnxHbTY1MjV8QW5rcmQ2fFRtZW0xNjl8VHRsbDEwfENyb3R8WmZ5dmUyOHxOY2FwZ3xDY2RjMTh8VHJwbTh8VWd0MWE1fFJwaDNhfEZ6ZDEwfEFrcjFkMXxaZnAzOTh8R3ByaW4zfE1hZDJsMXxCbXAxMHxLYnRiZDEyfEZhbmNkMnxDZGNhM3xSYWQ1MWFwMXxGb3htMXxQdHBuNHxCaGxoZTQxfExpZzF8Q3lwMmcxfE5waHMxfENjbmUxfFRpY3JyfEdzdGEzfEZ6ZDR8Q2RrMTh8UGxrMXxLaWYyMnxDaGlkMXxTaGNicDF8S2lmMTR8Q2VucHV8TmVpbDN8QXNwbXxBbmtsZTF8UGRwMnxHaW5zMnxTaXBhMWwyfE1tcDEyfFNlc24zfEZhbTEyOWF8Q2NkYzE1fENibHxIMmFmeHxBcG9hNHxDeXAxYTF8S2lmMjN8WndpbGNofFBpZjF8VHJhaXB8RmFtMTk4YXxLaWYxNXxBZGdifFN1bHQzYTF8Q2RrMXxQYXJwYnB8R2FzMmwzfEtpdGx8U3l0MXxOdWYyfENvYmx8VWhtazF8RmJ4bzQ4fFNwZGwxfEhtbXJ8T2xmcjE2fEF1cmtifFNwYWc1fEV4bzF8U2thMnxMcnJjNDZ8QnJjYTF8QkMwMzA4Njd8S2lmMThifEJpcmM1fFJybTJ8UmRoMTF8UGxla2hoMXxTZXJwaW5hNnxOY2FwZzJ8QWRhcmIyfFpmcDE4NHxIaXN0MWgyYmt8SGlzdDFoMmJlfFBwcDFyM2d8QXRmM3xaZnAzNjl8Q2VucGh8TWVpZzF8V250NWF8Q2RrbjN8RGxnYXA1fFRuZnJzZjE5fFBia3xLbGYxMnxMbWJyZDJ8TmVibHxSZWNxbDR8VHJvYXB8U2FwY2QyfENkYzQ1fFBvbHF8QzMzMDAyN0MwOVJpa3xFcGhhM3xOY2FtMnxDeXlyMXxaZnA5N3xQa215dDF8Q2h0ZjE4fE5ldXJsMUJ8S2lmYzVifEtpZmMxfEVtaWxpbjJ8TmRjODB8U3RybnxGemQ4fE1pYjF8U3RhcmQ0fENkYzI1Y3xLaWYyMGF8TGRscmFkNHxNYzVyfFNrYTF8Q2ZhcDUzfEN5YjVhfEdzdHAyfEluY2VucHxGZW4xfFB0YXIxfEtpZjExfENlcDU1fEN5cDJjNjZ8TGNvcnw0OTMzNDExSzE2UmlrfFNsYzlhN3xLaWY0fEZhbmNifEtpZjE4YXxBcmhnYXAxMWF8QnViMWJ8TmNhcGh8QnViMXxXZmRjMTZ8VWJlMmN8QXVya2F8R20xNDQ0MHxDY25hMnxQbGs0fFRyaW01OXxUbHIyfElxZ2FwM3xUaGVtNXxIaXN0MmgyYmJ8TmJlYWwxfFBzcmMxfFBhcmQzYnxEZXBkYzFhfE1tczIybHxNZWxrfFNtYzJ8UHRncjF8TXVwMTl8TXVwNXxNdXAyMXxNdXAxMXxNdXAxNXxBY290MTF8T3JjMXxDZGtuMmN8U3RpbHxSYWQ1NGx8UHRjaDJ8Q2RjYTh8Q2xzcG58QXVuaXAiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKVENQTzIgPC0gZ3JlcChjKCJNZWdmNnxWd2ExfENncmVmMXxTdWx0NWExfERpbzF8UmVuMXxTbGMxNWEyfEExYmd8TXVwMTd8VHJwdjF8S2xobDI1fENicjF8R3BjcGQxfEEybXxDYWRtNHxQcHAxcjE0YXxTYWEzfFJhZDUxYnxGb3N8RHNnMWN8VGNoaHxDcnltfEdtbm58QmlrfFRyaWIzfE5ubXR8RTJmMnxTdWx0MWQxfFBvcnxNYWQxbDF8Q3lwM2ExMXxHYWRkNDVhfEN5cDJiMTB8VHNrdXxDZXMyYXw0OTMxNDA2QzA3UmlrfEFsYXMxfEdhZGQ0NWJ8OTEzMDQwOUkyM1Jpa3xQbnBsYTN8RHR4NHxDeXAyYzU1fEN5cDJjMjl8UmFycmVzMXxHc3RtM3xQbGEyZzEyYXxSZGgxNnxHYWRkNDVnfFR0bGwxM3xSbmYxODZ8VG11YjF8RmFicDJ8U3VsdDFlMXxLYXRuYTF8Q3lwMjFhMXxDeXAzYTQ0fEN5cDJjNDB8Q3lwMmM2OXxSZGg5fERicHxBdHAyYjJ8Q2RjMjB8U2xjMzRhMnxBa3IxYjd8VGFmMWR8VHJtdDYxYXxOZWRkOXxQZmtmYjN8R20xNDI5NXxHbTE0NDAzfEV4b3NjOHxENjMwMDM5QTAzUmlrfE11ZzJ8UGtwM3xEZXJsM3xOZHVmYTRsMnxTbGMxNmExMXxTZW1hNWJ8Qm1mfEVsbDN8RG5haWMxfEN5cDRhMTR8Q3lwNGExMHxBemluMnxNdDJ8TXQxfEZieG8zMXxJZ2ZicDF8U2xjMTNhNXxQb2xlfENrYXAyfEFwb2wxMGF8U3VsdDFjMnxUY3AxMWwxfEhhbzJ8TXVwMTJ8U2xjMTBhMnxDb2xnYWx0MnxQc21jM2lwfFR0bGw4fFB0Z2VzfEdzdG0yfEdzdG0xfEN0cHN8Q2hrYXxHamI0fENka24xYXxNa2k2N3xDZW5wZnxDY25iMXxFc3BsMXxLbnN0cm58VGhyc3B8U2hyb29tMXxIc3BhMnxQdXNsMXxIbWduM3xCdG5sOXxCYXJobDF8VHRiazF8U3RrMzZ8SWhofFNhYTJ8U2Vib3h8Q3liNTYxfFNsYzdhMTV8QWRhbXRzbDJ8UmJtMjB8TWFwM2s2fFNjNWR8TWlzMThicDF8TWFzdGx8Q2hhZjFhfFNsYzIyYTI2fFNsY28xYTR8TXljfE1iZDF8T3JtM3xGZ2YyMXxBZHJiM3xTZXJwaW5hM258QXJpZDVhfEFwb2wxMGJ8TXVwMTZ8VnBzMzdifFJoYmRkMnxQYXBzczJ8Q3lwMjZhMXxQcnNzMjJ8RTAzMDAxOEIxM1Jpa3xTb2NzMnxVcHAyfExueDF8Q3V4MnxaYmVkNXxTbGMxMmE5fE54cGU1fFN1bjF8MzExMDA4MkkxN1Jpa3xUbWVtMTg0YXxDeXAzYTE2fEdwcjEyfFBvbjF8SGVzNnxBa3IxYjh8VHJpbTI0fEF0b2g4fFBwYXJnfEd1Y3kyY3xHeXMyfExkaGJ8UmVwMTV8WmZwNzczfEdyaWs1fFBobGRiM3xMZ2k0fE51cHIxfEFkb3JhMXxPYXR8QjRnYWxudDR8THJyYzU2fFNsYzI1YTIyfENka24xY3xBbm8xfEVpZjRlYnAxfFJmeGFua3xQYng0fFNsYzI3YTF8S2xmMXxIb29rMnxTcGF0YTJMfEFndHxGYW04OWF8Q2NkYzE1MXxPYWZ8MTgxMDA0NkswN1Jpa3xQY2JwNHxHbmF0MXxTbGMzOGEzfE1zdDFyfENvbDdhMXxQbHhuYjF8VG1pZXxBY2FhMWF8QWN2cjJifEN5cDhiMXxUcGQ1MmwxfEZtbzN8Q29sMThhMXxUbGUyfE10ZXJmMnxNZ3N0M3xMcnAxfEI0Z2FsbnQxfEl0Z2E3fEdsczJ8VGJjMWQxMGF8U3JlYmYxfFRycDUzaTEzfFJhcmF8QXJsNGR8UnVuZGMzYXxTbGMxNmE1fExsZ2wyfFRtYzZ8UGxla2hnM3xBY290M3xScHM2a2wxfEVtbDF8RDEzMDA0M0syMlJpa3xGb3hxMXxGYnAxfFViZTJxbDF8U2xjMTJhN3xDY25vfE1jbTEwfElsMTdyYnxScGdyaXAxfFJhYmdndGF8VGdtMXxJcmY5fEd1bG98U29yYnMzfERjdHxLaWZjMnxQZHhwfFBtbTF8Q2VucG18QXJoZ2FwOHxDZWxzcjF8Q2hrYnxSbmQxfExtYnIxbHxDc2FkfFNtaW0yMnxEZXhpfFByb2RofENsY24yfEFncGF0MnxTYXJkaHxDcmF0fEdtOTk5MnxTbGMyMmEzfFVuYzkzYXxBc3MxfFBpbTF8U2xjMjVhMjV8U3Q2Z2FsbmFjNnxDeXA0ZjE2fEdubXR8UGxpbjV8RWdyMXxHbnBkYTF8UHBhcmdjMWJ8QXJoZ2VmMzd8UGN5b3gxbHxCYWR8TWFjcm9kMXxTbGMyMmEyOXxSYWIzaWwxfFRycG02fEdvdDF8Q29sMTdhMXxHc3RvMXxQbGVraHMxfFNsYzdhM3xNdW0xbDF8UGRrMXxQbGEyZzRmfFByb20yfEFjc3MyfE5ldXJsMnxTbGMyYTJ8VGhiczMiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKVENQTzMgPC0gZ3JlcChjKCJJbDZyYXxTZWxlbmJwMXxBbnhhOXxDdHNrfEFscGsxfEN0aHxDb2wyN2ExfENjZGMzMHxIcGNhfFB0cHJ1fFRtZW0yMDBifENua3NyMXxQYXFyN3xJZm5scjF8QWxwbHxSYXAxZ2FwfEtsaGRjN2F8VWd0MmIzNXxNb2IxYnxEcjF8VWd0MWE5fEhzcGgxfEMxZ2FsdDF8R3JtOHxaZnAyMTJ8S2J0YmQ4fEI0Z2FsbnQzfFNsYzE1YTV8UGxhMmc0Y3xaZnA2MTl8R2FzMnxDZDU1fFlvZDF8UHJzczIzfEFjZXIzfElwbzd8TXJ2aTF8RGtrM3xNaWNhbDJ8UHNtYTF8UGRlM2J8UGRpbHR8WmZwNzY4fFRua3N8UHBwMXIzYnxaZnA2MTd8Q2FscnxFZGVtM3xTd3NhcDF8WmZwODcyfEhzcGE4fFRhZ2xufFRleDEyfEFycHAxOXxQZ20zfFNwc2I0fFBvYzFhfE1hbmZ8UHJrYXIyYXxFcG0yYWlwMXxIaWdkMWF8QWJoZDV8R2lubTF8Q2FjeWJwfERkeDIxfFRpbXAzfENyZWcxfEFybDF8RHVzcDZ8V2lmMXxQcmltMXxJcmdtMXxIbnJucGFifEJjbDZifFBzbWQxMXxQaWd3fFJhZDUxY3xObWUxfEdtMTE1NDF8THNtMTJ8RWZjYWIzfEtwbmEyfERlc2kyfFpmcDc1MHxSc2FkMnxEbmFqYjl8UHlnbHxQaWdofEFkYW00fFRtZWQ4fEFsa2JoMXxUYzJufEhzcDkwYWExfFRuZmFpcDJ8TmlkMXxJbmhiYXxSbmYxNDRifEx5c21kM3xGMnJ8SXRnYTF8U3ByeWQ3fFNsYzI1YTMwfExpZnJ8QXRhZDJ8TmRyZzF8U3QzZ2FsMXxDeXAyZDl8Q3lwMmQxMnxLbGhkYzdifEFua3JkMzl8RmdkNHxTZGYybDF8VHViYjRifEFsZzN8TWFwM2sxM3xMcnJjNTh8TmFhNTB8RHppcDN8UmFiNDR8R2xvMXxQcHAxcjEwfEVucHA0fENhdHNwZXJkfE51ZHQxMnxTcmQ1YTJ8WWlwZjR8WmJ0YjI2fFBzbWE4fFNjYWl8Um5mMTI1fFRtZWQ3fFNsYzIyYTI4fE1zNGE0ZHxNYW1kYzJ8UGlrM2FwMXxDb3gxNXxYa3xQZ3JtYzF8WmJ0YjMzfEtsaGwxNXxZaXBmNnxDZHg0fENoaWMxfE5wYXMyfFJlcHMyfE1vc3BkMnxDd2MyMnxTcHBsMmF8QXRybnxQY25hfDQ5MjE1MDlDMTlSaWt8UmJsMXxaZ3BhdHxJbDd8U3VwdDIwfFRjZjI0fFNlcnAxfFAycnkxMnxTc3IzfEFveDF8UzEwMGExMHxOb3A1OHxHc3RtNHw1MzMwNDE3QzIyUmlrfFByZG0xNHxYa3I5fFJucGMzfFRtZW01NnxBbGcxNHxGdWJwMXxGemQ1fE5kdWZhZjR8TXVwM3xNdXAxfE11cDEwfERwaDJ8QWtpcmluMXxBVzAxMTczOHxLZWcxfFBlcjN8SW5zY3xOcmc0fFB0cDRhMXxBYmNjM3wxODEwMDMyTzA4UmlrfFNsYzQ2YTN8Um5mMTUyfFN0ZWFwM3xCYmMzfEN5cDJhNHxDeXAyYTIyfFNoMmQ0YXxHYW10fFRiYzFkMzB8MTgxMDAxMEgyNFJpa3xDY2RjNTd8U3luZTN8WmZwMzk1fEFwb2w3YXxUZWZ8SWdmYWxzfFNsYzIyYTd8SHNkM2IzfFNsYzQ0YTN8VW94fEN5cDdhMXxFbmhvfFRjZWEzfEFyaGdlZjE5fEZhbTEzMWN8U2xjMmE1fExyZzF8Q3hjbDEwfEFiaGQyfE15Y258TnJlcHxQMnJ5NHxQYWRpNHxJbnNpZzJ8UHJnNHxMZWFwMnxDcnB8TWFsMnxSYXBnZWY0fEZhbTExMGF8SnVufDg0MzA0MDhHMjJSaWt8TGFkMXxDZXMzYXxBcnJkYzN8RzBzMnxIc2QzYjV8SHNkM2IyfEN5cDJ1MXxNcmVnfElsMjJyYTF8Q3lwM2E1OXxSZ3MxfERkaXQ0fExjbjJ8MTgxMDA1NUcwMlJpa3xSZ3MxMnxDYzJkMmF8UHBhcmdjMWF8TmlwYWwxfFVndDJiNXxBZnB8R2JwMTB8R2JwNnxGZ2ZybDF8U2dzbTF8MjYxMDUyNEgwNlJpa3xPYXNsMXxGYnhvMjF8VGJ4M3xPYXMxY3xTdHgyfEN5cDNhNDFhfFBlcjJ8SXJmNXxQYXNrfFpmcDQ2N3xBdmw5fE5hdDh8U2VycGluYjh8UmFzc2Y0fFVzcDE4fENsc3RuM3xDbGVjMmh8Q2VhY2FtMnxDZDc5YXxDeXAyYjl8U2VydGFkM3xDZDIyfFR1bHAyfFN2aXB8V2VlMXxFZWYya3xBcXA4fENkMTl8RmNlcjJhfENkMjA5Y3xIdHJhNHxNdG5yMWF8S2xrYjF8THJwMmJwfE5yM2MyfENlczFmfE1tcDE1fENlczJofENlczNifFNsYzlhNXxNdmR8VG1lbTIxOHxOeHBlMnxDZDI3NnxHY2xjfE50NWV8NjQzMDU3MUwxM1Jpa3xBY2FhMWJ8RGxlYzF8V2lzcDN8VHViZTF8Q2hzdDN8Rm1vNHxGbW8xfFJhYjM2fEdzdHQyfExzc3xJenVtbzR8VGpwM3xMaW43YXxJbmhiZXxOYWIyfE1ldHRsN2J8U2xjMzlhNXxPc2JwMnxEZGN8U25ybnAyNXxQY3A0bDF8UHR0ZzF8RDkzMDA0OE4xNFJpa3xQY3RwfFRvYjF8TnIxZDF8S3J0MjN8QWJjYThhfENieDh8Q2J4NHxDYngyfEZuM2t8UHNlbjJ8Q3lzMXxDbXBrMnxBdHhuN2wxfEFjb3Q0fFpjMmhjMWN8U2VycGluYTl8QWtyMWMxOXxEc3B8UmQzfFRwcHB8TWJsYWMyfEFkYW10czZ8UGRlNGR8RnN0fDQ5MzA0NTJCMDZSaWt8THJ0bTF8THJpdDF8RmRmdDF8Q2hybmEyfEMxcWwzfFBybHJ8QXBvbDlhfEFwb2w5YnxGYW0yMjdhfEFyc2F8RW50cGQyfE5pdDJ8SHVua3xDY25mfFBkZTlhfEN5cDRmMTR8VGNmMTl8WmJ0YjEyIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpClRDUE80IDwtIGdyZXAoYygiRG5waDF8QXFwNHxEc2cyfExpcGd8Q2FjbmI0fEhzYnAxbDF8QWN5M3xTbngzMnxDaHJtMXxGYWRzM3xLYW5rMXxWbGRscnxIaGV4fFBkZTZjfEN5cDJjMzh8TWlkMWlwMXxGaWdufFN5dGw0fEJobGhiOXxLYW50cnxLbGhsNDF8TWFkZHxBYnRiMnxFbGY1fFBhazZ8SXRwa2F8V2RyNzZ8U29yZHxOYWJwMXxSYm0zOHxTbGMxN2E5fFBnYXAxfFBmbjJ8U3VjbnIxfEJjaGV8QW94M3xNYWIyMWwyfEhjbjN8RmRwc3xDYXIxNHxIaXN0MmgyYmV8VHJpbTQ1fEduYXQyfEFkaDR8RGRhaDF8Q29ybzJhfENvbDE1YTF8TXVwOHxNcGR6fElnZmJwNXwyNjEwNTI4SjExUmlrfE5jbWFwfEdhbGV8QXJoZ2VmMTZ8SW5zaWcxfFNoM2JwMnxTdHgxOHxBZGFtdHMzfFNsYzEwYTZ8TWZzZDdhfENyeWJiM3xVbmd8R2x0MWQxfEFzbHxDcmNwfFNlcnBpbmUxfEN5cDNhNTd8Q3lwM2EyNXxBYXNzfExtb2QyfEF0cDZ2MGE0fFNueDEwfFN0M2dhbDV8UG9keGwyfE5vcDJ8SW5oYmJ8Q2xlYzlhfEdwcmM1YXxQaWszYzJnfEFtbjF8TmxycDEyfEhpZjNhfFNhYTF8S2xmMTN8U2xjNDVhM3xBZG18UmFzc2YxMHxTdWx0MWExfFRhY2MyfERtYnQxfElmaXRtNXxMcnJjOGV8SXJzMnxFbnBwNnxIcHxUYXR8V3dveHxNYXAxbGMzYnxDZGgxNXxNbXA4fFBwYW58Q25uMXxCbXBlcnxBZGFtdHMxNXxVYmFzaDNifFJnczE2fFpidGIxNnxaa3NjYW43fE1hcDNrNXxDdGdmfEFkYW10czE0fFNsYzE5YTF8U2xjMzVlM3xBZGN5MXxMZ2Fsc2x8UmFzZDF8QXBjc3xDY2w2fFlwZWwyfEV0djR8R3JufEdmYXB8SXRnYjN8SDNmM2J8VGhhMXxMcGluMXxQcnBzMWwxfFN1c2Q2fFBwcDRyNHxTZXJwaW5hM2l8U2VycGluYTNtfFNlcnBpbmEzZnxTZXJwaW5hM2d8U2xjMjVhNDd8U2ltYzF8S2xobDN8Q3RzbHxScHAzOHxIc3BhMTR8SXRnYTJ8R25sM3xJdGloNHxGYW0zNWF8QXBleDF8WmMzaDEzfEZhcnAxfE5yYnAyfEVwcGsxfE1hZmZ8UGltM3xTbGMzOGEyfERuYWphM3xTb2NzMXxDZWJwZHxPYnAyYXxOcjFpMnxDbGRuMTR8RG9wZXkyfFJwbDEwYXxGa2JwNXxSc3BoMXxBbmdwdGw0fFJwbDEyfFN1cHQzfEN5cDM5YTF8RnNkMXxNcG5kfERwcDl8TXlvbTF8UmJicDh8TnI2YTF8RmJuMnxBYmxpbTN8MjAxMDAwM0sxMVJpa3xNczRhOGF8U2dtczF8QWN0YTJ8Q3lwMjZjMXxDeXAyYzcwfFJycDEyfEFibGltMXxHZnJhMXw2MDMwNDk4RTA5UmlrfEIzZ2FsdDF8SWwxcjF8TXRjaDJ8VGhiczF8VG1lbTg3YnxOb3A1NnxUaGJkfEJjbDJsMXxLY25iMXxDZWJwYnxBcmhnZWYyNnxUaXBhcnB8R3BhdGNoNHxBZGFtdHNsNHxUcnA1M2lucDF8U2xjMjVhNTF8VG9tbTV8QW1icHxPcm0xfEx1cmFwMWx8Q3lwMmo4fFBya2FnM3xDeXAyN2ExfE1mc2QyYXxHamE0fFRtZW01MXxTdGVhcDR8QWJjYjFhfFNlcnBpbmE3fFVndDJiMzR8U3RiZDF8RmFtNDdlfFByc3M4fFNtcGQzfEdzdHQzfEdzdHQxfEZhbTExMGN8Q2hhZjFifEN5cDJjNTR8Q3lwMmMzN3xDeXAyYzUwfFBvZG58TGdyNXxBbmd8Q2hhYzF8VWd0MWExfFRmY3AybDF8VG9tdHxDeXAxYTJ8R2FzMXxQcHAxcjQyfE11cDl8SW5tdHxDZXMxZHxTZXRkNHxTdXNkNHxUaWZhfEZhbTIyMmF8Q3lwMjZiMXxQcnRuM3xSdG40cmwxfEJobXR8RG50dHxGb3NsMnxQcm9tMXxOZmUybDN8UHJjMXxDY25kMXxDZXMxY3xTbGMxM2EyfENjbDl8VG9wMmF8RmFtODRhfEFocnxLbGhsMzN8U2xjMjVhMzd8QWxkaDFhN3xFcm1ufEVsb3ZsM3xUaW1tOGExfENrYXAybHxTbGMyM2EyfEZhbTgzZHxFY3QyfEhnZmFjfExnYWxzNHxTeXQzfEZ1dDF8UmFiMzB8R2FzNnxSbmYxMjJ8NjQzMDU3M0YxMVJpa3xJc3luYTF8SnVuYnxSZng0fEhzZDE3YjZ8U3VuM3xQZXIxfFNvY3MzfEx0YnAyfEN5cDQ2YTF8TmZpbDN8TGFtYjN8SXRpaDN8TWF0MWF8Um5hc2U0fE51Z2djfFNjYXJhNXxTeWJ1fEFpZm0zfE1hczF8Q2FibGVzMXxBd2F0MnxSaXBwbHkxfFNsYzQzYTF8TXloN2J8RDYzMDAwM00yMVJpa3xQY2sxfEZhYnA1fExpbmdvNHxFdG5wcGx8U3l0bDF8RXh0bDF8VWd0MmIxfFVndDJiMzZ8VWd0MmExfFBya2cyfEhya3xLbnRjMXxOdXAyMDV8SmF6ZjF8UmVlcDF8TW9iMWF8TWNtMnxBdGc3fE1jbTN8TnVkdDE5fEFjbXNkfE1jbTZ8TWN0cDJ8RmFuY2l8QWNzbTJ8WmJlZDZ8TnJnMXxMcGx8Q2FscjN8TWNtNXxBc2YxYnxDZXMyY3xGYW5jYXxMYW1jMnxBcGgxYnxCbXA1fFR0a3xYaXJwMXxFY2hkYzF8U2dwbDF8SDJhZnkyfEJDMDU1MzI0fEZpZ25sMXxUZ3RwMnxTYXIxYnw5NTMwMDY4RTA3UmlrfFNsZm45fENkYzZ8RXJuMXxGb3hhMXxLbGhsMjh8SWZpMjdsMmJ8U2VycGluYTFkfFNlcnBpbmExZXxTZXJwaW5hMWF8SWRpMXxEdGx8TmVrMnxMZWN0MnxEZXBkYzFifFdkaGQxfFNvY3M0fEVzY28yfEFiY2M0fFRtdGM0fFBkemQyfEFybDVifE5jYWxkfFdpc3AxfEFsZzEwYnxTY244YXxLcnQ0fEtydDc5fE1jbTR8U2lkdDF8SHNwYTEzfE5yaXAxIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpClRDUE81IDwtIGdyZXAoYygiQWRhbXRzMXxVaHJmMXxTdG9uMXxQY2RoZ2MzfFByZWxpZDJ8Q2xjZjF8RmFkczF8QWxkaDFhMXxEb2NrOHxBMWNmfEhlbGxzfEN5cDJjNjV8QWJjYzJ8U29yY3MzfFBubGlwcnAxfFN5dGw1fFBvbGExfEVyY2M2bHxDZW5waXxSYWQ1MXxOdXNhcDF8TXlibDF8WmZwOTMxfENocm5hNHxTbGMxMGE1fFpmcDY4N3xDaGQxbHxQcm9rMXxMYWN0YjJ8QWdsfEltcGFkMXxDY25lMnxBbGcyfE11cDEzfE11cDJ8TXVwN3xNdXAxNHxUdGMzOWJ8QWRhbXRzbDF8Rm5kYzV8SXJzMXxTb3dhaGJ8S2xobDh8TnVkdDd8U2xjMTZhMTN8UmFiMTFmaXA0fFNudGcyfEFjb3Q2fFNnY2d8Qzl8RmFtMTcxYnxHcGF0MnxTcm1zfEl0Z2IzYnB8VWJlMnV8QTYzMDAwMUcyMVJpa3xTaGlzYTN8VWd0MmIzN3xDeGNsMTN8R2JwOHxTbGMxNWE0fFlieDN8U3VsdDJhNXxTdWx0MmEyfFN1bHQyYTF8U3VsdDJhNHxFdG5rMnxEcGVwMXw5NTMwMDc3QzA1UmlrfFVjazJ8UmltczJ8Q3lwNGYxNXxIMi1FYjF8Tm90Y2g0fEgyLVEyfERvY2sxMXxSbmYyNHxUZ20yfENvcTEwYnxLY25hMnxHYnAyYnxJZ2ZicDJ8TXlvbTN8Q29sNGEzIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCgpUQ1BPNiA8LSBncmVwKGMoIm5jUk5BX2ludGVyX2NocjE2XzEzNDEyfG5jUk5BX2ludGVyX2NocjJfMTkyM3xuY1JOQV9pbnRlcl9jaHI1XzQxOTd8bmNSTkFfaW50ZXJfY2hyOV84MTAzfG5jUk5BX2ludGVyX2NocjEwXzkyNTR8bmNSTkFfaW50ZXJfY2hyMThfMTQ2NTV8bmNSTkFfaW50ZXJfY2hyNl81MTM3fG5jUk5BX2FzX2NocjFfMzY5fG5jUk5BX2ludGVyX2NocjVfNDQyNHxuY1JOQV9pbnRlcl9jaHI1XzQ2MTl8bmNSTkFfYXNfY2hyNV80NzMxfG5jUk5BX2FzX2NocjVfNDc0NXxuY1JOQV9pbnRlcl9jaHI1XzQ3ODF8bmNSTkFfYXNfY2hyNl81MDM4fG5jUk5BX2ludGVyX2NocjZfNTYxMHxuY1JOQV9pbnRlcl9jaHI3XzU5MTN8bmNSTkFfaW50ZXJfY2hyN181OTE0fG5jUk5BX2FzX2NocjdfNjA1MHxuY1JOQV9pbnRlcl9jaHI3XzYwNzR8bmNSTkFfaW50ZXJfY2hyN182NDExfG5jUk5BX2ludGVyX2NocjFfNTUyfG5jUk5BX2ludGVyX2NocjFfNTQ3fG5jUk5BX2ludGVyX2NocjhfNjc0MXxuY1JOQV9pbnRlcl9jaHI4XzY5NDR8bmNSTkFfaW50ZXJfY2hyOF82OTU1fG5jUk5BX2ludGVyX2NocjlfNzc2NnxuY1JOQV9hc19jaHI5Xzc4NDN8bmNSTkFfYXNfY2hyOV83ODgwfG5jUk5BX2ludGVyX2NocjlfNzg4MXxuY1JOQV9pbnRlcl9jaHI5Xzc5Mzh8bmNSTkFfaW50ZXJfY2hyOV83OTk0fG5jUk5BX2ludGVyX2NocjlfNzk5MnxuY1JOQV9hc19jaHI5Xzg0MTl8bmNSTkFfaW50ZXJfY2hyMTBfODc5NnxuY1JOQV9pbnRlcl9jaHIxMF85MTk1fG5jUk5BX2FzX2NocjEwXzkzODV8bmNSTkFfYXNfY2hyMTBfOTQxMXxuY1JOQV9pbnRlcl9jaHIxMV85NTQzfG5jUk5BX2ludGVyX2NocjExXzEwMjA2fG5jUk5BX2FzX2NocjEyXzEwMjgxfG5jUk5BX2ludGVyX2NocjEyXzEwNjMwfG5jUk5BX2ludGVyX2NocjEyXzEwNzU0fG5jUk5BX2FzX2NocjEyXzEwNzYyfG5jUk5BX2ludGVyX2NocjEyXzEwODE0fG5jUk5BX2ludGVyX2NocjEyXzEwOTE2fG5jUk5BX2ludGVyX2NocjEyXzEwOTM4fG5jUk5BX2ludGVyX2NocjEzXzExMTI1fG5jUk5BX2ludGVyX2NocjEzXzExMTUzfG5jUk5BX2ludGVyX2NocjEzXzExMjAzfG5jUk5BX2ludGVyX2NocjEzXzExMjA0fG5jUk5BX2ludGVyX2NocjEzXzExMjAxfG5jUk5BX2ludGVyX2NocjEzXzExNDEyfG5jUk5BX2ludGVyX2NocjEzXzExNjAyfG5jUk5BX2FzX2NocjE0XzExOTA4fG5jUk5BX2FzX2NocjE0XzExOTE5fG5jUk5BX2FzX2NocjE0XzExOTkxfG5jUk5BX2ludGVyX2NocjE0XzEyMDYxfG5jUk5BX2ludGVyX2NocjE1XzEyNzc2fG5jUk5BX2ludGVyX2NocjE1XzEyODE5fG5jUk5BX2ludGVyX2NocjE2XzEzNDc3fG5jUk5BX2ludGVyX2NocjE3XzE0MDExfG5jUk5BX2FzX2NocjE4XzE0MzAyfG5jUk5BX2FzX2NocjE4XzE0NDYxfG5jUk5BX2ludGVyX2NocjE4XzE0NTg5fG5jUk5BX2FzX2NocjE4XzE0Njg5fG5jUk5BX2FzX2NocjE5XzE0ODgzfG5jUk5BX2ludGVyX2NocjE5XzE0OTQ5fG5jUk5BX2FzX2NocjE5XzE1MTI5fG5jUk5BX2ludGVyX2NocjJfMTQ3N3xuY1JOQV9hc19jaHIyXzE2NTJ8bmNSTkFfaW50ZXJfY2hyMl8xOTkwfG5jUk5BX2ludGVyX2NocjNfMjIzMnxuY1JOQV9pbnRlcl9jaHIzXzI1NTF8bmNSTkFfaW50ZXJfY2hyM18yNTUwfG5jUk5BX2ludGVyX2NocjNfMjYyOXxuY1JOQV9pbnRlcl9jaHIxXzY2fG5jUk5BX2ludGVyX2NocjFfNjN8bmNSTkFfaW50ZXJfY2hyMV82MnxuY1JOQV9hc19jaHIzXzI4Nzh8bmNSTkFfaW50ZXJfY2hyM18yOTAxfG5jUk5BX2ludGVyX2NocjNfMzAwM3xuY1JOQV9pbnRlcl9jaHI0XzMxNTd8bmNSTkFfYXNfY2hyNF8zODAwfG5jUk5BX2ludGVyX2NocjRfMzg2MnxuY1JOQV9pbnRlcl9jaHI0XzM4NjN8bmNSTkFfaW50ZXJfY2hyNV8zOTg4fG5jUk5BX2ludGVyX2NocjVfNDMxNXxuY1JOQV9pbnRlcl9jaHI1XzQzMjJ8bmNSTkFfaW50ZXJfY2hyNV80MzM1fG5jUk5BX2FzX2NocjFfNDAwfG5jUk5BX2ludHJhX2NocjVfNDcyOHxuY1JOQV9pbnRlcl9jaHI2XzQ4ODZ8bmNSTkFfYXNfY2hyNl81MTMyfG5jUk5BX2ludGVyX2NocjZfNTMxMHxuY1JOQV9pbnRlcl9jaHI2XzU0MjF8bmNSTkFfaW50ZXJfY2hyNl81NTAyfG5jUk5BX2ludGVyX2NocjZfNTcyMSIpLCB4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKClRDUE82LjIgPC0gZ3JlcChjKCJuY1JOQV9pbnRlcl9jaHI2XzU4MTd8bmNSTkFfYXNfY2hyN181OTU1fG5jUk5BX2ludGVyX2NocjdfNjA4NXxuY1JOQV9hc19jaHI3XzYxOTJ8bmNSTkFfaW50ZXJfY2hyN182MzY3fG5jUk5BX2ludGVyX2NocjdfNjM5MnxuY1JOQV9pbnRlcl9jaHI3XzY1MDh8bmNSTkFfaW50ZXJfY2hyN182NTEwfG5jUk5BX2ludGVyX2NocjFfNTcwfG5jUk5BX2ludGVyX2NocjFfNTcxfG5jUk5BX2ludGVyX2NocjFfNTY2fG5jUk5BX2ludGVyX2NocjFfNTY4fG5jUk5BX2ludGVyX2NocjFfNTY3fG5jUk5BX2ludGVyX2NocjhfNjc3NXxuY1JOQV9pbnRlcl9jaHIxXzU5MHxuY1JOQV9hc19jaHI4XzcwNzF8bmNSTkFfaW50ZXJfY2hyOF83MTQxfG5jUk5BX2ludGVyX2NocjFfNjEwfG5jUk5BX2ludHJhX2NocjFfNjExfG5jUk5BX2ludGVyX2NocjhfNzE2OXxuY1JOQV9pbnRyYV9jaHI4XzczMTJ8bmNSTkFfaW50cmFfY2hyOF83MzEwfG5jUk5BX2ludGVyX2NocjFfNjMzfG5jUk5BX2FzX2NocjhfNzUyMXxuY1JOQV9hc19jaHI4Xzc1Mjh8bmNSTkFfaW50ZXJfY2hyOF83NjEyfG5jUk5BX2ludGVyX2NocjhfNzY4M3xuY1JOQV9pbnRlcl9jaHI5XzgxMDV8bmNSTkFfaW50ZXJfY2hyOV84MDk5fG5jUk5BX2ludGVyX2NocjlfODEwNHxuY1JOQV9hc19jaHI5XzgxNzJ8bmNSTkFfaW50ZXJfY2hyOV84Mjc5fG5jUk5BX2FzX2NocjlfODMzNHxuY1JOQV9pbnRlcl9jaHI5XzgzNTB8bmNSTkFfaW50ZXJfY2hyMTBfODk5OXxuY1JOQV9pbnRlcl9jaHIxMF85MDAwfG5jUk5BX2ludGVyX2NocjEwXzkyMjJ8bmNSTkFfaW50cmFfY2hyMTFfOTU5M3xuY1JOQV9pbnRlcl9jaHIxMV85NjM2fG5jUk5BX2FzX2NocjExXzk3ODd8bmNSTkFfYXNfY2hyMTFfOTc5MHxuY1JOQV9pbnRlcl9jaHIxMV85OTk1fG5jUk5BX2ludGVyX2NocjEyXzEwNDIxfG5jUk5BX2ludGVyX2NocjEyXzEwNDc2fG5jUk5BX2ludGVyX2NocjEyXzEwNTQ5fG5jUk5BX2ludGVyX2NocjEyXzEwNjcyfG5jUk5BX2ludHJhX2NocjEyXzEwODY2fG5jUk5BX2ludHJhX2NocjEyXzEwODU5fG5jUk5BX2ludHJhX2NocjEyXzEwODUxfG5jUk5BX2ludGVyX2NocjEyXzEwOTQ5fG5jUk5BX2ludGVyX2NocjEzXzExMDc0fG5jUk5BX2ludGVyX2NocjEzXzExMDcwfG5jUk5BX2ludGVyX2NocjEzXzExMzk5fG5jUk5BX2ludGVyX2NocjEzXzExNDM4fG5jUk5BX2ludGVyX2NocjEzXzExNDQwfG5jUk5BX2ludGVyX2NocjE0XzExODUzfG5jUk5BX2ludGVyX2NocjE0XzExOTExfG5jUk5BX2ludGVyX2NocjE0XzExOTg3fG5jUk5BX2ludGVyX2NocjE0XzEyMDU4fG5jUk5BX2FzX2NocjE0XzEyMDc0fG5jUk5BX2ludGVyX2NocjE0XzEyMTkxfG5jUk5BX2ludGVyX2NocjE0XzEyMTkzfG5jUk5BX2ludGVyX2NocjE0XzEyMjA1fG5jUk5BX2ludGVyX2NocjE0XzEyMjkxfG5jUk5BX2ludGVyX2NocjE0XzEyMjk3fG5jUk5BX2ludGVyX2NocjE1XzEyNjA2fG5jUk5BX2FzX2NocjE1XzEyNjk3fG5jUk5BX2ludHJhX2NocjE1XzEyNzcxfG5jUk5BX2ludGVyX2NocjE1XzEyNzc3fG5jUk5BX2ludGVyX2NocjE2XzEyOTk4fG5jUk5BX2ludGVyX2NocjE2XzEzMTkwfG5jUk5BX2ludGVyX2NocjE2XzEzMzQ5fG5jUk5BX2ludGVyX2NocjE3XzEzNzQzfG5jUk5BX2ludGVyX2NocjE3XzEzODA4fG5jUk5BX2FzX2NocjE3XzEzODI4fG5jUk5BX2ludGVyX2NocjE3XzEzODQxfG5jUk5BX2ludGVyX2NocjE3XzEzODQyfG5jUk5BX2ludGVyX2NocjE3XzEzODc2fG5jUk5BX2ludGVyX2NocjE3XzEzOTE5fG5jUk5BX2ludGVyX2NocjE3XzE0MDE1fG5jUk5BX2ludGVyX2NocjE3XzE0MDg1fG5jUk5BX2ludGVyX2NocjE3XzE0MTI5fG5jUk5BX2ludGVyX2NocjE4XzE0MzM5fG5jUk5BX2ludGVyX2NocjE4XzE0NjU2fG5jUk5BX2ludGVyX2NocjE5XzE0NzE3fG5jUk5BX2ludGVyX2NocjE5XzE0ODU2fG5jUk5BX2ludGVyX2NocjE5XzE0ODU0fG5jUk5BX2ludGVyX2NocjE5XzE0OTUzfG5jUk5BX2ludGVyX2NocjE5XzE0OTUyfG5jUk5BX2ludGVyX2NocjJfMTQzNnxuY1JOQV9pbnRlcl9jaHIyXzE0OTJ8bmNSTkFfaW50ZXJfY2hyMl8xNTc3fG5jUk5BX2ludGVyX2NocjJfMTgyMXxuY1JOQV9pbnRlcl9jaHIyXzE4MjZ8bmNSTkFfaW50ZXJfY2hyMl8xODI3fG5jUk5BX2ludGVyX2NocjNfMjc2NHxuY1JOQV9hc19jaHIzXzI5MzZ8bmNSTkFfaW50ZXJfY2hyM18yOTgzfG5jUk5BX2ludGVyX2NocjRfMzE0MnxuY1JOQV9pbnRlcl9jaHI0XzMzMDZ8bmNSTkFfaW50ZXJfY2hyNF8zNTEyfG5jUk5BX2ludGVyX2NocjRfMzUyMXxuY1JOQV9pbnRlcl9jaHI0XzM2NzN8bmNSTkFfaW50ZXJfY2hyNF8zNzMyfG5jUk5BX2ludGVyX2NocjRfMzc3OHxuY1JOQV9hc19jaHI0XzM4NDN8bmNSTkFfYXNfY2hyMTBfOTAxNXxuY1JOQV9pbnRlcl9jaHIxOV8xNDg3M3xuY1JOQV9pbnRlcl9jaHIzXzIxNjV8bmNSTkFfaW50ZXJfY2hyMTBfODQ3MXxuY1JOQV9pbnRlcl9jaHIxOV8xNTA5N3xuY1JOQV9pbnRlcl9jaHIxMV8xMDE4OHxuY1JOQV9pbnRlcl9jaHIxXzQyMHxuY1JOQV9pbnRlcl9jaHI4XzczNjN8bmNSTkFfaW50ZXJfY2hyOF83NDIzfG5jUk5BX2ludGVyX2NocjhfNzQzMHxuY1JOQV9pbnRlcl9jaHIxMV85ODY0IikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCgoKVENQTzYuMSA8LSAgZ3JlcChjKCJuY1JOQV9pbnRlcl9jaHIxMV85OTI1fG5jUk5BX2ludGVyX2NocjExXzk5Njh8bmNSTkFfaW50ZXJfY2hyMV85MTR8bmNSTkFfaW50ZXJfY2hyMTZfMTMxNzZ8bmNSTkFfYXNfY2hyMThfMTQ2MDJ8bmNSTkFfaW50ZXJfY2hyM18yMTYyfG5jUk5BX2ludGVyX2NocjNfMjUwNHxuY1JOQV9hc19jaHI0XzMzMDB8bmNSTkFfaW50ZXJfY2hyNl81NzkzfG5jUk5BX2ludGVyX2NocjhfNzYxMHxuY1JOQV9hc19jaHI5Xzc5NTl8bmNSTkFfaW50ZXJfY2hyMTVfMTI4Njl8bmNSTkFfaW50ZXJfY2hyMThfMTQ0NDJ8bmNSTkFfaW50ZXJfY2hyMTlfMTUxNjl8bmNSTkFfaW50ZXJfY2hyMTlfMTUxNzl8bmNSTkFfaW50ZXJfY2hyMTlfMTUxNzd8bmNSTkFfaW50ZXJfY2hyMTlfMTUxNzF8bmNSTkFfaW50ZXJfY2hyMl8xNzI1fG5jUk5BX2ludGVyX2NocjNfMjU0M3xuY1JOQV9pbnRlcl9jaHI0XzMxMjB8bmNSTkFfYXNfY2hyNV80NjU1fG5jUk5BX2ludGVyX2NocjVfNDY1NHxuY1JOQV9hc19jaHI2XzUzMzV8bmNSTkFfaW50ZXJfY2hyN181OTk4fG5jUk5BX2ludGVyX2NocjlfODMwMXxuY1JOQV9hc19jaHIxMF84NDYwfG5jUk5BX2FzX2NocjExXzk3MDl8bmNSTkFfaW50ZXJfY2hyMV85MzF8bmNSTkFfaW50ZXJfY2hyMTVfMTI4MzR8bmNSTkFfaW50ZXJfY2hyMTZfMTM1MDl8bmNSTkFfaW50ZXJfY2hyMTZfMTM1MTB8bmNSTkFfYXNfY2hyMTZfMTM1MTJ8bmNSTkFfaW50ZXJfY2hyMThfMTQ2OTB8bmNSTkFfaW50ZXJfY2hyMTlfMTUwMDJ8bmNSTkFfaW50ZXJfY2hyMTlfMTUwMDR8bmNSTkFfaW50ZXJfY2hyMTZfMTMyMjV8bmNSTkFfaW50ZXJfY2hyMl8yMDE3fG5jUk5BX2ludGVyX2NocjZfNTI1M3xuY1JOQV9pbnRlcl9jaHI5Xzc3NjN8bmNSTkFfaW50ZXJfY2hyNV80Nzc3fG5jUk5BX2ludGVyX2NocjZfNTU1MXxuY1JOQV9pbnRlcl9jaHIxNF8xMTk0NXxuY1JOQV9hc19jaHI5XzgxNDJ8bmNSTkFfaW50ZXJfY2hyMl8xNDcxfG5jUk5BX2ludGVyX2NocjExXzEwMTg1fG5jUk5BX2ludGVyX2NocjlfODAwMHxuY1JOQV9pbnRlcl9jaHI0XzMyODJ8bmNSTkFfaW50ZXJfY2hyNV80NDk5fG5jUk5BX2ludGVyX2NocjFfNDk2fG5jUk5BX2ludGVyX2NocjhfNjg5NHxuY1JOQV9pbnRlcl9jaHI4XzY4OTZ8bmNSTkFfaW50ZXJfY2hyMTVfMTI4MzZ8bmNSTkFfaW50ZXJfY2hyMTlfMTQ5NDd8bmNSTkFfYXNfY2hyN182MDY1fG5jUk5BX2ludGVyX2NocjEzXzExMDMxfG5jUk5BX2ludGVyX2NocjRfMzE1NnxuY1JOQV9pbnRlcl9jaHI5Xzc4MDl8bmNSTkFfaW50ZXJfY2hyMTNfMTEzODV8bmNSTkFfaW50ZXJfY2hyNl81MjQ4fG5jUk5BX2ludGVyX2NocjlfNzg3NXxuY1JOQV9pbnRlcl9jaHIxXzc3NXxuY1JOQV9pbnRyYV9jaHIxMV85NTk0fG5jUk5BX2FzX2NocjE1XzEyOTU5fG5jUk5BX2ludGVyX2NocjVfNDMxNnxuY1JOQV9pbnRlcl9jaHIxMV85NjM1fG5jUk5BX2ludGVyX2NocjEzXzExMTAwfG5jUk5BX2ludGVyX2NocjE2XzEzNDI4fG5jUk5BX2ludGVyX2NocjE3XzE0MTMwfG5jUk5BX2ludGVyX2NocjNfMjcyMXxuY1JOQV9pbnRlcl9jaHI3XzYxMTN8bmNSTkFfYXNfY2hyNV80MzcyfG5jUk5BX2ludGVyX2NocjVfNDc3M3xuY1JOQV9hc19jaHI3XzU5MjF8bmNSTkFfaW50ZXJfY2hyN181OTM1fG5jUk5BX2FzX2NocjdfNjAwN3xuY1JOQV9pbnRlcl9jaHI3XzYwNzAiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKClRDUE83IDwtIGdyZXAoYygibmNSTkFfaW50ZXJfY2hyOV83OTg5fG5jUk5BX2ludGVyX2NocjlfODQxN3xuY1JOQV9hc19jaHIxMF85MDE2fG5jUk5BX2ludGVyX2NocjEwXzk0MTh8bmNSTkFfaW50ZXJfY2hyMTNfMTExNjN8bmNSTkFfaW50ZXJfY2hyMTVfMTIzMTl8bmNSTkFfaW50ZXJfY2hyMTZfMTMwNTB8bmNSTkFfaW50ZXJfY2hyMTZfMTMyMTF8bmNSTkFfaW50ZXJfY2hyMTdfMTQxODh8bmNSTkFfaW50ZXJfY2hyMTlfMTQ5ODd8bmNSTkFfYXNfY2hyMl8xMzQzfG5jUk5BX2ludGVyX2NocjJfMTU5NHxuY1JOQV9hc19jaHIzXzI5Njh8bmNSTkFfYXNfY2hyOF83MzMyfG5jUk5BX2ludGVyX2NocjExXzk5NjV8bmNSTkFfaW50ZXJfY2hyMTNfMTE2MjJ8bmNSTkFfaW50ZXJfY2hyMl8xOTk2fG5jUk5BX2FzX2NocjVfNDMyNXxuY1JOQV9pbnRlcl9jaHI3XzYwODd8bmNSTkFfaW50ZXJfY2hyN182MDk0fG5jUk5BX2ludGVyX2NocjdfNjY5MnxuY1JOQV9pbnRlcl9jaHIxXzU5MXxuY1JOQV9pbnRlcl9jaHI5Xzc4Nzh8bmNSTkFfaW50ZXJfY2hyOV84MTE4fG5jUk5BX2ludGVyX2NocjEwXzkxMjN8bmNSTkFfaW50ZXJfY2hyMTBfOTMxM3xuY1JOQV9pbnRlcl9jaHIxMl8xMDQ1NHxuY1JOQV9pbnRlcl9jaHIxM18xMTQzN3xuY1JOQV9pbnRlcl9jaHIxN18xMzg4OXxuY1JOQV9pbnRlcl9jaHIyXzIwMzd8bmNSTkFfaW50ZXJfY2hyM18yMTY4fG5jUk5BX2ludGVyX2NocjRfMzU0OXxuY1JOQV9pbnRlcl9jaHI5XzgzMDJ8bmNSTkFfaW50ZXJfY2hyMTBfOTI1NnxuY1JOQV9pbnRlcl9jaHIxMV85NDQyfG5jUk5BX2FzX2NocjE5XzE0Nzc3fG5jUk5BX2FzX2NocjE5XzE0Nzc5fG5jUk5BX2ludGVyX2NocjE5XzE0OTY3fG5jUk5BX2ludGVyX2NocjJfMTQzMHxuY1JOQV9pbnRlcl9jaHI0XzM2MTh8bmNSTkFfYXNfY2hyMTlfMTQ5NzZ8bmNSTkFfaW50ZXJfY2hyNV80MzM4fG5jUk5BX2FzX2NocjdfNTk5OXxuY1JOQV9hc19jaHI4XzczNTl8bmNSTkFfaW50ZXJfY2hyM18yOTg4fG5jUk5BX2ludGVyX2NocjJfMjAxNnxuY1JOQV9pbnRlcl9jaHI2XzUzMTZ8bmNSTkFfaW50ZXJfY2hyMV8yOTB8bmNSTkFfaW50ZXJfY2hyNV80Nzc1fG5jUk5BX2ludGVyX2NocjdfNjIyMHxuY1JOQV9pbnRlcl9jaHI3XzYyMjJ8bmNSTkFfaW50ZXJfY2hyOV84MTIyfG5jUk5BX2ludGVyX2NocjExXzk1OTl8bmNSTkFfaW50ZXJfY2hyMTJfMTA5MTB8bmNSTkFfYXNfY2hyMTVfMTI5MjB8bmNSTkFfaW50ZXJfY2hyMTZfMTMxNzB8bmNSTkFfaW50ZXJfY2hyMTZfMTMxNzd8bmNSTkFfaW50ZXJfY2hyMTdfMTQxNTF8bmNSTkFfaW50ZXJfY2hyMTdfMTQxNjJ8bmNSTkFfaW50ZXJfY2hyM18yMTY2fG5jUk5BX2ludGVyX2NocjRfMzY1MXxuY1JOQV9pbnRlcl9jaHI1XzM5NzR8bmNSTkFfaW50ZXJfY2hyOV84MDY3fG5jUk5BX2ludGVyX2NocjEwXzkxODF8bmNSTkFfaW50ZXJfY2hyMV8xMjl8bmNSTkFfaW50ZXJfY2hyMTVfMTI3OTZ8bmNSTkFfYXNfY2hyMl8xMjA3fG5jUk5BX2ludGVyX2NocjE5XzE1MTc1fG5jUk5BX2ludGVyX2NocjJfMjAxMnxuY1JOQV9pbnRlcl9jaHIyXzIwMTF8bmNSTkFfaW50ZXJfY2hyMV8zNjV8bmNSTkFfaW50ZXJfY2hyNV80NDkxfG5jUk5BX2FzX2NocjZfNTYzNXxuY1JOQV9pbnRlcl9jaHI2XzU3MTB8bmNSTkFfaW50ZXJfY2hyN182MTEwfG5jUk5BX2ludGVyX2NocjdfNjQ4OXxuY1JOQV9pbnRlcl9jaHI3XzY1ODd8bmNSTkFfaW50ZXJfY2hyN182NjM5fG5jUk5BX2ludGVyX2NocjhfNjczOHxuY1JOQV9pbnRlcl9jaHI4XzY3NTl8bmNSTkFfaW50ZXJfY2hyOF82NzY2fG5jUk5BX2ludGVyX2NocjhfNjk0MnxuY1JOQV9pbnRlcl9jaHI4XzY5NDZ8bmNSTkFfaW50ZXJfY2hyOF83MDc0fG5jUk5BX2ludGVyX2NocjhfNzE4MHxuY1JOQV9pbnRlcl9jaHI4Xzc0MzJ8bmNSTkFfaW50ZXJfY2hyOV83NjkxfG5jUk5BX2ludGVyX2NocjlfNzgxOXxuY1JOQV9pbnRlcl9jaHI5Xzc4MTN8bmNSTkFfaW50ZXJfY2hyMV8xMTN8bmNSTkFfaW50ZXJfY2hyOV83ODg1fG5jUk5BX2FzX2NocjlfODA0M3xuY1JOQV9pbnRlcl9jaHI5XzgwNDl8bmNSTkFfYXNfY2hyOV84MzE3fG5jUk5BX2ludGVyX2NocjEwXzg2OTciKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKClRDUE83LjEgIDwtIGdyZXAoYygibmNSTkFfaW50ZXJfY2hyMTBfODc3NnxuY1JOQV9pbnRlcl9jaHIxMF85MTI1fG5jUk5BX2ludGVyX2NocjEwXzkzNjZ8bmNSTkFfaW50ZXJfY2hyMTBfOTM2M3xuY1JOQV9pbnRyYV9jaHIxMV85NjIzfG5jUk5BX2FzX2NocjFfODE0fG5jUk5BX2ludGVyX2NocjExXzk3NDN8bmNSTkFfaW50ZXJfY2hyMV85MTN8bmNSTkFfaW50ZXJfY2hyMTJfMTA1MDl8bmNSTkFfaW50ZXJfY2hyMTJfMTA1Mzl8bmNSTkFfaW50ZXJfY2hyMTJfMTA3MTN8bmNSTkFfaW50ZXJfY2hyMTJfMTA5NDN8bmNSTkFfYXNfY2hyMTNfMTExMjd8bmNSTkFfYXNfY2hyMV85Nzh8bmNSTkFfaW50ZXJfY2hyMTNfMTEyMjJ8bmNSTkFfaW50ZXJfY2hyMTNfMTEzNjF8bmNSTkFfaW50ZXJfY2hyMTNfMTE1NzJ8bmNSTkFfYXNfY2hyMTNfMTE3ODd8bmNSTkFfaW50ZXJfY2hyMl8xMDUwfG5jUk5BX2ludGVyX2NocjE0XzExOTM4fG5jUk5BX2FzX2NocjE0XzExOTU3fG5jUk5BX2ludGVyX2NocjE0XzEyMDM0fG5jUk5BX2ludGVyX2NocjE0XzEyMDMyfG5jUk5BX2ludGVyX2NocjE0XzEyMDMxfG5jUk5BX2ludGVyX2NocjE1XzEyNDQ2fG5jUk5BX2FzX2NocjE1XzEyODE4fG5jUk5BX2ludGVyX2NocjE1XzEyODkwfG5jUk5BX2FzX2NocjE1XzEyOTQyfG5jUk5BX2ludGVyX2NocjE2XzEzMTczfG5jUk5BX2FzX2NocjFfMTUzfG5jUk5BX2ludGVyX2NocjE3XzEzODU3fG5jUk5BX2ludGVyX2NocjE3XzEzOTI0fG5jUk5BX2ludGVyX2NocjE3XzEzOTgzfG5jUk5BX2ludGVyX2NocjE3XzE0MDI2fG5jUk5BX2FzX2NocjE3XzE0MDQxfG5jUk5BX2ludGVyX2NocjE3XzE0MTAyfG5jUk5BX2FzX2NocjE4XzE0MzY5fG5jUk5BX2FzX2NocjE5XzE0NzgyfG5jUk5BX2ludGVyX2NocjJfMTMxMHxuY1JOQV9pbnRlcl9jaHIxOV8xNDg3NHxuY1JOQV9pbnRlcl9jaHIxOV8xNDg4MHxuY1JOQV9pbnRlcl9jaHJYXzE1NDQ5fG5jUk5BX2ludGVyX2NocjJfMTQyM3xuY1JOQV9pbnRlcl9jaHIyXzE0OTd8bmNSTkFfaW50ZXJfY2hyMl8xNTAxfG5jUk5BX2ludGVyX2NocjFfMzF8bmNSTkFfaW50ZXJfY2hyMl8xODI5fG5jUk5BX2FzX2NocjJfMTg3MHxuY1JOQV9pbnRlcl9jaHIyXzE5NTh8bmNSTkFfaW50ZXJfY2hyMl8yMTI0fG5jUk5BX2ludGVyX2NocjNfMjE0MHxuY1JOQV9pbnRlcl9jaHIzXzIzMTF8bmNSTkFfaW50ZXJfY2hyM18yNTA1fG5jUk5BX2ludGVyX2NocjNfMjc0M3xuY1JOQV9pbnRlcl9jaHIzXzI5NDB8bmNSTkFfaW50ZXJfY2hyNF8zMDA5fG5jUk5BX2ludGVyX2NocjRfMzAxMHxuY1JOQV9pbnRlcl9jaHI0XzMxNjN8bmNSTkFfYXNfY2hyNF8zNjU0fG5jUk5BX2ludGVyX2NocjRfMzY4OXxuY1JOQV9pbnRlcl9jaHI0XzM4Njd8bmNSTkFfaW50ZXJfY2hyNV80MDEwfG5jUk5BX2ludGVyX2NocjVfNDEyM3xuY1JOQV9pbnRlcl9jaHI1XzQxMzh8bmNSTkFfaW50ZXJfY2hyNV80MzM2fG5jUk5BX2ludGVyX2NocjVfNDMzN3xuY1JOQV9pbnRlcl9jaHI1XzQ2NTZ8bmNSTkFfaW50ZXJfY2hyNV80Njg1fG5jUk5BX2FzX2NocjVfNDY4N3xuY1JOQV9pbnRlcl9jaHI2XzQ4Mjh8bmNSTkFfaW50ZXJfY2hyNl81MTU0fG5jUk5BX2ludGVyX2NocjZfNTY3NXxuY1JOQV9pbnRlcl9jaHI2XzU2ODR8bmNSTkFfaW50ZXJfY2hyNl81NzIzfG5jUk5BX2FzX2NocjZfNTg2MXxuY1JOQV9pbnRlcl9jaHI3XzYwOTd8bmNSTkFfYXNfY2hyN182Mzg0fG5jUk5BX2ludGVyX2NocjdfNjU1OXxuY1JOQV9pbnRlcl9jaHI3XzY3MDl8bmNSTkFfaW50ZXJfY2hyOF82ODg3fG5jUk5BX2ludGVyX2NocjhfNzA3MnxuY1JOQV9pbnRlcl9jaHI4XzcxMDUiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKVENQTzcuMiA8LSAgZ3JlcChjKCJuY1JOQV9hc19jaHI4XzcxOTB8bmNSTkFfaW50cmFfY2hyOF83MzI0fG5jUk5BX2ludGVyX2NocjFfNjM1fG5jUk5BX2ludGVyX2NocjFfNjMwfG5jUk5BX2ludGVyX2NocjhfNzUxMnxuY1JOQV9pbnRlcl9jaHIxXzY0OHxuY1JOQV9pbnRlcl9jaHIxXzY3OHxuY1JOQV9pbnRlcl9jaHI5Xzc5OTZ8bmNSTkFfaW50ZXJfY2hyOV83OTk1fG5jUk5BX2ludGVyX2NocjlfODAyMnxuY1JOQV9pbnRlcl9jaHI5XzgxMDB8bmNSTkFfaW50cmFfY2hyOV84MTcxfG5jUk5BX2ludGVyX2NocjEwXzkxMjh8bmNSTkFfaW50ZXJfY2hyMTBfOTE5OXxuY1JOQV9pbnRyYV9jaHIxMV85NTk1fG5jUk5BX2ludGVyX2NocjExXzk2MDB8bmNSTkFfaW50ZXJfY2hyMTFfOTY1MXxuY1JOQV9hc19jaHIxMV85NjYzfG5jUk5BX2FzX2NocjExXzk2ODR8bmNSTkFfaW50ZXJfY2hyMTFfOTc4MHxuY1JOQV9pbnRlcl9jaHIxMV85Nzg0fG5jUk5BX2ludGVyX2NocjExXzk5OTF8bmNSTkFfaW50ZXJfY2hyMTFfMTAwNTF8bmNSTkFfaW50ZXJfY2hyMTJfMTA0MTV8bmNSTkFfaW50cmFfY2hyMTJfMTA1MDh8bmNSTkFfaW50ZXJfY2hyMTJfMTA1NDN8bmNSTkFfaW50ZXJfY2hyMTJfMTA2Mjh8bmNSTkFfaW50cmFfY2hyMTJfMTA4NzB8bmNSTkFfaW50cmFfY2hyMTJfMTA4NzJ8bmNSTkFfaW50cmFfY2hyMTJfMTA4NjN8bmNSTkFfaW50cmFfY2hyMTJfMTA4NTR8bmNSTkFfaW50cmFfY2hyMTJfMTA4NTZ8bmNSTkFfaW50cmFfY2hyMTJfMTA4NTd8bmNSTkFfaW50ZXJfY2hyMTJfMTA4OTV8bmNSTkFfaW50ZXJfY2hyMTJfMTA5Nzh8bmNSTkFfaW50ZXJfY2hyMTNfMTExOTl8bmNSTkFfaW50ZXJfY2hyMTRfMTE4NTF8bmNSTkFfaW50ZXJfY2hyMTRfMTIwMTZ8bmNSTkFfaW50ZXJfY2hyMTRfMTIxNDV8bmNSTkFfaW50ZXJfY2hyMTRfMTIxNTR8bmNSTkFfaW50ZXJfY2hyMTRfMTIyMzl8bmNSTkFfaW50ZXJfY2hyMTRfMTIyOTB8bmNSTkFfYXNfY2hyMTRfMTIzMTR8bmNSTkFfaW50ZXJfY2hyMTVfMTIzNjh8bmNSTkFfaW50ZXJfY2hyMl8xMDk3fG5jUk5BX2FzX2NocjJfMTEwMXxuY1JOQV9hc19jaHIxNV8xMjY4MnxuY1JOQV9hc19jaHIxNl8xMzE0NXxuY1JOQV9pbnRlcl9jaHIxNl8xMzI3MHxuY1JOQV9pbnRlcl9jaHIxNl8xMzMxNnxuY1JOQV9pbnRlcl9jaHIxNl8xMzMxN3xuY1JOQV9pbnRlcl9jaHIxN18xMzUzOXxuY1JOQV9hc19jaHIxN18xMzczMXxuY1JOQV9pbnRlcl9jaHIxN18xNDEzMnxuY1JOQV9pbnRlcl9jaHIxOF8xNDMzOHxuY1JOQV9pbnRlcl9jaHIxOF8xNDMzNnxuY1JOQV9pbnRlcl9jaHIxOF8xNDMzN3xuY1JOQV9pbnRlcl9jaHIxOF8xNDY3NHxuY1JOQV9pbnRlcl9jaHIxOV8xNDc5MHxuY1JOQV9pbnRlcl9jaHIxOV8xNDg5MnxuY1JOQV9pbnRlcl9jaHIxOV8xNDk5OXxuY1JOQV9pbnRlcl9jaHIxOV8xNTEzNnxuY1JOQV9pbnRlcl9jaHJYXzE1MjQ4fG5jUk5BX2ludGVyX2NoclhfMTUyNDB8bmNSTkFfaW50ZXJfY2hyWF8xNTM4OXxuY1JOQV9pbnRlcl9jaHIyXzE2ODZ8bmNSTkFfaW50ZXJfY2hyMl8xNzM2fG5jUk5BX2ludHJhX2NocjJfMTc5NnxuY1JOQV9pbnRlcl9jaHIyXzIxMTJ8bmNSTkFfaW50ZXJfY2hyM18yNTc0fG5jUk5BX2ludGVyX2NocjRfMzE2MXxuY1JOQV9pbnRlcl9jaHI0XzMxODR8bmNSTkFfYXNfY2hyNF8zMjA2fG5jUk5BX2FzX2NocjRfMzMxMHxuY1JOQV9pbnRlcl9jaHI0XzM0MjR8bmNSTkFfaW50ZXJfY2hyNF8zNDIyfG5jUk5BX2ludGVyX2NocjRfMzcyM3xuY1JOQV9hc19jaHI4XzczMzN8bmNSTkFfYXNfY2hyNV80NzQ0fG5jUk5BX2ludGVyX2NocjVfNDc0NnxuY1JOQV9pbnRlcl9jaHI2XzU2Mzh8bmNSTkFfaW50ZXJfY2hyN182MTA4fG5jUk5BX2ludGVyX2NocjdfNjEwOXxuY1JOQV9hc19jaHIxM18xMTAyNXxuY1JOQV9pbnRlcl9jaHIxNF8xMjIwMXxuY1JOQV9pbnRlcl9jaHIxNV8xMjQzOXxuY1JOQV9pbnRlcl9jaHIxNV8xMjgxNXxuY1JOQV9pbnRlcl9jaHIxOF8xNDIyM3xuY1JOQV9hc19jaHIxXzIyMnxuY1JOQV9pbnRlcl9jaHI4XzY3NDR8bmNSTkFfaW50ZXJfY2hyOF83MzM0fG5jUk5BX2ludGVyX2NocjJfMTQyNXxuY1JOQV9pbnRlcl9jaHIyXzE0MjZ8bmNSTkFfaW50ZXJfY2hyM18yNDEzfG5jUk5BX2ludGVyX2NocjNfMjQxMHxuY1JOQV9pbnRlcl9jaHIzXzI0MTF8bmNSTkFfaW50ZXJfY2hyNV80NDA3fG5jUk5BX2ludGVyX2NocjZfNTI0OXxuY1JOQV9pbnRlcl9jaHI4Xzc1MTF8bmNSTkFfaW50ZXJfY2hyOV83ODc0fG5jUk5BX2ludGVyX2NocjlfODA1NnxuY1JOQV9hc19jaHI5XzgzOTN8bmNSTkFfaW50ZXJfY2hyMTNfMTEyNTR8bmNSTkFfaW50cmFfY2hyMl8xMDU3fG5jUk5BX2FzX2NocjE0XzEyMzE1fG5jUk5BX2ludGVyX2NocjE1XzEyNjg0fG5jUk5BX2ludGVyX2NocjE1XzEyOTM3fG5jUk5BX2ludGVyX2NocjE3XzEzNjkyfG5jUk5BX2ludGVyX2NocjE3XzE0MTc1fG5jUk5BX2ludGVyX2NocjE4XzE0Njg4fG5jUk5BX2ludHJhX2NocjE5XzE0NzczfG5jUk5BX2ludGVyX2NocjNfMjE2OXxuY1JOQV9hc19jaHI0XzM1MzciKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKClRDUE84IDwtIGdyZXAoYygibmNSTkFfaW50ZXJfY2hyNV80NzUwfG5jUk5BX2ludGVyX2NocjdfNjM5MHxuY1JOQV9pbnRlcl9jaHI5XzgzMDB8bmNSTkFfaW50ZXJfY2hyMTNfMTExMTZ8bmNSTkFfaW50ZXJfY2hyMTVfMTI4MzV8bmNSTkFfaW50ZXJfY2hyNl81MzE4fG5jUk5BX2ludGVyX2NocjExXzk5MTR8bmNSTkFfYXNfY2hyMTJfMTA5NzR8bmNSTkFfaW50ZXJfY2hyMTRfMTIxOTl8bmNSTkFfaW50ZXJfY2hyMTVfMTI4MjR8bmNSTkFfaW50cmFfY2hyMTlfMTUwMDh8bmNSTkFfYXNfY2hyMTdfMTM4MzR8bmNSTkFfaW50ZXJfY2hyMTlfMTQ5NDZ8bmNSTkFfaW50ZXJfY2hyNV80MTUwfG5jUk5BX2ludGVyX2NocjVfNDE0OXxuY1JOQV9hc19jaHI1XzQxNTd8bmNSTkFfYXNfY2hyNV80MTU2fG5jUk5BX2ludGVyX2NocjVfNDE4MHxuY1JOQV9pbnRlcl9jaHI1XzQyNDJ8bmNSTkFfaW50ZXJfY2hyMV8zNjZ8bmNSTkFfaW50ZXJfY2hyNV80MjczfG5jUk5BX2FzX2NocjVfNDI3NnxuY1JOQV9hc19jaHI1XzQzNzB8bmNSTkFfaW50cmFfY2hyNV80Mzg4fG5jUk5BX2ludGVyX2NocjVfNDQwMnxuY1JOQV9pbnRlcl9jaHI1XzQ1MDd8bmNSTkFfaW50ZXJfY2hyNV80NTMyfG5jUk5BX2ludGVyX2NocjVfNDU2NHxuY1JOQV9pbnRlcl9jaHI1XzQ1NjB8bmNSTkFfYXNfY2hyMV80MDR8bmNSTkFfYXNfY2hyNV80NzEyfG5jUk5BX2ludGVyX2NocjVfNDc3NHxuY1JOQV9pbnRlcl9jaHI1XzQ3NzZ8bmNSTkFfaW50ZXJfY2hyNV80Nzg1fG5jUk5BX2ludGVyX2NocjVfNDc4NHxuY1JOQV9pbnRlcl9jaHI1XzQ3ODN8bmNSTkFfYXNfY2hyNl81MTE0fG5jUk5BX2ludGVyX2NocjZfNTExN3xuY1JOQV9pbnRlcl9jaHI2XzUxMjV8bmNSTkFfaW50ZXJfY2hyNl81MTI3fG5jUk5BX2ludGVyX2NocjZfNTE1OXxuY1JOQV9pbnRlcl9jaHIxXzQ0NHxuY1JOQV9hc19jaHI2XzUyNTB8bmNSTkFfaW50ZXJfY2hyMV80NjN8bmNSTkFfaW50ZXJfY2hyNl81MzA0fG5jUk5BX2ludGVyX2NocjZfNTMxM3xuY1JOQV9pbnRlcl9jaHI2XzUzMjN8bmNSTkFfaW50ZXJfY2hyNl81MzcwfG5jUk5BX2ludGVyX2NocjZfNTQyOXxuY1JOQV9pbnRlcl9jaHI2XzU1NTJ8bmNSTkFfaW50ZXJfY2hyNl81NTU3fG5jUk5BX2ludGVyX2NocjZfNTU2M3xuY1JOQV9pbnRlcl9jaHI2XzU1ODJ8bmNSTkFfYXNfY2hyNl81NTg3fG5jUk5BX2ludGVyX2NocjZfNTYzMHxuY1JOQV9pbnRlcl9jaHI2XzU2NzN8bmNSTkFfYXNfY2hyN181OTM5fG5jUk5BX2ludGVyX2NocjdfNTk5MHxuY1JOQV9hc19jaHI3XzYwMTJ8bmNSTkFfaW50ZXJfY2hyN182MDIyfG5jUk5BX2ludGVyX2NocjdfNjEwMXxuY1JOQV9pbnRlcl9jaHI3XzYxMTh8bmNSTkFfaW50ZXJfY2hyN182MTE1fG5jUk5BX2ludGVyX2NocjdfNjExOXxuY1JOQV9pbnRlcl9jaHI3XzYxMjF8bmNSTkFfaW50ZXJfY2hyN182MTE0fG5jUk5BX2ludGVyX2NocjdfNjIyM3xuY1JOQV9pbnRlcl9jaHI3XzYyMjF8bmNSTkFfYXNfY2hyN182Mjg4fG5jUk5BX2ludGVyX2NocjdfNjMzOHxuY1JOQV9pbnRlcl9jaHI4XzY4NjF8bmNSTkFfYXNfY2hyOF82OTYzfG5jUk5BX2ludGVyX2NocjhfNzAxMnxuY1JOQV9pbnRlcl9jaHI4XzcyNTZ8bmNSTkFfaW50ZXJfY2hyOF83MjgwfG5jUk5BX2FzX2NocjhfNzMzMXxuY1JOQV9pbnRlcl9jaHI4XzczMzB8bmNSTkFfaW50ZXJfY2hyOF83MzYyfG5jUk5BX2FzX2NocjhfNzM2OXxuY1JOQV9pbnRlcl9jaHI4XzczOTR8bmNSTkFfaW50ZXJfY2hyOF83NDI0fG5jUk5BX2ludGVyX2NocjhfNzYwM3xuY1JOQV9pbnRlcl9jaHI4Xzc2NDl8bmNSTkFfaW50ZXJfY2hyOF83NjUwfG5jUk5BX2ludGVyX2NocjlfNzc1NHxuY1JOQV9pbnRlcl9jaHI5Xzc4NzN8bmNSTkFfYXNfY2hyOV83OTMxfG5jUk5BX2FzX2NocjlfNzk0N3xuY1JOQV9hc19jaHI5Xzc5NDl8bmNSTkFfaW50ZXJfY2hyOV84MDE2fG5jUk5BX2ludGVyX2NocjlfODAxNXxuY1JOQV9pbnRlcl9jaHI5XzgxMTd8bmNSTkFfaW50ZXJfY2hyOV84MTIzfG5jUk5BX2ludGVyX2NocjlfODEyMXxuY1JOQV9pbnRlcl9jaHI5XzgxMzJ8bmNSTkFfYXNfY2hyOV84MjcxfG5jUk5BX2ludGVyX2NocjlfODM5NnxuY1JOQV9pbnRlcl9jaHIxXzExNXxuY1JOQV9pbnRlcl9jaHIxXzE0fG5jUk5BX2ludGVyX2NocjEwXzg4Mjl8bmNSTkFfaW50ZXJfY2hyMTBfODk1MHxuY1JOQV9pbnRlcl9jaHIxMF84OTUxfG5jUk5BX2ludGVyX2NocjEwXzkwMTF8bmNSTkFfYXNfY2hyMTBfOTAwN3xuY1JOQV9hc19jaHIxMF85MDIzfG5jUk5BX2ludGVyX2NocjEwXzkxMzh8bmNSTkFfYXNfY2hyMTBfOTI0MHxuY1JOQV9pbnRlcl9jaHIxMF85MjQ1fG5jUk5BX2FzX2NocjEwXzkzODl8bmNSTkFfaW50ZXJfY2hyMTBfOTQwOXxuY1JOQV9pbnRlcl9jaHIxMV85NjcwfG5jUk5BX2ludGVyX2NocjExXzk2NzR8bmNSTkFfYXNfY2hyMTFfOTY4OHxuY1JOQV9hc19jaHIxMV85NjkyfG5jUk5BX2ludGVyX2NocjExXzk4MzN8bmNSTkFfaW50ZXJfY2hyMTFfOTg2MnxuY1JOQV9pbnRlcl9jaHIxMV85ODczfG5jUk5BX2ludGVyX2NocjExXzk5MjZ8bmNSTkFfYXNfY2hyMTFfOTkyOHxuY1JOQV9pbnRlcl9jaHIxMV85OTM4fG5jUk5BX2FzX2NocjExXzk5NDB8bmNSTkFfaW50ZXJfY2hyMTFfOTkzOXxuY1JOQV9pbnRlcl9jaHIxXzg4OSIpLHggPSByb3duYW1lcyhHMTcyLnVtaXMpLCB2YWx1ZSA9IEZBTFNFKQoKVENQTzguMSA8LSBncmVwKGMoIm5jUk5BX2ludGVyX2NocjExXzEwMDg3fG5jUk5BX2FzX2NocjExXzEwMTMyfG5jUk5BX2ludGVyX2NocjExXzEwMTQ4fG5jUk5BX2FzX2NocjExXzEwMTQ5fG5jUk5BX2ludGVyX2NocjExXzEwMjAyfG5jUk5BX2ludGVyX2NocjExXzEwMjAxfG5jUk5BX2ludGVyX2NocjExXzEwMjExfG5jUk5BX2ludGVyX2NocjFfOTE1fG5jUk5BX2ludGVyX2NocjEyXzEwNDEyfG5jUk5BX2ludGVyX2NocjEyXzEwNDExfG5jUk5BX2ludGVyX2NocjFfOTI4fG5jUk5BX2ludGVyX2NocjEyXzEwNTczfG5jUk5BX2ludGVyX2NocjEyXzEwNjI5fG5jUk5BX2FzX2NocjEyXzEwNjU1fG5jUk5BX2ludGVyX2NocjEyXzEwNjU3fG5jUk5BX2ludGVyX2NocjEyXzEwNjY1fG5jUk5BX2ludGVyX2NocjEyXzEwNjgxfG5jUk5BX2FzX2NocjEyXzEwNzY0fG5jUk5BX2ludGVyX2NocjFfOTQ4fG5jUk5BX2ludGVyX2NocjFfOTQ5fG5jUk5BX2ludGVyX2NocjEyXzEwODE5fG5jUk5BX2ludGVyX2NocjEyXzEwODgxfG5jUk5BX2ludGVyX2NocjEyXzEwODkzfG5jUk5BX2FzX2NocjEzXzExMDY4fG5jUk5BX2ludGVyX2NocjEzXzExMDY5fG5jUk5BX2ludGVyX2NocjEzXzExMjM3fG5jUk5BX2ludGVyX2NocjEzXzExMjM2fG5jUk5BX2ludGVyX2NocjEzXzExMjE2fG5jUk5BX2ludGVyX2NocjEzXzExMjQyfG5jUk5BX2ludGVyX2NocjEzXzExMjU1fG5jUk5BX2ludGVyX2NocjFfMTAwMHxuY1JOQV9pbnRlcl9jaHIxM18xMTQzOXxuY1JOQV9hc19jaHIxM18xMTQ4NnxuY1JOQV9pbnRlcl9jaHIxM18xMTY1MXxuY1JOQV9pbnRlcl9jaHIxM18xMTc1MnxuY1JOQV9pbnRlcl9jaHIxM18xMTc3MXxuY1JOQV9pbnRlcl9jaHIyXzEwNDl8bmNSTkFfaW50ZXJfY2hyMTRfMTE5NTB8bmNSTkFfaW50ZXJfY2hyMTRfMTE5NDR8bmNSTkFfaW50ZXJfY2hyMTRfMTE5NDZ8bmNSTkFfaW50ZXJfY2hyMTRfMTE5NDl8bmNSTkFfaW50ZXJfY2hyMTRfMTE5ODl8bmNSTkFfaW50ZXJfY2hyMTRfMTE5OTh8bmNSTkFfaW50ZXJfY2hyMTRfMTE5OTl8bmNSTkFfYXNfY2hyMTRfMTIxMTF8bmNSTkFfYXNfY2hyMTRfMTIxNjZ8bmNSTkFfaW50ZXJfY2hyMTRfMTIxOTh8bmNSTkFfaW50ZXJfY2hyMTRfMTIyMDB8bmNSTkFfaW50ZXJfY2hyMl8xMDc3fG5jUk5BX2ludGVyX2NocjJfMTA3OHxuY1JOQV9pbnRlcl9jaHIxNV8xMjMzOHxuY1JOQV9pbnRlcl9jaHIxNV8xMjQ4OXxuY1JOQV9pbnRlcl9jaHIxNV8xMjUxNHxuY1JOQV9hc19jaHIxNV8xMjU0MnxuY1JOQV9pbnRlcl9jaHIxNV8xMjYzM3xuY1JOQV9hc19jaHIxNV8xMjY3N3xuY1JOQV9pbnRlcl9jaHIxNV8xMjY4NXxuY1JOQV9hc19jaHIxNV8xMjcwNnxuY1JOQV9pbnRyYV9jaHIxNV8xMjcxNXxuY1JOQV9pbnRlcl9jaHIxNV8xMjcxOXxuY1JOQV9pbnRlcl9jaHIxNV8xMjcxOCIpLHggPSByb3duYW1lcyhHMTcyLnVtaXMpLCB2YWx1ZSA9IEZBTFNFKQoKVENQTzguMiA8LSBncmVwKGMoIm5jUk5BX2ludGVyX2NocjE1XzEyNzIwfG5jUk5BX2FzX2NocjE1XzEyNzIxfG5jUk5BX2ludGVyX2NocjE1XzEyNzQ1fG5jUk5BX2ludGVyX2NocjE1XzEyODIzfG5jUk5BX2ludGVyX2NocjE1XzEyODc1fG5jUk5BX2ludGVyX2NocjE1XzEyOTE2fG5jUk5BX2ludGVyX2NocjE1XzEyOTM2fG5jUk5BX2ludGVyX2NocjE1XzEyOTUzfG5jUk5BX2ludGVyX2NocjE1XzEyOTU0fG5jUk5BX2ludGVyX2NocjE2XzEzMDQ5fG5jUk5BX2ludGVyX2NocjE2XzEzMTcxfG5jUk5BX2FzX2NocjE2XzEzMjI3fG5jUk5BX2ludGVyX2NocjE2XzEzMzQwfG5jUk5BX2ludGVyX2NocjE2XzEzNDM0fG5jUk5BX2ludGVyX2NocjE2XzEzNDcwfG5jUk5BX2ludGVyX2NocjE3XzEzNjgxfG5jUk5BX2ludHJhX2NocjE3XzEzODk0fG5jUk5BX2FzX2NocjE3XzEzOTA1fG5jUk5BX2ludGVyX2NocjE3XzEzOTM5fG5jUk5BX2ludGVyX2NocjE3XzEzOTM4fG5jUk5BX2ludGVyX2NocjE3XzE0MTYzfG5jUk5BX2FzX2NocjE3XzE0MTczfG5jUk5BX2ludGVyX2NocjE3XzE0MTc2fG5jUk5BX2ludGVyX2NocjE4XzE0MzE3fG5jUk5BX2ludGVyX2NocjE4XzE0MzIxfG5jUk5BX2ludGVyX2NocjE4XzE0MzIzfG5jUk5BX2ludGVyX2NocjE4XzE0MzMxfG5jUk5BX2ludGVyX2NocjE4XzE0MzMwfG5jUk5BX2ludGVyX2NocjE4XzE0MzI4fG5jUk5BX2ludGVyX2NocjE4XzE0MzI0fG5jUk5BX2FzX2NocjE4XzE0NDA4fG5jUk5BX2ludGVyX2NocjE4XzE0NTM0fG5jUk5BX2ludGVyX2NocjE4XzE0NTkwfG5jUk5BX2ludGVyX2NocjE4XzE0NjUwfG5jUk5BX2ludGVyX2NocjJfMTMwM3xuY1JOQV9hc19jaHIyXzEzMDV8bmNSTkFfaW50ZXJfY2hyMl8xMzAyfG5jUk5BX2ludGVyX2NocjE5XzE0ODAyfG5jUk5BX2FzX2NocjE5XzE0ODIzfG5jUk5BX2ludGVyX2NocjE5XzE0ODIyfG5jUk5BX2ludGVyX2NocjE5XzE0OTkxfG5jUk5BX2ludGVyX2NocjE5XzE0OTkwfG5jUk5BX2ludHJhX2NocjE5XzE1MDA2fG5jUk5BX2FzX2NocjE5XzE1MDEwfG5jUk5BX2FzX2NocjE5XzE1MDA3fG5jUk5BX2FzX2NoclhfMTUzODd8bmNSTkFfaW50ZXJfY2hyWF8xNTQyMnxuY1JOQV9pbnRlcl9jaHJYXzE1NTUwfG5jUk5BX2ludGVyX2NocjJfMTQ4MXxuY1JOQV9pbnRlcl9jaHIyXzE1MDJ8bmNSTkFfaW50ZXJfY2hyMl8xNTI4fG5jUk5BX2ludGVyX2NocjJfMTYwMHxuY1JOQV9pbnRlcl9jaHIyXzE3ODJ8bmNSTkFfaW50ZXJfY2hyMl8xNzkyfG5jUk5BX2ludGVyX2NocjJfMTc5MHxuY1JOQV9pbnRlcl9jaHIyXzE3OTN8bmNSTkFfaW50ZXJfY2hyMV8xOTZ8bmNSTkFfaW50ZXJfY2hyMV8xOTV8bmNSTkFfaW50ZXJfY2hyMl8xOTg5fG5jUk5BX2ludGVyX2NocjJfMjAzOHxuY1JOQV9pbnRlcl9jaHIzXzIxNjd8bmNSTkFfaW50ZXJfY2hyMV80NHxuY1JOQV9pbnRlcl9jaHIzXzI0MDd8bmNSTkFfaW50ZXJfY2hyM18yNDM3fG5jUk5BX2FzX2NocjFfMjIxfG5jUk5BX2ludGVyX2NocjNfMjUwN3xuY1JOQV9pbnRlcl9jaHIzXzI1NDZ8bmNSTkFfYXNfY2hyM18yNTQ0fG5jUk5BX2ludGVyX2NocjFfMjM4fG5jUk5BX2FzX2NocjNfMjYwM3xuY1JOQV9pbnRlcl9jaHIzXzI2MzZ8bmNSTkFfaW50ZXJfY2hyM18yNzY4fG5jUk5BX2FzX2NocjNfMjc4MXxuY1JOQV9hc19jaHIzXzI3Nzh8bmNSTkFfaW50ZXJfY2hyM18yNzkwfG5jUk5BX2ludGVyX2NocjNfMjc5MXxuY1JOQV9pbnRlcl9jaHIzXzI3OTh8bmNSTkFfaW50ZXJfY2hyM18yODg5fG5jUk5BX2ludGVyX2NocjNfMjg5NnxuY1JOQV9hc19jaHIzXzI4OTR8bmNSTkFfaW50ZXJfY2hyM18yOTA0fG5jUk5BX2ludGVyX2NocjRfMzAyN3xuY1JOQV9hc19jaHI0XzMyMjR8bmNSTkFfaW50ZXJfY2hyNF8zMzA4fG5jUk5BX2ludGVyX2NocjRfMzM1MHxuY1JOQV9pbnRlcl9jaHI0XzMzODF8bmNSTkFfaW50ZXJfY2hyNF8zMzgwfG5jUk5BX2ludGVyX2NocjRfMzM4OXxuY1JOQV9pbnRlcl9jaHI0XzMzOTF8bmNSTkFfaW50ZXJfY2hyNF8zMzkwfG5jUk5BX2FzX2NocjFfODZ8bmNSTkFfaW50ZXJfY2hyNF8zNTc1fG5jUk5BX2ludGVyX2NocjRfMzY1MnxuY1JOQV9pbnRlcl9jaHI0XzM2OTB8bmNSTkFfaW50ZXJfY2hyNF8zNzY0fG5jUk5BX2ludGVyX2NocjRfMzc3NXxuY1JOQV9pbnRlcl9jaHI0XzM5MDV8bmNSTkFfYXNfY2hyNF8zOTEwfG5jUk5BX2ludGVyX2NocjRfMzkyM3xuY1JOQV9pbnRlcl9jaHI1XzQwNjZ8bmNSTkFfaW50ZXJfY2hyNV80MDY3fG5jUk5BX2ludGVyX2NocjVfNDA2NXxuY1JOQV9pbnRlcl9jaHI1XzQxMTZ8bmNSTkFfaW50ZXJfY2hyNV80NDcyfG5jUk5BX2ludGVyX2NocjVfNDUwMHxuY1JOQV9hc19jaHI1XzQ2Mjd8bmNSTkFfaW50ZXJfY2hyNV80NzQ5fG5jUk5BX2ludGVyX2NocjZfNDk5M3xuY1JOQV9pbnRlcl9jaHI2XzUyODF8bmNSTkFfaW50ZXJfY2hyNl81MjgyfG5jUk5BX2FzX2NocjZfNTcyMnxuY1JOQV9pbnRlcl9jaHIxXzQ5NHxuY1JOQV9pbnRlcl9jaHIxXzQ5NXxuY1JOQV9hc19jaHI3XzU4ODB8bmNSTkFfaW50ZXJfY2hyN182MDkxfG5jUk5BX2ludGVyX2NocjdfNjA5MHxuY1JOQV9pbnRlcl9jaHI3XzYwODB8bmNSTkFfYXNfY2hyN182MTc0fG5jUk5BX2ludGVyX2NocjFfNTIwfG5jUk5BX2FzX2NocjdfNjM3N3xuY1JOQV9hc19jaHI3XzYzODl8bmNSTkFfaW50ZXJfY2hyN182NDE1fG5jUk5BX2ludGVyX2NocjdfNjQzM3xuY1JOQV9hc19jaHI3XzY0NjciKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKClRDUE85IDwtIGdyZXAoYygibmNSTkFfYXNfY2hyN182NjU2fG5jUk5BX2ludGVyX2NocjhfNjc0MnxuY1JOQV9hc19jaHI4XzY3NDd8bmNSTkFfaW50ZXJfY2hyOF82NzQwfG5jUk5BX2ludGVyX2NocjhfNjc0M3xuY1JOQV9pbnRlcl9jaHI4XzY4OTV8bmNSTkFfaW50ZXJfY2hyOF82OTUzfG5jUk5BX2ludGVyX2NocjhfNjk4OXxuY1JOQV9pbnRlcl9jaHI4XzY5OTB8bmNSTkFfaW50ZXJfY2hyOF83MzM2fG5jUk5BX2ludGVyX2NocjhfNzM5OXxuY1JOQV9pbnRlcl9jaHI4XzczOTh8bmNSTkFfYXNfY2hyOF83NjMyfG5jUk5BX2FzX2NocjlfNzc3OHxuY1JOQV9pbnRlcl9jaHI5Xzc4MTB8bmNSTkFfaW50ZXJfY2hyOV83OTIzfG5jUk5BX2FzX2NocjlfNzkyNHxuY1JOQV9pbnRlcl9jaHI5XzgxNjl8bmNSTkFfaW50ZXJfY2hyOV84Mjk5fG5jUk5BX2ludGVyX2NocjlfODI5N3xuY1JOQV9pbnRlcl9jaHI5XzgzODd8bmNSTkFfaW50ZXJfY2hyMTBfODQ2OXxuY1JOQV9pbnRlcl9jaHIxMF84Nzc3fG5jUk5BX2FzX2NocjEwXzkxODJ8bmNSTkFfaW50ZXJfY2hyMTBfOTE5M3xuY1JOQV9pbnRlcl9jaHIxMF85MjA5fG5jUk5BX2ludGVyX2NocjEwXzkyMTB8bmNSTkFfaW50ZXJfY2hyMV83OTJ8bmNSTkFfaW50ZXJfY2hyMTBfOTM1MXxuY1JOQV9hc19jaHIxMV85NDQ3fG5jUk5BX2FzX2NocjExXzk0NDl8bmNSTkFfaW50ZXJfY2hyMV8xMjV8bmNSTkFfaW50ZXJfY2hyMV8xMjZ8bmNSTkFfaW50ZXJfY2hyMTFfOTY5M3xuY1JOQV9pbnRlcl9jaHIxXzg0MnxuY1JOQV9pbnRlcl9jaHIxMV85ODk0fG5jUk5BX2ludGVyX2NocjExXzk5NjB8bmNSTkFfaW50ZXJfY2hyMTFfOTk2N3xuY1JOQV9pbnRlcl9jaHIxMV85OTY2fG5jUk5BX2ludGVyX2NocjExXzEwMDE5fG5jUk5BX2ludGVyX2NocjExXzEwMDkxfG5jUk5BX2FzX2NocjExXzEwMTkzfG5jUk5BX2ludGVyX2NocjEyXzEwMzI0fG5jUk5BX2ludGVyX2NocjEyXzEwMzIyfG5jUk5BX2ludGVyX2NocjEyXzEwNDc3fG5jUk5BX2ludGVyX2NocjEyXzEwNTYyfG5jUk5BX2FzX2NocjEyXzEwODQ3fG5jUk5BX2FzX2NocjEyXzEwODg5fG5jUk5BX2FzX2NocjEyXzEwODg3fG5jUk5BX2FzX2NocjEyXzEwODg1fG5jUk5BX2ludHJhX2NocjEyXzEwODg4fG5jUk5BX2FzX2NocjEyXzEwODUyfG5jUk5BX2ludHJhX2NocjEyXzEwODg2fG5jUk5BX2ludGVyX2NocjEyXzEwOTg4fG5jUk5BX2ludGVyX2NocjEzXzExMDcxfG5jUk5BX2ludGVyX2NocjEzXzExMTI4fG5jUk5BX2ludGVyX2NocjEzXzExMzgxfG5jUk5BX2ludGVyX2NocjEzXzExMzg2fG5jUk5BX2ludGVyX2NocjEzXzExNDI1fG5jUk5BX2FzX2NocjEzXzExNDkxfG5jUk5BX2ludGVyX2NocjEzXzExNDkwfG5jUk5BX2ludGVyX2NocjEzXzExNjAzfG5jUk5BX2FzX2NocjEzXzExNzg1fG5jUk5BX2FzX2NocjEzXzExNzg0fG5jUk5BX2ludGVyX2NocjE0XzEyMDE4fG5jUk5BX2ludGVyX2NocjJfMTA3MnxuY1JOQV9hc19jaHIxNV8xMjMzMHxuY1JOQV9pbnRlcl9jaHIxNV8xMjY0NHxuY1JOQV9pbnRlcl9jaHIxNV8xMjY5NXxuY1JOQV9pbnRlcl9jaHIxNV8xMjgzMHxuY1JOQV9hc19jaHIxNV8xMjgzN3xuY1JOQV9pbnRlcl9jaHIxNV8xMjgzMnxuY1JOQV9pbnRlcl9jaHIxNV8xMjgzMXxuY1JOQV9pbnRlcl9jaHIxNV8xMjgzM3xuY1JOQV9pbnRlcl9jaHIxNV8xMjg0OXxuY1JOQV9hc19jaHIxNl8xMzUxNHxuY1JOQV9pbnRlcl9jaHIxN18xMzc4N3xuY1JOQV9pbnRlcl9jaHIxN18xMzg3NXxuY1JOQV9pbnRlcl9jaHIxN18xNDAwNnxuY1JOQV9pbnRlcl9jaHIxN18xNDAyM3xuY1JOQV9pbnRlcl9jaHIxN18xNDEyNXxuY1JOQV9hc19jaHIxOV8xNDcyOHxuY1JOQV9pbnRyYV9jaHIxOV8xNTAyOHxuY1JOQV9hc19jaHIxOV8xNTAyN3xuY1JOQV9pbnRlcl9jaHIxOV8xNTA1OHxuY1JOQV9pbnRlcl9jaHIxOV8xNTE4N3xuY1JOQV9hc19jaHIxOV8xNTE4OHxuY1JOQV9hc19jaHJYXzE1MzE4fG5jUk5BX2ludGVyX2NocjJfMTQyN3xuY1JOQV9pbnRlcl9jaHIyXzE0MTl8bmNSTkFfaW50ZXJfY2hyMl8xNDIxfG5jUk5BX2ludGVyX2NocjJfMTQyMHxuY1JOQV9pbnRlcl9jaHIyXzE0MjR8bmNSTkFfaW50ZXJfY2hyMl8xNDIyfG5jUk5BX2ludGVyX2NocjJfMTQzMnxuY1JOQV9pbnRlcl9jaHIyXzE0MzF8bmNSTkFfYXNfY2hyMV8xNzN8bmNSTkFfaW50ZXJfY2hyMV8xNzF8bmNSTkFfaW50ZXJfY2hyMV8xNjl8bmNSTkFfaW50ZXJfY2hyMl8xODUxfG5jUk5BX2ludHJhX2NocjJfMTg1MnxuY1JOQV9pbnRlcl9jaHIyXzE4Nzd8bmNSTkFfaW50ZXJfY2hyMl8xODgzfG5jUk5BX2ludGVyX2NocjJfMTg4N3xuY1JOQV9pbnRlcl9jaHIyXzE4ODh8bmNSTkFfaW50ZXJfY2hyMl8xOTI2fG5jUk5BX2ludGVyX2NocjJfMjAwOXxuY1JOQV9pbnRlcl9jaHIyXzIwNzh8bmNSTkFfaW50ZXJfY2hyMl8yMDc5fG5jUk5BX2ludGVyX2NocjJfMjA4NHxuY1JOQV9pbnRlcl9jaHIyXzIwODV8bmNSTkFfaW50ZXJfY2hyM18yMjA3fG5jUk5BX2FzX2NocjNfMjQwOXxuY1JOQV9hc19jaHIzXzI0MTh8bmNSTkFfaW50ZXJfY2hyM18yNDgxfG5jUk5BX2ludGVyX2NocjNfMjU0OXxuY1JOQV9pbnRlcl9jaHIzXzI1Nzl8bmNSTkFfaW50ZXJfY2hyMV8yNTZ8bmNSTkFfaW50ZXJfY2hyMV8yNTd8bmNSTkFfaW50ZXJfY2hyM18yNzA1fG5jUk5BX2ludGVyX2NocjNfMjg4N3xuY1JOQV9pbnRlcl9jaHI0XzMwNTZ8bmNSTkFfaW50ZXJfY2hyNF8zMDc5fG5jUk5BX2FzX2NocjRfMzIxMHxuY1JOQV9hc19jaHI0XzMyNzV8bmNSTkFfYXNfY2hyNF8zMzEzIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCgpUQ1BPMTAgPC0gIGdyZXAoYygibmNSTkFfYXNfY2hyMV8zMTJ8bmNSTkFfaW50ZXJfY2hyNF8zNTM0fG5jUk5BX2ludGVyX2NocjRfMzU4NHxuY1JOQV9pbnRlcl9jaHI0XzM2ODV8bmNSTkFfaW50ZXJfY2hyNF8zODg0fG5jUk5BX2FzX2NocjdfNjMwMnxuY1JOQV9pbnRyYV9jaHI4XzczMjJ8bmNSTkFfaW50cmFfY2hyOF83MzIxfG5jUk5BX2ludHJhX2NocjhfNzMxOXxuY1JOQV9pbnRyYV9jaHI4XzczMTd8bmNSTkFfaW50cmFfY2hyOF83MzE0fG5jUk5BX2ludHJhX2NocjhfNzMxM3xuY1JOQV9pbnRyYV9jaHI4XzczMjN8bmNSTkFfaW50ZXJfY2hyMTBfODQ2MXxuY1JOQV9hc19jaHIxXzc4MnxuY1JOQV9pbnRlcl9jaHIxMl8xMDYyMXxuY1JOQV9pbnRlcl9jaHIxMl8xMDcxNXxuY1JOQV9hc19jaHIxNl8xMzUxMXxuY1JOQV9pbnRlcl9jaHIxOF8xNDY5MXxuY1JOQV9pbnRlcl9jaHIxOV8xNTAwM3xuY1JOQV9pbnRyYV9jaHIxOV8xNTAxNHxuY1JOQV9pbnRyYV9jaHIxOV8xNTAxMXxuY1JOQV9hc19jaHI5Xzc3Njd8bmNSTkFfYXNfY2hyMTlfMTQ5Nzd8bmNSTkFfYXNfY2hyMl8xOTY1fG5jUk5BX2FzX2NocjFfNDgzfG5jUk5BX2ludGVyX2NocjhfNjk2MXxuY1JOQV9pbnRlcl9jaHIxM18xMTQzNnxuY1JOQV9pbnRlcl9jaHIyXzEwOTh8bmNSTkFfaW50ZXJfY2hyM18yMjY5fG5jUk5BX2ludGVyX2NocjRfMzE4M3xuY1JOQV9hc19jaHI1XzQ2OTR8bmNSTkFfYXNfY2hyMTVfMTI4MTd8bmNSTkFfYXNfY2hyMTlfMTUxMzB8bmNSTkFfaW50ZXJfY2hyMl8xOTYzfG5jUk5BX2ludGVyX2NocjRfMzQ2OHxuY1JOQV9pbnRyYV9jaHI3XzU5MjB8bmNSTkFfaW50ZXJfY2hyM18yMTM3fG5jUk5BX2ludGVyX2NocjE0XzEyMDI0fG5jUk5BX2ludGVyX2NocjFfNDAxfG5jUk5BX2ludGVyX2NocjZfNTEzOHxuY1JOQV9pbnRlcl9jaHI2XzU4MjR8bmNSTkFfaW50ZXJfY2hyN182NTExfG5jUk5BX2ludGVyX2NocjlfODI0OXxuY1JOQV9pbnRlcl9jaHIxMF84NzY3fG5jUk5BX2FzX2NocjEwXzg5Mjd8bmNSTkFfaW50ZXJfY2hyMTlfMTQ4NTN8bmNSTkFfaW50ZXJfY2hyNF8zMDUyfG5jUk5BX2ludGVyX2NocjVfNDU3N3xuY1JOQV9pbnRlcl9jaHI1XzQ1Nzh8bmNSTkFfaW50ZXJfY2hyOF82ODE2fG5jUk5BX2ludGVyX2NocjlfNzk5M3xuY1JOQV9hc19jaHI5XzgwNTB8bmNSTkFfaW50ZXJfY2hyOV84MTQ3fG5jUk5BX2FzX2NocjExXzEwMTUxfG5jUk5BX2ludGVyX2NocjExXzEwMTk1fG5jUk5BX2ludGVyX2NocjEyXzEwOTQyfG5jUk5BX2ludGVyX2NocjFfOTg3fG5jUk5BX2ludGVyX2NocjE0XzEyMDI2fG5jUk5BX2ludGVyX2NocjE4XzE0MjkzfG5jUk5BX2ludGVyX2NocjE4XzE0NjA0fG5jUk5BX2ludGVyX2NocjE5XzE0OTc5fG5jUk5BX2ludGVyX2NoclhfMTU1NDl8bmNSTkFfaW50ZXJfY2hyMV83M3xuY1JOQV9pbnRlcl9jaHIxXzUxfG5jUk5BX2ludGVyX2NocjFfNTN8bmNSTkFfaW50ZXJfY2hyMV80N3xuY1JOQV9pbnRlcl9jaHIxXzU2fG5jUk5BX2FzX2NocjRfMzIzNXxuY1JOQV9pbnRlcl9jaHIxMV85OTk2fG5jUk5BX2ludGVyX2NocjJfMTQ5OHxuY1JOQV9pbnRlcl9jaHIyXzE0OTF8bmNSTkFfaW50ZXJfY2hyNF8zMTc4fG5jUk5BX2ludGVyX2NocjVfNDEzN3xuY1JOQV9pbnRlcl9jaHI1XzQxOTJ8bmNSTkFfaW50ZXJfY2hyNV80MzMwfG5jUk5BX2ludGVyX2NocjVfNDMyOXxuY1JOQV9hc19jaHI1XzQ2NjJ8bmNSTkFfaW50ZXJfY2hyNV80Njc0fG5jUk5BX2ludGVyX2NocjZfNTExOHxuY1JOQV9pbnRlcl9jaHI2XzUxMzF8bmNSTkFfYXNfY2hyNl81MzM2fG5jUk5BX2ludGVyX2NocjZfNTU5NXxuY1JOQV9pbnRlcl9jaHI2XzU4MjJ8bmNSTkFfaW50ZXJfY2hyN182MzQzfG5jUk5BX2ludGVyX2NocjdfNjM5MXxuY1JOQV9pbnRlcl9jaHI3XzY1MDl8bmNSTkFfaW50ZXJfY2hyN182NTIyfG5jUk5BX2ludGVyX2NocjdfNjUyM3xuY1JOQV9pbnRlcl9jaHI3XzY1MjR8bmNSTkFfaW50ZXJfY2hyN182NTM0fG5jUk5BX2ludGVyX2NocjhfNjc1N3xuY1JOQV9pbnRyYV9jaHIxXzYwNHxuY1JOQV9pbnRyYV9jaHI4XzczMjd8bmNSTkFfaW50ZXJfY2hyMV82MzF8bmNSTkFfaW50ZXJfY2hyOF83NjA1fG5jUk5BX2ludGVyX2NocjhfNzYwNnxuY1JOQV9hc19jaHI5Xzg0MDF8bmNSTkFfaW50ZXJfY2hyMTFfOTQzM3xuY1JOQV9pbnRlcl9jaHIxMV85NjU1fG5jUk5BX2ludGVyX2NocjEyXzEwNDU5fG5jUk5BX2FzX2NocjEyXzEwODk2fG5jUk5BX2ludGVyX2NocjEyXzEwOTc5fG5jUk5BX2ludGVyX2NocjEzXzExMTIwfG5jUk5BX2ludGVyX2NocjEzXzExMjk0fG5jUk5BX2FzX2NocjEzXzExNTk2fG5jUk5BX2ludGVyX2NocjE0XzEyMjE0fG5jUk5BX2ludGVyX2NocjE0XzEyMjUwfG5jUk5BX2ludGVyX2NocjJfMTA5OXxuY1JOQV9pbnRlcl9jaHIxNV8xMjYwOXxuY1JOQV9pbnRlcl9jaHIxNV8xMjc1MnxuY1JOQV9pbnRlcl9jaHIxNV8xMjc3NHxuY1JOQV9pbnRlcl9jaHIxNV8xMjc5M3xuY1JOQV9pbnRlcl9jaHIxNV8xMjc5MnxuY1JOQV9pbnRlcl9jaHIxNl8xMzUwOHxuY1JOQV9pbnRlcl9jaHIxOV8xNDg1MXxuY1JOQV9pbnRlcl9jaHIxOV8xNDg1NXxuY1JOQV9pbnRlcl9jaHIxOV8xNTAzMHxuY1JOQV9hc19jaHIxOV8xNTA1NHxuY1JOQV9pbnRlcl9jaHIxOV8xNTE5MHxuY1JOQV9hc19jaHIyXzE0NTd8bmNSTkFfaW50ZXJfY2hyM18yMzAzfG5jUk5BX2FzX2NocjNfMjU2N3xuY1JOQV9pbnRlcl9jaHIzXzI3MjJ8bmNSTkFfaW50ZXJfY2hyM18yOTM3fG5jUk5BX2ludGVyX2NocjRfMzMwN3xuY1JOQV9pbnRlcl9jaHI0XzM0MjV8bmNSTkFfaW50ZXJfY2hyNF8zNzc5fG5jUk5BX2ludGVyX2NocjExXzk2MzF8bmNSTkFfaW50ZXJfY2hyMTNfMTExMjJ8bmNSTkFfaW50ZXJfY2hyMTNfMTEzODN8bmNSTkFfaW50ZXJfY2hyMTVfMTI4NTV8bmNSTkFfYXNfY2hyMThfMTQzMTB8bmNSTkFfaW50ZXJfY2hyM18yNDg4fG5jUk5BX2ludGVyX2NocjNfMjc0NHxuY1JOQV9pbnRlcl9jaHI0XzM4NTl8bmNSTkFfaW50ZXJfY2hyNV80MTE1fG5jUk5BX2FzX2NocjZfNTYwMXxuY1JOQV9pbnRlcl9jaHIxXzY3MHxuY1JOQV9pbnRlcl9jaHIxMF85MTgzfG5jUk5BX2ludGVyX2NocjExXzEwMjE3fG5jUk5BX2FzX2NocjEyXzEwNjE4fG5jUk5BX2ludGVyX2NocjE2XzEzMTM3fG5jUk5BX2ludGVyX2NocjRfMzI4NXxuY1JOQV9pbnRlcl9jaHI0XzMyODYiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKCgpgYGAKCgpHMTcyTTFNMyBpcyB0aGUgY29ycmVjdCBiYXRjaCBERSBnZWVucwoKYGBge3J9CkRFMS5NMU0zLjAuMSA8LSBncmVwKGMoIm5jUk5BX2FzX2NocjdfNTk5OXxuY1JOQV9hc19jaHIxNV8xMjM0MHxuY1JOQV9pbnRlcl9jaHJYXzE1NDQ2fG5jUk5BX2ludGVyX2NocjJfMTQxOXxuY1JOQV9pbnRlcl9jaHIxOV8xNDc0NnxuY1JOQV9pbnRlcl9jaHIxN18xMzkwOXxuY1JOQV9hc19jaHI4Xzc1Mjh8bmNSTkFfaW50ZXJfY2hyOV83ODA5fG5jUk5BX2FzX2NocjRfMzUzMnxuY1JOQV9hc19jaHIxOV8xNDgyM3xuY1JOQV9hc19jaHIxOV8xNDg4M3xuY1JOQV9hc19jaHI4Xzc1MjF8bmNSTkFfaW50ZXJfY2hyMTBfODY5N3xuY1JOQV9pbnRyYV9jaHI2XzU1OTN8bmNSTkFfYXNfY2hyNl81NTg5fG5jUk5BX2FzX2NocjhfNjk1NHxuY1JOQV9pbnRlcl9jaHI1XzM5NzR8bmNSTkFfYXNfY2hyNV80MzI1fG5jUk5BX2ludGVyX2NocjhfNjc0M3xuY1JOQV9hc19jaHIxMl8xMDI4MXxuY1JOQV9hc19jaHI3XzYxNjZ8bmNSTkFfYXNfY2hyMTJfMTA2OTd8bmNSTkFfaW50ZXJfY2hyMTFfOTUxMnxuY1JOQV9hc19jaHIxNF8xMjAzOHxuY1JOQV9pbnRlcl9jaHI1XzQyMjF8bmNSTkFfYXNfY2hyNV80NzQ0fG5jUk5BX2ludGVyX2NocjNfMjk4OHxuY1JOQV9pbnRlcl9jaHIxN18xMzkyOHxuY1JOQV9pbnRlcl9jaHIxM18xMTIyN3xuY1JOQV9pbnRlcl9jaHIxNV8xMjYwOHxuY1JOQV9pbnRlcl9jaHIxMl8xMDI3MHxuY1JOQV9pbnRlcl9jaHI0XzM0MzZ8bmNSTkFfaW50ZXJfY2hyMl8xMzAyfG5jUk5BX2ludGVyX2NocjJfMTA3N3xuY1JOQV9pbnRlcl9jaHIxXzI5MnxuY1JOQV9hc19jaHIxXzM3M3xuY1JOQV9hc19jaHIxOV8xNDk3N3xuY1JOQV9hc19jaHIxXzYyNXxuY1JOQV9pbnRyYV9jaHIxNF8xMTk2MXxuY1JOQV9hc19jaHI1XzQzMzR8bmNSTkFfYXNfY2hyMTBfODk2MnxuY1JOQV9pbnRlcl9jaHIyXzE0OTF8bmNSTkFfaW50ZXJfY2hyMTNfMTEwNzB8bmNSTkFfYXNfY2hyNl81NjM0fG5jUk5BX2FzX2NoclhfMTUzMjB8bmNSTkFfaW50ZXJfY2hyMTBfOTAwMHxuY1JOQV9pbnRlcl9jaHI1XzQyMjB8bmNSTkFfaW50ZXJfY2hyMTFfOTQzNHxuY1JOQV9pbnRlcl9jaHIxMF85MjY0fG5jUk5BX2FzX2NocjE1XzEyODE3fG5jUk5BX2FzX2NocjlfNzcwMnxuY1JOQV9hc19jaHIxMV8xMDA3NXxuY1JOQV9hc19jaHIxOV8xNDg4MnxuY1JOQV9pbnRlcl9jaHIzXzIxNTZ8bmNSTkFfYXNfY2hyN182MTkyfG5jUk5BX2ludGVyX2NocjhfNzM2M3xuY1JOQV9pbnRlcl9jaHIxMF85MTkzfG5jUk5BX2ludGVyX2NocjEzXzExNzUyfG5jUk5BX2ludGVyX2NocjVfNDM5NXxuY1JOQV9hc19jaHIxN18xMzcwOHxuY1JOQV9hc19jaHIzXzI4OTR8bmNSTkFfaW50ZXJfY2hyMTVfMTIzNjV8bmNSTkFfaW50ZXJfY2hyMTRfMTE5NDV8bmNSTkFfaW50ZXJfY2hyWF8xNTQzN3xuY1JOQV9pbnRlcl9jaHIxMF85MDg2fG5jUk5BX2FzX2NocjE4XzE0NjAyfG5jUk5BX2FzX2NocjFfMjUyfG5jUk5BX2ludGVyX2NocjhfNjcyNnxuY1JOQV9pbnRlcl9jaHIxM18xMTYwMnxuY1JOQV9hc19jaHI0XzMwODN8bmNSTkFfaW50ZXJfY2hyNV80NTkzfG5jUk5BX2FzX2NocjE3XzE0MDE4fG5jUk5BX2ludGVyX2NocjEyXzEwODgwfG5jUk5BX2ludGVyX2NocjNfMjc2OHxuY1JOQV9hc19jaHIxMl8xMDUyMXxuY1JOQV9pbnRlcl9jaHI0XzMyOTR8bmNSTkFfYXNfY2hyOF83NjMyfG5jUk5BX2FzX2NocjJfMTQ0MHxuY1JOQV9pbnRlcl9jaHI4XzY3NTl8bmNSTkFfYXNfY2hyMl8xNTQzfG5jUk5BX2ludGVyX2NocjExXzk5MjJ8bmNSTkFfYXNfY2hyMl8xODg0fG5jUk5BX2FzX2NocjE3XzEzNjgzfG5jUk5BX2FzX2NocjFfOTc4fG5jUk5BX2FzX2NocjdfNjQ2N3xuY1JOQV9pbnRlcl9jaHIxN18xNDAyNnxuY1JOQV9pbnRlcl9jaHIxN18xMzgwMXxuY1JOQV9pbnRlcl9jaHIxMl8xMDQ3NnxuY1JOQV9hc19jaHI0XzMyMzV8bmNSTkFfYXNfY2hyN181OTIxfG5jUk5BX2ludGVyX2NocjFfMjkxfG5jUk5BX2ludGVyX2NocjFfMTYxfG5jUk5BX2ludGVyX2NocjVfNDA1MnxuY1JOQV9pbnRlcl9jaHIxMV85OTExfG5jUk5BX2ludGVyX2NocjdfNjUwMXxuY1JOQV9hc19jaHI0XzM1NTl8bmNSTkFfYXNfY2hyNl81ODYwfG5jUk5BX2ludGVyX2NocjdfNjMxOHxuY1JOQV9hc19jaHIxXzIyMnxuY1JOQV9pbnRlcl9jaHIxMF84NDY5fG5jUk5BX2FzX2NocjVfNDI4MXxuY1JOQV9hc19jaHIxMV85OTU2fG5jUk5BX2FzX2NocjJfMTY5NXxuY1JOQV9hc19jaHI0XzMyMjR8bmNSTkFfYXNfY2hyMTVfMTI0Njd8bmNSTkFfYXNfY2hyMTdfMTM4MzR8bmNSTkFfYXNfY2hyMTBfOTM4OXxuY1JOQV9pbnRlcl9jaHI3XzYzNjl8bmNSTkFfaW50ZXJfY2hyMTFfOTkyNnxuY1JOQV9hc19jaHIxNV8xMjgxOHxuY1JOQV9pbnRlcl9jaHIxXzQ5NnxuY1JOQV9pbnRlcl9jaHI2XzU4NjJ8bmNSTkFfYXNfY2hyMV80MDB8bmNSTkFfaW50ZXJfY2hyMTBfOTIwOHxuY1JOQV9pbnRlcl9jaHIxN18xNDEyOHxuY1JOQV9hc19jaHI4XzczMzF8bmNSTkFfYXNfY2hyNl81NzIyfG5jUk5BX2FzX2NocjE5XzE0NzgyfG5jUk5BX2ludGVyX2NocjNfMjY5N3xuY1JOQV9pbnRlcl9jaHIxMl8xMDQ2MnxuY1JOQV9pbnRlcl9jaHIxMV85OTIzfG5jUk5BX2ludGVyX2NocjFfODQ2fG5jUk5BX2ludGVyX2NocjJfMjA3OXxuY1JOQV9pbnRlcl9jaHI5Xzc5OTl8bmNSTkFfaW50ZXJfY2hyNF8zNDU4fG5jUk5BX2ludGVyX2NocjhfNzY1NHxuY1JOQV9hc19jaHIxOF8xNDMzMnxuY1JOQV9pbnRlcl9jaHIzXzIxNjZ8bmNSTkFfYXNfY2hyMl8xNDM5fG5jUk5BX2FzX2NocjE5XzE0OTc2fG5jUk5BX2FzX2NocjEyXzEwMjQ1fG5jUk5BX2ludGVyX2NocjVfMzk3NXxuY1JOQV9pbnRlcl9jaHIxXzg0MHxuY1JOQV9hc19jaHI0XzMyOTh8bmNSTkFfaW50ZXJfY2hyNl80OTgwfG5jUk5BX2FzX2NocjFfNzYyfG5jUk5BX2ludGVyX2NocjdfNjE4OXxuY1JOQV9pbnRlcl9jaHIxOV8xNDk5MHxuY1JOQV9hc19jaHIxM18xMTA2OHxuY1JOQV9pbnRlcl9jaHIxOV8xNDg4MHxuY1JOQV9pbnRlcl9jaHIxMV85OTQ4fG5jUk5BX2ludGVyX2NocjZfNDg4N3xuY1JOQV9hc19jaHIxM18xMTE0OXxuY1JOQV9hc19jaHIyXzE1NTB8bmNSTkFfaW50ZXJfY2hyNF8zNjk4fG5jUk5BX2ludGVyX2NocjEwXzkzNjZ8bmNSTkFfaW50ZXJfY2hyNV80MDY1fG5jUk5BX2FzX2NocjhfNzM3NXxuY1JOQV9hc19jaHIxOV8xNDcxM3xuY1JOQV9pbnRlcl9jaHI5XzgxMjF8bmNSTkFfYXNfY2hyMl8xNjc3fG5jUk5BX2ludGVyX2NocjVfNDAyMnxuY1JOQV9hc19jaHIyXzE5NjZ8bmNSTkFfYXNfY2hyMTlfMTUxMzB8bmNSTkFfaW50ZXJfY2hyMTJfMTA1NjF8bmNSTkFfaW50ZXJfY2hyNF8zODE5fG5jUk5BX2FzX2NocjE5XzE0NzMyfG5jUk5BX2ludGVyX2NoclhfMTUyOTd8bmNSTkFfaW50ZXJfY2hyMTFfOTYzNXxuY1JOQV9hc19jaHIxXzIyMXxuY1JOQV9pbnRlcl9jaHI4XzY4Nzh8bmNSTkFfaW50ZXJfY2hyOV83ODg1fG5jUk5BX2FzX2NocjExXzk5OTB8bmNSTkFfaW50ZXJfY2hyMTRfMTE4NDV8bmNSTkFfYXNfY2hyMTFfMTAyMjJ8bmNSTkFfaW50ZXJfY2hyM18yMTYxfG5jUk5BX2ludGVyX2NocjJfMTk1OHxuY1JOQV9pbnRlcl9jaHIxMV8xMDE4OXxuY1JOQV9pbnRyYV9jaHI4XzY4MDB8bmNSTkFfaW50ZXJfY2hyMV84NTJ8bmNSTkFfYXNfY2hyN182MTYxfG5jUk5BX2ludGVyX2NocjFfMTA5fG5jUk5BX2ludGVyX2NocjE2XzEzNDU2fG5jUk5BX2ludGVyX2NocjE5XzE1MTMyIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCkRFMi5NMU0zLjAuMSA8LSBncmVwKGMoIm5jUk5BX2ludGVyX2NocjE5XzE0OTU0fG5jUk5BX2ludGVyX2NocjNfMjQxMXxuY1JOQV9pbnRlcl9jaHIxNl8xMzE5MHxuY1JOQV9pbnRlcl9jaHIxNV8xMjc3MHxuY1JOQV9hc19jaHI1XzQzODR8bmNSTkFfaW50ZXJfY2hyNl81NTEwfG5jUk5BX2FzX2NocjExXzEwMTQ5fG5jUk5BX2ludGVyX2NocjlfODM1MHxuY1JOQV9hc19jaHIyXzExNDV8bmNSTkFfaW50ZXJfY2hyNl81NTQyfG5jUk5BX2ludGVyX2NoclhfMTUyNzh8bmNSTkFfaW50ZXJfY2hyMTNfMTEzODV8bmNSTkFfYXNfY2hyMl8xNTc5fG5jUk5BX2ludGVyX2NocjZfNDg3NXxuY1JOQV9hc19jaHIxMF85MzY1fG5jUk5BX2ludGVyX2NocjdfNjMzOHxuY1JOQV9hc19jaHI4XzcwOTZ8bmNSTkFfaW50ZXJfY2hyMTRfMTIxOTl8bmNSTkFfaW50ZXJfY2hyMV84MTJ8bmNSTkFfaW50ZXJfY2hyMTRfMTE5Nzl8bmNSTkFfYXNfY2hyMTdfMTQwNjl8bmNSTkFfaW50ZXJfY2hyMV8xMjB8bmNSTkFfYXNfY2hyMTdfMTM2NTh8bmNSTkFfYXNfY2hyMTRfMTIwNTV8bmNSTkFfYXNfY2hyMTZfMTMxNTB8bmNSTkFfaW50ZXJfY2hyNl81MzEwfG5jUk5BX2FzX2NocjlfNzk1N3xuY1JOQV9pbnRlcl9jaHIxXzExOXxuY1JOQV9pbnRlcl9jaHIyXzIwNjZ8bmNSTkFfaW50cmFfY2hyN181OTE5fG5jUk5BX2ludGVyX2NocjE0XzEyMDMwfG5jUk5BX2ludGVyX2NocjE3XzEzNzkyfG5jUk5BX2FzX2NocjE0XzExOTQ4fG5jUk5BX2FzX2NocjJfMTA3M3xuY1JOQV9pbnRlcl9jaHI4XzY3NDJ8bmNSTkFfaW50ZXJfY2hyNl81NjEwfG5jUk5BX2ludGVyX2NocjdfNjMzNHxuY1JOQV9pbnRlcl9jaHIxMF85MzIwfG5jUk5BX2FzX2NocjdfNjAzMnxuY1JOQV9hc19jaHI2XzU1MDh8bmNSTkFfYXNfY2hyNV8zOTQ3fG5jUk5BX2ludGVyX2NocjZfNDk4MXxuY1JOQV9pbnRlcl9jaHJYXzE1MjQwfG5jUk5BX2FzX2NocjEzXzExNzc5fG5jUk5BX2ludGVyX2NocjRfMzc5M3xuY1JOQV9pbnRlcl9jaHIxMF84Nzk0fG5jUk5BX2FzX2NocjExXzEwMTIxfG5jUk5BX2FzX2NocjlfODIyNHxuY1JOQV9hc19jaHI0XzM4MjB8bmNSTkFfYXNfY2hyMTlfMTUxNTF8bmNSTkFfaW50ZXJfY2hyMTVfMTI4NDV8bmNSTkFfYXNfY2hyMTFfOTgxMnxuY1JOQV9pbnRlcl9jaHI2XzUzMTh8bmNSTkFfYXNfY2hyMl8yMTA4fG5jUk5BX2ludGVyX2NocjEzXzExMjU0fG5jUk5BX2ludGVyX2NocjEyXzEwOTczfG5jUk5BX2ludGVyX2NocjE5XzE0OTY0fG5jUk5BX2ludGVyX2NocjZfNTU4MnxuY1JOQV9hc19jaHIxMF85MTQ3fG5jUk5BX2FzX2NocjE1XzEyMzIxfG5jUk5BX2ludGVyX2NocjJfMTE3MXxuY1JOQV9pbnRlcl9jaHIzXzIxNjV8bmNSTkFfYXNfY2hyMTFfOTg5N3xuY1JOQV9pbnRyYV9jaHI4XzY4MDJ8bmNSTkFfaW50ZXJfY2hyOF82Nzg4fG5jUk5BX2ludGVyX2NocjE2XzEzNDQzfG5jUk5BX2FzX2NocjFfMjUzfG5jUk5BX2FzX2NocjhfNzQxMHxuY1JOQV9pbnRlcl9jaHIxMl8xMDI2OXxuY1JOQV9hc19jaHI3XzY2NTV8bmNSTkFfaW50ZXJfY2hyOF83NjgyfG5jUk5BX2FzX2NocjlfODMxNnxuY1JOQV9pbnRlcl9jaHI4XzcyNjd8bmNSTkFfaW50ZXJfY2hyMl8xMjM3fG5jUk5BX2ludGVyX2NocjE3XzEzOTM5fG5jUk5BX2ludGVyX2NocjExXzEwMjMzfG5jUk5BX2FzX2NocjExXzk4Mzh8bmNSTkFfaW50ZXJfY2hyOV84MDAwfG5jUk5BX2ludGVyX2NocjEzXzExNjY5fG5jUk5BX2ludGVyX2NocjE5XzE0Nzc0fG5jUk5BX2ludGVyX2NocjEwXzkyMTB8bmNSTkFfaW50ZXJfY2hyNF8zNTQ5fG5jUk5BX2FzX2NocjhfNjg3NHxuY1JOQV9pbnRlcl9jaHIxNl8xMzE3MXxuY1JOQV9hc19jaHIzXzI1NDV8bmNSTkFfaW50ZXJfY2hyNl81MDQ1fG5jUk5BX2ludGVyX2NocjEwXzkyNjN8bmNSTkFfYXNfY2hyMTBfOTA0OHxuY1JOQV9pbnRlcl9jaHI3XzYxODJ8bmNSTkFfaW50ZXJfY2hyWF8xNTI0NHxuY1JOQV9pbnRlcl9jaHIxMl8xMDY0OXxuY1JOQV9hc19jaHIxOF8xNDYyOHxuY1JOQV9hc19jaHI5Xzg0Mjh8bmNSTkFfYXNfY2hyMTlfMTUwNjV8bmNSTkFfaW50ZXJfY2hyM18yNTcyfG5jUk5BX2FzX2NocjVfNDc3MXxuY1JOQV9pbnRlcl9jaHIxN18xNDE4N3xuY1JOQV9pbnRlcl9jaHIxMl8xMDQxMXxuY1JOQV9pbnRlcl9jaHIxOV8xNDg3NHxuY1JOQV9hc19jaHIxMV85NzY3fG5jUk5BX2FzX2NocjE2XzEzNDU4fG5jUk5BX2FzX2NocjhfNzM2N3xuY1JOQV9hc19jaHI3XzYyOTN8bmNSTkFfaW50ZXJfY2hyMTVfMTI2NTN8bmNSTkFfaW50ZXJfY2hyMTFfMTAyMTF8bmNSTkFfYXNfY2hyMTdfMTM4NTZ8bmNSTkFfYXNfY2hyMl8xNTQyfG5jUk5BX2ludGVyX2NocjRfMzI4NXxuY1JOQV9pbnRlcl9jaHIzXzI2NTN8bmNSTkFfaW50ZXJfY2hyN182Mzk3fG5jUk5BX2ludGVyX2NocjlfODEwNHxuY1JOQV9hc19jaHIzXzI1NTR8bmNSTkFfYXNfY2hyMTRfMTIxMzR8bmNSTkFfaW50ZXJfY2hyMTdfMTM1NTF8bmNSTkFfYXNfY2hyOF83NTIzfG5jUk5BX2FzX2NocjE1XzEyNDYwfG5jUk5BX2FzX2NocjJfMTEwMXxuY1JOQV9pbnRlcl9jaHI4Xzc1MTl8bmNSTkFfYXNfY2hyMTdfMTM4MjJ8bmNSTkFfaW50ZXJfY2hyNF8zNzM4fG5jUk5BX2ludGVyX2NocjJfMTgzMHxuY1JOQV9pbnRlcl9jaHI1XzQzMjF8bmNSTkFfYXNfY2hyMl8xNjk0fG5jUk5BX2ludGVyX2NocjE3XzE0MTgyfG5jUk5BX2ludGVyX2NocjE2XzEzMzUyfG5jUk5BX2ludGVyX2NocjNfMjc0MnxuY1JOQV9pbnRlcl9jaHIxMV85NTAzfG5jUk5BX2ludGVyX2NocjZfNTcyNHxuY1JOQV9pbnRlcl9jaHIxXzU5MXxuY1JOQV9pbnRlcl9jaHIxM18xMTUyM3xuY1JOQV9hc19jaHI0XzMzMTZ8bmNSTkFfaW50ZXJfY2hyM18yMzQ1fG5jUk5BX2FzX2NocjNfMjU0NCIpLHg9cm93bmFtZXMoRzE3Mi51bWlzKSx2YWx1ZT1GQUxTRSkKCkRFMy5NMU0zLjAuMSA8LSBncmVwKGMoIkdtMjY5OTJ8RHB5ZHxDd2MyMnxDcHMxfFVwcDJ8UmFkNTFifENhcm1pbDF8Q2xweHxGZ2J8QW5nNHxGZ2F8R2NsY3xGZ2d8RmFtMTNhfFN1bHQzYTJ8QWJjYzJ8R3N0YTN8S2NudDJ8SXJmOXxNZWlvYnxDcm90fEdhZGQ0NWd8RzZwY3xQenB8RmdsMXxDaHJtM3xDZmh8RXRmYmttdHxTbnRnMnxDeGNsMXxTZXRicDF8VHltcHxDcnRjM3xQYWh8S21vfFZtcDF8TmZpYXxSYnBtc3xTbGM3YTJ8RmFtMjEwYnxTbGMxNmExMHxQbGluMnxTdDNnYWwxfFNveDV8THk2ZXxTYzVkfFd3b3h8bXQtQXRwNnxUYWNjMnxDaGthfFFzb3gxfEFzczF8UHhtcDR8RmFtMjE0YXxSbmYxMjV8QWRncnYxfFBvcnxNYmwxfFpidGIxNnxBZGt8bXQtQ28zfFJyYnAxfE1hcDJrNnxQZGdmY3xOZmlifDI4MTA0NTlNMTFSaWt8U2xjMjVhMzB8QWRjazV8TWluZHkzfFlwZWwyfE5ycDF8Q3J5bDF8bXQtQ3l0YnxGYmYxfEdhczJ8T3RjfEM0YnB8TGRoYXxBbGRoMWwxfEdhcmVtMXxBZGg0fG10LU5kNHxJbm10fG10LU5kMnxHbTQyOTA2fFNsYzM4YTN8U3QzZ2FsNHxVZ3QyYjM2fFB0cHJkfEluc2lnMXxJbW1wMmx8R29uNGx8RGVzaTJ8VGFjYzF8Q3liNWF8VndhOHxLbGYxMnxHbm10fFBycGY2fENmaXxQdGVyfFJhcGdlZjR8RmdneXxQaXRwbmMxfExicHxQZWFrMXxDZG8xfERpYXBoMnxBZGgxfE1hcGsxNXxTbGMzMGExMHxTZHI5Yzd8TWFtZGMyfFJpbXMyfExpdGFmfEFoY3lsMnxBYmNiMTF8bXQtQ28yfEN5cDJjMjl8Q3JwfFNsYzI1YTQ3fFNsYzM3YTF8UG5yYzF8SGdkfFJhaTE0fFByZzR8R2NudDd8bXQtTmQzfFJpbnQxfEZnZnIyfEdjbG18R2x0MWQxfERkY3xWdG58RXZhMWF8VHJwbTN8WmMzaDEzfFRycDUzaW5wMnxTYWE0fE5yM2MyfFpidGIyMHxDZWJwYnxDcGIyfE5yMmMyYXB8R3NhcHxJdGloM3xTdWRzM3xJbnNpZzJ8SWdmMXxIaGV4fExueDJ8VmNsfFN1Z2N0fFRtZW0yNDN8bXQtTmQ0bHxDaG4yfENsb2NrfE10aGZyfEFnbW98UGlkMXxGZWNofEdtNDk1MnxTa2FwMnxQZGlhNXxPbmVjdXQxfEFjYXQxfEt5bnV8VG1lZDV8bXQtTmQxfE5vczFhcHxBY2FjYXxTZXJwaW5hMTB8UHRwbjN8VGlmYXxCaG10fENsZWMyZHxOZmlsM3xBYmNhNnxFcm4xfENlczFkfFBjeXQyfEZ0Y2R8U2xjMzhhNHxHc3B0MXxJbmhiYXxMYXJwNGJ8U2ltYzF8VHJhZjV8R3RwYnA0fFBpazNjMmd8UGhmMjBsMXxUaW1tMjN8UnBsMzZ8U2VucDV8U2xjMTdhNXxGYWJwMXxHbGRjfFJpcG9yMnxMcnBwcmN8VGFiMnxacHIxfEV0ZmRofFRocnNwfFViZTJmfFBlZzN8U2xjMjRhNXxHbTM4Mzl8VGdvbG4xfEFnbWF0fEtwbmE0fEZldHVifFN0NXxZcGVsM3xTZjNiM3xSbGZ8UGtoZDF8U2xjbzFiMnxHZm9kMnxDY2RjMTJ8U2NvMnxFeG9jNXxGdGwxfFpmcDY5N3xFaWYyczJ8Rm5icDF8TmVrNnxUeG5kYzE1fE1hc3RsfEJhY2gyfFdzYjF8TWFwM2sxNHxBYmNnOHxaYnRiN2F8UGF3cnxUbWVtMjE5fEdwZDF8RXJsaW4xfEdwYzR8RnBnc3xFaWYxfEFwM3MxfEFrcjFhMXxNYWNyb2QyfG10LUNvMXxTbGMyNWExN3xQY2sxfEEyMzAwNTBQMjBSaWt8WmtzY2FuMXxDeGFkcnxHbTY2MTR8TGRhaHxQcHAxcjNjfEIzZ2F0M3xGZXJtdDJ8Q3BuMXxNcHA2fEQ0MzAwNDJPMDlSaWt8UnRmMnxJdGloNHxEYml8UHJvZGh8TGdhbHM5fEJlbmQ3fFRzdGQxfEdtNDc1NnxQdGdlczN8SHNkMTdiMTN8TWFyY2gyfEZhbTIxMGF8Q294OGF8TGFyczJ8SHNkMTdiMTJ8U3FzdG0xfENvbDZhNnxFdG5wcGx8UHBmaWExfFRiYzFkNXxaYzNoMTV8Q2FscnxTaWdtYXIxfFB0cG4xfElzY3V8VG1lbTI0OHxUZWNwcjJ8Q2NkYzE1MnxHYWJhcmFwbDF8TXJwbDM4fENlcDQ0fDI4MTA0NzRPMTlSaWt8RnRsMS1wczF8R3JpbmF8TGFyc3xTZXJpbmMxfFNsYzI1YTUxfFNsYzI1YTI1fFBwcDRyM2J8TnNkM3xMY3AxfFNvY3MzfFVzcDZubHxGdGgxfFBtczF8SG1nY2x8U2lrMXxDbHBwfEVjaDF8S2lmYzN8U3N1NzJ8Q2xpYzR8RG5hamMzfEVpMjR8U3R4MTZ8UHJyMTZ8UmZmbHxSYXNhbDJ8Q2ZhcDU0fFNjYWl8U2VycGluZzF8TWV0dGwyNnxDNGJ8SHNwYTR8NDkzMTQwNlAxNlJpa3xEbm10M2J8Q2hkNHxDdWwxfE1hbDJ8TmNvYTV8U2NhcmIxfERjYWY1fEFrYXA4fFBsazN8VG9yMWFpcDF8U3RyYnB8SW5oYmN8WmZwNDEwfE5lZGQ0bHxHbTExNjM5fENhdHNwZXJlMnxTaDNiZ3JsMnwxNjAwMDE0QzEwUmlrfFNsYzExYTJ8Q3JlYjNsM3xBdHA3YXxUYW9rM3xBbmszfERhYjF8WmZwMTQxfE5yMWkzfERtZ2RofFViZTJrfENsY24zfEFtbjF8UmV0cmVnM3xFdG5rMXxFcmdpYzF8R2F0YTR8Q29xM3xDb3ExMGJ8RWlmM2N8UnBsMjR8UGZuMXxIaW50MXxUcm10MTEyfEJyaXAxfElmaTM1fFNlcnBpbmEzbnxIZWx6MnxTYXlzZDF8TXNtbzF8QXRveDF8Q294MTl8TGFjdGJ8RXJyZmkxfFJhYmFjMXxGYW0xNjhifE5kdWZhNGwyfEN5cDJlMXxTbGMxNWE0fFNudGIxfEdseWF0fFJhbmJwMnxUcGQ1MmwyfEhlY3RkMnxEY2FmN3xDb3g3YTJsfFBjc2s3fEtkbTVifFJiMXxNY2wxfG10LU5kNXxGYW0xMzVhfFBua2R8WmZoeDJ8RGNhZjZ8TmFzcHxUaW1tOXxLcmFzfENveDZhMXxJZnJkMXxBZGFwMnxQbHBwM3xabnJmMnxSZXhvMXxFaWY0ZXxOY2thcDV8UHhtcDJ8RGR4MzlifEdtMjgzMDV8S3J0MTh8NTgzMDQ3M0MxMFJpa3xMcmlnMXxBbWFjcnxBZ3BhdDJ8U29kMnxEaHJzNHxTbGMyNWEyMHxDZ2dicDF8SXJhazR8VG05c2YyfFRyYWY2fEdocnxNeW8xMHxTZXJwMXxXZHIzN3xBdHAxYTF8TnIyZjJ8TmNrMXxQcnBmNGJ8RnJyczF8R25hc3xUbWVtMzBhfE5kcmczfFR0YzdifEFiaGQxN2N8Q3BlYjR8RHJnMXxGYW0xNjBhMnxabXluZDh8U21pbTEzfEdmZXJ8T3R1bGlufEFoc2EyfE1waG9zcGg4fE5lZGQ4fFJjM2gxfFNsYzI1YTQyfENyZWxkMXxMYXAzfEdzZG1lfEZuMXxFeGQxfE5yYnAyfFNlcmYyfEFiaGQxNGJ8TmFyczJ8Q2RoMXxDYXByaW4xfEZhbTE2MmF8QWtpcmluMXxTZWxlbm90fEVwczE1fER0bmJwMXxTeXZuMXxMdXpwMXxDZWJwenxTbGt8UGxiZDJ8THNtNnxQcnIzfEVpZjRlMnxHaGl0bXxHZ3BzMXxScGw2fFBpZ2x8TmVifENhYnlyfFBhcms3fENhYjM5fENyZWcxfENoZDd8RWxhdmwxfEhzcGE1fEZlbTFjfFBsY3hkMnxHdGYyaXJkMXxOdXA5OHxIZGxicHxDMXJhfEFJMTgyMzcxfFBzbWQxMXxTcnNmN3xDeXAyYzIzfEN5cDNhMjV8UHljcmx8Tm9zdHJpbnxCYWczfEFwb2JlYzF8TmlwYTJ8VXFjcjEwfEFsa2JoNXxTdXNkMXxUcmEyYnxDOGd8U2RmMnxCYWlhcDJsMXxHYmUxfFBsY2IxfFRtZWQyfFR0cnwyMjEwNDA4STIxUmlrfERubTFsfFNlbWE2YnxBbGRoMWExfEVpZjRofEN5cDJqNnxHbTM3MjQwfFBhbGxkfFNhdDF8V2RyMjB8UG5wbGE3fFBhcnZhfFVyZ2NwfFRvcDF8UmFiNmF8Q3lwMmo1fEI0Z2FsdDV8Q3B8WmZwOTcwfEVsb2J8RG5hamEyfE5kdWZhNHxCNGdhbHQxfEdsdHBkMnxMYXNwMXxOdWZpcDJ8U2Z0cGR8UGFrMnxOdXA1NHxNdGZyMXxTbGMxMGEyfENlcDE3MHxNaWRufFJuZjExfE1pY2FsbDF8MTExMDAwOEYxM1Jpa3xTYXJkaHxQZWxpMXxUbWVtMjM4fFNsYzMwYTl8UG9scjJhfFNncGwxfE9ybWRsM3xTbGMzYTF8QWxkaDFhN3xFdHY2fEhtZ2NzMnxYYnAxfE5lY3RpbjJ8UmFwMWJ8R2F0YWQyYXxBY3NsMXxHb2xnYTV8QmNsN2N8RmFtMTExYXxNYXBrYXBrMnxQb2xyMmp8UnRwM3xJbnBwNWF8RnJtZDRifFNsYzM1YjN8TmFjYXxNaWNhbDJ8UHBtMWd8TWFwcmUzfElkMnxTcnByfENwb3h8RWlmNGJ8TnRhbjF8WmZwODEwIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCkRFNC5NMU0zLjAuMSA8LSBncmVwKGMoIkNveDdhMnxBc3RuMnxTbWFkMXxTZXJicDF8UnVzYzJ8Rm94YTN8RXJnaWMyfFNwaW4xfENlbGExfE51ZHQxMnxSbmYyNHxUZXgyfENoZGh8WmtzY2FuM3xTaHRuMXxTbGMzNWQxfENkODF8WmZwNzk5fFZjcHxBa2FwMXxDaHVrfEdwaG58TG9ucDJ8RXRmMXxCYWNlMXxTbGMzOWExMXxEbmFoOHxDY25pfEFsa2JoMXxNcHA3fEhvb2syfFl5MXxNb2I0fFNjeWwyfEdhdGFkMXxSZXJlfFBhcmd8WmZwMTgyfElsNnN0fEFwMWFyfEFjYWR2bHxBdHhuN2wzYnxTdHJhNmx8QnRiZDF8WWFmMnxCcmQxfFZ0Y24xfFJwbDExfE9yYzN8TmR1ZnYzfEhpYmFkaHxIc2QxN2I2fFRteDR8UHBwMmNhfFVicjR8TmVrMXxNb3JuMXxIZXJjNHxVYnFsbjF8R20xMDU2M3xEemlwM3xUYW5rfEZhcnAxfFRjdGF8UGFwb2xhfEJtcHIxYXxIc3BhOXxFaWY1fFRtZW0xMzF8QnJpM3xQYW5rMXxNdHRwfDExMTAwNTlFMjRSaWt8THJmbjN8SGl2ZXAxfE5ldTF8VGJjZXxFZm5hNXxaY2NoYzZ8QWN0cjJ8U2xjMTZhMXxTZWMyMmJ8WXRoZGYyfFRlZnxZYngxfFByZWJ8WmJ0YjF8UGxkMXxGOXxSYXJifEdtZWIyfFJhZDIzYnxSY2MyfEdvcmFzcDJ8THp0ZmwxfEZhbTEwNGF8U2ZwcXxTbWFncHxQcGlsNHxFZGYxfE5oc2wxfEludHM3fFpmcDM4NWJ8UHNtYjF8VGltbTEzfFpmcDY1MnxJdHNuMXxNcnBzMzR8RWVmMWIyfEx1cmFwMWx8R3NyfERkeDUwfFdkcjUzfFNlYzYyfEdsczJ8Q25vdDd8WGRofENsdWh8QXR4bjdsMXxUbWVtMTUwYXxOZXQxfFNlbnA2fEZhbTEyMGN8R3B4NHxFdGhlMXxDb21tZDd8RmJ4bzQyfE1ycHMyNnxDbHRifENhcjF8S2Fuc2wzfFBzcGMxfFRiYzFkMjJhfFBleDEzfFJuZjJ8QjIzMDIxOUQyMlJpa3xEY2xyZTFjfDE3MDAwMTlBMDJSaWt8QWNveDF8V2lwaTJ8VmV6dHxEcGYzfEdtMTQ0MDN8R21jbDF8SHNkbDJ8RWlmMmIxfEVtYzN8UmFwMWdhcHxUcml0MXxQcWxjMXxOZjF8U2NhZjh8U2hxMXxMYXJwNHxOZ3JufFViYnxWY3BpcDF8VWJlMmoyfExycmMyOXxTbngzfE1hc3QyfEF0cDVsfFJuZjE5YXxBdHA2djFmfEVpZjRnMnxLbGhsMnxTbGM3YTd8Q294N2J8QWRhbTExfE1iZDF8WWFwMXxHcmIxMHxNcHJpcHxMaW43Y3xaYnRiMTF8UHVyYXxHYWJhcmFwfFNyc2Y2fDg0MzA0MDhHMjJSaWt8T21hMXxBa3IxYzE5fEgyLVQyM3xTenJkMXxNcm5pcHxOc2QyfFVzbWc1fFJhYjE4fFNwcGwyYXxNY203fEtpZjVifFRocmFwM3xUcHN0MnxCbHZyYnxTYW1tNTB8RmJ4dzh8THp0cjF8UHBwMnIyZHxBY3RsNmF8QnRhZjF8QmNsM3xBdHJ8Q2x1fEVycDI5fFBsYTJnMTJifENzbmsyYTJ8U2RmNHxTZHI0MmUxfFR0cGFsfFJzYm4xbHxHbTM3OXxVYnhuMXxZdGhkYzF8SDJhZmp8UHJpY2tsZTF8QWJhdHxOb2xjMXxOcmlwMXxBY2JkNXxTcGF0YTI0fFJvcjF8TXRtcjE0fElnZmFsc3xNYXA3ZDF8UGxpbjV8Q2FzcDhhcDJ8Um5mMTB8R2luMXxUYzJufE5yMmY2fEFjcDV8VGdmYXxaZnAyNHxHcHgxfERuYWphM3xJZml0bTN8VXNwMTZ8MTcwMDAzN0MxOFJpa3xJZG5rfFJwOXxDZGlwMXxScG4xfENkdjN8RWlmNGExfEhtZ2NzMXxTbWFkOXw5MDMwNjI0RzIzUmlrfFN1bHQ1YTF8T3BsYWh8WmZwMTA2fE10bXIxfENvbGdhbHQyfFJhaTF8RGdraHxQcHA0cjNhfERkeDIzfERzdG58U3RhdDVhfEhtY2VzfFl0aGRmMXxBZGlwb3IyfER5bmxsMnxHY2dyfERoeDl8QXNiMTN8RWNpMXxaaHgyfEVpZjJiNHxVcGIxfFBzbWIyfEZveG4yfFpidGI1fFJhZDU0bDJ8Q3BlYjJ8VG1lZDR8S2RtM2F8TWV0YXAxfEFua3JkNDZ8QWtpcmluMnxMcGluMnxNcnBzN3xOcHJsM3xDdHN6fFNvYXQyfEF0cDZ2MWh8Q2FtbHxVcGYzYnxNYXA0azV8UGRpYTN8NDkzMjQzOEExM1Jpa3xEbmFqYjExfFNtdXJmMnxNdGlmMnxDeXA0ZjE3fFBhaXAyfFNsYzI5YTF8VGFyc3xWYW1wOHxHM2JwMXxBZGg3fFZ3Y2V8QW5hcGMxNnxTY3lsM3xDb3BzNnxTbncxfFJhbmJwOXxHb3NyMnxDaG9yZGMxfE1ycHMxMHxOY2FtMnxFMTMwMzExSzEzUmlrfFdhcnN8RWlmNWJ8Wm5oaXQxfEFjdGJ8R21mYnxDcmt8SGlwazJ8Q3JlbXxOcjBiMnxEdXNwMXxTZGYybDF8SGFkaGF8QXRwMTFhfERkYjF8UHJrZDN8SHRhdGlwMnxJbnRzOHxRcHJ0fFJjYnRiMnxHcmViMWx8S2xmOXxQaXRoZDF8VWd0M2ExfE1ycGw1MnxQc21kNHxQcGlifENsbnMxYXxSYWQ1NGJ8U21hcmNhZDF8VnBzNzJ8VHRjMTR8SGFkaGJ8WGlhcHxDZWFjYW0xfFNlYzYzfENveDExfENscHRtMXxBdHAxMWJ8Q294N2N8U2htdDF8QWJsMnxOZ2VmfE1nYXQyfER1czFsfFNlcnBpbmEzY3xUbWVtMjU5fFJob2F8UnBsMjdhfE5kdWZiMTF8QnJ3ZDN8RmFtNTNhfEhtZ2NyfDIzMTAwMzBHMDZSaWt8TWVkMTN8RmVyfFJlbG58VXh0fEp1bmJ8UGRpYTZ8UDRoYTF8TmR1ZmExMHxBdHA1YzF8QzFzMnxXZHI0fENlYnBnfFN0azM4fE5hZHN5bjF8RGV4aXxGYW0xMjBifFRyYWJkfEVsbW8xfEFobmFrfFRtZW0yMzR8U3RrMjR8WXdoYXp8UHBkcGZ8VHBwMnxNcmVnfE5waHAzfEdwa293fFByZWxpZDJ8U2xjMzBhNXxEZXJsMXxTdHg1YXxTdGF0M3xQeXVyZnxQcHAycjFifFRiY2F8UGhyZjF8VXRwMTRhfFRtZWQ3fFBhdGwxfFBlYnAxfFZwczUwfENhYXAxfFNzYnxQZHJnMXxHbmwzfEZhcnNhfFVmYzF8VHViYjRifEZveGozfFVibjF8Q294NmN8UnNwcnkxfEtwbmExfEJ0ZHxEY2FmMTB8TWJkMnw0OTIxNTI0SjE3UmlrfFVxY3JxfFBkaWE0fFBhaXAxfFNocGt8U3RhcmQxM3xQbHhuYjJ8VXRwNHxCc2d8Um5mMTE0fENmYXA5N3xUbWVtMTI3fFJucHMxfE1hcDNrMTB8UmlvazF8Tm9wNTh8R2NzaHxSYWMxfEZ5Y28xfFRyYXBwYzR8QmNsYWYxfFB0cG4yfERkeDE5YnxIczJzdDF8WnN3aW04fEdtNTYxN3xEY3VuMWQzfEFjdG4xfDQ5MzA1NTZKMjRSaWt8THJwNXxDZGs3fEFzZ3IxfFN1cHQ1fFBhYnBjMXxIbnJucGx8TGFtcDF8RW1jNnxSM2hkbTF8QmNrZGhifFNyc2YxMXxXZHI3fFRtZW0xNDN8QWF0ZnxQZWYxfEFjYWQ4fFRvZ2FyYW0xfFN5bXBrfE1ycGwzNHxNeWwxMmJ8QzFnYWx0MXxTeW5jfFpmcDg2N3xTbmFwNDd8VG1hN3xNdHNzMXxSZXN0fFRzc2M0fENyZWIxfEZrYnA4fExhcmdlMXxJbXAzfFNkc2x8RWlmM2V8UnBsMTBhfEF0cDZ2MGJ8UHJwc2FwMXxDZGM0MmJwYnxBY3RyMWF8TW9jb3N8UmFiMmJ8TGNhdHxTY2FmMXxTZjNiNnxBdHAxM2ExfE5kdWZiNXxNYXQyYXxJZ2YyYnAzfFByZHg1fEhubXR8Q294NWF8SWdobWJwMnxTZXRkYjJ8VG1lbTE5fEFjdG40fE94bGQxfE1hZ2VkMXxTb3g2fEdqYjJ8THNtMTJ8U2VjNjFhMXxCYXoxYnxQc21kNXwxMTkwMDAyTjE1UmlrfE5kdWZiOXxBYmhkM3xEaWNlcjF8Q2xkbjF8TWluZHkxfEFjYWRzfERocHN8UnBsMTl8QmF6MWF8SXdzMXxTdXB0MTZ8Q2NudDF8QXRnMmF8RmJ4dzd8UnBzM2ExfFdkcjQ1YnxEb2NrNHxGYW0yNWN8U2RoYWYzfFN3dDF8U2VycGluYzF8R2FufFNiZHN8TWVkNnxQY2YxMXxDb3ExMGF8U21hcDF8R3ByNjh8UHNtZDh8VHhuMnxBc2NjMnxGYnhvMzF8VnRpMWJ8VGFmMTF8RmFtMjIyYnxMZGxyfFRsZTN8QWNiZDN8THJyYzU4fFNpcnQxfExtbmF8U2xjNDBhMXxHcHR8Q2NkYzEyMnxUZXgzMHxDcHNmMXxNcnBsMnxFc2NvMXxDZGM0MmJwYXxYeWx0MnxObHJwNnxNcnBsNTd8WmZwNDUxfEdwYXRjaDJsfDQ4MzM0MzlMMTlSaWt8UHJwZjMxfENzbmsxZHxSYWJlcDJ8R3JpYTN8TmR1ZnMzfFJhcGdlZjV8U2hvYzJ8Um5mMjE3fENoZDl8UmJtNGJ8QXAyYTJ8TXlsNnxDYXJzfE1seGlwfFRiYzFkMjB8Q2FsbTF8Q29sNGExfEZhbTIwN2EiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKREU1Lk0xTTMuMC4xIDwtIGdyZXAoYygiUHBhcmR8UnBzMTF8V2R0YzF8VmFwYXxOZXRvMnxLcG5hM3xNcnBsNHxOZjJ8TXRvcnxUbTlzZjR8V2RyODJ8Q294MTh8TnJuMXxaZnA0NDR8TXJwbDE3fFRtMmQxfEFuZ3B0bDR8UHJvazF8TWNwaDF8VWxrMXxUbWVtMjE0fFRhZjFhfFNlbTF8Rm5kYzNifEZjaHNkMnxPbGZtMnxHbTExODA4fFRwazF8SXRnYjF8TWtsMXxGYnhvMzh8UnJhczJ8Um5mMTExfFRzYzIyZDJ8VG1lbTIxNnxOcjJjMnxBYWVkMXxBcG9vfEh5YWwyfEF0cDJjMXxQaTRrYnxTbGMzOWExNHxUc3R8S2RlbHIxfFViZTJhfENscGJ8Q29hM3xBcDV6MXxEZHgyMXxOb3AxMHxHaW1hcDl8V3NiMnxBYmNlMXxDY2FyMXxJbmNhMXxUZ20yfE9nZm9kMXxNdGhmc3xCZHAxfElsMTNyYTF8UmRoMTR8Q2dycmYxfEhucm5wa3xaZnA4MzB8U3RrMTZ8VmF2MnxHbTcyOTh8VHJwNTNpbnAxfERwYWd0MXxSbmYxMzh8VGNpbXxTZWMxMWF8Q2RrbjFhfFR0YzE5fEZhZjJ8QXRnMTR8SDNmM2F8VGh1bXBkM3xNcnBsNDl8Q2RjMTIzfFNycDl8THJwMXxSYWJnZWYxfFNwY3MyfExhbXAyfFNmcjF8UmV4bzJ8QW54YTd8UGNnZjZ8QmJveDF8VWJlMmQyYXxOcGxvYzR8TG9ucmYzfENhcjE0fFBzbWMzfE1hbHN1MXxJbnRzNnxEbmFqYzE1fFNlYzEzfExwYXI2fEZieHc0fFpmcDUxMnxIZWF0cjF8Q2RrbjJhaXB8R2FuYWJ8QmJzOXxQbGEyZzZ8VG1lbTE0MXxNYW5iYXxEMTdXc3U5MmV8Q3B0MnxDbGRuMnxUaG9jN3xDbHRhfEd0ZjJhMnxHcnBlbDF8QXRnMmJ8SGRhYzR8U2VjMjRjfFNucm5wNDh8WmZwNzczfEF0cDVhMXxaZnA2NjR8Q21haHxNb2dzfERkb3N0fEN5cDI2YTF8VHJyYXB8RXh0MnxFaWYzYXxDYW54fFJwbHAxfE11bDF8TnVkdDV8Tm9ub3xTbGMzNWEyfElyYWsyfEZrcnB8THJpZzJ8QnJtczFsfERla3xIZWF0cjZ8TW9yZjRsMXxEZGhkMXxaY2NoYzExfFRibDF4fE1jZmQyfE1hcDNrMjB8U3RvbjF8UmFiZ2d0YnxTdGVhcDR8TWlub3MxfFUyYWYxfEJtdDJ8Q3JpcDJ8TWFyY2g1fEd0ZjJlMXxTbnJucDcwfEVkZW0zfEVoZDF8Q3ljMXxSYm0xMHxJbmc0fFhwbzR8U2lkdDJ8QW5rcmQxMXxSYm0xOHxWcHMzN2F8TW9iMWJ8QWJjZjJ8R2lubTF8VG1lbTY4fFpjY2hjMTR8QzFybHxEYWQxfFVzcDE1fFViZTJ2MnxTc2ZhMnxLeGQxfFR0bGw0fFpkaGhjMTh8VG1lbTE2M3xIZmV8UGV4NnxFemgyfE1hcGsxfFNjYXJiMnxPc3RjfEJyaXgxfEF0cDZhcDJ8RGRoZDJ8QXBjc3xTcGludDJ8VGJja3xUc2VuMzR8UnBsNXxOYXQxMHxNdGZyMWx8TmluajF8QW5vNnxGbnRhfEZnZnI0fFBnazF8Q2NkYzI4YXxOaXBzbmFwMnxOdWR0MTN8WHByMXxDY3QyfFBwbTFkfEF0cDlhfFVwZjJ8R2FrfEtkbTNifEhucm5waDF8VHJpbTQ0fEFncm58Q3NkZTF8T2xmcjE2fFBwaXA1azJ8RGVubmQ1YnxQZGNkNmlwfFBvcDF8VG1lbTE3NmJ8RWZsMXxFaWY1YXxPdHVkNXxIaXN0MWgyYmN8WmZwNzQwfERpcDJifEFsa2JoOHxQZmRuNXxOcGMxfEdhYmFyYXBsMnxQcGlsMnxUbWVtMTY3fENhbG0yfFBwcDFyMTNifEFiY2E4YnxNY205fFByb2N8TXJwczIxfENub3Q4fFB4eWxwMXxBbGtiaDJ8UHRwbjExfFpmYW5kNXxUb20xbDJ8VHNwb3xTcmExfFJwczEwfEZhbTc2YnxaZnAxMzF8Q2xkbjN8TXJwczEyfElmbmFyMnxDZXMxZnxOZmUybDF8VWJlMm58MDYxMDAzMEUyMFJpa3xDb2c0fE1ibmwyfENhbWsybjF8R2F0YWQyYnxIMmFmeXxWZXpmMXxQa2QyfERkeDF8VHJhcHBjOHxXd2MyfFJuZjM4fEFhazF8QXRwNW98SG1neGIzfFNseDRpcHxDYXB6YTF8bXQtQXRwOHxNb24xYXxTbWltMTBsMXxHc3B0MnxCYXoyYXxTbngxNnxDZW5wYXxSaW9rM3xScm4zfEN3YzE1fFN1c2Q2fE94c218QXBvbDlifENjbTJ8Q3BxfENjZGM0N3xGZGZ0MXxDb3BlfE10ZjJ8WmMzaDdhfFBzbWcyfFRlZGMyfFRlcnR8UmFiMTFhfFJwczEzfFNsYzI1YTE1fEZieHcyfEVyY2M0fEF0ZzEyfENpYXBpbjF8RWZyM2F8QXRwNnYwYTJ8MTExMDAzMkEwM1Jpa3xPc2JwfEZhbTExOGJ8UHBobG4xfFBleDE5fEVyYmlufEFmZjR8TWxlY3xtdC1OZDZ8VHJwYzRhcHxaZnA1Njh8WmNjaGMyNHxGbmJwMWx8RmFtMjEzYnxBaW1wMXxWYWMxNHxOY29yMXxBa3I3YTV8QXRwOGIxfENsZG4xNHxDY2RjMjV8UGhmM3xTdXB0NnxIZWF0cjVhfEphZGUyfE1pZnxVc2YyfFRtZW02NHxDaGlkMXxQc21kN3xTY2FmMTF8VGV4MTJ8TWV0dGwyfEdtMTEyNzN8UnBsMTh8QWxnMTF8U3BzYjJ8VWJlMnp8WHJuMnxJY2FtMXxEZHg0NnxTZXBoczF8U2xjMzVhM3xUcmFtMXxCY2w3YnxNZWQyN3xOcmYxfENudHJsfFNlYzI0YnxOb2w4fFhyY2M0fFN1bWYxfEllcjJ8SGRhYzF8SGVhdHIzfE1mbjF8Q2NkYzkxfFNzbmExfEVpZjJzMXxOYXJzfEN5cDJqOHxDYWN5YnB8VHhuZGM5fFNwYWNhNnxaZGhoYzE0fFNhbWQ4fEVsbW9kM3xFcmh8TmFhNTB8T2F6MXxNZTF8R2xtcHxBcG9ufEFjYmQ0fE5nZG58VWZkMXxQb3U2ZjF8UHJrYXIxYXxDb3E1fEVpZjNqMXxIc3BlMXxHcnBlbDJ8RnhyMnxSYWI1YXxTcGF0YTV8U2VucDJ8QXRwNnYxYXxFcmkzfFh5bGJ8QWdvM3xBZ3R8VG1lbTEzMWx8UGxscHxBdHA2djFlMXxTY2FuZDF8VG1lbTU2fEdzdG0xfFBzbWQzfFRiYzFkMTR8RmFpbXwyMjEwMDE2RjE2UmlrfFRtZW0yMDh8WmZwNzY4fEF0YXQxfFRpbW04YnxDcmViemZ8UGRoeHxDb3BiMnxQcmthZzJ8U2xjMzBhN3xUaW1tMTdhfERoeDMzfE5sa3xQcHAxY2J8QWNiZDZ8WmZwMzI2fFBxbGMyfExlbmc5fFN0azM4bHxUbWVtMTI2YXxIZGdmbDJ8U2xjMjVhMjZ8RmxpaXxIaWdkMmF8QzFzMXxMc2cxfFB1ZjYwfFpmcDY1NXxSaWJjMXxEaHg0MHxQcHAxcjM3fEhvZ2ExfFBhcXI5fENjc3xOeGYxfFNzcjF8RmhpdHxObWU3fFBucG98S2N0ZDIwfEVhcHB8TnJhc3xIZWN0ZDF8WmZyMnxLcnQ4fFR0ZjF8RWNkfFZwczU0fE1pY2FsM3xScHJkMWJ8WmZ4fFBjYnAyfEFua3JkMTNjfENyeTF8SWtia2FwfEFncGF0M3xNcnBsNDB8VGF0fFJ0cmFmfENkYzI2fE1yZmFwMXxQcHAxcjJ8Vm5uMXxJdm5zMWFicHxBbGcxNHxNcnBsNTB8R2NoZnJ8Q25weTN8T3N0NHxQcHAxcjQyfERuYXNlMmF8TXJwbDQzfFZrb3JjMWwxfENscDF8U2xjMjVhNXxHbTQ5MzU2fFNuaXAxfFNsYzM1ZjV8QWNhZDExfFBvbHIzaHxUbWVtMjl8WmZjM2gxfFVzcDl4fFV0cDExfEVueTJ8SXJnbTJ8SWxmMnxaZnA2NTR8QW54YTV8S2xmM3xQcnBmMTl8QmNhczN8Q2NubDF8UGNiZDF8TW9zcGQzfEN0YnN8R20xNzY2MHxUcHJrYnxDYW10YTJ8TXJwbDIwfER1c3AxMXxaZnA1MTN8UmxpbXxNaWY0Z2R8Rm94cTF8SW5wcGwxfFBycjE0fEN5YjU2MXxDaGQ4fFJhYjQwY3xGYnh3MTF8RG5hMnxVc3AzfEtsaGRjOGJ8Q21hc3xQcm9zZXIxfE52bHxScnAxfFN5bmoxfFNpbjNhfEhucm5wbGx8VGFmMnxTbGMzOWExfENwc2YyfFNsYWluMnxOZHVmczd8VXFjcmMxfENtdG02fEhucm5wZnxNYXQyYnxOZHN0MnxHdGYzYzF8MjQxMDAxNU0yMFJpa3xUb21tMjJ8QUE5ODY4NjB8SW1tcDFsfFRvcDFtdHxRcmljaDF8VWJjfFBleDExYXxTbGM2YTl8TWluazF8UHBwMmNifEVpZjFhfE1ycHMyNHxCQzAwNTU2MXxTbGMyNmExfEN0bm5ibDF8UnJwOHxQb24xfE1ycGwxNHxUaXJhcHxFY2hkYzJ8UHBwNGN8SG5mMWJ8VXNvMXxDYXJoc3AxfFBjbTF8SHNwYTEzfEVobXQxfERuYWpiNHxFcDMwMHxBcG9wdDF8QXRwMmEyfFBvbGt8VXNwMTJ8UGRlM2J8VHNwYW4zMXxRdHJ0MXxHb2xpbTR8VGZyMnxaZnA1MTF8SG1ib3gxfFNueDEzfEF0cmFpZHxMeXJtMnxQYXh4fFJwczE1IikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCkRFNi5NMU0zLjAuMSA8LSBncmVwKGMoIlNtaW00fFByZG0yfFBkc3MyfFZwczUzfFVzcDUwfEFjaW4xfFpidGI0NHxBdHA2djFnMXxQcHAycjVjfElsdmJsfEtkbTVhfFdkcjkxfE9hejJ8UHNraDF8U2hhcnBpbnxGYWJwMnxTdWNsZzF8U2xjMzlhMTB8UmFiMjJhfDMxMTAwNDNPMjFSaWt8TWVkMjh8THlybTF8WHBvN3xMZXByb3RsMXxaZnJ8QXRmMXxUa2ZjfFRtZWQ5fE1ldHRsN2ExfERoeDMyfFRjcDExbDJ8VGZlYnxBY3lwMXxQcHA2Y3xHb2xnYTN8UGRwazF8UHRvdjF8UGZkbjZ8U25kMXxScHM2a2ExfEN1bDV8UmFkMTd8RG5hamIxMnxFbWM3fFBoZjExY3xTdHQzYnxaZnA1OTJ8SGlzdDFoMWN8VGRyZDd8VHR5aDJ8VGltcDN8UnNmMXxMcnJjMjh8Q2RrMTd8SW1tdHxEbmFqYzExfENmYXAyMHxTMTAwcGJwfEJ0ZzF8VWJlMmUxfE1hcmNoN3xBc2FwM3xGYW05OGF8TmFhMzB8VGFmMTN8VGlwaW58UGlwNWsxY3xQb2xlNHxHdWNkMXxTbWltMTR8UGNnZjJ8TWFmfE1ycHMzM3xTc3IyfEZnZnIxfFJuaDF8UnB1c2QzfElnc2Y1fFBvbTEyMXxVdHAyMHxMeW58RTJmNHxDYmZifExwZ2F0MXxOY2FwaDJ8U3BvcHxTcnAxOXxVb3h8MzExMDAyMU4yNFJpa3xBdHA1ZjF8TXlvNnxGYXJzYnxMc20xfFJwbDE4YXxOZHVmYWY3fFNlbGVub2Z8VGhvYzF8THlwbGEyfFRnZmJyMXxHbTQzMDY0fE10cG58TXJwczE4YXxBYXJzfENpcmJwfFRjcDF8UGhrZzF8U2xjMjVhMzl8RXBuMXxSYW5icDE3fENhc2QxfE1hcGsxaXAxbHxQa2RjY3xTZXB0N3xDYW5kMXxhfFBpdHBuYnxMcnBhcDF8VG1lbTE4NnxZbWUxbDF8R3BicDFsMXxTaXJwYXxScGwyM3xDb21tZDN8VnBzMjh8QWRhbTEwfEdtcHN8U2VjMjNpcHxOYWEyNXxUZ2ZicmFwMXxQZWNyfE1hcnN8U2dmMjl8U2xjMjVhNDZ8UmZjMnxIbnJucGExfFBzbWE3fEZveHA0fFBhcm58VHhucmQxfDQ5MzA0NTNOMjRSaWt8UHJvcnNkMXxBdGc0YXxBcXA4fFpucmYxfENkazExYnxNYW4yYTJ8U2d0YXxCdGJkMTB8RGR4MzF8RWNpMnxTcHJ8SWFyczJ8Q2FzdHxNZWQxNXxacmFuYjJ8VHJpbTExfFBzbWM2fFJleDFiZHxUc3BhbjEyfEFua3JkMzZ8UGRjZDd8VHV0MXxSbmYxMjZ8RG5hamM1fE1yb2gxfFBsY2cxfE51Y2tzMXxDY3Q3fEJpZHxDZGFkYzF8Q210bTR8RXhvc2M3fEFiY2YxfFRiYzFkMTJ8WmJ0YjQzfEtpZjFjfFNibm8xfFNycGsxfE15aDl8UGxhYXxSYWNrMXxBa3IxYzZ8UnBzMTZ8UGhjM3xObW5hdDF8T2dkaHxVZ2d0MXxFcGI0MWw0YnxIZXJwdWQyfE1mYXAzfENhY3RpbnxEZHg0MnxDeHhjMXxNY3RwMnwyMzEwMDM5SDA4UmlrfFRtOXNmM3xScHM1fFRyaW0yNXxNcnBzMTF8VWNrbDF8QWVzfFdkcjEyfFpmcDM2N3xOdWRjZDF8UGlneWx8SG5ybnBhMHxFcDQwMHxGbGNufFNlcnBpbmExYnwxMTEwMDY1UDIwUmlrfFBoZjh8RWlmMmFrMXxDb3BzM3xQZHpybjN8TnI1YTJ8MjAxMDEwN0UwNFJpa3xUbWVtMTc1fFJpbjJ8VXNwMzl8RWVmMWR8UHNtZjF8MTcwMDEyM08yMFJpa3xUcnViMnxBdHA1aHxNYWQybDJ8THJyYzN8U21kdDF8WmJ0YjI0fFdkcjg5fFVibGNwMXxFcGFzMXxGZXJtdDF8VHViYTRhfFJwczE5fEFiaTJ8Q2NkYzgyfFprc2Nhbjd8U3JybTJ8V2RyNjF8VHhsbmd8TnRtdDF8TmZzMXxVcm9zfENjZGM3N3wxNzAwMDE3QjA1UmlrfFViYXAyfFBwcDFyMTVifENjdDR8TXQxfEJDMDMxMTgxfFJuZjIxNnxEaHgyOXxBYmxpbTN8U3lucmd8WmZwMjYzfE5vbDl8TnVwMTUzfEhhYnAyfE1waG9zcGgxMHxSYWQ1MHxScHNhfEM4NzQzNnxNb2NzMXxGYXN0a2QxfERjYWYxN3xMbWJyZDF8Rm94azJ8Q2NkYzEwN3xFcGc1fEhhcnN8RWlmMmFrMnxIcmFzfFN0dDNhfEVwb3xFZm5hMXxVcmkxfEVwYzJ8U3R4OHxIeW91MXxaZnA2NDZ8MTcwMDEwOUgwOFJpa3xEbmFqYzIxfEtsaGRjMTB8QXA0bTF8VG1lbTcwfER5bmMyaDF8TXRtcjEwfE1vYjFhfEJvcDF8QWxhczF8UDJyeDR8VGhhcDJ8TXlsaXB8SDEzfE5kdWZiMTB8TmVsZmF8UHJlbGlkMXxJcWNiMXxTbngzM3xaaHgzfE51cDE1NXxNcmFwfEdtMTQzMjV8Q2xrMnxFbWwzfFN1ejEyfE5lY2FwMXxUbWVtMTIzfE1hcDNrN3xUYXp8UmFiM2dhcDF8THJyYzUxfEZhbTMyYXxXYXJzMnxTa3AxYXxWaXBhczM5fFBjaWYxfFNsYzE2YTR8TmR1ZmE4fEN5cDJkMjZ8Sm15fFRtZW0yMjJ8VGlnZDJ8RWVmMnxOYWJwMXxTc3JwMXxUaG5zbDJ8RGh4MTZ8UGdhbTV8VHNmbXxTeW4zfFBua3B8VXhzMXxCM2dhbG50MnxHZ25icDJ8QXBtYXB8Q2RjNDJzZTJ8THNzfE1ycGwyN3xLY3RkMnxMc200fFBvbHIzZnxBdHA1ZHxScHMxN3xUcmltMzN8V2RjcHxScGwzMnxSYWI5fFNsYzE4YTF8UmFiMTFifE5jZWgxfENsZWMxNmF8UGVwZHxUcmFwcGMxM3xSYWJnYXAxbHxQc21jMXxOZWN0aW4xfEFzY2MzfEFmdHBofE10Y2gyfEdyaXAxfE1hcDFsYzNhfEZhbmNsfEdlbWluNXxTaHByaHxBZGFtMTl8TGFnZTN8Tm9tMXxEbmFqYzI0fFBnczF8UHJyZzJ8Q3Rkc3BsMnxHcms1fFBpazNjM3xTbGMzNWUyfFN0YXAyfFV2c3NhfE12YjEyYXxTbGM4YjF8UmhiZGQxfFB0cG45fE5jazJ8Q3NuazFnMnxMYXB0bTRhfFB1czEwfFViZTJnMnxQaXJ8V3JhcDUzfElkaDNnfE1lZDh8UG9tcHxCQzAwNTYyNHxQY2JwMXxQb2xyMmN8S2xjNHxGOHxZd2hhZXxCcmQ3fFBwcDRyMXxBZG5wMnxEZW5uZDVhfFBycmMxfElubzgwZHxac3dpbTV8Um5mNnxPdHVkNHxQcnIxNGx8VG1lbTEwNmF8Q2RjMzd8Q29sNGEzYnB8VGJjMWQxNXxTcHJ0bnxQaHRmMXxCYnM3fE1hcGs4aXAzfFN1Z3AxfERlcGRjN3xZaXBmNXxHcGQyfENhbHV8V2JwMnxQbmxkYzF8U2xjMzVkMnxTZjNiMXxUbWVtMjU4fEdwcjg5fFBhbmsyfFJwczJ8SXA2azF8RG9sa3xVYmUybXxTbWM1fE1ycGw0OHxDbWM0fE1hbWwxfENjZGMxMzh8UnBzNHh8UGlrM2MyYXxFbXN5fE1lZDR8R25nNXxScHMyNnxNZXR0bDI3fFBhazd8UHNtYjV8UG9jMWJ8Q2lkZWJ8UHBwMXIxMHxDYndkMXxEZHgxMHxMbWFuMmx8RGxkfE1lY3J8UHRncjJ8Q2VwNTd8UGhiMnxDbnB5MnxTY2FtcDJ8TWRuMXxGaXAxbDF8UGFycDR8UHhrfEJvbGEzfFViZTJqMXxTdHhicDN8QWhzZ3xEZ2txfFpjY2hjOXxNZnNkMTF8U2gzZ2wxfFRwaTF8U2RjY2FnM3xUZHJkM3xIbmY0Z3xQb2xyMWR8SG9weHxHaWQ0fFRtb2QzfFJwbDEyfFNhZmJ8QnRiZDl8VmRhYzN8QWthcDl8Q2VwOTd8UmZ3ZDN8TWFyY2g4fFNtaW0xMnxDY2RjMTE3fEFicmF4YXMxfEhicDF8UGR6ZDh8RmJ4dzl8R2FwdmQxfFRoYXAzfEthdDZhfFNldGRiMXxGYW0yNDFhfERwaDV8U2xjMjVhMTN8VHJpbTZ8QWJjZjN8VG5mcnNmMWJ8RGVzaTF8UGF4YnAxfFNsYzM4YTEwfE5lZGQxfEFVMDQwMzIwfEgyLUtlNnxUbWVtMTYxYnxTdXJmNHxDdWwyfEZhdDF8QWRjeTZ8VHJpbTQxfE5hYTE1fFJ0ZjF8RG5hamI2fENzbmsyYnxDZXAzNTB8R3JufFpmcDI4MnxaZnAzNDZ8QW1kaGQxfEFjb3gzfFVieG43fFRhcmRicHxFMTMwMzA4QTE5UmlrfFNlbGVub2t8RWlmM2J8VmVnZmR8UGNucHxJcmYzfEFwaTV8TmR1ZnYxfFpidGI0MXxEY2FmOHwyNTEwMDM5TzE4UmlrfE5maWN8RGFscmQzfFNtYXJjYzF8SW5vODBifEFiY2M2fFNmdDJkM3xTaXBhMWwzfENwbjJ8T2xhMXxHbmIxfEdhbGN8VWJlMnEyfE5jYnAyfFZwczI2YXxQcnIxM3xIYWNlMXxaZnAyNjB8Q29xN3xIYWdofE1pZWYxfExpYXN8RWxmMiIpLHggPSByb3duYW1lcyhHMTcyLnVtaXMpLCB2YWx1ZSA9IEZBTFNFKQoKYGBgCgoKCgoKCmBgYHtyfQpERTEuTTJNNC4wLjEgPC0gZ3JlcChjKCJHbTI2OTkyfEV0ZmJrbXR8bmNSTkEtaW50ZXItY2hyWC0xNTQ0NnxuY1JOQS1pbnRlci1jaHI4LTY3MjZ8U3VsdDNhMnxuY1JOQS1hcy1jaHI2LTU1ODl8bmNSTkEtaW50cmEtY2hyNi01NTkzfEdtMzgzOXxBY3NsMXxuY1JOQS1pbnRlci1jaHIzLTIxNTZ8VHltcHxFcnJmaTF8R2hyfENhcm1pbDF8bmNSTkEtYXMtY2hyMTUtMTIzNDB8Q3lwMmMyM3xQa2hkMXxDYXIxfEc2cGN8QWRncnYxfG5jUk5BLWFzLWNocjQtMzUzMnxEcHlkfG5jUk5BLWludGVyLWNocjExLTk1MTJ8QWxifG5jUk5BLWFzLWNocjE1LTEyMzIxfEdtNDc1NnxDM3xBcG9lfFN1Z2N0fERsZ2FwMXxQYmxkMXxGZ2F8U2xjN2EyfFZ3YTh8TmNrYXA1fEtsZjl8R202NjE0fE5maWF8UmJwbXN8SG1nY3MxfE10aWYyfFBlYWsxfG5jUk5BLWludGVyLWNocjE3LTEzOTA5fFN1bHQyYTh8Q2xweHxTeW5lMXxCYWlhcDJsMXxuY1JOQS1hcy1jaHIxMC04NzkxfG5jUk5BLWludGVyLWNocjE4LTE0NjA1fFpmcDY5N3xuY1JOQS1hcy1jaHIyLTE5MDR8Q3hhZHJ8U294NXxNYXBrMTV8R201OTM0fEdtMjgzMDV8bmNSTkEtaW50ZXItY2hyMTUtMTI2MDh8R200MjkwNnxMcGluMnxBYmNiMTF8RWNoZGMyfG5jUk5BLWFzLWNoclgtMTUzMjB8QWJoZDE0YnxIbWdjczJ8bmNSTkEtYXMtY2hyMTUtMTIzMjN8VG1lbTIxOXxHbTM3MjQwfG5jUk5BLWFzLWNocjYtNTg2MHxuY1JOQS1hcy1jaHIxOS0xNDc3MnxFdmExYXxHbHVkMXxBZHJhMWJ8QnJpM3xBY2F0MXxuY1JOQS1hcy1jaHI0LTMyOTh8RmdmcjR8TXJuaXB8QWRoMXxGbW81fElpZ3AxfFNkcjljN3xTbGMzOWExNHxUdGM3YnxTdWRzM3xuY1JOQS1pbnRlci1jaHI1LTQyMjF8SWdmMmJwM3xuY1JOQS1pbnRlci1jaHIxMS05OTQ4fEFkY2s1fFNpcnQzfENvbDZhNnxDaHJtM3xuY1JOQS1pbnRlci1jaHI0LTM4MTl8RmdmcjJ8SWFoMXxJbW1wMmx8bmNSTkEtYXMtY2hyOC02OTU0fFJpbnQxfFNhYTR8TmhzbDF8R2NudDd8QWJjYjR8U2gzZDE5fG5jUk5BLWludGVyLWNocjMtMjE2MXxuY1JOQS1hcy1jaHIxMC04OTYyfFNsYzEwYTF8VGltbTl8bmNSTkEtYXMtY2hyMi0xNTQzfFRtZW0xMjZhfG5jUk5BLWludGVyLWNocjYtNDg4N3xHYmUxfEZhbTIxNGF8VHJwNTNpbnAyfEZlY2h8VGhuc2wyfG5jUk5BLWFzLWNocjE2LTEzMTc4fFRtZW0xNTBhfEVpZjF8TmVifFZtcDF8bmNSTkEtYXMtY2hyMTctMTM2ODN8TmZpYnxHbTMzNTQzfG5jUk5BLWFzLWNocjctNjU0N3xIZXJwdWQxfG5jUk5BLWludHJhLWNocjYtNTU5MXxDcHMxfFpidGIyMHxaZnA3MDd8QXAzbTF8TWV0dGwyM3xBdHA1b3xCbG18U2RyNDJlMXxWY2x8UHBhcmF8TWFiMjFsM3xQcnBmNGJ8SWdmMXxQcmVifFRzaHoyfFNodG4xfE5lZGQ0bHxDYWJ5cnxuY1JOQS1hcy1jaHI0LTM1MDB8WmRoaGMxNHxuY1JOQS1hcy1jaHI5LTc3MDJ8U2xjMjVhNDJ8bmNSTkEtaW50ZXItY2hyMTMtMTEyMjd8U3RpbTJ8R200OTUyfG5jUk5BLWludHJhLWNocjctNTkxOXxNZWNyfG5jUk5BLWludGVyLWNocjEyLTEwODgwfG5jUk5BLWludGVyLWNocjQtMzY5OHxTdDNnYWwzfEhzZDE3YjEzfFBsaW4yfFN0cmJwfDQ4MzM0MjBHMTdSaWt8VGhhcDJ8RmJmMXxaZmFuZDZ8VWd0MmEzfE9sZnI1NnxuY1JOQS1hcy1jaHI1LTQzMzR8U2NvMnxOdW1ifEJtcDF8RGFiMXxuY1JOQS1hcy1jaHIyLTE4ODR8QWRpcG9yMnxJcmdtMnxuY1JOQS1hcy1jaHIyLTExNDV8bmNSTkEtYXMtY2hyMTItMTA1MjF8bmNSTkEtYXMtY2hyMTEtMTAwNzV8Um5mMjV8QXRyfEV0ZmRofEYxMXxuY1JOQS1pbnRlci1jaHIxMC05MjY0fEJjYXMzfEFjb3gyfEt5YXQxfG5jUk5BLWludGVyLWNocjQtMzI5NHxTcXN0bTF8UHJvc2VyMXxUbWVtMjQzfFBpZDF8QnRiZDl8TWUxfG5jUk5BLWFzLWNocjE2LTEzMzgwfFNtYWQ5fFNtaW0xM3xHdWNkMXxEcmcxfFBoeWh8UGRlNGN8bmNSTkEtaW50ZXItY2hyMTAtODc5NHxOcjFoNHxNdHNzMXxFbG92bDV8U2xjMzdhNHxMenRmbDF8U3RhcmQ1fERuYXNlMmJ8QzFybHxYaWFwfE1zbW8xfFlwZWwzfG5jUk5BLWFzLWNocjE3LTE0MDE4fEFhZWQxfEdnYWN0fG5jUk5BLWludGVyLWNocjEtODQ2fG5jUk5BLWludGVyLWNocjEtMTYxfENlczFnfFNkYzR8UHBwMXI5YXxBcDNzMXxNZXR0bDI2fFRyaW03fERocHN8UmJmb3gxfFRyaW0yOHxuY1JOQS1pbnRlci1jaHIxMS0xMDE4OXxFY2kyfFN0eDE2fEdtMTA1NjN8RGhyczR8U2xjMjdhMnxHaW4xfEF0cDZ2MGJ8Q3B0MWF8TnJwMXxuY1JOQS1hcy1jaHIxOC0xNDYyOHxQeG1wNHxSb3JhfG5jUk5BLWFzLWNocjctNjE2MXxuY1JOQS1pbnRlci1jaHIxMS05OTIyfFR0YzE0fFRmcjJ8SWZua3xPeGxkMXxIYWRoYXxOb3MxYXB8U2YzYjN8bmNSTkEtaW50ZXItY2hyMTItMTA1OTV8bmNSTkEtaW50ZXItY2hyMTUtMTIzNjV8RnljbzF8bmNSTkEtaW50ZXItY2hyMTItMTAyNzAiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKREUyLk0yTTQuMC4xICA8LSBncmVwKGMoIkZhbTIxMGJ8bmNSTkEtYXMtY2hyMS05Nzl8QWxkaDFsMXxuY1JOQS1pbnRlci1jaHI4LTY5NzV8bmNSTkEtaW50ZXItY2hyMTctMTM5Mjh8RG5hamEyfFBsY2IxfE5ldDF8bmNSTkEtaW50ZXItY2hyNi01ODYyfExvbnAyfG5jUk5BLWFzLWNocjktODMxNnxQZWxpMXxUaGVtNHwyODEwNDc0TzE5UmlrfEdjbG18WnByMXxuY1JOQS1hcy1jaHI5LTc4MjV8bmNSTkEtaW50ZXItY2hyMTItMTA1NjF8R3JpYTN8bmNSTkEtaW50ZXItY2hyMTMtMTE2Njl8QWNrcjR8Um5mMTY5fFR0cGF8R3NkbWV8bmNSTkEtaW50ZXItY2hyMTItMTA1NTV8U2xjN2E4fEdncHMxfDE4MTAwMjJLMDlSaWt8U2xjMjRhNXxuY1JOQS1hcy1jaHI0LTMwODN8UnRwM3xTb258RGRoZDJ8RGNscmUxY3xuY1JOQS1hcy1jaHIxOS0xNTA2MHxuY1JOQS1pbnRlci1jaHI1LTQzOTV8bmNSTkEtYXMtY2hyMi0xNDM5fEFzdG4yfFRyYWY2fFNzYnAyfFNsYzM1ZTJ8bmNSTkEtYXMtY2hyNi01MjYxfFJvcjF8T3NicGw5fFBkcmcxfG5jUk5BLWFzLWNocjExLTEwMTM2fE5tZTd8MTcwMDAzN0MxOFJpa3xDZGlwMXxuY1JOQS1pbnRlci1jaHIxLTEwOXxMaW1zMnxIb3B4fEVlZjFha210MXxQbGQxfFNsYzM4YTR8RXNjbzF8Q294MTl8bmNSTkEtaW50ZXItY2hyWC0xNTQzN3xQcGRwZnxNcnBzMTB8SW5jYTF8QmV0MXxuY1JOQS1pbnRlci1jaHIxNS0xMjcxM3xuY1JOQS1hcy1jaHIxLTM3M3xBcG9iZWMxfFBsY3hkMnxTYXNoMXxaZnAzODVifG5jUk5BLWludGVyLWNocjEtMjkyfE9jZWwxfG5jUk5BLWludGVyLWNocjE3LTE0MTgyfEFsZGg5YTF8T2F6MXxTdGF0M3xUcGsxfFprc2NhbjF8RmJ4bDIwfE1ldHRsN2ExfG5jUk5BLWludGVyLWNocjExLTk5MTF8UDJyeTE0fFB5Y3JsfFBya2QzfG5jUk5BLWFzLWNocjYtNTYzNHxTaWdtYXIxfG5jUk5BLWFzLWNocjctNjEwMHxuY1JOQS1hcy1jaHIxMS05OTU2fE15bzZ8THBwfG5jUk5BLWludGVyLWNocjQtMzQ1OHxTbGMxNmE0fEFjc20zfG5jUk5BLWFzLWNocjItMTA3M3xEbWFjMnxaZnIyfFJicDR8R3B0MnxBZ21vfG5jUk5BLWludGVyLWNocjE5LTE0ODc2fG5jUk5BLWFzLWNocjE3LTE0MDY1fFJzcGgzYnxOZWsxfFNsYzI1YTIwfEFhY3N8VGFwMXxHbTExNjM5fEFrcjFjNnwyODEwNDU5TTExUmlrfG5jUk5BLWludGVyLWNocjE5LTE0NzQ2fG5jUk5BLWludGVyLWNocjYtNTU2MXxTdGsxNnxEbGF0fFBzbWQ3fFBpYmYxfFBobHBwMXxuY1JOQS1pbnRlci1jaHIxOS0xNTE4MHxOZngxfElwNmsyfEFiaTJ8WmZwOTUxfEdvbjRsfEdtMTIxODV8TWV0dGwyN3xMYWN0YnxDaGRofDkwMzA2MjRHMjNSaWt8bmNSTkEtaW50ZXItY2hyNC0zMzUyfEdwYXQzfFBwcDNjY3xOcjJjMmFwfFRsY2QxfE1vcm4xfG5jUk5BLWludGVyLWNocjUtNDA1MnxDYXRzcGVyZTJ8WmZwNjQ2fEFkYW0xMXxuY1JOQS1pbnRlci1jaHIxNy0xNDEyOHxTcGcyMHxDZW5wdnxCNGdhbHQ1fG5jUk5BLWludGVyLWNocjMtMjEyOHxOY29hNXxCQzA0OTc2Mnxac2NhbjI2fEFwb2J8RnVjYTF8U2lycGF8Um5wczF8UGF3cnxWcHM5ZDF8RGR4MzlifENyZWJ6ZnxWd2NlfG5jUk5BLWFzLWNocjEtMjUyfFJuZjR8Q2ZhcDU0fFNudzF8RXZpNXxNaWIyfFBleDE5fEFrMnxQdXJhfG5jUk5BLWludGVyLWNocjQtMzcwN3xZaXBmNXxFcmdpYzJ8UGxwcDN8SWZpMzV8UmFiMTFifG5jUk5BLWFzLWNocjUtMzk0N3xQdHByZ3xUbWVtMTA2YXxQb2xyMWF8QW1hY3J8UHJwc2FwMXxuY1JOQS1pbnRlci1jaHI2LTQ4NTN8Q3J0YzN8bmNSTkEtaW50ZXItY2hyMy0yMTM0fERpcDJjfEdtNzI5OHxTYXlzZDF8RGVwdG9yfERwZjN8SDItRDF8bmNSTkEtaW50ZXItY2hyMTktMTUxMzh8bmNSTkEtYXMtY2hyMTMtMTExNDl8QXBvaHxQZGNkNHxNcHAxfEFwYmIyfFNsYzE2YTEwfFRpbW0yM3xXc2IxfG5jUk5BLWFzLWNocjE1LTEyODIxfDIzMTAwMzlIMDhSaWt8UGhmN3xTY2FtcDF8QjNnYXQzfG5jUk5BLWFzLWNocjItMTU1MHxQYW4zfEdjaDF8SG1nY2x8VG9tMWwyfFNyc2Y3fG5jUk5BLWludGVyLWNocjEtMTIwfFR0YzE5fG5jUk5BLWFzLWNocjQtMzAyM3xGYW0xMTFhfFNsYzM1YjN8bmNSTkEtaW50ZXItY2hyMS04NDB8UGxzM3xuY1JOQS1hcy1jaHI1LTQwNzl8QXNpYzV8bmNSTkEtaW50ZXItY2hyOC02ODc4fG5jUk5BLWludGVyLWNocjEyLTEwNDYyfFNlcmYyfEhpYmFkaHxOZGZpcDF8VHJwbTN8QTIzMDA1MFAyMFJpa3xaZnA3OTl8QWthcDhsfG5jUk5BLWludGVyLWNocjEyLTEwNDAzfExlbmc4fE1hdDJhfExhcnMyfG5jUk5BLWFzLWNocjYtNTcyNnxaZnAxNDF8U2xjMjJhMjN8QUkxODIzNzF8UHFsYzF8bmNSTkEtaW50ZXItY2hyNi01NTEwfFVsazJ8bmNSTkEtYXMtY2hyMTAtOTA3M3xuY1JOQS1pbnRlci1jaHIyLTE5NTl8UHBpbDJ8bmNSTkEtaW50ZXItY2hyMTItMTA5NzN8SGVyYzZ8T2NsbnxVdnJhZ3xuY1JOQS1pbnRlci1jaHI1LTQyNzgiKSx4ID0gcm93bmFtZXMoRzE3Mi51bWlzKSwgdmFsdWUgPSBGQUxTRSkKREUzLk0yTTQuMC4xICA8LSBncmVwKGMoIk1mc2QxMXxDbG9ja3xEY2FrZHxuY1JOQS1hcy1jaHIxOC0xNDMzMnxuY1JOQS1pbnRlci1jaHI2LTUzODR8R203NjV8QXRwMTFifG5jUk5BLWludGVyLWNocjEyLTEwOTMwfFNlbnA1fG5jUk5BLWFzLWNocjYtNTI2NnxQYWxtZHxEMjMwMDI1RDE2UmlrfFpjM2gxNXxuY1JOQS1hcy1jaHI1LTQyODF8VHVmdDF8Q3lwNGYxM3xObW5hdDN8Q2NkYzE3NHxEYWN0MnxHbmV8bXQtQ28zfG5jUk5BLWludHJhLWNocjE5LTE1MDE2fERpZG8xfEl0cHIyfG5jUk5BLWFzLWNocjUtNDYwMHxUa2ZjfG5jUk5BLWFzLWNocjE2LTEzMzEwfE15bzFlfG5jUk5BLWludGVyLWNocjEtMTE5fEhucm5wbHxCcmQxfEF2ZW58RG5haDdhfEFDMTQ5MDkwLjF8RnBnc3xEZHg1MHxIbWNlc3xTZWMyNGN8RWNpMXxQYWlwMnxUaG9jMXxNeWxrfEtsaGwyfFpjM2g2fERuYXNlMmF8RmFoZDF8QWNiZDV8TnVkY2QyfFJtZG4xfFdkcjgyfE15bzEwfEZieHc5fFNsYzE3YTV8U2hhcnBpbnxDYWJpbjF8VHhuZGMxNXxBVTAyMjI1MnxTcmVrMXxDb3EzfG5jUk5BLWludGVyLWNocjE0LTExOTg4fElyZjN8WmNjaGM2fFNsYzI1YTEzfE1ycGwxOHxQZGlhNXxMZGxyfFRtZWQ5fEtsaGRjOGJ8UmNidGIxfEFkYXAyfEIybXxLbGhsMjR8TGJwfG5jUk5BLWFzLWNocjgtNzMzN3xuY1JOQS1hcy1jaHIxMC04OTUzfFNmM2I2fFNsYzMzYTF8THJwcHJjfFNyc2Y0fE1pbmR5M3xHc3RwM3xWcHMzN2F8RG5hamI0fG5jUk5BLWFzLWNocjE5LTE1MDY1fE1hc3QzfFNrcDFhfFpidGIxfE5kdWZhMTB8UHNpcDF8bmNSTkEtYXMtY2hyOC03MzY3fG5jUk5BLWludGVyLWNocjExLTk5MjN8QnRiZDF8U2xjMzhhMTF8U2VtYTZifG5jUk5BLWludGVyLWNocjUtNDMyMXxIc2YyfFpteW5kOHxMdXpwMXxQZGdmYXxuY1JOQS1pbnRlci1jaHI0LTMwMzh8VWJlMmJ8TGFtcDJ8QXRsM3xQcmR4NnxFaTI0fENlY3IyfFpjM2gxNHxDZGM0MHxDY2RjMTI1fEdzcHQyfEdwZDF8bmNSTkEtYXMtY2hyNS00Mzg0fG10LU5kMnxDYXNjM3xFbGwyfFJwbDM2fFNoM3JmMXxMcnJjMjl8RWRmMXxuY1JOQS1hcy1jaHIxMC04OTM5fEE0MzAwMzNLMDRSaWt8THJpZzF8Q3RzaHxuY1JOQS1hcy1jaHIxMS0xMDIyMnxTbWFwMXxOdGFuMXxDbGludDF8QXR4bjF8VGhhcDN8SXJhazR8VWd0M2ExfEhucm5waDN8UGphMXxCdGcxfFRnZmJyMnxDb3gxMXxUbWVtMjl8QnJhcHxHZGFwMnxSbmYyMTR8RjEzYnxuY1JOQS1hcy1jaHIxNi0xMzE0NnxUcHN0MnxQaWszYzJhfG5jUk5BLWludGVyLWNocjE5LTE0OTY0fEJjZGluM2R8QWhuYWt8U21pbTR8Q29tbWQ3fFRvcDJifG5jUk5BLWludGVyLWNocjExLTEwMjE1fG5jUk5BLWludGVyLWNocjEzLTExMzc0fG5jUk5BLWFzLWNocjE2LTEzMTUzfG5jUk5BLWFzLWNocjgtNzA5NnxuY1JOQS1hcy1jaHI0LTM4MjB8S3hkMXxNenQxfFRtZW0xNDN8RWlmNGVicDJ8TWJ0ZDF8UmJtNDd8Tmlwc25hcDNifG5jUk5BLWFzLWNocjEwLTkxMzB8bmNSTkEtaW50ZXItY2hyMTctMTQxNzd8RGh4NDB8QWthcDh8UGxzMXxTcnNmMTF8UGV4MTN8Q2xkbjJ8T3NicGwxYXxDZmFwMjB8TXJwbDUyfG5jUk5BLWFzLWNocjctNjMwMHxaZnA5MzN8MTExMDA1OUUyNFJpa3xUYWIyfEdsZTF8WWFmMnxLbW98TGNwMXxHbmwyfG5jUk5BLWFzLWNocjE1LTEyNDY3fExzbTZ8RXBzMTV8bmNSTkEtaW50ZXItY2hyMTctMTQxODd8bmNSTkEtYXMtY2hyMTktMTQ5MDR8SWdobWJwMnxuY1JOQS1hcy1jaHIyLTE1NDJ8QXRhdDF8TXRtcjF8bmNSTkEtYXMtY2hyOC03NDEwfERlcGRjN3xDY3N8U2N5bDJ8bXQtQ28yfExhcnN8UHRzfFJleG8xfFRzc2M0fFVzcDUzfG5jUk5BLWFzLWNocjQtMzU1OXxHZm9kMXxOYXJzMnxuY1JOQS1pbnRlci1jaHI0LTM1Nzl8RWlmM2oxfG5jUk5BLWFzLWNocjEtNzk1fG5jUk5BLWludGVyLWNocjgtNjk4MXxQZGU0YXxuY1JOQS1pbnRlci1jaHIzLTI4ODF8U2xjMzlhMTB8RTAzMDAzMEkwNlJpa3xDYW1rMXxQcHAycjFifEFtb3R8bmNSTkEtaW50ZXItY2hyMTctMTQwMTB8Q250bjV8VWJlMmh8RmJ4bzM2fFdicDFsfG5jUk5BLWFzLWNocjItMjEwOHxaYnRiNDR8SGVjdGQyfE1ncm4xIikseCA9IHJvd25hbWVzKEcxNzIudW1pcyksIHZhbHVlID0gRkFMU0UpCgpgYGAKCgoKCmBgYHtyfQpBbGwuc2V4LmluZGV4IDwtIGMoeDEseDIseDMseDQseDUpCkFsbC5zZXguVENQTy5pbmRleCA8LSBjKHgxLHgyLHgzLHg0LHg1LCBUQ1BPMSwgVENQTzIsIFRDUE8zLFRDUE80LCBUQ1BPNSwgVENQTzYsVENQTzYuMSwgVENQTzYuMiwgVENQTzcsVENQTzcuMSwgVENQTzcuMiwgVENQTzgsVENQTzguMSxUQ1BPOC4yLFRDUE85LCBUQ1BPMTApCgpERS5HMTcyTTFNMy4wLjEgPC0gYyhERTEuTTFNMy4wLjEsREUyLk0xTTMuMC4xLERFMy5NMU0zLjAuMSxERTQuTTFNMy4wLjEsREU1Lk0xTTMuMC4xLERFNi5NMU0zLjAuMSxERTcuTTFNMy4wLjEsREU4Lk0xTTMuMC4xLERFOS5NMU0zLjAuMSxERTEwLk0xTTMuMC4xKQpBbGwuc2V4LmluZGV4LmJhdGNoIDwtIGMoeDEseDIseDMseDQseDUsREUxLk0xTTMuMC4xLERFMi5NMU0zLjAuMSxERTMuTTFNMy4wLjEsREU0Lk0xTTMuMC4xLERFNS5NMU0zLjAuMSxERTYuTTFNMy4wLjEpCkcxNzIudW1pcy5zZXggPC0gRzE3Mi51bWlzWy1BbGwuc2V4LmluZGV4LCBdCkcxNzIudW1pcy5zZXguYmF0Y2ggPC0gRzE3Mi51bWlzWy1BbGwuc2V4LmluZGV4LmJhdGNoLCBdCgoKREUuRzE3Mk0yTTQuMC4xIDwtIGMoREUxLk0yTTQuMC4xLERFMi5NMk00LjAuMSxERTMuTTJNNC4wLjEpCkFsbC5zZXguVENQTy5pbmRleC5iYXRjaCA8LSBjKEFsbC5zZXguVENQTy5pbmRleCAsREUuRzE3Mk0yTTQuMC4xKSAKRzE3Mi51bWlzLnNleC5UQ1BPLmJhdGNoIDwtIEcxNzIudW1pc1stQWxsLnNleC5UQ1BPLmluZGV4LmJhdGNoLCBdCgpHMTcyLnVtaXMuc2V4LlRDUE8gPC0gRzE3Mi51bWlzWy1BbGwuc2V4LlRDUE8uaW5kZXgsIF0KCiMgU2V0dXAgU2V1cmF0IG9iamVjdAojRzE3Mi5oYXNodGFnIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBHMTcyLnVtaXMuc2V4KQoKRzE3Mi5oYXNodGFnIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBHMTcyLnVtaXMpCkcxNzIuaGFzaHRhZyA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBHMTcyLmhhc2h0YWcsICBtZXRhZGF0YSA9IGxuY1JOQSwgY29sLm5hbWUgPSAibmxuY1JOQSIpIAojRzE3Mi5oYXNodGFnIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IEcxNzIuaGFzaHRhZywgbWV0YS5kYXRhMC41KSAKCiAKRzE3Mi5oYXNodGFnLnNleC5iYXRjaCA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gRzE3Mi51bWlzLnNleC5iYXRjaCkKCgoKRzE3Mi5oYXNodGFnLlRDUE8gPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KGNvdW50cyA9IEcxNzIudW1pcy5zZXguVENQTykKRzE3Mi5oYXNodGFnLnNleC5UQ1BPLmJhdGNoIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBHMTcyLnVtaXMuc2V4LlRDUE8uYmF0Y2gpCgoKIyBOb3JtYWxpemUgUk5BIGRhdGEgd2l0aCBsb2cgbm9ybWFsaXphdGlvbgoKI0cxNzIuaGFzaHRhZyA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBHMTcyLmhhc2h0YWcpIApHMTcyLmhhc2h0YWcgPC0gTm9ybWFsaXplRGF0YShHMTcyLmhhc2h0YWcpCiMgRmluZCBhbmQgc2NhbGUgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5oYXNodGFnIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuaGFzaHRhZywgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojRzE3Mi5oYXNodGFnIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuaGFzaHRhZywgc2VsZWN0aW9uLm1ldGhvZCA9ICJtZWFuLnZhci5wbG90IikKRzE3Mi5oYXNodGFnIDwtIFNjYWxlRGF0YShHMTcyLmhhc2h0YWcsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLmhhc2h0YWcpKQpHMTcyLmhhc2h0YWcgPC0gUnVuUENBKEcxNzIuaGFzaHRhZyxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLmhhc2h0YWcpKQpHMTcyLmhhc2h0YWcgPC0gUnVuVU1BUChHMTcyLmhhc2h0YWcsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5oYXNodGFnIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5oYXNodGFnLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuaGFzaHRhZyA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5oYXNodGFnLCByZXNvbHV0aW9uID0gMC4yNSkgICAKRzE3Mi5oYXNodGFnLnAxPC0gVU1BUFBsb3QoRzE3Mi5oYXNodGFnLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5oYXNodGFnLnAxCkRlZmF1bHRBc3NheShHMTcyLmhhc2h0YWcpIDwtICJSTkEiCkcxNzIuaGFzaHRhZyA8LSBOb3JtYWxpemVEYXRhKEcxNzIuaGFzaHRhZywgdmVyYm9zZSA9IFRSVUUpCmQxIDwtIERvdFBsb3QoRzE3Mi5oYXNodGFnLCBmZWF0dXJlcyA9IEFsbF8pK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTEucDEsZDEpCkZlYXR1cmVQbG90KEcxNzIuaGFzaHRhZywgZmVhdHVyZXMgPSAiQ3lwMmM1NSIpCkZlYXR1cmVQbG90KEcxNzIuaGFzaHRhZywgZmVhdHVyZXMgPSAibmNSTkEtaW50ZXItY2hyWC0xNTM5NCIpCgojIEFkZCBIVE8gZGF0YSBhcyBhIG5ldyBhc3NheSBpbmRlcGVuZGVudCBmcm9tIFJOQQojRzE3Mi5oYXNodGFnW1siSFRPIl1dIDwtIENyZWF0ZUFzc2F5T2JqZWN0KGNvdW50cyA9IEcxNzIuaHRvcykKRzE3Mi5oYXNodGFnW1siSFRPIl1dIDwtIENyZWF0ZUFzc2F5T2JqZWN0KGNvdW50cyA9IEcxNzIuWGlzdC5DaHJZKQoKIyBOb3JtYWxpemUgSFRPIGRhdGEsIGhlcmUgd2UgdXNlIGNlbnRlcmVkIGxvZy1yYXRpbyAoQ0xSKSB0cmFuc2Zvcm1hdGlvbgpHMTcyLmhhc2h0YWcgPC0gTm9ybWFsaXplRGF0YShHMTcyLmhhc2h0YWcsIGFzc2F5ID0gIkhUTyIsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkNMUiIpCgojIElmIHlvdSBoYXZlIGEgdmVyeSBsYXJnZSBkYXRhc2V0IHdlIHN1Z2dlc3QgdXNpbmcga19mdW5jdGlvbiA9ICdjbGFyYScuIFRoaXMgaXMgYSBrLW1lZG9pZAojIGNsdXN0ZXJpbmcgZnVuY3Rpb24gZm9yIGxhcmdlIGFwcGxpY2F0aW9ucyBZb3UgY2FuIGFsc28gcGxheSB3aXRoIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAoc2VlCiMgZG9jdW1lbnRhdGlvbiBmb3IgSFRPRGVtdXgoKSkgdG8gYWRqdXN0IHRoZSB0aHJlc2hvbGQgZm9yIGNsYXNzaWZpY2F0aW9uIEhlcmUgd2UgYXJlIHVzaW5nIHRoZQojIGRlZmF1bHQgc2V0dGluZ3MKRzE3Mi5oYXNodGFnIDwtIEhUT0RlbXV4KEcxNzIuaGFzaHRhZywgYXNzYXkgPSAiSFRPIiwgcG9zaXRpdmUucXVhbnRpbGUgPSAwLjk5LCBrZnVuYyA9ICdjbGFyYScpCiMgR2xvYmFsIGNsYXNzaWZpY2F0aW9uIHJlc3VsdHMKdGFibGUoRzE3Mi5oYXNodGFnJEhUT19jbGFzc2lmaWNhdGlvbi5nbG9iYWwpCnRhYmxlKEcxNzIuaGFzaHRhZyRoYXNoLklEKQoKIyBHcm91cCBjZWxscyBiYXNlZCBvbiB0aGUgbWF4IEhUTyBzaWduYWwKSWRlbnRzKEcxNzIuaGFzaHRhZykgPC0gImhhc2guSUQiClJpZGdlUGxvdChHMTcyLmhhc2h0YWcsIGFzc2F5ID0gIkhUTyIsIGZlYXR1cmVzID0gcm93bmFtZXMoRzE3Mi5oYXNodGFnW1siSFRPIl1dKVsxOjRdLCBuY29sID0gMiwgbnJvdz0yKQpHMTcyLmhhc2h0YWckSFRPX2NsYXNzaWZpY2F0aW9uIDwtIEcxNzIuaGFzaHRhZyRoYXNoLklECiNJZGVudHMoRzE3Mi5oYXNodGFnKSA8LSAiSFRPX2NsYXNzaWZpY2F0aW9uLmdsb2JhbCIKCkcxNzIuaGFzaHRhZy5zdWJzZXQgPC0gRzE3Mi5oYXNodGFnCiMgRmlyc3QsIHdlIHdpbGwgcmVtb3ZlIG5lZ2F0aXZlIGNlbGxzIGZyb20gdGhlIG9iamVjdApHMTcyLmhhc2h0YWcuc3Vic2V0IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGlkZW50cyA9YygiTmVnYXRpdmUiLCJEb3VibGV0IiksIGludmVydCA9IFRSVUUpCgojIyBGZWF0dXJlIHNjYXR0ZXJwbG90IGZvciBoYXN0YWdzIElEcyAjIyMjIyMjIwpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMS1BVEdBVEdBQUNBR0NDQUciLCBmZWF0dXJlMiA9ICJNMi1UR0FDR0NDR1RUR1RUR1QiKQpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMS1BVEdBVEdBQUNBR0NDQUciLCBmZWF0dXJlMiA9ICJNMy1HQ0NUQUdUQVRHQVRDQ0EiKQpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMS1BVEdBVEdBQUNBR0NDQUciLCBmZWF0dXJlMiA9ICJNNC1BR1RDQUNBR1RBVFRDQ0EiKQpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMi1UR0FDR0NDR1RUR1RUR1QiLCBmZWF0dXJlMiA9ICJNMy1HQ0NUQUdUQVRHQVRDQ0EiKQpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMi1UR0FDR0NDR1RUR1RUR1QiLCBmZWF0dXJlMiA9ICJNNC1BR1RDQUNBR1RBVFRDQ0EiKQpGZWF0dXJlU2NhdHRlcihHMTcyLmhhc2h0YWcuc3Vic2V0LCBmZWF0dXJlMSA9ICJNMy1HQ0NUQUdUQVRHQVRDQ0EiLCBmZWF0dXJlMiA9ICJNNC1BR1RDQUNBR1RBVFRDQ0EiKQoKCiMgQ2FsY3VsYXRlIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIEhUTwpodG8uZGlzdC5tdHggPC0gYXMubWF0cml4KGRpc3QodChHZXRBc3NheURhdGEob2JqZWN0ID0gRzE3Mi5oYXNodGFnLnN1YnNldCwgYXNzYXkgPSAiSFRPIikpKSkKCgpHMTcyLmhhc2h0YWcuc3Vic2V0IDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5oYXNodGFnLnN1YnNldCkKIyBGaW5kIGFuZCBzY2FsZSB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLmhhc2h0YWcuc3Vic2V0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuaGFzaHRhZy5zdWJzZXQsIHNlbGVjdGlvbi5tZXRob2QgPSAibWVhbi52YXIucGxvdCIpCkcxNzIuaGFzaHRhZy5zdWJzZXQgPC0gU2NhbGVEYXRhKEcxNzIuaGFzaHRhZy5zdWJzZXQsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLmhhc2h0YWcuc3Vic2V0KSkKRzE3Mi5oYXNodGFnLnN1YnNldCA8LSBSdW5QQ0EoRzE3Mi5oYXNodGFnLnN1YnNldCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLmhhc2h0YWcuc3Vic2V0KSkKCiMgQ2FsY3VsYXRlIHRTTkUgZW1iZWRkaW5ncyB3aXRoIGEgZGlzdGFuY2UgbWF0cml4CkcxNzIuaGFzaHRhZy5zdWJzZXQgPC0gUnVuVFNORShHMTcyLmhhc2h0YWcuc3Vic2V0LCBkaXN0YW5jZS5tYXRyaXggPSBodG8uZGlzdC5tdHgsIHBlcnBsZXhpdHkgPSAxMDApCkRpbVBsb3QoRzE3Mi5oYXNodGFnLnN1YnNldCkKSFRPSGVhdG1hcChHMTcyLmhhc2h0YWcsIGFzc2F5ID0gIkhUTyIsIG5jZWxscyA9IDMwMzApCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVzY3VlIGRvdWJsZXRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpHMTcyLmRvdWJsZXQgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgaWRlbnRzID0gIk5lZ2F0aXZlIikKRzE3Mi5kb3VibGV0LnJlc2N1ZSA8LSBIVE9EZW11eChHMTcyLmRvdWJsZXQsIGFzc2F5ID0gIkhUTyIsIHBvc2l0aXZlLnF1YW50aWxlID0gMC45OSwga2Z1bmMgPSAnY2xhcmEnKQpJZGVudHMoRzE3Mi5kb3VibGV0LnJlc2N1ZSkgPC0gImhhc2guSUQiClJpZGdlUGxvdChHMTcyLmRvdWJsZXQucmVzY3VlLCBhc3NheSA9ICJIVE8iLCBmZWF0dXJlcyA9IHJvd25hbWVzKEcxNzIuZG91YmxldC5yZXNjdWVbWyJIVE8iXV0pWzE6NF0sIG5jb2wgPSAyLCBucm93PTIpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgojIEV4dHJhY3QgdGhlIHNpbmdsZXRzIE0xICMjIyMjIyMjIyMjIyMzCkcxNzIuTTEgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZy5zdWJzZXQsIGlkZW50cyA9ICJNMS1BVEdBVEdBQUNBR0NDQUciLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMSA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLnN1YnNldCwgaWRlbnRzID0gIk0xLUFUR0FUR0FBQ0FHQ0NBRyIpCgojRzE3Mi5NMSA8LSBHMTcyLmhhc2h0YWcKRzE3Mi5NMSRzdGltICA8LSAiRzE3Mk0xIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMSkgPC0gIlJOQSIKRzE3Mi5NMSA8LSBTQ1RyYW5zZm9ybShHMTcyLk0xLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTEgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTEgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMSA8LSBTY2FsZURhdGEoRzE3Mi5NMSwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEpKQojIFJ1biBQQ0EKRzE3Mi5NMSA8LSBSdW5QQ0EoRzE3Mi5NMSxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMSA8LSBSdW5VTUFQKEcxNzIuTTEsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMSA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTEsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMSA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMSwgcmVzb2x1dGlvbiA9IDAuNSkgICAKRzE3Mi5NMS5wMTwtIFVNQVBQbG90KEcxNzIuTTEsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk0xLnAxCgoKRGVmYXVsdEFzc2F5KEcxNzIuTTEpIDwtICJSTkEiCkcxNzIuTTEgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xLCB2ZXJib3NlID0gVFJVRSkKZDEgPC0gRG90UGxvdChHMTcyLk0xLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMS5wMSxkMSkKCgogZm9yKGkgaW4gMDoobGVuZ3RoKGxldmVscyhHMTcyLk0xQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpKS0xKSkKIHsKIGxhYmVsIDwtIHBhc3RlKCJwIiwgaSwgc2VwPSIiKSAKIGFzc2lnbihsYWJlbCwgc3Vic2V0KEcxNzIuTTEsIGlkZW50cyA9IGkpKX0KI2xhYmVsMSA8LSBwYXN0ZSgiZGYiLCBpLCBzZXA9IiIpIAojI3Bhc3RlMCgicCIsaSwiQGFzc2F5cyRSTkFAY291bnRzIikKIyBhc3NpZ24obGFiZWwxLHNwbGl0LmRlZmF1bHQoKGFzLmRhdGEuZnJhbWUoZXZhbChwYXJzZSh0ZXh0PShwYXN0ZTAoKGFzLm5hbWUobGFiZWwpKSwiQGFzc2F5cyRSTkFAY291bnRzIikpKSkpKSwwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShlIHZhbChwYXJzZSh0ZXh0PShwYXN0ZTAoKGFzLm5hbWUobGFiZWwpKSwiQGFzc2F5cyRSTkFAY291bnRzIikpKSkpLTEpJS8lNSksIHJvd1N1bXMpKQojIAojIGNvbG5hbWVzKGFzLm5hbWUobGFiZWwxKSkgPC0gcGFzdGUoIkMiLGksIGNvbG5hbWVzKGFzLm5hbWUobGFiZWwxKSksIHNlcCA9ICJfIikgfQoKbXlkZjAgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShwMEBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHAwQGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhteWRmMCkgPC0gcGFzdGUoIkMwIiwgY29sbmFtZXMobXlkZjApLCBzZXAgPSAiXyIpCgpteWRmMSA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHAxQGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocDFAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKG15ZGYxKSA8LSBwYXN0ZSgiQzEiLCBjb2xuYW1lcyhteWRmMSksIHNlcCA9ICJfIikKCm15ZGYyIDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocDJAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShwMkBhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMobXlkZjIpIDwtIHBhc3RlKCJDMiIsIGNvbG5hbWVzKG15ZGYyKSwgc2VwID0gIl8iKQoKbXlkZjMgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShwM0Bhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHAzQGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhteWRmMykgPC0gcGFzdGUoIkMzIiwgY29sbmFtZXMobXlkZjMpLCBzZXAgPSAiXyIpCgpteWRmNCA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHA0QGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocDRAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKG15ZGY0KSA8LSBwYXN0ZSgiQzQiLCBjb2xuYW1lcyhteWRmNCksIHNlcCA9ICJfIikKCm15ZGY1IDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocDVAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShwNUBhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMobXlkZjUpIDwtIHBhc3RlKCJDNSIsIGNvbG5hbWVzKG15ZGY1KSwgc2VwID0gIl8iKQoKbXlkZjYgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShwNkBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHA2QGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhteWRmNikgPC0gcGFzdGUoIkM2IiwgY29sbmFtZXMobXlkZjYpLCBzZXAgPSAiXyIpCgpteWRmNyA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHA3QGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocDdAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKG15ZGY3KSA8LSBwYXN0ZSgiQzciLCBjb2xuYW1lcyhteWRmNyksIHNlcCA9ICJfIikKCm15ZGY4IDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocDhAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShwOEBhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMobXlkZjgpIDwtIHBhc3RlKCJDOCIsIGNvbG5hbWVzKG15ZGY4KSwgc2VwID0gIl8iKQoKbXlkZjkgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShwOUBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHA5QGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhteWRmOSkgPC0gcGFzdGUoIkM5IiwgY29sbmFtZXMobXlkZjkpLCBzZXAgPSAiXyIpCgptZXJnZV9kZiA8LSBjYmluZChteWRmMCxteWRmMSxteWRmMixteWRmMyxteWRmNCxteWRmNSxteWRmNixteWRmNyxteWRmOCxteWRmOSkKCgpHMTcyLk0xLm1lcmdlIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBtZXJnZV9kZikKRGVmYXVsdEFzc2F5KEcxNzIuTTEpIDwtICJSTkEiCkcxNzIuTTEubWVyZ2UgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMS5tZXJnZSx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk0xLm1lcmdlIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMS5tZXJnZSwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0xLm1lcmdlIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEubWVyZ2UsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTEubWVyZ2UgPC0gU2NhbGVEYXRhKEcxNzIuTTEubWVyZ2UsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xLm1lcmdlKSkKIyBSdW4gUENBCkcxNzIuTTEubWVyZ2UgPC0gUnVuUENBKEcxNzIuTTEubWVyZ2UsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMS5tZXJnZSkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTEubWVyZ2UgPC0gUnVuVU1BUChHMTcyLk0xLm1lcmdlLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTEubWVyZ2UgPC0gRmluZE5laWdoYm9ycyhHMTcyLk0xLm1lcmdlLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTEubWVyZ2UgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTEubWVyZ2UsIHJlc29sdXRpb24gPSAwLjUgKSAgIApHMTcyLk0xLnAxLm1lcmdlPC0gVU1BUFBsb3QoRzE3Mi5NMS5tZXJnZSwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTEucDEubWVyZ2UKCgpEZWZhdWx0QXNzYXkoRzE3Mi5NMS5tZXJnZSkgPC0gIlJOQSIKRzE3Mi5NMS5tZXJnZSA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEubWVyZ2UsIHZlcmJvc2UgPSBUUlVFKQpkMSA8LSBEb3RQbG90KEcxNzIuTTEubWVyZ2UsIGZlYXR1cmVzID0gYWxsX2dlbmVzLCBjb2xzPWMoJ3doaXRlJywnYmx1ZScpKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk0xLnAxLm1lcmdlLGQxKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFeHRyYWN0IHRoZSBzaW5nbGV0IGZvciBNMiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKRzE3Mi5NMiA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBpZGVudHMgPSAiTTItVEdBQ0dDQ0dUVEdUVEdUIiwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCkcxNzIuTTIkc3RpbSAgPC0gIkcxNzJNMiIKRGVmYXVsdEFzc2F5KEcxNzIuTTIpIDwtICJSTkEiCkcxNzIuTTIgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMix2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk0yIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMiwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0yIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTIsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTIgPC0gU2NhbGVEYXRhKEcxNzIuTTIsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0yKSkKIyBSdW4gUENBCkcxNzIuTTIgPC0gUnVuUENBKEcxNzIuTTIsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMikpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTIgPC0gUnVuVU1BUChHMTcyLk0yLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTIgPC0gRmluZE5laWdoYm9ycyhHMTcyLk0yLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTIgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTIsIHJlc29sdXRpb24gPSAwLjUgKSAgIApHMTcyLk0yLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTIucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTIpIDwtICJSTkEiCkcxNzIuTTIgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk0yLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMi5wMSxkMikKCmZvcihpIGluIDA6KGxlbmd0aChsZXZlbHMoRzE3Mi5NMkBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSktMSkpCiB7CiBsYWJlbCA8LSBwYXN0ZSgicSIsIGksIHNlcD0iIikgCiBhc3NpZ24obGFiZWwsIHN1YnNldChHMTcyLk0yLCBpZGVudHMgPSBpKSl9CiMgbGFiZWwxIDwtIHBhc3RlKCJkZiIsIGksIHNlcD0iIikgCiMKZGZxMCA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHEwQGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocTBAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKGRmcTApIDwtIHBhc3RlKCJRMCIsIGNvbG5hbWVzKGRmcTApLCBzZXAgPSAiXyIpCgpkZnExIDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocTFAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShxMUBhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMoZGZxMSkgPC0gcGFzdGUoIlExIiwgY29sbmFtZXMoZGZxMSksIHNlcCA9ICJfIikKCmRmcTIgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShxMkBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHEyQGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhkZnEyKSA8LSBwYXN0ZSgiUTIiLCBjb2xuYW1lcyhkZnEyKSwgc2VwID0gIl8iKQoKZGZxMyA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHEzQGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocTNAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKGRmcTMpIDwtIHBhc3RlKCJRMyIsIGNvbG5hbWVzKGRmcTMpLCBzZXAgPSAiXyIpCgpkZnE0IDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocTRAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShxNEBhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMoZGZxNCkgPC0gcGFzdGUoIlE0IiwgY29sbmFtZXMoZGZxNCksIHNlcCA9ICJfIikKCmRmcTUgPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShxNUBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHE1QGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhkZnE1KSA8LSBwYXN0ZSgiUTUiLCBjb2xuYW1lcyhkZnE1KSwgc2VwID0gIl8iKQoKZGZxNiA8LSBzYXBwbHkoc3BsaXQuZGVmYXVsdChhcy5kYXRhLmZyYW1lKHE2QGFzc2F5cyRSTkFAY291bnRzKSwgMDoobGVuZ3RoKGFzLmRhdGEuZnJhbWUocTZAYXNzYXlzJFJOQUBjb3VudHMpKS0xKSAlLyUgNSksIHJvd1N1bXMpCmNvbG5hbWVzKGRmcTYpIDwtIHBhc3RlKCJRNiIsIGNvbG5hbWVzKGRmcTYpLCBzZXAgPSAiXyIpCgpkZnE3IDwtIHNhcHBseShzcGxpdC5kZWZhdWx0KGFzLmRhdGEuZnJhbWUocTdAYXNzYXlzJFJOQUBjb3VudHMpLCAwOihsZW5ndGgoYXMuZGF0YS5mcmFtZShxN0Bhc3NheXMkUk5BQGNvdW50cykpLTEpICUvJSA1KSwgcm93U3VtcykKY29sbmFtZXMoZGZxNykgPC0gcGFzdGUoIlE3IiwgY29sbmFtZXMoZGZxNyksIHNlcCA9ICJfIikKCmRmcTggPC0gc2FwcGx5KHNwbGl0LmRlZmF1bHQoYXMuZGF0YS5mcmFtZShxOEBhc3NheXMkUk5BQGNvdW50cyksIDA6KGxlbmd0aChhcy5kYXRhLmZyYW1lKHE4QGFzc2F5cyRSTkFAY291bnRzKSktMSkgJS8lIDUpLCByb3dTdW1zKQpjb2xuYW1lcyhkZnE4KSA8LSBwYXN0ZSgiQzgiLCBjb2xuYW1lcyhkZnE4KSwgc2VwID0gIl8iKQoKCm1lcmdlX2RmMiA8LSBjYmluZChkZnEwLGRmcTEsZGZxMixkZnEzLGRmcTQsZGZxNSxkZnE2LGRmcTcsZGZxOCkKRzE3Mi5NMi5tZXJnZSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gbWVyZ2VfZGYyKQpEZWZhdWx0QXNzYXkoRzE3Mi5NMikgPC0gIlJOQSIKRzE3Mi5NMi5tZXJnZSA8LSBTQ1RyYW5zZm9ybShHMTcyLk0yLm1lcmdlLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTIubWVyZ2UgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLm1lcmdlLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTIubWVyZ2UgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMi5tZXJnZSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMi5tZXJnZSA8LSBTY2FsZURhdGEoRzE3Mi5NMi5tZXJnZSwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTIubWVyZ2UpKQojIFJ1biBQQ0EKRzE3Mi5NMi5tZXJnZSA8LSBSdW5QQ0EoRzE3Mi5NMi5tZXJnZSxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0yLm1lcmdlKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMi5tZXJnZSA8LSBSdW5VTUFQKEcxNzIuTTIubWVyZ2UsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMi5tZXJnZSA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTIubWVyZ2UsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMi5tZXJnZSA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMi5tZXJnZSwgcmVzb2x1dGlvbiA9IDAuNSApICAgCkcxNzIuTTIucDEubWVyZ2U8LSBVTUFQUGxvdChHMTcyLk0yLm1lcmdlLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMi5wMS5tZXJnZQoKRGVmYXVsdEFzc2F5KEcxNzIuTTIubWVyZ2UpIDwtICJSTkEiCkcxNzIuTTIubWVyZ2UgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLm1lcmdlLCB2ZXJib3NlID0gVFJVRSkKZDEgPC0gRG90UGxvdChHMTcyLk0yLm1lcmdlLCBmZWF0dXJlcyA9IGFsbF9nZW5lcywgY29scz1jKCd3aGl0ZScsJ2JsdWUnKSkrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMi5wMS5tZXJnZSxkMSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEV4dHJhY3QgdGhlIHNpbmdsZXQgZm9yIE0zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKRzE3Mi5NMyA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBpZGVudHMgPSAiTTMtR0NDVEFHVEFUR0FUQ0NBIiwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCkRlZmF1bHRBc3NheShHMTcyLk0zKSA8LSAiUk5BIgpHMTcyLk0zIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTMsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NMyA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMyA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0zLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0zIDwtIFNjYWxlRGF0YShHMTcyLk0zLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMykpCiMgUnVuIFBDQQpHMTcyLk0zIDwtIFJ1blBDQShHMTcyLk0zLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTMpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0zIDwtIFJ1blVNQVAoRzE3Mi5NMywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1KQpHMTcyLk0zIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1KQpHMTcyLk0zIDwtIEZpbmRDbHVzdGVycyhHMTcyLk0zLCByZXNvbHV0aW9uID0gMC41ICkgICAKRzE3Mi5NMy5wMTwtIFVNQVBQbG90KEcxNzIuTTMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk0zLnAxCkRlZmF1bHRBc3NheShHMTcyLk0zKSA8LSAiUk5BIgpHMTcyLk0zIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMywgdmVyYm9zZSA9IFRSVUUpCmQzIDwtIERvdFBsb3QoRzE3Mi5NMywgZmVhdHVyZXMgPSBhbGxfZ2VuZXMpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTMucDEsZDMpCgoKCgojIyMjIyBFeHRyYWN0IHRoZSBzaW5nbGV0IGZvciBNNCAjIyMjIwpHMTcyLk00IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGlkZW50cyA9ICJNNC1BR1RDQUNBR1RBVFRDQ0EiLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRGVmYXVsdEFzc2F5KEcxNzIuTTQpIDwtICJSTkEiCkcxNzIuTTQgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NNCx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk00IDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk00IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTQsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTQgPC0gU2NhbGVEYXRhKEcxNzIuTTQsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk00KSkKIyBSdW4gUENBCkcxNzIuTTQgPC0gUnVuUENBKEcxNzIuTTQsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNCkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTQgPC0gUnVuVU1BUChHMTcyLk00LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTQgPC0gRmluZE5laWdoYm9ycyhHMTcyLk00LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTQgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTQsIHJlc29sdXRpb24gPSAwLjUgKSAgIApHMTcyLk00LnAxPC0gVU1BUFBsb3QoRzE3Mi5NNCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTQucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTQpIDwtICJSTkEiCkcxNzIuTTQgPC0gTm9ybWFsaXplRGF0YShHMTcyLk00LCB2ZXJib3NlID0gVFJVRSkKZDQgPC0gRG90UGxvdChHMTcyLk00LCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NNC5wMSxkNCkKCgojIyMjIyMjIyMjIyMjIyBDb21iaW5lZCAjIyMjIyMjIyMjIyMjIyMjIyMjIzMzCkcxNzIuTTUgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgaWRlbnRzID0gYygiTTEtQVRHQVRHQUFDQUdDQ0FHIiwiTTItVEdBQ0dDQ0dUVEdUVEdUIiwiTTMtR0NDVEFHVEFUR0FUQ0NBIiwiTTQtQUdUQ0FDQUdUQVRUQ0NBIiksIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpEZWZhdWx0QXNzYXkoRzE3Mi5NNSkgPC0gIlJOQSIKRzE3Mi5NNSA8LSBTQ1RyYW5zZm9ybShHMTcyLk01LHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTUgPC0gTm9ybWFsaXplRGF0YShHMTcyLk01LCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTUgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NNSA8LSBTY2FsZURhdGEoRzE3Mi5NNSwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTUpKQojIFJ1biBQQ0EKRzE3Mi5NNSA8LSBSdW5QQ0EoRzE3Mi5NNSxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk01KSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NNSA8LSBSdW5VTUFQKEcxNzIuTTUsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NNSA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTUsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NNSA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NNSwgcmVzb2x1dGlvbiA9IDAuNSApICAgCkcxNzIuTTUucDE8LSBVTUFQUGxvdChHMTcyLk01LCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NNS5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NNSkgPC0gIlJOQSIKRzE3Mi5NNSA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTUsIHZlcmJvc2UgPSBUUlVFKQpkNSA8LSBEb3RQbG90KEcxNzIuTTUsIGZlYXR1cmVzID0gYyhhbGxfZ2VuZXMsJ0N5cDJiMTAnLCdDeXAyZDknKSkrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NNS5wMSxkNSkKCgojIyMgY29udHJvbCAKRzE3Mi5NNiA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLnN1YnNldCwgaWRlbnRzID0gYygiTTEtQVRHQVRHQUFDQUdDQ0FHIiwiTTMtR0NDVEFHVEFUR0FUQ0NBIiksIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpEZWZhdWx0QXNzYXkoRzE3Mi5NNikgPC0gIlJOQSIKI0cxNzIuTTYgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NNix2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk02IDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNiwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk02IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTYsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTYgPC0gU2NhbGVEYXRhKEcxNzIuTTYsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk02KSkKIyBSdW4gUENBCkcxNzIuTTYgPC0gUnVuUENBKEcxNzIuTTYsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNikpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTYgPC0gUnVuVU1BUChHMTcyLk02LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTYgPC0gRmluZE5laWdoYm9ycyhHMTcyLk02LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTYgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTYsIHJlc29sdXRpb24gPSAwLjUgKSAgIApHMTcyLk02LnAxPC0gVU1BUFBsb3QoRzE3Mi5NNiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTYucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTYpIDwtICJSTkEiCkcxNzIuTTYgPC0gTm9ybWFsaXplRGF0YShHMTcyLk02LCB2ZXJib3NlID0gVFJVRSkKZDYgPC0gRG90UGxvdChHMTcyLk02LCBmZWF0dXJlcyA9IGMoYWxsX2dlbmVzLCdDeXAyYjEwJywnQ3lwMmQ5JykpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTYucDEsZDYpCgoKIyMjIyBUQ1BPIApHMTcyLk03IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGlkZW50cyA9IGMoIk0yLVRHQUNHQ0NHVFRHVFRHVCIsIk00LUFHVENBQ0FHVEFUVENDQSIpLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRGVmYXVsdEFzc2F5KEcxNzIuTTcpIDwtICJSTkEiCkcxNzIuTTcgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NNyx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk03IDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNywgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk03IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTcsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTcgPC0gU2NhbGVEYXRhKEcxNzIuTTcsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk03KSkKIyBSdW4gUENBCkcxNzIuTTcgPC0gUnVuUENBKEcxNzIuTTcsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNykpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTcgPC0gUnVuVU1BUChHMTcyLk03LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTcgPC0gRmluZE5laWdoYm9ycyhHMTcyLk03LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTcgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTcsIHJlc29sdXRpb24gPSAwLjUgKSAgIApHMTcyLk03LnAxPC0gVU1BUFBsb3QoRzE3Mi5NNywgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTcucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTcpIDwtICJSTkEiCkcxNzIuTTcgPC0gTm9ybWFsaXplRGF0YShHMTcyLk03LCB2ZXJib3NlID0gVFJVRSkKZDcgPC0gRG90UGxvdChHMTcyLk03LCBmZWF0dXJlcyA9IGMoYWxsX2dlbmVzLCdDeXAyYjEwJywnQ3lwMmQ5JykpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTcucDEsZDcsIG5yb3c9MikKCgpgYGAKCgpHMTcyIGNsYXNzaWZpZWQgIGNlbGxzIGFscmVhZHkgbGFiZWxsZWQgYnkgZGVtdXhFTSBvciBIVE9kZW11eCAoU2V1cmF0KSB0byBjYWxjdWxhdGUgVFBNCmBgYHtyfQoKRzE3Mi5NMS5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0xLmJvdGgpCkcxNzIuTTIuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCAgY2VsbHM9IGpvaW50LmJjcy5NMi5ib3RoKQpHMTcyLk0zLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgIGNlbGxzPSBqb2ludC5iY3MuTTMuYm90aCkKRzE3Mi5NNC5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk00LmJvdGgpCgpHMTcyLk0xLmRlbXV4RU0gPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgIGNlbGxzPSBqb2ludC5iY3MuTTEuZGVtdXhFTSkKRzE3Mi5NMi5kZW11eEVNIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0yLmRlbXV4RU0pCkcxNzIuTTMuZGVtdXhFTSA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCAgY2VsbHM9IGpvaW50LmJjcy5NNC5kZW11eEVNKQpHMTcyLk00LmRlbXV4RU0gPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgIGNlbGxzPSBqb2ludC5iY3MuTTQuZGVtdXhFTSkKCgpHMTcyLk0xLkhUT2RlbXV4IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0xLkhUT2RlbXV4KQpHMTcyLk0yLkhUT2RlbXV4IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0yLkhUT2RlbXV4KQpHMTcyLk0zLkhUT2RlbXV4IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0zLkhUT2RlbXV4KQpHMTcyLk00LkhUT2RlbXV4IDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk00LkhUT2RlbXV4KQoKCkcxNzIuTTEuYm90aCAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xLmJvdGgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCkcxNzIuTTIuYm90aCAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLmJvdGgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCkcxNzIuTTMuYm90aCAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0zLmJvdGgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCkcxNzIuTTQuYm90aCAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk00LmJvdGgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCgpHMTcyLk0xLmJvdGguYXZnICA8LSByb3dNZWFucyhhcy5tYXRyaXgoRzE3Mi5NMS5ib3RoQGFzc2F5cyRSTkFAZGF0YSkpCkcxNzIuTTIuYm90aC5hdmcgIDwtIHJvd01lYW5zKGFzLm1hdHJpeChHMTcyLk0yLmJvdGhAYXNzYXlzJFJOQUBkYXRhKSkKRzE3Mi5NMy5ib3RoLmF2ZyAgPC0gcm93TWVhbnMoYXMubWF0cml4KEcxNzIuTTMuYm90aEBhc3NheXMkUk5BQGRhdGEpKQpHMTcyLk00LmJvdGguYXZnICA8LSByb3dNZWFucyhhcy5tYXRyaXgoRzE3Mi5NNC5ib3RoQGFzc2F5cyRSTkFAZGF0YSkpCgoKRzE3Mi5NMS5kZW11eEVNICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuZGVtdXhFTSxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKRzE3Mi5NMi5kZW11eEVNICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTIuZGVtdXhFTSxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKRzE3Mi5NMy5kZW11eEVNICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMuZGVtdXhFTSxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKRzE3Mi5NNC5kZW11eEVNICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTQuZGVtdXhFTSxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKCkcxNzIuTTEuZGVtdXhFTS5hdmcgIDwtIHJvd01lYW5zKGFzLm1hdHJpeChHMTcyLk0xLmRlbXV4RU1AYXNzYXlzJFJOQUBkYXRhKSkKRzE3Mi5NMi5kZW11eEVNLmF2ZyAgPC0gcm93TWVhbnMoYXMubWF0cml4KEcxNzIuTTIuZGVtdXhFTUBhc3NheXMkUk5BQGRhdGEpKQpHMTcyLk0zLmRlbXV4RU0uYXZnICA8LSByb3dNZWFucyhhcy5tYXRyaXgoRzE3Mi5NMy5kZW11eEVNQGFzc2F5cyRSTkFAZGF0YSkpCkcxNzIuTTQuZGVtdXhFTS5hdmcgIDwtIHJvd01lYW5zKGFzLm1hdHJpeChHMTcyLk00LmRlbXV4RU1AYXNzYXlzJFJOQUBkYXRhKSkKCgpHMTcyLk0xLkhUT2RlbXV4ICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuSFRPZGVtdXgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCkcxNzIuTTIuSFRPZGVtdXggIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMi5IVE9kZW11eCxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKRzE3Mi5NMy5IVE9kZW11eCAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0zLkhUT2RlbXV4LGFzc2F5ID0gIlJOQSIsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlJDIiwgc2NhbGUuZmFjdG9yID0gMWU2KQpHMTcyLk00LkhUT2RlbXV4ICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTQuSFRPZGVtdXgsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCgpHMTcyLk0xLkhUT2RlbXV4LmF2ZyAgPC0gcm93TWVhbnMoYXMubWF0cml4KEcxNzIuTTEuSFRPZGVtdXhAYXNzYXlzJFJOQUBkYXRhKSkKRzE3Mi5NMi5IVE9kZW11eC5hdmcgIDwtIHJvd01lYW5zKGFzLm1hdHJpeChHMTcyLk0yLkhUT2RlbXV4QGFzc2F5cyRSTkFAZGF0YSkpCkcxNzIuTTMuSFRPZGVtdXguYXZnICA8LSByb3dNZWFucyhhcy5tYXRyaXgoRzE3Mi5NMy5IVE9kZW11eEBhc3NheXMkUk5BQGRhdGEpKQpHMTcyLk00LkhUT2RlbXV4LmF2ZyAgPC0gcm93TWVhbnMoYXMubWF0cml4KEcxNzIuTTQuSFRPZGVtdXhAYXNzYXlzJFJOQUBkYXRhKSkKCkcxNzIuTTEuVG9wIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsICBjZWxscz0gam9pbnQuYmNzLk0xLnRvcCkKRzE3Mi5NMi5Ub3AgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgIGNlbGxzPSBqb2ludC5iY3MuTTIudG9wKQoKRzE3Mi5NMS5Ub3AgIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMS5Ub3AsYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCkcxNzIuTTIuVG9wICA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTIuVG9wLGFzc2F5ID0gIlJOQSIsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlJDIiwgc2NhbGUuZmFjdG9yID0gMWU2KQoKRzE3Mi5NMS5ib3R0b20gPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgIGNlbGxzPSBqb2ludC5iY3MuTTEuYm90dG9tKQpHMTcyLk0yLmJvdHRvbSA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCAgY2VsbHM9IGpvaW50LmJjcy5NMi5ib3R0b20pCgpHMTcyLk0xLmJvdHRvbSAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xLmJvdHRvbSxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKRzE3Mi5NMi5ib3R0b20gIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMi5ib3R0b20sYXNzYXkgPSAiUk5BIiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCgpHMTcyX1RQTV9NMV9Ub3AgPC0gY2JpbmQoYXMubWF0cml4KEcxNzIuTTEuVG9wQGFzc2F5cyRSTkFAY291bnRzKSkgCkcxNzJfVFBNX00yX1RvcCA8LSBjYmluZChhcy5tYXRyaXgoRzE3Mi5NMi5Ub3BAYXNzYXlzJFJOQUBjb3VudHMpKSAKRzE3Ml9UUE1fTTFfYm90dG9tIDwtIGNiaW5kKGFzLm1hdHJpeChHMTcyLk0xLmJvdHRvbUBhc3NheXMkUk5BQGNvdW50cykpIApHMTcyX1RQTV9NMl9ib3R0b20gPC0gY2JpbmQoYXMubWF0cml4KEcxNzIuTTIuYm90dG9tQGFzc2F5cyRSTkFAY291bnRzKSkgCgoKRzE3Ml9jb3VudHNfTTFfVG9wIDwtIGNiaW5kKGFzLm1hdHJpeChHMTcyLk0xLlRvcEBhc3NheXMkUk5BQGNvdW50cykpIApHMTcyX2NvdW50c19NMl9Ub3AgPC0gY2JpbmQoYXMubWF0cml4KEcxNzIuTTIuVG9wQGFzc2F5cyRSTkFAY291bnRzKSkgCkcxNzJfY291bnRzX00xX2JvdHRvbSA8LSBjYmluZChhcy5tYXRyaXgoRzE3Mi5NMS5ib3R0b21AYXNzYXlzJFJOQUBjb3VudHMpKSAKRzE3Ml9jb3VudHNfTTJfYm90dG9tIDwtIGNiaW5kKGFzLm1hdHJpeChHMTcyLk0yLmJvdHRvbUBhc3NheXMkUk5BQGNvdW50cykpIAoKd3JpdGUudGFibGUoRzE3Ml9UUE1fTTFfVG9wLCAiZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9HMTcyX1RQTV9NMV9Ub3AiKQp3cml0ZS50YWJsZShHMTcyX1RQTV9NMl9Ub3AsICJkZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL0cxNzJfVFBNX00yX1RvcCIpCndyaXRlLnRhYmxlKEcxNzJfVFBNX00xX2JvdHRvbSwgImRlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvRzE3Ml9UUE1fTTFfYm90dG9tIikKd3JpdGUudGFibGUoRzE3Ml9UUE1fTTJfYm90dG9tLCAiZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9HMTcyX1RQTV9NMl9ib3R0b20iKQoKCndyaXRlLnRhYmxlKEcxNzJfY291bnRzX00xX1RvcCwgImRlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvRzE3Ml9jb3VudHNfTTFfVG9wIikKd3JpdGUudGFibGUoRzE3Ml9jb3VudHNfTTJfVG9wLCAiZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9HMTcyX2NvdW50c19NMl9Ub3AiKQp3cml0ZS50YWJsZShHMTcyX2NvdW50c19NMV9ib3R0b20sICJkZW11eEVNX0hUb2RlbXV4X2FuYWx5c2lzL0cxNzJfY291bnRzX00xX2JvdHRvbSIpCndyaXRlLnRhYmxlKEcxNzJfY291bnRzX00yX2JvdHRvbSwgImRlbXV4RU1fSFRvZGVtdXhfYW5hbHlzaXMvRzE3Ml9jb3VudHNfTTJfYm90dG9tIikKCgpjb21iaW5lZF9hdmdfcHJlbGFiZWxsZWQgPC0gY2JpbmQoRzE3Mi5NMS5ib3RoLmF2ZywgRzE3Mi5NMi5ib3RoLmF2ZyxHMTcyLk0zLmJvdGguYXZnLEcxNzIuTTQuYm90aC5hdmcsIEcxNzIuTTEuZGVtdXhFTS5hdmcsRzE3Mi5NMi5kZW11eEVNLmF2ZywgRzE3Mi5NMy5kZW11eEVNLmF2ZywgRzE3Mi5NNC5kZW11eEVNLmF2ZywgRzE3Mi5NMS5IVE9kZW11eC5hdmcsIEcxNzIuTTIuSFRPZGVtdXguYXZnLCBHMTcyLk0zLkhUT2RlbXV4LmF2ZywgRzE3Mi5NNC5IVE9kZW11eC5hdmcpIAoKd3JpdGUudGFibGUoY29tYmluZWRfYXZnX3ByZWxhYmVsbGVkLCAiZGVtdXhFTV9IVG9kZW11eF9hbmFseXNpcy9jb21iaW5lZF9hdmdUUE1fcHJlbGFiZWxsZWQiKQoKY29tYmluZWRfTTFfTTIgPC0gY2JpbmQoYXMubWF0cml4KEcxNzIuTTEuYm90aEBhc3NheXMkUk5BQGRhdGEpLCBhcy5tYXRyaXgoRzE3Mi5NMS5ib3RoQGFzc2F5cyRSTkFAZGF0YSkpIApgYGAKCgpgYGB7cn0KCkcxNzIuTTEuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0xLmJvdGgsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQojRzE3Mi5NMS5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcuc2V4LmJhdGNoLCBjZWxscz0gam9pbnQuYmNzLk0xLmJvdGgpCiNHMTcyLk0xLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMS5ib3RoKQpHMTcyLk0xLmJvdGgkc3RpbSAgPC0gIkcxNzJNMV9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMS5ib3RoKSA8LSAiUk5BIgpHMTcyLk0xLmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMS5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTEuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0xLmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMS5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0xLmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTEuYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0xLmJvdGggPC0gUnVuUENBKEcxNzIuTTEuYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0xLmJvdGggPC0gUnVuVU1BUChHMTcyLk0xLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMS5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMS5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTEuYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMS5ib3RoLCByZXNvbHV0aW9uID0gMC4yNSkgICAKRzE3Mi5NMS5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMS5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMS5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk0xLmJvdGgpIDwtICJSTkEiCkcxNzIuTTEuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NMS5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMS5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyBjbGVhbiBoZXBhdG9jeXRlcyAjIyMjIyMjIyMjIyMjIyMjIyMKCkcxNzIuTTEuY2xlYW4uYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0xLmNsZWFuLmJvdGgsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk0xLmNsZWFuLmJvdGgkc3RpbSAgPC0gIkcxNzJNMV9jbGVhbl9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMS5jbGVhbi5ib3RoKSA8LSAiUk5BIgpHMTcyLk0xLmNsZWFuLmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMS5jbGVhbi5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTEuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuY2xlYW4uYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0xLmNsZWFuLmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMS5jbGVhbi5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0xLmNsZWFuLmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTEuY2xlYW4uYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEuY2xlYW4uYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0xLmNsZWFuLmJvdGggPC0gUnVuUENBKEcxNzIuTTEuY2xlYW4uYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xLmNsZWFuLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0xLmNsZWFuLmJvdGggPC0gUnVuVU1BUChHMTcyLk0xLmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMS5jbGVhbi5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMS5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTEuY2xlYW4uYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMS5jbGVhbi5ib3RoLCByZXNvbHV0aW9uID0gMC41ICkgICAKRzE3Mi5NMS5jbGVhbi5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMS5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMS5jbGVhbi5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk0xLmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTEuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuY2xlYW4uYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NMS5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMS5jbGVhbi5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyBib3RoIHRvcDgwIE0xCkcxNzIuTTEuYm90aC50b3A4MCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0xLmJvdGgudG9wODAsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk0xLmJvdGgudG9wODAkc3RpbSAgPC0gIkcxNzJNMV9ib3RoX3RvcDgwIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMS5ib3RoLnRvcDgwKSA8LSAiUk5BIgpHMTcyLk0xLmJvdGgudG9wODAgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMS5ib3RoLnRvcDgwLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTEuYm90aC50b3A4MCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEuYm90aC50b3A4MCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0xLmJvdGgudG9wODAgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMS5ib3RoLnRvcDgwLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0xLmJvdGgudG9wODAgPC0gU2NhbGVEYXRhKEcxNzIuTTEuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEuYm90aC50b3A4MCkpCiMgUnVuIFBDQQpHMTcyLk0xLmJvdGgudG9wODAgPC0gUnVuUENBKEcxNzIuTTEuYm90aC50b3A4MCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xLmJvdGgudG9wODApKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0xLmJvdGgudG9wODAgPC0gUnVuVU1BUChHMTcyLk0xLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMS5ib3RoLnRvcDgwIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMS5ib3RoLnRvcDgwLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTEuYm90aC50b3A4MCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMS5ib3RoLnRvcDgwLCByZXNvbHV0aW9uID0gMC4yNSApICAgCkcxNzIuTTEuYm90aC50b3A4MC5wMTwtIFVNQVBQbG90KEcxNzIuTTEuYm90aC50b3A4MCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTEuYm90aC50b3A4MC5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NMS5ib3RoLnRvcDgwKSA8LSAiUk5BIgpHMTcyLk0xLmJvdGgudG9wODAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xLmJvdGgudG9wODAsIHZlcmJvc2UgPSBUUlVFKQpkMiA8LSBEb3RQbG90KEcxNzIuTTEuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBhbGxfZ2VuZXMpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTEuYm90aC50b3A4MC5wMSxkMikKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHMTcyIE0yIGJvdGggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKI0cxNzIuTTIuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0yLmJvdGgsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk0yLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMi5ib3RoKQojRzE3Mi5NMi5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcuVENQTywgY2VsbHM9IGpvaW50LmJjcy5NMi5ib3RoKQojRzE3Mi5NMi5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcuc2V4LlRDUE8uYmF0Y2gsIGNlbGxzPSBqb2ludC5iY3MuTTIuYm90aCkKRzE3Mi5NMi5ib3RoJHN0aW0gIDwtICJHMTcyTTJfYm90aCIKRGVmYXVsdEFzc2F5KEcxNzIuTTIuYm90aCkgPC0gIlJOQSIKRzE3Mi5NMi5ib3RoIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTIuYm90aCx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk0yLmJvdGggPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLmJvdGgsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMi5ib3RoIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTIuYm90aCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMi5ib3RoIDwtIFNjYWxlRGF0YShHMTcyLk0yLmJvdGgsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0yLmJvdGgpKQojIFJ1biBQQ0EKRzE3Mi5NMi5ib3RoIDwtIFJ1blBDQShHMTcyLk0yLmJvdGgsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMi5ib3RoKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMi5ib3RoIDwtIFJ1blVNQVAoRzE3Mi5NMi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCkcxNzIuTTIuYm90aCA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTIuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwKQpHMTcyLk0yLmJvdGggPC0gRmluZENsdXN0ZXJzKEcxNzIuTTIuYm90aCwgcmVzb2x1dGlvbiA9IDAuMzUpICAgCkcxNzIuTTIuYm90aC5wMTwtIFVNQVBQbG90KEcxNzIuTTIuYm90aCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTIuYm90aC5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NMi5ib3RoKSA8LSAiUk5BIgpHMTcyLk0yLmJvdGggPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLmJvdGgsIHZlcmJvc2UgPSBUUlVFKQpkMiA8LSBEb3RQbG90KEcxNzIuTTIuYm90aCwgZmVhdHVyZXMgPSBhbGxfZ2VuZXMpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTIuYm90aC5wMSxkMikKCiMjIyMjIyMjIyMjIyMgY2xlYW4gTTIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkcxNzIuTTIuY2xlYW4uYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0yLmNsZWFuLmJvdGgsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk0yLmNsZWFuLmJvdGgkc3RpbSAgPC0gIkcxNzJNMl9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMi5jbGVhbi5ib3RoKSA8LSAiUk5BIgpHMTcyLk0yLmNsZWFuLmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMi5jbGVhbi5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTIuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTIuY2xlYW4uYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0yLmNsZWFuLmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMi5jbGVhbi5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0yLmNsZWFuLmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTIuY2xlYW4uYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTIuY2xlYW4uYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0yLmNsZWFuLmJvdGggPC0gUnVuUENBKEcxNzIuTTIuY2xlYW4uYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0yLmNsZWFuLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0yLmNsZWFuLmJvdGggPC0gUnVuVU1BUChHMTcyLk0yLmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMi5jbGVhbi5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMi5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTIuY2xlYW4uYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMi5jbGVhbi5ib3RoLCByZXNvbHV0aW9uID0gMC4zNSkgICAKRzE3Mi5NMi5jbGVhbi5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMi5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMi5jbGVhbi5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk0yLmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTIuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTIuY2xlYW4uYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NMi5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMi5jbGVhbi5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyMgYm90aCB0b3AgODAgTTIgIyMjIyMjIyMjIyMjIyMjIwpHMTcyLk0yLmJvdGgudG9wODAgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMi5ib3RoLnRvcDgwLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMi5ib3RoLnRvcDgwJHN0aW0gIDwtICJHMTcyTTJfYm90aCIKRGVmYXVsdEFzc2F5KEcxNzIuTTIuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMi5ib3RoLnRvcDgwIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTIuYm90aC50b3A4MCx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk0yLmJvdGgudG9wODAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLmJvdGgudG9wODAsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMi5ib3RoLnRvcDgwIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTIuYm90aC50b3A4MCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMi5ib3RoLnRvcDgwIDwtIFNjYWxlRGF0YShHMTcyLk0yLmJvdGgudG9wODAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0yLmJvdGgudG9wODApKQojIFJ1biBQQ0EKRzE3Mi5NMi5ib3RoLnRvcDgwIDwtIFJ1blBDQShHMTcyLk0yLmJvdGgudG9wODAsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMi5ib3RoLnRvcDgwKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMi5ib3RoLnRvcDgwIDwtIFJ1blVNQVAoRzE3Mi5NMi5ib3RoLnRvcDgwLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTIuYm90aC50b3A4MCA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTIuYm90aC50b3A4MCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0yLmJvdGgudG9wODAgPC0gRmluZENsdXN0ZXJzKEcxNzIuTTIuYm90aC50b3A4MCwgcmVzb2x1dGlvbiA9IDAuMzUpICAgCkcxNzIuTTIuYm90aC50b3A4MC5wMTwtIFVNQVBQbG90KEcxNzIuTTIuYm90aC50b3A4MCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTIuYm90aC50b3A4MC5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NMi5ib3RoLnRvcDgwKSA8LSAiUk5BIgpHMTcyLk0yLmJvdGgudG9wODAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0yLmJvdGgudG9wODAsIHZlcmJvc2UgPSBUUlVFKQpkMiA8LSBEb3RQbG90KEcxNzIuTTIuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBhbGxfZ2VuZXMpK1JvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKEcxNzIuTTIuYm90aC50b3A4MC5wMSxkMikKCgojIyMjIyMjIyMjIyMjIGJvdGggTTMgIyMjIyMjIyMjIyMjIwpHMTcyLk0zLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMy5ib3RoLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKI0cxNzIuTTMuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLnNleC5iYXRjaCwgY2VsbHM9IGpvaW50LmJjcy5NMy5ib3RoKQpHMTcyLk0zLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMy5ib3RoKQpHMTcyLk0zLmJvdGgkc3RpbSAgPC0gIkcxNzJNM19ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMy5ib3RoKSA8LSAiUk5BIgpHMTcyLk0zLmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMy5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTMuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMuYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0zLmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMy5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0zLmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTMuYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTMuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0zLmJvdGggPC0gUnVuUENBKEcxNzIuTTMuYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0zLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0zLmJvdGggPC0gUnVuVU1BUChHMTcyLk0zLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMy5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMy5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTMuYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMy5ib3RoLCByZXNvbHV0aW9uID0gMC4zNSkgICAKRzE3Mi5NMy5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMy5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMy5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk0zLmJvdGgpIDwtICJSTkEiCkcxNzIuTTMuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMuYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NMy5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMy5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyBjbGVhbiBNMyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpHMTcyLk0zLmNsZWFuLmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGpvaW50LmJjcy5NMy5jbGVhbi5ib3RoLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMy5jbGVhbi5ib3RoJHN0aW0gIDwtICJHMTcyTTNfYm90aCIKRGVmYXVsdEFzc2F5KEcxNzIuTTMuY2xlYW4uYm90aCkgPC0gIlJOQSIKRzE3Mi5NMy5jbGVhbi5ib3RoIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTMuY2xlYW4uYm90aCx2ZXJib3NlID1UUlVFKQojIFNlbGVjdCB0aGUgdG9wIDEwMDAgbW9zdCB2YXJpYWJsZSBmZWF0dXJlcwpHMTcyLk0zLmNsZWFuLmJvdGggPC0gTm9ybWFsaXplRGF0YShHMTcyLk0zLmNsZWFuLmJvdGgsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMy5jbGVhbi5ib3RoIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTMuY2xlYW4uYm90aCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMy5jbGVhbi5ib3RoIDwtIFNjYWxlRGF0YShHMTcyLk0zLmNsZWFuLmJvdGgsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0zLmNsZWFuLmJvdGgpKQojIFJ1biBQQ0EKRzE3Mi5NMy5jbGVhbi5ib3RoIDwtIFJ1blBDQShHMTcyLk0zLmNsZWFuLmJvdGgsbnBjcyA9IDMwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMy5jbGVhbi5ib3RoKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMy5jbGVhbi5ib3RoIDwtIFJ1blVNQVAoRzE3Mi5NMy5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTMuY2xlYW4uYm90aCA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTMuY2xlYW4uYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0zLmNsZWFuLmJvdGggPC0gRmluZENsdXN0ZXJzKEcxNzIuTTMuY2xlYW4uYm90aCwgcmVzb2x1dGlvbiA9IDAuNCkgICAKRzE3Mi5NMy5jbGVhbi5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NMy5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMy5jbGVhbi5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk0zLmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTMuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMuY2xlYW4uYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NMy5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NMy5jbGVhbi5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIGJvdGggdG9wODAgTTMgIyMjIyMjIyMjIyMjIyMjIyMzCkcxNzIuTTMuYm90aC50b3A4MCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gam9pbnQuYmNzLk0zLmJvdGgudG9wODAsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk0zLmJvdGgudG9wODAkc3RpbSAgPC0gIkcxNzJNM19ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMy5ib3RoLnRvcDgwKSA8LSAiUk5BIgpHMTcyLk0zLmJvdGgudG9wODAgPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NMy5ib3RoLnRvcDgwLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTMuYm90aC50b3A4MCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTMuYm90aC50b3A4MCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk0zLmJvdGgudG9wODAgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMy5ib3RoLnRvcDgwLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0zLmJvdGgudG9wODAgPC0gU2NhbGVEYXRhKEcxNzIuTTMuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTMuYm90aC50b3A4MCkpCiMgUnVuIFBDQQpHMTcyLk0zLmJvdGgudG9wODAgPC0gUnVuUENBKEcxNzIuTTMuYm90aC50b3A4MCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0zLmJvdGgudG9wODApKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0zLmJvdGgudG9wODAgPC0gUnVuVU1BUChHMTcyLk0zLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMy5ib3RoLnRvcDgwIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMy5ib3RoLnRvcDgwLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTMuYm90aC50b3A4MCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMy5ib3RoLnRvcDgwLCByZXNvbHV0aW9uID0gMC40KSAgIApHMTcyLk0zLmJvdGgudG9wODAucDE8LSBVTUFQUGxvdChHMTcyLk0zLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk0zLmJvdGgudG9wODAucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTMuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMy5ib3RoLnRvcDgwIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NMy5ib3RoLnRvcDgwLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk0zLmJvdGgudG9wODAsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk0zLmJvdGgudG9wODAucDEsZDIpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojRzE3Mi5NNC5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzPSBqb2ludC5iY3MuTTQuYm90aCwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCiNHMTcyLk00LmJvdGggPC0gc3Vic2V0KEcxNzIuaGFzaHRhZy5UQ1BPLCBjZWxscz0gam9pbnQuYmNzLk00LmJvdGgpCkcxNzIuTTQuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLnNleC5UQ1BPLmJhdGNoLCBjZWxscz0gam9pbnQuYmNzLk00LmJvdGgpCkcxNzIuTTQuYm90aCRzdGltICA8LSAiRzE3Mk00X2JvdGgiCkRlZmF1bHRBc3NheShHMTcyLk00LmJvdGgpIDwtICJSTkEiCkcxNzIuTTQuYm90aCA8LSBTQ1RyYW5zZm9ybShHMTcyLk00LmJvdGgsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NNC5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5ib3RoLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTQuYm90aCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk00LmJvdGgsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTQuYm90aCA8LSBTY2FsZURhdGEoRzE3Mi5NNC5ib3RoLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNC5ib3RoKSkKIyBSdW4gUENBCkcxNzIuTTQuYm90aCA8LSBSdW5QQ0EoRzE3Mi5NNC5ib3RoLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTQuYm90aCkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTQuYm90aCA8LSBSdW5VTUFQKEcxNzIuTTQuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1KQpHMTcyLk00LmJvdGggPC0gRmluZE5laWdoYm9ycyhHMTcyLk00LmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NNC5ib3RoIDwtIEZpbmRDbHVzdGVycyhHMTcyLk00LmJvdGgsIHJlc29sdXRpb24gPSAwLjM1KSAgIApHMTcyLk00LmJvdGgucDE8LSBVTUFQUGxvdChHMTcyLk00LmJvdGgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk00LmJvdGgucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTQuYm90aCkgPC0gIlJOQSIKRzE3Mi5NNC5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5ib3RoLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk00LmJvdGgsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk00LmJvdGgucDEsZDIpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgY2xlYW4gTTQgIyMjIyMjIyMjIyMjIyMKRzE3Mi5NNC5jbGVhbi5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzPSBqb2ludC5iY3MuTTQuY2xlYW4uYm90aCwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCkcxNzIuTTQuY2xlYW4uYm90aCRzdGltICA8LSAiRzE3Mk00X2JvdGgiCkRlZmF1bHRBc3NheShHMTcyLk00LmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTQuY2xlYW4uYm90aCA8LSBTQ1RyYW5zZm9ybShHMTcyLk00LmNsZWFuLmJvdGgsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NNC5jbGVhbi5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5jbGVhbi5ib3RoLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTQuY2xlYW4uYm90aCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk00LmNsZWFuLmJvdGgsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTQuY2xlYW4uYm90aCA8LSBTY2FsZURhdGEoRzE3Mi5NNC5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNC5jbGVhbi5ib3RoKSkKIyBSdW4gUENBCkcxNzIuTTQuY2xlYW4uYm90aCA8LSBSdW5QQ0EoRzE3Mi5NNC5jbGVhbi5ib3RoLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTQuY2xlYW4uYm90aCkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTQuY2xlYW4uYm90aCA8LSBSdW5VTUFQKEcxNzIuTTQuY2xlYW4uYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk00LmNsZWFuLmJvdGggPC0gRmluZE5laWdoYm9ycyhHMTcyLk00LmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NNC5jbGVhbi5ib3RoIDwtIEZpbmRDbHVzdGVycyhHMTcyLk00LmNsZWFuLmJvdGgsIHJlc29sdXRpb24gPSAwLjI1KSAgIApHMTcyLk00LmNsZWFuLmJvdGgucDE8LSBVTUFQUGxvdChHMTcyLk00LmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk00LmNsZWFuLmJvdGgucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTQuY2xlYW4uYm90aCkgPC0gIlJOQSIKRzE3Mi5NNC5jbGVhbi5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5jbGVhbi5ib3RoLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk00LmNsZWFuLmJvdGgsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk00LmNsZWFuLmJvdGgucDEsZDIpCgojIyMjIyMjIyMjIyMjIE00IHRvcCA4MCAjIyMjIyMjIyMjIzMKRzE3Mi5NNC5ib3RoLnRvcDgwIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzPSBqb2ludC5iY3MuTTQuYm90aC50b3A4MCwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCkcxNzIuTTQuYm90aC50b3A4MCRzdGltICA8LSAiRzE3Mk00X2JvdGgiCkRlZmF1bHRBc3NheShHMTcyLk00LmJvdGgudG9wODApIDwtICJSTkEiCkcxNzIuTTQuYm90aC50b3A4MCA8LSBTQ1RyYW5zZm9ybShHMTcyLk00LmJvdGgudG9wODAsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NNC5ib3RoLnRvcDgwIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5ib3RoLnRvcDgwLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTQuYm90aC50b3A4MCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk00LmJvdGgudG9wODAsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTQuYm90aC50b3A4MCA8LSBTY2FsZURhdGEoRzE3Mi5NNC5ib3RoLnRvcDgwLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNC5ib3RoLnRvcDgwKSkKIyBSdW4gUENBCkcxNzIuTTQuYm90aC50b3A4MCA8LSBSdW5QQ0EoRzE3Mi5NNC5ib3RoLnRvcDgwLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTQuYm90aC50b3A4MCkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTQuYm90aC50b3A4MCA8LSBSdW5VTUFQKEcxNzIuTTQuYm90aC50b3A4MCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1KQpHMTcyLk00LmJvdGgudG9wODAgPC0gRmluZE5laWdoYm9ycyhHMTcyLk00LmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NNC5ib3RoLnRvcDgwIDwtIEZpbmRDbHVzdGVycyhHMTcyLk00LmJvdGgudG9wODAsIHJlc29sdXRpb24gPSAwLjI1KSAgIApHMTcyLk00LmJvdGgudG9wODAucDE8LSBVTUFQUGxvdChHMTcyLk00LmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk00LmJvdGgudG9wODAucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTQuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NNC5ib3RoLnRvcDgwIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNC5ib3RoLnRvcDgwLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk00LmJvdGgudG9wODAsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk00LmJvdGgudG9wODAucDEsZDIpCgoKCiMjIyMjIyMjIyMjIyMjIyBib3RoIE0xICsgbTMgIyMjIyMjIyMjIyMzMwoKRzE3Mi5NNi5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzID0gYyhqb2ludC5iY3MuTTEuYm90aCxqb2ludC5iY3MuTTMuYm90aCksIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk02LmJvdGggPC0gbWVyZ2UoRzE3Mi5NMS5ib3RoLCBHMTcyLk0zLmJvdGgpCkRlZmF1bHRBc3NheShHMTcyLk02LmJvdGgpIDwtICJSTkEiCiNHMTcyLk02LmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NNi5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTYuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTYuYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk02LmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNi5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk02LmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTYuYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTYuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk02LmJvdGggPC0gUnVuUENBKEcxNzIuTTYuYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk02LmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk02LmJvdGggPC0gUnVuVU1BUChHMTcyLk02LmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NNi5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NNi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTYuYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NNi5ib3RoLCByZXNvbHV0aW9uID0gMC4yNSApICAgCkcxNzIuTTYuYm90aC5wMTwtIFVNQVBQbG90KEcxNzIuTTYuYm90aCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTYuYm90aC5wMQpHMTcyLk02LmJvdGgucDIgPC0gVU1BUFBsb3QoRzE3Mi5NNi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwPSJzdGltIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk02LmJvdGgucDIKRGVmYXVsdEFzc2F5KEcxNzIuTTYuYm90aCkgPC0gIlJOQSIKRzE3Mi5NNi5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NNi5ib3RoLCB2ZXJib3NlID0gVFJVRSkKZDYgPC0gRG90UGxvdChHMTcyLk02LmJvdGgsIGZlYXR1cmVzID0gYyhhbGxfZ2VuZXMsJ0N5cDJiMTAnLCdDeXAyZDknKSkrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NNi5ib3RoLnAxLGQ2KQoKIyBmaW5kIG1hcmtlcnMgYmV0d2VlbiB0aGUgbWFsZSBhbmQgZmVtYWxlIGNsdXN0ZXIgaGVwYXRvY3l0ZXMgIyMjIyMjIyMjIyMjIyMjIyMKREUuc2V4LmhlcCA8LSBGaW5kTWFya2VycyhHMTcyLk02LmJvdGgsIGlkZW50LjEgPSAwLCBpZGVudC4yID0gMSAsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKd3JpdGUudGFibGUoREUuc2V4LmhlcCwgIkRFX0FuYWx5c2lzL0RFX3NleF9oZXBfRzE3M19NMS1NM19mb3Jfc2V4X2JhdGNoX2RlcGxldGVkIiwgc2VwPSJcdCIpCgojIyMjIyMjIyMjIyMjIyMjIyMjMzMgYm90aCBNMiArIE00ICMjIyMKRzE3Mi5NNy5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzID0gYyhqb2ludC5iY3MuTTIuYm90aCxqb2ludC5iY3MuTTQuYm90aCksIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk03LmJvdGggPC0gbWVyZ2UoRzE3Mi5NMi5ib3RoLCBHMTcyLk00LmJvdGgpCkRlZmF1bHRBc3NheShHMTcyLk03LmJvdGgpIDwtICJSTkEiCiNHMTcyLk03LmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NNy5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTcuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTcuYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk03LmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NNy5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk03LmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTcuYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTcuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk03LmJvdGggPC0gUnVuUENBKEcxNzIuTTcuYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk03LmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk03LmJvdGggPC0gUnVuVU1BUChHMTcyLk03LmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NNy5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NNy5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCkcxNzIuTTcuYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NNy5ib3RoLCByZXNvbHV0aW9uID0gMC4zICkgICAKRzE3Mi5NNy5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NNy5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NNy5ib3RoLnAxCkcxNzIuTTcuYm90aC5wMiA8LSBVTUFQUGxvdChHMTcyLk03LmJvdGgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXA9InN0aW0iLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTcuYm90aC5wMgpEZWZhdWx0QXNzYXkoRzE3Mi5NNy5ib3RoKSA8LSAiUk5BIgpHMTcyLk03LmJvdGggPC0gTm9ybWFsaXplRGF0YShHMTcyLk03LmJvdGgsIHZlcmJvc2UgPSBUUlVFKQpkNyA8LSBEb3RQbG90KEcxNzIuTTcuYm90aCwgZmVhdHVyZXMgPSBjKGFsbF9nZW5lcywnQ3lwMmIxMCcsJ0N5cDJkOScpKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk03LmJvdGgucDEsZDcpCkRFLnNleC5oZXAuTTcgPC0gRmluZE1hcmtlcnMoRzE3Mi5NNy5ib3RoLCBpZGVudC4xID0gMCwgaWRlbnQuMiA9IDEgLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCndyaXRlLnRhYmxlKERFLnNleC5oZXAuTTcsICJERV9BbmFseXNpcy9ERV9zZXhfaGVwX0cxNzJfTTItTTRfZm9yX3NleGRlcGxlYXRlZCIsIHNlcD0iXHQiKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBjbGVhbiBNOCAoTTErTTMpICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKRzE3Mi5NOC5jbGVhbi5ib3RoIDwtIHN1YnNldChHMTcyLmhhc2h0YWcsIGNlbGxzPSBjKGpvaW50LmJjcy5NMS5jbGVhbi5ib3RoLGpvaW50LmJjcy5NMy5jbGVhbi5ib3RoKSwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCkcxNzIuTTguY2xlYW4uYm90aCRzdGltICA8LSAiRzE3Mk04X2JvdGgiCkRlZmF1bHRBc3NheShHMTcyLk04LmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTguY2xlYW4uYm90aCA8LSBTQ1RyYW5zZm9ybShHMTcyLk04LmNsZWFuLmJvdGgsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NOC5jbGVhbi5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NOC5jbGVhbi5ib3RoLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTguY2xlYW4uYm90aCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk04LmNsZWFuLmJvdGgsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBTY2FsaW5nIFJOQSBkYXRhLCB3ZSBvbmx5IHNjYWxlIHRoZSB2YXJpYWJsZSBmZWF0dXJlcyBoZXJlIGZvciBlZmZpY2llbmN5CkcxNzIuTTguY2xlYW4uYm90aCA8LSBTY2FsZURhdGEoRzE3Mi5NOC5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NOC5jbGVhbi5ib3RoKSkKIyBSdW4gUENBCkcxNzIuTTguY2xlYW4uYm90aCA8LSBSdW5QQ0EoRzE3Mi5NOC5jbGVhbi5ib3RoLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTguY2xlYW4uYm90aCkpCiMgV2Ugc2VsZWN0IHRoZSB0b3AgMTAgUENzIGZvciBjbHVzdGVyaW5nIGFuZCB0U05FIGJhc2VkIG9uIFBDRWxib3dQbG90CkcxNzIuTTguY2xlYW4uYm90aCA8LSBSdW5VTUFQKEcxNzIuTTguY2xlYW4uYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk04LmNsZWFuLmJvdGggPC0gRmluZE5laWdoYm9ycyhHMTcyLk04LmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NOC5jbGVhbi5ib3RoIDwtIEZpbmRDbHVzdGVycyhHMTcyLk04LmNsZWFuLmJvdGgsIHJlc29sdXRpb24gPSAwLjI1KSAgIApHMTcyLk04LmNsZWFuLmJvdGgucDE8LSBVTUFQUGxvdChHMTcyLk04LmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQpHMTcyLk04LmNsZWFuLmJvdGgucDEKRGVmYXVsdEFzc2F5KEcxNzIuTTguY2xlYW4uYm90aCkgPC0gIlJOQSIKRzE3Mi5NOC5jbGVhbi5ib3RoIDwtIE5vcm1hbGl6ZURhdGEoRzE3Mi5NOC5jbGVhbi5ib3RoLCB2ZXJib3NlID0gVFJVRSkKZDIgPC0gRG90UGxvdChHMTcyLk04LmNsZWFuLmJvdGgsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk04LmNsZWFuLmJvdGgucDEsZDIpCgojIyMjIzMgY2xlYW4gTTkgKE0yKyBNNCkjIyMjIzMzCkcxNzIuTTkuY2xlYW4uYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscz0gYyhqb2ludC5iY3MuTTIuY2xlYW4uYm90aCxqb2ludC5iY3MuTTQuY2xlYW4uYm90aCksIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcyLk05LmNsZWFuLmJvdGgkc3RpbSAgPC0gIkcxNzJNOV9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NOS5jbGVhbi5ib3RoKSA8LSAiUk5BIgpHMTcyLk05LmNsZWFuLmJvdGggPC0gU0NUcmFuc2Zvcm0oRzE3Mi5NOS5jbGVhbi5ib3RoLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTkuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTkuY2xlYW4uYm90aCwgdmVyYm9zZSA9IEZBTFNFKQpHMTcyLk05LmNsZWFuLmJvdGggPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NOS5jbGVhbi5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk05LmNsZWFuLmJvdGggPC0gU2NhbGVEYXRhKEcxNzIuTTkuY2xlYW4uYm90aCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTkuY2xlYW4uYm90aCkpCiMgUnVuIFBDQQpHMTcyLk05LmNsZWFuLmJvdGggPC0gUnVuUENBKEcxNzIuTTkuY2xlYW4uYm90aCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk05LmNsZWFuLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk05LmNsZWFuLmJvdGggPC0gUnVuVU1BUChHMTcyLk05LmNsZWFuLmJvdGgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NOS5jbGVhbi5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NOS5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCkcxNzIuTTkuY2xlYW4uYm90aCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NOS5jbGVhbi5ib3RoLCByZXNvbHV0aW9uID0gMC4yNSkgICAKRzE3Mi5NOS5jbGVhbi5ib3RoLnAxPC0gVU1BUFBsb3QoRzE3Mi5NOS5jbGVhbi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NOS5jbGVhbi5ib3RoLnAxCkRlZmF1bHRBc3NheShHMTcyLk05LmNsZWFuLmJvdGgpIDwtICJSTkEiCkcxNzIuTTkuY2xlYW4uYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTkuY2xlYW4uYm90aCwgdmVyYm9zZSA9IFRSVUUpCmQyIDwtIERvdFBsb3QoRzE3Mi5NOS5jbGVhbi5ib3RoLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrUm90YXRlZEF4aXMoKQpwbG90X2dyaWQoRzE3Mi5NOS5jbGVhbi5ib3RoLnAxLGQyKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyBNMSsgTTMgYm90aCB0b3AgODAKCkcxNzIuTTEwLmJvdGgudG9wODAgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGMoam9pbnQuYmNzLk0xLmJvdGgudG9wODAsam9pbnQuYmNzLk0zLmJvdGgudG9wODApLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMTAuYm90aC50b3A4MCRzdGltICA8LSAiRzE3Mk0xMF9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMTAuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBTQ1RyYW5zZm9ybShHMTcyLk0xMC5ib3RoLnRvcDgwLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTEwLmJvdGgudG9wODAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xMC5ib3RoLnRvcDgwLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTEwLmJvdGgudG9wODAgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMTAuYm90aC50b3A4MCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBTY2FsZURhdGEoRzE3Mi5NMTAuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEwLmJvdGgudG9wODApKQojIFJ1biBQQ0EKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBSdW5QQ0EoRzE3Mi5NMTAuYm90aC50b3A4MCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xMC5ib3RoLnRvcDgwKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBSdW5VTUFQKEcxNzIuTTEwLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTEwLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMTAuYm90aC50b3A4MCwgcmVzb2x1dGlvbiA9IDAuMjUpICAgCkcxNzIuTTEwLmJvdGgudG9wODAucDE8LSBVTUFQUGxvdChHMTcyLk0xMC5ib3RoLnRvcDgwLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMTAuYm90aC50b3A4MC5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NMTAuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMTAuYm90aC50b3A4MCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEwLmJvdGgudG9wODAsIHZlcmJvc2UgPSBUUlVFKQpkMiA8LSBEb3RQbG90KEcxNzIuTTEwLmJvdGgudG9wODAsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk0xMC5ib3RoLnRvcDgwLnAxLGQyKQoKCiMjIyMjIyMjIyMjIyBNMisgTTQgdG9wIDgwCkcxNzIuTTExLmJvdGgudG9wODAgPC0gc3Vic2V0KEcxNzIuaGFzaHRhZywgY2VsbHM9IGMoam9pbnQuYmNzLk0yLmJvdGgudG9wODAsam9pbnQuYmNzLk00LmJvdGgudG9wODApLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMTEuYm90aC50b3A4MCRzdGltICA8LSAiRzE3Mk0xMV9ib3RoIgpEZWZhdWx0QXNzYXkoRzE3Mi5NMTEuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBTQ1RyYW5zZm9ybShHMTcyLk0xMS5ib3RoLnRvcDgwLHZlcmJvc2UgPVRSVUUpCiMgU2VsZWN0IHRoZSB0b3AgMTAwMCBtb3N0IHZhcmlhYmxlIGZlYXR1cmVzCkcxNzIuTTExLmJvdGgudG9wODAgPC0gTm9ybWFsaXplRGF0YShHMTcyLk0xMS5ib3RoLnRvcDgwLCB2ZXJib3NlID0gRkFMU0UpCkcxNzIuTTExLmJvdGgudG9wODAgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMTEuYm90aC50b3A4MCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQojIFNjYWxpbmcgUk5BIGRhdGEsIHdlIG9ubHkgc2NhbGUgdGhlIHZhcmlhYmxlIGZlYXR1cmVzIGhlcmUgZm9yIGVmZmljaWVuY3kKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBTY2FsZURhdGEoRzE3Mi5NMTEuYm90aC50b3A4MCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTExLmJvdGgudG9wODApKQojIFJ1biBQQ0EKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBSdW5QQ0EoRzE3Mi5NMTEuYm90aC50b3A4MCxucGNzID0gMzAsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xMS5ib3RoLnRvcDgwKSkKIyBXZSBzZWxlY3QgdGhlIHRvcCAxMCBQQ3MgZm9yIGNsdXN0ZXJpbmcgYW5kIHRTTkUgYmFzZWQgb24gUENFbGJvd1Bsb3QKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBSdW5VTUFQKEcxNzIuTTExLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBGaW5kTmVpZ2hib3JzKEcxNzIuTTExLmJvdGgudG9wODAsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyNSkKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBGaW5kQ2x1c3RlcnMoRzE3Mi5NMTEuYm90aC50b3A4MCwgcmVzb2x1dGlvbiA9IDAuMjUpICAgCkcxNzIuTTExLmJvdGgudG9wODAucDE8LSBVTUFQUGxvdChHMTcyLk0xMS5ib3RoLnRvcDgwLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMTEuYm90aC50b3A4MC5wMQpEZWZhdWx0QXNzYXkoRzE3Mi5NMTEuYm90aC50b3A4MCkgPC0gIlJOQSIKRzE3Mi5NMTEuYm90aC50b3A4MCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTExLmJvdGgudG9wODAsIHZlcmJvc2UgPSBUUlVFKQpkMiA8LSBEb3RQbG90KEcxNzIuTTExLmJvdGgudG9wODAsIGZlYXR1cmVzID0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk0xMS5ib3RoLnRvcDgwLnAxLGQyKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNMStNMitNMytNNCBzZXggZGVscGV0ZWMgZ2VuZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojRzE3Mi5NMTIuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscyA9IGMoam9pbnQuYmNzLk0xLmJvdGgsam9pbnQuYmNzLk0zLmJvdGgpLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMTIuYm90aCA8LSBtZXJnZShHMTcyLk02LmJvdGgsIEcxNzIuTTcuYm90aCkKI0cxNzIuTTEyLmJvdGggPC0gc3Vic2V0KEcxNzIuTTEyLmJvdGgsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQoKRGVmYXVsdEFzc2F5KEcxNzIuTTEyLmJvdGgpIDwtICJSTkEiCiNHMTcyLk0xMi5ib3RoIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTEyLmJvdGgsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NMTIuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEyLmJvdGgsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMTIuYm90aCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xMi5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0xMi5ib3RoIDwtIFNjYWxlRGF0YShHMTcyLk0xMi5ib3RoLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMTIuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0xMi5ib3RoIDwtIFJ1blBDQShHMTcyLk0xMi5ib3RoLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEyLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0xMi5ib3RoIDwtIFJ1blVNQVAoRzE3Mi5NMTIuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0xMi5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMTIuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0xMi5ib3RoIDwtIEZpbmRDbHVzdGVycyhHMTcyLk0xMi5ib3RoLCByZXNvbHV0aW9uID0gMC4yNSApICAgCkcxNzIuTTEyLmJvdGgucDE8LSBVTUFQUGxvdChHMTcyLk0xMi5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKRzE3Mi5NMTIuYm90aC5wMQpHMTcyLk0xMi5ib3RoLnAyIDwtIFVNQVBQbG90KEcxNzIuTTEyLmJvdGgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXA9InN0aW0iLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCkcxNzIuTTEyLmJvdGgucDIKcGxvdF9ncmlkKEcxNzIuTTEyLmJvdGgucDEsIEcxNzIuTTEyLmJvdGgucDIpCkZlYXR1cmVQbG90KEcxNzIuTTEyLmJvdGgsIGZlYXR1cmVzID0gIkN5cDJjNTUiKQpGZWF0dXJlUGxvdChHMTcyLk0xMi5ib3RoLCBmZWF0dXJlcyA9ICJuY1JOQS1pbnRlci1jaHJYLTE1Mzk0IikKZDEyIDwtIERvdFBsb3QoRzE3Mi5NMTIuYm90aCwgZmVhdHVyZXMgPSBjKGFsbF9nZW5lc19uZXcpKStSb3RhdGVkQXhpcygpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRzE3MiBNMSArTTIrTTMrTTQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojRzE3Mi5NMTMuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscyA9IGMoam9pbnQuYmNzLk0xLmJvdGgsam9pbnQuYmNzLk0zLmJvdGgsam9pbnQuYmNzLk0yLmJvdGgsam9pbnQuYmNzLk00LmJvdGgpLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMTMuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscyA9IGMoam9pbnQuYmNzLk0xLmJvdGgsam9pbnQuYmNzLk0zLmJvdGgsam9pbnQuYmNzLk0yLmJvdGgsam9pbnQuYmNzLk00LmJvdGgpLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKRzE3Mi5NMTMuYm90aCA8LSBzdWJzZXQoRzE3Mi5oYXNodGFnLCBjZWxscyA9IGMoam9pbnQuYmNzLk0xLmJvdGgsam9pbnQuYmNzLk0zLmJvdGgsam9pbnQuYmNzLk0yLmJvdGgsam9pbnQuYmNzLk00LmJvdGgpKQoKRGVmYXVsdEFzc2F5KEcxNzIuTTEzLmJvdGgpIDwtICJSTkEiCiNHMTcyLk0xMy5ib3RoIDwtIFNDVHJhbnNmb3JtKEcxNzIuTTEzLmJvdGgsdmVyYm9zZSA9VFJVRSkKIyBTZWxlY3QgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMKRzE3Mi5NMTMuYm90aCA8LSBOb3JtYWxpemVEYXRhKEcxNzIuTTEzLmJvdGgsIHZlcmJvc2UgPSBGQUxTRSkKRzE3Mi5NMTMuYm90aCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhHMTcyLk0xMy5ib3RoLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCiMgU2NhbGluZyBSTkEgZGF0YSwgd2Ugb25seSBzY2FsZSB0aGUgdmFyaWFibGUgZmVhdHVyZXMgaGVyZSBmb3IgZWZmaWNpZW5jeQpHMTcyLk0xMy5ib3RoIDwtIFNjYWxlRGF0YShHMTcyLk0xMy5ib3RoLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoRzE3Mi5NMTMuYm90aCkpCiMgUnVuIFBDQQpHMTcyLk0xMy5ib3RoIDwtIFJ1blBDQShHMTcyLk0xMy5ib3RoLG5wY3MgPSAzMCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKEcxNzIuTTEzLmJvdGgpKQojIFdlIHNlbGVjdCB0aGUgdG9wIDEwIFBDcyBmb3IgY2x1c3RlcmluZyBhbmQgdFNORSBiYXNlZCBvbiBQQ0VsYm93UGxvdApHMTcyLk0xMy5ib3RoIDwtIFJ1blVNQVAoRzE3Mi5NMTMuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0xMy5ib3RoIDwtIEZpbmROZWlnaGJvcnMoRzE3Mi5NMTMuYm90aCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpHMTcyLk0xMy5ib3RoIDwtIEZpbmRDbHVzdGVycyhHMTcyLk0xMy5ib3RoLCByZXNvbHV0aW9uID0gMC4yNSApICAgCkcxNzIuTTEzLmJvdGgucDE8LSBVTUFQUGxvdChHMTcyLk0xMy5ib3RoLCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKcGxvdF9ncmlkKEcxNzIuTTEzLmJvdGgucDEsIEcxNzIuTTEzLmJvdGgucDIpCkZlYXR1cmVQbG90KEcxNzIuTTEzLmJvdGgsIGZlYXR1cmVzID0gIkN5cDJjNTUiKQpGZWF0dXJlUGxvdChHMTcyLk0xMy5ib3RoLCBmZWF0dXJlcyA9ICJuY1JOQS1pbnRlci1jaHJYLTE1Mzk0IikKZDEzIDwtIERvdFBsb3QoRzE3Mi5NMTMuYm90aCwgZmVhdHVyZXMgPSBjKGFsbF9nZW5lc19uZXcpKStSb3RhdGVkQXhpcygpCnBsb3RfZ3JpZChHMTcyLk0xMy5ib3RoLnAxLCBkMTMpCkZlYXR1cmVQbG90KEcxNzIuTTEzLmJvdGgsIGZlYXR1cmVzID0gIkN5cDJjNTUiKQpGZWF0dXJlUGxvdChHMTcyLk0xMy5ib3RoLCBmZWF0dXJlcyA9ICJuY1JOQS1pbnRlci1jaHJYLTE1Mzk0IikKCmBgYAoKCgpgYGB7cn0KIyMjIyMjIyMjIyBmdW5jdGlvbiBsb2FkX3Rpc3N1ZV9kcm9wbGV0IyMjIyMjIyMjIyMjCmRyb3BsZXRfbWV0YWRhdGEgPC0gcmVhZC5jc3YoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NjUk5Bc2VxX2RhdGFfaW50ZWdyYXRpb24vbWV0YWRhdGFfZHJvcGxldF9saXZlci5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFKQpjb2xuYW1lcyhkcm9wbGV0X21ldGFkYXRhKVsxXSA8LSAiY2hhbm5lbCIKdGlzc3VlX21ldGFkYXRhID0gZmlsdGVyKGRyb3BsZXRfbWV0YWRhdGEsIHRpc3N1ZSA9PSB0aXNzdWVfb2ZfaW50ZXJlc3QpWyxjKCdjaGFubmVsJywndGlzc3VlJywnc3VidGlzc3VlJywnbW91c2Uuc2V4JywgJ21vdXNlLmlkJyldCgpyYXcuZGF0YSA8LSBSZWFkMTBYKCIvcmVzdHJpY3RlZC9wcm9qZWN0bmIvd2F4bWFubGFiL2trYXJyaS9zY1JOQXNlcV9kYXRhX2ludGVncmF0aW9uL1JlZmluZWRfY2VsbG1hdHJpY2VzL0xpdmVyLTEwWF9QNF8yLyIpCmNvbG5hbWVzKHJhdy5kYXRhKSA8LSBsYXBwbHkoY29sbmFtZXMocmF3LmRhdGEpLCBmdW5jdGlvbih4KSBwYXN0ZTAodGlzc3VlX21ldGFkYXRhJGNoYW5uZWxbMV0sJ18nLHgpKQogIG1ldGEuZGF0YTEgPSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHJhdy5kYXRhKSkKICBtZXRhLmRhdGExWydjaGFubmVsJ10gPSB0aXNzdWVfbWV0YWRhdGEkY2hhbm5lbFsxXQoKICBpZiAobGVuZ3RoKHRpc3N1ZV9tZXRhZGF0YSRjaGFubmVsKSA+IDEpewogICAgIyBTb21lIHRpc3N1ZXMsIGxpa2UgVGh5bXVzIGFuZCBIZWFydCBoYWQgb25seSBvbmUgY2hhbm5lbAogICAgZm9yKGkgaW4gMjpucm93KHRpc3N1ZV9tZXRhZGF0YSkpewpzdWJmb2xkZXIgPSBwYXN0ZTAoIi9yZXN0cmljdGVkL3Byb2plY3RuYi93YXhtYW5sYWIva2thcnJpL3NjUk5Bc2VxX2RhdGFfaW50ZWdyYXRpb24vUmVmaW5lZF9jZWxsbWF0cmljZXMvIix0aXNzdWVfb2ZfaW50ZXJlc3QsICctJywgdGlzc3VlX21ldGFkYXRhJGNoYW5uZWxbaV0pCiAgICAgIG5ldy5kYXRhMSA8LSBSZWFkMTBYKGRhdGEuZGlyID0gc3ViZm9sZGVyKQogICAgICBjb2xuYW1lcyhuZXcuZGF0YTEpIDwtIGxhcHBseShjb2xuYW1lcyhuZXcuZGF0YTEpLCBmdW5jdGlvbih4KSBwYXN0ZTAodGlzc3VlX21ldGFkYXRhJGNoYW5uZWxbaV0sJ18nLCB4KSkKICAgICAgCiAgICAgIG5ldy5tZXRhZGF0YTEgPSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKG5ldy5kYXRhMSkpCiAgICAgIG5ldy5tZXRhZGF0YTFbJ2NoYW5uZWwnXSA9IHRpc3N1ZV9tZXRhZGF0YSRjaGFubmVsW2ldCiAgICAgIAogICAgICByYXcuZGF0YSA9IGNiaW5kKHJhdy5kYXRhLCBuZXcuZGF0YTEpCiAgICAgIG1ldGEuZGF0YTEgPSByYmluZChtZXRhLmRhdGExLCBuZXcubWV0YWRhdGExKQogICAgfQogIH0KICAKICBybmFtZXMgPSByb3cubmFtZXMobWV0YS5kYXRhMSkKICBtZXRhLmRhdGExIDwtIG1lcmdlKG1ldGEuZGF0YTEsIHRpc3N1ZV9tZXRhZGF0YSwgc29ydCA9IEYpCiAgcm93Lm5hbWVzKG1ldGEuZGF0YTEpIDwtIHJuYW1lcwogICMgT3JkZXIgdGhlIGNlbGxzIGFscGhhYmV0aWNhbGx5IHRvIGVuc3VyZSBjb25zaXN0ZW5jeS4KICAgIG9yZGVyZWRfY2VsbF9uYW1lcyA9IG9yZGVyKGNvbG5hbWVzKHJhdy5kYXRhKSkKICByYXcuZGF0YSA9IHJhdy5kYXRhWyxvcmRlcmVkX2NlbGxfbmFtZXNdCiAgbWV0YS5kYXRhMSA9IG1ldGEuZGF0YTFbb3JkZXJlZF9jZWxsX25hbWVzLF0KICAgICMgRmluZCBFUkNDJ3MsIGNvbXB1dGUgdGhlIHBlcmNlbnQgRVJDQywgYW5kIGRyb3AgdGhlbSBmcm9tIHRoZSByYXcgZGF0YS4KICBlcmNjcyA8LSBncmVwKHBhdHRlcm4gPSAiXkVSQ0MtIiwgeCA9IHJvd25hbWVzKHggPSByYXcuZGF0YSksIHZhbHVlID0gVFJVRSkKICBwZXJjZW50LmVyY2MgPC0gTWF0cml4Ojpjb2xTdW1zKHJhdy5kYXRhW2VyY2NzLCBdKS9NYXRyaXg6OmNvbFN1bXMocmF3LmRhdGEpCiAgZXJjYy5pbmRleCA8LSBncmVwKHBhdHRlcm4gPSAiXkVSQ0MtIiwgeCA9IHJvd25hbWVzKHggPSByYXcuZGF0YSksIHZhbHVlID0gRkFMU0UpCiAgcmF3LmRhdGEgPC0gcmF3LmRhdGFbLWVyY2MuaW5kZXgsXQogIAogICMgQ3JlYXRlIHRoZSBTZXVyYXQgb2JqZWN0IHdpdGggYWxsIHRoZSBkYXRhCiAgZHJvcGxldCA8LSBDcmVhdGVTZXVyYXRPYmplY3QocmF3LmRhdGEpICAgIyBkcm9wc2VxCiAgZHJvcGxldCA8LSBBZGRNZXRhRGF0YShvYmplY3QgPSBkcm9wbGV0LCBtZXRhLmRhdGExKSAKICBkcm9wbGV0QG1ldGEuZGF0YSR0ZWNoIDwtICJkcm9wbGV0IgoKI24ucGNzID0gMTAKICAjZHJvcGxldCA8LSBTdWJzZXREYXRhKGRyb3BsZXQsc3Vic2V0Lm5hbWVzID0gYygibkdlbmUiLCAiblVNSSIpLCBsb3cudGhyZXNob2xkcyA9IGMoNTAwLCAxMDAwKSkgICMgb2xkIHZlcnNpb24gb2Ygc2V1cmF0CmRyb3BsZXQgPC0gIHN1YnNldChkcm9wbGV0LCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiA1MDAgJiBuQ291bnRfUk5BID4gMTAwMCkKZHJvcGxldCA8LSBOb3JtYWxpemVEYXRhKGRyb3BsZXQsIHZlcmJvc2UgPSBGQUxTRSkKZHJvcGxldCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhkcm9wbGV0LCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCmRyb3BsZXQgPC0gU2NhbGVEYXRhKGRyb3BsZXQsIHZlcmJvc2UgPSBGQUxTRSkKI2Ryb3BsZXQgPC0gUnVuUENBKGRyb3BsZXQsIG5wY3MgPSAxMCwgdmVyYm9zZSA9IEZBTFNFKQpkcm9wbGV0JHN0aW0gPC0gImRyb3BsZXQiCmRyb3BsZXQkY29uZCA8LSAiY3RybCIKIyBkcm9wbGV0IDwtIFNjYWxlRGF0YShkcm9wbGV0LCB2ZXJib3NlID0gRkFMU0UpCiBkcm9wbGV0IDwtIFJ1blBDQShkcm9wbGV0LCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKIGRyb3BsZXQgPC0gUnVuVU1BUChkcm9wbGV0LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCiBkcm9wbGV0IDwtIEZpbmROZWlnaGJvcnMoZHJvcGxldCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjEwKQogZHJvcGxldCA8LSBGaW5kQ2x1c3RlcnMoZHJvcGxldCwgcmVzb2x1dGlvbiA9IDAuNSApICAgCiBwMTwtIFVNQVBQbG90KGRyb3BsZXQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2hhbm5lbCIsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NSkKIHAyIDwtIFVNQVBQbG90KGRyb3BsZXQsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NikKIHAzPC0gVU1BUFBsb3QoZHJvcGxldCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJtb3VzZS5zZXgiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCgpyZXMudXNlZCA8LSAxCiNkcm9wbGV0IDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSBkcm9wbGV0LCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIHJlc29sdXRpb24gPSByZXMudXNlZCwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFLCBmb3JjZS5yZWNhbGMgPSBUUlVFKQoKZHJvcGxldCA8LSBSdW5UU05FKG9iamVjdCA9IGRyb3BsZXQsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCkKVFNORVBsb3Qob2JqZWN0ID0gZHJvcGxldCwgZG8ubGFiZWwgPSBULCBwdC5zaXplID0gMS4yLCBsYWJlbC5zaXplID0gNCkKCgpkcm9wbGV0IDwtIFJlbmFtZUlkZW50cyhkcm9wbGV0LCBgMGAgPSAiSGVwLU1pZC1NIiwgYDFgID0gIkhlcC1QQy1GIiwgYDJgID0gIkhlcC1QUC1GIixgM2AgPSAiSGVwLVBQLU0iLCBgNGAgPSAiSGVwLU1pZC1NIiwgYDVgID0gIkhlcC1QQy1NIiwgYDZgID0gIkhlcC1NaWQtRiIsIGA3YCA9ICJIZXAtTWlkLUYiLCBgOGAgPSAiRW5kby1GIiwgYDlgID0gIkJpbGVkdWN0LUYiKQoKCgojIyMgdGhpcyBpcyB0cmFuZm9ybWF0aW9uIG9wdGlvbiBmb3IgZGV2ZWxwbWVudCBTQ3RyYW5zZm9ybSBwcm9ncmFtICMjIyMjIyMKZHJvcGxldCA8LSBTQ1RyYW5zZm9ybShkcm9wbGV0LHZlcmJvc2UgPVRSVUUpCgoKIyMjIyMjMyBTbWFydHNlcSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpwbGF0ZV9tZXRhZGF0YSA8LSByZWFkLmNzdigiL3Jlc3RyaWN0ZWQvcHJvamVjdG5iL3dheG1hbmxhYi9ra2Fycmkvc2NSTkFzZXFfZGF0YV9pbnRlZ3JhdGlvbi9MaXZlcl9mYWNzX2Fubm90YXRpb24uY3N2Iiwgc2VwPSIsIiwgIGhlYWRlciA9IFRSVUUpCmNvbG5hbWVzKHBsYXRlX21ldGFkYXRhKVsxXSA8LSAicGxhdGUuYmFyY29kZSIKICAKcmF3LmRhdGEgPSByZWFkLmNzdigiL3Jlc3RyaWN0ZWQvcHJvamVjdG5iL3dheG1hbmxhYi9ra2Fycmkvc2NSTkFzZXFfZGF0YV9pbnRlZ3JhdGlvbi9saXZlcl9mYWNzX3Njcm5hX2RhdGEuY3N2Iiwgc2VwPSIsIiwgcm93Lm5hbWVzPTEpCmNvbG5hbWVzKHBsYXRlX21ldGFkYXRhKVsxXSA8LSAicGxhdGUuYmFyY29kZSIKICAKcGxhdGUuYmFyY29kZXMgPSBsYXBwbHkoY29sbmFtZXMocmF3LmRhdGEpLCBmdW5jdGlvbih4KSBzdHJzcGxpdChzdHJzcGxpdCh4LCAiXyIpW1sxXV1bMV0sICcuJywgZml4ZWQ9VFJVRSlbWzFdXVsyXSkKCiAgYmFyY29kZS5kZiA9IHQuZGF0YS5mcmFtZShhcy5kYXRhLmZyYW1lKHBsYXRlLmJhcmNvZGVzKSkKICAKICByb3duYW1lcyhiYXJjb2RlLmRmKSA9IGNvbG5hbWVzKHJhdy5kYXRhKQogIGJhcmNvZGUuZGY9IGNiaW5kKGJhcmNvZGUuZGYsIGNvbG5hbWVzKHJhdy5kYXRhKSkKICBjb2xuYW1lcyhiYXJjb2RlLmRmKSA9IGMoJ3BsYXRlLmJhcmNvZGUxJywgJ3BsYXRlLmJhcmNvZGUnKQogIAogIHJuYW1lcyA9IHJvdy5uYW1lcyhiYXJjb2RlLmRmKQogIG1ldGEuZGF0YSA8LSBtZXJnZShiYXJjb2RlLmRmLCBwbGF0ZV9tZXRhZGF0YSwgYnk9J3BsYXRlLmJhcmNvZGUnLCBzb3J0ID0gRikKICByb3cubmFtZXMobWV0YS5kYXRhKSA8LSBybmFtZXMKICAgIAogICMgU29ydCBjZWxscyBieSBjZWxsIG5hbWUKICBtZXRhLmRhdGEgPSBtZXRhLmRhdGFbb3JkZXIocm93bmFtZXMobWV0YS5kYXRhKSksIF0KICByYXcuZGF0YSA9IHJhdy5kYXRhWyxyb3duYW1lcyhtZXRhLmRhdGEpXQogIAogICMgQ3JlYXRlIHRoZSBTZXVyYXQgb2JqZWN0IHdpdGggYWxsIHRoZSBkYXRhCiAgc21hcnRzZXEgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KHJhdy5kYXRhKQogIHNtYXJ0c2VxIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IHNtYXJ0c2VxLCBtZXRhLmRhdGEpCiAgI3NtYXJ0c2VxQG1ldGEuZGF0YSR0ZWNoIDwtICJzbWFydHNlcSIKICBzbWFydHNlcSRzdGltIDwtICJzbWFydHNlcSIKICBzbWFydHNlcSRjb25kIDwtICJjdHJsIgojc21hcnRzZXEgPC0gU3Vic2V0RGF0YShzbWFydHNlcSxzdWJzZXQubmFtZXMgPSBjKCJuR2VuZSIsICJuVU1JIiksbG93LnRocmVzaG9sZHMgPSBjKDUwMCwgMTAwMCkpICAjb2xkIHZlcnNpb24gb2Ygc2V1cmF0CnNtYXJ0c2VxPC0gIHN1YnNldChzbWFydHNlcSwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDEwMDApCiNzbWFydHNlcSA8LSBTQ1RyYW5zZm9ybShzbWFydHNlcSkKc21hcnRzZXEgPC0gTm9ybWFsaXplRGF0YShzbWFydHNlcSwgdmVyYm9zZSA9IEZBTFNFKQpzbWFydHNlcSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhzbWFydHNlcSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQpzbWFydHNlcSA8LSBTY2FsZURhdGEoc21hcnRzZXEsIHZlcmJvc2UgPSBGQUxTRSkKc21hcnRzZXEgPC0gUnVuUENBKHNtYXJ0c2VxLCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKc21hcnRzZXEgPC0gUnVuVU1BUChzbWFydHNlcSwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjI1KQpzbWFydHNlcSA8LSBGaW5kTmVpZ2hib3JzKHNtYXJ0c2VxLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjUpCnNtYXJ0c2VxIDwtIEZpbmRDbHVzdGVycyhzbWFydHNlcSwgcmVzb2x1dGlvbiA9IDAuNSApICAgCiNwNDwtIFVNQVBQbG90KHNtYXJ0c2VxLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImNoYW5uZWwiLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTUpCnA1IDwtIFVNQVBQbG90KHNtYXJ0c2VxLCBsYWJlbD1UUlVFLCBsYWJlbC5zaXplPTYpCnA2PC0gVU1BUFBsb3Qoc21hcnRzZXEsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAibW91c2Uuc2V4IiwgbGFiZWw9VFJVRSwgbGFiZWwuc2l6ZT01KQoKIyMjIyMjIyMjIyBzY3RyYW5zZm9ybSAjIyMjIyMjIyMjIyMjIyMjIyMjMwpzbWFydHNlcSA8LSBTQ1RyYW5zZm9ybShzbWFydHNlcSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSW50ZWdyYXRpb24gUmVndWxhciB3b3JrZmxvdyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IGMoZHJvcGxldC5saXN0LCBzbWFydHNlcS5saXN0LEcxNzFCLmxpc3QsIEcxNzIuTTEubGlzdCwgRzE3Mi5NMi5saXN0KSwgZGltcyA9IDE6NTAsIGFuY2hvci5mZWF0dXJlcyA9IDMwMDApCmNvbWJpbmVkIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gYW5jaG9ycywgZGltcyA9IDE6NTApICAgIAoKRGVmYXVsdEFzc2F5KGNvbWJpbmVkKSA8LSAiaW50ZWdyYXRlZCIKIyBSdW4gdGhlIHN0YW5kYXJkIHdvcmtmbG93IGZvciB2aXN1YWxpemF0aW9uIGFuZCBjbHVzdGVyaW5nCmNvbWJpbmVkIDwtIFNjYWxlRGF0YShjb21iaW5lZCwgdmVyYm9zZSA9IEZBTFNFKQpjb21iaW5lZCA8LSBSdW5QQ0EoY29tYmluZWQsIG5wY3MgPSAzMCwgdmVyYm9zZSA9IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMgdC1TTkUgYW5kIENsdXN0ZXJpbmcKY29tYmluZWQgPC0gUnVuVU1BUChjb21iaW5lZCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwKQpjb21iaW5lZCA8LSBGaW5kTmVpZ2hib3JzKGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCmNvbWJpbmVkIDwtIEZpbmRDbHVzdGVycyhjb21iaW5lZCwgcmVzb2x1dGlvbiA9IDAuNSApICAgCiNjb21iaW5lZCA8LSBSdW5UU05FKGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCiAgICAKICMgVmlzdWFsaXphdGlvbgpwMSA8LSBEaW1QbG90KGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gInN0aW0iKQpwMiA8LSBEaW1QbG90KGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIm1vdXNlLnNleCIpCnAzIDwtIERpbVBsb3QoY29tYmluZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFKQpwNCA8LSBVTUFQUGxvdChjb21iaW5lZCwgbGFiZWw9VFJVRSkKcGxvdF9ncmlkKHAyLCBwMyxwNCkgCkRpbVBsb3QoY29tYmluZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgc3BsaXQuYnkgPSAic3RpbSIpICAgCgpwNSA8LSBEaW1QbG90KGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAidHNuZSIsIGdyb3VwLmJ5ID0gInN0aW0iKQpwNiA8LSBEaW1QbG90KGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAidHNuZSIsIGdyb3VwLmJ5ID0gIm1vdXNlLnNleCIpCnA3IDwtIERpbVBsb3QoY29tYmluZWQsIHJlZHVjdGlvbiA9ICJ0c25lIiwgbGFiZWwgPSBUUlVFKQpwOCA8LSBUU05FUGxvdChjb21iaW5lZCwgbGFiZWwgPVQpCnBsb3RfZ3JpZChwNiwgcDcscDgpIApEaW1QbG90KGNvbWJpbmVkLCByZWR1Y3Rpb24gPSAidHNuZSIsIHNwbGl0LmJ5ID0gInN0aW0iKSAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSZWZlcm5jZSBiYXNlZCBJbnRlZ3JhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkcm9wbGV0Lmxpc3QgPC0gU3BsaXRPYmplY3QoZHJvcGxldCwgc3BsaXQuYnkgPSAibW91c2Uuc2V4IikKc21hcnRzZXEubGlzdCA8LSBTcGxpdE9iamVjdChzbWFydHNlcSwgc3BsaXQuYnkgPSAic3RpbSIpCkcxNzIuTTEubGlzdCA8LSBTcGxpdE9iamVjdChHMTcyLk0xLCBzcGxpdC5ieSA9ICJzdGltIikKRzE3Mi5NMi5saXN0IDwtIFNwbGl0T2JqZWN0KEcxNzIuTTIsIHNwbGl0LmJ5ID0gInN0aW0iKQpHMTcyLk02Lmxpc3QgPC0gU3BsaXRPYmplY3QoRzE3Mi5NNiwgc3BsaXQuYnkgPSAic3RpbSIpCkcxNzFCLmxpc3QgPC0gU3BsaXRPYmplY3QoRzE3MUIsIHNwbGl0LmJ5PSJzdGltIikKY3RybC5saXN0MSA8LSBjKGRyb3BsZXQubGlzdCkKY3RybC5saXN0IDwtIGMoZHJvcGxldC5saXN0LCBzbWFydHNlcS5saXN0KQoKZm9yIChpIGluIG5hbWVzKGN0cmwubGlzdCkpIHsKICAgIGN0cmwubGlzdFtbaV1dIDwtIFNDVHJhbnNmb3JtKGN0cmwubGlzdFtbaV1dLCB2ZXJib3NlID1UUlVFKQp9CgpjdHJsLmxpc3QxIDwtIGMoY3RybC5saXN0LCBHMTcxQi5saXN0KQojZGltcyA9IDE6NTAKcmVmLmZlYXR1cmVzIDwtIFNlbGVjdEludGVncmF0aW9uRmVhdHVyZXMob2JqZWN0Lmxpc3QgPSBjdHJsLmxpc3QxLCBkaW1zPTE6NTAsIGFuY2hvci5mZWF0dXJlcyA9IDMwMDApCnJlZi5saXN0IDwtIFByZXBTQ1RJbnRlZ3JhdGlvbihvYmplY3QubGlzdCA9IGN0cmwubGlzdDEsIGFuY2hvci5mZWF0dXJlcyA9IHJlZi5mZWF0dXJlcykKcmVmLmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHJlZi5saXN0LCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJTQ1QiLCBhbmNob3IuZmVhdHVyZXMgPSByZWYuZmVhdHVyZXMsIHJlZmVyZW5jZSA9IGMoMSwyLDMpKQpyZWYuaW50ZWdyYXRlZCA8LSBJbnRlZ3JhdGVEYXRhKGFuY2hvcnNldCA9IHJlZi5hbmNob3JzLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJTQ1QiKQoKRGVmYXVsdEFzc2F5KHJlZi5pbnRlZ3JhdGVkKSA8LSAiaW50ZWdyYXRlZCIKcmVmLmludGVncmF0ZWQgPC0gU2NhbGVEYXRhKHJlZi5pbnRlZ3JhdGVkLCB2ZXJib3NlID0gRkFMU0UpCnJlZi5pbnRlZ3JhdGVkIDwtIFJ1blBDQShvYmplY3QgPSByZWYuaW50ZWdyYXRlZCwgbnBjcz0zMCx2ZXJib3NlID0gRkFMU0UpCnJlZi5pbnRlZ3JhdGVkIDwtIFJ1blVNQVAob2JqZWN0ID0gcmVmLmludGVncmF0ZWQgLGRpbXMgPSAxOjMwLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwKQpyZWYuaW50ZWdyYXRlZCA8LSBGaW5kTmVpZ2hib3JzKHJlZi5pbnRlZ3JhdGVkLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MzApCnJlZi5pbnRlZ3JhdGVkIDwtIEZpbmRDbHVzdGVycyhyZWYuaW50ZWdyYXRlZCwgcmVzb2x1dGlvbiA9IDAuMiApICAgCgpyMSA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZCwgc3BsaXQuYnk9InN0aW0iKQpyMiA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZCwgbGFiZWw9VFJVRSkKcjMgPC0gVU1BUFBsb3QocmVmLmludGVncmF0ZWQsIHNwbGl0LmJ5ID0gYygibW91c2Uuc2V4IikpCgoKcGxvdHMgPC0gbGFwcGx5KFggPSBwbG90cywgRlVOID0gZnVuY3Rpb24oeCkgeCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gNCwgCiAgICBieXJvdyA9IFRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDIuNSkpKSkKQ29tYmluZVBsb3RzKHBsb3RzKQoKCnJlZi5pbnRlZ3JhdGVkJGNlbGx0eXBlLnN0aW0gPC0gcGFzdGUoSWRlbnRzKHJlZi5pbnRlZ3JhdGVkKSwgcmVmLmludGVncmF0ZWQkc3RpbSwgc2VwID0gIl8iKQpyZWYuaW50ZWdyYXRlZCRzZXVyYXRfY2x1c3RlcnMgPC0gSWRlbnRzKHJlZi5pbnRlZ3JhdGVkKQpJZGVudHMocmVmLmludGVncmF0ZWQpIDwtICJjZWxsdHlwZS5zdGltIgoKZnAgPC0gRmVhdHVyZVBsb3QocmVmLmludGVncmF0ZWQsIGZlYXR1cmVzID0gIm5jUk5BLWFzLWNocjEwLTg0NjAiLCBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya3JlZCIpLCBvcmRlciA9IFRSVUUsICBzaGFwZS5ieSA9ICJzdGltIiwgcHQuc2l6ZSA9IDIpCgpEZWZhdWx0QXNzYXkocmVmLmludGVncmF0ZWQpIDwtIlJOQSIKcmVmLmludGVncmF0ZWQgPC0gTm9ybWFsaXplRGF0YShyZWYuaW50ZWdyYXRlZCkKcmVmLmludGVncmF0ZWQgPC0gU2NhbGVEYXRhKHJlZi5pbnRlZ3JhdGVkKQoKZG90MSA8LSBEb3RQbG90KHJlZi5pbnRlZ3JhdGVkLCBmZWF0dXJlcz0gYWxsX2dlbmVzKStSb3RhdGVkQXhpcygpCmQxIDwtIERvSGVhdG1hcChyZWYuaW50ZWdyYXRlZCwgZmVhdHVyZXMgPSBjKGFsbF9nZW5lcywiTXVwMjAiLCJYaXN0IiksIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIGFzc2F5PSAnUk5BJykKI2QxIDwtIERvSGVhdG1hcChyZWYuaW50ZWdyYXRlZCwgZmVhdHVyZXMgPSBoaWdoVFBNLCBncm91cC5ieSA9ICJjZWxsdHlwZS5zdGltIiwgYXNzYXk9ICdSTkEnLHJhc3RlciA9IEYsIGRpc3AubWF4ID0gMC41KStzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSAoUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG4gPSA5LCBuYW1lID0gIlB1UmQiKSkgKSArIGd1aWRlcyhjb2xvcj1GQUxTRSkKCgojIyMjIyMjIyMjIyMgbWVyZ2UgRzE3MiBNMSAjIyMjIyMjIyMjIyMjMzMKZHJvcGxldC5saXN0IDwtIFNwbGl0T2JqZWN0KGRyb3BsZXQsIHNwbGl0LmJ5ID0gIm1vdXNlLnNleCIpCnNtYXJ0c2VxLmxpc3QgPC0gU3BsaXRPYmplY3Qoc21hcnRzZXEsIHNwbGl0LmJ5ID0gInN0aW0iKQpHMTcyLk0xLmxpc3QgPC0gU3BsaXRPYmplY3QoRzE3Mi5NMSwgc3BsaXQuYnkgPSAic3RpbSIpCkcxNzIuTTIubGlzdCA8LSBTcGxpdE9iamVjdChHMTcyLk0yLCBzcGxpdC5ieSA9ICJzdGltIikKRzE3Mi5NNi5saXN0IDwtIFNwbGl0T2JqZWN0KEcxNzIuTTYsIHNwbGl0LmJ5ID0gInN0aW0iKQpHMTcxQi5saXN0IDwtIFNwbGl0T2JqZWN0KEcxNzFCLCBzcGxpdC5ieT0ic3RpbSIpCmN0cmwubGlzdC4yIDwtIGMoIEcxNzIuTTEubGlzdCwgRzE3Mi5NMi5saXN0KQpHMTcyLk0xLm1lcmdlLmxpc3QgPC0gU3BsaXRPYmplY3QoRzE3Mi5NMS5tZXJnZSwgc3BsaXQuYnkgPSAic3RpbSIpCkcxNzIuTTIubWVyZ2UubGlzdCA8LSBTcGxpdE9iamVjdChHMTcyLk0yLm1lcmdlLCBzcGxpdC5ieSA9ICJzdGltIikKCm1lcmdlZC5saXN0IDwtIGMoRzE3Mi5NMS5tZXJnZS5saXN0LCBHMTcyLk0yLm1lcmdlLmxpc3QpCgpmb3IgKGkgaW4gbmFtZXMoY3RybC5saXN0LjIpKSB7CiAgICBjdHJsLmxpc3QuMltbaV1dIDwtIFNDVHJhbnNmb3JtKGN0cmwubGlzdC4yW1tpXV0sIHZlcmJvc2UgPVRSVUUpCn0KCnJlZi5mZWF0dXJlcy4xIDwtIFNlbGVjdEludGVncmF0aW9uRmVhdHVyZXMob2JqZWN0Lmxpc3QgPSBjdHJsLmxpc3QuMiwgZGltcyA9IDE6NTAsIGFuY2hvci5mZWF0dXJlcyA9IDMwMDApCnJlZi5saXN0LjEgPC0gUHJlcFNDVEludGVncmF0aW9uKG9iamVjdC5saXN0ID0gY3RybC5saXN0LjIsIGFuY2hvci5mZWF0dXJlcyA9IHJlZi5mZWF0dXJlcy4xKQoKCnJlZi5hbmNob3JzLjEgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHJlZi5saXN0LjEsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlNDVCIsIAogICAgYW5jaG9yLmZlYXR1cmVzID0gcmVmLmZlYXR1cmVzLjEsIHJlZmVyZW5jZSA9IGMoMSwyKSkKcmVmLmludGVncmF0ZWQuMSA8LSBJbnRlZ3JhdGVEYXRhKGFuY2hvcnNldCA9IHJlZi5hbmNob3JzLjEsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlNDVCIpCgpEZWZhdWx0QXNzYXkocmVmLmludGVncmF0ZWQuMSkgPC0gImludGVncmF0ZWQiCnJlZi5pbnRlZ3JhdGVkLjEgPC0gU2NhbGVEYXRhKHJlZi5pbnRlZ3JhdGVkLjEsIHZlcmJvc2UgPSBGQUxTRSkKcmVmLmludGVncmF0ZWQuMSA8LSBSdW5QQ0Eob2JqZWN0ID0gcmVmLmludGVncmF0ZWQuMSwgbnBjcz0zMCx2ZXJib3NlID0gRkFMU0UpCnJlZi5pbnRlZ3JhdGVkLjEgPC0gUnVuVU1BUChvYmplY3QgPSByZWYuaW50ZWdyYXRlZC4xLCBkaW1zID0gMTozMCwgc2VlZC51c2UgPSAxMCAsIHBlcnBsZXhpdHk9MzApCiNyZWYuaW50ZWdyYXRlZC4xIDwtIFJ1blRTTkUob2JqZWN0ID0gcmVmLmludGVncmF0ZWQuMSwgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwKQpyZWYuaW50ZWdyYXRlZC4xIDwtIEZpbmROZWlnaGJvcnMocmVmLmludGVncmF0ZWQuMSwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpyZWYuaW50ZWdyYXRlZC4xIDwtIEZpbmRDbHVzdGVycyhyZWYuaW50ZWdyYXRlZC4xLCByZXNvbHV0aW9uID0gMC4yKSAgIAoKckcxNzJNMS4xIDwtIFVNQVBQbG90KHJlZi5pbnRlZ3JhdGVkLjEsIHNwbGl0LmJ5PSJzdGltIiwgbGFiZWw9VCkKckcxNzJNMS4yIDwtIFVNQVBQbG90KHJlZi5pbnRlZ3JhdGVkLjEsIGxhYmVsPVRSVUUsIGNvbWJpbmUgPSBGQUxTRSkKckcxNzJNMS4zIDwtIFVNQVBQbG90KHJlZi5pbnRlZ3JhdGVkLjEsIHNwbGl0LmJ5ID0gYygibW91c2Uuc2V4IikpCgpyRzE3Mk0xLjQgPC0gVFNORVBsb3QocmVmLmludGVncmF0ZWQuMSwgc3BsaXQuYnk9InN0aW0iKQoKCkRlZmF1bHRBc3NheShyZWYuaW50ZWdyYXRlZC4xKSA8LSJSTkEiCnJlZi5pbnRlZ3JhdGVkLjEgPC0gTm9ybWFsaXplRGF0YShyZWYuaW50ZWdyYXRlZC4xKQpyZWYuaW50ZWdyYXRlZC4xIDwtIFNjYWxlRGF0YShyZWYuaW50ZWdyYXRlZC4xKQoKRG9IZWF0bWFwKHJlZi5pbnRlZ3JhdGVkLjEsIGZlYXR1cmVzID0gYyhhbGxfZ2VuZXMsJ1NveDknLCdNdXAyMCcpLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBhc3NheT0gJ1JOQScgLHJhc3RlciA9IEYpK3NjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IChSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiUHVSZCIpKSApICsgZ3VpZGVzKGNvbG9yPUZBTFNFKQoKCnJlZi5pbnRlZ3JhdGVkLjEkY2VsbHR5cGUgPC0gUmVuYW1lSWRlbnRzKHJlZi5pbnRlZ3JhdGVkLjEsIGMoYDBgID0gIlBQIiwgYDFgID0gIlBDIiwgYDJgID0gIkVuZG8iLGAzYCA9ICJIU0MiLCBgNGAgPSAiS3VwZmZlciIsIGA1YCA9ICJEaXZpZGluZyIsIGA2YCA9ICJJbW11bmUiLCBgN2AgPSAiQi1OSyIsIGA4YCA9ICJOQSIpKQoKCnJlZi5pbnRlZ3JhdGVkLjEubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhyZWYuaW50ZWdyYXRlZC4xLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpyZWYuaW50ZWdyYXRlZC4xLm1hcmtlcnMgICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDIsIHd0ID0gYXZnX2xvZ0ZDKQoKd3JpdGUuY3N2KHJlZi5pbnRlZ3JhdGVkLjEubWFya2VycywgInJlZl9pbnRlZ3JhdGVkX0cxNzJNMS1NMl9BbGxtYXJrZXIiKQoKcmVmLmludGVncmF0ZWQuMSRjZWxsdHlwZS5zdGltIDwtIHBhc3RlKElkZW50cyhyZWYuaW50ZWdyYXRlZC4xKSwgcmVmLmludGVncmF0ZWQuMSRzdGltLCBzZXAgPSAiXyIpCnJlZi5pbnRlZ3JhdGVkLjEkY2VsbHR5cGUgPC0gSWRlbnRzKHJlZi5pbnRlZ3JhdGVkLjEpCklkZW50cyhyZWYuaW50ZWdyYXRlZC4xKSA8LSAiY2VsbHR5cGUuc3RpbSIKCkRvSGVhdG1hcChyZWYuaW50ZWdyYXRlZC4xLCBmZWF0dXJlcyA9IFRQTTQsIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIGFzc2F5PSAnUk5BJyApCgpyZWYuaW50ZWdyYXRlZC4xLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMocmVmLmludGVncmF0ZWQuMSwgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKcmVmLmludGVncmF0ZWQuMS5tYXJrZXJzICAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG4gPSAyLCB3dCA9IGF2Z19sb2dGQykKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzMKCmZvciAoaSBpbiBuYW1lcyhtZXJnZWQubGlzdCkpIHsKICAgIG1lcmdlZC5saXN0W1tpXV0gPC0gU0NUcmFuc2Zvcm0obWVyZ2VkLmxpc3RbW2ldXSwgdmVyYm9zZSA9VFJVRSkKfQpyZWYuZmVhdHVyZXMuMiA8LSBTZWxlY3RJbnRlZ3JhdGlvbkZlYXR1cmVzKG9iamVjdC5saXN0ID0gbWVyZ2VkLmxpc3QsIGRpbXMgPSAxOjUwLCBhbmNob3IuZmVhdHVyZXMgPSAzMDAwKQpyZWYubGlzdC4yIDwtIFByZXBTQ1RJbnRlZ3JhdGlvbihvYmplY3QubGlzdCA9IG1lcmdlZC5saXN0LCBhbmNob3IuZmVhdHVyZXMgPSByZWYuZmVhdHVyZXMuMikKCgpyZWYuYW5jaG9ycy4yIDwtIEZpbmRJbnRlZ3JhdGlvbkFuY2hvcnMob2JqZWN0Lmxpc3QgPSByZWYubGlzdC4yLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJTQ1QiLCAKICAgIGFuY2hvci5mZWF0dXJlcyA9IHJlZi5mZWF0dXJlcy4yLCByZWZlcmVuY2UgPSAxKQpyZWYuaW50ZWdyYXRlZC4yIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gcmVmLmFuY2hvcnMuMiwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiU0NUIikKCkRlZmF1bHRBc3NheShyZWYuaW50ZWdyYXRlZC4yKSA8LSAiaW50ZWdyYXRlZCIKcmVmLmludGVncmF0ZWQuMiA8LSBTY2FsZURhdGEocmVmLmludGVncmF0ZWQuMiwgdmVyYm9zZSA9IEZBTFNFKQpyZWYuaW50ZWdyYXRlZC4yIDwtIFJ1blBDQShvYmplY3QgPSByZWYuaW50ZWdyYXRlZC4yLCBucGNzPTMwLHZlcmJvc2UgPSBGQUxTRSkKcmVmLmludGVncmF0ZWQuMiA8LSBSdW5VTUFQKG9iamVjdCA9IHJlZi5pbnRlZ3JhdGVkLjIsIGRpbXMgPSAxOjMwLCBzZWVkLnVzZSA9IDEwICwgcGVycGxleGl0eT0zMCkKcmVmLmludGVncmF0ZWQuMiA8LSBSdW5UU05FKG9iamVjdCA9IHJlZi5pbnRlZ3JhdGVkLjIsIGRpbXMudXNlID0gMTozMCwgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCkKcmVmLmludGVncmF0ZWQuMiA8LSBGaW5kTmVpZ2hib3JzKHJlZi5pbnRlZ3JhdGVkLjIsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKcmVmLmludGVncmF0ZWQuMiA8LSBGaW5kQ2x1c3RlcnMocmVmLmludGVncmF0ZWQuMiwgcmVzb2x1dGlvbiA9IDAuNSkgICAKCnJHMTcyTTEuMSA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZC4yLCBzcGxpdC5ieT0ic3RpbSIsIGxhYmVsPVQpCnJHMTcyTTEuMiA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZC4yLCBsYWJlbD1UUlVFKQpyRzE3Mk0xLjMgPC0gVFNORVBsb3QocmVmLmludGVncmF0ZWQuMiwgc3BsaXQuYnk9InN0aW0iKQpyRzE3Mk0xLjQgPC0gVFNORVBsb3QocmVmLmludGVncmF0ZWQuMiwgbGFiZWw9VFJVRSkKCgpEZWZhdWx0QXNzYXkocmVmLmludGVncmF0ZWQuMikgPC0iUk5BIgpyZWYuaW50ZWdyYXRlZC4yIDwtIE5vcm1hbGl6ZURhdGEocmVmLmludGVncmF0ZWQuMikKcmVmLmludGVncmF0ZWQuMiA8LSBTY2FsZURhdGEocmVmLmludGVncmF0ZWQuMikKZDMgPC0gRG90UGxvdChyZWYuaW50ZWdyYXRlZC4yLCBmZWF0dXJlcyA9IGFsbF9nZW5lcykrIFJvdGF0ZWRBeGlzKCkKcGxvdF9ncmlkKHJHMTcyTTEuMixyRzE3Mk0xLjEgLGQzKQoKCmBgYAoKYGBge3J9CkcxNzIuTTEubGlzdCA8LSBTcGxpdE9iamVjdChHMTcyLk0xLmJvdGgsIHNwbGl0LmJ5ID0gInN0aW0iKQpHMTcyLk0zLmxpc3QgPC0gU3BsaXRPYmplY3QoRzE3Mi5NMy5ib3RoLCBzcGxpdC5ieSA9ICJzdGltIikKbWVyZ2VkLmxpc3QgPC0gYyhHMTcyLk0xLmxpc3QsIEcxNzIuTTMubGlzdCkKCmZvciAoaSBpbiBuYW1lcyhtZXJnZWQubGlzdCkpIHsKICAgbWVyZ2VkLmxpc3RbW2ldXSA8LSBTQ1RyYW5zZm9ybShtZXJnZWQubGlzdFtbaV1dLCB2ZXJib3NlID1UUlVFKQp9CgpyZWYuZmVhdHVyZXMuMSA8LSBTZWxlY3RJbnRlZ3JhdGlvbkZlYXR1cmVzKG9iamVjdC5saXN0ID0gbWVyZ2VkLmxpc3QsIGRpbXMgPSAxOjUwLCBhbmNob3IuZmVhdHVyZXMgPSAyMDAwKQpyZWYubGlzdC4xIDwtIFByZXBTQ1RJbnRlZ3JhdGlvbihvYmplY3QubGlzdCA9IG1lcmdlZC5saXN0LCBhbmNob3IuZmVhdHVyZXMgPSByZWYuZmVhdHVyZXMuMSkKCnJlZi5hbmNob3JzLjEgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHJlZi5saXN0LjEsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlNDVCIsIAogICAgYW5jaG9yLmZlYXR1cmVzID0gcmVmLmZlYXR1cmVzLjEpCnJlZi5pbnRlZ3JhdGVkLjEgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSByZWYuYW5jaG9ycy4xLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJTQ1QiKQoKRGVmYXVsdEFzc2F5KHJlZi5pbnRlZ3JhdGVkLjEpIDwtICJpbnRlZ3JhdGVkIgpyZWYuaW50ZWdyYXRlZC4xIDwtIFNjYWxlRGF0YShyZWYuaW50ZWdyYXRlZC4xLCB2ZXJib3NlID0gRkFMU0UpCnJlZi5pbnRlZ3JhdGVkLjEgPC0gUnVuUENBKG9iamVjdCA9IHJlZi5pbnRlZ3JhdGVkLjEsIG5wY3M9MzAsdmVyYm9zZSA9IEZBTFNFKQpyZWYuaW50ZWdyYXRlZC4xIDwtIFJ1blVNQVAob2JqZWN0ID0gcmVmLmludGVncmF0ZWQuMSwgZGltcyA9IDE6MzAsIHNlZWQudXNlID0gMTAgLCBwZXJwbGV4aXR5PTMwKQojcmVmLmludGVncmF0ZWQuMSA8LSBSdW5UU05FKG9iamVjdCA9IHJlZi5pbnRlZ3JhdGVkLjEsIGRpbXMudXNlID0gMTpuLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT0zMCkKcmVmLmludGVncmF0ZWQuMSA8LSBGaW5kTmVpZ2hib3JzKHJlZi5pbnRlZ3JhdGVkLjEsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKcmVmLmludGVncmF0ZWQuMSA8LSBGaW5kQ2x1c3RlcnMocmVmLmludGVncmF0ZWQuMSwgcmVzb2x1dGlvbiA9IDAuMikgICAKCnJHMTcyTTEuMSA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZC4xLCBncm91cC5ieT0ic3RpbSIpCnJHMTcyTTEuMiA8LSBVTUFQUGxvdChyZWYuaW50ZWdyYXRlZC4xLCBsYWJlbD1UUlVFKQojckcxNzJNMS40IDwtIFRTTkVQbG90KHJlZi5pbnRlZ3JhdGVkLjEsIHNwbGl0LmJ5PSJzdGltIikKCkRlZmF1bHRBc3NheShyZWYuaW50ZWdyYXRlZC4xKSA8LSJSTkEiCnJlZi5pbnRlZ3JhdGVkLjEgPC0gTm9ybWFsaXplRGF0YShyZWYuaW50ZWdyYXRlZC4xKQpyZWYuaW50ZWdyYXRlZC4xIDwtIFNjYWxlRGF0YShyZWYuaW50ZWdyYXRlZC4xKQpkMyA8LSBEb3RQbG90KHJlZi5pbnRlZ3JhdGVkLjEsIGZlYXR1cmVzID0gYWxsX2dlbmVzKSsgUm90YXRlZEF4aXMoKQpwbG90X2dyaWQockcxNzJNMS4yLHJHMTcyTTEuMSAsZDMpCgojIyMjIyMjIyMjMyB1c2UgdGhlIHN0YW5kYXIgaW50ZWdyYXRpb24gd29ya2Zsb3cgIyMjIyMjIyMjIyMjIyMjIyMjCmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IG1lcmdlZC5saXN0LCBkaW1zID0gMTo1MCwgYW5jaG9yLmZlYXR1cmVzID0gMjAwMCkKI2FuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IGxpc3QobG5jNTk5OCwgZHJvcGxldDEpLCBkaW1zID0gMTo1MCwgYW5jaG9yLmZlYXR1cmVzID0gMzAwMCkKY29tYmluZWQgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBhbmNob3JzLCBkaW1zID0gMTo1MCkgICAgCkRlZmF1bHRBc3NheShjb21iaW5lZCkgPC0gImludGVncmF0ZWQiCiMgUnVuIHRoZSBzdGFuZGFyZCB3b3JrZmxvdyBmb3IgdmlzdWFsaXphdGlvbiBhbmQgY2x1c3RlcmluZwpjb21iaW5lZCA8LSBTY2FsZURhdGEoY29tYmluZWQsIHZlcmJvc2UgPSBGQUxTRSkKY29tYmluZWQgPC0gUnVuUENBKGNvbWJpbmVkLCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAojIHQtU05FIGFuZCBDbHVzdGVyaW5nCmNvbWJpbmVkIDwtIFJ1blVNQVAoY29tYmluZWQsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKY29tYmluZWQgPC0gRmluZE5laWdoYm9ycyhjb21iaW5lZCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpjb21iaW5lZCA8LSBGaW5kQ2x1c3RlcnMoY29tYmluZWQsIHJlc29sdXRpb24gPSAwLjIgKSAgIAoKICMgVmlzdWFsaXphdGlvbgpwMSA8LSBVTUFQUGxvdChjb21iaW5lZCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJzdGltIikKcDQgPC0gVU1BUFBsb3QoY29tYmluZWQsIGxhYmVsPVRSVUUsIGxhYmVsLnNpemU9NikKCkRlZmF1bHRBc3NheShjb21iaW5lZCkgPC0iUk5BIgpjb21iaW5lZCA8LSBOb3JtYWxpemVEYXRhKGNvbWJpbmVkKQpjb21iaW5lZCA8LSBTY2FsZURhdGEoY29tYmluZWQpCmQzIDwtIERvdFBsb3QoY29tYmluZWQsIGZlYXR1cmVzID0gYWxsX2dlbmVzKSsgUm90YXRlZEF4aXMoKQpwbG90X2dyaWQocDEscDQgLGQzKQoKYGBgCgoKRzE3Mk0xIGFuZCBHMTcyIE0yIERFIGFuYWx5c2lzCmBgYHtyfQoKREUxLjEgPC0gRmluZE1hcmtlcnMocmVmLmludGVncmF0ZWQuMSwgaWRlbnQuMSA9IGMoIjBfRzE3Mk0xIiAsIjFfRzE3Mk0xIiwgIjJfRzE3Mk0xIiAsIjNfRzE3Mk0xIiAsIjRfRzE3Mk0xIiAsIjVfRzE3Mk0xIiAsIjZfRzE3Mk0xIiwiN19HMTcyTTEiLCAiOF9HMTcyTTEiKSwgaWRlbnQuMiA9IGMoIjBfRzE3Mk0yIiAsIjFfRzE3Mk0yIiwgIjJfRzE3Mk0yIiAsIjNfRzE3Mk0yIiAsIjRfRzE3Mk0yIiAsIjVfRzE3Mk0yIiAsIjZfRzE3Mk0yIiwiN19HMTcyTTIiLCAiOF9HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKREVfQWxsX00xX00yIDwtIERFMS4xIAp3cml0ZS5jc3YoREVfQWxsX00xX00yLCAiL25ldC93YXhtYW4tc2VydmVyL21udC9kYXRhL3dheG1hbmxhYnZtX2hvbWUva2thcnJpL0cxNzIvYW5hbHlzaXMvbWFya2VyL0RFX0cxNzJfQWxsX00xX00yIikKREVfaGVwX05QQyA8LSBGaW5kTWFya2VycyhyZWYuaW50ZWdyYXRlZC4xLCBpZGVudC4xID0gYygiMF9HMTcyTTIiICwiMV9HMTcyTTIiKSwgaWRlbnQuMiA9IGMoIjJfRzE3Mk0yIiAsIjNfRzE3Mk0yIiAsIjRfRzE3Mk0yIiAsIjVfRzE3Mk0yIiAsIjZfRzE3Mk0yIiwiN19HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKREVfTlBDX00xX00yIDwtIEZpbmRNYXJrZXJzKHJlZi5pbnRlZ3JhdGVkLjEsIGlkZW50LjEgPSBjKCAiMl9HMTcyTTEiICwiM19HMTcyTTEiICwiNF9HMTcyTTEiICwiNV9HMTcyTTEiICwiNl9HMTcyTTEiLCI3X0cxNzJNMSIpLCBpZGVudC4yID0gYygiMl9HMTcyTTIiICwiM19HMTcyTTIiICwiNF9HMTcyTTIiICwiNV9HMTcyTTIiICwiNl9HMTcyTTIiLCI3X0cxNzJNMiIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgpERV9IZXAwLjFfTlBDX00yIDwtIEZpbmRNYXJrZXJzKHJlZi5pbnRlZ3JhdGVkLjEsIGlkZW50LjEgPSBjKCAiMF9HMTcyTTIiICwiMV9HMTcyTTIiKSwgaWRlbnQuMiA9IGMoIjJfRzE3Mk0yIiAsIjNfRzE3Mk0yIiAsIjRfRzE3Mk0yIiAsIjVfRzE3Mk0yIiAsIjZfRzE3Mk0yIiwiN19HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKd3JpdGUuY3N2KERFX0hlcDAuMV9OUENfTTIsICJHMTcyX21hcmtlcnMvREVfSGVwMDFfTlBDX00yIikKCkRFMC4xIDwtIEZpbmRNYXJrZXJzKHJlZi5pbnRlZ3JhdGVkLjEsIGlkZW50LjEgPSBjKCIwX0cxNzJNMSIpLCBpZGVudC4yID0gYygiMF9HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKREUxLjEgPC0gRmluZE1hcmtlcnMocmVmLmludGVncmF0ZWQuMSwgaWRlbnQuMSA9IGMoIjFfRzE3Mk0xIiksIGlkZW50LjIgPSBjKCIxX0cxNzJNMiIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgpERTIuMSA8LSBGaW5kTWFya2VycyhyZWYuaW50ZWdyYXRlZC4xLCBpZGVudC4xID0gYygiMl9HMTcyTTEiKSwgaWRlbnQuMiA9IGMoIjJfRzE3Mk0yIiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCkRFMy4xIDwtIEZpbmRNYXJrZXJzKHJlZi5pbnRlZ3JhdGVkLjEsIGlkZW50LjEgPSBjKCIzX0cxNzJNMSIpLCBpZGVudC4yID0gYygiM19HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKREU0LjEgPC0gRmluZE1hcmtlcnMocmVmLmludGVncmF0ZWQuMSwgaWRlbnQuMSA9IGMoIjRfRzE3Mk0xIiksIGlkZW50LjIgPSBjKCI0X0cxNzJNMiIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgpERTUuMSA8LSBGaW5kTWFya2VycyhyZWYuaW50ZWdyYXRlZC4xLCBpZGVudC4xID0gYygiNV9HMTcyTTEiKSwgaWRlbnQuMiA9IGMoIjVfRzE3Mk0yIiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCkRFNi4xIDwtIEZpbmRNYXJrZXJzKHJlZi5pbnRlZ3JhdGVkLjEsIGlkZW50LjEgPSBjKCI2X0cxNzJNMSIpLCBpZGVudC4yID0gYygiNl9HMTcyTTIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKREU3LjEgPC0gRmluZE1hcmtlcnMocmVmLmludGVncmF0ZWQuMSwgaWRlbnQuMSA9IGMoIjdfRzE3Mk0xIiksIGlkZW50LjIgPSBjKCI3X0cxNzJNMiIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgpERTAuMSA8LSBGaW5kTWFya2VycyhyZWYuaW50ZWdyYXRlZC4xLCBpZGVudC4xID0gYygiMF9HMTcyTTEiKSwgaWRlbnQuMiA9IGMoIjBfRzE3Mk0yIiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKYGBgCgoKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyBHMTcxIFRDUE8gZXhwc29zZWQgIyMjIyMjIyMKRzE3MUJfbWV0YWRhdGFfRzE3MUIgPC0gcmVhZC5jc3YoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcxL0FuYWx5c2lzL0cxNzFfbWV0YWRhdGFfZHJvcGxldF9saXZlci5jc3YiLCBzZXA9IiwiLCBoZWFkZXIgPSBUUlVFKQpjb2xuYW1lcyhHMTcxQl9tZXRhZGF0YV9HMTcxQilbMV0gPC0gImNoYW5uZWwiCnRpc3N1ZV9tZXRhZGF0YV9HMTcxQiA9IGZpbHRlcihHMTcxQl9tZXRhZGF0YV9HMTcxQiwgdGlzc3VlID09IHRpc3N1ZV9vZl9pbnRlcmVzdClbLGMoJ2NoYW5uZWwnLCd0aXNzdWUnLCdzdWJ0aXNzdWUnLCdtb3VzZS5zZXgnLCAnbW91c2UuaWQnKV0KCnJhdy5kYXRhIDwtIFJlYWQxMFgoIi9uZXQvd2F4bWFuLXNlcnZlci9tbnQvZGF0YS93YXhtYW5sYWJ2bV9ob21lL2trYXJyaS9HMTcxL0FuYWx5c2lzL1RyYW5zY3JpcHRfUmVmaW5lZC9MaXZlci0xMFhfRzE3MUIvIikKY29sbmFtZXMocmF3LmRhdGEpIDwtIGxhcHBseShjb2xuYW1lcyhyYXcuZGF0YSksIGZ1bmN0aW9uKHgpIHBhc3RlMCh0aXNzdWVfbWV0YWRhdGFfRzE3MUIkY2hhbm5lbFsxXSwnXycseCkpCiAgbWV0YS5kYXRhMSA9IGRhdGEuZnJhbWUocm93Lm5hbWVzID0gY29sbmFtZXMocmF3LmRhdGEpKQogIG1ldGEuZGF0YTFbJ2NoYW5uZWwnXSA9IHRpc3N1ZV9tZXRhZGF0YV9HMTcxQiRjaGFubmVsWzFdCiAgCiAgcm5hbWVzID0gcm93Lm5hbWVzKG1ldGEuZGF0YTEpCiAgbWV0YS5kYXRhMSA8LSBtZXJnZShtZXRhLmRhdGExLCB0aXNzdWVfbWV0YWRhdGFfRzE3MUIsIHNvcnQgPSBGKQogIHJvdy5uYW1lcyhtZXRhLmRhdGExKSA8LSBybmFtZXMKICAjIE9yZGVyIHRoZSBjZWxscyBhbHBoYWJldGljYWxseSB0byBlbnN1cmUgY29uc2lzdGVuY3kuCiAgCiAgb3JkZXJlZF9jZWxsX25hbWVzID0gb3JkZXIoY29sbmFtZXMocmF3LmRhdGEpKQogIHJhdy5kYXRhID0gcmF3LmRhdGFbLG9yZGVyZWRfY2VsbF9uYW1lc10KICBtZXRhLmRhdGExID0gbWV0YS5kYXRhMVtvcmRlcmVkX2NlbGxfbmFtZXMsXQogIAogICMgRmluZCBFUkNDJ3MsIGNvbXB1dGUgdGhlIHBlcmNlbnQgRVJDQywgYW5kIGRyb3AgdGhlbSBmcm9tIHRoZSByYXcgZGF0YS4KICBlcmNjcyA8LSBncmVwKHBhdHRlcm4gPSAiXkVSQ0MtIiwgeCA9IHJvd25hbWVzKHggPSByYXcuZGF0YSksIHZhbHVlID0gVFJVRSkKICBwZXJjZW50LmVyY2MgPC0gTWF0cml4Ojpjb2xTdW1zKHJhdy5kYXRhW2VyY2NzLCBdKS9NYXRyaXg6OmNvbFN1bXMocmF3LmRhdGEpCiAgZXJjYy5pbmRleCA8LSBncmVwKHBhdHRlcm4gPSAiXkVSQ0MtIiwgeCA9IHJvd25hbWVzKHggPSByYXcuZGF0YSksIHZhbHVlID0gRkFMU0UpCiAgcmF3LmRhdGEgPC0gcmF3LmRhdGFbLWVyY2MuaW5kZXgsXQogIAogIG5jUk5BLmdlbmVzIDwtIGdyZXAocGF0dGVybiA9ICJebmNSTkEiLCB4ID0gcm93bmFtZXMoeCA9IHJhdy5kYXRhKSwgdmFsdWUgPSBUUlVFKQogIHBlcmNlbnQubmNSTkEgPC0gTWF0cml4Ojpjb2xTdW1zKHJhdy5kYXRhW25jUk5BLmdlbmVzLCBdKS9NYXRyaXg6OmNvbFN1bXMocmF3LmRhdGEpCiAgS1JBQi5nZW5lcyA8LSBncmVwKHBhdHRlcm4gPSAiXktSQUIiLCB4ID0gcm93bmFtZXMoeCA9IHJhdy5kYXRhKSwgdmFsdWUgPSBUUlVFKQogIGNoZXJyeS5nZW5lcyA8LSBncmVwKHBhdHRlcm4gPSAiXm1jaGVycnkiLCB4ID0gcm93bmFtZXMoeCA9IHJhdy5kYXRhKSwgdmFsdWUgPSBUUlVFKQogIAogICMgQ3JlYXRlIHRoZSBTZXVyYXQgb2JqZWN0IHdpdGggYWxsIHRoZSBkYXRhCiAgRzE3MUIgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KHJhdy5kYXRhKSAgICMgZHJvcHNlcQogIEcxNzFCIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IEcxNzFCLCBtZXRhLmRhdGExKSAKICBHMTcxQkBtZXRhLmRhdGEkdGVjaCA8LSAiRzE3MUIiCgojRzE3MUIgPC0gU3Vic2V0RGF0YShHMTcxQixzdWJzZXQubmFtZXMgPSBjKCJuR2VuZSIsICJuVU1JIiksIGxvdy50aHJlc2hvbGRzID0gYyg1MDAsIDEwMDApKSAgIyBvbGQgdmVyc2lvbiBvZiBzZXVyYXQKI0cxNzFCIDwtICBzdWJzZXQoRzE3MUIsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiAxMDAwKQpHMTcxQiA8LSBOb3JtYWxpemVEYXRhKEcxNzFCLCB2ZXJib3NlID0gRkFMU0UpCkcxNzFCIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKEcxNzFCLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCkcxNzFCJHN0aW0gPC0gIkcxNzFCIgoKIyMjIHRoaXMgaXMgdHJhbmZvcm1hdGlvbiBvcHRpb24gZm9yIGRldmVscG1lbnQgU0N0cmFuc2Zvcm0gcHJvZ3JhbSAjIyMjIyMjCkcxNzFCIDwtIFNDVHJhbnNmb3JtKEcxNzFCLHZlcmJvc2UgPVRSVUUpCgoKYGBgCgoKZGlmZnVzaW9uIHBsdCBjb2RlIAoKYGBge3J9CiMgQmVmb3JlIHJ1bm5pbmcgTURTLCB3ZSBmaXJzdCBjYWxjdWxhdGUgYSBkaXN0YW5jZSBtYXRyaXggYmV0d2VlbiBhbGwgcGFpcnMgb2YgY2VsbHMuICBIZXJlIHdlCiMgdXNlIGEgc2ltcGxlIGV1Y2xpZGVhbiBkaXN0YW5jZSBtZXRyaWMgb24gYWxsIGdlbmVzLCB1c2luZyBzY2FsZS5kYXRhIGFzIGlucHV0CmQgPC0gZGlzdCh0KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJzY2FsZS5kYXRhIikpKQojIFJ1biB0aGUgTURTIHByb2NlZHVyZSwgayBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucwptZHMgPC0gY21kc2NhbGUoZCA9IGQsIGsgPSAyKQojIGNtZHNjYWxlIHJldHVybnMgdGhlIGNlbGwgZW1iZWRkaW5ncywgd2UgZmlyc3QgbGFiZWwgdGhlIGNvbHVtbnMgdG8gZW5zdXJlIGRvd25zdHJlYW0KIyBjb25zaXN0ZW5jeQpjb2xuYW1lcyhtZHMpIDwtIHBhc3RlMCgiTURTXyIsIDE6MikKIyBXZSB3aWxsIG5vdyBzdG9yZSB0aGlzIGFzIGEgY3VzdG9tIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiBjYWxsZWQgJ21kcycKY29tYmluZWRbWyJtZHMiXV0gPC0gQ3JlYXRlRGltUmVkdWNPYmplY3QoZW1iZWRkaW5ncyA9IG1kcywga2V5ID0gIk1EU18iLCBhc3NheSA9IERlZmF1bHRBc3NheShjb21iaW5lZCkpCgojIFdlIGNhbiBub3cgdXNlIHRoaXMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBkaW1lbnNpb25hbCByZWR1Y3Rpb24gaW4gYWxsIGRvd25zdHJlYW0gZnVuY3Rpb25zCkRpbVBsb3QoY29tYmluZWQsIHJlZHVjdGlvbiA9ICJtZHMiLCBwdC5zaXplID0gMC41KQpgYGAKCgoKYGBge3J9CmdlbmVzX2hlcF9tYWluID1jKCdBbGInLCAnVHRyJywgJ0Fwb2ExJywgJ1NlcnBpbmExYycpCmdlbmVzX2hlcCA9IGMoJ0FsYicsICdUdHInLCAnQXBvYTEnLCAnU2VycGluYTFjJywKICAgICAgICAgICAgICAgICAgICdDeXAyZTEnLCAnR2x1bCcsICdPYXQnLCAnR3VsbycsCiAgICAgICAgICAgICAgICAgICAnQXNzMScsICdIYW1wJywgJ0dzdHAxJywgJ1ViYicsCiAgICAgICAgICAgICAgICAgICAnQ3lwMmYyJywgJ1BjazEnLCAnSGFsJywgJ0NkaDEnKQpnZW5lc19lbmRvID0gYygnUGVjYW0xJywgJ05ycDEnLCAnS2RyJywnT2l0MycsJ0lnZmJwNycsJ0FxcDEnKQpnZW5lc19rdXBwZmVyID0gYyggJ0NsZWM0ZicsICdDZDY4JykKZ2VuZXNfbmsgPSBjKCdJbDJyYicsICdOa2c3JywgJ0N4Y3I2JywgJ0d6bWEnKQpnZW5lc19iID0gYygnQ2Q3OWEnLCAnQ2Q3OWInKQpnZW5lc19iZWMgPSBjKCdFcGNhbScsICdLcnQxOScsICdLcnQ3JykKZ2VuZXNfaW1tdW5lID0gJ1B0cHJjJwpIU0MgPSBjKCJEY24iLCJMYW1hMSIsIk5lcyIpCkRpdmlkaW5nID0gIlRvcDJhIgpCcGxhc21hPSAiSmNoYWluIgpNYWM9ICJDc2YxciIKQ2hvbD0iU294OSIKCllfZ2VuZXMgPC0gYygiVXR5IiwiRGR4M3kiLCJLZG01ZCIsIkVpZjJzM3kiLAkiR200NzI4MyIpCnNleCA8LSBjKCJDeXAyZDkiLCAibmNSTkEtaW50ZXItY2hyWC0xNTM5NCIsIkN5cDJjNjkiLCAnTXVwMjAnLCAnTXVwMScsJ011cDEyJywgJ011cDIxJywgJ0N5cDJkOScpCkZfc2V4IDwtIGMoJ1N1bHQzYTEnLCAnQTFiZycsICdGbW8zJywgJ0N5cDJiOScsICdTdWx0MmExJywnQ3lwMmIxMycpCmFsbF9nZW5lcyA9IGMoZ2VuZXNfaGVwLCBnZW5lc19lbmRvLCBnZW5lc19rdXBwZmVyLCBNYWMsZ2VuZXNfbmssIGdlbmVzX2IsIGdlbmVzX2JlYywgZ2VuZXNfaW1tdW5lLCBIU0MsIERpdmlkaW5nKQpnZW5lc19iZWNfYl9pbW11bmUgID0gYyhnZW5lc19iZWMsZ2VuZXNfYixnZW5lc19pbW11bmUpCmdlbmVzX3pvbmVzID0gYygnQ3lwMmUxJywgJ0dsdWwnLCAnT2F0JywgJ0d1bG8nLAogICAgICAgICAgICAgICdBc3MxJywgJ0hhbXAnLCAnR3N0cDEnLCAnVWJiJywKICAgICAgICAgICAgICAnQ3lwMmYyJywgJ1BjazEnLCAnSGFsJywgJ0NkaDEnKQoKQWxsX3NleF9nZW5lcyA8LSBjKCdNdXAxMScsJ011cDcnLCdFbG92bDMnLCdDeXA0YTEyYScsJ1RmZjMnLCdTY2FyYTUnLCdNdXAxNCcsJ0dzdHAyJywnQ3lwNGExMmInLCdNdXAyMCcsJ011cDEyJywnTXVwMjEnLCdDeXAyZDknLCdNdXAxJywKICAgICAgICAgICAgICAgICAgICdTdWx0MmE1JywnU3VsdDJhMicsJ1N1bHQyYTMnLCdDeXAzYTE2JywnU3VsdDJhNicsJ0N5cDNhNDFiJywnQ3lwM2E0NCcsJ0N5cDNhNDFhJywnQ3lwMmE0JywnU2xjMjJhMjYnLCdTdWx0M2ExJywKJ1N1bHQyYTEnLCdDeXAyYjEzJywnQTFiZycsJ0ZtbzMnLCdDeXAyYzY5JywnQ3lwMmI5JykKCiNBbGxfc2V4X2dlbmVzIDwtIGMoJ011cDExfE11cDd8RWxvdmwzfEN5cDRhMTJhfFRmZjN8U2NhcmE1fE11cDE0fEdzdHAyfEN5cDRhMTJifE11cDIwfE11cDEyfE11cDIxfEN5cDJkOXxNdXAxfAogICAgICAgICAgICAgICAgICAjIFN1bHQyYTV8U3VsdDJhMnxTdWx0MmEzfEN5cDNhMTZ8U3VsdDJhNnxDeXAzYTQxYnxDeXAzYTQ0fEN5cDNhNDFhfEN5cDJhNHxTbGMyMmEyNnxTdWx0M2ExfAojU3VsdDJhMXxDeXAyYjEzfEExYmd8Rm1vM3xDeXAyYzY5fEN5cDJiOScpCgoKQWxsX3NleF9nZW5lc19hbGwgPC0gYyhZX2dlbmVzLCAibmNSTkEtaW50ZXItY2hyWC0xNTM5NCIsIEFsbF9zZXhfZ2VuZXMpCgpyZWNlcHRvcl9LTyA8LSBjKCJuY1JOQS1pbnRlci1jaHI3LTU5OTgiLCJDeXAyYjEwIiwiTnIxaTIiLCJOcjFpMyIsIlBwYXJhIiwiUHBhcmciLCJQcGFyZ2MxYiIsIlBwYXJkIikKY2VsbCA8LSBjKCJTdGFiMiIsIkNzZjFyIiwiQ2QzZyIsIkViZjEiLCJJcmY4IiwiU294OSIsIkFwb2MzIiwiVG9wMmEiLCJEY24iKQpgYGAKCmBgYHtyfQpUUE00PC0gYygnbmNSTkEtaW50ZXItY2hyNy02NTI0JywKJ25jUk5BLWludGVyLWNocjE5LTE0ODUzJywKJ25jUk5BLWludGVyLWNocjYtNTY3NScsCiduY1JOQS1pbnRlci1jaHI0LTM0NjgnLAonbmNSTkEtaW50ZXItY2hyOS04MTIyJywKJ25jUk5BLWludGVyLWNocjEyLTEwNDc2JywKJ25jUk5BLWludGVyLWNocjE3LTE0MDI2JywKJ25jUk5BLWFzLWNocjItMTQ1NycsCiduY1JOQS1hcy1jaHIxOS0xNDg4MycsCiduY1JOQS1hcy1jaHIxMC04NDYwJywKJ25jUk5BLWFzLWNocjUtNDMyNScsCiduY1JOQS1pbnRlci1jaHI3LTU5OTgnLAonbmNSTkEtYXMtY2hyOS03ODQzJywKJ25jUk5BLWFzLWNocjktODE0MicsCiduY1JOQS1pbnRlci1jaHIxMS05OTI1JywKJ25jUk5BLWludGVyLWNocjE5LTE0ODczJywKJ25jUk5BLWFzLWNocjktODE3MicsCiduY1JOQS1pbnRlci1jaHI0LTM3NzknLAonbmNSTkEtaW50ZXItY2hyMy0yNTA0JywKJ25jUk5BLWFzLWNocjE5LTE1MDU0JywKJ25jUk5BLWludGVyLWNocjgtNzQyMycsCiduY1JOQS1hcy1jaHI3LTYzMDInLAonbmNSTkEtaW50ZXItY2hyMTAtOTQxOCcsCiduY1JOQS1pbnRlci1jaHIxMi0xMDQ1NCcsCiduY1JOQS1hcy1jaHI3LTU5OTknLAonbmNSTkEtYXMtY2hyNi01MzM1JywKJ25jUk5BLWludGVyLWNocjE5LTE0OTg3JywKJ25jUk5BLWludGVyLWNocjE2LTEzMTcwJywKJ25jUk5BLWludGVyLWNocjMtMjk4OCcsCiduY1JOQS1pbnRlci1jaHI4LTc0MzAnLAonbmNSTkEtaW50ZXItY2hyMy0yMTY4JywKJ25jUk5BLWludGVyLWNocjktNzg3NCcsCiduY1JOQS1pbnRlci1jaHI0LTM3NzgnLAonbmNSTkEtaW50ZXItY2hyMi0yMDExJywKJ25jUk5BLWludGVyLWNocjUtNDMzNScsCiduY1JOQS1pbnRlci1jaHI5LTgzMDEnLAonbmNSTkEtaW50ZXItY2hyMTYtMTM1MTAnLAonbmNSTkEtYXMtY2hyOS04NDAxJywKJ25jUk5BLWFzLWNocjE2LTEzNTEyJywKJ25jUk5BLWFzLWNocjEyLTEwODk2JywKJ25jUk5BLWFzLWNocjgtNzM1OScsCiduY1JOQS1hcy1jaHI1LTQ3NDQnLAonbmNSTkEtaW50ZXItY2hyNS00NDk5JywKJ25jUk5BLWludGVyLWNocjE2LTEzNTA5JywKJ25jUk5BLWludGVyLWNocjE3LTEzNjkyJywKJ25jUk5BLWFzLWNocjE3LTEzODM0JywKJ25jUk5BLWludGVyLWNocjktODE0NycsCiduY1JOQS1pbnRlci1jaHIxMC04Njk3JywKJ25jUk5BLWludGVyLWNocjYtNTU1MScsCiduY1JOQS1hcy1jaHI5LTgzMTcnLAonbmNSTkEtaW50ZXItY2hyNy02NTA5JywKJ25jUk5BLWFzLWNocjE5LTE0OTc3JywKJ25jUk5BLWludGVyLWNocjYtNTMxOCcsCiduY1JOQS1pbnRlci1jaHI1LTQ1NzgnLAonbmNSTkEtaW50ZXItY2hyMTItMTA1MDknLAonbmNSTkEtYXMtY2hyMTAtOTAxNScsCiduY1JOQS1pbnRlci1jaHIzLTI0MTEnLAonbmNSTkEtaW50ZXItY2hyOS03ODc1JywKJ25jUk5BLWludGVyLWNocjUtNDMzNicsCiduY1JOQS1pbnRlci1jaHIxMi0xMDkxMCcsCiduY1JOQS1hcy1jaHIxLTc4MicsCiduY1JOQS1pbnRlci1jaHIxNy0xMzkyNCcsCiduY1JOQS1pbnRyYS1jaHI3LTU5MjAnLAonbmNSTkEtaW50ZXItY2hyMTYtMTMyMjUnLAonbmNSTkEtaW50ZXItY2hyMy0yMjY5JywKJ25jUk5BLWludGVyLWNocjE0LTEyMDE2JywKJ25jUk5BLWFzLWNocjQtMzgwMCcsCiduY1JOQS1hcy1jaHI1LTQ2NTUnLAonbmNSTkEtaW50ZXItY2hyOS03OTg5JywKJ25jUk5BLWludHJhLWNocjUtNDcyOCcsCiduY1JOQS1pbnRlci1jaHJYLTE1MjQ4JywKJ25jUk5BLWludGVyLWNocjEwLTg3NjcnLAonbmNSTkEtaW50ZXItY2hyMTktMTQ3MTcnLAonbmNSTkEtaW50ZXItY2hyOC02NzY2JywKJ25jUk5BLWludGVyLWNocjEzLTExMTIyJywKJ25jUk5BLWludGVyLWNocjctNjA3NCcsCiduY1JOQS1pbnRlci1jaHIxNS0xMjQzOScsCiduY1JOQS1hcy1jaHIxMS05Nzg3JywKJ25jUk5BLWludGVyLWNocjItMTgyNycsCiduY1JOQS1hcy1jaHIxOS0xNDk3NicsCiduY1JOQS1pbnRlci1jaHIxOS0xNDk0NycsCiduY1JOQS1pbnRlci1jaHI2LTUyNDgnLAonbmNSTkEtaW50ZXItY2hyMi0xMDk4JywKJ25jUk5BLWludGVyLWNocjgtNzE4MCcsCiduY1JOQS1pbnRlci1jaHI5LTgxMTgnLAonbmNSTkEtaW50ZXItY2hyMTQtMTIxOTknLAonbmNSTkEtYXMtY2hyNi01MzM2JywKJ25jUk5BLWludGVyLWNocjQtMzg2NycsCiduY1JOQS1pbnRlci1jaHIxMC05MDAwJywKJ25jUk5BLWludGVyLWNocjE0LTEyMjkwJywKJ25jUk5BLWludGVyLWNocjItMTQ5MScsCiduY1JOQS1pbnRlci1jaHIxNS0xMjYwNicsCiduY1JOQS1pbnRlci1jaHIxMC05MjIyJywKJ25jUk5BLWludGVyLWNocjUtNDMyMicsCiduY1JOQS1pbnRlci1jaHIxMi0xMDk0MicsCiduY1JOQS1pbnRlci1jaHIxOC0xNDY5MCcsCiduY1JOQS1pbnRlci1jaHIyLTE0NzEnLAonbmNSTkEtaW50ZXItY2hyMy0yNDEwJywKJ25jUk5BLWludGVyLWNocjE5LTE0ODgwJywKJ25jUk5BLWludGVyLWNocjEzLTExMDc0JywKJ25jUk5BLWludGVyLWNocjktODA1NicsCiduY1JOQS1pbnRlci1jaHI1LTQ2NTQnLAonbmNSTkEtaW50ZXItY2hyMy0yMTY2JywKJ25jUk5BLWludGVyLWNocjgtNjk0NCcsCiduY1JOQS1hcy1jaHI3LTYwNjUnLAonbmNSTkEtaW50ZXItY2hyOC02ODk2JywKJ25jUk5BLWludGVyLWNocjItMTk2MycsCiduY1JOQS1pbnRlci1jaHI0LTM0MjUnLAonbmNSTkEtaW50ZXItY2hyMTMtMTEzODUnLAonbmNSTkEtaW50ZXItY2hyOS03ODg1JywKJ25jUk5BLWFzLWNocjEwLTk0MTEnLAonbmNSTkEtYXMtY2hyOS04NDE5JywKJ25jUk5BLWFzLWNocjEyLTEwNjE4JywKJ25jUk5BLWludGVyLWNocjctNjM5MCcsCiduY1JOQS1pbnRlci1jaHIxNy0xNDE1MScsCiduY1JOQS1hcy1jaHIxMy0xMTc4NycsCiduY1JOQS1hcy1jaHIyLTE5NjUnLAonbmNSTkEtaW50ZXItY2hyNi01NzIxJywKJ25jUk5BLWludGVyLWNocjYtNTgyMicsCiduY1JOQS1pbnRlci1jaHIxMS05NjM1JywKJ25jUk5BLWludGVyLWNocjExLTk5NjUnLAonbmNSTkEtaW50ZXItY2hyNC0zMDUyJywKJ25jUk5BLWludGVyLWNocjE3LTEzODU3JywKJ25jUk5BLWludGVyLWNocjEzLTExMjAxJywKJ25jUk5BLWludGVyLWNocjYtNTI0OScsCiduY1JOQS1pbnRlci1jaHIxOS0xNDg1MScsCiduY1JOQS1pbnRlci1jaHI2LTU2MzgnLAonbmNSTkEtaW50ZXItY2hyMTctMTQxMzAnLAonbmNSTkEtaW50ZXItY2hyOS03OTkzJywKJ25jUk5BLWludGVyLWNocjE4LTE0NjU2JywKJ25jUk5BLWludGVyLWNocjktNzk5MicsCiduY1JOQS1pbnRlci1jaHIxLTU2NicsCiduY1JOQS1pbnRlci1jaHIxMi0xMDcxNScsCiduY1JOQS1pbnRlci1jaHIxNy0xNDEwMicsCiduY1JOQS1pbnRlci1jaHI0LTMwMTAnLAonbmNSTkEtaW50ZXItY2hyMy0yNzY0JywKJ25jUk5BLWludGVyLWNocjQtMzMwNicsCiduY1JOQS1pbnRlci1jaHIxOS0xNDk3OScsCiduY1JOQS1pbnRlci1jaHIxLTU3MCcsCiduY1JOQS1pbnRlci1jaHIxOS0xNDc5MCcsCiduY1JOQS1pbnRlci1jaHI0LTMyODInLAonbmNSTkEtaW50ZXItY2hyNS00Nzc3JywKJ25jUk5BLWludGVyLWNocjgtNzYwNScsCiduY1JOQS1pbnRlci1jaHI5LTgwMDAnLAonbmNSTkEtYXMtY2hyMTUtMTI5MjAnLAonbmNSTkEtYXMtY2hyMS0zNjknLAonbmNSTkEtaW50ZXItY2hyMTktMTQ5NTInLAonbmNSTkEtYXMtY2hyOS04MzkzJywKJ25jUk5BLWFzLWNocjE0LTEyMDc0JywKJ25jUk5BLWludGVyLWNocjEyLTEwNDE1JywKJ25jUk5BLWludGVyLWNocjctNjU1OScsCiduY1JOQS1pbnRlci1jaHIxLTYzMCcsCiduY1JOQS1pbnRlci1jaHI0LTMxNDInLAonbmNSTkEtaW50ZXItY2hyNi01MTMxJywKJ25jUk5BLWludGVyLWNocjE2LTEzMDUwJywKJ25jUk5BLWludGVyLWNocjctNjQxMScsCiduY1JOQS1pbnRlci1jaHI1LTQ3NDYnLAonbmNSTkEtaW50ZXItY2hyMS02MzMnLAonbmNSTkEtaW50ZXItY2hyMTAtODQ2MScsCiduY1JOQS1pbnRlci1jaHIyLTIwMTYnLAonbmNSTkEtaW50ZXItY2hyNi01MTM3JywKJ25jUk5BLWFzLWNocjQtMzMwMCcsCiduY1JOQS1pbnRlci1jaHI0LTMwMDknLAonbmNSTkEtaW50ZXItY2hyMi0xOTIzJywKJ25jUk5BLWludGVyLWNocjEtNjcwJywKJ25jUk5BLWludGVyLWNocjE1LTEyODM1JywKJ25jUk5BLWludGVyLWNocjE4LTE0NjU1JywKJ25jUk5BLWludGVyLWNocjE2LTEzMjExJywKJ25jUk5BLWFzLWNocjctNjA1MCcsCiduY1JOQS1pbnRlci1jaHI3LTY1MDgnLAonbmNSTkEtaW50ZXItY2hyMTEtMTAyMDYnLAonbmNSTkEtaW50ZXItY2hyMTMtMTEzOTknLAonbmNSTkEtaW50ZXItY2hyOC02NzU3JywKJ25jUk5BLWludGVyLWNocjEtMTI5JywKJ25jUk5BLWludGVyLWNocjEyLTEwNDU5JywKJ25jUk5BLWludGVyLWNocjctNjcwOScsCiduY1JOQS1pbnRlci1jaHIxMi0xMDcxMycsCiduY1JOQS1pbnRlci1jaHI3LTY1MjMnLAonbmNSTkEtaW50ZXItY2hyMi0yMDE3JywKJ25jUk5BLWludGVyLWNocjctNjM0MycsCiduY1JOQS1pbnRlci1jaHIxLTYzJywKJ25jUk5BLWFzLWNocjMtMjkzNicsCiduY1JOQS1pbnRlci1jaHIxOC0xNDY5MScsCiduY1JOQS1pbnRlci1jaHI3LTYwOTcnLAonbmNSTkEtaW50ZXItY2hyNi01NzIzJykKYGBgCgoKYGBge3J9CkRlZmF1bHRBc3NheShkcm9wbGV0KSA8LSAiUk5BIgojZHJvcGxldCA8LSBOb3JtYWxpemVEYXRhKGNvbWJpbmVkLCB2ZXJib3NlID0gVFJVRSwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiUkMiLCBzY2FsZS5mYWN0b3IgPSAxZTYpCmNvbWJpbmVkIDwtIE5vcm1hbGl6ZURhdGEoY29tYmluZWQsIHZlcmJvc2UgPSBUUlVFKQoKRG90UGxvdChjb21iaW5lZCwgZmVhdHVyZXMgPSBhbGxfZ2VuZXMpCkZlYXR1cmVQbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IGdlbmVzX2hlcF9tYWluLCBtaW4uY3V0b2ZmID0gInE5IikKI2hlcGF0b2N5dGVzIApzdWJ0aXNzcGxvdCA8LSBEb3RQbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IGMoZ2VuZXNfaGVwX21haW4sIGdlbmVzX2VuZG8sIGdlbmVzX2JlY19iX2ltbXVuZSwgZ2VuZXNfa3VwcGZlciwgZ2VuZXNfbmspKQpQQyA8LSBEb3RQbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IGMoZ2VuZXNfaGVwX21haW4sZ2VuZXNfem9uZXMpKQpOUEMgPC0gRG90UGxvdChjb21iaW5lZCwgZmVhdHVyZXMgPSBjKGdlbmVzX2VuZG8sZ2VuZXNfa3VwcGZlciwgZ2VuZXNfbmspKQphbGwgPC0gRG90UGxvdChjb21iaW5lZCwgZmVhdHVyZXM9YyhhbGxfZ2VuZXMpKQoKIyMjIGNvZXhwcmVzc2lvbiBwbG90cyMjIyMKCmYxIDwtIEZlYXR1cmVQbG90KEtPLmNlbGxzLCBmZWF0dXJlcyA9IGMoJ0N5cDJiMTAnLCduY1JOQS1pbnRlci1jaHI3LTU5OTgnKSwgcmVkdWN0aW9uID0gIm1kcyIsIG9yZGVyID0gVFJVRSxzcGxpdC5ieSA9ICJzdGltIiwgYmxlbmQgPSBUUlVFLHNvcnQuY2VsbCA9IFRSVUUsIG1heC5jdXRvZmYgPSAwLjUpCgoKIyMjIyMjIyMjIyB0aGlzIGlzIGV4YWN0IGF2ZXJhZ2luZyBmb3JtdWxhICMjIyMjIyMjIyMjIyMjIzMzCiAgeCA8LSAoQXZlcmFnZUV4cHJlc3Npb24oS08uY2VsbHMsIHZlcmJvc2UgPSBUUlVFLCBhc3NheXMgPSAiUk5BIiAsc2xvdD0iY291bnRzIikkUk5BKQogICB4WyJuY1JOQS1pbnRlci1jaHI3LTU5OTgiLF0KIyAgICAgICAgICAgICAgICAgICAgICAgICBHMTcxQiAgICBHMTcxQwojbmNSTkEtaW50ZXItY2hyNy01OTk4IDEuODcxNzk1IDEuMDkxNDYzCiMjIyMjIyMjCiNJZGVudHMoY29tYmluZWQpIDwtIGZhY3RvcihJZGVudHMoY29tYmluZWQpLCBsZXZlbHMgPSBjKDAsMSwxMikpCm1hcmtlcnMudG8ucGxvdCA8LSBjKCJBbGIiLCJuY1JOQS1pbnRlci1jaHI3LTU5OTgiKQpEb3RQbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IHJldihtYXJrZXJzLnRvLnBsb3QpLCBjb2xzID0gYygiYmx1ZSIsICJyZWQiKSwgZG90LnNjYWxlID0gOCwgCiAgICBzcGxpdC5ieSA9ICJzdGltIikgKyBSb3RhdGVkQXhpcygpCgpGZWF0dXJlUGxvdChjb21iaW5lZCwgZmVhdHVyZXMgPSBjKCJBbGIiLCAibmNSTkEtaW50ZXItY2hyNy01OTk4IiwiQ3lwMmIxMCIsImRTYUNhczkiLCJLUkFCIiwiQUFWOC1tQ2hlcnJ5IiksIHNwbGl0LmJ5ID0gInN0aW0iLCBtYXguY3V0b2ZmID0gMywgY29scyA9IGMoImdyZXkiLCAicmVkIikpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyB2bG5wbG90ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpwbG90cyA8LSBWbG5QbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IGMoIkFsYiIsICJuY1JOQS1pbnRlci1jaHI3LTU5OTgiLCJDeXAyYjEwIiwiZFNhQ2FzOSIpLCBzcGxpdC5ieSA9ICJzdGltIiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIiwgcHQuc2l6ZSA9IDAsIGNvbWJpbmUgPSBGQUxTRSkKQ29tYmluZVBsb3RzKHBsb3RzID0gcGxvdHMsIG5jb2wgPSAxKQoKcGxvdHMgPC0gVmxuUGxvdChjb21iaW5lZCwgZmVhdHVyZXMgPSBjKCJMaHg0IiwiRHRuYSIsIkZhbTE4OWExIiwiR2FsbnQxNiIsIkthbHJuIiksIHNwbGl0LmJ5ID0gInN0aW0iLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLCBwdC5zaXplID0gMCwgY29tYmluZSA9IEZBTFNFKQpDb21iaW5lUGxvdHMocGxvdHMgPSBwbG90cywgbmNvbCA9IDEpCgoKI2VuZG90aGVsaWFsCkRvdFBsb3QoY29tYmluZWQsIGZlYXR1cmVzID0gZ2VuZXNfZW5kbykKCiN6b25lcwp6b25lcyA8LSBEb3RQbG90KGNvbWJpbmVkLCBmZWF0dXJlcyA9IGdlbmVzX3pvbmVzKQoKZjEgPC0gRmVhdHVyZVBsb3QoY29tYmluZWQsIGZlYXR1cmVzID0gYygnQ3lwMmUxJywnQ3lwMmYyJywnQXNzMScpLCBtaW4uY3V0b2ZmID0gInE5IiwgcmVkdWN0aW9uID0gInRzbmUiKQoKRGltUGxvdChjb21iaW5lZCwgbGFiZWwgPSBUUlVFKQoKc2F2ZShjb21iaW5lZCwgZmlsZT0iU2V1cmF0X3NtYXJ0LWRyb3BfaW50ZWdyYXRlZC5Sb2JqIikKCgojIyMjIyMjIyMjIyMjIyMjIyBzYXZlIHJhdyBjb3VudHMgZnJvbSBjbHVzdGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKSWRlbnRzKGNvbWJpbmVkKSA8LSAic3RpbSIKCiMjIyB0byBhdmVyZ2FlIG91dCB0aGUgbWF0cml4IGZyb20gS08gY2VsbHMgCgpjb21iaW5lZC5yYXcuZGF0YS4wLjEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDAsaWRlbnRzID0gInN0aW0iKV0pCmNvbWJpbmVkLnJhdy5kYXRhLjEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gMCldKQpjb21iaW5lZC5yYXcuZGF0YS4yIDwtIGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDApXSkKCiNjb21iaW5lZC5yYXcuZGF0YS5baV0gPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gMSldKQojY29tYmluZWQucmF3LmRhdGEuMTIgPC1hcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSAxMildKQojY29tYmluZWQucmF3LmRhdGEuMSA8LSBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpKQp4IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKHRlc3QuY29tYmluZWQsYXNzYXlzID0gIlJOQSIsYWRkLmlkZW50ID0gInN0aW0iLCBzbG90ID0gImRhdGEiLHVzZS5zY2FsZSA9IEZBTFNFLCB1c2UuY291bnRzID0gRkFMU0UpJFJOQQoKI30jIyMjIyMjIyBDQVIgZGF0YSAKYXZnLmNvbWJpbmVkLmNlbGxzIDwtIChBdmVyYWdlRXhwcmVzc2lvbihjb21iaW5lZCwgdmVyYm9zZSA9IEZBTFNFKSRSTkEpIAphdmcuY29tYmluZWQuY2VsbHMkZ2VuZSA8LSByb3duYW1lcyhhdmcuY29tYmluZWQuY2VsbHMpCgpDQVJfRlAgPC0gRmVhdHVyZVBsb3QoY29tYmluZWQsIGZlYXR1cmVzID0gYygnQ3lwMmIxMCcsJ05yMWkzJyksIHJlZHVjdGlvbiA9ICJ1bWFwIiwgb3JkZXIgPSBUUlVFLHNwbGl0LmJ5ID0gInN0aW0iLCBibGVuZCA9IFRSVUUsc29ydC5jZWxsID0gVFJVRSwgbWF4LmN1dG9mZiA9IDEsIG1pbi5jdXRvZmYgPSAwLCBwdC5zaXplID0gMC41LCByZXBlbCA9IFRSVUUpCkNBUl9ET1RfTlIgPC0gRG90UGxvdChjb21iaW5lZCwgZmVhdHVyZXMgPSAnTnIxaTMnLCBjb2wubWluID0gMCkKCkN5cDJiMTBfRlAgPC0gRmVhdHVyZVBsb3QoY29tYmluZWQsIGZlYXR1cmVzID0gJ0N5cDJiMTAnLCByZWR1Y3Rpb24gPSAidW1hcCIsIG1pbi5jdXRvZmYgPSAwKQojIyMjIyMjIyMjIyB0U05FICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjb21iaW5lZCA8LSBOb3JtYWxpemVEYXRhKG9iamVjdCA9IGNvbWJpbmVkKQpjb21iaW5lZCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjb21iaW5lZCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwKQoKYGBgCgoKYGBge3J9CiMjIyMjIyBJIHVzZWQgdGhlc2UgZm9yIG1lcmdlZCBjZWxscyAjIyMjCgpHMTcyX1RQTV9jb3VudCAgPC0gcmVmLmludGVncmF0ZWQuMgpHMTcyX1RQTV9jb3VudCAgPC0gTm9ybWFsaXplRGF0YShHMTcyX1RQTV9jb3VudCxhc3NheSA9ICJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJSQyIsIHNjYWxlLmZhY3RvciA9IDFlNikKCgpHMTcyX1RQTV9jb3VudCAkY2VsbHR5cGUuc3RpbSA8LSBwYXN0ZShJZGVudHMoRzE3Ml9UUE1fY291bnQgKSwgRzE3Ml9UUE1fY291bnQgJHN0aW0sIHNlcCA9ICJfIikKRzE3Ml9UUE1fY291bnQgJGNlbGx0eXBlIDwtIElkZW50cyhHMTcyX1RQTV9jb3VudCApCklkZW50cyhHMTcyX1RQTV9jb3VudCApIDwtICJjZWxsdHlwZS5zdGltIgpHMTcyX1RQTV9jb3VudCA8LSBSZW5hbWVDZWxscyhHMTcyX1RQTV9jb3VudCwgbmV3Lm5hbWVzID0gcGFzdGUwKGNvbG5hbWVzKEcxNzJfVFBNX2NvdW50KSwiLSIsRzE3Ml9UUE1fY291bnQkY2VsbHR5cGUuc3RpbSkpCgoKS08uY2VsbHMgPC0gc3Vic2V0KEcxNzJfVFBNX2NvdW50LCBpZGVudHMgPSBjKCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQpJZGVudHMoS08uY2VsbHMpIDwtICJzdGltIgpjb2xuYW1lcyhLTy5jZWxscyApCmNvbG5hbWVzKEtPLmNlbGxzKSA8LSBsYXBwbHkoY29sbmFtZXMoS08uY2VsbHMpLCBmdW5jdGlvbih4KSBwYXN0ZTAoS08uY2VsbHMkc3RpbSwnXycseCkpCgojIyMgdG8gYXZlcmdhZSBvdXQgdGhlIG1hdHJpeCBmcm9tIEtPIGNlbGxzIApyYXcuZGF0YS4wIDwtIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSBjKCJjb3VudHMiLCJkYXRhIikpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAwKV0pCnJhdy5kYXRhLjEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gMSldKQpyYXcuZGF0YS4yIDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gMildKQpyYXcuZGF0YS4zIDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gMyldKQpyYXcuZGF0YS40IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gNCldKQpyYXcuZGF0YS41IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gNSldKQpyYXcuZGF0YS42IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gNildKQpyYXcuZGF0YS43IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gNyldKQpyYXcuZGF0YS44IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gOCldKQoKClRQTWNvdW50MDwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICcwX01lcmdlZE0xJyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICcwX01lcmdlZE0xJyldKSxhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMF9NZXJnZWRNMicpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMF9NZXJnZWRNMicpXSkpCgoKClRQTWNvdW50MTwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICcxX01lcmdlZE0xJyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICcxX01lcmdlZE0xJyldKSxhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMV9NZXJnZWRNMicpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMV9NZXJnZWRNMicpXSkpCgpUUE1jb3VudDI8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMl9NZXJnZWRNMScpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnMl9NZXJnZWRNMScpXSksYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzJfTWVyZ2VkTTInKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzJfTWVyZ2VkTTInKV0pKQoKVFBNY291bnQzPC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzNfTWVyZ2VkTTEnKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzNfTWVyZ2VkTTEnKV0pLGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICczX01lcmdlZE0yJyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICczX01lcmdlZE0yJyldKSkKCgpUUE1jb3VudDQ8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnNF9NZXJnZWRNMScpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnNF9NZXJnZWRNMScpXSksYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzRfTWVyZ2VkTTInKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzRfTWVyZ2VkTTInKV0pKQoKVFBNY291bnQ1PC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzVfTWVyZ2VkTTEnKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzVfTWVyZ2VkTTEnKV0pLGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICc1X01lcmdlZE0yJyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICc1X01lcmdlZE0yJyldKSkKCgpUUE1jb3VudDY8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnNl9NZXJnZWRNMScpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhHMTcyX1RQTV9jb3VudCwgaWRlbnQgPSAnNl9NZXJnZWRNMScpXSksYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzZfTWVyZ2VkTTInKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzZfTWVyZ2VkTTInKV0pKQoKVFBNY291bnQ3PC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzdfTWVyZ2VkTTEnKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzJfVFBNX2NvdW50LCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gJzdfTWVyZ2VkTTEnKV0pLGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Ml9UUE1fY291bnQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICc3X01lcmdlZE0yJyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9ICc3X01lcmdlZE0yJyldKSkKCgpUUE1jb3VudEJvdHRvbSA8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzIuTTEsIHNsb3QgPSAiY291bnRzIikpLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzIuTTEsIHNsb3QgPSAiZGF0YSIpKSkgCndyaXRlLmNzdihUUE1jb3VudEJvdHRvbSwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudEJvdHRvbSIpCgpUUE1jb3VudFRvcCA8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzIuTTEsIHNsb3QgPSAiY291bnRzIikpLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEcxNzIuTTEsIHNsb3QgPSAiZGF0YSIpKSkgCndyaXRlLmNzdihUUE1jb3VudFRvcCwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudFRvcCIpCgpUUE1jb3VudFRvcE0yIDwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Mi5NMiwgc2xvdCA9ICJjb3VudHMiKSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Mi5NMiwgc2xvdCA9ICJkYXRhIikpKSAKd3JpdGUuY3N2KFRQTWNvdW50VG9wTTIsICJDb3VudFJlc3VsdC9jb3VudHNfVFBNY291bnRUb3BHMTcyTTIiKQoKClRQTWNvdW50RzE3Mk0xIDwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Mi5NMSwgc2xvdCA9ICJjb3VudHMiKSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Mi5NMSwgc2xvdCA9ICJkYXRhIikpKSAKd3JpdGUuY3N2KFRQTWNvdW50RzE3Mk0xLCAiQ291bnRSZXN1bHQvY291bnRzX1RQTWNvdW50RzE3Mk0xX0Z1bGwiKQoKVFBNY291bnRHMTcyTTIgPC0gIGFzLm1hdHJpeChHZXRBc3NheURhdGEoRzE3Mi5NMiwgc2xvdCA9ICJkYXRhIikpIAp3cml0ZS5jc3YoVFBNY291bnRHMTcyTTEsICJDb3VudFJlc3VsdC9jb3VudHNfVFBNY291bnRHMTcyTTFfRnVsbCIpCgpUUE1jb3VudEcxNzJNMV9tZXJnZSA8LSAgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyLk0xLm1lcmdlLCBzbG90ID0gImRhdGEiKSkgCndyaXRlLmNzdihUUE1jb3VudEcxNzJNMV9tZXJnZV9hdmcsIkNvdW50UmVzdWx0L1BNY291bnRHMTcyTTFfbWVyZ2VfYXZnIikKCgpUUE1jb3VudEcxNzJNMl9tZXJnZSA8LSAgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyLk0yLm1lcmdlLCBzbG90ID0gImRhdGEiKSkgCndyaXRlLmNzdihUUE1jb3VudEcxNzJNMl9tZXJnZV9hdmcsICJDb3VudFJlc3VsdC9UUE1jb3VudEcxNzJNMl9tZXJnZV9hdmciKQoKVFBNY291bnQxPC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoRzE3Ml9UUE1fY291bnQsIGlkZW50ID0gMSldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShHMTcyX1RQTV9jb3VudCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKEcxNzJfVFBNX2NvdW50LCBpZGVudCA9IDEpXSkpCgpUUE1jb3VudDI8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSAyKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gMildKSkKClRQTWNvdW50MzwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDMpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSAzKV0pKQoKVFBNY291bnQ0PC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gNCldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDQpXSkpCgpUUE1jb3VudDU8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSA1KV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gNSldKSkKClRQTWNvdW50NjwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDYpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSA2KV0pKQoKVFBNY291bnQ3PC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gNyldKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDcpXSkpCgpUUE1jb3VudDg8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSA4KV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gOCldKSkKClRQTWNvdW50OTwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDkpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSA5KV0pKQoKVFBNY291bnQxMDwtIGNiaW5kKGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDEwKV0pLCBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImRhdGEiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gMTApXSkpCgpUUE1jb3VudDExPC0gY2JpbmQoYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoY29tYmluZWQsIGlkZW50ID0gMTEpXSksIGFzLm1hdHJpeChHZXRBc3NheURhdGEoY29tYmluZWQsIHNsb3QgPSAiZGF0YSIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSAxMSldKSkKClRQTWNvdW50MTI8LSBjYmluZChhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKGNvbWJpbmVkLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhjb21iaW5lZCwgaWRlbnQgPSAxMildKSwgYXMubWF0cml4KEdldEFzc2F5RGF0YShjb21iaW5lZCwgc2xvdCA9ICJkYXRhIilbLCBXaGljaENlbGxzKGNvbWJpbmVkLCBpZGVudCA9IDEyKV0pKQoKCgoKd3JpdGUuY3N2KFRQTWNvdW50MCwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDAuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50MSwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDEuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50MiwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDIuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50MywgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDMuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50NCwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDQuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50NSwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDUuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50NiwgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDYuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50NywgIkNvdW50UmVzdWx0L2NvdW50c19UUE1jb3VudDcuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50OCwgIkNvdW50UmVzdWx0L2NvdW50cy5UUE1jb3VudDguY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50OSwgIkNvdW50UmVzdWx0L2NvdW50cy5UUE1jb3VudDkuY3N2IikKd3JpdGUuY3N2KFRQTWNvdW50MTAsICJDb3VudFJlc3VsdC9jb3VudHMuVFBNY291bnQxMC5jc3YiKQp3cml0ZS5jc3YoVFBNY291bnQxMSwgIkNvdW50UmVzdWx0L2NvdW50cy5UUE1jb3VudDExLmNzdiIpCndyaXRlLmNzdihUUE1jb3VudDEyLCAiQ291bnRSZXN1bHQvY291bnRzLlRQTWNvdW50MTIuY3N2IikKCgoKI2F2Zy5LTy5jZWxscyA8LSBsb2cxcChBdmVyYWdlRXhwcmVzc2lvbihLTy5jZWxscywgdmVyYm9zZSA9IEZBTFNFKSRSTkEpICAjb3JpZ2luYWwgY29kZSBsb2cgdHJhbnNmb3JtZWQKYXZnLktPLmNlbGxzIDwtIChBdmVyYWdlRXhwcmVzc2lvbihLTy5jZWxscywgdmVyYm9zZSA9IEZBTFNFKSRSTkEpIAphdmcuS08uY2VsbHMkZ2VuZSA8LSByb3duYW1lcyhhdmcuS08uY2VsbHMpCgpnZW5lcy50by5sYWJlbD0gKCJuY1JOQS1pbnRlci1jaHI3LTU5OTgiKQojZ2VuZXMudG8ubGFiZWwgPSBjKCJJU0cxNSIsICJMWTZFIiwgIklGSTYiLCAiSVNHMjAiLCAiTVgxIiwgIklGSVQyIiwgIklGSVQxIiwgIkNYQ0wxMCIsICJDQ0w4IikKcDEgPC0gZ2dwbG90KGF2Zy5LTy5jZWxscywgYWVzKENUUkwsIFNUSU0pKSArIGdlb21fcG9pbnQoKSArIGdndGl0bGUoIkNENCBOYWl2ZSBUIENlbGxzIikKcDEgPC0gTGFiZWxQb2ludHMocGxvdCA9IHAxLCBwb2ludHMgPSBnZW5lcy50by5sYWJlbCwgcmVwZWwgPSBUUlVFKQpwMiA8LSBnZ3Bsb3QoYXZnLmNkMTQubW9ubywgYWVzKENUUkwsIFNUSU0pKSArIGdlb21fcG9pbnQoKSArIGdndGl0bGUoIkNEMTQgTW9ub2N5dGVzIikKcDIgPC0gTGFiZWxQb2ludHMocGxvdCA9IHAyLCBwb2ludHMgPSBnZW5lcy50by5sYWJlbCwgcmVwZWwgPSBUUlVFKQpwbG90X2dyaWQocDEsIHAyKQpgYGAKCgpgYGB7cn0KS08uY2VsbHMgPC0gUnVuVU1BUChLTy5jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwICkKS08uY2VsbHMgPC0gRmluZE5laWdoYm9ycyhLTy5jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwKQpLTy5jZWxscyA8LSBGaW5kQ2x1c3RlcnMoS08uY2VsbHMsIHJlc29sdXRpb24gPSAwLjUgKSAgIApLTy5jZWxscyA8LSBSdW5UU05FKEtPLmNlbGxzLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCiAKCkhlcC5jZWxscyA8LSBSdW5VTUFQKEhlcC5jZWxscywgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwICkKSGVwLmNlbGxzIDwtIEZpbmROZWlnaGJvcnMoSGVwLmNlbGxzLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCkhlcC5jZWxscyA8LSBGaW5kQ2x1c3RlcnMoSGVwLmNlbGxzLCByZXNvbHV0aW9uID0gMC41ICkgICAKSGVwLmNlbGxzIDwtIFJ1blRTTkUoSGVwLmNlbGxzLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCiAKCiAgIAogIyBWaXN1YWxpemF0aW9uCnAxIDwtIFVNQVBQbG90KEtPLmNlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gInN0aW0iKQpwMiA8LSBVTUFQUGxvdChLTy5jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJtb3VzZS5zZXgiKQpwMyA8LSBVTUFQUGxvdChLTy5jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUpCnA0IDwtIFVNQVBQbG90KEtPLmNlbGxzLCBsYWJlbD1UUlVFKQpwbG90X2dyaWQocDEscDQpIApEaW1QbG90KEtPLmNlbGxzLCByZWR1Y3Rpb24gPSAidW1hcCIsIHNwbGl0LmJ5ID0gInN0aW0iKSAgIAoKCiNoZXBhdG9jeXRlIGNlbGxzCgpwNSA8LSBVTUFQUGxvdChIZXAuY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic3RpbSIpCnA2IDwtIFVNQVBQbG90KEhlcC5jZWxscywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJtb3VzZS5zZXgiKQpwNyA8LSBVTUFQUGxvdChIZXAuY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFKQpwOCA8LSBVTUFQUGxvdChIZXAuY2VsbHMsIGxhYmVsPVRSVUUpCnBsb3RfZ3JpZChwNSxwOCkgCkRpbVBsb3QoS08uY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgc3BsaXQuYnkgPSAic3RpbSIpICAgCgoKcmF3LmRhdGEuS08uMCA8LSBhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKEtPLmNlbGxzLCBzbG90ID0gImNvdW50cyIpWywgV2hpY2hDZWxscyhLTy5jZWxscywgaWRlbnQgPSAwKV0pCnJhdy5kYXRhLktPLjEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShLTy5jZWxscywgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoS08uY2VsbHMsIGlkZW50ID0gMSldKQpyYXcuZGF0YS5LTy4yIDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShLTy5jZWxscywgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoS08uY2VsbHMsIGlkZW50ID0gMildKQpyYXcuZGF0YS5LTy4zIDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShLTy5jZWxscywgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoS08uY2VsbHMsIGlkZW50ID0gMyldKQpyYXcuZGF0YS5LTy40IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShLTy5jZWxscywgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoS08uY2VsbHMsIGlkZW50ID0gNCldKQpyYXcuZGF0YS5LTy41IDwtYXMubWF0cml4KEdldEFzc2F5RGF0YShLTy5jZWxscywgc2xvdCA9ICJjb3VudHMiKVssIFdoaWNoQ2VsbHMoS08uY2VsbHMsIGlkZW50ID0gNSldKQoKCndyaXRlLmNzdihyYXcuZGF0YS5LTy4wLCAiQ291bnRSZXN1bHQvTWFya2Vycy9yYXcuZGF0YS5LTy4wIikKd3JpdGUuY3N2KHJhdy5kYXRhLktPLjEsICJDb3VudFJlc3VsdC9NYXJrZXJzL3Jhdy5kYXRhLktPLjEiKQp3cml0ZS5jc3YocmF3LmRhdGEuS08uMiwgIkNvdW50UmVzdWx0L01hcmtlcnMvcmF3LmRhdGEuS08uMiIpCndyaXRlLmNzdihyYXcuZGF0YS5LTy4zLCAiQ291bnRSZXN1bHQvTWFya2Vycy9yYXcuZGF0YS5LTy4zIikKd3JpdGUuY3N2KHJhdy5kYXRhLktPLjQsICJDb3VudFJlc3VsdC9NYXJrZXJzL3Jhdy5kYXRhLktPLjQiKQp3cml0ZS5jc3YocmF3LmRhdGEuS08uNSwgIkNvdW50UmVzdWx0L01hcmtlcnMvcmF3LmRhdGEuS08uNSIpCgoKCmYxIDwtIEZlYXR1cmVQbG90KEtPLmNlbGxzLCBmZWF0dXJlcyA9IGMoJ25jUk5BLWludGVyLWNocjctNTk5OCcpLCAgcmVkdWN0aW9uID0gInVtYXAiLCBzcGxpdC5ieSA9ICJzdGltIikKcGxvdF9ncmlkKGYxLHAxLHA0KSAKCkRlZmF1bHRBc3NheShLTy5jZWxscykgPC0gIlJOQSIKS08uY2VsbHMgPC0gTm9ybWFsaXplRGF0YShLTy5jZWxscywgdmVyYm9zZSA9IEZBTFNFKQoKcGxvdHMgPC0gVmxuUGxvdChLTy5jZWxscywgZmVhdHVyZXMgPSBjKCJBbGIiLCAibmNSTkEtaW50ZXItY2hyNy01OTk4IiwiQ3lwMmIxMCIsIkN5cDJlMSIsIkN5cDJmMiIpLCBzcGxpdC5ieSA9ICJzdGltIiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIiwgcHQuc2l6ZSA9IDAsIGNvbWJpbmUgPSBGQUxTRSkKQ29tYmluZVBsb3RzKHBsb3RzID0gcGxvdHMsIG5jb2wgPSAxKQoKVGhyZWVfZml2ZV9zaXggPC0gc3Vic2V0KEtPLmNlbGxzLCBpZGVudHMgPSBjKCI1IiwiNiIpKQoKVGhyZWVfZml2ZV9zaXggPC0gUnVuVU1BUChUaHJlZV9maXZlX3NpeCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwICkKVGhyZWVfZml2ZV9zaXggPC0gRmluZE5laWdoYm9ycyhUaHJlZV9maXZlX3NpeCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwKQpUaHJlZV9maXZlX3NpeCA8LSBGaW5kQ2x1c3RlcnMoVGhyZWVfZml2ZV9zaXgsIHJlc29sdXRpb24gPSAxICkgICAKVGhyZWVfZml2ZV9zaXggPC0gUnVuVFNORShUaHJlZV9maXZlX3NpeCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjIwKQoKcDEgPC0gVU1BUFBsb3QoVGhyZWVfZml2ZV9zaXgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic3RpbSIpCnAyIDwtIFVNQVBQbG90KFRocmVlX2ZpdmVfc2l4LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIm1vdXNlLnNleCIpCnAzIDwtIFVNQVBQbG90KFRocmVlX2ZpdmVfc2l4LCByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsID0gVFJVRSkKcDQgPC0gVU1BUFBsb3QoVGhyZWVfZml2ZV9zaXgsIGxhYmVsPVRSVUUpCnBsb3RfZ3JpZChwMSxwNCkgCkRpbVBsb3QoVGhyZWVfZml2ZV9zaXgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgc3BsaXQuYnkgPSAic3RpbSIpICAgCgpmMSA8LSBGZWF0dXJlUGxvdChUaHJlZV9maXZlX3NpeCwgZmVhdHVyZXMgPSBjKCduY1JOQS1pbnRlci1jaHI3LTU5OTgnKSwgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgc3BsaXQuYnkgPSAic3RpbSIpCgoKbG5jNTk5OCA8LSBzdWJzZXQoY29tYmluZWQsIGNlbGxzID0gbG5jNTk5OC5jZWxscywgaWRlbnRzID0gIjEiKQoKbG5jNTk5OCA8LSBSdW5VTUFQKGxuYzU5OTgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyMCApCmxuYzU5OTggPC0gRmluZE5laWdoYm9ycyhsbmM1OTk4LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjApCmxuYzU5OTggPC0gRmluZENsdXN0ZXJzKGxuYzU5OTgsIHJlc29sdXRpb24gPSAxICkgICAKbG5jNTk5OCA8LSBSdW5UU05FKGxuYzU5OTgsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMToyMCkKICAgIAogIyBWaXN1YWxpemF0aW9uCnAxIDwtIFVNQVBQbG90KGxuYzU5OTgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic3RpbSIpCnAyIDwtIFVNQVBQbG90KGxuYzU5OTgsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAibW91c2Uuc2V4IikKcDMgPC0gVU1BUFBsb3QobG5jNTk5OCwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUpCnA0IDwtIFVNQVBQbG90KGxuYzU5OTgsIGxhYmVsPVRSVUUpCnBsb3RfZ3JpZChwMSxwNCkgCkRpbVBsb3QobG5jNTk5OCwgcmVkdWN0aW9uID0gInVtYXAiLCBzcGxpdC5ieSA9ICJzdGltIikgICAKCmxuYzU5OTguY2VsbHMgPC0gV2hpY2hDZWxscyhvYmplY3QgPSBjb21iaW5lZCwgZXhwcmVzc2lvbiA9ICJuY1JOQS1pbnRlci1jaHI3LTU5OTgiID4gMSkKRmVhdHVyZVBsb3QobG5jNTk5OCwgZmVhdHVyZXMgPSBjKCJuY1JOQS1pbnRlci1jaHI3LTU5OTgiKSwgc3BsaXQuYnkgPSAic3RpbSIsICAKKyAgICAgICAgICAgICBjb2xzID0gYygiZ3JleSIsICJyZWQiKSwgY2VsbHMgPSBsbmM1OTk4LmNlbGxzLG1pbi5jdXRvZmYgPSAwLjUpCgoKRGVmYXVsdEFzc2F5KGxuYzU5OTgpIDwtICJSTkEiCmxuYzU5OTggPC0gTm9ybWFsaXplRGF0YShsbmM1OTk4LCB2ZXJib3NlID0gRkFMU0UpCgpwbG90cyA8LSBWbG5QbG90KGxuYzU5OTgsIGZlYXR1cmVzID0gYygiQWxiIiwgIm5jUk5BLWludGVyLWNocjctNTk5OCIsIkN5cDJiMTAiLCJDeXAyZTEiLCJDeXAyZjIiKSwgc3BsaXQuYnkgPSAic3RpbSIsIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIHB0LnNpemUgPSAwLCBjb21iaW5lID0gRkFMU0UpCkNvbWJpbmVQbG90cyhwbG90cyA9IHBsb3RzLCBuY29sID0gMSkKCiAKYGBgCgpgYGB7cn0KZCA8LSBkaXN0KHQoR2V0QXNzYXlEYXRhKEtPLmNlbGxzLCBzbG90ID0gInNjYWxlLmRhdGEiKSkpCiMgUnVuIHRoZSBNRFMgcHJvY2VkdXJlLCBrIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zCm1kcyA8LSBjbWRzY2FsZShkID0gZCwgayA9IDIpCiMgY21kc2NhbGUgcmV0dXJucyB0aGUgY2VsbCBlbWJlZGRpbmdzLCB3ZSBmaXJzdCBsYWJlbCB0aGUgY29sdW1ucyB0byBlbnN1cmUgZG93bnN0cmVhbQojIGNvbnNpc3RlbmN5CmNvbG5hbWVzKG1kcykgPC0gcGFzdGUwKCJNRFNfIiwgMToyKQojIFdlIHdpbGwgbm93IHN0b3JlIHRoaXMgYXMgYSBjdXN0b20gZGltZW5zaW9uYWwgcmVkdWN0aW9uIGNhbGxlZCAnbWRzJwpLTy5jZWxsc1tbIm1kcyJdXSA8LSBDcmVhdGVEaW1SZWR1Y09iamVjdChlbWJlZGRpbmdzID0gbWRzLCBrZXkgPSAiTURTXyIsIGFzc2F5ID0gRGVmYXVsdEFzc2F5KEtPLmNlbGxzKSkKCiMgV2UgY2FuIG5vdyB1c2UgdGhpcyBhcyB5b3Ugd291bGQgYW55IG90aGVyIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiBpbiBhbGwgZG93bnN0cmVhbSBmdW5jdGlvbnMKRGltUGxvdChLTy5jZWxscywgcmVkdWN0aW9uID0gIm1kcyIsIHB0LnNpemUgPSAwLjUpCmBgYAoKRmluZCBkaWZmZXJlbnRpYWwgbWFya2VycwoKYGBge3J9CktPLmNlbGxzJGNlbGx0eXBlLnN0aW0gPC0gcGFzdGUoSWRlbnRzKEtPLmNlbGxzKSwgS08uY2VsbHMkc3RpbSwgc2VwID0gIl8iKQpLTy5jZWxscyRjZWxsdHlwZSA8LSBJZGVudHMoS08uY2VsbHMpCklkZW50cyhLTy5jZWxscykgPC0gImNlbGx0eXBlLnN0aW0iCnJlc3BvbnNlMyA8LSBGaW5kTWFya2VycyhLTy5jZWxscywgaWRlbnQuMSA9IGMoIjFfRzE3MUIiLCIwX0cxNzFCIiwiMl9HMTcxQiIpLCBpZGVudC4yID0gYygiMV9HMTcxQyIsICIwX0cxNzFDIiwiMl9HMTcxQyIpLCB2ZXJib3NlID0gVFJVRSwgdGVzdC51c2UgPSAiTUFTVCIsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKaGVhZChyZXNwb25zZTMsIG4gPSAxNSkKCgojREUxOiBDb21wYXJlIGNsdXN0ZXIgMCsxKzEyICh0aGF0IGV4cHJlc3NlZCBsbmM1OTk4KSB3aXRoIE90aGVyIGhlcGF0b2N5dGUgY2x1c3RlcnMgKDIrNSs4KQojREUyOiBjb21wYXJlIGNsdXN0ZXIgMSAoc2hvd2VkIG1ham9yIGVmZmVjdHMgaW4gdGhlIEtEKSB2cyBDbHVzdGVyIDAgKHRoYXQgc2hvd2VkIGxpdHRsZSBLRCkKI0RFMzogRm9yIEtPLmNlbGxzIHRoYXQgZm9ybWVkIGZpdmUgc3ViY2x1c3RlciwgY29tcGFyZSBjbHVzdGVycyAzKzQrNSsxIHZzIDIrMAojREU0OiBmb3IgS08uY2VsbHMgdGhhdCBmb3JtZWQgZml2ZSBjbHVzdGVycy4gQ29tYXByZSBjbHVzdGVyIDQgdnMuIDIKCkRFMDExMi4yNTggPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCIwIiwiMSIsIjEyIiApLCBpZGVudC4yID0gYygiMiIsIjUiLCI4IiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREUwMTEyLkFsbCA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjAiLCIxIiwiMTIiICksIHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkRFMS4yIDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiMSIgKSwgaWRlbnQuMiA9IGMoIjIiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpERTEuNSA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjEiICksIGlkZW50LjIgPSBjKCI1IiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREUxLjggPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCIxIiApLCBpZGVudC4yID0gYygiOCIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgoKREUyLjUgPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCIyIiApLCBpZGVudC4yID0gYygiNSIpLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkRFMi44IDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiMiIgKSwgaWRlbnQuMiA9IGMoIjgiKSx2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpERTUuOCA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjUiICksIGlkZW50LjIgPSBjKCI4IiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCgpERUs0MzUxLjIwIDwtIEZpbmRNYXJrZXJzKEtPLmNlbGxzLCBpZGVudC4xID0gYygiMyIsIjQiLCI1IiwiMSIgKSwgaWRlbnQuMiA9IGMoIjIiLCIwIiksdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCkRFSzQuMyA8LSBGaW5kTWFya2VycyhLTy5jZWxscywgaWRlbnQuMSA9ICI0IiwgaWRlbnQuMiA9ICIzIix2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpERUs0LjIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiNCIsIGlkZW50LjIgPSAiMiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLNC4wIDwtIEZpbmRNYXJrZXJzKEtPLmNlbGxzLCBpZGVudC4xID0gIjQiLCBpZGVudC4yID0gIjAiLHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkRFSzQuMSA8LSBGaW5kTWFya2VycyhLTy5jZWxscywgaWRlbnQuMSA9ICI0IiwgaWRlbnQuMiA9ICIxIix2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpERUs0LjUgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiNCIsIGlkZW50LjIgPSAiNSIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCgoKIyMjIyMgY29tYXByaXNvbiBiZXR3ZWVuIEcxNzFCIHZzIEcxNzFDIGZvciBLTy5jZWxsIGNsdXN0ZXJzIG9mIDArMSsxMiAjIyMjIyMzMwoKREVLNF9DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiNF9HMTcxQyIsIGlkZW50LjIgPSAiNF9HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLM19DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiM19HMTcxQyIsIGlkZW50LjIgPSAiM19HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLMV9DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiMV9HMTcxQyIsIGlkZW50LjIgPSAiMV9HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLMl9DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiMl9HMTcxQyIsIGlkZW50LjIgPSAiMl9HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLMF9DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiMF9HMTcxQyIsIGlkZW50LjIgPSAiMF9HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKREVLNV9DLkIgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSAiNV9HMTcxQyIsIGlkZW50LjIgPSAiNV9HMTcxQiIsdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBXcml0ZSB0aGUgcmVzdWx0cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCndyaXRlLmNzdihERTAxMTIuMjU4LCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERTAxMTIuMjU4IikKd3JpdGUuY3N2KERFMDExMi5BbGwsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFMDExMi5BbGwiKQp3cml0ZS5jc3YoREUxLjIsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFMS4yIikKd3JpdGUuY3N2KERFMS41LCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERTEuNSIpCndyaXRlLmNzdihERTEuOCwgIkNvdW50UmVzdWx0L01hcmtlcnMvREUxLjgiKQp3cml0ZS5jc3YoREUyLjUsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFMi41IikKd3JpdGUuY3N2KERFMi44LCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERTIuOCIpCndyaXRlLmNzdihERTUuOCwgIkNvdW50UmVzdWx0L01hcmtlcnMvREU1LjgiKQoKd3JpdGUuY3N2KERFSzQzNTEuMjAsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFSzQzNTEuMjAiKQp3cml0ZS5jc3YoREVLNC4zLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs0LjMiKQp3cml0ZS5jc3YoREVLNC4yLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs0LjIiKQp3cml0ZS5jc3YoREVLNC4wLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs0LjAiKQp3cml0ZS5jc3YoREVLNC4xLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs0LjEiKQp3cml0ZS5jc3YoREVLNC41LCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs0LjUiKQoKCndyaXRlLmNzdihERUs0X0MuQiwgIkNvdW50UmVzdWx0L01hcmtlcnMvREVLNF9DLkIiKQp3cml0ZS5jc3YoREVLM19DLkIsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFSzNfQy5CIikKd3JpdGUuY3N2KERFSzFfQy5CLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUsxX0MuQiIpCndyaXRlLmNzdihERUsyX0MuQiwgIkNvdW50UmVzdWx0L01hcmtlcnMvREVLMl9DLkIiKQp3cml0ZS5jc3YoREVLMF9DLkIsICJDb3VudFJlc3VsdC9NYXJrZXJzL0RFSzBfQy5CIikKd3JpdGUuY3N2KERFSzVfQy5CLCAiQ291bnRSZXN1bHQvTWFya2Vycy9ERUs1X0MuQiIpCgoKCgpjb21iaW5lZCRjZWxsdHlwZS5zdGltIDwtIHBhc3RlKElkZW50cyhjb21iaW5lZCksIGNvbWJpbmVkJHN0aW0sIHNlcCA9ICJfIikKY29tYmluZWQkY2VsbHR5cGUgPC0gSWRlbnRzKGNvbWJpbmVkKQpJZGVudHMoY29tYmluZWQpIDwtICJjZWxsdHlwZS5zdGltIgoKCnRlc3QuY29tYmluZWQkY2VsbHR5cGUuc3RpbSA8LSBwYXN0ZShJZGVudHModGVzdC5jb21iaW5lZCksIHRlc3QuY29tYmluZWQkc3RpbSwgc2VwID0gIl8iKQp0ZXN0LmNvbWJpbmVkJGNlbGx0eXBlIDwtIElkZW50cyh0ZXN0LmNvbWJpbmVkKQpJZGVudHModGVzdC5jb21iaW5lZCkgPC0gImNlbGx0eXBlLnN0aW0iCgoKCgpDb21iaW5lZF9HMTcxQl92c19HMTcxQyA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjBfRzE3MUIiLCIxX0cxNzFCIiwiMl9HMTcxQiIsIjNfRzE3MUIiLCI0X0cxNzFCIiwiNV9HMTcxQiIsIjZfRzE3MUIiLCI3X0cxNzFCIiwiOF9HMTcxQiIsIjlfRzE3MUIiLCIxMF9HMTcxQiIsIjExX0cxNzFCIiwiMTJfRzE3MUIiICksIGlkZW50LjIgPSBjKCIwX0cxNzFDIiwiMV9HMTcxQyIsIjJfRzE3MUMiLCIzX0cxNzFDIiwiNF9HMTcxQyIsIjVfRzE3MUMiLCI2X0cxNzFDIiwiN19HMTcxQyIsIjhfRzE3MUMiLCI5X0cxNzFDIiwiMTBfRzE3MUMiLCIxMV9HMTcxQyIsIjEyX0cxNzFDIiApLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKCkNvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MSA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjFfRzE3MUMiKSwgaWRlbnQuMiA9IGMoIjFfRzE3MUIiKSwgdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3QwIDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiMF9HMTcxQyIpLCBpZGVudC4yID0gYygiMF9HMTcxQiIpLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEyIDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiMTJfRzE3MUMiKSwgaWRlbnQuMiA9IGMoIjEyX0cxNzFCIiksIHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkNvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MiA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjJfRzE3MUMiKSwgaWRlbnQuMiA9IGMoIjJfRzE3MUIiKSwgdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3Q1IDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiNV9HMTcxQyIpLCBpZGVudC4yID0gYygiNV9HMTcxQiIpLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDggPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCI4X0cxNzFDIiksIGlkZW50LjIgPSBjKCI4X0cxNzFCIiksIHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCgoKQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3QzIDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiM19HMTcxQyIpLCBpZGVudC4yID0gYygiM19HMTcxQiIpLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDQgPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCI0X0cxNzFDIiksIGlkZW50LjIgPSBjKCI0X0cxNzFCIiksIHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkNvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0NiA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjZfRzE3MUMiKSwgaWRlbnQuMiA9IGMoIjZfRzE3MUIiKSwgdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3Q3IDwtIEZpbmRNYXJrZXJzKGNvbWJpbmVkLCBpZGVudC4xID0gYygiN19HMTcxQyIpLCBpZGVudC4yID0gYygiN19HMTcxQiIpLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDkgPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCI5X0cxNzFDIiksIGlkZW50LjIgPSBjKCI5X0cxNzFCIiksIHZlcmJvc2UgPSBUUlVFLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCkNvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MTAgPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCIxMF9HMTcxQyIpLCBpZGVudC4yID0gYygiMTBfRzE3MUIiKSwgdmVyYm9zZSA9IFRSVUUsIGxvZ2ZjLnRocmVzaG9sZCA9IEZBTFNFLG1pbi5wY3QgPSBGQUxTRSkKQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3QxMSA8LSBGaW5kTWFya2Vycyhjb21iaW5lZCwgaWRlbnQuMSA9IGMoIjExX0cxNzFDIiksIGlkZW50LjIgPSBjKCIxMV9HMTcxQiIpLCB2ZXJib3NlID0gVFJVRSwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQoKCgoKCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MSIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDAsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MCIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEyLCAiQ291bnRSZXN1bHQvTWFya2Vycy9Db21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEyIikKd3JpdGUuY3N2KENvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MiwgIkNvdW50UmVzdWx0L01hcmtlcnMvQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3QyIikKd3JpdGUuY3N2KENvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0NSwgIkNvdW50UmVzdWx0L01hcmtlcnMvQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3Q1IikKd3JpdGUuY3N2KENvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0OCwgIkNvdW50UmVzdWx0L01hcmtlcnMvQ29tYmluZWRfRzE3MUNfdnNfRzE3MUJfQ2x1c3Q4IikKCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDMsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MyIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDQsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0NCIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDYsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0NiIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDcsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0NyIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDksICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0OSIpCndyaXRlLmNzdihDb21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEwLCAiQ291bnRSZXN1bHQvTWFya2Vycy9Db21iaW5lZF9HMTcxQ192c19HMTcxQl9DbHVzdDEwIikKd3JpdGUuY3N2KENvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MTEsICJDb3VudFJlc3VsdC9NYXJrZXJzL0NvbWJpbmVkX0cxNzFDX3ZzX0cxNzFCX0NsdXN0MTEiKQoKCgoKClBDX3ZzX1BQX0cxNzFCIDwtIEZpbmRNYXJrZXJzKEtPLmNlbGxzLCBpZGVudC4xID0gYygiNF9HMTcxQiIsIjNfRzE3MUIiKSwgaWRlbnQuMiA9IGMoIjBfRzE3MUIiLCIyX0cxNzFCIiksIHZlcmJvc2UgPSBUUlVFLCB0ZXN0LnVzZSA9ICJNQVNUIiwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpoZWFkKFBDX3ZzX1BQX0cxNzFCLCBuID0gMTUpCgoKUENfdnNfUFBfRzE3MUMgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSBjKCI0X0cxNzFDIiwiM19HMTcxQyIpLCBpZGVudC4yID0gYygiMF9HMTcxQyIsIjJfRzE3MUMiKSwgdmVyYm9zZSA9IFRSVUUsIHRlc3QudXNlID0gIk1BU1QiLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCmhlYWQoUENfdnNfUFBfRzE3MUMsIG4gPSAxNSkKCgpQQ192c19QUF9HMTcxQkMgPC0gRmluZE1hcmtlcnMoS08uY2VsbHMsIGlkZW50LjEgPSBjKCI0X0cxNzFCIiwiM19HMTcxQiIsIjRfRzE3MUMiLCIzX0cxNzFDIiksIGlkZW50LjIgPSBjKCIwX0cxNzFCIiwiMl9HMTcxQiIsIjBfRzE3MUMiLCIyX0cxNzFDIiksIHZlcmJvc2UgPSBUUlVFLCB0ZXN0LnVzZSA9ICJNQVNUIiwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpoZWFkKFBDX3ZzX1BQX0cxNzFDLCBuID0gMTUpCgoKbG5jNTk5OF9LT19ERV8xIDwtIEZpbmRNYXJrZXJzKEtPLmNlbGxzLCBpZGVudC4xID0gYygiNF9HMTcxQiIsIjNfRzE3MUIiLCI1X0cxNzFCIiksIGlkZW50LjIgPSBjKCI0X0cxNzFDIiwiM19HMTcxQyIsIjVfRzE3MUMiKSwgdmVyYm9zZSA9IFRSVUUsIHRlc3QudXNlID0gIk1BU1QiLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCmhlYWQobG5jNTk5OF9LT19ERSwgbiA9IDE1KQoKCmxuYzU5OThfS09fREVfMiA8LSBGaW5kTWFya2VycyhLTy5jZWxscywgaWRlbnQuMSA9IGMoIjRfRzE3MUMiLCIzX0cxNzFDIiwiNV9HMTcxQyIpLCBpZGVudC4yID1jKCI0X0cxNzFCIiwiM19HMTcxQiIsIjVfRzE3MUIiKSAsIHZlcmJvc2UgPSBUUlVFLCB0ZXN0LnVzZSA9ICJNQVNUIiwgbG9nZmMudGhyZXNob2xkID0gRkFMU0UsbWluLnBjdCA9IEZBTFNFKQpoZWFkKGxuYzU5OThfS09fREUsIG4gPSAxNSkKCmNlbGwudHlwZS5nZW5lcyA8LSAoUENfdnNfUFBfRzE3MUJDWzFdKSAjIFRha2VzIGFsbCB0aGUgdW5pcXVlIGNlbGwgdHlwZSBzcGVjaWZpYyBnZW5lcwpHT3Rlcm1zID0gdG9wR090ZXJtcyhmZy5nZW5lcyA9IGNlbGwudHlwZS5nZW5lcywgYmcuZ2VuZXMgPSByb3duYW1lcyhLTy5jZWxsc0Bhc3NheXMkUk5BQGRhdGFLTy5jZWxsc0Bhc3NheXMkUk5BQGRhdGEpLCBvcmdhbmlzbSA9ICJNb3VzZSIpCgpjZWxsLnR5cGUuZ2VuZXMgPC0gKFBDX3ZzX1BQX0cxNzFCQ1sxXSkgIyBUYWtlcyBhbGwgdGhlIHVuaXF1ZSBjZWxsIHR5cGUgc3BlY2lmaWMgZ2VuZXMKR090ZXJtcyA9IHRvcEdPdGVybXMoZmcuZ2VuZXMgPSByb3duYW1lcyhjZWxsLnR5cGUuZ2VuZXMpLCBiZy5nZW5lcyA9IHJvd25hbWVzKEtPLmNlbGxzQGFzc2F5cyRSTkFAZGF0YSksIG9yZ2FuaXNtID0gIk1vdXNlIikKIApgYGAKCmBgYHtyfQoKQXZlcmdlRXhwcmVzc2lvbjIgPC0gZnVuY3Rpb24gKG9iamVjdCwgYXNzYXlzID0gTlVMTCwgZmVhdHVyZXMgPSBOVUxMLCByZXR1cm4uc2V1cmF0ID0gRkFMU0UsIAogICAgICAgICAgYWRkLmlkZW50ID0gTlVMTCwgc2xvdCA9ICJkYXRhIiwgdXNlLnNjYWxlID0gRkFMU0UsIHVzZS5jb3VudHMgPSBGQUxTRSwgCiAgICAgICAgICB2ZXJib3NlID0gVFJVRSwgLi4uKSAKewogICAgCiAgICBmeG4uYXZlcmFnZSA8LSBzd2l0Y2goRVhQUiA9IHNsb3QsIGRhdGEgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuKG1lYW4oeCA9IHgpKQogICAgfSwgbWVhbikKICAgIG9iamVjdC5hc3NheXMgPC0gRmlsdGVyT2JqZWN0cyhvYmplY3QgPSBvYmplY3QsIGNsYXNzZXMua2VlcCA9ICJBc3NheSIpCiAgICBhc3NheXMgPC0gYXNzYXlzICV8fCUgb2JqZWN0LmFzc2F5cwogICAgaWRlbnQub3JpZyA8LSBJZGVudHMob2JqZWN0ID0gb2JqZWN0KQogICAgb3JpZy5sZXZlbHMgPC0gbGV2ZWxzKHggPSBJZGVudHMob2JqZWN0ID0gb2JqZWN0KSkKICAgIGlkZW50Lm5ldyA8LSBjKCkKICAgIGlmICghYWxsKGFzc2F5cyAlaW4lIG9iamVjdC5hc3NheXMpKSB7CiAgICAgICAgYXNzYXlzIDwtIGFzc2F5c1thc3NheXMgJWluJSBvYmplY3QuYXNzYXlzXQogICAgICAgIGlmIChsZW5ndGgoYXNzYXlzKSA9PSAwKSB7CiAgICAgICAgICAgIHN0b3AoIk5vbmUgb2YgdGhlIHJlcXVlc3RlZCBhc3NheXMgYXJlIHByZXNlbnQgaW4gdGhlIG9iamVjdCIpCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB3YXJuaW5nKCJSZXF1ZXN0ZWQgYXNzYXlzIHRoYXQgZG8gbm90IGV4aXN0IGluIG9iamVjdC4gUHJvY2VlZGluZyB3aXRoIGV4aXN0aW5nIGFzc2F5cyBvbmx5LiIpCiAgICAgICAgfQogICAgfQogICAgaWYgKCFpcy5udWxsKHggPSBhZGQuaWRlbnQpKSB7CiAgICAgICAgbmV3LmRhdGEgPC0gRmV0Y2hEYXRhKG9iamVjdCA9IG9iamVjdCwgdmFycyA9IGFkZC5pZGVudCkKICAgICAgICBuZXcuaWRlbnQgPC0gcGFzdGUoSWRlbnRzKG9iamVjdClbcm93bmFtZXMoeCA9IG5ldy5kYXRhKV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcuZGF0YVssIDFdLCBzZXAgPSAiXyIpCiAgICAgICAgSWRlbnRzKG9iamVjdCwgY2VsbHMgPSByb3duYW1lcyhuZXcuZGF0YSkpIDwtIG5ldy5pZGVudAogICAgfQogICAgZGF0YS5yZXR1cm4gPC0gbGlzdCgpCiAgICBmb3IgKGkgaW4gMTpsZW5ndGgoeCA9IGFzc2F5cykpIHsKICAgICAgICBkYXRhLnVzZSA8LSBHZXRBc3NheURhdGEob2JqZWN0ID0gb2JqZWN0LCBhc3NheSA9IGFzc2F5c1tpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSBzbG90KQogICAgICAgIGZlYXR1cmVzLmFzc2F5IDwtIGZlYXR1cmVzCiAgICAgICAgaWYgKGxlbmd0aCh4ID0gaW50ZXJzZWN0KHggPSBmZWF0dXJlcywgeSA9IHJvd25hbWVzKHggPSBkYXRhLnVzZSkpKSA8IAogICAgICAgICAgICAxKSB7CiAgICAgICAgICAgIGZlYXR1cmVzLmFzc2F5IDwtIHJvd25hbWVzKHggPSBkYXRhLnVzZSkKICAgICAgICB9CiAgICAgICAgZGF0YS5hbGwgPC0gZGF0YS5mcmFtZShyb3cubmFtZXMgPSBmZWF0dXJlcy5hc3NheSkKICAgICAgICBmb3IgKGogaW4gbGV2ZWxzKHggPSBJZGVudHMob2JqZWN0KSkpIHsKICAgICAgICAgICAgdGVtcC5jZWxscyA8LSBXaGljaENlbGxzKG9iamVjdCA9IG9iamVjdCwgaWRlbnRzID0gaikKICAgICAgICAgICAgZmVhdHVyZXMuYXNzYXkgPC0gdW5pcXVlKHggPSBpbnRlcnNlY3QoeCA9IGZlYXR1cmVzLmFzc2F5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJvd25hbWVzKHggPSBkYXRhLnVzZSkpKQogICAgICAgICAgICBpZiAobGVuZ3RoKHggPSB0ZW1wLmNlbGxzKSA9PSAxKSB7CiAgICAgICAgICAgICAgICBkYXRhLnRlbXAgPC0gKGRhdGEudXNlW2ZlYXR1cmVzLmFzc2F5LCB0ZW1wLmNlbGxzXSkKICAgICAgICAgICAgICAgIGlmIChzbG90ID09ICJkYXRhIikgewogICAgICAgICAgICAgICAgICAgIGRhdGEudGVtcCA8LSAgZGF0YS50ZW1wCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxlbmd0aCh4ID0gdGVtcC5jZWxscykgPiAxKSB7CiAgICAgICAgICAgICAgICBkYXRhLnRlbXAgPC0gYXBwbHkoWCA9IGRhdGEudXNlW2ZlYXR1cmVzLmFzc2F5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5jZWxscywgZHJvcCA9IEZBTFNFXSwgTUFSR0lOID0gMSwgRlVOID0gZnhuLmF2ZXJhZ2UpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YS5hbGwgPC0gY2JpbmQoZGF0YS5hbGwsIGRhdGEudGVtcCkKICAgICAgICAgICAgY29sbmFtZXMoeCA9IGRhdGEuYWxsKVtuY29sKHggPSBkYXRhLmFsbCldIDwtIGoKICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UocGFzdGUoIkZpbmlzaGVkIGF2ZXJhZ2luZyIsIGFzc2F5c1tpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgY2x1c3RlciIsIGopKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpID09IDEpIHsKICAgICAgICAgICAgICAgIGlkZW50Lm5ldyA8LSBjKGlkZW50Lm5ldywgYXMuY2hhcmFjdGVyKHggPSBpZGVudC5vcmlnW3RlbXAuY2VsbHNbMV1dKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuYW1lcyh4ID0gaWRlbnQubmV3KSA8LSBsZXZlbHMoeCA9IElkZW50cyhvYmplY3QpKQogICAgICAgIGRhdGEucmV0dXJuW1tpXV0gPC0gZGF0YS5hbGwKICAgICAgICBuYW1lcyh4ID0gZGF0YS5yZXR1cm4pW2ldIDwtIGFzc2F5c1tbaV1dCiAgICB9CiAgICBpZiAocmV0dXJuLnNldXJhdCkgewogICAgICAgIHRvUmV0IDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSBkYXRhLnJldHVybltbMV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9ICJBdmVyYWdlIiwgYXNzYXkgPSBuYW1lcyh4ID0gZGF0YS5yZXR1cm4pWzFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKQogICAgICAgIGlmIChsZW5ndGgoeCA9IGRhdGEucmV0dXJuKSA+IDEpIHsKICAgICAgICAgICAgZm9yIChpIGluIDI6bGVuZ3RoKHggPSBkYXRhLnJldHVybikpIHsKICAgICAgICAgICAgICAgIHRvUmV0W1tuYW1lcyh4ID0gZGF0YS5yZXR1cm4pW2ldXV0gPC0gQ3JlYXRlQXNzYXlPYmplY3QoY291bnRzID0gZGF0YS5yZXR1cm5bW2ldXSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoRGVmYXVsdEFzc2F5KG9iamVjdCA9IG9iamVjdCkgJWluJSBuYW1lcyh4ID0gZGF0YS5yZXR1cm4pKSB7CiAgICAgICAgICAgIERlZmF1bHRBc3NheShvYmplY3QgPSB0b1JldCkgPC0gRGVmYXVsdEFzc2F5KG9iamVjdCA9IG9iamVjdCkKICAgICAgICB9CiAgICAgICAgSWRlbnRzKHRvUmV0LCBjZWxscyA9IGNvbG5hbWVzKHggPSB0b1JldCkpIDwtIGlkZW50Lm5ld1tjb2xuYW1lcyh4ID0gdG9SZXQpXQogICAgICAgIElkZW50cyhvYmplY3QgPSB0b1JldCkgPC0gZmFjdG9yKHggPSBJZGVudHMob2JqZWN0ID0gdG9SZXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBhcy5jaGFyYWN0ZXIoeCA9IG9yaWcubGV2ZWxzKSwgb3JkZXJlZCA9IFRSVUUpCiAgICAgICAgdG9SZXQgPC0gTm9ybWFsaXplRGF0YShvYmplY3QgPSB0b1JldCwgdmVyYm9zZSA9IHZlcmJvc2UpCiAgICAgICAgdG9SZXQgPC0gU2NhbGVEYXRhKG9iamVjdCA9IHRvUmV0LCB2ZXJib3NlID0gdmVyYm9zZSkKICAgICAgICByZXR1cm4odG9SZXQpCiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4oZGF0YS5yZXR1cm4pCiAgICB9Cn0KYGBgCgoKCkZpbmQgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gbWFya2VycwoKYGBge3J9CmNvbWJpbmVkLm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMob2JqZWN0ID0gY29tYmluZWQsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIHRocmVzaC51c2UgPSAwLjI1KQpjb21iaW5lZC5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24oMiwgYXZnX2xvZ0ZDKQoKS08ubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhvYmplY3QgPSBLTy5jZWxscywgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgdGhyZXNoLnVzZSA9IDAuMjUpCgpyZXNwb25zZTMgPC0gRmluZE1hcmtlcnMoY29tYmluZWQsIGlkZW50LjEgPSBjKCIxX0cxNzFCIiwiMF9HMTcxQiIsIjJfRzE3MUIiKSwgaWRlbnQuMiA9IGMoIjFfRzE3MUMiLCAiMF9HMTcxQyIsIjJfRzE3MUMiKSwgdmVyYm9zZSA9IFRSVUUsIHRlc3QudXNlID0gIk1BU1QiLCBsb2dmYy50aHJlc2hvbGQgPSBGQUxTRSxtaW4ucGN0ID0gRkFMU0UpCmhlYWQocmVzcG9uc2UzLCBuID0gMTUpCgpgYGAKCgoKClZpc3VhbGl6ZSB0b3AgZ2VuZXMgaW4gcHJpbmNpcGFsIGNvbXBvbmVudHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04fQpQQ0hlYXRtYXAob2JqZWN0ID0gdGlzczEsIHBjLnVzZSA9IDE6MywgY2VsbHMudXNlID0gNTAwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gOCkKYGBgCgpMYXRlciBvbiAoaW4gRmluZENsdXN0ZXJzIGFuZCBUU05FKSB5b3Ugd2lsbCBwaWNrIGEgbnVtYmVyIG9mIHByaW5jaXBhbCBjb21wb25lbnRzIHRvIHVzZS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBrZWVwaW5nIHRoZSBtYWpvciBkaXJlY3Rpb25zIG9mIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSBhbmQsIGlkZWFsbHksIHN1cHJlc3Npbmcgbm9pc2UuIFRoZXJlIGlzIG5vIGNvcnJlY3QgYW5zd2VyIHRvIHRoZSBudW1iZXIgdG8gdXNlLCBidXQgYSBkZWNlbnQgcnVsZSBvZiB0aHVtYiBpcyB0byBnbyB1bnRpbCB0aGUgcGxvdCBwbGF0ZWF1cy4KCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSB0aXNzMSkKYGBgCgpDaG9vc2UgdGhlIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuCmBgYHtyfQojIFNldCBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMuIApuLnBjcyA9IDEwCmBgYAoKVGhlIGNsdXN0ZXJpbmcgaXMgcGVyZm9ybWVkIGJhc2VkIG9uIGEgbmVhcmVzdCBuZWlnaGJvcnMgZ3JhcGguIENlbGxzIHRoYXQgaGF2ZSBzaW1pbGFyIGV4cHJlc3Npb24gd2lsbCBiZSBqb2luZWQgdG9nZXRoZXIuIFRoZSBMb3V2YWluIGFsZ29yaXRobSBsb29rcyBmb3IgZ3JvdXBzIG9mIGNlbGxzIHdpdGggaGlnaCBtb2R1bGFyaXR5LS1tb3JlIGNvbm5lY3Rpb25zIHdpdGhpbiB0aGUgZ3JvdXAgdGhhbiBiZXR3ZWVuIGdyb3Vwcy4gVGhlIHJlc29sdXRpb24gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIHNjYWxlLiBIaWdoZXIgcmVzb2x1dGlvbiB3aWxsIGdpdmUgbW9yZSBjbHVzdGVycywgbG93ZXIgcmVzb2x1dGlvbiB3aWxsIGdpdmUgZmV3ZXIuCgpGb3IgdGhlIHRvcC1sZXZlbCBjbHVzdGVyaW5nLCBhaW0gdG8gdW5kZXItY2x1c3RlciBpbnN0ZWFkIG9mIG92ZXItY2x1c3Rlci4gSXQgd2lsbCBiZSBlYXN5IHRvIHN1YnNldCBncm91cHMgYW5kIGZ1cnRoZXIgYW5hbHl6ZSB0aGVtIGJlbG93LgoKYGBge3J9CiMgU2V0IHJlc29sdXRpb24gCnJlcy51c2VkIDwtIDQKdGlzczEgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IHRpc3MxLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUsIGZvcmNlLnJlY2FsYyA9IFRSVUUpCmBgYAoKV2UgdXNlIFRTTkUgc29sZWx5IHRvIHZpc3VhbGl6ZSB0aGUgZGF0YS4KYGBge3J9CiMgSWYgY2VsbHMgYXJlIHRvbyBzcHJlYWQgb3V0LCB5b3UgY2FuIHJhaXNlIHRoZSBwZXJwbGV4aXR5LiBJZiB5b3UgaGF2ZSBmZXcgY2VsbHMsIHRyeSBhIGxvd2VyIHBlcnBsZXhpdHkgKGJ1dCBuZXZlciBsZXNzIHRoYW4gMTApLgp0aXNzMSA8LSBSdW5UU05FKG9iamVjdCA9IHRpc3MxLCBkaW1zLnVzZSA9IDE6bi5wY3MsIHNlZWQudXNlID0gMTAsIHBlcnBsZXhpdHk9MzApCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHRpc3MxLCBkby5sYWJlbCA9IFQsIHB0LnNpemUgPSAxLjIsIGxhYmVsLnNpemUgPSA0KQpgYGAKIyMgQ29tcGFyZSB0byBwcmV2aW91cyBhbm5vdGF0aW9ucwpgYGB7cn0KcHJldmlvdXNfYW5ub3RhdGlvbiA9IHJlYWQuY3N2KCIvVXNlcnMva2thcnJpL0RvY3VtZW50cy9MYWIvU2luZ2xlX2NlbGxfcHJvamVjdC9kcm9wc2VxL0xpdmVyX2Ryb3BsZXRfYW5ub3RhdGlvbi5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmNvbHMgPSBjKCdmcmVlX2Fubm90YXRpb24nLCAnY2VsbF9vbnRvbG9neV9jbGFzcycpCiAgICBmb3IgKGNvbCBpbiBjb2xzKXsKICAgICAgcHJldmlvdXNfY29sID0gcGFzdGUwKCdwcmV2aW91c18nLCBjb2wpCiAgICAgIHRpc3MxQG1ldGEuZGF0YVssIHByZXZpb3VzX2NvbF0gPC0gIk5BIgogICAgICB0aXNzMUBtZXRhLmRhdGFbYXMuY2hhcmFjdGVyKHByZXZpb3VzX2Fubm90YXRpb24kWCksIHByZXZpb3VzX2NvbF0gPC0gcHJldmlvdXNfYW5ub3RhdGlvblssIGNvbF0KICAgICAgcHJpbnQodGFibGUodGlzczFAbWV0YS5kYXRhWywgcHJldmlvdXNfY29sXSkpCiAgICAgIHByaW50KHRhYmxlKHRpc3MxQG1ldGEuZGF0YVssIHByZXZpb3VzX2NvbF0sIHRpc3NAaWRlbnQpKQogICAgICAKICAgIH0KICAgIAp0aXNzMSA9IGNvbXBhcmVfcHJldmlvdXNfYW5ub3RhdGlvbih0aXNzMSwgdGlzc3VlX29mX2ludGVyZXN0LCAiZHJvcGxldCIpClRTTkVQbG90KG9iamVjdCA9IHRpc3MxLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJwcmV2aW91c19jZWxsX29udG9sb2d5X2NsYXNzIikKdGFibGUodGlzczFAbWV0YS5kYXRhWywgInByZXZpb3VzX2NlbGxfb250b2xvZ3lfY2xhc3MiXSwgdGlzc0BpZGVudCkKYGBgCgoKYGBge3J9CnRpc3MxID0gY29tcGFyZV9wcmV2aW91c19hbm5vdGF0aW9uKHRpc3MxLCB0aXNzdWVfb2ZfaW50ZXJlc3QsICJkcm9wbGV0IikKVFNORVBsb3Qob2JqZWN0ID0gdGlzczEsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gInByZXZpb3VzX2NlbGxfb250b2xvZ3lfY2xhc3MiKQp0YWJsZSh0aXNzMUBtZXRhLmRhdGFbLCAicHJldmlvdXNfY2VsbF9vbnRvbG9neV9jbGFzcyJdLCB0aXNzMUBpZGVudCkKYGBgCgoKYGBge3J9ClRTTkVQbG90KHRpc3MxLCBncm91cC5ieT0ibW91c2Uuc2V4IikKVFNORVBsb3QodGlzczEsIGdyb3VwLmJ5PSJtb3VzZS5pZCIpCmBgYAoKClNpZ25pZmljYW50IGdlbmVzOgoKaGVwYXRvY3l0ZTogQWxiLCBUdHIsIEFwb2ExLCBhbmQgU2VycGluYTFjCnBlcmljZW50cmFsOiBDeXAyZTEsIEdsdWwsIE9hdCwgR3VsbwptaWRsb2J1bGFyOiBBc3MxLCBIYW1wLCBHc3RwMSwgVWJiCnBlcmlwb3J0YWw6IEN5cDJmMiwgUGNrMSwgSGFsLCBDZGgxCgplbmRvdGhlbGlhbCBjZWxsczogUGVjYW0xLCBOcnAxLCBLZHIrIGFuZCBPaXQzKwpLdXBwZmVyIGNlbGxzOiBFbXIxLCBDbGVjNGYsIENkNjgsIElyZjcKTksvTktUIGNlbGxzOiBaYXA3MCwgSWwycmIsIE5rZzcsIEN4Y3I2LCBLbHIxYywgR3ptYQpCIGNlbGxzOiBDZDc5YSwgQ2Q3OWIsIENkNzQgYW5kIENkMTkKSW1tdW5lIGNlbGxzOiBQdHByYwoKCgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MTYsIGZpZy53aWR0aD0xMn0KIyBIZXBhdGljIG1hcmtlcgpGZWF0dXJlUGxvdCh0aXNzMSwgYyhnZW5lc19oZXApLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIGNvbHMudXNlID0gYygiZ3JleSIsICJyZWQiKSkKCiMgRW5kb3RoZWxpYWwgbWFya2VycwpGZWF0dXJlUGxvdCh0aXNzMSwgYyhnZW5lc19lbmRvKSwgcHQuc2l6ZSA9IDEsIG5Db2wgPSA0LCBjb2xzLnVzZSA9IGMoImdyZXkiLCAicmVkIikpCgojIEt1cGZmZXIgY2VsbHMKRmVhdHVyZVBsb3QodGlzczEsIGMoZ2VuZXNfa3VwcGZlciksIHB0LnNpemUgPSAxLCBuQ29sID0gNCwgY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpKQoKIyBnZW5lc19uawpGZWF0dXJlUGxvdCh0aXNzMSwgYyhnZW5lc19uayksIHB0LnNpemUgPSAxLCBuQ29sID0gNCwgY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpKQoKIyBnZW5lc19iCkZlYXR1cmVQbG90KHRpc3MxLCBjKGdlbmVzX2IpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIGNvbHMudXNlID0gYygiZ3JleSIsICJyZWQiKSkKCiMgZ2VuZXMgYmlsZSBkdWN0IGVuZG8gY2VsbHMKRmVhdHVyZVBsb3QodGlzczEsIGMoZ2VuZXNfYmVjKSwgcHQuc2l6ZSA9IDEsIG5Db2wgPSA0LCBjb2xzLnVzZSA9IGMoImdyZXkiLCAicmVkIikpCgojIGdlbmVzIGltbXVuZQpGZWF0dXJlUGxvdCh0aXNzMSwgYyhnZW5lc19pbW11bmUpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIGNvbHMudXNlID0gYygiZ3JleSIsICJyZWQiKSkKCgpgYGAKCkRvdHBsb3RzIGxldCB5b3Ugc2VlIHRoZSBpbnRlbnNpdHkgb2YgZXhwcHJlc3Npb24gYW5kIHRoZSBmcmFjdGlvbiBvZiBjZWxscyBleHByZXNzaW5nIGZvciBlYWNoIG9mIHlvdXIgZ2VuZXMgb2YgaW50ZXJlc3QuClRoZSByYWRpdXMgc2hvd3MgeW91IHRoZSBwZXJjZW50IG9mIGNlbGxzIGluIHRoYXQgY2x1c3RlciB3aXRoIGF0IGxlYXN0IG9uZSByZWFkIHNlcXVlbmNlZCBmcm9tIHRoYXQgZ2VuZS4gVGhlIGNvbG9yIGxldmVsIGluZGljYXRlcyB0aGUgYXZlcmFnZQpaLXNjb3JlIG9mIGdlbmUgZXhwcmVzc2lvbiBmb3IgY2VsbHMgaW4gdGhhdCBjbHVzdGVyLCB3aGVyZSB0aGUgc2NhbGluZyBpcyBkb25lIG92ZXIgdGFrZW4gb3ZlciBhbGwgY2VsbHMgaW4gdGhlIHNhbXBsZS4KCiNXZSBoYXZlIHZhcmlvdXMgaW1tdW5lIGNlbGwgdHlwZXMgaW4gdGhlIGxhc3QgY2x1c3RlcgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CkRvdFBsb3QodGlzczEsIGMoZ2VuZXNfa3VwcGZlciwgZ2VuZXNfbmssIGdlbmVzX2IsICJQdHByYyIpLCBwbG90LmxlZ2VuZCA9IFQsIGNvbC5tYXggPSAyLjUsIGRvLnJldHVybiA9IFQpICsgY29vcmRfZmxpcCgpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpEb3RQbG90KHRpc3MxLCBjKGdlbmVzX2hlcF9tYWluLCBnZW5lc19lbmRvLCBnZW5lc19uaywgZ2VuZXNfa3VwcGZlciwgZ2VuZXNfYmVjX2JfaW1tdW5lKSwgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBUKSArIGNvb3JkX2ZsaXAoKQpgYGAKClVzaW5nIHRoZSBtYXJrZXJzIGFib3ZlLCB3ZSBjYW4gY29uZmlkZW50YWx5IGxhYmVsIG1hbnkgb2YgdGhlIGNsdXN0ZXJzOgoKMTk6IGVuZG90aGVsaWFsIGNlbGxzCjIwOiBiaWxlIGR1Y3QgZXBpdGhlbGlhbCBjZWxscwoyMTogaW1tdW5lIGNlbGxzCnJlc3QgYXJlIGhlcGF0b2N5dGVzCgpXZSB3aWxsIGFkZCB0aG9zZSBjZWxsX29udG9sb2d5X2NsYXNzZXMgdG8gdGhlIGRhdGFzZXQuCgpgYGB7cn0KdGlzczEgPC0gU3Rhc2hJZGVudChvYmplY3QgPSB0aXNzMSwgc2F2ZS5uYW1lID0gImNsdXN0ZXIuaWRzIikKY2x1c3Rlci5pZHMgPC0gYygwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwKQpmcmVlX2Fubm90YXRpb24gPC0gYygKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICBOQSwKICAiYmlsZSBkdWN0IGVwaXRoZWxpYWwgY2VsbHMiLAogICJlbmRvdGhlbGlhbCBjZWxsIG9mIGhlcGF0aWMgc2ludXNvaWQiLAogIE5BCiAgKQpjZWxsX29udG9sb2d5X2NsYXNzIDwtIGMoCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImhlcGF0b2N5dGUiLAogICJoZXBhdG9jeXRlIiwKICAiaGVwYXRvY3l0ZSIsCiAgImR1Y3QgZXBpdGhlbGlhbCBjZWxsIiwKICAiZW5kb3RoZWxpYWwgY2VsbCBvZiBoZXBhdGljIHNpbnVzb2lkIiwKICAiaGVwYXRvY3l0ZSIpCnRpc3MxID0gc3Rhc2hfYW5ub3RhdGlvbnModGlzczEsIGNsdXN0ZXIuaWRzLCBmcmVlX2Fubm90YXRpb24sIGNlbGxfb250b2xvZ3lfY2xhc3MpCmBgYAoKIyMgQ2hlY2tpbmcgZm9yIGJhdGNoIGVmZmVjdHMKCkNvbG9yIGJ5IG1ldGFkYXRhLCBsaWtlIHBsYXRlIGJhcmNvZGUsIHRvIGNoZWNrIGZvciBiYXRjaCBlZmZlY3RzLgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gdGlzczEsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gImNoYW5uZWwiKQpUU05FUGxvdChvYmplY3QgPSB0aXNzMSwgZG8ucmV0dXJuID0gVFJVRSwgZ3JvdXAuYnkgPSAiZnJlZV9hbm5vdGF0aW9uIikKCmBgYAoKIyMgU3ViY2x1c3RlcgoKTGV0J3MgZHJpbGwgZG93biBvbiB0aGUgaGVwYXRvY3l0ZXMuCgpgYGB7cn0Kc3VidGlzczEgPSBTdWJzZXREYXRhKHRpc3MxLCBpZGVudC51c2UgPSBjKDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMjApKQoKCmBgYAoKYGBge3J9CnN1YnRpc3MxIDwtIHN1YnRpc3MxICU+JSBTY2FsZURhdGEoKSAlPiUKICBGaW5kVmFyaWFibGVHZW5lcyhkby5wbG90ID0gRkFMU0UsIHguaGlnaC5jdXRvZmYgPSBJbmYsIHkuY3V0b2ZmID0gMC41KSAlPiUKICBSdW5QQ0EoZG8ucHJpbnQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KUENIZWF0bWFwKG9iamVjdCA9IHN1YnRpc3MxLCBwYy51c2UgPSAxOjMsIGNlbGxzLnVzZSA9IDIwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gOCkKUENFbGJvd1Bsb3Qoc3VidGlzczEpCmBgYAoKCmBgYHtyfQpzdWIubi5wY3MgPSA4CnN1Yi5yZXMudXNlID0gMC41CnN1YnRpc3MxIDwtIHN1YnRpc3MxICU+JSBGaW5kQ2x1c3RlcnMocmVkdWN0aW9uLnR5cGUgPSAicGNhIiwgZGltcy51c2UgPSAxOnN1Yi5uLnBjcywKICAgIHJlc29sdXRpb24gPSBzdWIucmVzLnVzZSwgcHJpbnQub3V0cHV0ID0gMCwgc2F2ZS5TTk4gPSBUUlVFLCBmb3JjZS5yZWNhbGMgPSBUUlVFKSAlPiUKICAgIFJ1blRTTkUoZGltcy51c2UgPSAxOnN1Yi5uLnBjcywgc2VlZC51c2UgPSAxMCwgcGVycGxleGl0eT04KQpUU05FUGxvdChvYmplY3QgPSBzdWJ0aXNzMSwgZG8ubGFiZWwgPSBULCBwdC5zaXplID0gMSwgbGFiZWwuc2l6ZSA9IDQpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MjUsIGZpZy53aWR0aD0yNX0KRmVhdHVyZVBsb3Qoc3VidGlzczEsIGdlbmVzX2hlcCxjb2xzLnVzZSA9IGMoImdyZXkiLCAicmVkIiksIHB0LnNpemUgPSA0LCBuQ29sID0gNCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9CkRvdFBsb3Qoc3VidGlzczEsIGFsbF9nZW5lcywgY29sLm1heCA9IDIuNSwgcGxvdC5sZWdlbmQgPSBULCBkby5yZXR1cm4gPSBUKSArIGNvb3JkX2ZsaXAoKQpgYGAKCmBgYHtyfQpCdWlsZENsdXN0ZXJUcmVlKHN1YnRpc3MxKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OH0KI2ZlbWFsZSBnZW5lcyBoYXZlIGxvd2VyIGV4cHJlc3Npb24gaW4gY2x1c3RlciA2IHJlbGF0aXZlIHRvIG90aGVyIGZlbWFsZSBjbHVzdGVycywgZXNwZWNhbGx5IFhpc3QKRmVhdHVyZVBsb3Qoc3VidGlzczEsYygnTXVwMjAnLCAnTXVwMScsJ011cDEyJywgJ011cDIxJywgJ0N5cDJkOScsICdYaXN0JywgJ0ExYmcnLCAnQ3lwMmM2OScpLGNvbHMudXNlID0gYygiZ3JleSIsICJyZWQiKSwgcHQuc2l6ZSA9IDMsIG5Db2wgPSAyKQoKRG90UGxvdCh0aXNzMSxjKCdNdXAyMCcsICdNdXAxJywnTXVwMTInLCAnTXVwMjEnLCAnQ3lwMmQ5JywgJ1hpc3QnLCAnQTFiZycsICdDeXAyYzY5JyksIHBsb3QubGVnZW5kID0gVCwgY29sLm1heCA9IDIuNSwgZG8ucmV0dXJuID0gVCkgKyBjb29yZF9mbGlwKCkKCmBgYAoKCkZyb20gdGhlc2UgZ2VuZXMsIGl0IGFwcGVhcnMgdGhhdCB0aGUgY2x1c3RlcnMgcmVwcmVzZW50OgoKMDogbWlkbG9idWxhciBtYWxlCjE6IHBlcmljZW50cmFsIGZlbWFsZQoyOiBwZXJpcG9ydGFsIGZlbWFsZQozOiBwZXJpcG9ydGFsIG1hbGUKNDogbWlkbG9idWxhciBtYWxlCjU6IHBlcmljZW50cmFsIG1hbGUKNjogbWlkbG9idWxhciBmZW1hbGUKNzogbWlkbG9idWxhciBmZW1hbGUKClRoZSBtdWx0aXR1ZGUgb2YgY2x1c3RlcnMgb2YgZWFjaCB0eXBlIGNvcnJlc3BvbmQgbW9zdGx5IHRvIGluZGl2aWR1YWwgYW5pbWFscy9zZXhlcy4KCmBgYHtyfQp0YWJsZShGZXRjaERhdGEoc3VidGlzczEsIGMoJ21vdXNlLnNleCcsJ2lkZW50JykpICU+JSBkcm9wbGV2ZWxzKCkpCmBgYAoKYGBge3J9CnN1Yi5jbHVzdGVyLmlkcyA8LSBjKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpCnN1Yi5mcmVlX2Fubm90YXRpb24gPC0gYygicGVyaXBvcnRhbCBmZW1hbGUiLCAibWlkbG9idWxhciBtYWxlIiwgInBlcmljZW50cmFsIGZlbWFsZSIsICJwZXJpcG9ydGFsIG1hbGUiLCAibWlkbG9idWxhciBtYWxlIiwgInBlcmljZW50cmFsIG1hbGUiLCAibWlkbG9idWxhciBmZW1hbGUiLCAibWlkbG9idWxhciBmZW1hbGUiKQpzdWIuY2VsbF9vbnRvbG9neV9jbGFzcyA8LSBjKCJoZXBhdG9jeXRlIiwgImhlcGF0b2N5dGUiLCAiaGVwYXRvY3l0ZSIsICJoZXBhdG9jeXRlIiwgImhlcGF0b2N5dGUiLCAiaGVwYXRvY3l0ZSIsICJoZXBhdG9jeXRlIiwgImhlcGF0b2N5dGUiKQpzdWJ0aXNzMSA9IHN0YXNoX2Fubm90YXRpb25zKHN1YnRpc3MxLCBzdWIuY2x1c3Rlci5pZHMsIHN1Yi5mcmVlX2Fubm90YXRpb24sIHN1Yi5jZWxsX29udG9sb2d5X2NsYXNzKQp0aXNzMSA9IHN0YXNoX3N1YnRpc3NfaW5fdGlzcyh0aXNzMSwgc3VidGlzczEpCmBgYAoKTGl2ZXIgem9uYXRpb24gbWFya2VycwoKYGBge3J9CmdlbmVzX3pvbmVzID0gYygnQ3lwMmUxJywgJ0dsdWwnLCAnT2F0JywgJ0d1bG8nLAogICAgICAgICAgICAgICdBc3MxJywgJ0hhbXAnLCAnR3N0cDEnLCAnVWJiJywKICAgICAgICAgICAgICAnQ3lwMmYyJywgJ1BjazEnLCAnSGFsJywgJ0NkaDEnKQoKRmVhdHVyZVBsb3Qoc3VidGlzczEsYyhnZW5lc196b25lcyksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCgpEb3RQbG90KHN1YnRpc3MxLGMoZ2VuZXNfem9uZXMpLCBwbG90LmxlZ2VuZCA9IFQsIGNvbC5tYXggPSAyLjUsIGRvLnJldHVybiA9IFQpICsgY29vcmRfZmxpcCgpCgoKVFNORVBsb3Qob2JqZWN0ID0gc3VidGlzczEsIGRvLmxhYmVsID0gVCwgcHQuc2l6ZSA9IDEsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieT0iZnJlZV9hbm5vdGF0aW9uIikKClRTTkVQbG90KG9iamVjdCA9IHRpc3MxLCBkby5sYWJlbCA9IFQsIHB0LnNpemUgPSAxLCBsYWJlbC5zaXplID0gNCwgZ3JvdXAuYnk9ImZyZWVfYW5ub3RhdGlvbiIpCgpgYGAKCgoKIyMjIyMjIyMjIwpGaW5kIGNsdXN0ZXIgbWFya2VycyBmb3IgbG5jUk5BcwpgYGB7cn0KCk1JTl9MT0dGT0xEX0NIQU5HRSA9IDEgIyBzZXQgdG8gbWluaW11bSByZXF1aXJlZCBhdmVyYWdlIGxvZyBmb2xkIGNoYW5nZSBpbiBnZW5lIGV4cHJlc3Npb24uCk1JTl9QQ1RfQ0VMTFNfRVhQUl9HRU5FID0gMC4xCgphbGwubWFya2VycyA9IEZpbmRBbGxNYXJrZXJzKHRpc3MxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wY3QgPSBNSU5fUENUX0NFTExTX0VYUFJfR0VORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dmYy50aHJlc2hvbGQgPSBNSU5fTE9HRk9MRF9DSEFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS5wb3MgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlPSJiaW1vZCIpICMgbGlrZWxpaG9vZCByYXRpbyB0ZXN0CmxuY19hbGxfbWFya2VycyA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeD0gcm93bmFtZXMoYWxsLm1hcmtlcnMpLCB2YWx1ZSA9IFRSVUUpCmxuY19hbGxfbWFya2VycwoKI1sxXSAibmNSTkFfaW50ZXJfY2hyMTBfOTIwODEiICJuY1JOQV9pbnRyYV9jaHIxNl8xMzM4MyIgIm5jUk5BX2ludGVyX2NocjE3XzEzNjA1IiAibmNSTkFfaW50ZXJfY2hyMTRfMTE4MTUiCiNbNV0gIm5jUk5BX2ludGVyX2NocjE4XzE0MzQ0IgoKRmVhdHVyZVBsb3Qoc3VidGlzczEsYyhsbmNfYWxsX21hcmtlcnMpLGNvbHMudXNlID0gYygiZ3JleSIsICJyZWQiKSwgcHQuc2l6ZSA9IDEsIG5Db2wgPSA0KQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBsbmNSTkEgbWFya2Vycy0gQ0VMTCBUWVBFIE1BUktFUiAjIyMjIyMjIyMjIyMKbWFya2Vycy5oZXAgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzczEsIGlkZW50LjEgPSBjKDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMjApLCBpZGVudC4yID0gYygxOCwxOSksb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgdGhyZXNoLnVzZSA9IDAuMjUpCmxuY19tYXJrZXJzX2hlcCA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeD0gcm93bmFtZXMobWFya2Vycy5oZXApLCB2YWx1ZSA9IFRSVUUpCmxuY19tYXJrZXJzX2hlcApGZWF0dXJlUGxvdCh0aXNzMSxjKGxuY19tYXJrZXJzX2hlcCksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCkRvdFBsb3QodGlzczEsbG5jX21hcmtlcnNfaGVwLCBwbG90LmxlZ2VuZCA9IFQsIGNvbC5tYXggPSAyLjUsIGRvLnJldHVybiA9IFQpICsgY29vcmRfZmxpcCgpCiNbMV0gIm5jUk5BX2FzX2NocjExXzk0MjMiICAgICAibmNSTkFfYXNfY2hyN182MTY2IiAgICAgICJuY1JOQV9pbnRlcl9jaHI0XzMyOTUiICAgIm5jUk5BX2ludGVyX2NocjE3XzE0MDI2IgojWzVdICJuY1JOQV9pbnRlcl9jaHIzXzI5MTUiICAgIm5jUk5BX2ludGVyX2NocjVfNDU0NyIgICAibmNSTkFfaW50ZXJfY2hyMTVfMTI2ODQiCgoKbWFya2Vycy5oZXAuTUFTVCA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzMSwgaWRlbnQuMSA9IGMoMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywyMCksIGlkZW50LjIgPSBjKDE4LDE5KSxvbmx5LnBvcyA9IFRSVUUsIHRlc3QudXNlID0gIk1BU1QiKQpsbmNfbWFya2Vyc19oZXBfTUFTVF9UQUJMRSA8LSBzdWJzZXQobWFya2Vycy5oZXAuTUFTVCwgZ3JlcGwoIl5uY1JOQSIsIHJvd25hbWVzKG1hcmtlcnMuaGVwLk1BU1QpKSkKbG5jX21hcmtlcnNfaGVwX01BU1QgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMuaGVwLk1BU1QpLCB2YWx1ZSA9IFRSVUUpCmxuY19tYXJrZXJzX2hlcF9NQVNUCgoKCm1hcmtlcnMuZW5kbyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzMSwgaWRlbnQuMSA9IGMoMTgsMTkpLCAgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgdGhyZXNoLnVzZSA9IDAuNSkKbG5jX21hcmtlcnNfZW5kbyA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeD0gcm93bmFtZXMobWFya2Vycy5lbmRvKSwgdmFsdWUgPSBUUlVFKQpsbmNfbWFya2Vyc19lbmRvCkZlYXR1cmVQbG90KHRpc3MxLGMobG5jX21hcmtlcnNfZW5kbyksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCkRvdFBsb3QodGlzczEsbG5jX21hcmtlcnNfZW5kbywgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBUKSArIGNvb3JkX2ZsaXAoKQoKCiMibmNSTkFfaW50ZXJfY2hyMTVfMTI3NzAiLCAibmNSTkFfaW50ZXJfY2hyMTJfMTA4MTciLCAibmNSTkFfYXNfY2hyMTNfMTE0NTEiLAoKCm1hcmtlcnMuZW5kby5NQVNUIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MxLCBpZGVudC4xID0gMTksIHRlc3QudXNlID0gIk1BU1QiICxvbmx5LnBvcyA9IFRSVUUpCmxuY19tYXJrZXJzX2VuZG9fTUFTVF9UQUJMRSA8LSBzdWJzZXQobWFya2Vycy5lbmRvLk1BU1QsIGdyZXBsKCJebmNSTkEiLCByb3duYW1lcyhtYXJrZXJzLmVuZG8uTUFTVCkpKQpsbmNfbWFya2Vyc19lbmRvX01BU1QgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMuZW5kby5NQVNUKSwgdmFsdWUgPSBUUlVFKQpsbmNfbWFya2Vyc19lbmRvX01BU1QKCgojIyMjIyMjIyMjIyMjIyMjIyMgbG5jUk5BIGV4cHJlc3Npb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjMwoKIyAibmNSTkFfaW50ZXJfY2hyMTdfMTM2MDUiICwgIm5jUk5BX2ludHJhX2NocjE2XzEzMzgzIgoKIyMjIyMjIyMjIyBQZXJpcG9yYWwgbWFya2Vycy0gem9uYXRpb24gbWFya2VycyAjIyMjIyMjIyMjIyMKbWFya2Vycy5wYyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzdWJ0aXNzMSwgaWRlbnQuMSA9IGMoMiw1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gRkFMU0UsIG1pbi5wY3QgPSAwLjAwMSwgdGhyZXNoLnVzZSA9IDAuMDAxLCB0ZXN0LnVzZSA9ICJiaW1vZCIgKQoKbWFya2Vycy5wYy5NQVNUIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHN1YnRpc3MxLCBpZGVudC4xID0gYygyLDUpLCBpZGVudC4yID0gYygwLDMpLCB0ZXN0LnVzZSA9ICJNQVNUIiAsb25seS5wb3MgPSBUUlVFKQpsbmNfbWFya2Vyc19wYyA8LSBzdWJzZXQobWFya2Vycy5wYywgZ3JlcGwoIl5uY1JOQSIsIHJvd25hbWVzKG1hcmtlcnMucGMpKSkKbG5jX21hcmtlcnNfcGMgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMucGMpLCB2YWx1ZSA9IFRSVUUpCmxuY19tYXJrZXJzX3BjIAoKbWFya2Vycy5wYy5NQVNUIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHN1YnRpc3MxLCBpZGVudC4xID0gYygyLDUpLCBpZGVudC4yID0gYygwLDMpLCB0ZXN0LnVzZSA9ICJNQVNUIiAsb25seS5wb3MgPSBUUlVFKQpsbmNfbWFya2Vyc19wY19NQVNUIDwtIHN1YnNldChtYXJrZXJzLnBjLk1BU1QsIGdyZXBsKCJebmNSTkEiLCByb3duYW1lcyhtYXJrZXJzLnBjLk1BU1QpKSkKbG5jX21hcmtlcnNfcGNfTUFTVCA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeD0gcm93bmFtZXMobWFya2Vycy5wYy5NQVNUKSwgdmFsdWUgPSBUUlVFKQpsbmNfbWFya2Vyc19wY19NQVNUCgpEb3RQbG90KHRpc3MxLCBsbmNfbWFya2Vyc19wYywgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBULCBncm91cC5ieT0iZnJlZV9hbm5vdGF0aW9uIikgKyBjb29yZF9mbGlwKCkKRmVhdHVyZVBsb3Qoc3VidGlzczEsYyhsbmNfbWFya2Vyc19wYyksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBtaWRsb2J1bGFyIGdlbmVzICMjIyMjIyMjIyMjIyMKCm1hcmtlcnMubWlkIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHN1YnRpc3MxLCBpZGVudC4xID0gYygxLDQsNiw3KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gRkFMU0UsIG1pbi5wY3QgPSAwLjAwMSwgdGhyZXNoLnVzZSA9IDAuMDUpCgpsbmNfbWFya2Vyc19taWQgPC0gc3Vic2V0KG1hcmtlcnMubWlkLCBncmVwbCgiXm5jUk5BIiwgcm93bmFtZXMobWFya2Vycy5taWQpKSkKbG5jX21hcmtlcnNfbWlkIDwtIGdyZXAocGF0dGVybiA9ICJebmNSTkEiLCB4PSByb3duYW1lcyhtYXJrZXJzLm1pZCksIHZhbHVlID0gVFJVRSkKbG5jX21hcmtlcnNfbWlkCkRvdFBsb3QodGlzczEsIGxuY19tYXJrZXJzX21pZCwgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBULCBncm91cC5ieT0iZnJlZV9hbm5vdGF0aW9uIikgKyBjb29yZF9mbGlwKCkKCgpGZWF0dXJlUGxvdChzdWJ0aXNzMSxjKGxuY19tYXJrZXJzX21pZCksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQpCgoKCm1hcmtlcnMubWlkLk1BU1QgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc3VidGlzczEsIGlkZW50LjEgPSBjKDEsNCw2LDcpLHRlc3QudXNlID0gIk1BU1QiLG9ubHkucG9zID0gVFJVRSApCgpsbmNfbWFya2Vyc19taWRfTUFTVF9UQUJMRSA8LSBzdWJzZXQobWFya2Vycy5taWQuTUFTVCwgZ3JlcGwoIl5uY1JOQSIsIHJvd25hbWVzKG1hcmtlcnMubWlkLk1BU1QpKSkKbG5jX21hcmtlcnNfbWlkX01BU1QgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMubWlkLk1BU1QpLCB2YWx1ZSA9IFRSVUUpCmxuY19tYXJrZXJzX21pZF9NQVNUCgoKIyMjIyMzIHBlcmlwb3J0YWxtYXJrZXIgZ2VuZXMjIyMjIyMjIyMjIyMzCgptYXJrZXJzLnBwIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHN1YnRpc3MxLCBpZGVudC4xID0gYygwLDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IEZBTFNFLCBtaW4ucGN0ID0gMC4wMDEsIHRocmVzaC51c2UgPSAwLjA1KQoKCmxuY19tYXJrZXJzX3BwIDwtIHN1YnNldChtYXJrZXJzLnBwLCBncmVwbCgiXm5jUk5BIiwgcm93bmFtZXMobWFya2Vycy5wcCkpKQpsbmNfbWFya2Vyc19wcCA8LSBncmVwKHBhdHRlcm4gPSAiXm5jUk5BIiwgeD0gcm93bmFtZXMobWFya2Vycy5wcCksIHZhbHVlID0gVFJVRSkKbG5jX21hcmtlcnNfcHAKCm1hcmtlcnMucHAuTUFTVCA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzdWJ0aXNzMSwgaWRlbnQuMSA9IGMoMCwzKSwgaWRlbnQuMiA9IGMoMiw1KSx0ZXN0LnVzZSA9ICJNQVNUIixvbmx5LnBvcyA9IFRSVUUgKQoKbG5jX21hcmtlcnNfcHBfTUFTVF9UQUJMRSA8LSBzdWJzZXQobWFya2Vycy5wcC5NQVNULCBncmVwbCgiXm5jUk5BIiwgcm93bmFtZXMobWFya2Vycy5wcC5NQVNUKSkpCmxuY19tYXJrZXJzX3BwX01BU1QgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMucHAuTUFTVCksIHZhbHVlID0gVFJVRSkKbG5jX21hcmtlcnNfcHBfTUFTVAoKRmVhdHVyZVBsb3Qoc3VidGlzczEsYyhsbmNfbWFya2Vyc19wcCksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIG1heC5jdXRvZmYgPSAxKQpEb3RQbG90KHRpc3MxLCBjKGxuY19tYXJrZXJzX3BwLCJDeXAyZTEiLCJDeXAyZjIiKSwgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBULCBncm91cC5ieT0gImZyZWVfYW5ub3RhdGlvbiIpICsgY29vcmRfZmxpcCgpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIGFtbGUgYW5kIGZlbWFsZSBzcGVjaWZpYyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgptYXJrZXJzLmZlbWFsZSA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzdWJ0aXNzMSwgaWRlbnQuMSA9IGMoMCwyLDYsNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMSwgbG9nZmMudGhyZXNob2xkID0gMSkKCmxuY19tYXJrZXJzX2ZlbWFsZSA8LSBzdWJzZXQobWFya2Vycy5mZW1hbGUsIGdyZXBsKCJebmNSTkEiLCByb3duYW1lcyhtYXJrZXJzLmZlbWFsZSkpKQpsbmNfbWFya2Vyc19mZW1hbGUgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMuZmVtYWxlKSwgdmFsdWUgPSBUUlVFKQpsbmNfbWFya2Vyc19mZW1hbGUKCkZlYXR1cmVQbG90KHN1YnRpc3MxLGMobG5jX21hcmtlcnNfZmVtYWxlKSxjb2xzLnVzZSA9IGMoImdyZXkiLCAicmVkIiksIHB0LnNpemUgPSAxLCBuQ29sID0gNCwgbWF4LmN1dG9mZiA9IDEpCkRvdFBsb3QodGlzczEsIGMobG5jX21hcmtlcnNfZmVtYWxlLCJDeXAyZTEiLCJDeXAyZjIiKSwgcGxvdC5sZWdlbmQgPSBULCBjb2wubWF4ID0gMi41LCBkby5yZXR1cm4gPSBULCBncm91cC5ieT0gImZyZWVfYW5ub3RhdGlvbiIpICsgY29vcmRfZmxpcCgpCgoKCm1hcmtlcnMubWFsZSA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzdWJ0aXNzMSwgaWRlbnQuMSA9IGMoMSwzLDQsNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMDAxLCB0aHJlc2gudXNlID0gMC4wNSkKCmxuY19tYXJrZXJzX21hbGUgPC0gc3Vic2V0KG1hcmtlcnMubWFsZSwgZ3JlcGwoIl5uY1JOQSIsIHJvd25hbWVzKG1hcmtlcnMubWFsZSkpKQpsbmNfbWFya2Vyc19tYWxlIDwtIGdyZXAocGF0dGVybiA9ICJebmNSTkEiLCB4PSByb3duYW1lcyhtYXJrZXJzLm1hbGUpLCB2YWx1ZSA9IFRSVUUpCmxuY19tYXJrZXJzX21hbGUKCkZlYXR1cmVQbG90KHN1YnRpc3MxLGMobG5jX21hcmtlcnNfbWFsZSksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIG1heC5jdXRvZmYgPSAxKQpEb3RQbG90KHRpc3MxLCBjKGxuY19tYXJrZXJzX21hbGUsIkN5cDJlMSIsIkN5cDJmMiIpLCBwbG90LmxlZ2VuZCA9IFQsIGNvbC5tYXggPSAyLjUsIGRvLnJldHVybiA9IFQsIGdyb3VwLmJ5PSAiZnJlZV9hbm5vdGF0aW9uIikgKyBjb29yZF9mbGlwKCkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZlbWFsZSB6b25hdGUgc3BlY2lmaWMgZ2VuZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm1hcmtlcnMucGVyaWNlbnRyYWwuZmVtYWxlIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MxLCBpZGVudC4xID0gYyg2LDExLDE0LDIwKSwgdGVzdC51c2UgPSAiTUFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjEsIGlkZW50LjIgPSBjKDIsMywxNSwxMiwxMyw4LDUsMTYpLCBsb2dmYy50aHJlc2hvbGQgPSAxKQoKbWFya2Vycy5wZXJpcG9ydGFsLmZlbWFsZSA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzMSwgaWRlbnQuMSA9IGMoMiwzLDE1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMSwgaWRlbnQuMiA9IGMoNiwxMSwxNCwyMCwxMiwxMyw4LDUsMTYpLCBsb2dmYy50aHJlc2hvbGQgPSAxKQoKCm1hcmtlcnMucGVyaWNlbnRyYWwubWFsZSA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzMSwgaWRlbnQuMSA9IGMoMTMsMTIpLCB0ZXN0LnVzZSA9ICJNQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMSwgaWRlbnQuMiA9IGMoMiwzLDE1LDgsNSwxNiw2LDExLDE0LDIwKSwgbG9nZmMudGhyZXNob2xkID0gMSkKCgptYXJrZXJzLnBlcmlwb3J0YWwubWFsZSA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzMSwgaWRlbnQuMSA9IGMoOCw1LDE2KSwgdGVzdC51c2UgPSAiTUFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjEsIGlkZW50LjIgPSBjKDIsMywxNSwxMywxMiw2LDExLDE0LDIwKSwgbG9nZmMudGhyZXNob2xkID0gMSkKCgoKCiMjIyMjIyMjIyMjIyMjIyB4ZW5vLWxuY3MgQ0FSP1JYUiAjIyMjIyMjIyMjIyMjIyMjIyMKCkZlYXR1cmVQbG90KHRpc3MxLGMoIm5jUk5BX2ludGVyX2NocjE1XzEyNjg0IiwibmNSTkFfaW50ZXJfY2hyOF83NDMwIiwibmNSTkFfaW50ZXJfY2hyN182MjIyIiksY29scy51c2UgPSBjKCJncmV5IiwgInJlZCIpLCBwdC5zaXplID0gMSwgbkNvbCA9IDQsIG1heC5jdXRvZmYgPSAxKQoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKbWFya2Vycy5lbmRvLjIgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2V1cmF0X2Ryb3AsIGxvZ2ZjLnRocmVzaG9sZCA9IDIsaWRlbnQuMSA9ICJFbmRvdGhlbGlhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKCmxuYy5lbmRvLjIgPC0gZ3JlcChwYXR0ZXJuID0gIl5uY1JOQSIsIHg9IHJvd25hbWVzKG1hcmtlcnMuZW5kby4yKSwgdmFsdWUgPSBUUlVFKQpsbmMuZW5kby4yCgoKCgoKYGBgCgoKClpvbmF0ZWQgbG5jUk5BcyAKCmBgYHtyfQpwcF96b250YWVkIDwtIGMoJ25jUk5BX2ludGVyX2NocjE0XzEyMDE2JywnbmNSTkFfYXNfY2hyMTlfMTUwOTAnLCduY1JOQV9pbnRlcl9jaHIxMF85MzUxJywnbmNSTkFfaW50ZXJfY2hyMTZfMTMxNzAnLAonbmNSTkFfaW50ZXJfY2hyM18yNjk3JywnbmNSTkFfaW50ZXJfY2hyMV8yNzQnLCduY1JOQV9hc19jaHI2XzU1MTgnLCduY1JOQV9pbnRlcl9jaHIxNF8xMjA2NicsJ25jUk5BX2ludHJhX2NocjEyXzEwODcxJywKJ25jUk5BX2ludGVyX2NocjE2XzEzNTEwJywnbmNSTkFfaW50ZXJfY2hyM18yMzE0JywnbmNSTkFfaW50ZXJfY2hyMTBfOTI2NCwnbmNSTkFfaW50ZXJfY2hyOV84MTIyJykKCgoKCgpgYGAKCiMjIENoZWNraW5nIGZvciBiYXRjaCBlZmZlY3RzCgpDb2xvciBieSBtZXRhZGF0YSwgbGlrZSBwbGF0ZSBiYXJjb2RlLCB0byBjaGVjayBmb3IgYmF0Y2ggZWZmZWN0cy4KYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHN1YnRpc3MxLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJtb3VzZS5zZXgiKQoKYGBgCgojIEZpbmFsIGNvbG9yaW5nCgpDb2xvciBieSBjZWxsIG9udG9sb2d5IGNsYXNzIG9uIHRoZSBvcmlnaW5hbCBUU05FLgoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHRpc3MxLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJjZWxsX29udG9sb2d5X2NsYXNzIikKYGBgCgojIFNhdmUgdGhlIFJvYmplY3QgZm9yIGxhdGVyCgpgYGB7cn0KZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwNF90aXNzMXVlX3JvYmpfZ2VuZXJhdGVkJywgCiAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiZHJvcGxldF8iLCB0aXNzMXVlX29mX2ludGVyZXN0LCAicmVmaW5lZGNlbGxzX3NldXJhdF90aXNzMS5Sb2JqIikpCnByaW50KGZpbGVuYW1lKQpzYXZlKHRpc3MxLCBmaWxlPWZpbGVuYW1lKQpgYGAKCmBgYHtyfQojIFRvIHJlbG9hZCBhIHNhdmVkIG9iamVjdApmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzA0X3Rpc3MxdWVfcm9ial9nZW5lcmF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJkcm9wbGV0XyIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgInNldXJhdF9zbWFydGRyb3AtaW50ZWdyYXRlZC04MjcyMDE5LlJvYmoiKSkKbG9hZChmaWxlPWZpbGVuYW1lKQpgYGAKCgojIEV4cG9ydCB0aGUgZmluYWwgbWV0YWRhdGEKCgpgYGB7cn0Kc2F2ZV9hbm5vdGF0aW9uX2Nzdih0aXNzMSwgdGlzczF1ZV9vZl9pbnRlcmVzdCwgImRyb3BsZXQiKQpgYGAK