diff --git a/r_notebooks/Seurat_integrate.Rmd b/r_notebooks/Seurat_integrate.Rmd new file mode 100644 index 00000000000..74c2e12e9be --- /dev/null +++ b/r_notebooks/Seurat_integrate.Rmd @@ -0,0 +1,233 @@ +--- +title: "R Seurat Integration Notebook 1" +output: html_notebook +--- + + +Load libraries: +```{r} +library(Seurat) +library(future) +options(future.globals.maxSize=990 * 1024^2) +library(dplyr) +``` +Load data: +```{r} +controls=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_controls/outs/filtered_feature_bc_matrix/",sep="")) +treated=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_treated/outs/filtered_feature_bc_matrix/",sep="")) +``` +Create Seurat objects and perfrom SC Transformation: +```{r} + seu_list = c(controls,treated) + annot_list = c("controls", "treated") + +i=1 + seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 ) + seu_list[[i]]@meta.data[,"sample"] <- annot_list[i] + + seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt") + #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20]) + #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE) + seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 800 & percent.mt < 20 ) + + # SCTransform replaces NormalizeData, FindVariableFeatures, ScaleData + # DO NOT run ScaleData after SCTransform + seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt") + +i=2 + +seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 ) + seu_list[[i]]@meta.data[,"sample"] <- annot_list[i] + + seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt") + #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20]) + #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE) + seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 300 & percent.mt < 20 ) + + seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt") +``` +Perform the integration of treated and controls: +```{r} +seu_features <- SelectIntegrationFeatures(object.list = seu_list, nfeatures = 3000) +seu_list <- PrepSCTIntegration(object.list = seu_list, anchor.features = seu_features, verbose = FALSE) + +# considering 80 nearest neighbors when filtering anchors <- close to upper limit for smallest sample +anchors <- FindIntegrationAnchors(object.list = seu_list, normalization.method = "SCT", anchor.features = seu_features, verbose = FALSE, k.filter = 50) +seu <- IntegrateData(anchorset = anchors, normalization.method = "SCT", verbose = FALSE) +``` + +look at normalised data: +```{r} +seu[["integrated"]]@scale.data +seu[["integrated"]]@counts +seu[["integrated"]]@data +``` +Run PCA: +```{r} +seu <- RunPCA(seu, features = VariableFeatures(seu)) +``` +Identify clusters and run UMAP: +```{r} +seu <-FindNeighbors(seu, dims = 1:10) +seu <- FindClusters(seu, resolution = 0.5) +seu <- RunUMAP(seu, dims = 1:10) +``` +Plot UMAP reduction, labelling cells by cluster or by group: +```{r} +dimplot1=DimPlot(seu, reduction = "umap",label = 1) +seu$group=seu@meta.data[,"sample"] +#dimplot2=DimPlot(seu, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange")) +dimplot2=DimPlot(seu, reduction = "umap",label = 1,split.by = "group") +#grid.arrange(dimplot1,dimplot2) +dimplot2 +``` + +seu2=seu +seu2$group=factor(seu2$group,levels=c("controls","treated")) +#dimplot3=DimPlot(seu2, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange")) +dimplot3=DimPlot(seu2, reduction = "umap",label = 1,group.by = "group",cols=c("red","cyan2")) + +Save the plots: +```{r} +png(paste("~/Dim_plot_aggr_controls_treated_300_800.png",sep="_"),res = 600,width=12,height=10,units='in') +grid.arrange(dimplot1,dimplot3) +dev.off() +VlnPlot(seu, features = c( "Col1a1", "Col3a1", "Col5a1", "Col12a1", "Dcn", "Fbln2"),ncol = 2) +``` +Identify markers across clusters: +```{r} +seu.markers <- FindAllMarkers(seu, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) +top10 <- seu.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC) + +id="aggr_control_treated" +threshold="300_800" +pct_mt=20 + +markers_filtmat=seu.markers[seu.markers$p_val_adj<0.05 & seu.markers$avg_logFC>=1,] +write.table(markers_filtmat,file=paste("~/Seurat",id,threshold,"selected_markers.csv",sep="_"),sep=",") +write.table(top10,file=paste("~/Seurat",id,threshold,"_top10_selected_markers.csv",sep="_"),sep=",") + +clust_control_count=1:19 +for (i in 0:18) { +clust_control_count[i+1]=sum(seu$seurat_clusters[seu$group=="controls"]==i) +} + +clust_count=1:19 +for (i in 0:18) { +clust_count[i+1]=sum(seu$seurat_clusters==i) +} +``` +Identify markers between groups: +```{r} +markers_CT=FindMarkers(seu, ident.1="controls",group.by="group") + +subsetC=subset(seu,cells=labels(seu$group[seu$group=="controls"])) +subsetT=subset(seu,cells=labels(seu$group[seu$group=="treated"])) +``` +Look for genes in the selected features: +```{r fig.width=8, fig.height=5} +seu_features[grep("Pall",seu_features)] +``` +markers1=c("Notch1","Notch4","Nav3") #c("Igfbp2","Odc1","Il17f","Notch1","Notch4","Nav3") + +```{r fig.width=5, fig.height=7.5} +VlnPlot(seu, features = c( "Cd207" ,"Il1b","Il17f","S100a4"),ncol = 2,group.by = "group",pt.size = 0.2) +``` + +```{r fig.width=8, fig.height=7} +v1=VlnPlot(subsetC, features = markers1,ncol = 1) +v2=VlnPlot(subsetT, features = markers1,ncol = 1) + +grid.arrange(arrangeGrob(v1,top =text_grob("controls",size=20 ) ) , arrangeGrob(v2,top =text_grob("treated", size=20) ) ,nrow=1) +``` + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_kerat_granular.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Flg2", "Lor"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_langerhans.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd207"),ncol = 1) +dev.off() + +plot n_features across clusters: + +```{r fig.width=8, fig.height=6} +data2=data.frame(cluster=factor(seu$seurat_clusters),n_features=as.vector(seu$nFeature_SCT)) +row.names(data2)=c() +ggplot(data=data2, aes(x=cluster,y=n_features))+geom_violin(aes(x=cluster,y=n_features,fill=cluster)) +``` + +```{r} +VlnPlot(seu, features = c( "Gata3", "Tbx21"),ncol = 1) +``` + +```{r} +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD4_helper.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Gata3", "Tbx21", "Ccl4", "Cxcr6"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD4.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_exhausted.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cxcl13", "Pdcd1", "Ctla4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_naive.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Tcf7", "Ccr7", "Lef1", "Il7r", "Il6st", "Foxo1","Myc"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_memoryCD4_and_monocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd14","Lyz2","S100a4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_epithelial.png",sep="_"),res = 600,width=18,height=12,units='in') +print(VlnPlot(seu, features = c( "Krt17", "Krt79", "Cd200", "Lrig1"),ncol = 1)) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_stem.png",sep="_"),res = 600,width=18,height=12,units='in') +print(VlnPlot(seu, features = c( "Cd34", "Lgr5", "Lrig1", "Krt14"),ncol = 1)) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Nkg7", "Gzmb", "Ifng", "Prf1"),ncol = 2) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +VlnPlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(pbmc, features = c( "Nkg7", "Gzmb", "Ifng", "Prf1"),ncol = 2) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3) +dev.off() +#FeaturePlot +#FeaturePlot(pbmc, features =c("Gzma", "Gzmb", "Gzmh", "Gzmk", "Gzmm", "Prf1", "Nkg7", "Klrd1", "Gnly"),ncol=3) +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_cd8_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Gzma", "Gzmb", "Gzmm", "Prf1", "Nkg7", "Klrd1"),ncol=3) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=3) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_epithelial.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Krt17", "Krt79", "Cd44", "Cd200", "Lrig1"),ncol=2) +dev.off() +``` + + +When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Cmd+Shift+K* to preview the HTML file). + diff --git a/r_notebooks/Seurat_integrate_300_600.Rmd b/r_notebooks/Seurat_integrate_300_600.Rmd new file mode 100644 index 00000000000..91f01c14ded --- /dev/null +++ b/r_notebooks/Seurat_integrate_300_600.Rmd @@ -0,0 +1,235 @@ +--- +title: "R Seurat Integration Notebook 1" +output: html_notebook +--- + + +Load libraries: +```{r} +library(Seurat) +library(future) +options(future.globals.maxSize=990 * 1024^2) +library(dplyr) +library(gridExtra) +``` +Load data: +```{r} +controls=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_controls/outs/filtered_feature_bc_matrix/",sep="")) +treated=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_treated/outs/filtered_feature_bc_matrix/",sep="")) +``` +Create Seurat objects and perfrom SC Transformation: +```{r} + seu_list = c(controls,treated) + annot_list = c("controls", "treated") + +i=1 + seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 ) + seu_list[[i]]@meta.data[,"sample"] <- annot_list[i] + + seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt") + #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20]) + #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE) + seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 600 & percent.mt < 20 ) + + # SCTransform replaces NormalizeData, FindVariableFeatures, ScaleData + # DO NOT run ScaleData after SCTransform + seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt") + +i=2 + +seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 ) + seu_list[[i]]@meta.data[,"sample"] <- annot_list[i] + + seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt") + #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20]) + #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE) + seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 300 & percent.mt < 20 ) + + seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt") +``` +Perform the integration of treated and controls: +```{r} +seu_features <- SelectIntegrationFeatures(object.list = seu_list, nfeatures = 3000) +seu_list <- PrepSCTIntegration(object.list = seu_list, anchor.features = seu_features, verbose = FALSE) + +# considering 80 nearest neighbors when filtering anchors <- close to upper limit for smallest sample +anchors <- FindIntegrationAnchors(object.list = seu_list, normalization.method = "SCT", anchor.features = seu_features, verbose = FALSE, k.filter = 50) +seu <- IntegrateData(anchorset = anchors, normalization.method = "SCT", verbose = FALSE) +``` + +look at normalised data: +```{r} +seu[["integrated"]]@scale.data +seu[["integrated"]]@counts +seu[["integrated"]]@data +``` +Run PCA: +```{r} +seu <- RunPCA(seu, features = VariableFeatures(seu)) +``` +Identify clusters and run UMAP: +```{r} +seu <-FindNeighbors(seu, dims = 1:10) +seu <- FindClusters(seu, resolution = 0.5) +seu <- RunUMAP(seu, dims = 1:10) +``` +Plot UMAP reduction, labelling cells by cluster or by group: +```{r} +dimplot1=DimPlot(seu, reduction = "umap",label = 1) +seu$group=seu@meta.data[,"sample"] +#dimplot2=DimPlot(seu, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange")) +dimplot2=DimPlot(seu, reduction = "umap",label = 1,split.by = "group") +#grid.arrange(dimplot1,dimplot2) +dimplot2 +``` + +```{r} +#seu2=seu +#seu2$group=factor(seu2$group,levels=c("controls","treated")) +#dimplot3=DimPlot(seu2, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange")) +dimplot3=DimPlot(seu, reduction = "umap",label = 1,group.by = "group",cols=c("blue","orange")) +``` +Save the plots: +```{r fig.width=7, fig.height=10} +png(paste("~/Dim_plot_aggr_controls_treated_300_600.png",sep="_"),res = 600,width=12,height=10,units='in') +grid.arrange(dimplot1,dimplot3) +dev.off() +VlnPlot(seu, features = c( "Col1a1", "Col3a1", "Col5a1", "Col12a1", "Dcn", "Fbln2"),ncol = 2) +``` +Identify markers across clusters: +```{r} +seu.markers <- FindAllMarkers(seu, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) +top10 <- seu.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC) + +id="aggr_control_treated" +threshold="300_800" +pct_mt=20 + +markers_filtmat=seu.markers[seu.markers$p_val_adj<0.05 & seu.markers$avg_logFC>=1,] +write.table(markers_filtmat,file=paste("~/Seurat",id,threshold,"selected_markers.csv",sep="_"),sep=",") +write.table(top10,file=paste("~/Seurat",id,threshold,"_top10_selected_markers.csv",sep="_"),sep=",") + +clust_control_count=1:19 +for (i in 0:18) { +clust_control_count[i+1]=sum(seu$seurat_clusters[seu$group=="controls"]==i) +} + +clust_count=1:19 +for (i in 0:18) { +clust_count[i+1]=sum(seu$seurat_clusters==i) +} +``` +Identify markers between groups: +```{r} +markers_CT=FindMarkers(seu, ident.1="controls",group.by="group") + +subsetC=subset(seu,cells=labels(seu$group[seu$group=="controls"])) +subsetT=subset(seu,cells=labels(seu$group[seu$group=="treated"])) +``` +Look for genes in the selected features: +```{r fig.width=8, fig.height=5} +seu_features[grep("Pall",seu_features)] +``` +markers1=c("Notch1","Notch4","Nav3") #c("Igfbp2","Odc1","Il17f","Notch1","Notch4","Nav3") + +```{r fig.width=5, fig.height=7.5} +VlnPlot(seu, features = c( "Cd207" ,"Il1b","Il17f","S100a4"),ncol = 2,group.by = "group",pt.size = 0.2) +``` + +```{r fig.width=8, fig.height=7} +v1=VlnPlot(subsetC, features = markers1,ncol = 1) +v2=VlnPlot(subsetT, features = markers1,ncol = 1) + +grid.arrange(arrangeGrob(v1,top =text_grob("controls",size=20 ) ) , arrangeGrob(v2,top =text_grob("treated", size=20) ) ,nrow=1) +``` + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_kerat_granular.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Flg2", "Lor"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_langerhans.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd207"),ncol = 1) +dev.off() + +plot n_features across clusters: + +```{r fig.width=8, fig.height=6} +data2=data.frame(cluster=factor(seu$seurat_clusters),n_features=as.vector(seu$nFeature_SCT)) +row.names(data2)=c() +ggplot(data=data2, aes(x=cluster,y=n_features))+geom_violin(aes(x=cluster,y=n_features,fill=cluster)) +``` + +```{r} +VlnPlot(seu, features = c( "Gata3", "Tbx21"),ncol = 1) +``` + +```{r} +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD4_helper.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Gata3", "Tbx21", "Ccl4", "Cxcr6"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD4.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_exhausted.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cxcl13", "Pdcd1", "Ctla4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_naive.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Tcf7", "Ccr7", "Lef1", "Il7r", "Il6st", "Foxo1","Myc"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_memoryCD4_and_monocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Cd14","Lyz2","S100a4"),ncol = 1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_epithelial.png",sep="_"),res = 600,width=18,height=12,units='in') +print(VlnPlot(seu, features = c( "Krt17", "Krt79", "Cd200", "Lrig1"),ncol = 1)) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_stem.png",sep="_"),res = 600,width=18,height=12,units='in') +print(VlnPlot(seu, features = c( "Cd34", "Lgr5", "Lrig1", "Krt14"),ncol = 1)) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=18,height=12,units='in') +VlnPlot(seu, features = c( "Nkg7", "Gzmb", "Ifng", "Prf1"),ncol = 2) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +VlnPlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(pbmc, features = c( "Nkg7", "Gzmb", "Ifng", "Prf1"),ncol = 2) +dev.off() + +png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3) +dev.off() +#FeaturePlot +#FeaturePlot(pbmc, features =c("Gzma", "Gzmb", "Gzmh", "Gzmk", "Gzmm", "Prf1", "Nkg7", "Klrd1", "Gnly"),ncol=3) +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_cd8_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Gzma", "Gzmb", "Gzmm", "Prf1", "Nkg7", "Klrd1"),ncol=3) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=3) +dev.off() + +png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_epithelial.png",sep="_"),res = 600,width=12,height=6,units='in') +FeaturePlot(seu, features =c("Krt17", "Krt79", "Cd44", "Cd200", "Lrig1"),ncol=2) +dev.off() +``` + + +When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Cmd+Shift+K* to preview the HTML file). + diff --git a/r_notebooks/Seurat_integrate_300_600.nb.html b/r_notebooks/Seurat_integrate_300_600.nb.html new file mode 100644 index 00000000000..5be4059bc18 --- /dev/null +++ b/r_notebooks/Seurat_integrate_300_600.nb.html @@ -0,0 +1,2229 @@ + + + + + + + + + + + + + + +R Seurat Integration Notebook 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

