Enrichment and Pathways Analysis
The differential expression step is concerned with being able to say
with confidence whether an individual gene has a different level of
expression between biological groups. However, in this section we move
towards discovering if our results are biologically
significant. Are the genes that we have picked statistical
flukes, or are there some commonalities?
It can be informative to scan (manually) through the gene lists we
generate through Degust and use our Biological intuition to look for
themes. We might also look for previously-published genes, or genes that
we have intentionally-manipulated (e.g. by knocking-out that gene).
However, sometimes we can mislead ourselves into thinking our results
are more significant than they really are.
In order to infer biological significance from our data, we need some
way of being able to group genes together based on their function. The
two main sources of these are:-
The GO database defines the relationships between sets of genes in a
tree-like structure starting with the most-general biological definition
to increasingly specific cases.

The ontologies are split into three categories
- (MF) Molecular Function: the molecular activities
of individual gene products
- (CC) Cellular Component: where the gene products
are active
- (BP) Biological Process: the pathways and larger
processes to which that gene product’s activity contributes
The KEGG database also defines sets of genes. There is no defined
relationship between KEGG pathways. There is however a complex network
between genes belonging to the same pathway which does not exist in
GO.
The choice of database does not actually affect how the statistical
testing works. We test of significant collections regardless of how the
collections have been defined.
The “cell cycle process” Gene Ontology has many hundreds of genes
belonging to it. If we were to pick a set of genes at
random of equivalent size as our list of
differentially-expressed genes we should not be
surprised to see a lot of cell-cycle genes appearing in the
list. This is just due to the fact that we had a lot of possible
cell-cycle genes to choose from. The key question is whether the number
of cell-cycle (or any other pathway) is more than we would expect by
chance.
In this section we will use the following files
background.csv
containing
one row for each gene in the comparison Basal.pregnant vs
Basal.lactation (27,179 rows).
B.preg_vs_lactation.csv
containing one row for each found to be DE in the contrast
Basal.pregnant vs Basal.Lactation.
It will be helpful to have both these files open in Excel.
There are two different approaches one might use, and we will cover
the theory behind both. The distinction is whether you are happy to use
a hard (and arbitrary) threshold to identify DE genes.
Over-representation analysis (ORA)
“Threshold-based” methods require definition of a statistical
threshold to define list of genes to test (e.g. FDR < 0.01). Then a
hypergeometric test or Fisher’s Exact test is
generally used. These methods require plenty of DE genes as an input, so
people often use more-relaxed criteria for identifying DE genes
(e.g. raw rather than adjusted p-values or FDR value but in conjuction
with a fold-change cut-off)
The question we are asking here is;
“Are the number of DE genes associated with Gene Set X
significantly greater than what we might expect by chance
alone?”
We can answer this question by knowing
- the total number of DE genes
- the number of genes in the gene set (pathway or process)
- the number of genes in the gene set that are found to be DE
- the total number of tested genes (background)
You will never need to know this, but for those interested the
formula for Fishers exact test is;
\[ p = \frac{\binom{a + b}{a}\binom{c
+d}{c}}{\binom{n}{a +c}} = \frac{(a+b)!(c+d)!(a+c)!(b+d)!}{a!b!c!d!n!}
\]
with:-
In Gene Set |
a |
b |
a + b |
Not in Gene Set |
c |
d |
c + d |
Total |
a + c |
b +d |
a + b + c + d (=n) |
As a worked example, consider a Gene Set with 634
genes. After performing differential expression, we find that our list
of differentially-expressed genes comprises 4595 genes.
Amongst this gene list, 233 belong to our Gene Set.
Plugging-in the numbers we get:-
In Gene Set |
233 |
388 |
Not in Gene Set |
4362 |
22196 |
Which yields a significant p-value with a Fishers’
test.
Another way of thinking about this is to randomly pick a set
of 4595 genes (i.e. without using a p-value cut-off)
and see how many belong to our gene set.
The first time we do this, we get 100 genes in our
set. The second time we get 112 and so on…
If we repeat enough time we can make a histogram:-

We see that a value of 233 is extremely unlikely. In other words,
using our p-value cut-off to generate our gene list has resulted in
about twice as many of our gene set than we would expect by
chance
Using WebGestalt for ORA
There are several popular online tools for performing enrichment
analysis We will be using the online tool WebGestalt to perform the
pathways analysis. It supports various types of analyses; the first of
which accepts a list of pre-selected genes to perform an
ORA.
- Go to https://www.webgestalt.org/#
- Choose the ORA Sample Run Tab

- Choose Organism:
Mus Musculus
- Make sure that Method of interest is set to
Over-Representation Analysis (ORA)
- Select Functional Database
geneontology
and
Biological Process non-redundant
- you can change this later if you wish
- Keep Select Gene ID Type as
Gene symbol
- Paste the gene symbols corresponding to DE genes in Basal
pregnant vs Basal Lactation from your Excel spreadsheet into the
Upload Gene List box.
- The shortcut CTRL + SPACE will let you select an entire
column
- Do not paste the column heading
SYMBOL
- In Select Reference Set make sure genome
protein-coding is selected.
- Under Advanced Parameters, make sure that the
FDR option is selected as Significance otherwise you will only
get the top 10 pathways reported.
- Click Submit
The page that appears can give a summary of the analysis performed
(i.e. the number of genes that were used as input and how many names
were recognised as valid gene names) along with various visualisations.
The summary tab can be useful to check that you have supplied the
correct kind of IDs (e.g. Gene symbol vs Ensembl, Entrez) and selected
the correct organism. If few IDs are reported as being mapped, you
should check your settings.
The bar plot shows the amount of enrichment for the pathways
identified as being significant. A larger enrichment score indicates for
a pathway indicates that genes are found in the list of gene names
more than you would expect by chance. However, the
pathways with the largest enrichment are not necessarily the most
significant.

