1. load libraries

2. Load Seurat Object


#Load Seurat Object merged from cell lines and a control(PBMC) after filtration
load("../5-SS_ScRNA_Data_Analysis/4-ScSS_MyAnalysis_on_SS/2-Marie-Objects-Merged-into-Seurat-Object/1-Merged_using_marie_obj/SS_merged_marie_obj-2-Variation.Robj")

All_samples_Merged
An object of class Seurat 
36629 features across 49193 samples within 2 assays 
Active assay: RNA (36601 features, 0 variable features)
 2 layers present: counts, data
 1 other assay present: ADT

3. Data PREPARATION


alldata <- All_samples_Merged

alldata.list <- SplitObject(alldata, split.by = "orig.ident")

for (i in 1:length(alldata.list)) {
    alldata.list[[i]] <- NormalizeData(alldata.list[[i]], verbose = FALSE)
    alldata.list[[i]] <- FindVariableFeatures(alldata.list[[i]], selection.method = "vst", nfeatures = 2000,verbose = FALSE)
}

# get the variable genes from all the datasets.
hvgs_per_dataset <- lapply(alldata.list, function(x) { x@assays$RNA@var.features })

# also add in the variable genes that was selected on the whole dataset
hvgs_per_dataset$all = VariableFeatures(alldata)

temp <- unique(unlist(hvgs_per_dataset))
overlap <- sapply( hvgs_per_dataset , function(x) { temp %in% x } )
pheatmap::pheatmap(t(overlap*1),cluster_rows = F ,
                   color = c("grey90","grey20"))


hvgs_all = SelectIntegrationFeatures(alldata.list)
hvgs_per_dataset$all_ranks = hvgs_all

temp <- unique(unlist(hvgs_per_dataset))
overlap <- sapply( hvgs_per_dataset , function(x) { temp %in% x } )
pheatmap::pheatmap(t(overlap*1),cluster_rows = F ,
                   color = c("grey90","grey20"))



alldata.list <- lapply(X = alldata.list, FUN = function(x) {
    x <- ScaleData(x, features = hvgs_all, verbose = FALSE)
    x <- RunPCA(x, features = hvgs_all, verbose = FALSE)
})

4. CCA-integration


alldata.anchors <- FindIntegrationAnchors(object.list = alldata.list, dims = 1:12, reduction = "cca", anchor.features = hvgs_all)
Scaling features for provided objects

  |                                                  | 0 % ~calculating  
  |+++++++                                           | 12% ~14s          
  |+++++++++++++                                     | 25% ~08s          
  |+++++++++++++++++++                               | 38% ~06s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Finding all pairwise anchors

  |                                                  | 0 % ~calculating  
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17113 anchors
Filtering anchors
    Retained 3118 anchors

  |++                                                | 4 % ~46m 07s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 19554 anchors
Filtering anchors
    Retained 5095 anchors

  |++++                                              | 7 % ~41m 52s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15890 anchors
Filtering anchors
    Retained 4209 anchors

  |++++++                                            | 11% ~36m 43s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17747 anchors
Filtering anchors
    Retained 4554 anchors

  |++++++++                                          | 14% ~35m 41s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 14956 anchors
Filtering anchors
    Retained 3331 anchors

  |+++++++++                                         | 18% ~33m 12s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17103 anchors
Filtering anchors
    Retained 3771 anchors

  |+++++++++++                                       | 21% ~31m 59s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17975 anchors
Filtering anchors
    Retained 4653 anchors

  |+++++++++++++                                     | 25% ~30m 41s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 16089 anchors
Filtering anchors
    Retained 2997 anchors

  |+++++++++++++++                                   | 29% ~28m 53s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17970 anchors
Filtering anchors
    Retained 3877 anchors

  |+++++++++++++++++                                 | 32% ~26m 49s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 16831 anchors
Filtering anchors
    Retained 6117 anchors

  |++++++++++++++++++                                | 36% ~25m 11s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17334 anchors
Filtering anchors
    Retained 4290 anchors

  |++++++++++++++++++++                              | 39% ~23m 40s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15420 anchors
Filtering anchors
    Retained 3835 anchors

  |++++++++++++++++++++++                            | 43% ~21m 59s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17292 anchors
Filtering anchors
    Retained 4349 anchors

  |++++++++++++++++++++++++                          | 46% ~20m 26s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15498 anchors