Load libraries:

+ + + +
library(gridExtra)
+
+ + +

+Attaching package: ‘gridExtra’
+
+The following object is masked from ‘package:dplyr’:
+
+    combine
+ + + +

Load data:

+ + + +
controls=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_controls/outs/filtered_feature_bc_matrix/",sep=""))
+treated=Read10X(data.dir = paste("/icgc/dkfzlsdf/analysis/B210/Luca/scRNA_test_015035/combined/combine_indexes/aggr_treated/outs/filtered_feature_bc_matrix/",sep=""))
+ + + +

Create Seurat objects and perfrom SC Transformation:

+ + + +
 seu_list = c(controls,treated)
+ annot_list = c("controls", "treated")
+
+i=1  
+  seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 )
+  seu_list[[i]]@meta.data[,"sample"] <- annot_list[i]
+  
+  seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt")
+  #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20])
+  #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE)
+  seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 600 & percent.mt < 20 )
+  
+  # SCTransform replaces NormalizeData, FindVariableFeatures, ScaleData
+  # DO NOT run ScaleData after SCTransform
+  seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt")
+
+i=2
+
+seu_list[[i]] <- CreateSeuratObject( seu_list[[i]], min.features = 100 )
+  seu_list[[i]]@meta.data[,"sample"] <- annot_list[i]
+  
+  seu_list[[i]] <- PercentageFeatureSet(seu_list[[i]], pattern = "^mt-", col.name = "percent.mt")
+  #high_mt_cells = names(seu_list[[i]]$nFeature_RNA[seu_list[[i]]$percent.mt >= 20])
+  #seu_list[[i]] = subset(seu_list[[i]], cells = high_mt_cells, invert = TRUE)
+  seu_list[[i]] <- subset(seu_list[[i]], subset = nFeature_RNA >= 300 & percent.mt < 20 )
+  
+  seu_list[[i]] <- SCTransform(seu_list[[i]], verbose = FALSE, conserve.memory = FALSE, vars.to.regress = "percent.mt")
+ + + +