The table output shows details of the most over-represented pathways.
Clicking on a pathway name in the left-hand column gives more
information on the genes belonging to that pathway - including the names
of genes in that pathway that were found in the list of genes. The
Expect and Ratio columns indicate how
many genes in a pathway that are expected to be found in the
uploaded gene list, and how many more times genes in the pathway
actually occur in the gene list. All columns in the table can
be sorted.

Exercise: Use WebGestalt to find enriched pathways
in the Basal pregnant vs lactation analysis and take some time to
understand the results.
Threshold-free analysis
This type of analysis is popular for datasets where differential
expression analysis does not reveal many genes that are
differentially-expressed on their own. Instead, it seeks to identify
genes that as a group have a tendency to be near the extremes of the
log-fold changes. The results are typically presented in the following
way.

The “barcode”-like panel represents where genes from a particular
pathway (HALLMARK_E2F_TARGETS in this case) are located
in a gene list ranked from most up-regulated to most
down-regulated. The peak in the green curve is used to indicate where
the majority of genes are located. If this is shifted to the left or the
right it indicates that genes belonging to this gene set have a tendency
to be up- or down-regulated. The set of genes for a given pathway that
contribute most to the enrichment are called the leading
edge.
One reason for the popularity of this method is that it does not rely
on having to impose arbitrary cut-offs on the data. Instead, we need to
provide a measure of the importance of each gene such as it’s
fold-change. These are then used the rank the genes.
The Broad institute has made this analysis method popular and
provides a
version of GSEA that can be run via a java application. However, the
application can be a bit fiddly to run, so we will use the Webgestalt
website again
https://www.webgestalt.org/#
- Open the file
background.csv
in Excel and delete all
columns except the SYMBOL
and basal.lactation
column. 
- Go to the Webgestalt website, and select GSEA Sample
Run from the front page
- Check that Organism of interest is
Mus musculus
- Make sure Method of interest is set to
Gene Set Enrichment Analysis (GSEA)
- Select Functional Database as
geneontology
- feel free to try other databases if you have time
- Make sure that Select Gene ID Type is
Gene symbol
- Paste the contents of your modified excel file into the text box
under Upload Gene List.
- Click Submit
The results are presented in a similar way to the ORA from the
previous section. However, the enrichment scores presented can either be
positive or negative - indicating that genes from a given pathway tend
to up- or down-regulated. Selecting a pathway from the Table of results
or bar chart will given information about the enrichment of the pathway
and the leading genes (set of genes in the pathway responsible
for the enrichment).

