Part A:

RNA-Seq Data Network Analysis

Cytoscape is an open source software platform for integrating, visualizing, and analysing measurement data in the context of networks.

This protocol describes a network analysis workflow in Cytoscape for differentially expressed genes from an RNA-Seq experiment. Overall workflow:

• Finding a set of differentially expressed genes.
• Retrieving relevant networks from public databases.
• Integration and visualization of experimental data.
• Network functional enrichment analysis.
• Exporting network visualizations.

Setup

Install the (stringApp) from the Cytoscape App Store, or via Apps → App Store → Show App Store.

OR

Just visit the Cytoscape App store and install/download it from there.



Experimental Data

For this exercise, we will use a dataset comparing transcriptomic differences between bladder cancer and normal tissue. The study has been published by Radvanyi F et al., and we will get a summarized dataset with fold change and p-value from the EBI Gene Expression Atlas. Array-express ID is E-MTAB-1940.

  • link to the publication and data : (Here..!)



  • Download the data: Transcriptomic analysis of bladder cancer reveals convergent molecular pathology. (Here..!). First Select all the contents (by holding control + A or Command + A (Mac-users)) and Save the file by right-clicking the mouse button and using save-as option.
  • To open the tsv data file in Excel, first launch Excel and open a blank workbook. Next, go to Data → Get External Data → Import Text File….
  • In the import wizard, select Delimited and in the next step select Tab.
  • In the third step, you can select the Data Format for every column. The file has 4 columns of data: Gene ID, Gene Name, fold change and p-value. Make sure to change the format for the second column, Gene Name, to Text. You will have to scroll to the right to see the second column.
  • Click Finish to complete the import.


Editing experimental data

We are going to define a set of up-regulated genes from the full dataset by filtering for fold change and p-value.
For this reason we will need to edit the raw downloaded file to obtain expression information for the features specific to bladder cancer.

Download the following file (Here..!) and open in Microsoft Excel.


• Select the row containing data value headers (row 4) and select Data → Filter.
• In the drop-down for the fold change column, set a filter for fold change greater than 2. This should result in 263 genes.
• Next, one would normally filter out non-significant changes by filtering on the p-value as well, for example setting p-value less than 0.05. But in this case, all genes with a fold change greater than 2 already meet that cutoff.
• With the filter active, select and copy all entries in the Gene Name column.




Retrieve Networks from STRING

To identify a relevant network, we will use the STRING database to find a network relevant to the list of up-regulated genes.

• Launch Cytoscape. In the Network Search bar at the top of the Network Panel, select STRING protein query from the drop-down, and paste in the list of 263 up-regulated genes.
• Open the options panel and confirm you are searching Homo sapiens with a Confidence cutoff of 0.40 and 0 Maximum additional interactors.
• Click the search icon to search. If any of the search terms are ambiguous, a Resolve Ambiguous Terms dialog will appear. Click Import to continue with the import using the default choices. The resulting network will load automatically, and should have around 173 nodes.




STRING Network Up-Regulated Genes

The resulting network contains up-regulated genes recognized by STRING, and interactions between them with a confidence score of 0.4 or greater.



The networks consist of one large connected component, several smaller networks, and some unconnected nodes. We will use only the largest connected component for the rest of the tutorial.

• To select the largest connected component, select Select → Nodes → Largest subnetwork.
• Select File → New Network → From Selected Nodes, All Edges.



Data Integration

Next we will import the RNA-Seq data and use them to create a visualization.

• Load the downloaded E-MTAB-1940-query-results.tsv file under File menu by selecting Import → Table from File….. Alternatively, drag and drop the data file directly onto the Node Table.
• In Advanced Options…, in the Ignore Lines Starting With field, enter #, to exclude the additional lines at the beginning of the data file.
• Select the query term column as the Key column for Network and select the Gene Name column as the key column by clicking on the header and selecting the key symbol.
• Click OK to import. Two new columns of data will be added to the Node Table.





Visualization

Next, we will create a visualization of the imported data on the network. For more detailed information on data visualization, see the Visualizing Data tutorial.

• In the Style tab of the Control Panel, switch the style from STRING style to default in the drop-down at the top.
• Change the default node Shape to ellipse and check Lock node width and height.
• Set the default node Size to 50.
• Set the default node Fill Color to light gray.
• Set the default Border Width to 2, and make the default Border Paint dark gray.





