1 L. Tropica

I really do not know what I am doing with this data, so lets wing it!

1.1 Annotations

Najib said to map this using L. tropica 590 and human. So let us gather those annotation sets.

## The biomart annotations file already exists, loading from it.
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Returning a df with 15 columns and 35977 rows.
## Found: Leishmania tropica L590
## $bsgenome
## BSGenome.Leishmania.tropica.L590.v46
## 
## $bsgenome_installed
## [1] FALSE
## 
## $granges
## GRanges.Leishmania.tropica.L590.v46.rda
## 
## $organismdbi
## tritrypdb.Leishmania.tropica.L590.v46
## 
## $organismdbi_installed
## [1] FALSE
## 
## $orgdb
## org.Ltropica.L590.v46.eg.db
## 
## $orgdb_installed
## [1] TRUE
## 
## $txdb
## TxDb.Leishmania.tropica.L590.TriTrypDB.v46
## 
## $txdb_installed
## [1] TRUE
## Loading required package: AnnotationDbi
## Loading required package: stats4
## Loading required package: IRanges
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:base':
## 
##     expand.grid
## 
## Selecting the following fields, this might be too many: 
## ANNOT_BFD3_CDS, ANNOT_BFD3_MODEL, ANNOT_BFD6_CDS, ANNOT_BFD6_MODEL, ANNOT_CDS, ANNOT_CDS_LENGTH, ANNOT_CHROMOSOME, ANNOT_DIF_CDS, ANNOT_DIF_MODEL, ANNOT_EC_NUMBERS, ANNOT_EC_NUMBERS_DERIVED, ANNOT_EXON_COUNT, ANNOT_FC_BFD3_CDS, ANNOT_FC_BFD3_MODEL, ANNOT_FC_BFD6_CDS, ANNOT_FC_BFD6_MODEL, ANNOT_FC_DIF_CDS, ANNOT_FC_DIF_MODEL, ANNOT_FC_PF_CDS, ANNOT_FC_PF_MODEL, ANNOT_FIVE_PRIME_UTR_LENGTH, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_EXON_COUNT, ANNOT_GENE_HTS_NONCODING_SNPS, ANNOT_GENE_HTS_NONSYN_SYN_RATIO, ANNOT_GENE_HTS_NONSYNONYMOUS_SNPS, ANNOT_GENE_HTS_STOP_CODON_SNPS, ANNOT_GENE_HTS_SYNONYMOUS_SNPS, ANNOT_GENE_LOCATION_TEXT, ANNOT_GENE_NAME, ANNOT_GENE_ORTHOLOG_NUMBER, ANNOT_GENE_ORTHOMCL_NAME, ANNOT_GENE_PARALOG_NUMBER, ANNOT_GENE_PREVIOUS_IDS, ANNOT_GENE_PRODUCT, ANNOT_GENE_SOURCE_ID, ANNOT_GENE_TOTAL_HTS_SNPS, ANNOT_GENE_TRANSCRIPT_COUNT, ANNOT_GENE_TYPE, ANNOT_GO_COMPONENT, ANNOT_GO_FUNCTION, ANNOT_GO_ID_COMPONENT, ANNOT_GO_ID_FUNCTION, ANNOT_GO_ID_PROCESS, ANNOT_GO_PROCESS, ANNOT_HAS_MISSING_TRANSCRIPTS, ANNOT_INTERPRO_DESCRIPTION, ANNOT_INTERPRO_ID, ANNOT_IS_PSEUDO, ANNOT_ISOELECTRIC_POINT, ANNOT_LOCATION_TEXT, ANNOT_MATCHED_RESULT, ANNOT_MOLECULAR_WEIGHT, ANNOT_NO_TET_CDS, ANNOT_NO_TET_MODEL, ANNOT_ORGANISM, ANNOT_PF_CDS, ANNOT_PF_MODEL, ANNOT_PFAM_DESCRIPTION, ANNOT_PFAM_ID, ANNOT_PIRSF_DESCRIPTION, ANNOT_PIRSF_ID, ANNOT_PREDICTED_GO_COMPONENT, ANNOT_PREDICTED_GO_FUNCTION, ANNOT_PREDICTED_GO_ID_COMPONENT, ANNOT_PREDICTED_GO_ID_FUNCTION, ANNOT_PREDICTED_GO_ID_PROCESS, ANNOT_PREDICTED_GO_PROCESS, ANNOT_PROJECT_ID, ANNOT_PROSITEPROFILES_DESCRIPTION, ANNOT_PROSITEPROFILES_ID, ANNOT_PROTEIN_LENGTH, ANNOT_PROTEIN_SEQUENCE, ANNOT_SEQUENCE_ID, ANNOT_SIGNALP_PEPTIDE, ANNOT_SIGNALP_SCORES, ANNOT_SMART_DESCRIPTION, ANNOT_SMART_ID, ANNOT_SOURCE_ID, ANNOT_STRAND, ANNOT_SUPERFAMILY_DESCRIPTION, ANNOT_SUPERFAMILY_ID, ANNOT_THREE_PRIME_UTR_LENGTH, ANNOT_TIGRFAM_DESCRIPTION, ANNOT_TIGRFAM_ID, ANNOT_TM_COUNT, ANNOT_TRANS_FOUND_PER_GENE_INTERNAL, ANNOT_TRANSCRIPT_INDEX_PER_GENE, ANNOT_TRANSCRIPT_LENGTH, ANNOT_TRANSCRIPT_LINK, ANNOT_TRANSCRIPT_PRODUCT, ANNOT_TRANSCRIPT_SEQUENCE, ANNOT_TRANSCRIPTS_FOUND_PER_GENE, ANNOT_UNIPROT_ID, ANNOT_URI, ANNOT_WDK_WEIGHT
## Extracted all gene ids.
## Attempting to select: ANNOT_BFD3_CDS, ANNOT_BFD3_MODEL, ANNOT_BFD6_CDS, ANNOT_BFD6_MODEL, ANNOT_CDS, ANNOT_CDS_LENGTH, ANNOT_CHROMOSOME, ANNOT_DIF_CDS, ANNOT_DIF_MODEL, ANNOT_EC_NUMBERS, ANNOT_EC_NUMBERS_DERIVED, ANNOT_EXON_COUNT, ANNOT_FC_BFD3_CDS, ANNOT_FC_BFD3_MODEL, ANNOT_FC_BFD6_CDS, ANNOT_FC_BFD6_MODEL, ANNOT_FC_DIF_CDS, ANNOT_FC_DIF_MODEL, ANNOT_FC_PF_CDS, ANNOT_FC_PF_MODEL, ANNOT_FIVE_PRIME_UTR_LENGTH, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_EXON_COUNT, ANNOT_GENE_HTS_NONCODING_SNPS, ANNOT_GENE_HTS_NONSYN_SYN_RATIO, ANNOT_GENE_HTS_NONSYNONYMOUS_SNPS, ANNOT_GENE_HTS_STOP_CODON_SNPS, ANNOT_GENE_HTS_SYNONYMOUS_SNPS, ANNOT_GENE_LOCATION_TEXT, ANNOT_GENE_NAME, ANNOT_GENE_ORTHOLOG_NUMBER, ANNOT_GENE_ORTHOMCL_NAME, ANNOT_GENE_PARALOG_NUMBER, ANNOT_GENE_PREVIOUS_IDS, ANNOT_GENE_PRODUCT, ANNOT_GENE_SOURCE_ID, ANNOT_GENE_TOTAL_HTS_SNPS, ANNOT_GENE_TRANSCRIPT_COUNT, ANNOT_GENE_TYPE, ANNOT_GO_COMPONENT, ANNOT_GO_FUNCTION, ANNOT_GO_ID_COMPONENT, ANNOT_GO_ID_FUNCTION, ANNOT_GO_ID_PROCESS, ANNOT_GO_PROCESS, ANNOT_HAS_MISSING_TRANSCRIPTS, ANNOT_INTERPRO_DESCRIPTION, ANNOT_INTERPRO_ID, ANNOT_IS_PSEUDO, ANNOT_ISOELECTRIC_POINT, ANNOT_LOCATION_TEXT, ANNOT_MATCHED_RESULT, ANNOT_MOLECULAR_WEIGHT, ANNOT_NO_TET_CDS, ANNOT_NO_TET_MODEL, ANNOT_ORGANISM, ANNOT_PF_CDS, ANNOT_PF_MODEL, ANNOT_PFAM_DESCRIPTION, ANNOT_PFAM_ID, ANNOT_PIRSF_DESCRIPTION, ANNOT_PIRSF_ID, ANNOT_PREDICTED_GO_COMPONENT, ANNOT_PREDICTED_GO_FUNCTION, ANNOT_PREDICTED_GO_ID_COMPONENT, ANNOT_PREDICTED_GO_ID_FUNCTION, ANNOT_PREDICTED_GO_ID_PROCESS, ANNOT_PREDICTED_GO_PROCESS, ANNOT_PROJECT_ID, ANNOT_PROSITEPROFILES_DESCRIPTION, ANNOT_PROSITEPROFILES_ID, ANNOT_PROTEIN_LENGTH, ANNOT_PROTEIN_SEQUENCE, ANNOT_SEQUENCE_ID, ANNOT_SIGNALP_PEPTIDE, ANNOT_SIGNALP_SCORES, ANNOT_SMART_DESCRIPTION, ANNOT_SMART_ID, ANNOT_SOURCE_ID, ANNOT_STRAND, ANNOT_SUPERFAMILY_DESCRIPTION, ANNOT_SUPERFAMILY_ID, ANNOT_THREE_PRIME_UTR_LENGTH, ANNOT_TIGRFAM_DESCRIPTION, ANNOT_TIGRFAM_ID, ANNOT_TM_COUNT, ANNOT_TRANS_FOUND_PER_GENE_INTERNAL, ANNOT_TRANSCRIPT_INDEX_PER_GENE, ANNOT_TRANSCRIPT_LENGTH, ANNOT_TRANSCRIPT_LINK, ANNOT_TRANSCRIPT_PRODUCT, ANNOT_TRANSCRIPT_SEQUENCE, ANNOT_TRANSCRIPTS_FOUND_PER_GENE, ANNOT_UNIPROT_ID, ANNOT_URI, ANNOT_WDK_WEIGHT
## 'select()' returned 1:1 mapping between keys and columns