Perform the integration of treated and controls:

+ + + +
seu_features <- SelectIntegrationFeatures(object.list = seu_list, nfeatures = 3000)
+seu_list <- PrepSCTIntegration(object.list = seu_list, anchor.features = seu_features, verbose = FALSE)
+ + +
# considering 80 nearest neighbors when filtering anchors <- close to upper limit for smallest sample
+anchors <- FindIntegrationAnchors(object.list = seu_list, normalization.method = "SCT", anchor.features = seu_features, verbose = FALSE, k.filter = 50)
+ + +
Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.
+ + +
seu <- IntegrateData(anchorset = anchors, normalization.method = "SCT", verbose = FALSE)
+ + + +

look at normalised data:

+ + + +
seu[["integrated"]]@scale.data
+seu[["integrated"]]@counts
+seu[["integrated"]]@data
+ + + +

Run PCA:

+ + + +
seu <- RunPCA(seu, features = VariableFeatures(seu))
+
+ + +
PC_ 1 
+Positive:  Fth1, Vim, Rgs1, Cd74, Ftl1, Tmsb4x, H2-Eb1, H2-Aa, H2-Ab1, Srgn 
+       Tmsb10, Ubb, Crip1, Cxcl2, Lgals1, Rgs2, S100a4, Il7r, Slc3a2, Cd52 
+       Cytip, Ifrd1, Fxyd5, Cd207, Dennd4a, Gadd45b, Odc1, Ctla2a, Arl4c, Hspa8 
+Negative:  Lgals7, Krt14, Perp, Apoe, Sfn, Ly6d, Dmkn, Hspb1, Krtdap, Krt10 
+       Krt5, Stfa3, Krt17, BC100530, S100a14, Calm4, Krt1, Cstb, Fabp5, Dsp 
+       Fxyd3, Dstn, Serpinb2, Sprr1a, Tacstd2, Serpinb5, Lypd3, Sbsn, Defb6, Rplp0 
+PC_ 2 
+Positive:  Tmsb4x, Rgs1, Cd74, H2-Aa, H2-Eb1, Actg1, H2-Ab1, Srgn, Rplp0, Lgals7 
+       Actb, Il7r, Cytip, Rgs2, Cd207, Cd52, Calm1, Sh3bgrl3, H2afz, Fth1 
+       Cstb, H3f3b, Dennd4a, Vps37b, Sub1, Perp, Odc1, Krt14, Traf1, Slc3a2 
+Negative:  Col1a1, Dcn, Col1a2, Col3a1, Sparc, Tnfaip6, Lum, Ccl2, Mt1, Ccl7 
+       Bgn, Mfap4, Fosb, Aebp1, Egr1, Gsn, Meg3, Dusp1, Zfp36, Igfbp5 
+       Gadd45g, Timp2, Igfbp7, Jun, Cilp, Serping1, Ctsk, Jund, Hspa1a, Hspa1b 
+PC_ 3 
+Positive:  Ctla2a, Tmsb10, Cd3g, Rgs2, Trdc, Ets1, Icos, Cd3e, Vps37b, Srgn 
+       Emb, Cd3d, Ptprc, Nkg7, Gem, Neurl3, Xcl1, Dennd4a, Gm42418, Tnfaip3 
+       Rora, Ubald2, Cd7, Il2rg, Cxcr6, Fosl2, Ctsw, Cd2, Stk17b, Gnas 
+Negative:  Cd74, H2-Eb1, H2-Aa, H2-Ab1, Cd207, Lgals3, Cxcl2, Cst3, Ftl1, Ifrd1 
+       Il1r2, Ndrg1, Cxcl16, Basp1, Mfge8, Mt1, Tnfaip2, Ctsz, Pgf, Cd83 
+       Csf2rb, Tyrobp, Tbc1d4, Sqstm1, Cdkn1a, Il1b, Cd86, Ctss, Alox5ap, Vim 
+PC_ 4 
+Positive:  Serpinb2, BC100530, Ccdc71l, Stfa3, Ifi202b, Pim1, Col1a1, Plet1, Actg1, Dcn 
+       Col1a2, Lypd3, Col3a1, Anxa1, Rplp0, Actb, Irf6, Odc1, Krt16, Cstb 
+       Ccl2, Sparc, Uba52, Tacstd2, Klf5, Tmsb10, Tnfaip6, Ptgs2, Ndrg1, Lum 
+Negative:  Hspa1a, Jun, Fos, Hspa1b, Hsp90aa1, Gm42418, Atf3, Jund, Hspb1, Btg2 
+       Ubc, Dnajb1, Fosb, Egr1, Hsp90ab1, Zfp36, Junb, mt-Nd4, Hspa8, Dnaja1 
+       Ubb, mt-Cytb, Krt15, Klf6, Hsph1, mt-Co2, mt-Atp6, Ier2, H3f3b, Neat1 
+PC_ 5 
+Positive:  Defb6, Krt79, Cst6, Sprr1a, Krt17, Krtdap, Gm42418, Calm4, Sbsn, Ly6g6c 
+       Fabp5, Neat1, Dbi, Dsp, Klk7, Junb, Cstb, Krt10, Klf4, Alox12e 
+       Cebpb, Gm26917, Sdc1, mt-Co3, Zfp36, mt-Co1, Gltp, Clec2d, Btg2, Ly6d 
+Negative:  Krt14, Krt5, Rplp0, S100a6, Fth1, Krt15, Hsp90ab1, S100a10, Stfa3, Hsp90aa1 
+       Mt1, Ubb, Mt2, Ifitm3, Serpinb2, Hspa8, Apoe, BC100530, Tmsb4x, Hspe1 
+       Col17a1, Igfbp3, Ubc, Hspa1a, Hspb1, Ifi202b, Dnajb1, Ccdc71l, Ndufa4l2, Actg1 
+ + + +

