load libraries
Load 10x Visium
dataset
InstallData("stxBrain")
trying URL 'http://seurat.nygenome.org/src/contrib/stxBrain.SeuratData_0.1.2.tar.gz'
Content type 'application/octet-stream' length 142661912 bytes (136.1 MB)
==================================================
downloaded 136.1 MB
The downloaded source packages are in
‘/tmp/RtmpsJDVnL/downloaded_packages’
brain <- LoadData("stxBrain", type = "anterior1")
Data preprocessing
plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()
plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")
wrap_plots(plot1, plot2)

Normalization
brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)
Gene expression
visualization
SpatialFeaturePlot(brain, features = c("Hpca", "Ttr", "Mki67"))

custom_plot <- SpatialFeaturePlot(brain, features = c("Ttr")) +
theme(legend.text = element_text(size = 0),
legend.title = element_text(size = 20),
legend.key.size = unit(1, "cm"))
custom_plot

p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
p1 + p2

Dimensionality
reduction, clustering, and visualization
brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
visualize the results
of the clustering either in UMAP space
p1 <- DimPlot(brain, reduction = "umap", label = TRUE)
p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3)
p1 + p2

visualize the results
of the clustering either in UMAP space
SpatialDimPlot(brain,
cells.highlight = CellsByIdentities(object = brain, idents = c(2, 1, 4, 3, 5, 8)),
facet.highlight = TRUE,
ncol = 3) & theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

Interactive
plotting
SpatialDimPlot(brain, interactive = TRUE)

visualize the results
of the clustering either in UMAP space
SpatialFeaturePlot(brain, features = "Ttr", interactive = TRUE)

LinkedDimPlot(brain)

Identification of
Spatially Variable Features
de_markers <- FindMarkers(brain, ident.1 = 5, ident.2 = 7)
SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)

FindSpatiallyVariableFeatures
brain <- FindSpatiallyVariableFeatures(brain,
features = VariableFeatures(brain)[1:1000],
selection.method = "moransi")
| | 0 % ~calculating
|+ | 1 % ~05m 08s
|+ | 2 % ~04m 48s
|++ | 3 % ~04m 47s
|++ | 4 % ~04m 42s
|+++ | 5 % ~04m 39s
|+++ | 6 % ~04m 34s
|++++ | 7 % ~04m 26s
|++++ | 8 % ~04m 19s
|+++++ | 9 % ~04m 14s
|+++++ | 10% ~04m 09s
|++++++ | 11% ~04m 07s
|++++++ | 12% ~04m 02s
|+++++++ | 13% ~04m 01s
|+++++++ | 14% ~03m 56s
|++++++++ | 15% ~03m 52s
|++++++++ | 16% ~03m 48s
|+++++++++ | 17% ~03m 47s
|+++++++++ | 18% ~03m 43s
|++++++++++ | 19% ~03m 40s
|++++++++++ | 20% ~03m 36s
|+++++++++++ | 21% ~03m 32s
|+++++++++++ | 22% ~03m 30s
|++++++++++++ | 23% ~03m 26s
|++++++++++++ | 24% ~03m 24s
|+++++++++++++ | 25% ~03m 21s
|+++++++++++++ | 26% ~03m 18s
|++++++++++++++ | 27% ~03m 15s
|++++++++++++++ | 28% ~03m 13s
|+++++++++++++++ | 29% ~03m 10s
|+++++++++++++++ | 30% ~03m 07s
|++++++++++++++++ | 31% ~03m 04s
|++++++++++++++++ | 32% ~03m 02s
|+++++++++++++++++ | 33% ~02m 58s
|+++++++++++++++++ | 34% ~02m 56s
|++++++++++++++++++ | 35% ~02m 53s
|++++++++++++++++++ | 36% ~02m 50s
|+++++++++++++++++++ | 37% ~02m 47s
|+++++++++++++++++++ | 38% ~02m 44s
|++++++++++++++++++++ | 39% ~02m 41s
|++++++++++++++++++++ | 40% ~02m 38s
|+++++++++++++++++++++ | 41% ~02m 36s
|+++++++++++++++++++++ | 42% ~02m 33s
|++++++++++++++++++++++ | 43% ~02m 30s
|++++++++++++++++++++++ | 44% ~02m 27s
|+++++++++++++++++++++++ | 45% ~02m 25s
|+++++++++++++++++++++++ | 46% ~02m 22s
|++++++++++++++++++++++++ | 47% ~02m 20s
|++++++++++++++++++++++++ | 48% ~02m 17s
|+++++++++++++++++++++++++ | 49% ~02m 14s
|+++++++++++++++++++++++++ | 50% ~02m 11s
|++++++++++++++++++++++++++ | 51% ~02m 09s
|++++++++++++++++++++++++++ | 52% ~02m 06s
|+++++++++++++++++++++++++++ | 53% ~02m 04s
|+++++++++++++++++++++++++++ | 54% ~02m 01s
|++++++++++++++++++++++++++++ | 55% ~01m 58s
|++++++++++++++++++++++++++++ | 56% ~01m 56s
|+++++++++++++++++++++++++++++ | 57% ~01m 53s
|+++++++++++++++++++++++++++++ | 58% ~01m 50s
|++++++++++++++++++++++++++++++ | 59% ~01m 47s
|++++++++++++++++++++++++++++++ | 60% ~01m 45s
|+++++++++++++++++++++++++++++++ | 61% ~01m 42s
|+++++++++++++++++++++++++++++++ | 62% ~01m 39s
|++++++++++++++++++++++++++++++++ | 63% ~01m 37s
|++++++++++++++++++++++++++++++++ | 64% ~01m 34s
|+++++++++++++++++++++++++++++++++ | 65% ~01m 31s
|+++++++++++++++++++++++++++++++++ | 66% ~01m 29s
|++++++++++++++++++++++++++++++++++ | 67% ~01m 26s
|++++++++++++++++++++++++++++++++++ | 68% ~01m 24s
|+++++++++++++++++++++++++++++++++++ | 69% ~01m 21s
|+++++++++++++++++++++++++++++++++++ | 70% ~01m 18s
|++++++++++++++++++++++++++++++++++++ | 71% ~01m 16s
|++++++++++++++++++++++++++++++++++++ | 72% ~01m 13s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01m 10s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01m 08s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01m 05s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01m 03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01m 00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~57s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~55s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~52s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~50s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~47s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~44s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~42s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~39s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~36s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~34s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~31s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~29s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~26s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~23s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~21s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~18s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~16s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~13s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~08s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04m 21s
top.features <- head(SpatiallyVariableFeatures(brain, method = "moransi"), 6)
SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1)) &
theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