• For node Fill Color, create a continuous mapping for ‘NMIBC’ vs ‘normal’ .foldChange.
• Double-click the color mapping to open the Continuous Mapping Editor and click the Current Palette. Select the ColorBrewer yellow-orange-red shades gradient.
• Finally, for node Label, set a passthrough mapping for display name.
• Save your new visualization under Copy Style… in the Options menu of the Style interface, and name it de genes up.




Apply the Prefuse Force Directed layout by clicking the Apply Preferred Layout button in the toolbar. The network will now look something like this:



Exercise

a. STRING Enrichment

The STRING app has built-in enrichment analysis functionality, which includes enrichment for Gene Ontology, InterPro, KEGG Pathways, and PFAM.

  • Using the STRING tab of the Results Panel, click the Functional Enrichment button. Keep the default settings. What do you see.



  • When the enrichment analysis is complete, a new tab titled STRING Enrichment will open in the Table Panel.

  • The STRING app includes several options for filtering and displaying the enrichment results. The features are all available at the top of the STRING Enrichment tab. Filter the table to only show GO Biological Process.

  • At the top left of the STRING enrichment tab, click the filter icon . Select GO Biological Process and check the Remove redundant terms check-box. Then click OK.

  • Next, add a split donut chart to the nodes representing the top terms by clicking on

  • Explore custom settings via in the top right of the STRING enrichment tab.

b. Repeat the whole experiment using “down-regulated” genes.

c. Export your Networks

d. Save in any of the formats and be ready for publishing.

We will now go to the next session session (2B) to understand how to perform Functional Enrichment.