Identify clusters and run UMAP:

+ + + +
seu <-FindNeighbors(seu, dims = 1:10)
+
+ + +
Computing nearest neighbor graph
+Computing SNN
+ + +
seu <- FindClusters(seu, resolution = 0.5)
+ + +
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
+
+Number of nodes: 11714
+Number of edges: 337686
+
+Running Louvain algorithm...
+ + +
0%   10   20   30   40   50   60   70   80   90   100%
+[----|----|----|----|----|----|----|----|----|----|
+**************************************************|
+ + +
Maximum modularity in 10 random starts: 0.9316
+Number of communities: 20
+Elapsed time: 1 seconds
+ + +
seu <- RunUMAP(seu, dims = 1:10)
+ + +
The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
+To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
+This message will be shown once per session15:51:53 Read 11714 rows and found 10 numeric columns
+15:51:53 Using Annoy for neighbor search, n_neighbors = 30
+15:51:53 Building Annoy index with metric = cosine, n_trees = 50
+0%   10   20   30   40   50   60   70   80   90   100%
+[----|----|----|----|----|----|----|----|----|----|
+**************************************************|
+15:51:58 Writing NN index file to temp file /tmp/RtmpY49ENJ/file6bfe9677dfc
+15:51:58 Searching Annoy index using 1 thread, search_k = 3000
+15:52:04 Annoy recall = 100%
+15:52:05 Commencing smooth kNN distance calibration using 1 thread
+15:52:07 Initializing from normalized Laplacian + noise
+15:52:08 Commencing optimization for 200 epochs, with 442470 positive edges
+0%   10   20   30   40   50   60   70   80   90   100%
+[----|----|----|----|----|----|----|----|----|----|
+**************************************************|
+15:52:28 Optimization finished
+ + + +

Plot UMAP reduction, labelling cells by cluster or by group:

+ + + +
dimplot1=DimPlot(seu, reduction = "umap",label = 1)
+
+ + +
Using `as.character()` on a quosure is deprecated as of rlang 0.3.0.
+Please use `as_label()` or `as_name()` instead.
+This warning is displayed once per session.
+ + +
seu$group=seu@meta.data[,"sample"]
+#dimplot2=DimPlot(seu, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange"))
+dimplot2=DimPlot(seu, reduction = "umap",label = 1,split.by = "group")
+#grid.arrange(dimplot1,dimplot2)
+dimplot2
+ + +

+ + + + + + +
#seu2=seu
+#seu2$group=factor(seu2$group,levels=c("controls","treated"))
+#dimplot3=DimPlot(seu2, reduction = "umap",label = 1,group.by = "group",cols=c("blue3","orange"))
+dimplot3=DimPlot(seu, reduction = "umap",label = 1,group.by = "group",cols=c("blue","orange"))
+ + + +

Save the plots:

+ + + +

+ + + +

Identify markers across clusters:

+ + + + +

Identify markers between groups:

+ + + +
markers_CT=FindMarkers(seu, ident.1="controls",group.by="group")
+
+ + +

+  |                                                  | 0 % ~calculating  
+  |++++                                              | 7 % ~07s          
+  |++++++++                                          | 14% ~05s          
+  |+++++++++++                                       | 21% ~05s          
+  |+++++++++++++++                                   | 29% ~05s          
+  |++++++++++++++++++                                | 36% ~04s          
+  |++++++++++++++++++++++                            | 43% ~04s          
+  |+++++++++++++++++++++++++                         | 50% ~03s          
+  |+++++++++++++++++++++++++++++                     | 57% ~03s          
+  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
+  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
+  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
+  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
+  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
+  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 06s
+ + + +

Look for genes in the selected features:

+ + + +
seu_features[grep("Pall",seu_features)]
+ + + +

markers1=c(“Notch1”,“Notch4”,“Nav3”) #c(“Igfbp2”,“Odc1”,“Il17f”,“Notch1”,“Notch4”,“Nav3”)

+ + + +

+ + + + + + +
v1=VlnPlot(subsetC, features = markers1,ncol = 1)
+v2=VlnPlot(subsetT, features = markers1,ncol = 1)
+
+grid.arrange(arrangeGrob(v1,top =text_grob("controls",size=20  ) ) , arrangeGrob(v2,top =text_grob("treated", size=20) )  ,nrow=1)
+ + + + + + +
png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_kerat_granular.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Flg2", "Lor"),ncol = 1)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_langerhans.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Cd207"),ncol = 1)
+dev.off()
+ + + +

plot n_features across clusters:

+ + + +
data2=data.frame(cluster=factor(seu$seurat_clusters),n_features=as.vector(seu$nFeature_SCT))
+row.names(data2)=c()
+ggplot(data=data2, aes(x=cluster,y=n_features))+geom_violin(aes(x=cluster,y=n_features,fill=cluster))
+ + + + + + +
VlnPlot(seu, features = c( "Gata3", "Tbx21"),ncol = 1)
+ + + + + + +

+ + + + + + +
png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD4.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Cd4"),ncol = 1)
+dev.off()
+ + + + + + +
png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_exhausted.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Cxcl13", "Pdcd1", "Ctla4"),ncol = 1)
+dev.off()
+ + + + + + +
png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_CD8_naive.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Tcf7", "Ccr7", "Lef1", "Il7r", "Il6st", "Foxo1","Myc"),ncol = 1)
+dev.off()
+ + + + + + +
png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_memoryCD4_and_monocytes.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Cd14","Lyz2","S100a4"),ncol = 1)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in')
+FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_keratinocytes.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=1)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_epithelial.png",sep="_"),res = 600,width=18,height=12,units='in')
+print(VlnPlot(seu, features = c( "Krt17", "Krt79", "Cd200", "Lrig1"),ncol = 1))
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Vln_plot_markers_stem.png",sep="_"),res = 600,width=18,height=12,units='in')
+print(VlnPlot(seu, features = c( "Cd34", "Lgr5", "Lrig1", "Krt14"),ncol = 1))
+dev.off()
+
+png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=18,height=12,units='in')
+VlnPlot(seu, features = c( "Nkg7",  "Gzmb", "Ifng", "Prf1"),ncol = 2)
+dev.off()
+
+png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Vln_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in')
+VlnPlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3)
+dev.off()
+
+png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in')
+FeaturePlot(pbmc, features = c( "Nkg7",  "Gzmb", "Ifng", "Prf1"),ncol = 2)
+dev.off()
+
+png(paste("~/plot_seurat_",id,threshold,pct_mt,"_Feature_plot_markers_cd4_T_helper_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in')
+FeaturePlot(seu, features = c( "Gata3", "Tbx21", "Eomes", "Ccl4", "Ccl5", "Cxcr6"),ncol = 3)
+dev.off()
+#FeaturePlot
+#FeaturePlot(pbmc, features =c("Gzma", "Gzmb", "Gzmh", "Gzmk", "Gzmm", "Prf1", "Nkg7", "Klrd1", "Gnly"),ncol=3)
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_cd8_T_cytotoxic_Abdul.png",sep="_"),res = 600,width=12,height=6,units='in')
+FeaturePlot(seu, features =c("Gzma", "Gzmb", "Gzmm", "Prf1", "Nkg7", "Klrd1"),ncol=3)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_keratinocytes.png",sep="_"),res = 600,width=12,height=6,units='in')
+FeaturePlot(seu, features =c("Krt5","Krt10","Krt14" ,"Ptgs1"),ncol=3)
+dev.off()
+
+png(paste("~/plot_seurat",id,threshold,pct_mt,"Feature_plot_markers_epithelial.png",sep="_"),res = 600,width=12,height=6,units='in')
+FeaturePlot(seu, features =c("Krt17", "Krt79", "Cd44", "Cd200", "Lrig1"),ncol=2)
+dev.off()
+ + + +

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

+ + +
LS0tCnRpdGxlOiAiUiBTZXVyYXQgSW50ZWdyYXRpb24gTm90ZWJvb2sgMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCkxvYWQgbGlicmFyaWVzOgpgYGB7cn0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZnV0dXJlKQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLm1heFNpemU9OTkwICogMTAyNF4yKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKYGBgCkxvYWQgZGF0YToKYGBge3J9CmNvbnRyb2xzPVJlYWQxMFgoZGF0YS5kaXIgPSBwYXN0ZSgiL2ljZ2MvZGtmemxzZGYvYW5hbHlzaXMvQjIxMC9MdWNhL3NjUk5BX3Rlc3RfMDE1MDM1L2NvbWJpbmVkL2NvbWJpbmVfaW5kZXhlcy9hZ2dyX2NvbnRyb2xzL291dHMvZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXgvIixzZXA9IiIpKQp0cmVhdGVkPVJlYWQxMFgoZGF0YS5kaXIgPSBwYXN0ZSgiL2ljZ2MvZGtmemxzZGYvYW5hbHlzaXMvQjIxMC9MdWNhL3NjUk5BX3Rlc3RfMDE1MDM1L2NvbWJpbmVkL2NvbWJpbmVfaW5kZXhlcy9hZ2dyX3RyZWF0ZWQvb3V0cy9maWx0ZXJlZF9mZWF0dXJlX2JjX21hdHJpeC8iLHNlcD0iIikpCmBgYApDcmVhdGUgU2V1cmF0IG9iamVjdHMgYW5kIHBlcmZyb20gU0MgVHJhbnNmb3JtYXRpb246CmBgYHtyfQogc2V1X2xpc3QgPSBjKGNvbnRyb2xzLHRyZWF0ZWQpCiBhbm5vdF9saXN0ID0gYygiY29udHJvbHMiLCAidHJlYXRlZCIpCgppPTEgIAogIHNldV9saXN0W1tpXV0gPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KCBzZXVfbGlzdFtbaV1dLCBtaW4uZmVhdHVyZXMgPSAxMDAgKQogIHNldV9saXN0W1tpXV1AbWV0YS5kYXRhWywic2FtcGxlIl0gPC0gYW5ub3RfbGlzdFtpXQogIAogIHNldV9saXN0W1tpXV0gPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoc2V1X2xpc3RbW2ldXSwgcGF0dGVybiA9ICJebXQtIiwgY29sLm5hbWUgPSAicGVyY2VudC5tdCIpCiAgI2hpZ2hfbXRfY2VsbHMgPSBuYW1lcyhzZXVfbGlzdFtbaV1dJG5GZWF0dXJlX1JOQVtzZXVfbGlzdFtbaV1dJHBlcmNlbnQubXQgPj0gMjBdKQogICNzZXVfbGlzdFtbaV1dID0gc3Vic2V0KHNldV9saXN0W1tpXV0sIGNlbGxzID0gaGlnaF9tdF9jZWxscywgaW52ZXJ0ID0gVFJVRSkKICBzZXVfbGlzdFtbaV1dIDwtIHN1YnNldChzZXVfbGlzdFtbaV1dLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPj0gNjAwICYgcGVyY2VudC5tdCA8IDIwICkKICAKICAjIFNDVHJhbnNmb3JtIHJlcGxhY2VzIE5vcm1hbGl6ZURhdGEsIEZpbmRWYXJpYWJsZUZlYXR1cmVzLCBTY2FsZURhdGEKICAjIERPIE5PVCBydW4gU2NhbGVEYXRhIGFmdGVyIFNDVHJhbnNmb3JtCiAgc2V1X2xpc3RbW2ldXSA8LSBTQ1RyYW5zZm9ybShzZXVfbGlzdFtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIGNvbnNlcnZlLm1lbW9yeSA9IEZBTFNFLCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5tdCIpCgppPTIKCnNldV9saXN0W1tpXV0gPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KCBzZXVfbGlzdFtbaV1dLCBtaW4uZmVhdHVyZXMgPSAxMDAgKQogIHNldV9saXN0W1tpXV1AbWV0YS5kYXRhWywic2FtcGxlIl0gPC0gYW5ub3RfbGlzdFtpXQogIAogIHNldV9saXN0W1tpXV0gPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoc2V1X2xpc3RbW2ldXSwgcGF0dGVybiA9ICJebXQtIiwgY29sLm5hbWUgPSAicGVyY2VudC5tdCIpCiAgI2hpZ2hfbXRfY2VsbHMgPSBuYW1lcyhzZXVfbGlzdFtbaV1dJG5GZWF0dXJlX1JOQVtzZXVfbGlzdFtbaV1dJHBlcmNlbnQubXQgPj0gMjBdKQogICNzZXVfbGlzdFtbaV1dID0gc3Vic2V0KHNldV9saXN0W1tpXV0sIGNlbGxzID0gaGlnaF9tdF9jZWxscywgaW52ZXJ0ID0gVFJVRSkKICBzZXVfbGlzdFtbaV1dIDwtIHN1YnNldChzZXVfbGlzdFtbaV1dLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPj0gMzAwICYgcGVyY2VudC5tdCA8IDIwICkKICAKICBzZXVfbGlzdFtbaV1dIDwtIFNDVHJhbnNmb3JtKHNldV9saXN0W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgY29uc2VydmUubWVtb3J5ID0gRkFMU0UsIHZhcnMudG8ucmVncmVzcyA9ICJwZXJjZW50Lm10IikKYGBgClBlcmZvcm0gdGhlIGludGVncmF0aW9uIG9mIHRyZWF0ZWQgYW5kIGNvbnRyb2xzOgpgYGB7cn0Kc2V1X2ZlYXR1cmVzIDwtIFNlbGVjdEludGVncmF0aW9uRmVhdHVyZXMob2JqZWN0Lmxpc3QgPSBzZXVfbGlzdCwgbmZlYXR1cmVzID0gMzAwMCkKc2V1X2xpc3QgPC0gUHJlcFNDVEludGVncmF0aW9uKG9iamVjdC5saXN0ID0gc2V1X2xpc3QsIGFuY2hvci5mZWF0dXJlcyA9IHNldV9mZWF0dXJlcywgdmVyYm9zZSA9IEZBTFNFKQoKIyBjb25zaWRlcmluZyA4MCBuZWFyZXN0IG5laWdoYm9ycyB3aGVuIGZpbHRlcmluZyBhbmNob3JzIDwtIGNsb3NlIHRvIHVwcGVyIGxpbWl0IGZvciBzbWFsbGVzdCBzYW1wbGUKYW5jaG9ycyA8LSBGaW5kSW50ZWdyYXRpb25BbmNob3JzKG9iamVjdC5saXN0ID0gc2V1X2xpc3QsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlNDVCIsIGFuY2hvci5mZWF0dXJlcyA9IHNldV9mZWF0dXJlcywgdmVyYm9zZSA9IEZBTFNFLCBrLmZpbHRlciA9IDUwKQpzZXUgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBhbmNob3JzLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJTQ1QiLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKbG9vayBhdCBub3JtYWxpc2VkIGRhdGE6CmBgYHtyfQpzZXVbWyJpbnRlZ3JhdGVkIl1dQHNjYWxlLmRhdGEKc2V1W1siaW50ZWdyYXRlZCJdXUBjb3VudHMKc2V1W1siaW50ZWdyYXRlZCJdXUBkYXRhCmBgYApSdW4gUENBOgpgYGB7cn0Kc2V1IDwtIFJ1blBDQShzZXUsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhzZXUpKQpgYGAKSWRlbnRpZnkgY2x1c3RlcnMgYW5kIHJ1biBVTUFQOgpgYGB7cn0Kc2V1IDwtRmluZE5laWdoYm9ycyhzZXUsIGRpbXMgPSAxOjEwKQpzZXUgPC0gRmluZENsdXN0ZXJzKHNldSwgcmVzb2x1dGlvbiA9IDAuNSkKc2V1IDwtIFJ1blVNQVAoc2V1LCBkaW1zID0gMToxMCkKYGBgClBsb3QgVU1BUCByZWR1Y3Rpb24sIGxhYmVsbGluZyBjZWxscyBieSBjbHVzdGVyIG9yIGJ5IGdyb3VwOgpgYGB7cn0KZGltcGxvdDE9RGltUGxvdChzZXUsIHJlZHVjdGlvbiA9ICJ1bWFwIixsYWJlbCA9IDEpCnNldSRncm91cD1zZXVAbWV0YS5kYXRhWywic2FtcGxlIl0KI2RpbXBsb3QyPURpbVBsb3Qoc2V1LCByZWR1Y3Rpb24gPSAidW1hcCIsbGFiZWwgPSAxLGdyb3VwLmJ5ID0gImdyb3VwIixjb2xzPWMoImJsdWUzIiwib3JhbmdlIikpCmRpbXBsb3QyPURpbVBsb3Qoc2V1LCByZWR1Y3Rpb24gPSAidW1hcCIsbGFiZWwgPSAxLHNwbGl0LmJ5ID0gImdyb3VwIikKI2dyaWQuYXJyYW5nZShkaW1wbG90MSxkaW1wbG90MikKZGltcGxvdDIKYGBgCgpgYGB7cn0KI3NldTI9c2V1CiNzZXUyJGdyb3VwPWZhY3RvcihzZXUyJGdyb3VwLGxldmVscz1jKCJjb250cm9scyIsInRyZWF0ZWQiKSkKI2RpbXBsb3QzPURpbVBsb3Qoc2V1MiwgcmVkdWN0aW9uID0gInVtYXAiLGxhYmVsID0gMSxncm91cC5ieSA9ICJncm91cCIsY29scz1jKCJibHVlMyIsIm9yYW5nZSIpKQpkaW1wbG90Mz1EaW1QbG90KHNldSwgcmVkdWN0aW9uID0gInVtYXAiLGxhYmVsID0gMSxncm91cC5ieSA9ICJncm91cCIsY29scz1jKCJibHVlIiwib3JhbmdlIikpCmBgYApTYXZlIHRoZSBwbG90czoKYGBge3IgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9MTB9CnBuZyhwYXN0ZSgifi9EaW1fcGxvdF9hZ2dyX2NvbnRyb2xzX3RyZWF0ZWRfMzAwXzYwMC5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xMixoZWlnaHQ9MTAsdW5pdHM9J2luJykKZ3JpZC5hcnJhbmdlKGRpbXBsb3QxLGRpbXBsb3QzKQpkZXYub2ZmKCkKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYyggIkNvbDFhMSIsICJDb2wzYTEiLCAiQ29sNWExIiwgIkNvbDEyYTEiLCAiRGNuIiwgIkZibG4yIiksbmNvbCA9IDIpCmBgYApJZGVudGlmeSBtYXJrZXJzIGFjcm9zcyBjbHVzdGVyczoKYGBge3J9CnNldS5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKHNldSwgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKdG9wMTAgPC0gc2V1Lm1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuID0gMTAsIHd0ID0gYXZnX2xvZ0ZDKQoKaWQ9ImFnZ3JfY29udHJvbF90cmVhdGVkIgp0aHJlc2hvbGQ9IjMwMF82MDAiCnBjdF9tdD0yMAoKbWFya2Vyc19maWx0bWF0PXNldS5tYXJrZXJzW3NldS5tYXJrZXJzJHBfdmFsX2FkajwwLjA1ICYgc2V1Lm1hcmtlcnMkYXZnX2xvZ0ZDPj0xLF0Kd3JpdGUudGFibGUobWFya2Vyc19maWx0bWF0LGZpbGU9cGFzdGUoIn4vU2V1cmF0IixpZCx0aHJlc2hvbGQsInNlbGVjdGVkX21hcmtlcnMuY3N2IixzZXA9Il8iKSxzZXA9IiwiKQp3cml0ZS50YWJsZSh0b3AxMCxmaWxlPXBhc3RlKCJ+L1NldXJhdCIsaWQsdGhyZXNob2xkLCJfdG9wMTBfc2VsZWN0ZWRfbWFya2Vycy5jc3YiLHNlcD0iXyIpLHNlcD0iLCIpCgpjbHVzdF9jb250cm9sX2NvdW50PTE6MjAKZm9yIChpIGluIDA6MTkpIHsgCmNsdXN0X2NvbnRyb2xfY291bnRbaSsxXT1zdW0oc2V1JHNldXJhdF9jbHVzdGVyc1tzZXUkZ3JvdXA9PSJjb250cm9scyJdPT1pKSAKfQoKY2x1c3RfY291bnQ9MToyMApmb3IgKGkgaW4gMDoxOSkgeyAKY2x1c3RfY291bnRbaSsxXT1zdW0oc2V1JHNldXJhdF9jbHVzdGVycz09aSkgCn0KYGBgCklkZW50aWZ5IG1hcmtlcnMgYmV0d2VlbiBncm91cHM6CmBgYHtyfQptYXJrZXJzX0NUPUZpbmRNYXJrZXJzKHNldSwgaWRlbnQuMT0iY29udHJvbHMiLGdyb3VwLmJ5PSJncm91cCIpCgpzdWJzZXRDPXN1YnNldChzZXUsY2VsbHM9bGFiZWxzKHNldSRncm91cFtzZXUkZ3JvdXA9PSJjb250cm9scyJdKSkKc3Vic2V0VD1zdWJzZXQoc2V1LGNlbGxzPWxhYmVscyhzZXUkZ3JvdXBbc2V1JGdyb3VwPT0idHJlYXRlZCJdKSkKYGBgCkxvb2sgZm9yIGdlbmVzIGluIHRoZSBzZWxlY3RlZCBmZWF0dXJlczoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NX0Kc2V1X2ZlYXR1cmVzW2dyZXAoIlBhbGwiLHNldV9mZWF0dXJlcyldCmBgYAptYXJrZXJzMT1jKCJOb3RjaDEiLCJOb3RjaDQiLCJOYXYzIikgI2MoIklnZmJwMiIsIk9kYzEiLCJJbDE3ZiIsIk5vdGNoMSIsIk5vdGNoNCIsIk5hdjMiKQoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9Ny41fQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiQ2QyMDciICwiSWwxYiIsIklsMTdmIiwiUzEwMGE0IiksbmNvbCA9IDIsZ3JvdXAuYnkgPSAiZ3JvdXAiLHB0LnNpemUgPSAwLjIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9N30KdjE9VmxuUGxvdChzdWJzZXRDLCBmZWF0dXJlcyA9IG1hcmtlcnMxLG5jb2wgPSAxKQp2Mj1WbG5QbG90KHN1YnNldFQsIGZlYXR1cmVzID0gbWFya2VyczEsbmNvbCA9IDEpCgpncmlkLmFycmFuZ2UoYXJyYW5nZUdyb2IodjEsdG9wID10ZXh0X2dyb2IoImNvbnRyb2xzIixzaXplPTIwICApICkgLCBhcnJhbmdlR3JvYih2Mix0b3AgPXRleHRfZ3JvYigidHJlYXRlZCIsIHNpemU9MjApICkgICxucm93PTEpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KcG5nKHBhc3RlKCJ+L3Bsb3Rfc2V1cmF0IixpZCx0aHJlc2hvbGQscGN0X210LCJWbG5fcGxvdF9tYXJrZXJzX2tlcmF0X2dyYW51bGFyLnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiRmxnMiIsICJMb3IiKSxuY29sID0gMSkKZGV2Lm9mZigpCgpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXQiLGlkLHRocmVzaG9sZCxwY3RfbXQsIlZsbl9wbG90X21hcmtlcnNfbGFuZ2VyaGFucy5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xOCxoZWlnaHQ9MTIsdW5pdHM9J2luJykKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYyggIkNkMjA3IiksbmNvbCA9IDEpCmRldi5vZmYoKQpgYGAKcGxvdCBuX2ZlYXR1cmVzIGFjcm9zcyBjbHVzdGVyczogCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQpkYXRhMj1kYXRhLmZyYW1lKGNsdXN0ZXI9ZmFjdG9yKHNldSRzZXVyYXRfY2x1c3RlcnMpLG5fZmVhdHVyZXM9YXMudmVjdG9yKHNldSRuRmVhdHVyZV9TQ1QpKQpyb3cubmFtZXMoZGF0YTIpPWMoKQpnZ3Bsb3QoZGF0YT1kYXRhMiwgYWVzKHg9Y2x1c3Rlcix5PW5fZmVhdHVyZXMpKStnZW9tX3Zpb2xpbihhZXMoeD1jbHVzdGVyLHk9bl9mZWF0dXJlcyxmaWxsPWNsdXN0ZXIpKQpgYGAKCmBgYHtyfQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiR2F0YTMiLCAiVGJ4MjEiKSxuY29sID0gMSkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KcG5nKHBhc3RlKCJ+L3Bsb3Rfc2V1cmF0IixpZCx0aHJlc2hvbGQscGN0X210LCJWbG5fcGxvdF9tYXJrZXJzX0NENF9oZWxwZXIucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTgsaGVpZ2h0PTEyLHVuaXRzPSdpbicpClZsblBsb3Qoc2V1LCBmZWF0dXJlcyA9IGMoICJHYXRhMyIsICJUYngyMSIsICAiQ2NsNCIsICJDeGNyNiIpLG5jb2wgPSAyKQpkZXYub2ZmKCkKYGBgCgpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD02fQpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXQiLGlkLHRocmVzaG9sZCxwY3RfbXQsIlZsbl9wbG90X21hcmtlcnNfQ0Q0LnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiQ2Q0IiksbmNvbCA9IDEpCmRldi5vZmYoKQpgYGAKCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTZ9CnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdCIsaWQsdGhyZXNob2xkLHBjdF9tdCwiVmxuX3Bsb3RfbWFya2Vyc19DRDhfZXhoYXVzdGVkLnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiQ3hjbDEzIiwgIlBkY2QxIiwgIkN0bGE0IiksbmNvbCA9IDEpCmRldi5vZmYoKQpgYGAKCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTZ9CnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdCIsaWQsdGhyZXNob2xkLHBjdF9tdCwiVmxuX3Bsb3RfbWFya2Vyc19DRDhfbmFpdmUucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTgsaGVpZ2h0PTEyLHVuaXRzPSdpbicpClZsblBsb3Qoc2V1LCBmZWF0dXJlcyA9IGMoICJUY2Y3IiwgIkNjcjciLCAiTGVmMSIsICJJbDdyIiwgIklsNnN0IiwgIkZveG8xIiwiTXljIiksbmNvbCA9IDEpCmRldi5vZmYoKQpgYGAKCmBgYHtyIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTZ9CnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdCIsaWQsdGhyZXNob2xkLHBjdF9tdCwiVmxuX3Bsb3RfbWFya2Vyc19tZW1vcnlDRDRfYW5kX21vbm9jeXRlcy5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xOCxoZWlnaHQ9MTIsdW5pdHM9J2luJykKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYyggIkNkMTQiLCJMeXoyIiwiUzEwMGE0IiksbmNvbCA9IDEpCmRldi5vZmYoKQoKcG5nKHBhc3RlKCJ+L3Bsb3Rfc2V1cmF0IixpZCx0aHJlc2hvbGQscGN0X210LCJGZWF0dXJlX3Bsb3RfbWFya2Vyc19rZXJhdGlub2N5dGVzLnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpGZWF0dXJlUGxvdChzZXUsIGZlYXR1cmVzID1jKCJLcnQ1IiwiS3J0MTAiLCJLcnQxNCIgLCJQdGdzMSIpLG5jb2w9MSkKZGV2Lm9mZigpCgpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXQiLGlkLHRocmVzaG9sZCxwY3RfbXQsIlZsbl9wbG90X21hcmtlcnNfa2VyYXRpbm9jeXRlcy5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xOCxoZWlnaHQ9MTIsdW5pdHM9J2luJykKVmxuUGxvdChzZXUsIGZlYXR1cmVzID1jKCJLcnQ1IiwiS3J0MTAiLCJLcnQxNCIgLCJQdGdzMSIpLG5jb2w9MSkKZGV2Lm9mZigpCgpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXQiLGlkLHRocmVzaG9sZCxwY3RfbXQsIlZsbl9wbG90X21hcmtlcnNfZXBpdGhlbGlhbC5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xOCxoZWlnaHQ9MTIsdW5pdHM9J2luJykKcHJpbnQoVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYyggIktydDE3IiwgIktydDc5IiwgIkNkMjAwIiwgIkxyaWcxIiksbmNvbCA9IDEpKQpkZXYub2ZmKCkKCnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdCIsaWQsdGhyZXNob2xkLHBjdF9tdCwiVmxuX3Bsb3RfbWFya2Vyc19zdGVtLnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpwcmludChWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiQ2QzNCIsICJMZ3I1IiwgIkxyaWcxIiwgIktydDE0IiksbmNvbCA9IDEpKQpkZXYub2ZmKCkKCnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdF8iLGlkLHRocmVzaG9sZCxwY3RfbXQsIl9WbG5fcGxvdF9tYXJrZXJzX1RfY3l0b3RveGljX0FiZHVsLnBuZyIsc2VwPSJfIikscmVzID0gNjAwLHdpZHRoPTE4LGhlaWdodD0xMix1bml0cz0naW4nKQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSBjKCAiTmtnNyIsICAiR3ptYiIsICJJZm5nIiwgIlByZjEiKSxuY29sID0gMikKZGV2Lm9mZigpCgpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXRfIixpZCx0aHJlc2hvbGQscGN0X210LCJfVmxuX3Bsb3RfbWFya2Vyc19jZDRfVF9oZWxwZXJfQWJkdWwucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTIsaGVpZ2h0PTYsdW5pdHM9J2luJykKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYyggIkdhdGEzIiwgIlRieDIxIiwgIkVvbWVzIiwgIkNjbDQiLCAiQ2NsNSIsICJDeGNyNiIpLG5jb2wgPSAzKQpkZXYub2ZmKCkKCnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdF8iLGlkLHRocmVzaG9sZCxwY3RfbXQsIl9GZWF0dXJlX3Bsb3RfbWFya2Vyc19UX2N5dG90b3hpY19BYmR1bC5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xMixoZWlnaHQ9Nix1bml0cz0naW4nKQpGZWF0dXJlUGxvdChwYm1jLCBmZWF0dXJlcyA9IGMoICJOa2c3IiwgICJHem1iIiwgIklmbmciLCAiUHJmMSIpLG5jb2wgPSAyKQpkZXYub2ZmKCkKCnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdF8iLGlkLHRocmVzaG9sZCxwY3RfbXQsIl9GZWF0dXJlX3Bsb3RfbWFya2Vyc19jZDRfVF9oZWxwZXJfQWJkdWwucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTIsaGVpZ2h0PTYsdW5pdHM9J2luJykKRmVhdHVyZVBsb3Qoc2V1LCBmZWF0dXJlcyA9IGMoICJHYXRhMyIsICJUYngyMSIsICJFb21lcyIsICJDY2w0IiwgIkNjbDUiLCAiQ3hjcjYiKSxuY29sID0gMykKZGV2Lm9mZigpCiNGZWF0dXJlUGxvdAojRmVhdHVyZVBsb3QocGJtYywgZmVhdHVyZXMgPWMoIkd6bWEiLCAiR3ptYiIsICJHem1oIiwgIkd6bWsiLCAiR3ptbSIsICJQcmYxIiwgIk5rZzciLCAiS2xyZDEiLCAiR25seSIpLG5jb2w9MykKcG5nKHBhc3RlKCJ+L3Bsb3Rfc2V1cmF0IixpZCx0aHJlc2hvbGQscGN0X210LCJGZWF0dXJlX3Bsb3RfbWFya2Vyc19jZDhfVF9jeXRvdG94aWNfQWJkdWwucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTIsaGVpZ2h0PTYsdW5pdHM9J2luJykKRmVhdHVyZVBsb3Qoc2V1LCBmZWF0dXJlcyA9YygiR3ptYSIsICJHem1iIiwgIkd6bW0iLCAiUHJmMSIsICJOa2c3IiwgIktscmQxIiksbmNvbD0zKQpkZXYub2ZmKCkKCnBuZyhwYXN0ZSgifi9wbG90X3NldXJhdCIsaWQsdGhyZXNob2xkLHBjdF9tdCwiRmVhdHVyZV9wbG90X21hcmtlcnNfa2VyYXRpbm9jeXRlcy5wbmciLHNlcD0iXyIpLHJlcyA9IDYwMCx3aWR0aD0xMixoZWlnaHQ9Nix1bml0cz0naW4nKQpGZWF0dXJlUGxvdChzZXUsIGZlYXR1cmVzID1jKCJLcnQ1IiwiS3J0MTAiLCJLcnQxNCIgLCJQdGdzMSIpLG5jb2w9MykKZGV2Lm9mZigpCgpwbmcocGFzdGUoIn4vcGxvdF9zZXVyYXQiLGlkLHRocmVzaG9sZCxwY3RfbXQsIkZlYXR1cmVfcGxvdF9tYXJrZXJzX2VwaXRoZWxpYWwucG5nIixzZXA9Il8iKSxyZXMgPSA2MDAsd2lkdGg9MTIsaGVpZ2h0PTYsdW5pdHM9J2luJykKRmVhdHVyZVBsb3Qoc2V1LCBmZWF0dXJlcyA9YygiS3J0MTciLCAiS3J0NzkiLCAiQ2Q0NCIsICJDZDIwMCIsICJMcmlnMSIpLG5jb2w9MikKZGV2Lm9mZigpCmBgYAoKCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoK
+ + + +
+ + + + + + + + + + + + + + + +