Subset out anatomical
regions
brain_sub <- subset(brain, idents = c(1, 2, 3, 4, 6, 7))
SpatialDimPlot(brain_sub, label = T, crop = T, label.size = 3) + NoLegend() +
SpatialDimPlot(brain_sub, label = T, crop = F, label.size = 3)

theme_axis_labels <- theme(axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
axis.title.x = element_text(size = 10),
axis.title.y = element_text(size = 10))
SpatialDimPlot(brain_sub, label = T, label.size = 3, crop = T) + theme_axis_labels

brain_sub[["anterior1"]] <- Crop(brain_sub[["anterior1"]],
x = c(150, 500),
y = c(0, 425))
SpatialDimPlot(brain_sub, label = T) + theme_axis_labels

m <- 0.6; b <- -550
cortex_coords <- GetTissueCoordinates(brain_sub, scale = "lowres") %>%
subset(-y >= (m * x + b))
cortex <- subset(brain_sub,
cells = cortex_coords$cell)
SpatialDimPlot(cortex, label = T, label.size = 3, crop = F)

c1 <- SpatialDimPlot(cortex, images = "anterior1", crop = T, label = T)
c2 <- SpatialDimPlot(cortex, images = "anterior1", crop = F, label = T, pt.size.factor = 1, label.size = 3)
c1 + c2

