##################
# LOAD LIBRARIES #
##################
suppressWarnings({suppressMessages({suppressPackageStartupMessages({
  library(tidyverse)
  library(scales)
  library(vegan)
  library(RColorBrewer)
  # remotes::install_github("czarnewski/niceRplots",force=T)
  library(niceRplots)
  library(openxlsx)
})  })  })

#############
# LODA DATA #
#############
datasets_all_samples <- readRDS("../../results/03_normalize_data_output/datasets_all_samples.RDS")
metadata <- read.csv("../../data/metadata.csv",row.names = 1, stringsAsFactors = F)
raw_data <- c("ASV_Luminal", "ASV_Tissue") %>% 
  set_names() %>%
  map(., ~read_csv(paste0("../../results/02_data_preprocessing_output/",.x,"_raw_counts.csv")))
TRX <- datasets_all_samples[["Tissue_RNAseq_V3_normalized"]]
sample_use <- intersect(colnames(raw_data$ASV_Tissue), colnames(TRX)[colSums(TRX)!=0])

m <- metadata %>%
  select(ID, Luminal_gr, Tissue_gr) %>%
  arrange(Luminal_gr) %>%
  group_by(Luminal_gr) %>%
  nest() %>%
  mutate(L = map(data, ~arrange(.x, Tissue_gr))) %>%
  unnest(L)

group_annotation <- factor(setNames(m$Luminal_gr,m$ID))
group_annotation <- factor(setNames(metadata$Luminal_gr,metadata$ID))
group_annotation <- factor(setNames(metadata$Tissue_gr,metadata$ID))

#################
# COLOR PALETTS #
#################
lvl <- c("L. iners", "Gardnerella", "L. crispatus/acidophilus","Prevotella", "Atopobium","Sneathia", "L. jensenii", "Megasphaera", "Streptococcus", "Anaerococcus", "BVAB2", "Escherichia/Shigella", "BVAB1", "Dialister", "Mycoplasma", "Bifidobacterium", "Other")
pal <- c( "#0072B2", "#009E73","#D55E00", "#CC79A7", "#E69F00", "#999999")
taxa_pal <- c(RColorBrewer::brewer.pal(8,"Pastel2"),RColorBrewer::brewer.pal(8,"Pastel1"),"grey90")

Fig. 3 Identification of a distinct ectocervical tissue-adherent microbiome. Ectocervical tissue samples were assessed for presence of a tissue-adherent microbiome. a Bar plots of alpha diversity indices and taxonomy profiles for each individual tissue sample. Color-coded squares above the stacked bar plots show bacterial vaginosis (BV, binned Nugent’s scores) and HIV diagnosis, respectively. Gray: negative, orange: intermediate, red: positive BV; Gray: HIV seronegative, red: HIV seropositive. b Total relative abundance in the luminal and tissue microbiome datasets. All taxa with a total relative abundance < 0.55 are included in the “other” category. c Microbiome profile shift between luminal and tissue

