library(ggplot2)
library(pheatmap)
library(RColorBrewer)
library(tidyverse)
library(ggpubr)
library(ggsignif)
library(openxlsx)
library(viridis)
library(jcolors)
library(stringr)
setwd("//atlas.uni.lux/users/isabel.rosety/GBA/GCase activity/Plots")
Warning: The working directory was changed to //atlas.uni.lux/users/isabel.rosety/GBA/GCase activity/Plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
data <- read_excel("//atlas.uni.lux/LCSB_Cellular_Biology/16-Our Papers/In Preparation/GBA hMO_Isabel/Figures/Fig1/Partials/B//Quantification/20210910_GCase activity results.xlsx",sheet=3)
dataNBarPlot<-dataN%>%
group_by(CellLine)%>%
summarise(Mean = mean(Gcase_activity), sd_rating = sd(Gcase_activity))
Error in group_by(., CellLine) : object 'dataN' not found
Violin Plots
dataN%>%
ggplot(aes(x = Condition, y=Gcase_activity),ordered=TRUE)+
#geom_violin( aes(fill=Condition),show.legend = T, trim=T),
geom_violin( aes(fill=Condition),show.legend = T,scale = "width", trim=F)+
geom_dotplot(binaxis = "y",stackdir = "center",dotsize=0.8)+
#scale_fill_manual(values= c("#bdd7e7","#2171b5"),name = "Condition", guide = FALSE)+
scale_fill_manual(values= alpha(c("#1565C0","#CC0000"),0.75),name = "Condition",guide = "none")+
theme(legend.key=element_blank()) +
geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
margin_top=0.5,vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05, " "=2) ) +
#facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
labs(x ="",
y = "Relative GCase activity",
fill = "Condition",
title = "GCase activity") +
theme_bw() +
theme(
axis.line = element_line(colour = 'black', size = 0.5) ,
axis.title.x = element_blank(),
axis.text.x = element_text(size=16, color="black"),
axis.title.y = element_text(size = 16),
axis.text.y = element_text(size=10, color="black"),
axis.ticks.y = element_line(),
axis.ticks.length=unit(.20, "cm"),
#change legend text font size)
#legend.key.size = unit(0.7, "cm"),
#legend.key.width = unit(0.6,"cm"),
legend.key=element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
strip.text = element_text(size=12, vjust=0.5),
strip.background = element_rect(fill="lightgray"),
# panel.border = element_rect(fill = NA, color = "black"),
panel.spacing.y = unit(0.8, "lines"),
strip.switch.pad.wrap=unit(20, "lines"),
legend.position="right",
legend.text = element_text(size=17),
legend.title = element_text(size=19)
) -> p
#t<- cowplot::ggdraw(cowplot::add_sub(p, "Wilcox-test, ***p=0.001, **p=0.01, *p=0.05",hjust=-0.2, size=13))
print(p)
##ggsave(paste0(Sys.Date(),"_", names[i], ".pdf"), plot=t)
ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=2.5,width=3)

Cell Lines
dataN%>%
ggplot(aes(x = Condition, y=Gcase_activity),ordered=TRUE)+
geom_boxplot(aes(fill=Condition),show.legend = FALSE,width=0.7)+
#scale_fill_manual(values=c("#2171b5","#B22222","#008B8B"))+ #blue and red
scale_fill_manual(values= c("#FFFFFF","#999999"),name = "Condition", guide = "none")+ #guide false will remove the legend for the condition
#ylim(4,9)+
#geom_boxplot(width=0.07, fill="white") +
geom_point(aes(color=CellLine),size=3,show.legend = T,alpha = 0.5)+
#scale_color_manual(values = rev(brewer.pal(n=6, name="OrRd")))+
scale_color_jcolors("pal7")+
#scale_color_viridis(option = "D", discrete=TRUE)+
#geom_point(shape = 1,size = 3,colour = "black")+
theme(legend.key=element_blank()) +
geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05, " "=2) ) +
#facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
labs(x ="",
y = "Relative GCase activity",
fill = "Condition",
title = "GCase activity") +
theme_bw() +
theme(
axis.line = element_line(colour = 'black', size = 1) ,
axis.title.x = element_blank(),
axis.text.x = element_text(size=21, color="black"),
axis.title.y = element_text(size = 21),
axis.text.y = element_text(size=15, color="black"),
axis.ticks.y = element_line(),
axis.ticks.length=unit(.25, "cm"),
#change legend text font size)
#legend.key.size = unit(0.7, "cm"),
#legend.key.width = unit(0.6,"cm"),
legend.key=element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
strip.text = element_text(size=12, vjust=0.5),
strip.background = element_rect(fill="lightgray"),
# panel.border = element_rect(fill = NA, color = "black"),
panel.spacing.y = unit(0.8, "lines"),
strip.switch.pad.wrap=unit(20, "lines"),
legend.position="right",
legend.text = element_text(size=17),
legend.title = element_text(size=19)
) -> p
print(p)

#ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=4)
Bar Plots for all the features one timepoint
dataNBarPlot%>%
ggplot(aes(x=factor(CellLine, level = c("CTRL1", "CTRL2","CTRL3", "PD1", "PD2","PD3")), y=MeanGCase),ordered=TRUE)+
#geom_violin( aes(fill=Condition),show.legend = T, trim=T),
geom_bar(aes(fill=CellLine),stat="summary",position=position_dodge(),colour="black",size=0.3,width=0.8) +
scale_y_continuous(expand = c(0, 0))+
scale_fill_manual(values= c("#1565C0", alpha(("#1565C0"),0.7),alpha(("#1565C0"),0.4),"#CC0000", alpha(("#CC0000"),0.5),alpha(("#CC0000"),0.2)),name = "CellLine",guide = "none")+
geom_errorbar(aes(ymin=MeanGCase, ymax=MeanGCase+sd_rating),width=.2,position=position_dodge(.9), size=0.3)+ # Width of the error bars
theme(legend.key=element_blank()) +
geom_signif(comparisons = list(c("CTRL", "GBA-PD")), test='wilcox.test',
margin_top=0.5,vjust=0.5, size=0.5, textsize=9, map_signif_level=c("***"=0.001, "**"=0.01, "*"=0.05, " "=2) ) +
#facet_grid(~fct_relevel(Day, "d30","d60"), scales="free") +
labs(x ="",
y = "Relative GCase activity",
fill = "",
title = "") +
theme_bw() +
theme(
axis.line = element_line(colour = 'black', size = 0.3) ,
axis.title.x = element_blank(),
axis.text.x = element_text(size=7, color="black"),
axis.title.y = element_text(size = 10),
axis.text.y = element_text(size=7, color="black"),
axis.ticks.y = element_line(size=0.3),
axis.ticks.x = element_line(size=0.3),
axis.ticks.length=unit(.1, "cm"),
#change legend text font size)
#legend.key.size = unit(0.7, "cm"),
#legend.key.width = unit(0.6,"cm"),
legend.key=element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
plot.title = element_text(size = 20, hjust=0.5, vjust= 1, face = "bold"),
plot.subtitle = element_blank(),#element_text(size = 2, hjust=0.5)
strip.text = element_text(size=12, vjust=0.5),
strip.background = element_rect(fill="lightgray"),
# panel.border = element_rect(fill = NA, color = "black"),
panel.spacing.y = unit(0.8, "lines"),
strip.switch.pad.wrap=unit(20, "lines"),
legend.position="right",
legend.text = element_text(size=17),
legend.title = element_text(size=19)
) -> p
#t<- cowplot::ggdraw(cowplot::add_sub(p, "Wilcox-test, ***p=0.001, **p=0.01, *p=0.05",hjust=-0.2, size=13))
print(p)
##ggsave(paste0(Sys.Date(),"_", names[i], ".pdf"), plot=t)
ggsave(paste0(Sys.Date()," GCase activity DIV30.pdf"),height=2.5,width=3)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KLS0tDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGhlYXRtYXApDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdnc2lnbmlmKQ0KbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkoamNvbG9ycykNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpgYGB7cn0NCnNldHdkKCIvL2F0bGFzLnVuaS5sdXgvdXNlcnMvaXNhYmVsLnJvc2V0eS9HQkEvR0Nhc2UgYWN0aXZpdHkvUGxvdHMiKQ0KZGF0YSAgPC0gcmVhZF9leGNlbCgiLy9hdGxhcy51bmkubHV4L0xDU0JfQ2VsbHVsYXJfQmlvbG9neS8xNi1PdXIgUGFwZXJzL0luIFByZXBhcmF0aW9uL0dCQSBoTU9fSXNhYmVsL0ZpZ3VyZXMvRmlnMS9QYXJ0aWFscy9CLy9RdWFudGlmaWNhdGlvbi8yMDIxMDkxMF9HQ2FzZSBhY3Rpdml0eSByZXN1bHRzLnhsc3giLHNoZWV0PTMpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI05vcm1hbGl6ZSB0byBtZWFuIG9mIGNvbnRyb2xzIGZvciBvbmUgZmVhdHVyZQ0KZGF0YU4gPC1kYXRhICU+JQ0KICAgICBncm91cF9ieShCYXRjaCwgQ29uZGl0aW9uKSAlPiUNCiAgICAgbXV0YXRlKEdjYXNlX2FjdGl2aXR5PUdjYXNlX2FjdGl2aXR5L21lYW4oZGF0YSRHY2FzZV9hY3Rpdml0eVtkYXRhJENvbmRpdGlvbj09IkNUUkwiXS8xMDAsbmEucm0gPSBUUlVFKSkgDQpkYXRhTkJhclBsb3Q8LWRhdGFOJT4lDQogIGdyb3VwX2J5KENlbGxMaW5lKSU+JQ0KICBzdW1tYXJpc2UoTWVhbkdDYXNlID0gbWVhbihHY2FzZV9hY3Rpdml0eSksIHNkX3JhdGluZyA9IHNkKEdjYXNlX2FjdGl2aXR5KSkNCiN3cml0ZS5jc3YoZGF0YU4sIGZpbGUgPSAnRGF0YSBhcyBQZXJjZW50YWdlIG9mIGNvbnRyb2xzLmNzdicpDQoNCmRhdGFOQmFyUGxvdCAlPiUgDQogICBtdXRhdGUoQ2VsbExpbmUgPSBzdHJfcmVwbGFjZV9hbGwoQ2VsbExpbmUsIA0KICAgICAgICAgICAgcGF0dGVybiA9ICJXVF81NiIsIHJlcGxhY2VtZW50ID0gIkNUUkwxIikpICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIldUXzM5IiwgcmVwbGFjZW1lbnQgPSAiQ1RSTDIiKSkgICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIldUXzY4IiwgcmVwbGFjZW1lbnQgPSAiQ1RSTDMiKSkgJT4lDQogICAgbXV0YXRlKENlbGxMaW5lID0gc3RyX3JlcGxhY2VfYWxsKENlbGxMaW5lLCANCiAgICAgICAgICAgIHBhdHRlcm4gPSAiTXV0XzMwOSIsIHJlcGxhY2VtZW50ID0gIlBEMSIpKSAlPiUNCiAgICBtdXRhdGUoQ2VsbExpbmU9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIk11dF9LVEk2IiwgcmVwbGFjZW1lbnQgPSAiUEQyIikpICU+JQ0KICAgIG11dGF0ZShDZWxsTGluZSA9IHN0cl9yZXBsYWNlX2FsbChDZWxsTGluZSwgDQogICAgICAgICAgICBwYXR0ZXJuID0gIk11dF9TR08xIiwgcmVwbGFjZW1lbnQgPSAiUEQzIikpIC0+ZGF0YU5CYXJQbG90DQoNCmRhdGFOPC1hcy5kYXRhLmZyYW1lKGRhdGFOKQ0KDQpgYGANCg0KVmlvbGluIFBsb3RzDQpgYGB7cn0NCg0KZGF0YU4lPiUNCiAgZ2dwbG90KGFlcyh4ID0gQ29uZGl0aW9uLCB5PUdjYXNlX2FjdGl2aXR5KSxvcmRlcmVkPVRSVUUpKw0KICAjZ2VvbV92aW9saW4oIGFlcyhmaWxsPUNvbmRpdGlvbiksc2hvdy5sZWdlbmQgPSBULCB0cmltPVQpLA0KICBnZW9tX3Zpb2xpbiggYWVzKGZpbGw9Q29uZGl0aW9uKSxzaG93LmxlZ2VuZCA9IFQsc2NhbGUgPSAid2lkdGgiLCB0cmltPUYpKw0KICBnZW9tX2RvdHBsb3QoYmluYXhpcyA9ICJ5IixzdGFja2RpciA9ICJjZW50ZXIiLGRvdHNpemU9MC44KSsNCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYygiI2JkZDdlNyIsIiMyMTcxYjUiKSxuYW1lID0gIkNvbmRpdGlvbiIsIGd1aWRlID0gRkFMU0UpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYWxwaGEoYygiIzE1NjVDMCIsIiNDQzAwMDAiKSwwLjc1KSxuYW1lID0gIkNvbmRpdGlvbiIsZ3VpZGUgPSAibm9uZSIpKw0KICAgIHRoZW1lKGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArDQogICAgDQogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJDVFJMIiwgIkdCQS1QRCIpKSwgdGVzdD0nd2lsY294LnRlc3QnLA0KICAgICAgICAgICAgICBtYXJnaW5fdG9wPTAuNSx2anVzdD0wLjUsIHNpemU9MC41LCB0ZXh0c2l6ZT05LCBtYXBfc2lnbmlmX2xldmVsPWMoIioqKiI9MC4wMDEsICIqKiI9MC4wMSwgIioiPTAuMDUsICAiICI9MikgKSArDQogICNmYWNldF9ncmlkKH5mY3RfcmVsZXZlbChEYXksICJkMzAiLCJkNjAiKSwgc2NhbGVzPSJmcmVlIikgKw0KICAgICAgIGxhYnMoeCAgICAgPSIiLA0KICAgICAgICB5ICAgICA9ICJSZWxhdGl2ZSBHQ2FzZSBhY3Rpdml0eSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIkdDYXNlIGFjdGl2aXR5IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gJ2JsYWNrJywgc2l6ZSA9IDAuNSkgLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE2LCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoKSwNCiAgICBheGlzLnRpY2tzLmxlbmd0aD11bml0KC4yMCwgImNtIiksDQogICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIldpbGNveC10ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMiwgc2l6ZT0xMykpDQogIHByaW50KHApDQogICMjZ2dzYXZlKHBhc3RlMChTeXMuRGF0ZSgpLCJfIiwgbmFtZXNbaV0sICIucGRmIiksIHBsb3Q9dCkNCg0KDQpnZ3NhdmUocGFzdGUwKFN5cy5EYXRlKCksIiBHQ2FzZSBhY3Rpdml0eSBESVYzMC5wZGYiKSxoZWlnaHQ9Mi41LHdpZHRoPTMpDQoNCmBgYA0KQ2VsbCBMaW5lcw0KYGBge3J9DQoNCmRhdGFOJT4lDQogIGdncGxvdChhZXMoeCA9IENvbmRpdGlvbiwgeT1HY2FzZV9hY3Rpdml0eSksb3JkZXJlZD1UUlVFKSsNCiAgICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9Q29uZGl0aW9uKSxzaG93LmxlZ2VuZCA9IEZBTFNFLHdpZHRoPTAuNykrDQogICAgICAgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzIxNzFiNSIsIiNCMjIyMjIiLCIjMDA4QjhCIikpKyAgI2JsdWUgYW5kIHJlZA0KICANCg0Kc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSBjKCIjRkZGRkZGIiwiIzk5OTk5OSIpLG5hbWUgPSAiQ29uZGl0aW9uIiwgZ3VpZGUgPSAibm9uZSIpKyAjZ3VpZGUgZmFsc2Ugd2lsbCByZW1vdmUgdGhlIGxlZ2VuZCBmb3IgdGhlIGNvbmRpdGlvbg0KICAjeWxpbSg0LDkpKw0KICAgICNnZW9tX2JveHBsb3Qod2lkdGg9MC4wNywgZmlsbD0id2hpdGUiKSArIA0KICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPUNlbGxMaW5lKSxzaXplPTMsc2hvdy5sZWdlbmQgPSBULGFscGhhID0gMC41KSsNCiAgICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJldihicmV3ZXIucGFsKG49NiwgbmFtZT0iT3JSZCIpKSkrDQogICAgc2NhbGVfY29sb3JfamNvbG9ycygicGFsNyIpKw0KICAgICNzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJEIiwgZGlzY3JldGU9VFJVRSkrDQogICAgI2dlb21fcG9pbnQoc2hhcGUgPSAxLHNpemUgPSAzLGNvbG91ciA9ICJibGFjayIpKw0KICAgIHRoZW1lKGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArDQogICAgDQogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJDVFJMIiwgIkdCQS1QRCIpKSwgdGVzdD0nd2lsY294LnRlc3QnLA0KICAgICAgICAgICAgICB2anVzdD0wLjUsIHNpemU9MC41LCB0ZXh0c2l6ZT05LCBtYXBfc2lnbmlmX2xldmVsPWMoIioqKiI9MC4wMDEsICIqKiI9MC4wMSwgIioiPTAuMDUsICAiICI9MikgKSArDQogICNmYWNldF9ncmlkKH5mY3RfcmVsZXZlbChEYXksICJkMzAiLCJkNjAiKSwgc2NhbGVzPSJmcmVlIikgKw0KICAgICAgIGxhYnMoeCAgICAgPSIiLA0KICAgICAgICB5ICAgICA9ICJSZWxhdGl2ZSBHQ2FzZSBhY3Rpdml0eSIsDQogICAgICAgZmlsbCAgPSAiQ29uZGl0aW9uIiwNCiAgICAgIHRpdGxlID0gIkdDYXNlIGFjdGl2aXR5IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICdibGFjaycsIHNpemUgPSAxKSAsDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MjEsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjEpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGNvbG9yPSJibGFjayIpLA0KICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgpLA0KICAgIGF4aXMudGlja3MubGVuZ3RoPXVuaXQoLjI1LCAiY20iKSwNCiAgICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQoNCiAgcHJpbnQocCkNCg0KI2dnc2F2ZShwYXN0ZTAoU3lzLkRhdGUoKSwiIEdDYXNlIGFjdGl2aXR5IERJVjMwLnBkZiIpLGhlaWdodD00KQ0KDQpgYGANCg0KQmFyIFBsb3RzIGZvciBhbGwgdGhlIGZlYXR1cmVzIG9uZSB0aW1lcG9pbnQNCmBgYHtyfQ0KDQpkYXRhTkJhclBsb3QlPiUNCiAgZ2dwbG90KGFlcyh4PWZhY3RvcihDZWxsTGluZSwgbGV2ZWwgPSBjKCJDVFJMMSIsICJDVFJMMiIsIkNUUkwzIiwgIlBEMSIsICJQRDIiLCJQRDMiKSksIHk9TWVhbkdDYXNlKSxvcmRlcmVkPVRSVUUpKw0KICAjZ2VvbV92aW9saW4oIGFlcyhmaWxsPUNvbmRpdGlvbiksc2hvdy5sZWdlbmQgPSBULCB0cmltPVQpLA0KICBnZW9tX2JhcihhZXMoZmlsbD1DZWxsTGluZSksc3RhdD0ic3VtbWFyeSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSxjb2xvdXI9ImJsYWNrIixzaXplPTAuMyx3aWR0aD0wLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0gYygiIzE1NjVDMCIsIGFscGhhKCgiIzE1NjVDMCIpLDAuNyksYWxwaGEoKCIjMTU2NUMwIiksMC40KSwiI0NDMDAwMCIsIGFscGhhKCgiI0NDMDAwMCIpLDAuNSksYWxwaGEoKCIjQ0MwMDAwIiksMC4yKSksbmFtZSA9ICJDZWxsTGluZSIsZ3VpZGUgPSAibm9uZSIpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPU1lYW5HQ2FzZSwgeW1heD1NZWFuR0Nhc2Urc2RfcmF0aW5nKSx3aWR0aD0uMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSksIHNpemU9MC4zKSsgICAgICAgICMgV2lkdGggb2YgdGhlIGVycm9yIGJhcnMNCiAgICB0aGVtZShsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSkgKw0KICAgIA0KICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiQ1RSTCIsICJHQkEtUEQiKSksIHRlc3Q9J3dpbGNveC50ZXN0JywNCiAgICAgICAgICAgICAgbWFyZ2luX3RvcD0wLjUsdmp1c3Q9MC41LCBzaXplPTAuNSwgdGV4dHNpemU9OSwgbWFwX3NpZ25pZl9sZXZlbD1jKCIqKioiPTAuMDAxLCAiKioiPTAuMDEsICIqIj0wLjA1LCAgIiAiPTIpICkgKw0KICAjZmFjZXRfZ3JpZCh+ZmN0X3JlbGV2ZWwoRGF5LCAiZDMwIiwiZDYwIiksIHNjYWxlcz0iZnJlZSIpICsNCiAgICAgICBsYWJzKHggICAgID0iIiwNCiAgICAgICAgeSAgICAgPSAiUmVsYXRpdmUgR0Nhc2UgYWN0aXZpdHkiLA0KICAgICAgIGZpbGwgID0gIiIsDQogICAgICB0aXRsZSA9ICIiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZSgNCiAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAnYmxhY2snLCBzaXplID0gMC4zKSAsDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9NywgY29sb3I9ImJsYWNrIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT03LCBjb2xvcj0iYmxhY2siKSwNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoc2l6ZT0wLjMpLA0KICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZShzaXplPTAuMyksDQogICAgYXhpcy50aWNrcy5sZW5ndGg9dW5pdCguMSwgImNtIiksDQogICAgI2NoYW5nZSBsZWdlbmQgdGV4dCBmb250IHNpemUpDQogICAgI2xlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAiY20iKSwNCiAgICAjbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC42LCJjbSIpLA0KICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdD0wLjUsIHZqdXN0PSAxLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCNlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGhqdXN0PTAuNSkNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIHZqdXN0PTAuNSksDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJsaWdodGdyYXkiKSwNCiAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwYW5lbC5zcGFjaW5nLnkgPSB1bml0KDAuOCwgImxpbmVzIiksDQogICAgc3RyaXAuc3dpdGNoLnBhZC53cmFwPXVuaXQoMjAsICJsaW5lcyIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTcpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE5KQ0KICAgIA0KICApICAtPiBwDQogICN0PC0gY293cGxvdDo6Z2dkcmF3KGNvd3Bsb3Q6OmFkZF9zdWIocCwgIldpbGNveC10ZXN0LCAqKipwPTAuMDAxLCAqKnA9MC4wMSwgKnA9MC4wNSIsaGp1c3Q9LTAuMiwgc2l6ZT0xMykpDQogIHByaW50KHApDQogICMjZ2dzYXZlKHBhc3RlMChTeXMuRGF0ZSgpLCJfIiwgbmFtZXNbaV0sICIucGRmIiksIHBsb3Q9dCkNCg0KDQpnZ3NhdmUocGFzdGUwKFN5cy5EYXRlKCksIiBHQ2FzZSBhY3Rpdml0eSBESVYzMC5wZGYiKSxoZWlnaHQ9Mi41LHdpZHRoPTMpDQoNCmBgYA0K