Filtering anchors
    Retained 4596 anchors

  |+++++++++++++++++++++++++                         | 50% ~18m 53s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15608 anchors
Filtering anchors
    Retained 4407 anchors

  |+++++++++++++++++++++++++++                       | 54% ~17m 22s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 16580 anchors
Filtering anchors
    Retained 4149 anchors

  |+++++++++++++++++++++++++++++                     | 57% ~16m 01s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 14736 anchors
Filtering anchors
    Retained 3523 anchors

  |+++++++++++++++++++++++++++++++                   | 61% ~14m 34s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 16895 anchors
Filtering anchors
    Retained 3997 anchors

  |+++++++++++++++++++++++++++++++++                 | 64% ~13m 15s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15671 anchors
Filtering anchors
    Retained 6043 anchors

  |++++++++++++++++++++++++++++++++++                | 68% ~11m 52s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15201 anchors
Filtering anchors
    Retained 5980 anchors

  |++++++++++++++++++++++++++++++++++++              | 71% ~10m 29s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 14296 anchors
Filtering anchors
    Retained 5464 anchors

  |++++++++++++++++++++++++++++++++++++++            | 75% ~09m 04s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17293 anchors
Filtering anchors
    Retained 621 anchors

  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07m 45s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 16014 anchors
Filtering anchors
    Retained 898 anchors

  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~06m 25s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 17524 anchors
Filtering anchors
    Retained 886 anchors

  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05m 08s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15980 anchors
Filtering anchors
    Retained 935 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03m 50s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15941 anchors
Filtering anchors
    Retained 644 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02m 33s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15024 anchors
Filtering anchors
    Retained 672 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01m 16s      
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 15691 anchors
Filtering anchors
    Retained 714 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=35m 05s
alldata.int <- IntegrateData(anchorset = alldata.anchors, dims = 1:12, new.assay.name = "CCA")
Merging dataset 7 into 4
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 5 into 4 7
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 3 into 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 6 into 4 7 5
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 1 3 into 4 7 5 6
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 2 into 4 7 5 6 1 3
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 8 into 4 7 5 6 1 3 2
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
names(alldata.int@assays)
[1] "RNA" "ADT" "CCA"
alldata.int@active.assay
[1] "CCA"
DefaultAssay(alldata.int) <- "CCA"

#Run Dimensionality reduction on integrated space
alldata.int <- ScaleData(alldata.int, verbose = TRUE)
Centering and scaling data matrix

  |                                                                                                       
  |                                                                                                 |   0%
  |                                                                                                       
  |================================================                                                 |  50%
  |                                                                                                       
  |=================================================================================================| 100%
alldata.int <- RunPCA(alldata.int, features = hvgs_all, reduction.name = "pca_CCA", do.print = TRUE, pcs.print = 1:5, genes.print = 15, verbose = FALSE)
alldata.int <- RunUMAP(alldata.int, reduction = "pca_CCA", reduction.name = "umap_CCA", dims = 1:12, verbose = FALSE)
Avis : 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 session
alldata.int <- RunTSNE(alldata.int, reduction = "pca_CCA",reduction.name = "tsne_CCA",dims = 1:12, verbose = FALSE)
alldata.int <- FindNeighbors(alldata.int, reduction = "pca_CCA", dims = 1:12, verbose = FALSE)
alldata.int <- FindClusters(alldata.int, resolution = 1.2, verbose = FALSE)



wrap_plots(

    DimPlot(alldata.int, reduction = "pca_CCA", group.by = "orig.ident")+NoAxes()+ggtitle("PCA integrated"),
    DimPlot(alldata.int, reduction = "tsne_CCA", group.by = "orig.ident")+NoAxes()+ggtitle("tSNE integrated"),
    DimPlot(alldata.int, reduction = "umap_CCA", group.by = "orig.ident")+NoAxes()+ggtitle("UMAP integrated"),

    DimPlot(alldata.int, reduction = "pca_CCA", group.by = "CCA_snn_res.1.2")+NoAxes()+ggtitle("PCA integrated"),
    DimPlot(alldata.int, reduction = "tsne_CCA", group.by = "CCA_snn_res.1.2")+NoAxes()+ggtitle("tSNE integrated"),
    DimPlot(alldata.int, reduction = "umap_CCA", group.by = "CCA_snn_res.1.2")+NoAxes()+ggtitle("UMAP integrated"),
    ncol = 3) + plot_layout(guides = "collect")