LS0tCnRpdGxlOiAiRmlndXJlIDMuIFRpc3N1ZSBNaWNyb2Jpb21lIEFidW5kYW5jZXMiCmdlb21ldHJ5OiAibGVmdD0yY20scmlnaHQ9MmNtLHRvcD0yY20sYm90dG9tPTJjbSIKaGVhZGVyLWluY2x1ZGVzOiAKLSBcdXNlcGFja2FnZXtmbG9hdH0KZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCmtuaXQ6IChmdW5jdGlvbihpbnB1dEZpbGUsIG91dF9kaXIsIC4uLikgewogICAgc291cmNlKCIuLi8uLi9jb2RlL2tuaXRfZnVuY3Rpb24uUiIpOwogICAgY3VzdG9tX2tuaXQoaW5wdXRGaWxlLCAiLi4vLi4vbGFiX2Jvb2svRmlndXJlMy8iLCAuLi4pCiAgICB9KQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgcmVzdWx0cyAgICA9ICJob2xkIiwKICBtZXNzYWdlICAgID0gRkFMU0UsCiAgd2FybmluZyAgICA9IEZBTFNFLAogIGZpZy53aWR0aCAgPSA2LjY5MjkxMzM4NTgsCiAgZmlnLmFsaWduICA9ICJjZW50ZXIiLAogIGZpZy5wYXRoICAgPSIuL0ZpZ3VyZXMvIiwKICBmaWcucHJvY2VzcyA9IGZ1bmN0aW9uKGZpbGVuYW1lKXsKICAgIG5ld19maWxlbmFtZSA8LSBzdHJpbmdyOjpzdHJfcmVtb3ZlKHN0cmluZyA9IGZpbGVuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiLTEiKQogICAgZnM6OmZpbGVfbW92ZShwYXRoID0gZmlsZW5hbWUsIG5ld19wYXRoID0gbmV3X2ZpbGVuYW1lKQogICAgaWZlbHNlKGZzOjpmaWxlX2V4aXN0cyhuZXdfZmlsZW5hbWUpLCBuZXdfZmlsZW5hbWUsIGZpbGVuYW1lKQp9KQojIHNldHdkKCIvVXNlcnMvdmlsa2FsL3dvcmsvQnJvbGlkZW5zX3dvcmsvUHJvamVjdHMvYnJvbGlkZW5fNTMyNS9yZXBvcnRzL21hbnVzY3JpcHQiKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIyMjIyMjIyMjIyMjIyMjIwojIExPQUQgTElCUkFSSUVTICMKIyMjIyMjIyMjIyMjIyMjIyMjCnN1cHByZXNzV2FybmluZ3Moe3N1cHByZXNzTWVzc2FnZXMoe3N1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeSh0aWR5dmVyc2UpCiAgbGlicmFyeShzY2FsZXMpCiAgbGlicmFyeSh2ZWdhbikKICBsaWJyYXJ5KFJDb2xvckJyZXdlcikKICAjIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJjemFybmV3c2tpL25pY2VScGxvdHMiLGZvcmNlPVQpCiAgbGlicmFyeShuaWNlUnBsb3RzKQogIGxpYnJhcnkob3Blbnhsc3gpCn0pICB9KSAgfSkKCiMjIyMjIyMjIyMjIyMKIyBMT0RBIERBVEEgIwojIyMjIyMjIyMjIyMjCmRhdGFzZXRzX2FsbF9zYW1wbGVzIDwtIHJlYWRSRFMoIi4uLy4uL3Jlc3VsdHMvMDNfbm9ybWFsaXplX2RhdGFfb3V0cHV0L2RhdGFzZXRzX2FsbF9zYW1wbGVzLlJEUyIpCm1ldGFkYXRhIDwtIHJlYWQuY3N2KCIuLi8uLi9kYXRhL21ldGFkYXRhLmNzdiIscm93Lm5hbWVzID0gMSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCnJhd19kYXRhIDwtIGMoIkFTVl9MdW1pbmFsIiwgIkFTVl9UaXNzdWUiKSAlPiUgCiAgc2V0X25hbWVzKCkgJT4lCiAgbWFwKC4sIH5yZWFkX2NzdihwYXN0ZTAoIi4uLy4uL3Jlc3VsdHMvMDJfZGF0YV9wcmVwcm9jZXNzaW5nX291dHB1dC8iLC54LCJfcmF3X2NvdW50cy5jc3YiKSkpClRSWCA8LSBkYXRhc2V0c19hbGxfc2FtcGxlc1tbIlRpc3N1ZV9STkFzZXFfVjNfbm9ybWFsaXplZCJdXQpzYW1wbGVfdXNlIDwtIGludGVyc2VjdChjb2xuYW1lcyhyYXdfZGF0YSRBU1ZfVGlzc3VlKSwgY29sbmFtZXMoVFJYKVtjb2xTdW1zKFRSWCkhPTBdKQoKbSA8LSBtZXRhZGF0YSAlPiUKICBzZWxlY3QoSUQsIEx1bWluYWxfZ3IsIFRpc3N1ZV9ncikgJT4lCiAgYXJyYW5nZShMdW1pbmFsX2dyKSAlPiUKICBncm91cF9ieShMdW1pbmFsX2dyKSAlPiUKICBuZXN0KCkgJT4lCiAgbXV0YXRlKEwgPSBtYXAoZGF0YSwgfmFycmFuZ2UoLngsIFRpc3N1ZV9ncikpKSAlPiUKICB1bm5lc3QoTCkKCmdyb3VwX2Fubm90YXRpb24gPC0gZmFjdG9yKHNldE5hbWVzKG0kTHVtaW5hbF9ncixtJElEKSkKZ3JvdXBfYW5ub3RhdGlvbiA8LSBmYWN0b3Ioc2V0TmFtZXMobWV0YWRhdGEkTHVtaW5hbF9ncixtZXRhZGF0YSRJRCkpCmdyb3VwX2Fubm90YXRpb24gPC0gZmFjdG9yKHNldE5hbWVzKG1ldGFkYXRhJFRpc3N1ZV9ncixtZXRhZGF0YSRJRCkpCgojIyMjIyMjIyMjIyMjIyMjIwojIENPTE9SIFBBTEVUVFMgIwojIyMjIyMjIyMjIyMjIyMjIwpsdmwgPC0gYygiTC4gaW5lcnMiLCAiR2FyZG5lcmVsbGEiLCAiTC4gY3Jpc3BhdHVzL2FjaWRvcGhpbHVzIiwiUHJldm90ZWxsYSIsICJBdG9wb2JpdW0iLCJTbmVhdGhpYSIsICJMLiBqZW5zZW5paSIsICJNZWdhc3BoYWVyYSIsICJTdHJlcHRvY29jY3VzIiwgIkFuYWVyb2NvY2N1cyIsICJCVkFCMiIsICJFc2NoZXJpY2hpYS9TaGlnZWxsYSIsICJCVkFCMSIsICJEaWFsaXN0ZXIiLCAiTXljb3BsYXNtYSIsICJCaWZpZG9iYWN0ZXJpdW0iLCAiT3RoZXIiKQpwYWwgPC0gYyggIiMwMDcyQjIiLCAiIzAwOUU3MyIsIiNENTVFMDAiLCAiI0NDNzlBNyIsICIjRTY5RjAwIiwgIiM5OTk5OTkiKQp0YXhhX3BhbCA8LSBjKFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LCJQYXN0ZWwyIiksUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDgsIlBhc3RlbDEiKSwiZ3JleTkwIikKCmBgYAoKYGBge3IgRmlndXJlIDMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5wb3M9InQifQojIGZpZy5hc3A9MSwgZmlnLmhlaWdodD03LAojIyMgQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIERJVkVSU0lUWSArIFRBWCBBQlVOREFOQ0UgIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpmaWdsYWJlbHMgPC0gbGV0dGVycwoKbGF5b3V0KG1hdHJpeChjKDEsMSwxLDEsMSwxLAogICAgICAgICAgICAgICAgMiwyLDIsMiwyLDIsCiAgICAgICAgICAgICAgICAzLDMsNiw3LDQsNCwKICAgICAgICAgICAgICAgIDMsMyw2LDUsNCw0KSAsIG5jb2w9IDYsYnlyb3cgPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMS4yLDEsMS44MywxLjcsLjg1LDEuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gbGNtKGMoMiw0LjUsMi41LDIuMykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhlaWdodHMgPSBjKC43LDEuNiwxLDEuMSwxLC44LC4yKQogICAgICAgKQoKQVNWIDwtIGxpc3QoI2MoIkx1bWluYWxfZ3IiLCJBU1ZfTHVtaW5hbF9ub3JtYWxpemVkIiksCiAgICAgICAgICAgICBjKCJUaXNzdWVfZ3IiLCJBU1ZfVGlzc3VlX25vcm1hbGl6ZWQiKQogICAgICAgICApCmRpdl9saXN0IDwtIGxpc3QoKQpmb3IoaSBpbiBBU1YpewogIHggPC0gZGF0YXNldHNfYWxsX3NhbXBsZXNbW2lbMl1dXQogIAogIGRmIDwtIG5hLm9taXQobWV0YWRhdGFbc2FtcGxlX3VzZSwgYyhpWzFdLCAiSUQiKV0pCiAgbWV0YWRhdGEgPC0gbWV0YWRhdGFbZGZbLCJJRCJdLF0KICBnciA8LSBmYWN0b3Ioc2V0TmFtZXMobWV0YWRhdGFbW2lbMV1dXSxtZXRhZGF0YSRJRCkpCiAgZ3JvdXBfYW5ub3RhdGlvbiA8LSBuYS5vbWl0KGdyb3VwX2Fubm90YXRpb24pCgogIHBhcihtYXI9YygwLDUsMS41LDEuNSkpICNiLGwsdCxyCiAgdGVtcCA8LSB0KHQoMl54LTEpL2NvbFN1bXMoMl54LTEpKQogIHRlbXAgPC0gdGVtcFssIGRmWywiSUQiXV0KICAKICBzaGFubiA8LSB2ZWdhbjo6ZGl2ZXJzaXR5KHQodGVtcCksaW5kZXggPSBjKCJzaGFubm9uIikgKQogIHNpbXAgPC0gdmVnYW46OmRpdmVyc2l0eSh0KHRlbXApLGluZGV4ID0gYygic2ltcHNvbiIpICkKICBpbnZzaW1wIDwtIHZlZ2FuOjpkaXZlcnNpdHkodCh0ZW1wKSxpbmRleCA9IGMoImludnNpbXBzb24iKSApCiAgZGl2ZXJzIDwtIGFzLm1hdHJpeChyYmluZChzaGFubixzaW1wLGludnNpbXApICkKICBkaXZlcnNbaXMuaW5maW5pdGUoZGl2ZXJzKV0gPC0gMAogIHJvd25hbWVzKGRpdmVycykgPC0gYygiU2hhbm5vbiIsIlNpbXBzb24iLCJJbnYgU2ltcHNvbiIpCiAgCiAgYmFybGlzdCggZGF0YSA9IGRpdmVyc1ssb3JkZXIoZ3JvdXBfYW5ub3RhdGlvbildLAogICAgICAgICBtYWluID0gIiIsIHhsYWI9IiIsCiAgICAgICAgIGdlbmVzID0gYygiU2hhbm5vbiIsIlNpbXBzb24iLCJJbnYgU2ltcHNvbiIpLAogICAgICAgICBkcmF3X21lYW5fbGluZXM9Rixjb2wgPSBwYWxbZ3Jbb3JkZXIoZ3JvdXBfYW5ub3RhdGlvbildXSkKICAKICBkaXYgPC0gdGliYmxlKElEPW5hbWVzKHNoYW5uKSxzaGFubiwgc2ltcCwgaW52c2ltcCApICU+JSAKICAgIHJlbmFtZV93aXRoKC4sIH5wYXN0ZTAoYygiSUQiLCJTaGFubm9uIiwiU2ltcHNvbiIsIkludiBTaW1wc29uIikpKQogIGRpdl9saXN0W1tsZW5ndGgoZGl2X2xpc3QpICsgMV1dIDwtIGRpdgogIAogIGlmKGlbMl0gPT0gIkFTVl9UaXNzdWVfbm9ybWFsaXplZCIpewogICAgZW5kIDwtIHRhYmxlKHBhbFtmYWN0b3IoZ3JvdXBfYW5ub3RhdGlvbltzYW1wbGVfdXNlXSldKQogICAgZW5kIDwtIGVuZFtvcmRlcihmYWN0b3IobmFtZXMoZW5kKSwgbGV2ZWxzID0gcGFsKSldCiAgICBlbmQgPC0gbWFwX2RibChjdW1zdW0oZW5kKSwgfiAoLnggKiAocGFyKCJ1c3IiKVsyXSkvbGVuZ3RoKGNvbG5hbWVzKGRpdmVycykpKS0uMiApCiAgICBzdGFydCA8LSBjKDAuNSwgbWFwX2RibChlbmRbMTo0XSwgfi54KzAuNykpCiAgICAKICAgIGF4aXMoMSwgYXQgPSBjKHN0YXJ0LCBlbmQpLCBsYWJlbCA9IEYsIHBvcyA9My4zICwgeHBkPVQsIGNvbD1OQSwgY29sLnRpY2tzPSJibGFjayIpCiAgICBtYXAyKHN0YXJ0LCBlbmQsIH5saW5lcyh4PWMoLnksIC54KSwgeT0gYygzLjMsIDMuMyksIHhwZD1ULCBjZXg9LjgpKQogICAgdCA8LSBtYXAyKHN0YXJ0LCBlbmQsIH4oLngrLnkpLzIpCiAgICBtYXAyKHQsbGV2ZWxzKGdyKSwgfnRleHQoeD0ueCwgeT0zLjgsIC55LHhwZD1UKSkKICB9CiAgCiAgI2FkZCBsYWJlbAogIGFkZF9sZXR0ZXIoZmlnbGFiZWxzWzFdKTsgZmlnbGFiZWxzIDwtIGZpZ2xhYmVsc1stMV0KICAKICBwYXIobWFyPWMoMS41LDUsMSwxLjUpKSAjYixsLHQscgogIHRlbXBbaXMubmFuKHRlbXApXSA8LSAwCgogIG8gPC0gb3JkZXIoIHJvd1N1bXModGVtcCkgLCBkZWNyZWFzaW5nID0gVCkKICBzYW1wbGVfbyA8LSBuYW1lcyhncm91cF9hbm5vdGF0aW9uKVsgb3JkZXIoIGdyb3VwX2Fubm90YXRpb24gKV0KICB0ZW1wIDwtIHRlbXBbbyxzYW1wbGVfb10qMTAwCiAgdGVtcCA8LSByYmluZCh0ZW1wW2MobHZsWzE6MTZdKSxdLCBPdGhlciA9IGNvbFN1bXModGVtcFshKHJvdy5uYW1lcyh0ZW1wKSAlaW4lIGMobHZsWzE6MTZdKSksIF0pKQogIAogIGJhcnBsb3QoIHRlbXAsIGxhcz0yICwgYm9yZGVyID0gTkEgLCB5YXhzPSJpIiwgeGF4cz0iaSIseWxhYj0iYWJ1bmRhbmNlIiwKICAgICAgICAgICBtYWluPWdzdWIoIl9nciIsIiIsaVsxXSksZm9udC5tYWluPTEsbmFtZXMuYXJnID0gcmVwKCIiLG5jb2wodGVtcCkpLAogICAgICAgICAgIGNvbCA9IHRheGFfcGFsW2ZhY3Rvcihyb3duYW1lcyh0ZW1wKSxsZXZlbHMgPSBsdmwpXSkKICAKICBwb2ludHMoICgxOm5jb2wodGVtcCkpKjEuMiAtLjUsIHJlcChwYXIoInVzciIpWzNdLG5jb2wodGVtcCkpLTIsIAogICAgICAgICAgYmc9IndoaXRlIiwgcGNoPTE1LGNleD0uNyx4cGQ9VCwgCiAgICAgICAgICBjb2w9IGMoInRvbWF0byIsIm9yYW5nZSIsIiNkN2Q3ZDciKVtmYWN0b3IobWV0YWRhdGEkQlZfRGlhZ25vc2lzX3YzKV1bb3JkZXIoIGdyb3VwX2Fubm90YXRpb24pXSkKICBwb2ludHMoICgxOm5jb2wodGVtcCkpKjEuMiAtLjUsIHJlcChwYXIoInVzciIpWzNdLG5jb2wodGVtcCkpLTcsYmc9IndoaXRlIiwKICAgICAgICBjb2w9IGMoIiNkN2Q3ZDciLCJ0b21hdG8iKVtmYWN0b3IobWV0YWRhdGEkSElWc3RhdHVzKV1bb3JkZXIoIGdyb3VwX2Fubm90YXRpb24gKV0sCiAgICAgICAgcGNoPTE1LGNleD0uNyx4cGQ9VCkKICB0ZXh0KHBhcigidXNyIilbMl0scGFyKCJ1c3IiKVszXS0yLGxhYmVscyA9ICIgICAgICBCViIsY2V4PS41LHhwZD1UKQogIHRleHQocGFyKCJ1c3IiKVsyXSxwYXIoInVzciIpWzNdLTcsbGFiZWxzID0gIiAgICAgICBISVYiLGNleD0uNSx4cGQ9VCkgIyBwb3M9NCwKICAKIGwgPC0gYygiQlY6IiwiTm9ybWFsIiwiSW50ZXJtZWRpYXRlIiwiQlYiKQogIGxlZ2VuZCh4ID0gMTAsIHkgPSAxMTEsICMiYm90dG9tIiwgaW5zZXQgPSBjKDAsIC0wLjUpLAogICAgICAgICBidHkgPSAibiIsIGhvcml6PVRSVUUsIGNleD0wLjcsIHhwZCA9IFQsIAogICAgICAgICBib3JkZXIgPSBOQSwgI3BjaD0xNSwKICAgICAgICAgbGVnZW5kID0gbCwgeC5pbnRlcnNwPTAuNSwgeGp1c3Q9MCwKICAgICAgICAgdGV4dC53aWR0aCA9IGMoMCwgbWFwX2RibChsLCB+c3Ryd2lkdGgoLngpLzIpKSAsCiAgICAgICAgIGZpbGw9YyhOQSwgIiNkN2Q3ZDciLCJvcmFuZ2UiLCJ0b21hdG8iKSkKICBsMiA8LSBjKCJISVY6IiwiSElWLSIsIkhJVisiKQogIGxlZ2VuZCh4ID0gNzAsIHkgPSAxMTEsICMgYm90dG9tIHBvc2l0aW9uOiBwYXIoInVzciIpWzNdLTUKICAgICAgICAgYnR5ID0gIm4iLCBob3Jpej1UUlVFLCBjZXg9MC43LCB4cGQgPSBULAogICAgICAgICBib3JkZXIgPSBOQSwKICAgICAgICAgbGVnZW5kID0gbDIsIHguaW50ZXJzcD0wLjUsIAogICAgICAgICB0ZXh0LndpZHRoID1jKDAsIG1hcF9kYmwobDIsIH5zdHJ3aWR0aCgueCkvMikpLAogICAgICAgICBmaWxsPWMoTkEsICIjZDdkN2Q3IiwgInRvbWF0byIpKQp9CgoKIyMjIEIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRPVEFMIFJFTEFUSVZFIEFCVU5EQU5DRSAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKc2FtcGxlX3VzZSA8LSBjb2xuYW1lcyhUUlgpW2NvbFN1bXMoVFJYKSE9MF0KcmF3X2xpc3QgPC0gcmF3X2RhdGEgJT4lCiAgbWFwKC4sIH5jb2x1bW5fdG9fcm93bmFtZXMoLiwgdmFyID0gIlgxIikpICU+JSAgICAgICAgICAKICBtYXAoLiwgfmRwbHlyOjpzZWxlY3QoLiwgYW55X29mKHNhbXBsZV91c2UpKSkgCiAgICAgICAgICAgIApyIDwtIHJhd19saXN0ICU+JQogIG1hcCguLCB+bXV0YXRlKC4sYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IC4vc3VtKC4pKSkgKSAlPiUKICBtYXAoLiwgfihyb3dTdW1zKC54KS9sZW5ndGgoY29sbmFtZXMoLngpKSApKjEwMCApICU+JQogIGJpbmRfcm93cyguLCAuaWQ9IklEIikgJT4lCiAgICBwaXZvdF9sb25nZXIoLUlEKSAlPiUgCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gSUQsIHZhbHVlc19mcm9tID0gdmFsdWUpICU+JQogICAgbXV0YXRlX2F0KHZhcnMobmFtZSksIH5yZXBsYWNlKC4sIEFTVl9MdW1pbmFsPDAuNTUsICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShuYW1lID0gaWZlbHNlKC4kbmFtZT09Ik5vdCBhc3NpZ25lZCIsICJPdGhlciIsIC4kbmFtZSkpICU+JQogICAgZ3JvdXBfYnkobmFtZSkgJT4lCiAgICBzdW1tYXJpemUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+c3VtKC4pKSkgJT4lCiAgICBhcnJhbmdlKC1BU1ZfTHVtaW5hbCkgJT4lCiAgICBkcGx5cjo6cmVuYW1lKEx1bWluYWw9IkFTVl9MdW1pbmFsIixUaXNzdWU9IkFTVl9UaXNzdWUiKSAlPiUKICAgIGByb3cubmFtZXM8LWAoLiwgTlVMTCkgJT4lIAogICAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJuYW1lIikgJT4lCiAgICBhcy5tYXRyaXgoKQoKcGFyKG1hcj1jKDEuMyw1LDIsLjMpKSAjYixsLHQscgpiYXJwbG90KCByLCBib3JkZXIgPSBOQSAseWxhYj0iYWJ1bmRhbmNlIiwgeGxhYiA9IiIsIGF4aXNuYW1lcyA9IEYsCiAgICAgICAgIGNvbCA9IHRheGFfcGFsW2ZhY3Rvcihyb3duYW1lcyhyKSxsZXZlbHMgPSBsdmwpXSkKdGl0bGUobWFpbiA9ICJUb3RhbCByZWxhdGl2ZSBhYnVuZGFuY2UgIiwgbGluZSA9IDAuNSwgY2V4Lm1haW4gPSAuOSwgZm9udC5tYWluPSAxKQptdGV4dCgiTHVtaW5hbCAgICAgICAgVGlzc3VlICIsIGxpbmUgPSAwLCBjZXg9LjYsIHNpZGU9MSkKCiNhZGQgbGFiZWwKYWRkX2xldHRlcihmaWdsYWJlbHNbMV0pOyBmaWdsYWJlbHMgPC0gZmlnbGFiZWxzWy0xXQoKCiMjIyBDCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTFVNSU5BTC1USVNTVUUgQ09NUEFSSVNPTiAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnBhcihtYXI9YygwLDEuMSwyLDIpKSAjYixsLHQscgp4IDwtIGFzLmNoYXJhY3RlcihtZXRhZGF0YVssIkx1bWluYWxfZ3IiXSkKeFtpcy5uYSh4KV0gPC0gIk5BIgp5IDwtIGFzLmNoYXJhY3RlcihtZXRhZGF0YVssIlRpc3N1ZV9nciJdKQp5W2lzLm5hKHkpXSA8LSAiTkEiCngxIDwtIHggWyAoeCE9Ik5BIikgJiAoeSE9Ik5BIikgXQp5MSA8LSB5IFsgKHghPSJOQSIpICYgKHkhPSJOQSIpIF0KZGYgPC0gZGF0YS5mcmFtZSh4MSx5MSkKcCA8LSBwbG90X3NhbmtleShkZiwgY29sb3JfYnkgPSAxLCAKICAgICAgICAgICAgIHBsb3RfbGFiZWxzID0gVCwgcGxvdF93ZWlnaHRzID0gRiwgb3JkZXJfMV9ieSA9ICJOVUxMIiwKICAgICAgICAgICAgIG9yZGVyXzJfYnkgPSAiZGlzZW50YW5nbGVkIix1c2VfdzEgPSBULHVzZV93MiA9IFQsCiAgICAgICAgICAgICBnYXAydiA9IDAsc21vb3RoaW5nID0gLjEscGFsPSBwYWwKICAgICAgICAgICAgICkKdGV4dChjKDAsMSksYygxLDEpLGxhYmVscyA9IGMoICJMdW1pbmFsIiAsICJUaXNzdWUiICkscG9zPTMsIHhwZD1UKQoKI2FkZCBsYWJlbAphZGRfbGV0dGVyKGZpZ2xhYmVsc1sxXSk7IGZpZ2xhYmVscyA8LSBmaWdsYWJlbHNbLTFdCgoKIyMjIyMjIyMjIyMKIyBMRUdFTkRTICMKIyMjIyMjIyMjIyMKcGFyKG1hcj1jKDAsMCwwLC41KSkgI2IsbCx0LHIgIyBwYXIobWFyPWMoMSwuMywwLC41KSkgI2IsbCx0LHIKZW1wdHlfcGxvdCgpCmxlZ2VuZCh4ID0gLTAuMDQsIAogICAgICAgeSA9IDEuMDQsIAogICAgICAgbGVnZW5kID0gYygiTC4gY3Jpc3BhdHVzL2plbnNlbmlpIiwgIkwuIGluZXJzIiwgIkdhcmRuZXJlbGxhIiwgIkhpZ2ggZGl2ZXJzZSIsICJPdGhlciIpICwKICAgICAgIHhqdXN0ID0gMCx5anVzdCA9IDEsdGl0bGUuYWRqID0gMCwgIG5jb2wgPTEsCiAgICAgICBidHkgPSAibiIscGNoID0gMjIscHQuY2V4ID0gMixjZXggPSAxLHhwZD1ULHRpdGxlID0gIlN0dWR5IEdyb3VwcyIsCiAgICAgICBwdC5iZyA9IHBhbCkKCnBhcihtYXI9YygwLC4yLDEuNSwuNCkpICNiLGwsdCxyCmVtcHR5X3Bsb3QoKQpsZWdlbmQoeCA9IHBhcigidXNyIilbYygxKV0sCiAgICAgICAgIHkgPSBwYXIoInVzciIpW2MoNCldLAogICAgICAgICBsZWdlbmQgPSBsdmxbMToxMl0seGp1c3QgPSAwLHlqdXN0ID0gMSwKICAgICAgICAgYnR5ID0gIm4iLHBjaCA9IDIyLHB0LmNleCA9IDIsY2V4ID0gMSx4cGQ9VCwKICAgICAgICAgcHQuYmcgPSB0YXhhX3BhbCkKCnBhcihtYXI9YygwLDAsMS41LDEpKSAjYixsLHQscgplbXB0eV9wbG90KCkKbGVnZW5kKHggPSBwYXIoInVzciIpW2MoMSldLAogICAgICAgICB5ID0gcGFyKCJ1c3IiKVtjKDQpXSwKICAgICAgICAgbGVnZW5kID0gbHZsWzEzOjE3XSx4anVzdCA9IDAseWp1c3QgPSAxLAogICAgICAgICBidHkgPSAibiIscGNoID0gMjIscHQuY2V4ID0gMixjZXggPSAxLHhwZD1ULAogICAgICAgICBwdC5iZyA9IHRheGFfcGFsWzEzOjE3XSkKCmBgYAoKKipGaWcuIDMgSWRlbnRpZmljYXRpb24gb2YgYSBkaXN0aW5jdCBlY3RvY2VydmljYWwgdGlzc3VlLWFkaGVyZW50IG1pY3JvYmlvbWUuKiogRWN0b2NlcnZpY2FsIHRpc3N1ZSBzYW1wbGVzIHdlcmUgYXNzZXNzZWQgZm9yIHByZXNlbmNlIG9mIGEgdGlzc3VlLWFkaGVyZW50IG1pY3JvYmlvbWUuIGEgQmFyIHBsb3RzIG9mIGFscGhhIGRpdmVyc2l0eSBpbmRpY2VzIGFuZCB0YXhvbm9teSBwcm9maWxlcyBmb3IgZWFjaCBpbmRpdmlkdWFsIHRpc3N1ZSBzYW1wbGUuIENvbG9yLWNvZGVkIHNxdWFyZXMgYWJvdmUgdGhlIHN0YWNrZWQgYmFyIHBsb3RzIHNob3cgYmFjdGVyaWFsIHZhZ2lub3NpcyAoQlYsIGJpbm5lZCBOdWdlbnTigJlzIHNjb3JlcykgYW5kIEhJViBkaWFnbm9zaXMsIHJlc3BlY3RpdmVseS4gR3JheTogbmVnYXRpdmUsIG9yYW5nZTogaW50ZXJtZWRpYXRlLCByZWQ6IHBvc2l0aXZlIEJWOyBHcmF5OiBISVYgc2Vyb25lZ2F0aXZlLCByZWQ6IEhJViBzZXJvcG9zaXRpdmUuIGIgVG90YWwgcmVsYXRpdmUgYWJ1bmRhbmNlIGluIHRoZSBsdW1pbmFsIGFuZCB0aXNzdWUgbWljcm9iaW9tZSBkYXRhc2V0cy4gQWxsIHRheGEgd2l0aCBhIHRvdGFsIHJlbGF0aXZlIGFidW5kYW5jZSA8IDAuNTUgYXJlIGluY2x1ZGVkIGluIHRoZSDigJxvdGhlcuKAnSBjYXRlZ29yeS4gYyBNaWNyb2Jpb21lIHByb2ZpbGUgc2hpZnQgYmV0d2VlbiBsdW1pbmFsIGFuZCB0aXNzdWU=