Integration with
single-cell data
allen_reference <- readRDS("/brahms/shared/vignette-data/allen_cortex.rds")
LS0tCnRpdGxlOiAiU2V1cmF0IFNwYXRpYWwgVHV0b3JpYWwiCmF1dGhvcjogIk5hc2lyIE1haG1vb2QgQWJiYXNpIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICB0aGVtZTogam91cm5hbAotLS0KCgojIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShTZXVyYXREYXRhKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgojIExvYWQgMTB4IFZpc2l1bSBkYXRhc2V0CmBgYHtyfQoKSW5zdGFsbERhdGEoInN0eEJyYWluIikKCmJyYWluIDwtIExvYWREYXRhKCJzdHhCcmFpbiIsIHR5cGUgPSAiYW50ZXJpb3IxIikKYGBgCgojIERhdGEgcHJlcHJvY2Vzc2luZwpgYGB7cn0KcGxvdDEgPC0gVmxuUGxvdChicmFpbiwgZmVhdHVyZXMgPSAibkNvdW50X1NwYXRpYWwiLCBwdC5zaXplID0gMC4xKSArIE5vTGVnZW5kKCkKCnBsb3QyIDwtIFNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSAibkNvdW50X1NwYXRpYWwiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgp3cmFwX3Bsb3RzKHBsb3QxLCBwbG90MikKYGBgCiMgTm9ybWFsaXphdGlvbgpgYGB7cn0KYnJhaW4gPC0gU0NUcmFuc2Zvcm0oYnJhaW4sIGFzc2F5ID0gIlNwYXRpYWwiLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCgoKIyBHZW5lIGV4cHJlc3Npb24gdmlzdWFsaXphdGlvbgpgYGB7cn0KU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9IGMoIkhwY2EiLCAiVHRyIiwgIk1raTY3IikpCmBgYAoKCmBgYHtyfQpjdXN0b21fcGxvdCA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gYygiVHRyIikpICsgCiAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMCksCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImNtIikpCgpjdXN0b21fcGxvdApgYGAKCgpgYGB7cn0KcDEgPC0gU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9ICJUdHIiLCBwdC5zaXplLmZhY3RvciA9IDEpCgpwMiA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gIlR0ciIsIGFscGhhID0gYygwLjEsIDEpKQoKcDEgKyBwMgpgYGAKCgoKCiMgRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLCBjbHVzdGVyaW5nLCBhbmQgdmlzdWFsaXphdGlvbgpgYGB7cn0KYnJhaW4gPC0gUnVuUENBKGJyYWluLCBhc3NheSA9ICJTQ1QiLCB2ZXJib3NlID0gRkFMU0UpCmJyYWluIDwtIEZpbmROZWlnaGJvcnMoYnJhaW4sIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKYnJhaW4gPC0gRmluZENsdXN0ZXJzKGJyYWluLCB2ZXJib3NlID0gRkFMU0UpCmJyYWluIDwtIFJ1blVNQVAoYnJhaW4sIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTozMCkKYGBgCgoKCgojIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2x1c3RlcmluZyBlaXRoZXIgaW4gVU1BUCBzcGFjZSAKYGBge3J9CnAxIDwtIERpbVBsb3QoYnJhaW4sIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFKSAKCnAyIDwtIFNwYXRpYWxEaW1QbG90KGJyYWluLCBsYWJlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAzKSAKCnAxICsgcDIKYGBgCgojIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2x1c3RlcmluZyBlaXRoZXIgaW4gVU1BUCBzcGFjZSAKYGBge3J9ClNwYXRpYWxEaW1QbG90KGJyYWluLAogICAgICAgICAgICAgICBjZWxscy5oaWdobGlnaHQgPSBDZWxsc0J5SWRlbnRpdGllcyhvYmplY3QgPSBicmFpbiwgaWRlbnRzID0gYygyLCAxLCA0LCAzLCA1LCA4KSksIAogICAgICAgICAgICAgICBmYWNldC5oaWdobGlnaHQgPSBUUlVFLCAKICAgICAgICAgICAgICAgbmNvbCA9IDMpICYgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMSwgMSksICJtbSIpKQpgYGAKCgojIEludGVyYWN0aXZlIHBsb3R0aW5nCmBgYHtyfQpTcGF0aWFsRGltUGxvdChicmFpbiwgaW50ZXJhY3RpdmUgPSBUUlVFKQpgYGAKCgoKCiMgdmlzdWFsaXplIHRoZSByZXN1bHRzIG9mIHRoZSBjbHVzdGVyaW5nIGVpdGhlciBpbiBVTUFQIHNwYWNlIApgYGB7cn0KU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9ICJUdHIiLCBpbnRlcmFjdGl2ZSA9IFRSVUUpCmBgYAoKCgojIApgYGB7cn0KTGlua2VkRGltUGxvdChicmFpbikKYGBgCgoKIyBJZGVudGlmaWNhdGlvbiBvZiBTcGF0aWFsbHkgVmFyaWFibGUgRmVhdHVyZXMKYGBge3J9CmRlX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoYnJhaW4sIGlkZW50LjEgPSA1LCBpZGVudC4yID0gNykKClNwYXRpYWxGZWF0dXJlUGxvdChvYmplY3QgPSBicmFpbiwgZmVhdHVyZXMgPSByb3duYW1lcyhkZV9tYXJrZXJzKVsxOjNdLCBhbHBoYSA9IGMoMC4xLCAxKSwgbmNvbCA9IDMpCmBgYAoKCgojIEZpbmRTcGF0aWFsbHlWYXJpYWJsZUZlYXR1cmVzCmBgYHtyfQpicmFpbiA8LSBGaW5kU3BhdGlhbGx5VmFyaWFibGVGZWF0dXJlcyhicmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKGJyYWluKVsxOjEwMDBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWV0aG9kID0gIm1vcmFuc2kiKQoKdG9wLmZlYXR1cmVzIDwtIGhlYWQoU3BhdGlhbGx5VmFyaWFibGVGZWF0dXJlcyhicmFpbiwgbWV0aG9kID0gIm1vcmFuc2kiKSwgNikKClNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSB0b3AuZmVhdHVyZXMsIG5jb2wgPSAzLCBhbHBoYSA9IGMoMC4xLCAxKSkgJiAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAxLCAxKSwgIm1tIikpCmBgYAoKCgoKIyBTdWJzZXQgb3V0IGFuYXRvbWljYWwgcmVnaW9ucwpgYGB7cn0KYnJhaW5fc3ViIDwtIHN1YnNldChicmFpbiwgaWRlbnRzID0gYygxLCAyLCAzLCA0LCA2LCA3KSkKClNwYXRpYWxEaW1QbG90KGJyYWluX3N1YiwgbGFiZWwgPSBULCBjcm9wID0gVCwgbGFiZWwuc2l6ZSA9IDMpICsgTm9MZWdlbmQoKSArIAogIFNwYXRpYWxEaW1QbG90KGJyYWluX3N1YiwgbGFiZWwgPSBULCBjcm9wID0gRiwgbGFiZWwuc2l6ZSA9IDMpCmBgYAoKCgoKCmBgYHtyfQp0aGVtZV9heGlzX2xhYmVscyA8LSB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQoKU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQsIGxhYmVsLnNpemUgPSAzLCBjcm9wID0gVCkgKyB0aGVtZV9heGlzX2xhYmVscwpgYGAKCgoKYGBge3J9CmJyYWluX3N1YltbImFudGVyaW9yMSJdXSA8LSBDcm9wKGJyYWluX3N1YltbImFudGVyaW9yMSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGMoMTUwLCA1MDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYygwLCA0MjUpKQoKU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQpICsgdGhlbWVfYXhpc19sYWJlbHMKYGBgCgoKCgoKYGBge3J9Cm0gPC0gMC42OyBiIDwtIC01NTAKCmNvcnRleF9jb29yZHMgPC0gR2V0VGlzc3VlQ29vcmRpbmF0ZXMoYnJhaW5fc3ViLCBzY2FsZSA9ICJsb3dyZXMiKSAlPiUKICAgICAgICAgICAgICAgICAgc3Vic2V0KC15ID49IChtICogeCArIGIpKQoKY29ydGV4IDwtIHN1YnNldChicmFpbl9zdWIsIAogICAgICAgICAgICAgICAgIGNlbGxzID0gY29ydGV4X2Nvb3JkcyRjZWxsKQoKU3BhdGlhbERpbVBsb3QoY29ydGV4LCBsYWJlbCA9IFQsIGxhYmVsLnNpemUgPSAzLCBjcm9wID0gRikKYGBgCgpgYGB7cn0KYzEgPC0gU3BhdGlhbERpbVBsb3QoY29ydGV4LCBpbWFnZXMgPSAiYW50ZXJpb3IxIiwgY3JvcCA9IFQsIGxhYmVsID0gVCkKYzIgPC0gU3BhdGlhbERpbVBsb3QoY29ydGV4LCBpbWFnZXMgPSAiYW50ZXJpb3IxIiwgY3JvcCA9IEYsIGxhYmVsID0gVCwgcHQuc2l6ZS5mYWN0b3IgPSAxLCBsYWJlbC5zaXplID0gMykKCmMxICsgYzIKYGBgCgoKIyBJbnRlZ3JhdGlvbiB3aXRoIHNpbmdsZS1jZWxsIGRhdGEKYGBge3J9CmFsbGVuX3JlZmVyZW5jZSA8LSByZWFkUkRTKCIvYnJhaG1zL3NoYXJlZC92aWduZXR0ZS1kYXRhL2FsbGVuX2NvcnRleC5yZHMiKQpgYGAKCg==