FeaturePlot



myfeatures <- c("CD3E", "CD4", "CD8A", "NKG7", "GNLY", "MS4A1", "CD14", "LYZ", "MS4A7", "FCGR3A", "CST3", "FCER1A")
FeaturePlot(alldata.int, reduction = "umap_CCA", dims = 1:2, features = myfeatures, ncol = 4, order = T) + NoLegend() + NoAxes() + NoGrid()
Avis : Found the following features in more than one assay, excluding the default. We will not include these in the final data frame: CD4Avis : Could not find CD3E in the default search locations, found in 'RNA' assay insteadAvis : Could not find CD14 in the default search locations, found in 'RNA' assay insteadAvis : Could not find FCGR3A in the default search locations, found in 'RNA' assay insteadAvis : Could not find FCER1A in the default search locations, found in 'RNA' assay insteadAvis : The following requested variables were not found: CD4

5. Save the Seurat object as an Robj file


#save(alldata.int, file = "Integration-by-different-Methods-1.Robj")
LS0tCnRpdGxlOiAiSW50ZWdyYXRpb24gYnkgRGlmZmVyZW50IE1ldGhvZHMtQ0NBIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICIyMDI0LTA0LTI2IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGRhcmtseQotLS0KIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2V1cmF0T2JqZWN0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXRpY3VsYXRlKQpsaWJyYXJ5KEF6aW11dGgpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoUnRzbmUpCmxpYnJhcnkoaGFybW9ueSkKCmBgYAoKCgoKIyAyLiBMb2FkIFNldXJhdCBPYmplY3QgCmBgYHtyIGxvYWRfc2V1cmF0fQoKI0xvYWQgU2V1cmF0IE9iamVjdCBtZXJnZWQgZnJvbSBjZWxsIGxpbmVzIGFuZCBhIGNvbnRyb2woUEJNQykgYWZ0ZXIgZmlsdHJhdGlvbgpsb2FkKCIuLi81LVNTX1NjUk5BX0RhdGFfQW5hbHlzaXMvNC1TY1NTX015QW5hbHlzaXNfb25fU1MvMi1NYXJpZS1PYmplY3RzLU1lcmdlZC1pbnRvLVNldXJhdC1PYmplY3QvMS1NZXJnZWRfdXNpbmdfbWFyaWVfb2JqL1NTX21lcmdlZF9tYXJpZV9vYmotMi1WYXJpYXRpb24uUm9iaiIpCgpBbGxfc2FtcGxlc19NZXJnZWQKYGBgCiMgMy4gRGF0YSBQUkVQQVJBVElPTgpgYGB7ciBkYXRhLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCmFsbGRhdGEgPC0gQWxsX3NhbXBsZXNfTWVyZ2VkCgphbGxkYXRhLmxpc3QgPC0gU3BsaXRPYmplY3QoYWxsZGF0YSwgc3BsaXQuYnkgPSAib3JpZy5pZGVudCIpCgpmb3IgKGkgaW4gMTpsZW5ndGgoYWxsZGF0YS5saXN0KSkgewogICAgYWxsZGF0YS5saXN0W1tpXV0gPC0gTm9ybWFsaXplRGF0YShhbGxkYXRhLmxpc3RbW2ldXSwgdmVyYm9zZSA9IEZBTFNFKQogICAgYWxsZGF0YS5saXN0W1tpXV0gPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoYWxsZGF0YS5saXN0W1tpXV0sIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCx2ZXJib3NlID0gRkFMU0UpCn0KCiMgZ2V0IHRoZSB2YXJpYWJsZSBnZW5lcyBmcm9tIGFsbCB0aGUgZGF0YXNldHMuCmh2Z3NfcGVyX2RhdGFzZXQgPC0gbGFwcGx5KGFsbGRhdGEubGlzdCwgZnVuY3Rpb24oeCkgeyB4QGFzc2F5cyRSTkFAdmFyLmZlYXR1cmVzIH0pCgojIGFsc28gYWRkIGluIHRoZSB2YXJpYWJsZSBnZW5lcyB0aGF0IHdhcyBzZWxlY3RlZCBvbiB0aGUgd2hvbGUgZGF0YXNldApodmdzX3Blcl9kYXRhc2V0JGFsbCA9IFZhcmlhYmxlRmVhdHVyZXMoYWxsZGF0YSkKCnRlbXAgPC0gdW5pcXVlKHVubGlzdChodmdzX3Blcl9kYXRhc2V0KSkKb3ZlcmxhcCA8LSBzYXBwbHkoIGh2Z3NfcGVyX2RhdGFzZXQgLCBmdW5jdGlvbih4KSB7IHRlbXAgJWluJSB4IH0gKQpwaGVhdG1hcDo6cGhlYXRtYXAodChvdmVybGFwKjEpLGNsdXN0ZXJfcm93cyA9IEYgLAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJncmV5OTAiLCJncmV5MjAiKSkKCmh2Z3NfYWxsID0gU2VsZWN0SW50ZWdyYXRpb25GZWF0dXJlcyhhbGxkYXRhLmxpc3QpCmh2Z3NfcGVyX2RhdGFzZXQkYWxsX3JhbmtzID0gaHZnc19hbGwKCnRlbXAgPC0gdW5pcXVlKHVubGlzdChodmdzX3Blcl9kYXRhc2V0KSkKb3ZlcmxhcCA8LSBzYXBwbHkoIGh2Z3NfcGVyX2RhdGFzZXQgLCBmdW5jdGlvbih4KSB7IHRlbXAgJWluJSB4IH0gKQpwaGVhdG1hcDo6cGhlYXRtYXAodChvdmVybGFwKjEpLGNsdXN0ZXJfcm93cyA9IEYgLAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJncmV5OTAiLCJncmV5MjAiKSkKCgphbGxkYXRhLmxpc3QgPC0gbGFwcGx5KFggPSBhbGxkYXRhLmxpc3QsIEZVTiA9IGZ1bmN0aW9uKHgpIHsKICAgIHggPC0gU2NhbGVEYXRhKHgsIGZlYXR1cmVzID0gaHZnc19hbGwsIHZlcmJvc2UgPSBGQUxTRSkKICAgIHggPC0gUnVuUENBKHgsIGZlYXR1cmVzID0gaHZnc19hbGwsIHZlcmJvc2UgPSBGQUxTRSkKfSkKYGBgCgoKCiMgNC4gQ0NBLWludGVncmF0aW9uCmBgYHtyIGludGVncmF0aW9uLUNDQSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgphbGxkYXRhLmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IGFsbGRhdGEubGlzdCwgZGltcyA9IDE6MTIsIHJlZHVjdGlvbiA9ICJjY2EiLCBhbmNob3IuZmVhdHVyZXMgPSBodmdzX2FsbCkKCmFsbGRhdGEuaW50IDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gYWxsZGF0YS5hbmNob3JzLCBkaW1zID0gMToxMiwgbmV3LmFzc2F5Lm5hbWUgPSAiQ0NBIikKCm5hbWVzKGFsbGRhdGEuaW50QGFzc2F5cykKCmFsbGRhdGEuaW50QGFjdGl2ZS5hc3NheQoKRGVmYXVsdEFzc2F5KGFsbGRhdGEuaW50KSA8LSAiQ0NBIgoKI1J1biBEaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gb24gaW50ZWdyYXRlZCBzcGFjZQphbGxkYXRhLmludCA8LSBTY2FsZURhdGEoYWxsZGF0YS5pbnQsIHZlcmJvc2UgPSBUUlVFKQphbGxkYXRhLmludCA8LSBSdW5QQ0EoYWxsZGF0YS5pbnQsIGZlYXR1cmVzID0gaHZnc19hbGwsIHJlZHVjdGlvbi5uYW1lID0gInBjYV9DQ0EiLCBkby5wcmludCA9IFRSVUUsIHBjcy5wcmludCA9IDE6NSwgZ2VuZXMucHJpbnQgPSAxNSwgdmVyYm9zZSA9IEZBTFNFKQphbGxkYXRhLmludCA8LSBSdW5VTUFQKGFsbGRhdGEuaW50LCByZWR1Y3Rpb24gPSAicGNhX0NDQSIsIHJlZHVjdGlvbi5uYW1lID0gInVtYXBfQ0NBIiwgZGltcyA9IDE6MTIsIHZlcmJvc2UgPSBGQUxTRSkKYWxsZGF0YS5pbnQgPC0gUnVuVFNORShhbGxkYXRhLmludCwgcmVkdWN0aW9uID0gInBjYV9DQ0EiLHJlZHVjdGlvbi5uYW1lID0gInRzbmVfQ0NBIixkaW1zID0gMToxMiwgdmVyYm9zZSA9IEZBTFNFKQphbGxkYXRhLmludCA8LSBGaW5kTmVpZ2hib3JzKGFsbGRhdGEuaW50LCByZWR1Y3Rpb24gPSAicGNhX0NDQSIsIGRpbXMgPSAxOjEyLCB2ZXJib3NlID0gRkFMU0UpCmFsbGRhdGEuaW50IDwtIEZpbmRDbHVzdGVycyhhbGxkYXRhLmludCwgcmVzb2x1dGlvbiA9IDEuMiwgdmVyYm9zZSA9IEZBTFNFKQoKCgp3cmFwX3Bsb3RzKAoKICAgIERpbVBsb3QoYWxsZGF0YS5pbnQsIHJlZHVjdGlvbiA9ICJwY2FfQ0NBIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpK05vQXhlcygpK2dndGl0bGUoIlBDQSBpbnRlZ3JhdGVkIiksCiAgICBEaW1QbG90KGFsbGRhdGEuaW50LCByZWR1Y3Rpb24gPSAidHNuZV9DQ0EiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikrTm9BeGVzKCkrZ2d0aXRsZSgidFNORSBpbnRlZ3JhdGVkIiksCiAgICBEaW1QbG90KGFsbGRhdGEuaW50LCByZWR1Y3Rpb24gPSAidW1hcF9DQ0EiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikrTm9BeGVzKCkrZ2d0aXRsZSgiVU1BUCBpbnRlZ3JhdGVkIiksCgogICAgRGltUGxvdChhbGxkYXRhLmludCwgcmVkdWN0aW9uID0gInBjYV9DQ0EiLCBncm91cC5ieSA9ICJDQ0Ffc25uX3Jlcy4xLjIiKStOb0F4ZXMoKStnZ3RpdGxlKCJQQ0EgaW50ZWdyYXRlZCIpLAogICAgRGltUGxvdChhbGxkYXRhLmludCwgcmVkdWN0aW9uID0gInRzbmVfQ0NBIiwgZ3JvdXAuYnkgPSAiQ0NBX3Nubl9yZXMuMS4yIikrTm9BeGVzKCkrZ2d0aXRsZSgidFNORSBpbnRlZ3JhdGVkIiksCiAgICBEaW1QbG90KGFsbGRhdGEuaW50LCByZWR1Y3Rpb24gPSAidW1hcF9DQ0EiLCBncm91cC5ieSA9ICJDQ0Ffc25uX3Jlcy4xLjIiKStOb0F4ZXMoKStnZ3RpdGxlKCJVTUFQIGludGVncmF0ZWQiKSwKICAgIG5jb2wgPSAzKSArIHBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikKYGBgCgoKCgoKIyBGZWF0dXJlUGxvdApgYGB7ciBmZWF0dXJlcGxvdCwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgoKbXlmZWF0dXJlcyA8LSBjKCJDRDNFIiwgIkNENCIsICJDRDhBIiwgIk5LRzciLCAiR05MWSIsICJNUzRBMSIsICJDRDE0IiwgIkxZWiIsICJNUzRBNyIsICJGQ0dSM0EiLCAiQ1NUMyIsICJGQ0VSMUEiKQpGZWF0dXJlUGxvdChhbGxkYXRhLmludCwgcmVkdWN0aW9uID0gInVtYXBfQ0NBIiwgZGltcyA9IDE6MiwgZmVhdHVyZXMgPSBteWZlYXR1cmVzLCBuY29sID0gNCwgb3JkZXIgPSBUKSArIE5vTGVnZW5kKCkgKyBOb0F4ZXMoKSArIE5vR3JpZCgpCgoKYGBgCgojIDUuIFNhdmUgdGhlIFNldXJhdCBvYmplY3QgYXMgYW4gUm9iaiBmaWxlCmBgYHtyIHNhdmVST0JKfQoKI3NhdmUoYWxsZGF0YS5pbnQsIGZpbGUgPSAiSW50ZWdyYXRpb24tYnktZGlmZmVyZW50LU1ldGhvZHMtMS5Sb2JqIikKCgpgYGAKCgoKCg==