1. load libraries

2. Load Seurat Object


#Load Seurat Object Integrated Object
load("/home/bioinfo/Cluster_to_Computer_Transfer_files_folder/All_Normal-PBMC_Abnormal-cellLines_T_cells_Merged_Annotated_UMAP_on_Clusters_to_USE.Robj")
 
  All_samples_Merged
An object of class Seurat 
62625 features across 46976 samples within 6 assays 
Active assay: SCT (25901 features, 3000 variable features)
 3 layers present: counts, data, scale.data
 5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
 4 dimensional reductions calculated: pca, umap, integrated_dr, ref.umap
DefaultAssay(All_samples_Merged) <- "SCT"

Idents(All_samples_Merged) <- "SCT_snn_res.0.9"

3. Data input & processing and initialization of CellChat object


#------------------------------------------------------------------------------
# **Part I: Data input & processing and initialization of CellChat object**
#------------------------------------------------------------------------------

# Loading and Preparing Data
All_samples_Merged <- AddMetaData(object = All_samples_Merged, 
                          metadata = paste0("Cluster_", All_samples_Merged$seurat_clusters), 
                          col.name = 'Clusters')

#All_samples_Merged[["RNA"]] <- JoinLayers(All_samples_Merged[["RNA"]])


# Extract the normalized data
#data_input <- GetAssayData(All_samples_Merged, assay = "RNA", slot = "data")


data.input <- All_samples_Merged@assays$SCT$data


#1.  Create CellChat object
cellchat <- createCellChat(object = data.input, meta = All_samples_Merged@meta.data, group.by = "Clusters")
[1] "Create a CellChat object from a data matrix"
Warning: The 'meta' data does not have a column named `samples`. We now add this column and all cells are assumed to belong to `sample1`! 
Set cell identities for the new CellChat object 
The cell groups used for CellChat analysis are  Cluster_0, Cluster_1, Cluster_10, Cluster_11, Cluster_12, Cluster_13, Cluster_14, Cluster_15, Cluster_16, Cluster_17, Cluster_18, Cluster_19, Cluster_2, Cluster_20, Cluster_21, Cluster_22, Cluster_23, Cluster_24, Cluster_3, Cluster_4, Cluster_5, Cluster_6, Cluster_7, Cluster_8, Cluster_9 
#2.  Set the ligand-receptor interaction database

cellchatDB <- CellChatDB.human # or CellChatDB.mouse
showDatabaseCategory(cellchatDB)