LS0tCnRpdGxlOiAiUk5BLVNlcSBEYXRhIE5ldHdvcmsgQW5hbHlzaXMgLSBTZXNzaW9uIDItQSIKYXV0aG9yOiAiQWtzaGF5IEJoYXQiCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIkxhc3QgbW9kaWZpZWQ6ICVkICViICVZIilgJwpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBjc3M6IHN0eWxlc2hlZXRzL3N0eWxlcy5jc3MKLS0tCjxpbWcgc3JjPSJpbWFnZXMvbG9nby1zbS5wbmciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDBweDtyaWdodDoxMHB4OyIgd2lkdGg9IjIwMCIgLz4KCgojIFBhcnQgQToKCgojIFJOQS1TZXEgRGF0YSBOZXR3b3JrIEFuYWx5c2lzCkN5dG9zY2FwZSBpcyBhbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBwbGF0Zm9ybSBmb3IgaW50ZWdyYXRpbmcsIHZpc3VhbGl6aW5nLCBhbmQgYW5hbHlzaW5nIG1lYXN1cmVtZW50IGRhdGEgaW4gdGhlIGNvbnRleHQgb2YgbmV0d29ya3MuPGJyPjwvYnI+CiAgCiAgVGhpcyBwcm90b2NvbCBkZXNjcmliZXMgYSBuZXR3b3JrIGFuYWx5c2lzIHdvcmtmbG93IGluIEN5dG9zY2FwZSBmb3IgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGZyb20gYW4gUk5BLVNlcSBleHBlcmltZW50LiBPdmVyYWxsIHdvcmtmbG93Ojxicj48L2JyPgogIAogIOKAoglGaW5kaW5nIGEgc2V0IG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4gPGJyPjwvYnI+CiAg4oCiCVJldHJpZXZpbmcgcmVsZXZhbnQgbmV0d29ya3MgZnJvbSBwdWJsaWMgZGF0YWJhc2VzLiA8YnI+PC9icj4KICDigKIJSW50ZWdyYXRpb24gYW5kIHZpc3VhbGl6YXRpb24gb2YgZXhwZXJpbWVudGFsIGRhdGEuIDxicj48L2JyPgogIOKAoglOZXR3b3JrIGZ1bmN0aW9uYWwgZW5yaWNobWVudCBhbmFseXNpcy4gPGJyPjwvYnI+CiAg4oCiCUV4cG9ydGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb25zLiA8YnI+PC9icj4KICAKICAKIyMgU2V0dXAKICAKICBJbnN0YWxsIHRoZSAoW3N0cmluZ0FwcF0oaHR0cDovL2FwcHMuY3l0b3NjYXBlLm9yZy9hcHBzL3N0cmluZ2FwcCkpIGZyb20gdGhlIEN5dG9zY2FwZSBBcHAgU3RvcmUsIG9yIHZpYSAqKkFwcHMg4oaSIEFwcCBTdG9yZSDihpIgU2hvdyBBcHAgU3RvcmUuKiogPGJyPjwvYnI+CiAgCiMjIE9SIDxicj48L2JyPgogIApKdXN0IHZpc2l0IHRoZSAqKkN5dG9zY2FwZSBBcHAgc3RvcmUqKiBhbmQgaW5zdGFsbC9kb3dubG9hZCBpdCBmcm9tIHRoZXJlLgo8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1N0cmluZ0FwcC5wbmcpCjxicj48L2JyPjxicj48L2JyPgogIAojIyBFeHBlcmltZW50YWwgRGF0YQogIEZvciB0aGlzIGV4ZXJjaXNlLCB3ZSB3aWxsIHVzZSBhIGRhdGFzZXQgY29tcGFyaW5nIHRyYW5zY3JpcHRvbWljIGRpZmZlcmVuY2VzIGJldHdlZW4gYmxhZGRlciBjYW5jZXIgYW5kIG5vcm1hbCB0aXNzdWUuIFRoZSBzdHVkeSBoYXMgYmVlbiBwdWJsaXNoZWQgYnkgUmFkdmFueWkgRiBldCBhbC4sIGFuZCB3ZSB3aWxsIGdldCBhIHN1bW1hcml6ZWQgZGF0YXNldCB3aXRoIGZvbGQgY2hhbmdlIGFuZCBwLXZhbHVlIGZyb20gdGhlICoqRUJJIEdlbmUgRXhwcmVzc2lvbiBBdGxhcyoqLiBBcnJheS1leHByZXNzIElEIGlzICoqRS1NVEFCLTE5NDAqKi4gIAogIAoqIGxpbmsgdG8gdGhlIHB1YmxpY2F0aW9uIGFuZCBkYXRhIDogKFtIZXJlLi4hXShodHRwczovL3d3dy5lYmkuYWMudWsvYmlvc3R1ZGllcy9hcnJheWV4cHJlc3Mvc3R1ZGllcy9FLU1UQUItMTk0MD9xdWVyeT1FLU1UQUItMTk0MCkpCiAgCiAgCjxicj48L2JyPgogIDxicj48L2JyPgogIAoqIERvd25sb2FkIHRoZSBkYXRhOiBUcmFuc2NyaXB0b21pYyBhbmFseXNpcyBvZiBibGFkZGVyIGNhbmNlciByZXZlYWxzIGNvbnZlcmdlbnQgbW9sZWN1bGFyIHBhdGhvbG9neS4gKFtIZXJlLi4hXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYTFha3MvQ3l0b3NjYXBlX0NvdXJzZS9tYWluL0RhdGFfRmlsZXMvQkNMQS1hbGwudHN2KSkuICBGaXJzdCBTZWxlY3QgYWxsIHRoZSBjb250ZW50cyAoYnkgaG9sZGluZyBjb250cm9sICsgQSBvciBDb21tYW5kICsgQSAoTWFjLXVzZXJzKSkgYW5kIFNhdmUgdGhlIGZpbGUgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIG1vdXNlIGJ1dHRvbiBhbmQgdXNpbmcgc2F2ZS1hcyBvcHRpb24uICA8YnI+PC9icj4KKiBUbyBvcGVuIHRoZSB0c3YgZGF0YSBmaWxlIGluIEV4Y2VsLCBmaXJzdCBsYXVuY2ggRXhjZWwgYW5kIG9wZW4gYSBibGFuayB3b3JrYm9vay4gTmV4dCwgZ28gdG8gKipEYXRhIOKGkiBHZXQgRXh0ZXJuYWwgRGF0YSDihpIgSW1wb3J0IFRleHQgRmlsZS4uLi4qKiA8YnI+PC9icj4KKiBJbiB0aGUgaW1wb3J0IHdpemFyZCwgc2VsZWN0ICoqRGVsaW1pdGVkKiogYW5kIGluIHRoZSBuZXh0IHN0ZXAgc2VsZWN0IFRhYi4KPGJyPjwvYnI+CiogSW4gdGhlIHRoaXJkIHN0ZXAsIHlvdSBjYW4gc2VsZWN0IHRoZSAqKkRhdGEgRm9ybWF0KiogZm9yIGV2ZXJ5IGNvbHVtbi4gVGhlIGZpbGUgaGFzIDQgY29sdW1ucyBvZiBkYXRhOiAqKkdlbmUgSUQsIEdlbmUgTmFtZSwgZm9sZCBjaGFuZ2UgYW5kIHAtdmFsdWUqKi4gKipNYWtlIHN1cmUgdG8gY2hhbmdlIHRoZSBmb3JtYXQgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBHZW5lIE5hbWUsIHRvIFRleHQuKiogWW91IHdpbGwgaGF2ZSB0byBzY3JvbGwgdG8gdGhlIHJpZ2h0IHRvIHNlZSB0aGUgc2Vjb25kIGNvbHVtbi4KPGJyPjwvYnI+CiogQ2xpY2sgKipGaW5pc2gqKiB0byBjb21wbGV0ZSB0aGUgaW1wb3J0LgoKPGJyPjwvYnI+CiAgCiMjIEVkaXRpbmcgZXhwZXJpbWVudGFsIGRhdGEKICBXZSBhcmUgZ29pbmcgdG8gZGVmaW5lIGEgc2V0IG9mIHVwLXJlZ3VsYXRlZCBnZW5lcyBmcm9tIHRoZSBmdWxsIGRhdGFzZXQgYnkgZmlsdGVyaW5nIGZvciBmb2xkIGNoYW5nZSBhbmQgcC12YWx1ZS4KPGJyPjwvYnI+CkZvciB0aGlzIHJlYXNvbiB3ZSB3aWxsIG5lZWQgdG8gZWRpdCB0aGUgcmF3IGRvd25sb2FkZWQgZmlsZSB0byBvYnRhaW4gZXhwcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmVzIHNwZWNpZmljIHRvIGJsYWRkZXIgY2FuY2VyLiAKCkRvd25sb2FkIHRoZSBmb2xsb3dpbmcgZmlsZSAoW0hlcmUuLiFdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hMWFrcy9DeXRvc2NhcGVfQ291cnNlL21haW4vRGF0YV9GaWxlcy9FLU1UQUItMTk0MC1xdWVyeS1yZXN1bHRzLnRzdikpIGFuZCBvcGVuIGluIE1pY3Jvc29mdCBFeGNlbC4gCgo8YnI+PC9icj4KICDigKIJU2VsZWN0IHRoZSByb3cgY29udGFpbmluZyBkYXRhIHZhbHVlIGhlYWRlcnMgKHJvdyA0KSBhbmQgc2VsZWN0ICoqRGF0YSDihpIgRmlsdGVyLioqPGJyPjwvYnI+CiAg4oCiCUluIHRoZSBkcm9wLWRvd24gZm9yIHRoZSBmb2xkIGNoYW5nZSBjb2x1bW4sIHNldCBhIGZpbHRlciBmb3IgZm9sZCBjaGFuZ2UgZ3JlYXRlciB0aGFuIDIuIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiAqKjI2MyoqIGdlbmVzLjxicj48L2JyPgogIOKAoglOZXh0LCBvbmUgd291bGQgbm9ybWFsbHkgZmlsdGVyIG91dCBub24tc2lnbmlmaWNhbnQgY2hhbmdlcyBieSBmaWx0ZXJpbmcgb24gdGhlIHAtdmFsdWUgYXMgd2VsbCwgZm9yIGV4YW1wbGUgc2V0dGluZyBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1LiBCdXQgaW4gdGhpcyBjYXNlLCBhbGwgZ2VuZXMgd2l0aCBhIGZvbGQgY2hhbmdlIGdyZWF0ZXIgdGhhbiAyIGFscmVhZHkgbWVldCB0aGF0IGN1dG9mZi48YnI+PC9icj4KICDigKIJV2l0aCB0aGUgZmlsdGVyIGFjdGl2ZSwgc2VsZWN0IGFuZCBjb3B5IGFsbCBlbnRyaWVzIGluIHRoZSAqKkdlbmUgTmFtZSoqIGNvbHVtbi48YnI+PC9icj4KICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL0V4cF9kYXRhLnBuZykKCjxicj48L2JyPjxicj48L2JyPgogIAojIyBSZXRyaWV2ZSBOZXR3b3JrcyBmcm9tIFNUUklORwogIAogIFRvIGlkZW50aWZ5IGEgcmVsZXZhbnQgbmV0d29yaywgd2Ugd2lsbCB1c2UgdGhlICoqU1RSSU5HKiogZGF0YWJhc2UgdG8gZmluZCBhIG5ldHdvcmsgcmVsZXZhbnQgdG8gdGhlIGxpc3Qgb2YgdXAtcmVndWxhdGVkIGdlbmVzLgo8YnI+PC9icj48YnI+PC9icj4KICDigKIJTGF1bmNoIEN5dG9zY2FwZS4gSW4gdGhlICoqTmV0d29yayBTZWFyY2gqKiBiYXIgYXQgdGhlIHRvcCBvZiB0aGUgKipOZXR3b3JrIFBhbmVsKiosIHNlbGVjdCAqKlNUUklORyBwcm90ZWluIHF1ZXJ5KiogZnJvbSB0aGUgZHJvcC1kb3duLCBhbmQgcGFzdGUgaW4gdGhlIGxpc3Qgb2YgMjYzIHVwLXJlZ3VsYXRlZCBnZW5lcy48YnI+PC9icj4KICDigKIJT3BlbiB0aGUgb3B0aW9ucyBwYW5lbCAgYW5kIGNvbmZpcm0geW91IGFyZSBzZWFyY2hpbmcgKipIb21vIHNhcGllbnMqKiB3aXRoIGEgKipDb25maWRlbmNlIGN1dG9mZiBvZiAwLjQwKiogYW5kICoqMCBNYXhpbXVtIGFkZGl0aW9uYWwgaW50ZXJhY3RvcnMuKio8YnI+PC9icj4KICDigKIJQ2xpY2sgdGhlICoqc2VhcmNoIGljb24qKiB0byBzZWFyY2guIElmIGFueSBvZiB0aGUgc2VhcmNoIHRlcm1zIGFyZSBhbWJpZ3VvdXMsIGEgKipSZXNvbHZlIEFtYmlndW91cyBUZXJtcyoqIGRpYWxvZyB3aWxsIGFwcGVhci4gQ2xpY2sgKipJbXBvcnQqKiB0byBjb250aW51ZSB3aXRoIHRoZSBpbXBvcnQgdXNpbmcgdGhlIGRlZmF1bHQgY2hvaWNlcy4gVGhlIHJlc3VsdGluZyBuZXR3b3JrIHdpbGwgbG9hZCBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvdWxkIGhhdmUgYXJvdW5kICoqMTczKiogbm9kZXMuIDxicj48L2JyPgogIAogIDxicj48L2JyPgogIAogICFbXShpbWFnZXMvU3RyaW5nLUltcG9ydC5wbmcpCjxicj48L2JyPjxicj48L2JyPgogIAojIyBTVFJJTkcgTmV0d29yayBVcC1SZWd1bGF0ZWQgR2VuZXMKICAKICBUaGUgcmVzdWx0aW5nIG5ldHdvcmsgY29udGFpbnMgdXAtcmVndWxhdGVkIGdlbmVzIHJlY29nbml6ZWQgYnkgU1RSSU5HLCBhbmQgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlbSB3aXRoIGEgY29uZmlkZW5jZSBzY29yZSBvZiAwLjQgb3IgZ3JlYXRlci4KPGJyPjwvYnI+PGJyPjwvYnI+CiAgCiAgIVtdKGltYWdlcy9TdHJpbmctSW1hZ2UxLnBuZykKCgo8YnI+PC9icj48YnI+PC9icj4KICAKICBUaGUgbmV0d29ya3MgY29uc2lzdCBvZiBvbmUgbGFyZ2UgY29ubmVjdGVkIGNvbXBvbmVudCwgc2V2ZXJhbCBzbWFsbGVyIG5ldHdvcmtzLCBhbmQgc29tZSB1bmNvbm5lY3RlZCBub2Rlcy4gV2Ugd2lsbCB1c2Ugb25seSB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgY29tcG9uZW50IGZvciB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwuPGJyPjwvYnI+CiAgCiAg4oCiCVRvIHNlbGVjdCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgY29tcG9uZW50LCBzZWxlY3QgKipTZWxlY3Qg4oaSIE5vZGVzIOKGkiBMYXJnZXN0IHN1Ym5ldHdvcmsuKio8YnI+PC9icj4KICDigKIJU2VsZWN0ICoqRmlsZSDihpIgTmV3IE5ldHdvcmsg4oaSIEZyb20gU2VsZWN0ZWQgTm9kZXMsIEFsbCBFZGdlcy4qKjxicj48L2JyPgogIDxicj48L2JyPjxicj48L2JyPgogICFbXShpbWFnZXMvU3RyaW5nLUltYWdlMi5wbmcpCgo8YnI+PC9icj4KCiMjIERhdGEgSW50ZWdyYXRpb24KICAKICBOZXh0IHdlIHdpbGwgaW1wb3J0IHRoZSBSTkEtU2VxIGRhdGEgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24uPGJyPjwvYnI+CiAgCiAg4oCiCUxvYWQgdGhlIGRvd25sb2FkZWQgKipFLU1UQUItMTk0MC1xdWVyeS1yZXN1bHRzLnRzdioqIGZpbGUgdW5kZXIgRmlsZSBtZW51IGJ5IHNlbGVjdGluZyAqKkltcG9ydCDihpIgVGFibGUgZnJvbSBGaWxlLi4uLi4qKiBBbHRlcm5hdGl2ZWx5LCBkcmFnIGFuZCBkcm9wIHRoZSBkYXRhIGZpbGUgZGlyZWN0bHkgb250byB0aGUgTm9kZSBUYWJsZS48YnI+PC9icj4KICDigKIJSW4gKipBZHZhbmNlZCBPcHRpb25zKiouLi4sIGluIHRoZSAqKklnbm9yZSBMaW5lcyBTdGFydGluZyBXaXRoIGZpZWxkKiosIGVudGVyICMsIHRvIGV4Y2x1ZGUgdGhlIGFkZGl0aW9uYWwgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBmaWxlLjxicj48L2JyPgrigKIJU2VsZWN0IHRoZSAqKnF1ZXJ5IHRlcm0qKiBjb2x1bW4gYXMgdGhlICoqS2V5IGNvbHVtbiBmb3IgTmV0d29yayoqIGFuZCBzZWxlY3QgdGhlICoqR2VuZSBOYW1lKiogY29sdW1uIGFzIHRoZSBrZXkgY29sdW1uIGJ5IGNsaWNraW5nIG9uIHRoZSBoZWFkZXIgYW5kIHNlbGVjdGluZyB0aGUga2V5IHN5bWJvbC48YnI+PC9icj4KICDigKIJQ2xpY2sgKipPSyoqIHRvIGltcG9ydC4gVHdvIG5ldyBjb2x1bW5zIG9mIGRhdGEgd2lsbCBiZSBhZGRlZCB0byB0aGUgKipOb2RlIFRhYmxlLioqPGJyPjwvYnI+CiAgCiAgPGJyPjwvYnI+PGJyPjwvYnI+CiAgIVtdKGltYWdlcy9JbXBvcnQtZGF0YS1pbnQucG5nKQohW10oaW1hZ2VzL0ltcG9ydC1Db2x1bW5zLnBuZykKPGJyPjwvYnI+PGJyPjwvYnI+CiAgCiAgCiMjIFZpc3VhbGl6YXRpb24KICBOZXh0LCB3ZSB3aWxsIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEgb24gdGhlIG5ldHdvcmsuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRhdGEgdmlzdWFsaXphdGlvbiwgc2VlIHRoZSBWaXN1YWxpemluZyBEYXRhIHR1dG9yaWFsLjxicj48L2JyPgogIAogIOKAoglJbiB0aGUgKipTdHlsZSoqIHRhYiBvZiB0aGUgKipDb250cm9sIFBhbmVsKiosIHN3aXRjaCB0aGUgc3R5bGUgZnJvbSAqKlNUUklORyoqIHN0eWxlIHRvICoqZGVmYXVsdCoqIGluIHRoZSBkcm9wLWRvd24gYXQgdGhlIHRvcC48YnI+PC9icj4KICDigKIJQ2hhbmdlIHRoZSBkZWZhdWx0IG5vZGUgKipTaGFwZSoqIHRvICoqZWxsaXBzZSoqIGFuZCAqKmNoZWNrIExvY2sgbm9kZSB3aWR0aCBhbmQgaGVpZ2h0LioqPGJyPjwvYnI+CiAg4oCiCVNldCB0aGUgZGVmYXVsdCBub2RlICoqU2l6ZSoqIHRvICoqNTAuKio8YnI+PC9icj4KICDigKIJU2V0IHRoZSBkZWZhdWx0IG5vZGUgKipGaWxsIENvbG9yKiogdG8gKipsaWdodCBncmF5KiouPGJyPjwvYnI+CiAg4oCiCVNldCB0aGUgZGVmYXVsdCAqKkJvcmRlciBXaWR0aCoqIHRvIDIsIGFuZCBtYWtlIHRoZSBkZWZhdWx0ICoqQm9yZGVyIFBhaW50KiogZGFyayBncmF5Ljxicj48L2JyPgogIDxicj48L2JyPjxicj48L2JyPgogICFbXShpbWFnZXMvVmlzdWFsaXphdGlvbi1TdHlsZXMucG5nKQoKPC9icj48YnI+PC9icj48YnI+PC9icj4KICDigKIJRm9yIG5vZGUgKipGaWxsIENvbG9yKiosIGNyZWF0ZSBhIGNvbnRpbnVvdXMgbWFwcGluZyBmb3IgJ05NSUJDJyB2cyAnbm9ybWFsJyAuZm9sZENoYW5nZS48YnI+PC9icj4KICDigKIJRG91YmxlLWNsaWNrIHRoZSBjb2xvciBtYXBwaW5nIHRvIG9wZW4gdGhlICoqQ29udGludW91cyBNYXBwaW5nIEVkaXRvcioqIGFuZCBjbGljayB0aGUgKipDdXJyZW50IFBhbGV0dGUqKi4gU2VsZWN0IHRoZSBDb2xvckJyZXdlciAqKnllbGxvdy1vcmFuZ2UtcmVkIHNoYWRlcyBncmFkaWVudCoqLjxicj48L2JyPgogIOKAoglGaW5hbGx5LCBmb3Igbm9kZSAqKkxhYmVsKiosIHNldCBhIHBhc3N0aHJvdWdoIG1hcHBpbmcgZm9yIGRpc3BsYXkgbmFtZS48YnI+PC9icj4KICDigKIJU2F2ZSB5b3VyIG5ldyB2aXN1YWxpemF0aW9uIHVuZGVyICoqQ29weSBTdHlsZS4uLioqIGluIHRoZSAqKk9wdGlvbnMqKiBtZW51IG9mIHRoZSAqKlN0eWxlKiogaW50ZXJmYWNlLCBhbmQgbmFtZSBpdCBkZSBnZW5lcyB1cC48YnI+PC9icj4KICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1N0eWxlLW9wdGlvbnMucG5nKQo8YnI+PC9icj48YnI+PC9icj4KICAKICAKICBBcHBseSB0aGUgKipQcmVmdXNlIEZvcmNlIERpcmVjdGVkKiogbGF5b3V0IGJ5IGNsaWNraW5nIHRoZSAqKkFwcGx5IFByZWZlcnJlZCBMYXlvdXQqKiBidXR0b24gaW4gdGhlIHRvb2xiYXIuIFRoZSBuZXR3b3JrIHdpbGwgbm93IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1ByZWZ1c2UtZm9yY2UtbGF5b3V0LnBuZykKPGJyPjwvYnI+PGJyPjwvYnI+Cgo8ZGl2IGNsYXNzPSJleGVyY2lzZSI+CiMgRXhlcmNpc2UKCiMjIGEuIFNUUklORyBFbnJpY2htZW50CgpUaGUgU1RSSU5HIGFwcCBoYXMgYnVpbHQtaW4gZW5yaWNobWVudCBhbmFseXNpcyBmdW5jdGlvbmFsaXR5LCB3aGljaCBpbmNsdWRlcyBlbnJpY2htZW50IGZvciBHZW5lIE9udG9sb2d5LCBJbnRlclBybywgS0VHRyBQYXRod2F5cywgYW5kIFBGQU0uPGJyPjwvYnI+CgoqCVVzaW5nIHRoZSBTVFJJTkcgdGFiIG9mIHRoZSBSZXN1bHRzIFBhbmVsLCBjbGljayB0aGUgKipGdW5jdGlvbmFsIEVucmljaG1lbnQgYnV0dG9uKiouIEtlZXAgdGhlIGRlZmF1bHQgc2V0dGluZ3MuIFdoYXQgZG8geW91IHNlZS48YnI+PC9icj4KICAgICFbXShpbWFnZXMvRnVuY3Rpb25hbEVucmljaG1lbnRCdXR0b24ucG5nKQogIAogIDxicj48L2JyPjxicj48L2JyPgoKKiBXaGVuIHRoZSBlbnJpY2htZW50IGFuYWx5c2lzIGlzIGNvbXBsZXRlLCBhIG5ldyB0YWIgdGl0bGVkICoqU1RSSU5HKiogKipFbnJpY2htZW50Kiogd2lsbCBvcGVuIGluIHRoZSAqKlRhYmxlIFBhbmVsKiouPGJyPjwvYnI+CgoqIFRoZSBTVFJJTkcgYXBwIGluY2x1ZGVzIHNldmVyYWwgb3B0aW9ucyBmb3IgZmlsdGVyaW5nIGFuZCBkaXNwbGF5aW5nIHRoZSBlbnJpY2htZW50IHJlc3VsdHMuIFRoZSBmZWF0dXJlcyBhcmUgYWxsIGF2YWlsYWJsZSBhdCB0aGUgdG9wIG9mIHRoZSAqKlNUUklORyBFbnJpY2htZW50IHRhYioqLiBGaWx0ZXIgdGhlIHRhYmxlIHRvIG9ubHkgc2hvdyAqKkdPIEJpb2xvZ2ljYWwgUHJvY2Vzcy4qKjxicj48L2JyPgogICAKKiBBdCB0aGUgdG9wIGxlZnQgb2YgdGhlIFNUUklORyBlbnJpY2htZW50IHRhYiwgY2xpY2sgdGhlIGZpbHRlciBpY29uIGByIGljb25zOjpmb250YXdlc29tZSgiZmlsdGVyIiwgc3R5bGUgPSAic29saWQiKWAgLiBTZWxlY3QgKipHTyBCaW9sb2dpY2FsIFByb2Nlc3MqKiBhbmQgY2hlY2sgdGhlICoqUmVtb3ZlIHJlZHVuZGFudCB0ZXJtcyBjaGVjay1ib3gqKi4gVGhlbiBjbGljayAqKk9LLioqPGJyPjwvYnI+CiogTmV4dCwgYWRkIGEgc3BsaXQgZG9udXQgY2hhcnQgdG8gdGhlIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgdG9wIHRlcm1zIGJ5IGNsaWNraW5nIG9uIDxicj48L2JyPgoqIEV4cGxvcmUgY3VzdG9tIHNldHRpbmdzIHZpYSAgIGluIHRoZSB0b3AgcmlnaHQgb2YgdGhlIFNUUklORyBlbnJpY2htZW50IHRhYi48YnI+PC9icj4gICAKICAgIAojIyMgYi4gUmVwZWF0IHRoZSB3aG9sZSBleHBlcmltZW50IHVzaW5nICJkb3duLXJlZ3VsYXRlZCIgZ2VuZXMuIAoKIyMjIGMuIEV4cG9ydCB5b3VyIE5ldHdvcmtzCgojIyMgZC4gKipTYXZlIGluIGFueSBvZiB0aGUgZm9ybWF0cyBhbmQgYmUgcmVhZHkgZm9yIHB1Ymxpc2hpbmcuKioKICAKICA8L2Rpdj4KICAKICAKIyMjIFdlIHdpbGwgbm93IGdvIHRvIHRoZSBuZXh0IHNlc3Npb24gW3Nlc3Npb24gKDJCKV0oc2Vzc2lvbjJiLm5iLmh0bWwpIHRvIHVuZGVyc3RhbmQgaG93IHRvIHBlcmZvcm0gRnVuY3Rpb25hbCBFbnJpY2htZW50LiAgICAKICA=