So, I now have 2 data frames of parasite annotations and 1 human.

1.2 Metadata

I am going to write a quick sample sheet in the current working directory called ‘samples.xlsx’ and put the names of the count tables in it.

1.3 Create expressionsets

Here I combine the metadata, count data, and annotations.

It is worth noting that the gene IDs from htseq-count probably do not match the annotations retrieved because they are likely exon-based rather than gene based. This is not really a problem, but don’t forget it!

## Reading the sample metadata.
## The sample definitions comprises: 6 rows(samples) and 5 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/raw_data/salloum/INF1_1/processed/outputs/hisat2_hg38_91/INF1_S155_L003.count.xz contains 58307 rows.
## INF1_2/processed/outputs/hisat2_hg38_91/INF2_S0_L009.count.xz contains 58307 rows and merges to 58307 rows.
## THP1_1/processed/outputs/hisat2_hg38_91/THP1_1_S17_L001.count.xz contains 58307 rows and merges to 58307 rows.
## THP1_2/processed/outputs/hisat2_hg38_91/THP1_2_S0_L009.count.xz contains 58307 rows and merges to 58307 rows.
## Finished reading count tables.
## Matched 58243 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 58302 rows and 4 columns.
## Reading the sample metadata.
## The sample definitions comprises: 6 rows(samples) and 5 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/raw_data/salloum/INF1_1/processed/outputs/hisat2_ltropica590_v46/INF1_S155_L003.count.xz contains 9052 rows.
## INF1_2/processed/outputs/hisat2_ltropica590_v46/INF2_S0_L009.count.xz contains 9052 rows and merges to 9052 rows.
## LT2_1/processed/outputs/hisat2_ltropica590_v46/LT2_1_S156_L003.count.xz contains 9052 rows and merges to 9052 rows.
## LT2_2/processed/outputs/hisat2_ltropica590_v46/LT2_2_S0_L009.count.xz contains 9052 rows and merges to 9052 rows.
## Finished reading count tables.
## Matched 8938 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 9047 rows and 4 columns.