# Show the structure of the database
dplyr::glimpse(cellchatDB$interaction)
Rows: 3,233
Columns: 28
$ interaction_name         <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2", "TGFB3_TGFBR1_TGFBR2", "TGFB1_ACVR1B_TGFBR2", "TGFB…
$ pathway_name             <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "…
$ ligand                   <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ receptor                 <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1B_TGFbR2", "ACVR1C_TGFbR2", "ACVR1B_TGFbR2", "ACVR1C…
$ agonist                  <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "…
$ antagonist               <chr> "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "T…
$ co_A_receptor            <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ co_I_receptor            <chr> "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibit…
$ evidence                 <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hsa04350", "PMID: 27449815", "PMID: 27449815", "PMID: …
$ annotation               <chr> "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted…
$ interaction_name_2       <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+TGFBR2)", "TGFB3 - (TGFBR1+TGFBR2)", "TGFB1 - (ACVR1B…
$ is_neurotransmitter      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
$ ligand.symbol            <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ ligand.family            <chr> "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "…
$ ligand.location          <chr> "Extracellular matrix, Secreted, Extracellular space", "Extracellular matrix, Secreted, Extracell…
$ ligand.keyword           <chr> "Disease variant, Signal, Reference proteome, Extracellular matrix, Disulfide bond, Secreted, Mit…
$ ligand.secreted_type     <chr> "growth factor", "growth factor", "cytokine;growth factor", "growth factor", "growth factor", "gr…
$ ligand.transmembrane     <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FAL…
$ receptor.symbol          <chr> "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, ACVR1B", "TGFBR2, ACVR1C", "TGFBR2…
$ receptor.family          <chr> "Protein kinase superfamily, TKL Ser/Thr protein kinase", "Protein kinase superfamily, TKL Ser/Th…
$ receptor.location        <chr> "Cell membrane, Secreted, Membrane raft, Cell surface, Cell junction, Tight junction", "Cell memb…
$ receptor.keyword         <chr> "Membrane, Secreted, Disulfide bond, Kinase, Transmembrane, Differentiation, ATP-binding, Recepto…
$ receptor.surfaceome_main <chr> "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Recep…
$ receptor.surfaceome_sub  <chr> "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "A…
$ receptor.adhesome        <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.secreted_type   <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.transmembrane   <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, T…
$ version                  <chr> "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB …
# use a subset of CellChatDB for cell-cell communication analysis
cellchatDB.use <- subsetDB(cellchatDB, search = "Secreted Signaling", key = "annotation") # use Secreted Signaling

# set the used database in the object
cellchat@DB <- cellchatDB.use

#------------------------------------------------------------------------------
# **Preprocessing the expression data for cell-cell communication analysis**
#------------------------------------------------------------------------------
#3.  Preprocess the expression data
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 2 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 2 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 2 % ~00s          
  |++                                                | 3 % ~00s          
  |+++                                               | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 10% ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
The number of highly variable ligand-receptor pairs used for signaling inference is 549 

4. Inference of cell-cell communication network

#------------------------------------------------------------------------------
# **Part II: Inference of cell-cell communication network**
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------------
# **Compute the communication probability and infer cellular communication network**
#------------------------------------------------------------------------------------

#4.  Compute communication probability and infer cellular communication network
cellchat <- computeCommunProb(cellchat)
triMean is used for calculating the average gene expression per cell group. 
[1] ">>> Run CellChat on sc/snRNA-seq data <<< [2024-09-20 15:34:24.817166]"

  |                                                                                                                                
  |                                                                                                                          |   0%
  |                                                                                                                                
  |=                                                                                                                         |   1%
  |                                                                                                                                
  |==                                                                                                                        |   1%
  |                                                                                                                                
  |==                                                                                                                        |   2%
  |                                                                                                                                
  |===                                                                                                                       |   2%
  |                                                                                                                                
  |===                                                                                                                       |   3%
  |                                                                                                                                
  |====                                                                                                                      |   3%
  |                                                                                                                                
  |====                                                                                                                      |   4%
  |                                                                                                                                
  |=====                                                                                                                     |   4%
  |                                                                                                                                
  |======                                                                                                                    |   5%
  |                                                                                                                                
  |=======                                                                                                                   |   5%
  |                                                                                                                                
  |=======                                                                                                                   |   6%
  |                                                                                                                                
  |========                                                                                                                  |   6%
  |                                                                                                                                
  |========                                                                                                                  |   7%
  |                                                                                                                                
  |=========                                                                                                                 |   7%
  |                                                                                                                                
  |=========                                                                                                                 |   8%
  |                                                                                                                                
  |==========                                                                                                                |   8%
  |                                                                                                                                
  |==========                                                                                                                |   9%
  |                                                                                                                                
  |===========                                                                                                               |   9%
  |                                                                                                                                
  |============                                                                                                              |   9%
  |                                                                                                                                
  |============                                                                                                              |  10%
  |                                                                                                                                
  |=============                                                                                                             |  10%
  |                                                                                                                                
  |=============                                                                                                             |  11%
  |                                                                                                                                
  |==============                                                                                                            |  11%
  |                                                                                                                                
  |==============                                                                                                            |  12%
  |                                                                                                                                
  |===============                                                                                                           |  12%
  |                                                                                                                                
  |===============                                                                                                           |  13%
  |                                                                                                                                
  |================                                                                                                          |  13%
  |                                                                                                                                
  |=================                                                                                                         |  14%
  |                                                                                                                                
  |==================                                                                                                        |  14%
  |                                                                                                                                
  |==================                                                                                                        |  15%
  |                                                                                                                                
  |===================                                                                                                       |  15%
  |                                                                                                                                
  |===================                                                                                                       |  16%
  |                                                                                                                                
  |====================                                                                                                      |  16%
  |                                                                                                                                
  |====================                                                                                                      |  17%
  |                                                                                                                                
  |=====================                                                                                                     |  17%
  |                                                                                                                                
  |======================                                                                                                    |  18%
  |                                                                                                                                
  |=======================                                                                                                   |  19%
  |                                                                                                                                
  |========================                                                                                                  |  19%
  |                                                                                                                                
  |========================                                                                                                  |  20%
  |                                                                                                                                
  |=========================                                                                                                 |  20%
  |                                                                                                                                
  |=========================                                                                                                 |  21%
  |                                                                                                                                
  |==========================                                                                                                |  21%
  |                                                                                                                                
  |==========================                                                                                                |  22%
  |                                                                                                                                
  |===========================                                                                                               |  22%
  |                                                                                                                                
  |============================                                                                                              |  23%
  |                                                                                                                                
  |=============================                                                                                             |  23%
  |                                                                                                                                
  |=============================                                                                                             |  24%
  |                                                                                                                                
  |==============================                                                                                            |  24%
  |                                                                                                                                
  |==============================                                                                                            |  25%
  |                                                                                                                                
  |===============================                                                                                           |  25%
  |                                                                                                                                
  |===============================                                                                                           |  26%
  |                                                                                                                                
  |================================                                                                                          |  26%
  |                                                                                                                                
  |================================                                                                                          |  27%
  |                                                                                                                                
  |=================================                                                                                         |  27%
  |                                                                                                                                
  |==================================                                                                                        |  28%
  |                                                                                                                                
  |===================================                                                                                       |  28%
  |                                                                                                                                
  |===================================                                                                                       |  29%
  |                                                                                                                                
  |====================================                                                                                      |  29%
  |                                                                                                                                
  |====================================                                                                                      |  30%
  |                                                                                                                                
  |=====================================                                                                                     |  30%
  |                                                                                                                                
  |=====================================                                                                                     |  31%
  |                                                                                                                                
  |======================================                                                                                    |  31%
  |                                                                                                                                
  |======================================                                                                                    |  32%
  |                                                                                                                                
  |=======================================                                                                                   |  32%
  |                                                                                                                                
  |========================================                                                                                  |  32%
  |                                                                                                                                
  |========================================                                                                                  |  33%
  |                                                                                                                                
  |=========================================                                                                                 |  33%
  |                                                                                                                                
  |=========================================                                                                                 |  34%
  |                                                                                                                                
  |==========================================                                                                                |  34%
  |                                                                                                                                
  |==========================================                                                                                |  35%
  |                                                                                                                                
  |===========================================                                                                               |  35%
  |                                                                                                                                
  |===========================================                                                                               |  36%
  |                                                                                                                                
  |============================================                                                                              |  36%
  |                                                                                                                                
  |=============================================                                                                             |  37%
  |                                                                                                                                
  |==============================================                                                                            |  37%
  |                                                                                                                                
  |==============================================                                                                            |  38%
  |                                                                                                                                
  |===============================================                                                                           |  38%
  |                                                                                                                                
  |===============================================                                                                           |  39%
  |                                                                                                                                
  |================================================                                                                          |  39%
  |                                                                                                                                
  |================================================                                                                          |  40%
  |                                                                                                                                
  |=================================================                                                                         |  40%
  |                                                                                                                                
  |==================================================                                                                        |  41%
  |                                                                                                                                
  |===================================================                                                                       |  42%
  |                                                                                                                                
  |====================================================                                                                      |  42%
  |                                                                                                                                
  |====================================================                                                                      |  43%
  |                                                                                                                                
  |=====================================================                                                                     |  43%
  |                                                                                                                                
  |=====================================================                                                                     |  44%
  |                                                                                                                                
  |======================================================                                                                    |  44%
  |                                                                                                                                
  |======================================================                                                                    |  45%
  |                                                                                                                                
  |=======================================================                                                                   |  45%
  |                                                                                                                                
  |========================================================                                                                  |  46%
  |                                                                                                                                
  |=========================================================                                                                 |  46%
  |                                                                                                                                
  |=========================================================                                                                 |  47%
  |                                                                                                                                
  |==========================================================                                                                |  47%
  |                                                                                                                                
  |==========================================================                                                                |  48%
  |                                                                                                                                
  |===========================================================                                                               |  48%
  |                                                                                                                                
  |===========================================================                                                               |  49%
  |                                                                                                                                
  |============================================================                                                              |  49%
  |                                                                                                                                
  |============================================================                                                              |  50%
  |                                                                                                                                
  |=============================================================                                                             |  50%
  |                                                                                                                                
  |==============================================================                                                            |  50%
  |                                                                                                                                
  |==============================================================                                                            |  51%
  |                                                                                                                                
  |===============================================================                                                           |  51%
  |                                                                                                                                
  |===============================================================                                                           |  52%
  |                                                                                                                                
  |================================================================                                                          |  52%
  |                                                                                                                                
  |================================================================                                                          |  53%
  |                                                                                                                                
  |=================================================================                                                         |  53%
  |                                                                                                                                
  |=================================================================                                                         |  54%
  |                                                                                                                                
  |==================================================================                                                        |  54%
  |                                                                                                                                
  |===================================================================                                                       |  55%
  |                                                                                                                                
  |====================================================================                                                      |  55%
  |                                                                                                                                
  |====================================================================                                                      |  56%
  |                                                                                                                                
  |=====================================================================                                                     |  56%
  |                                                                                                                                
  |=====================================================================                                                     |  57%
  |                                                                                                                                
  |======================================================================                                                    |  57%
  |                                                                                                                                
  |======================================================================                                                    |  58%
  |                                                                                                                                
  |=======================================================================                                                   |  58%
  |                                                                                                                                
  |========================================================================                                                  |  59%
  |                                                                                                                                
  |=========================================================================                                                 |  60%
  |                                                                                                                                
  |==========================================================================                                                |  60%
  |                                                                                                                                
  |==========================================================================                                                |  61%
  |                                                                                                                                
  |===========================================================================                                               |  61%
  |                                                                                                                                
  |===========================================================================                                               |  62%
  |                                                                                                                                
  |============================================================================                                              |  62%
  |                                                                                                                                
  |============================================================================                                              |  63%
  |                                                                                                                                
  |=============================================================================                                             |  63%
  |                                                                                                                                
  |==============================================================================                                            |  64%
  |                                                                                                                                
  |===============================================================================                                           |  64%
  |                                                                                                                                
  |===============================================================================                                           |  65%
  |                                                                                                                                
  |================================================================================                                          |  65%
  |                                                                                                                                
  |================================================================================                                          |  66%
  |                                                                                                                                
  |=================================================================================                                         |  66%
  |                                                                                                                                
  |=================================================================================                                         |  67%
  |                                                                                                                                
  |==================================================================================                                        |  67%
  |                                                                                                                                
  |==================================================================================                                        |  68%
  |                                                                                                                                
  |===================================================================================                                       |  68%
  |                                                                                                                                
  |====================================================================================                                      |  68%
  |                                                                                                                                
  |====================================================================================                                      |  69%
  |                                                                                                                                
  |=====================================================================================                                     |  69%
  |                                                                                                                                
  |=====================================================================================                                     |  70%
  |                                                                                                                                
  |======================================================================================                                    |  70%
  |                                                                                                                                
  |======================================================================================                                    |  71%
  |                                                                                                                                
  |=======================================================================================                                   |  71%
  |                                                                                                                                
  |=======================================================================================                                   |  72%
  |                                                                                                                                
  |========================================================================================                                  |  72%
  |                                                                                                                                
  |=========================================================================================                                 |  73%
  |                                                                                                                                
  |==========================================================================================                                |  73%
  |                                                                                                                                
  |==========================================================================================                                |  74%
  |                                                                                                                                
  |===========================================================================================                               |  74%
  |                                                                                                                                
  |===========================================================================================                               |  75%
  |                                                                                                                                
  |============================================================================================                              |  75%
  |                                                                                                                                
  |============================================================================================                              |  76%
  |                                                                                                                                
  |=============================================================================================                             |  76%
  |                                                                                                                                
  |=============================================================================================                             |  77%
  |                                                                                                                                
  |==============================================================================================                            |  77%
  |                                                                                                                                
  |===============================================================================================                           |  78%
  |                                                                                                                                
  |================================================================================================                          |  78%
  |                                                                                                                                
  |================================================================================================                          |  79%
  |                                                                                                                                
  |=================================================================================================                         |  79%
  |                                                                                                                                
  |=================================================================================================                         |  80%
  |                                                                                                                                
  |==================================================================================================                        |  80%
  |                                                                                                                                
  |==================================================================================================                        |  81%
  |                                                                                                                                
  |===================================================================================================                       |  81%
  |                                                                                                                                
  |====================================================================================================                      |  82%
  |                                                                                                                                
  |=====================================================================================================                     |  83%
  |                                                                                                                                
  |======================================================================================================                    |  83%
  |                                                                                                                                
  |======================================================================================================                    |  84%
  |                                                                                                                                
  |=======================================================================================================                   |  84%
  |                                                                                                                                
  |=======================================================================================================                   |  85%
  |                                                                                                                                
  |========================================================================================================                  |  85%
  |                                                                                                                                
  |========================================================================================================                  |  86%
  |                                                                                                                                
  |=========================================================================================================                 |  86%
  |                                                                                                                                
  |==========================================================================================================                |  87%
  |                                                                                                                                
  |===========================================================================================================               |  87%
  |                                                                                                                                
  |===========================================================================================================               |  88%
  |                                                                                                                                
  |============================================================================================================              |  88%
  |                                                                                                                                
  |============================================================================================================              |  89%
  |                                                                                                                                
  |=============================================================================================================             |  89%
  |                                                                                                                                
  |=============================================================================================================             |  90%
  |                                                                                                                                
  |==============================================================================================================            |  90%
  |                                                                                                                                
  |==============================================================================================================            |  91%
  |                                                                                                                                
  |===============================================================================================================           |  91%
  |                                                                                                                                
  |================================================================================================================          |  91%
  |                                                                                                                                
  |================================================================================================================          |  92%
  |                                                                                                                                
  |=================================================================================================================         |  92%
  |                                                                                                                                
  |=================================================================================================================         |  93%
  |                                                                                                                                
  |==================================================================================================================        |  93%
  |                                                                                                                                
  |==================================================================================================================        |  94%
  |                                                                                                                                
  |===================================================================================================================       |  94%
  |                                                                                                                                
  |===================================================================================================================       |  95%
  |                                                                                                                                
  |====================================================================================================================      |  95%
  |                                                                                                                                
  |=====================================================================================================================     |  96%
  |                                                                                                                                
  |======================================================================================================================    |  96%
  |                                                                                                                                
  |======================================================================================================================    |  97%
  |                                                                                                                                
  |=======================================================================================================================   |  97%
  |                                                                                                                                
  |=======================================================================================================================   |  98%
  |                                                                                                                                
  |========================================================================================================================  |  98%
  |                                                                                                                                
  |========================================================================================================================  |  99%
  |                                                                                                                                
  |========================================================================================================================= |  99%
  |                                                                                                                                
  |==========================================================================================================================| 100%
[1] ">>> CellChat inference is done. Parameter values are stored in `object@options$parameter` <<< [2024-09-20 15:39:47.003683]"
cellchat <- filterCommunication(cellchat, min.cells = 10)

#------------------------------------------------------------------------------
# **Infer the cell-cell communication at a signaling pathway level**
#------------------------------------------------------------------------------
#5.  Compute communication at the pathway level
cellchat <- computeCommunProbPathway(cellchat)

#------------------------------------------------------------------------------
# **Calculate the aggregated cell-cell communication network**
#------------------------------------------------------------------------------
#6.  Aggregate the inferred cell-cell communication network
cellchat <- aggregateNet(cellchat)


#7.  Visualize the communication network
groupSize <- as.numeric(table(cellchat@idents))

netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Number of interactions")

netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")


mat <- cellchat@net$weight
par(mfrow = c(3,4), xpd=TRUE)

for (i in 1:nrow(mat)) {
  mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
  mat2[i, ] <- mat[i, ]
  netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, edge.weight.max = max(mat), title.name = rownames(mat)[i])
}

NA

5. Visualization of cell-cell communication network

#------------------------------------------------------------------------------
# **Part III: Visualization of cell-cell communication network**
#------------------------------------------------------------------------------
 
#----------------------------------------------------------------------------------------------------
# **Visualize each signaling pathway using Hierarchy plot, Circle plot or Chord diagram**
#----------------------------------------------------------------------------------------------------
  
pathways.show <- c("CXCL") 
# Hierarchy plot
# Here we define `vertex.receive` so that the left portion of the hierarchy plot shows signaling to fibroblast and the right portion shows signaling to immune cells 
vertex.receiver = seq(1,4) # a numeric vector. 
netVisual_aggregate(cellchat, signaling = pathways.show,  vertex.receiver = vertex.receiver)

# Circle plot
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")



# Chord diagram
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "chord")


# Heatmap
par(mfrow=c(1,1))

netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
Do heatmap based on a single object 

#> Do heatmap based on a single object



# Get the levels of cell types
cell_types <- levels(cellchat@idents)

# Chord diagram
group.cellType <- c(rep("CXCL", 6), rep("CCL", 6), rep("IL2", 6), rep("TNF", 7))

group.cellType <- rep(NA, length(cell_types))

# Assign each cell type to a group
# You'll need to adjust this based on your actual data and biological knowledge
group.cellType[1:6] <- "CXCL"
group.cellType[7:12] <- "CCL"
group.cellType[13:18] <- "IL2"
group.cellType[19:25] <- "TNF"

# Name the vector with the cell types
names(group.cellType) <- cell_types

# Check the result
print(group.cellType)
 Cluster_0  Cluster_1 Cluster_10 Cluster_11 Cluster_12 Cluster_13 Cluster_14 Cluster_15 Cluster_16 Cluster_17 Cluster_18 Cluster_19 
    "CXCL"     "CXCL"     "CXCL"     "CXCL"     "CXCL"     "CXCL"      "CCL"      "CCL"      "CCL"      "CCL"      "CCL"      "CCL" 
 Cluster_2 Cluster_20 Cluster_21 Cluster_22 Cluster_23 Cluster_24  Cluster_3  Cluster_4  Cluster_5  Cluster_6  Cluster_7  Cluster_8 
     "IL2"      "IL2"      "IL2"      "IL2"      "IL2"      "IL2"      "TNF"      "TNF"      "TNF"      "TNF"      "TNF"      "TNF" 
 Cluster_9 
     "TNF" 
netVisual_chord_cell(cellchat, signaling = pathways.show, group = group.cellType, title.name = paste0(pathways.show, " signaling network"))
Plot the aggregated cell-cell communication network at the signaling pathway level

#> Plot the aggregated cell-cell communication network at the signaling pathway level


  
# Compute the contribution of each ligand-receptor pair to the overall signaling pathway and visualize cell-cell 
#communication mediated by a single ligand-receptor pair

netAnalysis_contribution(cellchat, signaling = pathways.show)


pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show, geneLR.return = FALSE)
LR.show <- pairLR.CXCL[1,] # show one ligand-receptor pair
# Hierarchy plot
vertex.receiver = seq(1,4) # a numeric vector
netVisual_individual(cellchat, signaling = pathways.show,  pairLR.use = LR.show, vertex.receiver = vertex.receiver)
[[1]]

#> [[1]]
# Circle plot
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
[[1]]

#> [[1]]
# Chord diagram
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "chord")
[[1]]

# Access all the signaling pathways showing significant communications
pathways.show.all <- cellchat@netP$pathways
# check the order of cell identity to set suitable vertex.receiver
levels(cellchat@idents)
 [1] "Cluster_0"  "Cluster_1"  "Cluster_10" "Cluster_11" "Cluster_12" "Cluster_13" "Cluster_14" "Cluster_15" "Cluster_16"
[10] "Cluster_17" "Cluster_18" "Cluster_19" "Cluster_2"  "Cluster_20" "Cluster_21" "Cluster_22" "Cluster_23" "Cluster_24"
[19] "Cluster_3"  "Cluster_4"  "Cluster_5"  "Cluster_6"  "Cluster_7"  "Cluster_8"  "Cluster_9" 
vertex.receiver = seq(1,4)
for (i in 1:length(pathways.show.all)) {
  # Visualize communication network associated with both signaling pathway and individual L-R pairs
  netVisual(cellchat, signaling = pathways.show.all[i], vertex.receiver = vertex.receiver, layout = "hierarchy")
  # Compute and visualize the contribution of each ligand-receptor pair to the overall signaling pathway
  gg <- netAnalysis_contribution(cellchat, signaling = pathways.show.all[i])
  ggsave(filename=paste0(pathways.show.all[i], "_L-R_contribution.pdf"), plot=gg, width = 3, height = 2, units = 'in', dpi = 300)
}

#----------------------------------------------------------------------------------------------------
# **Visualize cell-cell communication mediated by multiple ligand-receptors or signaling pathways**
#----------------------------------------------------------------------------------------------------
#(A) Bubble plot

# (1) show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), remove.isolate = FALSE)
Comparing communications on a single object 

#> Comparing communications on a single object



# (2) show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), signaling = c("CCL","CXCL"), remove.isolate = FALSE)
Comparing communications on a single object 

#> Comparing communications on a single object


# (3) show all the significant interactions (L-R pairs) based on user's input (defined by `pairLR.use`)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF"))
There is no significant communication of FGF
netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), pairLR.use = pairLR.use, remove.isolate = TRUE)
Comparing communications on a single object 

#> Comparing communications on a single object


# (B) Chord diagram

# show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
# show all the interactions sending from Inflam.FIB
netVisual_chord_gene(cellchat, sources.use = 4, targets.use = c(5:11), lab.cex = 0.5,legend.pos.y = 30)



# show all the interactions received by Inflam.DC
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = 8, legend.pos.x = 15)


# show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), signaling = c("CCL","CXCL"),legend.pos.x = 8)


# show all the significant signaling pathways from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), slot.name = "netP", legend.pos.x = 10)



#----------------------------------------------------------------------------------------------------
# **Plot the signaling gene expression distribution using violin/dot plot**
#----------------------------------------------------------------------------------------------------

plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = TRUE, type = "violin")
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = FALSE)
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

6. Systems analysis of cell-cell communication network

#----------------------------------------------------------------------------------------------------
# **Part IV: Systems analysis of cell-cell communication network**
#----------------------------------------------------------------------------------------------------
# (A) Compute and visualize the network centrality scores

ptm = Sys.time()
# Compute the network centrality scores
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP") # the slot 'netP' means the inferred intercellular communication network of signaling pathways

  |                                                  | 0 % ~calculating  
  |++                                                | 4 % ~07s          
  |++++                                              | 7 % ~05s          
  |++++++                                            | 11% ~05s          
  |++++++++                                          | 14% ~04s          
  |+++++++++                                         | 18% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
# Visualize the computed centrality scores using heatmap, allowing ready identification of major signaling roles of cell groups
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)



#(B) Visualize dominant senders (sources) and receivers (targets) in a 2D space

# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
gg1 <- netAnalysis_signalingRole_scatter(cellchat)
Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
# Signaling role analysis on the cell-cell communication networks of interest
gg2 <- netAnalysis_signalingRole_scatter(cellchat, signaling = c("CXCL", "CCL"))
Signaling role analysis on the cell-cell communication network from user's input
#> Signaling role analysis on the cell-cell communication network from user's input
gg1 + gg2



# (C) Identify signals contributing the most to outgoing or incoming signaling of certain cell groups
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
ht1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
ht2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
ht1 + ht2
Warning: Heatmap/annotation names are duplicated: Relative strength

# Signaling role analysis on the cell-cell communication networks of interest
ht <- netAnalysis_signalingRole_heatmap(cellchat, signaling = c("CXCL", "CCL"))


#---------------------------------------------------------------------------------------------------------------------------
# **Identify global communication patterns to explore how multiple cell types and signaling pathways coordinate together**
#----------------------------------------------------------------------------------------------------------------------------

# (A) Identify and visualize outgoing communication pattern of secreting cells

library(NMF)
Loading required package: registry
Loading required package: rngtools
Loading required package: cluster
NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
  To enable shared memory capabilities, try: install.extras('
NMF
')

Attaching package: ‘NMF’

The following objects are masked from ‘package:igraph’:

    algorithm, compare
#> Loading required package: registry
#> Loading required package: rngtools
#> Loading required package: cluster
#> NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
#>   To enable shared memory capabilities, try: install.extras('
#> NMF
#> ')
#> 
#> Attaching package: 'NMF'
#> The following objects are masked from 'package:igraph':
#> 
#>     algorithm, compare
library(ggalluvial)


setwd("../SS_CellLines_Pipeline/")
selectK(cellchat, pattern = "outgoing")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
nPatterns = 6

cellchat <- identifyCommunicationPatterns(cellchat, pattern = "outgoing", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "outgoing")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function


# dot plot
netAnalysis_dot(cellchat, pattern = "outgoing")


setwd(".")

# (B) Identify and visualize incoming communication pattern of target cells

selectK(cellchat, pattern = "incoming")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
 nPatterns = 3
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
  Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "incoming")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function


# dot plot
netAnalysis_dot(cellchat, pattern = "incoming")





#---------------------------------------------------------------------------------------------------------------------------
# **Manifold and classification learning analysis of signaling networks**
#----------------------------------------------------------------------------------------------------------------------------

# Identify signaling groups based on their functional similarity
#8.  Identify signaling roles and patterns
cellchat <- computeNetSimilarity(cellchat, type = "functional")
library(uwot)
Loading required package: Matrix
cellchat <- netEmbedding(cellchat, type = "functional", umap.method = "uwot")
Manifold learning of the signaling networks for a single dataset 
options(future.globals.maxSize = 16000 * 1024^2)  # Set to 16 GB
cellchat <- netClustering(cellchat, type = "functional", do.parallel = FALSE)
Classification learning of the signaling networks for a single dataset 

  |                                                  | 0 % ~calculating  
  |++++++                                            | 11% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
netVisual_embedding(cellchat, type = "functional", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

# Identify signaling groups based on structure similarity
#install umap-learn before running these commands
 #pip install umap-learn
cellchat <- computeNetSimilarity(cellchat, type = "structural")
cellchat <- netEmbedding(cellchat, type = "structural", umap.method = "uwot")
Manifold learning of the signaling networks for a single dataset 
#> Manifold learning of the signaling networks for a single dataset
options(future.globals.maxSize = 16000 * 1024^2)  # Set to 16 GB
cellchat <- netClustering(cellchat, type = "structural", do.parallel = FALSE)
Classification learning of the signaling networks for a single dataset 

  |                                                  | 0 % ~calculating  
  |++++++                                            | 11% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
#> Classification learning of the signaling networks for a single dataset
# Visualization in 2D-space
netVisual_embedding(cellchat, type = "structural", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

netVisual_embeddingZoomIn(cellchat, type = "structural", nCol = 2)

7. Save the CellChat object

save(cellchat, file = "cellCHAT_Analysis_All_samples_Merged.Robj")
LS0tCnRpdGxlOiAiSW5mZXJlbmNlIGFuZCBhbmFseXNpcyBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiB1c2luZyBDZWxsQ2hhdC1TU19jZWxsTGluZXMiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KENlbGxDaGF0KQpsaWJyYXJ5KHBhdGNod29yaykKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMgcmV0aWN1bGF0ZTo6dXNlX3B5dGhvbigiL1VzZXJzL3N1b3Fpbmppbi9hbmFjb25kYTMvYmluL3B5dGhvbiIsIHJlcXVpcmVkPVQpIAoKYGBgCgojIDIuIExvYWQgU2V1cmF0IE9iamVjdApgYGB7ciBsb2FkX3NldXJhdE9CSn0KCiNMb2FkIFNldXJhdCBPYmplY3QgSW50ZWdyYXRlZCBPYmplY3QKbG9hZCgiL2hvbWUvYmlvaW5mby9DbHVzdGVyX3RvX0NvbXB1dGVyX1RyYW5zZmVyX2ZpbGVzX2ZvbGRlci9BbGxfTm9ybWFsLVBCTUNfQWJub3JtYWwtY2VsbExpbmVzX1RfY2VsbHNfTWVyZ2VkX0Fubm90YXRlZF9VTUFQX29uX0NsdXN0ZXJzX3RvX1VTRS5Sb2JqIikKIAogIEFsbF9zYW1wbGVzX01lcmdlZAoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlNDVCIKCklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJTQ1Rfc25uX3Jlcy4wLjkiCgpgYGAKCgojIDMuIERhdGEgaW5wdXQgJiBwcm9jZXNzaW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBDZWxsQ2hhdCBvYmplY3QKYGBge3IgREFUQUlOUFVULCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlBhcnQgSTogRGF0YSBpbnB1dCAmIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIG9mIENlbGxDaGF0IG9iamVjdCoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTG9hZGluZyBhbmQgUHJlcGFyaW5nIERhdGEKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBwYXN0ZTAoIkNsdXN0ZXJfIiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHNldXJhdF9jbHVzdGVycyksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5uYW1lID0gJ0NsdXN0ZXJzJykKCiNBbGxfc2FtcGxlc19NZXJnZWRbWyJSTkEiXV0gPC0gSm9pbkxheWVycyhBbGxfc2FtcGxlc19NZXJnZWRbWyJSTkEiXV0pCgoKIyBFeHRyYWN0IHRoZSBub3JtYWxpemVkIGRhdGEKI2RhdGFfaW5wdXQgPC0gR2V0QXNzYXlEYXRhKEFsbF9zYW1wbGVzX01lcmdlZCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikKCgpkYXRhLmlucHV0IDwtIEFsbF9zYW1wbGVzX01lcmdlZEBhc3NheXMkU0NUJGRhdGEKCgojMS4gIENyZWF0ZSBDZWxsQ2hhdCBvYmplY3QKY2VsbGNoYXQgPC0gY3JlYXRlQ2VsbENoYXQob2JqZWN0ID0gZGF0YS5pbnB1dCwgbWV0YSA9IEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEsIGdyb3VwLmJ5ID0gIkNsdXN0ZXJzIikKCgoKCiMyLiAgU2V0IHRoZSBsaWdhbmQtcmVjZXB0b3IgaW50ZXJhY3Rpb24gZGF0YWJhc2UKCmNlbGxjaGF0REIgPC0gQ2VsbENoYXREQi5odW1hbiAjIG9yIENlbGxDaGF0REIubW91c2UKc2hvd0RhdGFiYXNlQ2F0ZWdvcnkoY2VsbGNoYXREQikKCiMgU2hvdyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhYmFzZQpkcGx5cjo6Z2xpbXBzZShjZWxsY2hhdERCJGludGVyYWN0aW9uKQoKIyB1c2UgYSBzdWJzZXQgb2YgQ2VsbENoYXREQiBmb3IgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gYW5hbHlzaXMKY2VsbGNoYXREQi51c2UgPC0gc3Vic2V0REIoY2VsbGNoYXREQiwgc2VhcmNoID0gIlNlY3JldGVkIFNpZ25hbGluZyIsIGtleSA9ICJhbm5vdGF0aW9uIikgIyB1c2UgU2VjcmV0ZWQgU2lnbmFsaW5nCgojIHNldCB0aGUgdXNlZCBkYXRhYmFzZSBpbiB0aGUgb2JqZWN0CmNlbGxjaGF0QERCIDwtIGNlbGxjaGF0REIudXNlCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQcmVwcm9jZXNzaW5nIHRoZSBleHByZXNzaW9uIGRhdGEgZm9yIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIGFuYWx5c2lzKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojMy4gIFByZXByb2Nlc3MgdGhlIGV4cHJlc3Npb24gZGF0YQpjZWxsY2hhdCA8LSBzdWJzZXREYXRhKGNlbGxjaGF0KQpjZWxsY2hhdCA8LSBpZGVudGlmeU92ZXJFeHByZXNzZWRHZW5lcyhjZWxsY2hhdCkKY2VsbGNoYXQgPC0gaWRlbnRpZnlPdmVyRXhwcmVzc2VkSW50ZXJhY3Rpb25zKGNlbGxjaGF0KQoKCgpgYGAKCiMgNC4gSW5mZXJlbmNlIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKYGBge3IgSU5GRVJFTkNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJSTogSW5mZXJlbmNlIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipDb21wdXRlIHRoZSBjb21tdW5pY2F0aW9uIHByb2JhYmlsaXR5IGFuZCBpbmZlciBjZWxsdWxhciBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojNC4gIENvbXB1dGUgY29tbXVuaWNhdGlvbiBwcm9iYWJpbGl0eSBhbmQgaW5mZXIgY2VsbHVsYXIgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmNlbGxjaGF0IDwtIGNvbXB1dGVDb21tdW5Qcm9iKGNlbGxjaGF0KQpjZWxsY2hhdCA8LSBmaWx0ZXJDb21tdW5pY2F0aW9uKGNlbGxjaGF0LCBtaW4uY2VsbHMgPSAxMCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKkluZmVyIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBhdCBhIHNpZ25hbGluZyBwYXRod2F5IGxldmVsKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojNS4gIENvbXB1dGUgY29tbXVuaWNhdGlvbiBhdCB0aGUgcGF0aHdheSBsZXZlbApjZWxsY2hhdCA8LSBjb21wdXRlQ29tbXVuUHJvYlBhdGh3YXkoY2VsbGNoYXQpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipDYWxjdWxhdGUgdGhlIGFnZ3JlZ2F0ZWQgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIzYuICBBZ2dyZWdhdGUgdGhlIGluZmVycmVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKY2VsbGNoYXQgPC0gYWdncmVnYXRlTmV0KGNlbGxjaGF0KQoKCiM3LiAgVmlzdWFsaXplIHRoZSBjb21tdW5pY2F0aW9uIG5ldHdvcmsKZ3JvdXBTaXplIDwtIGFzLm51bWVyaWModGFibGUoY2VsbGNoYXRAaWRlbnRzKSkKCm5ldFZpc3VhbF9jaXJjbGUoY2VsbGNoYXRAbmV0JGNvdW50LCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBsYWJlbC5lZGdlPSBGLCB0aXRsZS5uYW1lID0gIk51bWJlciBvZiBpbnRlcmFjdGlvbnMiKQpuZXRWaXN1YWxfY2lyY2xlKGNlbGxjaGF0QG5ldCR3ZWlnaHQsIHZlcnRleC53ZWlnaHQgPSBncm91cFNpemUsIHdlaWdodC5zY2FsZSA9IFQsIGxhYmVsLmVkZ2U9IEYsIHRpdGxlLm5hbWUgPSAiSW50ZXJhY3Rpb24gd2VpZ2h0cy9zdHJlbmd0aCIpCgptYXQgPC0gY2VsbGNoYXRAbmV0JHdlaWdodApwYXIobWZyb3cgPSBjKDMsNCksIHhwZD1UUlVFKQpmb3IgKGkgaW4gMTpucm93KG1hdCkpIHsKICBtYXQyIDwtIG1hdHJpeCgwLCBucm93ID0gbnJvdyhtYXQpLCBuY29sID0gbmNvbChtYXQpLCBkaW1uYW1lcyA9IGRpbW5hbWVzKG1hdCkpCiAgbWF0MltpLCBdIDwtIG1hdFtpLCBdCiAgbmV0VmlzdWFsX2NpcmNsZShtYXQyLCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBlZGdlLndlaWdodC5tYXggPSBtYXgobWF0KSwgdGl0bGUubmFtZSA9IHJvd25hbWVzKG1hdClbaV0pCn0KCmBgYAojIDUuIFZpc3VhbGl6YXRpb24gb2YgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yawpgYGB7ciBWSVNVQUxJWkFUSU9OLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJSUk6IFZpc3VhbGl6YXRpb24gb2YgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqVmlzdWFsaXplIGVhY2ggc2lnbmFsaW5nIHBhdGh3YXkgdXNpbmcgSGllcmFyY2h5IHBsb3QsIENpcmNsZSBwbG90IG9yIENob3JkIGRpYWdyYW0qKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIApwYXRod2F5cy5zaG93IDwtIGMoIkNYQ0wiKSAKIyBIaWVyYXJjaHkgcGxvdAojIEhlcmUgd2UgZGVmaW5lIGB2ZXJ0ZXgucmVjZWl2ZWAgc28gdGhhdCB0aGUgbGVmdCBwb3J0aW9uIG9mIHRoZSBoaWVyYXJjaHkgcGxvdCBzaG93cyBzaWduYWxpbmcgdG8gZmlicm9ibGFzdCBhbmQgdGhlIHJpZ2h0IHBvcnRpb24gc2hvd3Mgc2lnbmFsaW5nIHRvIGltbXVuZSBjZWxscyAKdmVydGV4LnJlY2VpdmVyID0gc2VxKDEsNCkgIyBhIG51bWVyaWMgdmVjdG9yLiAKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgIHZlcnRleC5yZWNlaXZlciA9IHZlcnRleC5yZWNlaXZlcikKIyBDaXJjbGUgcGxvdApwYXIobWZyb3c9YygxLDEpKQpuZXRWaXN1YWxfYWdncmVnYXRlKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBsYXlvdXQgPSAiY2lyY2xlIikKCgojIENob3JkIGRpYWdyYW0KcGFyKG1mcm93PWMoMSwxKSkKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgbGF5b3V0ID0gImNob3JkIikKCiMgSGVhdG1hcApwYXIobWZyb3c9YygxLDEpKQpuZXRWaXN1YWxfaGVhdG1hcChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgY29sb3IuaGVhdG1hcCA9ICJSZWRzIikKIz4gRG8gaGVhdG1hcCBiYXNlZCBvbiBhIHNpbmdsZSBvYmplY3QKCgoKIyBHZXQgdGhlIGxldmVscyBvZiBjZWxsIHR5cGVzCmNlbGxfdHlwZXMgPC0gbGV2ZWxzKGNlbGxjaGF0QGlkZW50cykKCiMgQ2hvcmQgZGlhZ3JhbQpncm91cC5jZWxsVHlwZSA8LSBjKHJlcCgiQ1hDTCIsIDYpLCByZXAoIkNDTCIsIDYpLCByZXAoIklMMiIsIDYpLCByZXAoIlRORiIsIDcpKQoKZ3JvdXAuY2VsbFR5cGUgPC0gcmVwKE5BLCBsZW5ndGgoY2VsbF90eXBlcykpCgojIEFzc2lnbiBlYWNoIGNlbGwgdHlwZSB0byBhIGdyb3VwCiMgWW91J2xsIG5lZWQgdG8gYWRqdXN0IHRoaXMgYmFzZWQgb24geW91ciBhY3R1YWwgZGF0YSBhbmQgYmlvbG9naWNhbCBrbm93bGVkZ2UKZ3JvdXAuY2VsbFR5cGVbMTo2XSA8LSAiQ1hDTCIKZ3JvdXAuY2VsbFR5cGVbNzoxMl0gPC0gIkNDTCIKZ3JvdXAuY2VsbFR5cGVbMTM6MThdIDwtICJJTDIiCmdyb3VwLmNlbGxUeXBlWzE5OjI1XSA8LSAiVE5GIgoKIyBOYW1lIHRoZSB2ZWN0b3Igd2l0aCB0aGUgY2VsbCB0eXBlcwpuYW1lcyhncm91cC5jZWxsVHlwZSkgPC0gY2VsbF90eXBlcwoKIyBDaGVjayB0aGUgcmVzdWx0CnByaW50KGdyb3VwLmNlbGxUeXBlKQoKbmV0VmlzdWFsX2Nob3JkX2NlbGwoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGdyb3VwID0gZ3JvdXAuY2VsbFR5cGUsIHRpdGxlLm5hbWUgPSBwYXN0ZTAocGF0aHdheXMuc2hvdywgIiBzaWduYWxpbmcgbmV0d29yayIpKQojPiBQbG90IHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgYXQgdGhlIHNpZ25hbGluZyBwYXRod2F5IGxldmVsCgoKICAKIyBDb21wdXRlIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBsaWdhbmQtcmVjZXB0b3IgcGFpciB0byB0aGUgb3ZlcmFsbCBzaWduYWxpbmcgcGF0aHdheSBhbmQgdmlzdWFsaXplIGNlbGwtY2VsbCAKI2NvbW11bmljYXRpb24gbWVkaWF0ZWQgYnkgYSBzaW5nbGUgbGlnYW5kLXJlY2VwdG9yIHBhaXIKCm5ldEFuYWx5c2lzX2NvbnRyaWJ1dGlvbihjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdykKCnBhaXJMUi5DWENMIDwtIGV4dHJhY3RFbnJpY2hlZExSKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBnZW5lTFIucmV0dXJuID0gRkFMU0UpCkxSLnNob3cgPC0gcGFpckxSLkNYQ0xbMSxdICMgc2hvdyBvbmUgbGlnYW5kLXJlY2VwdG9yIHBhaXIKIyBIaWVyYXJjaHkgcGxvdAp2ZXJ0ZXgucmVjZWl2ZXIgPSBzZXEoMSw0KSAjIGEgbnVtZXJpYyB2ZWN0b3IKbmV0VmlzdWFsX2luZGl2aWR1YWwoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csICBwYWlyTFIudXNlID0gTFIuc2hvdywgdmVydGV4LnJlY2VpdmVyID0gdmVydGV4LnJlY2VpdmVyKQojPiBbWzFdXQojIENpcmNsZSBwbG90Cm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBwYWlyTFIudXNlID0gTFIuc2hvdywgbGF5b3V0ID0gImNpcmNsZSIpCgoKCiM+IFtbMV1dCiMgQ2hvcmQgZGlhZ3JhbQpuZXRWaXN1YWxfaW5kaXZpZHVhbChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgcGFpckxSLnVzZSA9IExSLnNob3csIGxheW91dCA9ICJjaG9yZCIpCgojIEFjY2VzcyBhbGwgdGhlIHNpZ25hbGluZyBwYXRod2F5cyBzaG93aW5nIHNpZ25pZmljYW50IGNvbW11bmljYXRpb25zCnBhdGh3YXlzLnNob3cuYWxsIDwtIGNlbGxjaGF0QG5ldFAkcGF0aHdheXMKIyBjaGVjayB0aGUgb3JkZXIgb2YgY2VsbCBpZGVudGl0eSB0byBzZXQgc3VpdGFibGUgdmVydGV4LnJlY2VpdmVyCmxldmVscyhjZWxsY2hhdEBpZGVudHMpCnZlcnRleC5yZWNlaXZlciA9IHNlcSgxLDQpCmZvciAoaSBpbiAxOmxlbmd0aChwYXRod2F5cy5zaG93LmFsbCkpIHsKICAjIFZpc3VhbGl6ZSBjb21tdW5pY2F0aW9uIG5ldHdvcmsgYXNzb2NpYXRlZCB3aXRoIGJvdGggc2lnbmFsaW5nIHBhdGh3YXkgYW5kIGluZGl2aWR1YWwgTC1SIHBhaXJzCiAgbmV0VmlzdWFsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LmFsbFtpXSwgdmVydGV4LnJlY2VpdmVyID0gdmVydGV4LnJlY2VpdmVyLCBsYXlvdXQgPSAiaGllcmFyY2h5IikKICAjIENvbXB1dGUgYW5kIHZpc3VhbGl6ZSB0aGUgY29udHJpYnV0aW9uIG9mIGVhY2ggbGlnYW5kLXJlY2VwdG9yIHBhaXIgdG8gdGhlIG92ZXJhbGwgc2lnbmFsaW5nIHBhdGh3YXkKICBnZyA8LSBuZXRBbmFseXNpc19jb250cmlidXRpb24oY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3cuYWxsW2ldKQogIGdnc2F2ZShmaWxlbmFtZT1wYXN0ZTAocGF0aHdheXMuc2hvdy5hbGxbaV0sICJfTC1SX2NvbnRyaWJ1dGlvbi5wZGYiKSwgcGxvdD1nZywgd2lkdGggPSAzLCBoZWlnaHQgPSAyLCB1bml0cyA9ICdpbicsIGRwaSA9IDMwMCkKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlZpc3VhbGl6ZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBtZWRpYXRlZCBieSBtdWx0aXBsZSBsaWdhbmQtcmVjZXB0b3JzIG9yIHNpZ25hbGluZyBwYXRod2F5cyoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMoQSkgQnViYmxlIHBsb3QKCiMgKDEpIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgKEwtUiBwYWlycykgZnJvbSBzb21lIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICdzb3VyY2VzLnVzZScpIHRvIG90aGVyIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICd0YXJnZXRzLnVzZScpCm5ldFZpc3VhbF9idWJibGUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCByZW1vdmUuaXNvbGF0ZSA9IEZBTFNFKQojPiBDb21wYXJpbmcgY29tbXVuaWNhdGlvbnMgb24gYSBzaW5nbGUgb2JqZWN0CgoKCiMgKDIpIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgKEwtUiBwYWlycykgYXNzb2NpYXRlZCB3aXRoIGNlcnRhaW4gc2lnbmFsaW5nIHBhdGh3YXlzCm5ldFZpc3VhbF9idWJibGUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzaWduYWxpbmcgPSBjKCJDQ0wiLCJDWENMIiksIHJlbW92ZS5pc29sYXRlID0gRkFMU0UpCiM+IENvbXBhcmluZyBjb21tdW5pY2F0aW9ucyBvbiBhIHNpbmdsZSBvYmplY3QKCgojICgzKSBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGJhc2VkIG9uIHVzZXIncyBpbnB1dCAoZGVmaW5lZCBieSBgcGFpckxSLnVzZWApCnBhaXJMUi51c2UgPC0gZXh0cmFjdEVucmljaGVkTFIoY2VsbGNoYXQsIHNpZ25hbGluZyA9IGMoIkNDTCIsIkNYQ0wiLCJGR0YiKSkKbmV0VmlzdWFsX2J1YmJsZShjZWxsY2hhdCwgc291cmNlcy51c2UgPSBjKDMsNCksIHRhcmdldHMudXNlID0gYyg1OjgpLCBwYWlyTFIudXNlID0gcGFpckxSLnVzZSwgcmVtb3ZlLmlzb2xhdGUgPSBUUlVFKQojPiBDb21wYXJpbmcgY29tbXVuaWNhdGlvbnMgb24gYSBzaW5nbGUgb2JqZWN0CgoKIyAoQikgQ2hvcmQgZGlhZ3JhbQoKIyBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGZyb20gc29tZSBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAnc291cmNlcy51c2UnKSB0byBvdGhlciBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAndGFyZ2V0cy51c2UnKQojIHNob3cgYWxsIHRoZSBpbnRlcmFjdGlvbnMgc2VuZGluZyBmcm9tIEluZmxhbS5GSUIKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBsYWIuY2V4ID0gMC41LGxlZ2VuZC5wb3MueSA9IDMwKQoKCiMgc2hvdyBhbGwgdGhlIGludGVyYWN0aW9ucyByZWNlaXZlZCBieSBJbmZsYW0uREMKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSA4LCBsZWdlbmQucG9zLnggPSAxNSkKCiMgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyAoTC1SIHBhaXJzKSBhc3NvY2lhdGVkIHdpdGggY2VydGFpbiBzaWduYWxpbmcgcGF0aHdheXMKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzaWduYWxpbmcgPSBjKCJDQ0wiLCJDWENMIiksbGVnZW5kLnBvcy54ID0gOCkKCiMgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IHNpZ25hbGluZyBwYXRod2F5cyBmcm9tIHNvbWUgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3NvdXJjZXMudXNlJykgdG8gb3RoZXIgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3RhcmdldHMudXNlJykKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzbG90Lm5hbWUgPSAibmV0UCIsIGxlZ2VuZC5wb3MueCA9IDEwKQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQbG90IHRoZSBzaWduYWxpbmcgZ2VuZSBleHByZXNzaW9uIGRpc3RyaWJ1dGlvbiB1c2luZyB2aW9saW4vZG90IHBsb3QqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcGxvdEdlbmVFeHByZXNzaW9uKGNlbGxjaGF0LCBzaWduYWxpbmcgPSAiQ1hDTCIsIGVucmljaGVkLm9ubHkgPSBUUlVFLCB0eXBlID0gInZpb2xpbiIpCgoKcGxvdEdlbmVFeHByZXNzaW9uKGNlbGxjaGF0LCBzaWduYWxpbmcgPSAiQ1hDTCIsIGVucmljaGVkLm9ubHkgPSBGQUxTRSkKCmBgYAoKIyA2LiBTeXN0ZW1zIGFuYWx5c2lzIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKYGBge3IgU1lTVEVNUy1BTkFMWVNJUywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQYXJ0IElWOiBTeXN0ZW1zIGFuYWx5c2lzIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIChBKSBDb21wdXRlIGFuZCB2aXN1YWxpemUgdGhlIG5ldHdvcmsgY2VudHJhbGl0eSBzY29yZXMKCnB0bSA9IFN5cy50aW1lKCkKIyBDb21wdXRlIHRoZSBuZXR3b3JrIGNlbnRyYWxpdHkgc2NvcmVzCmNlbGxjaGF0IDwtIG5ldEFuYWx5c2lzX2NvbXB1dGVDZW50cmFsaXR5KGNlbGxjaGF0LCBzbG90Lm5hbWUgPSAibmV0UCIpICMgdGhlIHNsb3QgJ25ldFAnIG1lYW5zIHRoZSBpbmZlcnJlZCBpbnRlcmNlbGx1bGFyIGNvbW11bmljYXRpb24gbmV0d29yayBvZiBzaWduYWxpbmcgcGF0aHdheXMKIyBWaXN1YWxpemUgdGhlIGNvbXB1dGVkIGNlbnRyYWxpdHkgc2NvcmVzIHVzaW5nIGhlYXRtYXAsIGFsbG93aW5nIHJlYWR5IGlkZW50aWZpY2F0aW9uIG9mIG1ham9yIHNpZ25hbGluZyByb2xlcyBvZiBjZWxsIGdyb3VwcwpuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX25ldHdvcmsoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIHdpZHRoID0gOCwgaGVpZ2h0ID0gMi41LCBmb250LnNpemUgPSAxMCkKCgojKEIpIFZpc3VhbGl6ZSBkb21pbmFudCBzZW5kZXJzIChzb3VyY2VzKSBhbmQgcmVjZWl2ZXJzICh0YXJnZXRzKSBpbiBhIDJEIHNwYWNlCgojIFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgZnJvbSBhbGwgc2lnbmFsaW5nIHBhdGh3YXlzCmdnMSA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX3NjYXR0ZXIoY2VsbGNoYXQpCiM+IFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgZnJvbSBhbGwgc2lnbmFsaW5nIHBhdGh3YXlzCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmtzIG9mIGludGVyZXN0CmdnMiA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX3NjYXR0ZXIoY2VsbGNoYXQsIHNpZ25hbGluZyA9IGMoIkNYQ0wiLCAiQ0NMIikpCiM+IFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGZyb20gdXNlcidzIGlucHV0CmdnMSArIGdnMgoKCiMgKEMpIElkZW50aWZ5IHNpZ25hbHMgY29udHJpYnV0aW5nIHRoZSBtb3N0IHRvIG91dGdvaW5nIG9yIGluY29taW5nIHNpZ25hbGluZyBvZiBjZXJ0YWluIGNlbGwgZ3JvdXBzCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGFnZ3JlZ2F0ZWQgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayBmcm9tIGFsbCBzaWduYWxpbmcgcGF0aHdheXMKaHQxIDwtIG5ldEFuYWx5c2lzX3NpZ25hbGluZ1JvbGVfaGVhdG1hcChjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIpCmh0MiA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX2hlYXRtYXAoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQpodDEgKyBodDIKCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmtzIG9mIGludGVyZXN0Cmh0IDwtIG5ldEFuYWx5c2lzX3NpZ25hbGluZ1JvbGVfaGVhdG1hcChjZWxsY2hhdCwgc2lnbmFsaW5nID0gYygiQ1hDTCIsICJDQ0wiKSkKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipJZGVudGlmeSBnbG9iYWwgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyB0byBleHBsb3JlIGhvdyBtdWx0aXBsZSBjZWxsIHR5cGVzIGFuZCBzaWduYWxpbmcgcGF0aHdheXMgY29vcmRpbmF0ZSB0b2dldGhlcioqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIChBKSBJZGVudGlmeSBhbmQgdmlzdWFsaXplIG91dGdvaW5nIGNvbW11bmljYXRpb24gcGF0dGVybiBvZiBzZWNyZXRpbmcgY2VsbHMKCmxpYnJhcnkoTk1GKQojPiBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IHJlZ2lzdHJ5CiM+IExvYWRpbmcgcmVxdWlyZWQgcGFja2FnZTogcm5ndG9vbHMKIz4gTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBjbHVzdGVyCiM+IE5NRiAtIEJpb0NvbmR1Y3RvciBsYXllciBbT0tdIHwgU2hhcmVkIG1lbW9yeSBjYXBhYmlsaXRpZXMgW05POiBiaWdtZW1vcnldIHwgQ29yZXMgMi8yCiM+ICAgVG8gZW5hYmxlIHNoYXJlZCBtZW1vcnkgY2FwYWJpbGl0aWVzLCB0cnk6IGluc3RhbGwuZXh0cmFzKCcKIz4gTk1GCiM+ICcpCiM+IAojPiBBdHRhY2hpbmcgcGFja2FnZTogJ05NRicKIz4gVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSBtYXNrZWQgZnJvbSAncGFja2FnZTppZ3JhcGgnOgojPiAKIz4gICAgIGFsZ29yaXRobSwgY29tcGFyZQpsaWJyYXJ5KGdnYWxsdXZpYWwpCgoKc2V0d2QoIi4uL1NTX0NlbGxMaW5lc19QaXBlbGluZS8iKQpzZWxlY3RLKGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKCgpuUGF0dGVybnMgPSA2CgpjZWxsY2hhdCA8LSBpZGVudGlmeUNvbW11bmljYXRpb25QYXR0ZXJucyhjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIsIGsgPSBuUGF0dGVybnMpCgoKIyByaXZlciBwbG90Cm5ldEFuYWx5c2lzX3JpdmVyKGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKIz4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBsb2FkIGBsaWJyYXJ5KGdnYWxsdXZpYWwpYCB3aGVuIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbgoKCiMgZG90IHBsb3QKbmV0QW5hbHlzaXNfZG90KGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKCnNldHdkKCIuIikKCiMgKEIpIElkZW50aWZ5IGFuZCB2aXN1YWxpemUgaW5jb21pbmcgY29tbXVuaWNhdGlvbiBwYXR0ZXJuIG9mIHRhcmdldCBjZWxscwoKc2VsZWN0SyhjZWxsY2hhdCwgcGF0dGVybiA9ICJpbmNvbWluZyIpCgoKCiBuUGF0dGVybnMgPSAzCmNlbGxjaGF0IDwtIGlkZW50aWZ5Q29tbXVuaWNhdGlvblBhdHRlcm5zKGNlbGxjaGF0LCBwYXR0ZXJuID0gImluY29taW5nIiwgayA9IG5QYXR0ZXJucykKCgojIHJpdmVyIHBsb3QKbmV0QW5hbHlzaXNfcml2ZXIoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQojPiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGxvYWQgYGxpYnJhcnkoZ2dhbGx1dmlhbClgIHdoZW4gcnVubmluZyB0aGlzIGZ1bmN0aW9uCgoKIyBkb3QgcGxvdApuZXRBbmFseXNpc19kb3QoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQoKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqTWFuaWZvbGQgYW5kIGNsYXNzaWZpY2F0aW9uIGxlYXJuaW5nIGFuYWx5c2lzIG9mIHNpZ25hbGluZyBuZXR3b3JrcyoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIElkZW50aWZ5IHNpZ25hbGluZyBncm91cHMgYmFzZWQgb24gdGhlaXIgZnVuY3Rpb25hbCBzaW1pbGFyaXR5CiM4LiAgSWRlbnRpZnkgc2lnbmFsaW5nIHJvbGVzIGFuZCBwYXR0ZXJucwpjZWxsY2hhdCA8LSBjb21wdXRlTmV0U2ltaWxhcml0eShjZWxsY2hhdCwgdHlwZSA9ICJmdW5jdGlvbmFsIikKbGlicmFyeSh1d290KQpjZWxsY2hhdCA8LSBuZXRFbWJlZGRpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIHVtYXAubWV0aG9kID0gInV3b3QiKQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLm1heFNpemUgPSAxNjAwMCAqIDEwMjReMikgICMgU2V0IHRvIDE2IEdCCmNlbGxjaGF0IDwtIG5ldENsdXN0ZXJpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIGRvLnBhcmFsbGVsID0gRkFMU0UpCm5ldFZpc3VhbF9lbWJlZGRpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIGxhYmVsLnNpemUgPSAzLjUpCgojIElkZW50aWZ5IHNpZ25hbGluZyBncm91cHMgYmFzZWQgb24gc3RydWN0dXJlIHNpbWlsYXJpdHkKI2luc3RhbGwgdW1hcC1sZWFybiBiZWZvcmUgcnVubmluZyB0aGVzZSBjb21tYW5kcwogI3BpcCBpbnN0YWxsIHVtYXAtbGVhcm4KY2VsbGNoYXQgPC0gY29tcHV0ZU5ldFNpbWlsYXJpdHkoY2VsbGNoYXQsIHR5cGUgPSAic3RydWN0dXJhbCIpCmNlbGxjaGF0IDwtIG5ldEVtYmVkZGluZyhjZWxsY2hhdCwgdHlwZSA9ICJzdHJ1Y3R1cmFsIiwgdW1hcC5tZXRob2QgPSAidXdvdCIpCiM+IE1hbmlmb2xkIGxlYXJuaW5nIG9mIHRoZSBzaWduYWxpbmcgbmV0d29ya3MgZm9yIGEgc2luZ2xlIGRhdGFzZXQKb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gMTYwMDAgKiAxMDI0XjIpICAjIFNldCB0byAxNiBHQgpjZWxsY2hhdCA8LSBuZXRDbHVzdGVyaW5nKGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiLCBkby5wYXJhbGxlbCA9IEZBTFNFKQojPiBDbGFzc2lmaWNhdGlvbiBsZWFybmluZyBvZiB0aGUgc2lnbmFsaW5nIG5ldHdvcmtzIGZvciBhIHNpbmdsZSBkYXRhc2V0CiMgVmlzdWFsaXphdGlvbiBpbiAyRC1zcGFjZQpuZXRWaXN1YWxfZW1iZWRkaW5nKGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiLCBsYWJlbC5zaXplID0gMy41KQoKCm5ldFZpc3VhbF9lbWJlZGRpbmdab29tSW4oY2VsbGNoYXQsIHR5cGUgPSAic3RydWN0dXJhbCIsIG5Db2wgPSAyKQoKYGBgCiMgNy4gU2F2ZSB0aGUgQ2VsbENoYXQgb2JqZWN0CmBgYHtyIFNBVkUtQ0VMTENIQVQsIGV2YWwgPSBGQUxTRX0KCgpzYXZlKGNlbGxjaGF0LCBmaWxlID0gImNlbGxDSEFUX0FuYWx5c2lzX0FsbF9zYW1wbGVzX01lcmdlZC5Sb2JqIikKCmBgYAo=