Exercise: Use Webgestalt to identify enriched
pathways in the Basal Pregnant vs Lactation contrast. Compare the
results from the most extreme positive and negative enrichment score,
and make sure that you can interpret corresponding the barcode
plots.
If the GSEA analysis is taking too long, please use this link to view
some results from the same dataset
LS0tCnRpdGxlOiAiT250b2xvZ2llcyBhbmQgRW5yaWNobWVudCIKYXV0aG9yOiAiTWFyayBEdW5uaW5nIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICJMYXN0IG1vZGlmaWVkOiAlZCAlYiAlWSIpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY3NzOiBzdHlsZXNoZWV0cy9zdHlsZXMuY3NzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KbGlicmFyeShsaW1tYSkKYGBgCgojIFJlY2FwCgpJbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBmaWxlcwoKLSBbYGJhY2tncm91bmQuY3N2YF0oYmFja2dyb3VuZC5jc3YpIGNvbnRhaW5pbmcgb25lIHJvdyBmb3IgZWFjaCBnZW5lIGluIHRoZSBjb21wYXJpc29uIEJhc2FsLnByZWduYW50IHZzIEJhc2FsLmxhY3RhdGlvbiAoMjcsMTc5IHJvd3MpLgotIFtgQi5wcmVnX3ZzX2xhY3RhdGlvbi5jc3ZgXShCLnByZWdfdnNfbGFjdGF0aW9uLmNzdikgY29udGFpbmluZyBvbmUgcm93IGZvciBlYWNoIGZvdW5kIHRvIGJlIERFIGluIHRoZSBjb250cmFzdCBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5MYWN0YXRpb24uCgpJdCB3aWxsIGJlIGhlbHBmdWwgdG8gaGF2ZSBib3RoIHRoZXNlIGZpbGVzIG9wZW4gaW4gRXhjZWwuCgojIEVucmljaG1lbnQgYW5kIFBhdGh3YXlzIEFuYWx5c2lzCgpUaGUgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gc3RlcCBpcyBjb25jZXJuZWQgd2l0aCBiZWluZyBhYmxlIHRvIHNheSB3aXRoIGNvbmZpZGVuY2Ugd2hldGhlciBhbiBpbmRpdmlkdWFsIGdlbmUgaGFzIGEgZGlmZmVyZW50IGxldmVsIG9mIGV4cHJlc3Npb24gYmV0d2VlbiBiaW9sb2dpY2FsIGdyb3Vwcy4gSG93ZXZlciwgaW4gdGhpcyBzZWN0aW9uIHdlIG1vdmUgdG93YXJkcyBkaXNjb3ZlcmluZyBpZiBvdXIgcmVzdWx0cyBhcmUgKioqYmlvbG9naWNhbGx5IHNpZ25pZmljYW50KioqLiBBcmUgdGhlIGdlbmVzIHRoYXQgd2UgaGF2ZSBwaWNrZWQgc3RhdGlzdGljYWwgZmx1a2VzLCBvciBhcmUgdGhlcmUgc29tZSBjb21tb25hbGl0aWVzPwoKSXQgY2FuIGJlIGluZm9ybWF0aXZlIHRvIHNjYW4gKG1hbnVhbGx5KSB0aHJvdWdoIHRoZSBnZW5lIGxpc3RzIHdlIGdlbmVyYXRlIHRocm91Z2ggRGVndXN0IGFuZCB1c2Ugb3VyIEJpb2xvZ2ljYWwgaW50dWl0aW9uIHRvIGxvb2sgZm9yIHRoZW1lcy4gV2UgbWlnaHQgYWxzbyBsb29rIGZvciBwcmV2aW91c2x5LXB1Ymxpc2hlZCBnZW5lcywgb3IgZ2VuZXMgdGhhdCB3ZSBoYXZlIGludGVudGlvbmFsbHktbWFuaXB1bGF0ZWQgKGUuZy4gYnkga25vY2tpbmctb3V0IHRoYXQgZ2VuZSkuIEhvd2V2ZXIsIHNvbWV0aW1lcyB3ZSBjYW4gbWlzbGVhZCBvdXJzZWx2ZXMgaW50byB0aGlua2luZyBvdXIgcmVzdWx0cyBhcmUgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZXkgcmVhbGx5IGFyZS4KCkluIG9yZGVyIHRvIGluZmVyIGJpb2xvZ2ljYWwgc2lnbmlmaWNhbmNlIGZyb20gb3VyIGRhdGEsIHdlIG5lZWQgc29tZSB3YXkgb2YgYmVpbmcgYWJsZSB0byBncm91cCBnZW5lcyB0b2dldGhlciBiYXNlZCBvbiB0aGVpciBmdW5jdGlvbi4gVGhlIHR3byBtYWluIHNvdXJjZXMgb2YgdGhlc2UgYXJlOi0KCgotIFtHZW5lIE9udG9sb2d5XShodHRwOi8vZ2VuZW9udG9sb2d5Lm9yZy8pCi0gW0tFR0ddKGh0dHBzOi8vd3d3Lmdlbm9tZS5qcC9rZWdnL2tlZ2cxYS5odG1sKQoKClRoZSBHTyBkYXRhYmFzZSBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2V0cyBvZiBnZW5lcyBpbiBhIHRyZWUtbGlrZSBzdHJ1Y3R1cmUgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdC1nZW5lcmFsIGJpb2xvZ2ljYWwgZGVmaW5pdGlvbiB0byBpbmNyZWFzaW5nbHkgc3BlY2lmaWMgY2FzZXMuCgohW10oaHR0cDovL2dlbmVvbnRvbG9neS5vcmcvYXNzZXRzL2hleG9zZS1iaW9zeW50aGV0aWMtcHJvY2Vzcy5wbmcpCgpUaGUgb250b2xvZ2llcyBhcmUgc3BsaXQgaW50byB0aHJlZSBjYXRlZ29yaWVzCgotICgqKk1GKiopIE1vbGVjdWxhciBGdW5jdGlvbjogdGhlIG1vbGVjdWxhciBhY3Rpdml0aWVzIG9mIGluZGl2aWR1YWwgZ2VuZSBwcm9kdWN0cwotICgqKkNDKiopIENlbGx1bGFyIENvbXBvbmVudDogd2hlcmUgdGhlIGdlbmUgcHJvZHVjdHMgYXJlIGFjdGl2ZQotICgqKkJQKiopIEJpb2xvZ2ljYWwgUHJvY2VzczogdGhlIHBhdGh3YXlzIGFuZCBsYXJnZXIgcHJvY2Vzc2VzIHRvIHdoaWNoIHRoYXQgZ2VuZSBwcm9kdWN04oCZcyBhY3Rpdml0eSBjb250cmlidXRlcwoKVGhlIEtFR0cgZGF0YWJhc2UgYWxzbyBkZWZpbmVzIHNldHMgb2YgZ2VuZXMuIFRoZXJlIGlzIG5vIGRlZmluZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gS0VHRyBwYXRod2F5cy4gVGhlcmUgaXMgaG93ZXZlciBhIGNvbXBsZXggbmV0d29yayBiZXR3ZWVuIGdlbmVzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBwYXRod2F5IHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIEdPLgoKLSBbZS5nLiBQYXRod2F5cyBpbiBjYW5jZXJdKGh0dHBzOi8vd3d3Lmdlbm9tZS5qcC9rZWdnLWJpbi9zaG93X3BhdGh3YXk/aHNhMDUyMDApCgpUaGUgY2hvaWNlIG9mIGRhdGFiYXNlIGRvZXMgbm90IGFjdHVhbGx5IGFmZmVjdCBob3cgdGhlIHN0YXRpc3RpY2FsIHRlc3Rpbmcgd29ya3MuIFdlIHRlc3Qgb2Ygc2lnbmlmaWNhbnQgY29sbGVjdGlvbnMgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGNvbGxlY3Rpb25zIGhhdmUgYmVlbiBkZWZpbmVkLgoKClRoZSAiY2VsbCBjeWNsZSBwcm9jZXNzIiBHZW5lIE9udG9sb2d5IGhhcyBtYW55IGh1bmRyZWRzIG9mIGdlbmVzIGJlbG9uZ2luZyB0byBpdC4gSWYgd2Ugd2VyZSB0byBwaWNrIGEgc2V0IG9mIGdlbmVzICoqYXQgcmFuZG9tKiogb2YgZXF1aXZhbGVudCBzaXplIGFzIG91ciBsaXN0IG9mIGRpZmZlcmVudGlhbGx5LWV4cHJlc3NlZCBnZW5lcyAqKndlIHNob3VsZCBub3QgYmUgc3VycHJpc2VkKiogdG8gc2VlIGEgbG90IG9mIGNlbGwtY3ljbGUgZ2VuZXMgYXBwZWFyaW5nIGluIHRoZSBsaXN0LiBUaGlzIGlzIGp1c3QgZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UgaGFkIGEgbG90IG9mIHBvc3NpYmxlIGNlbGwtY3ljbGUgZ2VuZXMgdG8gY2hvb3NlIGZyb20uIFRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgbnVtYmVyIG9mIGNlbGwtY3ljbGUgKG9yIGFueSBvdGhlciBwYXRod2F5KSBpcyAqbW9yZSB0aGFuIHdlIHdvdWxkIGV4cGVjdCBieSBjaGFuY2UqLgoKCkluIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIGZpbGVzCgotICAgW2BiYWNrZ3JvdW5kLmNzdmBdKGJhY2tncm91bmQuY3N2KSBjb250YWluaW5nIG9uZSByb3cgZm9yIGVhY2ggZ2VuZSBpbiB0aGUgY29tcGFyaXNvbiBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5sYWN0YXRpb24gKDI3LDE3OSByb3dzKS4KLSAgIFtgQi5wcmVnX3ZzX2xhY3RhdGlvbi5jc3ZgXShCLnByZWdfdnNfbGFjdGF0aW9uLmNzdikgY29udGFpbmluZyBvbmUgcm93IGZvciBlYWNoIGZvdW5kIHRvIGJlIERFIGluIHRoZSBjb250cmFzdCBCYXNhbC5wcmVnbmFudCB2cyBCYXNhbC5MYWN0YXRpb24uCgpJdCB3aWxsIGJlIGhlbHBmdWwgdG8gaGF2ZSBib3RoIHRoZXNlIGZpbGVzIG9wZW4gaW4gRXhjZWwuCgoKClRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgb25lIG1pZ2h0IHVzZSwgYW5kIHdlIHdpbGwgY292ZXIgdGhlIHRoZW9yeSBiZWhpbmQgYm90aC4gVGhlIGRpc3RpbmN0aW9uIGlzIHdoZXRoZXIgeW91IGFyZSBoYXBweSB0byB1c2UgYSBoYXJkIChhbmQgYXJiaXRyYXJ5KSB0aHJlc2hvbGQgdG8gaWRlbnRpZnkgREUgZ2VuZXMuCgojIyBPdmVyLXJlcHJlc2VudGF0aW9uIGFuYWx5c2lzIChPUkEpCgoiVGhyZXNob2xkLWJhc2VkIiBtZXRob2RzIHJlcXVpcmUgZGVmaW5pdGlvbiBvZiBhIHN0YXRpc3RpY2FsIHRocmVzaG9sZCB0byBkZWZpbmUgbGlzdCBvZiBnZW5lcyB0byB0ZXN0IChlLmcuIEZEUiBcPCAwLjAxKS4gVGhlbiBhICpoeXBlcmdlb21ldHJpYyogdGVzdCBvciAqRmlzaGVyJ3MgRXhhY3QqIHRlc3QgaXMgZ2VuZXJhbGx5IHVzZWQuIFRoZXNlIG1ldGhvZHMgcmVxdWlyZSBwbGVudHkgb2YgREUgZ2VuZXMgYXMgYW4gaW5wdXQsIHNvIHBlb3BsZSBvZnRlbiB1c2UgbW9yZS1yZWxheGVkIGNyaXRlcmlhIGZvciBpZGVudGlmeWluZyBERSBnZW5lcyAoZS5nLiByYXcgcmF0aGVyIHRoYW4gYWRqdXN0ZWQgcC12YWx1ZXMgb3IgRkRSIHZhbHVlIGJ1dCBpbiBjb25qdWN0aW9uIHdpdGggYSBmb2xkLWNoYW5nZSBjdXQtb2ZmKQoKVGhlIHF1ZXN0aW9uIHdlIGFyZSBhc2tpbmcgaGVyZSBpczsKCj4gKioqIkFyZSB0aGUgbnVtYmVyIG9mIERFIGdlbmVzIGFzc29jaWF0ZWQgd2l0aCBHZW5lIFNldCBYIHNpZ25pZmljYW50bHkgZ3JlYXRlciB0aGFuIHdoYXQgd2UgbWlnaHQgZXhwZWN0IGJ5IGNoYW5jZSBhbG9uZT8iKioqCgpXZSBjYW4gYW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkga25vd2luZwoKLSAgIHRoZSB0b3RhbCBudW1iZXIgb2YgREUgZ2VuZXMKLSAgIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0IChwYXRod2F5IG9yIHByb2Nlc3MpCi0gICB0aGUgbnVtYmVyIG9mIGdlbmVzIGluIHRoZSBnZW5lIHNldCB0aGF0IGFyZSBmb3VuZCB0byBiZSBERQotICAgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0ZWQgZ2VuZXMgKGJhY2tncm91bmQpCgpZb3Ugd2lsbCBuZXZlciBuZWVkIHRvIGtub3cgdGhpcywgYnV0IGZvciB0aG9zZSBpbnRlcmVzdGVkICB0aGUgZm9ybXVsYSBmb3IgRmlzaGVycyBleGFjdCB0ZXN0IGlzOwoKJCQgcCA9IFxmcmFje1xiaW5vbXthICsgYn17YX1cYmlub217YyArZH17Y319e1xiaW5vbXtufXthICtjfX0gPSBcZnJhY3soYStiKSEoYytkKSEoYStjKSEoYitkKSF9e2EhYiFjIWQhbiF9ICQkCgp3aXRoOi0KCnwgKipEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQqKiB8ICoqTm90IERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCoqIHwgKipUb3RhbCoqIHwgICAgICAgICAgICAgICAgICAgICAgICB8Cnw6LS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLTp8CnwgICAgICAgICBJbiBHZW5lIFNldCAgICAgICAgICB8ICAgICAgICAgICAgICAgIGEgICAgICAgICAgICAgICAgIHwgICAgIGIgICAgIHwgICAgICAgICBhICsgYiAgICAgICAgICB8CnwgICAgICAgTm90IGluIEdlbmUgU2V0ICAgICAgICB8ICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAgIHwgICAgIGQgICAgIHwgICAgICAgICBjICsgZCAgICAgICAgICB8CnwgICAgICAgICAgKipUb3RhbCoqICAgICAgICAgICB8ICAgICAgICAgICAgKiphICsgYyoqICAgICAgICAgICAgIHwgKipiICtkKiogIHwgKiphICsgYiArIGMgKyBkICg9bikqKiB8CgoKQXMgYSB3b3JrZWQgZXhhbXBsZSwgY29uc2lkZXIgYSBHZW5lIFNldCB3aXRoICoqNjM0KiogZ2VuZXMuIEFmdGVyIHBlcmZvcm1pbmcgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24sIHdlIGZpbmQgdGhhdCBvdXIgbGlzdCBvZiBkaWZmZXJlbnRpYWxseS1leHByZXNzZWQgZ2VuZXMgY29tcHJpc2VzICoqNDU5NSoqIGdlbmVzLiBBbW9uZ3N0IHRoaXMgZ2VuZSBsaXN0LCAqKjIzMyoqIGJlbG9uZyB0byBvdXIgR2VuZSBTZXQuIFBsdWdnaW5nLWluIHRoZSBudW1iZXJzIHdlIGdldDotCgoKCnwgICAgICAgICAgICAgICAgIHwgRGlmZmVyZW50aWFsbHkgRXhwcmVzc2VkIHwgTm90IERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCB8CnwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgSW4gR2VuZSBTZXQgICAgIHwgMjMzICAgICAgICAgICAgICAgICAgICAgIHwgMzg4ICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgTm90IGluIEdlbmUgU2V0IHwgNDM2MiAgICAgICAgICAgICAgICAgICAgIHwgMjIxOTYgICAgICAgICAgICAgICAgICAgICAgICB8CgoKV2hpY2ggeWllbGRzIGEgKipzaWduaWZpY2FudCBwLXZhbHVlKiogd2l0aCBhIEZpc2hlcnMnIHRlc3QuCgpBbm90aGVyIHdheSBvZiB0aGlua2luZyBhYm91dCB0aGlzIGlzIHRvICpyYW5kb21seSogcGljayBhIHNldCBvZiAqKjQ1OTUqKiBnZW5lcyAoaS5lLiB3aXRob3V0IHVzaW5nIGEgcC12YWx1ZSBjdXQtb2ZmKSBhbmQgc2VlIGhvdyBtYW55IGJlbG9uZyB0byBvdXIgZ2VuZSBzZXQuCgoKVGhlIGZpcnN0IHRpbWUgd2UgZG8gdGhpcywgd2UgZ2V0ICoqMTAwKiogZ2VuZXMgaW4gb3VyIHNldC4gVGhlIHNlY29uZCB0aW1lIHdlIGdldCAqKjExMioqIGFuZCBzbyBvbi4uLgoKSWYgd2UgcmVwZWF0IGVub3VnaCB0aW1lIHdlIGNhbiBtYWtlIGEgaGlzdG9ncmFtOi0KCiFbXShtZWRpYS9nZW5lc2V0X3JhbmRvbUhpc3QucG5nKQoKV2Ugc2VlIHRoYXQgYSB2YWx1ZSBvZiAyMzMgaXMgZXh0cmVtZWx5IHVubGlrZWx5LiBJbiBvdGhlciB3b3JkcywgdXNpbmcgb3VyIHAtdmFsdWUgY3V0LW9mZiB0byBnZW5lcmF0ZSBvdXIgZ2VuZSBsaXN0IGhhcyByZXN1bHRlZCBpbiBhYm91dCAqKnR3aWNlIGFzIG1hbnkgb2Ygb3VyIGdlbmUgc2V0IHRoYW4gd2Ugd291bGQgZXhwZWN0IGJ5IGNoYW5jZSoqCgotIFtSIHNjcmlwdCBmb3IgdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZC4uLl0oc2FtcGxlX2dlbmVzZXQuUikKCiMjIFVzaW5nIFdlYkdlc3RhbHQgZm9yIE9SQQoKPGRpdiBjbGFzcz0iaW5mb3JtYXRpb24iPgoqKk4uQi4qKiBQcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgY291cnNlIHVzZWQgdGhlIHdlYnNpdGUgR09yaWxsYSBmb3IgdGhpcyBzZWN0aW9uLiBIb3dldmVyLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoaXMgc2l0ZSBubyBsb25nZXIgc2VlbXMgdG8gYmUgd29ya2luZy4gV2UgaGF2ZSBzd2l0Y2hlZCB0byB1c2luZyBXZWJHZXN0YWx0IHdoaWNoIGNhbiBwZXJmb3JtIHRoZSBzYW1lIHN0YXRpc3RpY2FsIHRlc3RzIGFzIEdPcmlsbGEgYW5kIGhhcyBhIG5pY2VyIGludGVyZmFjZS4KPC9kaXY+CgpUaGVyZSBhcmUgc2V2ZXJhbCBwb3B1bGFyIG9ubGluZSB0b29scyBmb3IgcGVyZm9ybWluZyBlbnJpY2htZW50IGFuYWx5c2lzIFdlIHdpbGwgYmUgdXNpbmcgdGhlIG9ubGluZSB0b29sIFtXZWJHZXN0YWx0XShodHRwczovL3d3dy53ZWJnZXN0YWx0Lm9yZy8pIHRvIHBlcmZvcm0gdGhlIHBhdGh3YXlzIGFuYWx5c2lzLiBJdCBzdXBwb3J0cyB2YXJpb3VzIHR5cGVzIG9mIGFuYWx5c2VzOyB0aGUgZmlyc3Qgb2Ygd2hpY2ggYWNjZXB0cyBhIGxpc3Qgb2YgcHJlLXNlbGVjdGVkIGdlbmVzIHRvIHBlcmZvcm0gYW4gKk9SQSouCgoxLiAgR28gdG8gPGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnLyM+CjIuICBDaG9vc2UgdGhlICoqT1JBIFNhbXBsZSBSdW4qKiBUYWIKCiFbXShtZWRpYS93ZWJnZXN0YWx0XzEucG5nKQoKMy4gIENob29zZSBPcmdhbmlzbTogYE11cyBNdXNjdWx1c2AKNC4gIE1ha2Ugc3VyZSB0aGF0ICoqTWV0aG9kIG9mIGludGVyZXN0KiogaXMgc2V0IHRvIGBPdmVyLVJlcHJlc2VudGF0aW9uIEFuYWx5c2lzIChPUkEpYAo1LiAgU2VsZWN0ICoqRnVuY3Rpb25hbCBEYXRhYmFzZSoqIGBnZW5lb250b2xvZ3lgIGFuZCBgQmlvbG9naWNhbCBQcm9jZXNzIG5vbi1yZWR1bmRhbnRgCiAgKyB5b3UgY2FuIGNoYW5nZSB0aGlzIGxhdGVyIGlmIHlvdSB3aXNoCjYuICBLZWVwICoqU2VsZWN0IEdlbmUgSUQgVHlwZSoqIGFzIGBHZW5lIHN5bWJvbGAKNy4gIFBhc3RlIHRoZSBnZW5lIHN5bWJvbHMgY29ycmVzcG9uZGluZyB0byBERSBnZW5lcyBpbiAqQmFzYWwgcHJlZ25hbnQgdnMgQmFzYWwgTGFjdGF0aW9uKiBmcm9tIHlvdXIgRXhjZWwgc3ByZWFkc2hlZXQgaW50byB0aGUgVXBsb2FkIEdlbmUgTGlzdCBib3guCgotICAgKipUaGUgc2hvcnRjdXQgQ1RSTCArIFNQQUNFIHdpbGwgbGV0IHlvdSBzZWxlY3QgYW4gZW50aXJlIGNvbHVtbioqCi0gRG8gbm90IHBhc3RlIHRoZSBjb2x1bW4gaGVhZGluZyBgU1lNQk9MYAo4LiBJbiAqKlNlbGVjdCBSZWZlcmVuY2UgU2V0KiogbWFrZSBzdXJlICpnZW5vbWUgcHJvdGVpbi1jb2RpbmcqIGlzIHNlbGVjdGVkLgo5LiBVbmRlciAqKkFkdmFuY2VkIFBhcmFtZXRlcnMqKiwgbWFrZSBzdXJlIHRoYXQgdGhlICpGRFIqIG9wdGlvbiBpcyBzZWxlY3RlZCBhcyBTaWduaWZpY2FuY2Ugb3RoZXJ3aXNlIHlvdSB3aWxsIG9ubHkgZ2V0IHRoZSB0b3AgMTAgcGF0aHdheXMgcmVwb3J0ZWQuCjEwLiBDbGljayBTdWJtaXQKCgpUaGUgcGFnZSB0aGF0IGFwcGVhcnMgY2FuIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBhbmFseXNpcyBwZXJmb3JtZWQgKGkuZS4gdGhlIG51bWJlciBvZiBnZW5lcyB0aGF0IHdlcmUgdXNlZCBhcyBpbnB1dCBhbmQgaG93IG1hbnkgbmFtZXMgd2VyZSByZWNvZ25pc2VkIGFzIHZhbGlkIGdlbmUgbmFtZXMpIGFsb25nIHdpdGggdmFyaW91cyB2aXN1YWxpc2F0aW9ucy4gVGhlIHN1bW1hcnkgdGFiIGNhbiBiZSB1c2VmdWwgdG8gY2hlY2sgdGhhdCB5b3UgaGF2ZSBzdXBwbGllZCB0aGUgY29ycmVjdCBraW5kIG9mIElEcyAoZS5nLiBHZW5lIHN5bWJvbCB2cyBFbnNlbWJsLCBFbnRyZXopIGFuZCBzZWxlY3RlZCB0aGUgY29ycmVjdCBvcmdhbmlzbS4gSWYgZmV3IElEcyBhcmUgcmVwb3J0ZWQgYXMgYmVpbmcgbWFwcGVkLCB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgc2V0dGluZ3MuCgpUaGUgKmJhciBwbG90KiBzaG93cyB0aGUgYW1vdW50IG9mIGVucmljaG1lbnQgZm9yIHRoZSBwYXRod2F5cyBpZGVudGlmaWVkIGFzIGJlaW5nIHNpZ25pZmljYW50LiBBIGxhcmdlciBlbnJpY2htZW50IHNjb3JlIGluZGljYXRlcyBmb3IgYSBwYXRod2F5IGluZGljYXRlcyB0aGF0IGdlbmVzIGFyZSBmb3VuZCBpbiB0aGUgbGlzdCBvZiBnZW5lIG5hbWVzICoqbW9yZSB0aGFuIHlvdSB3b3VsZCBleHBlY3QgYnkgY2hhbmNlKiouIEhvd2V2ZXIsIHRoZSBwYXRod2F5cyB3aXRoIHRoZSBsYXJnZXN0IGVucmljaG1lbnQgYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgbW9zdCBzaWduaWZpY2FudC4KCiFbXShtZWRpYS93ZWJnZXN0YWx0XzIucG5nKQoKVGhlIHRhYmxlIG91dHB1dCBzaG93cyBkZXRhaWxzIG9mIHRoZSBtb3N0IG92ZXItcmVwcmVzZW50ZWQgcGF0aHdheXMuIENsaWNraW5nIG9uIGEgcGF0aHdheSBuYW1lIGluIHRoZSBsZWZ0LWhhbmQgY29sdW1uIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGdlbmVzIGJlbG9uZ2luZyB0byB0aGF0IHBhdGh3YXkgLSBpbmNsdWRpbmcgdGhlIG5hbWVzIG9mIGdlbmVzIGluIHRoYXQgcGF0aHdheSB0aGF0IHdlcmUgZm91bmQgaW4gdGhlIGxpc3Qgb2YgZ2VuZXMuIFRoZSAqKkV4cGVjdCoqIGFuZCAqKlJhdGlvKiogY29sdW1ucyBpbmRpY2F0ZSBob3cgbWFueSBnZW5lcyBpbiBhIHBhdGh3YXkgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBmb3VuZCBpbiB0aGUgdXBsb2FkZWQgZ2VuZSBsaXN0LCBhbmQgaG93IG1hbnkgbW9yZSB0aW1lcyBnZW5lcyBpbiB0aGUgcGF0aHdheSAqYWN0dWFsbHkgb2NjdXIqIGluIHRoZSBnZW5lIGxpc3QuIEFsbCBjb2x1bW5zIGluIHRoZSB0YWJsZSBjYW4gYmUgc29ydGVkLgoKIVtdKG1lZGlhL3dlYmdlc3RhbHRfMy5wbmcpCgoKOjo6IGV4ZXJjaXNlCioqRXhlcmNpc2U6KiogVXNlIFdlYkdlc3RhbHQgdG8gZmluZCBlbnJpY2hlZCBwYXRod2F5cyBpbiB0aGUgQmFzYWwgcHJlZ25hbnQgdnMgbGFjdGF0aW9uIGFuYWx5c2lzIGFuZCB0YWtlIHNvbWUgdGltZSB0byB1bmRlcnN0YW5kIHRoZSByZXN1bHRzLgo6OjoKCgoKIyMgVGhyZXNob2xkLWZyZWUgYW5hbHlzaXMKClRoaXMgdHlwZSBvZiBhbmFseXNpcyBpcyBwb3B1bGFyIGZvciBkYXRhc2V0cyB3aGVyZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBkb2VzIG5vdCByZXZlYWwgbWFueSBnZW5lcyB0aGF0IGFyZSBkaWZmZXJlbnRpYWxseS1leHByZXNzZWQgb24gdGhlaXIgb3duLiBJbnN0ZWFkLCBpdCBzZWVrcyB0byBpZGVudGlmeSBnZW5lcyB0aGF0IGFzIGEgZ3JvdXAgaGF2ZSBhIHRlbmRlbmN5IHRvIGJlIG5lYXIgdGhlIGV4dHJlbWVzIG9mIHRoZSBsb2ctZm9sZCBjaGFuZ2VzLiBUaGUgcmVzdWx0cyBhcmUgdHlwaWNhbGx5IHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4KCiFbXShtZWRpYS9vdmVyZXhwcmVzc2VkLWdzZWEucG5nKQoKVGhlICJiYXJjb2RlIi1saWtlIHBhbmVsIHJlcHJlc2VudHMgd2hlcmUgZ2VuZXMgZnJvbSBhIHBhcnRpY3VsYXIgcGF0aHdheSAoKipIQUxMTUFSS19FMkZfVEFSR0VUUyoqIGluIHRoaXMgY2FzZSkgYXJlIGxvY2F0ZWQgaW4gYSBnZW5lIGxpc3QgKnJhbmtlZCogZnJvbSBtb3N0IHVwLXJlZ3VsYXRlZCB0byBtb3N0IGRvd24tcmVndWxhdGVkLiBUaGUgcGVhayBpbiB0aGUgZ3JlZW4gY3VydmUgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgZ2VuZXMgYXJlIGxvY2F0ZWQuIElmIHRoaXMgaXMgc2hpZnRlZCB0byB0aGUgbGVmdCBvciB0aGUgcmlnaHQgaXQgaW5kaWNhdGVzIHRoYXQgZ2VuZXMgYmVsb25naW5nIHRvIHRoaXMgZ2VuZSBzZXQgaGF2ZSBhIHRlbmRlbmN5IHRvIGJlIHVwLSBvciBkb3duLXJlZ3VsYXRlZC4gVGhlIHNldCBvZiBnZW5lcyBmb3IgYSBnaXZlbiBwYXRod2F5IHRoYXQgY29udHJpYnV0ZSBtb3N0IHRvIHRoZSBlbnJpY2htZW50IGFyZSBjYWxsZWQgdGhlICoqbGVhZGluZyBlZGdlKiouCgpPbmUgcmVhc29uIGZvciB0aGUgcG9wdWxhcml0eSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IGl0IGRvZXMgbm90IHJlbHkgb24gaGF2aW5nIHRvIGltcG9zZSBhcmJpdHJhcnkgY3V0LW9mZnMgb24gdGhlIGRhdGEuIEluc3RlYWQsIHdlIG5lZWQgdG8gcHJvdmlkZSBhIG1lYXN1cmUgb2YgdGhlIGltcG9ydGFuY2Ugb2YgZWFjaCBnZW5lIHN1Y2ggYXMgaXQncyBmb2xkLWNoYW5nZS4gVGhlc2UgYXJlIHRoZW4gdXNlZCB0aGUgcmFuayB0aGUgZ2VuZXMuCgpUaGUgQnJvYWQgaW5zdGl0dXRlIGhhcyBtYWRlIHRoaXMgYW5hbHlzaXMgbWV0aG9kIHBvcHVsYXIgYW5kIHByb3ZpZGVzIFthIHZlcnNpb24gb2YgR1NFQV0oaHR0cDovL3NvZnR3YXJlLmJyb2FkaW5zdGl0dXRlLm9yZy9nc2VhL2luZGV4LmpzcCkgdGhhdCBjYW4gYmUgcnVuIHZpYSBhIGphdmEgYXBwbGljYXRpb24uIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBjYW4gYmUgYSBiaXQgZmlkZGx5IHRvIHJ1biwgc28gd2Ugd2lsbCB1c2UgdGhlIFdlYmdlc3RhbHQgd2Vic2l0ZSBhZ2FpbgoKPGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnLyM+CgotICAgT3BlbiB0aGUgZmlsZSBgYmFja2dyb3VuZC5jc3ZgIGluIEV4Y2VsIGFuZCBkZWxldGUgYWxsIGNvbHVtbnMgZXhjZXB0IHRoZSBgU1lNQk9MYCBhbmQgYGJhc2FsLmxhY3RhdGlvbmAgY29sdW1uLiA8aW1nIHNyYz0ibWVkaWEvd2ViZ2VzdGFsdF80LnBuZyIvPgotICAgR28gdG8gdGhlIFdlYmdlc3RhbHQgd2Vic2l0ZSwgYW5kIHNlbGVjdCAqKkdTRUEgU2FtcGxlIFJ1bioqIGZyb20gdGhlIGZyb250IHBhZ2UKLSAgIENoZWNrIHRoYXQgKipPcmdhbmlzbSBvZiBpbnRlcmVzdCoqIGlzIGBNdXMgbXVzY3VsdXNgCi0gICBNYWtlIHN1cmUgKipNZXRob2Qgb2YgaW50ZXJlc3QqKiBpcyBzZXQgdG8gYEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpYAotICBTZWxlY3QgKipGdW5jdGlvbmFsIERhdGFiYXNlKiogYXMgYGdlbmVvbnRvbG9neWAKICAgICsgZmVlbCBmcmVlIHRvIHRyeSBvdGhlciBkYXRhYmFzZXMgaWYgeW91IGhhdmUgdGltZQotICBNYWtlIHN1cmUgdGhhdCAqKlNlbGVjdCBHZW5lIElEIFR5cGUqKiBpcyBgR2VuZSBzeW1ib2xgIAotICAgUGFzdGUgdGhlIGNvbnRlbnRzIG9mIHlvdXIgbW9kaWZpZWQgZXhjZWwgZmlsZSBpbnRvIHRoZSB0ZXh0IGJveCB1bmRlciAqKlVwbG9hZCBHZW5lIExpc3QqKi4gCjxkaXYgY2xhc3MgPSJpbmZvcm1hdGlvbiI+CkRvIG5vdCBwYXN0ZSB0aGUgaGVhZGVyIGxpbmUgb2YgKipTWU1CT0wqKiBhbmQgKipiYXNhbC5sYWN0YXRpb24qKiBpbnRvIHRoZSBib3gKPC9kaXY+Ci0gICBDbGljayAqKlN1Ym1pdCoqCgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CklmIHRoZSBHU0VBIGFuYWx5c2lzIGlzIHRha2luZyB0b28gbG9uZywgeW91IG1pZ2h0IGJlIGFibGUgdG8gc3BlbmQgdXAgdGhlIHByb2Nlc3MgYnkgY2hvb3NpbmcgS0VHRyBwYXRod2F5cyBhcyB0aGUgZGF0YWJhc2Ugb2YgY2hvaWNlIGFuZCAvIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwZXJtdXRhdGlvbnMgaW4gdGhlIEFkdmFuY2VkIFBhcmFtZXRlcnMgdGFiCjwvZGl2PgoKVGhlIHJlc3VsdHMgYXJlIHByZXNlbnRlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBPUkEgZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbi4gSG93ZXZlciwgdGhlIGVucmljaG1lbnQgc2NvcmVzIHByZXNlbnRlZCBjYW4gZWl0aGVyIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIC0gaW5kaWNhdGluZyB0aGF0IGdlbmVzIGZyb20gYSBnaXZlbiBwYXRod2F5IHRlbmQgdG8gdXAtIG9yIGRvd24tcmVndWxhdGVkLiBTZWxlY3RpbmcgYSBwYXRod2F5IGZyb20gdGhlIFRhYmxlIG9mIHJlc3VsdHMgb3IgYmFyIGNoYXJ0IHdpbGwgZ2l2ZW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVucmljaG1lbnQgb2YgdGhlIHBhdGh3YXkgYW5kIHRoZSAqbGVhZGluZyBnZW5lcyogKHNldCBvZiBnZW5lcyBpbiB0aGUgcGF0aHdheSByZXNwb25zaWJsZSBmb3IgdGhlIGVucmljaG1lbnQpLgoKCjxpbWcgc3JjPSJtZWRpYS93ZWJnZXN0YWx0XzUucG5nIi8+CgoKCjo6OiBleGVyY2lzZQoqKkV4ZXJjaXNlOioqIFVzZSBXZWJnZXN0YWx0IHRvIGlkZW50aWZ5IGVucmljaGVkIHBhdGh3YXlzIGluIHRoZSBCYXNhbCBQcmVnbmFudCB2cyBMYWN0YXRpb24gY29udHJhc3QuIENvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSB0aGUgbW9zdCBleHRyZW1lIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlbnJpY2htZW50IHNjb3JlLCBhbmQgbWFrZSBzdXJlIHRoYXQgeW91IGNhbiBpbnRlcnByZXQgY29ycmVzcG9uZGluZyB0aGUgYmFyY29kZSBwbG90cy4KOjo6CgpJZiB0aGUgR1NFQSBhbmFseXNpcyBpcyB0YWtpbmcgdG9vIGxvbmcsIHBsZWFzZSB1c2UgdGhpcyBsaW5rIHRvIHZpZXcgc29tZSByZXN1bHRzIGZyb20gdGhlIHNhbWUgZGF0YXNldAoKLSBbUHJlLWdlbmVyYXRlZCBHU0VBIHJlc3VsdHNdKGh0dHBzOi8vd3d3LndlYmdlc3RhbHQub3JnL3Jlc3VsdHMvMTcwNzA1NDEyMy8jKQoKIyBBbHRlcm5hdGl2ZSB3ZWItc2l0ZXMKClRoZSBwZXJmb3JtYW5jZSBvZiBXZWJHZXN0YWx0IGNhbiBiZSBhIGJpdCB2YXJpYWJsZS4gSGVyZSBhcmUgYSBjb3VwbGUgb2Ygc3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIHdlYnNpdGVzIHRoYXQgd29yayBpbiBhIHNpbWlsYXIgZmFzaGlvbiBhbmQgcmVxdWlyZSB0aGUgc2FtZSBkYXRhIGlucHV0CgotIFtTaGlueUdPXShodHRwOi8vYmlvaW5mb3JtYXRpY3Muc2RzdGF0ZS5lZHUvZ28vKSwgZm9yICoqT3Zlci1yZXByZXNlbnRhdGlvbiBhbmFseXNpcyoqIG9ubHkKLSBbR2VuZVRyYWlsXShodHRwczovL2dlbmV0cmFpbC5iaW9pbmYudW5pLXNiLmRlL2luZGV4P3BpcGVsaW5lPWdlbmUpLCBmb3IgYm90aCBPdmVyLXJlcHJlc2VudGF0aW9uIEFuYWx5c2lzIG9yIEdTRUEgZGVwZW5kaW5nIG9uIHR5cGUgb2YgaW5wdXQgZGF0YQoK