1.4 Query expressionsets

In this block I will calculate all the diagnostic plots, but not show them. I will show them next with a little annotation.

I will leave the output for the first of each invocation and silence it for the second.

## Graphing number of non-zero genes with respect to CPM by library.
## Graphing library sizes.
## Graphing a boxplot.
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 158534 zero count features.
## Graphing a correlation heatmap.
## Graphing a standard median correlation.
## Performing correlation.
## Graphing a distance heatmap.
## Graphing a standard median distance.
## Performing distance.
## Graphing a PCA plot.
## Graphing a T-SNE plot.
## Warning in plot_pca(..., pc_method = "tsne"): TSNE: Attempting to auto-detect
## perplexity failed, setting it to 1.
## Plotting a density plot.
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some entries are 0.  We are on log scale, setting them to 0.5.
## Changed 158534 zero count features.
## Plotting a CV plot.
## Naively calculating coefficient of variation/dispersion with respect to condition.
## Finished calculating dispersion estimates.
## Plotting the representation of the top-n genes.
## Plotting the expression of the top-n PC loaded genes.
## Printing a color to condition legend.
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 47141 low-count genes (11161 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in plot_pca(..., pc_method = "tsne"): TSNE: Attempting to auto-detect
## perplexity failed, setting it to 1.
## Writing the normalized reads.
## Graphing the normalized reads.
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Writing the median reads by factor.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in plot_pca(..., pc_method = "tsne"): TSNE: Attempting to auto-detect
## perplexity failed, setting it to 1.
## Writing the normalized reads.
## Graphing the normalized reads.
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Writing the median reads by factor.

1.6 Do a simple DE

Like the above, I am going to tell the 2nd invocation of each command to stay quiet.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 47141 low-count genes (11161 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/1: inf_over_thp which is: inf/thp.
## Found inverse table with thp_vs_inf
## Adding venn plots for inf_over_thp.
## Limma expression coefficients for inf_over_thp; R^2: 0.911; equation: y = 0.958x - 0.0379
## Deseq expression coefficients for inf_over_thp; R^2: 0.831; equation: y = 0.939x + 0.218
## Edger expression coefficients for inf_over_thp; R^2: 0.899; equation: y = 0.944x + 0.2
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20191212_hg38_91_contrast_tables.xlsx.

Now lets visualize some of the DE results. I was watching the plots generate while it wrote the tables, it looks like limma does not agree well with DESeq2/EdgeR for this data.

2 Get significant genes

## Writing a legend of columns.
## Writing excel data according to limma for inf_over_thp: 1/5.
## After (adj)p filter, the up genes table has 4 genes.
## After (adj)p filter, the down genes table has 145 genes.
## After fold change filter, the up genes table has 4 genes.
## After fold change filter, the down genes table has 145 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/1: Creating significant table up_limma_inf_over_thp
## Writing excel data according to edger for inf_over_thp: 1/5.
## After (adj)p filter, the up genes table has 601 genes.
## After (adj)p filter, the down genes table has 414 genes.
## After fold change filter, the up genes table has 601 genes.
## After fold change filter, the down genes table has 414 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/1: Creating significant table up_edger_inf_over_thp
## Writing excel data according to deseq for inf_over_thp: 1/5.
## After (adj)p filter, the up genes table has 1166 genes.
## After (adj)p filter, the down genes table has 764 genes.
## After fold change filter, the up genes table has 1166 genes.
## After fold change filter, the down genes table has 764 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/1: Creating significant table up_deseq_inf_over_thp
## Writing excel data according to ebseq for inf_over_thp: 1/5.
## After (adj)p filter, the up genes table has 3422 genes.
## After (adj)p filter, the down genes table has 1062 genes.
## After fold change filter, the up genes table has 3080 genes.
## After fold change filter, the down genes table has 902 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## 1/1: Creating significant table up_ebseq_inf_over_thp
## Writing excel data according to basic for inf_over_thp: 1/5.
## After (adj)p filter, the up genes table has 0 genes.
## After (adj)p filter, the down genes table has 0 genes.
## After fold change filter, the up genes table has 0 genes.
## After fold change filter, the down genes table has 0 genes.
## Printing significant genes to the file: excel/significant_genes.xlsx
## The up table inf_over_thp is empty.
## The down table inf_over_thp is empty.
## Adding significance bar plots.

3 Ontology

## Performing gProfiler GO search of 1166 against hsapiens.
## GO search found 147 hits.
## Performing gProfiler KEGG search of 1166 against hsapiens.
## KEGG search found 7 hits.
## Performing gProfiler REAC search of 1166 against hsapiens.
## REAC search found 13 hits.
## Performing gProfiler MI search of 1166 against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1166 against hsapiens.
## TF search found 833 hits.
## Performing gProfiler CORUM search of 1166 against hsapiens.
## CORUM search found 10 hits.
## Performing gProfiler HP search of 1166 against hsapiens.
## HP search found 4 hits.

## Performing gProfiler GO search of 764 against hsapiens.
## GO search found 461 hits.
## Performing gProfiler KEGG search of 764 against hsapiens.
## KEGG search found 15 hits.
## Performing gProfiler REAC search of 764 against hsapiens.
## REAC search found 127 hits.
## Performing gProfiler MI search of 764 against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 764 against hsapiens.
## TF search found 343 hits.
## Performing gProfiler CORUM search of 764 against hsapiens.
## CORUM search found 50 hits.
## Performing gProfiler HP search of 764 against hsapiens.
## HP search found 230 hits.

LS0tCnRpdGxlOiAiTC4gdHJvcGljYSBhbmFseXNpcyIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAidW5kZWZpbmVkLlJtZCIKdmVyIDwtICIyMDE5MTIxMCIKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQojI3JtZF9maWxlIDwtICIwM19leHByZXNzaW9uX2luZmVjdGlvbl8yMDE4MDgyMi5SbWQiCmBgYAoKIyBMLiBUcm9waWNhCgpJIHJlYWxseSBkbyBub3Qga25vdyB3aGF0IEkgYW0gZG9pbmcgd2l0aCB0aGlzIGRhdGEsIHNvIGxldHMgd2luZyBpdCEKCiMjIEFubm90YXRpb25zCgpOYWppYiBzYWlkIHRvIG1hcCB0aGlzIHVzaW5nIEwuIHRyb3BpY2EgNTkwIGFuZCBodW1hbi4gIFNvIGxldCB1cyBnYXRoZXIgdGhvc2UgYW5ub3RhdGlvbiBzZXRzLgoKYGBge3IgYW5ub3RhdGlvbnN9CiMjIE15IGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucygpIGZ1bmN0aW9uIGRlZmF1bHRzIHRvIGh1bWFuLCBzbyB0aGF0IHdpbGwgYmUgcXVpY2suCmhzX2Fubm90IDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucygpCmhzX2Fubm90IDwtIGhzX2Fubm90W1siYW5ub3RhdGlvbiJdXQpsdF9hbm5vdCA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygifi9zY3JhdGNoL2xpYnJhcmllcy9nZW5vbWUvbHRyb3BpY2E1OTBfdjQ2LmdmZiIpCiMjIFRvIGdldCB0aGUgVHJpVHJ5cERCIGFubm90YXRpb25zLCBJIG5lZWQgdG8gZmlyc3QgZmlndXJlIG91dCB0aGUgZnVsbCBJRC4KIyMgT2gsIEkgbWlzcGVlbGVkIGl0IHdoZW4gSSBkb3dubG9hZGVkIHRoZSBnZW5vbWUsIEkgd3JvdGUgaXQgYXMgJ2x0cm9waWNhNTkwJywKIyMgaXQgc2hvdWxkIGhhdmUgYmVlbjogbHRyb3BpY2FsNTkwLgoKbHRfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoIkw1OTAiLCB3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQpsdF9uYW1lcyA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9wa2duYW1lcyhsdF9lbnRyeSkKbHRfbmFtZXMKbHRfZW50cnkgPC0gIm9yZy5MdHJvcGljYS5MNTkwLnY0Ni5lZy5kYiIKbHRfb3JnZGIgPC0gRXVQYXRoREI6OmxvYWRfb3JnZGJfYW5ub3RhdGlvbnMobHRfZW50cnksIGZpZWxkcz0iYWxsIikKbHRfb3JnZGIgPC0gbHRfb3JnZGJbWyJnZW5lcyJdXQpgYGAKClNvLCBJIG5vdyBoYXZlIDIgZGF0YSBmcmFtZXMgb2YgcGFyYXNpdGUgYW5ub3RhdGlvbnMgYW5kIDEgaHVtYW4uCgojIyBNZXRhZGF0YQoKSSBhbSBnb2luZyB0byB3cml0ZSBhIHF1aWNrIHNhbXBsZSBzaGVldCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjYWxsZWQKJ3NhbXBsZXMueGxzeCcgYW5kIHB1dCB0aGUgbmFtZXMgb2YgdGhlIGNvdW50IHRhYmxlcyBpbiBpdC4KCiMjIENyZWF0ZSBleHByZXNzaW9uc2V0cwoKSGVyZSBJIGNvbWJpbmUgdGhlIG1ldGFkYXRhLCBjb3VudCBkYXRhLCBhbmQgYW5ub3RhdGlvbnMuCgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgZ2VuZSBJRHMgZnJvbSBodHNlcS1jb3VudCBwcm9iYWJseSBkbyBub3QgbWF0Y2ggdGhlCmFubm90YXRpb25zIHJldHJpZXZlZCBiZWNhdXNlIHRoZXkgYXJlIGxpa2VseSBleG9uLWJhc2VkIHJhdGhlciB0aGFuIGdlbmUKYmFzZWQuICBUaGlzIGlzIG5vdCByZWFsbHkgYSBwcm9ibGVtLCBidXQgZG9uJ3QgZm9yZ2V0IGl0IQoKYGBge3IgZXhwdH0KIyMgT29wcywgdGhlIGNvdW50IHRhYmxlIGlzIGJ5IGdlbmUgYW5kIEkgd3JvdGUgdGhlIGFubm90YXRpb25zIGJ5IHRyYW5zY3JpcHQuICBEb29mdXMuCnJvd25hbWVzKGhzX2Fubm90KSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90W1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKaGczOF9leHB0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXQueGxzeCIsIGdlbmVfaW5mbz1oc19hbm5vdCwgZmlsZV9jb2x1bW49ImhzZmlsZSIpCgojIyBBbmQgSSBlbnRpcmVseSBmb3Jnb3QgdG8gc2V0IHRoZSByb3cgbmFtZXMgZm9yIHRoZSBsZWlzaG1hbmlhIGRhdGEhCiMjIEJ1dCBpdCBkb2VzIGNvbnRhaW4gdGhlIGV4b24gbmFtZXMsIGJ1dCB3aXRoIGEgJy0nIGluc3RlYWQgb2YgYSAnLicuLi4Kcm93bmFtZXMobHRfYW5ub3QpIDwtIHBhc3RlMCgiZXhvbl8iLCBsdF9hbm5vdFtbIklEIl1dLCAiLkUxIikKbHRfZXhwdCA8LSBjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0Lnhsc3giLCBnZW5lX2luZm89bHRfYW5ub3QsIGZpbGU9Imx0ZmlsZSIpCmBgYAoKIyMgUXVlcnkgZXhwcmVzc2lvbnNldHMKCkluIHRoaXMgYmxvY2sgSSB3aWxsIGNhbGN1bGF0ZSBhbGwgdGhlIGRpYWdub3N0aWMgcGxvdHMsIGJ1dCBub3Qgc2hvdyB0aGVtLiAgSQp3aWxsIHNob3cgdGhlbSBuZXh0IHdpdGggYSBsaXR0bGUgYW5ub3RhdGlvbi4KCkkgd2lsbCBsZWF2ZSB0aGUgb3V0cHV0IGZvciB0aGUgZmlyc3Qgb2YgZWFjaCBpbnZvY2F0aW9uIGFuZCBzaWxlbmNlIGl0IGZvciB0aGUgc2Vjb25kLgoKYGBge3IgcXVlcnksIGZpZy5zaG93PSJoaWRlIn0KaGczOF9wbG90cyA8LSBncmFwaF9tZXRyaWNzKGhnMzhfZXhwdCkKbHRfcGxvdHMgPC0gc20oZ3JhcGhfbWV0cmljcyhsdF9leHB0KSkKCmhnMzhfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoZzM4X2V4cHQsIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIiwgZmlsdGVyPVRSVUUpCmx0X25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQobHRfZXhwdCwgbm9ybT0icXVhbnQiLCBjb252ZXJ0PSJjcG0iLCB0cmFuc2Zvcm09ImxvZzIiLCBmaWx0ZXI9VFJVRSkpCgpoZzM4bl9wbG90cyA8LSBzbShncmFwaF9tZXRyaWNzKGhnMzhfbm9ybSkpCmx0bl9wbG90cyA8LSBzbShncmFwaF9tZXRyaWNzKGx0X25vcm0pKQoKaGczOF93cml0ZSA8LSB3cml0ZV9leHB0KGhnMzhfZXhwdCwgZXhjZWw9ImV4Y2VsL3tydW5kYXRlfWhnMzhfZXhwcmVzc2lvbnNldC54bHN4IikKbHRfd3JpdGUgPC0gd3JpdGVfZXhwdChsdF9leHB0LCBleGNlbD0iZXhjZWwve3J1bmRhdGV9bHRfZXhwcmVzc2lvbnNldC54bHN4IikKYGBgCgojIyBTaG93IHNvbWUgcGxvdHMKCmBgYHtyIHNob3dfcGxvdHN9CmhnMzhfcGxvdHMkbGVnZW5kCmx0X3Bsb3RzJGxlZ2VuZAojIyBUaGUgbGVnZW5kIHdpbGwgYmUgdGhlIHNhbWUgZm9yIGJvdGggdGhlIGh1bWFuIGFuZCBwYXJhc2l0ZSBkYXRhLCBleGNlcHQgSSBkZWNpZGVkIHRvIGRyb3AgdGhlCiMjIFRIUCBzYW1wbGVzIGZyb20gdGhlIHBhcmFzaXRlLCBJIGFtIHJlYXNvbmFibHkgY2VydGFpbiB0aGVyZSBhcmUgbm8gYWN0dWFsIHBhcmFzaXRlIHJlYWRzIHRoZXJlLgoKaGczOF9wbG90cyRsaWJzaXplCiMjIENvdW50cyBvYnNlcnZlZCBmb3IgZWFjaCBzYW1wbGUsIGh1bWFuIGRhdGEuCmx0X3Bsb3RzJGxpYnNpemUKIyMgQ291bnRzIG9ic2VydmVkIGZvciBlYWNoIHNhbXBsZSwgcGFyYXNpdGUgZGF0YS4KCmhnMzhfcGxvdHMkbm9uemVybwojIyBIb3cgbWFueSBodW1hbiBnZW5lcyBoYXZlID4wIHJlYWRzPwpsdF9wbG90cyRub256ZXJvCiMjIEhvdyBtYW55IHBhcmFzaXRlIGdlbmVzIGhhdmUgPjAgcmVhZHM/CiMjIFRoZXNlIHBsb3RzIHN1Z2dlc3QgdGhhdCBJbmYxXzIgbWlnaHQgYmVuZWZpdCBmcm9tIG1vcmUgY292ZXJhZ2UuCgpoZzM4bl9wbG90cyRkZW5zaXR5Cmx0bl9wbG90cyRkZW5zaXR5CiMjIFRoaXMgaXMgZ29pbmcgdG8gYmUgYSBwcm9ibGVtLCBJbmYxXzIgaXMgbWlzc2luZyBhIHdob2xlIGJ1bmNoIG9mIGdlbmVzLgoKaGczOG5fcGxvdHMkcGNfcGxvdApsdG5fcGxvdHMkcGNfcGxvdApgYGAKCiMjIERvIGEgc2ltcGxlIERFCgpMaWtlIHRoZSBhYm92ZSwgSSBhbSBnb2luZyB0byB0ZWxsIHRoZSAybmQgaW52b2NhdGlvbiBvZiBlYWNoIGNvbW1hbmQgdG8gc3RheSBxdWlldC4KCmBgYHtyIGRlLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIGFsbF9wYWlyd2lzZSgpIGludm9rZXMgREVTZXEyLCBFZGdlUiwgbGltbWEsIEVCU2VxIG9uIHRoZSBkYXRhLCBhbG9uZyB3aXRoIG15IG93biBiYXNpYyBtZXRob2QuCmhnMzhfZGUgPC0gYWxsX3BhaXJ3aXNlKGhnMzhfZXhwdCwgbW9kZWxfYmF0Y2g9RkFMU0UpCmx0X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShsdF9leHB0LCBtb2RlbF9iYXRjaD1GQUxTRSkpCgojIyBOb3cgd2Ugd2FudCB0byBtYWtlIG9uZSBiaWcgdGFibGUgZnJvbSB0aGUgdGFibGVzIHByb3ZpZGVkIGJ5IERFU2VxMiwgRWRnZVIsIGV0Yy4KaGczOF9jb250cmFzdCA8LSBsaXN0KAogICJpbmZfb3Zlcl90aHAiID0gYygiaW5mIiwgInRocCIpKQpoZzM4X3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKGhnMzhfZGUsIGtlZXBlcnM9aGczOF9jb250cmFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faGczOF85MV9jb250cmFzdF90YWJsZXMueGxzeCIpKQpsdF9jb250cmFzdCA8LSBsaXN0KAogICJpbmZfb3Zlcl9sdCIgPSBjKCJpbmYiLCAibHQiKSkKbHRfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMobHRfZGUsIGtlZXBlcnM9bHRfY29udHJhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9sdF9jb250cmFzdF90YWJsZXMueGxzeCIpKSkKYGBgCgpOb3cgbGV0cyB2aXN1YWxpemUgc29tZSBvZiB0aGUgREUgcmVzdWx0cy4KSSB3YXMgd2F0Y2hpbmcgdGhlIHBsb3RzIGdlbmVyYXRlIHdoaWxlIGl0IHdyb3RlIHRoZSB0YWJsZXMsIGl0IGxvb2tzIGxpa2UgbGltbWEKZG9lcyBub3QgYWdyZWUgd2VsbCB3aXRoIERFU2VxMi9FZGdlUiBmb3IgdGhpcyBkYXRhLgoKYGBge3IgZGVfcGxvdHN9CmhnMzhfdGFibGUkcGxvdHNbWzFdXSRkZXNlcV9zY2F0dGVyX3Bsb3RzJHNjYXR0ZXIKaGczOF90YWJsZSRwbG90c1tbMV1dJGRlc2VxX21hX3Bsb3RzJHBsb3QKCmx0X3RhYmxlJHBsb3RzW1sxXV0kZGVzZXFfc2NhdHRlcl9wbG90cyRzY2F0dGVyCmx0X3RhYmxlJHBsb3RzW1sxXV0kZGVzZXFfbWFfcGxvdHMkcGxvdApgYGAKCiMgR2V0IHNpZ25pZmljYW50IGdlbmVzCgpgYGB7ciBzaWdfZ2VuZXN9CmhnMzhfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoaGczOF90YWJsZSkKbHRfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobHRfdGFibGUpKQpgYGAKCiMgT250b2xvZ3kKCmBgYHtyIGdwcm9maWxlcn0KaGczOF91cCA8LSBoZzM4X3NpZyRkZXNlcSR1cHNbWzFdXQpoZzM4X3VwX2dwcm9mIDwtIHNpbXBsZV9ncHJvZmlsZXIoaGczOF91cCkKaGczOF91cF9ncHJvZiRwdmFsdWVfcGxvdHMkbWZwX3Bsb3Rfb3ZlcgpoZzM4X3VwX2dwcm9mJHB2YWx1ZV9wbG90cyRicHBfcGxvdF9vdmVyCmhnMzhfdXBfZ3Byb2YkcHZhbHVlX3Bsb3RzJHRmX3Bsb3Rfb3ZlcgpoZzM4X3VwX2dwcm9mJHB2YWx1ZV9wbG90cyRjb3J1bV9wbG90X292ZXIKCmhnMzhfZG93biA8LSBoZzM4X3NpZyRkZXNlcSRkb3duc1tbMV1dCmhnMzhfZG93bl9ncHJvZiA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGhnMzhfZG93bikKaGczOF9kb3duX2dwcm9mJHB2YWx1ZV9wbG90cyRtZnBfcGxvdF9vdmVyCmhnMzhfZG93bl9ncHJvZiRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3ZlcgpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK