From 03a3b0d5a7546f8f4f001a965114e76e75b5da10 Mon Sep 17 00:00:00 2001 From: sjspielman <4701111+sjspielman@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:51:57 +0000 Subject: [PATCH] Live and rendered notebooks --- RNA-seq/02-gastric_cancer_tximeta.nb.html | 4 +- .../01-read_filter_normalize_scRNA-live.Rmd | 6 +- .../01-read_filter_normalize_scRNA.nb.html | 172 +++---- .../02-dataset_integration-live.Rmd | 46 +- .../02-dataset_integration.nb.html | 155 ++++--- .../03-differential_expression-live.Rmd | 11 +- .../03-differential_expression.nb.html | 136 +++--- .../04-gene_set_enrichment_analysis-live.Rmd | 281 ++++++++++++ .../04-gene_set_enrichment_analysis.nb.html | 221 +++++---- scRNA-seq-advanced/05-aucell-live.Rmd | 422 ++++++++++++++++++ scRNA-seq-advanced/05-aucell.nb.html | 277 +++++++----- .../04-dimension_reduction_scRNA-live.Rmd | 2 + .../04-dimension_reduction_scRNA.nb.html | 34 +- 13 files changed, 1291 insertions(+), 476 deletions(-) create mode 100644 scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd create mode 100644 scRNA-seq-advanced/05-aucell-live.Rmd diff --git a/RNA-seq/02-gastric_cancer_tximeta.nb.html b/RNA-seq/02-gastric_cancer_tximeta.nb.html index 5ad82e07..28d4cb37 100644 --- a/RNA-seq/02-gastric_cancer_tximeta.nb.html +++ b/RNA-seq/02-gastric_cancer_tximeta.nb.html @@ -3264,8 +3264,8 @@ <h2>Summarize to gene</h2> <pre class="r"><code># Summarize to the gene level gene_summarized <- summarizeToGene(txi_data)</code></pre> <!-- rnb-source-end --> -<!-- rnb-message-begin eyJkYXRhIjoibG9hZGluZyBleGlzdGluZyBFbnNEYiBjcmVhdGVkOiAyMDI0LTA4LTA4IDE2OjEwOjI3XG4ifQ== --> -<pre><code>loading existing EnsDb created: 2024-08-08 16:10:27</code></pre> +<!-- rnb-message-begin eyJkYXRhIjoibG9hZGluZyBleGlzdGluZyBFbnNEYiBjcmVhdGVkOiAyMDI0LTEyLTA0IDIwOjM1OjI1XG4ifQ== --> +<pre><code>loading existing EnsDb created: 2024-12-04 20:35:25</code></pre> <!-- rnb-message-end --> <!-- rnb-message-begin eyJkYXRhIjoib2J0YWluaW5nIHRyYW5zY3JpcHQtdG8tZ2VuZSBtYXBwaW5nIGZyb20gZGF0YWJhc2VcbiJ9 --> <pre><code>obtaining transcript-to-gene mapping from database</code></pre> diff --git a/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd b/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd index e5407a46..a8d4e0a3 100644 --- a/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd +++ b/scRNA-seq-advanced/01-read_filter_normalize_scRNA-live.Rmd @@ -90,9 +90,7 @@ Finally, we will set up the our output directory, creating it if it does not yet normalized_dir <- file.path(data_dir, "normalized") # create the directory if it does not exist -if (!dir.exists(normalized_dir)) { - dir.create(normalized_dir, recursive = TRUE) -} +fs::dir_create(normalized_dir) # output RDS file for normalized data output_sce_file <- file.path(normalized_dir, @@ -113,6 +111,8 @@ Some of these functions for other common data formats are discussed in [Chapter ```{r read SCE, live=TRUE} # read SCE from matrix directory + # ensure barcodes are set as column names in the SCE object + ``` Let's look at the contents of the object after reading it in: diff --git a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html index 98d9521c..facc84d3 100644 --- a/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html +++ b/scRNA-seq-advanced/01-read_filter_normalize_scRNA.nb.html @@ -3107,16 +3107,14 @@ <h3>Directories and files</h3> <!-- rnb-text-begin --> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgT3V0cHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCIiLCIjIERpcmVjdG9yeSBhbmQgZmlsZSB0byBzYXZlIG91dHB1dCIsIm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXCJub3JtYWxpemVkXCIpIiwiIiwiIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBleGlzdCIsImlmICghZGlyLmV4aXN0cyhub3JtYWxpemVkX2RpcikpIHtcbiAgZGlyLmNyZWF0ZShub3JtYWxpemVkX2RpciwgcmVjdXJzaXZlID0gVFJVRSlcbn0iLCIiLCIjIG91dHB1dCBSRFMgZmlsZSBmb3Igbm9ybWFsaXplZCBkYXRhIiwib3V0cHV0X3NjZV9maWxlIDwtIGZpbGUucGF0aChub3JtYWxpemVkX2RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnbGlvYmxhc3RvbWFfbm9ybWFsaXplZF9zY2UucmRzXCIpIl19 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgT3V0cHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCIiLCIjIERpcmVjdG9yeSBhbmQgZmlsZSB0byBzYXZlIG91dHB1dCIsIm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXCJub3JtYWxpemVkXCIpIiwiIiwiIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2VzIG5vdCBleGlzdCIsImZzOjpkaXJfY3JlYXRlKG5vcm1hbGl6ZWRfZGlyKSIsIiIsIiMgb3V0cHV0IFJEUyBmaWxlIGZvciBub3JtYWxpemVkIGRhdGEiLCJvdXRwdXRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKG5vcm1hbGl6ZWRfZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdsaW9ibGFzdG9tYV9ub3JtYWxpemVkX3NjZS5yZHNcIikiXX0= --> <pre class="r"><code># Outputs ------------------------------------ # Directory and file to save output normalized_dir <- file.path(data_dir, "normalized") # create the directory if it does not exist -if (!dir.exists(normalized_dir)) { - dir.create(normalized_dir, recursive = TRUE) -} +fs::dir_create(normalized_dir) # output RDS file for normalized data output_sce_file <- file.path(normalized_dir, @@ -3144,9 +3142,13 @@ <h2>Reading Cell Ranger data</h2> other common data formats are discussed in [Chapter 3 of OSCA] (<a href="http://bioconductor.org/books/3.16/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r" class="uri">http://bioconductor.org/books/3.16/OSCA.intro/getting-scrna-seq-datasets.html#reading-counts-into-r</a>).</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgcmVhZCBTQ0UgZnJvbSBtYXRyaXggZGlyZWN0b3J5IiwicmF3X3NjZSA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHMocmF3X21hdHJpeF9kaXIpIl19 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgcmVhZCBTQ0UgZnJvbSBtYXRyaXggZGlyZWN0b3J5IiwicmF3X3NjZSA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHMoXG4gIHJhd19tYXRyaXhfZGlyLCBcbiAgIyBlbnN1cmUgYmFyY29kZXMgYXJlIHNldCBhcyBjb2x1bW4gbmFtZXMgaW4gdGhlIFNDRSBvYmplY3RcbiAgY29sLm5hbWVzID0gVFJVRVxuKSJdfQ== --> <pre class="r"><code># read SCE from matrix directory -raw_sce <- DropletUtils::read10xCounts(raw_matrix_dir)</code></pre> +raw_sce <- DropletUtils::read10xCounts( + raw_matrix_dir, + # ensure barcodes are set as column names in the SCE object + col.names = TRUE +)</code></pre> <!-- rnb-source-end --> <!-- rnb-warning-begin eyJkYXRhIjoiV2FybmluZzogcmVwbGFjaW5nIHByZXZpb3VzIGltcG9ydCAnUzRBcnJheXM6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgYnlcbidEZWxheWVkQXJyYXk6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgd2hlbiBsb2FkaW5nICdIREY1QXJyYXknXG4ifQ== --> <pre><code>Warning: replacing previous import 'S4Arrays::makeNindexFromArrayViewport' by @@ -3161,7 +3163,7 @@ <h2>Reading Cell Ranger data</h2> <pre class="r"><code># view SCE object raw_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSA3MzQ0OTIgXG5tZXRhZGF0YSgxKTogU2FtcGxlc1xuYXNzYXlzKDEpOiBjb3VudHNcbnJvd25hbWVzKDM2NjAxKTogRU5TRzAwMDAwMjQzNDg1IEVOU0cwMDAwMDIzNzYxMyAuLi4gRU5TRzAwMDAwMjc4ODE3XG4gIEVOU0cwMDAwMDI3NzE5Nlxucm93RGF0YSBuYW1lcygzKTogSUQgU3ltYm9sIFR5cGVcbmNvbG5hbWVzOiBOVUxMXG5jb2xEYXRhIG5hbWVzKDIpOiBTYW1wbGUgQmFyY29kZVxucmVkdWNlZERpbU5hbWVzKDApOlxubWFpbkV4cE5hbWU6IE5VTExcbmFsdEV4cE5hbWVzKDApOlxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSA3MzQ0OTIgXG5tZXRhZGF0YSgxKTogU2FtcGxlc1xuYXNzYXlzKDEpOiBjb3VudHNcbnJvd25hbWVzKDM2NjAxKTogRU5TRzAwMDAwMjQzNDg1IEVOU0cwMDAwMDIzNzYxMyAuLi4gRU5TRzAwMDAwMjc4ODE3XG4gIEVOU0cwMDAwMDI3NzE5Nlxucm93RGF0YSBuYW1lcygzKTogSUQgU3ltYm9sIFR5cGVcbmNvbG5hbWVzKDczNDQ5Mik6IEFBQUNDQ0FBR0FBQUNDQ0EtMSBBQUFDQ0NBQUdBQUFUVENHLTEgLi4uXG4gIFRUVEdUVEdUQ1RUVENUQUctMSBUVFRHVFRHVENUVFRHQ0FULTFcbmNvbERhdGEgbmFtZXMoMik6IFNhbXBsZSBCYXJjb2RlXG5yZWR1Y2VkRGltTmFtZXMoMCk6XG5tYWluRXhwTmFtZTogTlVMTFxuYWx0RXhwTmFtZXMoMCk6XG4ifQ== --> <pre><code>class: SingleCellExperiment dim: 36601 734492 metadata(1): Samples @@ -3169,7 +3171,8 @@ <h2>Reading Cell Ranger data</h2> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(734492): AAACCCAAGAAACCCA-1 AAACCCAAGAAATTCG-1 ... + TTTGTTGTCTTTCTAG-1 TTTGTTGTCTTTGCAT-1 colData names(2): Sample Barcode reducedDimNames(0): mainExpName: NULL @@ -3251,16 +3254,16 @@ <h3>Structure of the <code>SingleCellExperiment</code> object</h3> <pre class="r"><code># view colData (cell barcodes) head(colData(raw_sce))</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggNiByb3dzIGFuZCAyIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgIFNhbXBsZSAgICAgICAgICAgIEJhcmNvZGVcbiAgICAgICAgICAgICA8Y2hhcmFjdGVyPiAgICAgICAgPGNoYXJhY3Rlcj5cbjEgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUFDQ0NBLTFcbjIgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUFUVENHLTFcbjMgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUNUR0FULTFcbjQgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUdBQUNHLTFcbjUgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUdDR0NULTFcbjYgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUdHQVRHLTFcbiJ9 --> +<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggNiByb3dzIGFuZCAyIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlICAgICAgICAgICAgQmFyY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNoYXJhY3Rlcj4gICAgICAgIDxjaGFyYWN0ZXI+XG5BQUFDQ0NBQUdBQUFDQ0NBLTEgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUFDQ0NBLTFcbkFBQUNDQ0FBR0FBQVRUQ0ctMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNDQ0FBR0FBQVRUQ0ctMVxuQUFBQ0NDQUFHQUFDVEdBVC0xIGRhdGEvZ2xpb2JsYXN0b21hLTEwLi4gQUFBQ0NDQUFHQUFDVEdBVC0xXG5BQUFDQ0NBQUdBQUdBQUNHLTEgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDQ0NBQUdBQUdBQUNHLTFcbkFBQUNDQ0FBR0FBR0NHQ1QtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNDQ0FBR0FBR0NHQ1QtMVxuQUFBQ0NDQUFHQUFHR0FURy0xIGRhdGEvZ2xpb2JsYXN0b21hLTEwLi4gQUFBQ0NDQUFHQUFHR0FURy0xXG4ifQ== --> <pre><code>DataFrame with 6 rows and 2 columns - Sample Barcode - <character> <character> -1 data/glioblastoma-10.. AAACCCAAGAAACCCA-1 -2 data/glioblastoma-10.. AAACCCAAGAAATTCG-1 -3 data/glioblastoma-10.. AAACCCAAGAACTGAT-1 -4 data/glioblastoma-10.. AAACCCAAGAAGAACG-1 -5 data/glioblastoma-10.. AAACCCAAGAAGCGCT-1 -6 data/glioblastoma-10.. AAACCCAAGAAGGATG-1</code></pre> + Sample Barcode + <character> <character> +AAACCCAAGAAACCCA-1 data/glioblastoma-10.. AAACCCAAGAAACCCA-1 +AAACCCAAGAAATTCG-1 data/glioblastoma-10.. AAACCCAAGAAATTCG-1 +AAACCCAAGAACTGAT-1 data/glioblastoma-10.. AAACCCAAGAACTGAT-1 +AAACCCAAGAAGAACG-1 data/glioblastoma-10.. AAACCCAAGAAGAACG-1 +AAACCCAAGAAGCGCT-1 data/glioblastoma-10.. AAACCCAAGAAGCGCT-1 +AAACCCAAGAAGGATG-1 data/glioblastoma-10.. AAACCCAAGAAGGATG-1</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3313,7 +3316,7 @@ <h3>Filtering empty droplets</h3> <!-- rnb-source-begin eyJkYXRhIjoicmF3X3NjZSJ9 --> <pre class="r"><code>raw_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSA0NjIwMjcgXG5tZXRhZGF0YSgxKTogU2FtcGxlc1xuYXNzYXlzKDEpOiBjb3VudHNcbnJvd25hbWVzKDM2NjAxKTogRU5TRzAwMDAwMjQzNDg1IEVOU0cwMDAwMDIzNzYxMyAuLi4gRU5TRzAwMDAwMjc4ODE3XG4gIEVOU0cwMDAwMDI3NzE5Nlxucm93RGF0YSBuYW1lcygzKTogSUQgU3ltYm9sIFR5cGVcbmNvbG5hbWVzOiBOVUxMXG5jb2xEYXRhIG5hbWVzKDIpOiBTYW1wbGUgQmFyY29kZVxucmVkdWNlZERpbU5hbWVzKDApOlxubWFpbkV4cE5hbWU6IE5VTExcbmFsdEV4cE5hbWVzKDApOlxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSA0NjIwMjcgXG5tZXRhZGF0YSgxKTogU2FtcGxlc1xuYXNzYXlzKDEpOiBjb3VudHNcbnJvd25hbWVzKDM2NjAxKTogRU5TRzAwMDAwMjQzNDg1IEVOU0cwMDAwMDIzNzYxMyAuLi4gRU5TRzAwMDAwMjc4ODE3XG4gIEVOU0cwMDAwMDI3NzE5Nlxucm93RGF0YSBuYW1lcygzKTogSUQgU3ltYm9sIFR5cGVcbmNvbG5hbWVzKDQ2MjAyNyk6IEFBQUNDQ0FBR0FBQUNDQ0EtMSBBQUFDQ0NBQUdBQUFUVENHLTEgLi4uXG4gIFRUVEdUVEdUQ1RUVENUQUctMSBUVFRHVFRHVENUVFRHQ0FULTFcbmNvbERhdGEgbmFtZXMoMik6IFNhbXBsZSBCYXJjb2RlXG5yZWR1Y2VkRGltTmFtZXMoMCk6XG5tYWluRXhwTmFtZTogTlVMTFxuYWx0RXhwTmFtZXMoMCk6XG4ifQ== --> <pre><code>class: SingleCellExperiment dim: 36601 462027 metadata(1): Samples @@ -3321,7 +3324,8 @@ <h3>Filtering empty droplets</h3> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(462027): AAACCCAAGAAACCCA-1 AAACCCAAGAAATTCG-1 ... + TTTGTTGTCTTTCTAG-1 TTTGTTGTCTTTGCAT-1 colData names(2): Sample Barcode reducedDimNames(0): mainExpName: NULL @@ -3370,21 +3374,21 @@ <h3>Filtering empty droplets</h3> <pre class="r"><code># view rows where FDR is not `NA` droplet_df[!is.na(droplet_df$FDR), ]</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggMjE3NiByb3dzIGFuZCA1IGNvbHVtbnNcbiAgICAgICAgIFRvdGFsICAgTG9nUHJvYiAgICAgUFZhbHVlICAgTGltaXRlZCAgICAgICAgIEZEUlxuICAgICA8aW50ZWdlcj4gPG51bWVyaWM+ICA8bnVtZXJpYz4gPGxvZ2ljYWw+ICAgPG51bWVyaWM+XG4xICAgICAgICAxNTYyMiAgICAgICAgTkEgICAgICAgICBOQSAgICAgICAgTkEgICAwLjAwMDAwMDBcbjIgICAgICAgICAgNTg5ICAtMTYxNC40MiAgMC42NTk3MzQwICAgICBGQUxTRSAgIDAuNzY2NDYwOVxuMyAgICAgICAgICA1MDcgIC0xMzQzLjkyICAwLjk5OTMwMDEgICAgIEZBTFNFICAgMS4wMDAwMDAwXG40ICAgICAgICAxOTg5OSAgICAgICAgTkEgICAgICAgICBOQSAgICAgICAgTkEgICAwLjAwMDAwMDBcbjUgICAgICAgICAgODgxICAtMjI2Mi44NSAgMC4wMjM3OTc2ICAgICBGQUxTRSAgIDAuMDMxMTAxM1xuLi4uICAgICAgICAuLi4gICAgICAgLi4uICAgICAgICAuLi4gICAgICAgLi4uICAgICAgICAgLi4uXG4yMTcyICAgICAgIDg2NyAgLTIzNjEuODAgMC4wMDAwOTk5OSAgICAgIFRSVUUgMC4wMDAxMzk5MjJcbjIxNzMgICAgICAxMjQ1ICAtMjg0MC40OCAwLjA0MTk5NTgwICAgICBGQUxTRSAwLjA1NDI5NzYwMVxuMjE3NCAgICAgICA3NzAgIC0yMDQ2LjU3IDAuMDU2NTk0MzQgICAgIEZBTFNFIDAuMDcyNjU0NDQ1XG4yMTc1ICAgICAgMTAxMSAgLTI4NzYuMTMgMC4wMDAwOTk5OSAgICAgIFRSVUUgMC4wMDAxMzk5MjJcbjIxNzYgICAgICA5OTg3ICAgICAgICBOQSAgICAgICAgIE5BICAgICAgICBOQSAwLjAwMDAwMDAwMFxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggMjE3NiByb3dzIGFuZCA1IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgICBMb2dQcm9iICAgICBQVmFsdWUgICBMaW1pdGVkICAgICAgICAgRkRSXG4gICAgICAgICAgICAgICAgICAgPGludGVnZXI+IDxudW1lcmljPiAgPG51bWVyaWM+IDxsb2dpY2FsPiAgIDxudW1lcmljPlxuQUFBQ0NDQUNBVEdUR1RDQS0xICAgICAxNTYyMiAgICAgICAgTkEgICAgICAgICBOQSAgICAgICAgTkEgICAwLjAwMDAwMDBcbkFBQUNDQ0FHVEdHVEFBVEEtMSAgICAgICA1ODkgIC0xNjE0LjQyICAwLjY1OTczNDAgICAgIEZBTFNFICAgMC43NjY0NjA5XG5BQUFDR0FBQUdBQUFDVEFDLTEgICAgICAgNTA3ICAtMTM0My45MiAgMC45OTkzMDAxICAgICBGQUxTRSAgIDEuMDAwMDAwMFxuQUFBQ0dBQUFHQUdBQUNDQy0xICAgICAxOTg5OSAgICAgICAgTkEgICAgICAgICBOQSAgICAgICAgTkEgICAwLjAwMDAwMDBcbkFBQUNHQUFUQ0NDVFRDQ0MtMSAgICAgICA4ODEgIC0yMjYyLjg1ICAwLjAyMzc5NzYgICAgIEZBTFNFICAgMC4wMzExMDEzXG4uLi4gICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgIC4uLiAgICAgICAgLi4uICAgICAgIC4uLiAgICAgICAgIC4uLlxuVFRUR0dUVFRDQ0NHR1RBRy0xICAgICAgIDg2NyAgLTIzNjEuODAgMC4wMDAwOTk5OSAgICAgIFRSVUUgMC4wMDAxMzk5MjJcblRUVEdHVFRUQ0NHR0FDVEctMSAgICAgIDEyNDUgIC0yODQwLjQ4IDAuMDQxOTk1ODAgICAgIEZBTFNFIDAuMDU0Mjk3NjAxXG5UVFRHR1RUVENUR1RDQ0NBLTEgICAgICAgNzcwICAtMjA0Ni41NyAwLjA1NjU5NDM0ICAgICBGQUxTRSAwLjA3MjY1NDQ0NVxuVFRUR1RUR0dUQ0FHR0NBQS0xICAgICAgMTAxMSAgLTI4NzYuMTMgMC4wMDAwOTk5OSAgICAgIFRSVUUgMC4wMDAxMzk5MjJcblRUVEdUVEdUQ0FHQVRUR0MtMSAgICAgIDk5ODcgICAgICAgIE5BICAgICAgICAgTkEgICAgICAgIE5BIDAuMDAwMDAwMDAwXG4ifQ== --> <pre><code>DataFrame with 2176 rows and 5 columns - Total LogProb PValue Limited FDR - <integer> <numeric> <numeric> <logical> <numeric> -1 15622 NA NA NA 0.0000000 -2 589 -1614.42 0.6597340 FALSE 0.7664609 -3 507 -1343.92 0.9993001 FALSE 1.0000000 -4 19899 NA NA NA 0.0000000 -5 881 -2262.85 0.0237976 FALSE 0.0311013 -... ... ... ... ... ... -2172 867 -2361.80 0.00009999 TRUE 0.000139922 -2173 1245 -2840.48 0.04199580 FALSE 0.054297601 -2174 770 -2046.57 0.05659434 FALSE 0.072654445 -2175 1011 -2876.13 0.00009999 TRUE 0.000139922 -2176 9987 NA NA NA 0.000000000</code></pre> + Total LogProb PValue Limited FDR + <integer> <numeric> <numeric> <logical> <numeric> +AAACCCACATGTGTCA-1 15622 NA NA NA 0.0000000 +AAACCCAGTGGTAATA-1 589 -1614.42 0.6597340 FALSE 0.7664609 +AAACGAAAGAAACTAC-1 507 -1343.92 0.9993001 FALSE 1.0000000 +AAACGAAAGAGAACCC-1 19899 NA NA NA 0.0000000 +AAACGAATCCCTTCCC-1 881 -2262.85 0.0237976 FALSE 0.0311013 +... ... ... ... ... ... +TTTGGTTTCCCGGTAG-1 867 -2361.80 0.00009999 TRUE 0.000139922 +TTTGGTTTCCGGACTG-1 1245 -2840.48 0.04199580 FALSE 0.054297601 +TTTGGTTTCTGTCCCA-1 770 -2046.57 0.05659434 FALSE 0.072654445 +TTTGTTGGTCAGGCAA-1 1011 -2876.13 0.00009999 TRUE 0.000139922 +TTTGTTGTCAGATTGC-1 9987 NA NA NA 0.000000000</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3411,7 +3415,7 @@ <h3>Filtering empty droplets</h3> <!-- rnb-source-begin eyJkYXRhIjoiZmlsdGVyZWRfc2NlIn0= --> <pre class="r"><code>filtered_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxNjI2IFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygxKTogY291bnRzXG5yb3duYW1lcygzNjYwMSk6IEVOU0cwMDAwMDI0MzQ4NSBFTlNHMDAwMDAyMzc2MTMgLi4uIEVOU0cwMDAwMDI3ODgxN1xuICBFTlNHMDAwMDAyNzcxOTZcbnJvd0RhdGEgbmFtZXMoMyk6IElEIFN5bWJvbCBUeXBlXG5jb2xuYW1lczogTlVMTFxuY29sRGF0YSBuYW1lcygyKTogU2FtcGxlIEJhcmNvZGVcbnJlZHVjZWREaW1OYW1lcygwKTpcbm1haW5FeHBOYW1lOiBOVUxMXG5hbHRFeHBOYW1lcygwKTpcbiJ9 --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxNjI2IFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygxKTogY291bnRzXG5yb3duYW1lcygzNjYwMSk6IEVOU0cwMDAwMDI0MzQ4NSBFTlNHMDAwMDAyMzc2MTMgLi4uIEVOU0cwMDAwMDI3ODgxN1xuICBFTlNHMDAwMDAyNzcxOTZcbnJvd0RhdGEgbmFtZXMoMyk6IElEIFN5bWJvbCBUeXBlXG5jb2xuYW1lcygxNjI2KTogQUFBQ0NDQUNBVEdUR1RDQS0xIEFBQUNHQUFBR0FHQUFDQ0MtMSAuLi5cbiAgVFRUR1RUR0dUQ0FHR0NBQS0xIFRUVEdUVEdUQ0FHQVRUR0MtMVxuY29sRGF0YSBuYW1lcygyKTogU2FtcGxlIEJhcmNvZGVcbnJlZHVjZWREaW1OYW1lcygwKTpcbm1haW5FeHBOYW1lOiBOVUxMXG5hbHRFeHBOYW1lcygwKTpcbiJ9 --> <pre><code>class: SingleCellExperiment dim: 36601 1626 metadata(1): Samples @@ -3419,7 +3423,8 @@ <h3>Filtering empty droplets</h3> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(1626): AAACCCACATGTGTCA-1 AAACGAAAGAGAACCC-1 ... + TTTGTTGGTCAGGCAA-1 TTTGTTGTCAGATTGC-1 colData names(2): Sample Barcode reducedDimNames(0): mainExpName: NULL @@ -3498,24 +3503,32 @@ <h3>Calculating summary QC statistics</h3> <!-- rnb-source-begin eyJkYXRhIjoiaGVhZChjb2xEYXRhKGZpbHRlcmVkX3NjZSkpIn0= --> <pre class="r"><code>head(colData(filtered_sce))</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggNiByb3dzIGFuZCA4IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgIFNhbXBsZSAgICAgICAgICAgIEJhcmNvZGUgICAgICAgc3VtICBkZXRlY3RlZFxuICAgICAgICAgICAgIDxjaGFyYWN0ZXI+ICAgICAgICA8Y2hhcmFjdGVyPiA8bnVtZXJpYz4gPGludGVnZXI+XG4xIGRhdGEvZ2xpb2JsYXN0b21hLTEwLi4gQUFBQ0NDQUNBVEdUR1RDQS0xICAgICAxNTYyMiAgICAgIDI4MjJcbjIgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFDR0FBQUdBR0FBQ0NDLTEgICAgIDE5ODk5ICAgICAgMzUwM1xuMyBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNHQ1RBR0FUVEFHQUMtMSAgICAgIDI4NTggICAgICAxMzY3XG40IGRhdGEvZ2xpb2JsYXN0b21hLTEwLi4gQUFBQ0dDVEdUQUNHQ1RBVC0xICAgICAzMTM2MyAgICAgIDQzNTRcbjUgZGF0YS9nbGlvYmxhc3RvbWEtMTAuLiBBQUFHQUFDQUdUQUNBR0NHLTEgICAgIDEyNjM2ICAgICAgMjc4MFxuNiBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUdHQVRBR0FUVEdUR0EtMSAgICAgMTM0ODkgICAgICAyNTMzXG4gIHN1YnNldHNfbWl0b19zdW0gc3Vic2V0c19taXRvX2RldGVjdGVkIHN1YnNldHNfbWl0b19wZXJjZW50ICAgICB0b3RhbFxuICAgICAgICAgPG51bWVyaWM+ICAgICAgICAgICAgIDxpbnRlZ2VyPiAgICAgICAgICAgIDxudW1lcmljPiA8bnVtZXJpYz5cbjEgICAgICAgICAgICAgMTY5OSAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgICAgMTAuODc1NjkgICAgIDE1NjIyXG4yICAgICAgICAgICAgIDExNDEgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICA1LjczMzk2ICAgICAxOTg5OVxuMyAgICAgICAgICAgICAgMTA4ICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgICAgMy43Nzg4NyAgICAgIDI4NThcbjQgICAgICAgICAgICAgMTg4NyAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgICAgIDYuMDE2NjQgICAgIDMxMzYzXG41ICAgICAgICAgICAgIDEwMDggICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICA3Ljk3NzIxICAgICAxMjYzNlxuNiAgICAgICAgICAgICAxMTQ1ICAgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAgICAgOC40ODg0MCAgICAgMTM0ODlcbiJ9 --> +<!-- rnb-output-begin eyJkYXRhIjoiRGF0YUZyYW1lIHdpdGggNiByb3dzIGFuZCA4IGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlICAgICAgICAgICAgQmFyY29kZSAgICAgICBzdW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGFyYWN0ZXI+ICAgICAgICA8Y2hhcmFjdGVyPiA8bnVtZXJpYz5cbkFBQUNDQ0FDQVRHVEdUQ0EtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNDQ0FDQVRHVEdUQ0EtMSAgICAgMTU2MjJcbkFBQUNHQUFBR0FHQUFDQ0MtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNHQUFBR0FHQUFDQ0MtMSAgICAgMTk4OTlcbkFBQUNHQ1RBR0FUVEFHQUMtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNHQ1RBR0FUVEFHQUMtMSAgICAgIDI4NThcbkFBQUNHQ1RHVEFDR0NUQVQtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUNHQ1RHVEFDR0NUQVQtMSAgICAgMzEzNjNcbkFBQUdBQUNBR1RBQ0FHQ0ctMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUdBQUNBR1RBQ0FHQ0ctMSAgICAgMTI2MzZcbkFBQUdHQVRBR0FUVEdUR0EtMSBkYXRhL2dsaW9ibGFzdG9tYS0xMC4uIEFBQUdHQVRBR0FUVEdUR0EtMSAgICAgMTM0ODlcbiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgc3Vic2V0c19taXRvX3N1bSBzdWJzZXRzX21pdG9fZGV0ZWN0ZWRcbiAgICAgICAgICAgICAgICAgICA8aW50ZWdlcj4gICAgICAgIDxudW1lcmljPiAgICAgICAgICAgICA8aW50ZWdlcj5cbkFBQUNDQ0FDQVRHVEdUQ0EtMSAgICAgIDI4MjIgICAgICAgICAgICAgMTY5OSAgICAgICAgICAgICAgICAgICAgMTNcbkFBQUNHQUFBR0FHQUFDQ0MtMSAgICAgIDM1MDMgICAgICAgICAgICAgMTE0MSAgICAgICAgICAgICAgICAgICAgMTFcbkFBQUNHQ1RBR0FUVEFHQUMtMSAgICAgIDEzNjcgICAgICAgICAgICAgIDEwOCAgICAgICAgICAgICAgICAgICAgMTBcbkFBQUNHQ1RHVEFDR0NUQVQtMSAgICAgIDQzNTQgICAgICAgICAgICAgMTg4NyAgICAgICAgICAgICAgICAgICAgMTNcbkFBQUdBQUNBR1RBQ0FHQ0ctMSAgICAgIDI3ODAgICAgICAgICAgICAgMTAwOCAgICAgICAgICAgICAgICAgICAgMTFcbkFBQUdHQVRBR0FUVEdUR0EtMSAgICAgIDI1MzMgICAgICAgICAgICAgMTE0NSAgICAgICAgICAgICAgICAgICAgMTNcbiAgICAgICAgICAgICAgICAgICBzdWJzZXRzX21pdG9fcGVyY2VudCAgICAgdG90YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljPiA8bnVtZXJpYz5cbkFBQUNDQ0FDQVRHVEdUQ0EtMSAgICAgICAgICAgICAxMC44NzU2OSAgICAgMTU2MjJcbkFBQUNHQUFBR0FHQUFDQ0MtMSAgICAgICAgICAgICAgNS43MzM5NiAgICAgMTk4OTlcbkFBQUNHQ1RBR0FUVEFHQUMtMSAgICAgICAgICAgICAgMy43Nzg4NyAgICAgIDI4NThcbkFBQUNHQ1RHVEFDR0NUQVQtMSAgICAgICAgICAgICAgNi4wMTY2NCAgICAgMzEzNjNcbkFBQUdBQUNBR1RBQ0FHQ0ctMSAgICAgICAgICAgICAgNy45NzcyMSAgICAgMTI2MzZcbkFBQUdHQVRBR0FUVEdUR0EtMSAgICAgICAgICAgICAgOC40ODg0MCAgICAgMTM0ODlcbiJ9 --> <pre><code>DataFrame with 6 rows and 8 columns - Sample Barcode sum detected - <character> <character> <numeric> <integer> -1 data/glioblastoma-10.. AAACCCACATGTGTCA-1 15622 2822 -2 data/glioblastoma-10.. AAACGAAAGAGAACCC-1 19899 3503 -3 data/glioblastoma-10.. AAACGCTAGATTAGAC-1 2858 1367 -4 data/glioblastoma-10.. AAACGCTGTACGCTAT-1 31363 4354 -5 data/glioblastoma-10.. AAAGAACAGTACAGCG-1 12636 2780 -6 data/glioblastoma-10.. AAAGGATAGATTGTGA-1 13489 2533 - subsets_mito_sum subsets_mito_detected subsets_mito_percent total - <numeric> <integer> <numeric> <numeric> -1 1699 13 10.87569 15622 -2 1141 11 5.73396 19899 -3 108 10 3.77887 2858 -4 1887 13 6.01664 31363 -5 1008 11 7.97721 12636 -6 1145 13 8.48840 13489</code></pre> + Sample Barcode sum + <character> <character> <numeric> +AAACCCACATGTGTCA-1 data/glioblastoma-10.. AAACCCACATGTGTCA-1 15622 +AAACGAAAGAGAACCC-1 data/glioblastoma-10.. AAACGAAAGAGAACCC-1 19899 +AAACGCTAGATTAGAC-1 data/glioblastoma-10.. AAACGCTAGATTAGAC-1 2858 +AAACGCTGTACGCTAT-1 data/glioblastoma-10.. AAACGCTGTACGCTAT-1 31363 +AAAGAACAGTACAGCG-1 data/glioblastoma-10.. AAAGAACAGTACAGCG-1 12636 +AAAGGATAGATTGTGA-1 data/glioblastoma-10.. AAAGGATAGATTGTGA-1 13489 + detected subsets_mito_sum subsets_mito_detected + <integer> <numeric> <integer> +AAACCCACATGTGTCA-1 2822 1699 13 +AAACGAAAGAGAACCC-1 3503 1141 11 +AAACGCTAGATTAGAC-1 1367 108 10 +AAACGCTGTACGCTAT-1 4354 1887 13 +AAAGAACAGTACAGCG-1 2780 1008 11 +AAAGGATAGATTGTGA-1 2533 1145 13 + subsets_mito_percent total + <numeric> <numeric> +AAACCCACATGTGTCA-1 10.87569 15622 +AAACGAAAGAGAACCC-1 5.73396 19899 +AAACGCTAGATTAGAC-1 3.77887 2858 +AAACGCTGTACGCTAT-1 6.01664 31363 +AAAGAACAGTACAGCG-1 7.97721 12636 +AAAGGATAGATTGTGA-1 8.48840 13489</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3649,7 +3662,7 @@ <h4>One more filter: unique gene count</h4> qcfiltered_sce <- qcfiltered_sce[, which(qcfiltered_sce$detected >= 200)] qcfiltered_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygxKTogY291bnRzXG5yb3duYW1lcygzNjYwMSk6IEVOU0cwMDAwMDI0MzQ4NSBFTlNHMDAwMDAyMzc2MTMgLi4uIEVOU0cwMDAwMDI3ODgxN1xuICBFTlNHMDAwMDAyNzcxOTZcbnJvd0RhdGEgbmFtZXMoMyk6IElEIFN5bWJvbCBUeXBlXG5jb2xuYW1lczogTlVMTFxuY29sRGF0YSBuYW1lcyg5KTogU2FtcGxlIEJhcmNvZGUgLi4uIHRvdGFsIHByb2JfY29tcHJvbWlzZWRcbnJlZHVjZWREaW1OYW1lcygwKTpcbm1haW5FeHBOYW1lOiBOVUxMXG5hbHRFeHBOYW1lcygwKTpcbiJ9 --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygxKTogY291bnRzXG5yb3duYW1lcygzNjYwMSk6IEVOU0cwMDAwMDI0MzQ4NSBFTlNHMDAwMDAyMzc2MTMgLi4uIEVOU0cwMDAwMDI3ODgxN1xuICBFTlNHMDAwMDAyNzcxOTZcbnJvd0RhdGEgbmFtZXMoMyk6IElEIFN5bWJvbCBUeXBlXG5jb2xuYW1lcygxMjMzKTogQUFBQ0NDQUNBVEdUR1RDQS0xIEFBQUNHQUFBR0FHQUFDQ0MtMSAuLi5cbiAgVFRUR0dUVFRDQVRDVEFDVC0xIFRUVEdUVEdUQ0FHQVRUR0MtMVxuY29sRGF0YSBuYW1lcyg5KTogU2FtcGxlIEJhcmNvZGUgLi4uIHRvdGFsIHByb2JfY29tcHJvbWlzZWRcbnJlZHVjZWREaW1OYW1lcygwKTpcbm1haW5FeHBOYW1lOiBOVUxMXG5hbHRFeHBOYW1lcygwKTpcbiJ9 --> <pre><code>class: SingleCellExperiment dim: 36601 1233 metadata(1): Samples @@ -3657,7 +3670,8 @@ <h4>One more filter: unique gene count</h4> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(1233): AAACCCACATGTGTCA-1 AAACGAAAGAGAACCC-1 ... + TTTGGTTTCATCTACT-1 TTTGTTGTCAGATTGC-1 colData names(9): Sample Barcode ... total prob_compromised reducedDimNames(0): mainExpName: NULL @@ -3717,7 +3731,7 @@ <h2>Normalization</h2> <!-- rnb-source-begin eyJkYXRhIjoibm9ybWFsaXplZF9zY2UifQ== --> <pre class="r"><code>normalized_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygyKTogY291bnRzIGxvZ2NvdW50c1xucm93bmFtZXMoMzY2MDEpOiBFTlNHMDAwMDAyNDM0ODUgRU5TRzAwMDAwMjM3NjEzIC4uLiBFTlNHMDAwMDAyNzg4MTdcbiAgRU5TRzAwMDAwMjc3MTk2XG5yb3dEYXRhIG5hbWVzKDMpOiBJRCBTeW1ib2wgVHlwZVxuY29sbmFtZXM6IE5VTExcbmNvbERhdGEgbmFtZXMoMTApOiBTYW1wbGUgQmFyY29kZSAuLi4gcHJvYl9jb21wcm9taXNlZCBzaXplRmFjdG9yXG5yZWR1Y2VkRGltTmFtZXMoMCk6XG5tYWluRXhwTmFtZTogTlVMTFxuYWx0RXhwTmFtZXMoMCk6XG4ifQ== --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygyKTogY291bnRzIGxvZ2NvdW50c1xucm93bmFtZXMoMzY2MDEpOiBFTlNHMDAwMDAyNDM0ODUgRU5TRzAwMDAwMjM3NjEzIC4uLiBFTlNHMDAwMDAyNzg4MTdcbiAgRU5TRzAwMDAwMjc3MTk2XG5yb3dEYXRhIG5hbWVzKDMpOiBJRCBTeW1ib2wgVHlwZVxuY29sbmFtZXMoMTIzMyk6IEFBQUNDQ0FDQVRHVEdUQ0EtMSBBQUFDR0FBQUdBR0FBQ0NDLTEgLi4uXG4gIFRUVEdHVFRUQ0FUQ1RBQ1QtMSBUVFRHVFRHVENBR0FUVEdDLTFcbmNvbERhdGEgbmFtZXMoMTApOiBTYW1wbGUgQmFyY29kZSAuLi4gcHJvYl9jb21wcm9taXNlZCBzaXplRmFjdG9yXG5yZWR1Y2VkRGltTmFtZXMoMCk6XG5tYWluRXhwTmFtZTogTlVMTFxuYWx0RXhwTmFtZXMoMCk6XG4ifQ== --> <pre><code>class: SingleCellExperiment dim: 36601 1233 metadata(1): Samples @@ -3725,7 +3739,8 @@ <h2>Normalization</h2> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(1233): AAACCCACATGTGTCA-1 AAACGAAAGAGAACCC-1 ... + TTTGGTTTCATCTACT-1 TTTGTTGTCAGATTGC-1 colData names(10): Sample Barcode ... prob_compromised sizeFactor reducedDimNames(0): mainExpName: NULL @@ -3832,7 +3847,7 @@ <h3>Principal components analysis</h3> <!-- rnb-source-begin eyJkYXRhIjoibm9ybWFsaXplZF9zY2UifQ== --> <pre class="r"><code>normalized_sce</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygyKTogY291bnRzIGxvZ2NvdW50c1xucm93bmFtZXMoMzY2MDEpOiBFTlNHMDAwMDAyNDM0ODUgRU5TRzAwMDAwMjM3NjEzIC4uLiBFTlNHMDAwMDAyNzg4MTdcbiAgRU5TRzAwMDAwMjc3MTk2XG5yb3dEYXRhIG5hbWVzKDMpOiBJRCBTeW1ib2wgVHlwZVxuY29sbmFtZXM6IE5VTExcbmNvbERhdGEgbmFtZXMoMTApOiBTYW1wbGUgQmFyY29kZSAuLi4gcHJvYl9jb21wcm9taXNlZCBzaXplRmFjdG9yXG5yZWR1Y2VkRGltTmFtZXMoMSk6IFBDQVxubWFpbkV4cE5hbWU6IE5VTExcbmFsdEV4cE5hbWVzKDApOlxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiY2xhc3M6IFNpbmdsZUNlbGxFeHBlcmltZW50IFxuZGltOiAzNjYwMSAxMjMzIFxubWV0YWRhdGEoMSk6IFNhbXBsZXNcbmFzc2F5cygyKTogY291bnRzIGxvZ2NvdW50c1xucm93bmFtZXMoMzY2MDEpOiBFTlNHMDAwMDAyNDM0ODUgRU5TRzAwMDAwMjM3NjEzIC4uLiBFTlNHMDAwMDAyNzg4MTdcbiAgRU5TRzAwMDAwMjc3MTk2XG5yb3dEYXRhIG5hbWVzKDMpOiBJRCBTeW1ib2wgVHlwZVxuY29sbmFtZXMoMTIzMyk6IEFBQUNDQ0FDQVRHVEdUQ0EtMSBBQUFDR0FBQUdBR0FBQ0NDLTEgLi4uXG4gIFRUVEdHVFRUQ0FUQ1RBQ1QtMSBUVFRHVFRHVENBR0FUVEdDLTFcbmNvbERhdGEgbmFtZXMoMTApOiBTYW1wbGUgQmFyY29kZSAuLi4gcHJvYl9jb21wcm9taXNlZCBzaXplRmFjdG9yXG5yZWR1Y2VkRGltTmFtZXMoMSk6IFBDQVxubWFpbkV4cE5hbWU6IE5VTExcbmFsdEV4cE5hbWVzKDApOlxuIn0= --> <pre><code>class: SingleCellExperiment dim: 36601 1233 metadata(1): Samples @@ -3840,7 +3855,8 @@ <h3>Principal components analysis</h3> rownames(36601): ENSG00000243485 ENSG00000237613 ... ENSG00000278817 ENSG00000277196 rowData names(3): ID Symbol Type -colnames: NULL +colnames(1233): AAACCCACATGTGTCA-1 AAACGAAAGAGAACCC-1 ... + TTTGGTTTCATCTACT-1 TTTGTTGTCAGATTGC-1 colData names(10): Sample Barcode ... prob_compromised sizeFactor reducedDimNames(1): PCA mainExpName: NULL @@ -3903,12 +3919,12 @@ <h3>UMAP</h3> results using the <code>plotReducedDim()</code> function.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGxvdCB0aGUgVU1BUCIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIFwiVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gaHZfZ2VuZXNbMV0pIl19 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGxvdCB0aGUgVU1BUCIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIFwiVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBodl9nZW5lc1sxXSkiXX0= --> <pre class="r"><code># plot the UMAP scater::plotReducedDim(normalized_sce, "UMAP", # color by the most variable gene - colour_by = hv_genes[1])</code></pre> + color_by = hv_genes[1])</code></pre> <!-- rnb-source-end --> <!-- rnb-plot-begin --> <p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeZRe9Xng+ef53Xvf+261aiktoF2AsJBBYIIXAvYYMnQS21nsxEkap+P22IlzMovTk5yTybTnnHTmzCRxt3OSjt09ScftpdvYcdpxGycO2CwxuwAJhAAtaFdVqfaqd7nb75k/SsiYJQFZ8OpK38/hCNV936p6fu8pOPV976ZmJgAAAAAA4Nzmej0AAAAAAAD4pxHwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJRA2OsBzi1Zlh05ckREGo3GyMhIr8cBAAAAAOAU9sD/gH379m3cuHHjxo2/+qu/2utZAAAAAAD4PgIeAAAAAIASIOABAAAAACgBAh4AAAAAgBIg4AEAAAAAKAECHgAAAACAEiDgAQAAAAAoAQIeAAAAAIASIOABAAAAACgBAh4AAAAAgBIg4AEAAAAAKAECHgAAAACAEiDgAQAAAAAoAQIeAAAAAIASIOABAAAAACgBAh4AAAAAgBIg4AEAAAAAKAECHgAAAACAEiDgAQAAAAAoAQIeAAAAAIASIOABAAAAACgBAh4AAAAAgBIg4AEAAAAAKAECHgAAAACAEiDgAQAAAAAoAQIeAAAAAIASIOABAAAAACgBAh4AAAAAgBIg4AEAAAAAKAECHgAAAACAEiDgAQAAAAAogVIG/Mc//vFly5a90qP79+//wAc+sHz58lqttmXLlt/7vd9L0/SNHA8AAAAAgLOufAE/NTX15S9/+ZUe3blz5zve8Y6vfOUrc3NzIyMjTz/99O/+7u/efPPNNDwAAAAAoNTKFPBZlt11110/8RM/MTk5+bJPMLOf+ZmfGR0d/fVf//Xp6emDBw8+9dRTq1atuvvuuz/1qU+9wdMCAAAAAHAWlSbgP/7xj9fr9Xe+853333//Kz3njjvu2L9///bt2z/96U/XajUR2bJlyxe+8AUR+fSnP21mb9y4OCPtLHv8xIk7D+y/88CBnaOj7Szr9UQAAAAAcK4Iez3Aq3XFFVf88i//soi02+0vfelLL/ucz33ucyLygQ98wLnvvzFx4403rlixYnR09LHHHtu+ffsbMixe3nh74ejCXFLkfZV4ff9QI6qcfsib3Xlg/72HDuXeP3TsqIhcu/qiShBcv3btO9dvcKq9mxoAAAAAzgmlCfiPfexji38ZGxt7pYDfu3eviNxwww0v3KiqP/qjP3rbbbc999xzBHyvPDs58bknHn1qajyzIorcULW+pFb/kRUX//j6S2thZCL/9YldT46P7zh+fLheXz84JCLPTU9NdrppUZxstX9u61al4QEAAABc2EoT8K/GiRMnROSlF6hf3DI6OvrST/mLv/iLD3/4w2/AbBesvPBffOTxP3/24RPFvJfCq6lK5Fwg7u5jBw7MTP7alW995uTEk+PjO0dHty5fHoenfiaXNRqr+vKdoydE5LKlS69cufLsDlZYMpse6RYzKq4eLu2LVjsNzu63AAAAAICz6PwJeDNbTPTh4eEXPbRkyRJ5hYDH68qbffbbD3zuyI6JqGWBORXnvKrkVmTeFT7/L/sfW9UcmJ7rPnTs6OXLvl/vi+Iw3DA8/NCxoxf195+VgO8WcxPJ3oV8cufUjh1HJydmo6KIGmG4bqBy5eq+q1a8c1n18h/+uwAAAADA6+H8CfjTXulY65e9k9zSpUuvvvrq0x92u93du3e/XpNdMPZNTD55YuzY1NyOhw7uWRifWt2xwILAq4h4EaeqIoHPTNvW/euDO9cFy+MgbFYqL/1SfZU4DsJj8/NZUUTBme8h95bvn7/reGfX4zOjD4zNzi7UvWnatSwpkoXgwWeK7y0/dv3ab/7slTPrmm8785UDAAAAwOvm/Al4VR0ZGTl69OjU1NTg4OALH5qamhKRVatWvfSz3vOe97znPe85/eGePXsuv5x9sGeuk+Vf3fnksycnHjl4NDnYTg53pt9cFFUfBF5NpRARERPRUxmfFXZwYXKg3qyErxjnlSAws4UsGzrTgM+s/fjklybTo98aPXSsVU2KisY+MKnX2qqStsO0HR090X+Xnyzse7923bq+6GV+VAAAAACgt86fgBeRVatWHT16dGJiYsOGDS/cPjExIa8Q8DiLvNkXHnnsa088VQ3D4STqSDxRSfP+XFRUTLzK4rERdupPFTGRhTyZyObUv8zu90W59yJSfY317i3PfLfr544s3Hes/ehMdnjHTD6ZNgpzWTtyIoErTFzhJKrmqjK0enb06MADevLaNfe9c+3PnvmrAAAAAACvj/Mq4Ddt2vTQQw/dd99911577Qu3L946fuPGjT2a60Lx2NHjh2dmG5XKpcuX7j94fH68LTXR0FRNTE1FTp/cYKf/auJEoqKdpUlRxC+p9CTPu0U+XKvVouhVjjHR3X+kvWM2PdbJZybSA2kxZZZ1fDaTXpRZaIlIrnGcipqIFOaKzIVxLiLVge6RkwPf3bf/nWvPwqsBAAAAAGeX+6efUh633nqriHzta1974cZHH3300KFDW7du5R5yr7fHjp145Mixi4cGsnaWTrWDrLMkPL68OVMPsxXNuSWNhWbcDQIvaubs1G54UxG5qNl8y+qLDk5P26nNp5jZgZnpt6xaffWq1a9mABN7Zu6OJ2a+/tTM7Xvmnnx67tH59Ph8kS0URbeIq0EWWmFFoM68qDdnpoFaKN7nGtXyuJF60SPTHW/F2X91AAAAAOCHc14F/M0337x+/fp77733U5/61OKWmZmZxar/tV/7tZ6OdkEYnV8IVKupP3zXE7UNe7b90iNv/Ze7Llk1GrusESQjtdmV9dmVjZm+SuJERMXERERVblizfkWzOZt0d4+PT7Tb3Tzv5vnJVvvJ8fH5JFnZ13f92le1T/xw6+Hj7V1j3T2pH5pP50Ntp94NysJl1bFl4VyfSwajzkV9U4O11uLzTdSbOvWBFxEJKoWKtDJT7icHAAAA4NxzXh1Cr6pf/epXb7nllk984hN/9md/tmbNmgceeKDdbn/oQx/6yEc+0uvpznMLWXZgdmoia909dnDDTYcvXjV1cd+0U1udT092mqOt/pFgLnJF6IpAzanNdqvenIgMV+uXDKz48dUr61HlwPTUQ8eOnv6a166+aNPw8M9tvSJ0L/NOU2HFRDKV+qwSVJZWhkyKQwsPnmg/WY+WPzN/wiTp13x1NDuf1490h46lgweTJU2XDFXbgfiu7463+k8dyG/qnHlZ3P1vgaskeV4Nz6v/NAAAAACcB863Stm+ffv3vve93/qt37rnnnuOHDmyfv36D3/4w5/4xCde6d5yOCsOzsx88YnHjyQz7f6J1csnlg/MrmjMetHCu6Fae7Da9qYnWgMDlW4U5BVXxGGmWhWTqFKs7KtuGVhVDaJ/efXVeycnr7v44pOtlogsqzfetHz5xuHhl3671GcPTz3+zPyB3PLFLaGGK6v1SNNaODDWHj3WlfW1rOk6+zojrSI+kg4X5nJzU0WjW0SNMKn5dLjWmuw0RcRETExF8jT0ps360EtPxQcAAACAnitfwI+MjLzoTOkX2bRp01/91V+9YfNgutv5dzvuuXtin4+7cdS9ZGh8oJaczJqiGqgPxG9ZdmLfxHITOb4wqGImWpgbrLVbRb0WuzW15dUgyi3fM/fMoeTwdHVqXsdVijjuH7d1buGii+ubQvf9a9S3i843jv/9bDb/zPz+elgPxSV+vpW3x+NwPj+6faB+Mk1NoqrLnm2vPJYOhloMha1A/Xg60PZR10Kfu/6o01fpzHTrhTkR0VDSVtSdi/ubnStGbuDtHgAAAADnoPIFPM41f7Lre39/8ukiyIdr8+sHJlpZRdVMVEXUWaRF6IoNSyfWZFNjrf5uHuY+qERFy6pjncsCq/ZHjal0+s6x785kM4/P7EyLrokvxMdOHph6aGvfhovqq64eunFlbd3it/vu+H0PTD7WF9Y3NdcXfqqbH6lrUbOJ491wPg/qbqpTFCrRTFY/ng40gqThUqemYs2gq+I7Pko1WCjims8qLp/PYheJqCXdSiXw9f7BzSM9fTUBAAAA4BUQ8Pih7JuZ+OsDO1NNw8KWVOadFNUon0lrWRF6kUCtEuQDcTf3wWCltak6XtM8N83FjSdDy6MVe6bn+6Lw22N3PjDxQOLnC+kGaqIamsu9S7w9MffcieRgkh27fGDrYLRkzodHO0djV1ldX5EWJ7vZkbQ46TSOguYy51MrZjLnxJvoQl4N1TeDxOzU2wmDYTu3QERaPm5bJQi9i72qiYpLnKbSrVU3LJ+KqqO9flEBAAAA4GUQ8Dhz7ST7nTtvX5Cuz7UZd5vVZCDuzGdV8xJo4US9uW4eFd4trbams2agPpSiFmZVlw5X5q9v/skVtZW16qa9cz7182LtQERVRUy0iFUyC9qF72Tp0fZDlt/VCPtn7fLHp2dWVJd7n3Szo6mfiIJBlUhEnPqaa09m9WWVee/FO6m6fPFQeBNdPMt9STQ/n9ecSstXKi6vVvJAfGS+EuaP5/1b+utbR2bm8mkRe8E96wEAAADgnEDA48x9+7Fnd8+NWt2sCGrVRNWSIjSvIqYqTs1JkXtXmFvIK4H31bBoS2U2qVdctqoy2wynrhpa+LtZdzBtVNWLOjHVU+VsJkWkvhA3V8iAVy/NKFg60x4vzBd+ZjqZNj8WuOZivYuIiqsH4XyeO7V6kOQWhFqomBdVETNVNSfSH3b6rHMiGxwIOuv6JltFPJfV7h694tKhwXdfXD+ZOG++MB9wJzkAAAAA5xgCHmeolaSP7j9a6KlArkXp0urCQlp1zleCwjkRMxE1kdy73IJYCzOJXV6oS6zSyuNZX02DWtvqTsykUBHT0z+QquJMCmeq6nKrTeYLw3GtHjaczibFrBNz5iONXzhSRSOnfiDIvMlMVsvE9UunEGciIlqYOjERMREnvi9MWnnl2bmV7eKSzQPV65bX4kAKyyoupt4BAAAAnIMIeJyhw+MzJ7ttja1WSTMJ1HkRCYPCqYRBIaKLt1U3kXZR6eTRXF7NiiCOisgVzSCZlfpoOrAsSto+V4tEVcUWr1H//HfwIiYqKmImmWkhRSNwF1erM7nL/MlAvMoP3B8+8bKpXh+pNJb5Yw/Mrk2LioUaaZFZsPg2QyESik98VJhLivDQ7Jp6ZWjdQN+G/kqoOpfNeLHl8UVv9EsJAAAAAK8CAY8ztNBNFqzdbC4E1Xw+r+VFoGqVoBAV7503FZHc3HRabxUVJxaoz3zQSSKnlkeaWnAyrIeaZd5npt4HoXqn9qJTz72pqDnnnWig4UhcebbVaWUShIFT7y13euoQ+sxsvvBLKuEVfRdPJROT2fTBzsDxdHBJ2KoHiZmKioolPprKG8uihc1NvWZJNXNrFk93bxetyXRsQ+PyS/u2vdEvJQAAAAC8CgQ8zlAcRXP9x+r1JCkCMZlNa628OhB1OkVlsd7FdDqrtfJK6Hw1yEwk9YGIxC6fz6qFuJNB32DYjjQ3MW+aigvMnEr4fMR7UxMJ1MR8f9isunrVuXW1qjc50qn2hVa1pKKRibQLP5UVa6rRpnrYCMOiiN8yMJRa8+lWOpqFzSKpBIWZpj5o+8qSSrGitmza+7msGeukqXXzVtd3NjS2vHnwuqHKst69qAAAAADwigh4nKG0Ou8rbUuc1yBw1k4qmTmnFmmeWmiibR967wL1VZc5scwCVTFTEamFeSuPp9L60oH5UIsDneUzea3i8lzC3LQQDUS8aWqu6opKkDnxg1G1GtRFZFOjmpklhY2m9YXCQk1MAjNbV4vW1cNLm3GSHRHLNve/88rlN90++s0nZ/enRTqRFk7dimpjdTDwP658V38UPz33WOK7pxYTLWuGA9sGr1tVXdvDlxQAAAAA/hEEPM7QrM5ZX0cmAw01DrNmUEx0m9Uwb7okdGlhbj6rdH1YC9LCXG6SS+DUvIkXdVoE6s0kK9zSaMFMj6eDJ7M+VR9rklmQicvNxS6PXd7n8otq9aXx6sXvq6KXNSqRtVbXlnaLqJVNVMPqskptfU2GwnY7PVT4+aHa9csbP1EJlv7imv9pIW8dbB05mZ50oqtrq9c31gbqRGRD4/KpdLyVz6m6/nBwqLKUW8cBAAAAOJcR8DhDc3m7r6ZJVKRJEFR9PUxDtcluc95VG2HXiSQ+MlEvrjDnRZ2KiDi1qstUxIlFrpjMGsPaqYfdNW5yMGqnPuz6qF1UCglULFBfC+yiWv+ljTWRO3XBeRNrZUcHw/xtwz/eDGtTnbvMitnuI2LSzmSgek0cLF/RfH8lWLr4/GbY2DpwmchlL5o/0GBZvHJZvPINfM0AAAAA4MwR8DhDgbpKEKxZOrP/5FDiXb2SNqKsEDfdrc1qvRJkiQ8L77oSBepVRUS8qRNfDTJvrlCNNE99VEiSmxOV/rBjos4sN7dQ1GpBlvpKxUUXVdLCL6iIqua+3c7Hct9e3bxxdeOG0NUH4qvmkif64m1maegG6tHGRuXSF12dHgAAAADOAwQ8ztBQ1Kca9zeaG8PZ56b7Z1qNZnW6GmYWS7eInLNIfW7OPV/vJuLNRS53KiI+tyD1URR5LxqIqZo3MRN1GpivS+Jc1Bf4TJx3K+azw6e/77LaVY1o5Yb+nw5dXURCNzBce0ePXgMAAAAAeOMQ8DhDl/RdfOXQll3TO5ZXOm6pjrXrE+3msuZ8JSyCwKc+CKyIAi28U/PqJPcu1LwZpt40N1eIUxURNXFOCzFREVVx4r0FofrcCpMgUK1Fm9cP3NTJJ0R8HAwNxpcOxZdwvjoAAACACw0BjzM0Uh26rG9t4ZPds37ATcb1dCaP21m9EqZhkNecL3yQFZKZFhJE5gP1fWE3cj71QaeoDFdaK+tzbV/JvRsKF5za6a8cqM/EiXkvzokV3q/tu6WHKwUAAACAcwEBjzP37pGrU5+pBjund5t0o8BqaoUFg0FbNe16cZbOSUVFMu8iV3SLqJWriC6tLCyL5wejTm6aWrjgq/1BZ/FrqpiqqokTUTETU8dPKQAAAAAQ8PghhBr85Mq37WutXVtfNdqd6OTztdCtro5c1r9irPP3xzv7RjvBRDIznxetIkx9ZCaq1hcmK2tztSA1EzVRlcQik66IORUn5kW8iYmZmIjrC5f2eqEAAAAA0HsEPH4oqrq5edHm5kUv3OitmOzeW/gFJw0ntqw6v1J9LqF5c+pDl4upiDg1b2omJupNK8478YW43AJRVRMRWxJvHKlt7s3aAAAAAOBcQsDj7HMarG1el/r2TPaQaqBiIuLExFkgPhDpWuC9xi53al5UxRYvX7dY74Ut3gROC6kuq269qPam3i4HAAAAAM4FBDxeFxfVr17ITx5pT3aKJ7yYiDkxJyZq3SJayGOnXsNuxeXexERVJJcw886rioqYqKuvrf/oW5a832nQ69UAAAAAQO8R8Hid6GX9t1TcyDeP6XS6J3JZYYGopkXYKeLci4nFLhfVUAoVn0oo3hZvDWfmAm1eNvAzb1t+qxPqHQAAAABECHi8rjY0t39w3eb/uPePcnssKbRVVBdv9x6qOJXE6oFPwiCruThUEbVA+wIXLYm3XDX88ytrl/V6fAAAAAA4hxDweH0tjfv+ly2f+P/2/d6MPCuaJT4UUacSOhdaXg0qS+Kt7x75yU4+lfhWHPSPVN80WFkpor0eHAAAAADOLQQ8Xne1oO/WDf/bnaNfPNh+LitOmDgVdVo4CVfX33zzyn8+XFnd6xkBAAAA4FxHwOONMBCN/MTqXz248NiB1pMz6biJ9EdLNjTftLF5TcXVez0dAAAAAJQAAY83SMXVLul/2yX9bzMxEVEOkgcAAACA14KAxxuNdAcAAACAM+B6PQAAAAAAAPinEfAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEPAAAAAEAJEPAAAAAAAJQAAQ8AAAAAQAkQ8AAAAAAAlAABDwAAAABACRDwAAAAAACUAAEP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ZQlt0E6tSO780LL+t73/ytddsbHbXaZzxerNY3e4vzz9yL1//cDf/X/fPdN2fuer/6FvsHzqYdJMXuYLVbUT0YeGhl70o+HhYTDA04JhgF+iimH4y6/fZY2ZbrZ+tP9wKLY/KKQuXzZUqRSid+zc9s7zz6sW+SE3ERERLZQVG5e/+2O/GBWimcnaD775YNLKxAhEoqFKVClWq2Vxrj45u+6yjW+58fVveNv53e4vnUNWbh570ZHX33D562+4/FU2G5fiM33Jv7RTHSvJ0QJhgF+6lvWVP/aWKx/cf2jN4MDxekMVw5XS9hWjl29YUwj5h0FEREQLbt35q3/1Mx98/N6n15+/+v5v//jAU0fCKBgYrZTKxaSVtBvJFddftOmi9dfffHW3e0r0U0Rk+fLlhw4dmpqaqlarp/9oamoKwMqVK7vUNVrkmNOWtCiwb9i87g2b13W7I0RERLRERYXwdW+98HVvvfCGj//iD/929+P3Pp205ocuq8sGLrlu545rtrMcF52DVq5ceejQocnJyY0bf2pxx+TkJBjgacEwwBMRERFR98Wl+E03vv6a9181fWwmS7LKQLly2uJkonPN5s2bH3jggXvvvffyy39q6v59990HYNOmTV3qFy1y5uc/hYiIiIjoNWGMDK8YHFu/jOmdznEf/vCHAXzjG984/eCPf/zjAwcOXHjhhawhRwuEAZ6IiIiIiOjMXH/99Rs2bLj77rs///nPd47MzMx0Uv3HPvaxrnaNFjMGeCIiIiIiojMjIl/72teWLVv227/921u2bLn22mtXrVr1+OOP33LLLR/96Ee73TtatBjgiYiIiIiIztiuXbvuueeeX/qlX5qZmbnnnnvWrl37uc997stf/nIQcKMxWij82yIiIiIiInolNm/e/PWvf73bvaAlhCPwRERERERERD2AAZ6IiIiIiIioBzDAExEREREREfUABngiIiIiIiKiHsAAT0RERERERNQDGOCJiIiIiIiIegADPBEREREREVEPYIAnIiIiIiIi6gEM8EREREREREQ9gAGeiIiIiIiIqAcwwBMRERERERH1AAZ4IiIiIiIioh7AAE9ERERERETUAxjgiYiIiIiIiHoAAzwRERERERFRD2CAJyIiIiIiIuoBDPBEREREREREPYABnoiIiIiIiKgHMMATERERERER9QAGeCIiIiIiIqIewABPRERERERE1AMY4ImIiIiIiIh6AAM8ERERERERUQ9ggCciIiIiIiLqAQzwRERERERERD2AAZ6IiIiIiIioBzDAExEREREREfUABngiIiIiIiKiHsAAT0RERERERNQDGOCJiIiIiIiIegADPBEREREREVEPYIAnIiIiIiIi6gEM8EREREREREQ9gAGeiIiIiIiIqAcwwBMRERERERH1AAZ4IiIiIiIioh7AAE9ERERERETUAxjgiYiIiIiIiHoAAzwRERERERFRD2CAJyIiIiIiIuoBDPBEREREREREPYABnoiIiIiIiKgHMMATERERERER9QAGeCIiIiIiIqIewABPRERERERE1AMY4ImIiIiIiIh6AAM8ERERERERUQ9ggCciIiIiIiLqAQzwRERERERERD2AAZ6IiIiIiIioBzDAExEREREREfUABngiIiIiIiKiHsAAT0RERERERNQDGOCJiIiIiIiIegADPBEREREREVEPYIAnIiIiIiIi6gEM8EREREREREQ9gAGeiIiIiIiIqAcwwBMRERERERH1AAZ4IiIiIiIioh7AAE9ERERERETUAxjgiYiIiIiIiHoAAzwRERERERFRD2CAJyIiIiIiIuoBDPBEREREREREPYABnoiIiIiIiKgHMMATERERERER9YDFFuB/8zd/U36WDRs2dLtrRERERERERK/cYgvwzz77bLe7QERERERERHT2Bd3uwFm2Z88eALVarVKpdLsvRERERERERGfNohqBz/N8//79q1atYnonIiIiIiKiRWZRBfgDBw7keb5t27Zud4SIiIiIiIjoLFtUU+g78+e3bt36ta997Vvf+tahQ4e2bNly+eWXf/jDHw6Cn32mTz/99F133XXq4fj4+GvUVyIiIiIiIqIzIara7T6cNX/wB3/wG7/xG8VisdVqnX78oosuuv3227du3frSl3zpS1/6tV/7tZcef+973/uNb3xjoTpKREREREREdIYW1RT6U1vQf/GLX9y3b9/U1NR3vvOdHTt2PPLIIzfddJNzrrvdIyIiIiIiInrFFtUI/F//9V8//fTT11133a5du04dnJmZ2bZt28TExG233fbBD37wRS959NFH//7v//7Uw4mJic9//vPgCDwRERERERGdY3pyDXxfX1+9Xj/18DOf+cynPvUpADfccMNLn1ytVm+55ZbPfe5z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hYyi74Jf6NyA7k0ZY/yuAYG0Z8+e8vLyXr167d279/CzK1asmDJlSm1t7eDBg/v16/fee++1t7ffdNNNjz76aCjEgxs4Oq7rXnrppa+//rplWVVVVeFweNOmTY7jDBky5OWXX2YaKo4ZPRUyir4LmcPXMOCkRYDHMer6k0NENm7ceM8997z99tstLS1VVVVf//rX77rrrs42NQG6lkqlHn/88ccee2zLli2O44waNWrixIn33HNPLBbzuzQEGz0VMoq+CxnC1zDgpEWABwAAAAAgAHgGHgAAAACAACDAAwAAAAAQAAR4AAAAAAACgAAPAAAAAEAAEOABAAAAAAgAAjwAAAAAAAFAgAcAAAAAIAAI8AAAAAAABAABHgAAAACAACDAAwAAAAAQAAR4AAAAAAACgAAPAAAAAEAAEOABAEdh0qRJSqlJkyZ10WbevHlKKaXU8uXLDx5UB3zzm9/s+kfMnTv3YOM//vGPnTU788wz020uvvjiLt7tW9/6ljqSaDQ6YsSIqVOnzpkzp+t6AAAAThAEeABAVj333HOe53XR4PMk6g0bNhz868CCBQt27959tGWkUql169a98MIL06dPnzRpUkdHx9G+AwAAQJYR4AEAWbV3794FCxZ0djaVSr388suf+SZ/+MMfRCQUComI1vrZZ5/tun1xcfHKT3rzzTcfeuihgQMHisj8+fN/+MMfHt1tiNx3331KqS7uBQAA4PgiwAMAsqesrExEusjbr732WnNzc7pZF37/+9+LyGWXXTZ69Gg5kOe7EA6HT/+kCRMmzJo1a82aNaeeeqqI3H///XV1dZ//RhzHefLJJz9/ewAAgC+OAA8AyJ5rr71WRObOnau1PmKD9Pz5dLPOrFq1at26dSIyc+bM6dOni8jixYu3b99+DPXE4/G///u/FxHP89asWfM5r2pqarr11ls3btx4DD8RAADgmBHgAQDZc/7555eVle3Zs2fhwoWHn3Vd98UXXxSRadOmdfEm6fH23NzcK6+8Mt3SGDN79uxjK2nYsGHpFx999FHXLaurq++9996pU6f27t37N7/5zbH9OAAAgGNGgAcAZI9t2+nR9Weeeebws2+99VZ9ff2AAQPGjh3bxZukA/zUqVNzcnKGDRuWngP/mbPoO3Nw6L6ioqLrluvXr//pT3/6wgsvtLW1HdvPAgAA+CII8ACArLruuutEZM6cOYfPok/Pn58+fbpSqrPL33vvva1bt4rIDTfckD6SHoT/y1/+smnTpmOo5+GHH06/OP3007tuee655x5cA2/+/PnH8LMAAAC+CAI8ACCrLrzwwpKSkpqamnfffffQ41rr5557Tj5r/nx6+bri4uLJkyenj6QfgxeRp59++vOX0dTUtGjRoiuvvHLevHnpN+nfv3/Xl+Tn5x9cA2/kyJGf/2cBAAAcFwR4AEBW2bZ9zTXXyGFr0b/zzjt79uzp06fP2Wef3dm1Wuv0s+7Tp08Ph8Ppg6NGjRoyZIh0GeBramrUJxUVFZ133nnpLev69ev385///HjcHAAAQAYR4AEA2XZwFr0x5uDBg+vPdzF//q233qqpqRGRmTNnHno8PQi/evXq9Or0n19JSckdd9yxZs2a8vLyo7oQAAAg+0J+FwAAOOlMmDChuLh4586dixcvPvfcc0XEGDN37lw5ZD78EaXnz5eWlg4fPry+vv7QN/zpT38qIk8//fSPfvSjwy8sLi5+/fXXP3WwtLT0MxeuAwAAOHEQ4AEA2RYKhaZOnfpf//VfzzzzTDrAL126dMeOHWVlZeedd15nVzmOkw75tbW1paWlR2zTWYAPh8OfuUYdAADACY4p9ACAo5Ce3+44ThdtDp61rE4/ZdIj7c8++2x6Fv3B+fNdXDJv3ryGhoauy1u/fv2qVau6bgMAABBQBHgAwFEoLi4Wka4fNT94tqSkpLM2EydO7NGjx44dO5YsWSIin3/+fGFhYSKRMIdZsWJFutlRrUUPAAAQIAR4AMBRGDt2rIjU1tYeDMyfYox56aWXRKSioqJ3796dvU84HL766qtF5Nlnn125cuWmTZuKi4vHjx/fWfuOjo4XX3xRRKZOnRqNRg9vcMYZZwwaNEgI8AAAoPsiwAMAjsLMmTN79OghItdff/2ePXs+dVZr/YMf/GDhwoUi8p3vfKeL9eTlkFn06f3krrnmGtu2O2v80ksvtba2isjf/M3fdNYmvbj95s2bly1b9vnvCAAAICgI8ACAo1BZWfnoo4+KyMaNGwcNGnT33XfPmTNn2bJl8+bNe+ihh0aPHn3fffeJyOTJk//u7/6u67eaNGlSYWFhdXV1eg/2adOmddH4D3/4g4gUFxdfcsklnbWZMWNG+gWD8AAAoFsiwAMAjs61117761//urS0tK2t7d/+7d+mT58+bty4Sy+99Fvf+tYHH3xgWdbNN9/81FNPdT38LiKRSOSqq64Skebm5qKiookTJ3bWsqmp6ZVXXkn/6FCo0/1TDp1Ff+gO8wAAAN0DAR4AcNRuvfXWjRs3/uQnP7n66qtPPfXUnJycvn37XnzxxbfffvvKlSsff/zx9Fp3n+ngqnVXXXVVOBzurNnzzz+fTCZF5Prrr+/6DdOD8Dt27Fi0aNHnvRkAAICAUIxRAAAAAABw4mMEHgAAAACAACDAAwAAAAAQAAR4AAAAAAACgAAPAAAAAEAAEOABAAAAAAgAAjwAAAAAAAFAgAcAAAAAIAAI8AAAAAAABAABHgAAAACAACDAAwAAAAAQAAR4AAAAAAACgAAPAAAAAEAAEOABAAAAAAgAAjwAAAAAAAFAgAcAAAAAIAAI8AAAAAAABAABHgAAAACAACDAAwAAAAAQAP8fvNaCVuiQ8gcAAAAASUVORK5CYII=" width="672" /></p> @@ -3985,10 +4001,10 @@ <h2>Unsupervised clustering</h2> we can skip that argument.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGxvdCBVTUFQIHdpdGggYXNzaWduZWQgY2x1c3RlcnMiLCJzY2F0ZXI6OnBsb3RVTUFQKG5vcm1hbGl6ZWRfc2NlLFxuICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcIm5uX2NsdXN0ZXJcIikiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGxvdCBVTUFQIHdpdGggYXNzaWduZWQgY2x1c3RlcnMiLCJzY2F0ZXI6OnBsb3RVTUFQKG5vcm1hbGl6ZWRfc2NlLFxuICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwibm5fY2x1c3RlclwiKSJdfQ== --> <pre class="r"><code># plot UMAP with assigned clusters scater::plotUMAP(normalized_sce, - colour_by = "nn_cluster")</code></pre> + color_by = "nn_cluster")</code></pre> <!-- rnb-source-end --> <!-- rnb-plot-begin --> <p><img role="img" src="data:image/png;base64,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d8gmdgAAAAAAxMLRE+Bramq+9rWv7dixY/ny5SeccMLocWvtXXfdJSIrV66cvNEBAAAAAPCaOJM9gHFjjPnrv/5rEbnooouefvrp6ODQ0NDHP/7x1atXn3766eeff/6kDhAAAAAAgFfv6KnAi8jnP//5Bx544J577jnhhBPa29sTicTWrVt931+4cOFPf/pTxzl6fq0AAAAAABxrjqpM63neb37zmxtuuGHlypVDQ0NdXV2nnXbal770pQ0bNrAAHgAAAAAQa0dVBV5Eksnkxz72sY997GOTPRAAAAAAAMbTUVWBBwAAAADgaEWABwAAAAAgBgjwAAAAAADEAAEeAAAAAIAYIMADAAAAABADBHgAAAAAAGKAAA8AAAAAQAwQ4AEAAAAAiAECPAAAAAAAMUCABwAAAAAgBgjwAAAAAADEAAEeAAAAAIAYIMADAAAAABADBHgAAAAAAGKAAA8AAAAAQAwQ4AEAAAAAiAECPAAAAAAAMUCABwAAAAAgBgjwAAAAAADEAAEeAAAAABBv69evN8YYY8IwnOyxTCACPAAAAAAAMUCABwAAAADgZTn77LONMddee+2kfDoBHgAAAACAGCDAAwAAAAAQAwR4AAAAAAAmwfbt2//jP/5j/fr1L/N8AjwAAAAA4GBbt241xkybNk1Edu3a9YlPfGLOnDnpdHrRokWXXXbZtm3bXvXJr0IYhtddd93KlSvr6uqam5tPP/30L3/5y8PDwy9xyd13322MaWxsfOFLP//5z40xxx133EHH77///gsvvHDJkiWZTGbu3Llve9vb7rzzTlWNXr300kuNMX/4wx9E5OqrrzbGvOlNbxp7+b333nv++edPnTo1uvFLLrlk9erVB31E9EXNmjVLRL71rW8tXLjw4osvvvnmm1/m9+C9zPMAAAAAAMegp5566m1ve1tVVdUb3/jGMAx///vf/+xnP7vzzjufeOKJJUuWvJaTX6Zdu3ZdfPHFDz744OiRRx999NFHH/3Rj370yCOPzJkz59Xf2xhXXXXVd7/73dGn27dv3759+z333HPZZZf99Kc/FZGZM2cef/zxHR0duVyura2ttbW1vb09Otn3/X/5l3+59tprR9P+5s2bN2/efMstt3z+85//yle+8sKP+9nPfvbpT386emyMeZmDpAIPAAAAADi0YrF44YUXvv/979+6destt9xy6623Pvfcc4sWLcrlcv/4j//4Wk5+mVT1ve9974MPPlhbW/v973//qaee2rp164033jhlypS9e/dedNFF1trXfJfyi1/8IkrvV1xxxdq1a7u6utatW/ehD31IRG666abf/OY3IvL1r39948aNp59+uoj8/d///caNG3/2s59Fl3/ta1/7t3/7N1W9/PLLH3jggZ07d959993nnE085DoAACAASURBVHOOiHz1q1/9zne+c9DHDQ4OfvKTn1y8ePEvf/nLHTt2vPye9gR4AAAAAMChDQwMNDQ0XH/99Z5Xmb7d2tr62c9+VkReOD/8FZ38Mt1yyy2PP/6453kPPfTQFVdcsWzZsnnz5l1++eW/+tWvROSxxx5bt27dq3vnsaKIfu65537/+98/6aST2traXve61/3kJz9ZunSpiNx3330vce2ePXu++c1visi3v/3tG2+88Ywzzpg5c+Y555xz9913f+QjHxGRa665pq+vb+wl2Wy2ra3tySefPP/882fNmkUFHgAAAAAwDj71qU8ddGThwoUi0t/f/xpPfjm+973vicgll1yyfPnyscdPO+20t7/97XPnzh2XAN/b2ysiQRCMPWiMueeee7Zs2fIP//APL3HtDTfckMvljj/++Kuuuuqgl7797W+n0+mhoaF77733oJc++9nPplKpVzpOAjwAAAAA4EVFVeixXNcdl5NfjmeffVZEzj333Be+9Nvf/rajo+Pyyy9/Le8fOeuss0Tkd7/73bnnnnvXXXcNDQ1Fx6dOnTp//vy2traXuPaZZ54RkbPPPvuFhfTa2toTTzxRRB599NGDXjrppJNexTgJ8AAAAAAmVtjbW9q8pbR1qx3KTvZY8IpNnz59gk7+s7q6ugYHB0Vk7ty54/i2L/R3f/d3l19+uTFm1apV559/fmNj4/Lly6+44opVq1b5vv/S1z7//PMi8u1vf9scShTd9+/ff9BVr+6Logs9AAAAgAmhQTB0111Dq37r798vqm51rTulJbVsWd3bz0mOU+dwHAaO8wrqvq/o5D+rWCxGD5LJ5Di+bblcPuiI4zg33njjlVdeeccdd6xatWrt2rVPPfXUU0899YMf/GDx4sU///nPTz755Bd7t2h9+/Tp05uaml7snClTphx0pKqq6lWMnAAPAAAAYPwFXV1dX/rfhSef9AcHjKqIqDHGdXMPP+Lv2FH/3gsyK1ZM9hhxpJs9e3YqlSoWi52dna973evG6207OjoOeXz58uXLly//8pe/nMvlVq9e/dvf/vbGG2987rnn3vve927dunW0M99BFi1atHv37o9+9KPXXHPNeI3wxTCFHgAAAMA4CwcG9vzzF4b/5z6/v99YFRFVEavqB2F2aPCuXw/+6q5g377JHiaOdI7jLFiwQETuueeeF7560UUXpdPpK6+88iXeoVQqje7NPuqgFem+71977bXXXnttNBleRKqrq9/61rd+4xvfuOuuu0Rkx44doy+9ULS//Yu12f/Vr35155137t279yUG+fIR4AEAAACMs/5bbhl+9GGr1oioEVU50N1LRculwf/69fADD07iCBEX0WbsN9544+bNm8ce7+jo+PWvf10sFs8888xDXlhXVycihUJh7dq1Y4/fd999v//978ceSSQS3/nOd66++uof/OAHB73JaAe+1tbWscfH/ijwgQ98QERWrVq1atWqgy6/9dZb3/Oe91x66aWvouH8IRHgAQAAAIwnLZV6/9/NYlVEjBGjYoyIEWPEiIgRq6r5fP7Jcdj9C0e9K6+8cuHChaVS6dRTT40mtO/Zs+eXv/zlO97xjkKhcMIJJ7zrXe865IUnnnhitHL+0ksvfeSRR8Iw7O3t/clPfnLeeefNnj37oJPPPvtsEfne97739a9/ffPmzf39/Z2dnTfffPPFF18sIqeeeupBAf6xxx4rl8vWWhE544wzLr30UhG54IILvvCFL6xbt663t/fZZ5/913/91w9+8IPRLTQ2No7Lt8EaeAAAAADjqbBuXTgwKEZMNHN+7NZapvJMRQuPPa6lknlVrbxw7EgkEr/85S//6q/+auPGjR/96EfHvjRr1qzbbrvtxYrbmUzmG9/4xqc+9alNmza94Q1vSCQSUT/5JUuW3HDDDdG+caO+853vPPDAA52dnZ/73Oc+97nPHfQpt99+++jTRYsW/eEPf/jP//zPmpqa00477f777xeR66+/vlAo3HHHHV/96le/+tWvjr38wx/+8Ne//vXX9BWMQYAHAAAAMD5sPl986qm+m28WtXJQdB/DGFERf3+PvEhXMGCspUuXPv7449ddd90DDzzw5JNPBkGwZMmSs88++zOf+Uwmk3mJC6+66qpFixZdd911Tz/99MDAQHt7+/ve975//ud/zmazl19++dSp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5ZY/+ZM/8X1/oSe1kLgHnoiIiIiIiF6e7ERx6KV0ZqygfG1HzFRbtGNVveUYszjEfffd9+CDDwLo7u5ubW197LHHtm3b9thjj33zm99MpVKzONAiwgCeiIiIiIiIzpbW+uCOkYH9k/0HJqoHO1fXH909dvGrOpuXJWZllK997WsPPvhgR0fH1772teuvvx5Af3//O9/5zm3btt1///0PPPDArIyy6HAJPREREREREZ2tA88M9++bGHppKtUSbetJtq9INS9LTI3kj+2Z2P3j/snh/KyMcv/99wP4whe+EETvALq6ur75zW82NTX93d/9XS6Xm5VRFh0G8ERERERERHRWMmPFwYNTw4fTzcsS8ZRjWIY0hB0xU62x+tZo//6J/U8PQZ/rKMVice/evaZp3nrrrbXHm5qabrjhhomJiUcfffRcx1icGMATERERERHRWRnuS/cfmEg0OIZ1ciwZrbOdiJlPl9NjhXMcJZ/Pe54nhDCMkzfVR6NRAMeOHTvHIRYpBvBERERERER0VrLjRQCR+OmLqTkxE0B2onSOozQ2Ni5btsx13SeffLL2eC6Xe+KJJwD09/ef4xCLFAN4IiIiIiIiOiu+rwAIKU77qjDEwMFJ31XnPtC73/1uAO9973uff/754MjQ0NBb3/rW48ePA5iYmPhFb75wMYAnIiIiIiKisxI0ivPOEKL7rt+5ut6OzkKzsz/8wz98zWtes3///g0bNqxYseKiiy5atmzZtm3bbrrpJgBtbW3nPsRixACeiIiIiIiIzkpDe7xzdX0hXT71Ja10IeMJIerbouc+kG3bP/rRj/7yL//y1a9+9eTkpO/7d999909/+tP169cD6OrqOvchFiP2gSciIiIiIqKz0rEqdXT3WD7tWk45lrKrx7XSE8N531ctPUknZs3KWFLKD37wgx/84AdrDw4MDADo7OyclSEWHQbwREREREREdFZM27h4S4fnqv79E/l0yYlZ0hReSRVzru+rVVe1rtk0O4vbjx49WigUli9fHpSdD5RKpccee8xxnC1btszKKIsOl9ATERERERHR2Wpalrji9cvXXt3e3J1MNkWmThRSrdH2lamrbu656paeYJP8ubv//vsvvvjiBx98sPbg17/+9cnJybvuuqu5uXlWRll0hNZ6oedwHtm7d+8ll1wC4M1vfvO3vvWthZ4OERERERHR+UhrnZ0oZcaKvqvsmFnfFnNmo3Zd1eOPP/7a1742lUr94Ac/uOaaa7TW3//+99/ylrcUCoXt27dfc801szjWIsIl9ERERERERPTyCCGSjZFkY2SOrn/TTTfdd999n//851/1qletWbNmfHx8dHQUwAMPPLBko3dwCT0RERERERGdh/7qr/7qn/7pn66++urBwUGt9datWx955JGPfexjCz2vhcQMPBEREREREZ2P3vnOd77zne9c6FmcR5iBJyIiIiIiIloEGMATERERERERLQIM4ImIiIiIiIgWAQbwRERERERERIsAA3giIiIiIiKiRYABPBEREREREdEiwACeiIiIiIiIaBFgAE9ERERERES0CDCAJyIiIiIiIloEGMATERERERERLQIM4ImIiIiIiIgWAQbwRERERERERIsAA3giIiIiIiI6r33gAx9oaWk506uHDh266667Wltbo9HounXrPvWpT5XL5fmc3rwxF3oCREREREREtMgopfPpYqngKV+ZlhFN2JG4PUdjjY+Pf/3rXxdCnPbVXbt23XrrrUNDQ47jtLe3v/jii5/85CcfffTRRx55xLbnakoLhRl4IiIiIiIiehmyE4Wje0eGj0we3TtyfP9o3+7h/oNj/QfH3JI3uwO5rvujH/3otttuGxsbO+0JWus77rhjaGjovvvum5iY6Ovr27NnT2dn5xNPPPHZz352didzPmAAT0RERERERGcrPZYfPjo5OZItZMrRhB1LOk7Mzk4WRo5Ozm4M/4EPfCAWi910003bt28/0zmPPvrooUOHrrrqqs997nPRaBTAunXrvvKVrwD43Oc+p7WercmcJ7iEnoiIiIiIiM6KV/ZH+6fSY/lYnWNaRnDQBOyIWcyXJ4azTtTqWNk4K2Nddtll99xzD4B8Pv/www+f9pyHHnoIwF133SXldHL6xhtvbG9vHxoaeu6556666qpZmcx5ggE8ERERERERnZX0eH5qNO9ErWr0HhACkbjtu34+U3JLnuXMQqT5vve9L/hieHj4TAH8gQMHANxwww0zJyOuv/76b3zjG4cPH77AAnguoSciIiIiIqKzUsyVAZw2PheAaZsACrn5qwA/ODgI4NQC9cGRoaGheZvJ/GAAT0RERERERGdF+RrAGerBQ0qRHssrT83PZLTWQYje2Hjyov2mpiYwgCciIiIiIqIlSxoC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tddemzBhwoYNG5YsWXLHHXf4WyEgGk84ghYVaYD2FimFHnicufz8fNPF9773vd6/1hhTWloqqb6+/rhTiSNDhw49h6UCJ+ruAzxnzpyHHnrouFltBQUFCxYskLRhwwYfagU60HjCLbSocBftLVITPfA4c3Pnzm1vb+98OmnSpNN6+dChQ6uqqurq6kaPHt31eF1dnWgT0fdO9wOcmKtZWVnZt2UBp0LjiTRAiwon0N4iBRHgceaefvrps3n52LFj33rrrbVr115xxRVdj7/xxhuSxowZczZvDpzSST/AjY2NixcvzsvL++IXv3jcqdraWnV86QR8ROMJV9CiwnW0t0hBDKGHb+666y5JL774YteD77zzTmVl5eTJk9mWA77Iy8t79NFHv/SlL23atKnrcc/zli1bJmnatGk+lQYk0XjCFbSocB3tLVIQAR6+mT17dnl5+erVqxctWpQ4cvjw4URDef/99/taGs5fxph77rlH0vz587ds2ZI42NDQcN99961bt+7KK6+85ZZbfC0QoPGEM2hR4TraW6QgY631uwaks5qamrKysqKiogMHDpx49p133vnc5z5XW1s7duzYESNGvPnmmy0tLQsWLPjJT34SCjG/A/6IxWI33HDDK6+8EggEysvLw+Hwzp07o9HouHHjXn75ZQZ8IhXQeMIVtKhIfXxZhVsI8OhbPbeJknbs2PHQQw+99tprjY2N5eXlX/nKVx588MHutusA+kckEnnqqad+9rOf7dq1KxqNVlRUzJw586GHHsrKyvK7NCCJxhOuoEVFiuPLKtxCgAcAAAAAwAHMgQcAAAAAwAEEeAAAAAAAHECABwAAAADAAQR4AAAAAAAcQIAHAAAAAMABBHgAAAAAABxAgAcAAAAAwAEEeAAAAAAAHECABwAAAADAAQR4AAAAAAAcQIAHAAAAAMABBHgAAAAAABxAgAcApLNZs2YZY2bNmtXDNStWrDDGGGM2bNjQedB0uPfee3v+Ey+++GLnxb/+9a+7u2zatGmJa6677roe3u2BBx4wJ5OZmTlp0qQ5c+a88MILPdcDAADSFQEeAICe/PKXv4zH4z1c0JtEvX379s5fB1atWrV///7TLSMSiWzduvVXv/rVvHnzZs2a1draerrvAAAAXEeABwCgJwcOHFi1alV3ZyORyMsvv3zKN3n22WclhUIhSZ7nLV26tOfrCwsL3zvWH//4xyeeeGL06NGSVq5c+Q//8A+ndxvSI488Yozp4V4AAECKI8ADANCt0tJSST3k7d///vcNDQ2Jy3rwi1/8QtKNN954ySWXqCPP9yAcDl98rBkzZixcuHDz5s0XXXSRpEWLFtXV1fX+RqLR6DPPPNP76wEAQAoiwAMA0K3bbrtN0osvvuh53kkvSIyfT1zWnY0bN27dulXSnXfeOW/ePElvvPHGnj17zqCe7Ozsv/u7v5MUj8c3b97cy1cdOXLkq1/96o4dO87gLwIAgNRBgAcAoFuf+cxnSktLa2pqVq9efeLZWCy2bNkySXPnzu3hTRL97bm5uTfddFPiSmvtkiVLzqykCy+8MPHgww8/7PnKysrKhx9+eM6cOcOGDfuP//iPM/tzAAAgdRDgAQDoVjAYTPSuP//88yeeffXVVw8ePDhq1KjLLrushzdJBPg5c+bk5ORceOGFiTHwpxxF353OrvshQ4b0fOW2bdu+//3v/+pXv2pubj6zvwUAAFIKAR4AgJ786Z/+qaQXXnjhxFH0ifHz8+bNM8Z09/I333xz9+7dku64447EkUQn/Ntvv71z584zqOfJJ59MPLj44ot7vvKqq67qXANv5cqVZ/C3AABASiHAAwDQk2uuuaa4uLi6unrNmjVdj3ue98tf/lKnGj+fWL6usLBw9uzZiSOJafCSnnvuud6XceTIkbVr1950000rVqxIvMnIkSN7fkl+fn7nGniTJ0/u/d8CAACpiQAPAEBPgsHgrbfeqhPWon/99ddramouuOCCT33qU9291vO8xFz3efPmhcPhxMGKiopx48apxwBfXV1tjlVQUHD11VcntqwbMWLEv/3bv52LmwMAAC4hwAMAcAqdo+ittZ0HO9ef72H8/KuvvlpdXS3pzjvv7Ho80Qm/adOmxOr0vVdcXHz//fdv3ry5rKzstF4IAADSQMjvAgAASHUzZswoLCzcu3fvG2+8cdVVV0my1r744ovqMh7+pBLj50tKSiZOnHjw4MGub/j9739f0nPPPffd7373xBcWFha+8sorxx0sKSk55cJ1AAAgjRHgAQA4hVAoNGfOnJ/+9KfPP/98IsC/9dZbVVVVpaWlV199dXevikajiZBfW1tbUlJy0mu6C/DhcPiUa9QBAIDzDUPoAQDpLDG+PRqN9nBN59lAoNv/LCZ62pcuXZoYRd85fr6Hl6xYsaK+vr7n8rZt27Zx48aerwEAAEggwAMA0llhYaGknqead54tLi7u7pqZM2cOGjSoqqpq3bp1kno/fn7gwIFtbW32BO+8807istNaix4AAJzPCPAAgHR22WWXSaqtre0MzMex1i5fvlzSkCFDhg0b1t37hMPhW265RdLSpUvfe++9nTt3FhYWTp8+vbvrW1tbly1bJmnOnDmZmZknXnDppZeOGTNGBHgAANBrBHgAQDq78847Bw0aJOkLX/hCTU3NcWc9z/v7v//71atXS/rmN7/Zw3ry6jKKPrGf3K233hoMBru7ePny5U1NTZJuv/327q5JLG7/8ccfr1+/vvd3BAAAzlsEeABAOhs6dOhPfvITSTt27BgzZsy3vvWtF154Yf369StWrHjiiScuueSSRx55RNLs2bP/+q//uue3mjVr1sCBAysrKxN7sM+dO7eHi5999llJhYWF119/fXfXzJ8/P/GATngAANAbBHgAQJq77bbb/v3f/72kpKS5uflf/uVf5s2bd8UVV9xwww0PPPDA+++/HwgE7r777sWLF/fc/S4pIyPj5ptvltTQ0FBQUDBz5szurjxy5MhvfvObxJ8Ohbrd8KXrKPquO8wDAACcFAEeAJD+vvrVr+7YsePRRx+95ZZbLrroopycnOHDh1933XV/8Rd/8d577z311FOJte5OqXPVuptvvjkcDnd32UsvvdTe3i7pC1/4Qs9vmOiEr6qqWrt2bW9vBgAAnK8MP/kDAAAAAJD66IEHAAAAAMABBHgAAAAAABxAgAcAAAAAwAEEeAAAAAAAHECABwAAAADAAQR4AAAAAAAcQIAHAAAAAMABBHgAAAAAABxAgAcAAAAAwAEEeAAAAAAAHECABwAAAADAAQR4AAAAAAAcQIAHAAAAAMABBHgAAAAAABxAgAcAAAAAwAEEeAAAAAAAHECABwAAAADAAQR4AAAAAAAc8H8B3XxGtH57YnUAAAAASUVORK5CYII=" width="672" /></p> @@ -4033,7 +4049,7 @@ <h2>Print session info</h2> <!-- rnb-source-begin eyJkYXRhIjoic2Vzc2lvbkluZm8oKSJ9 --> <pre class="r"><code>sessionInfo()</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gU2luZ2xlQ2VsbEV4cGVyaW1lbnRfMS4yNi4wIFN1bW1hcml6ZWRFeHBlcmltZW50XzEuMzQuMFxuIFszXSBCaW9iYXNlXzIuNjQuMCAgICAgICAgICAgICAgR2Vub21pY1Jhbmdlc18xLjU2LjAgICAgICAgXG4gWzVdIEdlbm9tZUluZm9EYl8xLjQwLjAgICAgICAgICBJUmFuZ2VzXzIuMzguMCAgICAgICAgICAgICBcbiBbN10gUzRWZWN0b3JzXzAuNDIuMCAgICAgICAgICAgIEJpb2NHZW5lcmljc18wLjUwLjAgICAgICAgIFxuIFs5XSBNYXRyaXhHZW5lcmljc18xLjE2LjAgICAgICAgbWF0cml4U3RhdHNfMS4zLjAgICAgICAgICAgXG5bMTFdIGdncGxvdDJfMy41LjEgICAgICAgICAgICAgICBvcHRwYXJzZV8xLjcuNSAgICAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBncmlkRXh0cmFfMi4zICAgICAgICAgICAgIHJsYW5nXzEuMS4zICAgICAgICAgICAgICBcbiAgWzNdIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICAgc2NhdGVyXzEuMzIuMCAgICAgICAgICAgIFxuICBbNV0gY29tcGlsZXJfNC40LjEgICAgICAgICAgICBmbGV4bWl4XzIuMy0xOSAgICAgICAgICAgXG4gIFs3XSBEZWxheWVkTWF0cml4U3RhdHNfMS4yNi4wIHZjdHJzXzAuNi41ICAgICAgICAgICAgICBcbiAgWzldIHN0cmluZ3JfMS41LjEgICAgICAgICAgICAgcGtnY29uZmlnXzIuMC4zICAgICAgICAgIFxuIFsxMV0gY3JheW9uXzEuNS4yICAgICAgICAgICAgICBmYXN0bWFwXzEuMS4xICAgICAgICAgICAgXG4gWzEzXSBYVmVjdG9yXzAuNDQuMCAgICAgICAgICAgIHNjdXR0bGVfMS4xNC4wICAgICAgICAgICBcbiBbMTVdIGxhYmVsaW5nXzAuNC4zICAgICAgICAgICAgdXRmOF8xLjIuNCAgICAgICAgICAgICAgIFxuIFsxN10gcm1hcmtkb3duXzIuMjYgICAgICAgICAgICB0emRiXzAuNC4wICAgICAgICAgICAgICAgXG4gWzE5XSBnZ2JlZXN3YXJtXzAuNy4yICAgICAgICAgIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICBcbiBbMjFdIGJpdF80LjAuNSAgICAgICAgICAgICAgICAgYmx1c3Rlcl8xLjE0LjAgICAgICAgICAgIFxuIFsyM10geGZ1bl8wLjQzICAgICAgICAgICAgICAgICBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgXG4gWzI1XSB6bGliYmlvY18xLjUwLjAgICAgICAgICAgIGNhY2hlbV8xLjAuOCAgICAgICAgICAgICBcbiBbMjddIGJlYWNobWF0XzIuMjAuMCAgICAgICAgICAganNvbmxpdGVfMS44LjggICAgICAgICAgIFxuIFsyOV0gaGlnaHJfMC4xMCAgICAgICAgICAgICAgICByaGRmNWZpbHRlcnNfMS4xNi4wICAgICAgXG4gWzMxXSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIFJoZGY1bGliXzEuMjYuMCAgICAgICAgICBcbiBbMzNdIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICAgY2x1c3Rlcl8yLjEuNiAgICAgICAgICAgIFxuIFszNV0gaXJsYmFfMi4zLjUuMSAgICAgICAgICAgICBwYXJhbGxlbF80LjQuMSAgICAgICAgICAgXG4gWzM3XSBSNl8yLjUuMSAgICAgICAgICAgICAgICAgIGJzbGliXzAuNy4wICAgICAgICAgICAgICBcbiBbMzldIHN0cmluZ2lfMS44LjMgICAgICAgICAgICAgbGltbWFfMy42MC4wICAgICAgICAgICAgIFxuIFs0MV0ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG4gWzQzXSBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgIFIudXRpbHNfMi4xMi4zICAgICAgICAgICBcbiBbNDVdIEZOTl8xLjEuNCAgICAgICAgICAgICAgICAgcmVhZHJfMi4xLjUgICAgICAgICAgICAgIFxuIFs0N10gaWdyYXBoXzIuMC4zICAgICAgICAgICAgICBNYXRyaXhfMS43LTAgICAgICAgICAgICAgXG4gWzQ5XSBzcGxpbmVzXzQuNC4xICAgICAgICAgICAgIG5uZXRfNy4zLTE5ICAgICAgICAgICAgICBcbiBbNTFdIHRpZHlzZWxlY3RfMS4yLjEgICAgICAgICAgdmlyaWRpc18wLjYuNSAgICAgICAgICAgIFxuIFs1M10gYWJpbmRfMS40LTUgICAgICAgICAgICAgICB5YW1sXzIuMy44ICAgICAgICAgICAgICAgXG4gWzU1XSBjb2RldG9vbHNfMC4yLTIwICAgICAgICAgIGxhdHRpY2VfMC4yMi02ICAgICAgICAgICBcbiBbNTddIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICAgd2l0aHJfMy4wLjAgICAgICAgICAgICAgIFxuIFs1OV0gZXZhbHVhdGVfMC4yMyAgICAgICAgICAgICBnZXRvcHRfMS4yMC40ICAgICAgICAgICAgXG4gWzYxXSBwaWxsYXJfMS45LjAgICAgICAgICAgICAgIGdlbmVyaWNzXzAuMS4zICAgICAgICAgICBcbiBbNjNdIHZyb29tXzEuNi41ICAgICAgICAgICAgICAgaG1zXzEuMS4zICAgICAgICAgICAgICAgIFxuIFs2NV0gc3BhcnNlTWF0cml4U3RhdHNfMS4xNi4wICBtdW5zZWxsXzAuNS4xICAgICAgICAgICAgXG4gWzY3XSBzY2FsZXNfMS4zLjAgICAgICAgICAgICAgIG1pUUNfMS4xMi4wICAgICAgICAgICAgICBcbiBbNjldIGdsdWVfMS43LjAgICAgICAgICAgICAgICAgbWV0YXBvZF8xLjEyLjAgICAgICAgICAgIFxuIFs3MV0gdG9vbHNfNC40LjEgICAgICAgICAgICAgICBCaW9jTmVpZ2hib3JzXzEuMjIuMCAgICAgXG4gWzczXSBTY2FsZWRNYXRyaXhfMS4xMi4wICAgICAgIGxvY2ZpdF8xLjUtOS45ICAgICAgICAgICBcbiBbNzVdIHNjcmFuXzEuMzIuMCAgICAgICAgICAgICAgY293cGxvdF8xLjEuMyAgICAgICAgICAgIFxuIFs3N10gcmhkZjVfMi40OC4wICAgICAgICAgICAgICBncmlkXzQuNC4xICAgICAgICAgICAgICAgXG4gWzc5XSBEcm9wbGV0VXRpbHNfMS4yNC4wICAgICAgIGVkZ2VSXzQuMi4wICAgICAgICAgICAgICBcbiBbODFdIGNvbG9yc3BhY2VfMi4xLTAgICAgICAgICAgR2Vub21lSW5mb0RiRGF0YV8xLjIuMTIgIFxuIFs4M10gYmVlc3dhcm1fMC40LjAgICAgICAgICAgICBCaW9jU2luZ3VsYXJfMS4yMC4wICAgICAgXG4gWzg1XSBIREY1QXJyYXlfMS4zMi4wICAgICAgICAgIHZpcG9yXzAuNC43ICAgICAgICAgICAgICBcbiBbODddIGNsaV8zLjYuMiAgICAgICAgICAgICAgICAgcnN2ZF8xLjAuNSAgICAgICAgICAgICAgIFxuIFs4OV0gZmFuc2lfMS4wLjYgICAgICAgICAgICAgICB2aXJpZGlzTGl0ZV8wLjQuMiAgICAgICAgXG4gWzkxXSBTNEFycmF5c18xLjQuMCAgICAgICAgICAgIGRwbHlyXzEuMS40ICAgICAgICAgICAgICBcbiBbOTNdIHV3b3RfMC4yLjIgICAgICAgICAgICAgICAgZ3RhYmxlXzAuMy41ICAgICAgICAgICAgIFxuIFs5NV0gUi5tZXRob2RzUzNfMS44LjIgICAgICAgICBzYXNzXzAuNC45ICAgICAgICAgICAgICAgXG4gWzk3XSBkaWdlc3RfMC42LjM1ICAgICAgICAgICAgIGdncmVwZWxfMC45LjUgICAgICAgICAgICBcbiBbOTldIFNwYXJzZUFycmF5XzEuNC4wICAgICAgICAgZHFybmdfMC4zLjIgICAgICAgICAgICAgIFxuIFsgcmVhY2hlZCBnZXRPcHRpb24oXCJtYXgucHJpbnRcIikgLS0gb21pdHRlZCA3IGVudHJpZXMgXVxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gU2luZ2xlQ2VsbEV4cGVyaW1lbnRfMS4yNi4wIFN1bW1hcml6ZWRFeHBlcmltZW50XzEuMzQuMFxuIFszXSBCaW9iYXNlXzIuNjQuMCAgICAgICAgICAgICAgR2Vub21pY1Jhbmdlc18xLjU2LjAgICAgICAgXG4gWzVdIEdlbm9tZUluZm9EYl8xLjQwLjAgICAgICAgICBJUmFuZ2VzXzIuMzguMCAgICAgICAgICAgICBcbiBbN10gUzRWZWN0b3JzXzAuNDIuMCAgICAgICAgICAgIEJpb2NHZW5lcmljc18wLjUwLjAgICAgICAgIFxuIFs5XSBNYXRyaXhHZW5lcmljc18xLjE2LjAgICAgICAgbWF0cml4U3RhdHNfMS4zLjAgICAgICAgICAgXG5bMTFdIGdncGxvdDJfMy41LjEgICAgICAgICAgICAgICBvcHRwYXJzZV8xLjcuNSAgICAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBncmlkRXh0cmFfMi4zICAgICAgICAgICAgIHJsYW5nXzEuMS4zICAgICAgICAgICAgICBcbiAgWzNdIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICAgc2NhdGVyXzEuMzIuMCAgICAgICAgICAgIFxuICBbNV0gY29tcGlsZXJfNC40LjEgICAgICAgICAgICBmbGV4bWl4XzIuMy0xOSAgICAgICAgICAgXG4gIFs3XSBEZWxheWVkTWF0cml4U3RhdHNfMS4yNi4wIHZjdHJzXzAuNi41ICAgICAgICAgICAgICBcbiAgWzldIHN0cmluZ3JfMS41LjEgICAgICAgICAgICAgcGtnY29uZmlnXzIuMC4zICAgICAgICAgIFxuIFsxMV0gY3JheW9uXzEuNS4yICAgICAgICAgICAgICBmYXN0bWFwXzEuMS4xICAgICAgICAgICAgXG4gWzEzXSBYVmVjdG9yXzAuNDQuMCAgICAgICAgICAgIHNjdXR0bGVfMS4xNC4wICAgICAgICAgICBcbiBbMTVdIGxhYmVsaW5nXzAuNC4zICAgICAgICAgICAgdXRmOF8xLjIuNCAgICAgICAgICAgICAgIFxuIFsxN10gcm1hcmtkb3duXzIuMjYgICAgICAgICAgICB0emRiXzAuNC4wICAgICAgICAgICAgICAgXG4gWzE5XSBnZ2JlZXN3YXJtXzAuNy4yICAgICAgICAgIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICBcbiBbMjFdIGJpdF80LjAuNSAgICAgICAgICAgICAgICAgYmx1c3Rlcl8xLjE0LjAgICAgICAgICAgIFxuIFsyM10geGZ1bl8wLjQzICAgICAgICAgICAgICAgICBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgXG4gWzI1XSB6bGliYmlvY18xLjUwLjAgICAgICAgICAgIGNhY2hlbV8xLjAuOCAgICAgICAgICAgICBcbiBbMjddIGJlYWNobWF0XzIuMjAuMCAgICAgICAgICAganNvbmxpdGVfMS44LjggICAgICAgICAgIFxuIFsyOV0gaGlnaHJfMC4xMCAgICAgICAgICAgICAgICByaGRmNWZpbHRlcnNfMS4xNi4wICAgICAgXG4gWzMxXSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIFJoZGY1bGliXzEuMjYuMCAgICAgICAgICBcbiBbMzNdIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICAgY2x1c3Rlcl8yLjEuNiAgICAgICAgICAgIFxuIFszNV0gaXJsYmFfMi4zLjUuMSAgICAgICAgICAgICBwYXJhbGxlbF80LjQuMSAgICAgICAgICAgXG4gWzM3XSBSNl8yLjUuMSAgICAgICAgICAgICAgICAgIGJzbGliXzAuNy4wICAgICAgICAgICAgICBcbiBbMzldIHN0cmluZ2lfMS44LjMgICAgICAgICAgICAgbGltbWFfMy42MC4wICAgICAgICAgICAgIFxuIFs0MV0ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG4gWzQzXSBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgIFIudXRpbHNfMi4xMi4zICAgICAgICAgICBcbiBbNDVdIEZOTl8xLjEuNCAgICAgICAgICAgICAgICAgcmVhZHJfMi4xLjUgICAgICAgICAgICAgIFxuIFs0N10gaWdyYXBoXzIuMC4zICAgICAgICAgICAgICBNYXRyaXhfMS43LTAgICAgICAgICAgICAgXG4gWzQ5XSBzcGxpbmVzXzQuNC4xICAgICAgICAgICAgIG5uZXRfNy4zLTE5ICAgICAgICAgICAgICBcbiBbNTFdIHRpZHlzZWxlY3RfMS4yLjEgICAgICAgICAgdmlyaWRpc18wLjYuNSAgICAgICAgICAgIFxuIFs1M10gYWJpbmRfMS40LTUgICAgICAgICAgICAgICB5YW1sXzIuMy44ICAgICAgICAgICAgICAgXG4gWzU1XSBjb2RldG9vbHNfMC4yLTIwICAgICAgICAgIGxhdHRpY2VfMC4yMi02ICAgICAgICAgICBcbiBbNTddIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICAgd2l0aHJfMy4wLjAgICAgICAgICAgICAgIFxuIFs1OV0gZXZhbHVhdGVfMC4yMyAgICAgICAgICAgICBnZXRvcHRfMS4yMC40ICAgICAgICAgICAgXG4gWzYxXSBwaWxsYXJfMS45LjAgICAgICAgICAgICAgIGdlbmVyaWNzXzAuMS4zICAgICAgICAgICBcbiBbNjNdIHZyb29tXzEuNi41ICAgICAgICAgICAgICAgaG1zXzEuMS4zICAgICAgICAgICAgICAgIFxuIFs2NV0gc3BhcnNlTWF0cml4U3RhdHNfMS4xNi4wICBtdW5zZWxsXzAuNS4xICAgICAgICAgICAgXG4gWzY3XSBzY2FsZXNfMS4zLjAgICAgICAgICAgICAgIG1pUUNfMS4xMi4wICAgICAgICAgICAgICBcbiBbNjldIGdsdWVfMS43LjAgICAgICAgICAgICAgICAgbWV0YXBvZF8xLjEyLjAgICAgICAgICAgIFxuIFs3MV0gdG9vbHNfNC40LjEgICAgICAgICAgICAgICBCaW9jTmVpZ2hib3JzXzEuMjIuMCAgICAgXG4gWzczXSBTY2FsZWRNYXRyaXhfMS4xMi4wICAgICAgIGxvY2ZpdF8xLjUtOS45ICAgICAgICAgICBcbiBbNzVdIGZzXzEuNi40ICAgICAgICAgICAgICAgICAgc2NyYW5fMS4zMi4wICAgICAgICAgICAgIFxuIFs3N10gY293cGxvdF8xLjEuMyAgICAgICAgICAgICByaGRmNV8yLjQ4LjAgICAgICAgICAgICAgXG4gWzc5XSBncmlkXzQuNC4xICAgICAgICAgICAgICAgIERyb3BsZXRVdGlsc18xLjI0LjAgICAgICBcbiBbODFdIGVkZ2VSXzQuMi4wICAgICAgICAgICAgICAgY29sb3JzcGFjZV8yLjEtMCAgICAgICAgIFxuIFs4M10gR2Vub21lSW5mb0RiRGF0YV8xLjIuMTIgICBiZWVzd2FybV8wLjQuMCAgICAgICAgICAgXG4gWzg1XSBCaW9jU2luZ3VsYXJfMS4yMC4wICAgICAgIEhERjVBcnJheV8xLjMyLjAgICAgICAgICBcbiBbODddIHZpcG9yXzAuNC43ICAgICAgICAgICAgICAgcnN2ZF8xLjAuNSAgICAgICAgICAgICAgIFxuIFs4OV0gY2xpXzMuNi4yICAgICAgICAgICAgICAgICBmYW5zaV8xLjAuNiAgICAgICAgICAgICAgXG4gWzkxXSB2aXJpZGlzTGl0ZV8wLjQuMiAgICAgICAgIFM0QXJyYXlzXzEuNC4wICAgICAgICAgICBcbiBbOTNdIGRwbHlyXzEuMS40ICAgICAgICAgICAgICAgdXdvdF8wLjIuMiAgICAgICAgICAgICAgIFxuIFs5NV0gZ3RhYmxlXzAuMy41ICAgICAgICAgICAgICBSLm1ldGhvZHNTM18xLjguMiAgICAgICAgXG4gWzk3XSBzYXNzXzAuNC45ICAgICAgICAgICAgICAgIGRpZ2VzdF8wLjYuMzUgICAgICAgICAgICBcbiBbOTldIGdncmVwZWxfMC45LjUgICAgICAgICAgICAgU3BhcnNlQXJyYXlfMS40LjAgICAgICAgIFxuIFsgcmVhY2hlZCBnZXRPcHRpb24oXCJtYXgucHJpbnRcIikgLS0gb21pdHRlZCA4IGVudHJpZXMgXVxuIn0= --> <pre><code>R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.4 LTS @@ -4103,27 +4119,27 @@ <h2>Print session info</h2> [69] glue_1.7.0 metapod_1.12.0 [71] tools_4.4.1 BiocNeighbors_1.22.0 [73] ScaledMatrix_1.12.0 locfit_1.5-9.9 - [75] scran_1.32.0 cowplot_1.1.3 - [77] rhdf5_2.48.0 grid_4.4.1 - [79] DropletUtils_1.24.0 edgeR_4.2.0 - [81] colorspace_2.1-0 GenomeInfoDbData_1.2.12 - [83] beeswarm_0.4.0 BiocSingular_1.20.0 - [85] HDF5Array_1.32.0 vipor_0.4.7 - [87] cli_3.6.2 rsvd_1.0.5 - [89] fansi_1.0.6 viridisLite_0.4.2 - [91] S4Arrays_1.4.0 dplyr_1.1.4 - [93] uwot_0.2.2 gtable_0.3.5 - [95] R.methodsS3_1.8.2 sass_0.4.9 - [97] digest_0.6.35 ggrepel_0.9.5 - [99] SparseArray_1.4.0 dqrng_0.3.2 - [ reached getOption("max.print") -- omitted 7 entries ]</code></pre> + [75] fs_1.6.4 scran_1.32.0 + [77] cowplot_1.1.3 rhdf5_2.48.0 + [79] grid_4.4.1 DropletUtils_1.24.0 + [81] edgeR_4.2.0 colorspace_2.1-0 + [83] GenomeInfoDbData_1.2.12 beeswarm_0.4.0 + [85] BiocSingular_1.20.0 HDF5Array_1.32.0 + [87] vipor_0.4.7 rsvd_1.0.5 + [89] cli_3.6.2 fansi_1.0.6 + [91] viridisLite_0.4.2 S4Arrays_1.4.0 + [93] dplyr_1.1.4 uwot_0.2.2 + [95] gtable_0.3.5 R.methodsS3_1.8.2 + [97] sass_0.4.9 digest_0.6.35 + [99] ggrepel_0.9.5 SparseArray_1.4.0 + [ reached getOption("max.print") -- omitted 8 entries ]</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <!-- rnb-text-end --> </div> -<div id="rmd-source-code">LS0tCnRpdGxlOiAiUmVhZGluZywgZmlsdGVyaW5nLCBhbmQgbm9ybWFsaXppbmcgc2NSTkEtc2VxIGRhdGEiCmF1dGhvcjogRGF0YSBMYWIgZm9yIEFMU0YKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciB0byBjZWxscyB1c2luZyBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAKLSBDYWxjdWxhdGUgcXVhbGl0eSBjb250cm9sIG1lYXN1cmVzIG9uIHNjUk5BLXNlcSBkYXRhCi0gUmVtb3ZlIGxpa2VseSBjb21wcm9taXNlZCBjZWxscyB3aXRoIGBtaVFDKClgCi0gTm9ybWFsaXplIGV4cHJlc3Npb24gZGF0YSBhY3Jvc3MgY2VsbHMKLSBDYWxjdWxhdGUgYW5kIHBsb3QgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIGV4cHJlc3Npb24gZGF0YSAoUENBLCBVTUFQKQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHJldmlldyBiYXNpYyBwcm9jZXNzaW5nIGZvciBzaW5nbGUtY2VsbCBSTkEtc2VxIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCBhbmQgcHJvY2VlZGluZyB0aHJvdWdoIGZpbHRlcmluZywgcXVhbGl0eSBjb250cm9sLCBub3JtYWxpemF0aW9uLCBhbmQgZGltZW5zaW9uIHJlZHVjdGlvbi4gV2Ugd2lsbCBwZXJmb3JtIHRoZXNlIHRhc2tzIHVzaW5nIHRvb2xzIGZyb20gdGhlIFtCaW9jb25kdWN0b3IgcHJvamVjdF0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnKSwgaW4gcGFydGljdWxhciBbYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3RzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvU2luZ2xlQ2VsbEV4cGVyaW1lbnQuaHRtbCkgYW5kIGZ1bmN0aW9ucyB0aGF0IHdvcmsgd2l0aCB0aG9zZSBvYmplY3RzLgpNdWNoIG9mIHRoZSBtYXRlcmlhbCBpbiB0aGlzIG5vdGVib29rIGlzIGRpcmVjdGx5IGluc3BpcmVkIGJ5LCBhbmQgZHJhd3MgaGVhdmlseSBvbiwgbWF0ZXJpYWwgcHJlc2VudGVkIGluIHRoZSBib29rIFtfT3JjaGVzdHJhdGluZyBTaW5nbGUgQ2VsbCBBbmFseXNpcyB3aXRoIEJpb2NvbmR1Y3Rvcl8gKE9TQ0EpXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EvKS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX292ZXJ2aWV3LnBuZykKClRoZSBkYXRhIHdlIHdpbGwgdXNlIGZvciB0aGlzIG5vdGVib29rIGlzIGRlcml2ZWQgZnJvbSBhIGh1bWFuIGdsaW9ibGFzdG9tYSBzcGVjaW1lbi4KVGhlIHNhbXBsZSB3YXMgcHJvY2Vzc2VkIGJ5IDEweCBHZW5vbWljcyB1c2luZyBhIDMnIFJOQSBraXQgKHYzLjEpLCBzZXF1ZW5jZWQsIGFuZCBxdWFudGlmaWVkIHdpdGggQ2VsbCBSYW5nZXIgNi4wLgpGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIHNhbXBsZSBhbmQgcHJvY2Vzc2luZyBjYW4gYmUgZm91bmQgb24gdGhlIFsxMHggd2Vic2l0ZV0oaHR0cHM6Ly93d3cuMTB4Z2Vub21pY3MuY29tL3Jlc291cmNlcy9kYXRhc2V0cy8yLWstc29ydGVkLWNlbGxzLWZyb20taHVtYW4tZ2xpb2JsYXN0b21hLW11bHRpZm9ybWUtMy12LTMtMS0zLTEtc3RhbmRhcmQtNi0wLTApLgoKCiMjIFNldCBVcAoKVG8gc3RhcnQsIHdlIHdpbGwgbG9hZCBzb21lIG9mIHRoZSBsaWJyYXJpZXMgd2Ugd2lsbCBuZWVkIGxhdGVyLCBhbmQgc2V0IGEgcmFuZG9tIG51bWJlciBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkuCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwoKIyBQbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShnZ3Bsb3QyKQoKIyBUaGUgbWFpbiBjbGFzcyB3ZSB3aWxsIHVzZSBmb3IgU2luZ2xlIENlbGwgZGF0YQpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKQmVmb3JlIHdlIGdldCB0b28gZmFyLCB3ZSBsaWtlIHRvIGRlZmluZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyB0aGF0IHRoZSBub3RlYm9vayB3aWxsIHVzZSBuZWFyIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LgpXaGlsZSB5b3UgbWlnaHQgbm90IGtub3cgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgZmlsZXMgeW91IHdpbGwgbmVlZCBvciBjcmVhdGUgb3V0cHV0IGZpbGVzIHdoZW4geW91IHN0YXJ0IGFuIGFuYWx5c2lzLCB3ZSBoYXZlIGZvdW5kIGl0IGhlbHBmdWwgdG8ga2VlcCBhbGwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIGEgc2luZ2xlIHBsYWNlIG5lYXIgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuClRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBzb21lYm9keSBjb21pbmcgdG8gdGhlIGNvZGUgbGF0ZXIgdG8gcXVpY2tseSBzZWUgd2hhdCBmaWxlcyBhcmUgbmVlZGVkIGFzIGlucHV0IGFuZCB3aGF0IHdpbGwgYmUgcHJvZHVjZWQgYXMgb3V0cHV0LgpNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGF0IHNvbWVib2R5IGlzIHlvdSEKClRoZSBnZW5lIGV4cHJlc3Npb24gZGF0YSB3ZXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgYSBnZW5lLWJ5LWNlbGwgZXhwcmVzc2lvbiBtYXRyaXggb2YgY291bnRzIGZvciB1c2luZyBDZWxsIFJhbmdlciA2LjAuCldlIGhhdmUgcHJvdmlkZWQgdGhlIHJhdyBkYXRhIGRpcmVjdG9yeSwgYHJhd19mZWF0dXJlX2JjX21hdHJpeGAsIHdoaWNoIGlzIHVzdWFsbHkgcHJvZHVjZWQgYnkgQ2VsbCBSYW5nZXIgYW5kIHBsYWNlZCBpbiBpdHMgYG91dHNgIGRpcmVjdG9yeS4KVGhpcyBkaXJlY3RvcnkgdXN1YWxseSBjb250YWlucyB0aHJlZSBmaWxlczoKLSBgYmFyY29kZXMudHN2Lmd6YCwgYSB0YWJsZSBvZiB0aGUgY2VsbCBiYXJjb2RlcyB0aGF0IDEweCB1c2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSBjb3VudCBtYXRyaXguCi0gYGZlYXR1cmVzLnRzdi5nemAsIGEgdGFibGUgb2YgdGhlIGZlYXR1cmVzIChnZW5lcyBpbiB0aGlzIGNhc2UpIGZvciB3aGljaCBleHByZXNzaW9uIHdhcyBxdWFudGlmaWVkLgpUaGlzIHdpbGwgdXN1YWxseSBhbHNvIGluY2x1ZGUgYSBiaXQgb2YgbWV0YWRhdGEgYWJvdXQgdGhlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZ2VuZSBzeW1ib2xzIChpZiB0aGUgZmVhdHVyZXMgYXJlIGdlbmVzKSBhbmQgdGhlIHR5cGUgb2YgZGF0YSB0aGV5IHJlcHJlc2VudCAoZS5nLiwgZ2VuZSBleHByZXNzaW9uIG9yIGFudGlib2R5IGNhcHR1cmUpLgotIGBtYXRyaXgubXR4Lmd6YCwgVGhlIGNvdW50cyB0aGVtc2VsdmVzLCBzdG9yZWQgaW4gYSBzcGFyc2UgWyJNYXRyaXggRXhjaGFuZ2UiIGZvcm1hdF0oaHR0cHM6Ly9tYXRoLm5pc3QuZ292L01hdHJpeE1hcmtldC9mb3JtYXRzLmh0bWwpLgoKQ2VsbCBSYW5nZXIgd2lsbCBhbHNvIGV4cG9ydCB0aGVzZSBkYXRhIGluIGEgc2luZ2xlIGBIREY1YCBmb3JtYXQgZmlsZSB3aXRoIGEgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjYW4gYWxzbyBiZSBpbXBvcnRlZCB3aXRoIHRoZSBzYW1lIGNvbW1hbmRzIHdlIHdpbGwgdXNlIGJlbG93LgpIb3dldmVyLCB3ZSBoYXZlIGZvdW5kIHRoYXQgcHJvY2Vzc2luZyBsYXJnZSBgLmg1YCBmaWxlcyBpcyBvZnRlbiBfbXVjaF8gbGVzcyBlZmZpY2llbnQgaW4gUiwgc28gd2UgcHJlZmVyIHRvIHN0YXJ0IHdpdGggdGhlIG1hdHJpeCBmaWxlcyB3aGVuIHBvc3NpYmxlLgpJbiBwYXJ0aWN1bGFyLCB3ZSB3b3VsZCBub3QgcmVjb21tZW5kIHdvcmtpbmcgd2l0aCBgLmg1YCBmaWxlcyBmb3IgcmF3IGRhdGE7IHRoZSBmaWx0ZXJpbmcgc3RlcHMgd2Ugd2lsbCB1c2UgYmVsb3cgY2FuIHNvbWV0aW1lcyB0YWtlIGhvdXJzIHdoZW4gdXNpbmcgdGhvc2UgZmlsZXMgYXMgaW5wdXQuCgpXZSB3aWxsIGFsc28gbmVlZCBhIHRhYmxlIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMsIHdoaWNoIHdlIGhhdmUgc3RvcmVkIGluIHRoZSBgZGF0YS9yZWZlcmVuY2UvYCBkaXJlY3RvcnkuCgpGaW5hbGx5LCB3ZSB3aWxsIHNldCB1cCB0aGUgb3VyIG91dHB1dCBkaXJlY3RvcnksIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdCwgYW5kIGRlZmluZSB0aGUgbmFtZSBmb3IgdGhlIGZpbGVzIHdlIHdpbGwgc2F2ZSBhZnRlciBhbGwgb2Ygb3VyIGluaXRpYWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KCmBgYHtyIGlucHV0cywgbGl2ZT1UUlVFfQojIElucHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG1haW4gZGF0YSBkaXJlY3RvcnkKZGF0YV9kaXIgPC0gZmlsZS5wYXRoKCJkYXRhIiwgImdsaW9ibGFzdG9tYS0xMHgiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXggZmlsZQpyYXdfbWF0cml4X2RpciA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJyYXdfZmVhdHVyZV9iY19tYXRyaXgiKQoKIyByZWZlcmVuY2UgZGF0YSBkaXJlY3RvcnkKcmVmX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAicmVmZXJlbmNlIikKCiMgUGF0aCB0byBtaXRvY2hvbmRyaWFsIGdlbmVzIHRhYmxlCm1pdG9fZmlsZSA8LSBmaWxlLnBhdGgocmVmX2RpciwgImhzX21pdG9jaG9uZHJpYWxfZ2VuZXMudHN2IikKYGBgCgpgYGB7ciBvdXRwdXRzfQojIE91dHB1dHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIERpcmVjdG9yeSBhbmQgZmlsZSB0byBzYXZlIG91dHB1dApub3JtYWxpemVkX2RpciA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJub3JtYWxpemVkIikKCiMgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3QKaWYgKCFkaXIuZXhpc3RzKG5vcm1hbGl6ZWRfZGlyKSkgewogIGRpci5jcmVhdGUobm9ybWFsaXplZF9kaXIsIHJlY3Vyc2l2ZSA9IFRSVUUpCn0KCiMgb3V0cHV0IFJEUyBmaWxlIGZvciBub3JtYWxpemVkIGRhdGEKb3V0cHV0X3NjZV9maWxlIDwtIGZpbGUucGF0aChub3JtYWxpemVkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xpb2JsYXN0b21hX25vcm1hbGl6ZWRfc2NlLnJkcyIpCmBgYAoKCiMjIFJlYWRpbmcgQ2VsbCBSYW5nZXIgZGF0YQoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBQcmVwcm9jZXNzIGFuZCBJbXBvcnRdKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX3ByZXByb2Nlc3MucG5nKQoKV2hldGhlciB0aGUgMTB4IENlbGwgUmFuZ2VyIGRhdGEgaXMgaW4gTWF0cml4IEV4Y2hhbmdlIGZvcm1hdCBvciBpbiBhbiBIREY1IGZpbGUsIHdlIGNhbiB1c2UgdGhlIGByZWFkMTB4Q291bnRzKClgIGZ1bmN0aW9uIGZyb20gdGhlIGBEcm9wbGV0VXRpbHNgIHBhY2thZ2UgdG8gcmVhZCB0aGUgZGF0YSBpbnRvIFIgYW5kIGNyZWF0ZSBhIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgooVGhvdWdoIGFnYWluLCB3ZSBkbyBub3QgcmVjb21tZW5kIHVzaW5nIHRoZSBgLmg1YCBmaWxlIGlmIHlvdSBjYW4gYXZvaWQgaXQsIF9lc3BlY2lhbGx5XyBmb3IgcmF3ICh1bmZpbHRlcmVkKSBkYXRhLikKCklmIHlvdSB1c2VkIHNvbWV0aGluZyBvdGhlciB0aGFuIENlbGwgUmFuZ2VyIHRvIHByb2Nlc3MgdGhlIHJhdyBkYXRhLCB5b3Ugd291bGQgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24gdG8gcmVhZCBpdCBpbiBhbmQgY3JlYXRlIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgZm9yIG90aGVyIGNvbW1vbiBkYXRhIGZvcm1hdHMgYXJlIGRpc2N1c3NlZCBpbiBbQ2hhcHRlciAzIG9mIE9TQ0FdIChodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EuaW50cm8vZ2V0dGluZy1zY3JuYS1zZXEtZGF0YXNldHMuaHRtbCNyZWFkaW5nLWNvdW50cy1pbnRvLXIpLgoKYGBge3IgcmVhZCBTQ0UsIGxpdmU9VFJVRX0KIyByZWFkIFNDRSBmcm9tIG1hdHJpeCBkaXJlY3RvcnkKcmF3X3NjZSA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHMocmF3X21hdHJpeF9kaXIpCmBgYAoKTGV0J3MgbG9vayBhdCB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBhZnRlciByZWFkaW5nIGl0IGluOgoKYGBge3IgdmlldyBTQ0UsIGxpdmU9VFJVRX0KIyB2aWV3IFNDRSBvYmplY3QKcmF3X3NjZQpgYGAKCldlIGNhbiBzZWUgZnJvbSB0aGlzIHN1bW1hcnkgdGhhdCB0aGlzIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgKFNDRSkgb2JqZWN0IGNvbnRhaW5zIDM2LDYwMSByb3dzLCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBmZWF0dXJlcyAoZ2VuZXMpIHRoYXQgd2VyZSBhbmFseXplZCwgYW5kIDczNCw0OTIgY29sdW1ucywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgYmFyY29kZSB0YWdzIHRoYXQgd2VyZSB1c2VkIGluIHRoZSBleHBlcmltZW50LgpOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBiYXJjb2RlIHRhZ3Mgd2lsbCBoYXZlIGJlZW4gdXNlZCwgYW5kIG1hbnkgb2YgdGhlIGZlYXR1cmVzIG1heSBuZXZlciBoYXZlIGJlZW4gc2VlbiBlaXRoZXIuCk9uZSBvZiBvdXIgZmlyc3Qgc3RlcHMgd2lsbCBiZSB0byBmaWx0ZXIgb3V0IGJhcmNvZGVzIHRoYXQgd2VyZSBuZXZlciBzZWVuLCBvciB0aGF0IG1heSBoYXZlIG9ubHkgYmVlbiBzZWVuIGluIGEgZHJvcGxldCB0aGF0IGRpZCBub3QgY29udGFpbiBhIGNlbGwgKGFuICJlbXB0eSBkcm9wbGV0IikuCgojIyMgU3RydWN0dXJlIG9mIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdAoKSW4gYWRkaXRpb24gdG8gdGhlIG1haW4gYGNvdW50c2AgbWF0cml4LCBsaXN0ZWQgYXMgYW4gYGFzc2F5YCBpbiB0aGUgU0NFIHN1bW1hcnkgYWJvdmUsIHRoZSBTQ0Ugb2JqZWN0IGNhbiBjb250YWluIGEgbnVtYmVyIG9mIG90aGVyIHRhYmxlcyBhbmQgbWF0cmljZXMsIGVhY2ggc3RvcmVkIGluIGEgInNsb3QiIHdpdGggYSBwYXJ0aWN1bGFyIGZvcm1hdC4KVGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIHRoZSBvYmplY3QgY2FuIGJlIHNlZW4gaW4gdGhlIGZpZ3VyZSBiZWxvdywgd2hpY2ggY29tZXMgZnJvbSBhbiBbT1NDQSBJbnRyb2R1Y3Rpb24gY2hhcHRlcl0oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xNi9PU0NBLmludHJvL3RoZS1zaW5nbGVjZWxsZXhwZXJpbWVudC1jbGFzcy5odG1sKS4KCiFbU3RydWN0dXJlIG9mIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0XShkaWFncmFtcy9TaW5nbGVDZWxsRXhwZXJpbWVudC5wbmcpCgpXZSBoYXZlIGp1c3QgbWVudGlvbmVkIHRoZSBtYWluIGBhc3NheWAgc2xvdCwgd2hpY2ggY29udGFpbnMgZnVsbCBtYXRyaWNlcyBvZiBkYXRhIChzdWNoIGFzIHRyYW5zY3JpcHQgY291bnRzKSB3aXRoIGVhY2ggcm93IGEgZmVhdHVyZSBhbmQgZWFjaCBjb2x1bW4gYSBjZWxsLgpUaGVyZSBhcmUgYWxzbyBhIGNvdXBsZSBvZiB0YWJsZXMgZm9yIG1ldGFkYXRhLCBhbmQgYSBzbG90IHRvIHN0b3JlIHJlZHVjZWQtZGltZW5zaW9uIHJlcHJlc2VudGF0aW9ucyAoZS5nLiwgUENBIGFuZC9vciBVTUFQKSBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhLgoKV2UnbGwgc3RhcnQgd2l0aCB0aGUgYHJvd0RhdGFgIHNsb3QsIHdoaWNoIGlzIGEgdGFibGUgb2YgbWV0YWRhdGEgZm9yIGVhY2ggZmVhdHVyZSBpbiBvdXIgb2JqZWN0LgpGb3Igbm93IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgZmVhdHVyZXMudHN2Lmd6YCBmaWxlIHRoYXQgd2UgZGlzY3Vzc2VkIGVhcmxpZXIuCklmIHdlIGhhZCByZWFkIHRoZSBkYXRhIGZyb20gc29tZXRoaW5nIG90aGVyIHRoYW4gQ2VsbCBSYW5nZXIgb3V0cHV0LCB3ZSBtaWdodCBoYXZlIGRpZmZlcmVudCBjb250ZW50cywgYnV0IGVhY2ggcm93IHdvdWxkIHN0aWxsIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgZmVhdHVyZSBvZiB0aGUgU0NFIG9iamVjdC4KCkxldCdzIGxvb2sgYXQgdGhpcyB0YWJsZSwgZXh0cmFjdGluZyBpdCBmcm9tIHRoZSBTQ0Ugb2JqZWN0IHdpdGggdGhlIGByb3dEYXRhKClgIGZ1bmN0aW9uIGFuZCB1c2luZyBgaGVhZCgpYCB0byB2aWV3IG9ubHkgdGhlIGZpcnN0IDYgcm93cy4KCmBgYHtyIHJvd2RhdGF9CiMgdmlldyByb3dEYXRhIChmZWF0dXJlcykKaGVhZChyb3dEYXRhKHJhd19zY2UpKQpgYGAKCllvdSBjYW4gc2VlIHRoYXQgdGhpcyB0YWJsZSBpbmNsdWRlcyBhbiBgSURgIGZvciBlYWNoIGZlYXR1cmUsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIEVuc2VtYmwgZ2VuZSBJRCwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBnZW5lIHN5bWJvbCBpbiB0aGUgYFN5bWJvbGAgY29sdW1uLgpGaW5hbGx5IHRoZXJlIGlzIGEgY29sdW1uIGZvciBgVHlwZWAsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhbHdheXMgIkdlbmUgRXhwcmVzc2lvbiIsIGFzIGFsbCBvZiB0aGUgZmVhdHVyZXMgaW4gdGhpcyBkYXRhIHNldCBhcmUgZ2VuZXMuCklmIHRoZXJlIHdlcmUgYW5vdGhlciBtb2RhbGl0eSBvZiBkYXRhIHRoYXQgaGFkIGJlZW4gYXNzYXllZCBpbiB0aGlzIGV4cGVyaW1lbnQsIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHZhbHVlcyBpbiB0aGlzIGNvbHVtbiwgc3VjaCBhcyAiQW50aWJvZHkgQ2FwdHVyZSIgZm9yIENJVEUtc2VxIGV4cGVyaW1lbnRzLgoKVGhlIHNlY29uZCBzbG90IGlzIHRoZSBgY29sRGF0YWAgdGFibGUsIHdoaWNoIG5vdyBjb3JyZXNwb25kcyB0byB0aGUgYGJhcmNvZGVzLnRzdi5nemAgZmlsZSwgY29udGFpbmluZyBvbmUgcm93IHBlciBjZWxsIGJhcmNvZGUsIG9yLCBtb3JlIGdlbmVyYWxseSwgb25lIHJvdyBwZXIgY29sdW1uIG9mIHRoZSBgY291bnRzYCBhc3NheS4KV2UgY2FuIGxvb2sgYXQgdGhpcyB0YWJsZSB1c2luZyB0aGUgYGNvbERhdGEoKWAgZnVuY3Rpb24gKGFuZCBgaGVhZCgpYCBhZ2FpbiB0byBwcmV2ZW50IHByaW50aW5nIHRoZSB3aG9sZSB0YWJsZSk6CgpgYGB7ciBjb2xkYXRhfQojIHZpZXcgY29sRGF0YSAoY2VsbCBiYXJjb2RlcykKaGVhZChjb2xEYXRhKHJhd19zY2UpKQpgYGAKCkhlcmUgd2Ugc2VlIHRoYXQgdGhlcmUgYXJlIGN1cnJlbnRseSB0d28gY29sdW1uczoKCi0gdGhlIGBTYW1wbGVgIGNvbHVtbiBoYXMgdGhlIHBhdGggb2YgdGhlIGZpbGUgdGhhdCB3ZSByZWFkIGluICh5b3UgbWF5IG5vdCBzZWUgdGhlIHdob2xlIHBhdGggaW4gdGhpcyBkaXNwbGF5KTsgdGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGFsbCByb3dzIGZyb20gYSBzaW5nbGUgc2FtcGxlLgotIHRoZSBgQmFyY29kZWAgY29sdW1uIGNvbnRhaW5zIHRoZSBzZXF1ZW5jZSB0aGF0IHdhcyB1c2VkIHRvIGlkZW50aWZ5IGVhY2ggcG90ZW50aWFsIGRyb3BsZXQgZm9yIHNlcXVlbmNpbmcgKGFuZCBhIG51bWVyaWMgdGFnLCBpbiB0aGlzIGNhc2UpLgpUaGVzZSB3aWxsIGJlIHVuaXF1ZSB3aXRoaW4gYSBzYW1wbGUuCgpBcyB3ZSBwcm9jZWVkIHRvIGNhbGN1bGF0ZSBwZXItY2VsbCBzdGF0aXN0aWNzLCB3ZSB3aWxsIGJlIGFkZGluZyBuZXcgZGF0YSB0byB0aGlzIHRhYmxlLgoKIyMgUXVhbGl0eSBjb250cm9sIGFuZCBmaWx0ZXJpbmcKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogUUMsIEZpbHRlciwgYW5kIE5vcm1hbGl6ZV0oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfcWNfbm9ybS5wbmcpCgojIyMgRmlsdGVyaW5nIGVtcHR5IGRyb3BsZXRzCgpNb3N0IG9mIHRoZSBiYXJjb2RlcyBpbiBhbnkgZ2l2ZW4gMTB4IGV4cGVyaW1lbnQgd2lsbCBub3QgYmUgc2VlbiBhdCBhbGwsIHNvIG91ciBmaXJzdCBzdGVwIGNhbiBiZSB0byBmaWx0ZXIgdGhpcyByYXcgZGF0YSB0byBvbmx5IHRoZSBjZWxscyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdHJhbnNjcmlwdCB0aGF0IHdhcyBjb3VudGVkIHdpdGggdGhhdCBiYXJjb2RlLgoKVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBjb2xTdW1zKClgIGZ1bmN0aW9uIHRvIHF1aWNrbHkgYWRkIHVwIGFsbCB0aGUgY291bnRzIHRoYXQgY29ycmVzcG9uZCB0byBlYWNoIHBvc3NpYmxlIGNlbGwgYmFyY29kZSwgdGhlbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBkb3duIHRvIGp1c3QgdGhvc2UgY29sdW1ucyB3aGVyZSB0aGVyZSBhcmUgbm9uLXplcm8gdG90YWwgY291bnRzLgpXZSB3aWxsIG5lZWQgdG8gZXh0cmFjdCB0aGUgYGNvdW50c2AgbWF0cml4IGZyb20gb3VyIFNDRSBvYmplY3QsIHdoaWNoIHdlIGNhbiBkbyB1c2luZyB0aGUgYGNvdW50cygpYCBmdW5jdGlvbiwgY29udmVuaWVudGx5IGVub3VnaC4KCmBgYHtyIHJlbW92ZSB6ZXJvcywgbGl2ZT1UUlVFfQojIHN1bSBjb2x1bW5zIGZyb20gY291bnRzIG1hdHJpeApiYXJjb2RlX2NvdW50cyA8LSBjb2xTdW1zKGNvdW50cyhyYXdfc2NlKSkKCiMgZmlsdGVyIFNDRSBvYmplY3QgdG8gb25seSByb3dzIHdpdGggY291bnRzID4gMApyYXdfc2NlIDwtIHJhd19zY2VbLCB3aGljaChiYXJjb2RlX2NvdW50cyA+IDApXQpgYGAKCk5vdyB3ZSBjYW4gbG9vayBhdCBob3cgb3VyIFNDRSBvYmplY3QgaGFzIGNoYW5nZWQ6CgpgYGB7ciB6ZXJvLWZpbHRlcmVkIFNDRX0KcmF3X3NjZQpgYGAKCkJ1dCBiYXJjb2RlcyB3aXRoIHplcm8gY291bnRzIGFyZSBub3QgdGhlIG9ubHkgb25lcyB0aGF0IGNvcnJlc3BvbmQgdG8gZHJvcGxldHMgd2l0aG91dCBjZWxscyBpbiB0aGVtIQpFdmVuIGlmIGEgZHJvcGxldCBkb2VzIG5vdCBoYXZlIGEgY2VsbCBpbiBpdCwgdGhlcmUgd2lsbCBvZnRlbiBiZSBzcHVyaW91cyByZWFkcyBmcm9tIFJOQSBzZXF1ZW5jZXMgdGhhdCB3ZXJlIHByZXNlbnQgaW4gdGhlIGV4dHJhY2VsbHVsYXIgc29sdXRpb24sIHdoZXRoZXIgZnJvbSB0aGUgb3JpZ2luYWwgc2FtcGxlIG9yIGZyb20gY2VsbHMgdGhhdCB3ZXJlIGRhbWFnZWQgZHVyaW5nIHNpbmdsZS1jZWxsIGxpYnJhcnkgcHJlcGFyYXRpb24uCgpXZSBjb3VsZCBpZGVudGlmeSB0aGVzZSBiYXJjb2RlcyBzaW1wbHkgYXMgdGhvc2Ugd2l0aCBsb3cgdHJhbnNjcmlwdCBjb3VudHMuCk9yLCB3ZSBjYW4gYmUgYSBiaXQgbW9yZSBjbGV2ZXIhCldlIGNhbiBsb29rIGF0IHRoZSB0cmFuc2NyaXB0IGNvdW50cyBfZnJvbV8gdGhlIGxvd2VzdC1jb3VudCBkcm9wbGV0cyB0byBjcmVhdGUgYW4gZXhwZWN0ZWQgZGlzdHJpYnV0aW9uIG9mIHRyYW5zY3JpcHRzIGluIGRyb3BsZXRzIHRoYXQgZG9uJ3QgY29udGFpbiBjZWxscy4KVGhlbiB3ZSBjYW4gdGVzdCBlYWNoIGRyb3BsZXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGl0cyB0cmFuc2NyaXB0IGRpc3RyaWJ1dGlvbiBkZXZpYXRlcyBmcm9tIHRoYXQgZXhwZWN0YXRpb24uCklmIGl0IGRvZXMsIHRoZW4gd2UgaGF2ZSBwcmV0dHkgZ29vZCBldmlkZW5jZSB0aGF0IHRoZXJlIF9pc18gYSBjZWxsIGluIHRoZXJlLgoKVGhpcyB0ZXN0IHdhcyBmaXJzdCBwcm9wb3NlZCBieSBbTHVuIF9ldCBhbC5fICgyMDE5KV0oaHR0cHM6Ly9kb2kub3JnLzEwLjExODYvczEzMDU5LTAxOS0xNjYyLXkpIGFuZCBpbXBsZW1lbnRlZCBhcyBgZW1wdHlEcm9wcygpYCBpbiB0aGUgYERyb3BsZXRVdGlsc2AgcGFja2FnZS4KVGhpcyBtZXRob2Qgd2FzIHRoZW4gYWRvcHRlZCwgd2l0aCBzb21lIG1vZGlmaWNhdGlvbnMsIGFzIHRoZSBkZWZhdWx0IGNlbGwgZmlsdGVyaW5nIG1ldGhvZCB1c2VkIGJ5IENlbGwgUmFuZ2VyLgpIZXJlIHdlIHdpbGwgdXNlIHRoZSBbYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uXShodHRwczovL3JkcnIuaW8vZ2l0aHViL01hcmlvbmlMYWIvRHJvcGxldFV0aWxzL21hbi9lbXB0eURyb3BzQ2VsbFJhbmdlci5odG1sKSB0byBwZXJmb3JtIGZpbHRlcmluZyB0aGF0IG1vcmUgY2xvc2VseSBtYXRjaGVzIHRoZSBDZWxsIFJhbmdlciBpbXBsZW1lbnRhdGlvbi4KCgpgYGB7ciBjYWxjdWxhdGUgZHJvcGxldCBzdGF0cywgbGl2ZT1UUlVFfQojIGNyZWF0ZSBhIHRhYmxlIG9mIHN0YXRpc3RpY3MgdXNpbmcgZW1wdHlEcm9wc0NlbGxSYW5nZXIKZHJvcGxldF9kZiA8LSBEcm9wbGV0VXRpbHM6OmVtcHR5RHJvcHNDZWxsUmFuZ2VyKHJhd19zY2UpCmBgYAoKTW9zdCB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYE5BYCwgYmVjYXVzZSBpbmRpdmlkdWFsIHN0YXRpc3RpY3Mgd2VyZSBub3QgY2FsY3VsYXRlZCBmb3IgdGhlIGxvdy1jb3VudCBkcm9wbGV0cyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYmFja2dyb3VuZCBkaXN0cmlidXRpb24uCihNb3N0IGRyb3BsZXRzIGRvbid0IGhhdmUgY2VsbHMsIHNvIHRoaXMgbWFrZXMgc29tZSBzZW5zZSEpCgpXZSBjYW4gbG9vayBhdCBqdXN0IHRoZSByb3dzIHdpdGhvdXQgYE5BYCB2YWx1ZXMgYnkgc2VsZWN0ZWQgdGhlIG9uZXMgd2hlcmUgdGhlIEZEUiAod2hpY2ggd2Ugd2lsbCB1c2UgYWdhaW4gc29vbiksIGlzIG5vdCBgTkFgLgoKYGBge3IgZHJvcGxldCBzdGF0c30KIyB2aWV3IHJvd3Mgd2hlcmUgRkRSIGlzIG5vdCBgTkFgCmRyb3BsZXRfZGZbIWlzLm5hKGRyb3BsZXRfZGYkRkRSKSwgXQpgYGAKWW91IHdpbGwgbm90aWNlIHRoYXQgc29tZSBjZWxscyB3aXRoIGhpZ2ggY291bnRzIGFsc28gaGF2ZSBgTkFgIHZhbHVlcyBmb3IgbWFueSBzdGF0aXN0aWNzLgpJbiB0aG9zZSBjYXNlcywgYE5BYCB2YWx1ZXMgYXJlIGFjdHVhbGx5IHByZXNlbnQgX2JlY2F1c2VfIG9mIHRoZSBoaWdoIGNvdW50cyAtIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBhdXRvbWF0aWNhbGx5IGFzc3VtZWQgY2VsbHMgd2VyZSBwcmVzZW50LCBzbyB0aGV5IHdlcmUgYWxzbyBub3QgdGVzdGVkLgoKTm93IHdlIGNhbiBmaWx0ZXIgb3VyIGByYXdfc2NlYCBvYmplY3QgX2J5IGNvbHVtbl8gdG8gb25seSBrZWVwIHRoZSBjZWxscyB3aXRoIGEgc21hbGwgRkRSOiB0aG9zZSB0aGF0IGFyZSBxdWl0ZSB1bmxpa2VseSB0byBiZSBlbXB0eSBkcm9wbGV0cy4KCmBgYHtyIGZpbHRlciBlbXB0eWRyb3BzLCBsaXZlPVRSVUV9CiMgZmlsdGVyIGRyb3BsZXRzIHVzaW5nIGB3aGljaGAgdG8gcHJldmVudCBOQSB0cm91YmxlCmNlbGxzX3RvX3JldGFpbiA8LSB3aGljaChkcm9wbGV0X2RmJEZEUiA8IDAuMDEpCmZpbHRlcmVkX3NjZSA8LSByYXdfc2NlWywgY2VsbHNfdG9fcmV0YWluXQpgYGAKCkhvdyBtYW55IGNlbGxzIGRvIHdlIGhhdmUgbm93PwoKYGBge3IgZmlsdGVyZWQgc3VtbWFyeX0KZmlsdGVyZWRfc2NlCmBgYAoKIyMjIEFkZGl0aW9uYWwgcXVhbGl0eSBjb250cm9sCgpJbiBhZGRpdGlvbiB0byBmaWx0ZXJpbmcgb3V0IGVtcHR5IGRyb3BsZXRzLCB3ZSBhbHNvIHdpbGwgd2FudCB0byBmaWx0ZXIgb3V0IGNlbGxzIHRoYXQgbWF5IGhhdmUgYmVlbiBkYW1hZ2VkIGR1cmluZyBsaWJyYXJ5IHByZXBhcmF0aW9uLgpUaGVzZSB3aWxsIG9mdGVuIGJlIGNoYXJhY3Rlcml6ZWQgYnkgYSBoaWdoIHByb3BvcnRpb24gb2YgbWl0b2Nob25kcmlhbCB0cmFuc2NyaXB0cyBhbmQgYSBzbWFsbGVyIG92ZXJhbGwgbnVtYmVyIG9mIHVuaXF1ZSB0cmFuc2NyaXB0cy4KV2hlbiBhIGNlbGwgcnVwdHVyZXMsIGN5dG9wbGFzbWljIHRyYW5zY3JpcHRzIHdpbGwgbGVhayBvdXQsIGJ1dCBtaXRvY2hvbmRyaWFsIHRyYW5zY3JpcHRzLCBzdGlsbCBwcm90ZWN0ZWQgYnkgdGhlIG1pdG9jaG9uZHJpYWwgbWVtYnJhbmUsIG1heSByZW1haW4uCkFzIGEgY29uc2VxdWVuY2UsIHRoZXJlIHdpbGwgYmUgYW4gb3Zlci1hYnVuZGFuY2Ugb2YgbWl0b2Nob25kcmlhbCByZWFkcywgYW5kIGZld2VyIHVuaXF1ZSB0cmFuc2NyaXB0cyBleHByZXNzZWQuCgpPdXIgZmlyc3Qgc3RlcCB0aGVuLCBpcyBjcmVhdGUgYSB2ZWN0b3Igb2YgdGhlIG1pdG9jaG9uZHJpYWwgZ2VuZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBvdXIgZGF0YXNldC4KVGhlIG1pdG9jaG9uZHJpYWwgZmlsZSB3ZSBkZWZpbmVkIGR1cmluZyBzZXR1cCAoYG1pdG9fZmlsZWApIGlzIGEgVFNWIGZpbGUgY29udGFpbmluZyBhbGwgb2YgdGhlIGh1bWFuIG1pdG9jaG9uZHJpYWwgZ2VuZXMgd2l0aCBhZGRpdGlvbmFsIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZSwgc3VjaCBhcyB0aGUgZ2VuZSBsb2NhdGlvbiBhbmQgYWx0ZXJuYXRpdmUgbmFtZXMuCihGb3IgbW9yZSBkZXRhaWwgb24gdGhlIHN0ZXBzIHdlIHRvb2sgdG8gY3JlYXRlIHRoaXMgZmlsZSwgeW91IGNhbiBsb29rIGF0IFtvbmUgb2Ygb3VyIHNldHVwIG5vdGVib29rc10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvdHJhaW5pbmctbW9kdWxlcy9ibG9iL21hc3Rlci9zY1JOQS1zZXEtYWR2YW5jZWQvc2V0dXAvbWl0b19nZW5lX2xpc3RzLlJtZCkpCgpBbGwgd2UgbmVlZCBub3cgaXMgdGhlIGBnZW5lX2lkYCwgYW5kIG9ubHkgZm9yIHRoZSBnZW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIG91ciBTQ0UsIHNvIHdlIHdpbGwgZG8gc29tZSBmaWx0ZXJpbmcgd2l0aCBgZHBseXJgIHRvIHB1bGwgb3V0IGEgdmVjdG9yIHdpdGgganVzdCB0aG9zZSBpZHMuCgpgYGB7ciBnZXQgbWl0b2Nob25kcmlhbCBnZW5lc30KIyByZWFkIGluIGEgdGFibGUgb2YgbWl0b2Nob25kcmlhbCBnZW5lcyBhbmQgZXh0cmFjdCBpZHMKbWl0b19nZW5lcyA8LSByZWFkcjo6cmVhZF90c3YobWl0b19maWxlKSB8PgogICMgZmlsdGVyIHRvIG9ubHkgdGhlIGdlbmVzIHRoYXQgYXJlIGZvdW5kIGluIG91ciBkYXRhc2V0CiAgZHBseXI6OmZpbHRlcihnZW5lX2lkICVpbiUgcm93bmFtZXMoZmlsdGVyZWRfc2NlKSkgfD4KICAjIGNyZWF0ZSBhIHZlY3RvciBmcm9tIHRoZSBnZW5lX2lkIGNvbHVtbgogIGRwbHlyOjpwdWxsKGdlbmVfaWQpCmBgYAoKIyMjIENhbGN1bGF0aW5nIHN1bW1hcnkgUUMgc3RhdGlzdGljcwoKV2UgY2FuIG5vdyB1c2UgdGhlIGBzY3V0dGxlYCBmdW5jdGlvbiBgYWRkUGVyQ2VsbFFDKClgIHRvIGNhbGN1bGF0ZSBzb21lIHN0YXRpc3RpY3MgYmFzZWQgb24gdGhlIGNvdW50cyBtYXRyaXgsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGBjb2xEYXRhYCB0YWJsZS4KCkluIGFkZGl0aW9uIHRvIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3MgbGlrZSB0aGUgdG90YWwgcmVhZCBjb3VudCBmb3IgZWFjaCBjZWxsIGFuZCB0aGUgbnVtYmVyIG9mIHRyYW5zY3JpcHRzIHRoYXQgYXJlIGRldGVjdGVkLCB3ZSBjYW4gYWxzbyBjYWxjdWxhdGUgdGhvc2Ugc3RhdGlzdGljcyBmb3IgZGVmaW5lZCBzdWJzZXRzIG9mIGdlbmVzLgpJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdXNlIG91ciBgbWl0b19nZW5lc2AgdmVjdG9yIHRvIGRlZmluZSBhIHN1YnNldCBjYWxsZWQgYG1pdG9gLgpUaGUgYG1pdG9gIG5hbWUgaXMgaW1wb3J0YW50IGluIHRoYXQgaXQgaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIGV4cGVjdGVkIGJ5IGEgbGF0ZXIgZnVuY3Rpb24uCihXZSBjb3VsZCBkZWZpbmUgbW9yZSBzdWJzZXRzLCBidXQgZm9yIG5vdyB0aGlzIG9uZSB3aWxsIGRvLikKCmBgYHtyIHBlciBjZWxsIFFDLCBsaXZlPVRSVUV9CmZpbHRlcmVkX3NjZSA8LSBzY3V0dGxlOjphZGRQZXJDZWxsUUMoZmlsdGVyZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNldHMgPSBsaXN0KG1pdG8gPSBtaXRvX2dlbmVzKSkKYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgdGhlIGNvbERhdGEgdG8gc2VlIHdoYXQgd2FzIGFkZGVkOgoKYGBge3IgdmlldyBjb2xEYXRhIHN0YXRzfQpoZWFkKGNvbERhdGEoZmlsdGVyZWRfc2NlKSkKYGBgCgpXZSBjYW4gYWxzbyBwbG90IHNvbWUgb2YgdGhlc2Ugc3RhdGlzdGljcywgaGVyZSB1c2luZyB0aGUgYHBsb3RNZXRyaWNzKClgIGZ1bmN0aW9uIGZyb20gdGhlIGBtaVFDYCBwYWNrYWdlIHRvIHBsb3QgdGhlIHBlcmNlbnQgb2YgcmVhZHMgdGhhdCBhcmUgbWl0b2Nob25kcmlhbCAodGhlIGBzdWJzZXRzX21pdG9fcGVyY2VudGAgY29sdW1uKSBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgdW5pcXVlIGdlbmVzIGRldGVjdGVkICh0aGUgYGRldGVjdGVkYCBjb2x1bW4pIGZvciBlYWNoIGNlbGwuCgpgYGB7ciBtaVFDIHBsb3RNZXRyaWNzfQojIHVzZSBtaVFDOjpwbG90TWV0cmljcygpCm1pUUM6OnBsb3RNZXRyaWNzKGZpbHRlcmVkX3NjZSkgKyB0aGVtZV9idygpCmBgYAoKV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGEgcmFuZ2Ugb2YgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlcywgYW5kIGl0IGRvZXMgYWxzbyBzZWVtIHRoYXQgY2VsbHMgd2l0aCBoaWdoIHBlcmNlbnRhZ2VzIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMgZG9uJ3Qgc2VlbSB0byBjb250YWluIHZlcnkgbWFueSB1bmlxdWUgZ2VuZXMuCgpIb3cgZG8gd2UgZmlsdGVyIHdpdGggdGhpcyBpbmZvcm1hdGlvbj8KT25lIG9wdGlvbiBpcyB0byBkZWZpbmUgYSBjdXRvZmYgZm9yIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UgYWJvdmUgd2hpY2ggd2UgY2FsbCBhIGNlbGwgY29tcHJvbWlzZWQgYW5kIGV4Y2x1ZGUgaXQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgpIb3dldmVyLCBjaG9vc2luZyB0aGF0IGN1dG9mZiBjYW4gYmUgYSBiaXQgZnJhdWdodCwgYXMgdGhlIGV4cGVjdGVkIHBlcmNlbnRhZ2Ugb2YgbWl0b2Nob25kcmlhbCByZWFkcyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGNlbGwgdHlwZSBhbmQgbGlicmFyeSBwcmVwYXJhdGlvbiBtZXRob2RzLgpTbyBpdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoYXQgY3V0b2ZmIGZyb20gdGhlIGRhdGEgaXRzZWxmLgoKIyMjIEZpbHRlcmluZyBjb21wcm9taXNlZCBjZWxscwoKRGV0ZXJtaW5pbmcgbWl0b2Nob25kcmlhbCBjdXRvZmZzIGlzIGV4YWN0bHkgd2hhdCB0aGUgYG1pUUNgIHBhY2thZ2UgZG9lcyAoW0hpcHBlbiBfZXQgYWwuXyAyMDIxXShodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBjYmkuMTAwOTI5MCkpIQpJbiB0cnV0aCwgaXQgZG9lcyBzb21ldGhpbmcgcG9zc2libHkgZXZlbiBhIGJpdCBiZXR0ZXI6IGl0IGZpdHMgYSBtaXh0dXJlIG1vZGVsIHRvIHRoZSBkYXRhIHRoYXQgY29uc2lzdHMgb2YgZGlzdHJpYnV0aW9ucyBvZiBoZWFsdGh5IGNlbGxzIGFuZCBjb21wcm9taXNlZCBjZWxscy4KVGhlbiB3ZSBjYW4gY2FsY3VsYXRlIHdoZXRoZXIgZWFjaCBjZWxsIGlzIG1vcmUgbGlrZWx5IHRvIGJlbG9uZyB0byB0aGUgaGVhbHRoeSBvciBjb21wcm9taXNlZCBkaXN0cmlidXRpb24uCldlIGNhbiB0aGVuIGV4Y2x1ZGUgdGhlIGNlbGxzIHRoYXQgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGNvbXByb21pc2VkLgoKVG8gdXNlIGBtaVFDYCwgd2UgZmlyc3QgZml0IGEgbW9kZWwgdG8gdGhlIGRhdGEgaW4gb3VyIFNDRSBvYmplY3Q6CgpgYGB7ciBtaVFDIG1vZGVsLCBsaXZlPVRSVUV9CiMgZml0IHRoZSBtaVFDIG1vZGVsCm1pcWNfbW9kZWwgPC0gbWlRQzo6bWl4dHVyZU1vZGVsKGZpbHRlcmVkX3NjZSkKYGBgCgpOb3cgd2UgY2FuIHBsb3QgdGhlIG1vZGVsIHJlc3VsdHMgdXNpbmcgdGhlIGBwbG90TW9kZWwoKWAgZnVuY3Rpb24gdG8gc2VlIGhvdyBpdCBjb3JyZXNwb25kcyB0byBvdXIgZGF0YS4KV2Ugc2hvdWxkIGV4cGVjdCB0byBzZWUgdHdvIGZpdCBsaW5lczoKCi0gT25lIGxpbmUgd2lsbCBjb3JyZXNwb25kIHRoZSB0aGUgImhlYWx0aHkiIGNlbGxzIGFuZCBzaG91bGQgc2hvdyBsaXR0bGUgdG8gbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiB1bmlxdWUgZ2VuZXMgZGV0ZWN0ZWQgYW5kIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UuCi0gQnkgY29udHJhc3QsIHRoZSBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gImNvbXByb21pc2VkIiBjZWxscyB3aWxsIHNob3cgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBnZW5lcyBkZXRlY3RlZCBhbmQgdGhlIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZS4KClRoaXMgcGxvdCB3aWxsIGFsc28gc2hvdywgZm9yIGVhY2ggY2VsbCwgdGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eSB0aGF0IHRoZSBjZWxsIGlzIGRlcml2ZWQgZnJvbSB0aGUgY29tcHJvbWlzZWQgZGlzdHJpYnV0aW9uOyBhIGhpZ2hlciBzY29yZSBpbmRpY2F0ZXMgdGhhdCBhIGNlbGwgaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29tcHJvbWlzZWQuCgpJdCBpcyBhbHNvIGNyaXRpY2FsIHRvIG5vdGUgdGhhdCB0aGlzIG1vZGVsIGNhbiBfYW5kIGRvZXNfIGZhaWwgYXQgdGltZXMuClBsb3R0aW5nIHRoZSByZXN1bHRzIGFzIHdlIGhhdmUgZG9uZSBoZXJlIGlzIG5vdCBhIHN0ZXAgdG8gc2tpcC4KKipBbHdheXMgbG9vayBhdCB5b3VyIGRhdGEhKioKCmBgYHtyIG1pUUMgcGxvdE1vZGVsLCBsaXZlPVRSVUV9CiMgcGxvdCB0aGUgbWlRQyBtb2RlbAptaVFDOjpwbG90TW9kZWwoZmlsdGVyZWRfc2NlLCBtaXFjX21vZGVsKSArCiAgdGhlbWVfYncoKQpgYGAKCldlIGNhbiBub3cgZmlsdGVyIG91ciBkYXRhIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBjb21wcm9taXNlZCBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIG1vZGVsLgpCdXQgYmVmb3JlIHdlIGRvIHRoYXQsIHdlIG1pZ2h0IHdhbnQgdG8gcXVpY2tseSBwbG90IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGZpbHRlcmVkIG91dCB3aXRoIGEgZ2l2ZW4gY3V0b2ZmLCB1c2luZyB0aGUgYHBsb3RGaWx0ZXJpbmcoKWAgZnVuY3Rpb24uClRoZSBkZWZhdWx0IGlzIHRvIGV4Y2x1ZGUgY2VsbHMgdGhhdCBoYXZlIGEgcG9zdGVyaW9yIHByb2JhYmlsaXR5IG9mIDAuNzUgb3IgZ3JlYXRlciBvZiBiZWluZyBjb21wcm9taXNlZC4KV2Ugc3RpY2sgd2l0aCB0aGF0IGRlZmF1bHQsIGJ1dCBmb3IgY2xhcml0eSwgd2Ugd2lsbCBhbHNvIGluY2x1ZGUgaXQgaW4gb3VyIGNvZGUhCgoKYGBge3IgbWlRQyBwbG90RmlsdGVyaW5nfQojIGxvb2sgYXQgbWlRQyBmaWx0ZXJpbmcKbWlRQzo6cGxvdEZpbHRlcmluZyhmaWx0ZXJlZF9zY2UsIG1pcWNfbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgcG9zdGVyaW9yX2N1dG9mZiA9IDAuNzUpICsKICB0aGVtZV9idygpCmBgYAoKSW4gdGhpcyBjYXNlLCB0aGUgbGluZSBiZXR3ZWVuIHRoZSBjZWxscyB0byBiZSBrZXB0IGFuZCB0aG9zZSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBzZWVtcyB0byBjb3JyZXNwb25kIHRvIGEgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlIG9mIGFib3V0IDEyLjUlLCBidXQgbm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgYWx3YXlzIGJlIGNvbnN0YW50LgpUaGUgY3V0b2ZmIHBvaW50IGNhbiB2YXJ5IGZvciBkaWZmZXJlbnQgbnVtYmVycyBvZiB1bmlxdWUgZ2VuZXMgd2l0aGluIGEgc2FtcGxlLCBhbmQgaXQgd2lsbCBjZXJ0YWlubHkgdmFyeSBhbW9uZyBzYW1wbGVzIQoKQXQgdGhpcyBwb2ludCwgd2UgY2FuIHBlcmZvcm0gdGhlIGFjdHVhbCBmaWx0ZXJpbmcgdXNpbmcgdGhlIGBmaWx0ZXJDZWxscygpYCBmdW5jdGlvbiwgZ2l2aW5nIHVzIGEgZnVydGhlciBmaWx0ZXJlZCBTQ0Ugb2JqZWN0LgoKYGBge3IgbWlRQyBmaWx0ZXJjZWxscywgbGl2ZT1UUlVFfQojIHBlcmZvcm0gbWlRQyBmaWx0ZXJpbmcKcWNmaWx0ZXJlZF9zY2UgPC0gbWlRQzo6ZmlsdGVyQ2VsbHMoZmlsdGVyZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IG1pcWNfbW9kZWwpCmBgYAoKIyMjIyBPbmUgbW9yZSBmaWx0ZXI6IHVuaXF1ZSBnZW5lIGNvdW50CgpXaGlsZSB0aGUgbWlRQyBmaWx0ZXJpbmcgaXMgcHJldHR5IGdvb2QsIHlvdSBtYXkgaGF2ZSBub3RpY2VkIHRoYXQgaXQgc3RpbGwgbGVmdCBzb21lIGNlbGxzIHRoYXQgaGFkIHZlcnkgbG93IG51bWJlcnMgb2YgdW5pcXVlIGdlbmVzLgpXaGlsZSB0aGVzZSBjZWxscyBtYXkgbm90IGJlIGNvbXByb21pc2VkLCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGVtIGlzIGFsc28gbm90IGxpa2VseSB0byBiZSB1c2VmdWwsIHNvIHdlIHdpbGwgZmlsdGVyIHRob3NlIGFzIHdlbGwuCldlIHdpbGwgb25seSBrZWVwIGNlbGxzIHRoYXQgaGF2ZSBhdCBsZWFzdCAyMDAgdW5pcXVlIGdlbmVzLgoKYGBge3IgdW5pcXVlIGN1dG9mZiwgbGl2ZT1UUlVFfQojIGZpbHRlciBjZWxscyBieSB1bmlxdWUgZ2VuZSBjb3VudCAoYGRldGVjdGVkYCkKcWNmaWx0ZXJlZF9zY2UgPC0gcWNmaWx0ZXJlZF9zY2VbLCB3aGljaChxY2ZpbHRlcmVkX3NjZSRkZXRlY3RlZCA+PSAyMDApXQpxY2ZpbHRlcmVkX3NjZQpgYGAKCgojIyBOb3JtYWxpemF0aW9uCgpOb3cgdGhhdCB3ZSBoYXZlIGRvbmUgb3VyIGZpbHRlcmluZywgd2UgY2FuIHN0YXJ0IGFuYWx5emluZyB0aGUgZXhwcmVzc2lvbiBjb3VudHMgZm9yIHRoZSByZW1haW5pbmcgY2VsbHMuCgpUaGUgbmV4dCBzdGVwIGF0IHRoaXMgcG9pbnQgaXMgdG8gY29udmVydCB0aGUgcmF3IGNvdW50cyBpbnRvIGEgbWVhc3VyZSB0aGF0IGFjY291bnRzIGZvciBkaWZmZXJlbmNlcyBpbiBzZXF1ZW5jaW5nIGRlcHRoIGJldHdlZW4gY2VsbHMsIGFuZCB0byBjb252ZXJ0IHRoZSBkaXN0cmlidXRpb24gb2YgZXhwcmVzc2lvbiB2YWx1ZXMgZnJvbSB0aGUgc2tld2VkIGRpc3RyaWJ1dGlvbiB3ZSBleHBlY3QgdG8gc2VlIGluIHJhdyBjb3VudHMgdG8gb25lIHRoYXQgaXMgbW9yZSBub3JtYWxseSBkaXN0cmlidXRlZC4KCldlIHdpbGwgZG8gdGhpcyB1c2luZyBmdW5jdGlvbnMgZnJvbSB0aGUgYHNjcmFuYCBhbmQgYHNjdXR0bGVgIHBhY2thZ2VzLgpUaGUgcHJvY2VkdXJlIHdlIHdpbGwgdXNlIGhlcmUgaXMgZGVyaXZlZCBmcm9tIHRoZSBbT1NDQSBjaGFwdGVyIG9uIG5vcm1hbGl6YXRpb25dKGh0dHA6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTYvT1NDQS5iYXNpYy9ub3JtYWxpemF0aW9uLmh0bWwjbm9ybWFsaXphdGlvbi1ieS1kZWNvbnZvbHV0aW9uKS4KVGhlIGlkZWEgaXMgdGhhdCB0aGUgdmFyeWluZyBleHByZXNzaW9uIHBhdHRlcm5zIHRoYXQgZGlmZmVyZW50IGNlbGwgdHlwZXMgZXhoaWJpdCB3aWxsIGFmZmVjdCB0aGUgc2NhbGluZyBmYWN0b3JzIHRoYXQgd2Ugd291bGQgYXBwbHkuClRvIGFjY291bnQgZm9yIHRoYXQgdmFyaWF0aW9uLCB3ZSBmaXJzdCBkbyBhIHJvdWdoIGNsdXN0ZXJpbmcgb2YgY2VsbHMgYnkgdGhlaXIgZXhwcmVzc2lvbiB3aXRoIGBzY3Jhbjo6cXVpY2tDbHVzdGVyKClgLCB0aGVuIHVzZSB0aGF0IGNsdXN0ZXJpbmcgdG8gY2FsY3VsYXRlIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgZWFjaCBjZWxsIHdpdGhpbiB0aGUgY2x1c3RlcnMgdXNpbmcgYHNjcmFuOjpjb21wdXRlU3VtRmFjdG9ycygpYC4KRmluYWxseSwgd2UgYXBwbHkgdGhlIHNjYWxpbmcgZmFjdG9yIHRvIHRoZSBleHByZXNzaW9uIHZhbHVlcyBmb3IgZWFjaCBjZWxsIGFuZCBjYWxjdWxhdGUgdGhlIGxvZy1zY2FsZWQgZXhwcmVzc2lvbiB2YWx1ZXMgdXNpbmcgdGhlIGBzY3V0dGxlOjpsb2dOb3JtQ291bnRzKClgIGZ1bmN0aW9uLgoKYGBge3Igbm9ybWFsaXphdGlvbiwgbGl2ZT1UUlVFfQojIFBlcmZvcm0gcm91Z2ggY2x1c3RlcmluZwpxY2x1c3QgPC0gc2NyYW46OnF1aWNrQ2x1c3RlcihxY2ZpbHRlcmVkX3NjZSkKCiMgdXNlIGNsdXN0ZXJzIHRvIGNvbXB1dGUgc2NhbGluZyBmYWN0b3JzIGFuZCBhZGQgdG8gU0NFIG9iamVjdApxY2ZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMocWNmaWx0ZXJlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVycyA9IHFjbHVzdCkKCiMgcGVyZm9ybSBub3JtYWxpemF0aW9uIHVzaW5nIHNjYWxpbmcgZmFjdG9ycwojIGFuZCBzYXZlIGFzIGEgbmV3IFNDRSBvYmplY3QKbm9ybWFsaXplZF9zY2UgPC0gc2N1dHRsZTo6bG9nTm9ybUNvdW50cyhxY2ZpbHRlcmVkX3NjZSkKYGBgCgpUaGlzIGNyZWF0ZXMgYSBuZXcgImFzc2F5IiBpbiB0aGUgYG5vcm1hbGl6ZWRfc2NlYCBvYmplY3QsIGBsb2djb3VudHNgLCB3aGljaCBjb250YWlucyB0aGUgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMgZm9yIGVhY2ggY2VsbCBhbmQgZ2VuZS4KKFRoZSBkYXRhIGhlcmUgYXJlIG5vdCBfYWN0dWFsbHlfIHRoZSBsb2cgb2YgdGhlIGNvdW50cywgc2luY2Ugd2UgYWxzbyBhcHBsaWVkIHRoZSBzY2FsaW5nIGZhY3RvcnMsIGJ1dCB0aGF0IG5hbWUgaXMgdXNlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLikKCkxldCdzIHRha2UgYSBsb29rOgoKYGBge3Igbm9ybWFsaXplZCBzY2V9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKIyMgRGltZW5zaW9uIHJlZHVjdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBEaW1lbnNpb24gcmVkdWN0aW9uXShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9kaW1lbnNpb25fcmVkdWN0aW9uLnBuZykKCk5vdyB0aGF0IHdlIGhhdmUgbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgd2Ugd291bGQgbGlrZSB0byBwcm9kdWNlIHNvbWUgcmVkdWNlZC1kaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBkYXRhLgpUaGVzZSB3aWxsIGFsbG93IHVzIHRvIHBlcmZvcm0gc29tZSBkb3duc3RyZWFtIGNhbGN1bGF0aW9ucyBtb3JlIHF1aWNrbHksIHJlZHVjZSBzb21lIG9mIHRoZSBub2lzZSBpbiB0aGUgZGF0YSwgYW5kIGFsbG93IHVzIHRvIHZpc3VhbGl6ZSBvdmVyYWxsIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2VsbHMgbW9yZSBlYXNpbHkgKHRob3VnaCB3aXRoIG1hbnkgY2F2ZWF0cyEpLgoKIyMjIFNlbGVjdGluZyBoaWdobHkgdmFyaWFibGUgZ2VuZXMKCldoaWxlIHdlIGNvdWxkIGNhbGN1bGF0ZSB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIHVzaW5nIGFsbCBvZiB0aGUgZ2VuZXMgdGhhdCB3ZSBoYXZlIGFzc2F5ZWQsIGluIHByYWN0aWNlIG1vc3Qgb2YgdGhlIGdlbmVzIHdpbGwgaGF2ZSB2ZXJ5IGxpdHRsZSB2YXJpYXRpb24gaW4gZXhwcmVzc2lvbiwgc28gZG9pbmcgc28gd2lsbCBub3QgcHJvdmlkZSBtdWNoIGFkZGl0aW9uYWwgc2lnbmFsLgpSZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGdlbmVzIHdlIGluY2x1ZGUgd2lsbCBhbHNvIHNwZWVkIHVwIHNvbWUgb2YgdGhlIGNhbGN1bGF0aW9ucy4KClRvIGlkZW50aWZ5IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzLCB3ZSB3aWxsIHVzZSBmdW5jdGlvbnMgZnJvbSB0aGUgYHNjcmFuYCBwYWNrYWdlLgpUaGUgZmlyc3QgZnVuY3Rpb24sIGBtb2RlbEdlbmVWYXIoKWAsIGF0dGVtcHRzIHRvIGRpdmlkZSB0aGUgdmFyaWF0aW9uIG9ic2VydmVkIGZvciBlYWNoIGdlbmUgaW50byBhIGJpb2xvZ2ljYWwgYW5kIHRlY2huaWNhbCBjb21wb25lbnQsIHdpdGggdGhlIGludHVpdGlvbiB0aGF0IGdlbmVzIHdpdGggbG93ZXIgbWVhbiBleHByZXNzaW9uIHRlbmQgdG8gaGF2ZSBsb3dlciB2YXJpYW5jZSBmb3IgcHVyZWx5IHRlY2huaWNhbCByZWFzb25zLgpXZSB0aGVuIHByb3ZpZGUgdGhlIGBtb2RlbEdlbmVWYXIoKWAgb3V0cHV0IHRvIHRoZSBgZ2V0VG9wSFZHcygpYCBmdW5jdGlvbiB0byBpZGVudGlmeSB0aGUgZ2VuZXMgd2l0aCB0aGUgaGlnaGVzdCBfYmlvbG9naWNhbF8gdmFyaWF0aW9uLCB3aGljaCBpcyB3aGF0IHdlIGFyZSBtb3N0IGludGVyZXN0ZWQgaW4uCgpgYGB7ciBzZWxlY3QgSFZHc30KIyBpZGVudGlmeSAyMDAwIGdlbmVzCm51bV9nZW5lcyA8LSAyMDAwCgojIG1vZGVsIHZhcmlhbmNlLCBwYXJ0aXRpb25pbmcgaW50byBiaW9sb2dpY2FsIGFuZCB0ZWNobmljYWwgdmFyaWF0aW9uCmdlbmVfdmFyaWFuY2UgPC0gc2NyYW46Om1vZGVsR2VuZVZhcihub3JtYWxpemVkX3NjZSkKCiMgZ2V0IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzCmh2X2dlbmVzIDwtIHNjcmFuOjpnZXRUb3BIVkdzKGdlbmVfdmFyaWFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBudW1fZ2VuZXMpCmBgYAoKVGhlIHJlc3VsdCBpcyBhIHZlY3RvciBvZiBnZW5lIGlkcyAob3JkZXJlZCBmcm9tIG1vc3QgdG8gbGVhc3QgdmFyaWFibGUpOgoKYGBge3IgdmlldyBIVkdzfQpoZWFkKGh2X2dlbmVzKQpgYGAKCiMjIyBQcmluY2lwYWwgY29tcG9uZW50cyBhbmFseXNpcwoKTm93IHRoYXQgd2UgaGF2ZSBzZWxlY3RlZCB0aGUgZ2VuZXMgd2Ugd291bGQgbGlrZSB0byB1c2UgZm9yIHRoZSByZWR1Y2VkLWRpbWVuc2lvbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGV4cHJlc3Npb24gZGF0YSwgd2UgY2FuIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGVtLgpGaXJzdCB3ZSB3aWxsIHVzZSB0aGUgYHNjYXRlcjo6cnVuUENBKClgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcHJpbmNpcGFsIGNvbXBvbmVudHMgZnJvbSB0aGUgZXhwcmVzc2lvbiBtYXRyaXguClRoaXMgcmVwcmVzZW50YXRpb24gaXMgZmFzdCBhbmQgZmFpcmx5IHJvYnVzdCwgYnV0IHRoZSByZXN1bHQgaXMgc3RpbGwgcXVpdGUgbXVsdGlkaW1lbnNpb25hbC4KV2Ugd2FudCBrZWVwIGEgZmFpciBudW1iZXIgb2YgY29tcG9uZW50cyAoZGltZW5zaW9ucykgaW4gb3JkZXIgdG8gYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSwgYnV0IGRvaW5nIHNvIG1lYW5zIHRoYXQgcGxvdHRpbmcgb25seSBhIGZldyBvZiB0aGVzZSBkaW1lbnNpb25zIChpbiAyRCkgaXMgbm90IGxpa2VseSB0byBwcm92aWRlIGEgZnVsbCB2aWV3IG9mIHRoZSBkYXRhLgoKVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaXMgNTAsIHdoaWNoIHdlIHdpbGwgc3RpY2sgd2l0aCwgYnV0IGxldCdzIGVudGVyIGl0IG1hbnVhbGx5IGp1c3QgZm9yIHRoZSByZWNvcmQuCgpgYGB7ciBydW5QQ0EsIGxpdmU9VFJVRX0KIyBjYWxjdWxhdGUgYW5kIHNhdmUgUENBIHJlc3VsdHMKbm9ybWFsaXplZF9zY2UgPC0gc2NhdGVyOjpydW5QQ0EoCiAgbm9ybWFsaXplZF9zY2UsCiAgbmNvbXBvbmVudHMgPSA1MCwgIyBob3cgbWFueSBjb21wb25lbnRzIHRvIGtlZXAKICBzdWJzZXRfcm93ID0gaHZfZ2VuZXMgIyB1c2Ugb25seSB0aGUgdmFyaWFibGUgZ2VuZXMgd2UgY2hvc2UKKQpgYGAKClRoZXNlIHJlZHVjZWQtZGltZW5zaW9uIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4gYSBgcmVkdWNlZERpbWAgc2xvdCBpbiB0aGUgU0NFIG9iamVjdC4KV2UgY2FuIHNlZSB0aGUgbmFtZXMgb2YgdGhlIGByZWR1Y2VkRGltYHMgdGhhdCB3ZSBoYXZlIGJ5IGxvb2tpbmcgYXQgdGhlIG9iamVjdCBzdW1tYXJ5OgoKYGBge3IgdmlldyByZWR1Y2VkIGRpbWVuc2lvbnN9Cm5vcm1hbGl6ZWRfc2NlCmBgYAoKSWYgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBQQ0EgcmVzdWx0cywgd2UgY2FuIGRvIHRoYXQgd2l0aCB0aGUgYHJlZHVjZWREaW0oKWAgZnVuY3Rpb246Ck5vdGUgdGhhdCBmb3IgdGhlc2UgcmVkdWNlZC1kaW1lbnNpb25hbGl0eSBtYXRyaWNlcywgdGhlIHJvd3MgYXJlIHRoZSBjZWxscyBhbmQgdGhlIGNvbHVtbnMgYXJlIHRoZSBQQyBkaW1lbnNpb25zLgoKYGBge3IgZ2V0UmVkdWNlZERpbX0KIyBleHRyYWN0IHRoZSBQQ0EgbWF0cml4CnBjYV9tYXRyaXggPC0gcmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIpCgojIGxvb2sgYXQgdGhlIHNoYXBlIG9mIHRoZSBtYXRyaXgKZGltKHBjYV9tYXRyaXgpCmBgYAoKIyMjIFVNQVAKCkZpbmFsbHksIHdlIHdpbGwgY2FsY3VsYXRlIGEgVU1BUCAoVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uKSByZXByZXNlbnRhdGlvbiBvZiBvdXIgZGF0YS4KVGhpcyBpcyBhIG1hY2hpbmUtbGVhcm5pbmctYmFzZWQgbWV0aG9kIHRoYXQgaXMgdXNlZnVsIGZvciBwZXJmb3JtaW5nIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBzdWl0YWJsZSBmb3IgdmlzdWFsaXphdGlvbi4KSXQncyBnb2FsIGlzIHRvIHByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSBpbiB0d28gZGltZW5zaW9ucyAodHlwaWNhbGx5LCBtb3JlIGFyZSBwb3NzaWJsZSkgdGhhdCBwcmVzZXJ2ZXMgYXMgbXVjaCBvZiB0aGUgZGlzdGFuY2UgcmVsYXRpb25zaGlwcyBhbW9uZyBjZWxscyBhcyBwb3NzaWJsZS4KV2hpbGUgdGhpcyBkb2VzIG1ha2UgZm9yIHZpc3VhbGx5IGFwcGVhbGluZyBhbmQgdXNlZnVsIHBsb3RzLCBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIG92ZXJpbnRlcnByZXQgdGhlIHJlc3VsdHMhCkluIHBhcnRpY3VsYXIsIHdoaWxlIHlvdSB3aWxsIG9mdGVuIHNlZSBzb21lIGFwcGFyZW50IGNsdXN0ZXJpbmcgb2YgY2VsbHMgaW4gdGhlIHJlc3VsdGluZyBvdXRwdXQsIHRob3NlIGNsdXN0ZXJzIG1heSBub3QgYmUgcGFydGljdWxhcmx5IHZhbGlkLCBhbmQgdGhlIHNwYWNpbmcgd2l0aGluIG9yIGJldHdlZW4gY2x1c3RlcnMgbWF5IG5vdCByZWZsZWN0IHRydWUgZGlzdGFuY2VzLgoKSW4gbWFueSB3YXlzIHRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBwcm9ibGVtIG9mIHByb2plY3RpbmcgYSBtYXAgb2YgdGhlIGVhcnRoIG9udG8gYSBmbGF0IHN1cmZhY2U7IGFueSBjaG9pY2Ugd2lsbCByZXN1bHQgaW4gc29tZSBkaXN0b3J0aW9ucy4KSG93ZXZlciwgd2l0aCBVTUFQLCB3ZSByYXJlbHkga25vdyBleGFjdGx5IHdoYXQgY2hvaWNlcyB3ZXJlIG1hZGUgYW5kIHdoYXQgZGlzdG9ydGlvbnMgbWlnaHQgaGF2ZSByZXN1bHRlZC4KVGhlIFVNQVAgY29vcmRpbmF0ZXMgdGhlbXNlbHZlcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgZG93bnN0cmVhbSBhbmFseXNpcy4KClNpbmNlIHRoZSBVTUFQIHByb2NlZHVyZSB3b3VsZCBiZSBzbG93IHRvIGNhbGN1bGF0ZSB3aXRoIHRoZSBmdWxsIGRhdGEsIHNvIHRoZSBgcnVuVU1BUCgpYCBmdW5jdGlvbiBmaXJzdCBjYWxjdWxhdGVzIGEgUENBIG1hdHJpeCBhbmQgdGhlbiB1c2VzIF90aGF0XyB0byBjYWxjdWxhdGUgdGhlIFVNQVAuClNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhIFBDQSBtYXRyaXgsIHdlIHdpbGwgdGVsbCB0aGUgZnVuY3Rpb24gdXNlIHRoYXQgaW5zdGVhZCBvZiByZWNhbGN1bGF0aW5nIGl0LgoKYGBge3IgcnVuVU1BUCwgbGl2ZT1UUlVFfQpub3JtYWxpemVkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAobm9ybWFsaXplZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiUENBIikKYGBgCgpBcyBiZWZvcmUsIHdlIGNvdWxkIGV4dHJhY3QgdGhlIFVNQVAgbWF0cml4IGZyb20gb3VyIFNDRSBvYmplY3Qgd2l0aCB0aGUgYHJlZHVjZWREaW0oKWAgZnVuY3Rpb24uCldlIGNhbiBhbHNvIHZpc3VhbGl6ZSB0aGUgVU1BUCByZXN1bHRzIHVzaW5nIHRoZSBgcGxvdFJlZHVjZWREaW0oKWAgZnVuY3Rpb24uCgpgYGB7ciBwbG90UmVkdWNlZERpbSwgbGl2ZT1UUlVFfQojIHBsb3QgdGhlIFVNQVAKc2NhdGVyOjpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAiVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBieSB0aGUgbW9zdCB2YXJpYWJsZSBnZW5lCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gaHZfZ2VuZXNbMV0pCmBgYAoKCiMjIFVuc3VwZXJ2aXNlZCBjbHVzdGVyaW5nCgpBcyBhIGZpbmFsIGFuYWx5c2lzIHN0ZXAgYXQgdGhpcyBzdGFnZSwgd2Ugd2lsbCByZXR1cm4gdG8gdGhlIFBDQSByZXN1bHRzIHRvIHBlcmZvcm0gdW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcuCkhlcmUgd2Ugd2lsbCB1c2UgYSBncmFwaC1iYXNlZCBjbHVzdGVyaW5nIG1ldGhvZCwgd2hpY2ggc3RhcnRzIGJ5IGlkZW50aWZ5aW5nIGNlbGxzIHRoYXQgYXJlIGNsb3NlIHRvZ2V0aGVyIGluIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHNwYWNlLgpJdCB0aGVuIGlkZW50aWZpZXMgImNvbW11bml0aWVzIiBvZiBoaWdobHkgY29ubmVjdGVkIGNlbGxzLCBhbmQgYnJlYWtzIHRoZW0gYXBhcnQgYnkgcmVnaW9ucyBvZiBsb3dlciBjb25uZWN0aW9uLgoKVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGFsZ29yaXRobXMgdGhhdCBjYW4gcGVyZm9ybSB0aGlzIGNsdXN0ZXJpbmcsIGVhY2ggd2l0aCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGFmZmVjdCBob3cgbWFueSBjbHVzdGVycyBhcmUgaWRlbnRpZmllZCBhbmQgd2hpY2ggY2VsbHMgYmVsb25nIHRvIGVhY2ggY2x1c3Rlci4KSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGVzZSBjbHVzdGVycyBtYXkgb3IgbWF5IG5vdCBjb3JyZXNwb25kIHRvICJjZWxsIHR5cGVzIiBieSB3aGF0ZXZlciBkZWZpbml0aW9uIHlvdSBtaWdodCBwcmVmZXIgdG8gdXNlLgpJbnRlcnByZXRhdGlvbiBvZiB0aGVzZSBjbHVzdGVycywgb3Igb3RoZXIgbWVhc3VyZXMgb2YgY2VsbCB0eXBlLCBhcmUgc29tZXRoaW5nIHRoYXQgd2lsbCByZXF1aXJlIG1vcmUgY2FyZWZ1bCBhbmQgbGlrZWx5IG1vcmUgY3VzdG9taXplZCBhbmFseXNpcy4KCldlIHdpbGwgcGVyZm9ybSBvdXIgY2x1c3RlcmluZyB1c2luZyB0aGUgYGJsdXN0ZXJgIHBhY2thZ2UsIHdoaWNoIGNhbiBwZXJmb3JtIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcuCkFzIG1lbnRpb25lZCBlYXJsaWVyLCB3ZSBhcmUgdXNpbmcgImdyYXBoIiBjbHVzdGVyaW5nLCB3aGljaCB3ZSBkZWZpbmUgdXNpbmcgdGhlIGBOTkdyYXBoUGFyYW0oKWAgZnVuY3Rpb24uCldpdGhpbiB0aGF0IGFyZSBhIG51bWJlciBvZiBmdXJ0aGVyIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIHdlaWdodGluZyB1c2VkIGZvciBidWlsZGluZyB0aGUgbmV0d29yayBncmFwaCBhbmQgdGhlIGFsZ29yaXRobSB1c2VkIGZvciBkaXZpZGluZyB0aGUgZ3JhcGggaW50byBjbHVzdGVycy4KCk1vZGlmeWluZyB0aGVzZSBwYXJhbWV0ZXJzIGNhbiByZXN1bHQgaW4gcXVpdGUgZGlmZmVyZW50IGNsdXN0ZXIgYXNzaWdubWVudHMhCkZvciB0aGUgY2x1c3RlcmluZyBiZWxvdyB3ZSB3aWxsIHVzZSBKYWNjYXJkIHdlaWdodGluZyBhbmQgTG91dmFpbiBjbHVzdGVyaW5nLCB3aGljaCBjb3JyZXNwb25kIG1vcmUgY2xvc2VseSB0byB0aGUgZGVmYXVsdCBtZXRob2RzIHVzZWQgYnkgYFNldXJhdGAgdGhhbiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLgpJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZSB0aGUgY2x1c3RlciBhc3NpZ25tZW50cyBhcmUgc29tZXdoYXQgc3RvY2hhc3RpYy4KSW4gcGFydGljdWxhciwgdGhlIG5hbWVzL251bWJlcnMgb2YgdGhlIGNsdXN0ZXJzIGNhbiBiZSBxdWl0ZSBpbmNvbnNpc3RlbnQgYmV0d2VlbiBydW5zIQoKCmBgYHtyIGNsdXN0ZXJpbmcsIGxpdmU9VFJVRX0KIyBwZXJmb3JtIGdyYXBoLWJhc2VkIGNsdXN0ZXJpbmcKbm5fY2x1c3RlcnMgPC0gYmx1c3Rlcjo6Y2x1c3RlclJvd3MoCiAgcGNhX21hdHJpeCwKICBibHVzdGVyOjpOTkdyYXBoUGFyYW0oCiAgICAjIG51bWJlciBvZiBuZWlnaGJvcnMgdG8gdXNlIGluIG5ldHdvcmsgZ3JhcGgKICAgIGsgPSAyMCwKICAgICMgd2VpZ2h0aW5nIHNjaGVtZSBmb3IgYnVpbGRpbmcgdGhlIG5ldHdvcmsgZ3JhcGgKICAgICMgZGVmYXVsdCBpcyAicmFuayIKICAgIHR5cGUgPSAiamFjY2FyZCIsCiAgICAjIGNsdXN0ZXIgZGV0ZWN0aW9uIGFsZ29yaXRobQogICAgIyBkZWZhdWx0IGlzICJ3YWxrdHJhcCIKICAgIGNsdXN0ZXIuZnVuID0gImxvdXZhaW4iCiAgKQopCmBgYAoKV2UgY2FuIHNhdmUgdGhlIGNsdXN0ZXIgYXNzaWdubWVudHMgYmFjayBpbnRvIHRoZSBgY29sRGF0YWAgb2YgdGhlIFNDRSBvYmplY3Qgd2l0aCBhIGxpdHRsZSBzaG9ydGN1dDogdGhlIGAkYCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNvbHVtbiB3ZSB3YW50IHRvIGFkZC4KCmBgYHtyIGFkZCBjbHVzdGVycyB0byBTQ0UsIGxpdmU9VFJVRX0KIyBzYXZlIGNsdXN0ZXJzIHRvIFNDRSBjb2xEYXRhCm5vcm1hbGl6ZWRfc2NlJG5uX2NsdXN0ZXIgPC0gbm5fY2x1c3RlcnMKYGBgCgpOb3cgd2UgY2FuIHBsb3QgdGhlIFVNQVAgYWdhaW4sIHRoaXMgdGltZSBjb2xvcmVkIGJ5IHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzIHRoYXQgd2UganVzdCBjcmVhdGVkLgpIZXJlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGBwbG90UmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgd2Ugd2lsbCB1c2UgYHBsb3RVTUFQKClgLCB3aGljaCBpcyBleGFjdGx5IHRoZSBzYW1lLCBleGNlcHQgaXQgYWx3YXlzIHBsb3RzIGZyb20gdGhlIGByZWR1Y2VkRGltYCBzbG90IG5hbWVkIGBVTUFQYCwgc28gd2UgY2FuIHNraXAgdGhhdCBhcmd1bWVudC4KCmBgYHtyIHBsb3QgY2x1c3RlcnMsIGxpdmU9VFJVRX0KIyBwbG90IFVNQVAgd2l0aCBhc3NpZ25lZCBjbHVzdGVycwpzY2F0ZXI6OnBsb3RVTUFQKG5vcm1hbGl6ZWRfc2NlLAogICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJubl9jbHVzdGVyIikKYGBgCgpXaGF0IGRvIHlvdSBzZWUgaW4gdGhlc2UgcmVzdWx0cz8KCldoYXQgd291bGQgeW91IHdhbnQgdG8gZG8gbmV4dD8KCiMjIFNhdmUgU0NFIG9iamVjdCBmb3IgbGF0ZXIKCldlIHdpbGwgbm93IHNhdmUgb3VyIGZpbHRlcmVkIGFuZCBub3JtYWxpemVkIG9iamVjdCwgaW5jbHVkaW5nIHRoZSBkaW1lbnNpb24gcmVkdWN0aW9uIGFuZCBjbHVzdGVyaW5nIHJlc3VsdHMgdG8gYW4gYFJEU2AgZmlsZSwgdXNpbmcgdGhlIGZpbGUgcGF0aCB0aGF0IHdlIGRlZmluZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBub3RlYm9vay4KSWYgd2Ugd2VyZSB0byB3YW50IHRvIHJldHVybiB0byB0aGlzIGRhdGEsIHdlIGNvdWxkIGxvYWQgdGhpcyBmaWxlIGRpcmVjdGx5IGludG8gYSBuZXcgUiBzZXNzaW9uIGFuZCBub3QgaGF2ZSB0byByZXBlYXQgdGhlIHByb2Nlc3NpbmcgdGhhdCB3ZSBoYXZlIGRvbmUgdXAgdG8gdGhpcyBwb2ludC4KClRoZSBkYXRhIGluIHRoZXNlIG9iamVjdHMgdGVuZHMgdG8gYmUgcXVpdGUgbGFyZ2UsIGJ1dCB2ZXJ5IGNvbXByZXNzaWJsZS4KVG8gc2F2ZSBzcGFjZSBvbiBkaXNrIChhdCB0aGUgZXhwZW5zZSBvZiB0aW1lKSwgd2Ugd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgZGF0YSBpcyBjb21wcmVzc2VkIGludGVybmFsbHkgYmVmb3JlIHdyaXRpbmcgaXQgb3V0IHRvIGEgZmlsZS4KTm90ZSB0aGF0IHRoZSBmaWxlIHdlIHdyaXRlIGlzIHN0aWxsIGdvaW5nIHRvIGJlIGFuIGAucmRzYCBmaWxlIHdpdGggbm8gYWRkaXRpb25hbCBleHRlbnNpb24uCihGdXJ0aGVyIG5vdGU6IFRoZSBiYXNlIFIgZnVuY3Rpb24gYHNhdmVSRFMoKWAgdXNlcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0LCBidXQgdGhlIGB0aWR5dmVyc2VgIGZ1bmN0aW9uIGByZWFkcjo6d3JpdGVfcmRzKClgIGRvZXMgbm90LikKCmBgYHtyIHNhdmUgU0NFLCBsaXZlPVRSVUV9CiMgd3JpdGUgUkRTIGZpbGUgd2l0aCBjb21wcmVzc2lvbgpyZWFkcjo6d3JpdGVfcmRzKG5vcm1hbGl6ZWRfc2NlLCBmaWxlID0gb3V0cHV0X3NjZV9maWxlLCBjb21wcmVzcyA9ICJneiIpCmBgYAoKCiMjIFByaW50IHNlc3Npb24gaW5mbwoKQXMgaXMgb3VyIGhhYml0IGF0IHRoZSBEYXRhIExhYiwgd2Ugd2lsbCBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wdXRpbmcgZW52aXJvbm1lbnQsIHRoZSBwYWNrYWdlcyB3ZSBoYXZlIHVzZWQgaW4gdGhpcyBub3RlYm9vaywgYW5kIHRoZWlyIHZlcnNpb25zIHVzaW5nIHRoZSBgc2Vzc2lvbkluZm8oKWAgY29tbWFuZC4KCmBgYHtyIHNlc3Npb24gaW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAKCg==</div> +<div id="rmd-source-code">LS0tCnRpdGxlOiAiUmVhZGluZywgZmlsdGVyaW5nLCBhbmQgbm9ybWFsaXppbmcgc2NSTkEtc2VxIGRhdGEiCmF1dGhvcjogRGF0YSBMYWIgZm9yIEFMU0YKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciB0byBjZWxscyB1c2luZyBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAKLSBDYWxjdWxhdGUgcXVhbGl0eSBjb250cm9sIG1lYXN1cmVzIG9uIHNjUk5BLXNlcSBkYXRhCi0gUmVtb3ZlIGxpa2VseSBjb21wcm9taXNlZCBjZWxscyB3aXRoIGBtaVFDKClgCi0gTm9ybWFsaXplIGV4cHJlc3Npb24gZGF0YSBhY3Jvc3MgY2VsbHMKLSBDYWxjdWxhdGUgYW5kIHBsb3QgcmVkdWNlZCBkaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIGV4cHJlc3Npb24gZGF0YSAoUENBLCBVTUFQKQoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHJldmlldyBiYXNpYyBwcm9jZXNzaW5nIGZvciBzaW5nbGUtY2VsbCBSTkEtc2VxIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCBhbmQgcHJvY2VlZGluZyB0aHJvdWdoIGZpbHRlcmluZywgcXVhbGl0eSBjb250cm9sLCBub3JtYWxpemF0aW9uLCBhbmQgZGltZW5zaW9uIHJlZHVjdGlvbi4gV2Ugd2lsbCBwZXJmb3JtIHRoZXNlIHRhc2tzIHVzaW5nIHRvb2xzIGZyb20gdGhlIFtCaW9jb25kdWN0b3IgcHJvamVjdF0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnKSwgaW4gcGFydGljdWxhciBbYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3RzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvU2luZ2xlQ2VsbEV4cGVyaW1lbnQuaHRtbCkgYW5kIGZ1bmN0aW9ucyB0aGF0IHdvcmsgd2l0aCB0aG9zZSBvYmplY3RzLgpNdWNoIG9mIHRoZSBtYXRlcmlhbCBpbiB0aGlzIG5vdGVib29rIGlzIGRpcmVjdGx5IGluc3BpcmVkIGJ5LCBhbmQgZHJhd3MgaGVhdmlseSBvbiwgbWF0ZXJpYWwgcHJlc2VudGVkIGluIHRoZSBib29rIFtfT3JjaGVzdHJhdGluZyBTaW5nbGUgQ2VsbCBBbmFseXNpcyB3aXRoIEJpb2NvbmR1Y3Rvcl8gKE9TQ0EpXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EvKS4KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX292ZXJ2aWV3LnBuZykKClRoZSBkYXRhIHdlIHdpbGwgdXNlIGZvciB0aGlzIG5vdGVib29rIGlzIGRlcml2ZWQgZnJvbSBhIGh1bWFuIGdsaW9ibGFzdG9tYSBzcGVjaW1lbi4KVGhlIHNhbXBsZSB3YXMgcHJvY2Vzc2VkIGJ5IDEweCBHZW5vbWljcyB1c2luZyBhIDMnIFJOQSBraXQgKHYzLjEpLCBzZXF1ZW5jZWQsIGFuZCBxdWFudGlmaWVkIHdpdGggQ2VsbCBSYW5nZXIgNi4wLgpGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIHNhbXBsZSBhbmQgcHJvY2Vzc2luZyBjYW4gYmUgZm91bmQgb24gdGhlIFsxMHggd2Vic2l0ZV0oaHR0cHM6Ly93d3cuMTB4Z2Vub21pY3MuY29tL3Jlc291cmNlcy9kYXRhc2V0cy8yLWstc29ydGVkLWNlbGxzLWZyb20taHVtYW4tZ2xpb2JsYXN0b21hLW11bHRpZm9ybWUtMy12LTMtMS0zLTEtc3RhbmRhcmQtNi0wLTApLgoKCiMjIFNldCBVcAoKVG8gc3RhcnQsIHdlIHdpbGwgbG9hZCBzb21lIG9mIHRoZSBsaWJyYXJpZXMgd2Ugd2lsbCBuZWVkIGxhdGVyLCBhbmQgc2V0IGEgcmFuZG9tIG51bWJlciBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkuCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwoKIyBQbG90dGluZyBmdW5jdGlvbnMKbGlicmFyeShnZ3Bsb3QyKQoKIyBUaGUgbWFpbiBjbGFzcyB3ZSB3aWxsIHVzZSBmb3IgU2luZ2xlIENlbGwgZGF0YQpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKQmVmb3JlIHdlIGdldCB0b28gZmFyLCB3ZSBsaWtlIHRvIGRlZmluZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyB0aGF0IHRoZSBub3RlYm9vayB3aWxsIHVzZSBuZWFyIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LgpXaGlsZSB5b3UgbWlnaHQgbm90IGtub3cgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgZmlsZXMgeW91IHdpbGwgbmVlZCBvciBjcmVhdGUgb3V0cHV0IGZpbGVzIHdoZW4geW91IHN0YXJ0IGFuIGFuYWx5c2lzLCB3ZSBoYXZlIGZvdW5kIGl0IGhlbHBmdWwgdG8ga2VlcCBhbGwgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIGluIGEgc2luZ2xlIHBsYWNlIG5lYXIgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuClRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBzb21lYm9keSBjb21pbmcgdG8gdGhlIGNvZGUgbGF0ZXIgdG8gcXVpY2tseSBzZWUgd2hhdCBmaWxlcyBhcmUgbmVlZGVkIGFzIGlucHV0IGFuZCB3aGF0IHdpbGwgYmUgcHJvZHVjZWQgYXMgb3V0cHV0LgpNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGF0IHNvbWVib2R5IGlzIHlvdSEKClRoZSBnZW5lIGV4cHJlc3Npb24gZGF0YSB3ZXJlIHByb2Nlc3NlZCB0byBjcmVhdGUgYSBnZW5lLWJ5LWNlbGwgZXhwcmVzc2lvbiBtYXRyaXggb2YgY291bnRzIGZvciB1c2luZyBDZWxsIFJhbmdlciA2LjAuCldlIGhhdmUgcHJvdmlkZWQgdGhlIHJhdyBkYXRhIGRpcmVjdG9yeSwgYHJhd19mZWF0dXJlX2JjX21hdHJpeGAsIHdoaWNoIGlzIHVzdWFsbHkgcHJvZHVjZWQgYnkgQ2VsbCBSYW5nZXIgYW5kIHBsYWNlZCBpbiBpdHMgYG91dHNgIGRpcmVjdG9yeS4KVGhpcyBkaXJlY3RvcnkgdXN1YWxseSBjb250YWlucyB0aHJlZSBmaWxlczoKLSBgYmFyY29kZXMudHN2Lmd6YCwgYSB0YWJsZSBvZiB0aGUgY2VsbCBiYXJjb2RlcyB0aGF0IDEweCB1c2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSBjb3VudCBtYXRyaXguCi0gYGZlYXR1cmVzLnRzdi5nemAsIGEgdGFibGUgb2YgdGhlIGZlYXR1cmVzIChnZW5lcyBpbiB0aGlzIGNhc2UpIGZvciB3aGljaCBleHByZXNzaW9uIHdhcyBxdWFudGlmaWVkLgpUaGlzIHdpbGwgdXN1YWxseSBhbHNvIGluY2x1ZGUgYSBiaXQgb2YgbWV0YWRhdGEgYWJvdXQgdGhlIGZlYXR1cmVzLCBpbmNsdWRpbmcgZ2VuZSBzeW1ib2xzIChpZiB0aGUgZmVhdHVyZXMgYXJlIGdlbmVzKSBhbmQgdGhlIHR5cGUgb2YgZGF0YSB0aGV5IHJlcHJlc2VudCAoZS5nLiwgZ2VuZSBleHByZXNzaW9uIG9yIGFudGlib2R5IGNhcHR1cmUpLgotIGBtYXRyaXgubXR4Lmd6YCwgVGhlIGNvdW50cyB0aGVtc2VsdmVzLCBzdG9yZWQgaW4gYSBzcGFyc2UgWyJNYXRyaXggRXhjaGFuZ2UiIGZvcm1hdF0oaHR0cHM6Ly9tYXRoLm5pc3QuZ292L01hdHJpeE1hcmtldC9mb3JtYXRzLmh0bWwpLgoKQ2VsbCBSYW5nZXIgd2lsbCBhbHNvIGV4cG9ydCB0aGVzZSBkYXRhIGluIGEgc2luZ2xlIGBIREY1YCBmb3JtYXQgZmlsZSB3aXRoIGEgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjYW4gYWxzbyBiZSBpbXBvcnRlZCB3aXRoIHRoZSBzYW1lIGNvbW1hbmRzIHdlIHdpbGwgdXNlIGJlbG93LgpIb3dldmVyLCB3ZSBoYXZlIGZvdW5kIHRoYXQgcHJvY2Vzc2luZyBsYXJnZSBgLmg1YCBmaWxlcyBpcyBvZnRlbiBfbXVjaF8gbGVzcyBlZmZpY2llbnQgaW4gUiwgc28gd2UgcHJlZmVyIHRvIHN0YXJ0IHdpdGggdGhlIG1hdHJpeCBmaWxlcyB3aGVuIHBvc3NpYmxlLgpJbiBwYXJ0aWN1bGFyLCB3ZSB3b3VsZCBub3QgcmVjb21tZW5kIHdvcmtpbmcgd2l0aCBgLmg1YCBmaWxlcyBmb3IgcmF3IGRhdGE7IHRoZSBmaWx0ZXJpbmcgc3RlcHMgd2Ugd2lsbCB1c2UgYmVsb3cgY2FuIHNvbWV0aW1lcyB0YWtlIGhvdXJzIHdoZW4gdXNpbmcgdGhvc2UgZmlsZXMgYXMgaW5wdXQuCgpXZSB3aWxsIGFsc28gbmVlZCBhIHRhYmxlIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMsIHdoaWNoIHdlIGhhdmUgc3RvcmVkIGluIHRoZSBgZGF0YS9yZWZlcmVuY2UvYCBkaXJlY3RvcnkuCgpGaW5hbGx5LCB3ZSB3aWxsIHNldCB1cCB0aGUgb3VyIG91dHB1dCBkaXJlY3RvcnksIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdCwgYW5kIGRlZmluZSB0aGUgbmFtZSBmb3IgdGhlIGZpbGVzIHdlIHdpbGwgc2F2ZSBhZnRlciBhbGwgb2Ygb3VyIGluaXRpYWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KCmBgYHtyIGlucHV0cywgbGl2ZT1UUlVFfQojIElucHV0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIG1haW4gZGF0YSBkaXJlY3RvcnkKZGF0YV9kaXIgPC0gZmlsZS5wYXRoKCJkYXRhIiwgImdsaW9ibGFzdG9tYS0xMHgiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXggZmlsZQpyYXdfbWF0cml4X2RpciA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJyYXdfZmVhdHVyZV9iY19tYXRyaXgiKQoKIyByZWZlcmVuY2UgZGF0YSBkaXJlY3RvcnkKcmVmX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAicmVmZXJlbmNlIikKCiMgUGF0aCB0byBtaXRvY2hvbmRyaWFsIGdlbmVzIHRhYmxlCm1pdG9fZmlsZSA8LSBmaWxlLnBhdGgocmVmX2RpciwgImhzX21pdG9jaG9uZHJpYWxfZ2VuZXMudHN2IikKYGBgCgpgYGB7ciBvdXRwdXRzfQojIE91dHB1dHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIERpcmVjdG9yeSBhbmQgZmlsZSB0byBzYXZlIG91dHB1dApub3JtYWxpemVkX2RpciA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJub3JtYWxpemVkIikKCiMgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3QKZnM6OmRpcl9jcmVhdGUobm9ybWFsaXplZF9kaXIpCgojIG91dHB1dCBSRFMgZmlsZSBmb3Igbm9ybWFsaXplZCBkYXRhCm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgobm9ybWFsaXplZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsaW9ibGFzdG9tYV9ub3JtYWxpemVkX3NjZS5yZHMiKQpgYGAKCgojIyBSZWFkaW5nIENlbGwgUmFuZ2VyIGRhdGEKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogUHJlcHJvY2VzcyBhbmQgSW1wb3J0XShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9wcmVwcm9jZXNzLnBuZykKCldoZXRoZXIgdGhlIDEweCBDZWxsIFJhbmdlciBkYXRhIGlzIGluIE1hdHJpeCBFeGNoYW5nZSBmb3JtYXQgb3IgaW4gYW4gSERGNSBmaWxlLCB3ZSBjYW4gdXNlIHRoZSBgcmVhZDEweENvdW50cygpYCBmdW5jdGlvbiBmcm9tIHRoZSBgRHJvcGxldFV0aWxzYCBwYWNrYWdlIHRvIHJlYWQgdGhlIGRhdGEgaW50byBSIGFuZCBjcmVhdGUgYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KKFRob3VnaCBhZ2Fpbiwgd2UgZG8gbm90IHJlY29tbWVuZCB1c2luZyB0aGUgYC5oNWAgZmlsZSBpZiB5b3UgY2FuIGF2b2lkIGl0LCBfZXNwZWNpYWxseV8gZm9yIHJhdyAodW5maWx0ZXJlZCkgZGF0YS4pCgpJZiB5b3UgdXNlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBDZWxsIFJhbmdlciB0byBwcm9jZXNzIHRoZSByYXcgZGF0YSwgeW91IHdvdWxkIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGZ1bmN0aW9uIHRvIHJlYWQgaXQgaW4gYW5kIGNyZWF0ZSB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QuClNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGZvciBvdGhlciBjb21tb24gZGF0YSBmb3JtYXRzIGFyZSBkaXNjdXNzZWQgaW4gW0NoYXB0ZXIgMyBvZiBPU0NBXSAoaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xNi9PU0NBLmludHJvL2dldHRpbmctc2NybmEtc2VxLWRhdGFzZXRzLmh0bWwjcmVhZGluZy1jb3VudHMtaW50by1yKS4KCmBgYHtyIHJlYWQgU0NFLCBsaXZlPVRSVUV9CiMgcmVhZCBTQ0UgZnJvbSBtYXRyaXggZGlyZWN0b3J5CnJhd19zY2UgPC0gRHJvcGxldFV0aWxzOjpyZWFkMTB4Q291bnRzKAogIHJhd19tYXRyaXhfZGlyLCAKICAjIGVuc3VyZSBiYXJjb2RlcyBhcmUgc2V0IGFzIGNvbHVtbiBuYW1lcyBpbiB0aGUgU0NFIG9iamVjdAogIGNvbC5uYW1lcyA9IFRSVUUKKQpgYGAKCkxldCdzIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgYWZ0ZXIgcmVhZGluZyBpdCBpbjoKCmBgYHtyIHZpZXcgU0NFLCBsaXZlPVRSVUV9CiMgdmlldyBTQ0Ugb2JqZWN0CnJhd19zY2UKYGBgCgpXZSBjYW4gc2VlIGZyb20gdGhpcyBzdW1tYXJ5IHRoYXQgdGhpcyBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdCBjb250YWlucyAzNiw2MDEgcm93cywgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgZmVhdHVyZXMgKGdlbmVzKSB0aGF0IHdlcmUgYW5hbHl6ZWQsIGFuZCA3MzQsNDkyIGNvbHVtbnMsIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIHBvc3NpYmxlIGJhcmNvZGUgdGFncyB0aGF0IHdlcmUgdXNlZCBpbiB0aGUgZXhwZXJpbWVudC4KTm90ZSB0aGF0IG5vdCBhbGwgb2YgdGhlc2UgYmFyY29kZSB0YWdzIHdpbGwgaGF2ZSBiZWVuIHVzZWQsIGFuZCBtYW55IG9mIHRoZSBmZWF0dXJlcyBtYXkgbmV2ZXIgaGF2ZSBiZWVuIHNlZW4gZWl0aGVyLgpPbmUgb2Ygb3VyIGZpcnN0IHN0ZXBzIHdpbGwgYmUgdG8gZmlsdGVyIG91dCBiYXJjb2RlcyB0aGF0IHdlcmUgbmV2ZXIgc2Vlbiwgb3IgdGhhdCBtYXkgaGF2ZSBvbmx5IGJlZW4gc2VlbiBpbiBhIGRyb3BsZXQgdGhhdCBkaWQgbm90IGNvbnRhaW4gYSBjZWxsIChhbiAiZW1wdHkgZHJvcGxldCIpLgoKIyMjIFN0cnVjdHVyZSBvZiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QKCkluIGFkZGl0aW9uIHRvIHRoZSBtYWluIGBjb3VudHNgIG1hdHJpeCwgbGlzdGVkIGFzIGFuIGBhc3NheWAgaW4gdGhlIFNDRSBzdW1tYXJ5IGFib3ZlLCB0aGUgU0NFIG9iamVjdCBjYW4gY29udGFpbiBhIG51bWJlciBvZiBvdGhlciB0YWJsZXMgYW5kIG1hdHJpY2VzLCBlYWNoIHN0b3JlZCBpbiBhICJzbG90IiB3aXRoIGEgcGFydGljdWxhciBmb3JtYXQuClRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiB0aGUgb2JqZWN0IGNhbiBiZSBzZWVuIGluIHRoZSBmaWd1cmUgYmVsb3csIHdoaWNoIGNvbWVzIGZyb20gYW4gW09TQ0EgSW50cm9kdWN0aW9uIGNoYXB0ZXJdKGh0dHA6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTYvT1NDQS5pbnRyby90aGUtc2luZ2xlY2VsbGV4cGVyaW1lbnQtY2xhc3MuaHRtbCkuCgohW1N0cnVjdHVyZSBvZiBhIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdF0oZGlhZ3JhbXMvU2luZ2xlQ2VsbEV4cGVyaW1lbnQucG5nKQoKV2UgaGF2ZSBqdXN0IG1lbnRpb25lZCB0aGUgbWFpbiBgYXNzYXlgIHNsb3QsIHdoaWNoIGNvbnRhaW5zIGZ1bGwgbWF0cmljZXMgb2YgZGF0YSAoc3VjaCBhcyB0cmFuc2NyaXB0IGNvdW50cykgd2l0aCBlYWNoIHJvdyBhIGZlYXR1cmUgYW5kIGVhY2ggY29sdW1uIGEgY2VsbC4KVGhlcmUgYXJlIGFsc28gYSBjb3VwbGUgb2YgdGFibGVzIGZvciBtZXRhZGF0YSwgYW5kIGEgc2xvdCB0byBzdG9yZSByZWR1Y2VkLWRpbWVuc2lvbiByZXByZXNlbnRhdGlvbnMgKGUuZy4sIFBDQSBhbmQvb3IgVU1BUCkgb2YgdGhlIGV4cHJlc3Npb24gZGF0YS4KCldlJ2xsIHN0YXJ0IHdpdGggdGhlIGByb3dEYXRhYCBzbG90LCB3aGljaCBpcyBhIHRhYmxlIG9mIG1ldGFkYXRhIGZvciBlYWNoIGZlYXR1cmUgaW4gb3VyIG9iamVjdC4KRm9yIG5vdyB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUgYGZlYXR1cmVzLnRzdi5nemAgZmlsZSB0aGF0IHdlIGRpc2N1c3NlZCBlYXJsaWVyLgpJZiB3ZSBoYWQgcmVhZCB0aGUgZGF0YSBmcm9tIHNvbWV0aGluZyBvdGhlciB0aGFuIENlbGwgUmFuZ2VyIG91dHB1dCwgd2UgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgY29udGVudHMsIGJ1dCBlYWNoIHJvdyB3b3VsZCBzdGlsbCBjb3JyZXNwb25kIHRvIGEgc2luZ2xlIGZlYXR1cmUgb2YgdGhlIFNDRSBvYmplY3QuCgpMZXQncyBsb29rIGF0IHRoaXMgdGFibGUsIGV4dHJhY3RpbmcgaXQgZnJvbSB0aGUgU0NFIG9iamVjdCB3aXRoIHRoZSBgcm93RGF0YSgpYCBmdW5jdGlvbiBhbmQgdXNpbmcgYGhlYWQoKWAgdG8gdmlldyBvbmx5IHRoZSBmaXJzdCA2IHJvd3MuCgpgYGB7ciByb3dkYXRhfQojIHZpZXcgcm93RGF0YSAoZmVhdHVyZXMpCmhlYWQocm93RGF0YShyYXdfc2NlKSkKYGBgCgpZb3UgY2FuIHNlZSB0aGF0IHRoaXMgdGFibGUgaW5jbHVkZXMgYW4gYElEYCBmb3IgZWFjaCBmZWF0dXJlLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBFbnNlbWJsIGdlbmUgSUQsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZ2VuZSBzeW1ib2wgaW4gdGhlIGBTeW1ib2xgIGNvbHVtbi4KRmluYWxseSB0aGVyZSBpcyBhIGNvbHVtbiBmb3IgYFR5cGVgLCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgYWx3YXlzICJHZW5lIEV4cHJlc3Npb24iLCBhcyBhbGwgb2YgdGhlIGZlYXR1cmVzIGluIHRoaXMgZGF0YSBzZXQgYXJlIGdlbmVzLgpJZiB0aGVyZSB3ZXJlIGFub3RoZXIgbW9kYWxpdHkgb2YgZGF0YSB0aGF0IGhhZCBiZWVuIGFzc2F5ZWQgaW4gdGhpcyBleHBlcmltZW50LCB0aGVyZSBtaWdodCBiZSBvdGhlciB2YWx1ZXMgaW4gdGhpcyBjb2x1bW4sIHN1Y2ggYXMgIkFudGlib2R5IENhcHR1cmUiIGZvciBDSVRFLXNlcSBleHBlcmltZW50cy4KClRoZSBzZWNvbmQgc2xvdCBpcyB0aGUgYGNvbERhdGFgIHRhYmxlLCB3aGljaCBub3cgY29ycmVzcG9uZHMgdG8gdGhlIGBiYXJjb2Rlcy50c3YuZ3pgIGZpbGUsIGNvbnRhaW5pbmcgb25lIHJvdyBwZXIgY2VsbCBiYXJjb2RlLCBvciwgbW9yZSBnZW5lcmFsbHksIG9uZSByb3cgcGVyIGNvbHVtbiBvZiB0aGUgYGNvdW50c2AgYXNzYXkuCldlIGNhbiBsb29rIGF0IHRoaXMgdGFibGUgdXNpbmcgdGhlIGBjb2xEYXRhKClgIGZ1bmN0aW9uIChhbmQgYGhlYWQoKWAgYWdhaW4gdG8gcHJldmVudCBwcmludGluZyB0aGUgd2hvbGUgdGFibGUpOgoKYGBge3IgY29sZGF0YX0KIyB2aWV3IGNvbERhdGEgKGNlbGwgYmFyY29kZXMpCmhlYWQoY29sRGF0YShyYXdfc2NlKSkKYGBgCgpIZXJlIHdlIHNlZSB0aGF0IHRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGNvbHVtbnM6CgotIHRoZSBgU2FtcGxlYCBjb2x1bW4gaGFzIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRoYXQgd2UgcmVhZCBpbiAoeW91IG1heSBub3Qgc2VlIHRoZSB3aG9sZSBwYXRoIGluIHRoaXMgZGlzcGxheSk7IHRoaXMgc2hvdWxkIGJlIGlkZW50aWNhbCBpbiBhbGwgcm93cyBmcm9tIGEgc2luZ2xlIHNhbXBsZS4KLSB0aGUgYEJhcmNvZGVgIGNvbHVtbiBjb250YWlucyB0aGUgc2VxdWVuY2UgdGhhdCB3YXMgdXNlZCB0byBpZGVudGlmeSBlYWNoIHBvdGVudGlhbCBkcm9wbGV0IGZvciBzZXF1ZW5jaW5nIChhbmQgYSBudW1lcmljIHRhZywgaW4gdGhpcyBjYXNlKS4KVGhlc2Ugd2lsbCBiZSB1bmlxdWUgd2l0aGluIGEgc2FtcGxlLgoKQXMgd2UgcHJvY2VlZCB0byBjYWxjdWxhdGUgcGVyLWNlbGwgc3RhdGlzdGljcywgd2Ugd2lsbCBiZSBhZGRpbmcgbmV3IGRhdGEgdG8gdGhpcyB0YWJsZS4KCiMjIFF1YWxpdHkgY29udHJvbCBhbmQgZmlsdGVyaW5nCgohW1NpbmdsZS1jZWxsIHJvYWRtYXA6IFFDLCBGaWx0ZXIsIGFuZCBOb3JtYWxpemVdKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX3FjX25vcm0ucG5nKQoKIyMjIEZpbHRlcmluZyBlbXB0eSBkcm9wbGV0cwoKTW9zdCBvZiB0aGUgYmFyY29kZXMgaW4gYW55IGdpdmVuIDEweCBleHBlcmltZW50IHdpbGwgbm90IGJlIHNlZW4gYXQgYWxsLCBzbyBvdXIgZmlyc3Qgc3RlcCBjYW4gYmUgdG8gZmlsdGVyIHRoaXMgcmF3IGRhdGEgdG8gb25seSB0aGUgY2VsbHMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRyYW5zY3JpcHQgdGhhdCB3YXMgY291bnRlZCB3aXRoIHRoYXQgYmFyY29kZS4KClRvIGRvIHRoaXMsIHdlIHdpbGwgdXNlIHRoZSBgY29sU3VtcygpYCBmdW5jdGlvbiB0byBxdWlja2x5IGFkZCB1cCBhbGwgdGhlIGNvdW50cyB0aGF0IGNvcnJlc3BvbmQgdG8gZWFjaCBwb3NzaWJsZSBjZWxsIGJhcmNvZGUsIHRoZW4gZmlsdGVyIG91ciBgcmF3X3NjZWAgZG93biB0byBqdXN0IHRob3NlIGNvbHVtbnMgd2hlcmUgdGhlcmUgYXJlIG5vbi16ZXJvIHRvdGFsIGNvdW50cy4KV2Ugd2lsbCBuZWVkIHRvIGV4dHJhY3QgdGhlIGBjb3VudHNgIG1hdHJpeCBmcm9tIG91ciBTQ0Ugb2JqZWN0LCB3aGljaCB3ZSBjYW4gZG8gdXNpbmcgdGhlIGBjb3VudHMoKWAgZnVuY3Rpb24sIGNvbnZlbmllbnRseSBlbm91Z2guCgpgYGB7ciByZW1vdmUgemVyb3MsIGxpdmU9VFJVRX0KIyBzdW0gY29sdW1ucyBmcm9tIGNvdW50cyBtYXRyaXgKYmFyY29kZV9jb3VudHMgPC0gY29sU3Vtcyhjb3VudHMocmF3X3NjZSkpCgojIGZpbHRlciBTQ0Ugb2JqZWN0IHRvIG9ubHkgcm93cyB3aXRoIGNvdW50cyA+IDAKcmF3X3NjZSA8LSByYXdfc2NlWywgd2hpY2goYmFyY29kZV9jb3VudHMgPiAwKV0KYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgaG93IG91ciBTQ0Ugb2JqZWN0IGhhcyBjaGFuZ2VkOgoKYGBge3IgemVyby1maWx0ZXJlZCBTQ0V9CnJhd19zY2UKYGBgCgpCdXQgYmFyY29kZXMgd2l0aCB6ZXJvIGNvdW50cyBhcmUgbm90IHRoZSBvbmx5IG9uZXMgdGhhdCBjb3JyZXNwb25kIHRvIGRyb3BsZXRzIHdpdGhvdXQgY2VsbHMgaW4gdGhlbSEKRXZlbiBpZiBhIGRyb3BsZXQgZG9lcyBub3QgaGF2ZSBhIGNlbGwgaW4gaXQsIHRoZXJlIHdpbGwgb2Z0ZW4gYmUgc3B1cmlvdXMgcmVhZHMgZnJvbSBSTkEgc2VxdWVuY2VzIHRoYXQgd2VyZSBwcmVzZW50IGluIHRoZSBleHRyYWNlbGx1bGFyIHNvbHV0aW9uLCB3aGV0aGVyIGZyb20gdGhlIG9yaWdpbmFsIHNhbXBsZSBvciBmcm9tIGNlbGxzIHRoYXQgd2VyZSBkYW1hZ2VkIGR1cmluZyBzaW5nbGUtY2VsbCBsaWJyYXJ5IHByZXBhcmF0aW9uLgoKV2UgY291bGQgaWRlbnRpZnkgdGhlc2UgYmFyY29kZXMgc2ltcGx5IGFzIHRob3NlIHdpdGggbG93IHRyYW5zY3JpcHQgY291bnRzLgpPciwgd2UgY2FuIGJlIGEgYml0IG1vcmUgY2xldmVyIQpXZSBjYW4gbG9vayBhdCB0aGUgdHJhbnNjcmlwdCBjb3VudHMgX2Zyb21fIHRoZSBsb3dlc3QtY291bnQgZHJvcGxldHMgdG8gY3JlYXRlIGFuIGV4cGVjdGVkIGRpc3RyaWJ1dGlvbiBvZiB0cmFuc2NyaXB0cyBpbiBkcm9wbGV0cyB0aGF0IGRvbid0IGNvbnRhaW4gY2VsbHMuClRoZW4gd2UgY2FuIHRlc3QgZWFjaCBkcm9wbGV0IHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBpdHMgdHJhbnNjcmlwdCBkaXN0cmlidXRpb24gZGV2aWF0ZXMgZnJvbSB0aGF0IGV4cGVjdGF0aW9uLgpJZiBpdCBkb2VzLCB0aGVuIHdlIGhhdmUgcHJldHR5IGdvb2QgZXZpZGVuY2UgdGhhdCB0aGVyZSBfaXNfIGEgY2VsbCBpbiB0aGVyZS4KClRoaXMgdGVzdCB3YXMgZmlyc3QgcHJvcG9zZWQgYnkgW0x1biBfZXQgYWwuXyAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzA1OS0wMTktMTY2Mi15KSBhbmQgaW1wbGVtZW50ZWQgYXMgYGVtcHR5RHJvcHMoKWAgaW4gdGhlIGBEcm9wbGV0VXRpbHNgIHBhY2thZ2UuClRoaXMgbWV0aG9kIHdhcyB0aGVuIGFkb3B0ZWQsIHdpdGggc29tZSBtb2RpZmljYXRpb25zLCBhcyB0aGUgZGVmYXVsdCBjZWxsIGZpbHRlcmluZyBtZXRob2QgdXNlZCBieSBDZWxsIFJhbmdlci4KSGVyZSB3ZSB3aWxsIHVzZSB0aGUgW2BlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBmdW5jdGlvbl0oaHR0cHM6Ly9yZHJyLmlvL2dpdGh1Yi9NYXJpb25pTGFiL0Ryb3BsZXRVdGlscy9tYW4vZW1wdHlEcm9wc0NlbGxSYW5nZXIuaHRtbCkgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgdGhhdCBtb3JlIGNsb3NlbHkgbWF0Y2hlcyB0aGUgQ2VsbCBSYW5nZXIgaW1wbGVtZW50YXRpb24uCgoKYGBge3IgY2FsY3VsYXRlIGRyb3BsZXQgc3RhdHMsIGxpdmU9VFJVRX0KIyBjcmVhdGUgYSB0YWJsZSBvZiBzdGF0aXN0aWNzIHVzaW5nIGVtcHR5RHJvcHNDZWxsUmFuZ2VyCmRyb3BsZXRfZGYgPC0gRHJvcGxldFV0aWxzOjplbXB0eURyb3BzQ2VsbFJhbmdlcihyYXdfc2NlKQpgYGAKCk1vc3QgdmFsdWVzIGluIHRoaXMgdGFibGUgYXJlIGBOQWAsIGJlY2F1c2UgaW5kaXZpZHVhbCBzdGF0aXN0aWNzIHdlcmUgbm90IGNhbGN1bGF0ZWQgZm9yIHRoZSBsb3ctY291bnQgZHJvcGxldHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGJhY2tncm91bmQgZGlzdHJpYnV0aW9uLgooTW9zdCBkcm9wbGV0cyBkb24ndCBoYXZlIGNlbGxzLCBzbyB0aGlzIG1ha2VzIHNvbWUgc2Vuc2UhKQoKV2UgY2FuIGxvb2sgYXQganVzdCB0aGUgcm93cyB3aXRob3V0IGBOQWAgdmFsdWVzIGJ5IHNlbGVjdGVkIHRoZSBvbmVzIHdoZXJlIHRoZSBGRFIgKHdoaWNoIHdlIHdpbGwgdXNlIGFnYWluIHNvb24pLCBpcyBub3QgYE5BYC4KCmBgYHtyIGRyb3BsZXQgc3RhdHN9CiMgdmlldyByb3dzIHdoZXJlIEZEUiBpcyBub3QgYE5BYApkcm9wbGV0X2RmWyFpcy5uYShkcm9wbGV0X2RmJEZEUiksIF0KYGBgCllvdSB3aWxsIG5vdGljZSB0aGF0IHNvbWUgY2VsbHMgd2l0aCBoaWdoIGNvdW50cyBhbHNvIGhhdmUgYE5BYCB2YWx1ZXMgZm9yIG1hbnkgc3RhdGlzdGljcy4KSW4gdGhvc2UgY2FzZXMsIGBOQWAgdmFsdWVzIGFyZSBhY3R1YWxseSBwcmVzZW50IF9iZWNhdXNlXyBvZiB0aGUgaGlnaCBjb3VudHMgLSBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgYXV0b21hdGljYWxseSBhc3N1bWVkIGNlbGxzIHdlcmUgcHJlc2VudCwgc28gdGhleSB3ZXJlIGFsc28gbm90IHRlc3RlZC4KCk5vdyB3ZSBjYW4gZmlsdGVyIG91ciBgcmF3X3NjZWAgb2JqZWN0IF9ieSBjb2x1bW5fIHRvIG9ubHkga2VlcCB0aGUgY2VsbHMgd2l0aCBhIHNtYWxsIEZEUjogdGhvc2UgdGhhdCBhcmUgcXVpdGUgdW5saWtlbHkgdG8gYmUgZW1wdHkgZHJvcGxldHMuCgpgYGB7ciBmaWx0ZXIgZW1wdHlkcm9wcywgbGl2ZT1UUlVFfQojIGZpbHRlciBkcm9wbGV0cyB1c2luZyBgd2hpY2hgIHRvIHByZXZlbnQgTkEgdHJvdWJsZQpjZWxsc190b19yZXRhaW4gPC0gd2hpY2goZHJvcGxldF9kZiRGRFIgPCAwLjAxKQpmaWx0ZXJlZF9zY2UgPC0gcmF3X3NjZVssIGNlbGxzX3RvX3JldGFpbl0KYGBgCgpIb3cgbWFueSBjZWxscyBkbyB3ZSBoYXZlIG5vdz8KCmBgYHtyIGZpbHRlcmVkIHN1bW1hcnl9CmZpbHRlcmVkX3NjZQpgYGAKCiMjIyBBZGRpdGlvbmFsIHF1YWxpdHkgY29udHJvbAoKSW4gYWRkaXRpb24gdG8gZmlsdGVyaW5nIG91dCBlbXB0eSBkcm9wbGV0cywgd2UgYWxzbyB3aWxsIHdhbnQgdG8gZmlsdGVyIG91dCBjZWxscyB0aGF0IG1heSBoYXZlIGJlZW4gZGFtYWdlZCBkdXJpbmcgbGlicmFyeSBwcmVwYXJhdGlvbi4KVGhlc2Ugd2lsbCBvZnRlbiBiZSBjaGFyYWN0ZXJpemVkIGJ5IGEgaGlnaCBwcm9wb3J0aW9uIG9mIG1pdG9jaG9uZHJpYWwgdHJhbnNjcmlwdHMgYW5kIGEgc21hbGxlciBvdmVyYWxsIG51bWJlciBvZiB1bmlxdWUgdHJhbnNjcmlwdHMuCldoZW4gYSBjZWxsIHJ1cHR1cmVzLCBjeXRvcGxhc21pYyB0cmFuc2NyaXB0cyB3aWxsIGxlYWsgb3V0LCBidXQgbWl0b2Nob25kcmlhbCB0cmFuc2NyaXB0cywgc3RpbGwgcHJvdGVjdGVkIGJ5IHRoZSBtaXRvY2hvbmRyaWFsIG1lbWJyYW5lLCBtYXkgcmVtYWluLgpBcyBhIGNvbnNlcXVlbmNlLCB0aGVyZSB3aWxsIGJlIGFuIG92ZXItYWJ1bmRhbmNlIG9mIG1pdG9jaG9uZHJpYWwgcmVhZHMsIGFuZCBmZXdlciB1bmlxdWUgdHJhbnNjcmlwdHMgZXhwcmVzc2VkLgoKT3VyIGZpcnN0IHN0ZXAgdGhlbiwgaXMgY3JlYXRlIGEgdmVjdG9yIG9mIHRoZSBtaXRvY2hvbmRyaWFsIGdlbmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gb3VyIGRhdGFzZXQuClRoZSBtaXRvY2hvbmRyaWFsIGZpbGUgd2UgZGVmaW5lZCBkdXJpbmcgc2V0dXAgKGBtaXRvX2ZpbGVgKSBpcyBhIFRTViBmaWxlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBodW1hbiBtaXRvY2hvbmRyaWFsIGdlbmVzIHdpdGggYWRkaXRpb25hbCBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciBlYWNoIGdlbmUsIHN1Y2ggYXMgdGhlIGdlbmUgbG9jYXRpb24gYW5kIGFsdGVybmF0aXZlIG5hbWVzLgooRm9yIG1vcmUgZGV0YWlsIG9uIHRoZSBzdGVwcyB3ZSB0b29rIHRvIGNyZWF0ZSB0aGlzIGZpbGUsIHlvdSBjYW4gbG9vayBhdCBbb25lIG9mIG91ciBzZXR1cCBub3RlYm9va3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3RyYWluaW5nLW1vZHVsZXMvYmxvYi9tYXN0ZXIvc2NSTkEtc2VxLWFkdmFuY2VkL3NldHVwL21pdG9fZ2VuZV9saXN0cy5SbWQpKQoKQWxsIHdlIG5lZWQgbm93IGlzIHRoZSBgZ2VuZV9pZGAsIGFuZCBvbmx5IGZvciB0aGUgZ2VuZXMgdGhhdCBhcmUgcHJlc2VudCBpbiBvdXIgU0NFLCBzbyB3ZSB3aWxsIGRvIHNvbWUgZmlsdGVyaW5nIHdpdGggYGRwbHlyYCB0byBwdWxsIG91dCBhIHZlY3RvciB3aXRoIGp1c3QgdGhvc2UgaWRzLgoKYGBge3IgZ2V0IG1pdG9jaG9uZHJpYWwgZ2VuZXN9CiMgcmVhZCBpbiBhIHRhYmxlIG9mIG1pdG9jaG9uZHJpYWwgZ2VuZXMgYW5kIGV4dHJhY3QgaWRzCm1pdG9fZ2VuZXMgPC0gcmVhZHI6OnJlYWRfdHN2KG1pdG9fZmlsZSkgfD4KICAjIGZpbHRlciB0byBvbmx5IHRoZSBnZW5lcyB0aGF0IGFyZSBmb3VuZCBpbiBvdXIgZGF0YXNldAogIGRwbHlyOjpmaWx0ZXIoZ2VuZV9pZCAlaW4lIHJvd25hbWVzKGZpbHRlcmVkX3NjZSkpIHw+CiAgIyBjcmVhdGUgYSB2ZWN0b3IgZnJvbSB0aGUgZ2VuZV9pZCBjb2x1bW4KICBkcGx5cjo6cHVsbChnZW5lX2lkKQpgYGAKCiMjIyBDYWxjdWxhdGluZyBzdW1tYXJ5IFFDIHN0YXRpc3RpY3MKCldlIGNhbiBub3cgdXNlIHRoZSBgc2N1dHRsZWAgZnVuY3Rpb24gYGFkZFBlckNlbGxRQygpYCB0byBjYWxjdWxhdGUgc29tZSBzdGF0aXN0aWNzIGJhc2VkIG9uIHRoZSBjb3VudHMgbWF0cml4LCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBgY29sRGF0YWAgdGFibGUuCgpJbiBhZGRpdGlvbiB0byBjYWxjdWxhdGluZyBzdGF0aXN0aWNzIGxpa2UgdGhlIHRvdGFsIHJlYWQgY291bnQgZm9yIGVhY2ggY2VsbCBhbmQgdGhlIG51bWJlciBvZiB0cmFuc2NyaXB0cyB0aGF0IGFyZSBkZXRlY3RlZCwgd2UgY2FuIGFsc28gY2FsY3VsYXRlIHRob3NlIHN0YXRpc3RpY3MgZm9yIGRlZmluZWQgc3Vic2V0cyBvZiBnZW5lcy4KSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHVzZSBvdXIgYG1pdG9fZ2VuZXNgIHZlY3RvciB0byBkZWZpbmUgYSBzdWJzZXQgY2FsbGVkIGBtaXRvYC4KVGhlIGBtaXRvYCBuYW1lIGlzIGltcG9ydGFudCBpbiB0aGF0IGl0IGlzIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBleHBlY3RlZCBieSBhIGxhdGVyIGZ1bmN0aW9uLgooV2UgY291bGQgZGVmaW5lIG1vcmUgc3Vic2V0cywgYnV0IGZvciBub3cgdGhpcyBvbmUgd2lsbCBkby4pCgpgYGB7ciBwZXIgY2VsbCBRQywgbGl2ZT1UUlVFfQpmaWx0ZXJlZF9zY2UgPC0gc2N1dHRsZTo6YWRkUGVyQ2VsbFFDKGZpbHRlcmVkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXRzID0gbGlzdChtaXRvID0gbWl0b19nZW5lcykpCmBgYAoKTm93IHdlIGNhbiBsb29rIGF0IHRoZSBjb2xEYXRhIHRvIHNlZSB3aGF0IHdhcyBhZGRlZDoKCmBgYHtyIHZpZXcgY29sRGF0YSBzdGF0c30KaGVhZChjb2xEYXRhKGZpbHRlcmVkX3NjZSkpCmBgYAoKV2UgY2FuIGFsc28gcGxvdCBzb21lIG9mIHRoZXNlIHN0YXRpc3RpY3MsIGhlcmUgdXNpbmcgdGhlIGBwbG90TWV0cmljcygpYCBmdW5jdGlvbiBmcm9tIHRoZSBgbWlRQ2AgcGFja2FnZSB0byBwbG90IHRoZSBwZXJjZW50IG9mIHJlYWRzIHRoYXQgYXJlIG1pdG9jaG9uZHJpYWwgKHRoZSBgc3Vic2V0c19taXRvX3BlcmNlbnRgIGNvbHVtbikgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBnZW5lcyBkZXRlY3RlZCAodGhlIGBkZXRlY3RlZGAgY29sdW1uKSBmb3IgZWFjaCBjZWxsLgoKYGBge3IgbWlRQyBwbG90TWV0cmljc30KIyB1c2UgbWlRQzo6cGxvdE1ldHJpY3MoKQptaVFDOjpwbG90TWV0cmljcyhmaWx0ZXJlZF9zY2UpICsgdGhlbWVfYncoKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIHJhbmdlIG9mIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZXMsIGFuZCBpdCBkb2VzIGFsc28gc2VlbSB0aGF0IGNlbGxzIHdpdGggaGlnaCBwZXJjZW50YWdlcyBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzIGRvbid0IHNlZW0gdG8gY29udGFpbiB2ZXJ5IG1hbnkgdW5pcXVlIGdlbmVzLgoKSG93IGRvIHdlIGZpbHRlciB3aXRoIHRoaXMgaW5mb3JtYXRpb24/Ck9uZSBvcHRpb24gaXMgdG8gZGVmaW5lIGEgY3V0b2ZmIGZvciB0aGUgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlIGFib3ZlIHdoaWNoIHdlIGNhbGwgYSBjZWxsIGNvbXByb21pc2VkIGFuZCBleGNsdWRlIGl0IGZyb20gZnVydGhlciBhbmFseXNpcy4KSG93ZXZlciwgY2hvb3NpbmcgdGhhdCBjdXRvZmYgY2FuIGJlIGEgYml0IGZyYXVnaHQsIGFzIHRoZSBleHBlY3RlZCBwZXJjZW50YWdlIG9mIG1pdG9jaG9uZHJpYWwgcmVhZHMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBjZWxsIHR5cGUgYW5kIGxpYnJhcnkgcHJlcGFyYXRpb24gbWV0aG9kcy4KU28gaXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgbWV0aG9kIHRvIGRldGVybWluZSB0aGF0IGN1dG9mZiBmcm9tIHRoZSBkYXRhIGl0c2VsZi4KCiMjIyBGaWx0ZXJpbmcgY29tcHJvbWlzZWQgY2VsbHMKCkRldGVybWluaW5nIG1pdG9jaG9uZHJpYWwgY3V0b2ZmcyBpcyBleGFjdGx5IHdoYXQgdGhlIGBtaVFDYCBwYWNrYWdlIGRvZXMgKFtIaXBwZW4gX2V0IGFsLl8gMjAyMV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDkyOTApKSEKSW4gdHJ1dGgsIGl0IGRvZXMgc29tZXRoaW5nIHBvc3NpYmx5IGV2ZW4gYSBiaXQgYmV0dGVyOiBpdCBmaXRzIGEgbWl4dHVyZSBtb2RlbCB0byB0aGUgZGF0YSB0aGF0IGNvbnNpc3RzIG9mIGRpc3RyaWJ1dGlvbnMgb2YgaGVhbHRoeSBjZWxscyBhbmQgY29tcHJvbWlzZWQgY2VsbHMuClRoZW4gd2UgY2FuIGNhbGN1bGF0ZSB3aGV0aGVyIGVhY2ggY2VsbCBpcyBtb3JlIGxpa2VseSB0byBiZWxvbmcgdG8gdGhlIGhlYWx0aHkgb3IgY29tcHJvbWlzZWQgZGlzdHJpYnV0aW9uLgpXZSBjYW4gdGhlbiBleGNsdWRlIHRoZSBjZWxscyB0aGF0IGFyZSBtb3JlIGxpa2VseSB0byBiZSBjb21wcm9taXNlZC4KClRvIHVzZSBgbWlRQ2AsIHdlIGZpcnN0IGZpdCBhIG1vZGVsIHRvIHRoZSBkYXRhIGluIG91ciBTQ0Ugb2JqZWN0OgoKYGBge3IgbWlRQyBtb2RlbCwgbGl2ZT1UUlVFfQojIGZpdCB0aGUgbWlRQyBtb2RlbAptaXFjX21vZGVsIDwtIG1pUUM6Om1peHR1cmVNb2RlbChmaWx0ZXJlZF9zY2UpCmBgYAoKTm93IHdlIGNhbiBwbG90IHRoZSBtb2RlbCByZXN1bHRzIHVzaW5nIHRoZSBgcGxvdE1vZGVsKClgIGZ1bmN0aW9uIHRvIHNlZSBob3cgaXQgY29ycmVzcG9uZHMgdG8gb3VyIGRhdGEuCldlIHNob3VsZCBleHBlY3QgdG8gc2VlIHR3byBmaXQgbGluZXM6CgotIE9uZSBsaW5lIHdpbGwgY29ycmVzcG9uZCB0aGUgdGhlICJoZWFsdGh5IiBjZWxscyBhbmQgc2hvdWxkIHNob3cgbGl0dGxlIHRvIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgdW5pcXVlIGdlbmVzIGRldGVjdGVkIGFuZCB0aGUgbWl0b2Nob25kcmlhbCBwZXJjZW50YWdlLgotIEJ5IGNvbnRyYXN0LCB0aGUgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvICJjb21wcm9taXNlZCIgY2VsbHMgd2lsbCBzaG93IGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiB1bmlxdWUgZ2VuZXMgZGV0ZWN0ZWQgYW5kIHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRhZ2UuCgpUaGlzIHBsb3Qgd2lsbCBhbHNvIHNob3csIGZvciBlYWNoIGNlbGwsIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgdGhhdCB0aGUgY2VsbCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbXByb21pc2VkIGRpc3RyaWJ1dGlvbjsgYSBoaWdoZXIgc2NvcmUgaW5kaWNhdGVzIHRoYXQgYSBjZWxsIGlzIG1vcmUgbGlrZWx5IHRvIGJlIGNvbXByb21pc2VkLgoKSXQgaXMgYWxzbyBjcml0aWNhbCB0byBub3RlIHRoYXQgdGhpcyBtb2RlbCBjYW4gX2FuZCBkb2VzXyBmYWlsIGF0IHRpbWVzLgpQbG90dGluZyB0aGUgcmVzdWx0cyBhcyB3ZSBoYXZlIGRvbmUgaGVyZSBpcyBub3QgYSBzdGVwIHRvIHNraXAuCioqQWx3YXlzIGxvb2sgYXQgeW91ciBkYXRhISoqCgpgYGB7ciBtaVFDIHBsb3RNb2RlbCwgbGl2ZT1UUlVFfQojIHBsb3QgdGhlIG1pUUMgbW9kZWwKbWlRQzo6cGxvdE1vZGVsKGZpbHRlcmVkX3NjZSwgbWlxY19tb2RlbCkgKwogIHRoZW1lX2J3KCkKYGBgCgpXZSBjYW4gbm93IGZpbHRlciBvdXIgZGF0YSBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgY29tcHJvbWlzZWQgYXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBtb2RlbC4KQnV0IGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSBtaWdodCB3YW50IHRvIHF1aWNrbHkgcGxvdCB0byBzZWUgd2hhdCB3b3VsZCBiZSBmaWx0ZXJlZCBvdXQgd2l0aCBhIGdpdmVuIGN1dG9mZiwgdXNpbmcgdGhlIGBwbG90RmlsdGVyaW5nKClgIGZ1bmN0aW9uLgpUaGUgZGVmYXVsdCBpcyB0byBleGNsdWRlIGNlbGxzIHRoYXQgaGF2ZSBhIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBvZiAwLjc1IG9yIGdyZWF0ZXIgb2YgYmVpbmcgY29tcHJvbWlzZWQuCldlIHN0aWNrIHdpdGggdGhhdCBkZWZhdWx0LCBidXQgZm9yIGNsYXJpdHksIHdlIHdpbGwgYWxzbyBpbmNsdWRlIGl0IGluIG91ciBjb2RlIQoKCmBgYHtyIG1pUUMgcGxvdEZpbHRlcmluZ30KIyBsb29rIGF0IG1pUUMgZmlsdGVyaW5nCm1pUUM6OnBsb3RGaWx0ZXJpbmcoZmlsdGVyZWRfc2NlLCBtaXFjX21vZGVsLAogICAgICAgICAgICAgICAgICAgIHBvc3Rlcmlvcl9jdXRvZmYgPSAwLjc1KSArCiAgdGhlbWVfYncoKQpgYGAKCkluIHRoaXMgY2FzZSwgdGhlIGxpbmUgYmV0d2VlbiB0aGUgY2VsbHMgdG8gYmUga2VwdCBhbmQgdGhvc2UgdGhhdCB3aWxsIGJlIHJlbW92ZWQgc2VlbXMgdG8gY29ycmVzcG9uZCB0byBhIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZSBvZiBhYm91dCAxMi41JSwgYnV0IG5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGFsd2F5cyBiZSBjb25zdGFudC4KVGhlIGN1dG9mZiBwb2ludCBjYW4gdmFyeSBmb3IgZGlmZmVyZW50IG51bWJlcnMgb2YgdW5pcXVlIGdlbmVzIHdpdGhpbiBhIHNhbXBsZSwgYW5kIGl0IHdpbGwgY2VydGFpbmx5IHZhcnkgYW1vbmcgc2FtcGxlcyEKCkF0IHRoaXMgcG9pbnQsIHdlIGNhbiBwZXJmb3JtIHRoZSBhY3R1YWwgZmlsdGVyaW5nIHVzaW5nIHRoZSBgZmlsdGVyQ2VsbHMoKWAgZnVuY3Rpb24sIGdpdmluZyB1cyBhIGZ1cnRoZXIgZmlsdGVyZWQgU0NFIG9iamVjdC4KCmBgYHtyIG1pUUMgZmlsdGVyY2VsbHMsIGxpdmU9VFJVRX0KIyBwZXJmb3JtIG1pUUMgZmlsdGVyaW5nCnFjZmlsdGVyZWRfc2NlIDwtIG1pUUM6OmZpbHRlckNlbGxzKGZpbHRlcmVkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBtaXFjX21vZGVsKQpgYGAKCiMjIyMgT25lIG1vcmUgZmlsdGVyOiB1bmlxdWUgZ2VuZSBjb3VudAoKV2hpbGUgdGhlIG1pUUMgZmlsdGVyaW5nIGlzIHByZXR0eSBnb29kLCB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGF0IGl0IHN0aWxsIGxlZnQgc29tZSBjZWxscyB0aGF0IGhhZCB2ZXJ5IGxvdyBudW1iZXJzIG9mIHVuaXF1ZSBnZW5lcy4KV2hpbGUgdGhlc2UgY2VsbHMgbWF5IG5vdCBiZSBjb21wcm9taXNlZCwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlbSBpcyBhbHNvIG5vdCBsaWtlbHkgdG8gYmUgdXNlZnVsLCBzbyB3ZSB3aWxsIGZpbHRlciB0aG9zZSBhcyB3ZWxsLgpXZSB3aWxsIG9ubHkga2VlcCBjZWxscyB0aGF0IGhhdmUgYXQgbGVhc3QgMjAwIHVuaXF1ZSBnZW5lcy4KCmBgYHtyIHVuaXF1ZSBjdXRvZmYsIGxpdmU9VFJVRX0KIyBmaWx0ZXIgY2VsbHMgYnkgdW5pcXVlIGdlbmUgY291bnQgKGBkZXRlY3RlZGApCnFjZmlsdGVyZWRfc2NlIDwtIHFjZmlsdGVyZWRfc2NlWywgd2hpY2gocWNmaWx0ZXJlZF9zY2UkZGV0ZWN0ZWQgPj0gMjAwKV0KcWNmaWx0ZXJlZF9zY2UKYGBgCgoKIyMgTm9ybWFsaXphdGlvbgoKTm93IHRoYXQgd2UgaGF2ZSBkb25lIG91ciBmaWx0ZXJpbmcsIHdlIGNhbiBzdGFydCBhbmFseXppbmcgdGhlIGV4cHJlc3Npb24gY291bnRzIGZvciB0aGUgcmVtYWluaW5nIGNlbGxzLgoKVGhlIG5leHQgc3RlcCBhdCB0aGlzIHBvaW50IGlzIHRvIGNvbnZlcnQgdGhlIHJhdyBjb3VudHMgaW50byBhIG1lYXN1cmUgdGhhdCBhY2NvdW50cyBmb3IgZGlmZmVyZW5jZXMgaW4gc2VxdWVuY2luZyBkZXB0aCBiZXR3ZWVuIGNlbGxzLCBhbmQgdG8gY29udmVydCB0aGUgZGlzdHJpYnV0aW9uIG9mIGV4cHJlc3Npb24gdmFsdWVzIGZyb20gdGhlIHNrZXdlZCBkaXN0cmlidXRpb24gd2UgZXhwZWN0IHRvIHNlZSBpbiByYXcgY291bnRzIHRvIG9uZSB0aGF0IGlzIG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCgpXZSB3aWxsIGRvIHRoaXMgdXNpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGBzY3JhbmAgYW5kIGBzY3V0dGxlYCBwYWNrYWdlcy4KVGhlIHByb2NlZHVyZSB3ZSB3aWxsIHVzZSBoZXJlIGlzIGRlcml2ZWQgZnJvbSB0aGUgW09TQ0EgY2hhcHRlciBvbiBub3JtYWxpemF0aW9uXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EuYmFzaWMvbm9ybWFsaXphdGlvbi5odG1sI25vcm1hbGl6YXRpb24tYnktZGVjb252b2x1dGlvbikuClRoZSBpZGVhIGlzIHRoYXQgdGhlIHZhcnlpbmcgZXhwcmVzc2lvbiBwYXR0ZXJucyB0aGF0IGRpZmZlcmVudCBjZWxsIHR5cGVzIGV4aGliaXQgd2lsbCBhZmZlY3QgdGhlIHNjYWxpbmcgZmFjdG9ycyB0aGF0IHdlIHdvdWxkIGFwcGx5LgpUbyBhY2NvdW50IGZvciB0aGF0IHZhcmlhdGlvbiwgd2UgZmlyc3QgZG8gYSByb3VnaCBjbHVzdGVyaW5nIG9mIGNlbGxzIGJ5IHRoZWlyIGV4cHJlc3Npb24gd2l0aCBgc2NyYW46OnF1aWNrQ2x1c3RlcigpYCwgdGhlbiB1c2UgdGhhdCBjbHVzdGVyaW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGVhY2ggY2VsbCB3aXRoaW4gdGhlIGNsdXN0ZXJzIHVzaW5nIGBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoKWAuCkZpbmFsbHksIHdlIGFwcGx5IHRoZSBzY2FsaW5nIGZhY3RvciB0byB0aGUgZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIGVhY2ggY2VsbCBhbmQgY2FsY3VsYXRlIHRoZSBsb2ctc2NhbGVkIGV4cHJlc3Npb24gdmFsdWVzIHVzaW5nIHRoZSBgc2N1dHRsZTo6bG9nTm9ybUNvdW50cygpYCBmdW5jdGlvbi4KCmBgYHtyIG5vcm1hbGl6YXRpb24sIGxpdmU9VFJVRX0KIyBQZXJmb3JtIHJvdWdoIGNsdXN0ZXJpbmcKcWNsdXN0IDwtIHNjcmFuOjpxdWlja0NsdXN0ZXIocWNmaWx0ZXJlZF9zY2UpCgojIHVzZSBjbHVzdGVycyB0byBjb21wdXRlIHNjYWxpbmcgZmFjdG9ycyBhbmQgYWRkIHRvIFNDRSBvYmplY3QKcWNmaWx0ZXJlZF9zY2UgPC0gc2NyYW46OmNvbXB1dGVTdW1GYWN0b3JzKHFjZmlsdGVyZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnMgPSBxY2x1c3QpCgojIHBlcmZvcm0gbm9ybWFsaXphdGlvbiB1c2luZyBzY2FsaW5nIGZhY3RvcnMKIyBhbmQgc2F2ZSBhcyBhIG5ldyBTQ0Ugb2JqZWN0Cm5vcm1hbGl6ZWRfc2NlIDwtIHNjdXR0bGU6OmxvZ05vcm1Db3VudHMocWNmaWx0ZXJlZF9zY2UpCmBgYAoKVGhpcyBjcmVhdGVzIGEgbmV3ICJhc3NheSIgaW4gdGhlIGBub3JtYWxpemVkX3NjZWAgb2JqZWN0LCBgbG9nY291bnRzYCwgd2hpY2ggY29udGFpbnMgdGhlIG5vcm1hbGl6ZWQgY291bnQgdmFsdWVzIGZvciBlYWNoIGNlbGwgYW5kIGdlbmUuCihUaGUgZGF0YSBoZXJlIGFyZSBub3QgX2FjdHVhbGx5XyB0aGUgbG9nIG9mIHRoZSBjb3VudHMsIHNpbmNlIHdlIGFsc28gYXBwbGllZCB0aGUgc2NhbGluZyBmYWN0b3JzLCBidXQgdGhhdCBuYW1lIGlzIHVzZWQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4pCgpMZXQncyB0YWtlIGEgbG9vazoKCmBgYHtyIG5vcm1hbGl6ZWQgc2NlfQpub3JtYWxpemVkX3NjZQpgYGAKCiMjIERpbWVuc2lvbiByZWR1Y3Rpb24KCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogRGltZW5zaW9uIHJlZHVjdGlvbl0oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfZGltZW5zaW9uX3JlZHVjdGlvbi5wbmcpCgpOb3cgdGhhdCB3ZSBoYXZlIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiB2YWx1ZXMsIHdlIHdvdWxkIGxpa2UgdG8gcHJvZHVjZSBzb21lIHJlZHVjZWQtZGltZW5zaW9uIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZGF0YS4KVGhlc2Ugd2lsbCBhbGxvdyB1cyB0byBwZXJmb3JtIHNvbWUgZG93bnN0cmVhbSBjYWxjdWxhdGlvbnMgbW9yZSBxdWlja2x5LCByZWR1Y2Ugc29tZSBvZiB0aGUgbm9pc2UgaW4gdGhlIGRhdGEsIGFuZCBhbGxvdyB1cyB0byB2aXN1YWxpemUgb3ZlcmFsbCByZWxhdGlvbnNoaXBzIGFtb25nIGNlbGxzIG1vcmUgZWFzaWx5ICh0aG91Z2ggd2l0aCBtYW55IGNhdmVhdHMhKS4KCiMjIyBTZWxlY3RpbmcgaGlnaGx5IHZhcmlhYmxlIGdlbmVzCgpXaGlsZSB3ZSBjb3VsZCBjYWxjdWxhdGUgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyB1c2luZyBhbGwgb2YgdGhlIGdlbmVzIHRoYXQgd2UgaGF2ZSBhc3NheWVkLCBpbiBwcmFjdGljZSBtb3N0IG9mIHRoZSBnZW5lcyB3aWxsIGhhdmUgdmVyeSBsaXR0bGUgdmFyaWF0aW9uIGluIGV4cHJlc3Npb24sIHNvIGRvaW5nIHNvIHdpbGwgbm90IHByb3ZpZGUgbXVjaCBhZGRpdGlvbmFsIHNpZ25hbC4KUmVkdWNpbmcgdGhlIG51bWJlciBvZiBnZW5lcyB3ZSBpbmNsdWRlIHdpbGwgYWxzbyBzcGVlZCB1cCBzb21lIG9mIHRoZSBjYWxjdWxhdGlvbnMuCgpUbyBpZGVudGlmeSB0aGUgbW9zdCB2YXJpYWJsZSBnZW5lcywgd2Ugd2lsbCB1c2UgZnVuY3Rpb25zIGZyb20gdGhlIGBzY3JhbmAgcGFja2FnZS4KVGhlIGZpcnN0IGZ1bmN0aW9uLCBgbW9kZWxHZW5lVmFyKClgLCBhdHRlbXB0cyB0byBkaXZpZGUgdGhlIHZhcmlhdGlvbiBvYnNlcnZlZCBmb3IgZWFjaCBnZW5lIGludG8gYSBiaW9sb2dpY2FsIGFuZCB0ZWNobmljYWwgY29tcG9uZW50LCB3aXRoIHRoZSBpbnR1aXRpb24gdGhhdCBnZW5lcyB3aXRoIGxvd2VyIG1lYW4gZXhwcmVzc2lvbiB0ZW5kIHRvIGhhdmUgbG93ZXIgdmFyaWFuY2UgZm9yIHB1cmVseSB0ZWNobmljYWwgcmVhc29ucy4KV2UgdGhlbiBwcm92aWRlIHRoZSBgbW9kZWxHZW5lVmFyKClgIG91dHB1dCB0byB0aGUgYGdldFRvcEhWR3MoKWAgZnVuY3Rpb24gdG8gaWRlbnRpZnkgdGhlIGdlbmVzIHdpdGggdGhlIGhpZ2hlc3QgX2Jpb2xvZ2ljYWxfIHZhcmlhdGlvbiwgd2hpY2ggaXMgd2hhdCB3ZSBhcmUgbW9zdCBpbnRlcmVzdGVkIGluLgoKYGBge3Igc2VsZWN0IEhWR3N9CiMgaWRlbnRpZnkgMjAwMCBnZW5lcwpudW1fZ2VuZXMgPC0gMjAwMAoKIyBtb2RlbCB2YXJpYW5jZSwgcGFydGl0aW9uaW5nIGludG8gYmlvbG9naWNhbCBhbmQgdGVjaG5pY2FsIHZhcmlhdGlvbgpnZW5lX3ZhcmlhbmNlIDwtIHNjcmFuOjptb2RlbEdlbmVWYXIobm9ybWFsaXplZF9zY2UpCgojIGdldCB0aGUgbW9zdCB2YXJpYWJsZSBnZW5lcwpodl9nZW5lcyA8LSBzY3Jhbjo6Z2V0VG9wSFZHcyhnZW5lX3ZhcmlhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbnVtX2dlbmVzKQpgYGAKClRoZSByZXN1bHQgaXMgYSB2ZWN0b3Igb2YgZ2VuZSBpZHMgKG9yZGVyZWQgZnJvbSBtb3N0IHRvIGxlYXN0IHZhcmlhYmxlKToKCmBgYHtyIHZpZXcgSFZHc30KaGVhZChodl9nZW5lcykKYGBgCgojIyMgUHJpbmNpcGFsIGNvbXBvbmVudHMgYW5hbHlzaXMKCk5vdyB0aGF0IHdlIGhhdmUgc2VsZWN0ZWQgdGhlIGdlbmVzIHdlIHdvdWxkIGxpa2UgdG8gdXNlIGZvciB0aGUgcmVkdWNlZC1kaW1lbnNpb24gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBleHByZXNzaW9uIGRhdGEsIHdlIGNhbiBzdGFydCB0byBjYWxjdWxhdGUgdGhlbS4KRmlyc3Qgd2Ugd2lsbCB1c2UgdGhlIGBzY2F0ZXI6OnJ1blBDQSgpYCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHByaW5jaXBhbCBjb21wb25lbnRzIGZyb20gdGhlIGV4cHJlc3Npb24gbWF0cml4LgpUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGZhc3QgYW5kIGZhaXJseSByb2J1c3QsIGJ1dCB0aGUgcmVzdWx0IGlzIHN0aWxsIHF1aXRlIG11bHRpZGltZW5zaW9uYWwuCldlIHdhbnQga2VlcCBhIGZhaXIgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGRpbWVuc2lvbnMpIGluIG9yZGVyIHRvIGFjY3VyYXRlbHkgcmVwcmVzZW50IHRoZSB2YXJpYXRpb24gaW4gdGhlIGRhdGEsIGJ1dCBkb2luZyBzbyBtZWFucyB0aGF0IHBsb3R0aW5nIG9ubHkgYSBmZXcgb2YgdGhlc2UgZGltZW5zaW9ucyAoaW4gMkQpIGlzIG5vdCBsaWtlbHkgdG8gcHJvdmlkZSBhIGZ1bGwgdmlldyBvZiB0aGUgZGF0YS4KClRoZSBkZWZhdWx0IG51bWJlciBvZiBjb21wb25lbnRzIGlzIDUwLCB3aGljaCB3ZSB3aWxsIHN0aWNrIHdpdGgsIGJ1dCBsZXQncyBlbnRlciBpdCBtYW51YWxseSBqdXN0IGZvciB0aGUgcmVjb3JkLgoKYGBge3IgcnVuUENBLCBsaXZlPVRSVUV9CiMgY2FsY3VsYXRlIGFuZCBzYXZlIFBDQSByZXN1bHRzCm5vcm1hbGl6ZWRfc2NlIDwtIHNjYXRlcjo6cnVuUENBKAogIG5vcm1hbGl6ZWRfc2NlLAogIG5jb21wb25lbnRzID0gNTAsICMgaG93IG1hbnkgY29tcG9uZW50cyB0byBrZWVwCiAgc3Vic2V0X3JvdyA9IGh2X2dlbmVzICMgdXNlIG9ubHkgdGhlIHZhcmlhYmxlIGdlbmVzIHdlIGNob3NlCikKYGBgCgpUaGVzZSByZWR1Y2VkLWRpbWVuc2lvbiByZXN1bHRzIHdpbGwgYmUgc3RvcmVkIGluIGEgYHJlZHVjZWREaW1gIHNsb3QgaW4gdGhlIFNDRSBvYmplY3QuCldlIGNhbiBzZWUgdGhlIG5hbWVzIG9mIHRoZSBgcmVkdWNlZERpbWBzIHRoYXQgd2UgaGF2ZSBieSBsb29raW5nIGF0IHRoZSBvYmplY3Qgc3VtbWFyeToKCmBgYHtyIHZpZXcgcmVkdWNlZCBkaW1lbnNpb25zfQpub3JtYWxpemVkX3NjZQpgYGAKCklmIHdlIHdhbnQgdG8gZXh0cmFjdCB0aGUgUENBIHJlc3VsdHMsIHdlIGNhbiBkbyB0aGF0IHdpdGggdGhlIGByZWR1Y2VkRGltKClgIGZ1bmN0aW9uOgpOb3RlIHRoYXQgZm9yIHRoZXNlIHJlZHVjZWQtZGltZW5zaW9uYWxpdHkgbWF0cmljZXMsIHRoZSByb3dzIGFyZSB0aGUgY2VsbHMgYW5kIHRoZSBjb2x1bW5zIGFyZSB0aGUgUEMgZGltZW5zaW9ucy4KCmBgYHtyIGdldFJlZHVjZWREaW19CiMgZXh0cmFjdCB0aGUgUENBIG1hdHJpeApwY2FfbWF0cml4IDwtIHJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsICJQQ0EiKQoKIyBsb29rIGF0IHRoZSBzaGFwZSBvZiB0aGUgbWF0cml4CmRpbShwY2FfbWF0cml4KQpgYGAKCiMjIyBVTUFQCgpGaW5hbGx5LCB3ZSB3aWxsIGNhbGN1bGF0ZSBhIFVNQVAgKFVuaWZvcm0gTWFuaWZvbGQgQXBwcm94aW1hdGlvbiBhbmQgUHJvamVjdGlvbikgcmVwcmVzZW50YXRpb24gb2Ygb3VyIGRhdGEuClRoaXMgaXMgYSBtYWNoaW5lLWxlYXJuaW5nLWJhc2VkIG1ldGhvZCB0aGF0IGlzIHVzZWZ1bCBmb3IgcGVyZm9ybWluZyBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gc3VpdGFibGUgZm9yIHZpc3VhbGl6YXRpb24uCkl0J3MgZ29hbCBpcyB0byBwcm92aWRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaW4gdHdvIGRpbWVuc2lvbnMgKHR5cGljYWxseSwgbW9yZSBhcmUgcG9zc2libGUpIHRoYXQgcHJlc2VydmVzIGFzIG11Y2ggb2YgdGhlIGRpc3RhbmNlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2VsbHMgYXMgcG9zc2libGUuCldoaWxlIHRoaXMgZG9lcyBtYWtlIGZvciB2aXN1YWxseSBhcHBlYWxpbmcgYW5kIHVzZWZ1bCBwbG90cywgaXQgaXMgaW1wb3J0YW50IG5vdCB0byBvdmVyaW50ZXJwcmV0IHRoZSByZXN1bHRzIQpJbiBwYXJ0aWN1bGFyLCB3aGlsZSB5b3Ugd2lsbCBvZnRlbiBzZWUgc29tZSBhcHBhcmVudCBjbHVzdGVyaW5nIG9mIGNlbGxzIGluIHRoZSByZXN1bHRpbmcgb3V0cHV0LCB0aG9zZSBjbHVzdGVycyBtYXkgbm90IGJlIHBhcnRpY3VsYXJseSB2YWxpZCwgYW5kIHRoZSBzcGFjaW5nIHdpdGhpbiBvciBiZXR3ZWVuIGNsdXN0ZXJzIG1heSBub3QgcmVmbGVjdCB0cnVlIGRpc3RhbmNlcy4KCkluIG1hbnkgd2F5cyB0aGlzIGlzIGFuYWxvZ291cyB0byB0aGUgcHJvYmxlbSBvZiBwcm9qZWN0aW5nIGEgbWFwIG9mIHRoZSBlYXJ0aCBvbnRvIGEgZmxhdCBzdXJmYWNlOyBhbnkgY2hvaWNlIHdpbGwgcmVzdWx0IGluIHNvbWUgZGlzdG9ydGlvbnMuCkhvd2V2ZXIsIHdpdGggVU1BUCwgd2UgcmFyZWx5IGtub3cgZXhhY3RseSB3aGF0IGNob2ljZXMgd2VyZSBtYWRlIGFuZCB3aGF0IGRpc3RvcnRpb25zIG1pZ2h0IGhhdmUgcmVzdWx0ZWQuClRoZSBVTUFQIGNvb3JkaW5hdGVzIHRoZW1zZWx2ZXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgZm9yIGRvd25zdHJlYW0gYW5hbHlzaXMuCgpTaW5jZSB0aGUgVU1BUCBwcm9jZWR1cmUgd291bGQgYmUgc2xvdyB0byBjYWxjdWxhdGUgd2l0aCB0aGUgZnVsbCBkYXRhLCBzbyB0aGUgYHJ1blVNQVAoKWAgZnVuY3Rpb24gZmlyc3QgY2FsY3VsYXRlcyBhIFBDQSBtYXRyaXggYW5kIHRoZW4gdXNlcyBfdGhhdF8gdG8gY2FsY3VsYXRlIHRoZSBVTUFQLgpTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYSBQQ0EgbWF0cml4LCB3ZSB3aWxsIHRlbGwgdGhlIGZ1bmN0aW9uIHVzZSB0aGF0IGluc3RlYWQgb2YgcmVjYWxjdWxhdGluZyBpdC4KCmBgYHtyIHJ1blVNQVAsIGxpdmU9VFJVRX0Kbm9ybWFsaXplZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKG5vcm1hbGl6ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gIlBDQSIpCmBgYAoKQXMgYmVmb3JlLCB3ZSBjb3VsZCBleHRyYWN0IHRoZSBVTUFQIG1hdHJpeCBmcm9tIG91ciBTQ0Ugb2JqZWN0IHdpdGggdGhlIGByZWR1Y2VkRGltKClgIGZ1bmN0aW9uLgpXZSBjYW4gYWxzbyB2aXN1YWxpemUgdGhlIFVNQVAgcmVzdWx0cyB1c2luZyB0aGUgYHBsb3RSZWR1Y2VkRGltKClgIGZ1bmN0aW9uLgoKYGBge3IgcGxvdFJlZHVjZWREaW0sIGxpdmU9VFJVRX0KIyBwbG90IHRoZSBVTUFQCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIlVNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYnkgdGhlIG1vc3QgdmFyaWFibGUgZ2VuZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gaHZfZ2VuZXNbMV0pCmBgYAoKCiMjIFVuc3VwZXJ2aXNlZCBjbHVzdGVyaW5nCgpBcyBhIGZpbmFsIGFuYWx5c2lzIHN0ZXAgYXQgdGhpcyBzdGFnZSwgd2Ugd2lsbCByZXR1cm4gdG8gdGhlIFBDQSByZXN1bHRzIHRvIHBlcmZvcm0gdW5zdXBlcnZpc2VkIGNsdXN0ZXJpbmcuCkhlcmUgd2Ugd2lsbCB1c2UgYSBncmFwaC1iYXNlZCBjbHVzdGVyaW5nIG1ldGhvZCwgd2hpY2ggc3RhcnRzIGJ5IGlkZW50aWZ5aW5nIGNlbGxzIHRoYXQgYXJlIGNsb3NlIHRvZ2V0aGVyIGluIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHNwYWNlLgpJdCB0aGVuIGlkZW50aWZpZXMgImNvbW11bml0aWVzIiBvZiBoaWdobHkgY29ubmVjdGVkIGNlbGxzLCBhbmQgYnJlYWtzIHRoZW0gYXBhcnQgYnkgcmVnaW9ucyBvZiBsb3dlciBjb25uZWN0aW9uLgoKVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGFsZ29yaXRobXMgdGhhdCBjYW4gcGVyZm9ybSB0aGlzIGNsdXN0ZXJpbmcsIGVhY2ggd2l0aCBwYXJhbWV0ZXJzIHRoYXQgY2FuIGFmZmVjdCBob3cgbWFueSBjbHVzdGVycyBhcmUgaWRlbnRpZmllZCBhbmQgd2hpY2ggY2VsbHMgYmVsb25nIHRvIGVhY2ggY2x1c3Rlci4KSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGVzZSBjbHVzdGVycyBtYXkgb3IgbWF5IG5vdCBjb3JyZXNwb25kIHRvICJjZWxsIHR5cGVzIiBieSB3aGF0ZXZlciBkZWZpbml0aW9uIHlvdSBtaWdodCBwcmVmZXIgdG8gdXNlLgpJbnRlcnByZXRhdGlvbiBvZiB0aGVzZSBjbHVzdGVycywgb3Igb3RoZXIgbWVhc3VyZXMgb2YgY2VsbCB0eXBlLCBhcmUgc29tZXRoaW5nIHRoYXQgd2lsbCByZXF1aXJlIG1vcmUgY2FyZWZ1bCBhbmQgbGlrZWx5IG1vcmUgY3VzdG9taXplZCBhbmFseXNpcy4KCldlIHdpbGwgcGVyZm9ybSBvdXIgY2x1c3RlcmluZyB1c2luZyB0aGUgYGJsdXN0ZXJgIHBhY2thZ2UsIHdoaWNoIGNhbiBwZXJmb3JtIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcuCkFzIG1lbnRpb25lZCBlYXJsaWVyLCB3ZSBhcmUgdXNpbmcgImdyYXBoIiBjbHVzdGVyaW5nLCB3aGljaCB3ZSBkZWZpbmUgdXNpbmcgdGhlIGBOTkdyYXBoUGFyYW0oKWAgZnVuY3Rpb24uCldpdGhpbiB0aGF0IGFyZSBhIG51bWJlciBvZiBmdXJ0aGVyIG9wdGlvbnMsIHN1Y2ggYXMgdGhlIHdlaWdodGluZyB1c2VkIGZvciBidWlsZGluZyB0aGUgbmV0d29yayBncmFwaCBhbmQgdGhlIGFsZ29yaXRobSB1c2VkIGZvciBkaXZpZGluZyB0aGUgZ3JhcGggaW50byBjbHVzdGVycy4KCk1vZGlmeWluZyB0aGVzZSBwYXJhbWV0ZXJzIGNhbiByZXN1bHQgaW4gcXVpdGUgZGlmZmVyZW50IGNsdXN0ZXIgYXNzaWdubWVudHMhCkZvciB0aGUgY2x1c3RlcmluZyBiZWxvdyB3ZSB3aWxsIHVzZSBKYWNjYXJkIHdlaWdodGluZyBhbmQgTG91dmFpbiBjbHVzdGVyaW5nLCB3aGljaCBjb3JyZXNwb25kIG1vcmUgY2xvc2VseSB0byB0aGUgZGVmYXVsdCBtZXRob2RzIHVzZWQgYnkgYFNldXJhdGAgdGhhbiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLgpJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZSB0aGUgY2x1c3RlciBhc3NpZ25tZW50cyBhcmUgc29tZXdoYXQgc3RvY2hhc3RpYy4KSW4gcGFydGljdWxhciwgdGhlIG5hbWVzL251bWJlcnMgb2YgdGhlIGNsdXN0ZXJzIGNhbiBiZSBxdWl0ZSBpbmNvbnNpc3RlbnQgYmV0d2VlbiBydW5zIQoKCmBgYHtyIGNsdXN0ZXJpbmcsIGxpdmU9VFJVRX0KIyBwZXJmb3JtIGdyYXBoLWJhc2VkIGNsdXN0ZXJpbmcKbm5fY2x1c3RlcnMgPC0gYmx1c3Rlcjo6Y2x1c3RlclJvd3MoCiAgcGNhX21hdHJpeCwKICBibHVzdGVyOjpOTkdyYXBoUGFyYW0oCiAgICAjIG51bWJlciBvZiBuZWlnaGJvcnMgdG8gdXNlIGluIG5ldHdvcmsgZ3JhcGgKICAgIGsgPSAyMCwKICAgICMgd2VpZ2h0aW5nIHNjaGVtZSBmb3IgYnVpbGRpbmcgdGhlIG5ldHdvcmsgZ3JhcGgKICAgICMgZGVmYXVsdCBpcyAicmFuayIKICAgIHR5cGUgPSAiamFjY2FyZCIsCiAgICAjIGNsdXN0ZXIgZGV0ZWN0aW9uIGFsZ29yaXRobQogICAgIyBkZWZhdWx0IGlzICJ3YWxrdHJhcCIKICAgIGNsdXN0ZXIuZnVuID0gImxvdXZhaW4iCiAgKQopCmBgYAoKV2UgY2FuIHNhdmUgdGhlIGNsdXN0ZXIgYXNzaWdubWVudHMgYmFjayBpbnRvIHRoZSBgY29sRGF0YWAgb2YgdGhlIFNDRSBvYmplY3Qgd2l0aCBhIGxpdHRsZSBzaG9ydGN1dDogdGhlIGAkYCBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNvbHVtbiB3ZSB3YW50IHRvIGFkZC4KCmBgYHtyIGFkZCBjbHVzdGVycyB0byBTQ0UsIGxpdmU9VFJVRX0KIyBzYXZlIGNsdXN0ZXJzIHRvIFNDRSBjb2xEYXRhCm5vcm1hbGl6ZWRfc2NlJG5uX2NsdXN0ZXIgPC0gbm5fY2x1c3RlcnMKYGBgCgpOb3cgd2UgY2FuIHBsb3QgdGhlIFVNQVAgYWdhaW4sIHRoaXMgdGltZSBjb2xvcmVkIGJ5IHRoZSBjbHVzdGVyIGFzc2lnbm1lbnRzIHRoYXQgd2UganVzdCBjcmVhdGVkLgpIZXJlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGBwbG90UmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgd2Ugd2lsbCB1c2UgYHBsb3RVTUFQKClgLCB3aGljaCBpcyBleGFjdGx5IHRoZSBzYW1lLCBleGNlcHQgaXQgYWx3YXlzIHBsb3RzIGZyb20gdGhlIGByZWR1Y2VkRGltYCBzbG90IG5hbWVkIGBVTUFQYCwgc28gd2UgY2FuIHNraXAgdGhhdCBhcmd1bWVudC4KCmBgYHtyIHBsb3QgY2x1c3RlcnMsIGxpdmU9VFJVRX0KIyBwbG90IFVNQVAgd2l0aCBhc3NpZ25lZCBjbHVzdGVycwpzY2F0ZXI6OnBsb3RVTUFQKG5vcm1hbGl6ZWRfc2NlLAogICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gIm5uX2NsdXN0ZXIiKQpgYGAKCldoYXQgZG8geW91IHNlZSBpbiB0aGVzZSByZXN1bHRzPwoKV2hhdCB3b3VsZCB5b3Ugd2FudCB0byBkbyBuZXh0PwoKIyMgU2F2ZSBTQ0Ugb2JqZWN0IGZvciBsYXRlcgoKV2Ugd2lsbCBub3cgc2F2ZSBvdXIgZmlsdGVyZWQgYW5kIG5vcm1hbGl6ZWQgb2JqZWN0LCBpbmNsdWRpbmcgdGhlIGRpbWVuc2lvbiByZWR1Y3Rpb24gYW5kIGNsdXN0ZXJpbmcgcmVzdWx0cyB0byBhbiBgUkRTYCBmaWxlLCB1c2luZyB0aGUgZmlsZSBwYXRoIHRoYXQgd2UgZGVmaW5lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5vdGVib29rLgpJZiB3ZSB3ZXJlIHRvIHdhbnQgdG8gcmV0dXJuIHRvIHRoaXMgZGF0YSwgd2UgY291bGQgbG9hZCB0aGlzIGZpbGUgZGlyZWN0bHkgaW50byBhIG5ldyBSIHNlc3Npb24gYW5kIG5vdCBoYXZlIHRvIHJlcGVhdCB0aGUgcHJvY2Vzc2luZyB0aGF0IHdlIGhhdmUgZG9uZSB1cCB0byB0aGlzIHBvaW50LgoKVGhlIGRhdGEgaW4gdGhlc2Ugb2JqZWN0cyB0ZW5kcyB0byBiZSBxdWl0ZSBsYXJnZSwgYnV0IHZlcnkgY29tcHJlc3NpYmxlLgpUbyBzYXZlIHNwYWNlIG9uIGRpc2sgKGF0IHRoZSBleHBlbnNlIG9mIHRpbWUpLCB3ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGNvbXByZXNzZWQgaW50ZXJuYWxseSBiZWZvcmUgd3JpdGluZyBpdCBvdXQgdG8gYSBmaWxlLgpOb3RlIHRoYXQgdGhlIGZpbGUgd2Ugd3JpdGUgaXMgc3RpbGwgZ29pbmcgdG8gYmUgYW4gYC5yZHNgIGZpbGUgd2l0aCBubyBhZGRpdGlvbmFsIGV4dGVuc2lvbi4KKEZ1cnRoZXIgbm90ZTogVGhlIGJhc2UgUiBmdW5jdGlvbiBgc2F2ZVJEUygpYCB1c2VzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYHRpZHl2ZXJzZWAgZnVuY3Rpb24gYHJlYWRyOjp3cml0ZV9yZHMoKWAgZG9lcyBub3QuKQoKYGBge3Igc2F2ZSBTQ0UsIGxpdmU9VFJVRX0KIyB3cml0ZSBSRFMgZmlsZSB3aXRoIGNvbXByZXNzaW9uCnJlYWRyOjp3cml0ZV9yZHMobm9ybWFsaXplZF9zY2UsIGZpbGUgPSBvdXRwdXRfc2NlX2ZpbGUsIGNvbXByZXNzID0gImd6IikKYGBgCgoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCgpBcyBpcyBvdXIgaGFiaXQgYXQgdGhlIERhdGEgTGFiLCB3ZSB3aWxsIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXB1dGluZyBlbnZpcm9ubWVudCwgdGhlIHBhY2thZ2VzIHdlIGhhdmUgdXNlZCBpbiB0aGlzIG5vdGVib29rLCBhbmQgdGhlaXIgdmVyc2lvbnMgdXNpbmcgdGhlIGBzZXNzaW9uSW5mbygpYCBjb21tYW5kLgoKYGBge3Igc2Vzc2lvbiBpbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoK</div> </div> diff --git a/scRNA-seq-advanced/02-dataset_integration-live.Rmd b/scRNA-seq-advanced/02-dataset_integration-live.Rmd index 8dfb894f..ffc14ff8 100644 --- a/scRNA-seq-advanced/02-dataset_integration-live.Rmd +++ b/scRNA-seq-advanced/02-dataset_integration-live.Rmd @@ -447,6 +447,10 @@ To see how this looks, let's look at the UMAP when calculated from individual sa ```{r plot individual UMAPs, live = TRUE} # Plot UMAP calculated from individual samples with separate scaling + # Use a CVD-friendly color scheme and specify legend name + + # Modify the legend key so its points are larger and easier to see + ``` @@ -525,13 +529,12 @@ Now, let's see how this new `merged_UMAP` looks compared to the `UMAP` calculate # UMAPs scaled together when calculated from the merged SCE scater::plotReducedDim(merged_sce, dimred = "merged_UMAP", - colour_by = "sample", + color_by = "sample", # Some styling to help us see the points: point_size = 0.5, point_alpha = 0.2) + - # Modify the legend key so its points are larger and easier to see - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + - # Add a plot title + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP calculated on merged_sce") ``` @@ -596,13 +599,12 @@ scater::plotReducedDim(merged_sce, # plot the fastMNN coordinates dimred = "fastmnn_UMAP", # color by sample - colour_by = "sample", + color_by = "sample", # Some styling to help us see the points: point_size = 0.5, point_alpha = 0.2) + - # Modify legend so they key is larger and easier to see - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + - # add plot title + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN") ``` @@ -642,10 +644,12 @@ Let's re-plot this UMAP to highlight cell types: scater::plotReducedDim(merged_sce, dimred = "fastmnn_UMAP", # color by broad celltypes - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2) + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + + # include argument to specify color of NA values + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN") ``` @@ -658,12 +662,13 @@ One way we can see all the points a bit better is to facet the plot by sample, u ```{r plot fastmnn umap celltypes faceted} scater::plotReducedDim(merged_sce, dimred = "fastmnn_UMAP", - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2, # Allow for faceting by a variable using `other_fields`: other_fields = "sample") + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN") + # Facet by sample facet_wrap(vars(sample)) + @@ -743,11 +748,12 @@ Let's see how the `harmony` UMAP, colored by sample, looks compared to the `fast ```{r plot harmony umap batches} scater::plotReducedDim(merged_sce, dimred = "harmony_UMAP", - colour_by = "sample", + color_by = "sample", point_size = 0.5, point_alpha = 0.2) + - ggtitle("UMAP after integration with harmony") + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + + ggtitle("UMAP after integration with harmony") ``` How do you think this `harmony` UMAP compares to that from `fastMNN` integration? @@ -757,19 +763,19 @@ Let's see how this UMAP looks colored by cell type, and faceted for visibility: ```{r plot harmony umap celltypes} scater::plotReducedDim(merged_sce, dimred = "harmony_UMAP", - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2, # Specify variable for faceting other_fields = "sample") + + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3))) + ggtitle("UMAP after integration with harmony") + - guides(colour = guide_legend(override.aes = list(size = 3))) + facet_wrap(vars(sample)) ``` -With the faceted view, we can now see that the small amounts of `Tumor_Myocyte` from other samples are "pulled" towards those cells in `SCPCL000481`. - -What other patterns do you see that are similar or different from the `fastMNN` UMAP? +What do you now notice in this faceted view that wasn't clear previously? +Are there other patterns you see that are similar or different from the `fastMNN` UMAP? How do you think `fastMNN` vs. `harmony` performed in integrating these samples? ### Export diff --git a/scRNA-seq-advanced/02-dataset_integration.nb.html b/scRNA-seq-advanced/02-dataset_integration.nb.html index 0a991051..84734d25 100644 --- a/scRNA-seq-advanced/02-dataset_integration.nb.html +++ b/scRNA-seq-advanced/02-dataset_integration.nb.html @@ -3091,7 +3091,7 @@ <h3>Directories and files</h3> <p>To begin, let’s set up our directories and files:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgRGVmaW5lIGRpcmVjdG9yeSB3aGVyZSBwcm9jZXNzZWQgU0NFIG9iamVjdHMgdG8gYmUgaW50ZWdyYXRlZCBhcmUgc3RvcmVkIiwiaW5wdXRfZGlyIDwtIGZpbGUucGF0aChcImRhdGFcIiwgXCJybXNcIiwgXCJwcm9jZXNzZWRcIikiLCIiLCIjIERlZmluZSBkaXJlY3RvcnkgdG8gc2F2ZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QgdG8iLCJvdXRwdXRfZGlyIDwtIGZpbGUucGF0aChcImRhdGFcIiwgXCJybXNcIiwgXCJpbnRlZ3JhdGVkXCIpIiwiIiwiIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IiwiaWYgKCEoZGlyLmV4aXN0cyhvdXRwdXRfZGlyKSkpIHtcbiAgZGlyLmNyZWF0ZShvdXRwdXRfZGlyKVxufSIsIiIsIiMgRGVmaW5lIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGVkIG9iamVjdCIsImludGVncmF0ZWRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKG91dHB1dF9kaXIsIFwicm1zX2ludGVncmF0ZWRfc3Vic2V0LnJkc1wiKSJdfQ== --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgRGVmaW5lIGRpcmVjdG9yeSB3aGVyZSBwcm9jZXNzZWQgU0NFIG9iamVjdHMgdG8gYmUgaW50ZWdyYXRlZCBhcmUgc3RvcmVkIiwiaW5wdXRfZGlyIDwtIGZpbGUucGF0aChcImRhdGFcIiwgXCJybXNcIiwgXCJwcm9jZXNzZWRcIikiLCIiLCIjIERlZmluZSBkaXJlY3RvcnkgdG8gc2F2ZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QgdG8iLCJvdXRwdXRfZGlyIDwtIGZpbGUucGF0aChcImRhdGFcIiwgXCJybXNcIiwgXCJpbnRlZ3JhdGVkXCIpIiwiIiwiIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IiwiZnM6OmRpcl9jcmVhdGUob3V0cHV0X2RpcikiLCIiLCIjIERlZmluZSBvdXRwdXQgZmlsZSBuYW1lIGZvciB0aGUgaW50ZWdyYXRlZCBvYmplY3QiLCJpbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChvdXRwdXRfZGlyLCBcInJtc19pbnRlZ3JhdGVkX3N1YnNldC5yZHNcIikiXX0= --> <pre class="r"><code># Define directory where processed SCE objects to be integrated are stored input_dir <- file.path("data", "rms", "processed") @@ -3099,9 +3099,7 @@ <h3>Directories and files</h3> output_dir <- file.path("data", "rms", "integrated") # Create output directory if it doesn't exist -if (!(dir.exists(output_dir))) { - dir.create(output_dir) -} +fs::dir_create(output_dir) # Define output file name for the integrated object integrated_sce_file <- file.path(output_dir, "rms_integrated_subset.rds")</code></pre> @@ -4116,18 +4114,25 @@ <h2>Integration</h2> let’s look at the UMAP when calculated from individual samples:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgUGxvdCBVTUFQIGNhbGN1bGF0ZWQgZnJvbSBpbmRpdmlkdWFsIHNhbXBsZXMgd2l0aCBzZXBhcmF0ZSBzY2FsaW5nIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcIlVNQVBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gXCJzYW1wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICtcbiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgK1xuICBnZ3RpdGxlKFwiVU1BUCBjYWxjdWxhdGVkIG9uIGVhY2ggc2FtcGxlIHNlcGFyYXRlbHlcIikiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgUGxvdCBVTUFQIGNhbGN1bGF0ZWQgZnJvbSBpbmRpdmlkdWFsIHNhbXBsZXMgd2l0aCBzZXBhcmF0ZSBzY2FsaW5nIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcIlVNQVBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBcInNhbXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgK1xuICAjIFVzZSBhIENWRC1mcmllbmRseSBjb2xvciBzY2hlbWUgYW5kIHNwZWNpZnkgbGVnZW5kIG5hbWVcbiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBcIkRhcmsyXCIsIG5hbWUgPSBcInNhbXBsZVwiKSArXG4gICMgTW9kaWZ5IHRoZSBsZWdlbmQga2V5IHNvIGl0cyBwb2ludHMgYXJlIGxhcmdlciBhbmQgZWFzaWVyIHRvIHNlZVxuICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgY2FsY3VsYXRlZCBvbiBlYWNoIHNhbXBsZSBzZXBhcmF0ZWx5XCIpIl19 --> <pre class="r"><code># Plot UMAP calculated from individual samples with separate scaling scater::plotReducedDim(merged_sce, dimred = "UMAP", - colour_by = "sample", + color_by = "sample", point_size = 0.5, point_alpha = 0.2) + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + + # Use a CVD-friendly color scheme and specify legend name + scale_color_brewer(palette = "Dark2", name = "sample") + + # Modify the legend key so its points are larger and easier to see + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP calculated on each sample separately")</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd5wdVcE38DN3S3Y3jRTSExKSQMCASMAIBCECAqEldKQXFQQEUQQU0Qi8voiPoD4i4AuC0jHw0HtRifQeEiCkEdJISG+b3b3z/nH1Os+27N5s2Ez2+/3kj3tnzsycOTN7c393zpyJ4jgOAAAAwKYt09oVAAAAANZPgAcAAIAUEOABAAAgBQR4AAAASAEBHgAAAFJAgAcAAIAUEOABAAAgBQR4AAAASAEBHgAAAFJAgAcAAIAUEOABAAAgBQR4AAAASAEBPowbNy76t0GDBjVU7LjjjssX23LLLZOzojq6dOkSx3HdlfzlL3+pW/jEE09spHqXXXZZsnDfvn2z2WwTd6euzp0777rrrscff/ztt99ebw1bUXl5eb6ejzzySJutQ2GOOuqofM3POuus1q7OZiK958MmQgNuxhxcAGgVAvxGsXTp0smTJ9ed/uKLLzZ3VXfccUfy7dy5c//2t78VXLHly5e/9tprd9xxxwknnLDHHntMmjSp4FXRuCuvvDL/7Xa33XZr7eoAbZpPJADYPAjwG8vEiRPrTmxugH/xxRenTZtWa+Kdd95ZeLX+98oPPfTQ1atXt8jaAAAA2KgE+I3ln//8Z60pq1atevfdd5u1kttuu63uxAkTJqxbt64pi5eWlu6UMHjw4NLS0mSBGTNmXHrppc2qEgAAAK1CgN9Y6l6Bf+WVV2pqapq+hqqqqrvvvrvu9MWLFz/xxBNNWUOfPn3eTPjoo49Wrlx57bXXRlGUL1Oriz4AAACbJgG+hQ0dOjT34qOPPlqwYEFyVr7/fI8ePTp37rzeVT3++OOfffZZ7nVpaWl+zWEDetGXlJScd955p5xySn7KggUL8ltpXGVl5Y033njIIYf069evrKxswIABX//61y+66KJPP/20oUX+8Y9/fOMb3xg5cmSvXr0qKiqGDh06evToH/3oR/PmzWtuzZu+9YkTJybH7ausrKxVYLfddsvPvfLKK5tehxbcnZzZs2f/6Ec/GjFiRLdu3crKyrbaaqsjjjjinnvuaWR8wYULF/74xz8ePnx4+/btu3fvvs8++9x3332FbT3viSeeOO2007bddtvOnTuXlZX169fvgAMOuOaaa5YvX1638JIlSw5MmDVrVnV19e9+97uRI0d26dKla9euo0aNuuiii1asWNHcahTQGgUckQJO46Rbb711zz337NatW25Pr7zyyiZ2h0maPHnyt7/97T333LNPnz4dOnQYPnz4IYcc8qtf/WrlypUbvqezZs1KHqBVq1bNnTv329/+9oABA3IH9xvf+MYbb7yRK7xkyZKLL754u+22q6io6Nu37z777HPzzTfXavD33nsvucKqqqpPP/30ggsu2HrrrcvKyvr27XvooYc+9NBDzW2EUNARb0gBTdr0rW94CzT98C1YsCD58fXee++FEB588MFRo0Z17Njx2WefLWy1TbSBR+T888/P1zyTydStxrRp05J799JLLxVWTwBo0+I2b+zYsfnWGDhwYEPFjj322Hyx7t27J2cl2/Okk04qKirKvb7//vuTxQ4++ODc9LFjx26xxRb5RU444YR6t3jMMcfkyxx88MGXX355/m379u1XrVpV8O786U9/StZ54sSJ62mjOH799de32mqrek+hzp07/+53v6tVfvny5fvuu29DZ11paelvfvObWouUlZXlCzz88MMFb/2FF15IFli7dm2tDX3lK1/Jz73iiiuaUodm7c4555zTUMlJkybli/3hD38oLy+vt9hXvvKVuXPn1j0KTz31VLdu3eqW/8EPfnDkkUfm35555pkNHcda5s6du9deezVU2y5duuS+uyfNnz8/WebFF1/cY4896i7bv3//d955p4nVKKA1CjjB4uafxsnz4f777x83blzdBYcNG/bpp582cTerq6tPP/30TKb+X067det26623buCe1hqZ8qmnnuratWvdpe69997Jkyf36dOn7jr33Xff6urq/Apr/UG9++67/fv3r7vUUUcdVVlZ2UgD1vqjLuD8b6kmbe7WN6QFmnv4av19TZo06ec//3n+7dNPP13AajfSJ1Ldg1trkJebbrqp1iLXXXddfm7//v2z2WxTDjEAkCTAt3CAP+ecc3baaafc6x/84AfJYt27d89Nv/rqq9cb4JcvX578LnXLLbe8//77yQ3deeedBe/OLbfcklzV5MmTG2+i9957r3379vV+scu76667koskf32oV1FR0VNPPZVcpKHv+s3d+sYI8M3anaZ8Xf7DH/7Q+AqHDBmyZMmSZN3eeuuthr5ehxCSIa2JAf7TTz8dMGBA49WIouiWW25JLlUrYOywww4NLbv77rs38Qt6Aa1RwAlWwGmcPB+GDx/e0FInnXRSU3YzjuNLLrmk8QoUFxfnQ1phe1orwHfs2LHepTp16tSvX7+G1vnrX/86v8Jaf1Bf/OIXG1qq7kdZQ39QBRzxFmzS5m59Q1qguYev1t/Xtddem3yb35FN4ROp3oOb/IHsiCOOqNUayf+evve97zXl+AIAtQjwLR/g89+Wdtttt3yZDz/8MF9m4sSJ6w3wyYvkJSUluW9OO+64Y37iIYccUvDunHHGGfkyxcXF69ata7yJdt555+Q+7rXXXpdccsn555+/5ZZb5id27tx59uzZufK1+nmOHDnykksuufLKK0899dSKioqGvt419F2/uVtv8QDf3N25/PLLhw0blv+9JoRQVlY2bNiwYcOGffjhh3EcT58+PRnFd9xxx+uvv/7ee+89++yz8903QginnXZasm777bdfshr9+/c/9thj99xzz1oDE4YmB/hDDz00udSAAQPOOOOMiy++uNY1+YqKihkzZuSXqhUwcrbbbruxY8fuuuuutabXCk71KqA1CjvBmnsi1TofcoYMGXLYYYcl/xJzPv7446bsaXL4iREjRvzoRz+64YYbLrrool69euWn9+vXb0P2tO6zIdu3b7/PPvsccMAB7dq1C3Vsu+22Y8eO3XbbbZMTd9hhh/wKa/1B5Zc6/vjjR44cmTxGURS98cYbyV2u9w+qsPO/pZq0gK0X3AIFHL5af1/5H+Zyu5n7g9pEPpHqPbg//OEP8xM7deqU/M+lqqqqU6dO+bn//Oc/13t8AYC6BPiWD/D5G9RLS0vz6fHWW2/NTWzXrt3atWvXG+D32WeffIExY8bkJiZ70ZeWli5evLi5u1NVVfX73/8+2d10+PDhjbfP008/ndzBa665Jj9r/vz5yfCT74H805/+ND9x//33T64t3w4hhEGDBiVn1ft1sICtt3iAL2x3rrjiivysr3zlK8lZ559/fn7WF77whTVr1uRnJZ87UFRUlA+TtdrhjDPOqKqqys166aWXku0Qmhbg33zzzeQi+++//7Jly/Jz/9//+3/Jk+Tcc89NNntywXbt2iVvFak1OkO9/dhrKaA1CjgiBZxIcZ0Af/311+dnjR8/PjnrscceW++e3nXXXfny2267bbKb+qxZs5LRa/r06QXvaa0Av/XWW+d/f3n33XdrdeK4/PLLc7NqamqSQ2OUlpbmT7C68TW/VBzHjz76aIcOHfKzDj300GQl6/2DKuCIt2CTFrD1gluggMNX9weygw466LXXXlu9enVlZWUuD28Kn0hxAwf39ddfT1b+2WefzZdPNqP+8wBQMIPYtbxRo0blXqxbt+61117Lvc7fHLjLLrvUex0sac6cOc8991z+7VFHHVXrRW7lEyZMaHw9c+fO3TVhu+2269y589lnn53NZvNlfvSjHzW+kvvvvz//eocddkh+1evZs+d3v/vd/Nu//e1vuReZTObgf0sWCCEkk9Ls2bMb33RhW29xLbg7OcmHC1x66aXJ78HHH398/haMmpqa22+/Pff6d7/7Xb7MkCFDbrjhhuLi4tzbkSNH/uIXv2jG/oQQQrjnnnvyrysqKv785z8nL46dfvrpRx99dP7tvffe29B6LrzwwuRvRscee2zy6nSy40lDCmiNAo7Ihp9Ixx9//Le//e3820suuSTZIb/WHS71yg1IlrNw4cI5c+bk3w4YMOBnP/vZOf+WH3ptw8+98ePHDxw4MPd6+PDhyQELhg4dmv/zz2QyyY4569ata2hsy3322Sf57MkDDzwwedH1wQcfXLp0aUOVySngiDekgCbd8K03vQU2/PB9+ctffuihh0aMGFFeXl5aWlpSUtIiq62lBY/IzjvvnBxv9dFHH82/fvLJJ/OvjzzyyGTXCQCg6YpbuwKboX79+g0YMODjjz8OIUycODH3jTn/WPjdd999vWu488478xm7pKTksMMOy73edtttd9xxx3feeSdfLPmdu67kLwj1+upXv3rcccc1XpnkQMGHH354rbmnnHJK/ibbfLeCyy67rFax6urqmTNnvv7668kBmZqigK23uBbcnRDCrFmzkoMz77333rUK7LXXXm+99Vbudf53n+TFq7PPPrvWkF0nnnjiBRdcUO+g8Q1JrvCYY47p0aNHrQLnnHNO/vLm/Pnzp0+fvvXWW9ddT7KrSM4222yTP0VXrVrVeDUKa40CjsiGn0i1xgwrKSnZeuut33333dzb9e5pCKFLly7514sXLx40aNDuu+9+0EEHHXTQQTvssMOFF15Yd5ENP/dq3deQ3LsRI0YkT6Qm/gWdffbZtaacddZZyXpOmzZtxIgRDS1e2BFvSHObtEW23vQW2PDDd84559QNupvCJ1IjjjnmmPzV/kcfffTqq6/OvU4G+OSP0QBAswjwG8WoUaNyz1fP5fYVK1bk+7XWO2R3LcmrHPvuu2/yS+pRRx2VT0fPP//83Llz6x1HuikOP/zwG264Yb3Fkt/t6o7g3a9fv/POO6/eBZctW/bkk08+8cQTr7766pQpU6qqqgqoZMFbb3EtsjshhBkzZiTf9u7du5HCudNm5cqVycuhX/jCF2oVKy0tHTx4cK1e8Y1LXqvcbrvt6hYYNmxY8u0nn3xSb4Cv1Xs/hFD3vvFGFNAaec06Iht+ItXd0/UOiVfLEUcccfHFF+cfO5fNZl944YUXXnjhkksu6dev35gxYw4++OAxY8Yk7zrO2ZBzr5FYXthvXttvv32tKd27d99yyy0XLlyYe9t4gN+QI15Xc5u0Rbbe3BbYkMM3ZMiQhma14idS44499th8gJ88efLMmTMHDhy4dOnSV199NTexX79+yfuYAIBm0YV+o8in9IkTJ4YQXnnllfwV9d12263xZd9777385Y5Q50pF8m02m012hG6KKIq6d+++77773nHHHRMmTEgOa9SQ5HXdpn/jv/nmmwcOHHj00UffdNNN77zzTsFfLgvbeotrqd0JISxZsqS5hWs9U73en2ya+ztOsmHr/crerVu35L0e6+0XXZgCWiOnuUdkUziRBgwY8Pjjj/ft27furE8++eTGG2889NBDBw8e/NRTTyVnteC51yKSg8PlJU+/XOejhhR8xOvV3CZtka03qwU28PAlb2xJat1PpMZ94QtfSD6yIdeL/plnnqmpqclN0X8eADaEK/AhOYh3I/1gk7PqjvtdS/42+EWLFn344Yf5bodDhw6t21e5luSgQSGE00477bTTTmuo8J133pm8m7eWgQMH1rq6UoCKior87aMN3RZby7333nv66afn35aWlu6yyy5f+tKXdt555x49ehxyyCEbdestrgV3J4SQv3c9hJDJZLbZZptGCufOtB49epSUlOS/oy9YsKDuRfhPP/20WdXo1KnTokWLcq/rHVh+yZIllZWV+bcNPY1sAxXQGqGgI7IpnEghhNGjR8+cOfOBBx74y1/+8tRTT61evbpWgVmzZo0ZM+bll1/OjZnfsudei1iwYEHnzp1rTUyeQskR3eoq7Ig3ollN2iJbb3oLbKTD1+qfSOt1zDHH5K/VP/roo9/5zneS/eeT42sA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Vckb13PyX5dramouuOCChvqld+rUqVZszrn99tvrffb42LFjDzvssPzbJgb4OI5nz57dyB3L3bp1u//++2stsjECfHNbo7AjEjf/RGrZAB/H8SuvvFL3rEgaNGhQskNNAXu6sQP8Qw89VLfTRwjhm9/8Zk1NTRMbsLDzv0WatICtF9wCBRy+pgT4TeQTab0B/je/+U2t9UycOLGJhxUAaIgA/7+sWrXq2muvPf7447/yla9sueWWHTt23GmnnY444oif/OQnc+fObWip5BeUZIC/4IILkrOee+65/Ky6AX7x4sXJy4Mnn3xy41VN3nWZ/GK0kQJ8HMcrV6685ppr9t133169epWWlg4YMGD//fe/7LLLlixZUm/h8ePH77zzzh07duzSpcvo0aP//Oc/535lOP300/f9t3HjxuUXafzrYLO2nnPXXXcdeOCBW221VVlZ2VZbbXX66adPnjw5juNzzz03X4Fa30obqkMBuxPH8cyZM0877bRBgwa1a9eurKyse/fu77//frLAO++8c/bZZ2+//fYdO3asqKjYdttt999//+uvvz553ayW6dOnn3feeUOHDi0vL+/Spcuee+55yy23ZLPZ8ePH56tx7bXXNrR4vR555JGTTz556NChHTt2LC0t7dOnz/7773/ttdfWW42NEeBzmtUahR2RuJknUosH+DiOs9nsI488ctxxx+22224DBgxo165dz549R4wYcfjhh0+YMCHXpXlD9nRjB/i1a9e+/fbbxx57bK4Be/fuffjhhz/99NP17mzjDVjA+d8iTdrcrW9ICzT38DUlwBew2pyW/URab4CfO3dusmeQ/vMA0CKiuDkDegHQpkycOHHUqFH5t2vXrq33+vNmTAsUbO+99/7b3/6We33eeedde+21rVsfANgMGIUeAGh5HTt2zL82/jwAtAgBHgBoYfPmzctffu/bt+/uu+/euvUBgM1D8fqLAAA0wZw5c1asWDFt2rSLLrpoxYoVuYknnHBCQyPkAQDNIsADAC3j8ccfP+OMM5JTysvLv/e977VWfQBgM6MLPQCwUURR9Otf/7pnz56tXREA2Ey4Ag9Ag/bYY482/rASLdAs5eXl7du3r6qq6tKly4gRI84666yDDz64tSsFAJsPj5EDAACAFNCFHgAAAFJAgAcAAIAUEOABAAAgBQR4AAAASAEBHgAAAFJAgAcAAIAUEOABAAAgBQR4AAAASAEBHgAAAFJAgAcAAIAUEOABAAAgBdpogJ82bdrgwYMHDx581llntXZdAAAAYP2KW7sCrWPdunXTp08PISxYsKC16wIAAADr10avwAMAAEC6CPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAACQAgI8AAAApIAADwAAACkgwAMAAEAKCPAAAG1StjqsWxVq1rV2PQBoquLWrgAAAJ+7VYvCoulhzquhcmXotX3Y7uAQotauEwDrIcADALQxlSvC7FfDm38Oa1aEkA2zXgjvPxLGXd/a1QJgPXShBwBoY6pWhXfuCWuWhLg61NSEqnVh8czw12+2drUAWA8BHgCgjVm3NqxZHrIhxCFEIWRCiENYOjs8d2Vr1wyAxgjwAABtTEXXUJQJUQhRHEIU4vCvKD/thTD7tdauHAANEuABANqYsk6hU98QRyFEIYpDlBu+LhsyIbz6p1C9upWrB0ADBHgAgLZnzM9DpjjEcQghhDjEUciEkI3D6oXhjdtC1ZpWrh4A9RHgAQDanuJOYdzvQ3GuI30UojjEUYiisG5N+Pi1MO251q4fAPUQ4AEA2qQuA8LXfhKi0hCiEEUhRKGoNJRvEWrWhaWzw8qFrV0/AGoT4AEA2qoBu4cDfhG6DAhRScgUhXYdQgghWx0WfhCmPxc+nfLvPvYAbBIEeACANqz38DDy3NDrC6Fd+5DJhGxVyFaG6rVh3nth1othwZTWrh8A/1Hc2hUAAKBVbdEnbDk0tOsYln0csqtCUVnIFIXq1WHum2HlwlBaGroOae0qAhCCAA8A0NaVlIVBXw2L3g/lHcOCKSFbE0IIn30cqleERdPDrBfDDmPDiFNauZIA6EIPANDWlVSEsk6h+7BQ3i106hNqasLyT0PV8hCyIa4J2crw5t1h4u9bu5YACPAAAHToGTr3Ddt8PfQZETpsGapXhhCHOA5xCHEImRCmPh6qK1u7lgBtnQAPAEAIJRWh/ZZh2AFhq91DCCGOQ5QJRVGI45CNQ002LJjU2lUEaOsEeAAA/i3KhG2/Hko6hEwmZOMQhxDl/sWhJtvalQNo6wR4AAASisvC7meGkAmZKIRsiOIQh1DRI3Qb3No1A2jrBHgAAP63rUeHnU8MRe1CVBzi0tChd9j1lNC+a2tXC6Ct8xg5AADq2LwHcMoAACAASURBVOnYsO2BYeGkEDKhy5DQccvWrhAAAjwAAPUq7xwG7NHalQDgP3ShBwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQQ4AEAACAFBHgAAABIAQEeAAAAUkCABwAAgBQobu0KAJAOU5e9P3Xp+1uW9ti++xfbl7Rv7eoAALQ5AjwA63fFGz+et2JudVyViYq7f9z9O8O/37t979auFABA26ILPQDr8YdJ13yyYnZVXJWN45q4esHq+bd++MfWrhQAQJsjwAPQmDiOJy+ZHIc4iqNMlAlRFKIwb/nsqmxVa1cNAKBt0YUegMZU1qyJ4poQh5CJQ4iiEEII2VBdnPE/CADA58oVeAAaU5QpKS0qCyGOsyEOcRzHIYo6lHWKQtTaVQMAaFsEeAAaUxQV7dRtlxCiKIqiOIqiUByKThx8RmvXCwCgzdEBEmBzF8ehqirOZqPS0pBp9u+22Ti7U48R68LaqYs/Wptd1a6obN+++w/oPHAjVBQAgMYI8ACbs7i6quqjjyqffaJm0adxSUnFPge0+/JuzVpDcaZ4i9IuQztvt3XHbeIom83GgzsNLSsq30gVBgCgIQI8wOasauaMlTf9PqxYGcc1UQgr/3R91RuvtT/l9Kisoukr6V7eIw5xNs6GEKIQdWnX1Qh2AACfP9/AADZf2ey6px6LVy6LauKQCdk4hJrqyjdeqVm5vHjb7Yp692m3zfZRp07rXU1ZUVnf9v1WV68JIS4rKpfeAQBahS9hAJuzmgUL4po4zoSQDVEmxDUhG8VVH06pmTktat9xbY8eZXuObjfsC1Gnzo2sJBvXVNasK8mUlGZKo8jg8wAArUOAB9h8ZTJxUZSJQpwN2SjEcZyJojhkQxxlK6vCus8yy5asWbgoOiIq3WGnqKz+29pXVa38bO2iOMQhhJJMaY+KnsWR/zsAAFqBx8gBbM5KvrhTNs5EmTgKIYpDNo4yUSaEKMRxJkRxTTa7bPHqJx6uWbCg3sWrslWfrV00b/WcZeuWfLZ20ccrZy5eu+hz3gUAAHIEeIDNWekOXyrq0zcbojjOxlEcRXGIQxSyuQvycRSH6prsvLnrJj4fr11bd/G1NWviEHco6di5tEvXdt2KoqK11WvjOP78dwQAAAEeYHNW0rd/xX4HlgzYOlNcFsWZEMVxHMdRURRCHMdRNgohG6qq17720pr/uadm6ZLay8chhPCvxO7mdwCAVuU+RoDNWmm7ki/tUtS7z+pnHq+a9lG85LMQZaMQZ8O/7oePQibEIaxcvfatN0OUKd//4GiLLfJLlxdXROsWr6peWR1X12Sra+KasuJy49gBALQKAR5gM5epqMhsPaTTgDMrX39lzaMP1nw6N1udzURRHIcoiuIoysQhFEXx8uVr3ni5evnS9vsfVDRgUAhhTfXqyYvffn/xlDiKe1f069+xf6fSLbqVdW/tHQIAaKMEeIC2obi43cjdox5bVj3/TOWsafGnn4bqmjjKZEIIUYiz2RBXxUuX1rz9+vIPPyjZdWTV/vvcPvP2D5ZPqaqpCtlQ1q79gf3GjOrztaKoqLX3BACgjRLgAdqQ0kFDS/puVbbw06pJb695/uns8mXZ6qoohCjEIYQojmsqq7LrlsTPP73ko1dn7LKssrQ6CnEoyqypWvHYxw8P7jR0SJdhrb0TAABtlEHsANqWqLS0qG+/0pF7tNt9VFGv3pmu3eKiojhENXEcRyHKhOIQ4urq8k8Wj36npqI6xCHKZrNxCKtqVj04477Wrj4AQNslwAO0RVGnTsX9BhYPHFy63XbFnbqEEKIQsnGI4jgOIQ5RaXUYsDDut+Bf49Bna+I4jqYsn/z32c+0ctUBANoqAR6gLYoymeKh25Tu+MVM915F2w2L2rePolAUsiHO1IQ4CnEcQudVcbcVcYhCFKJMURTiOMTxbdNu+WDZlNauPgBAWyTAA7RFNfPmVM+cFkqK231p14oDx5YMHBqiTByimpAtDplsiKMQSquj/p9FpZUhhDgbQqYojjKZOITr3722Jq5p7T0AAGhzDGIH0Oasff3VmrmfVE15N1NaVtR/QOlOI0p33yO7ZmX1zOlRtiYbx3E2RFG2KM4Mm5vdfl701oBMFMVxTRwVZUMcVteseXXhi1/pMaq19wMAoG1xBR6gban5dEF23pyqKZMyHTvXVK5d984b615/JdO5S8m220U9eoSQieNsJorjEBXF2dKq6JBX4/5L41AdoigTx7kR6+NPVsxu7f0AAGhzBHiAtiW7dMm6ye9m2neIiopLe/UJpe1qPlsUr1ld+sURRV17hBAyIRNnMlEIcRxl4lBeFR36aoiKQsiEKBviEIqioh5lPVt7PwAA2hwBHqBtyZSVFQ8cnF2+NJSU1MTZTFFRKMpEnbtEnbfI9O2XKS6KQ5yJQxTFIQpxJmRC6LQ606EqE0IUFYWiKOpV3nunbru09n4AALQ57oEHaFsyvXoVlbWrWrsm+8nHoThT1Lt/VF4Wr1xes3Z1Jo7jkpJo3bo4iqJsCJk4iqM4hM4lnYd12mpq9eyS4qK+5f3HDTymU1mn1t4PAIA2R4AHaFui0rJ2o/aKo6hm3pwQMlH79iWDBtcsWpiprq6ZPzfKZGqiKKqJ40wIcQghjkJU3KXbt0ZeGELIhmxG1y0AgFYiwAO0OZmu3csPOCS7+LO4al2UKcquWF4UZ6s//ji7YEFcWZ3JZOKQjeIQR1EmRHFZ+/LR+/1rQekdAKD1CPAAbVFUUlLUs1cIIdRUx+sq1308a907b8VLFsXZmiiKoigKRZlMpjjTrXvpbruX7Pil1q4vAAACPEAbV1ScXVuZnftJdtHCuKY6ikMUQpzJZMrbR717V+y+V+mIXUNZeWvXEgAAAR6gzYvalWYXLoiy1SEbx3FuWhxC1G77HUq+NEJ6BwDYRLibEaCtiyor42wc12TjKIoycRzFIRviUJPp3DmqaN/atQMA4F8EeIC2Ls5ms3E2DnEUx3HIxCEKURxqqkOHjq1dNQAA/kOAB2jroi06F3ftGqIohCgKUVEIUSYKRaXZyrWtXTUAAP5DgAdo64p79I5694tKSqMoRFEcSouzUVFR9+5FXXu0dtUAAPgPAR6gzSsubr/f/pmtBsWZTDYqjuOiTPsOUY+epQMHtXbNAAD4D6PQAxAyW/bucMyJlc8+kV26OAqZTK/eZfvsF0pKWrteAAD8hwAPQAghlAzYqviE0+Lly0IUZTp2CsX+gwAA2LT4fgbAv0TFxVHXbq1dCwAA6uceeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFBDgAQAAIAUEeAAAAEgBAR4AAABSQIAHAACAFNikA/zZZ5+95ZZbNjR32rRpRx99dI8ePcrLy7fbbrsrrrhi3bp1n2f1AAAA4HOz6Qb4xYsX33333Q3Nffvtt0eNGnXvvfcuX768Z8+e77///k9+8pOvf/3rMjwAAACbpU0xwFdVVT3//PMHH3zwZ599Vm+BOI6POOKI+fPnn3POOUuWLJk5c+bkyZP79Onzt7/97de//vXnXFsAAAD4HGxyAf7ss8+uqKgYPXr0iy++2FCZp59+etq0aTvvvPNvfvOb8vLyEMJ222132223hRB+85vfxHH8+VUXAAAAPhfFrV2B2nbYYYdTTjklhLB69eo77rij3jK33nprCOHoo4/OZP7zA8Tee+/dq1ev+fPnv/nmmzvvvPPnUlkAAAD4nGxyAf7MM8/MvViwYEFDAX7q1KkhhL322is5MYqir371q/fcc8+MGTMEeAAAADYzm1yAb4p58+aFEOoOUJ+bMn/+/LqLvPbaa3/961/zbxu6ux4AAAA2TekL8HEc5yJ6165da83q1q1baCDAv/POO1ddddXnUD0AAADYGDa5QeyaLoqieqd7khwAAACbn/RdgY+iqGfPnp988snixYu32GKL5KzFixeHEPr06VN3qdGjR99zzz35t3PmzPne9763sasKAAAALSV9AT6E0KdPn08++WTRokVbb711cvqiRYtCAwF+0KBBgwYNyr+dMmXKxq4kAAAAtKBUdqEfMmRICOGf//xnrem5R8cPHjy4FeoEAAAAG1MqA/xJJ50UQrjvvvuSE994441Zs2YNHz7cM+QAAADY/KQywH/9618fNGjQP/7xj1//+te5KUuXLs2l+u985zutWjUAAADYKFIZ4KMo+utf/9qjR4/vf//7Q4cO3Wefffr27fvee++dfPLJ3/zmN1u7dgAAANDyUhngQwg777zzxIkTDz/88KVLl06cOHHAgAFXX331n/70p+LiVA7LBwAAAI3bdONuz5494zhupMCQIUMmTJjwudUHAAAAWlFar8ADAABAmyLAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjwAAACkgAAPAAAAKSDAAwAAQAoI8AAAAJACAjywKYrjuLombu1aAADAJqS4tSsAUNvM+aufmTR/0fK1RZnMiMFbjN6hV2vXCAAAWp8AD2xaPl229s4XZi1cvrYmDpkoWrRi/pKV6w7fbUBr1wsAAFqZLvTApuXFDxYuXlUZh1CciUIIlVXx69OWr6msau16AQBAKxPggU3LomXrqmtCCHFRJiopDiGE6mz11HmrWrlaAADQ2gR4YNPSrVNpu+IoxFE2jmuqQxyiTCgqLS5q7XoBAEArE+CBTcv+X+xVWpQJUVSTzWZDtijE3TqWdO1Q2tr1AgCAVibAA5uW8rKSk/bdqlfnduWlRR3blfTvVn7AiF6dKoy4CQBAW+c7MbDJGdKz0/mHdliwdG1NNi4riTq3b1dWqgs9AABtnQAPbIralWQGbFnR2rUAAIBNiC70AAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAAKSAAA8AAAApIMADAABACgjwAAAAkAICPAAAQFv09ttvR1EURVFNTU1r14UmEeABAAAgBQR4AAAASAEBHgAAAFJAgAcAAIAUEOABAAAgBQR4AACAAv39738/4ogjhg0bVlFRMXDgwH333XfChAlxHNcqtnDhwvHjx++66669e/cuLy/feuut99tvvzvuuKOqqipZbM6cOVEU9e7dO4Tw8ssvH3LIId27d6+oqNhxxx2vv/76XJnnn3/+gAMO6NatW4cOHXbaaaff/va3yTHkL7zwwiiKrrzyyhDCLbfcsttuu3Xq1GmLLbbYbbfdbrrppqbv17PPPnvYYYf16tWrvLx8m222Of74419++eXCmogWVNzaFQAAAEil884777e//W3+7axZs2bNmvXMM8+cfPLJt9xyS3761KlTR44cuWTJkvyUGTNmzJgx4+mnn77nnnvuu+++TKb2hdW77rrrpJNOGjly5NixY1977bW33377rLPOmjdvXs+ePc8555wRI0aMGzfu3XfffeWVV84777zZs2dfffXVycWz2ew3vvGNO++8s0uXLiNGjJg6depLL7300ksvPffcczfeeGNFRUUjO1VVVXXZZZddddVV+Z8hpk6dOnXq1DvuuOPHP/7xFVdcUWhr0RLiNmny5Mm53R83blxr1wUAAEifCRMm5DLF2Wef/cYbb8yfP//NN9885ZRTchMfeeSRfMmdd945hNCnT59bb7116tSp8+fPf+WVV771rW/lSt5///35kp988kkIoV27dh07dnzwwQdzE7PZbG61mUwmk8ncdNNN+fIXXHBBCKG4uHjFihW5KT/4wQ9CCH379o2i6Kqrrspms7npjz32WJcuXUII5557bn7xt956K1eH6urq/MSf/exnuYlnnHHGP/7xj9mzZz/xxBNf//rXcxOvueaajdCWNJUAL8ADAADNdvrpp4cQxowZk5yYzWa33377EMIPf/jD3JRPP/00Fz2ee+65WmvYc889QwiXXHJJfkouwCcXz3nvvfdy00866aTk9AULFuSmv/baa7kpuQAfQvje975Xa3OPPfZY7teBTz75JDelboCfM2dO+/bt6w3quf3t1KnTZ5991qQGYiNwDzwAAECzffbZZyGE6urq5MQoip555pmPPvood208hBDH8W233Xbbbbd99atfrbWG/v37hxBWrFhRd+Xjxo1Lvh04cGC903v06FFeXh5CWLp0aXJ6cXFxPsnnHXDAAbvssktlZeUNN9zQ0E5df/31q1atGj58+HnnnVdr1jXXXFNeXr58+fJnn322ocXZ2AR4AACAZtt7771DCE8++eSYMWMefPDB5cuX56b36tVr8ODBPXv2zL3t0aPH8ccff/zxxydvdJ87d+4dd9zxyCOPNLTyrbbaKvm2qKio3unJWUmDBg3q06dP3el77LFHCOH9999vaLu5rsr77bdfFEW1ZnXs2PGLX/xiCOGll15qaHE2NoPYAQAANNu55547adKkm2666bHHHnvssccymcz222//1a9+9eCDD953331LSkqShd95550HHnjgtddemzp16qxZs1avXt34yusOa9f49FoGDRpU7/Stt946hDB9+vSGFvzwww9DCNdcc80111zTUJn8TQF8/gR4AACAZstkMn/84x+/+93v/vWvf33sscfeeOONSZMmTZo06brrrtt2221vv/32ESNGhBCqq6vPPPPMm2++OY7jKIoGDx48evToIUOG7LrrrhMmTLj//vs3Rt3WrVtX7/S1a9eGENasWdPQgosXLw4h9OnTp2vXrg2V6dGjxwZXkAIJ8AAAAAXaYYcddthhh/Hjx69aterll19+/PHH//jHP37wwQeHH374tGnTiouLf/nLX950000lJSW/+MUvTjvttNxQ8DlPP/30RqrVjBkz6p3+0UcfhYavz4cQttlmmzlz5nzrW9/66U9/upHqxoZwDzwAAEDzVFVVXXXVVVdddVWuz3kIoX379l/72td++ctfPvjggyGEjz/+ODfrr3/9awjhzDPP/P73v59M7yGEadOmbaTqffzxx/kR5vNWr1790EMPhRC22WabhhYcNmxYCOHll1+ud+4DDzwwYcKEefPmtVxNaR4BHgAAoHlKSkquvfbaiy+++Lrrrqs1Kz+q3JZbbhlCyGazIYQOHTrUKvbCCy+8+OKLIYQ4jlu8enEcX3zxxVVVVcmJ48ePnz9/flFRUe6BcPX6xje+EULI3dVfa9bdd989duzYE088saysrMUrTBMJ8AAAAM223377hRB+97vf/eIXv5g6deqSJUtmzpx52223HXfccSGEkSNH5gL8l7/85RDCjTfe+NRTT9XU1GSz2VmzZl1++eVjxozJPYLu+eef/+CDDxq6a71gTzzxxNe+9rWHH354xowZTz755NFHH/3LX/4yhHDyySd/4QtfaGipUaNGnXjiiSGEcePGXXrppW+++eZnn332/vvvX3755SeddFII4bvf/W6tfgR8nqKN8XvPpm/KlCnbb799CGHcuHH33Xdfa1cHAABImcWLF48YMWLmzJl1Z/Xv33/ixIm5x7zPnz9/p512WrBgQQghk8kUFxfnsvpJJ5103HHHjRkzJpfInn766X322WfOnDn9+vXLLZV/EF0IobKyMnfd+6233so9yy2vY8eOK1euzC0eQrjwwgt/9atfHXTQQZWVlXXvsR87duwtt9zSuXPn3Nu33357p512CiFUV1fnOw4sWbLkW9/6Vq7nfy2nnnrqTTfdVPcJc3xuDGIHAADQbF27dn333Xevv/76CRMmzJ49e9GiRb179x44cOBRRx116qmnlpeX54r16tXr7bffvvLKK5955pkZM2a0b99+l112Oeussw499NAQws0333zrrbdWVFTkcntLKS8vf+CBB37/+9/fcsstH3zwQZcuXXbZZZeDDz74jDPOWO+yXbp0uffee++9994JEya88847s2bNGjBgwPDhw88///zcY+RpRa7AuwIPAACk1aJFi959991hw4b17t07/PsK/JFHHnnvvfe2dtVoea7AAwAApFX37t1Hjx7d2rXgc2IQOwAAAEgBAR4AAABSQIAHAACAFBDgAQAANhNXX311HMdGsNtcCfBs5rJxtrKmsiaubu2KAAAAbJACR6F/+eWX//nPf06fPn3IkCHHHHNMr1696pb58MMPcz/8/PjHP96gOkKhVlatmLVixpsL35y7alZFu04H9j1w8BbbtnalAAAACtHs58CvXLnyO9/5zl/+8pf8lIqKiquuuuqcc86pVfKBBx4YO3ZsCGETfNS858C3BZU1lR8umXLj5N9XxmtCHKIQxXE4oO+Yw7c5rrWrBgAA0GzNvgJ/zDHHPProoyGEioqKQYMGTZ8+ffXq1eeee25NTc155523EWoIBVpbs+b2D2+ujNfENdmQieJsHKLo8XmPlGYqRg34avvi9iWZ0tauIwAAQFM17x74hx566NFHH42i6PLLL1+2bNmkSZPmzp176qmnhhB++MMfTpkyZeNUEgpRWVO5pHJpHMdxyMRxFEIcQhzH2SfmPfDmp6/NWfXJgtXzW7J7yKrPwrRnwwePhJn/CMs+abHVAgAAhBCaewX+lltuCSGcfPLJl156aW7KFltscfPNNy9btuy+++4755xznnnmmRavIhRmddXKEOIoRKEojuIohCgbRZkQVdZUffz/2bv3sKiqvXHg37X3nhswwHBnFAUFFMG8kWla3o76WpqSSGrnTTPreMouj+TRPPaeznnsZK+d3sxeO56OFf2ykouaYmVK3vKOioqMlwBBhBluAwNz33uv3x9bJ15AHYYhvHw/j3/I2t+91tqAj/Pd62YuV3IqrW+PBodRowjyQmPlx+Dox2BtAI4DpQb6TQEACOjphZoRQgghhBBCCAA6OgJ//vx5AFi4cGGr8o8//litVv/000/79u3zVs8Q6iR/eaCCk4siBQqUAmUIQ4ACEKAsw2kUmipLpZW3eKGl0pPw41+hyQAOK9iaobESdDuhodwLNSOEEEIIIYTQDR1L4MvLywEgJiamVXlYWFh6ejoA/OUvf/FWzxDqJH95wJCQ4YQhIBIg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KC4uTktLCwsLU6lUCQkJq1ataveNg3fDWsrIyCCEvP32220vHTp0aPr06TExMWq1etiwYW+88UZjY6NXGm0HdY8rfvDgwatWrdLpdK0CamtrO1Rh9yoqKpJ6m5KS0t19QQghhBBCCN3leDvNWkA/faxjf/I/72SzTz/9NAAkJiYePHjQVXju3LnJkycDwJAhQ2w2m6vcbDYnJSUBgFarzczMNBgMlFKn05mXl5ecnAwAAwYMaG5ubll/SEgIAOTn57cstNvtGzduVKlUALBy5UqP6y8sLAQAPz+/2z5mQUFBREQEACgUit69e0up3JgxY+x2e9eFtVRUVOTr6wsAq1atanVp9erVUg1hYWEJCQlKpRIAIiIiysvLO9louzowhR4AOI7r1atXbGxsr169OnQjQgghhBBCCN2zdLnQpO/wXee3gbnG4zYrKys3bdqkUCh27tw5evRoV3lSUtK2bdsGDBhw+vTpvLw8V/mHH35YWFg4cODA48ePz5o1KywsDAA4jhs/fvyePXvi4+OLiorWrl1723blcvmCBQtWrlwJAJmZmV6vvxVK6cyZM/V6/eLFi41G45UrV4qKirRa7f79+99///0uCmvJarWmpaWZzea2l06fPr1ixQqlUrl9+3aDwVBUVKTX6+fOnavX6xcsWNCZRm/G3QRemiHP8/z27dtnz54dFhb2+9//fufOnTdb9oAQQgghhBBC9wVK4fxWT24UHKDb4XGzJ0+eBIDBgwe7RnRdlErljBkzAKCgoEAqMZlMa9asAYB169b16NGjVXxAQMCyZcsAIDs7283WpUH+kpISaR641+t32bNnT3Fx8dChQ9euXSsN+yckJHz55ZcAsHbtWnpjtrh3w1p6+eWXCwsLBwwY0PbSrl27RFGcP3/+tGnTXE+6YcMGlmX3799vtVo9bvRm3N35MD8///Lly998883XX3+t0+nMZvOmTZs2bdoUHBycmpo6d+7chIQE91tFCCGEEEIIoXtEzUWw1Ht4b9kRSF5w+7D2WCwWANDr9TzPc1zrzO7111+fO3euRqORvszIyKivrx81atSYMWParS01NdVoNAKAw+GQy+W3bV0aypXmdXdF/S4ZGRkAkJaWxjC/Dj+PHTs2IiJCr9efPn166NChXg9z2bRp08aNG1944YWgoCDXQmwX6YkUCkXLQplMxrKsw+Fobm6W0vWONnoLHZhCHxcX9+abbxYVFRUUFCxfvjw6OhoA6urqNmzYMGbMGGm1AwDY7Xb360QIIYQQQgihu1vNBc/vNVW6u+9dG8nJyQzDlJWVzZ07t6ysrNVVjUaTmJio1WqlL8+fPw8AEydOvFlt/v7+6enp6enpbmbXW7ZsAYD4+HgpffV6/S6XL18GgFbvBQghjz76KACUlpZ2RZjk0qVLixYtSkpK+uCDD9rtW2pqKsdxGRkZp06dkkp4nl+xYoXD4Rg7dmxoaKgHjd5ax9bASwYNGvTOO++UlpYeOXLklVdekdbiV1dXS1fDw8Pnz5//ww8/8Hxn91RECCGEEEIIoTud1dip2y11nt3Xt2/fpUuXAkBWVlZMTMzw4cPffPPNAwcOtLvM+ZdffgGAmJiYzvQUAERRLC0tfeutt6TF2wsXLvRu/W1VVVUBgCsZdpFK9Hp9V4QBgM1mS0tLE0Vx8+bN0kB6Ww8++GBWVhYhJDk5OTk5edKkSb169Xr//fcnTZqUk5PT0UdwhycJvMuIESPWrl0rHQywcOFCaXpGY2NjRkbGlClTIiIiXnjhhZ9++qkzTSCEEEIIIYTQHY3v3BxkvuNnid2wevXqr776asSIEZTSEydOrFq1asyYMRqNZtq0ad9++60gCK5IaZg3KirKg1aSk5Ndh8CzLNunT5+//vWvgiBMmTLl1Vdf7Xz9t0AplfLboKCgVpeCg4PhRvbr3TDJa6+9dubMmXXr1rW7+t1Fq9X26NGDUnry5Mndu3dXVVURQgYNGiRtR9/RRm+rUwn89SoYZvz48Z988onBYNixY8fcuXP9/PwAoK6u7pNPPpkwYULnm0AIIYQQQgihO5RP68Tst7x9zpw5R44cqaqq+vLLL5999tmoqCiz2ZybmztjxozJkyc3NDRIYdKBcHV1noz2tzwHPjo6ul+/fk8++eSnn366c+dOlmU7X787CCHtlrc6St1bYZmZmRs2bJgzZ07LzeTb2rdv35gxY0pLS997770rV640NTUdOXJk4sSJa9asmTp1aqupEG727da8kMC7yGSyqVOnbtq0qbq6evPmzSkpKa1W8yOEEEIIIYTQvSagp+f3yn1Bpel8FyIiIp5++ulPP/20vLzcYDDk5uY+8MADeXl56enpUkB8fDzcmOh+M3v37s3JySkuLm5VvmPHjtIWLly4kJOT8+yzz7bMSDtT/y0QQsLDwwGgvr71NoFSibTI37thJSUlzz//fGxs7IYNG27dvcWLF9tstvXr16enp/fu3dvPz2/EiBG5ublDhw7du3evtM+8m426yZsJvItKpUpLS9uyZYvBYPjss8+6ogmEEEIIIYQQuiNohwAr8/DensnAsJ7dOmPGjIEDB7bNh8PCwh5//PFvv/0WADIyMqRdxqUE++jRozerjef5GTNmpKamXr161YPOdF39Un5bW1vbqlwqcWW/Xgw7ePCgyWSyWq3jx49/8IbPP/8cANavX//ggw8+8cQT0i3nz5+XyWRPPfVUy6pcJXv37u1Q39zRJQm8S0BAwPz587u0CYQQQgghhBDqTjIVRI/28N7Y33ncrFwuLywszM/Pb/eqVqvlOE4QBOm0ubS0NI7jtm/f7tovvZUDBw6YTCalUjly5EgPOtN19cfGxgLA4cOHW5UfOXIEAPr27dsVYQBw7dq1/BYq7pYRAAAgAElEQVSkleqVlZX5+fnnzp0DAOlMOJlMJpO1fn3j6+vrwSO4w90EfmcnuN8bhBBCCCGEELr7DP1PTwbhIwZCD3cPAG8rOTkZAN566y2r1dr26q5du3ie7927t7TXeL9+/RYuXEgpffHFF9sOBfM8L022nzZtmmfroLuu/meeeQZunFrncurUqbKysqSkJNcJ6l4MmzdvHm1j+fLlALBq1SpKqbRjX1BQUHR0tMVi+fnnn1v1edeuXQAwbNiwDvXNLW171q4O1OhpE7+loqIiqW8pKSnd3ReEEEIIIYTQ3a9oO/30sQ78+Wo2Nek706DZbE5ISACAwYMHf/fdd2azWSo3mUwbNmwIDAwEgPXr17vi9Xp9WFgYAPTs2TMnJ6e6uppSyvN8fn6+dCB5SEiIXv9/uiRtTZefn+9Ofzpaf2FhIQD4+fndulpRFKXT6f7xj39IJUajMTExsdXTeTesrZYJvMvq1asBIDo6+vDhw1KJxWJZsWIFAAQHB1+7dq2TjbZFqHvJ+c12zHMzgff43i6i0+mkwwBSUlJavQhBCCGEEEIIIU8c/wTOb3MrUqaC3/0FIgZ2ssHCwsKUlBTX1nEREREOh0PaGo1l2ddee+29995rGX/x4sWUlBSdTid9GR4ebjQapV3Qo6KiMjIyxo0b1zI+NDS0trY2Pz/fNZh8ax2q//z580lJSYSQm80h/+677+Li4gDg1KlTU6ZMqa6ujo2N7dWr19GjRy0Wy7x58/79739zHOeK925YK2+88cbq1atXrVr15z//2VUoimJqaurWrVsBQKvVajSa4uJim83m6+u7efPmxx9/vJONttWBUEl4ePiTTz45c+bMYcOGdSarRwghhBBCCKF7yvDnQR0JJ/4NgvNWYf5aGL8SNL0732BSUpJOp/vss8+2bt1aUlJSXl6u0WhGjRo1cODAJUuWSNlvS/369Tt79uwXX3yRlZV19uzZuro6rVYbFxc3ZsyYJUuWqFSqTvbHg/oppTfbu951vtrQoUMPHTq0bNmyAwcOXL16NSYm5rnnnktPT2+VkHo3zB0Mw2zZsmXbtm0bNmzQ6XRXrlxJSEgYMWLEypUrW21N561G3R2B37p1a3Z2dm5urslkkkqio6NTU1Nnzpz50EMP3XWZPI7AI4QQQgghhLpEkwFO/z+4cgiENud7+wRB0pPQf6rnu9aj+5u7CbzE4XDs3r07Jyfn22+/dZ1i17NnzyeffDI1NXXUqFHSRnx3PkzgEUIIIYQQQl3IaYXKAmgsB4sRODn4BENoAoTGAdxlY5/ojtKxBN6F5/l9+/bl5ORs3brVYDBIhdLs+tTU1DFjxrCsh4cZ/jYwgUcIIYQQQgghdHfxMIF3EUXx559/zsnJ2bJlS0VFhVQYEhIyY8aMmTNnTpgwoe2ZeHcCTOARQujeIIiUUsqxd8f8L4QQQgihzuhsAu9CKT1+/HhOTk5OTk5JSYlUGBgYOH369M8//9wrTXgRJvAIIXSXcvBis5XXG62GBluDWVAqoXeIn8ZPFuQnV8ju6MlfCCGEEEKd5LUEvqWCgoLs7Ox169ZJO97hMXIIIYS8orrBdq3eeu5qk7HBVtNk50VRxjEaX1lMuP+DsQHaIB+GwYWFCCGEELpndfgYuVujlB47diw7Ozs7O9u1Xz1CCCHUSZSCvsF67orx7FVTfYPDwvMMMADgFAWHU2A4EqmRB/srVXIchEcIIYTQPcs7CTyl9MiRI1lZWdnZ2a6V8AEBAU888URqaqpXmkAIIXQ/a7bzl6816Sqaak1OOy9SEUQGgAKIAECv1VpL1ObYSD9M4BFCCCF0D+tUAi+K4qFDh6Tx9srKSqlQo9FMnz49NTV14sSJcrncG51ECCF0v6tvdJQYzDUmh83OAwVpCRgBQkVRJAyhUNNos9hFkVKG4Cx6hBBCCN2bPEngRVE8ePBgVlZWTk6OXq+XCoODg2fMmJGamnrH7jyPEELo7tXkcJqsToFSCsAQkVKGUAqiABxDKSWEcCzLi6KTpwoZJvAIIYQQujd1IIEXBGH//v3Z2dlbtmxxnf0eGhqakpIya9assWPHcpyXV9QjhBBCEiXHilQUeIEAiCIhDCWUCASICIQBOcsShtaY7KH+CoUMj5RDCCHUzRodDSerj52rO11lqWxymDiGC1QExfj3HRQ87IGQISzBBV/IQ+6m3H/4wx+2bt1aU1MjfRkeHv7kk0/OmjXr0UcfZVn8/UMIIdS1/JSsXCajYAUqAkMAQKTAMiwllGMpIWB3iI3NTpOF91VyOIseIYRQd3EIju/Ktv10bZdDcLgKBUEwWKoMlqqj+p/DfSKe7DN7UMiwbuwkunu5m8D/61//kv4ipe6jR49mWba6ujo7O/u29z711FOedxAhhNB9z+YUak12u90JhBDCEhAoJQSAUipnWRkHChkT4CsDBqwOwe4QVQp8s4wQQqgbGO31Hxf+T3nTlVvEGCz6jws/mBT1eEqfp4iX3jhnZWV98cUXly9fLi8vj4yM7Nu377Rp0/7whz/cbEuyrVu3btq06eTJk3q9PiwsLC4u7rHHHlu8eHHb+NDQ0Nra2raF/fr1mz59+quvvtru6mk36z9//nxSUpKfn19TU1Mnnv7+4u458J353cJz4BFCCHVGZb3lTGljldFSUWczWRyCSFgORIFyLOEYRiEnQWqFr5wDoFGhPgk9/UP8VUqcSI8QQui31exsWn3qrVprtZvxY3tMnB33TGcbbW6ePHny4cOHASAwMFCr1VZVVRmNRgDo3bv3jz/+GB8f3zK+pqYmLS1t37590pehoaH19fWCIABATEzMzp07ExISWsZLCXxkZKRCoZBKBEGorKyUbhk8ePCRI0eUSqVn9XcogS8uLn7jjTf27dvX1NQUHR399NNP/+lPf2r7xsG7YS1lZGTMnz9/1apVf/7zn1tdOnTo0H//93+fPXu2trY2Pj5+0qRJy5cvDwgIuFlVL730UmZmpmt6e4fg5xuEEEJ3OruTMgwJ8lOq5CzHshwLMkKUcpZliUrBqOQywUnrmx0NFr681nqmtPFancVkcXZ3rxFCCN1HKNBPzn/kfvYOAPuu7T6iP9jJdhctWnT48OHExMSDBw8ajcbz58/X19efO3du8uTJZWVls2fPttvtrmCLxTJ+/Ph9+/ZptdrMzEyDwVBdXW2z2fLy8pKTk0tLS1NTU81mc9tWduzYUXpDeXm5xWLZuHGjSqUqKCh4++23O1//bZ05c2b06NFZWVkmkyk8PPzChQtvvvnmpEmTHA5H14W1pNPpXnrppXYvvfvuu6NHj96+fbvFYomKiioqKlq9enX//v2vXr3abnx9ff3mzZs7/j24zt0EnnaCx51DCCGEeEEUKXUKogg01F/JEWBZxs9H5u8r95OzAb4ytZK1OUWLgzdbeacTGsyOM1ca9I02Ef//QQgh9Fs5VX38YkNRx+6hsKXkG5tg87jRysrKTZs2KRSKnTt3jh492lWelJS0bdu2AQMGnD59Oi8vz1X+4YcfFhYWDhw48Pjx47NmzQoLCwMAjuPGjx+/Z8+e+Pj4oqKitWvX3rZduVy+YMGClStXAkBmZqbX62+FUjpz5ky9Xr948WKj0XjlypWioiKtVrt///7333+/i8JaslqtaWlp7b56OH369IoVK5RK5fbt2w0GQ1FRkV6vnzt3rl6vX7BgQatgp9O5b9++qVOn1tXVdfSb4IIj8AghhO5cZhtfZbQJIoiUNlqcVgcf6CsPC5D7+8oDlKxKzrGENNsFESgVQaTUIfAWh2BsdtSZbM1Wvru7jxBC6H6xs2xbh+8h0OQwHajMu33kTZw8eRIABg8e3Lt371aXlErljBkzAKCgoEAqMZlMa9asAYB169b16NGjVXxAQMCyZcsAwJ09ziSTJ08GgJKSEmng2uv1u+zZs6e4uHjo0KFr165VqVQAkJCQ8OWXXwLA2rVrXQPG3g1r6eWXXy4sLJSWYLeya9cuURTnz58/bdo015Nu2LCBZdn9+/dbrVZX5EsvveTj4zNu3LgjR4509DvQEh78hhBC6A4lUmo0O6qMVruT8gIFKso5DnyI2ebkCBAgvj6cn0Lmp6SNFkejxSmKwBFitgocR65UWwJ9FAzj46fE/+kQQgh1LYNFX2mu8Oze0zUnJkU97tm9FosFAPR6Pc/zbY/0fv311+fOnavRaKQvMzIy6uvrR40aNWbMmHZrS01NlRbPOxyOW68GlzidTrgxU7sr6nfJyMgAgLS0NIb5dfh57NixERERer3+9OnTQ4cO9XqYy6ZNmzZu3PjCCy8EBQUVFbWeZCE9kWuDAIlMJmNZ1uFwNDc3S+8IAGDgwIHz588HAIvF8tVXX7n/+K24+7FGertzWwzDhIaG9ujRw1sbKiKEELpvOXhKKTCEsdjtIf4KjiFGi7Oq0Q4iUHBGalR+Ss7BU4Wc+ipVTqfgpNTs4EVKKBCHU6wx2dQ+MjnHyDmcboYQQqgLdXjyfAtXTCV2waZglbcPbSM5OZlhmLKysrlz565Zs6bVOLxGo3Fl7wBw/vx5AJg4ceLNavP3909PT3e/dWkv8Pj4eCl99Xr9LpcvXwaAVu8FCCGPPvpoZmZmaWmplHJ7N0xy6dKlRYsWJSUlffDBB3/729/a9i01NfX999/PyMh45plnpBt5nl+xYoXD4Rg7dmxoaKgrctGiRdJfDAbDb5HAJycnu1+pVqt95ZVX/vSnP2EajxBCyGMMAQBwOAWgIPC0tslR3WAjlFIgogiNZgdLqL+PQhApBeLvJxdF4EVR5EEmY6LD/TR+cr3RqlZxmMAjhBDqUkZ7vcf3UqANdmO4T6QH9/bt23fp0qXvvvtuVlZWdnZ2cnLy5MmTJ06cOHLkyLanu/3yyy8AEBMT43FXJaIolpWVZWRkSCvGFy5c6N3626qqqgKAlsmwRCrR6/VdEQYANpstLS1NFMXNmze7BtJbefDBB7OyshYsWJCcnDx06NCgoKDCwsKqqqpJkyZ9/fXXHjzsbXXJxMLKysrly5f/9NNPX331VXBwcFc0gRBC6J4n5xgZy/CUmh1Og0lstNjNdkEhIz4KlgAYjHanAP6+CpWClXOEY1UMJQ5RMDY7tEE+QX5yhYyxOwXArewQQgh1MSsvbW9GATwZv7TwnmzMLlm9evWgQYM+/PDDo0ePnjhx4sSJE6tWrfL19R03btzChQunTp3KsqwUWVpaCgBRUVEetHKz0dwpU6a8+uqrna//FiilUlIdFBTU6pKUaUpXvRsmee21186cObNx48Z2V7+7aLXaHj16GI1G16R1QsigQYNanq7nRe4m8D/88IM7YU6nU6fT7dix4+DBgz/++OPSpUs//fTTTnQPIYTQfS3EX1Hf7KhttPurWGMTYQgQQihQm0PkOCbAl4sKVSlYrqHZHham8lNxtSYHx1r8lDKGgSYbHx6oVMrZ7n6ILmS011ear9VZqymFCLU2TBkeIAs0C2aBCnJGrmJV0lQ4CpR49JkSIYSQO/xk/gDgWfYOAOrrt3tozpw5c+bM0ev1eXl5eXl5e/bsuXr1am5ubm5u7oQJE7KzswMDAwEgJCSkpKTEs/3PW54DDwAKhSIxMXHq1Knz5893zbnuTP3uuNnk7lZnv3krLDMzc8OGDXPmzGm7mXxL+/btmzJlCsuy7733XmpqanBwcGFh4V/+8pc1a9bk5+fv2rWr7VSITnI3gZf2GHTH1KlTX3/99TfffPPtt9/OyMhYsmRJUlKSp91DCCF0X+NY4u/DRYWo/H0UwX7KI5drm8wOQeDkMmAoCVGr1AoZyzBNLBPgKwtWK4LUiohABS9SAAjwIWoVp5Ddg/Pn7YLdwpsbHMbLjZdOGo6YHCYgRM7I+gclqjl/OaMwO81W0RqsDO4f2F/OKh2CgyWsvzzAXx7Q3X1HCKF7ULAyxON7OYYLUGhuH3c7ERERTz/99NNPPw0A1dXVJ06cWLFiRV5eXnp6+saNGwEgPj7++PHj0kT3m9m7d299ff3gwYP79u3bsnzHjh3Dhg27dQc6U/8tEELCw8MrKirq6+ulNxEu9fX1AKDVar0eVlJS8vzzz8fGxm7YsOHW3Vu8eLHNZpPWwEslI0aMyM3NHTFixN69e7/88stnn33WzSd1U5dMoSeE/O1vf/v2228LCwv/+c9/fvTRR13RCkIIofsBAWAYopSRyGBFjMmntIoqZJyfkuEFyjIgitQhCAAg4xiFjFEA+CpUdl4UBCrnCMfeg9l7lbnyYoOuxmq4YNTV2Q08FQQBGBCAZY5UHVIwchkrBwEcxAEizTccCVdF9g3op+KUkb49CBC1vFPjPAghhNoaEDSQAKFAPZhEHx+YIGM8HKSdMWNGcXHxtm3bWuXDYWFhjz/+eGJiYkxMTEZGxvr16xUKRXx8PAAcPXr0ZrXxPD9jxgyTybR37173E2yXrqtfq9VWVFTU1tb26dOnZXltbS3cSLm9G3bw4EGTyaRWq8ePH+8KqKioAID169dv27YtMjJy+/bttbW158+fl8lkTz31VMuqpJJTp07t3bvX6wl8V32yYRjm+eefB4CLFy92URMIIYTuYVaH0GTlLXbBV8mFBShrmxwNzbyfQjYgKiA5TjMwWhMbqWYZUt1ob7I4wwOV/qpfP/0oOMZHwd5j2Tul1CE4qs2GEzVHjhoO5lcfqbKUW3irU3SI4OBB4AWnXbCaeXOjw9gg1Nt5i4VvrjCVXzZd1BnP1VgNFxoKO7PNEkIIoZsJkAfGBfYH8GQS/YNhIz1uVy6XFxYW5ufnt3tVq9VyHCcIgnTaXFpaGsdx27dvP3XqVLvxBw4cMJlMSqVy5EhPutR19cfGxgLA4cOHW5VLB6q73gV4NwwArl27lt+CtDy+srIyPz//3LlzACAdRCeTydrOk/f19e3QM7qvCz/cSO9gLl261HVNIIQQuvcIAi3WN1+sMJ24XF9Ra7HaBZWcDQ9UhgbIIwJVwf7yULUiwEfm78v1DFZFh/nGhPuGBShuNlWeUmqx801Wp90p/MYP4kUO0VHS9MulBt2x6kMFtfl19lobbxMpBUJFkVKQjuAFAKCUgkgFUeCpwIMoENrkMF006k7V5hfWndUZC6uthga70Sk6u/WBEELoXjM9JtWDuyJ8tA+FP+xxo9Lecm+99ZbVam17ddeuXTzP9+7dWzpMrl+/fgsXLqSUvvjii9Joc0s8z0tnvE2bNq3VqeZu6rr6pdnp0ql1LqdOnSorK0tKSnKd+ubFsHnz5tE2li9fDgCrVq2ilEo79gUFBUVHR1sslp9//rlVn3ft2gUAt1134IEuTOClnf3a/vAQQgihW7hU1Xyy2HiquMHQYCutbi7WNzMM6RGk7BnsE6f16xnsY7I6m6zOiEBVr1DfyCBVsFqhkLW/U50gUn2Dva7JcfFaU3WjvdZk/42fxStEEPMNx/LKfvi2NOtY9eFaW53NYeUpT4AQ6bA9CoRQCpQCUEp5ECgVBSoSKgIDvMjbqa3OWl3RfPVszZkfr+YeMxy6aDxfa60WqdjdD4cQQveIvgHxoyPHdegWlrBz4+czxPPNVhcvXpyQkHDhwoWHH374+++/l0baAaCpqelf//qXlKkuW7bMFf/WW2+FhYUdO3ZsyJAhW7ZsqampAQBBEE6ePDlhwoSCgoKQkJB169Z53J8uqn/SpEkxMTEHDx6UDq4DgIaGBunpXnzxxS4Kc5N0uvu8efOkAXwAsFqtf/7zn3fs2BEcHDxr1qyOVnhbXbIGXlJeXg4ArZYWIIQQQrdQ3+wo1puu1VnUKs5spwIVqZranQIhcpaAn5KTc4y/jwwAVHL2tge8N5gd1+osCjmjVnG1JnuIv8Ji530UXfh/n9cJonC89tie8u9rHdW8KFAQKaVAgCGMKO0uL6XvQAEIAQBCASgAEKAiA4SKlBBRpDwj8oLtqvmKTbRWNl0rqDkZogrtqe41LHRESCf2XkIIIeQyO+6ZamvVpYYL7gQTIGlx/xkfmNCZFn18fDIzM1NSUgoKCh577DEAiIiIcDgc0n5sLMump6f/8Y9/dMWHh4cfOHAgJSVFp9PNnDlTKjEajdLW61FRURkZGeHh4R73x7P6zWZzXFxcuxV+9913cXFxhJDs7OwpU6akp6d//PHHvXr1Onr0qMVimTdvnrRqW+LdMDctXbr02LFjW7duffjhh7VarUajKS4uttlsvr6+GRkZroX3XtSFH2KkdQU3+2EghBBCbVXWWYurmhlCWIbhRdpocSrlLCG/Jupyjrlt3u5id4oAEOgjBwCWMIYGm5+S8/FkYmC3qbEZCgzHa+x6XhQogAgiUMoCIZQBEOBG/k4ooQAAVKQUACghQAgDIAIwFACAB54FxkGd9Y46hoIIYp2j7mpzuY23/S5qii/XVUv1EELo/sEx3MsP/On/Xfz3cUPr9dWtyBj5M/0Xdmb1u0tSUpJOp/vss8+2bt1aUlJSXl6u0WhGjRo1cODAJUuWtM3F+vXrd/bs2S+++CIrK+vs2bN1dXVarTYuLm7MmDFLlixRqVSd7I8H9VNKb7Z3vetQt6FDhx46dGjZsmUHDhy4evVqTEzMc889l56e3uo0OO+GuYNhmC1btmzbtm3Dhg06ne7KlSsJCQkjRoxYuXJlV2TvAEB+XTbnVQaDoW/fvmaz+Z133pFWC9xRdDrdgAEDACAlJaXV+geEEELdhVJ65GL9uSsNChkrUNEpiA1m56DowEcGhPopPXnjrG+wVdRaQvzlLMNY7HyTlY+N9Av0lXu9512EUnqpQZdbtq2k6bIgCuR6Ag9AiJzIWZYjwDAAokh5IgiCU6CUgCBQ16nvFBgClFAQqcAwUt5PWAJERmRK1gcoqGSqKb2mDg8f5cGnFoQQQu06XXNiW2mmwaJve4kAGRL64Iw+s8JUEb99x9A9oEtG4E+ePDl79myz2RweHr548eKuaAIhhNA9xsmLFyubrtY2N1occhlhCMsQqlbJtMEqz7J3APBRsOGByupGO8cQpyCGByrvrvnzAOAUnQQYQhlKnZQQAAIUAIAwxI/z08iDOYY18+YGh9EsOBWsXBAFkThABCBAgFARgFAChGVBpFSklDIiABBgBMrzlBd5ocJ8Nc5RH6QI7uZHRQihe8WQ0AcHhQwrMV0+W3tab6k0OU0cYQMVQX38Yx8IGRqiDO3uDqK7mLufYyZOnOhOmNPp1Ol01dXV0pdvv/22n5+fh11DCCF0P7lS3XzyF2OT1SFQMJkFlRK0GlW8Vt1Pq/a4TrWSoxQIIZRSliEaP7n70+/vBIQQGSuXszIlo+KpUwQKlBKGcISlFGy8nVNwLMPaBIcg8hSAp05KKQGgBABApETa3I4AEQglIjAEqAiEoU7RIWfkHJH5yfzsvK3WUo0JPEIIeRFDmNiAfrEB/bq7I+he424Cv2fPng7Vq9FoNm7cmJKS0vEuIYQQaodIRafolDFcZ7arvWNRSuubnZTQCI1SS0md2Wm28UH+8vgeauVNdph3ByEkwEfmr5JRabf2u1CALLC3f58gZbCurrDOUS+AA0RCWOApz4gOlmH6BSSEKMMuGs87BCcvOsTra+MIAQCGAr0xM54CEKAMoQAgUmCIjbdplIGRPj3UikABRJGKDLmb3m4ghBBC9yF3E/jf/e537oQRQoKDg4cNGzZ37twuWrWPEEL3oVpr9cVGXaO9QcZy0b6xsYHx99iKZQdPTVbB7hB9ZJzal7PxtMnm5BjGYufd2W3+1siNFeF3I1+Z7wNBg6vM14IUIUerf66xGBiOkREFT+0EwCZaCSEJmiSHYLcJtgankaEAwIC0Hz0VKaEADBUpkTa5EyiwAAwDFEQQmp2WemdDBIn05Xwxe0cIIYTufO4m8Lt37+7SfiCEELoZk6PxkP7A+fqzJruJ5bievr80801DQpO7u19eY3eK1Y02m93ZbOMbzA4FxzqpoORYp1O8VmcVRRqhUbF36QB6p/nJ1RbeHOnbwyJYe/tFO3ibSCkQQnlRwSmdolBpqaAADMOyrEwlKO2iE4BSoCzDsQwrUlFOZBbeylOnSAhDgFAKAlAGgBCnaK9prmr0idQocf48QgghdBe4y/byQQih+1BJU/HZ2oImRxMhgt1hK7KftfO2QEWQ1jeSY+Ts3T+jvrzWcrmySaWURWhUTRZHo8XJCzQ6WBXir1Ap2Cqjzd9HrlZ5/z8spyA2NDsdgsgS4qfiPN4qz+sopRSoNCROgIT7RFp5i6/Mj4LYaG+othh4gQdCVKzSX6724XzVcn+GcCWmYhvhFCzjEByUCkqiDFBqrE4LT+2EUgKEAQoipQwwLCFARaAECCXUaGswWKrUAZ7vNYAQQgih38ad8mEFIYTQzdRZqpudDSIRKAWbYBeoUNx0eUvx1/EB/dWqQH/Ov7c6JlChuUsz+as11l+qTFeqmxUyDijlKQT6yP19ZAF+Moa5vhubIIpeb1cQaXWjvareSghQCuGBSkrBa68JBEGor6WmJuBYNiSM+Lp7yrpAhXpbrYW3AICCVQQrQ2SMHABUnA9DmD7+sTWWqmZHc4PDKCdyOaP0ZXzlrFKjCEoMGlhlKb9Yb3VSnhCi4vx8WFW0X/SV5hKzkwqESofPAUsIpZSK0tJ4ESgBsAvWJmeTU3TKGJl3Hh8hhBBCXQMTeIQQutP5KvxEChbeRgnlQQRRFHnb5YZLV5pKfOU+Mer48ubS4WEPR/r0uOsWxlsdgqHRcrXGanNSB883WXmWQJBaKZMBAaJvsIeoxR7BPjK2Y8uzb2zjdqvvhsXOV9VbVXLW30fmFMTqRruMZbyTwIuio+Qyf/ECOO1UFJmwCEXSYEajcefWOltNiamYBYYQhqe8QEWtbw8CpM5W2+xsKjOVqmUajjCBiiCn4BSpWOuolXNKFasy2usD5ZoAZaCVtxNCZITt4Rsd7BNmFQxErA8AACAASURBVOyNrLHJ0eQAG1DpEHlKrm/MT4AKKs7XR+7LEZbHBB4hhBC642ECjxBCd7q+6lhfuV+zs4G/fgA4UAoCI1BR5G38Rb6QAWJyNAYqND7c9ZFekYomR6NdsDGE9ZOpVZyqOx/gJix24Vqdudbk4GTElzLNdhFA5AVgiKiQMY0Wp1rFhfgrFTLWR+Hu5AJKocHsMNsFSqmcY25xbpwgAgDIORYAZCwDBHgvjfOLjQ3CRR1fViI2NdNGEzAgVF7zS5sLt9slTqSilbdyhAtRhRIgRns9LzptvA2ANjubDGa95f+zd+fRepXlwfCv6x729MxnHjIQhjCLDCpTq2KF0uoqKlJFV7VUu6y11kVKrdSu16/Lrupy+Bze2tK+6Eo/fbsKFCnQunglRVARAQlDSJhykpPkzOc8457v4fr+eCAvhhBCEmrQ/fsv+7n3vfc+J2s959r3fV2XDre2tiQ2L4tSVdYSHYYqTE22kixHJmwlrUCUe1noO0FV1jlDY1XAPe4NhjpejPYoMEiEhP22coAAjOU2HZRDgShJ7hyRxy8UCoVCofDKKQL4QqFQONoNeiPj5cmFeJaRtQgA0F8+JSKDNtHJrnDHM52J8dJkfzwBLcRzuc3n4lkAGA8mhvzhkij/Ah/hhaJUzzSTJ2d6s820HeeBI0sOByApmCcFB378mFfx5WjdLXny4DcWtKM8TPViJ2OIxlpjaazusf0VwHMEG617zV7OUOTGkqUj1SLexqFaXrIzM6bTRiAimz90fzS+qvTrbzrwiYYMAHBk/ar5HDgAENjc5HPxrKI8VFGio8zEBCY2sSWqu1WHOQ+1Hkzz6Nja+oqpSyZXkmXJRN2pK9IKVVVUj62s62TLYJSinIgQAQgAgCGzAL70GGMCiz8JCoVC4cgh0tM71CObzcKc7bRROqxWF8cdL19zJqsf1J6sQmG/im/rQqFQONoxRA6cCCwBUD8rHNECMCCwFrGdt7b3nhnrTp5YPani1BId5zZvpstD7rABPZ/MCiaPtgB+ppk8vLPdi3UvyZW2K2nqSlYrObWSGKw4Ew1/bMAbrngvKyeACKLMLHazoYrDGHZjZSylygTufr7sfIe5kg9UnIV2CgBjDa8eHJklaHR9Wl4yrZX+LwosQaelfriJzj0fnQNdQjLJkWc272Ydxliso5pbd5irrFJWdVV3KVkcCUaX4uWcskQndbeam1yTaifNzKaZyQQTPi9L0UVkbdWJVNjLe9J3EFjDHUp13smXclL9nvAM0EFnSAz1VM9aa0jzIoYvFAqFIyF/5KHklhvN7Mw+x7P7fgT/e6PzunOD37mcDQ3/Qu6t8GpXNH0tFAqFo11mcq1zDhwREaG/qEuMiAgtEqAxtBQt3jf7o8dWHolUlJp0Lp71hK8oT3QSqyjWUT8t/ChBRNOL0Z7lJMl0yRe+JyXHks9Hau74QGmg5A1V3aGXGb0DAAEQEUfsL7kLzgDgxfbFI+Jw1R2ouMeNlU+YqIw3fEceme9EPjBAAGgtERABMGYJTBzl2596yXMHveHJ0qqqWyvLynhpsu4OCCYCUSrL0o7OM7GOU53VvcaQM+RzL9ZZRdYFckdIBNwTTney1kq66POgLEsOyrKo1L163ak3sxVls1h3DQDrd4knIAIBPGP5Yro4H8+mJjsij18oFAq/0rSONv6v8BtfeWH0/iyi/P6fdP762vyhB47gZW+88ca3v/3tJ510UhAExx133MUXX/z1r389z/MXG//d73738ssvX7dune/7a9eu/Y3f+I0vf/nL+x0/PDyMLzAyMvJrv/ZrX/ziF5VShzP/448/joiVStEG5WUoAvhCoVA42nXzTitvabD9nc9kkSFjFhAQEcFahsyiWUzmf7r448eamxfjeY58urNjOVva0ZuajWbbWSvW0S/6OZ6lDe1cTBc6WZYbAnA450S1knP6moEzj60fPxqsHQmGqu4h9H1nCIKjNrabqDgzUaYB4AAb4xGh5PJG2akFkjO0R+oVB+Ni9WpwHAALCGiIAWAY6t07KUkOfKov/InSqkFvaMAbHC9NVp0qAFgyDncb7qDHXUu2JAJP+gPuUNWpCsYJcMSfqLn18WDCE8FJjVPXVY89rnrimsoxg97gCdX1qUkV5alOkAmwGhH7NemBMKUsznq9rLuULER5eISev1AoFH5VGdP7n1/O7r3nJQdSloX/+D+zH999+NcMw/CCCy644oorbr/99oWFhXXr1rVare9///sf//jH169f/9RT+747XlpaevOb3/zOd77z3/7t33bu3FmpVGZmZjZt2rRhw4aTTjpp27Zt+73K+Pj4Mc9ZvXp1s9n80Y9+dM0117z+9a9P0/Tw5z8Y27dvv+KKK0ZGRnzfP/nkkz/72c/u943DkR32fBs3bkTEv/mbv3nhRz/+8Y9/53d+Z926dZVK5eyzz/7Upz7V6XReOOz++++/7LLLTjzxxFKp9JrXvOaqq67auXPnQT388xQBfKFQKBztpjpPrSRLABYsEAHjAEjEODAgJEROYKM8buetPeHuzUsPzEUzjy0//GRn24ML97fSlbFgLNZRK2v2u4v/Yp+FiBba2ebtK/OtNMz0fDPZvRwnuZEcGwE/ZqS0ajAYrXuHnI4+UHbGG37Vl71EDVfdii8OZl29l6iZlXhmJZ5tJv2w/zB5rz8fK3XgHI0hsMAYcqGffDLf+cxLboXgyMuyUpHVfk14ImpmK0vx0prymtMHzxjxRjKbr62sO3v09Q13oJf1Onk7VuGgNzzgD501dPYxlXU12VCkYh3XnYZgTqTDVtYE4GgVABpSFgiBgNncqNxmmU46WTs28eE/eKFQKPwqi274ttq25WBHE0X/e6Pe/vRhXvQjH/nIvffee+qpp/7whz9stVqPP/54s9l87LHHLrnkkunp6fe85z1Z9n83WMVxfNFFF/3gBz+YmJi44YYbFhYWFhcX0zTdtGnTOeecs2PHjssvvzyK9vPG/7bbbtvxnF27dsVxfP311/u+//DDDz8/oD3k+V/SI488cuGFF954443dbnd0dPSJJ574q7/6q4svvnifqPvIDnu+bdu2/fEf//F+P/r85z9/4YUX3nrrrXEcr169euvWrZ/73OdOOumk3bt3P3/YV77ylfPOO+/f//3fW63W+vXrp6amvvWtb51yyim33HLLy/pRFAF8oVAoHNUMmdlkTpHqZy0zRGuJCBEJARkif7a2OSKBtipV6a5weiGdX0wWYtXLbGas9ViwnC5Nhzt296aXkgVtj0CMemgyQ9NL4UqYAhIS5JbS3FgAS8QFA8D9Fpw7eK7kYw2vUXZOnKyO1r16ad+cc0vUidXOxfC+J1d+vG3p0enOfCtpR2qula708rlW0uzlmTrccvR8ZMx966WsPkjSRcchKclqs2tn9v3vqfvvBX2wP39DZj6Zmwl3L6bzoe5ZS+sHTl1bXjcZrPKEb6xu5iu7w+mFeC7SYaLihWR+R29Kk6qIyoA3sJIt5zpdiBd6WSc1cWxTTcYSAgARWCJgFOs0NTkiY/Aq60FYKBQKRxU99Ux293+9zHN09O1vvmiu10GYnZ39zne+47ruf/zHf1x44YV7j5922mm33HLLKaecsnnz5k2bNu09/rWvfW3Lli2nn376/fff/+53v3tkZAQAhBAXXXTRnXfeuX79+q1bt371q199yes6jnPVVVd9+tOfBoAbbrjhiM+/DyJ617veNT8//7GPfazVau3cuXPr1q0TExN33333l7/85Vdo2PMlSXLFFVfs99XD5s2br732Ws/zbr311oWFha1bt87Pz1955ZXz8/NXXXXV3mFTU1Of+tSniOif/umfFhcXN2/evLKy8ud//udJklx11VUzMy+ScLE/RQBfKBQKRzVjTStd1lYDEFB/yR0ZIQLnwBlIAAJAQg0oBBPz8fz29tNL8UJq4khFvawzHU7NRbt39qZ2tp95tPnwD/bcee/sPXuiXdkvIuc5SXWqjDLWFazkSUcwV7Kyx48ZKVV9qfSL/hFjLXVjtdLLOrE68F53zrDsiYovXriMby0ttNPN25vff3hh06PzP9iy+F+PzN+1ZfHJ2V6j4gxWnKovF9pplO4/o+/gYansnnqa94bz+dAQSo+spTSFsJM/sS26/ebke7eZmd2Uv/TPv521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n9+5c6ekL33pS6UtpU74F198cceOHcdRzw9+8IPSgwsvvHDulp/61KcOzoH3m9/85jjOBQAAUEKABwAkwFVXXdXc3Nzb2/vss88euj2O45///Oc60vj50vR1uVzuuuuuK20p3QYv6cEHHzz6MkZGRp577rkbbrhh8+bNpYOcccYZc+9SU1NzcA68lStXHv25AAAAPoQADwBIgCAIbrrpJh02F/0zzzzT19e3aNGiyy67bLZ94zgu3eu+YcOGVCpV2nj++eefeeaZmjPA9/b22p+qr6+//PLLS0vWLVmy5Pvf//6JeHEAAABHhQAPAEiGg6PovfcHNx6cf36O8fNPPvlkb2+vpFtvvfXQ7aVO+Ndee600O/3Ra25u/vrXv75t27a2trZj2hEAAODjCMtdAAAAR2XNmjW5XG7Pnj1btmz51Kc+Jcl7v2nTJh0yHv4jlcbPt7S0nHPOOYODg4ce8K677pL04IMPfuc73zl8x1wu99vf/vZDG1taWo44cR0AAMDJQIAHACRDGIbr1q37t3/7t5/97GelAP/CCy/09PS0trZefvnls+1VKBRKIb+/v7+lpeUj28wW4FOp1BHnqAMAADhlGEIPADjpSuPbC4XCHG0OPuvcrN9NpZ72hx56qDSK/uD4+Tl22bx589DQ0Nzlvfnmm6+++urcbQAAAMqOAA8AOOlyuZykuW81P/hsc3PzbG2uueaahoaGnp6e3/3ud5KOfvx8XV3d9PS0P8xLL71UanZMc9EDAACUBQEeAHDSXXzxxZL6+/sPBuYP8d7/8pe/lNTe3t7Z2TnbcVKp1Oc//3lJDz300CuvvLJjx45cLrd69erZ2k9NTT366KOS1q1bl8lkDm/wiU98oru7WwR4AACQBAR4AMBJd+uttzY0NEj6whe+0NfX96Fn4zj++7//+6efflrSt771rTnmk9cho+hL68nddNNNQRDM1viXv/zl+Pi4pC9+8YuztSlNbv/OO+9s3br16F8RAADAqUeABwCcdB0dHffee6+k7du3d3d3/83f/M3DDz+8devWzZs333333RdddNEdd9wh6brrrvv2t78996HWrl1bV1e3a9eu0hrs69evn6PxT37yE0m5XO7aa6+drc3GjRtLD+iEBwAA8xwBHgBwKtx888333HNPS0vLxMTEP//zP2/YsOHSSy+9/vrrv/nNb/7hD39wzt12220PPPDA3N3vktLp9I033ihpdHS0vr7+mmuuma3lyMjIr371q9Kpw3DWVVcOHUV/6ArzAAAA8w0BHgBwinzlK1/Zvn37P/7jP37+858/77zzKisrFy9efPXVV//1X//1K6+8cv/995fmujuig7PW3XjjjalUarZmv/jFL2ZmZiR94QtfmPuApU74np6e55577mhfDAAAwCln9DYAAAAAADD/0QMPAAAAAEACEOABAAAAAEgAAjwAAAAAAAlAgAcAAAAAIAEI8AAAAAAAJAABHgAAAACABCDAAwAAAACQAAR4AAAAAAASgAAPAAAAAEACEOABAAAAAEgAAjwAAAAAAAlAgAcAAAAAIAEI8AAAAAAAJAABHgAAAACABCDAAwAAAACQAAR4AAAAAAASgAAPAAAAAEACEOABAAAAAEiA/w+AlhQRYaqWugAAAABJRU5ErkJggg==" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdZ4AcxYE/7OrZvMoB5RxAgAQcIhtMNlgkiYwBEc8GIwzmjAEbY8vA+Y/xGRyOA/yCwSZjwZEzmDMimRxEUAaUkFBOG2b6/TDn8dwm7Y5WrJp9Hvgw013dXV3dO5rfdHV1FMdxAAAAADZvqbauAAAAALBhAjwAAAAkgAAPAAAACSDAAwAAQAII8AAAAJAAAjwAAAAkgAAPAAAACSDAAwAAQAII8AAAAJAAAjwAAAAkgAAPAAAACSDAAwAAQAII8GHChAnRPwwdOrSxYieccEKu2BZbbJE/K6qnW7ducRzXX8mf//zn+oVPPvnkJqp32WWX5Rfu379/JpNp5u7U16VLl5133vnEE0+8/fbbG6xhG6qoqMjV85FHHmm3dSjMMccck6v52Wef3dbV+YpI7vmwmdCAX2EOLgC0CQF+k1i+fPm0adPqT3/ppZdauqo77rgj/+38+fOff/75giu2cuXK11577Y477jjppJO+9rWvvffeewWviqZdeeWVuW+3u+++e1tXB2jXfCIBwFeDAL+pTJ06tf7Elgb4l156aebMmXUm3nnnnYVX6/+u/PDDD1+7dm2rrA0AAIBNSoDfVF588cU6U9asWfPuu++2aCW33XZb/YlTpkyprq5uzuKlpaU75Bk+fHhpaWl+gdmzZ1966aUtqhIAAABtQoDfVOpfgX/11VfT6XTz11BTU3P33XfXn7506dInnniiOWvo16/fm3lmzJixevXqa6+9NoqiXJk6XfQBAADYPAnwrWzkyJHZFzNmzFi0aFH+rFz/+V69enXp0mWDq3r88ce/+OKL7OvS0tLcmsNG9KIvKSk577zzTj311NyURYsW5bbStKqqqhtvvPGwww4bMGBAeXn5oEGDvvGNb1x00UWff/55Y4v87W9/+9a3vrXrrrv26dOnsrJy5MiR++67749+9KMFCxa0tObN3/rUqVPzx+2rqqqqU2D33XfPzb3yyiubX4dW3J2sTz/99Ec/+tHYsWN79OhRXl4+ePDgo4466p577mlifMHFixf/+Mc/Hj16dIcOHXr27Ln//vvfd999hW0954knnjj99NO32mqrLl26lJeXDxgw4OCDD77mmmtWrlxZv/CyZcu+mWfu3Lm1tbW/+93vdt11127dunXv3n3PPfe86KKLVq1a1dJqFNAaBRyRAk7jfLfeeutee+3Vo0eP7J5eeeWVzewOk2/atGnf+c539tprr379+nXs2HH06NGHHXbYr371q9WrV2/8ns6dOzf/AK1Zs2b+/Pnf+c53Bg0alD243/rWt954441s4WXLll188cVbb711ZWVl//79999//5tvvrlOg7///vv5K6ypqfn8888vuOCCYcOGlZeX9+/f//DDD3/ooYda2gihoCPemAKatPlb3/gWaP7hW7RoUf7H1/vvvx9CePDBB/fcc89OnTo9++yzha22mTbyiJx//vm5mqdSqfrVmDlzZv7evfzyy4XVEwDatbjdGz9+fK41hgwZ0lix448/PlesZ8+e+bPy23PixIlFRUXZ1/fff39+sUMPPTQ7ffz48V27ds0tctJJJzW4xeOOOy5X5tBDD7388stzbzt06LBmzZqCd+ePf/xjfp2nTp26gTaK49dff33w4MENnkJdunT53e9+V6f8ypUrDzjggMbOutLS0t/85jd1FikvL88VePjhhwve+gsvvJBfYP369XU2tNtuu+XmXnHFFc2pQ4t2Z9KkSY2VfO+993LF/uu//quioqLBYrvtttv8+fPrH4WnnnqqR48e9cv/4Ac/OProo3NvzzrrrMaOYx3z58/fe++9G6ttt27dst/d8y1cuDC/zEsvvfS1r32t/rIDBw585513mlmNAlqjgBMsbvlpnH8+3H///RMmTKi/4KhRoz7//PNm7mZtbe0ZZ5yRSjX8y2mPHj1uvfXWjdzTOiNTPvXUU927d6+/1L333jtt2rR+/frVX+cBBxxQW1ubW2GdP6h333134MCB9Zc65phjqqqqmmjAOn/UBZz/rdWkLd36xrRASw9fnb+v99577+c//3nu7dNPP13AajfRJ1L9g1tnkJebbrqpziLXXXddbu7AgQMzmUxzDjEAkE+Ab+UAP2nSpB122CH7+gc/+EF+sZ49e2anX3311RsM8CtXrsz/LnXLLbd8+OGH+Ru68847C96dW265JX9V06ZNa7qJ3n///Q4dOjT4xS7nrrvuyl8k/9eHBhUVFT311FP5izT2Xb+lW98UAb5Fu9Ocr8v/9V//1fQKR4wYsWzZsvy6vfXWW419vQ4h5Ie0Zgb4zz//fNCgQU1XI4qiW265JX+pOgFjzJgxjS27xx57NPMLegGtUcAJVsBpnH8+jB49urGlJk6c2JzdjOP4kksuaboCxcXFuZBW2J7WCfCdOnVqcKnOnTsPGDCgsXX++te/zq2wzh/U9ttv39hS9T/KGvuDKuCIt2KTtnTrG9MCLT18df6+rr322vy3uR3ZHD6RGjy4+T+QHXXUUXVaI/+fp+9///vNOb4AQB0CfOsH+Ny3pd133z1X5uOPP86VmTp16gYDfP5F8pKSkuw3p+222y438bDDDit4d84888xcmeLi4urq6qabaMcdd8zfx7333vuSSy45//zzt9hii9zELl26fPrpp9nydfp57rrrrpdccsmVV1552mmnVVZWNvb1rrHv+i3deqsH+JbuzuWXXz5q1Kjc7zUhhPLy8lGjRo0aNerjjz+O43jWrFn5UXy77ba7/vrr77333nPOOSfXfSOEcPrpp+fX7cADD8yvxsCBA48//vi99tqrzsCEodkB/vDDD89fatCgQWeeeebFF19c55p8ZWXl7Nmzc0vVCRhZW2+99fjx43feeec60+sEpwYV0BqFnWAtPZHqnA9ZI0aMOOKII/L/ErM++eST5uxp/vATY8eO/dGPfnTDDTdcdNFFffr0yU0fMGDAxuxp/WdDdujQYf/99z/44IPLyspCPVtttdX48eO32mqr/IljxozJrbDOH1RuqRNPPHHXXXfNP0ZRFL3xxhv5u9zgH1Rh539rNWkBWy+4BQo4fHX+vnI/zGV3M/sHtZl8IjV4cH/4wx/mJnbu3Dn/H5eamprOnTvn5r744osbPL4AQH0CfOsH+NwN6qWlpbn0eOutt2YnlpWVrV+/foMBfv/9988VGDduXHZifi/60tLSpUuXtnR3ampq/vM//zO/u+no0aObbp+nn346fwevueaa3KyFCxfmh59cD+Sf/vSnuYkHHXRQ/tpy7RBCGDp0aP6sBr8OFrD1Vg/whe3OFVdckZu122675c86//zzc7O23XbbdevW5WblP3egqKgoFybrtMOZZ55ZU1OTnfXyyy/nt0NoXoB/88038xc56KCDVqxYkZv7//1//1/+SXLuuefmN3v+gmVlZfm3itQZnaHBfux1FNAaBRyRAk6kuF6Av/7663OzJk+enD/rscce2+Ce3nXXXbnyW221VX439blz5+ZHr1mzZhW8p3UC/LBhw3K/v7z77rt1OnFcfvnl2VnpdDp/aIzS0tLcCVY/vuaWiuP40Ucf7dixY27W4Ycfnl/JBv+gCjjirdikBWy94BYo4PDV/4HskEMOee2119auXVtVVZXNw5vDJ1LcyMF9/fXX8yv/7LPP5srnN6P+8wBQMIPYtb4999wz+6K6uvq1117Lvs7dHLjTTjs1eB0s37x585577rnc22OOOabOi+zKp0yZ0vR65s+fv3OerbfeukuXLuecc04mk8mV+dGPftT0Su6///7c6zFjxuR/1evdu/f3vve93Nvnn38++yKVSh36D/kFQgj5SenTTz9tetOFbb3VteLuZOU/XODSSy/N/x584okn5m7BSKfTt99+e/b17373u1yZESNG3HDDDcXFxdm3u+666y9+8YsW7E8IIYR77rkn97qysvJPf/pT/sWxM84449hjj829vffeextbz4UXXpj/m9Hxxx+ff3U6v+NJYwpojQKOyMafSCeeeOJ3vvOd3NtLLrkkv0N+nTtcGpQdkCxr8eLF8+bNy70dNGjQz372s0n/kBt6bePPvcmTJw8ZMiT7evTo0fkDFowcOTL3559KpfI75lRXVzc2tuX++++f/+zJb37zm/kXXR988MHly5c3VpmsAo54Ywpo0o3fevNbYOMP3y677PLQQw+NHTu2oqKitLS0pKSkVVZbRysekR133DF/vNVHH3009/rJJ5/MvT766KPzu04AAM1X3NYV+AoaMGDAoEGDPvnkkxDC1KlTs9+Yc4+F32OPPTa4hjvvvDOXsUtKSo444ojs66222mq77bZ75513csXyv3PXl/8LQoO+/vWvn3DCCU1XJn+g4COPPLLO3FNPPTV3k22uW8Fll11Wp1htbe2cOXNef/31/AGZmqOArbe6VtydEMLcuXPzB2feZ5996hTYe++933rrrezr3O8++RevzjnnnDpDdp188skXXHBBg4PGNyZ/hccdd1yvXr3qFJg0aVLu8ubChQtnzZo1bNiw+uvJ7yqSteWWW+ZO0TVr1jRdjcJao4AjsvEnUp0xw0pKSoYNG/buu+9m325wT0MI3bp1y71eunTp0KFD99hjj0MOOeSQQw4ZM2bMhRdeWH+RjT/36tzXkL93Y8eOzT+RmvkXdM4559SZcvbZZ+fXc+bMmWPHjm1s8cKOeGNa2qStsvXmt8DGH75JkybVD7qbwydS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m8hdDdahsN1Zs2ZN/o3rWbmvy+l0+oILLmisX3rnzp3rxOas22+/vcFnj48fP/6II47IvW1mgI/j+NNPP23ijuUePXrcf//9dRbZFAG+pa1R2BGJW34itW6Aj+P41VdfrX9W5Bs6dGh+h5oC9nRTB/iHHnqofqePEMK//uu/ptPpZjZgYed/qzRpAVsvuAUKOHzNCfCbySfSBgP8b37zmzrrmTp1ajMPKwDQGAH+/1izZs2111574okn7rbbbltssUWnTp122GGHo4466ic/+cn8+fMbWyr/C0p+gL/gggvyZz333HO5WfUD/NKlS/MvD55yyilNVzX/rsv8L0abKMDHcbx69eprrrnmgAMO6NOnT2lp6aBBgw466KDLLrts2bJlDRaePHnyjjvu2KlTp27duu27775/+tOfsr8ynHHGGQf8w4QJE3KLNP11sEVbz7rrrru++c1vDh48uLy8fPDgwWeccca0adPiOD733HNzFajzrbSxOhSwO3Ecz5kz5/TTTx86dGhZWVl5eXnPnj0//PDD/ALvvPPOOeecs80223Tq1KmysnKrrbY66KCDrr/++vzrZnXMmjXrvPPOGzlyZEVFRbdu3fbaa69bbrklk8lMnjw5V41rr722scUb9Mgjj5xyyikjR47s1KlTaWlpv379DjrooGuvvbbBamyKAJ/VotYo7IjELTyRWj3Ax3GcyWQeeeSRE044Yffddx80aFBZWVnv3r3Hjh175JFHTpkyJduleWP2dFMH+PXr17/99tvHH398tgH79u175JFHPv300w3ubNMNWMD53ypN2tKtb0wLtPTwNSfAF7DarNb9RNpggJ8/f35+zyD95wGgVURxSwb0AqBdmTp16p577pl7u379+gavP3+FaYGC7bPPPs8//3z29XnnnXfttde2bX0A4CvAKPQAQOvr1KlT7rXx5wGgVQjwAEArW7BgQe7ye//+/ffYY4+2rQ8AfDUUb7gIAEAzzJs3b9WqVTNnzrzoootWrVqVnXjSSSc1NkIeANAiAjwA0Doef/zxM888M39KRUXF97///baqDwB8xehCDwBsElEU/frXv+7du3dbVwQAviJcgQegUV/72tfa+cNKtECLVFRUdOjQoaamplu3bmPHjj377LMPPfTQtq4UAHx1eIwcAAAAJIAu9AAAAJAAAjwAAAAkgAAPAAAACSDA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AAAAJIAADwAAAAkgwAMAAEACCPAAAACQAAI8AAAAJIAADwAAAAkgwAMAAEACCPAAAACQAAI8AAAAJIAADwAAAAkgwAMAAEACCPAAAACQAAI8AAAAJIAAD2yO4jiuTte2dS0AAGAzUtzWFQCo6/WFc//rvedmrVxanioeP3z7b4/Zu61rBAAAbU+ABzYvM1YsvvCFe2auXJKOMyEKs1ct/mz10p/vPqGt6wUAAG1MF3pg83LnRy9/umZZbcgUp4pTIVpVU/XfM99ZXrWuresFAABtTIAHNi+zVyxZm65NhagklSotLgkhrM9Uv7xgVlvXCwAA2pgAD2xehnTu0bG4LI7jTJypra0NISoORRXF7vcBAKC9E+CBzcuk7Q/sUFQSoqgqU1sb4uIQ+nfqNqBjt7auFwAAtDEBHti8dC+vuP6Ak0Z16d21tKJnWYcxPQZeNPagLSo7t3W9AACgjemVCmx2duk97L8PnzRj+efVmXSXkvI+Hbp0Li1v60oBAEAbE+CBzVHHkrIdthjY1rUAAIDNiC70AAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAACSAAA8AAAAJIMADAABAAgjwAAAAkAACPAAAQHv09ttvR1EURVE6nW7rutAsAjwAAAAkgAAPAAAACSDAAwAAQAII8AAAAJAAAjwAAAAkgAAPAABQoP/5n/856qijRo0aVVlZOWTIkAMOOGDKlClxHNcptnjx4smTJ++88859+/atqKgYNmzYgQceeMcdd9TU1OQXmzdvXhRFffv2DSG88sorhx12WM+ePSsrK7fbbrvrr78+W+avf/3rwQcf3KNHj44dO+6www6//e1v88eQv/DCC6MouvLKK0MIt9xyy+677965c+euXbvuvvvuN910U/P369lnnz3iiCP69OlTUVGx5ZZbnnjiia+88kphTUQrKm7rCgAAACTSeeed99vf/jb3du7cuXPnzn3mmWdOOeWUW265JTd9+vTpu+6667Jly3JTZs+ePXv27Keffvqee+657777Uqm6F1bvuuuuiRMn7rrrruPHj3/ttdfefvvts88+e8GCBb179540adLYsWMnTJjw7rvvvvrqq+edd96nn3569dVX5y+eyWS+9a1v3Xnnnd26dRs7duz06dNffvnll19++bnnnrvxxhsrKyub2KmamprLLrvsqquuyv0MMX369OnTp99xxx0//vGPr7jiikJbi9YQt0vTpk3L7v6ECRPaui4AAEDyTJkyJZspzjnnnDfeeGPhwoVvvvnmqaeemp34yCOP5EruuOOOIYR+/frdeuut06dPX7hw4auvvvrtb387W/L+++/Plfzss89CCGVlZZ06dXrwwQezEzOZTHa1qVQqlUrddNNNufIXXHBBCKG4uHjVqlXZKT/4wQ9CCP3794+i6KqrrspkMtnpjz32WLdu3UII5557bm7xt956K1uH2tra3MSf/exn2Ylnnnnm3/72t08//fSJJ574xje+kZ14zTXXbIK2pLkEeAEeAABosTPOOCOEMG7cuPyJmUxmm222CSH88Ic/zE75/PPPs9Hjueeeq7OGvfbaK4RwySWX5KZkA3z+4lnvv/9+dvrEiRPzpy9atCg7/bXXXstOyQb4EML3v//9Opt77LHHsr8OfPbZZ9kp9QP8vHnzOnTo0GBQz+5v586dv/jii2Y1EJuAe+ABAABa7Isvvggh1NbW5k+MouiZZ56ZMWNG9tp4CCGO49tuu+222277+te/XmcNAwcODCGsWrWq/sonTJiQ/3bIkCENTu/Vq1dFRUUIYfny5fnTi4uLc0k+5+CDD95pp52qqqpuuOGGxnbq+uuvX7NmzejRo88777w6s6655pqKioqVK1c+++yzjS3OpibAAwAAtNg+++wTQnjyySfHjRv34IMPrly5Mju9T58+w4cP7927d/Ztr169TjzxxBNPPDH/Rvf58+ffcccdjzzySGMrHzx4cP7boqKiBqfnz8o3dOjQfv361Z/+ta99LYTw4YcfNrbdbFflAw88MIqiOrM6deq0/fbbhxBefvnlxhZnUzOIHQAAQIude+6577333k033fTYY4899thjqVRqm222+frXv37ooYcecMABJSUl+YXfeeedBx544LXXXps+ffrcuXPXrl3b9MrrD2vX9PQ6hg4d2uD0YcOGhRBmzZrV2IIff/xxCOGaa6655pprGiuTuymAL58ADwAA0GKpVOoPf/jD9773vb/85S+PPfbYG2+88d5777333nvXXXfdVlttdfvtt48dOzaEUFtbe9ZZZ918881xHEdRNHz48H333XfEiBE777zzlClT7r///k1Rt+rq6ganr1+/PoSwbt26xhZcunRpCKFfv37du3dvrEyvXr02uoIUSIAHAAAo0JgxY8aMGTN58uQ1a9a88sorjz/++B/+8IePPvroyCOPnDlzZnFx8S9/+cubbrqppKTkF7/4xemnn54dCj7r6aef3kS1mj17doPTZ8yYERq/Ph9C2HLLLefNm/ftb3/7pz/96SaqGxvDPfAAAAAtU1NTc9VVV1111VXZPuchhA4dOuy3336//OUvH3zwwRDCJ598kp31l7/8JYRw1lln/du//Vt+eg8hzJw5cxNV75NPPsmNMJ+zdu3ahx56KISw5ZZbNrbgqFGjQgivvPJKg3MfeOCBKVOmLFiwoPVqSssI8AAAAC1TUlJy7bXXXnzxxdddd12dWblR5bbYYosQQiaTCSF07NixTrEXXnjhpZdeCiHEcdzq1Yvj+OKLL66pqcmfOHny5IULFxYVFWUfCNegb33rWyGE7F39dWbdfffd48ePP/nkk8vLy1u9wjSTAA8AANBiBx54YAjhd7/73S9+8Yvp06cvW7Zszpw5t9122wknnBBC2HXXXbMBfpdddgkh3HjjjU899VQ6nc5kMnPnzr388svHjRuXfQTdX//6148++qixu9YL9sQTT+y3334PP/zw7Nmzn3zyyWOPPfaXv/xlCOGUU07ZdtttG1tqzz33PPnkk0MIEyZMuPTSS998880vvvjiww8/vPzyyydOnBhC+N73vlenHwFfpmhT/N6z+fvggw+22WabEMKECRPuu+++tq4OAACQMEuXLh07duycOXPqzxo4cODUqVOzj3lfuHDhDjvssGjRohBCKpUqLi7OZvWJEyeecMIJ48aNyyayp59+ev/99583b96AAQOyS+UeRBdCqKqqyl73fuutt7LPcsvp1KnT6tWrs4uHEC688MJf/epXhxxySFVVVf177MePH3/LLbd06dIl+/btt9/eYYcdQgi1tbW5jgPLli379re/ne35X8dpp51200031X/CHF8ag9gBAAC0WPfu3d99993rr79+ypQpn3766ZIlS/r27TtkyJBjjjnmtNNOq6ioyBbr06fP22+/feWVVz7zzDOzZ8/u0KHDTjvtdPbZZx9++OEhhJtvvvnWW2+trKzM5vbWUlFR8cADD/znf/7nLbfc8tFHH3Xr1m2nnXY69NBDzzzzzA0u261bt3vvvffee++dMmXKO++8M3fu3EGDBo0ePfr888/PPkaeNuQKvCvwAABAUi1ZsuTdd98dNWpU3759wz+uwB999NH33ntvW1eN1ucKPAAAQFL17Nlz3333beta8CUxiB0AAAAkgAAPAAAACSDAAwAAQAII8AAAAF8RV199dRzHRrD7qhLg+YrLZOLq6nQ6nWnrigAAAGyUAkehf+WVV1588cVZs2aNGDHiuOOO69OnT/0yH3/8cfaHnx//+McbVUco1Jo11Z9+umzauwsXLlhVWVm69/7Dhw7t0daVAgAAKESLnwO/evXq7373u3/+859zUyorK6+66qpJkybVKfnAAw+MHz8+hLAZPmrec+Dbg+rq2pnTF//5T2/UVlVn4iiEkEpFe+837JDDxrR11QAAAFqsxVfgjzvuuEcffTSEUFlZOXTo0FmzZq1du/bcc89Np9PnnXfeJqghFGj9+top97xTXVUbhygVhTgTZzLhr8/OKi1J7bb78PLKkpKSorauIwAAQHO17B74hx566NFHH42i6PLLL1+xYsV77703f/780047LYTwwx/+8IMPPtg0lYRCVFelV6xcF0ImlYnjOI5TUQghDtFzz85+5935CxesWrJ4dSt2D6lZvmDVi3cue+76Va/fX7Xw49ZaLQAAQFbLrsDfcsstIYRTTjnl0ksvzU7p2rXrzTffvGLFivvuu2/SpEnPPPNMq1cRCrN2bU2IoxCHOIqikAlxHMUhjtO11Zn581aXlRb36dt55f/P3r3HRVXmjwP/POfMHQYYLgOMIiCCIphm1GpapKaupXlDStvfamblll2+kmu59d12v7ZrW9tmtra2Xyv6ZiXgJcXKFO93UVERFAQEuQy3GRjmPuec5/fHqfnyBdRhGMLL5/3yD+Y5n/M8z5k0/Zzn1moPDFL2vK22wu8bP1/isjQyEpkkIDwo9RkCIItI6HnNCCGEEEIIISTq3gj8hQsXAGDRokUdyj/++GO1Wr1nz559+/b5qmcI9VBAgEwql1BKCVAgLKGEMECAADAS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HEYPPDCnXH311V//+teTJKn9s6ur6/V9Lz//+c8vvvjiM888c9OmTc698le8e+6558ILL+zr69u1a5eqHtOigaOA8xzHJ64CADC3hfUuAMCRdOqpp37sYx8Tkampqe9+97tv2Obb3/62iFxxxRX7f7eJyAUXXNDX19ff3//444+feeaZx6RY4CjiPMfxiasAAMxtDKEH5pQ//dM/veGGG2644YYZhkFu3rxZRNauXXvgQlU9//zzReTFF1882kUCxwDnOY5PXAUAYG4jwAPHnd27d4vI66cmri3p7++vQ03AkcZ5DkyHbwcAZBcBHji+mFntx1lHR8drVnV2dgo/3TAncJ4D0+HbAQCZRoAHjlPTzVHEc4Axl3CeA9Ph2wEAWUSAB7KnublZD3Dttdce/Laq2tvbKyL79u17zarakvnz5x/BUoG64DwHpsO3AwAyjVnogezZsGFDpVLZ/8/Vq1cf0ubz58/fsWPH0NDQ8uXLD1w+NDQk/HTDXMF5DkyHbwcAZBcBHsieb33rW7/P5itXrnzkkUcefPDBc84558DlDz30kIisWLHi99k5MEtwngPT4dsBANnFEHrguPORj3xERG699dYDFz722GPbtm1bs2YNj//F3MB5DkyHbwcAZBcBHjjuXHzxxcuWLbv//vv3PyV4ZGSk9nvuk5/8ZF1LA44YznNgOnw7ACC71MzqXQOAI29gYKCvr6+rq2twcPD1ax977LF3v/vde/bsWbly5eLFix9++OGpqamPfvSjN954YxhyZw3mCM5zHM+4CgDAnEQPPHA8OvPMMx944IHLL798ZGTkgQceWLx48Ze+9KWbbrqJ322YSzjPgenw7QCAjKIHHgAAAACADKAHHgAAAACADCDAAwAAAACQAQR4AAAAAAAygAAPAAAAAEAGEOABAAAAAMgAAjwAAAAAABlAgAcAAAAAIAMI8AAAAAAAZAABHgAAAACADCDAAwAAAACQAQR4AAAAAAAygAAPAAAAAEAGEOABAEfdunXrVHXdunUztLnzzjtVVVUfffTR/Qv1VZ/4xCdmfotbb711f+Of/vSn0zU7++yza20uvPDCGfb26U9/Wt9IPp9fvXr1+vXrb7nllpnrAQAAOOII8ACADLjtttvSNJ2hwcEk6s2bN+//68B99923e/fuQy0jjuNnnnnm9ttv37hx47p160ql0qHuAQAA4LAR4AEAGTA4OHjfffdNtzaO43/5l3950518//vfF5EwDEXEe3/zzTfP3L6zs/OJ33XPPfd89atfXb58uYjcddddf/M3f3NoH0PkmmuuUdUZPgsAAMB0CPAAgNmut7dXRGbI2z//+c/HxsZqzWbwve99T0Te8573nHHGGfJqnp9BFEWn/64LLrjg6quvfvrpp0855RQRuf7664eGhg7+g1Sr1W9/+9sH3x4AAOBABHgAwGx3+eWXi8itt97qvX/DBrXx87Vm03nyySefeeYZEbnqqqs2btwoIg899NDLL798GPUUi8W//uu/FpE0TZ9++umD3Gp0dPTjH//4li1bDuMdAQAAhAAPAJj93vGOd/T29g4MDNx///2vX5skyR133CEiGzZsmGEntf72xsbGSy+9tNbSzH74wx8eXkmrVq2qvXjuuedmbrlt27bPfe5z69evX7BgwXe+853DezsAAAAhwAMAZr8gCGq96z/60Y9ev/bee+/du3fv0qVLzzrrrBl2Ugvw69evb2hoWLVqVW0M/JuOop/O/q77efPmzdzy2Wefve66626//fbJycnDey8AAIAaAjwAIAM++MEPisgtt9zy+lH0tfHzGzduVNXpNn/44YdfeuklEfnwhz9cW1LrhP/Vr361devWw6jna1/7Wu3F6aefPnPLc889d/8ceHfddddhvBcAAEANAR4AkAHnn39+d3d3f3//Aw88cOBy7/1tt90mbzZ+vjZ9XWdn58UXX1xbUrsNXkR+8IMfHHwZo6OjDz744KWXXnrnnXfWdrJkyZKZN2lubt4/B96aNWsO/r0AAABegwAPAMiAIAg+8IEPyOvmov/FL34xMDCwcOHCt73tbdNt672v3eu+cePGKIpqC0899dQTTjhBZgzw/f39+rva2trOO++82iPrFi9e/I//+I9H4sMBAAAcFAI8ACAb9o+iN7P9C/fPPz/D+Pl77723v79fRK666qoDl9c64X/961/XZqc/eN3d3Z/85Ceffvrpvr6+Q9oQAADg9xHWuwAAAA7KBRdc0NnZuXPnzoceeujcc88VETO79dZb5YDx8G+oNn6+p6fn5JNP3rt374E7vO6660TkBz/4wd/+7d++fsPOzs677777NQt7enredOI6AACAo4EADwDIhjAM169f/41vfONHP/pRLcA/8sgjO3bs6O3tPe+886bbqlqt1kL+nj17enp63rDNdAE+iqI3naMOAADgmGEIPQDgqKuNb69WqzO02b/WuWmvTbWe9ptvvrk2in7/+PkZNrnzzjv37ds3c3nPPvvsk08+OXMbAACAuiPAAwCOus7OThGZ+Vbz/Wu7u7una3PRRRe1t7fv2LHjl7/8pYgc/Pj51tbWcrlsr/PYY4/Vmh3SXPQAAAB1QYAHABx1Z511lojs2bNnf2B+DTP7yU9+IiLz5s1bsGDBdPuJouiyyy4TkZtvvvmJJ57YunVrZ2fn2rVrp2tfKpXuuOMOEVm/fn0+n399g7e85S0rVqwQAjwAAMgCAjwA4Ki76qqr2tvbReRDH/rQwMDAa9Z67z//+c/ff//9IvKZz3xmhvnk5YBR9LXnyX3gAx8IgmC6xj/5yU8mJiZE5Morr5yuTW1y+xdeeGHTpk0H/4kAAACOPQI8AOComz9//o033igiW7ZsWbFixWc/+9lbbrll06ZNd95551e/+tUzzjjjmmuuEZGLL774L/7iL2be1bp161pbW7dt21Z7BvuGDRtmaPz9739fRDo7O9/1rndN1+aKK66ovaATHgAAzHIEeADAsXD55ZffcMMNPT09k5OTX/7ylzdu3HjOOedccskln/70p5966inn3Mc+9rHvfve7M3e/i0gul3v/+98vImNjY21tbRdddNF0LUdHR3/2s5/V3joMp33qyoGj6A98wjwAAMBsQ4AHABwjH//4x7ds2fKFL3zhsssuO+WUUxoaGhYtWnThhRf+2Z/92RNPPHHTTTfV5rp7U/tnrXv/+98fRdF0zX784x9XKhUR+dCHPjTzDmud8Dt27HjwwQcP9sMAAAAcc0pvAwAAAAAAsx898AAAAAAAZAABHgAAAACADCDAAwAAAACQAQR4AAAAAAAygAAPAAAAAEAGEOABAAAAAMgAAjwAAAAAABlAgAcAAAAAIAMI8AAAAAAAZAABHgAAAACADCDAAwAAAACQAQR4AAAAAAAygAAPAAAAAEAGEOABAAAAAMgAAjwAAAAAABlAgAcAAAAAIAMI8AAAAAAAZAABHgAAAACADPj/LxNwgWb/FFQAAAAASUVORK5CYII=" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4252,21 +4257,24 @@ <h2>Integration</h2> to the <code>UMAP</code> calculated from individual samples:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUHMgc2NhbGVkIHRvZ2V0aGVyIHdoZW4gY2FsY3VsYXRlZCBmcm9tIHRoZSBtZXJnZWQgU0NFIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcIm1lcmdlZF9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9IFwic2FtcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgU29tZSBzdHlsaW5nIHRvIGhlbHAgdXMgc2VlIHRoZSBwb2ludHM6XG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArXG4gICMgTW9kaWZ5IHRoZSBsZWdlbmQga2V5IHNvIGl0cyBwb2ludHMgYXJlIGxhcmdlciBhbmQgZWFzaWVyIHRvIHNlZVxuICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArXG4gICMgQWRkIGEgcGxvdCB0aXRsZVxuICBnZ3RpdGxlKFwiVU1BUCBjYWxjdWxhdGVkIG9uIG1lcmdlZF9zY2VcIikiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUHMgc2NhbGVkIHRvZ2V0aGVyIHdoZW4gY2FsY3VsYXRlZCBmcm9tIHRoZSBtZXJnZWQgU0NFIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcIm1lcmdlZF9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gXCJzYW1wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICtcbiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBcIkRhcmsyXCIsIG5hbWUgPSBcInNhbXBsZVwiKSArXG4gIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgK1xuICBnZ3RpdGxlKFwiVU1BUCBjYWxjdWxhdGVkIG9uIG1lcmdlZF9zY2VcIikiXX0= --> <pre class="r"><code># UMAPs scaled together when calculated from the merged SCE scater::plotReducedDim(merged_sce, dimred = "merged_UMAP", - colour_by = "sample", + color_by = "sample", # Some styling to help us see the points: point_size = 0.5, point_alpha = 0.2) + - # Modify the legend key so its points are larger and easier to see - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + - # Add a plot title + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP calculated on merged_sce")</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdabgdVZU//u/au6rOcKfczEAICQGBFhyxGcSfILQioKAMIlMzPQ8qOLTKA9i2E9Lt/1FabbtRwFkUlMahG20RW7SbSRxQZBCBQAgJGe98pqraa/1fVDh9vMnNcA3cXPL9vKphV9WuqnOSu87ee20xMxARERERERHRjs1NdQWIiIiIiIiIaMsYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wADeCIiIiIiIqJpgAE8ERERERER0TTAAJ6IiIiIiIhoGmAAT0RERERERDQNMIAnIiIiIiIimgYYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wAD+Am96U1vkmcsXrx4omJvfetb28XmzJnTuUs20t/fb2Ybn+Qb3/jGxoXPPPPMzVTvQx/6UGfh3XbbTVW38nY21tfX94pXvOL000//5je/uckaTqFKpdKu5w9/+MOdtg6Tc/LJJ7dr/va3v32qq0PPLr5uIiIiouc3BvDPqaGhoQcffHDj7Xfddde2nupb3/pW5+rKlSt/8YtfTLpiIyMjv/71r7/1rW+dccYZr3zlK++///5Jn4o274orrmiHWIcccshUV4eIiIiIiKYNBvDPtTvuuGPjjdsawN91112PPfbYuI3XX3/95Kv15yd/4xvfWK/Xt8vZiIiIiIiIaLtgAP9cu/POO8dtqdVqf/jDH7bpJNddd93GG2+66aY0Tbfm8CRJXtJhyZIlSZJ0Fnj88cc/+MEPblOViIiIiIiI6FnFAP65tnEL/D333BNC2PozZFn27W9/e+PtAwMDt9xyy9acYdddd723w6OPPjo2NvaZz3xGRNplxnXRJyIiIiIioqnFAP45svfeexcLjz766OrVqzt3tfvPz507t6+vb4un+vGPf7x+/fpiOUmS9pnxF/Sij+P43e9+99lnn93esnr16vZVNq/Val1zzTVveMMbFixYUC6XFy5c+NrXvvaSSy5Zs2bNRIf87//+72mnnXbQQQfNnz+/Wq3uvffeRxxxxAc+8IGnn356W2u+9Ve/4447OvP2tVqtcQUOOeSQ9t4rrrhi6+uwHW+nsHz58g984AMvf/nLZ82aVS6X99hjjxNPPPE73/nOZvILrl279u///u/333//rq6u2bNnH3nkkd/97ncnd/W2W2655dxzz91nn336+vrK5fKCBQuOPvroT3/60yMjIxsXHhwcfH2HZcuW5Xn+uc997qCDDurv7585c+Zhhx12ySWXjI6ObuXVly1b1nnCWq22cuXKCy64YOHChUVlTjvttN/+9rftq1966aX77bdftVrdbbfdjjzyyC9/+csTPa6tf7yrV6/u/Mw88MADAP7jP/7jsMMO6+np+dnPftZZeHR09IorrnjJS17S3d09d+7cE0444Z577gFw1VVXte9ik9/QHeR1T+TBBx+84IILXvWqV+26667d3d3777//G97whk996lNjY2MTHTKJfxMm8RCIiIiIdkZGEzjhhBPaT2nRokUTFTv11FPbxWbPnt25q/M5n3XWWd77Yvl73/teZ7Hjjjuu2H7CCSfMmDGjfcgZZ5yxySu+5S1vaZc57rjjLr/88vZqV1dXrVab9O185Stf6azzHXfcsYVnZPab3/xmjz322ORHq6+v73Of+9y48iMjI0cdddREn8YkST772c+OO6RcLrcL3HzzzZO++u23395ZoNlsjrvQwQcf3N778Y9/fGvqsE23c9FFF01U8v77728X+/znP1+pVDZZ7OCDD165cuXGb+HWW2+dNWvWxuXf//73n3TSSe3Vt73tbRO9x3FWrlz56le/eqLa9vf3F5FVp1WrVnWWueuuu175yldufOzuu+9+3333bU0dxmVSvPXWW2fOnDnubEmS3HjjjQ8++OCuu+668bWOOuqoPM/HnXabHu+4m7r//vs/9rGPtVd/+tOftkv+/ve/3/ijGMfxt771rc73Pu5zta31KWz31z2RPM/PO+885zb9O++sWbO+9rWvbXzUtv6bMLmHQERERLRzYgA/oe0bwF900UUveclL2n9ndxabPXt2sf2Tn/zkFgP4kZGRzr90v/rVr/7xj3/svND1118/6dv56le/2nmqBx98cPOP6IEHHujq6trkn91tN9xwQ+chnb8+bJL3/tZbb+08ZKLgeVuv/mwE8Nt0O1sTwH/+85/f/An32muvwcHBzrr97ne/myj4AdAZ9G5lRLdmzZqFCxduvhoi8tWvfrXzqHGx7gEHHDDRsYceeqiqbrEa4wL4np6eTZ6tt7d3wYIFE13rn//5nzvPua2Pd9xNfeYzn+lcbQfwq1atGjeFZFupVDr00EPbq+M+VzvC696Myy67bPPVi6Ko81cMm9S/CZN4CEREREQ7LXahf+4cdthhxULnMPhHHnlk3bp1xXLnH/oTuemmmxqNRrEcx/Hxxx+/zz77vOhFL2oX+EvGrneGuFEU7bXXXpsvf+aZZ9Zqtfbqq1/96ssuu+w973lPZzBzwQUXPPXUU8Xybbfd1jl6/6CDDrrsssuuuOKKc845p1qtFhtDCF/4whe2prbbevXtbltvZ968efvuu2/79xoA5XJ533333XfffYskgo8//vh73/ve9t4XvehFX/jCF2688cYLL7yw3X3j0Ucffd/73tdZjYsvvrj9kQCw++67n3rqqa961auKcw4MDGzrfZ1//vlPPvlke3XhwoXnn3/+pZde2tkmb2bveMc7nnjiiYlOUuRl3G+//U444YRXvOIVnbvuvPPOcZ3Pt8bo6GhXV9eRRx559NFHl0ql9vaRkZHiFe+zzz4nnHDCPvvs03lUZ6eSyT3eTu3m985sEQCuuOKKtWvXtlfnz5//lre8pXgFrVZr47yVf0l9tvvrnsjjjz/+iU98or368pe//AMf+MDVV199ySWXzJ8/v9iY53nnuBts+7fyL38pRERERDuXqf4FYce13Vvg28NfkyRpN/9+7WtfKzaWSqVms7nFFvgjjzyyXeCYY44pNnb2ok+SZGBgYFtvJ8uyf/u3f+vsK7v//vtv/vn89Kc/7bzBT3/60+1d4xok251mP/zhD7c3vu51r+s8W/s5AFi8eHHnrk22fk/i6tu9BX5yt/Pxj3+8vevggw/u3PWe97ynveuFL3xho9Fo7+qcd8B7v3z58k0+h/PPPz/LsmLX3XffPa5ZeGuaZO+9997OQ173utcNDw+3937xi1/s/JC8853v7HzsnQeWSqXOoSLjxn5vPFBiY+Na4Pfcc8/HH3+82PWHP/xhXCv05ZdfXuwKIXSGlEmStB/IJB7vuJsCcOyxx/7617+u1+utVitNUzNbtmxZ5yQOxx13XL1eLw7/1a9+1Y51C52fqx3hdW/GDTfc0D7VPvvs0zkYYdmyZe2fqAAsXbp0k9Xbmm/lJB4CERER0c6MLfDPnXYLfJqmv/71r4vldga7Aw88sLNdcZNWrFhx2223tVdPPvnkcQvFyW+66abNn2flypWv6LDffvv19fVdeOGFqtou84EPfGDzJ/ne977XXj7ggAM6/xCfN2/eu971rvbqL37xi2LBOXfcMzoLAOj843758uWbv/Tkrr7dbcfbKXS253/wgx/s/NXg9NNPbw/BCCF885vfLJY/97nPtcvstddeV199dRRFxepBBx30T//0T9twPwCA73znO+3larX69a9/vbe3t73lvPPOO+WUU9qrN95440Tnufjiizt/Mzr11FM7+4n86U9/2taKffSjH120aFGxvP/++3cOsN97773bH1fn3Pnnn9/elaZpOxfjJB7vOH/913/9n//5ny9/+csrlUqSJHEcA7j66qvb0zf29PRcd9117R8XDjzwwM30D98RXvdmFBn7CmvXrl2xYkV7deHChR/5yEcuekY7m90kvpV/+UshIiIi2qlEU12BnciCBQsWLlxYdE6+4447igik3b12a/rPX3/99e0Yu+g/XywXvejvu+++drHOGGZjnb8gbNL/+3//761vfevmK3P33Xe3l9/85jeP23v22We3By23uxV86EMfGlcsz/MnnnjiN7/5TWdusK0xiatvd9vxdgAsW7asM2v94YcfPq7Aq1/96t/97nfFcvt3n85uBRdeeOG4fGNnnnnme9/73k0mjZ9I5wnf8pa3zJ07d1yBiy66qN02u2rVqqVLl+65554bn6ezq0jhBS94Qfsj2tnLeiuN64ff+Vpf/vKXd974Jt/45B7vOBdddNG4zvP48yd22mmnjZtI4vjjj997770feeSR7VKf7f66N6O/v7+9PDAwsHjx4kMPPfTYY4899thjDzjggIsvvnjjQ7b1W7ldXgoRERHRToUB/HPqsMMOK8aoF3H76Ohou5/wJlN2j9PZBnXUUUd1/oV98sknt6Ojn//85ytXrtxkXu6t8eY3v/nqq6/eYrHOv7w3Tjq9YMGCd7/73Zs8cHh4+Cc/+cktt9zyq1/96qGHHsqybBKVnPTVt7vtcjsAHn/88c7VXXbZZTOFi4/N2NhY51R/L3zhC8cVS5JkyZIl43rFb15nQ+t+++23cYF99923c/Wpp57aZAC/cVK3zsbVSdjMDzFb8xvNJB7vxjaZFaLzzBu/AhF58YtfvHEAv4O87s048cQTL7300nbnAlW9/fbbb7/99ssuu2zBggXHHHPMcccdd8wxx7RHqmPbv5Xb5aUQERER7VTYhf451Y7Sizx299xzT7tF/ZBDDtn8sQ888EC7MQp/3m1+3KqqdnaE3hoiMnv27KOOOupb3/rWTTfd1JlobSKdDX1b38r95S9/edGiRaeccsqXvvSl++67b9Lh7uSuvt1tr9sBMDg4uK2Fx82pvsmfbLb1d5zOB7vJgGrWrFmdYz2Ghoa26fxTZRKPd2OdownaOp/AJp/2JlP67yCvezMWLlz44x//eLfddtt411NPPXXNNde88Y1vXLJkya233trevq3fyu3yUoiIiIh2KmyBn1BnYqrN9Pjt3NV5yCa1h8GvW7fuT3/6U7tT6N57771xX+VxOlM6ATj33HPPPffciQpff/31nQNQx1m0aNG4tq9JqFar7bGvnQ2Dm3HjjTeed9557dUkSQ488MCXvvSlL3vZy+bOnfuGN7zhWb36drcdbwdAezAzAOfcC17wgs0ULj5pc+fOjeO4/avB6tWrN26VXbNmzTZVo7e3tz0twsYp3AAMDg62Wq326kSzu+1oJvF4t9K8efPaofUmP4qbfAU7yOvevCOOOOKJJ574wQ9+8I1vfOPWW2+t1+vjCixbtuyYY4755S9/+bKXvQzb/q189l4KERER0fMVA/gJzZs3r728du3aoaGhTbYpdabjGpdxemP7779/X1/f8PAwgDvuuKMdwG9xALyZbdP8cPfcc89jjz22ZMmSrT9kW82dO7cdLWxmOrFOndNKv+Utb/nCF77QfqQ333zzs331cVqt1risgZ0zgW2N7Xg7AMb1erj33nu32Ofce7948eL2J/Chhx56zWte01kghPDoo49uUzV22WWXpUuXFst//OMfNy7w0EMPjSu/TeefKpN4vFtpr732aj/khx9+eOMC457YpOvzbLzuLYqi6MQTTzzxxBMbjcatt976/e9//+abb+78puR5fuWVVxaje7b1W/nsvRQiIiKi5yt2oZ9QOwFy4aqrrtq4zH//9393/sk+7pCNOefaXeVvv/32ds6nLQ6A/5//+Z/Oqbm3xriJu7a7Aw88sL387W9/uzODPYCvfOUrlWccddRRAGq1WjsyBPDhD3+48weRiebK3l5XB9A58RWAxx57rHP1iSee6KzeFm3f2wHwohe9qN0gqaqdOcA3Y++9924vX3XVVfbnkxdef/3129rxuPOjeMMNN7Rb49s6E6HPnj173LzrO6zJPd6t0fkz2XXXXddsNjv33n777b/5zW+2V322++ueSLPZ/P86DA0NVSqVN77xjV/+8pdXrVp18803d971gw8+WCxs67fy2XspRERERM9XDOAn9IY3vKGzhfajH/3oP/zDP7SzNA0PD1977bXjUrWPG5e+Se0A6aabbhoYGBi3cSKd6euiKHrJBDrH6D7bAfxxxx3XXn700Uf/8R//sb26bt26j370o81nvO51rwNQTCfeeUh7+Q9/+ENnWPhsXB0bZSC7/PLL2wm6Vq5cefrpp48LhzZvu9xO55j5rq6uo48+ur36iU98Ylzhyy677KXPuPzyy4uNncMoHnzwwXe9613tqOm3v/3tJlOFb17nZ7hWq5199tntTtEAvvSlL3WmVzjppJM2zsq+Y5rc490a7Q8YgDVr1lxwwQV5nherDz300ETjXHaQ1z2Rcrn8L//yL5c+45prrmnvcs4de+yxnUnmFyxYUCxs67fy2XspRERERM9bUzkJ/Q5vk3OhVyqVcTNFFQ4//PBxh3fuveiii4qNnRO5F2bMmKGqxd7OVtwzzjij2NhsNju3H3/88RNV+CMf+UjnmX//+9+3d3VOyr1o0aK//OHkeT6ui/7hhx/+oQ996P3vf3/nUIKurq7HH3+8OGTWrFnt7T09PSeffPLHPvaxM888c1y/2SiKOi/Uuffmm2+e9NXNbFw6sUWLFp144omvec1rurq6xr2Uj3/841usw+Ru51Of+lR7V3d398MPP1yr1fI8N7M//vGPnQN9jz766G984xs333zzlVdeeeyxx3ae8E9/+lNxNlV98Ytf3Hm5JUuWnHXWWUceeeS4AQIA3va2t23Nm33961/fedTixYvf8Y53fPCDHzziiCM6t1er1c5nO27A/P333z/utGeccUZ779lnn73FaozLOr5q1arOvSeddNJE9zXRgZN4vFu8qcJBBx3UWWzPPfc866yzjjrqqPaE8G2dn6sd5HVP5NRTT22fyjn3t3/7t1dfffV111131VVXnXPOOZ3D1y+//PLikEl8KyfxEIiIiIh2ZgzgN6fVah1zzDHYCnvttdeKFSvGHd5ZoB3A12q1OI47dx1zzDHtQzYZwN90002d5b/97W9PVOFxQ3AvueSS9q7tHsCb2V133bXFzFKdtT3rrLMmKjZz5szO1dHR0fZRmwyeJ3F1M9vM9HhRFHVOy7c1AfzkbucHP/jBxuXbkeGll166+TsSkU996lOddfvJT37SOZXXOJ1ThW9lRPf0009vMvf4uGpcd911nUft+AH8JB7vVgbwP/vZzzbTE6Hz7Yz7XO0Ir3siS5cu3WJmTQALFizo/KdvEt/KSTwEIiIiop0Wu9BvTpIk3//+9//1X/91M9npKpXKxRdf/Mtf/nIrJ3CqVqsvfelLO7dsMYNdZ/75np6ezaQ3f8ELXlCkgy7ccMMNti3dwrfVwQcffMstt0z0V/7MmTOvueaaU045pb3ls5/97Cbz6h166KE///nPO7fccMMN2/3qAM4///w3velNGxculUpf+9rXtnU49+Ru56ijjuocyTzOFVdc8d73vneiaLC3t/cb3/jG+973vs6Nf/M3f/P1r399404EAE444YRtTYYPYP78+Xffffdm5jWcNWvWd7/73dNPP31bzzzlJvF4t8YRRxzxxS9+ceM2cACnnnrqOeecsx3rs91f90QWL1588803b+azWpT54Q9/2PlP3yS+lc/SSyEiIiJ6XmIW+i2I4/jCCy8855xzrr322l/96lePPfbYY4891mw2lyxZsmTJkr/6q796+9vfvq2JuA877LB77rmnvbr5AfCDg4M//OEP26tvfvObN+6X2+mtb33rb3/722J52bJld9111xZ/IPhLHH744UuXLr322mt/+MMf3n///QMDA/Pnz99vv/0OOuigv/u7vxuXt3/GjBm///3vr7zyyh/84AePPPJIMZj/nHPOOeOMM0TkvPPOW7ZsWVHyRz/60fnnn799rw7AOffd737329/+9te+9rUHH3xw9erV8+bNO+qoo973vvftt99+d999d3d3d1Fy0aJFW7z65G6nWq3eeuutH/vYx2677baVK1eKSHd3d7tDsnPuyiuvPPvss6+++urbbrtt+fLlIYTdd9990aJFb3rTm04//fR2DTuddtpphxxyyGc/+9kf/ehHTz31VLlc3n///c8777yzzjrr8ssvb890uO+++27xpgoLFiy48847f/SjH33nO9+58847V61a1Wq1Zs+efcABB7z+9a8/77zzNlmNHd/kHu/WOPfcc1/1qld9+tOfvuWWW1asWFGpVF784he/4x3vOOWUU975zndu3/ps99c9kVe84hUPP/zwf/3Xf1133XVPPPHEihUrVq9ePWPGjAULFuyxxx6nn3768ccfv3F3gEl8K5+ll0JERET0/CPPagstEdFO7swzz2x3ovnkJz/5/ve/f2rrQ0RERETTF1vgiYgm72c/+9m9995bLHd1db3tbW/r3Fuv13/xi1+0Vzc55oKIiIiIaCsxgCcimrzVq1d3NqqPjo5eeOGF1WoVwPLly9/2trctX7682DVz5szXvva1U1NLIiIiInpeYBd6IqLJGx0dPeyww+677772liiKDjjggFar9cgjj2RZVmyM4/gnP/nJ4Ycf/hxXb2hoqNVqbetRlUqlt7f32agPEREREf0lGMATEf1FBgYGTjrppNtuu22iAosXL77yyis3OQPCs+3kk0/+93//92096vzzz7/22mufjfoQERER0V+CXeiJiP4iM2fOLEbCX3vttffff//y5cuffvrpWbNmLVy4cI899jj++ONPOeWUzUzeTkRERES0ldgCT0RERERERDQNuKmuABERERERERFtGQN4IiIiIiIiommAATwRERERERHRNMAAnoiIiIiIiGgaYABPRERERERENA0wgCciIiIiIiKaBhjAExEREREREU0DDOCJiIiIiIiIpgEG8ERERERERETTAAN4IiIiIiIiommAATwRERERERHRNMAAnoiIiIiIiGgaYAD/Zx577LElS5YsWbLk7W9/+1TXhYiIiIiIiOj/RFNdgR1LmqZLly4FsHr16qmuCxEREREREdH/YQs8ERERERER0TTAAJ6IiIiIiIhoGmAAT0RERERERDQNMIAnIiIiIiIimgYYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wADeCIiIiIiIqJpgAE8ERERERER0TTAAJ6IiIiIiIhoGmAAT0RERERERDQNMIAnIiIiIiIimgYYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wADeCIiIiIiIqJpgAE8ERERERER0TTAAJ6IiIiIiIhoGmAAT0RERERERDQNMIAnIiIiIiIimgYYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wADeCIiIiIiIqJpgAE8ERERERER0TTAAJ6IiIiIiIhoGmAAT0RERERERDQNMIAnIiIiIiIimgYYwBMRERERERFNAwzgiYiIiIiIiKYBBvBERERERERE0wADeCIiIiIiIqJpgAE8ERERERER0TQQTXUFiIiIdmpmSPMASBKJiEx1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uLIr4/0rk+L++WZV58mw+ODx8nxRr5pc4QSCxRDYNLnAiHjw/Ul15+qorv3aYfnGzcmdownBymiTYWFwNC3H1cHLV+um9UEVD8ZlWdjto/Hto2f1nRIREZG/iwK8iIjI99x4UIyqImUPgWB/d/d5MA4/ckL+zVvT126M752sH56v56v2+sEwu49Gxd6oLEM4mMTZsl3WaVpFx6L58aw9WWyaNndl81uHw/GwGJTx2n71A7f3B+U3FtKHVRxWo+/ar1lERES+2xTgRUREngUzividHhwvQrhzbTwo46ZJD87WNw+HR9Pq+sFgXecbh0MzhlXEMePhxXq5as9WTVtTtzmTDiZVzjQpX50OPpreRURE5PufAryIiMguMbhxMFjVaX9cFsHGg8KMcvSNgfzO0fjy7eUmncw33bz6YFzd/8bavoiIiOwEBXgREZHdM6riqPr7rmEfD+KgHG2aBDYsQ9AEeRERkd2kAC8iIvL8i8E+urVOREREdouOwImIiIiIiIjsAAV4ERERERERkR2gAC8iIiIiIiKyAxTgRURERERERHaAAryIiIiIiIjIDlCAFxEREREREdkBCvAiIiIiIiIiO0ABXkRERERERGQHKMCLiIiIiIiI7AAFeBEREREREZEdoAAvIiIiIiIisgMU4EVERERERER2gAK8iIiIiIiIyA5QgBcRERERERHZAQrwIiIiIiIiIjtAAV5ERERERERkByjAi4iIiIiIiOwABXgRERERERGRHaAALyIiIiIiIrIDFOBFREREREREdoACvIiIiIiIiMgO2MkA/8u//MvXr1//Vh996623fuZnfubGjRuj0egzn/nMv/t3/66u62d5eSIiIiIiIiLfdbsX4E9OTv7Tf/pP3+qjf/mXf/kv/+W//N3f/d2Li4ubN29+5Stf+fVf//Wf+qmfUoYXERERERGRnbZLAb5pmt///d//6Z/+6cePH3/TJ7j7v/23//b+/fu/8iu/cnp6+s4773zpS1+6ffv2H/zBH/zmb/7mM75aERERERERke+inQnwv/zLvzwej//Vv/pXf/zHf/ytnvPf//t/f+uttz73uc99/vOfH41GwGc+85nf/u3fBj7/+c+7+7O7XBEREREREZHvquLjvoC/r89+9rM///M/DyyXy9/5nd/5ps/5rd/6LeBnfuZnQnhyY+InfuInbt26df/+/T//8z//3Oc+90wuVkREREREROS7bGcC/C/+4i92bzx48OBbBfivfvWrwI//+I8//aCZ/diP/dh//s//+e2331aAFxERERERkR21MwH+7+PevXvARwfUd4/cv3//o5/yV3/1V//tv/23y3cfPnz4vbxAERERERERkX+k5yfAu3sX0Y+Ojr7hQ1evXuVbBPg//dM//bVf+7VncHkiIiIiIiIi34mdGWL392dm3/RxbZITERERERGR3fX8VODN7ObNm3fv3j05OTk8PHz6QycnJ8Dt27c/+lk/+qM/+h/+w3+4fPfevXu/8Ru/8T2+UhEREREREZF/sOcnwAO3b9++e/fu8fHxG2+88fTjx8fHfIsA/+lPf/rTn/705btf/vKXFeBFRERERETk+9Bz1UL/5ptvAn/0R3/0DY93q+M/+clPfgzXJCIiIiIiIvLd8FwF+J/92Z8F/ut//a9PP/hnf/Zn77777o/8yI9oh5yIiIiIiIjsrucqwP/UT/3U66+//od/+Ie/+Zu/2T1ydnbWpfpf+qVf+lgvTUREREREROQ78lwFeDP7vd/7vRs3bvzqr/7qpz71qZ/8yZ98+eWXv/jFL/7cz/3cL/zCL3zcVyciIiIiIiLyj/dcBXjgc5/73Be+8IV/82/+zdnZ2Re+8IVXX3313//7f/8f/+N/LIrnalyfiIiIiIiIvGh2L9bevHnT3b/NE958883/8l/+yzO7HhEREREREZFn4HmrwIuIiIiIiIg8lxTgRURERERERHaAAryIiIiIiIjIDlCAFxEREREREdkBCvAiIiIiIiIiO0ABXkRERERERGQHKMCLiIiIiIiI7AAFeBEREREREZEdoAAvIiIiIiIisgMU4EVERERERER2gAK8iIiIiIiIyA5QgBcRERERERHZAQrwIiIiIiIiIjtAAV5ERERERERkByjAi4iIiIiIiOwABXgRERERERGRHaAALyIiIiIiIrIDFOBFREREREREdoACvIiIiIiIiMgOUIAXERERERER2QEK8CIiIiIiIiI7QAFeREREREREZAcowIuIiIiIiIjsAAV4ERERERERkR2gAC8iIiIiIiKyAxTgRURERERERHaAAryIiIiIiIjIDlCAFxEREREREdkBCvAiIiIiIiIiO0ABXkRERERERGQHKMCLiIiIiIiI7AAFeBEREREREZEdoAAv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KTa7/VAPioiIftDae8rIiy++CKBPnz6rV6++4oorTjjhhDFjxrz33nsXXXQRgDlz5nTjGImIiIgOBbdDzUhPzczpkZKVxfROREeftWvXCiGEEK1XSdPhrL0BfvPmzQCmTZvmdDpbCoUQv/71rwFUVlaWl5d3x/iIiIiIiIiICO0P8EVFRQAGDhzYprylpKKioguHRURERERERESttTfA67oOIBAItCnfu4SIiIiIiIiIulx7AzwRERERERERHUIM8ERERERERERHAAZ4IiIiIiKiTlqxYsX48eP79+/vdrt79+59zjnnzJ8/X0rZplpVVdX9999/8sknZ2dnu1yuPn36jBo16pVXXkksVW5RVlYmhMjOzgawatWqMWPGpKWlud3u448//tlnn03UWb58+fnnn5+amur1ek844YSnnnqq9R7yd999txDioYceAjBr1qxhw4b5/f5AIDBs2LCZM2e2/3MtW7bskksuycrKcrlcBQUFV1111apVqzr3iKgLtfcceCIiIiIiImrtjjvueOqpp1p+LSkpKSkpWbp06TXXXDNr1qyW8i1btpx66ql1dXUtJcXFxcXFxUuWLJkzZ86CBQsUpe2L1VdfffXqq68+9dRTx44du3r16rVr19588827d+/OzMycOnXqSSedNG7cuHXr1n322Wd33HHHjh07Hnvssda3W5Z15ZVX/vvf/05OTj7ppJO2bNny6aeffvrppx9++OHzzz/vdru/40Ppuv5///d/jz76aMvXEFu2bNmyZcsrr7zy29/+9sEHH+zs06KuINsnUTk1NTVrL99xKaGdXRwONm7cmPg448aNO9RjISIiIiKiw9f8+fMT2eHWW2/98ssvy8vLv/rqq2uvvTZR+M4777TUPPHEEwHk5OTC1jO9AAAgAElEQVTMnj17y5Yt5eXln3322eTJkxM1X3/99ZaaO3fuBOBwOHw+31tvvZUotCwr0ayiKIqizJw5s6X+nXfeCUDTtGAwmCi56667APTo0UMI8eijj1qWlShftGhRcnIygNtuu63l9jVr1iTGYBhGS+Ef/vCHROGNN964cuXKHTt2vP/+++eee26i8PHHH++GZ0nt1bEA363fERwOGOCJiIiIiKg9brjhBgAXXnhh60LLsgYMGADgV7/6VaKksrIyETE+/PDDNi385Cc/AfDrX/+6pSQR4FvfnrBhw4ZE+dVXX926vOUw79WrVydKEgEewC9/+cs23S1atCjx7cDOnTsTJXsH+LKyMo/Hs8+gnvi8fr+/pqamXQ+IukF7p9BPnTr1ACI8ERERERHRUaWmpgaAYRitC4UQS5cuDYVCXq83USKlfOmllwCcccYZbVro2bMngGAwuHfj48aNa/1r796991mekZHhcrkikUh9fX3rck3TWpJ8i/PPP3/o0KGrV69+7rnnHnjggX1+qGeffTYUCg0aNOiOO+5oc+nxxx9/5ZVXGhsbly1bNmHChH3eTt2tvQF++vTp3ToOIiIiIiKiI8iIESPeeOONDz744MILL5wyZcqIESP8fj+AllXGCRkZGVdddVWbe3ft2rV8+fJ33nlnf4336tWr9a+qqu6zvPWl1vLz83NycvYuHz58+OrVq7/55pv99ZuYkjxq1CghRJtLPp9vyJAhibX0DPCHCjexIyIiIiIi6rDbbrtt/fr1M2fOXLRo0aJFixRFGTBgwBlnnDF69OhzzjnHZrO1rvz111+/+eabq1ev3rJlS0lJSTgc/u7G997W7rvL28jPz99neZ8+fQAUFRXt78bNmzcDePzxxx9//PH91WlZFEAHX/cGeCnlxx9/PHz48G7thYiIiIiI6CBTFOUf//jH7bffPm/evEWLFn355Zfr169fv3793//+92OPPfbll18+6aSTABiGMWXKlBdeeEFKKYQ45phjzjrrrL59+5588snz589//fXXu2Ns8Xh8n+XRaBRAJBLZ3421tbUAcnJyUlJS9lcnIyPjgAdIndRdAf7zzz9/7bXXXnvttcQGCd3UCxERERER0SE0ePDgwYMH33///aFQaNWqVe+9994//vGPTZs2XXrppdu2bdM07c9//vPMmTNtNtsjjzxy/fXXJ7aCT1iyZEk3jaq4uHif5Vu3bsX+388DKCgoKCsrmzx58u9///tuGhsdiC4O8GvXrk3k9u+YlUFERERERHRE03X9b3/7G4Bx48YVFBQA8Hg8I0eOHDly5JgxY84444zS0tLNmzcPGDBg3rx5AKZMmTJt2rQ2jWzbtq2bhldaWrpmzZoTTjihdWE4HH777bcBJAa8T/379//www9XrVq1z6tvvvmmYRg//vGPs7Ozu3bA1E5dE+ALCwtfe+21V199ddOmTa3L+/bty+0NiIiIiIjoKGOz2Z544ony8vLdu3c/8cQTrS+17CqXnp4OwLIsAC2b0rf4z3/+88knnwDojgnLUsp777337bffbr0U//777y8vL1dVNXEg3D5deeWVM2bMSKzqv+CCC1pfeu2116644gqXy1VWVtblA6Z2atcWCPuzbdu2hx9+eMiQIQMGDLj//vtb0nvfvn3vvffeL7/8csuWLY888khXjJOIiIiIiOgwMmrUKADTp09/5JFHtmzZUldXt3379pdeemnSpEkATj311ESAP+WUUwA8//zzixcvNk3TsqySkpI//vGPF154YeIIuuXLl2/atGl/q9Y77f333x85cuTChQuLi4s/+OCDiRMn/vnPfwZwzTXXDBw4cH93nX766T/72c8AjBs37r777vvqq69qamq++eabP/7xj1dffTWA22+/vfUqADrIRCe+7yktLZ07d+6rr766evXqva9++eWXP/rRj7pibIdAYWHhgAEDAIwbN27BggWHejhERERERHSYqq2tPemkk7Zv3773pZ49e/73v/9NHPNeXl5+wgknVFRUAFAURdO0RFa/+uqrJ02adOGFFyYS2ZIlS84+++yysrLc3NzEXZmZmS0NxmIxp9MJYM2aNUOGDGndl8/na2pqStwO4O677/7LX/5y0UUXxWKxvdfYjx07dtasWUlJSYlf165dm5hmbxhGy8SBurq6yZMnJ2b+t3HdddfNnDlz7xPm6KDpwBT63bt3z5s379VXX/3kk09ax/5+/fpNmDBhxIgR5513HoAjN70TERERERG1U0pKyrp165599tn58+fv2LGjuro6Ozu7d+/el1122XXXXedyuRLVsrKy1q5d+9BDDy1durS4uNjj8QwdOvTmm2+++OKLAbzwwguzZ892u92J3N5VXC7Xm2+++cwzz8yaNWvTpk3JyclDhw4dPXr0jTfe+L33Jicnz507d+7cufPnz//6669LSkry8vIGDRr0i1/8gueLHXLtfQN/1llnrVixIrF+I2HgwIHjx4+fMGHC4MGDAdTU1KSlpaF7lnAcNHwDT0RERERER5Dq6up169b1798/sbFc4g38hAkT5s6de6iHRl2vvW/gly9fnvjhhBNOmDBhwvjx4/v3799dgyIiIiIiIqJ2SEtLO+ussw71KOgg6dgmdpqm5eXl9e3bNy8vr5sGRERERERERER7a2+AP+mkkwAYhvHWW29dccUVGRkZP/3pT9955x1d17tzeEREREREREQEtD/Ar169evPmzQ888MBxxx0HIBQKvfzyy6NHj87Ozp4yZUqb5fFERERERERE1LU6c4zc2rVrX3311VdffbX1kQkZGRmVlZUAotGow+HowiEeTNzEjoiIiIiIiA5PHVsDnzBkyJBHHnmkuLj4k08+uf3227OysgAk0juAzMzMa6+99r333jMMoytHSkRERERERPQD1pkA3+K000578skny8rKli5deuONNyYnJwNoaGiYPXv2BRdckJWVNXny5GXLlnXRUImIiIiIiIh+uDozhX5/dF1///33//3vf7/11ltNTU0t5UfQyfCcQk9ERERERESHpwN6A9+GzWYbPXr0yy+/XFlZ+dprr40bN+7IXQxPREREREREdFjRuqNRl8s1ceLEiRMnNjQ0vP76693RBREREREREdEPSle+gd9bUlLStdde261dEBEREREREf0QtPcN/DvvvNPpPi666KJO30tEREREREREaH+AHz16dKf7OII2sSMiIiIiIiI6PHXvFHoiIiIiIiIi6hId3sQuMzPz0ksvHT9+/EknnSSE6I4xEREREREREVEb7Q3wCxYsmDdv3sKFCysqKmbMmDFjxozevXtPmDBh/Pjxp556KpM8ERERERERUbcSHVqgHo/HFy9ePH/+/DfffLO2tjZRmJube+mll06YMGH48OGKcmTPyS8sLBwwYACAcePGLViw4FAPh4iIiIiIiKhZxwJ8C8Mwli9fPn/+/Ndff72ioiJRmJhdP2HChDPPPFNV1S4d50HCAE9ERERERESHp04G+BaWZf3nP/+ZP3/+ggULdu7cmShMS0sbO3bs+PHjzz77bJvN1hXjPEgY4ImIiIiIiOjwdKABvoWU8rPPPps/f/78+fOLiooShYFA4JJLLpk1a1aXdHEQMMATEREREVGX2F0bqWyMNYZ1m6b4XVpeusfr7PAm4kStdVmAb23NmjXz5s2bPn16Y2Mjjqhz4BngiYiIiIjoQER186P1lZ9vra1rircuFwK9M7wjBmUMyks6VGOjI10X7zknpfz0009feumll156KZHeiYiIiIiIfiA27mh4ZN7GD9aUt0nvAKREcUXTv5YW/X3Rlsaw3oWdzp07d8yYMf3793e73cccc8y55547ffr0eLztAFq8/vrrEyZMyM/Pd7lcvXr1Ouecc/72t7/ts356errYS0ZGxk9+8pO//OUvur7vT9HO9jds2CCE8Pl8B/LZf2i6JsBLKT/++ONf/vKXeXl5w4YN++tf/1pSUpKUlPSzn/3szTff7JIuiIiIiIiIDmf/Kax6YWlRU9T47mrbypueWLipoj564D02NTUNHz584sSJiQO/8/Pz6+rqFi9efPvttxcUFGzevLlN/aqqqrPOOuvSSy+dP3/+9u3bfT5fWVnZ0qVLp02b1r9//8LCwn32kp2d3XuPnj171tbW/uc//7n77rtPOeWUaDR64O23x7Zt2yZOnJiRkeFyuY477rgHH3xwn984dG211mbPni2EeOihh1oX+ny+vb/gaJGfn9+68gcffHDxxRf37t07LS3t3HPP/dOf/mSaZkefwwEFeMuyVq5ceccdd+Tm5g4fPvyJJ57YuXNncnLytddeu3DhwsrKyhdffPHiiy8+kC6IiIiIiIgOf+tK6t9YtbOdq4cbQvrMJUWh74v632vKlCkff/zxwIEDV65cWVdXt2HDhtra2nXr1p133nklJSVXXHFFLBZrqRwOh0eOHLl8+fKcnJw5c+ZUVFRUVlZGo9GlS5cOHTq0uLh4woQJoVBo717efvvt4j1KS0vD4fDMmTNdLteaNWtaB9pOt/+91q5de/rpp8+dO7exsTEzM/Obb7753e9+d+6557ZJ3V1brbXCwsJbb721o8N2Op0tP0+dOvW88857++23LcvKyMhYtmzZr3/96wsuuKChoaFDbXYmwFuW9dFHH02dOrVHjx5nnHHGU089tWvXrtTU1BtuuGHRokUVFRX/+te/LrroIrvd3onGiYiIiIiIjixNUePfK0s6tPdXTTC24NOdB9Lprl27Xn75ZYfD8c4775x++ukt5YMGDXrjjTcGDBjw1VdfLV26tKX8qaeeWr9+/eDBgz/77LPLLrssIyMDgKZpI0eOXLJkSUFBwcaNG5988snv7ddut19//fX33XcfgDlz5nR5+21IKcePH19eXj516tS6urrt27dv3LgxJyfno48++tvf/tZN1VqLRCITJ07c51cPwWBQ7sudd94J4LHHHktUe/XVV5955pns7OyPPvqotLR048aNJSUlZ5111uLFix9++OEOPY0OBHjTNJctW3bLLbfk5OSMGDHimWeeKS8vT09Pnzx58uLFi8vLy//5z3+ef/75R9a5cURERERERAdo8ZrymG519K61xXWlVeFOd/rFF18AOOGEE3r16tXmktPpHDt2LIA1a9YkShobGxN5cvr06T169GhTPykp6Z577gEwb968dvZ+3nnnASgqKkq8uO7y9lssWbJk27ZtJ5544pNPPulyuQAcd9xxL730EoAnn3yyZcf0rq3W2m233bZ+/frEZuftsWzZsscff/yOO+4YPXp0oiSR0mfMmHHGGWckSnr06DF37tzU1NR//OMfHZqV0N5jDG666abXX3+9qqoq8WtmZuall1562WWXnXHGGaqqtr8/IiIiIiKio4lhys+31nTiRgl8urk6Lz2vc/2Gw2EA5eXlhmFoWttkd9ddd1155ZXJycmJX2fPnl1bWzt8+PAzzzxzn61NmDChrq4OQDweb89k6sQOdokXzt3RfovZs2cDmDhxoqJ8+/p5xIgRWVlZ5eXlX3311Yknntjl1Vq8/PLLM2fOnDx5ckpKysaNG793tPX19ddee+2QIUMeffTRREk0Gi0sLNQ07fzzz29dMzU19cwzz1ywYMGSJUsuueSSdj6N9gb4559/PvFDIrqffvrpqqpWVla25xuUyy+/vJ29EBERERERHVm27g524vV7wobSBvljCNGZe4cOHaooSklJyZVXXvnYY4+1eQ+fnJzckt4BbNiwAcCoUaP215rf7582bVr7e0+cul1QUOBwOLqj/RZbtmwB0OZ7ASHEGWecMWfOnOLi4kTk7tpqCZs3b54yZcqgQYOeeOKJBx54oD2jveeee3bs2DFnzpzEYwEQDocNw7DZbHu/+U5MAdixY0d7Wk5ob4BvUVFRMWPGjBkzZrT/FgZ4IiIiIiI6Wu2ui3T63qaoEYzofndnliEfc8wxd99996OPPjp37tx58+YNHTr0vPPOGzVq1LBhw/Ze17x161YAbfZF7wTLskpKSmbPnp1YMX7jjTd2bft72717N4D09PQ25YmS8vLy7qgGIBqNTpw40bKs1157LZG0v1dhYeHMmTPHjx9/2mmntRSmpKTk5ubu3Lnzv//9b+svDkKh0EcffQSgrKysPY0ndPE58ERERERERD8ojZED2ky+MdL5M+H/9Kc/vfLKK6eddpqU8vPPP3/wwQfPPPPM5OTkMWPGvPnmm61PKSsuLgbQs2fPTvQydOjQlqPRVFXt06fP/fffb5rmBRdccMcddxx4+99BSpkI1SkpKW0upaamYk/k7tpqCb/4xS/Wrl07ffr09q9+v/fee4UQe+9Ld9111wGYPHnyunXrEiXl5eVXXHHFzp07ASRWFrRTe9/A73M1PxERERER0Q9cp+a/t779gBqYNGnSpEmTysvLly5dunTp0iVLluzYsWPhwoULFy48++yz582bFwgEAKSlpRUVFdXUdGatfnZ2dsuEcAAOh2PgwIGjR4++9tprxZ7Z/wfSfnuI/SwzaHP2W1dVmzNnznPPPTdp0qTrr7++nSP8+OOP33rrreuvv76goKDNpfvuu2/58uUrV64cMmRIr1697Hb7tm3bNE0766yzPvzww8zMzHZ2Ab6BJyIiIiIiOhCdmwDfVbcnZGVlXXXVVS+88EJpaWlFRcXChQuPP/74pUuXtiw7T6TKxET3/fnwww/nz5+/bdu2NuWtz4EvLi7+5ptv5s+ff91117WOwQfS/ncQQiTybW1tbZtLiZKcnJwur1ZUVPTzn/+8b9++zz33XPuH+sQTTwCYPHny3pfsdvvy5cufeuqp4cOH19fXm6Z5+eWXr1q1auDAgQD23rT/OzDAExERERERdV5uarsWSO9TksfmdXV4Y7KEsWPHDh48eO88nJGRcdFFF7355psAZs+eHYvFsCdgf/rpp/trzTCMsWPHTpgwoUN7qrXovvYTobq6urpNeaIkcbVrq61cubKxsTESiYwcOfLkPWbNmgXg73//+8knn3zxxRe3ub28vPyNN9447rjjTj311H1+CkVRbrvttpUrV9bV1W3duvXll18eMmTIrl27Wo+tPdr7ZyVxxuD3UhQlPT29R48e+5uTQEREREREdDTJz/S67Gokbn5/1b0M6pnU6eBkt9vXr1+/evXqY445Zu+rOTk5mqYZhhEOhx0Ox8SJEx944IG33nrryy+/bHNSWsKKFSsaGxudTuewYcM6MZjua79v376fffbZxx9/fMopp7Qu/+STTwC0fPaurQagrKxs7+3ldu3atWvXrt69e7cp/+c//6nr+g033LDPj1BaWhqJRPLy8lpvhheLxZYtW+ZwOFrvePe92vsGfmj7nHjiiT179szNzX300Ue5bJ6IiIiIiI56qiKG9U/rxI2KED/u33Y79PYbOnQogD/84Q+RyD62wX///fcNw+jVq1fiMLljjz32xhtvlFLecsste79/NgwjMdl+zJgxrZe7t1/3tX/11Vdjz6l1Lb788suSkpJBgwa1fFnQhdWuueYauZd7770XwIMPPiilTOzY11riePnx48fv8yM8/PDD/fv3f+aZZ1oXvvbaa/X19RMnTkxL68Afnm6ZQr9r16577733/PPP7749DIiIiIiIiA4TIwdnepwdngl/cr+UrGRnpzudOnXqcccd98033/z4xz9etGhROBxOlAeDweeffz6RVO+5556W+n/4wx8yMjJWrVr1ox/9aMGCBVVVVQBM0/ziiy/OPvvsNWvWpKWlTZ8+vdPj6ab2zz333Pz8/JUrVyYOrgNQX1+f+HS33HJLN1XrkM2bN2/dujU3N3fvN/MJiYPVH3zwwVWrVgGQUi5atOjmm28WQtx6660d6qu9f8jee++99lTTdb2wsPDtt99euXLlBx98cPfdd7/wwgsdGhAREREREdGRxWVXrx2Z/+x7W03re6chy8S+9ZkB58WndGD3sr253e45c+aMGzduzZo1F154IYCsrKx4PJ7Yj01V1WnTpt18880t9TMzM1esWDFu3LjCwsLEu+LMzMy6urrE1us9e/acPXt2h3ZEb6Nz7YdCoX79+u2zwXfffbdfv35CiHnz5l1wwQXTpk2bMWNGXl7ep59+Gg6Hr7nmmp///Octlbu2WocsWrQIwE9+8pP9VTjrrLOmTp369NNPDxs2rF+/frW1tYlJCo8++uj+1szvT3sD/HnnndfOmqNHj77rrrt+97vfPfTQQ7Nnz77zzjsHDRrUoTEREREREREdWfpkeq/4Sa/X/lNimN+d4ZvT+89HHeO0qQfY6aBBgwoLC//1r3+9/vrrRUVFpaWlycnJw4cPHzx48J133rl3MD722GO//vrrF198ce7cuV9//XVNTU1OTk6/fv3OPPPMO++8s/UK7c7pRPtSyv3tXd9yqNuJJ5743//+95577lmxYsWOHTvy8/NvuOGGadOmtdl5rWurtV/ibfd3BHgA06dPP+WUU55++unCwkK73X7eeedNmzZt1KhRHe1LdNNKdcuyhgwZsn79+ltvvfXpp5/uji66Q2Fh4YABAwCMGzeuzboIIiIiIiKi77a9MvTvlSXVjbF9XWx+935CfvJlP+7ptB9oeqcfoO46Rk5RlMQMhE2bNnVTF0RERERERIeV3hmeX4077tJhPXumudu8z7Vr6uBegdsuKvjZiN5M79Q5nTxysD0SJwFu3ry5+7ogIiIiIiI6rKiKGN4/bXj/tMawXtUYawjpdpvid2nZKS6b2l0vUOkHohsDfEpKCoC9jxAgIiIiIiI66vndNr/bdqhHQUeVbvwGqLS0FECfPn26rwsiIiIiIiKiH4huDPAff/wxgP0dCUBERERERERE7dddAb6iouL5558HcMopp3RTF0REREREREQ/HN0S4L/44ovTTz89FAplZmZOnTq1O7ogIiIiIiIi+kFp7yZ27TxiXtf1wsLCysrKxK8PPfSQ1+vt5NCIiIiIiIiIaI/2BvglS5Z0qN3k5OSZM2eOGzeu40MiIiIiIiIiorbaG+DPOeec9lQTQqSmpp500klXXnllTk7OAQyMiIiIiIjoSGYZiNQjUgvVAVcynP5DPSA64rU3wC9evLhbx0FERERERHSUKPsCW5Zg52ro4W8L/TnIOw3HjYE349CNjI5s7Q3wXaKoqGjx4sU33XTTweyUiIiIiIjoIGnchf8+hfJ1+760fgEKF2LAxTjxZ1AOahajo0M3ngO/t6+++mrKlCkHs0ciIvr/7N15eFXVuTj+9117OFPmEcJkmBFwQLC2UOfi3DpErsNTsYq9VO3VihbHb2lL+1ClVvR364OWtrHafgVBi6ilVwqiDDILhCBDIAmZk3NOzrTHtd7fHzvm8g2D4SQYq+vzl9ln7bXWPj0PT9+91npfSZIkSZK+II27YMVDx4/eO3Ebdr0B/3wK7ERvDbtkyZLrrrtu9OjRwWBw2LBhU6dOfeGFF2zbPlH7N998s6ysrLS0NBAIDBky5PLLL3/22WeP276wsBCPUVRU9O1vf3v+/PmO4/Sk/4qKCkTMzMzsybN/3XyhAbwkSZIkSZIkSdJXU+QwvP9zsOLdatywE/71KxBuD8dMJBKTJ0+eNm3aihUrmpqaSktLI5HI//zP//zXf/3XyJEj9+3b16V9S0vLJZdccuONNy5duvTw4cOZmZl1dXWrVq2aNWvW6NGjKysrjztK//79z/jMoEGDwuHwRx999Mgjj5x//vmmafa8/+44ePDgtGnTioqKAoHAmDFj5s6de9w3Dr3b7Gjl5eWI+Ktf/erYj9atW/e9732vtLQ0MzPzvPPOe+yxx9rb23tl0GPJAF6SJEmSJEmSJKlnuA2rfgmOcQq3NOyE7a/1cNiZM2euX79+7NixH374YSQSqaioCIfDu3btuuKKK6qrq2+55RbLsjobp1KpSy+9dM2aNSUlJYsXL25qampubjZNc9WqVRMnTjx06FBZWVkymTx2lLfffvvQZ2pqalKp1KJFiwKBwI4dO44OaNPu/3N98sknU6ZMWbJkSSwWKy4u3rt371NPPTV16tQuAXDvNjtaZWXlfffdd9yPfvOb30yZMmX58uWpVGrQoEF79uyZN2/e6NGja2trezjocckAXpIkSZIkSZIkqWcqV0C88ZTvqngLki1pj1lfX//aa6/5fL533nlnypQpndfHjRv31ltvnXnmmdu3b1+1alXn9eeff3737t3jx4/ftGnTzTffXFRUBACqql566aXvv//+yJEj9+zZs2DBgs8dV9f1u+6668knnwSAxYsX93r/XRDRTTfd1NjYeP/990cikcOHD+/Zs6ekpOSDDz549tlnT1OzoxmGMW3atOO+eti+ffvjjz/u9/uXL1/e1NS0Z8+exsbG2267rbGx8a677urJoCciA3hJkiRJkiRJkqQeIIKKN9O5kdtQ+Xbaw27duhUAzjnnnCFDhnT5yO/3X3/99QCwY8cO70osFnvmmWcA4IUXXhgwYECX9tnZ2bNnzwaAN954o5ujX3HFFQBQVVXlrSH3ev+d3n///YMHD06YMGHBggWBQAAAxowZ8+qrrwLAggULiOh0NDvaj3/84927d5955pnHfrRy5UohxJ133nndddd1PunChQsVRfnggw8Mw0h70BORmQ8lSZIkSZIkSZJ6oOVTSIXTvLd6A0y86/ObHU8qlQKAxsZG13VVtWtk9/DDD9922225ubnen+Xl5eFwePLkyRdddNFxeysrK4tEIgBg27au6587upfBjoi8+LPX++9UXl4OANOmTWPsf5efL7744n79+jU2Nm7fvn3ChAm93qzTa6+9tmjRoh/+8Id5eXl79uzpMjfviXw+39EXNU1TFMW27UQi4YXrpzroScgVeEmSJEmSJEmSpB5o2Zv+vbH67ua9O8bEiRMZY9XV1bfddqiS1QYAACAASURBVFt1dXWXT3Nzc8eOHVtSUuL9WVFRAQDf+c53TtRbVlbWrFmzZs2a1c3oetmyZQAwcuRIL3zt9f477d+/HwC6vBdAxAsvvBAADh06dDqaefbt2zdz5sxx48Y999xzx51bWVmZqqrl5eXbtm3zrriu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u3fvHj9+/KZNm26++eaioiIAUFX10ksvff/990eOHLlnz54FCxZ87ri6rt91111PPvkkACxevLjX+++CiG666abGxsb7778/EokcPnx4z549JSUlH3zwwbPPPnuamh3NMIxp06Yd99XD9u3bH3/8cb/fv3z58qampj179jQ2Nt52222NjY133XVXl8aO46xZs+baa69ta0v/EG6PAvgnnnjiJz/5SSwWCwQCF1xwQed1VVUNw5g3b94999zTk/4l6SQc4Vjc0pme7cvRmZ9QhK1w0k0oDAkICJJ2Imq1tdvRgOoPqAEFlHCy7XC8qjnV5GWYT9oJlyxyBQCiQOZlnAfwts4jA84IkIAEACIgCQYCAFAgJXiyOdUUMcP9gyUBNdjH34UkSZIkSZLUp96pfuuU70GI27G19as+v+UJbN26FQDOOeecIUOGdPnI7/dff/31ALBjxw7vSiwWe+aZZwDghRdeGDBgQJf22dnZXv3vN954o5ujX3HFFQBQVVXlLVz3ev+d3n///YMHD06YMGHBggWBQAAAxowZ8+qrrwLAggULOteMe7fZ0X784x/v3r3bO2rdxcqVK4UQd95553XXXdf5pAsXLlQU5YMPPjAMo7PlfffdFwwGL7nkkg0bNpzqN3C09LPQb9y48de//jUAzJgx43e/+11GRgZiR6bu733ve3/729+mT5++aNGiu++++5vf/GZPpihJx3KEHbEi7XYkYrepwCJO1HCSpp0iohQ3VKa5xDXFl3ASDBWf4gcAF3icxxVkCmoKKBY3o07EdjkCIAIxBABgBMCAAIlIAGMdP2kgJAZACEAkABERyBWuwtQMLSNTHoCXJEmSJEn6GmtKNdYnj6R37/aWzVMHXZPevalUCgAaGxtd11XVrpHdww8/fNttt3VmFi8vLw+Hw5MnT77ooouO21tZWZl3Dtq27ZOfBvd4GeyIOg6d9nr/ncrLywFg2rRpjP3v8vPFF1/cr1+/xsbG7du3T5gwodebdXrttdcWLVr0wx/+MC8vb8+erpssvCfqTBDg0TRNURTbthOJhPeOAADGjx9/5513AkAqlfrrX//a/cfvIv0VeG/zwxVXXPHyyy9nZGR0+fSWW27xDvf/7ne/S3sI6YtkcTPhxA3X+PymfS1uxyqjFXvCO1uM5pgV29temXKSAdWvKz5vpZ0RKcAUQkECkbnCjlhRW9gKKCTIh1pQDbkkGDDR8Y8OEJAgIgHACb33bgoK4e2PR8SONgCErKM4fKPRELFa8/2FffttSJIkSZIkSX3rlDfPH+VwrMpKdxf9xIkTGWPV1dW33XZbdXV1l09zc3PHjh1bUlLi/VlRUQEA3/nOd07UW1ZW1qxZs2bNmtXN6NrL+T1y5EgvfO31/jvt378fALq8F0DECy+8EAAOHTp0Opp59u3bN3PmzHHjxj333HPHnVtZWZmqquXl5du2bfOuuK77+OOP27Z98cUXFxb+b6Qwc+bMl19++eWXXz7RRv1uSj+A37x5MwDMmjXrRA1uvvlmANi9e3faQ0jH4sR7PbMAEbUYTY2phjaztdlobEzV05fjWDcRpdxk3I4ZruEK17uYcpP7o59uaFhbnahixLK07JCWkefLy9Xzs7RcQFBQcYgLBBddIrCF0263R63WuNWe4qkUT8XdeJvZErPaAZQAUxERgCEBICEiKkAIRAAcGBIxQOwI4ZEIkIEgQhDkxt1Ui9VySqlKJEmSJEmSpK+eiBVO+14Cilpp5v8eNmzYI488AgBLliwpLS09//zzn3rqqbVr1x63utuBAwcAoLS0NO2peoQQhw4dmjNnjheIzpgxo3f7P1ZDQwMAHB0Me7wrjY2Np6MZAJimOW3aNCHE66+/3rmQ3sWkSZOWLFmCiBMnTpw4ceLUqVMHDx787LPPTp06denSpWk87OdKfwv9kSNHAKBLmYGjeV/Bsa+CpPSY3GwzW003ZXIzoAT6hwac5Oi1ANFuRW1uq0zJ0LOAgCFq7PjvuuJOPOWmWozmgBqwuJnvL4xakVxf3ml7lG5xhdtkNNrcajYaE3bCr/qy9dwMLTNihDe1bWx3ogDUlGzKDxQG1GC2L9cWjk2mIC6EEIILEAgKIAluuUQMhMktVWFEZHGDC2KIJEhRGBAgEgEgMUQgICRAZIRAKEAQEUMGgAhABABKx1n5APMbTqrZaC4IFPXtdyVJkiRJkiT1IcP10psRAH5O0+NJuekkZvfMmzfv7LPPfv755zdu3Lh58+bNmzfPnTs3FApdcsklM2bMuPbaaxVF8Vp6a8uDBg1KY5SJEyce9/pVV131wAMP9Lz/kyAiL6jOy+sanuTn58NnIXfvNvM8+OCDn3zyyaJFi457+r1TSUnJgAEDIpGIl5IAABDx7LPPPrq6Xi9KP4DPzs5ubm6urq4eOHDgcRt4ofsZZ5yR9hDpSaOm35efK9wWo6kqdsBwkw3J+oAaGJQx5IysYbn+/MbEEZPbjDHHtVwQQBDQAo6wNdSjdsTmlk/xqagBkKb4+gdLMvQMFTUEjNsxl1xd0U1uNqTq8/0FOtODaqghVa8zHXyfP6teR0CucA03ZbipiB1pTNbHnbglrMOxg9latuGk/FrQ4laz2WC6RpAFCeFgfF+BvzhHzWk2GuN2zPHyyQMXBAQCATgREQgERG65LiAiATEhiDFGDhEBJy9HHUMgQkJCIgRwiSnM+2/ystghCiIAIEJERUEEAAV7oRajJEmSJEmS9O8rQ8sCgPSidwDI7Lg9Tbfeeuutt97a2Ni4atWqVatWvf/++7W1tStWrFixYsVll132xhtv5OTkAEBBQUFVVVV6+c+PrgMPAD6fb+zYsddee+2dd97ZmQetJ/13R+dAXXSp/dZbzRYvXrxw4cJbb7312GTyR1uzZs1VV12lKMr8+fPLysry8/N37979s5/97JlnntmyZcvKlSs1TTvJ7WlIP4A///zzV6xYUV5ePnny5OM28A5FnHXWWWkPkYZPPvnkyiuvbGxs9Pl8/fr182r6vf/++//85z//rWN4w01x4hG77UBkf7sdNYWxo21rppbncouAVFQsYevMRwwdbumouiAK/AVnZJQG1cxPo3vyfHkO8ZSTHJgxsH9wIAI2mY0pO6kwdWj2MFe4goQgAQCcOABwEq1miyscjenZerbKevlndywCCpttCScetsIOt0xhxu246aZidjsnnuvLa002WWS7VospjISdQEQTTQUUANBRJaCwGRbIOecCBRAAkEBC7xg8Q+KADAEEERIQcIZEAgGQd4T0QOi9MyUAIOAADAmBiDqS1yEQICKSIEQgEDbZQrh5/vzT/eVIkiRJkiRJX2b5/oK071WZmu3L7fkc+vXrd/vtt99+++0A0NzcvHnz5scff3zVqlWzZs1atGgRAIwcOXLTpk3eRvcTWb16dTgcPuecc4YNG3b09bfffvu88847+QR60v9JIGJxcfGRI0fC4bD3JqJTOBwGAO+Qf+82q6qquueee4YPH75w4cKTT+/+++83TbO8vPyOO+7wrlxwwQUrVqy44IILVq9e/eqrr/7gBz/o5pN2U/qLhw8++CAivvzyy88999yxp7Lfe++9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udVEq57UFCmlZdnu6rK7cmZhwh81uFWPawxY3iwMZ+cdUzpOsLRXXCqVSqVSqdRcJDppxg2pE4OZBavIkb/cd/QSUqr13W8kmzcc0mDEzHsvsU59w2Fes91un3XWWffeey8AFIvFgYGBsbGxWq0GAPPnz//Zz352QBHxqampCy+88O677+78t7u7u1qtKqUAYOHChT/5yU+WL1++//hOAN/f329Z1jOvUo2OjnZOOeGEE+677779o78XNP8LCuC3bdv26U9/+u677261WgsWLLjooos+8YlPPPuJw5Edtr9169a9733vu/LKKz/72c8e8KFf/epXX/3qVx9//PHp6emlS5euWbPmU5/6VKFQOGDYAw888KUvfWnz5s179+5dtGjRqlWr/uZv/mbBggW/9bXvb45F7B577LErrrjiE5/4xGz8L4RYvHjxypUrX7nR++8swYTF7SWlZctKK07t/4PV/aeuKK54bfdJeTPncEcqDQAcBXZy34GINAIhA4bQab2GjDjyRKtYJ2ESKZKaAJAI9nWE15oQgAkgJKUVARjcJIJ6Up/0p6SKNWjdKWwHDAEBOGdIpIEIEZABMOgskkeURCqsRVNT4eh0NElABhoGNw1m5s08avASP1AeAgtV1E7asY4N5AZYNrcNNAwhBJomcke4ZaucNfIOt23DGcrOr5hdNroC+b7+9qAZIWfMEhZC55UCIut8UQsmbG4CKsHNsfaIYLyWzFSj6d2t7fW45iXNZtyIVNjnDPQ6vcvyy4/KL56Xnb+4sDSN3lOpVCqVSqXmzGBGxe7qdfvLduX3K3oH8G78t0ON3gGAyPvf6+S2g5QDf0E+9KEP3Xvvvcccc8w999xTq9U2btxYrVafeOKJs846a9euXe985zujKJod7Pv+6aeffvfddw8MDNx4440TExOTk5NhGK5fv37VqlU7duw4//zzPc979lVuu+22Hc/YvXu37/vXXnut4ziPPvro3/3d3x3+/L/VY489dtppp910003NZrO3t/fJJ5/867/+6zVr1sRx/OIN29/mzZv/4i8Ong/yla985bTTTrv11lt93x8eHt60adNVV1119NFH79mzZ/9h3/rWt04++eT/+I//qNVqS5cu3b59+/XXX79ixYpbbrnlBX0q5hjAb9q06etf//rXvva1kZEDUztSLxIGbDgz7/W9p7y26/Wr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vbSmpuawFYwxl19+eUVFxW233Xbw4MGdO3d+8MEHhYWFr7322rx5805ya4GjsnXrVhGpr683n7Vjx45kNw04Mrpf9Cd0yADQpyhjTLLbgKM2Z86cP//5z4lEwnubk5Ozf//+DnVefPHFadOmnXnmmRs2bND6kys1r7766pQpU/Lz8/fu3auUOqmNBnomkUiEQqG8vLzy8vJktwXoDbpf9Bt0yADQ13AHPiWNHz/++uuvnz179qxZs7qq89RTT4nIzJkz234+isjkyZPz8/MrKio2bdp0MhoKHL1du3YlEonRo0cnuyFAL9H9ot+gQwaAvsZOdgPQGzfffLP3orKy8umnnz5sHW/M26RJk9oXKqXOP//8xYsX79ix48wzzzzR7QR6wfvqjho1asmSJc8//3x5efnIkSPPOeeca6+91rbpspAC6H7Rb9AhA0BfQ+fbb+3bt09EOk9Q75VUVFQkoU1AD3gTJj311FMLFizwSl555ZU//elPDz300OLFi0eNGpXU1gFHRveLfoMOGQD6GobQ90/GGO834oABAzpsys7OFn5Bog9rm/H4kUce2b59+4EDB1auXDl+/PjS0tJZs2Y5jpPc5gHdo/tFf0KHDAB9DXfg+7mupkpiKSP0WZMnTy4oKJg6dWrbMONp06atXr169OjRGzduXLx48VVXXZXcFgI9QfeLfoAOGQD6Gu7A913RaFS1c//99/d8X6VUXl6eiBw4cKDDJq+ksLDwODYV6IWuvuElJSV33XVXh4eEMzMzr7vuOhHZuHFjEtoK9BjdL/oTOmQA6Gu4A993XX755a2trW1vx44de1S7FxYWlpeXV1dXDxs2rH15dXW18AsSfcDRfsO9hy137dp1YpsFHDO6X/R7dMgAkCwE+L7rr3/967HsPmLEiLfeeuvNN98855xz2pevXbtWRIYPH34sBweO3WG/4fX19U8//XQkErn66qs7bKqqqpJPfzUCfRndL/oHOmQA6IMYQt9vXXvttSLy7LPPti98++23d+3addppp7GIEfqmSCTywAMPfPvb337nnXfal7uuu3z5chH54he/mKSmAT1F94v+gQ4ZAPogAny/NW3atOLi4jVr1sybN88rqa2t9X5W3nrrrUltGtAlpdR3v/tdEZk5c+b777/vFdbV1d18883r16//8pe/fNlllyW1gcCR0f2if6BDBoA+SBljkt0G9F5lZWV+fn5OTs7+/fs7b3377bcvvvjiqqqqESNGFBUVrVu3rqmp6brrrnvsscdsm6cn0EclEomLLrro5Zdf1loXFxf7fL5t27bF4/GRI0euWLGCEZtICXS/6B/okAGgryHAp7buA7yIlJWV3XXXXatXr66vry8uLr7hhhvmzp3b1eJGQB8Ri8WefPLJJ554YseOHfF4fPz48RdccMFdd90VDAaT3TSgp+h+0T/QIQNAn0KABwAAAAAgBfAMPAAAAAAAKYAADwAAAABACiDAAwAAAACQAgjwAAAAAACkAAI8AAAAAAApgAAPAAAAAEAKIMADAAAAAJACCPAAAAAAAKQAAjwAAAAAACmAAA8AAAAAQAogwAMAAAAAkAII8AAAAAAApAACPACg/3AcRymllCotLe3dEaZOnaqUmjp1ajd1Vq5c6Z1l48aNbYXqUzfddFP3p3j22WfbKv/rX//qqtoXv/hFr86UKVO6Odr3v/99dTiBQGDs2LElJSVLly7tvj0AACBVEOABADie/vnPfzqO002FniTqrVu3tl0deO211/bt23e0zYjFYlu2bHnuuedmzJgxderU5ubmoz0CAADoawjwAAAcT/v373/ttde62hqLxVasWHHEgyxcuFBEbNsWEdd1lyxZ0n397OzszZ/16quvPvzww8OGDRORl1566d577z26jyFy3333KaW6+SwAAOAkI8ADAHDc5OXliUg3efvFF1+sq6vzqnXjH//4h4hccsklEyZMkE/zfDd8Pt8XPmvy5Mlz5sx57733xo0bJyLz5s2rrq7u+QeJx+NPPfVUz+sDAICTgAAPAMBx881vflNEnn32Wdd1D1vBGz/vVetKaWnpli1bRGTWrFkzZswQkbVr1+7evbsX7QmFQvfcc4+IOI7z3nvv9XCvQ4cOzZ49u6ysrBdnBAAAJw4BHgBw3OzatWvhwoW9nkCuHzjvvPPy8vIqKyvXrFnTeWsikVi+fLmIXH755d0cxLvfnpaW9vWvf92raYxZvHhx75o0ZswY78VHH33Ufc1du3b97Gc/KykpGTRo0N/+9rfenQ4AAJw4BHgA6Ff27NmjlCooKBCR9evXf/3rX8/JyQmHw6effvqCBQu8OqtWrbrooouys7MjkciECRMeeuihw0669sorr1x22WX5+fmhUGjUqFFXX331+vXrO9TZtm2bUmrIkCEiMm/evJEjR1511VV///vf2yo0NTXdfffdY8aMCYVC+fn5V1555bvvvts2V3xra2svTuqprq7+8Y9/fP7556enp+fl5U2fPv3111/v7Z/tuLEsy7u7/swzz3TeumrVqpqamqFDh5511lndHMQL8CUlJeFweMyYMd4Y+COOou9K261771vRjQ8//PDXv/71c88919jY2LtzAQCAE4oADwD908KFC7/61a/W1taWlJSMGjXq3XffveWWW+69995HH310ypQpNTU106dPHzduXGlp6R133PHTn/60/b7xePzuu+++8MILly9fXllZ2dLSsnXr1qeffnrixIneeOzO/va3v82dOzcej4uIUsorLCsrmzhx4m9+85uPPvqopaWlsrJy8eLFEydOfPrppzsf4ahOumbNmgkTJvz+979fs2ZNfX19VVXVsmXLJk2a1HaRIomuuOIKEVm6dGnnUfTe+PkZM2a0/Yk6W7du3c6dO0Xkqquu8kq8m/D//e9/t23b1ov2PPLII96LL3zhC93XPPfcc9vmwHvppZd6cS4AAHBiGQBAP1JeXi4igUAgGo0uX77cK3Rd9/rrrxcRrbXW+vHHH2+r/6Mf/UhEbNuur69vK/zlL3/p/R8xe/bsNWvW7N69e+XKldOmTfMK58+f31bTe0w6Go1Go9HRo0cvW7bs448/dl3XGBOPx0eNGiUiWVlZCxYs2LJlS2lp6e9+97tgMNj2f1BLS0svTlpdXZ2ZmSki4XD4N7/5zfr16zdt2jR//vxoNKr1JxemN2/e3Ls/4IUXXigiF154YTd1/vOf/3hn+e9//9tW6JUsXLgwkUgMHDhQRFavXt1+L8dxvLnr1q5dW1tb69VfsWJFh4PffvvtIpKdnR2LxbySd955x6t8//33d27MbbfdJiL5+fkdymtra994441LL73U23fGjBk9/yMYYyoqKrwdV61adVQ7AgCAE4cADwD9ihfgReTOO+9sX/7+++975ddee2378srKyg5ZdM+ePWlpaR0ys+eGG24QkfT09JqaGq+kbZ6zESNGNDc3t6/s3QwPBoMfffRR+/JVq1Z1DvBHdVIv4gaDwdLS0vY133vvvVAolPQAb4y58cYbReT2229vv5e3HtvgwYNd1+0qwDuOk5+fLyI33XRT+/KRI0eKyOmnn965MV6A715RUdG+ffuO6u9AgAcAoA9iCD0A9E/Tp09v/3bo0KGHLc/NzfVCb1ukXLBgQWNj42mnnXbHHXd0OOb8+fNDoVBdXd0rr7zSYdOdd97Z/ta6iPzhD38QkRtvvNG7D99m0qRJF110UYfdj+qkTz75pIjcdtttp59+evua48aNu/nmm6UPaBtFbz4N9tJu/vluxs+vWrXKS86zZs1qX+7NRf/OO+94s9P33MCBA2+99db33nvPuy4AAABSGgEeAPqnU045pf1by7IOW95+k+eDDz4QkalTp3bOmdFo1HuOet26dR02nXHGGe3fJhKJ//3vfyJy8cUXd27bJZdc0qGk5yfdu3dvfX29fJppOzhs4ck3efLk7OzsPXv2rF271isxxjz77LNypBZ6y7/n5uaeeuqpNe1MnjzZq7Bo0aLD7pidnb25k71791ZVVT3yyCPRaPQ4fjoAAJAsdrIbAAA4IdqeBu9heRsveM+fP3/+/Pld1amqqupQUlhY2P7tzp07vQntiouLO+/e+SJCz0/q1RQRb1R5B8OHD+9q95PJtu2SkpLHH3/8mWeeOffcc0XkrbfeKi8vz8vL+8pXvtLVXvF43Av5VVVVubm5h62zaNGitskC2vP5fEecow4AAKQ6AjwA4DMOHDggIoWFhQMGDOiqTud4GQgE2r9taWnxXhx2uLjP5+v1Sf1+fzdH7jCaoBe8w3pXH7rStrWbqyEzZsx4/PHHlyxZMm/ePKVU2/j5bnZZuXKl93foxocfflhaWkpWBwDg84kADwD4jFGjRu3Zs+fGG2+89957e32QESNGaK1d1925c2eHZ+BFZMeOHb0+aduN97KysrPPPrvD1t4ttNZedna2iHT/qHnbVm+2+cO64IILsrKyysvL169fP3HixJ6Pn8/IyKisrOxwQURENm3adOaZZ4rIokWLCPAAAHw+8Qw8AOAzxowZIyLr168/7Nbnnntu6dKl+/bt6/4gwWDQmzZv5cqVnbd2ngOv5ycdOHBgRkaGfDonXAcrVqzovmFHdNZZZ4lIVVXV22+/fdgKxpjnn39eRAoKCgYNGtTVcXw+32WXXSYiS5Ys2bx587Zt27KzsydNmtRV/ebm5uXLl4tISUlJ5/QuImeccYb3gEBXj8EDAIB+jwAPAPgMb/7zF1544YUXXuiwadGiRSUlJddcc02HCecPy1v+bcGCBdu3b29fvmHDBu92dK9P6i3S9tBDD7WtjefZvn37gw8+eMSGdW/WrFlZWVkicuWVV7atsdfGdd1f/OIXa9asEZE77rijm/nk5dP77UuWLFmyZImITJ8+vZsR/s8//3xDQ4OIfOtb3+qqjje5/fbt2zds2NDzTwQAAPoNAjwA4DPOO++8a665RkSmT59+zz33bNq0qaam5sMPP/zVr3517bXXisjtt9/uRdzu/fCHPxwyZEhTU9M555zzxBNPbN269X//+9+jjz46ZcqUgoICr07bA+FHddK77747MzOzubn5S1/60rx58zZt2rRly5Y///nPZ599dmNjY2Zm5rF8/MLCwscee0xEysrKhg8f/uMf/3jp0qUbNmxYuXLlww8/PGHChPvuu09Epk2bduedd3Z/qKlTp2ZkZOzatctbUe/yyy/vpvLChQtFJDs721uI/rBmzpzpveAmPAAAn1NJXoceAHBclZeXe917RUVF+/K2WeU2b97cYZdIJCIiL730UlvJgQMHunpa+zvf+Y7rum01y8rKvPLq6urOjdm0adOwYcM6HKGoqGjz5s0i4vP52lfu+UmNMWvWrOk8fF1r/cgjj0ycOPGwH/Oo/OUvf+lqHnit9fXXX9/583pbFy5c2L7QuyohIpmZmbFYrK28trbWK1+xYoX31hs2/73vfa/7hnmj6AcPHtz2B7nttttEJD8//1g+b2fecvQismrVquN7ZAAA0GvcgQcAdJSVlfXMM88sXrz4yiuvPPXUU8Ph8JgxY2bMmPH6668/8cQT3Y8bb2/ChAkbN278yU9+8uUvfzkcDhcVFf3gBz/YvHmzNxjemy6udyc977zzNm/ePHfu3PPPPz89PT07O/viiy9++eWXb7311m984xuzZ8/uZjb7npg9e3ZZWdkDDzxw2WWXjRs3LhwODxkyZMqUKbfccsvmzZuffPLJDo3vStsliW984xud595vs2zZstbWVhG58soruz+gdxO+vLz8zTff7OmHAQAA/YUyn940AAB8PlVXV7/77rtjxoxpG9l+oj333HMlJSWTJ09+9dVXT84ZAQAA+gHuwAPA511OTs7Xvva1457eb7755qysrOuuu67zpt/+9rci0s3D3gAAAOiMAA8AOCEuvfTS2trav//977/97W/r6+u9wp07d15xxRVr165NS0s7bLYHAABAVxhCDwA4Ue655577779fRGzbzsvLq6ur85K8z+d76qmnrrrqqhN69k2bNnVYwa57Z5xxRucp9wAAAPoOAjwA4ARat27dgw8+WFpaumvXrvT09BEjRowdO3bOnDmnn376iT71LbfcsmDBgp7XX7BgwU033XTi2gMAAHCMCPAAAAAAAKQAnoEHAAAAACAFEOABAAAAAEgBBHgAAAAAAFIAAR4AAAAAgBRAgAcAAAAAIAUQ4AEAAAAASAEEeAAAAAAAUgABHgAAAACAFECABwAAAAAgBRDgAQAAAABIAQR4AAAAAABSAAEeAAAAAIAUQIAHAAAAACAF/D8d9weUcA2fsAAAAABJRU5ErkJggg==" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeZwdVZk//uc5p6ru1nsn6SxNFkICkU0FhkUUkIwii6Cssg3b6wUKLqPyYvk6bsiMv5cy6jiDAm4IssjgMhNUjCM6soksAiEBQvakk+70em/fe2s75/n9UeFO2Z3upNuGTpvP+69aTlWdOufepJ97NhYRAgAAAAAAAIA9m5rsDAAAAAAAAADAriGABwAAAAAAAJgCEMADAAAAAAAATAEI4AEAAAAAAACmAATwAAAAAAAAAFMAAngAAAAAAACAKQABPAAAAAAAAMAUgAAeAAAAAAAAYApAAA8AAAAAAAAwBSCABwAAAAAAAJgCEMADAAAAAAAATAEI4AEAAAAAAACmAATwI/rABz7Ar1uwYMFIyT70oQ/Vkk2fPj19iodpbm4WkeE3ueuuu4Ynvuiii0bJ3mc/+9l04jlz5lhrd/N1hmtsbDziiCMuuOCCH/3oRzvN4STK5XK1fD700EN7bR7G5+yzz67l/MMf/vBkZwfeWKhuAAAAgL9tCODfVP39/StXrhx+/Iknnhjrre655570bkdHx+9///txZ6xYLD799NP33HPPhRde+I53vGPFihXjvhWM7uabb66FWEcfffRkZwcAAAAAAKYMBPBvtscee2z4wbEG8E888cSaNWuGHLz33nvHn62/vPn73//+SqUyIXcDAAAAAACACYEA/s32+OOPDzlSLpdffPHFMd3k7rvvHn7wwQcfDMNwdy73PO+tKQsXLvQ8L51g3bp1n/nMZ8aUJQAAAAAAAHhDIYB/sw1vgX/qqaeMMbt/hyiK7r///uHHe3t7H3744d25w+zZs59Lee211wYHB7/+9a8zcy3NkC76AAAAAAAAMLkQwL9JFi1alGy89tprnZ2d6VO1/vMzZsxobGzc5a1+9atf9fT0JNue59XuTH9FL3rXdT/+8Y9fcskltSOdnZ21p4wuCILbb7/9tNNOa29vz2azc+fOfc973nPdddd1dXWNdMkf/vCH888//8gjj5w5c2Y+n1+0aNEJJ5xw4403bt26daw53/2nP/bYY+l5+4IgGJLg6KOPrp29+eabdz8PE/g6iU2bNt14442HHXZYa2trNpudN2/emWee+eMf/3iU+QW3b9/+//7f/zvooIMKhcK0adNOPPHEn/zkJ+N7es3DDz982WWX7b///o2Njdlstr29/aSTTvra175WLBaHJ+7r63tfyoYNG+I4/uY3v3nkkUc2Nze3tLQce+yx1113XalU2s2nb9iwIX3Dcrnc0dFx5ZVXzp07N8nM+eef/+yzz9aefv311y9ZsiSfz8+ZM+fEE0/83ve+N1Jx7X7xdnZ2pj8zL730EhH913/917HHHltfX//b3/42nbhUKt18881vfetb6+rqZsyYccYZZzz11FNEdOutt9beYqff0D2kukeycuXKK6+88p3vfOfs2bPr6uoOOuig00477atf/erg4OBIl4zj34RxFAIAAADA3khgBGeccUatlObPnz9SsvPOO6+WbNq0aelT6XK++OKLtdbJ9k9/+tN0slNPPTU5fsYZZzQ1NdUuufDCC3f6xHPPPbeW5tRTT73ppptqu4VCoVwuj/t1vv/976fz/Nhjj+2ijESeeeaZefPm7fSj1djY+M1vfnNI+mKxuHTp0pE+jZ7nfeMb3xhySTabrSVYtmzZuJ/+6KOPphP4vj/kQUcddVTt7Je+9KXdycOYXueaa64ZKeWKFStqyb71rW/lcrmdJjvqqKM6OjqG18Ly5ctbW1uHp//0pz991lln1XavuuqqkepxiI6OjuOOO26k3DY3NyeRVdq2bdvSaZ544ol3vOMdw6/dZ599Xnjhhd3Jw5CZFJcvX97S0jLkbp7nPfDAAytXrpw9e/bwZy1dujSO4yG3HVPxDnmpFStWfPGLX6zt/uY3v6mlfP7554d/FF3Xveeee9L1PuRzNdb8JCa8ukcSx/Hll1+u1M5/521tbb3zzjuHXzXWfxPGVwgAAAAAeycE8COa2AD+mmuueetb31r7OzudbNq0acnxr3zlK7sM4IvFYvov3R/84Acvv/xy+kH33nvvuF/nBz/4QfpWK1euHL2IXnrppUKhsNM/u2vuu+++9CXpXx92Smu9fPny9CUjBc9jffobEcCP6XV2J4D/1re+NfoN99tvv76+vnTe/vznP48U/BBROujdzYiuq6tr7ty5o2eDmX/wgx+krxoS6x588MEjXXvMMcdYa3eZjSEBfH19/U7v1tDQ0N7ePtKz/vVf/zV9z7EW75CX+vrXv57erQXw27ZtG7KEZE0mkznmmGNqu0M+V3tCdY/ihhtuGD17juOkf8WQcf2bMI5CAAAAANhroQv9m+fYY49NNtLD4FevXt3d3Z1sp//QH8mDDz5YrVaTbdd1Tz/99P333/+QQw6pJfhrxq6nQ1zHcfbbb7/R01900UXlcrm2e9xxx91www2f+MQn0sHMlVdeuXnz5mT7kUceSY/eP/LII2+44Yabb7750ksvzefzyUFjzLe//e3dye1Ynz7hxvo6bW1tBxxwQO33GiLKZrMHHHDAAQcckEwiuG7duk9+8pO1s4cccsi3v/3tBx544Oqrr65133jttdc+9alPpbNx7bXX1j4SRLTPPvucd95573znO5N79vb2jvW9rrjiio0bN9Z2586de8UVV1x//fXpNnkR+chHPrJ+/fqRbpLMy7hkyZIzzjjjiCOOSJ96/PHHh3Q+3x2lUqlQKJx44oknnXRSJpOpHS8Wi0kV77///mecccb++++fvirdqWR8xZtWa35PzxZBRDfffPP27dtruzNnzjz33HOTKgiCYPi8lX9Nfia8ukeybt26L3/5y7Xdww477MYbb7ztttuuu+66mTNnJgfjOE6Pu6Gxfyv/+koBAAAA2LtM9i8Ie64Jb4GvDX/1PK/W/HvnnXcmBzOZjO/7u2yBP/HEE2sJTj755ORguhe953m9vb1jfZ0oiv7jP/4j3Vf2oIMOGr18fvOb36Rf8Gtf+1rt1JAGyVqn2c997nO1g+9973vTd6uVAxEtWLAgfWqnrd/jePqEt8CP73W+9KUv1U4dddRR6VOf+MQnaqcOPPDAarVaO5Ved0BrvWnTpp2WwxVXXBFFUXLqySefHNIsvDtNss8991z6kve+970DAwO1s9/5znfSH5KPfvSj6WJPX5jJZNJDRYaM/R4+UGK4IS3w++6777p165JTL7744pBW6Jtuuik5ZYxJh5Se59UKZBzFO+SliOiUU055+umnK5VKEARhGIrIhg0b0os4nHrqqZVKJbn8T3/6Uy3WTaQ/V3tCdY/ivvvuq91q//33Tw9G2LBhQ+0nKiJau3btTrO3O9/KcRQCAAAAwN4MLfBvnloLfBiGTz/9dLJdm8Hu8MMPT7cr7tSWLVseeeSR2u7ZZ589ZCO5+YMPPjj6fTo6Oo5IWbJkSWNj49VXX22traW58cYbR7/JT3/609r2wQcfnP5DvK2t7WMf+1ht9/e//32yoZQ69XXpBESU/uN+06ZNoz96fE+fcBP4Ool0e/5nPvOZ9K8GF1xwQW0IhjHmRz/6UbL9zW9+s5Zmv/32u+222xzHSXaPPPLIf/mXfxnD+xAR0Y9//OPadj6f/+EPf9jQ0FA7cvnll59zzjm13QceeGCk+1x77bXp34zOO++8dD+RV199dawZ+8IXvjB//vxk+6CDDkoPsF+0aFHt46qUuuKKK2qnwjCszcU4juId4u/+7u/++7//+7DDDsvlcp7nua5LRLfddltt+cb6+vq777679uPC4YcfPkr/8D2hukeRzNiX2L59+5YtW2q7c+fO/fznP3/N62qz2Y3jW/nXVwoAAADAXsWZ7AzsRdrb2+fOnZt0Tn7ssceSCKTWvXZ3+s/fe++9tRg76T+fbCe96F944YVasnQMM1z6F4Sdete73vWhD31o9Mw8+eSTte0PfvCDQ85ecskltUHLtW4Fn/3sZ4cki+N4/fr1zzzzTHpusN0xjqdPuAl8HSLasGFDetb6448/fkiC44477s9//nOyXfvdJ92t4Oqrrx4y39hFF130yU9+cqeTxo8kfcNzzz13xowZQxJcc801tbbZbdu2rV27dt999x1+n3RXkcTixYtrH9F0L+vdNKQffrpaDzvssPSL77TGx1e8Q1xzzTVDOs/TX5bY+eefP2QhidNPP33RokWrV6+ekPxMeHWPorm5ubbd29u7YMGCY4455pRTTjnllFMOPvjga6+9dvglY/1WTkilAAAAAOxVEMC/qY499thkjHoSt5dKpVo/4Z1O2T1Eug1q6dKl6b+wzz777Fp09Lvf/a6jo2On83Lvjg9+8IO33XbbLpOl//IePul0e3v7xz/+8Z1eODAw8Otf//rhhx/+05/+tGrVqiiKxpHJcT99wk3I6xDRunXr0ruzZs0aJXHysRkcHEwv9XfggQcOSeZ53sKFC4f0ih9duqF1yZIlwxMccMAB6d3NmzfvNIAfPqlbunF1HEb5IWZ3fqMZR/EOt9NZIdJ3Hl4FzHzooYcOD+D3kOoexZlnnnn99dfXOhdYax999NFHH330hhtuaG9vP/nkk0899dSTTz65NlKdxv6tnJBKAQAAANiroAv9m6oWpSfz2D311FO1FvWjjz569GtfeumlWmMU/WW3+SG71tp0R+jdwczTpk1bunTpPffc8+CDD6YnWhtJuqFv91u5v/e9782fP/+cc8757ne/+8ILL4w73B3f0yfcRL0OEfX19Y018ZA11Xf6k81Yf8dJF+xOA6rW1tb0WI/+/v4x3X+yjKN4h0uPJqhJl8BOS3unU/rvIdU9irlz5/7qV7+aM2fO8FObN2++/fbb3//+9y9cuHD58uW142P9Vk5IpQAAAADsVdACP6L0xFSj9PhNn0pfslO1YfDd3d2vvvpqrVPookWLhvdVHiI9pRMRXXbZZZdddtlIie+99970ANQh5s+fP6Ttaxzy+Xxt7Gu6YXAUDzzwwOWXX17b9Tzv8MMPf9vb3vb2t799xowZp5122hv69Ak3ga9DRLXBzESklFq8ePEoiZNP2owZM1zXrf1q0NnZObxVtqura0zZaGhoqC2LMHwKNyLq6+sLgqC2O9LqbnuacRTvbmpra6uF1jv9KO60CvaQ6h7dCSecsH79+p///Od33XXX8uXLK5XKkAQbNmw4+eST//jHP7797W+nsX8r37hKAQAAAPhbhQB+RG1tbbXt7du39/f377RNKT0d15AZp4c76KCDGhsbBwYGiOixxx6rBfC7HAAvImNaH+6pp55as2bNwoULd/+SsZoxY0YtWhhlObG09LLS55577re//e1akS5btuyNfvoQQRAMmTUwvRLY7pjA1yGiIb0ennvuuV32OddaL1iwoPYJXLVq1bvf/e50AmPMa6+9NqZszJo1a+3atcn2yy+/PDzBqlWrhqQf0/0nyziKdzftt99+tUJ+5ZVXhicYUmLjzs8bUd275DjOmWeeeeaZZ1ar1eXLl//sZz9btmxZ+psSx/Ett9ySjO4Z67fyjasUAAAAgL9V6EI/otoEyIlbb711eJr/+Z//Sf/JPuSS4ZRSta7yjz76aG3Op10OgP/f//3f9NLcu2PIwl0T7vDDD69t33///ekZ7Ino+9//fu51S5cuJaJyuVyLDInoc5/7XPoHkZHWyp6opxNReuErIlqzZk16d/369ens7dLEvg4RHXLIIbUGSWtteg7wUSxatKi2feutt8pfLl547733jrXjcfqjeN9999Va42vSE6FPmzZtyLrre6zxFe/uSP9Mdvfdd/u+nz776KOPPvPMMxOVnwmv7pH4vv//pfT39+dyufe///3f+973tm3btmzZsvRbr1y5MtkY67fyjasUAAAAgL9VCOBHdNppp6VbaL/whS/80z/9U22WpoGBgTvuuGPIVO1DxqXvVC1AevDBB3t7e4ccHEl6+jrHcd46gvQY3Tc6gD/11FNr26+99to///M/13a7u7u/8IUv+K9773vfS0TJcuLpS2rbL774YjosfCOeTsNmILvppptqE3R1dHRccMEFQ8Kh0U3I66THzBcKhZNOOqm2++Uvf3lI4htuuOFtr7vpppuSg+lhFCtXrvzYxz5Wi5qeffbZnU4VPrr0Z7hcLl9yySW1TtFE9N3vfjc9vcJZZ501fFb2PdP4ind31D5gRNTV1XXllVfGcZzsrlq1aqRxLntIdY8km83+27/92/Wvu/3222unlFKnnHJKepL59vb2ZGOs38o3rlIAAAAA/mZN5iL0e7ydroWey+WGrBSVOP7444dcnj57zTXXJAfTC7knmpqarLXJ2XQr7oUXXpgc9H0/ffz0008fKcOf//zn03d+/vnna6fSi3LPnz//ry+cOI6HdNE//vjjP/vZz376059ODyUoFArr1q1LLmltba0dr6+vP/vss7/4xS9edNFFQ/rNOo6TflD67LJly8b9dBEZMp3Y/PnzzzzzzHe/+92FQmFIpXzpS1/aZR7G9zpf/epXa6fq6upeeeWVcrkcx7GIvPzyy+mBvieddNJdd921bNmyW2655ZRTTknf8NVXX03uZq099NBD049buHDhxRdffOKJJw4ZIEBEV1111e7U7Pve9770VQsWLPjIRz7ymc985oQTTkgfz+fz6bIdMmB+xYoVQ2574YUX1s5ecsklu8zGkFnHt23blj571llnjfReI104juLd5UsljjzyyHSyfffd9+KLL166dGltQfia9OdqD6nukZx33nm1Wyml/uEf/uG22267++67b7311ksvvTQ9fP2mm25KLhnHt3IchQAAAACwN0MAP5ogCE4++WTaDfvtt9+WLVuGXJ5OUAvgy+Wy67rpUyeffHLtkp0G8A8++GA6/f333z9ShocMwb3uuutqpyY8gBeRJ554YpczS6Vze/HFF4+UrKWlJb1bKpVqV+00eB7H00VklOXxHMdJL8u3OwH8+F7n5z//+fD0tcjw+uuvH/2NmPmrX/1qOm+//vWv00t5DZFeKnw3I7qtW7fudO7xIdm4++6701ft+QH8OIp3NwP43/72t6P0REjXzpDP1Z5Q3SNZu3btLmfWJKL29vb0P33j+FaOoxAAAAAA9lroQj8az/N+9rOf/fu///sos9Plcrlrr732j3/8424u4JTP59/2trelj+xyBrv0/PP19fWjTG++ePHiZDroxH333Sdj6RY+VkcdddTDDz880l/5LS0tt99++znnnFM78o1vfGOn8+odc8wxv/vd79JH7rvvvgl/OhFdccUVH/jAB4YnzmQyd95551iHc4/vdZYuXZoeyTzEzTff/MlPfnKkaLChoeGuu+761Kc+lT7493//9z/84Q+HdyIgojPOOGOsk+ET0cyZM5988slR1jVsbW39yU9+csEFF4z1zpNuHMW7O0444YTvfOc7w9vAiei888679NJLJzA/E17dI1mwYMGyZctG+awmaR566KH0P33j+Fa+QZUCAAAA8DcJs9Dvguu6V1999aWXXnrHHXf86U9/WrNmzZo1a3zfX7hw4cKFC9/ylrd8+MMfHutE3Mcee+xTTz1V2x19AHxfX99DDz1U2/3gBz84vF9u2oc+9KFnn3022d6wYcMTTzyxyx8I/hrHH3/82rVr77jjjoceemjFihW9vb0zZ85csmTJkUce+Y//+I9D5u1vamp6/vnnb7nllp///OerV69OBvNfeumlF154ITNffvnlGzZsSFL+4he/uOKKKyb26USklPrJT35y//3333nnnStXruzs7Gxra1u6dOmnPvWpJUuWPPnkk3V1dUnK+fPn7/Lp43udfD6/fPnyL37xi4888khHRwcz19XV1TokK6VuueWWSy655LbbbnvkkUc2bdpkjNlnn33mz5//gQ984IILLqjlMO38888/+uijv/GNb/ziF7/YvHlzNps96KCDLr/88osvvvimm26qrXR4wAEH7PKlEu3t7Y8//vgvfvGLH//4x48//vi2bduCIJg2bdrBBx/8vve97/LLL99pNvZ84yve3XHZZZe9853v/NrXvvbwww9v2bIll8sdeuihH/nIR84555yPfvSjE5ufCa/ukRxxxBGvvPLKL3/5y7vvvnv9+vVbtmzp7Oxsampqb2+fN2/eBRdccPrppw/vDjCOb+UbVCkAAAAAf3v4DW2hBQDYy1100UW1TjRf+cpXPv3pT09ufgAAAABg6kILPADA+P32t7997rnnku1CoXDVVVelz1Yqld///ve13Z2OuQAAAAAA2E0I4AEAxq+zszPdqF4qla6++up8Pk9EmzZtuuqqqzZt2pScamlp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zvL57tJrJ3uDarrc6nzjYGtnPBjUZQfenCWSps5GdZ1CxLvg7Fy3/8zqhUlVXVpa/bEzV59ZOQcnuU9WWl2BXOgtL2TtZ1bPTUPdz1pnOoutJH1y5dyTK+fu10tFRERE3wcDPBER0dtuMe8sZO1ao3fOi/u+j0/EbXaX3nLjj529+uzGxRcPd9442dubDq4unommy+3OWrvfcsmZ7uL+ZHBcFctZB0Aq/uZw7+b4pAj1cquTJel7l84utTq9NL+8sPoTm4910rcupC9krYWMfemIiIjeuRjgiYiI7gcRyfw/99du5pL3r53vp/moLl893n18aeNib/nq4tqwKh9d2nCCXtYyg4hcH+wfTsd3p8NJVZQhVojnugummMbqYm+l/W3pnYiIiN75GOCJiIjmiUCuLq4PqumZzkLq/FLecSJ5+60D8J5e2bz38Uk5vTU6VDMAXtwjCytsQEdERDSPGOCJiIjmz0LWXsjaP+CDF/N2Jz07rkuBdNM8cd+/hp+IiIjegRjgiYiI3v2atfoHfRZERET0z8Jr8ERERERERERzgAGeiIiIiIiIaA4wwBMRERERERHNAQZ4IiIiIiIiojnAAE9EREREREQ0BxjgiYiIiIiIiOYAAzwRERERERHRHGCAJyIiIiIiIpoDDPBEREREREREc4ABnoiIiIiIiGgOMMATERERERERzQEGeCIiIiIiIqI5wABPRERERERENAcY4ImIiIiIiIjmAAM8ERERERER0RxggCciIiIiIiKaAwzwRERERERERHOAAZ6IiIiIiIhoDjDAExEREREREc0BBngiIiIiIiKiOcAAT0RERERERDQH5jLAf/KTn1xfX/9u977++uuf+MQnNjY22u32U0899bu/+7tVVd3P0yMiIiIiIiL6oZu/AH94ePgnf/In3+3e55577id+4if+7M/+bDAYnDlz5qWXXvrt3/7tj3/848zwRERERERENNfmKcDXdf3Zz37253/+5w8ODr7jA8zsF3/xF3d2dn7jN37j6Ojo+vXrL7zwwubm5t/93d996lOfus9nS0RERERERPRDNDcB/pOf/GSn0/mZn/mZL3zhC9/tMX/zN3/z+uuvP/vss5/+9Kfb7TaAp5566o/+6I8AfPrTnzaz+3e6RERERERERD9UyYM+gR/U+973vl/5lV8BMJlM/viP//g7PuYP//APAXziE59w7s0LEx/72MfOnj27s7Pzla985dlnn70vJ0tERERERET0QzY3Af7Xfu3Xmg/u3r373QL8q6++CuCnf/qnv/lGEfmpn/qpP/3TP7127RoDPBEREREREc2puQnwP4jt7W0A396gvrllZ2fn25/y/PPP/9Vf/dW9T3d3d9/OEyQiIiIiIiL67/TuCfBm1kT0lZWVt9y1urqK7xLgv/jFL/7Wb/3WfTg9IiIiIiIion+OuWli94MTke94OyfJERERERER0fx696zAi8iZM2e2trYODw+Xlpa++a7Dw0MAm5ub3/6sj370o7//+79/79Pt7e3f+Z3feZvPlIiIiIiIiOif7N0T4AFsbm5ubW3t7+9fvXr1m2/f39/HdwnwTzzxxBNPPHHv0xdffJEBnoiIiIiIiN6B3lUl9I899hiAf/iHf3jL7c3o+EcfffQBnBMRERERERHRD8O7KsD/0i/9EoDPfOYz33zjl7/85Rs3bjzzzDOcIUdERERERETz610V4D/+8Y9fuXLlc5/73Kc+9anmluPj4ybV//qv//oDPTUiIiIiIiKif5Z3VYAXkT//8z/f2Nj4zd/8zccff/xnf/Znz58//41vfOOXf/mXf/VXf/VBnx0RERERERHRf793VYAH8Oyzz37+85//hV/4hePj489//vMXL178vd/7vT/4gz9IkndVuz4iIiIiIiJ62MxfrD1z5oyZfY8HPPbYY3/xF39x386HiIiIiIiI6D54t63AExEREREREb0rMcATERERERERzQEGeCIiIiIiIqI5wABPRERERERENAcY4ImIiIiIiIjmAAM8ERERERER0RxggCciIiIiIiKaAwzwRERERERERHOAAZ6IiIiIiIhoDjDAExEREREREc0BBngiIiIiIiKiOcAAT0RERERERDQHGOCJiIiIiIiI5gADPBEREREREdEcYIAnIiIiIiIimgMM8ERERERERERzgAGeiIiIiIiIaA4wwBMRERERERHNAQZ4IiIiIiIiojnAAE9EREREREQ0BxjgiYiIiIiIiOYAAzwRERERERHRHGCAJyIiIiIiIpoDDPBEREREREREc4ABnoiIiIiIiGgOMMATERERERERzQEGeCIiIiIiIqI5wABPRERERERENAcY4ImIiIiIiIjmAAM8ERERERER0RxggCciIiIiIiKaAwzwRERERERERHOAAZ6IiIiIiIhoDjDAExEREREREc0BBngiIiIiIiKiOcAAT0RERERERDQHGOCJiIiIiIiI5gADPBEREREREdEcYIAnIiIiIiIimgMM8ERERERERERzgAGeiIiIiIiIaA4wwBMRERERERHNAQZ4IiIiIiIiojnAAE9EREREREQ0BxjgiYiIiIiIiOYAAzwRERERERHRHGCAJyIiIiIiIpoDDPBEREREREREc4ABnoiIiIiIiGgOMMATERERERERzQEGeCIiIiIiIqI5wABPRERERERENAcY4ImIiIiIiIjmAAM8ERERERER0RxggCciIiIiIiKaAwzwRERERERERHOAAZ6IiIiIiIhoDjDAExEREREREc0BBngiIiIiIiKiOcAAT0RERERERDQHGOCJiIiIiIiI5gADPBEREREREdEcYIAnIiIiIiIimgMM8ERERERERERzgAGeiIiIiIiIaA4wwBMRERERERHNAQZ4IiIiIiIiojnAAE9EREREREQ0B5IHfQJERERE9FZaDK0uJW25vKN16ZIMzj/okyIiogeMAZ6IiIjoHcRMq9vfiMN9+MSqqdVFsrQJ53x/PV15ROtCzCRtQeRBnykREd1vDPBERERE940B3xq8TbUYWgyS5K7VA1De/Gp1+4VwdDuWo7h/Q7KuX72QLp1Lzz0V9m5I3gYgaZ6uXm4e/z1oMQzDPWh0eVd8Fod7GiqXd5KlTZd337bvkYiI3i4M8ERERERvuzg5CUdbVhdm4vOW6yxBLZxsVzuvwCJcqrFy4tLVR+r9m5NXPwfXCkc36t1Xpb3c9j5Z2hx/9d/H6SBbuZgsbsAliCG78D757nX1cXxY712r7rxooYJLwvFtnZxI3kn6a61Hfyw//7QkOUxhxuJ8IqJ5wQBPRERE9EOjdRFP7looJcl8f71Z6LZqWu++Xt15wZzUt1+QVj8ebiHv1sPdNO3EyUkc75mJae07i3E6hKnVZZwcWzERFYRq/MLfxv1rBqu3X042HvXtBUAshvz8eyXrfMczCcd3qu2X/OKZcLw9fv4/6WjffJqtXtByXN55of3Ex1zagnPO54D6pc1kYcP31liZT0T0TsYAT0RERPRPY3URRwcWg2v1fHcFIhZKLceIoT7cqm5/ox7s6PgwWXkkP/dU/sj7rS6qOy/4xTPhcCuc7FWv/YMTK/dvi/N1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fuYzn/nCF75gjDnR+M53vvP222/v6+s7B31jjDHGGDtvVKbUXPlzmaNPqdYsABAAIth8ZeWfPKtechM4xhhj7Bw5gwD/1re+9YEHHjil8e6773788ce3b9+ez+fPascYY4wxxs6nnvJAvOF/TJMuPnm3uzghhOevvW70t/4OlXu+u8YYY+xn1OkG+LvvvruT3jdu3PjpT3963bp1x44d+6u/+qvvfve7R48e/eQnP3n77befy34yxhhjjL2iil4Ao1v9Ul962Tt85fV1Lw944p0xxth5hUR0Ose97W1vu/fee1esWLFjxw7f9zuNRPTWt771vvvu6+npmZ6ePpf9fIXs2rVrw4YNAHDjjTfec88957s7jDHGGGOMMXauPPPMM1u2bAEArbXk0h6vBuI0j9u7dy8AfOQjHzmR3gEAET/xiU8AwMzMzNTU1LnoH2OMMcYYY4wxxuD0A/zBgwcBYOPGjae0n2i5OGbgGWOMMcYYY4yxC9PpBvg0TQGgVCqd0v7CFsYYY4wxxhhjjJ11pxvgGWOMMcYYY4wxdh5xgGeMMcYYY4wxxl4FOMAzxhhjjDHG2Mv08MMP//Iv//K6desymczIyMj111//zW9+84Vbfc3Ozv7hH/7ha1/72v7+/iAIVqxYccMNN9x1112dW5VPGB8fR8T+/n4AeOyxx9761rdWq9VMJrNp06Y77rijc8xDDz305je/uaurK5fLbdmy5Ytf/KIx5sQZfu/3fg8R//RP/xQA7rzzzquvvrpQKJRKpauvvvorX/nK6b+vBx988O1vf3tfX18QBGvWrHnPe97z2GOPvbwhYmfR6e4DzxhjjDHGGGPsZLfddtsXv/jFEw+PHDly5MiRBx544Oabb77zzjtPtO/bt+/KK69cXFw80XLo0KFDhw79+7//+9e//vV77rlHiFMnVv/pn/7pve9975VXXvmOd7xj27ZtzzzzzG/91m9NTk729vbecsstW7duvfHGG5977rnHH3/8tttuO3bs2Oc///mTX26tffe73/2P//iP5XJ569at+/bte/TRRx999NHvf//7f/M3f5PJZF7iTaVp+pnPfOZzn/vcia8h9u3bt2/fvrvuuutTn/rUn/zJn7zc0WJnA52ezsFdXV19L/AST3Wc5iUuBDt37uy8nRtvvPF894UxxhhjjDF24frmN7/ZyQ6/8zu/8+STT05NTT311FPve9/7Oo333XffiSMvu+wyABgYGPja1762b9++qampxx9//Dd+4zc6R/7zP//ziSPHxsYAwPO8fD7/7W9/u9Nore2cVgghhPjKV75y4vgPf/jDAKCUajQanZaPfvSjADA4OIiIn/vc56y1nfb777+/XC4DwK233nri5U8//XSnD1rrE42f/exnO40f+MAHHnnkkWPHjv3bv/3bm970pk7jF77whXMwlux0nVmAP6ffEVwIOMAzxhhjjDHGTsev//qvA8Bb3vKWkxuttRs2bACAj33sY52WmZmZTsT4/ve/f8oZrr32WgD4xCc+caKlE+BPfnnHjh07Ou3vfe97T24/sZn3tm3bOi2dAA8Av/u7v3vK5e6///7OtwNjY2OdlhcG+PHx8Ww2+6JBvfN+C4XC/Pz8aQ0QOwdOdwn9Lbfc8lNEeMYYY4wxxhi7qMzPzwOA1vrkRkR84IEHWq1WLpfrtBDRP/zDPwDA61//+lPOsGzZMgBoNBovPPmNN9548sORkZEXbe/p6QmCIAzDWq12crtS6kSSP+HNb37z5Zdfvm3bti9/+ct/9Ed/9KJv6o477mi1Wpdccsltt912ylNf+MIX7rrrrnq9/uCDD77zne980Zezc+10A/ztt99+TvvBGGOMMcYYY68i11133be+9a3vfve7b3nLW37zN3/zuuuuKxQKAHDiLuOOnp6e97znPae8dmJi4qGHHrrvvvt+3MmXL19+8kMp5Yu2n/zUyUZHRwcGBl7Yfs0112zbtm337t0/7rqdJck33HADIp7yVD6f37x5c+deeg7w5wsXsWOMMcYYY4yxM3brrbdu3779K1/5yv3333///fcLITZs2PD617/+l37pl66//nrHcU4++Nlnn/2Xf/mXbdu27du378iRI+12+6VP/sKydi/dforR0dEXbV+xYgUAHDx48Me9cO/evfD/s3en4VEV2+LwV+3dYwZC5hAIEIFAIMgUEAUZFURACYQoeA8gIhcVh2PkDzi8oqKiIjKoXODgIV44CiEgEA8iiczzFCADU+apM3UnPQ97V70ftvbJTQJ0Oh0QWb/nfDC1166qzpPj4+qqWgXw1VdfffXVVzeLcR4KQHde6ybwjLHjx48PGTKkVUdBCCGEEEIIoTuM47gNGza89tpr27dv37t37/nz5zMzMzMzM7/99tvu3btv2bJlwIABACAIwrx587777jvGGCGkS5cuI0eO7Nq168CBA1NSUnbu3Nkac7Pb7U22W61WALBYLDd7UavVAkB4eHhAQMDNYkJCQlo8QeSm1krgz5w5s3Xr1q1bt0oFElppFIQQQgghhBC6i3r37t27d+8PPvjAZDKdOnXql19+2bBhw9WrVydPnpybmyuTyT7//PONGzfK5fJPP/109uzZUil4SVpaWivNKj8/v8n2GzduwM3X5wEgKiqqtLR07ty577//fivNDbWEhxP4ixcvSnn7LXZlIIQQQgghhNA9zeFwrFixAgDi4uKioqIAwNvbe9SoUaNGjZo4ceKwYcOKioquXbvWs2fP7du3A8C8efMSExMbdJKbm9tK0ysqKsrIyOjbt2/9RrPZvGfPHgCQJtykHj16HDhw4NSpU00+3bVrlyAIjzzySLt27Tw7YeQizyTwOTk5W7du/fHHH69evVq/vWvXrljeACGEEEIIIfQXI5fLV65cqdFoysvLV65cWf+Rs6pccHAwAFBKAcBZlN7p6NGjJ06cAIDW2LDMGFu0aNGePXvqH8X/4IMPNBoNz/PShXBNmj59+tq1a6VT/ePGjav/aOvWrc8++6xarS4tLfX4hJGLXCqBcDO5ubmffPJJnz59evbs+cEHHziz965duy5atOj8+fPXr1//9NNPPTFPhBBCCCGEEPoTefzxxwFgzZo1n3766fXr13U6XUFBwebNm6dNmwYADz30kJTADxo0CADWr1+/f/9+URQppYWFhR999NGTTz4pXUF38ODBq1ev3uzUutv27ds3atSo1NTU/Pz8X3/9NSEh4fPPPweAmTNn9urV62ZvDR069G9/+xsAxMXFvfvuuxcuXKipqbly5cpHH300Y8YMAHjttdfqnwJAdxhx4/ueoqKi5OTkH3/88ezZs42fnj9/vl+/fp6Y212Qk5PTs2dPAIiLi9uxY8fdng5CCCGEEELoT0qr1Q4YMKCgoKDxo4iIiGPHjknXvGs0mr59+1ZUVAAAx3EymUzK1WfMmDFt2rQnn3xSysjS0tJGjx5dWlraoUMH6a3Q0FBnhzabTaVSAUBGRkafPn3qj+Xr62s0GqXXAWDBggXLly8fP368zWZrfMZ+0qRJmzZt8vPzk368ePGitM1eEATnxgGdTjd37lxp538Dzz///MaNGxvfMIfumGZsoS8v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OTk5r7zySnOnrVKpnP88f/78sWPH7tmzh1IaEhLy22+/LV68eNy4cXV1dc3q050EnlJ66NCh+fPnt2/fftiwYatXry4rKwsMDHzhhRf27t1bUVHxz3/+c/z48QqFwo3OEUIIIYQQQujeUm01/v1IsovZu6TIoH3nZIt2K5eVlW3ZskWpVP78889Dhw51tsfExPz00089e/a8cOFCenq6s3316tWZmZm9e/c+ffr01KlTQ0JCAEAmk40aNSotLS0qKio7O3vVqlW3HVehUMyePfvdd98FgG3btnm8/wYYY1OmTNFoNPPnz9fpdAUFBdnZ2eHh4YcOHVqxYkUrhdVnsVgSEhKa/OrBYDCwprz55psA8MUXX0hhP/744zfffNOuXbtDhw4VFRVlZ2cXFhaOHDly//79n3zySbN+G81I4EVR/O23315++eXw8PARI0Z88803Go0mODh47ty5+/fv12g0//jHP5544ol76944hBBCCCGEEGqhVRm/GR2228f9X6n5lzOqit0e9Ny5cwDQt2/fTp06NXikUqkmTZoEABkZGVKLXq+X8sk1a9a0b9++Qbyfn9/ChQsBYPv27S6OPnbsWADIy8uTFq493r9TWlpabm5u//79V61apVarASA6Onrz5s0AsGrVKmfFdM+G1ffqq69mZmZKxc5d8dtvv3311Vevv/76hAkTpBYpS1+7du2wYcOklvbt2ycnJwcGBm7YsKFZuxJkLsb993//986dO6uqqqQfQ0NDJ0+ePHXq1GHDhvE87/p4CCGEEEIIIfRXYheFbTfOuvEiA7bl2um+wRHujWs2mwFAo9EIgiCTNczs3nrrrenTp/v7+0s/JiUlabXaIUOGDB8+vMne4uPjdTodANjtdlc2U0sV7KQF59bo3ykpKQkAEhISOO4/y88jRowICwvTaDQXLlzo37+/x8OctmzZsnHjxrlz5wYEBGRnZ992trW1tbNmzerTp89nn30mtVit1pycHJlM9sQTT9SPDAwMHD58+I4dO9LS0p5++mkXfxuuJvDr16+X/kFK3YcOHcrzfGVlpSvfoDzzzDMujoIQQgghhBBC95Zj5bkmx21KoN3M/qIc+gjjCHHj3djYWI7jCgsLp0+f/sUXXzRYh/f393dm7wCQlZUFAI8//vjNemvTpk1iYqLro0u3bkdFRSmVytbo3+n69esA0OB7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ypYhR0EQwIkdJIiBDDzRRJ5noIHnGuR/iOwgRoY2YAQG4kC+EZJNQyIpWk2yb3Xprvu57/v7vmv9ngxOS7QSijYsisVT/XwGNShUnbP2fg82zvdd613LkyEAv9yX1SxttpP/8Z32r9225M971CIiIiI/MVcy4H+kzc3N3/zN3/z444+/8pWvvPPOO3/89xHxT/7JPwHw1a9+9fmNTkRE/qxubux87aVbR4uL+UG3Ub9LzyiFNAMIAuaGIaX6la3R1960m9s2qaFTLUREROQF8uJMTZjZr/3arwH423/7b7/77ruXfzmdTv/u3/273/zmN7/+9a//rb/1t57rAEVE5M8kmb+5ffALN9746ttfuPGVW/Vmm9wrJDfAE7aa9Eu3tv7mlzf+xpfbv/pm+/U3q9f2YDoyTkRERF4cL84MPIC/9/f+3je+8Y3f/u3ffuedd27dulXX9UcffTQMw9tvv/0P/sE/cH9x7laIiHxmVZ42Xj/o/+aXLEd+73EJq3Ym4//pK6P/6m2uMipPO2NsNFbpM19EREReNC9UwFdV9U//6T/9+3//7//Wb/3W3bt3h2H4xV/8xV/91V/9jd/4jdFo9LxHJyIiPxl+fav5hVf8+lYcz2xUV1+5mXbGz3tQIiIiIn/uXqiAB9A0za//+q//+q//+vMeiIiI/Lkx+LXN5trm8x6HiIiIyE+VVhiKiIiIiIiIXAEKeBEREREREZErQAEvIiIiIiIicgUo4EVERERERESuAAW8iIiIiIiIyBWggBcRERERERG5AhTwIiIiIiIiIleAAl5ERERERETkClDAi4iIiIiIiFwBCngRERERERGRK0ABLyIiIiIiInIFKOBFRERERERErgAFvIiIiIiIiMgVoIAXERERERERuQIU8CIiIiIiIiJXgAJeRERERERE5ApQwIuIiIiIiIhcAQp4ERERERERkStAAS8iIiIiIiJyBSjgRURERERERK4ABbyIiIiIiIjIFaCAFxEREREREbkCFPAiIiIiIiIiV4ACXkREREREROQKUMCLiIiIiIiIXAEKeBEREREREZErQAEvIiIiIiIicgUo4EVERERERESuAAW8iIiIiIiIyBWggBcRERERERG5AhTwIiIiIiIiIleAAl5ERERERETkClDAi4iIiIiIiFwBCngRERERERGRK0ABLyIiIiIiInIFKOBF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AAAAAAAAgAqAAA8AAAAAAABQARDgAQAAAAAAACoAAjwAAAAAAABABUCABwAAAAAAAKgACPAAAAAAAAAAFQABHgAAAAAAAKACIMADAMD4YYxhZmZev3794Z3hrLPOYuazzjprhDqPPfZYdJUXXnhhqJDf9rnPfW7kSzz44INDlX/5y1/ur9oHP/jBqM4ZZ5wxwtm+8IUv8L7EYrG5c+cuWbLkgQceGLk9AAAAUCkQ4AEAAI6k//mf/zHGjFDhYBL1m2++OfTrwFNPPbVz585DbYbv+6+++urDDz984YUXnnXWWcVi8VDPAAAAAGMNAjwAAMCRtHv37qeeemp/z/q+/+ijjx7wJPfeey8ROY5DRNbaFStWjFw/l8ute6cnn3zy+9///vTp04no8ccf/9a3vnVoL4PolltuYeYRXgsAAAC8xxDgAQAAjpjGxkYiGiFv/+Y3v+nr64uqjeC///u/iegTn/jEggUL6O08PwLXdU94p0WLFl1//fWvvPLKvHnziGjp0qUdHR0H/0KCILj77rsPvj4AAAC8BxDgAQAAjpi//Mu/JKIHH3zQWrvPCtH4+aja/qxfv/7VV18lossuu+zCCy8kotWrV2/btu0w2pNIJL7xjW8QkTHmlVdeOcijent7r7766g0bNhzGFQEAAODoQYAHAIAjZuvWrffee+9hLyA3Dpx66qmNjY3t7e2rVq3a+9kwDB955BEiuuCCC0Y4SdTfnkqlPvnJT0Y1RWT58uWH16TZs2dHf7z++usj19y6des//MM/LFmyZMKECT/72c8O73IAAABw9CDAAwCMK9u3b2fm5uZmIlqzZs0nP/nJurq6ZDJ5/PHHL1u2LKqzcuXKs88+O5fLpdPpBQsWfO9739vnomtPPPHEeeed19TUlEgkZs2a9elPf3rNmjV71Nm4cSMzT5o0iYiWLl16zDHHXHrppT//+c+HKhQKha9//euzZ89OJBJNTU2XXHLJyy+/PLRWfLlcPoyLRjo6Or761a+edtppVVVVjY2N559//u9+97vDfduOGK111Lt+//337/3sypUrOzs7p06d+oEPfGCEk0QBfsmSJclkcvbs2dEY+AOOot+foa776FMxgtdee+1f//VfH3744Xw+f3jXAgAAgKMKAR4AYHy69957P/axj/X09CxZsmTWrFkvv/zy5z//+W9961s/+MEPzjjjjM7OzvPPP3/evHnr16//4he/+Pd///fDjw2C4Otf//qZZ575yCOPtLe3l0qlN99885577jnllFOi8dh7+9nPfnbTTTcFQUBEzBwVbtiw4ZRTTvnOd77z+uuvl0ql9vb25cuXn3LKKffcc8/eZziki65atWrBggX//u//vmrVqv7+/l27dj300EOnn3760I8Uo+iiiy4iogceeGDvUfTR+PkLL7xw6C3a27PPPrtlyxYiuvTSS6OSqBP+D3/4w8aNGw+jPXfccUf0xwknnDByzY985CNDa+A9/vjjh3EtAAAAOLoEAADGkdbWViKKxWKZTOaRRx6JCq21V155JREppZRSP/nJT4bqf+UrXyEix3H6+/uHCv/5n/85+n/E1VdfvWrVqm3btj322GOLFy+OCm+77bahmtE06Uwmk8lkjj322Iceeuitt96y1opIEASzZs0iopqammXLlr366qvr16//t3/7t3g8PvT/oFKpdBgX7ejoyGazRJRMJr/zne+sWbNm7dq1t912WyaTUWrwh+l169Yd3ht45plnEtGZZ545Qp3//d//ja7yhz/8YagwKrn33nvDMKyvryeip59+evhRxpho7brVq1f39PRE9R999NE9Tn7jjTcSUS6X830/KnnppZeiyrfeeuvejbnhhhuIqKmpaY/ynp6e3//+9+eee2507IUXXnjwb4KItLW1RQeuXLnykA4EAACAowcBHgBgXIkCPBF97WtfG17+xz/+MSq//PLLh5e3t7fvkUW3b9+eSqX2yMyRq666ioiqqqo6OzujkqF1zmbOnFksFodXjjrD4/H466+/Prx85cqVewf4Q7poFHHj8fj69euH13zllVcSicSoB3gRueaaa4joxhtvHH5UtB/bxIkTrbX7C/DGmKamJiL63Oc+N7z8mGOOIaLjjz9+78ZEAX5kkydP3rlz5yG9DwjwAAAAYxCG0AMAjE/nn3/+8IdTp07dZ3lDQ0MUeoci5bJly/L5/HHHHffFL35xj3PedtttiUSir6/viSee2OOpr33ta8O71onoP/7jP4jommuuifrhh5x++ulnn332Hocf0kXvuusuIrrhhhuOP/744TXnzZt37bXX0hgwNIpe3g72NGz9+RHGz69cuTJKzpdddtnw8mgt+pdeeilanf7g1dfXX3fdda+88kr0uwAAAABUNAR4AIDxacqUKcMfaq33WT78qcif/vQnIjrrrLP2zpmZTCaaR/3ss8/u8dSJJ544/GEYhm+88QYRnXPOOXu37ROf+MQeJQd/0R07dvT399PbmXYP+yx87y1atCiXy23fvn316tVRiYg8+OCDdKAWRtu/NzQ0zJkzp3OYRYsWRRXuu+++fR6Yy+XW7WXHjh27du264447MpnMEXx1AAAAMFqc0W4AAAAcFUOzwQ+yfEgUvG+77bbbbrttf3V27dq1R0lLS8vwh1u2bIkWtJs2bdreh+/9I8LBXzSqSUTRqPI9zJgxY3+Hv5ccx1myZMlPfvKT+++//yMf+QgRPffcc62trY2NjR/96Ef3d1QQBFHI37VrV0NDwz7r3HfffUOLBQznuu4B16gDAACASocADwAA79DV1UVELS0ttbW1+6uzd7yMxWLDH5ZKpeiPfQ4Xd133sC/qed4IZ95jNMFhiE4b/fqwP0PPjvBryIUXXviTn/xkxYoVS5cuZeah8fMjHPLYY49F78MIXnvttfXr1yOrAwAAvD8hwAMAwDvMmjVr+/bt11xzzbe+9a3DPsnMmTOVUtbaLVu27DEHnog2b9582Bcd6njfsGHDSSedtMezh7fR2nC5XI6IRp5qPvRstNr8Pn384x+vqalpbW1ds2bNKaeccvDj56urq9vb2/f4QYSI1q5du3DhQiK67777EOABAADenzAHHgAA3mH27NlEtGbNmn0++/DDDz/wwAM7d+4c+STxeDxaNu+xxx7b+9m918A7+IvW19dXV1fT22vC7eHRRx8duWEH9IEPfICIdu3a9eKLL+6zgoj84he/IKLm5uYJEybs7zyu65533nlEtGLFinXr1m3cuDGXy51++un7q18sFh955BEiWrJkyd7pnYhOPPHEaILA/qbBAwAAwLiHAA8AAO8QrX/+61//+te//vUeT913331Lliz5zGc+s8eC8/sUbf+2bNmyTZs2DS9//vnno+7ow75otEnb9773vaG98SKbNm26/fbbD9iwkV122WU1NTVEdMkllwztsTfEWvtP//RPq1atIqIvfvGLI6wnT2/3t69YsWLFihVEdP75548wwv8Xv/jFwMAAEf3VX/3V/upEi9tv2rTp+eefP/hXBAAAAOMGAjwAALzDqaee+pnPfIaIzj///G984xtr167t7Ox87bXX/uVf/uXyyy8nohtvvDGKuCP78pe/PGnSpEKhcPLJJ995551vvvnmG2+88YMf/OCMM85obm6O6gxNCD+ki37961/PZrPFYvFDH/rQ0qVL165d++qrr/7oRz866aST8vl8Npt9Ny+/paXlxz/+MRFt2LBhxowZX/3qVx944IHnn3/+scce+/73v79gwYJbbrmFiBYvXvy1r31t5FOdddZZ1dXVW7dujXbUu+CCC0aofO+99xJRLpeLNqLfp4svvjj6A53wAAAA71OjvA89AAAcUa2trdHtva2tbXj50Kpy69at2+OQdDpNRI8//vhQSVdX1/5ma//N3/yNtXao5oYNG6Lyjo6OvRuzdu3a6dOn73GGyZMnr1u3johc1x1e+eAvKiKrVq3ae/i6UuqOO+445ZRT9vkyD8l//dd/7W8deKXUlVdeuffrjZ699957hxdGv0oQUTab9X1/qLynpycqf/TRR6OH0bD5z372syM3LBpFP3HixKE35IYbbiCipqamd/N69xZtR09EK1euPLJnBgAAgMOGHngAANhTTU3N/fffv3z58ksuuWTOnDnJZHL27NkXXnjh7373uzvvvHPkcePDLViw4IUXXvi7v/u7D3/4w8lkcvLkyV/60pfWrVsXDYaPlos7vIueeuqp69atu+mmm0477bSqqqpcLnfOOef89re/ve666z71qU9dffXVI6xmfzCuvvrqDRs2fPvb3z7vvPPmzZuXTCYnTZp0xhlnfP7zn1+3bt1dd921R+P3Z+gniU996lN7r70/5KGHHiqXy0R0ySWXjHzCqBO+tbX1mWeeOdgXAwAAAOMFy9udBgAA8P7U0dHx8ssvz549e2hk+9H28MMPL1myZNGiRU8++eR7c0UAAACAcQA98AAA73d1dXV/8Rd/ccTT+7XXXltTU3PFFVfs/dR3v/tdIhphsjcAAAAA7A0BHgAAjopzzz23p6fn5z//+Xe/+93+/v6ocMuWLRdddNHq1atTqdQ+sz0AAAAA7A+G0AMAwNHyjW9849ZbbyUix3EaGxv7+vqiJO+67t13333ppZce1auvXbt2jx3sRnbiiSfuveQeAAAAwNiBAA8AAEfRs88+e/vtt69fv37r1q1VVVUzZ86cO3fu9ddff/zxxx/tS3/+859ftmzZwddftmzZ5z73uaPXHgAAAIB3CQEeAAAAAAAAoAJgDjwAAAAAAABABUCABwAAAAAAAKgACPAAAAAAAAAAFQABHgAAAAAAAKACIMADAAAAAAAAVAAEeAAAAAAAAIAKgAAPAAAAAAAAUAEQ4AEAAAAAAAAqAAI8AAAAAAAAQAVAgAcAAAAAAACoAAjwAAAAAAAAABUAAR4AAAAAAACgAiDAAwAAAAAAAFSA/w8aKHT6/qgnYgAAAABJRU5ErkJggg==" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4382,22 +4390,25 @@ <h3>Integration with <code>fastMNN</code></h3> chapter of OSCA</a>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICAjIHBsb3QgdGhlIGZhc3RNTk4gY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gXCJmYXN0bW5uX1VNQVBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBieSBzYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gXCJzYW1wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICtcbiAgIyBNb2RpZnkgbGVnZW5kIHNvIHRoZXkga2V5IGlzIGxhcmdlciBhbmQgZWFzaWVyIHRvIHNlZVxuICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArXG4gICMgYWRkIHBsb3QgdGl0bGVcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OXCIpIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICAjIHBsb3QgdGhlIGZhc3RNTk4gY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gXCJmYXN0bW5uX1VNQVBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBieSBzYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBcInNhbXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc3R5bGluZyB0byBoZWxwIHVzIHNlZSB0aGUgcG9pbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgK1xuICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9IFwiRGFyazJcIiwgbmFtZSA9IFwic2FtcGxlXCIpICtcbiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArXG4gIGdndGl0bGUoXCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTlwiKSJ9 --> <pre class="r"><code>scater::plotReducedDim(merged_sce, # plot the fastMNN coordinates dimred = "fastmnn_UMAP", # color by sample - colour_by = "sample", + color_by = "sample", # Some styling to help us see the points: point_size = 0.5, point_alpha = 0.2) + - # Modify legend so they key is larger and easier to see - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + - # add plot title + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN")</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd5xdVbk//udZu506Z1p6MiRACChEpEhvVwRp0rwUg6iAgoLeexFfGL6icgVf/hS9IhcEFb1IFUS9CDYQG0gTkV6SkD7JZMrpZZe1nt8fB849ziSTyWSSYSaf91+7nbVXmdmv85y19losIgQAAAAAAAAAb29qvDMAAAAAAAAAAJuHAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwG/Sqaeeym+ZN2/epi47++yzG5dNmTKl+RQP0dbWJiJDE7ntttuGXvzhD394mOx98YtfbL541qxZxpgRFmeoTCaz//77L1q06I477thoDseQMebmm2/ed999W1tbbdtOp9M/+clPtukdR23GjBmNKrrjjjvGOzsT3o5Tn6MraTweb3zqwQcfHJOcvM3/3cbwIdnW1tY43tLSsn79+o3e8brrrmtOYdmyZWOYAgAAAMC2hgB+u8rlci+//PLQ448//viWJnXnnXc273Z3d//pT38adcYKhcLf/va3O++885xzzjnkkENefPHFUSe1WVdeeeVFF13097//PZ/Pa61LpVKtVmucveaaaxrfjA866KBtl41xMblLRztAAbfS9q+f4f/dtoMtLfKYPCSLxeLll1++BbncBikAAAAAbAsI4Le3xx57bOjBLQ3gH3/88aHdPnfdddfos/XPiX/gAx+oVCpjktoglUrl2muv3RYpA8AgE/TfbUwekrfddtsofhgd2xQAAAAAxhwC+O3tr3/966Aj5XL5hRde2KJEbr/99qEH77vvviAIRvJx13X3brLLLru4rtt8wfLly7/whS9sUZZGaOnSpc2ZXLx48V/+8pejjz56W9wLYAc3Qf/dxuQhKSKf/vSnh3+xaFunAAAAADDm7PHOwA5naOfSU089pbUeeQphGG70LdaBgYHf/va3J5100mZTmDlz5rPPPjsozRtvvPE//uM/Gm+f3nnnnd/61rdGnqsR6u3tbd790pe+5HnemN9lrNx5552N+GfhwoXjm5lJYMepz7dJSSfWv1vD1j8k65555plbbrnl4x//+KhzsvUpAAAAAIwt9MBvJ/Pnz69vLF26tKenp/lUY5Tm1KlTM5nMZpP6zW9+09/fX992XbeRMm3FKHrHcf7t3/7tox/9aONIT09P4y7D+8tf/vKhD33ogAMOmD59eiKRmD9//lFHHXXFFVesW7dus58dXTixevXqK664Yt999+3o6IjFYjvttNPpp59+zz33DJ37qqenp3m6qZdeeomI7r///kMPPTSdTj/yyCPD3+j4449//1v+/ve/1w9ms9njmqxcuTKKouuvv/6AAw5oa2trb28/9NBDL7/88mKxOIqibVHpGorF4jXXXLP33nunUqmpU6eecsopTz31FBHdeOONjXw2/21sUbVsTfsOstH6bPbb3/72vPPOW7BgQSaTicVis2fPfv/73/9f//VfhUJh6MVj2xDHHntso0L+9V//tfnUDTfc0DillMrn841Tzz33XHNNPvfccyMs6Qjdeuuthx12WEdHR70411xzzQhH2WzURv/dRtG+L7/88oUXXnjYYYfNnDkzlUrtueeeJ5100rXXXlsqlUadNxrTh2TDFVdckc1mtyZXW58CAAAAwFgS2IRTTjmlUUtz587d1GVnnXVW47LOzs7mU831fO6551qWVd/++c9/3nzZiSeeWD9+yimntLa2Nj5yzjnnbPSOZ555ZuOaE0888Stf+UpjN5lMlsvlURfnRz/6UXOeH3vsseGrqFAoDDMc13Xd6667rnHxJZdcsqkrP//5zw9/wYsvvthI57vf/W48Ht/oZQceeGB3d3dzDgfNI/3iiy/+53/+Z2P34YcfHr6AsViscfEDDzyw0TQff/zxQw45ZGhm5syZ8/zzz4+k+KMuXd1zzz230047DbrYcZw777yz+aZXX331llbLWLVvo4Abrc+67u7uI444YlMptLW11X/CGKZxR9gQm9L8rvisWbOaT33kIx9pTrD5z+b73/9+4/jUqVONMZsq6ZbWz89//vNTTz116MW77777hg0bNluczf67bWn71kVRdP755yu18V9+Ozo6br311pHkoVHk5oNb+ZBsPt5Ih4g+/elPNyf17W9/u/mmS5cuHcMUAAAAALY19MBvJy0tLXvttVd9e9AA0SeeeKK+sdHwY5BisXj//fc3dj/4wQ829xaWy+Xms1uKmZt329rahr/+4x//+MMPP7yps0EQXHrppcNcMAo33XTTJz/5yWq1utGzTzzxxOGHH57L5Tb18YcffviLX/ziGOaHiD7xiU9sdM6t1atXX3TRRbIla/KNonQ9PT1HH330ypUrB10chuHHPvaxEfb9bqpatlv79vb2HnjggcMso5DNZs8888xbb711mES2siGOOeaYxvbatWvXrFnT2K0PZ2h4+umnN3rqmGOOGfQftDWuvPLKn//850OPv/rqq5dddtmY3GIU7XvllVfecsstm3otvL+///zzz//9738/uvyM1UOSiE488cQZM2bUt2+88cYtfX9+TFIAAAAA2BYQwG8/hx56aH2j+bvpkiVL+vr66tsHH3zwZhO57777GgGe4zgnn3zyggULml+yHbS83BZ59NFHG9u2be+6667DXPyHP/yh+VX8Aw44YPHixddcc83HPvaxRCJRP6i1vummm+rb06ZN23333efMmdOcyO6777777rtPmTKlcUFnZ2fjbCwWq19Qn2Nv+fLll156aePswoULb7rppnvvvffiiy9udJctXbr0s5/97Kby3OhnHsNAq/7Nfo899jjllFP233//5lN//etfG8PRt1Hprrnmmub3nKdPn37mmWcedthhruv6vj90MrCN2mi1jK59hyngMC644IJVq1Y1dru6ui644ILPf/7zzX3yIvKpT31qxYoVm0pkhA2xKXvttVcjYKOmiLFQKLz66qvNVw4TwA+T/pbWT30px1133fXkk08e9Bb9j3/849WrVw9fnM3+u21p+xLR8uXLv/a1rzV299133yuuuOLmm2++/PLLp0+fXj8YRVHjTZxR/EmMyUOSiNLp9Ne//vVGKT796U+P5FNjmwIAAADANjHOIwDexsZ2CP0ll1zSeAnZdd1arVa/ptGp6HlerVbb7BD69773vY0Ljj/++PrB5lH0rusODAxsaXHCMLzhhhuaR8buueeew9fPl770pcbFxx57bPOp5p7SefPmNZ8a1KE3NNmrr766cfbAAw9sPvXv//7vjVPvfOc7q9Vq41TztPyWZa1evbp+fNAoayI64YQT/va3v1UqFd/3gyAYvowjGULveV7zcN9B0xAMGoQ8tqVbuXJlcyB04oknViqV+qmnn366EVPVDTOEfqPVMrr2HaaAm6rPQfMpHnvssfl8vvGRH/zgB81/ls2DmbemITbq3HPPbVx/6aWX1g8O7U+eM2dO/VS5XG4eaN38gsOmXhYYef0Q0U033dQ4ddVVVzWf+vWvf73Z4siw/26jaN+77767cXzBggVRFDVOrVy5shH2E9Ebb7wxwiI3Z28rH5KDjhtjmqP9u+++u37ZCIfQjy4FAAAAgG0NPfDbT6NzKQiCv/3tb/XtxuRM++2332ZndFu7du0f/vCHxm5j8HzzKPogCO67777h0+nu7t6/yR577JHJZC6++OLmkbFXXHHF8IkopU58y2c+85nmU/UuvrrNdhWOXHOH4Re+8IXmaGfRokV77713fVtrfccdd2w0hfe85z2//OUv991333g87rqu4zhbn6vPfe5zzT+OnHXWWc39pa+//voI0xlF6W6++ebGlGbpdPr2229vvD+/3377ffe73x3hrTdaLdutfe+5557GdiKR+PGPf9zS0tI4cv75559xxhmN3XvvvXdT6Wx9QzR3oTd64Bv97fvtt199Y/Xq1fUp1p599tnG1OgLFy5s7sDfeosWLbrwwgsbu4sXL04mk43dQYMCRmEU7Vuf7LCut7d37dq1jd2urq4vf/nLl7xl1LPZbf1DsoGZr7/++savP5dddlmlUtmizGx9CgAAAABjDsvIbT+zZ8/u6uqqDxV+7LHH6i9zNgY5j2Ro6F133dWIsevj5+vb9VH0zz//fOOyCy64YJh0mr8cb9Thhx9+9tlnD5+ZoW9NR1G0YsWKZ555pnlGtLGycuXK5mmxjzzyyEEXHHHEEf/4xz/q241v/INccsklYzh4vq55TETdbrvt1miLcrk8kkRGV7rmVx4+9KEPDZqd++STT54/f/6SJUs2e/eNVst2a9/mUpx55plTp04dmr1G3+/69evfeOONnXfeeWg6W98QRx99NDOLCBE988wzQRC4rtsYJH/GGWesWrVqw4YNRPT000+feOKJIx8/PwqDppdzHGfnnXduvIk9wr+rYYyifZsnxRgYGJg3b97BBx98wgknnHDCCXvttdfnPve5rcwSjcVDstk+++xzwQUXfO973yOiNWvWfPWrX20eDrB9UgAAAAAYW+iB364a/Uv1r6TFYrH+piuNbHKm5o7lo48+uvn7dHMn/B//+Mfu7u5RZ/K0007bbB9+Qz6fv/feey+44IJ3vetd9TWozjrrrJdffnnUd9+U5cuXN+/OmDGD/9l1113XONuo1UGGf6t/dJq7K+sGDYQeidGVrvlT73znOwelyczvete7RnL3YaplO7Rvc0fuHnvsMfSC3XffvXm3eXq5ZlvfENOmTWvUmO/79V9MGlH6QQcd1OiEr3fLb9MAfmhxmnvgx8oWte/pp5/e/MqGMebRRx9dvHjxwoUL58yZc+GFF/7yl78cxWrtg2zlQ3KQa665pjEw/tprr122bNn2TwEAAABgDCGA364aX0DrUzQ99dRTjR71gw46aPjPvvTSS40+WPrniH3QrjGmeVjySDBzZ2fn0Ucffeedd953333N804N44c//OHcuXPPOOOMW2655fnnnw/DcItuukW2aCnmTV3cPDb7bWV0pWuekX7mzJlDr+zq6hpJgpuqlu3Tvs1rvG90FHpHR0fzwOlhVhnYeu973/sa20888cT69evrvxfYtr3vvvs25sYbFMDHYrHDDjts2+VqG9nS9u3q6vrNb34za9asoafWrFnzve997wMf+MAuu+zy0EMPbU2utuYhOVRnZ2djQIHv+83zRG63FAAAAADGEIbQb1JzX9MwA1abT212tu1G51JfX9/rr7/eGAs9f/78oSOHB2meyYyIzjvvvPPOO29TF991113Nk6INMnfu3EFdvqNw7733nn/++Y1d13X322+/d7/73fvss8/UqVNPOumkrUx/ENv+v79VpdRuu+02zMWbbYi3m9GVbtq0acVisb7d398/9Mr6eO/R2W7t29LS0phjfOjsekSUzWZ932/sptPpsbr1UMccc8w3vvGN+vbjjz8+d+7c+vbChQvj8XhzAN/f3//GG2/Ud4844ohRDLsYX6Nr36OOOmrFihX/+7//e9tttz300END3wlfuXLl8ccf/+STT+6zzz6jy9jWPCQ36lOf+tT3vve9ejf+/fffX6vVtn8KAAAAAGMFAfwmTZs2rbHd29uby+Wa5yhuaJ4ca9C830PtueeemUwmn88T0WOPPdb4brrZdztFZIvWh3vqqaeWLVu2yy67jPwjW2rx4sWN7TPPPPOmm25q1M8DDzww5rcbNCjg2WefnXAh0zBGV7pdd9116dKl9e3XXntt6AWvvPLKqLO03dp3xowZjUh4o3OzDSrF2M4VN8ihhx4aj8frKzU+8cQTjf+gAw88kJrmsevr62se5DLm4+e3g1G3r23bp59++umnn16tVh966KFf/OIXDzzwQPNahlEUffOb39zURJKbNeqH5KZYlvWd73znX/7lX+q7v/vd77Z/CgAAAABjBUPoN6kx73fdjTfeOPSa3//+982B06CPDKWUaowCffTRRxszXW/23c4///nPzQtlj8SgZbTGVrlcbgRdRPSlL32p+deNES4/vkUWLlzY6KY2xjRPiD0JjK50zT/Q3H777YM6Bh999NFnnnlmdPnZnu3b/Md/9913N3rjG66//vrGdmdn54IFC8bw7oPEYrHDDz+8vl3vaq5v1wP4adOmNVZWv+GGGxqfmnAB/Cjat1ar/X9NcrlcPB7/wAc+8MMf/nD9+vUPPPBA81/j1sySMOqH5DCOOuqoQe8cbf8UAAAAAMYEAvhNOumkk5rfvL3qqquuvPLKxlTh+Xz++9///qCp2kfyDa/xNfS+++4bGBgYdHBTmruzbNveexOaX2bepgF8faXuxm6jH5iIXnjhheaIa2s0v5SbTCbf//73N3a/9rWvDbp48eLF737LV77ylTHJwDa19aU79thjGxds2LDhwgsvjKKovvvKK68M84bFZo1J+47wnfnm/5pyufzRj360eRGyW265pbmv+4Mf/OCYryMwSHM03pg+rR7AE1FjFH3jR5YZM2bsueeeo7jRNp0zYnijaN9YLPad73zn82+pT8xep5Q64YQTTjvttMaR2bNnb/S+Iyzy6B6Sw7v22msbiyyOVwoAAAAAWw9D6DdpypQpn/3sZ7/61a/Wd4MguPrqq6+++ur6Wtn1EZ7NjjzyyOYYbFMab3g2Umhtbd3o5NsNvu83L399wgkn/OIXv9jolVddddWXv/zl+vbLL7/8/PPPNy+FPYZmzpzZ0dHReO960aJF73//+/faa68lS5bce++9W/OOaPPQ8ddee+3111+fPXu253mWZV177bW/+93v6iuf//SnPz3uuOMWLVrU1tb22muvPfLIIw8++GD9U7Ztb+kcftvN2JbupJNOOuCAA5588sn67o9//ONHH3300EMP7e7ufuyxx+rjwEdn1O07TAE39ZH99tvvuOOO+/Wvf13fffDBBxcuXHjccce1t7c/9thjf/jDHxpXJhKJyy+/fNSFGqGh3ent7e3z58+vb++///4/+9nPhr9+GKOon21hdO17+OGHN9bzW7x48csvv3zwwQcnk8lCofD000/fdtttjSsPOOCAxvYoijyKh+RmdXV1LV68eOjiedszBQAAAIAxILBpvu8ff/zxI6nGXXfdde3atYM+3nzBJZdcUj9YLpcdx2k+dfzxxzc+0jyQ9ZxzzqkfHLSo209+8pNNZXjQi9CXX35549Qpp5zSOD537tytr5xzzz13U7XR3t7evFssFhufevjhh5tPDU22MWi52Ysvvlg/+/nPf35TN61j5muvvbaR2qBJ0RrpjFBz7PHAAw+MMM1zzjmncfajH/3otiudiDzyyCPD9Eg3x0hXX331FlXL6Np3+AJutD5FZN26dRud23xQ2W+//fbmHG5NQwxv0Gv2xx13XOPU0CnW77jjjqEpbKqko6ufusYoAPrn1hzGMP9uo2jfN954YyTTyM2ePbv5YTh8kZsPbs1DcpjjDdVqtTErYcPSpUvHMAUAAACAbQ1D6Ifjuu4vfvGL//7v/x5mdrp4PP65z33uySef3Og6XkMlEol3v/vdzUc2OzlT8/zz6XR6mAnAd9ttt+bJn++++27556/IY+i6667b6CR5Bx988B//+MfmI41eu5E4+uijG72dQ11zzTWXXnrppkLWlpaW22677bOf/ezIb7edjXnpjjrqqB/84AfN73o0nHXWWR/72MdGndXRte/wBdyU6dOnP/HEE8MsEtbR0fGzn/1s0aJFW5ry6AzqVG+OnPfbb7/mBmLmo48+euQpj65+toVRtO+8efMeeOCB4fM/b968Bx98sPlhOIoij+IhORKxWOxb3/rW+KYAAAAAsJUQwG+G4zgXX3zxsmXLvv3tby9atOjAAw+cMmVKOp3ee++9Tz/99CuvvHLZsmVf//rXB/VZDa8xQLRu+Hc7s9lsY/g0EZ122mnDv4fZ/Fr+ypUrG3M4j7nW1tbnnnvuqquu2meffdLpdFtb21FHHVUfxb3XXnudf/75R7/lV7/61ciTTSQSDz300HnnnTdv3jzP82KxWGdnZ2OCN6XUN7/5zeeee+7iiy9+xzvekU6nE4nEggULjj322Jtuumnt2rXbLcYbnW1RuvPOO++FF1745Cc/ufPOO3ue19raesQRR/zkJz+56667tmai/tG17/AFHMbs2bP/+te/Pvjggx/5yEfmz5+fTqdd1505c+axxx777W9/e8WKFc1DSLa1QQF884Dw1tbWXXfdtbG79957b9HaZqOunzE3uvbdf//9X3vttQcffPDss88+6KCDurq6PM+bNm3avvvue9ppp913331LliwZ9NrO6Iq8RQ/JkTv11FO36AeXbZECAAAAwNbgbddDCwDj68Mf/nBj+MY3vvGNyy67bHzzAwAAAAAAWwOT2AFMVI888sizzz5b304mkxdddFHz2Uql8qc//amxu9Hx0gAAAAAAMIEggAeYqHp6epo71YvF4sUXX5xIJIho9erVF1100erVq+un2tvbJ9xa5QAAAAAAMAiG0ANMVMVi8dBDD33++ecbR2zb3muvvXzfX7JkSWPNbcdxfve73x155JHjk0sAAAAAABgjCOABJrCBgYEPfvCDzYulDzJv3rxvfvObp5566vbMFQAAAAAAbAsI4AEmvGefffb73//+iy++uHr16nXr1nV0dHR1de20004nn3zyGWec0bwaPAAAAAAATFwI4AEAAAAAAAAmAKwDDwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPD/ZNmyZbvssssuu+zyyU9+crzzAgAAAAAAAPB/7PHOwNtLEARvvPEGEfX09Ix3XgAAAAAAAAD+D3rgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYABPAAAAAAAAAAEwACeAAAAAAAAIAJAAE8AAAAAAAAwASAAB4AAAAAAABgAkAADwAAAAAAADABIIAHAAAAAAAAmAAQwAMAAAAAAABMAAjgAQAAAAAAACYAe7wzAABve5FPJiLL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t922atWqSZMmvfXWW6lUatOmTclk8uOPP77kkkt27dp1zTXX2LbdH2ya5oUXXvjGG2/U1NQsXLiwvb29o6PDsqzly5dPnTp1x44ds2bNyuVyB/fy6quv7thv9+7dpmkuWLDAMIwNGzYcmNAW3f4Rffjhh+ecc86iRYvS6XRlZeWWLVt+8pOfTJ8+fUDWPbxhB2ppabnjjjsGfenRRx8955xzXnnlFdM06+rqNm/e/Mgjj4wfP37Pnj0Hhj355JNnnnnmH//4x1Qq1djYuH379meffXbixIlLliw5qo+i+AS+urr67rvvdhznX//1X88888yampqqQyi6C0EQBEEQBEEQhC8+b/tn9pv/7yjv8XLPPwPGiu60tbX1hRde0DTtT3/60znnnNN/ffLkyUuWLJk4ceL69euXL1/ef/2Xv/zlxo0bp0yZsmbNmquvvrqiogKALMsXXnjh66+/3tjYuHnz5qeeeuqI/aqqevPNNz/44IMAFi5cOOztD8A5v+qqqxKJxJ133plKpXbu3Ll58+aampo333zziSeeOE5hB8rn87Nnzx700cP69evvv/9+XddfeeWV9vb2zZs3JxKJOXPmJBKJm2++uT9s+/bt9913H+f8N7/5TUdHx/r167u7u3/0ox/l8/mbb755375DbLgYTPEJfCKRSCQSBz7REQRBEARBEARB+ArK//ElcH60d/mt++w1q4ru9IMPPgBw8skn19fXD3hJ1/WZM2cC2LBhQ+FKOp1+7LHHAMybN6+2tnZAfDQavffeewG8+OKLQ+z9kksuAbB9+/bCxPWwt9/v9ddf37Zt26mnnvrUU08ZhgFgwoQJzz//PICnnnqK7//YhzfsQN///vc3btw4ceLEg19atmwZY+zGG2+cMWNG/zudP3++JElvvvlmPp8vXHzmmWcsy/rnf/7nW265pXBF07RHH3304osvTqVSRzUJX3wV+r179xZ9ryAIgiAIgiAIwj8Glu51P9lc3L3O2tXatHOOHDcY0zQBJBIJz/NkeWBmd88998yZMyce7zu1rrm5OZlMnn322eedd96grc2aNSuVSgFwHEdV1SP2XqhgxzkvJL3D3n6/5uZmALNnz6b0r9PP559/flVVVSKRWL9+/amnnjrsYf1eeOGFBQsWfPe73y0pKdm8eeB/5cI70jTtwIuKokiS5DhONpstPCPYtGkTgMIjlQNNnz79tddeW79+/dA/jeJn4GuHrOguBEEQBEEQBEEQvuDczRuLmH7vu3fLZnhecfdOnTqVUrpr1645c+bs2rVrwKvxeHzSpEk1NTWFHws55MUXX3yo1iKRSFNTU1NT0xCz65dffhlAY2NjIX0d9vb7ffrppwAGPBcghJx77rkAduzYcTzCCrZu3XrbbbdNnjz5ySefHHRss2bNkmW5ubl53bp1hSue591///2O45x//vnl5X2HBZ511ll33XXX1772tQG3J5NJALFYbAgfQ5/iE/ivf/3r119//WECGGPnnnvut7/97aK7KMIPfvCDg885IIQ0NDT8PYchCIIgCIIgCMJXBOvqLP5mz2M9qeJuHT169Ny5cwEsWrSooaHhjDPO+MlPfrJy5cpBT3f77LPPABx7WsQY27Fjx0MPPVTYMd6/Jny42j9YW1sbgP5kuF/hSiKROB5hACzLmj17NmPsD3/4Q2Ei/WCnn376okWLCCFTp06dOnXq9OnTR44c+cQTT0yfPv2ll17qD5s7d+6//du/DZjb7ujoeOaZZwB885vfPOKH0K/4JfRvv/12T0/PYQJc1129evWh3upxUvi9EQRBEARBEARB+PvgmfSx3M7SvbRsYD45RI888shJJ530y1/+cvXq1WvXrl27du3DDz8cDAYvuOCCW2655fLLL5ckqRBZmFuuq6sropepU6cOev3SSy/94Q9/eOztHwbnvJBUl5SUDHiptLQU+1Pu4Q0ruOuuuz788MMFCxYMuvu9X01NTW1tbSqVKpQkAEAIOemkk3RdP8xdH3/88TXXXNPe3n7llVdeeOGFh4kc4OgS+EcfffTAHzs7Owdc6cc5X7Nmjeu6gUDgqLo4RoUVEZlMJhQK/T37FQRBEARBEAThq4kcW8pDAsFjuf3aa6+99tprE4nE8uXLly9f/vrrr+/Zs2fp0qVLly696KKLXnzxxcIK7bKysu3bt3d3dxfRRXV19YHbvDVNmzRp0uWXX37jjTcSQgoXj6X9oejvaIABZ78NV9jChQvnz59/7bXXHlhM/mBvvPHGpZdeKknS448/PmvWrNLS0o0bN/70pz997LHH3n///WXLlimKMuCWzs7On//85//5n//ped7MmTNfeOGFw7R/sKNL4H/84x8f+GN7e/uAKwc7//zzj6qLY+F53s6dO2tra0X2LgiCIAiCIAjC3weNxYu/mZBjun2/qqqq66677rrrrgPQ0dGxdu3a+++/f/ny5U1NTQsWLADQ2Ni4Zs2awy9YXrFiRTKZPPnkk0ePHv3/t3fvcVbV9f7432vPDPfLAMJwNUAugmJKSpaZeIHMUEGQSjtiaUfzen5qX83OKevryTqVp4uaekzEr5lXVLxlSSKmKCqKiogKiiJyl5tcZmbv9ftj1xwCGYeLDGvm+fSf2Z/9WWu/N+7HZ+a112d9Ppu233///Z/5zGdqL2BHzl+LJEkqKioWLFiwYsWKze4VL95AXrzJf+d2mzdv3re//e0+ffpcd911tZd3zjnnbNiwYcKECTV3lx988MEPPPDAwQcf/Nhjj91yyy3f/OY3N+1/4403XnDBBatWrerWrdtPf/rTb3zjG3X8d6ixbQH+qKOOqvn50Ucfbdmy5ec+97la+vfr1++HP/zhtta03ebPn19dXd2/f/9d9ooAAEAjV9pvwPYf+6leSa1zrWsxcuTIuXPn3nvvvZvl4U6dOn3lK1/ZZ599evXqNWHChGuuuaZp06b9+vWLiKeffnprZyteEF69evVjjz1W94Bd45M7f9euXRcsWLBs2bLevXtv2r5s2bL4R+Teud2eeOKJ1atXt27detPJ7cVd2K655pp77723S5cukyZNWrZs2axZs8rKyjZb963YMmPGjMcee6wmwK9du3bMmDGPPPJIu3btfvnLX5511lm1z7Hfmm0L8H/5y19qfi6uDLdpS70rzp/v16/fXXfddf/99y9YsKBv375Dhgw55ZRTttxWoWjhwoWbbgbwzjvv7KJaAQCABqGkS9eSLl3z7y/cjmObHPDRt5fX6dgmTV555ZXnnnvuI/Nw165dS0tLq6ur161b17Rp07Fjx/74xz+eNGnSjBkzNtsprWjq1KmrV69u1qxZ7ddot+aTO3+fPn2mT5/+1FNPDRkyZNP2adOmRUTNe9+53SLivffee++99zYrZuHChQsXLuzZs2dEFDeiKysr23KefMuW/3RbRGVl5ciRIydPnnz00UePHz++c+fO2/D+/9n2r0L/jW98Y8SIEdt9+CehOGFjwoQJJ5544s033/zXv/71uuuuO+200w488MDXX3/9Iw/505/+NGwTp5122q4tGQAAyLzmxxy/HUclrVo3PWwbFjDbTHFtucsuu2z9+vVbPvvII49UV1d/6lOfKm4F379//9NPPz1N07POOqt4tXlT1dXVF154YUQce+yxm+1qXkef3PmLs9OLu9bVmDFjxvz58/fdd9+aLwt2Yrdx48alWyjePH755ZenaVpcsa99+/Y9e/Zct27d3/72t81qfuSRRyKi5r6D8ePHT548+ctf/vL999+/I+k9diTA/7//9/+uuOKKLdurq6tfffXVpUt3YCuF7VVzx8XVV189b968FStWPPLII4MGDZo5c+ZJJ52Uz+d3fUkAAECD1+Sgg0v7bvOdvC1GnZg03/4F8M4555wBAwa89tprn//85x9++OF169YV29esWXP99dcXk+rFF19c0/+yyy7r1KnTM888c8ABB0ycOLEY2fL5/PPPP3/kkUe++OKLe+yxx29/+9vtrucTOv/w4cN79er1xBNPFDeui4iVK1cW391ZZ531CXWrozPPPDMixo0bV7yAHxHr16///ve/f//993fo0OHEE08sNl599dURccUVV2xtYnjdJWma7sjxDz744NSpUy+44IKKioqIeO6550aPHl2ciP7Zz372rrvu6t69+w6WWHf33nvvnDlzhg0btumcjZUrV/bv33/JkiW33nrr17/+9c0OefLJJ2+++eZNO99xxx0RMWrUqM2+lQEAANiawupVq3/6o8LyzS8+b03TQw9v+Y1vfny/Wr3yyiujRo2quZDZuXPnysrK4npsJSUl//Zv//aLX/xi0/5z5swZNWrU7Nmziw8rKio++OCD4tLrPXr0mDBhwuGHH75p/44dOy5btuy555772EXstuP8s2bN2nfffZMk2dot8Q899FDfvn0jYsaMGV/+8peXLFnSp0+fPffc8+mnn163bt24ceNuuOGGTSPxzu22me9973s//elPL7/88u9///s1jYVCYcyYMffcc09EdO3atV27dnPnzt2wYUPLli1vv/32r3zlKxGxfv36li1bpmlaUlLykavfn3feeb/85S/r8s8bO7IPfJqmp556ajH9/uu//mtFRUVVVdXJJ59ccxv5M888c8ghh8yZM2f77s6vRevWrdeuXVvzsOYfceTIkVt2Li8vHzdu3M9//vPnn39+ywB/yCGHHHLIITUPZ8+eXQzwDUy6cUNh5QdRVRWlpbk25Tu40QUAALCZXJu2bS68dM3V/51/792P7dzsiOEtTtw8m2yHfffdd/bs2ePHj7/nnnvmzZv3zjvvtGvX7pBDDhk0aNAFF1xQTL+b6t+//0svvXTzzTffeeedL7300vLly7t27dq3b9/DDjvsggsuaN68+Q7Wsx3nT9N0a2vX12zqNnjw4CeffPLiiy+eOnXqu+++26tXr9NOO+3CCy/cLA/v3G51kcvlJk6ceO+991533XWzZ89+++23BwwYcPDBB//7v/97zbJ5b731VvGq+damhBcKhbq/4vZfgb/zzjvHjh0bEQMHDpw8eXLnzp0ffPDBESNGtGvX7r777ispKfna17727rvv/u53vyvOK9iJTj311I0bN9Y8HDt27KhRo2rpf8MNN3z7298eM2bMnXfeWfuZZ8+ePXDgwMjgFfh8mi+khdJcaRKbf+zSysr8ooX5he9FEpFGSZeuuU4VuR2YqwMAAHykdOOG9ZMmbpjyaFRXf2SH3B4dW5zw1SafGfKRz0Lttv8K/LXXXhsR3/rWt4r7CkbEgw8+GBHf/va3Dz300Ii4/PLLx40bd8cdd+z0AH/TTTdt2bhmzZpbb721VatWxc0PN7VkyZL4x8YGDUq+qrD03fzalasKH65r2SptU16SlLRvtkeL0r+H87T439o1+YXvJW3a5Fq2Sjesz7+/MNe8RQjwAACwsyVNm7U48aRmR36p8tlplTNfyC9elK5dEyUluTZtS/fq2+TTg5sMPih2+EZoGq3t/+gU92w777zzam7XmdsAACAASURBVFqmTp0aEUcffXTxYTHGv/322ztSX921atXqJz/5yTvvvDNo0KD99tuvpr1QKEyaNCn+sUhjA5HPb1j0/tqXns4vmrdx49o1ZVVp9+6Fnr3XlbcpRKFry+5J1cYVaxeur1qbRqHZqnWtqyvLmnSMiKRJ04hI8x/9dSAAALDjcu07NPvSiGZfGhERUV0dJSWx7dOzYUvbH+CLiwrWLIK/evXq2bNnl5SU1OynV15eHhELF27PdojbIUmSb33rW5dddtnYsWPvvvvuffbZp1jVRRdd9Mwzz3zuc587/vjt2dpht1MorFmwcNXTT8drLxTWLi/bWLW2vKy6dZPmsah5k3a59l1iY+XahdPXv/nG8tULCiWRb1Oab9Gs+9o27ctKon2Xwvp1ERFlTer7bQAAQOPgejs7z/Z/mPbcc8/XX3/9/fffL64//9e//rVQKAwZMqRmz/piwu/YseNOKbQuvv/97z/xxBOTJ0/eb7/9evXqVVZWNnfu3Kqqqr59+95000253PbvmbebSAvp8lmvrp/+TOnLz+U2rE0jchFtl21cWVkWazfkk7Lm+VzVyy9ULlhRUlXdriTSFqX5PfZYtW/XypbV1U0LJcuWRJIr7d4jV15e328FAACAbbP9mba42FvNDfDXX399RBxzzDE1HYorxvXo0WOHCtwWpaWlDz300LXXXnvggQeuXr160aJFBx988GWXXfbSSy81gBvg0zRdMnf+munPlL34VOn6NUm+UFpISwqFsupov6qq1dJ1TV6Y2+beB1q/tiDWrC/ZWF22rrp0Yz5ZuSq37MNC+/Zp6xZle/UuG7BPrku3pLSsvt8NAAAA22b7r8Cff/75995771VXXTVv3rzq6uo///nPuVxuzJgxEfH6669fffXVV111VUSMHj16pxVbB02aNDnjjDPOOOOMXfmiu8aaNevzb85p9srTZRs3FiJNkkjSNE2SpJCWFiLNReSr05IkSSONQj5K0kiTynxJycb8unX5qupmFe1yHTpHrqS+3wcAAADbY/uvwA8dOvTcc8+NiIceeujPf/5zRJx++unFO8/vueee3/zmN4VCoWfPng0yS9eL6lUr02efKF23IR9pkhY3i0siTXNR3DkuSZLIpRGRJJFL0shFklQV0uq0dVJW3rFPSbNy6R0AACC7dmhBhd/85jeHHXbYww8/vHz58sMPP/ycc86peapLly5HHXXUr371q1atWu1wkURsXJO8NbNs+dJcmqZpRBJJGoVII5I0SYsbxkUu0jQtiSSfJElaiDSXj6RQ0b3lvoe0b98zmrer7/cAAADA9kvSNN3pJ62qqiory+Rd1rNnzy7e2z9q1KiJEyfWdzkREZGmhRVL06XzPnziscoXX02rCkmaRJJGGmkSkSa5iELy9yvvhTRJkohCpLkkTQpV3bsmw0/ofODBJTm7VgAAAGTbJ7KlQTG9V1ZWPvHEE927d+/fv/8n8SqNQbphQ/Xbb6ZLFlS+PL2wZHlUF5I0kkgjknyuUJJP0lzko1ASSSEpxvYoRBRK0g0tStb36tF62PF79B0svQMAADQAn+DOavPmzTvqqKMuuOCCT+4lGra0sjK/6L2qN9+snDOnatnyjStX5NM0l/x9xnxJmktzSZpGSVJSiKQyl+Qjt740NpQli8pL3jio24df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ACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIAAEeAAAAMkCABwAAgAwQ4AEAACADBHgAAADIgEwG+LPPPrtjx45be3bu3Lljx47t1KlT8+bNBwwYcPnll1dWVu7K8gAAAGCny16AX7Fixe233761Z2fOnPmFL3zhzjvvXL16dUVFxWuvvfYf//Efw4cPl+EBAADItCwF+KqqqilTpowYMWL58uUf2SFN09GjRy9atOicc8754IMP3n777VdffbVr166PP/74lVdeuYurBQAAgJ0oMwH+7LPPbtGixeGHHz5t2rSt9Xn00Ufnzp07ePDgX//6182bN4+IAQMG3HLLLRHx61//Ok3TXVcuAAAA7FSl9V1AXQ0aNOjUU0+NiHXr1t16660f2WfChAkRMXbs2Fzuf7+YGDp0aOfOnRctWvTCCy8MHjx4lxQLAAAAO1lmAvyZZ55Z/GHx4sVbC/BvvPFGRBx22GGbNiZJ8sUvfvGOO+546623tgzwCxcufPXVV2sevvPOOzuzaAAAANhJMhPg6+L999+PiC0XqC+2LFq0aMtD/vSnP5122mm7oDYAAADYEZm5B/5jpWlajOjt27ff7KkOHTrEVgI8AAAAZEKDugJflCTJR7Z/5E5y++2338UXX1zzcPny5TfccMMnVRkAAABsr90rwLdu3Xrt2rU1Dy+//PLvf//7dTw2SZKKiooFCxasWLGivLx806dWrFgREV27dt3yqAMPPPDAAw+seTh79mwBHgAAgN3Q7hXgR48evXHjxpqHAwcO3KbDu3btumDBgmXLlvXu3XvT9mXLlsVWAjwAAABkwu4V4G+66aYdObxPnz7Tp09/6qmnhgwZsml7cev4vfbaa0dODgAAAPWo4SxiFxGnnHJKREycOHHTxhkzZsyfP3/fffe1CTwAAADZ1aAC/PDhw3v16vXEE09ceeWVxZaVK1cWU/1ZZ51Vr6UBAADADmlQAT5JkrvuuqtTp04XXnhh3759jzzyyG7dus2aNWvcuHHf/va367s6AAAA2H4NKsBHxODBg5988skTTjhh5cqVTz755J577vnzn/98/PjxpaW7193+AAAAsE2yF2srKirSNK2lQ58+fe6+++5dVg8AAADs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1VW9e/eOiEcfffSHP/zhtr2NiMsvvzxJklreCwCwKwnwAA3H/PnzI2LEiBEDBw6s71oar4qKioioJW//5S9/Wb16dbFbLf74xz9GxDHHHLP//vvHP/J8LcrKyj79z4YOHXr22We/8sor++yzT0RceeWVy5Ytq/sbqaqqmjBhQt37AwCfNAEeoOEoFAoR0bp16/oupFE74YQTImLixInF/x1bKs6fL3bbmpkzZ86ePTsiTjrppDFjxkTEtGnT3n333e2op3nz5v/+7/8eEfl8/pVXXqnjUatWrTr99NPffPPN7XhFAOATIsADwM70hS98oaKiYvHixU888cSWz1ZXV0+aNCkiRo8eXctJitfbW7ZseeyxxxZ7pml6xx13bF9Je++9d/GHOXPm1N5z/vz5l1566ciRI7t163bzzTdv38sBAJ8QAR6gIfje976XJEkx9f3iF79IkqRXr141zy5duvRHP/rRQQcd1KVLl+bNm/fu3XvYsGG33nprVVXVlqeaOnXq6NGj99577xYtWvTs2fOoo466++670zQtPvsv//IvSZI8+uijEXHJJZckSXLooYdGxHvvvZckSZcuXSLimWeeOfbYY/fYY48WLVrst99+1157bfHYKVOmHH300R06dGjVqtX+++//m9/8ZtOV3ubOnVtzhgULFpx11lmf+tSnmjdv3q9fv3Hjxs2bN2/TIrep8y5WUlJSvLp+5513bvnslClTli9f3rNnz8985jO1nKT4v3LkyJEtWrTYe++9i3PgP3YW/dbUXLov/ovV4rXXXrviiivuu+++Dz/8cPteCwD45AjwAA1BRUXFvvvu27Zt24jo0KHDvvvu269fv+JTb7zxRv/+/S+77LLnnntu0aJFGzZseOuttx599NGTTz75xBNP3Gya9/nnn3/YYYdNnDhxzpw569evnz9//uTJk8eMGfPNb36z2KF79+777rtvy5Yta150028KIuK222479NBDV65cOXLkyH79+r388svf+c53fvjDH15zzTVHHHHE8uXLR40atc8++8ycOfP888+/5JJLtnwvr7zyyoEHHvjggw8ecsghxx133LJly26++eb99tvvI5fl26bOu8yJJ54YEXffffeWs+iL8+fHjBmTJMnWDn/66afffvvtiPj6179ebClehH/uuefmzp27HfVcffXVxR8+/elP197z85//fM0aeMWvaQCA3UgKQEPxta99LSIuuuiiTRsHDx4cEV27dp0wYcIbb7yxaNGi6dOn/+u//mvxt8A999xT07Nmb7Ozzz57xowZixYteuGFF0499dRi44MPPljT86ijjoqIn/70pzUtCxYsiIimTZu2bt160qRJxcZCoVA8PJfL5XK53//+9zX9L7jggogoLS1ds2ZNsaV4u3V5eXm/fv3OO++8qqqqYvuSJUuKX0aMGDGi5vBt6rytiu/uqKOOqqXPn/70p+I/y3PPPVfTWGy57bbbqqurO3bsGBFTp07d9Kh8Pl9cu27atGkrV64s9n/ggQc2O/l5550XER06dKisrCy2vPTSS8XO//mf/7llMeecc05EdO7cebP2lStXPvnkkyNGjCgeO2bMmLr/I6RpumjRouKBU6ZM2aYDAYBPiCvwAA3Z0qVLZ8yYERF/+MMfTjnllD59+lRUVBx00EHXXXddcer79OnTazo/9NBDEXHMMcdcddVVBxxwQEVFxf7773/jjTcW17Svy15iGzdu/M53vnPssccWHyZJ8t3vfjciCoXCN77xjW9961s1PS+++OKIqK6u3uyu7JUrV5aXl//6178ubp8WER07dvw//+f/RMQzzzyz2cttU+ddqaSkZNSoUbHFWvR/+9vfFi9e3L17989+9rNbO7ZQKBTvdR8zZkxZWVmxcdCgQX379o2I22+/fWsHLlq0KPln5eXlhxxySHHLuj333PO3v/3tznhzAEC9EeABGrI0TW+55ZZbbrnli1/84mZP9ejRIyLWrFlT07J8+fKIqK6u3rRbkiSTJ09+8803i9fMP1YxuNbo2bPnR7Z36tSpefPmEVFzIbrGv/3bv23WUsyuH3zwwZYvt02dd6WaWfTpP67Mxybrz9cyf37KlCnFS98nnXTSpu3Ftehfeuml4ur0ddexY8ezzjrrlVde6dy58zYdCADsbkrruwAAPkGdOnU6+eSTN2tcuHDhlClTHnzwwc3ahw4deu+99/75z38+5phjzjzzzKFDh7Zp0yYitin4fepTn9r0YUlJyUe2b/rUZrbcxH5rPbe18640dOjQDh06vPfee9OmTfv85z8fEWmaTpw4Mf4RxbemuP17p06dBgwYUPxKpeaEV1xxRUTcfvvtl1122ZYHdujQYfLkyZs1durU6WMXrgMAskKAB2j4Xnrppfvuu++5555744035s+fv27duo/sdu65577yyiu///3vH3744YcffjiXyw0cOPCLX/ziiBEjjjrqqJrp3LXL5T56btfW2rfUtWvXOvbc1s67Umlp6ciRI3//+9/feeedxQA/ffr0BQsWVFRUHHLIIVs7qqqqqhjylyxZ0qlTp4/ss7UAX1ZW9rFr1AEAmWYKPUBDVl1dffrpp++///4/+MEP7r///qqqqsMPP/z888+/5ZZbNpvTHhG5XO5//ud/Zs6c+YMf/OCggw5KkuSVV1655pprjjnmmEGDBj3//PO7pua6R/1t7VxHxfntH7nHXo2aZ2spoHil/a677irOoq+ZP1/LIY888siKFStqL++1116bOXNm7X0AgAZJgAdoyP7rv/7r97//fWlp6S9+8Yvly5e/8cYbDzzwwK9+9auTTz65uOfclgYNGvSjH/1o+vTpq1atmjx58ne/+93y8vI5c+accMIJm90e31B16NAhImq/1bzm2eJq8x/pyCOPbNeu3YIFC4or6tV9/nzbtm03bNiw5cKzxfUIo9al7ACABkyAB2jIiqugn3nmmRdeeGG7du02fWqzHcWrqqp+9rOf/exnP3v99deLLS1btjziiCP+67/+a9KkSRHxzjvv1DzVsH3mM5+JiCVLltQE5s2kaXr//fdHRJcuXbp167a185SVlR1//PERcdddd7344otz587t0KHDYYcdtrX+69evL/5Tjxw5smnTplt2OOCAA/baa68Q4AGgsRLgARqyQqEQEa1atdqs/W9/+9u0adMiomaN9LKysl/96leXXHLJNddcs1nnmmXhNrvavOn66g3JSSedVPyy46tf/erixYs3e7ZQKPzgBz944oknIuL888+vZT352GQWffGblFGjRtWyxt7999+/du3aiPja1762tT7Fxe3nzZv37LPP1v0dAQANgwAP0JANGTIkIq6//vq//OUv+Xy+UCjMnz////7f/3vMMccU58NPmTJlzpw5lZWVETFs2LCI+O1vf3vFFVe88cYbH3zwwdtvv33LLbd8/etfj4jPfvazmwX46dOnV1ZWFr8jaEi6du16ww03RMSbb7651157XXTRRXffffezzz77yCOPXHXVVfvvv//ll18eEcOHDy/uOV+LYcOGtW3bdv78+cU92EePHl1L59tuuy0iOnTocNRRR22tz9ixY4s/uAgPAI2QAA/QkP34xz+uqKhYvnz58OHDmzRp0rx58549e/7gBz8YNWrUww8/nCTJrFmz9t577+L15F/96lc9e/YsFAqXXnppv3792rdv36tXr3/5l3955513evToceedd9actl+/fhFxzz33tGrVaujQofX17j45J5xwwv/8z/906tTpww8//OUvfzlmzJghQ4YcffTR55577ssvv5zL5U499dRbb7219svvEdGkSZPjjjsuIlavXl1eXn7kkUdureeqVaseeuih4kuXlm51j5hNZ9E31BkQAMDWCPAADVnnzp1nzpx57rnnDhw4sGnTpm3atDn66KPvu+++CRMmHH300TfeeOPQoUOPOeaY7t27R0T79u1ffvnln//85wcffHC3bt2aNm3as2fPoUOHXn311XPmzOnRo0fNaX/4wx8ee+yxbdq0adasWUPdZvz0009/8803f/KTnxx//PH77LNPixYtevToccQRR3znO9958cUXx48fX1zr7mPVrFp33HHH1bIV37333rtx48aI+OpXv1r7CYsX4RcsWPDUU0/V9c0AAA1C4vt7AOrFsmXLXn755b333vtjvwJI0/Ttt9+eNWvWiBEjPva029QZACBDBHgAAADIAFPoAQAAIAO2ukwOAGTdCy+8MG/evLr3P+CAA3r37v3J1QMAsCMEeAAarOuvv/7aa6+te/9rr732jDPO+OTqAQDYEe6BBwAAgAxwDzwAAABkgAAPAAAAGSDAAwAAQAYI8AAAAJABAjwAAABkgAAPAAAAGSDAAwAAQAYI8AAAAJABAjwAAABkgAAPAAAAGSDAAwAAQAYI8AAAAJABAjwAAABkwP8PFuucoqGrhgMAAAAASUVORK5CYII=" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd5xdVbk//meVvfep09NDIEAIKESkSJVyRZAmzUsxiAooKOi9F/GF8BWVK/jyp+gVvSCo6EWqIOpFsIHY6IgI0kklySQzmXb6Lmut5/fH0XOPk2QymUwyTPJ5/7XbWXuVmf06z1llC2YmAAAAAAAAAHhzkxOdAQAAAAAAAADYOATwAAAAAAAAAJMAAngAAAAAAACASQABPAAAAAAAAMAkgAAeAAAAAAAAYBJAAA8AAAAAAAAwCSCABwAAAAAAAJgEEMADAAAAAAAATAII4AEAAAAAAAAmAQTwAAAAAAAAAJMAAngAAAAAAACASQABPAAAAAAAAMAkgAB+g0455RTxD3Pnzt3QZWeddVbjsilTpjSfEutob29n5nUTufXWW9e9+AMf+MAI2fvc5z7XfPGsWbOcc6MszrpaW1v333//hQsX3n777evN4Thyzt1000377rtvW1ub1jqfz//oRz/aonccsxkzZjSq6Pbbb5/o7Ex62099jq2k6XS68akHHnhgXHLyJv93G8eHZHt7e+N4S0vLmjVr1nvH6667rjmFxYsXj2MKAAAAAFsaAvitamho6KWXXlr3+OOPP76pSd1xxx3Nu93d3X/4wx/GnLFisfjnP//5jjvuOPvssw855JAXXnhhzElt1JVXXnnhhRf+5S9/KRQK1tpyuRyGYePsNddc0/hmfNBBB225bEyIbbt0tB0UcDNt/foZ+d9tK9jUIo/LQ7JUKl122WWbkMstkAIAAADAloAAfmt79NFH1z24qQH8448/vm63z5133jn2bP1z4u9973ur1eq4pDZMtVq99tprt0TKADDMJP13G5eH5K233jqGH0bHNwUAAACAcYcAfmt77LHHhh2pVCp/+9vfNimR2267bd2D9957bxzHo/m47/t7N9lll11832++YOnSpZ/97Gc3KUujtGjRouZMXn755X/605+OOuqoLXEvgO3cJP13G5eHJDN/4hOfGHli0ZZOAQAAAGDc6YnOwHZn3c6lp556ylo7+hSSJFnvLNaBgYFf//rXJ5544kZTmDlz5rPPPjsszRtuuOE//uM/GrNP77jjjq9//eujz9UorV27tnn385//fBAE436X8XLHHXc04p8FCxZMbGa2AdtPfb5JSjq5/t0aNv8hWffMM8/cfPPNH/nIR8ack81PAQAAAGB8oQd+K5k3b159Y9GiRT09Pc2nGqM0p06d2trautGkfvWrX/X399e3fd9vpEybMYre87x/+7d/+9CHPtQ40tPT07jLyP70pz+9//3vP+CAA6ZPn57JZObNm3fkkUdeccUVq1ev3uhnxxZOrFix4oorrth33307OztTqdSOO+542mmn3X333euufdXT09O83NSLL75IRPfdd9+hhx6az+cffvjhkW903HHHvecf/vKXv9QPDg4OHttk+fLlxphvfetbBxxwQHt7e0dHx6GHHnrZZZeVSqUxFG2TStdQKpWuueaavffeO5fLTZ069eSTT37qqaeI6IYbbmjks/lvY5OqZXPad5j11mezX//61+eee+78+fNbW1tTqdTs2bPf8573/Nd//VexWFz34vFtiGOOOaZRIf/6r//afOr6669vnJJSFgqFxqnnnnuuuSafe+65UZZ0lG655ZZ3vvOdnZ2d9eJcc801oxxls17r/XcbQ/u+9NJLF1xwwTvf+c6ZM2fmcrk999zzxBNPvPbaa8vl8pjzRuP6kGy44oorBgcHNydXm58CAAAAwHhi2ICTTz65UUs77bTThi4788wzG5d1dXU1n2qu53POOUcpVd/+6U9/2nzZCSecUD9+8sknt7W1NT5y9tlnr/eOZ5xxRuOaE0444Ytf/GJjN5vNViqVMRfnBz/4QXOeH3300ZGrqFgsjjAc1/f96667rnHxxRdfvKErP/OZz4x8wQsvvNBI59vf/nY6nV7vZQceeGB3d3dzDoetI/3CCy/853/+Z2P3oYceGrmAqVSqcfH999+/3jQff/zxQw45ZN3M7LDDDs8///xoij/m0tU999xzO+6447CLPc+74447mm969dVXb2q1jFf7Ngq43vqs6+7uPvzwwzeUQnt7e/0njBEad5QNsSHNc8VnzZrVfOqDH/xgc4LNfzbf/e53G8enTp3qnNtQSTe1fn7605+ecsop6168++679/b2brQ4G/1329T2rTPGnHfeeVKu/5ffzs7OW265ZTR5aBS5+eBmPiSbjzfSIaJPfOITzUl94xvfaL7pokWLxjEFAAAAgC0NPfBbSUtLy1577VXfHjZA9IknnqhvrDf8GKZUKt13332N3fe9733NvYWVSqX57KYSQjTvtre3j3z9Rz7ykYceemhDZ+M4vuSSS0a4YAxuvPHGj33sY7Vabb1nn3jiicMOO2xoaGhDH3/ooYc+97nPjWN+iOijH/3oetfcWrFixYUXXsib8k6+MZSup6fnqKOOWr58+bCLkyT58Ic/PMq+3w1Vy1Zr37Vr1x544IEjvEZhcHDwjDPOuOWWW0ZIZDMb4uijj25sr1q1auXKlY3d+nCGhqeffnq9p44++uhh/0Gb48orr/zpT3+67vFXXnnl0ksvHZdbjKF9r7zyyptvvnlD08L7+/vPO++83/72t2PLz3g9JInohBNOmDFjRn37hhtu2NT58+OSAgAAAMCWgAB+6zn00EPrG83fTV9//fW+vr769sEHH7zRRO69995GgOd53kknnTR//vzmSbbDXi+3SR555JHGttZ61113HeHi3/3ud81T8Q844IDLL7/8mmuu+fCHP5zJZOoHrbU33nhjfXvatGm77777Djvs0JzI7rvvvvvuu0+ZMqVxQVdXV+NsKpWqX1BfY2/p0qWXXHJJ4+yCBQtuvPHGe+6556KLLmp0ly1atOhTn/rUhvLc6Gcex0Cr/s1+jz32OPnkk/fff//mU4899lhjOPoWKt0111zTPM95+vTpZ5xxxjvf+U7f96MoWncxsPVab7WMrX1HKOAIzj///DfeeKOxO2fOnPPPP/8zn/lMc588M3/84x9ftmzZhhIZZUNsyF577dUI2KgpYiwWi6+88krzlSME8COkv6n1U3+V46677nrSSScNm0X/wx/+cMWKFSMXZ6P/bpvavkS0dOnSL3/5y43dfffd94orrrjpppsuu+yy6dOn1w8aYxozccbwJzEuD0kiyufzX/nKVxql+MQnPjGaT41vCgAAAABbxASPAHgTG98h9BdffHFjErLv+2EY1q9pdCoGQRCG4UaH0L/rXe9qXHDcccfVDzaPovd9f2BgYFOLkyTJ9ddf3zwyds899xy5fj7/+c83Lj7mmGOaTzX3lM6dO7f51LAOvXWTvfrqqxtnDzzwwOZT//7v/9449da3vrVWqzVONS/Lr5RasWJF/fiwUdZEdPzxx//5z3+uVqtRFMVxPHIZRzOEPgiC5uG+w5YhGDYIeXxLt3z58uZA6IQTTqhWq/VTTz/9dCOmqhthCP16q2Vs7TtCATdUn8PWUzzmmGMKhULjI9/73vea/yybBzNvTkOs1znnnNO4/pJLLqkfXLc/eYcddqifqlQqzQOtmyc4bGiywOjrh4huvPHGxqmrrrqq+dQvf/nLjRaHR/x3G0P73nXXXY3j8+fPN8Y0Ti1fvrwR9hPRkiVLRlnk5uxt5kNy2HHnXHO0f9ddd9UvG+UQ+rGlAAAAALCloQd+62l0LsVx/Oc//7m+3Vicab/99tvoim6rVq363e9+19htDJ5vHkUfx/G99947cjrd3d37N9ljjz1aW1svuuii5pGxV1xxxciJSClP+IdPfvKTzafqXXx1G+0qHL3mDsPPfvazzdHOwoUL99577/q2tfb2229fbwrveMc7fv7zn++7777pdNr3fc/zNj9Xn/70p5t/HDnzzDOb+0tfe+21UaYzhtLddNNNjSXN8vn8bbfd1pg/v99++337298e5a3XWy1brX3vvvvuxnYmk/nhD3/Y0tLSOHLeeeedfvrpjd177rlnQ+lsfkM0d6E3euAb/e377bdffWPFihX1JdaeffbZxtLoCxYsaO7A33wLFy684IILGruXX355Nptt7A4bFDAGY2jf+mKHdWvXrl21alVjd86cOV/4whcu/ocxr2a3+Q/JBiHEt771rcavP5deemm1Wt2kzGx+CgAAAADjDq+R23pmz549Z86c+lDhRx99tD6ZszHIeTRDQ++8885GjF0fP1/fro+if/755xuXnX/++SOk0/zleL0OO+yws846a+TMrDtr2hizbNmyZ555pnlFtPGyfPny5mWxjzjiiGEXHH744X/961/r241v/MNcfPHF4zh4vq55TETdbrvt1miLSqUymkTGVrrmKQ/vf//7h63OfdJJJ82bN+/111/f6N3XWy1brX2bS3HGGWdMnTp13ew1+n7XrFmzZMmSnXfeed10Nr8hjjrqKCEEMxPRM888E8ex7/uNQfKnn376G2+80dvbS0RPP/30CSecMPrx82MwbHk5z/N23nnnxkzsUf5djWAM7du8KMbAwMDcuXMPPvjg448//vjjj99rr70+/elPb2aWaDweks322Wef888//zvf+Q4RrVy58ktf+lLzcICtkwIAAADA+EIP/FbV6F+qfyUtlUr1ma40usWZmjuWjzrqqObv082d8L///e+7u7vHnMlTTz11o334DYVC4Z577jn//PPf9ra31d9BdeaZZ7700ktjvvuGLF26tHl3xowZ4p9dd911jbONWh1m5Fn9Y9PcXVk3bCD0aIytdM2feutb3zosTSHE2972ttHcfYRq2Qrt29yRu8cee6x7we67796827y8XLPNb4hp06Y1aiyKovovJo0o/aCDDmp0wte75bdoAL9ucZp74MfLJrXvaaed1jxlwzn3yCOPXH755QsWLNhhhx0uuOCCn//852N4W/swm/mQHOaaa65pDIy/9tprFy9evPVTAAAAABhHCOC3qsYX0PoSTU899VSjR/2ggw4a+bMvvvhiow+W/jliH7brnGseljwaQoiurq6jjjrqjjvuuPfee5vXnRrB97///Z122un000+/+eabn3/++SRJNummm2STXsW8oYubx2a/qYytdM0r0s+cOXPdK+fMmTOaBDdULVunfZvf8b7eUeidnZ3NA6dHeMvA5nv3u9/d2H7iiSfWrFlT/71Aa73vvvs21sYbFsCnUql3vvOdWy5XW8imtu+cOXN+9atfzZo1a91TK1eu/M53vvPe9753l112efDBBzcnV5vzkFxXV1dXY0BBFEXN60RutRQAAAAAxhGG0G9Qc1/TCANWm09tdLXtRudSX1/fa6+91hgLPW/evHVHDg/TvJIZEZ177rnnnnvuhi6+8847mxdFG2annXYa1uU7Bvfcc895553X2PV9f7/99nv729++zz77TJ069cQTT9zM9IfR+v/+VqWUu+222wgXb7Qh3mzGVrpp06aVSqX6dn9//7pX1sd7j81Wa9+WlpbGGuPrrq5HRIODg1EUNXbz+fx43XpdRx999Fe/+tX69uOPP77TTjvVtxcsWJBOp5sD+P7+/iVLltR3Dz/88DEMu5hYY2vfI488ctmyZf/7v/976623Pvjgg+vOCV++fPlxxx335JNP7rPPPmPL2OY8JNfr4x//+He+8516N/59990XhuHWTwEAAABgvCCA36Bp06Y1tteuXTs0NNS8RnFD8+JYw9b9Xteee+7Z2tpaKBSI6NFHH218N93o3E5m3qT3wz311FOLFy/eZZddRv+RTXX55Zc3ts8444wbb7yxUT/333//uN9u2KCAZ599dtKFTCMYW+l23XXXRYsW1bdfffXVdS94+eWXx5ylrda+M2bMaETC612bbVgpxnetuGEOPfTQdDpdf1PjE0880fgPOvDAA6lpHbu+vr7mQS7jPn5+Kxhz+2qtTzvttNNOO61Wqz344IM/+9nP7r///uZ3GRpjvva1r21oIcmNGvNDckOUUt/85jf/5V/+pb77m9/8ZuunAAAAADBeMIR+gxrrftfdcMMN617z29/+tjlwGvaRdUkpG6NAH3nkkcZK1xud2/nHP/6x+UXZozHsNVrjq1KpNIIuIvr85z/f/OvGKF8/vkkWLFjQ6KZ2zjUviL0NGFvpmn+gue2224Z1DD7yyCPPPPPM2PKzNdu3+Y//rrvuavTGN3zrW99qbHd1dc2fP38c7z5MKpU67LDD6tv1rub6dj2AnzZtWuPN6tdff33jU5MugB9D+4Zh+P81GRoaSqfT733ve7///e+vWbPm/vvvb/5r3JxVEsb8kBzBkUceOWzO0dZPAQAAAGBcIIDfoBNPPLF55u1VV1115ZVXNpYKLxQK3/3ud4ct1T6ab3iNr6H33nvvwMDAsIMb0tydpbXeewOaJzNv0QC+/qbuxm6jH5iI/va3vzVHXJujeVJuNpt9z3ve09j98pe/POziyy+//O3/8MUvfnFcMrBFbX7pjjnmmMYFvb29F1xwgTGmvvvyyy+PMMNio8alfUc5Z775v6ZSqXzoQx9qfgnZzTff3NzX/b73vW/c3yMwTHM03lg+rR7AE1FjFH3jR5YZM2bsueeeY7jRFl0zYmRjaN9UKvXNb37zM/9QX5i9Tkp5/PHHn3rqqY0js2fPXu99R1nksT0kR3bttdc2XrI4USkAAAAAbD4Mod+gKVOmfOpTn/rSl75U343j+Oqrr7766qvr78quj/BsdsQRRzTHYBvSmOHZSKGtrW29i283RFHU/Prr448//mc/+9l6r7zqqqu+8IUv1Ldfeuml559/vvlV2ONo5syZnZ2djXnXCxcufM973rPXXnu9/vrr99xzz+bMEW0eOv7qq6++9tprs2fPDoJAKXXttdf+5je/qb/5/Mc//vGxxx67cOHC9vb2V1999eGHH37ggQfqn9Jab+oaflvN+JbuxBNPPOCAA5588sn67g9/+MNHHnnk0EMP7e7ufvTRR+vjwMdmzO07QgE39JH99tvv2GOP/eUvf1nffeCBBxYsWHDsscd2dHQ8+uijv/vd7xpXZjKZyy67bMyFGqV1u9M7OjrmzZtX395///1/8pOfjHz9CMZQP1vC2Nr3sMMOa7zP7/LLL3/ppZcOPvjgbDZbLBaffvrpW2+9tXHlAQcc0NgeQ5HH8JDcqDlz5lx++eXrvjxva6YAAAAAMA4YNiyKouOOO2401bjrrruuWrVq2MebL7j44ovrByuViud5zaeOO+64xkeaB7KeffbZ9YPDXur2ox/9aEMZHjYR+rLLLmucOvnkkxvHd9ppp82vnHPOOWdDtdHR0dG8WyqVGp966KGHmk+tm2xj0HKzF154oX72M5/5zIZuWieEuPbaaxupDVsUrZHOKDXHHvfff/8o0zz77LMbZz/0oQ9tudIx88MPPzxCj3RzjHT11VdvUrWMrX1HLuB665OZV69evd61zYeV/bbbbmvO4eY0xMiGTbM/9thjG6fWXWL99ttvXzeFDZV0bPVT1xgFQP/cmiMY4d9tDO27ZMmS0SwjN3v27OaH4chFbj64OQ/JEY431Gq1xqqEDYsWLRrHFAAAAAC2NAyhH4nv+z/72c/++7//e4TV6dLp9Kc//eknn3xyve/xWlcmk3n729/efGSjizM1rz+fz+dHWAB8t912a178+a677uJ//oo8jq677rr1LpJ38MEH//73v28+0ui1G42jjjqq0du5rmuuueaSSy7ZUMja0tJy6623fupTnxr97baycS/dkUce+b3vfa95rkfDmWee+eEPf3jMWR1b+45cwA2ZPn36E088McJLwjo7O3/yk58sXLhwU1Mem2Gd6s2R83777dfcQEKIo446avQpj61+toQxtO/cuXPvv//+kfM/d+7cBx54oPlhOIYij+EhORqpVOrrX//6xKYAAAAAsJkQwG+E53kXXXTR4sWLv/GNbyxcuPDAAw+cMmVKPp/fe++9TzvttCuvvHLx4sVf+cpXhvVZjawxQLRu5Lmdg4ODjeHTRHTqqaeOPA+zeVr+8uXLG2s4j7u2trbnnnvuqquu2mefffL5fHt7+5FHHlkfxb3XXnudd955R/3DL37xi9Enm8lkHnzwwXPPPXfu3LlBEKRSqa6ursYCb1LKr33ta88999xFF130lre8JZ/PZzKZ+fPnH3PMMTfeeOOqVau2Wow3NluidOeee+7f/va3j33sYzvvvHMQBG1tbYcffviPfvSjO++8c3MW6h9b+45cwBHMnj37sccee+CBBz74wQ/Omzcvn8/7vj9z5sxjjjnmG9/4xrJly5qHkGxpwwL45gHhbW1tu+66a2N37733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//qviy666D3vec+pp5564MCBz372s7fccgsAvO51rzv11FN/2VUveMEL/uzP/uyLX/ziZZdd9q53vevyyy/fuHHj2traLbfc8qEPfQgA3v72tx+/CyDzW/ZkA/gLL7zwe9/73nD0aOjUU0+9/PLLr7jiitNPPx1+VgUxk8lkMs8s0mi7lA5Up059wriqrVVE4P2icTRDQBUhaYxTQFSGgHFmJNqCsTbZDgZ5ohCYxbQEMJwAjJRGo06VVUwAmV/xB+usPMnjnowHwDgnwDQclipjCNpozS1hNENBJAHpaPiOwAiANCQGGSJnQAQASIDIiDFKY+M7sVci0P7SXrA91k7QKJRpyaTM8jWy2PG82s7c1E4TNvtuodep54wOq5v63bq3eoAzQ61l1q9XnBzLj/LiJDBkds6qbXa3/B6lA16ctCd3yrWDKwd/tBjHteZhd3nvoDHL2svtzmKuugGASKVoi3bYWRl0/DFXc6aV+dHK4UGanDM2s600qskwZD+PeInIGANAaTiu476KAi9nl8Z9lTiMERmmEmbnDBeIuBr2VsKeITPbbaxFvUSrgu2dXpscyGRl0K2HXU84nDObcQMGCCue//u54MWeuwE0N0r5+f1WgTjfkcSuZbfigW87gyN77MF62JxV3N48uqlcqSZ+bba9fmTQiJVinNVMMhk2V+yiS2pr2itDS/rB3pJf2OBXqoEe8zUZhidAEfhfBpHZo1tTY1RzGWZ8Sl1ozUedgZtosDzm52UqVXkCaptNt161fWivYhpX1Y8b0cg47p8V58WU7+AUB6WBOyy0eb+Xc6p95kU6sgU3RnGuORpkwBgRyG77ju8W2zJPxOChRYEHf/+5zouuuMyys+JzmUzmF1x77bXf//73Dx8+/N73vve9733v8Yc2bNgwjJYB4IMf/OBXv/rV1dXVl770pYwxIcQww9yVV175p3/6pxdffPFDDz20Y8eOO++880UvetHT1bc/+IM/SJLkzjvvvPvuu49vv/TSS4cr/3+Fj3/841EU3XrrrVdfffXVV199/KHXv/71H/7wh5+uTmaegif7VXTXXXcN/7Br164rrrji8ssv37FjxzPVqUwmk8n8EswJmF+RRpt4wKwcWn3mCBP30WbABVeMYQLGaDKG6GgxLUDGNYk++MIkTQDNSKIQTCkNBolcI5VkAnuO5YheF4BU1AWj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1fGdg1u0mTrUWfXigPTqEPUlEJ4po52hhFTd7ICToSIkpiPm91LLjVemIPa4maJ2OmYWAKSYSWRsma5A2ldq/cCGSnvxacteCfoznRXXsNOm9ZJXP5FIJBIn2jGvn6+putlXPofBwcH3ve9973vf+wBgZWXl4Ycf/tznPnfHHXdcddVVN9xwAwBs2bLloYceWtvo/mLuvPPOZrN52mmnbdy48cjjz6kD/4JeSf+/ACGkWq3Oz883m821OxHPajabADA8PHzcm01NTV1++eWbNm26/vrrj3KeALCWc/7DH/7w818yTfOuu+769re/vWvXrj179pRKpXe9612f+cxnvvvd7955550jIyNHP8rRBvAvtmviBQ0PD3/yk5/8zGc+k4TxiUQi8avAZPx/jJ8yFbSC/qph2mm/lU7llfCp35FKRY2Z8PBDPD8ivZaOfRA+IjIKAICoFAADQEoI0YQw7mSNgXFzYCNGfRSSGIaZqbD2orZywnYYpeHcozRsEa0JswADUIiAiAqoGxNq6JgiMFCoiPDbXKdl0EdCBGMUAY20BYQLr8dchSqihLlF7De470dKcm5KrXPl9RyIbs4Xg06dO3F+GPwO0b7DDGqniIgJkIyTMTJFxBwXPs0Pq6AXTT8EhDgTZ6n2Qr5b3zB6+v7IB7uwefPGKgHaX5WNmbi230PwMxVZHPNNN04PgJszGtOW5WbTxay30m7ONqm7mqrkC4HVWnDC9pydd9KlFHeyPGwiZixbIWogM8IoARunvO21d6/MZtoLtoo6c0+63AxKY87ARNd0NaLptXhn0d9/r2otgJkC1O6W8+wNrzGrm2yvCwD10MOg57eX2zxlmM6wY0cbfwvMzCKSaio/kS0Np/Ivce0TiUQiceKdXHoZAdhzDKVyZecYs5m87W1vO3To0C233PKceLhSqfze7/3eSSedNDExceONN37nO9+xLGttWfgFC86tkVK+7W1v63a7d95559EH2M86cf0PDw/Pz8/X6/UNGzYcebxer8PPQ+7j2+zee+/tdruZTOaCCy54tsHadvfvfOc7t9xyy9DQ0K233nrk6cvLy7fccsv27dtf85rXvOC7oJR+4hOf+MQnPnHkwcXFxSPndjToSzd5+RYXFz/72c/+zu/8zonbQZFIJBKJl8WkfMum124/970bd5w/cNpbrPGzmJ3h+SGjPGZX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1CpTWweEUBVF199Z3mFGgcgKMw03P+YWxpjreuUM9hzEEKOAAI6mo2eAqQelMXNwp3HwZSRqJNZoTxxiliFGG5SWFVLdQqVlhVTbQfw1Zy9fAMdx3PsOY/Dzf38jM6XP/patLw688drQGY57xx13bN26dfHixS+++GI2m927d28mk9m9e/fVV189ODj4d3/3d5b13w9/dV2/4oor/vSnP6VSqSeeeGJ8fHxiYsI0zU2bNq1cubK/v3/t2rXlcvn4UZ577rn+dxw+fFjX9ccff1xV1Z07dx4b0Fbd/3t66623PvKRj2zYsKFQKCSTyf3793/rW99avXr1jKh7bpsdq6en58tf/vIJX/rud7/7kY985Nlnn9V1vbGxcd++fd/5zncWLlx45MiRE7bPZDK//vWvT/8zOKr6AP7b3/52uVzu6Oj413/91z//+c8vnVxzc3PVo3Acx3Hc+x1WQwgTrzRlp/upVdaWX6l1LTRXNk8sTXlNTHUcEIYM36jps+VgDOfHywdfdCf7y32vOlND5qFt7tRhL96al/1Zy6Cz3m/JHNMZP2j0b8+9+dz4q79KD24v9m53jRySVOoYztQRR89gx2DAKknoEICHAAFQ5qJyjubHneywfWQ3LU0R2Q8AiEhSqlNpXialOsk7Jes4juO4il1vjfQemjrdu373bI9luVUPOjIy8otf/EKW5d/97ncf+chHpq93dXU988wzixYtevPNNzdt2jR9/Yc//OGePXuWLFmyffv2T33qU4lEAgAEQbjiiiteeOGFjo6Offv2/eAHP3jPcSVJ+vznP//Nb34TAJ544ok5738GxtiNN944NjZ21113ZbPZgYGBffv2pVKpP//5z9///vfPUrNjGYaxbt26Ez56ePPNN++//35FUZ599tnx8fF9+/aNjY3dfPPNY2Njn//852c0dhznT3/603XXXTc1ddq/KtOqD+C3bt0aiURefvnlL3zhC5dccsnFJ4f4E3qO4zjuQwwJkhCfJzedK8Vb5dQipXmZdv5V9kfOz1zSwlbUurVD4NO9YAGrfmJZyCy4+VG3mEGMMc/Cii8bSBwRAy+VSkdK2f3ZMdt77z/1GPXs8YPGoW3p3X8cePX/jr35++LLv8iN7p+yjCIDkwHzbOzoR58GMMAIXARHE9oxANehQL1yzitPUr3glbMAgAR+1p3jOO6kNv3X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99Te8sOa676F2z9K1SgjGkMYMAFMABAwl3gus8vG8B59/4v2+P7yvudzL/08++JPy3v+y5ns98pTtDjmeSYWBcEpiYPbJT2DCfYEEQCAeYAAKAAARYABEAKGAOGjq/EAAAhcLLjUETouXLDsEws6L1kQq+fL7xzHcad29ccXVHFXIuFfvrKh6kFXrlwJAA888IBhGMe/+vzzz7uu29zcXCkFv2DBgttuu40xdueddx6//uy67vr16wHg+uuvn1HVfJbOXv+V3emVqnXTduzYMTg42NXVNf2wYA6b3Xrrrew4X/va1wDgwQcfZIxVMvZFo9GWlhZd11966aUZc37++ecB4D3PHVSh+gCe4ziO47gzQbSwlFqktKyQW1aQSD0gBABY9onxVv85V0eu/gc0/zzqCzBBZVhEWECAsCBjWcOCjInAXJt51MkO6wOvlXq3lfp3lKaGy4ff9EydSCqWg4AQlvwUqIOI7di0cpSdAoJKxnsABl7lADyDo8E7A4rAJUIpVGc1LMOhhCrKVe8L5TiO+/BoaY1ecGHTad1CCLrhU0swrv7/sXfddVdnZ+f+/fsvuuiiP/zhD7quV64Xi8Uf//jHlUj1vvvum27/wAMPJBKJV199ddmyZU899VQ6nQYAz/PeeOONK6+8cufOnTU1NY888kjV8zlL/a9evbq1tfXFF1+crqCey+Uq7+7OO+88S81m6Y477mkOylIAACAASURBVACAW2+9tbKADwCGYXzjG9947rnnYrHYpz71qdPt8D1Vv4W+olQqvf3226c+Cb948eLa2tozHIjjOI7jPjywGowtuIRiKbNvE00fgtw4NrJochBLGhZlYIyCh1wPEGaMeYLsAkLU9XKjWA15+THZtYioCsGUGG+xy1NmbkxAHhVETB3E4OjpegwYAX5n1X26hhwwzNRQqeGcMTVcY5VTvhAP4DmO42ZjzY1d6YlyX++sNtIjBH97Q1fb/NiZjKhp2hNPPHHDDTfs3Lnz4x//OADU1tbatl3Jx0YIWb9+/Ze+9KXp9slkcsuWLTfccENPT8+NN95YuZLNZiup1xsbG7u7u5PJZNXzqa7/crnc3t5+wg5///vft7e3I4SefPLJa665Zv369T/60Y+ampq2bdum6/qtt956++23Tzee22azdO+997766qtPP/30RRddlEqlIpFIb2+vaZo+n6+7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dp+q/+LFiydMmJCWlhYeHt61a9crrrhi1qxZJ+2fmJioTpCUlHTJJZc888wzHo+nKfvfuXOnUio6Oropr72tCTzA//GPf1y/fv3SpUubsRoAAAAAMJLXPnr3osrF/zltR13pKfm/H1V+cPqep1VeXn7xxRdnZmYuXbr08OHDaWlpR48e/fTTT++555709PQTT7geOXJkxIgR11133QcffJCTkxMdHX3gwIGVK1dOnz79nHPOycrKOulROnTo0O0nnTt3Li4u/uKLLx588MGhQ4dWVVU1ff8NkZ2dnZmZmZSUFB4enpGRMXPmzJN+49C83WqbO3euUurPf/7ziU+tW7fu2muvTUtLi46OPv/88x966KFjx46d2G3Dhg1jx47t3bt3ZGTkgAEDbrvttpycnAa9+Np0E8ybNy86Ovr3v//9V199dfDgwfxTaMohzrJdu3b5fy3jxo0Ldi0AAAAAjHHs8U8PZfx/Df+XP+Cv1ZvzmnjQm266SUT69u27du3amsb//Oc/v/rVr0TkvPPOq6qqqmk/fvx4v379RCQ1NXX+/PmHDx/WWns8npUrVw4ePFhE+vTpU15eXnv/CQkJIrJp06bajdXV1a+//np4eLiI/PGPfwx4/zt27BCRqKio077Mbdu2paSkiEhoaGjXrl39kW3YsGHV1dVnrlttu3btioyMFJGZM2fWeerJJ5/07yEpKSkjIyMsLExEUlJS9u/fX7vbs88+a1mWiCQmJg4cONC/t/Dw8MWLF5/25dcWeIBPSUlJSUkJDQ09o98RnGUEeAAAAACN5d524FCfRqR3/78j17yhvXbABz1w4IA/hebk5NR5qrKysk+fPiKybNmymsYnnnhCRPr375+XV/eLg5KSkvT0dBH585//XLv9pAHez38uOj09PeD9NzDA27bdo0cPEZk2bVpFRYXWeteuXampqSLyxBNPnKFutVVUVPi/mDgxwG/ZssWyrLCwsCVLltS80okTJ4rIFVdcUdMtOzs7LCxMKfWPf/zD31JVVfX73/9eRGJjY0/8ddUj8Evo/WfXq6urA94DAAAAALQCZc99IbrRW3n3FFYu3RXwQTdv3iwiAwcOrDmNXCMsLGzs2LEism3bNn9LaWnp008/LSIvvPBCx451Vxtp3779jBkzRGThwoUNPLr/JP/evXv9F583+/5rrFixIjs7e9CgQc89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R0ZG1n7odrvHjh27cuXKK6+8cs6cOSkpKY14/T8X+Cz0N99885gxYwLe/EzwX7Axd+7c66+//q233vrss89mz559++23Dx48+LvvvjvpJv/6179G1nL77bef3ZIBAAAAGC/qrkBCrxUbHnHDwIAP6p9b7rHHHqusrDzx2eXLl3u93q5du/qXgu/du/eUKVO01nfffbf/bHNtXq93+vTpInLNNdfUWdW8gc7c/v1Xp/tXrauxZcuW3Nzcfv361XxZ0IzdJk2apE/gv3l85syZWmv/jH1xcXHdunWrqKj44osv6tS8fPlyEam572DOnDkrV64cPXr0xx9/3JT0Lk0J8P/7v//7xBNPnNju9Xp37dp15MiRJlQVoJo7Ll566aW9e/cWFxcvX768f//+33zzzcSJE32+ANdXBAAAAIB6hF11Tsj5nRq7VfT/vVQ1YQK8adOmZWRk7N69+xe/+MU///nPioofJ8MvKyt79dVX/Ul1xowZNf0fe+yxpKSkr7/++rzzzlu0aJE/svl8vs2bN19++eXbtm1LSEh44YUXAq7nDO1/1KhRaWlpa9eu9S9cJyIlJSX+V3f33XefoW4NdNddd4nIpEmT/CfwRaSysvKRRx75+OOP4+Pjr7/+en/jSy+9JCJPPPHEqS4MbziltW7K9suWLVuzZs3999+fnJwsIps2bRo/frz/QvQLLrhg4cKFnTo1+n0csA8//PDbb78dOXJk7Ws2SkpKevfuXVBQMG/evBtvvLHOJuvWrXvrrbdqd54/f76IjBs3rs63MgAAAABwKnbR8aLfvO07WNrA/hGZ57Z7bFQTD7pjx45x48bVnMhMSUlxu93++dgcDsd99933zDPP1O7/7bffjhs3Lisry/8wOTn56NGj/qnXO3fuPHfu3BEjRtTun5iYWFhYuGnTptNOYhfA/nfu3NmvXz+l1Kluif/kk0969eolIlu2bBk9enRBQUHPnj27dOmyfv36ioqKSZMmvfbaa7UjcfN2q+Ohhx568sknZ86c+cgjj9Q02rY9YcKExYsXi0hqampsbGx2dnZVVVVkZOT7779/9dVXi0hlZWVkZKTW2uFwnHT2+3vuueevf/1rQ3690pR14LXWkydP9qff3/72t8nJyR6P56abbqq5jfzrr7+++OKLv/3228Duzq9HdHR0eXl5zcOaX+LYsWNP7BwTEzNp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AAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAAAAAGIMADAAAAAGAAAjwAAAAAAAYgwAMAAAAAYAACPAAAAAAABiDAAwAAAABgAAI8AAAA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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4444,18 +4455,24 @@ <h3>Integration with <code>fastMNN</code></h3> <p>Let’s re-plot this UMAP to highlight cell types:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IGJyb2FkIGNlbGx0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcImNlbGx0eXBlX2Jyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArXG4gIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OXCIpIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IGJyb2FkIGNlbGx0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwiY2VsbHR5cGVfYnJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICtcbiAgIyBpbmNsdWRlIGFyZ3VtZW50IHRvIHNwZWNpZnkgY29sb3Igb2YgTkEgdmFsdWVzXG4gIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gXCJEYXJrMlwiLCBuYW1lID0gXCJCcm9hZCBjZWxsdHlwZVwiLCBuYS52YWx1ZSA9IFwiZ3JleTgwXCIpICtcbiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArXG4gIGdndGl0bGUoXCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTlwiKSJ9 --> <pre class="r"><code>scater::plotReducedDim(merged_sce, dimred = "fastmnn_UMAP", # color by broad celltypes - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2) + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + + # include argument to specify color of NA values + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN")</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeZhdVZU//LX2PudOVbeGzAkhECEEWhKRQeapjSCTTDaDQVRAQUG7G/HB8BOVFnx8FW3RBkFFGxkFURvBCcQJZBJpZiETRcaq1HzHM+y13j8O3L5WJZVKpZJKFd+PjzxnuvvsvU/qPHfdPbGqEgAAAAAAAADs2MxYZwAAAAAAAAAANg8BPAAAAAAAAMA4gAAeAAAAAAAAYBxAAA8AAAAAAAAwDiCABwAAAAAAABgHEMADAAAAAAAAjAMI4AEAAAAAAADGAQTwAAAAAAAAAOMAAngAAAAAAACAcQABPAAAAAAAAMA4gAAeAAAAAAAAYBxAAA8AAAAAAAAwDiCA36RTTz2V3zR37txNXXb22WfXLps6dWr9KR6ktbVVVQcncuuttw6++IMf/OAQ2fv85z9ff/FOO+0kIsMszmDNzc0HHHDA4sWLb7/99o3mcBSJyE033bTffvu1tLR4npfP53/84x9v0zuO2MyZM2tVdPvtt491dsa9t059jqyk2Wy29qkHHnhgVHKyg/+5jeJLsrW1tXa8qalp/fr1G73jddddV5/C8uXLRzEFAAAAgG0NAfx21dvb+9JLLw0+/thjj21pUnfccUf97tq1a//4xz+OOGP9/f1//etf77jjjnPOOefQQw994YUXRpzUZl155ZUXXXTR3/72t76+PudcsVisVqu1s9dcc03tm/HBBx+87bIxJiZ26egtUMCttP3rZ+g/t+1gS4s8Ki/JQqFw+eWXb0Eut0EKAAAAANsCAvjt7dFHHx18cEsD+Mcee2xws8+dd9458mz9Y+Lve9/7yuXyqKQ2QLlcvvbaa7dFygAwwDj9cxuVl+Stt946gh9GRzcFAAAAgFGHAH57+8tf/jLgSKlUev7557cokdtuu23wwXvvvTcMw+F8PJVK7VNnt912S6VS9ResXLnyc5/73BZlaZiWLVtWn8klS5b8+c9/XrRo0ba4F8Bb3Dj9cxuVl6SqfvKTnxx6YNG2TgEAAABg1HljnYG3nMGNS08++aRzbvgpRFG00VGs3d3dv/nNb0466aTNpjBr1qxnnnlmQJo33HDDv//7v9dGn95xxx3f+MY3hp+rYdqwYUP97he+8IV0Oj3qdxktd9xxRy3+Wbhw4dhmZgJ469TnDlLS8fXnVrP1L8nE008/ffPNN3/0ox8dcU62PgUAAACA0YUW+O1k3rx5ycayZcva29vrT9V6aU6bNq25uXmzSf3617/u6upKtlOpVC1l2ope9L7v/+u//uuHP/zh2pH29vbaXYb25z//+QMf+MCBBx44Y8aMXC43b968o48++oorrli3bt1mPzuycGLVqlVXXHHFfvvtN3ny5Ewms8suu5x++ul333334Lmv2tvb66ebevHFF4novvvuO+yww/L5/MMPPzz0jY4//vj3vulvf/tbcrCnp+e4Om1tbXEcf/vb3z7wwANbW1snTZp02GGHXX755YVCYQRF26LS1RQKhWuuuWafffZpbGycNm3aKaec8uSTTxLRDTfcUMtn/b+NLaqWrXm+A2y0Puv95je/Oe+88+bPn9/c3JzJZGbPnv3e9773P//zP/v7+wdfPLoP4thjj61VyL/8y7/Un7r++utrp4wxfX19tVPPPvtsfU0+++yzwyzpMN1yyy2HH3745MmTk+Jcc801w+xls1Eb/XMbwfN96aWXLrzwwsMPP3zWrFmNjY177733SSeddO211xaLxRHnjUb1JVlzxRVX9PT0bE2utj4FAAAAgNGksAmnnHJKrZZ23XXXTV121lln1S6bMmVK/an6ej733HOttcn2z372s/rLTjzxxOT4Kaec0tLSUvvIOeecs9E7nnnmmbVrTjzxxC996Uu13YaGhlKpNOLi/PCHP6zP86OPPjp0FfX39w/RHTeVSl133XW1iy+55JJNXfnZz3526AteeOGFWjrf+c53stnsRi876KCD1q5dW5/DAfNIv/DCC//xH/9R233ooYeGLmAmk6ldfP/99280zccee+zQQw8dnJmdd975ueeeG07xR1y6xLPPPrvLLrsMuNj3/TvuuKP+pldfffWWVstoPd9aATdan4m1a9ceeeSRm0qhtbU1+QljiIc7zAexKfVjxXfaaaf6Ux/60IfqE6z/Z/O9732vdnzatGkisqmSbmn9/OxnPzv11FMHX7znnnt2dHRstjib/XPb0uebiOP4/PPPN2bjv/xOnjz5lltuGU4eakWuP7iVL8n647V0iOiTn/xkfVLf/OY362+6bNmyUUwBAAAAYFtDC/x20tTUtGDBgmR7QAfRxx9/PNnYaPgxQKFQuO+++2q773//++tbC0ulUv3ZLcXM9butra1DX//Rj370oYce2tTZMAwvvfTSIS4YgRtvvPHjH/94pVLZ6NnHH3/8iCOO6O3t3dTHH3rooc9//vOjmB8i+tjHPrbRObdWrVp10UUX6ZasyTeC0rW3ty9atKitrW3AxVEUfeQjHxlm2++mqmW7Pd8NGzYcdNBBQyyj0NPTc+aZZ95yyy1DJLKVD+KYY46pba9Zs2b16tW13aQ7Q81TTz210VPHHHPMgL+grXHllVf+7Gc/G3z873//+2WXXTYqtxjB873yyitvvvnmTQ0L7+rqOv/883/3u9+NLD+j9ZIkohNPPHHmzJnJ9g033LCl4+dHJQUAAACAbQEB/PZz2GGHJRv1302XLl3a2dmZbB9yyCGbTeTee++tBXi+75988snz58+vH2Q7YHm5LfLII4/Utj3P23333Ye4+Pe//339UPwDDzxwyZIl11xzzUc+8pFcLpccdM7deOONyfb06dP33HPPnXfeuT6RPffcc88995w6dWrtgilTptTOZjKZ5IJkjr2VK1deeumltbMLFy688cYb77nnnosvvrjWXLZs2bJPf/rTm8pzrZ15FAOt5Jv9XnvtdcoppxxwwAH1p/7yl7/UuqNvo9Jdc8019eOcZ8yYceaZZx5++OGpVCoIgsGTgW3URqtlZM93iAIO4YILLnj99ddru3PmzLngggs++9nP1rfJq+onPvGJ1157bVOJDPNBbMqCBQtqARvVRYz9/f1///vf668cIoAfIv0trZ9kKcfdd9/95JNPHjCK/kc/+tGqVauGLs5m/9y29PkS0cqVK7/yla/Udvfbb78rrrjipptuuvzyy2fMmJEcjOO4NhJnBP8kRuUlSUT5fP6rX/1qrRSf/OQnh/Op0U0BAAAAYJsY4x4AO7DR7UJ/ySWX1AYhp1KparWaXFNrVEyn09VqdbNd6N/97nfXLjj++OOTg/W96FOpVHd395YWJ4qi66+/vr5n7N577z10/XzhC1+oXXzsscfWn6pvKZ07d279qQENeoOTvfrqq2tnDzrooPpT//Zv/1Y79fa3v71SqdRO1U/Lb61dtWpVcnxAL2siOuGEE/7617+Wy+UgCMIwHLqMw+lCn06n67v7DpiGYEAn5NEtXVtbW30gdOKJJ5bL5eTUU089VYupEkN0od9otYzs+Q5RwE3V54D5FI899ti+vr7aR77//e/X/7Os78y8NQ9io84999za9ZdeemlycHB78s4775ycKpVK9R2t6wc4bGqwwPDrh4huvPHG2qmrrrqq/tSvfvWrzRZHh/xzG8Hzveuuu2rH58+fH8dx7VRbW1st7CeiFStWDLPI9dnbypfkgOMiUh/t33XXXcllw+xCP7IUAAAAALY1tMBvP7XGpTAM//rXvybbtcmZ9t9//83O6LZmzZrf//73td1a5/n6XvRhGN57771Dp7N27doD6uy1117Nzc0XX3xxfc/YK664YuhEjDEnvulTn/pU/amkiS+x2abC4atvMPzc5z5XH+0sXrx4n332Sbadc7fffvtGU3jXu971i1/8Yr/99stms6lUyvf9rc/VZz7zmfofR84666z69tJXX311mOmMoHQ33XRTbUqzfD5/22231cbP77///t/5zneGeeuNVst2e7533313bTuXy/3oRz9qamqqHTn//PPPOOOM2u4999yzqXS2/kHUN6HXWuBr7e37779/srFq1apkirVnnnmmNjX6woUL6xvwt97ixYsvvPDC2u6SJUsaGhpquwM6BYzACJ5vMtlhYsOGDWvWrKntzpkz54tf/OIlbxrxbHZb/5KsYeZvf/vbtV9/LrvssnK5vEWZ2foUAAAAAEYdlpHbfmbPnj1nzpykq/Cjjz6aDOasdXIeTtfQO++8sxZjJ/3nk+2kF/1zzz1Xu+yCCy4YIp36L8cbdcQRR5x99tlDZ2bwqOk4jl977bWnn366fka00dLW1lY/LfZRRx014IIjjzzyf//3f5Pt2jf+AS655JJR7DyfqO8Tkdhjjz1qz6JUKg0nkZGVrn7Iwwc+8IEBs3OffPLJ8+bNW7p06WbvvtFq2W7Pt74UZ5555rRp0wZnr9b2u379+hUrVrztbW8bnM7WP4hFixYxs6oS0dNPPx2GYSqVqnWSP+OMM15//fWOjg4ieuqpp0488cTh958fgQHTy/m+/7a3va02EnuY/66GMILnWz8pRnd399y5cw855JATTjjhhBNOWLBgwWc+85mtzBKNxkuy3r777nvBBRd897vfJaLVq1d/+ctfru8OsH1SAAAAABhdaIHfrmrtS8lX0kKhkIx0peFNzlTfsLxo0aL679P1jfB/+MMf1q5dO+JMnnbaaZttw6/p6+u75557Lrjggne84x3JGlRnnXXWSy+9NOK7b8rKlSvrd2fOnMn/6LrrrqudrdXqAEOP6h+Z+ubKxICO0MMxstLVf+rtb3/7gDSZ+R3veMdw7j5EtWyH51vfkLvXXnsNvmDPPfes362fXq7e1j+I6dOn12osCILkF5NalH7wwQfXGuGTZvltGsAPLk59C/xo2aLne/rpp9cP2RCRRx55ZMmSJQsXLtx5550vvPDCX/ziFyNYrX2ArXxJDnDNNdfUOsZfe+21y5cv3/4pAAAAAIwiBPDbVe0LaDJF05NPPllrUT/44IOH/uyLL75Ya4Olf4zYB+yKSH235OFg5ilTpixatOiOO+6499576+edGsIPfvCDXXfd9Ywzzrj55pufe+65KIq26KZbZIuWYt7UxfV9s3coIytd/Yz0s2bNGnzlnDlzhpPgpqpl+zzf+jXeN9oLffLkyfUdp4dYZWDrvec976ltP/744+vXr09+L/A8b7/99qvNjTcggM9kMocffvi2y9U2sqXPd86cOb/+9a932mmnwadWr1793e9+933ve99uu+324IMPbk2utuYlOdiUKVNqHQqCIKifJ3K7pQAAAAAwitCFfpPq25qG6LBaf2qzs23XGpc6OztfffXVWl/oefPmDe45PED9TGZEdN5555133nmbuvjOO++snxRtgF133XVAk+8I3HPPPeeff35tN5VK7b///u985zv33XffadOmnXTSSVuZ/gCe93//Vo0xe+yxxxAXb/ZB7GhGVrrp06cXCoVku6ura/CVSX/vkdluz7epqak2x/jg2fWIqKenJwiC2m4+nx+tWw92zDHHfO1rX0u2H3vssV133TXZXrhwYTabrQ/gu7q6VqxYkeweeeSRI+h2MbZG9nyPPvro11577X/+539uvfXWBx98cPCY8La2tuOPP/6JJ57Yd999R5axrXlJbtQnPvGJ7373u0kz/n333VetVrd/CgAAAACjBQH8Jk2fPr22vWHDht7e3vo5imvqJ8caMO/3YHvvvXdzc3NfXx8RPfroo7Xvppsd26mqW7Q+3JNPPrl8+fLddttt+B/ZUkuWLKltn3nmmTfeeGOtfu6///5Rv92ATgHPPPPMuAuZhjCy0u2+++7Lli1Ltl955ZXBF7z88ssjztJ2e74zZ86sRcIbnZttQClGd664AQ477LBsNpus1Pj444/X/oIOOuggqpvHrrOzs76Ty6j3n98ORvx8Pc87/fTTTz/99Eql8uCDD/785z+///7769cyjOP461//+qYmktysEb8kN8Va+61vfeuf//mfk93f/va32z8FAAAAgNGCLvSbVJv3O3HDDTcMvuZ3v/tdfeA04CODGWNqvUAfeeSR2kzXmx3b+ac//al+oezhGLCM1ugqlUq1oIuIvvCFL9T/ujHM5ce3yMKFC2vN1CJSPyH2BDCy0tX/QHPbbbcNaBh85JFHnn766ZHlZ3s+3/p//HfddVetNb7m29/+dm17ypQp8+fPH8W7D5DJZI444ohkO2lqTraTAH769Om1ldWvv/762qfGXQA/gudbrVb/vzq9vb3ZbPZ973vfD37wg/Xr199///31/xq3ZpaEEb8kh3D00UcPGHO0/VMAAAAAGBUI4DfppJNOqh95e9VVV1155ZW1qcL7+vq+973vDZiqfTjf8GpfQ++9997u7u4BBzelvjnL87x9NqF+MPM2DeCTlbpru7V2YCJ6/vnn6yOurVE/KLehoeG9731vbfcrX/nKgIuXLFnyzjd96UtfGpUMbFNbX7pjjz22dkFHR8eFF14Yx3Gy+/LLLw8xwmKzRuX5DnPMfP1fTalU+vCHP1y/CNnNN99c39b9/ve/f9TXERigPhqvTZ+WBPBEVOtFX/uRZebMmXvvvfcIbrRN54wY2giebyaT+da3vvXZNyUTsyeMMSeccMJpp51WOzJ79uyN3neYRR7ZS3Jo1157bW2RxbFKAQAAAGDroQv9Jk2dOvXTn/70l7/85WQ3DMOrr7766quvTtbKTnp41jvqqKPqY7BNqY3wrKXQ0tKy0cm3a4IgqF/++oQTTvj5z3++0SuvuuqqL37xi8n2Sy+99Nxzz9UvhT2KZs2aNXny5Nq468WLF7/3ve9dsGDB0qVL77nnnq0ZI1rfdfyVV1559dVXZ8+enU6nrbXXXnvtb3/722Tl85/85CfHHXfc4sWLW1tbX3nllYcffviBBx5IPuV53pbO4bfdjG7pTjrppAMPPPCJJ55Idn/0ox898sgjhx122Nq1ax999NGkH/jIjPj5DlHATX1k//33P+644371q18luw888MDChQuPO+64SZMmPfroo7///e9rV+Zyucsvv3zEhRqmwc3pkyZNmjdvXrJ9wAEH/PSnPx36+iGMoH62hZE93yOOOKK2nt+SJUteeumlQw45pKGhob+//6mnnrr11ltrVx544IG17REUeQQvyc2aM2fOkiVLBi+etz1TAAAAABgFCpsWBMHxxx8/nGrcfffd16xZM+Dj9RdccsklycFSqeT7fv2p448/vvaR+o6s55xzTnJwwKJuP/7xjzeV4QEDoS+//PLaqVNOOaV2fNddd936yjn33HM3VRuTJk2q3y0UCrVPPfTQQ/WnBidb67Rc74UXXkjOfvazn93UTRPMfO2119ZSGzApWi2dYaqPPe6///5hpnnOOefUzn74wx/edqVT1YcffniIFun6GOnqq6/eomoZ2fMduoAbrU9VXbdu3UbnNh9Q9ttuu60+h1vzIIY2YJj9cccdVzs1eIr122+/fXAKmyrpyOonUesFQP/4NIcwxJ/bCJ7vihUrhjON3OzZs+tfhkMXuf7g1rwkhzheU6lUarMS1ixbtmwUUwAAAADY1tCFfiipVOrnP//5f/3Xfw0xO102m/3MZz7zxBNPbHQdr8Fyudw73/nO+iObnZypfv75fD4/xATge+yxR/3kz3fddZf+41fkUXTddddtdJK8Qw455A9/+EP9kVqr3XAsWrSo1to52DXXXHPppZduKmRtamq69dZbP/3pTw//dtvZqJfu6KOP/v73v18/1qPmrLPO+shHPjLirI7s+Q5dwE2ZMWPG448/PsQiYZMnT/7pT3+6ePHiLU15ZAY0qtdHzvvvv3/9A2LmRYsWDT/lkdXPtjCC5zt37tz7779/6PzPnTv3gQceqH8ZjqDII3hJDkcmk/nGN74xtikAAAAAbCUE8Jvh+/7FF1+8fPnyb37zm4sXLz7ooIOmTp2az+f32Wef008//corr1y+fPlXv/rVAW1WQ6t1EE0MPbazp6en1n2aiE477bShx2HWD8tva2urzeE86lpaWp599tmrrrpq3333zefzra2tRx99dNKLe8GCBeeff/6iN/3yl78cfrK5XO7BBx8877zz5s6dm06nM5nMlClTahO8GWO+/vWvP/vssxdffPE//dM/5fP5XC43f/78Y4899sYbb1yzZs12i/FGZluU7rzzznv++ec//vGPv+1tb0un0y0tLUceeeSPf/zjO++8c2sm6h/Z8x26gEOYPXv2X/7ylwceeOBDH/rQvHnz8vl8KpWaNWvWscce+81vfvO1116r70KyrQ0I4Os7hLe0tOy+++61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Pe/mm28eDAbvec97/u3f/u32229/3/vet76+fuzYsV/6pV86NZL8tre97R3veAczv/zlL7/pppvuueeev//7v7/00ksB4K1vfeuf/MmffP9v+va3v/0rX/nKxRdfDACvec1rvvKVr3zoQx9KkuTZz342ANx3I+qDBw8CwIUXXvjYxz72VOOVV17513/91+985zu3trY++9nPHj58+FOf+tR4PL766qvf9KY3nX74Axj5fV133XXXXnvtJZdc8nd/93eHDh36xCc+8dznPhcAbrzxxl//9V8/o/NsNnvVq171qEc96mMf+9jdd9/9zne+c9n+0pe+9IYbbpBS/u7v/u4tt9xy5513Xn/99U94whPatv3N3/zNz3zmM6ef5Jd/+Zcnk8nevXv/6q/+6tChQ8ePH7/tttte8YpXAMD111//8Y9//FTPra2tZz/72UeOHMnz/B3veMfnP//5L37xi1dccUVRFL/1W7/1g1x1D/oR+F6v13toIUJa6LTQANDMbVs5QCTiQOza4G3IzypPDV8vCYlmZYiDgbOSmFuQbY0xJAr4xB2zemZnm41S6AMJAiGQidsqILrgKQTijikQKow2IggpJUdUCsodmTRCG5kMTTnOipHJBsakql24+WZrcqW0EIl0XUwl5kMz32rLUdJWHkoTvAWErDRSimreLbY714ViYIRCnQj4jxL0AECRAaBczaSS3kYpMJgRRNkkJeS6qWBWsU4EMNczH1xgZplIiEwEIUSlOUnJV46EYcYYZFOjgUhCUwhaAzMDIYOEe0cYMKIQAih4FS2zBACrclIQVaFABWkiyxgisgCBgFEwIwfja4wRARjBgwykI2kl2LNxTnI3T9qZDE3iJyg450WrV9omtXI0l2uGZjltJ6GT5CJKL/OIQiEjIDJFgQhcq+EQKxydpc7ZL0ZjLP7T6vd6ak8l0lKLwWp6arTkAeG60NW+mXTNwre1iz6u7i33nLcyO9kigkn7Z4Ner/dDd/DgwX/+539WSn3uc5/70R/90WXjeeedd+GFF1588cW33XbbF7/4xcc97nFHjx5917veBQBXXHHFq1/96mW3ffv2XXrppS9/+cvf//73v/nNb7788stXV1d/kGBe+MIXXnXVVf/4j/84m81Go9GykZk//OEPA8BLXvKS0zsfOXLkNa95zRve8IZTLU9/+tMPHjz4jGc8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cLKo48DLK60hSsCSZOjCDMqisavj3hUGGgcA6DwgUN+yLY8vLTeJsinqwpQTtzkZVHWyU5AhMhhD6paxXQXOEoc825RV74vK+tIWtd27YbI87Kq6UMGydq6wRAifLFNvLO0+dT9fVV3YPVbbDH//t327YgBQUhIFAkBUBVKjxqgrRbwREMk5QS6m1LU+E+awLvYSlQigiNaiAIKwEgCAgEWrogpAFoRVEYkQ0QJqYqFAJZrFNB0rcuf3OrefTEGaDRPmBMaRZkBSBEUEQoPCQMACCtl4VFXCwTQWFGdzx0NOZohixORN6yHJrKL51MwaOkrh6oCSEJ0RDqsuVZm6KWC1nQxvvXWerl7ZEKCA7l8/xU9m1ki4uFDHgfO8QARXWef/T5nf0OXlYedLW0196NLZlY4IkAyCqohzncVsNTO6ZBYMRg1ZSyJwcNOsWVSfpSndaDQa/UM861nP+ou/+Is3vvGNf/Inf3L77bfnnG+++eZ/8S/+xY/8yI/Udf3QYTs7O+94xzve8Y53/NaesrZxAAAgAElEQVRv/dZf/dVf3XvvvTfddNOzn/3sf//v//229fpj9RM/8RP333//H//xH6vqxYsXH77rm77pmyaTyWazufnmm5/znOd82rdXVfWud73rF37hF972trfdeeedOzs7z3nOc771W79127j+4R73yLe+5mu+5mUve9lzn/vcH/mRH3nTm970a7/2a3fddZf3/p/8k3/yile84iUvecmjP9X1119/22233Xrrre9///v/6q/+6tq1a1/5lV/5VV/1Va961ase0WT+woUL/+t//a/Xv/71t91229133900zXOe85x//a//9bd/+7cDwFvf+tZf+ZVfqev6hhtu2B7/tV/7tbfffvt//a//9S/+4i9uv/1259xzn/vcH/3RH33e8563XC6f/exnf5bi/KPPDj91+ceXso997GPPetazAOCFL3zhO9/5zic6nNFo9OTXnoW//+i1k8sbziJZMqt3VE49s5y7aTZZlNbR4f2r2HM1dWdHvSZRAk4iDJK5b2M9LYraqWizqGa7fu/GWTVx3Soe3bdeHnZKUBQ+DensqJ0s6nLihnU4u9b6xlWNb8+CsFRTN9mt2rNYVqYqtTvZ+NoJuq5T37hzN07Lie838eDGWT3znEVj1MMr+dKDqxaOj7jTiuv59KABwDSk80+b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AqhQe0ZyoJFdAOQgupx2q7VOvWxdxkCIipF8wHG8NE63ehXX8aAcbMqidbN4ycXdOu44YwxXqZsqKANgUk+k9kymirpVfwNHXd3piPc6SfTRx3dPPilaP5/0dRSTtQQPlBl4RCbSnWHUnY+VoelqGSU66dp0ECGCq8IT+bC2Wq3WU+KOXdMj/Q34INv3ZfWD/lI8IV71qlcZY6677rqq+rGx0c985jMA8IY3vOFgy3e+852XvvSlz3nOcz70oQ+98IUvvPLKK88+++z3ve99b3jDG04//fS/+Iu/OPPMM7/0pS+df/75dV0feqr3v//9l1xyycaNGy+77LJnP/vZV1555fOe97zrrrvusJ7cfvvtZ5555lVXXbW0tHTCCSfcfPPNb37zm9/1rncdeszb3va288477+qrr57NZlu2bPnOd77zl3/5l6eddtqdd9556GF//Md//KpXveraa681xiwtLX33u9+99NJLL7300iO53wsuuOAP//APAWBhYeHNb35zk60cAP7pn/7pjDPO+NSnPrV79+7jjz/+3nvv/eAHP/jc5z73hhtueAwfe+tIoBzxl4afB7fddtuznvUsALjwwgu/+MUv/rS702q1fgbtvnu04/bl2UoxG9V1GQhAmnw9jIwBgQixaSNCAUZAZlQK2CMggzQJ6YUQAZgFABBBAAGYEJgJUQBFmiPIEItoVCJMmozBIOJrBhbSij0DorYkwbMPIMpocXVwDIhgFAAgGUTneospqxgVOee9E6NVdz4WYAiST71zfmlTtNAZ4WSXU711G5MO7A+0OHJLe3fXHEWd+Z4rg4poYWO3M4yEZe+9kzhWWrOwjFd97SSKdDYt48S42ttY60gtHTU4tD78oXVJg+eVXbPVnbNsUhfTMh9lVV5qY0TQpOLWcg1VZ047wVCRAZVDB0mlwyhSgVmYYbJSVrljx0p88z8gCDpUoLXxxfrJbXPlrgBIoQLASvcyM1+rVEOthJFEp2mWzE84yUJXK6bge8V9KGau2sVa5dTXGqp4wSqfuCnGdiATjaIoVOuO6T/vzHTbUX7/ft5+J1kNSktZqk2b9cZNYOxDPTUPoZjV++6dxB1jYy0Cs7Wiv5gOl9In+HlttVqtJ9m//s/uf7vxsSyhb/zZq5+12H+EGpwP6ZZbbjnllFO63e50On3IA84///yvfOUr11133a/92q81LZPJZP369UqpPXv2dLvdK6644k1vepNS6pvf/Obzn//85piXvOQl119/fRRF//3f/33yyScDgIicfvrpN91007e//e0XvOAFAHD22Wd//etf11p/4QtfeMUrXtG88frrr3/5y1/e6/W2b9/e6XQA4GMf+9gf/MEfAMCrX/3qT37yk03jJz/5yUsvvbTf749Go+bP4vXXX/+Sl7xkOBx++tOfbro6Go3e8IY3XHfddeedd96//Mu/NOe/5pprXvWqVx199NFXX3316aef3nwC55577q5du7785S+ff/75j3i/D05it2PHjpNOOgkRr7jiiosvvhgAiqJ4+9vf/pGPfOTYY4+95ZZbkiR5DP81rYfXzsC3Wq3WU2p+U3dpa99YLQEQsIkchYGFFQNBM6iKIE10ToiAgUOQ0MzOAwACihyYp0c8EL4LAoEXIUEABGpW1UtwDB68D8Gzq0KdMwoBIgCyZyQ0loylKCINQuB9HTxg0zEJyACG/XAxiruRSfRwfbq4uTecj4FgtlbUmReAwbo4itTantnq9vtWVhXo2NWSr9Vu395qeU2XEzfO990z8iEgACk0kRYBcC6srcjqKozWeDwy4PNJWZe+Ll1VeG0IETkwCBTTerQ3G+3NJyuFrw9MMitN2igWAYHgRUeGtPHeK+0luP683bBon3XK4rHbFhcWer1UFhe07doo1UedtnndtnWucFLmsR/1/P5OvU+FkhFAmAHFh6ieJG4c81RDHdAAoFdRbXoA0NR7N4ondsFRxxhDGj0bD3ZitpSqM9XzyteGILPrsDcQm+b9LYSI3Q51Er+4JWw5Xm3YSArNugWzbRstLtHcvN68heYXjjx6BwAT6f5CUuaunNX5uBKBtp5cq9V6Jsoe3+qhrPqJReMfp9e+9rUAcNVVVx1s+cIXvlCW5UUXXdTtdg82/uqv/urB6B0AXvziFwPAxRdf3ETvAICIv/RLvwQA99xzz6Hnf/WrX30wegeAs88++/d///f3799/+eWXH3rY4uLiJz7xiSZ6B4A3vvGNW7ZsmUwm+/fvb1re/e53A8Bf/dVfHQy8h8Ph5z//+fXr13/1q1/99re/3TS+4x3vAICPf/zjTfQOACeffHJTZP4rX/nKkd/vod7znvcURfGBD3ygid4BIEmSD3/4wy972cu2b99+9dVXP+S7Wo9TG8C3Wq3W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z3rWs77xjW9cfPHFeZ4f2Opd73rXb//2b3/961/vdrurV6/+0Y9+9JGPfOTss8++++67D9r/TTfd9MY3vpGItmzZMjU1tYIIX/7ylx+2in5YP//qV7/60E3+6Z/+acuWLf/4j/+4Z8+eDRs2bN++/ZOf/OQ555xz8803H1jnF7/4xTOe8YzPfe5z8/PzT3/605l569atL3jBC7797W8/ptPs9/sXXXTRO97xjh/84AdBECwuLn7+858/77zz7r333hVE9cgXbWU36wThE3jP87yTUBDrSjOqjcXVZlyfSJqrK+NrqtPrG6OrK4AYlhSRIAACAjDgcJA6UFoNW9uDUDFLUtLaoFKklCJNLMzsFCkkKpkCF/ZivQkjE6bZwLm9IfbDxCitl2d72aBgFjI0NlOd3lAv1yMgiRIzua5WnyzpwKT9POsXgxStRR2Y/QPTswNQD1aziyEOCIbN3gAozCJiyIbahtzRnJfy+aRoA1tQwGgMD6J8WeV9RoIwkaQGIGW7ELqOEBJAGlQBqVLMVwaz9WzPSPZANZsLeCBAjMRCFlDIiFJQrWIYY6WKI2O0bqPZcBo1RyWMUGsxBEQQBBKFMDkVPO+F4bOeG5y9xazbAEhudq99YHtxzy/d3j3y61k31Rt61QyMjOeV8S5U8oEbdPLluX6vlYFIsXNHdvttosiNruJyE4IQ6yOQ1CwoN7fXze19Yj5Gnud5j78VN7/v33x56VhFcpQ++9nPfutb3/rIRz7ypje9aZgQzs/Pf/jDH77hhhuuuOKKN7/5zVdfffVZZ521bdu2n/xkf+HAdddd97GPfaxWq33rW9+am5u7/fbb5+fnX/rSl959991vf/vbD9r/pz71qUsuuWT37t0333zzeeedt4II6/X6BRdccFAVfbfb/e53v3vWWWdt3LjxoPV37Njxlre8BQC+9KUv7du372c/+9ni4uLb3/72ubm5173udYPBYLjau971rna7/Z73vGfPnj0//vGPH3jggY9+9KMi8v73v/8xneYnPvGJf/u3f5uZmbnhhhtmZ2d37dr13//939ba733veyuI6pEv2gpu1onDJ/Ce53knP20orgSNqVKcaEVISForFAviDLhhWToqNKEhERNqHemorHWkmAWJlCEVEBKh0nlejEyXSiWtNFEUBLGWICCNxhCIBLFCxCAy5UZcGYnG19ZX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/4RGxx7XkADgZS972czMzLZt2zZs2PDiF7/4Oc95zrnnnrtly5YLL7zwmOz/ggsueMc73rGwsHDRRRfNzMycffbZY2NjV1111YYNG/72b//2mBzisIZj0f/oRz+Ch6mfH9q8efPHPvaxTqdz8cUXr169+txzz121atUf/MEfxHF81VVXDUd3J6KPfexjAHDppZeuWbPm/PPPP/PMMzds2PDLX/7yzW9+8/nnn3/kp/mnf/qnF1xwwfbt25/73OdOT0+vW7du8+bNs7OzD50r/gijOrmtPIG/5557nvWsZ1199dXz8/P2ER00Ir/neZ73REGESjOeXt9Yc3qzMZpQqASY5ME0WlhYmIEtOAeFwzTl7nIRKVerYFILy6Ol0dWVsZlKXA2SatCYKJVqAbMggtIIADrU7YUBu2FVPASRro8lI5MlbZRzAABsQRk1zExBENVw3ndQCJpAISqtGAGVshZFGIB1oLTRFITJWC1qVsXEJdcmEKYg1VXDhc46NL/b9XtoHnYIHEAIE11Zv7q85ZkqKfWLwCgulXVlvFYbTWoTJXZiHVebcVIJgIjGxvXMWr16jV41M5wW7hHw8pKb3VvcdWex7Q63dw932r/2tnNS5CACjkFEHLvFeVWpISJ3e5ANSBEASLsl7WVxTlAAZHiBmAUQEYgmpmnscf+p6nme9wRKXntJ8oY3PmotvRqfrL7r/9KnHWa48mOu0Whcf/31v/d7v1cul//93/+91WpdccUV3/jGN17wghe85jWvwYeOhLJSn/jEJ77zne8M+6Xfd999z372s9/97nf/9Kc/Hc7N9jgZVtEDwMaNGw+apO0gf/EXf3HjjTe+9rWvLZVKt912W6PR+OM//uM77rjjOc95zoF13va2t1199dXDhxo/+clP2u32b/7mb37lK1/5/Oc/f2CdIznNJEm++93vfvKTn3zhC184GAza7farX/3qm2+++WUve9lrXvOah44nfyRRncRQRFa25Rvf+MYvfOELp5122uWXX75x48ZHqCQ577zzjsnn+zi44447hp1AXvnKV/7rv/7rEx2O53ne46XI3F037dl++750YJ1jEmBhgWG3ayQAIgQUIDAGG81gYiqqrG1WRytxJQAAa5kQSSMidhbTxT3dKDbKUDawSTVIqkGYGAAYvmUCKjI3v6PTWRxkvcI5toUIiw6IkPKBRRRE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Z2ZlZd3zA9or5Dn4Ha1evVq8LWfPnu3Xr59Go9FqtS+88MLFixcBICEhYeDAgb6+vj4+PkOHDq2mkmKVnE/gxXtnMBjsLcHBweW3oAQFBUml0uTkZKeneDzdLspUn7yksAgMAA9ACIj5OwGwcuRmkIoPC9FKvAPZRqGSoFYN2jSUezeQNwxUBzeSezOkVscKIIQQQggh9CBZb5ZQvoqa8w6NzSwGWuOle7thw4bJZLLU1NQKT1OL++fty++U0hdffHHy5MknT5709PRs1apVYWHhpk2bunXrduzYMfuolJSUNm3arFy5Mj8/v1WrVoIgJCUlde/efffu3fY+b7zxxpAhQxISEiQSibe394kTJ8aPHz9+/HinP4Lj4YlOnDgxduxYhmEiIiL8/PxqM295ubm5HTt2LCsri4uLe//994uLi994443yxQXKysqio6NnzJjx22+/SaXSwsLC//znP126dBH3dJc3e/bsPn36bN++Xa/Xa7Xa48ePL1iwoF27dleuXAGAgQMHigXwvby8pk2bNmrUKPvAS5cudejQYevWrd7e3qGhoRcuXJg2bdo777xT/uI//fRTRETEDz/8kJOTExIScuPGjc8++6x9+/b3KWM9fvx4r1692rZtu2TJki5dumzevLlnz55xcXFjx4598sknP/nkkw4dOuzYsaN///4Wi8Xxyzqf72m1WgA4evSovSUkJOTatWvFxcXiS0qpzWYrn+EjRwh5t9peNlAKBChLxEPjqEAIJWCUEVMDtZeikVLqpiq1ukvcfJX+ASqtnzLAXxWAy+8IIYQQQqh+EWpxJhw180KZ1enhGo2mX79+8L+L8DzPi6ea2RP4Y8eObdmyJSgoKC0tLTU1NTk5OS8vb+bMmeK6t33g7NmzdTrdvHnzcnJyTp48efPmzYULF1JK33vvPbFDfHz8F198ERwcfPr06fT09NTU1PPnz/v7+//444/ijn3nOBie6PPPPx89enR2dnZycnKXLl2qv3Lfvn1D78L+3LTo/fffnzFjxsaNG1955ZW33nrr0KFDUqn066+/tm8uWLx48a+//hoYGHj06NG8vLysrKw///zTZrOJpf7tDh48uGjRIg8Pj507d96+ffvChQv5+fkDBw68cuXK1KlTASA2NnbBggUA4Ofnt2TJkvKPpv/000/du3e/efPm/v37z5w5s3btWgBYsWIF/ecnnszMzFdffRUANmzYUFBQcO7cucLCwqlTp96+fXvEiBH34+zzFStW7Ny5c8GCBRMmTBCz9/z8/E8++eTo0aNxcXGxsbG7du1q27ZtWlraqVOnHL+s8wl8//79AeDtt98+dOiQ+N1ERkZSSr/77juxw6+//ioIQtOmTZ2e4jFkMJYoNu8EQlgAnjICBYESCkCACCwxeKp8iUZtpKy7u6RJM2BZAOAYiZSVEnz+HSGEEEII1Te1ycABQDDUanjlXfRHjhwpKCho0aJFmzZtxJa8vLwePXrExcWFhISILRKJRFwHFpeFRWfPngWAV155heM4ACCETJkyZebMmdHR0WIHcUV61apVTz75pNjSqlUrcW92UlKS0x/BwfBEfn5+q1atcnd3d+TKN2/evHoXFdJdrVb7+uuv2182adKkVatWBoNB3J1uMBg+/fRTANi4caP9V4PIyMh169ZVmHH+/PkA8O9//3vAgAFii0aj2bhxo4+Pz549eypvKCivYcOGa9asUalU4stx48ZptVqdTpefny+2vPfee0ajceHChSNHjhRbFArFsmXLevfunZ6evn37dkfuSY307du3U6dO9pdizYWRI0faa/sTQp555hkAyMjIcPyyzifw//d//+fp6ZmVldWjR48NGzYAwJAhQwBgzpw5U6dOnTt3rvjn4bnnnnN6iseNQIWru1apCwxEEGwAjFh/HgAoCATyNYwhwFOubsAp1CBTEHcPRqGs65ARQgghhBCqBVZchXJyJzxha7WINWDAAHd396tXr54+fVpsqbB/HgBiYmIOHjwolvcS8Txfec08NDQUAF577bUzZ86ILQqF4tNPP/3oo48AQKfTpaSkBAQE2PN50ciRI8+ePVubIucOhieKjo6WyWQOXvnChQv0Lrp3716+59NPP80w/5NXiom0uMqblpam1+vbt29fYc3/6aefDg8Pt7+klJ4+fZrjuAkTJpTvplQqxbzS/h1VqU+fPm5ubuVbfH19xcuKL48dO0YIES9VXkxMDPzvvnJXqXAIn3hPWrduXbnRvlXBEc6fA+/t7X38+PGRI0fa/x1t06bNhAkT1qxZ8+WXX4otvr6+VZ6siKqUdfOi4q9rDKWUEIYQSnn7urpRAVdaNmjYtIWbd0sPWSNWoWI8PQGPtUAIIYQQQvUZoxTPcnfyr7WMyvmj4AFALpfH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udz+++/fu3fvzfZv3rx5YRb9b37zmx1aGGT5fL7YNTQib775ZuG0luOPP37SpEnFLgcAAHYia9aseeaZZ1555ZVVq1ZttKlLly6HHnrovvvuu31Xnoe0uIwcAADQKJSVlQ0bNmzo0KHvv//+4sWLV61a1axZs7Zt23br1q19+/bFrg6KT4AHAAAakSzLunbt2rVr12IXAo2Oc+ABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACRAgAcAAIAECPAAAACQAAEeAAAAEiDAAwAAQAIEeAAAAEiAAA8AAAAJEOABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACRAgAcAAIAECPAAAACQAAEeAAAAEiDAAwAAQAIEeAAAAEiAAA8AAAAJEOABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQCjOhAAAACAASURBVIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACRAgAcAAIAECPAAAACQAAEeAAAAEiDAAwAAQAIEeAAAAEiAAA8AAAAJEOABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACRAgAcAAIAECPAAAACQAAEeAAAAEiDAAwAAQAIEeAAAAEiAAA8AAAAJEOABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACRAgAcAAIAECPAAAACQAAEeAAAAEiDAAwAAQAIEeAAAAEiAAA8AAAAJEOABAAAgAQI8AAAAJECABwAAgAQI8AAAAJAAAR4AAAASIMADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACQgyQA/fvz4jh07bmnr3Llzx44d26lTp7Kysn322efyyy9fv359Q5YHAAAA2116AX7p0qV33333lrbOmDHj8MMPv+eee1asWFFZWTlr1qwf/OAHI0aMkOEBAABIWkoBvrq6eurUqSNHjlyyZMlmO+Tz+dGjR1dVVZ1zzjnLli1755133njjjS5dujz55JNXX311A1cLAAAA21EyAX78+PGtWrX66le/Om3atC31eeKJJ+bOnTto0KBrr722rKwsIvbZZ5877rgjIq699tp8Pt9w5QIAAMB2VVrsArbWgAEDzjjjjIhYvXr1nXfeudk+EyZMiIixY8eWlPzfDxODBw/u3LlzVVXVyy+/PGjQoAYpFgAAALazZAL8uHHjCjcWLly4pQA/e/bsiDjyyCM3bMyy7Igjjpg4ceK8efM2DfDvv//+G2+8UXf33Xff3Z5FAwAAwHaSTIDfGh988EFEbLpAfaGlqqpq011+97vffetb32qA2gAAAOCLSOYc+M+Uz+cLEb1Dhw4bbaqoqIgtBHgAAABIQpM6Al+QZdlm2zd7Jbn99tvv4osvrru7ZMmSW265ZUdVBgAAAJ9X4wrwbdu2XbVqVd3dyy+//F//9V+3ct8syyorKxcsWLB06dLy8vINNy1dujQiunTpsuleBx544IEHHlh398033xTgAQAAaIQaV4AfPXr0unXr6u7269dvm3bv0qXLggULFi9e3KtXrw3bFy9eHFsI8AAAAJCExhXgf/WrX32R3ffaa6/p06c/++yzBx988IbthUvH77nnnl/kwQEAAKCIms4idhFx2mmnRcSkSZM2bHzppZfmz5/fv39/F4EHAAAgXU0qwI8YMaJnz55PP/301VdfXWhZvnx5IdWfffbZRS0NAAAAvpAmFeCzLLv33ns7dep0wQUX7L333kOHDu3atevrr79++umnf/vb3y52dQAAAPD5NakA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Kvzn2FRh/nyh25bMmDHjzTffjIhTTjllzJgxETFt2rS//OUvn6OesrKyf/u3f4uI2tramTNnbuVeH3300ZlnnjlnzpzP8YwAQLoEeAB2IocffnhlZeXChQuffvrpTbfW1NQ8+OCDETF69Oh6HqRwvL1169bHHHNMoWc+n584ceLnK6lv376FG2+99Vb9PefPn//9739/1KhRXbt2/fWvf/35ng4ASJcAD7DD/cu//EuWZYXU97Of/SzLsp49e9Zt/fDDD3/0ox8ddNBBu+++e1lZWa9evYYPH37nnXdWV1dv+lBPPfXU6NGj+/bt26pVqx49egwbNuy+++7L5/OFrd/4xjeyLHviiSci4pJLLsmy7Ctf+UpEvPfee1mW7b777hHx3HPPHXPMMbvttlurVq3222+/G2+8sbDv1KlTjzrqqIqKijZt2gwcOPDnP//5hiu9zZ07t+4RFixYcPbZZ3/pS18qKyvr3bv36aef/vbbb29Y5DZ1bmDNmjUrHF2/5557Nt06derUJUuW9OjR44ADDqjnQQr/KUeNGtWqVau+ffsW5sB/5iz6Lak7dF/4F6vHrFmzrrzyygceeODjjz/+fM8FACRNgAfY4SorK/v379++ffuIqKio6N+/f+/evQubZs+e3adPnx/+8IcvvPBCVVXV2rVr582b98QTT5x66qknnnjiRtO8zz///COPPHLSpElvvfXWmjVr5s+fP2XKlDFjxvzDP/xDoUO3bt369+/funXruifd8JeCiLjrrru+8pWvLF++fNSoUb17937ttdfOOuusyy677IYbbhgyZMiSJUuOP/74fffdd8aMGeeff/4ll1yy6d8yc+bMAw88cPLkyYcddtixxx67ePHiX//61/vtt99ml+Xbps4N5sQTT4yI++67b9NZ9IX582PGjMmybEu7/+lPf3rnnXci4uSTTy60FA7Cv/DCC3Pnzv0c9Vx//fWFG1/+8pfr73nooYfWrYFX+JkGANi55AFoEF/72tci4sILL9ywcdCgQRHRpUuXCRMmzJ49u6qqavr06d/5zncKQ/T9999f17Pu2mbjx49/6aWXqqqqXn755TPOOKPQOHny5Lqew4YNi4j//M//rGtZsGBBRLRs2bJt27YPPvhgoTGXyxV2LykpKSkpufXWW+v6/9M//VNElJaWrly5stBSON26vLy8d+/e5513XnV1daF90aJFhR8jRo4cWbf7NnXeVoW/btiwYfX0+d3vflf4Z3nhhRfqGgstd911V01NTceOHSPiqaee2nCv2trawtp106ZNW758eaH/ww8/vNGDn3feeRFRUVGxfv36Qsurr75a6PzjH/9402LOOeeciOjcufNG7cuXL3/mmWdGjhxZ2HfMmDFb/4+Qz+erqqoKO06dOnWbdgQA0uUIPEDRfPjhhy+99FJE/M///M9pp5221157VVZWHnTQQTfddFNh6vv06dPrOj/yyCMRcfTRR1933XX7779/ZWXlwIEDb7vttsKa9ltzLbF169adddZZxxxzTOFulmUXXXRRRORyua9//evf/OY363pefPHFEVFTU7PRWdnLly8vLy+/9tprC5dPi4iOHTv+8z//c0Q899xzGz3dNnVuSM2aNTv++ONjk7Xo//jHPy5cuLBbt26HHHLIlvbN5XKFc93HjBnTvHnzQuOAAQP23nvviLj77ru3tGNVVVX218rLyw877LDCJev22GOPX/ziF9vjjwMAmjIBHqBo8vn8HXfccccddxxxxBEbberevXtErFy5sq5lyZIlEVFTU7NhtyzLpkyZMmfOnMIx889UCK51evTosdn2Tp06lZWVRUTdgeg6//iP/7hRSyG7Llu2bNOn26bODaluFn3+0yPzscH68/XMn586dWrh0Pcpp5yyYXthLfpXX321sDr91uvYsePZZ589c+bMzp07b9OOAMBOqLTYBQDsvDp16nTqqadu1Pj+++9PnTp18uTJG7UPHjz4t7/97f/+7/8effTR48aNGzx4cLt27SJim4Lfl770pQ3vNmvWbLPtG27ayKYXsd9Sz23t3JAGDx5cUVHx3nvvTZs27dBDD42IfD4/adKk+DSKb0nh8u+dOnXaZ599Cj+p1D3glVdeGRF33333D3/4w013rKiomDJlykaNnTp1+syF6wAA6gjwAEX26quvPvDAAy+88MLs2bPnz5+/evXqzXY799xzZ86ceeuttz766KOPPvpoSUlJv379jjjiiJEjRw4bNqxuOnf9Sko2P/FqS+2b6tKly1b23NbODam0tHTUqFG33nrrPffcUwjw06dPX7BgQWVl5WGHHbalvaqrqwshf9GiRZ06ddpsny0F+ObNm3/mGnUAAPUzhR6gaGpqas4888yBAwdeeumlDz30UHV19Ve/+tXzzz//jjvu2GhOe0SUlJT88pe/nDFjxqWXXnrQQQdlWTZz5swbbrjh6KOPHjBgwIsvvtgwNW991N/WzlupML99s9fYq1O3tZ4CCkfa77333sIs+rr58/Xs8thjjy1durT+8mbNmjVjxoz6+wAAfD4CPEDR/OQnP7n11ltLS0t/9rOfLVmyZPbs2Q8//PA111xz6qmnFq45t6kBAwb86Ec/mj59+kcffTRlypSLLrqovLz8rbfeOuGEEzY6Pb6pqqioiIj6TzWv21pYbX6zhg4duuuuuy5YsKCwot7Wz59v37792rVrN10VtrAeYdS7lB0AwBchwAMUTWEV9HHjxl1wwQW77rrrhps2uqJ4dXX1VVddddVVV/35z38utLRu3XrIkCE/+clPHnzwwYh499136zY1bQcccEBELFq0qC4wbySfzz/00EMRsfvuu3ft2nVLj9O8efPjjjsuIu69995XXnll7ty5FRUVRx555Jb6r1mzpvBPPWrUqJYtW27aYf/9999zzz1DgAcAdhgBHqBocrlcRLRp02aj9j/+8Y/Tpk2LiLo10ps3b37NNddccsklN9xww0ad65aF2+ho84brqzclp5xySuHHjpNOOmnhwoUbbc3lcpdeeunTTz8dEeeff34968nHBrPoC7+kHH/88fWssffQQw+tWrUqIr72ta9tqU9hcfu33377+eef3/q/CABgKwnwAEVz8MEHR8TNN9/8+OOP19bW5nK5+fPn/8d//MfRRx9dmA8/derUt956a/369RExfPjwiPjFL35x5ZVXzp49e9myZe+8884dd9xx8sknR8QhhxyyUYCfPn36+vXrC78RNCVdunS55ZZbj0Xu0gAAAtNJREFUImLOnDl77rnnhRdeeN999z3//POPPfbYddddN3DgwMsvvzwiRowYUbjmfD2GDx/evn37+fPnF67BPnr06Ho633XXXRFRUVExbNiwLfUZO3Zs4YaD8ADAjiDAAxTNv//7v1dWVi5ZsmTEiBEtWrQoKyvr0aPHpZdeevzxxz/66KNZlr3++ut9+/YtHE++5pprevTokcvlvv/97/fu3btDhw49e/b8xje+8e6773bv3v2ee+6pe9jevXtHxP3339+mTZvBgwcX66/bcU444YRf/vKXnTp1+vjjj//rv/5rzJgxBx988FFHHXXuuee+9tprJSUlZ5xxxp133ln/4feIaNGixbHHHhsRK1asKC8vHzp06JZ6fvTRR4888kjhqUtLt3gBlw1n0TfVGRAAQBEJ8ABF07lz5xkzZpx77rn9+vVr2bJlu3btjjrqqAceeGDChAlHHXXUbbfdNnjw4KOPPrpbt24R0aFDh9dee+2nP/3p3/zN33Tt2rVly5Y9evQYPHjw9ddf/9Zbb3Xv3r3uYS+77LJjjjmmXbt2u+yyS1O9zPiZZ545Z86cK6644rjjjtt3331btWrVvXv3IUOGnHXWWa+88srtt99eWOvuM9WtWnfsscfWcym+3/72t+vWrYuIk046qf4HLByEX7BgwbPPPru1fwwAwNbJHCIAYFOLFy9+7bXX+vbt+5k/AeTz+Xfeeef1118fOXLkZz7sNnUGAGBDAjwAAAAkwBR6AAAASMAWV+IBgB3q5Zdffvvtt7e+//7779+rV68dVw8AQCMnwANQHDfffPONN9649f1vvPHG7373uzuuHgCARs458AAAAJAA58ADAABAAgR4AAAASIAADwAAAAkQ4AEAACABAjwAAAAkQIAHAACABAjwAAAAkAABHgAAABIgwAMAAEACBHgAAABIgAAPAAAACRDgAQAAIAECPAAAACTg/wM973y4YSePgwAAAABJRU5ErkJggg==" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd5xdVbk//s+z1t77nDM9vRISIAQUIlKktyuCNGleikFUQEFB772ILwxfUbmCL3+KXtELgopepAqiXgQbxUJvRrqQRnqbZDLltL33Ws/vjxPOPc4kk8lkkskMn/dfu511VplzXueZ1URVQUREREREREQ7NjPYGSAiIiIiIiKizWMAT0RERERERDQEMIAnIiIiIiIiGgIYwBMRERERERENAQzgiYiIiIiIiIYABvBEREREREREQwADeCIiIiIiIqIhgAE8ERERERER0RDAAJ6IiIiIiIhoCGAAT0RERERERDQEMIAnIiIiIiIiGgIYwBMRERERERENAQzgN+m0006Tt02bNm1Tj51zzjnVx8aMGVN7S3oYMWKEqvZM5Lbbbuv58Ec/+tFesvflL3+59uFJkyZ57/tYnJ6am5sPOOCAWbNm3XHHHRvN4QDy3t9888377bdfS0tLEASNjY0///nPt+k79tuECROqVXTHHXcMdnaGvHdOffavpLlcrvqqBx98cEBysoN/3AbwS3LEiBHV601NTStXrtzoO15//fW1KcyfP38AUyAiIiLa1hjAb1fr169/7bXXel5/6qmntjSpO++8s/Z0+fLlf/nLX/qdsY6Ojueff/7OO+8899xzDz300FdeeaXfSW3WVVdddfHFF//tb39rb293znV1dZVKperda6+9tvrL+OCDD9522RgUw7t0eAcUcCtt//rp/eO2HWxpkQfkS7Kzs/OKK67YglxugxSIiIiItgUG8NvbE0880fPilgbwTz31VM9un7vuuqv/2frnxD/0oQ8VCoUBSa2bQqFw3XXXbYuUiaibIfpxG5Avydtuu60f/xgd2BSIiIiIBhwD+O3tySef7HYln8+//PLLW5TI7bff3vPifffdF8dxX14eRdE+NXbdddcoimofWLhw4Ze+9KUtylIfzZs3rzaTs2fPfuyxx4455pht8V5E73BD9OM2IF+SqvrZz36294lF2zoFIiIiogEXDHYG3nF6di49++yzzrm+p5AkyUZnsa5bt+4Pf/jDySefvNkUJk6cOGfOnG5p3njjjf/xH/9RnX165513fuc73+l7rvpozZo1tadf+cpXMpnMgL/LQLnzzjur8c/MmTMHNzPDwDunPneQkg6tj1vV1n9JVrzwwgu33HLLJz/5yX7nZOtTICIiIhpY7IHfTqZPn145mDdv3qpVq2pvVUdpjh07trm5ebNJ/f73v1+7dm3lOIqiasrYilH0YRj+27/928c//vHqlVWrVlXfpXePPfbYRz7ykQMPPHD8+PF1dXXTp08/+uijr7zyyhUrVmz2tf0LJ5YsWXLllVfut99+o0aNymazO++88xlnnHHPPff0XPtq1apVtctNvfrqqwDuv//+ww47rLGx8dFHH+39jU444YQPvu1vf/tb5WJbW9vxNRYtWpSm6fe///0DDzxwxIgRI0eOPOyww6644orOzs5+FG2LSlfV2dl57bXX7rPPPg0NDWPHjj311FOfffZZADfeeGM1n7V/G1tULVvTvt1stD5r/eEPfzj//PNnzJjR3NyczWYnT578wQ9+8L/+6786Ojp6PjywDXHcccdVK+Rf//Vfa2/dcMMN1VvGmPb29uqtF198sbYmX3zxxT6WtI9uvfXWww8/fNSoUZXiXHvttX0cZbNRG/249aN9X3vttYsuuujwww+fOHFiQ0PDXnvtdfLJJ1933XVdXV39zhsG9Euy6sorr2xra9uaXG19CkREREQDSWkTTj311GotTZ06dVOPnX322dXHRo8eXXurtp7PO+88a23l+Fe/+lXtYyeddFLl+qmnntrS0lJ9ybnnnrvRdzzrrLOqz5x00klf+9rXqqf19fX5fL7fxfnpT39am+cnnnii9yrq6OjoZThuFEXXX3999eFLL710U09+8Ytf7P2BV155pZrOD37wg1wut9HHDjrooOXLl9fmsNs60q+88sp//ud/Vk8ffvjh3guYzWarDz/wwAMbTfOpp5469NBDe2Zmp512eumll/pS/H6XruLFF1/ceeeduz0chuGdd95Z+6bXXHPNllbLQLVvtYAbrc+K5cuXH3nkkZtKYcSIEZV/YfTSuH1siE2pnSs+adKk2lsf+9jHahOs/bP50Y9+VL0+duxY7/2mSrql9fOrX/3qtNNO6/nwHnvssXr16s0WZ7Mfty1t34o0TS+44AJjNv6f31GjRt166619yUO1yLUXt/JLsvZ6NR0An/3sZ2uT+u53v1v7pvPmzRvAFIiIiIi2NfbAbydNTU1777135bjbANGnn366crDR8KObzs7O+++/v3r64Q9/uLa3MJ/P197dUiJSezpixIjen//kJz/58MMPb+puHMeXXXZZLw/0w0033fTpT3+6WCxu9O7TTz99xBFHrF+/flMvf/jhh7/85S8PYH4AfOpTn9romltLliy5+OKLdUv25OtH6VatWnXMMccsWrSo28NJknziE5/oY9/vpqplu7XvmjVrDjrooF62UWhrazvrrLNuvfXWXhLZyoY49thjq8fLli1bunRp9bQynKHqueee2+itY489ttsnaGtcddVVv/rVr3pe/8c//nH55ZcPyFv0o32vuuqqW265ZVPTwteuXXvBBRc88sgj/cvPQH1JAjjppJMmTJhQOb7xxhu3dP78gKRAREREtC0wgN9+DjvssMpB7W/TuXPntra2Vo4POeSQzSZy3333VQO8MAxPOeWUGTNm1E6y7ba93BZ5/PHHq8dBEOy22269PPynP/2pdir+gQceOHv27GuvvfYTn/hEXV1d5aJz7qabbqocjxs3bo899thpp51qE9ljjz322GOPMWPGVB8YPXp09W42m608UFljb+HChZdddln17syZM2+66aZ77733kksuqXaXzZs37/Of//ym8lztZx7AQKvyy37PPfc89dRTDzjggNpbTz75ZHU4+jYq3bXXXls7z3n8+PFnnXXW4YcfHkVRuVzuuRjYRm20WvrXvr0UsBcXXnjh4sWLq6dTpky58MILv/jFL9b2yavqZz7zmbfeemtTifSxITZl7733rgZsqIkYOzo6/vGPf9Q+2UsA30v6W1o/la0cd9ttt1NOOaXbLPqf/exnS5Ys6b04m/24bWn7Ali4cOE3vvGN6ul+++135ZVX3nzzzVdcccX48eMrF9M0rc7E6cefxIB8SQJobGz85je/WS3FZz/72b68amBTICIiItomBnkEwA5sYIfQX3rppdVJyFEUlUqlyjPVTsVMJlMqlTY7hP79739/9YETTjihcrF2FH0URevWrdvS4iRJcsMNN9SOjN1rr716r5+vfOUr1YePO+642lu1PaXTpk2rvdWtQ69nstdcc0317kEHHVR769///d+rt9797ncXi8Xqrdpl+a21S5YsqVzvNsoawIknnvj8888XCoVyuRzHce9l7MsQ+kwmUzvct9syBN0GIQ9s6RYtWlQbCJ100kmFQqFy67nnnqvGVBW9DKHfaLX0r317KeCm6rPbeorHHXdce3t79SU//vGPa/8sawczb01DbNR5551Xff6yyy6rXOzZn7zTTjtVbuXz+dqB1rUTHDY1WaDv9QPgpptuqt66+uqra2/97ne/22xxtNePWz/a9+67765enzFjRpqm1VuLFi2qhv0AFixY0Mci12ZvK78ku1333tdG+3fffXflsT4Ooe9fCkRERETbGnvgt59q51Icx88//3zluLo40/7777/ZFd2WLVv2pz/9qXpaHTxfO4o+juP77ruv93SWL19+QI0999yzubn5kksuqR0Ze+WVV/aeiDHmpLd97nOfq71V6eKr2GxXYd/Vdhh+6Utfqo12Zs2atc8++1SOnXN33HHHRlN43/ve95vf/Ga//fbL5XJRFIVhuPW5+sIXvlD7z5Gzzz67tr/0zTff7GM6/SjdzTffXF3SrLGx8fbbb6/On99///1/8IMf9PGtN1ot261977nnnupxXV3dz372s6ampuqVCy644Mwzz6ye3nvvvZtKZ+sborYLvdoDX+1v33///SsHS5YsqSyxNmfOnOrS6DNnzqztwN96s2bNuuiii6qns2fPrq+vr552GxTQD/1o38pihxVr1qxZtmxZ9XTKlClf/epXL31bv1ez2/ovySoR+f73v1/978/ll19eKBS2KDNbnwIRERHRgOM2ctvP5MmTp0yZUhkq/MQTT1Qmc1YHOfdlaOhdd91VjbEr4+crx5VR9C+99FL1sQsvvLCXdGp/HG/UEUcccc455/SemZ6zptM0feutt1544YXaFdEGyqJFi2qXxT7qqKO6PXDkkUf+/e9/rxxXf/F3c+mllw7g4PmK2jERFbvvvnu1LfL5fF8S6V/paqc8fOQjH+m2Ovcpp5wyffr0uXPnbvbdN1ot2619a0tx1llnjR07tmf2qn2/K1euXLBgwS677NIzna1viGOOOUZEVBXACy+8EMdxFEXVQfJnnnnm4sWLV69eDeC555476aST+j5+vh+6LS8XhuEuu+xSnYndx7+rXvSjfWsXxVi3bt20adMOOeSQE0888cQTT9x7772/8IUvbGWWMBBfkrX23XffCy+88Ic//CGApUuXfv3rX68dDrB9UiAiIiIaWOyB366q/UuVn6SdnZ2Vma7o2+JMtR3LxxxzTO3v6dpO+D//+c/Lly/vdyZPP/30zfbhV7W3t997770XXnjhe97znsoeVGefffZrr73W73fflIULF9aeTpgwQf7Z9ddfX71brdVuep/V3z+13ZUV3QZC90X/Slf7qne/+93d0hSR97znPX15916qZTu0b21H7p577tnzgT322KP2tHZ5uVpb3xDjxo2r1li5XK78x6QapR988MHVTvhKt/w2DeB7Fqe2B36gbFH7nnHGGbVTNrz3jz/++OzZs2fOnLnTTjtddNFFv/nNb/qxW3s3W/kl2c21115bHRh/3XXXzZ8/f/unQERERDSAGMBvV9UfoJUlmp599tlqj/rBBx/c+2tfffXVah8s/jli73bqva8dltwXIjJ69OhjjjnmzjvvvO+++2rXnerFT37yk6lTp5555pm33HLLSy+9lCTJFr3pFtmirZg39XDt2OwdSv9KV7si/cSJE3s+OWXKlL4kuKlq2T7tW7vH+0ZHoY8aNap24HQvuwxsvQ984APV46effnrlypWV/xcEQbDffvtV18brFsBns9nDDz982+VqG9nS9p0yZcrvf//7SZMm9by1dOnSH/7whx/60Id23XXXhx56aGtytTVfkj2NHj26OqCgXC7XrhO53VIgIiIiGkAcQr9JtX1NvQxYrb212dW2q51Lra2tb775ZnUs9PTp03uOHO6mdiUzAOeff/7555+/qYfvuuuu2kXRupk6dWq3Lt9+uPfeey+44ILqaRRF+++//3vf+95999137NixJ5988lam300Q/N/fqjFm99137+XhzTbEjqZ/pRs3blxnZ2fleO3atT2frIz37p/t1r5NTU3VNcZ7rq4HoK2trVwuV08bGxsH6q17OvbYY7/1rW9Vjp966qmpU6dWjmfOnJnL5WoD+LVr1y5YsKByeuSRR/Zj2MXg6l/7Hn300W+99db//u//3nbbbQ899FDPOeGLFi064YQTnnnmmX333bd/GduaL8mN+sxnPvPDH/6w0o1///33l0ql7Z8CERER0UBhAL9J48aNqx6vWbNm/fr1tWsUV9UujtVt3e+e9tprr+bm5vb2dgBPPPFE9bfpZud2quoW7Q/37LPPzp8/f9ddd+37S7bU7Nmzq8dnnXXWTTfdVK2fBx54YMDfrtuggDlz5gy5kKkX/SvdbrvtNm/evMrxG2+80fOB119/vd9Z2m7tO2HChGokvNG12bqVYmDXiuvmsMMOy+VylZ0an3766eon6KCDDkLNOnatra21g1wGfPz8dtDv9g2C4IwzzjjjjDOKxeJDDz3061//+oEHHqjdyzBN029/+9ubWkhys/r9Jbkp1trvfe97//Iv/1I5/eMf/7j9UyAiIiIaKBxCv0nVdb8rbrzxxp7PPPLII7WBU7eX9GSMqY4Cffzxx6srXW92budf//rX2o2y+6LbNloDK5/PV4MuAF/5yldq/7vRx+3Ht8jMmTOr3dTe+9oFsYeB/pWu9h80t99+e7eOwccff/yFF17oX362Z/vW/vHffffd1d74qu9///vV49GjR8+YMWMA372bbDZ7xBFHVI4rXc2V40oAP27cuOrO6jfccEP1VUMugO9H+5ZKpf+vxvr163O53Ic+9KGf/OQnK1eufOCBB2r/GrdmlYR+f0n24uijj+4252j7p0BEREQ0IBjAb9LJJ59cO/P26quvvuqqq6pLhbe3t//oRz/qtlR7X37hVX+G3nfffevWret2cVNqu7OCINhnE2onM2/TAL6yU3f1tNoPDODll1+ujbi2Ru2k3Pr6+g9+8IPV02984xvdHp49e/Z73/a1r31tQDKwTW196Y477rjqA6tXr77ooovSNK2cvv76673MsNisAWnfPs6Zr/3U5PP5j3/847WbkN1yyy21fd0f/vCHB3wfgW5qo/Hq8mmVAB5AdRR99Z8sEyZM2GuvvfrxRtt0zYje9aN9s9ns9773vS++rbIwe4Ux5sQTTzz99NOrVyZPnrzR9+1jkfv3Jdm76667rrrJ4mClQERERLT1OIR+k8aMGfP5z3/+61//euU0juNrrrnmmmuuqeyVXRnhWeuoo46qjcE2pTrDs5pCS0vLRhffriqXy7XbX5944om//vWvN/rk1Vdf/dWvfrVy/Nprr7300ku1W2EPoIkTJ44aNao673rWrFkf/OAH995777lz5957771bM0e0duj4G2+88eabb06ePDmTyVhrr7vuuj/+8Y+Vnc9/8YtfHH/88bNmzRoxYsQbb7zx6KOPPvjgg5VXBUGwpWv4bTcDW7qTTz75wAMPfOaZZyqnP/vZzx5//PHDDjts+fLlTzzxRGUceP/0u317KeCmXrL//vsff/zxv/vd7yqnDz744MyZM48//viRI0c+8cQTf/rTn6pP1tXVXXHFFf0uVB/17E4fOXLk9OnTK8cHHHDAL3/5y96f70U/6mdb6F/7HnHEEdX9/GbPnv3aa68dcsgh9fX1HR0dzz333G233VZ98sADD6we96PI/fiS3KwpU6bMnj275+Z52zMFIiIiogGgtGnlcvmEE07oSzXutttuy5Yt6/by2gcuvfTSysV8Ph+GYe2tE044ofqS2oGs5557buVit03dfv7zn28qw90mQl9xxRXVW6eeemr1+tSpU7e+cs4777xN1cbIkSNrTzs7O6uvevjhh2tv9Uy2Omi51iuvvFK5+8UvfnFTb1ohItddd101tW6LolXT6aPa2OOBBx7oY5rnnntu9e7HP/7xbVc6VX300Ud76ZGujZGuueaaLaqW/rVv7wXcaH2q6ooVKza6tnm3st9+++21Odyahuhdt2n2xx9/fPVWzyXW77jjjp4pbKqk/aufiuooAPxza/ail49bP9p3wYIFfVlGbvLkybVfhr0Xufbi1nxJ9nK9qlgsVlclrJo3b94ApkBERES0rXEIfW+iKPr1r3/93//9372sTpfL5b7whS8888wzG93Hq6e6urr3vve9tVc2uzhT7frzjY2NvSwAvvvuu9cu/nz33XfrP/9EHkDXX3/9RhfJO+SQQ/785z/XXqn22vXFMcccU+3t7Onaa6+97LLLNhWyNjU13XbbbZ///Of7/nbb2YCX7uijj/7xj39cO9ej6uyzz/7EJz7R76z2r317L+CmjB8//umnn+5lk7BRo0b98pe/nDVr1pam3D/dOtVrI+f999+/toFE5Jhjjul7yv2rn22hH+07bdq0Bx54oPf8T5s27cEHH6z9MuxHkfvxJdkX2Wz2O9/5zuCmQERERLSVGMBvRhiGl1xyyfz587/73e/OmjXroIMOGjNmTGNj4z777HPGGWdcddVV8+fP/+Y3v9mtz6p31QGiFb3P7Wxra6sOnwZw+umn9z4Ps3Za/qJFi6prOA+4lpaWF1988eqrr953330bGxtHjBhx9NFHV0Zx77333hdccMExb/vtb3/b92Tr6uoeeuih888/f9q0aZlMJpvNjh49urrAmzHm29/+9osvvnjJJZe8613vamxsrKurmzFjxnHHHXfTTTctW7Zsu8V4/bMtSnf++ee//PLLn/70p3fZZZdMJtPS0nLkkUf+/Oc/v+uuu7Zmof7+tW/vBezF5MmTn3zyyQcffPBjH/vY9OnTGxsboyiaOHHicccd993vfvett96qHUKyrXUL4GsHhLe0tOy2227V03322WeL9jbrd/0MuP617wEHHPDGG288+OCD55xzzsEHHzxlypRMJjNu3Lj99tvv9NNPv+++++bOndtt2k7/irxFX5J9d9ppp23RP1y2RQpEREREW0O2XQ8tEQ2uj370o9XhG9/61rcuv/zywc0PERERERFtDS5iRzRUPfroo3PmzKkc19fXX3zxxbV3C4XCX/7yl+rpRsdLExERERHREMIAnmioWrVqVW2nemdn5yWXXFJXVwdgyZIlF1988ZIlSyq3Ro4cOeT2KiciIiIiom44hJ5oqOrs7DzssMNeeuml6pUgCPbee+9yuTx37tzqntthGP7xj3886qijBieXREREREQ0QBjAEw1h69at+/CHP1y7WXo306ZN+/a3v33aaadtz1wREREREdG2wACeaMibM2fOj370o1deeWXJkiUrVqwYNWrUlClTdt5551NOOeXMM8+s3Q2eiIiIiIiGLgbwREREREREREMA94EnIiIiIiIiGgIYwBMRERERERENAQzgiYiIiIiIiIYABvBEREREREREQwADeCIiIiIiIqIhgAE8ERERERER0RDAAJ6IiIiIiIhoCGAAT0RERERERDQEMIAnIiIiIiIiGgIYwBMRERERERENAQzgiYiIiIiIiIYABvBEREREREREQwAD+H8yf/78XXfdddddd/30pz892HkhIiIiIiIi+j/BYGdgxxLH8YIFCwCsWrVqsPNCRERERERE9H/YA09EREREREQ0BDCAJyIiIiIiIhoCGMATERERERERDQEM4ImIiIiIiIiGAAbwREREREREREMAA3giIiIiIiKiIYABPBEREREREdEQwACeiIiIiIiIaAhgAE9EREREREQ0BDCAJyIiIiIiIhoCGMATERERERERDQEM4ImIiIiIiIiGAAbwREREREREREMAA3giIiIiIiKiIYABPBEREREREdEQwACeiIiIiIiIaAhgAE9EREREREQ0BDCAJyIiIiIiIhoCGMATERERERERDQEM4ImIiIiIiIiGAAbwREREREREREMAA3giIiIiIiKiIYABPBEREREREdEQwACeiIiIiIiIaAhgAE9EREREREQ0BDCAJyIiIiIiIhoCGMATERERERERDQEM4ImIiIiIiIiGAAbwREREREREREMAA3giIiIiIiKiIYABPBERERER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es/2Pzw0+Nq8HE7S3UF8LhdxWsy1FlKJWTHIdRIX483pfZTwrIyWg6Meb2ZVlFXzQXwutHvzfDBOt7JqOiv2siqa58PFxmFtZFJOhHpkCTQzy/f2otMtZ7njrQ7ic2k1E6rY3zfPB1E56nhri43DBFPXarLmWh50vKLYwAuoe6hynEznuYjLKuonp7NyrI1GRqflPCqG2IBTOa2i5dGGInLmTVSDOu22xCYmcWbiChUVVQqkAW2MAaYV1RXTpS00QsjhOPRcEphUOAlRxEz5eGrNNdaYYKWkMYZoZAyquGCasZQGu5Z1XqBBkUfzIoqKwVgbYSMXVbDWX1zf6x3sL1JoUOQ3ChlE5dQzcypmNA1irzUNBa6wQm7KEUaZIysLcjoZtyaO9CIawflEbc/JWhP5HDW+Ywr6UqZJOSlE8shfQj9E02z3xODOE4M7z03v+8b2F+7Zuu0b5//2wb3ju9HJrJr/0E9Xq9Vq38d4PP7Wo9x1112f//znf+mXfunVr341Y+zGG2+86KKLvust8/n8+uuvf8pTnvLZz352c3Pz/e9//378ta997W233UYIeec733n8+PGzZ89+7nOfe/azn53n+S//8i9/4QtfePRBfu7nfm46na6srHziE584ceJEv9+/88473/CGNwDA5z73uc9//vOPzvAlL3nJ9va267rve9/7vva1r911110f+tCHPM/7lV/5lR/kGo0xL33pS++4445Go/GHf/iH3/zmN0+dOvXxj3+81+vt7u6+/OUv11rvt3zve9/7vve9zxjz+te//vbbbz9//vzf//3fX3PNNQDwnve85/d///d/8A/2d37nd+67776rrroKAN785jffd999n/zkJy3LeslLXgIAj111++abbwaAyy67bH8x+X0f/ehH/+Iv/uL973//eDz+0pe+tLW19bd/+7etVutTn/rUO97xjke//YeYee37q3vga7Va7YmEEA7s7v7045NsZ57tISASKi2zvJpn1fxI95kL3saj30IxcxY6eOhlVCmTTNHeVE/azGaKfqt/+zDZ7EcnGLYqlRkNGFNj9KwYAEKlLoQqUjFTSjHMK5UDAMFMGW1hvtI4wplrcb/pLC36Bxf8jaaz6PJglvV35g/7VtumnsuDrIoo4W13ZTc6ueCvz4s9BIulzBGgprtEMRulW3vR6VTMWt4KJ7bDfQCo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yy1DQ0MbN27cvn3729/+9ve85z3H1nnnO9956aWX3nrrrb1eb2Ji4oc//OH1119/9tln7937P1L6//Ef//Hll19+++23G4YxNDT0ox/96Oqrr7766qtPpL+XXXbZW9/6VgCo1Wpvf/vb+9nKAeALX/jCeeed97nPfW5+fn7Dhg2HDh368Ic/fO655957772P423PnYg8gM/lcrknj+CmaxRTFS/2DkqVgCbGAQiAkAhAkSIFAICkSTFAQEDEVMe9tBkmXakTzSRRSqQAtSZ1JIZngEQMCYBAU382PaDWlBEAaODcQIYGNx3DF8wggCBpaZJSZYwLVxRIQAYZA7S0CYo0gAIFCDGExEGBdI0SZ8I0HM6FYKZvVBCoG9YZGIp0lHYbnUNJ0EiXDmB5FP1atPO+7IGH5KFmZ24u6jXirCdVrLScKJ/hGEWGvB7OFoxqBQdrbGRmZddMa6fWqh0tV92JijNioj3b2t1NVo6+dUez3PUZ3IqzXpA2Mx2V7UHfLFgGL1nlollY7U9YbFDK9ePec8bcs4bt01brLWVzpOgMjo1sGq+eXpxYBR5PZZhlYczCFJLQDAi05FlkRlpJP3AqjVIhdhTXmZmFbtwotw+tXlgebiBhMfB65awx1NtfObA40A7sYHl0eeeW/XUvXhhqSJOUqbVB3Uq4NNxqDKX1wU59XWCMllnJNrxC50zu/J/1Y8951vCazaOwxl829WJXr4Ri/QD61pN7P+ZyudxTby5oPe5jpdaLYecUNuaoSqXywhe+sNPpfOc7/z29v9PpfOMb3/A874orrjhaeOONN95xxx3XX3/9G97whn70vry8/P73v//73//+dddd98Y3vvHOO+/ctm3b7t27f/KTn/x3y6X8v//3/95666233nrrddddd8stt3z729+WUv7+7/9+EATHtuQLX/jCc5/73MOHD//rv/7rT3/6089+9rP9ixIdeepx9913f/CDHyyVSnfcccfS0tL27duXl5cvu+yyvXv3vu1tbzt6nttuu+1jH/vY6tWr77vvvqmpqV27dj344INjY2Of//znv/GNbzxmf9/4xjdef/31ADA6OnrDDTdcc801ADA9Pf3mN78ZAL785S/X6/UHHnig0Wi87W1vW1paetWrXhVF0an8J8n9XB7A53K53JNqzcC20wafaRtOplNgQESA/dCUiFF/BJYB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pS2Ab7VaX3zxxUGDBrkGHj16tGXLlosXLw4ODq5Tp87BgwdffPHFv/71r4V3PmfOnBYtWvz73/8+f/58TExMYmLiP/7xj+bNm9+mxPrzzz936dKlSZMm//znP9u0abNw4cIOHTpMmjRpyJAhzZo1e+edd1q2bPntt98++OCDBQU3MQOl9AE+MjJSRLZs+f+JKzExMadOncrMzNQeqqpqt9sLJ3yUhP3kxbqn0kUVUcWkiEkUkypOUVQ35YqXOc/qE2j1tfh7WS7n+1k8g0N8Q8OqhIT6hYRW4fQ7AAAAjOVW7glXcCUr73JqqYcHBAT06NFD/ngS3uFwaHc1cwX4rVu3Llq0qHr16seOHTty5MiuXbtSUlLGjRunnfd2DRw/fnxWVtZrr712/vz5nTt3njlzZurUqaqqvvHGb5f3L1++/IMPPqhRo8aePXvi4+OPHDly4MCB8PDw//znP9qM/dIpYXmaGTNmDB48+Ny5c7t27WrTpk3xe+7evXud63BdN6158803x44dO3/+/Keffvqll17auHGjh4fHRx995JpcMH369PXr10dFRW3ZsiUlJeXs2bM7duyw2+3aUv8uP/3007vvvuvv779y5coLFy4cPHgwNTW1V69eJ06cGD16tIgMHz58ypQpIhIWFvbPf/6z8KXpc+bMad++/ZkzZ9atW7d3796vv/5aRD7++GPtQmMROX369DPPPCMi8+bNS0tL279/f0ZGxujRoy9cuDBgwIDbce/zjz/+eOXKlVOmTHnyySe19J6amvrOO+9s2bJl0qRJw4cP/+6775o0aXLs2LHdu3eXfLelD/APPvigiLzyyisbN27UfjetWrVSVfXLL7/UOqxfv97pdNaqVavUT3EHupKV7/7PDW6quCmimpwOk2oXVcSpiNMpjjyrT7CPuyXP5hZocW8cJu4mETGbTe7ubqyvAQAAAMO5knVLV2LnXr6l4VfPot+8eXNaWlr9+vUbN26staSkpMTFxU2aNCkmJkZrcXd3184Da6eFNfv27RORp59+2mw2i4iiKC+88MK4ceO6du2qddDOSM+aNatZs2ZaS8OGDbW52atXry71t1DC8jRhYWGzZs2qUqVKSfZ85syZk9dRJO5GRkY+//zzroc1a9Zs2LBhTk6ONjs9Jydn2rRpIjJ//nzXpwatWrX65ptvijzj66+/LiJ///vf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0ksv3XCsdtsA3JDZy71m70YZd4XY4i96uEvVhmFKWBVxI7cDAACg0nJzt7R74rO1H/dz2Ep0L25FJKhm68YP3DiGlFDr1q1jYmJOnjwpV82fF5EXX3xx3LhxcXFxbdu29fPzO378+LFjx1544YXVq1efPHmydu3ay5cvb9So0bvvvjty5MgRI0a8/fbbUVFRly5dOnLkiNPpHD58+H333Sciw4YNW7t27bx582JjY2NiYnx9fQ8fPpyfn//II48MGTJERB566KGoqKhjx47FxMTce++9aWlpe/fufeCBBxwOxw8//HC94ktYXil+LN27dy/mwvLil5QrYsyYMT/++OO6devuueeesLAwT0/PhISEKlWqjB49+oMPPnB169y589ixY//xj3907do1MjLSarUePnzYZrPFxMR89NFHWh8fHx9PT89z5861a9euRYsW7733XglriI2Nfffdd8ePH//ggw9GRERERUUlJiaeP3/e19d3+fLlJVycv3S/o7JV0gD/5ptv9uvX7+zZs4U/VUpPT58+ffoNxxLgS87N7BbUMFQahupdCAAAAFBOAiMa3T/08y3fPFdwJeuGnYOiW7Z7YpbJ7VZX8y5s8ODB2ulf7Qr2wv7yl79YrdaZM2fu3r07MDCwVatWH374YefOnYcNGzZ58uSUlBRt7vpzzz1XvXr1999//+jRo7t37w4ODu7YseMzzzyjnV0XEUVR5s6d26NHj2+++Wbfvn0XL15s1arVU089paV3EQkMDNy4cePEiRM3bNjw448/1qhRY9KkSS+99NL06dN9fX21ydtXK2F5pXDmzJnSDbyat7f3mjVr3nvvvZUrV+7bty8/P79fv35Tpkw5ffr0uXPnCq+NP3369C5dunz88ccHDhyIj49v1apV+/btX3vtNdcN3s1m88yZM994441du3b5+/vfVBl/+ctf2rVrN23atP379x84cCA6Orpv374TJkyIjIws4R5K9zsqW4prAfkb2rt376JFixITE7UVAufPn+/v79+9e/cbDtTuEm8IR44c0VYg7NOnj3YNDAAAAIBykJV6avuicWmJu6/XweRmrtNmWNPur5RtekeZu3z58qFDhxo3buzt7a13LRVaQUHB0aNHrVZrRERJryK5iQBfdKSiNGrUyHXjvsqBAA8AAADoKOnQmvjdi88f31R4Rr13QERkgy51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P2g/ll27drkatZb58+fb7fagoCAR2bRpU+FRDodDW7tu27ZtmZmZWv/vvvuuyM5Hjx4tIlartaCgQGs5cOCA1vntt9++upjnn39eREJDQ4u0Z2ZmbtmypWfPntrY/v37l/yHoKpqcnKyNnDDhg03NRAAABgXZ+ABQDepqal79uwRkW+++WbIkCExMTEhISGtWrX69NNPtanvO3bscHVevXq1iPTo0WPmzJnNmjULCQlp2rTpl19+qa1pX5J7ieXn5z/33HO9evXSHiqK8tJLL4mI0+l8/PHHhw8f7uo5fvx4EbHb7UWuys7MzAwICHj//fe126eJSFBQ0Msvvywi27dvL/J0N9W5PLm5ufXp00euWov+f//7X0pKSmRk5N133329sU6nU7vWvX///u7u7lpjbGxsnTp1RGTBggXXG5icnKz8UUBAwH333afdsq569eoffvhhWXxzAACgMiPAA4BuVFWdM2fOnDlz7r///iKboqKiROTy5cuulvT0dBGx2+2FuymKsn79+pMnT2rnzG9IC64u0dHR12wPDg62WCwi4joR7fLiiy8WadGy68WLF69+upvqXJ5cs+jV38/MS6H154uZP79hwwbt1PfgwYMLt2tr0R84cEBbnb7kgoKCRo4cefDgwdDQ0JsaCAAA7kBmvQsAgDtXcHDwY489VqTx3LlzGzZsWLVqVZH2uLi4b7/99r///W+PHj1GjBgRFxdXpUoVEbmp4FejRo3CD93c3K7ZXnhTEVffxP56PW+2c3mKi4uzWq1nz57dtm1bmzZtRERV1aVLl8rvUfx6tNu/BwcH33XXXdpHKq4dTpkyRUQWLFjw5ptvXj3QarWuX7++SGNwcPANF64DAABwIcADgM4OHDiwfPnyXbt2nThxIjExMTc395rdXnjhhYMHD37xxRfff//9999/bzKZGjRocP/99/fs2bNz586u6dzFM5muPfHqeu1XCw8PL2HPm+1cnsxmc+/evb/44otFixZpAX7Hjh1JSUkhISH33Xff9UbZbDYt5F+4cCE4OPiafa4X4N3d3W+4Rh0AAEDxmEIPALqx2+1PPfVU06ZNJ06cuHLlSpvN1qFDhzFjxsyZM6fInHYRMZlMn3322f79+ydOnNiqVStFUQ4ePPjRRx/16NEjNjZ29+7d5VNzyaP+zXYuIW1++zXvsefi2lpMAdqZ9sWLF2uz6F3z54sZsmbNmoyMjOLLO3r06P79+4vvAwAAUDoEeADQzbvvvvvFF1+Yzebp06enp6efOHHiu+++e++99x577DHtnnNXi42Nfeutt3bs2HHp0qX169e/9NJLAQEBx44d69u3b5HL4ysrq9UqIsVfau7aqq02f02dOnUKDAxMSkrSVtQr+fx5f3//vLy8q1eF1dYjlGKXsgMAALgVBHgA0I22CvqIESPGjh0bGBhYeFORO4rbbLapU6dOnTr1+PHjWouPj0/Hjh3ffffdFStWiMjp06ddmyq3Fi1aiMiFCxdcgbkIVVVXrlwpImFhYREREdfbj7u7+8MPPywiixcv3rdv36lTp6xWa/v27a/X/8qVK9qPunfv3p6enld3aNasWe3atYUADwAAbhsCPADoxul0ioivr2+R9v/973/btm0TEdca6e7u7u+9996ECRM++uijIp1dy8IVOdtceH31ymTw4MHahx2PPvpoSkpKka1Op3PixImbN28WkTFjxhSznrwUmkWvfZLSp0+fYtbYW7lyZXZ2togMHDjwen20xe1//fXXnTt3lvw7AgAAKCECPADopnXr1iIya9astWvXOhwOp9OZmJj4t7/9rUePHtp8+A0bNhw7dqygoEBEunTpIiIffvjhlClTTpw4cfHixYSEhDlz5gwaNEhE7r777iIBfseOHQUFBdpnBJVJeHj4559/LiInT56sXbv2uHHjlixZsnPnzjVr1sycObNp06aTJ08Wka5du2r3nC9Gly5d/P39ExMTtXuw9+vXr5jO8+fPFxGr1dq5c+fr9RkwYID2BSfhAQDA7UCABwDdTJo0KSQkJD09vWvXrh4eHhaLJTo6euLEiX369Pn+++8VRTl06FD9+vW188nvvfdedHS00+l89dVX69atW7Vq1Zo1az7xxBOnT5+OiopatGiRa7d169YVkWXLlvn6+sbFxen13d0+ffv2/eyzz4KDg3Nycv7xj3/079+/devW3bp1e+GFF3755ReTyTRs2LC5c+cWf/pdRDw8PB566CERycrKCggI6NSp0/V6Xrp0afXq1dpTm83XvYFL4Vn0lXUGBAAA0BEBHgB0Exoaun///hdeeKFBgwaenp5VqlTp1q3b8uXLZ8+e3a1bty+//DIuLq5Hjx6RkZEiUrVq1V9++WXatGn33HNPRESEp6dndHR0XFzcv/71r2PHjkVFRbl2+8Ybb/Tq1atKlSpeXl6V9TbjTz311MmTJ995552HH364YcOG3t7eUVFRHTt2fO655/bt2/fVV19pa93dkGvVuoceeqiYW/F9++23+fn5IvLoo48Wv0PtJHxSUtLWrVtL+s0AAACUjMIpAgDA1dLS0n755Zf69evf8CMAVVUTEhIOHTrUs2fPG+72pjoDAACgMAI8AAAAAAAGwBR6AAAAAAAM4Lor8QAAcFvt3bv3119/LXn/Zs2a1apV6/bVAwAAUMER4AEA+pg1a9Ynn3xS8v6ffPLJs88+e/vqAQAAqOC4Bh4AAAAAAAPgGngAAAAAAAyAAA8AAAAAgAEQ4AEAAAAAMAACPAAAAAAABkCABwAAAADAAAjwAAAAAAAYAAEeAAAAAAADIMADAAAAAGAABHgAAAAAAAyAAA8AAAAAgAEQ4AEAAAAAMAACPAAAAAAABkCA/7/24IAEAAAAQND/1+0IVAAAABgIxnex1e1YbBkAAAAASUVORK5CYII=" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4473,23 +4490,28 @@ <h3>Integration with <code>fastMNN</code></h3> object):</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcImNlbGx0eXBlX2Jyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGZvciBmYWNldGluZyBieSBhIHZhcmlhYmxlIHVzaW5nIGBvdGhlcl9maWVsZHNgOlxuICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSBcInNhbXBsZVwiKSArXG4gIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OXCIpICtcbiAgIyBGYWNldCBieSBzYW1wbGVcbiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICtcbiAgIyBVc2UgYSB0aGVtZSB3aXRoIGJhY2tncm91bmQgZ3JpZCB0byBtb3JlIGVhc2lseSBjb21wYXJlIHBhbmVsIGNvb3JkaW5hdGVzXG4gIHRoZW1lX2J3KCkifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwiY2VsbHR5cGVfYnJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgQWxsb3cgZm9yIGZhY2V0aW5nIGJ5IGEgdmFyaWFibGUgdXNpbmcgYG90aGVyX2ZpZWxkc2A6XG4gICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9IFwic2FtcGxlXCIpICtcbiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBcIkRhcmsyXCIsIG5hbWUgPSBcIkJyb2FkIGNlbGx0eXBlXCIsIG5hLnZhbHVlID0gXCJncmV5ODBcIikgK1xuICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OXCIpICtcbiAgIyBGYWNldCBieSBzYW1wbGVcbiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICtcbiAgIyBVc2UgYSB0aGVtZSB3aXRoIGJhY2tncm91bmQgZ3JpZCB0byBtb3JlIGVhc2lseSBjb21wYXJlIHBhbmVsIGNvb3JkaW5hdGVzXG4gIHRoZW1lX2J3KCkifQ== --> <pre class="r"><code>scater::plotReducedDim(merged_sce, dimred = "fastmnn_UMAP", - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2, # Allow for faceting by a variable using `other_fields`: other_fields = "sample") + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1))) + + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + ggtitle("UMAP after integration with fastMNN") + # Facet by sample facet_wrap(vars(sample)) + # Use a theme with background grid to more easily compare panel coordinates theme_bw()</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,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aWKNJEl/+9vfaLrBn5AKCwsPHz5ccxftpNXlcrkURXnkkUfq3Wq322vms3Pnzt69e9ebkqbp2267LRqN1q3wfffdp6Y5dOjQ3Llza+715ZdfxnLIWg7vvfdevet3795dXFxcVFRUt2IURd15550192rVg1Uv0L333lvvBcrNzV27du2cOXPUj9u2bWvGiWrGFyCWQ27oJKveeOMNq9VabyYsy957772iKDZy4Zp0gRqn9T0566yz6m698cYbtZyvvPLKugmGDBmibn3iiScaOvCmnq7Nmzdrf8u1NOnQTvp3qjTr6msWL16cnZ1d714sy959991ayljOQCvdirU29kOGDFEUxeVyZWZmqmtmzJhRb7YffvhhzZq0RlYAAADQDpz87QEkwIQJEx5//HGe51euXDl58uS6CRRFWbp0KSEkIyNj+PDhq1atOmme2vB1l156qc1mU5evueaap556ihBSVlb23XffXXjhhS2s+e7du7XhlOoNbBpy//33a4/OBoOhS5cuWVlZHo/n4MGDagfU4uLicePGbd682Ww2q8kGDRqktiCdNWuW+urp1VdfVbvXqmkuu+yy/Px8SZJmzJhBCLFarc8++ywhRKfTaeX+/PPPF198cXV1tfrRZDL16tXL7XYfOHBAURRZlt98882DBw8uW7ZMK7eWTZs2PfbYY+pyYWFhQUFBvCboqqysvP766ysrKx9++OERI0YUFRUdOHDg9ddf//DDDxVFeemll/r06aO9f2vtg73llltqRmKdO3d2OBw7d+4UBKG0tHTs2LF9+/Zt/HAaP1HN+ALEcsiNmDdv3gMPPKB9tFqtZ5xxRklJifqiWBTF559//siRI428fW3SBWrcqFGj1IVdu3a5XK6MjIyaWzdu3Kgtf//994qiUBSlrQmHwz/99JO6PGbMmIaKaNLp2rlz51133eX1eo1G4znnnNOtW7eDBw9u2rRJfRP+0ksv9e/fX23Ic1In/Tslzbr6qu+++27KlCnqb6k0TZ9++ukdOnRwu93FxcU8z4uiuGDBgsLCwttvv72pZ0DVGrdiQojT6fzXv/41ZcoUQsjChQuvv/76gQMHxrJjq2YFAAAAKSmJPx6knNZ7A681Lb7sssvqzWfz5s1qgltvvVVRlJO+gY9Go9q8ccuXL6+5SQuzp06d2lC1Y3wDHwgE+vTpo6akKGrXrl2N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0KBBe/fujf0MxP1WrNJ6AQwZMuSkJyoYDGp377o1iWNWAAAA0A5gGrlmuu6666655prly5d//fXXW7duLS0tra6u1uv16enpRUVFgwcPnjRpktZAvakmTJig9Z+PsdHm5s2btSmyGh9/vqbevXt369Zt3759hJDFixfPmjWrOdVtuszMzF9//fXDDz9csmTJ/v37jxw54nA4ioqKxo8ff+ONN9psNkLISy+91L9/f3VeqKYOKvbKK69kZmYuXbr02LFjer2+qKio5taLL764uLj4/fffX7Fixa5duyorK51OZ2FhYc+ePe+4444ePXrE70DjiaKoehurt9LB6vX6//mf/7nlllveeuutTZs2lZeXOxyOvn373n777ZdccgkhxO12q7VyOBxNPZYWfgEaP+RGTJ8+/corr3z77bdXr169f//+qqoqq9XaqVOniy+++Oabb1Z7/jdbQxcoFqNHj1ZfGptMprpT9/Xr189isQQCAdKsCeSafbpaSUuuvtVqXbNmzdatWxcuXLhv376jR49WVFRkZWUVFBR07dr15ptvrtt+gbTgDDTjVtwMJpPptddeU/+s2k5WAAAA0DZRStsY2QgAUst55523efPm0047rfHJ1QEAAAAAIF7wBh4A/o99+/atWLGCENK1a9fx48fXm6a4uFidnS726RUAAAAAAKCFEMADwP9hMBjUrtHp6emjR4+ud0j22bNnq5MsXHHFFYmuHwAAAADAqQqj0APA/9GxY8ezzz6bEOLxeK699tpQKFRzaygUuvPOOz/++GNCiNPpvPLKK5NTSwAAAACAUw/6wANAbdu3bz///PP9fj8hxGazXXbZZZ07d5Yk6c8//9y8efPx48fVZO+//36TZvgDAAAAAICWQAAPAPVYt27d1KlTGxqgTq/XL1iwYPr06YmtFAAAAADAKQ0BPADUTxTFjz766IsvvigpKTl06BDP83a7vXv37sOGDZs2bVpubm6yKwgAAAAAcGpBAA8AAAAAAACQAjCIHQAAAAAAAEAKQAAPAAAAAAAAkAIQwAMAAAAAAACkAATwAAAAAAAAACkAATwAAAAAAABACkAADwAAAAAAAJACEMADAAAAAAAApAAE8AAAAAAAAAApAAE8AAAAAAAAQApAAA8AAAAAAACQAhDAAwAAAAAAAKQABPAAAAAAAAAAKQABPAAAAAAAAEAKQAAPAAAAAAAAkALYZFcgNdx0002hUCjZtQAAaEPuuuuu8847L5aU0Wh0ypQprV0fAIDUMmfOnB49eiS7FgCQYhDAx6SkpMRut+fl5SW7IgAAySeK4i+//OL1emNMryjKgQMHunTpkpmZ2aoVAwBICeFweOfOnXg5BADNgAA+VgMHDrzyyiuTXQsAgOQLBoO33nprU/caMWLE8DWSdgcAACAASURBVOHDW6E6AAAp5tixY7NmzUp2LQAgJaEPPAAAAAAAAEAKQAAPAAAAAAAAkAIQwAMAAAAAAACkAATwAAAAAAAAACkAATwAAAAAAABACkAADwAAAAAAAJACEMADAAAAAAAApAAE8AAAAAAAAAApAAE8AAAAAAAAQApAAA8AAAAAAACQAhDAAwAAAAAAAKQABPAAAAAAAAAAKYBNdgUA4mzHjh1ffPHF0aNHS0tLLRZLXl5ejx49Jk6caLfbG9pl+/bta9eu3bFjR1VVlcFgyM/P7969+3XXXedwOGqlvPbaa8vKymqtNJlM+fn5PXr0uOGGG+ru0qQiysvLJ02aRAhZvXq1wWBozvEDALQM7qIAAABtFgJ4aD8kSXryySc3bNhACGEYxul0+v3+HTt27NixY/ny5ffcc8+IESNq7RKJRObNm/fdd9+pHxmGiUQi1dXVu3fvXrVq1Z133jlmzJi6BRkMBpb9629HUZRQKFRcXFxcXPzNN988++yzPXv2bHkRsXC73W+99dbPP//s8/kcDsfAgQPrffaNb7Ka9u7d+/e//713797z58/XVo4fP97r9Tay1xtvvFFYWKjlsGTJkoMHD7rd7s6dOxcVFU2ZMsVqtTbhLABA/OAu2hbuoqqSkpJFixYVFxdXVlZ26NBBvT126NCh5YUCAEBKQwAP7cc777yzYcMGm812++23X3TRRerTYWlp6Ycffrh69er58+d37dq1c+fOWnpJku6///6dO3fq9fqbbrqpb9++nTt3FgShpKRkyZIl33///fPPP5+bm9u7d+9aBT3yyCODBw/WPkYikd9+++3ll18+ceLEc8899/bbbzMM08IiTqq0tHTmzJmlpaWEEIfDUV5evnz58o0bN7766qs5OTmtlKwmv98/Z84cURSbWnOO49SFd99998MPP5Rl2Wg0pqen79mzZ/fu3T/88MNTTz1V8zIBQMLgLtpG7qKrV69+/vnnJUnS6XTp6elHjx4tKSlZu3btk08+OXDgwJYUCgAAqQ594KGdiEQiH3/8MSFkzpw5o0aN0t7t5Obmzpo1a+TIkTzPL168uOYu//nPf3bu3OlwOF566aWJEyeefvrpDMMYDIYePXo8/vjjY8aMkSSp7luRugwGw6BBg5544glCyKFDh/bt2xf3Iup6/PHHS0tLBw4cuHTp0qVLly5ZsqSoqMjtdr/88sutl0yjKMpTTz1VXl5ed9OSJUtW10c9PyNHjlSf/rdu3frBBx/o9fqHH3541apVixYtWr58+ejRo0+cODF37txmnBAAaCHcRdvIXfT48eMvvPCCLMt33XXXV199tWTJklWrVt1www2iKD711FOBQKDZhQIAQDuAAB7aiQMHDkiS5HQ6zz777Lpbx44dSwjZv3+/tiYajb733nuEkGnTpmktumuaNm0awzDHjh2r+SjZiNNPPz0rK4sQcvjw4VYqQrN3797i4uKMjIw5c+aoTSWzs7OfeeYZvV6/devWysrK1khW06JFi7Zu3dqlS5e6mwz1iUQiCxYs6NSp0z333KMm++CDDwgh06dPHzFiBEVRhBCLxTJr1qwzzzzz4MGD27Zta9IJAYCWw120jdxFf/75Z0EQBg0aNH78eLUlgk6nu+mmm7p16xYIBHbu3NnsQgEAoB1AAA/thNrvWhAESZLqbi0qKpo7d+6tt96qrVm3bp3L5crLy7vooovqzdBms91777233HJL7K3EZVkmhGgVaI0iVF999RUhZNiwYXq9vmZuAwYMkCTp66+/bo1kmt9+++299947++yzr7/++hgrPG/evGAwOGfOHHVMKUmSDhw4QAgZMmRIzWQURQ0bNowQ8u2338aYMwDEC+6ibeQu6vf7CSE6na7WenWNz+drXqEAANA+IICHduK0004jhPh8vgULFkQikVpb9Xr94MGDBw0apK0pKSkhhPTr10/raVnXmDFjrr/++h49esRSgT/++MPlchFCtDcqcS9Cc+TIEUJInz59aq0/55xztK1xT6aqqqp68sknbTbbo48+StMx3UBWr169ZcuWyZMna11nBUGIRqOEkLpnRn0SraioiCVnAIgj3EVJ27iLDhs2TKfTbdq06ccff1TXKIry1Vdf7dmzx2KxaH3gm1QoAAC0GxjEDtqJvLy8kSNHrl279ssvv1y/fv2gQYMGDBjQt2/fhgbjPXbsGCEkNze35UW73e5ff/319ddfJ4R069atW7ducS+ilqqqKkJIenp6rfXqGrfb3RrJCCGSJD3++OM+n+/555+PcZTjSCTy9ttvZ2RkTJgwQVtpMBjy8vKOHTu2bdu2Wi/WfvjhB0IIGn8CJB7uoqRt3EU7der07LPPzp079+GHH+7QoYPT6SwrK3O5XB07dpw9e7Y2mV/shQIAQHuCAB7aj/vvvz8rK2v58uWBQOCbb7755ptvCCGdO3c+55xzRowYUVRUVDPxiRMnCCHZ2dnNKOiRRx6pd73dbp81a5b2pqglRTROfW6z2Wy11qtr1K1xT0YIefPNN3ft2jV16tTYB3z+6KOP3G73gw8+WGtC5ksvvXThwoWvvvqq1Wrt378/ISQQCLzzzjtbtmxRl2PMHwDiCHfRNnIXtVgsGRkZLpfrxIkT6kkghOTk5JhMpqYeAgAAtDMI4KH9YBhm6tSpN9xww6+//vrLL7/88ssvJf+1dOnSc84557HHHtOeddSXGI3PWN6QmjMYE0IoisrLy+vZs+eUKVO0dyMtLKJ5FEUhhAiC0BrJNm7c+Mknn5x77rnXXXddjPWpqqr65JNPOnfuPHLkyFqbrr766p07d/7www+zZs0ym80Wi6WyslKW5aFDh27cuBGTGAMkBe6ibeEu+vvvv993332iKE6ZMmXUqFHqG/gVK1YsW7ZsxowZL730Un5+fsvrBgAAKQoBPLQ3Op1u4MCBai9Bt9t9+PBhiqI2bdq0dOnSWbNmLVy4UO1zmJ+fv3379qNHjzaS1fHjx4uLi81m84ABA2qurzWDcUNaUkTjnE7nsWPHfD5fXl5ezfXq0EcZGRlxT3bixIl58+ZlZ2c//PDD6qDxsVi+fDnP8+PGjau7C03Tc+fO/frrr9esWVNSUiJJ0uDBg8eOHRsOhzdu3KjVDQASD3fR5N5FX3zxxUgkcvvtt19zzTXqmoKCgjvvvJOm6aVLl77++uvqXJsx1g0AANoZBPDQTtx5551//vnn008/rY7fo3I4HOq73LPPPvvAgQPbt2/fvHmz+tTYsWNHQsju3bsbyXPRokWrV68eMWJEk54LNa1XhPrcVl1dXWu9uiYzMzPuyfbu3RsMBhmGueOOO7QEwWCQEPL777/feOONhJA5c+Zow9QRQkRR/PLLL3U63cUXX9zQgVx88cW1tn722Wc16wYACYO7KGkDd9HMzEx1Sry6d85Ro0YtXbr0t99+a1LdAACgncEo9NBOdOrUKRqN/vHHHw0lULsOap2rhw8frtfr9+7du2nTpnrTi6K4detW8t8RfZuh9YpQH2q12YA1u3btIoRob2Pim4wQ4vP5jtSg9rGMRCLqx1otNr/77juPxzNs2DCLxVL3EMrKykpKStSH15rUUZf79evX6AkAgPjDXZS0gbsoTdMURVEUxXFcrdzUaeRomlYbycdeKAAAtCcI4KGdUOcQWrJkSXl5ed2tLpdLfcrRug5mZWWp46K/+uqrhw8frrvLe++953a7TSbTueee27wqtV4RY8aMIYR8//33Nadr5nl+8+bNNE2PHj067skuuOCC9XXMmTOHENK3b1/1Y2FhYc1Krlq1St2x3kP4/PPPb7755vfff7/mykOHDm3fvj0jIyOWtrUAEF+4i7aFu6jJZMrPz1cUZfPmzbXqrK4pLCxUW+DHWDcAAGhnEMBDOzF69OizzjorEAhMnz79888/LysrU59pfD7fN998849//CMQCAwcOLBnz57aLtddd11ubm5ZWdn06dM/+eQTtSe2JEmHDx+eN2/eRx99RAi56667WjKgWisV0bNnz8LCwtLS0hdffFGWZUKIKIpPPPFEMBg877zztBGb45usSYLB4K5du2iaPvPMM+tNMGLECJqmP//88w0bNhBCFEXZu3fvzJkzFUUZP358I3M+A0ArwV20jdxFr776akLIiy++uGHDBvVluyRJK1eufOeddwghV111VWsUCgAAqYJS/zdA44YPHz569Ogrr7wy2RWBxlRWVj722GN79+5VPzIMQ9O01q777LPPnjt3rtlsrrlLVVXV7Nmzf//9d/Ujy7KKoqjPrBzHTZ48We2XqLn22mvLysrmzp0b+yviJhVRXl4+adIkQojVaq13lKNJkyapCY4fPz5r1qzS0lKLxVJQULB///5IJFJYWPj000/XfJCNb7JaNmzYMGfOnL59+86fP7/Wpu+//3727NndunV78803G9r9f/7nf9TnUbvdLsuyz+cjhAwZMmTOnDkI4Nu4YDB46623Pvnkk+o7wJPieX7w4MG33Xbb8OHDW7lq0CK4i7aRu+j8+fPVRkx6vd7pdFZUVIiiSNP05MmTb7755hYWCm3BsWPHZs2a9cYbb/Tt2zfZdQGA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e3sPP/zwSqUCAB/60IcOO+ywUqn08MMPf+9736vVahdeeCERfeYzn/m7GnD11VdfffXVW8xCf+yxx1533XX33ntvGIa+72/8rnRYHhFPOOGEjcsrlcoxxxyzYcOGq6++evHixeVyeeXKld/85jevuOKKBx988KMf/ejdd989fvD26M7mjjvuuA0bNhx66KHpyPajjz562223bdiw4Z577jnqqKP+9Kc/bXL8ZZdd9rvf/a6zs/Okk06aN2/eu9/97rT8zjvv/NCHPgQAnuedcsopBxxwACI+/PDD119/fRRF55133syZM9///vePn+eqq65Ko/c5c+acfvrpc+bMAYDnn3/+uuuue+mll+69997LL7/805/+9Pjxn/jEJ370ox8BQEtLywknnLDffvutX7/+3nvv/cMf/nD88cePf79jTSwbwFvWDo2BHS/MttcGRoSUSS2sepNodDTbVhBSupLVutVULlOhGL34kvrzEzRSdcIxNKYuiuwHplqBMEIAIIAoNj1rZe8qJCVykye6Y5ZlWduTH4jJ3bD8pUyG/HDAsC9MInWkQTKSkZJMFA6G/D/3t77vPSpbBIBkxUpYsxwbNQBgAWBejtsVMRgkMgyEbGCsjrmcnDKVWtqcqdOB7Jeh1gRrNBpf/OIXAWD33Xe/7777pkyZkpZ/4hOf+MxnPvPNb37zgQceuOeee4455pi0/Ctf+UqlUhFC/OQnP/nABz6QFi5evPiss8468sgjly1b9qUvfen444/fZND+NfvgBz943XXXVavV+++//6ijjtr4pVtvvRUADjrooBkzZmxcvmbNGgC4++67jz766LRkxowZl19+eWtr65e//OWf//znjzzyyFvf+tZmdmfNmjUXXHDBpZdemk75OfHEEy+44IJjjjlmyZIlDz300N133z1+eVO/+tWv3v3ud//4xz9ubW0dL1RKffaznwWA9vb2n//85/vvv39aftJJJ5188slHHXXUwMDA5z73uWOOOWZ8UP2mm24CgLlz5z722GOFQmH8VGedddbChQtXr179wAMPjAfwTz75ZHr87rvv/vOf/3zmzJlp+QUXXPC5z33u0ksvfT1XwNqG7MeGZe3IpCuyXW2RkZTJke/nu9vA8NhoMrqyL1rfV1u53lRGIEkgSUytxgbAz6HjACLpCEgwA0QNCEPQGrNZBk5WLoM4NmFj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pIXpAoFVq1aNjY1tfLAx5tRTT12/fj0A1Gq18fIvfvGL6VSjj33sY5tM1P/qV7+68RYA1sTawafQp7+almW9MszlnTl5AHABMrvMbfzql8lzT0GtykkifE/O2dXd7wBqsWmTLcuytgwRwXXRdb099+Vdd5d77j324CP80hNQHWYSWOpw8xl3wR6UL010Sy1rU+3t7Z/73Oc++9nPPvbYY/vss8+pp5661157hWH4y1/+8oc//CEA7Lfffqeffnp6MCJedtllBx98cF9f38KFC08//fS3vvWt7e3tK1euvPHGG9ONyj/96U/vvvvur6El6TrzkZGR//7v/543b15LS0s60T111FFHua4bx3Eac77C/HkACILgyiuv/L//+79jjz122rRpjz/++I9//OOenh4AOProow866KAmdGdcd3f36Ojod7/73SeffPK4446bNm3ao48+evPNN6dfl3zsYx+bP3/+qzmP4ziXXHLJhz/84d7e3oMPPvi000474IADmPmhhx763ve+ly5Q/9rXvub8ZbLk4Ycffv3111er1SOOOOLCCy+cPXv28PDwk08+efnll7/wwgtpYv8VK1Z84QtfOOaYY/bbb7/58+efdNJJN9xww9NPP73vvvueeOKJ++23X39//7333vurX/3K9/1Zs2ZtbamF1Uw7eACfDrP/13/9V3d39yYvvcpkm5a1sxHFUu4fPmxGDte9vVyvARF1dMqOTmjiUjfLsqw3K0TMZNxZs1umz9BD7wqfeRoqwzIbUGe3M2MW2mcP6w3pggsucBznX//1X9etW7fJaPCCBQtuueUWZ6MFdAcddNAvfvGLj3/84z09PVdcccXGByPiGWec8a1vfeu1NWOfffZJ/5AOtn/729/+1Kc+Nf5qsVg8/PDD7733XgDYZZddtrikfNwdd9xx/PHH/+lPf0oXmY9729veln4r0YTujJs6deoXvvCFxYsXP/TQQ+ki/HHHHXfcVVdd9epP9aEPfeiWW24588wzK5XKd77zne985zvjL5XL5WuuueYDH/jAeMnxxx//s5/97Cc/+clDDz103HHHjZcj4ic/+cmPf/zjBx10UBzHF1988Z///Oc777wTAK688soNGzb84he/GBgY+Pa3vz3+liAIfvSjH91+++02gH8j2PEDeCHEjBkzmplmw7Le9BCp3Ep2p2LLsqzXCoWQ7W25Q94JAMBslyBZb2SIeO655x5yyCHf/OY3//jHP/b19XV1dc2bN+/oo48+44wzNn+KPuKII55++ulLL730vvvuW7VqFTPPmTNn4cKF55133oIFC15zM4466qhLL730u9/97vr169va2traNs2b+8EPfjAN4F95+B0AFi1a9Mwzz1x66aX/8z//s27dumw2u2DBgo9+9KOnnHJKOku8Cd0BgD322OPTn/709OnTjzzyyCVLlnzjG9/41a9+1dvbWywW08kOaXb9v8tHPvKRAw888NJLL/3Nb36T7mDf3d39rne967Of/eyUKVM2OfjWW299//vff80117z44ouDg4OTJ08+9NBDzzzzzPS7kvvvv/+yyy4bHR19z3vekx6fyWTuvffe22677YYbbliyZMnIyEh7e/vhhx9+wQUXzJ8/v1ardXZ2Hnjgga/nmliv344cwFcqlXq9PmXKFBu9W5ZlWZY1YWz0br0Z7L333jfffPOrPLilpeXrX//617/+9Vc+TAgxvtX5KxemLrzwwgsvvHBrZxsdHU3/cMIJJ/zNFk6ePHmTMepX8Cq78/c6+OCD08xwADB37txrr732b75lk/XqWzR9+vSrr7761TQAET/ykY985CMf2eKrixYt2mKu/sWLFy9evHjz8pNOOumkk056NfVa29WOHMCn8+enTJny2GOPPfDAA729va2trTNmzHjve99bKtlFaJZlWZZlWZb1pnHjjTcCwP7775/uiG5ZO6cdOYBPM1U8/vjjaQqK1EMPPXT33XefffbZ49+Hbez555+/+OKLNy83xoRhuMl+ia/HeBbKbXjOV69er4dh2Mwa05yfADA2NobNHYgwxkRRlCRJkytN/1Cv1xuNRjOrTn+1mvx7Nf49ehiGzb/UxpiJ6m+SJBNS9fgQRJPrHb/U6fjA1hIFb+3t9Xp9G16uTZrUNGm9tVqtXq83s97xT41KpdLkuygzNxqNND1S04z3t1qtNrm/Wmut9UTdVZp/qY0xzDxR/Y3juMlVT0h/xymlNr6Lbr6vmPUKHn744SeeeAIATjzxxIlui2VNpB0/gDfGnHTSSQcccEBra+vatWt/8pOf/O///u+3v/3tmTNnbp7Zrl6vP/fcc5ufKpfLGWNe/dPq1rDWSLTxVLrXf87XII15ml8vTNBnFTPvVP2FCfq9AgBmnpCqbX+bY7y/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lYMHD9ZoNKaube3ateHh4Tt37szLy/P09Lx06dLs2bN79uypUqmIaMiQIVKpNDk5uazs/4102Lt3r1arHTx4sIuLS9++fSdMmEBEMpls0qRJb775Jl/n5MmTISEha9asuXjxore3d2Zm5ubNmzt37vzkTQEAhAQeAAAAAABqpFFSzmUzl1WWUsENi0ZjKDw8vGnTpj/88EN5ebl+eWJiokKhiIqKYhjGYJG0tLQPPvhApVItWrRILpenpaUVFRWNHTu2oKBg/PjxfDqts2LFinbt2p06dWr27Nn//ve/z58/36xZsz///PPUqVMmre3q1avTpk0TiURbt24tLi6+d+/erVu3OnTocOHChaVLlxKRu7t7nz59lEplUlKSfgD8uYnXX3+diKZMmbJ+/XoicnR0jI+PX7NmDRFVVFSMHj06Ly/vk08+kcvld+/elcvls2fPVqlU0dHRaWlpltvYUC8ggQcAAAAAgBqU5ZNW9fhqNSnOsFwo1RCJRCNHjqyoqPjxxx/1y/mLz/z1eQMxMTFqtXrSpEnz5s3j75x3dXXdvn17aGhoenp6fHy8fmWFQrFq1Sp+4DoRubi48BPm3bx506S1zZ07l2XZmJiYN954QywWE1FAQACfjR86dIivExERQUQHDhzQtZ6VlXXq1Ck3N7cBAwbUtAVWrVqVm5s7ZsyY5cuXOzg4EJG9vf2SJUsmTJigVCpXrFhh9LaEhuFJSOCPHj06ZMiQau8zIaLi4uKvvvpq/PjxEREREydO/Oabb4qLiwWOEAAAAACgQaosqtvihreLWxyfpSckJOhKSkpKjh071r59+44dO1atf+LECSL68MMPDcqnTp1KRAbj3rt16+bt7a1f4uXlRURardb4tbEse/ToUbFYPHnyZP06PXr0WLp06ciRIzmOI6Jhw4aJRKLDhw/rrtvv3r2b47jIyEg7O7uaus/f/883p++dd97RhQdPkrrOQm9zWq222lkreHl5efPnz+dzezc3twcPHhw5cuT06dMrVqxo0qSJgGECAAAAADRAImndFrd6utGjRw8/P78jR47I5XIXFxciSkxMVKlU1V5+VyqV2dnZEomkXbt2Bi8FBQURkcGY81atWtXStJFry8zMVKlUvr6+Hh4e+nUYhvn00091fzZp0qRnz54nT5789ddf+/fvT/8dPz927NhaYkhNTSWi+Pj4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z6Dx9R0cHCy4px4+fMg/nscme79Ro0YymaDPvCgpKVGr1URkk71vb2/v4OAgZKNlZWX8L+ZGjRpJpVIhmy4uLhaLxfzjowSjUCj4S7IODg7Cb2qNRiPw50itVvMXomUymcC3AVdWVlZUVNjk1xcRicVivmm+18YfReuD1595K6sso6Ayz6jaHEnF0rc7fCAVCff5DQ4Obt++/fnz5+lx09f1798/ODj4ypUrXbp0CQsLUygUV69ebdeu3b/+9a8lS5boqsXFxQ0dOvTrr7/eunVry5YtKysr7927x7Jst27dpk2bxtcJDw+fN2/eZ599NmrUKFdXVx8fn3v37imVyuDg4GXLllXbuoeHx6ZNm958881FixYtW7bM39+/sLDwwYMHIpFo69attZx3AOBZ+EdA586dly5d+vfff1+9enXBggUdO3Ykojt37nz++eddunThL9EDAAAAAEAD0kjq9H7Hj70cmhhT2U5i/86zU1u5+Fs7KgP8RXh6XAJvb2+fnJz83nvvtWjR4tKlS0VFRVOnTj19+nS3bt1Gjx7drFkzvtqQIUNOnTo1dOhQLy+v27dvV1RUdOvWbd26db/++qv+lbBFixb99NNPI0aMcHd3z8nJCQ4OXrp06dmzZx0dHWsKYOjQoZcvX54wYUKHDh3S09NdXV3HjBlz5cqVsWPHWmIzwBPOWtdCg4KCgoKCYmJibt++vWbNmjVr1rAsa3CrCQAAAAAANAjejk0/fW7h5lvrrzy8VEu15o38JgS+29zJz6rBhIeHV52FLiYmJiYmxqCwa9euVWs2adJk7dq1BoWDBw8ePHiwfkmPHj0OHjz42GD69evXr1+/ml6dPHny5MmTDQpbtWq1YcOGx64ZoCorDmbOycnZt2/f3r17//jjD93sLAAAAAAA0BA1kjq913HG38U3fs46drPompr935yLDDFtXANe8Anv5t1TxOAx5gDWYvkEPisra//+/Xv27Dl16pTudJezs/PgwYMjIyMt3hwAAAAAAAimnVuHdm4dVFpVdnmmXFWsZtVudh7eDk2dZYLOCwPwdLJYAp+Zmblv3749e/acPn1al7e7uLgMGTIkMjKyf//+As+aBgAAAAAAViITy1oLfpc7ANQ1gU9PT+fz9jNnzujydjc3tyFDhowcOfLll18WeApuAAAAAAAAgCeSmQn8/fv39+7du2fP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7UdKCMk8uooeXVfRlStXLlq0qL6+3u/3X3fddZdeemkrKQMISQNE9dTT1FNP45FGe/cu3hgWlslCOVJRV6nLIXb/JoSkFwXw5Bhx4403btmy5e6773aSBjlycnKcRYaDBw/esWPH+vXrV69e7dw1OttUfv3116185rPPPvvmm2+ef/75h3Vf2KTjmnBuFsPhcItypyQ/Pz/t1TZv3hyPxyVJuv7665sqOFlJN2zYcNVVVwHAvHnz8vPzncyuP/zhD1t82pgxY1566aV169a1/TAJIZlEV1E42q6ihmEsWLDgww8/VFV1ypQpkydPptx1JJNYMIsNOsSuk4SQDtVpSez69evnpE8kJC2c5JkHbybZxFk62LQ9xujRo10u1+bNm1etWnXI+pZlrVmzBr5NI9wOHdeEc1PbfE91h7PBZtMQUHqrAUAkEilvxlnYqWma861pmowxRETEg7eFczZAYowdcmYXIaTT0VUUjqqrqG3bc+bM+fDDDwcOHPi3v/1t+vTpFL0TchT5zW9+g23zy1/+srM7S44s6RmBF0Ls3Llzx44drd+a+/3+pilzLRafEJKi/v37L1269Pnnnz///PMPznhUW1vr3Fo1LR0sKCi45JJLnnnmmUceeaRbt27O/knNPfXUU/X19V6v9/TTT29flzquibFjx77++usrV66cPn1601RJXddXr17NGLvgggvSXu2cc84555xzWnRjxYoV8+bNO/XUU++7776mwpKSkr17965evfr8889vXnn16tUA0Ldv39bnjhJCOgtdRY+uq+jy5cvXrFkzcODAP/7xjwdH+4SQI9yNN97YxrHMpsk+hDjSEMCvWrXqiiuu2LNnz/fWLC0t3blzZ+otEnKwCy644J133vnyyy9nzJgxderUESNG5OfnS5IUiUT+85///P3vf4/FYsOHDx8wYEDTWy6//PL33nvvwIEDM2bM+NnPfjZs2LDu3bsDwL59+55//vm3334bAG666abv2umnLTqoiQEDBvTt23fr1q2LFi26+eabGWOWZd11113xePzMM89suvNOb7U2mjhx4p/+9KdFixYpinL22Wcjom3bb7zxxl//+lcAmDBhwmF9GiEkY+gqenRdRV955RUAcHJEHZxODxGbpwkkhBxpioqKioooZQBpD0xxOuuuXbvKysoMw2hL5UAgEIlEUmmus4wePfqCCy746U9/2tkdIa2pqamZM2fO5s2bnW8lSWKMNd3WDB48eMGCBT6fr/lb6urq5s6du2HDBudbWZaFELZtA4CiKFOmTHHWJTa57LLLKisrFyxY0Jb0S+1ooqqqynkcGwwGDzlSPXnyZKfC/v37b7/99gMHDvj9/p49e27fvl3TtL59+959993Nb2TTW62FQ44dAcB99923dOlSAHC5XLm5udXV1ZZlMcamTJlyzTXXHPKjLr744sbGxmeffbYjNnwmaRePx6+99tr58+ePHTu2LfV1XR85cuR11103evToDu4aSQldRY+Wq6ht22PGjHFOwiEVFxc/88wzrZ9Y0on27dt3++23L168+NRTT+3svhBCjjKpPp296667DMMIBAKzZs06++yzU3nKTkiK8vPzH3vssVWrVr399tsHDhyoqKhQVbVLly7FxcXjxo0bMmTIwW/Jzc196KGHPvzww/fff3/Tpk0NDQ1+v7+4uLi0tHTy5MlpeTLavia+61GXruvOF8XFxQ899NATTzzx6aefbt68OTc3d+zYsddee63H42leP73V2ujWW2/9wQ9+8K9//Wv37t21tbUlJSU9e/a87LLL+vbt245PI4RkDF1Fj5araFVVVSvROyGEkGNYqiPwAwYM2LRp07vvvnvuueemq09HIBqBJ4SQJjQCTwghqaAReEJIu6Wahd6ZQn9sR++EEEIIIYQQQkinSzWAz87OzsvLS0tXCCGEEEIIIYQQ8l1SDeBPO+20devW0UIsQgghhBBCCCGkQ6UawN9yyy3JZPKee+5JS28IIYQQQgghhBBySKlmoT/77LPvvffe2267zTCMW265JRgMpqVbhBBCCCGEEEIIaS7VAH7p0qX9+vWbPn36nXfeuWjRopEjR/bq1Ss/P/+Qm68CwKxZs1JskRBCCCGEEEIIOQ6lGsCPGzeu6etwOLx06dLW61MATwghhBBCCCGEtEOqAbzf709LPwghhBBCCCGEENKKVAP4aDSaln4QQgghhBBCCCGkFalmoSeEEEIIIYQQQkgGUABPCCGEEEIIIYQcBVKdQu8QQuzcuXPHjh1CiFaq+f3+kSNHpqVFQgghhBBCCCHkuJKGAH7VqlVXXHHFnj17vrdmaWnpzp07U2+xU3zyySd79+7t7F4QQkjnsyyrHe9avnz5F198kfbOEELIUSeZTHZ2FwghR6tUA/hdu3add955hmG0pXJtbW2KzXWWsrKyZDIZi8U6uyOEEHJEOPHEE1VVbWNlIcSJJ54IAHQVJYQQx4knnsgYLWUlhBy2VAP4u+66yzCMQCAwa9ass88+OycnJy3dOtJs3bo1Eol0di8IIeQI0sZHtwCAiBs2bOjQzhBCyFGHc97ZXSCEHH1SDeDXrFkDAK+++uq5556bjv4cuSZMmHDxxRen69MikYhz1Q6FQun6zLYQQjQ2Nnq93rYPnaVFIpFw7vUDgYAkSZlsOhKJKIri8Xgy2aimaZqmAUDmT3U8HhdC+P3+TDZqmmY8HgcAl8uV+VNtGEYwGMxko5xz54meoig+ny+TTRuGkUgkgsFghsdtGhsbhRCMMedUx+PxGTNmHO6HTJ8+fdSoUR3UpYxxfvo+n09RlEy2G4vFnJULnfLTd7vdLpcrk402/dXw+/2ynJ58PW0UjUYlSfJ6vZls1PmvDQAejyfzp9q27UAgkMlGLcty5uOoqprhU63ruqZpWVlZmWzUufsCAFmWnT/Q+/bt+81vfpPJPhBCjhlpmEJfVlZ2zEfvAJCXl9e/f/90fVpDQ4Nt287Hpusz20IIUVdX5/f73W53JtuNRqO6rgNAKBTK8K1YQ0ODqqoZjrISiYRzKxYIBDJ8KxaJRIQQGb41MQzDCWg9Hk/mT7WmaRme+2PbdkNDAwCoqprh6FHX9Wg0mpOTk+EQrq6uTgghSVJ2djYAtG9GUlFRURqvok6XGGOd8tMPBoMZfjbX2NhomiYAdMpP3+v1ZvjZXCwWcx6DZmVlZfhZSTgcliQpwwGtpmlOQOvz+TJ/qi3LyvBwgmmaTkDrdrsz/MQ5mUwmEonc3NxMNurcfQGAoijOH+gMX0AIIceSVEOp7OzsDIeghBBCCCGEkM4luIiFdT1u2jb3+FVvliorGZ1lScjxKdUA/rTTTlu+fLlt2xmeF00IIYQQQgjJvIbK+I7Pqyp3hg3t/zYlkWSW3z3Y86T8rn2yO7FvhBzzUp2Gd8sttySTyXvuuSctvSGEEEIIIYQcmUzD/nTpjvef2VC+sbZ59A4AtsUrd4Y/WbLtg2c3xhq0zuohIce8VAP4s88++9577509e/a8efMoTzshhBBCCCHHpEREX/Hcxr2b6lqvVl8Re//ZjTXlHRgXzJ49G9ugqKio4/qQSStWrHCOKDc318mHckgvvPCCUy2NGWea/OAHP0DEtWvXtl5t8eLFiEg5GjtUqlPoly5d2q9fv+nTp995552LFi0aOXJkr1698vPzEfGQ9WfNmpVii4QQQgghhJBMsgz745e3RWqTbalsatbqV7aNntI/mNchuwy43e4WmRedDZ5abBGS4USzGVBfX79s2bIf/ehHh3z1xRdfzHB/Msm2bVmWQ6GQk0j4eJZqAD9u3Limr8Ph8NKlS1uvTwE8IYQQQgghR5f1y/dEahNtr2+Z9idLtp9/9UlMOvSoXipmzZrVIqYoLS3dvXv3Cy+8cOGFF6a9uSMEY4xz/sILLxwygI/FYm+++aZTJ/N9I5mUagCf4c0/CCGEEEIIIZkUrorv3VR7uO+KNWi7vqjudUphR3Tp6BWJRFatWlVaWnq4E9379+9fVVX16quvapp28IbQ//73v5PJ5OjRoz/44IO09ZUckVJdAx89TGnpNCGEEEIIISQzdnxeJUR73rh9bWW6+3IYfve73yHiwcm2p06diohNE4edpeOLFi0qLy+//PLL8/LycnNzx40b51TYvXv3tGnTBg4c6Pf7hwwZ8swzzxzc0Pr166dMmTJw4MBAIHDaaaf9/Oc/r6z8rwN/9tlnEfGRRx5Zs2ZN7969L7zwwqeffvpwD0dRlAkTJkQikbfeeuvgV53585deemnzwr///e+I+OMf/7hF5aqqKlmWPR5PUwqz7z2EJu+8887o0aOzsrK6du364x//+KWXXmq925zzF1988ZxzzunWrZvb7e7Ro8fYsWNff/31FtVqa2tnzpw5ePDgQCBQVFQ0atSol19+uenVSy65RJZlAAiHw4gYCARab/TYlmoATwghhBBCCDlWCSEqdoYBoB0hfLxRP6yJ951o+/btw4YNA4C5c+deeOGFS5cuHT9+/COPPDJ06NDKysprr732yiuv/Oqrr6ZOnfraa681f+MTTzwxfPjw5557buvWrfn5+WvXrn3sscdOPvnkg0fCq6qqxo0bV1NT43K5cnNz29HJSZMmAcDzzz/fojwajb711lu9e/ceMmRI8/Lx48crirJs2bJYLNa8/F//+pdt2+PGjXPSBLT9EP73f//3ggsuWLFihc/nq6qqev311ydOnHjzzTe30ueZM2dOmjTpgw8+0HW9tLQ0HA6/9dZbP/7xjx977LGmOhUVFYMGDVq4cOHmzZuLiops2165cuWECROaHr6cd95511xzDQCoqjp9+vSrrrrqcE7bsYYCeEIIIYQQQsihxRt1I2kBwGGvZRcAAPUV8bR3qSM8/PDDs2fPfu6552644Yann356xowZnPPrr7/+6quvXrp06U033fToo4/OmzcPAJ566qmmd+3cufP66683DOOuu+6KRCI7d+6sr6+//PLLq6urr776asMwmjdx//33Z2Vlvf/++/F4/NZbb21HJ0eNGtWlS5d///vf8fh/ndUlS5ZomjZp0qQWecSzs7PPOeccXdfffPPN5uXOI4ApU6Yc7iEsWrTovPPOq6ysPHDgQENDw29/+1uncNmyZYfs8LZt2+677z6327106dLq6upNmzbV1dXdf//9APCHP/yhqdodd9xRUVFx8cUXV1RUbN26tbq6+q9//SsAzJ49O5lMAsCMGTOeeOIJAPB6vU8++eTDDz/cjrN3zEhPAG+a5pYtW9555523W/XRRx+lpTlCCCHkOGSbhhaPGcmjYziLEHJs0GLfuW/Z90AAAC3e3rdnVq9evX7xi180feskigsGg/Pnz28qdDLk7dy5s6lk7ty5pmlOnz599uzZzrr0rKysZ599dsiQIXv27HnyySebN5FMJpcsWTJ69GhJktrXScbYJZdckkgkWkxBd+bPO+PzLUyYMAEAXnnllaaSffv2ffTRR6FQaOzYsYd7CM7jg8LCwqaT8/Of/xwA5syZc8gOf/zxxwBw2WWXNSXek2X5lltuyc3NLS8vb5oX8MknnwDArFmzsrOznZKf/exnF1100amnnrp3797DPUvHvDQE8H/+858LCwvLysrGjBlzQaumTp2aenOEEELIcSjZ2NBYU73n6y/qKyvCVRXctju7R4SQ4wLn7Vr+3vR2++hIin7qqac2H77OyckBgIEDB3o8nhaFdrPL74oVKwDg4DnkN9xwAwC0mII+fPjwE088McV+OlH6Cy+80FTS2Nj49ttvl5WVnXTSSQfXv/jiixljS5cubRpLf/HFF4UQEydOdLlch3sI/+///b8W+fN+/etfA8Cnn356yA3qr7rqKiGEM5zeJJlMWpYFzc6ks6b95ZdfFs1yLbz66qurV6/u27fvd56L41WqAfxbb7117bXXtnE7vtraw05fSY4ZRiIRq61uqNgfqamyDL2zu0MIIUcTU0tW7N6168v1ddXVOzd8tXPD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HpscBBCBKlAQMWldAFILtaQEdapdSKyaAhmRA+eqqUqH4JjroCqZISBUUVJAfXADVAdVFT4HkfE8ZoDADKm4Tn2rMzZ0Fb9Vdyq5zW0iUpS0IxbR2U3dX3z74f09YSUlJSULjIjazMW9zPO5Wjc26aV9uEz8KPIrFbUIKo3ZrW3Pz8cOG/fCapbm9WboV019MBoYqS45cmDp6kZjNPRCU6kHQdULK15rW78zHbenk6SX9+bSqc2d9mSspapISclBiqpu/v1eulLtya2dyW0L25+niQceeODUU08FcOWVV77yla+8/fbbzzrrrOuvv/6UU06ZmJh485vffMEFF/z2t789//zzv/71r+944qc//enTTjvt1ltvvf/++8fGxu66665PfepTz372sx8fCd+6deuZZ545OTkZhmER7NxTzjnnHABf+MIXdmrvdDrf+c53jj766JNPPnnH9rPOOsv3/TvuuKPb/V9apP/+7//unDvzzDMLmYDdHML1119/+umnf/7zn5+YmBgZGfnVr371/ve//4UvfGERrN0dWy996UsvuugiAEEQXHzxxW984xuLY+68886TTjrpuuuu++Uvf7lkyZJNmzZ95jOfec5znnNA7OpffBYmZ3h8fPzCCy/8+Mc/fsUVV5x44onz7c1mc8uWLbfffvvZZ5+9IIZKDiyiij84XgPUpk7UkGcMwxgOomo0OOiHQ9Cuui4gMFWGJ3AgVRJASXOohYuBGFQhBKQWmhOHqkLkgwyRT8SqVskBuSF4zL4fMMiPGIYNsypLTKZbo1aFA/UiI5lS6qtqkfKpUFKAeWL9bNKx+3vOSkpKShYS47GzmmfWGKPO1AabzqU2tVkSQzVsjnbnuNIcqw4tC2vNIApHVjTIx/gRg8uPHlxx7NDKZw2PHF6t1HwoVFVVs8SyobibA0qENM7jdt6a6rcm+7bcHl9ScjDSm51JOu29Pn1q40ML2Jmnj+uuu+6KK6649dZbL7vsss9+9rOXXHKJiLz97W+/8MILb7/99ne+852f/OQnP/CBDwC4+eab589av37929/+9izLrrrqqna7vX79+pmZmfPOO2/btm0XXnhh4dnO89GPfrTZbH7/+9/v9Xrvec979qKTp59++tKlS7/xjW/0er0d22+77bYkSc4555ydNjQNDQ295CUvSdO0ECmbp1gCeMMb3rD7Q/jt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e27jvdMP/nLbpntn5rb1xJWKyiUlJQcMxuNKw28MRWHVrzaDwfFqtfmk0kEAokYwtLTWGKqksQ0rvor6Fd9Zp6p+5NWHQoDjTtrvZCLChvyq1xipLH/WYHO0Glb92nA0vKwyNFapNqMwMkQYGKtVB6L2ZNya6nemYmdLQbuSkgOew048eWjFqj09ywvCE/7s5U9Hf3a3A56Hx9K/57nzzjsXyoEH8Kd/+qcAPv7xj+/U/olPfALAi170ooUytBPnnHNOnudf+cpXCif5KSt2F/rwV1999a9//etjjz12x3LxuzOEMAyf97zn5Xm+k67+xo0b//7v//6WW26Z9wR3besJefGLXwzg2muv3an96quvXrlyZalC/3j21YEvdAV2lD047rjj8JgawXYbzJdddpmqFpUGSg5xjEcimvWtzVzczozxnDKQqrYgsUpbpafSBwSkoJAgBAdiJUD60FQBZgN1ClYYYo8NMyCkAJQEEFGBqPGrYbXhe12ilvF94/me8b2ITcAm8GAMlIraxlABsZAFkToXt9NtG1ub753Z9nC7O5s8fu22pKSk5BlLWPWbY9XaYFgfippjVTa7StpkpuZopToQLDlycHTVgB+a7mzSa2UDI5Wo6nu+8UPjnPq+qQ2GIysa4lQFA6O1VccMr1gztOyIwcZIbdUJY0edNL5szdD4YYMrjxkiDyJ49MG5LQ/NtafiPC3T6UtKDnCInvu687xgV6uBj+c5f3X2Pgrg7SPHHnssgFtuueXuu+8uWu699943velNu1BE31M+8IEP+L5/4403XnPNNXmeA+h2u2984xt/8YtfHHbYYZdccslCGdqJIov+hhtu+N73vnfSSSc9XoJuJwqnuig+V5Rk39MhXH311QAuv/zyL3/5y8WD8datWy+44AJVXbdu3Y67A3Zha55utztfyv69733v4ODgLbfccuWVVxby9ar6hS984eqrrw6C4KKLLtrj2TnY2VcHvljZ2pEjjjiCiO67774dG5/97GcD+N73vreP5koOAqJGMDBSSeK838mimtdv9wgJqTP+CPtLyBsU7YIcAcRNNQNqanBONVEXM3KGYSaIJShBmZgN+6FHRlmYlEgBYgLEIYsRNgdroytro8sHx+uNkXpjuMogZlI4qAOJUYYSsQdVViIwiPIENnNJz/baedLNbVZGkEpKSg4k2FAQeX64W5mrxBRW/fpgOLKsNrK83hyrDC2phVXPWfFDUx8OgsiAUW2GhpmZiNUPuDleWbK6WR+KRlfWiBA1QvbIBGRzsZnEnSys+GHVb0/H/Xa24APMEtua7M882p3c1Glt63Wm434r7c2m05u7sxP9fidTKRdeS0oWksGly5+/7o3G83fz+BNe+hdH/PGpT2uXnpKXv/zlJ554YrfbPfXUU5///OeffPLJa9euDYLgPe95z0KZOProoz/xiU94nvfe9753YGDgmGOOGRwc/OxnPzs2NnbzzTcXZdWfDk488cRjjz32F7/4RZ7nu5Cvm+eoo44q3DE8Lqd9N4dw+umnX3HFFf1+//Wvf/3Q0NBxxx13+OGH//CHPzzxxBP/4R/+YTdtATDGDA8PW2tPPvnkv/iLvwAwPDx88803DwwMXHXVVY1G4/jjj1+yZMm6devyPL/pppuecm3iEGRfHfiVK1fisUT6giiKVqxYMT09vXHjxvnGoaEhAJs3b95HcyUHAX5gmmOV8cObY6sG6qOV5khVrFNSlVDVAKGSDwrBTagaeECk7CkpQQRGxapCiFQTEJSVVNhjv+ITRGl7NB0KQJO+zToUtwKVelBpLl09WB0K2OM8U5cBakBGYIWgkMfkl0QVqpLnkvSz4gFxblt3f09bSUlJydOO8bgI2g+MVthwezquNvz6SFgdrlTqATOHNa82FNUHI2wXsTd+aPJEKg2fCMZQFruZjZ3Zzb08tUzUb+ftqX5npu+culziThZ3sn0PyOepm9va33jP1B/umrj3J5t/e+cjD/xyyy++s/6Hn//9T75y339968GHfzPVmXkiLVJF6diXlOw1y4894c/eclm1Objrw4zvP/d156192RmL06tdEEXRHXfc8ba3ve2www771a9+NTMzc9lll/30pz897bTTzj333OXLl+/Fe65YseL5z3/+ji2XXHLJz372s3Xr1h155JGPPvroSSeddMkll/zmN795yUteskDjeGKKIDx2qT+/I3/1V38F4PnPf/6RRx6500u7OYSrrrrqu9/97mte85qhoaFHH330xBNP/PCHP/zf//3f1erOlZt2YQvADTfcsHr16o0bNxaFxovj77777osuuuj444/fsGFDs9lct27db37zm6fcP39osq9l5I4//vh77rnn05/+9Fve8pb5SonHH3/8I4888u1vf/ut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ecr8/PxwOGzC9QNcfvnleZ6fdNJJZ5xxBoDrr7/+He94R5qml19++b59+6655pqVlZV3vvOdAN761rce2Oqiiy7as2fPr/7qr+7Zs+e6667bt2/fhz/8YQCve93riqJo1vnud7/7ile8gpk//vGPD4fDm2666dprr33kIx/5rW99681vfvOP8lkOc5AN73znO2dmZr70pS9Np9NXvepVP8px78rb3/72U0455atf/epFF130R3/0R9/85je3b9/+ta997atf/WqzwiWXXPKRj3wkjuMPfvCDo9FoeXn56quv3rx58wc/+MGD93PjjTe+/OUvr+v6jW9842g0uvHGG1dXV88555x9+/adf/75zXzHy172sg996EMAOp3OxRdf/N73vvfA5n/913/NzNddd913vvOd73znO1/4whestV/5yle++c1vNivkef7c5z53aWnpD/7gD0aj0Q9+8IPRaHTRRRfVdX3eeefdeOON9+9pAfDe9773da973aWXXnrhhRd+7GMfe9nLXiYiL3/5y88///zLL7/8d3/3d9///vf/yZ/8CYCPfOQj9/vRD6YN4FuONGk32baDvDbqvmD1DAUpVIWMgoXJG0ChTbU8E1RJoUo2Mp1ZM8jctt54e7/c3p/2Byae6cXdNFvsd2Y2mg3ZUJRau7jYOWnX7KnHbT7tuGNO3TrYlMVZNB6WxpV9WQ/pzLSM1JiEKq21zt1oWI3XytU94+mwCL4SseAUFJFGgFFs6CWBtPEWVg0IgSCJjPtuf6fen7kxqQdA0EBWlYPYCmkZuqVkHNRWpQjFxWrYvz/ee0s3DAnamct6m/u9uXTxmEF3NmHQhodcEAB6FyFo7vTMtu0yHuUS+fmt+ZaTp7PH+h3H+5N+hnr9Nv3e0tLygNIZxHNbup2ZJO1Gg4VO1o/vqepeggKwMWeDeH5HrztIunOpdyGf1Gwo6UUAA+Tqqi79ZFQVuXe5UyHxwXttLI5MgsqB1KXsYi6NDV588NrM/hKDmnamppK9qRAAEZRIASsgBUV+atVx064OLZLZCGUcim69PwujQb2chUll++Nkcx7P11HX2a7jrjMdUDSOFqbp5qkZxKZwthNsR8iwSqOih0anRQGGAAbEABMUIFEqctx63RG9PC0tDwCS/0i5ZZ0+UC5ucRw/5znPwV2q6Bv9+QPydV/72tcAPO95z3vq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gAcAAAAAwAP8bgfgGe+9996f/vSnnppaS0uLZVkiEovFemqa3aG1TiQSoVDI73c09alUKpvNikgkEjEMR08btbS0+Hy+YDDoZKOZTCadTouIK4taax0Oh51s1DTNZDIpIoFAwPlFnclkotGok41altXS0iIifr8/FAo52XQ2m02lUtFoVCnlZLuJREJrbRhGJBIRkVQqdQgTeeONN+rq6no2JKWUK9kPh8M+n8/JdpPJpGmaIuJK9gOBQCAQcLLRdDqdyWRExPlF3dLSYhiGK6u2iASDQecXtWma9qrtmELba9hHXyLi8/nsHXRNTY2TAQDIJxTw3VJUVLR58+bNmzf31ATt6l1EHK5mRcQ+5HW4UXfnV0QcnmWtda5d55sWx+dX/pHiApnfXH6lgFfh4uLi7pcZSqni4uI1a9asWbOm90JyjCspyP3qCmQrWmh7jdz8iuOz7O5eQwpsflvvJYuLix0+OQUgP6jcYSicdO6553766aci8s477zh/dOK866+//uWXXxaRJUuWjBo1yu1wet39999/7733isgvfvGLuXPnuh1Or1uxYsWPfvQjEfnOd75z5ZVXuh1Or9u+ffv8+fNFZMaMGXfccYfb4Thh2rRp6XR60KBBzz77rNuxfOHEE09sbGwsLy9/6aWX3I7FCZdeeun69etF5JVXXikrK3M7nF53++23P/HEEyJy7733Tp482e1wet1jjz22ePFiEVm4cOF5553ndji9bt26dZdddpmIfPOb37z++uvdDqfX1dfXn3TSSSJyzDHHPPDAA26HA8Db8r90BAAAAAAgD1DAAwAAAADgARTwAAAAAAB4AAU8AAAAAAAeQAEPAAAAAIAHUMADAAAAAOABvEbOHe+//34ymRSRKVOmOP8yUud9/PHH+/fvF5Hx48dHo1G3w+l1u3bt2rFjh4gMHz68vLzc7XB6XW1t7datW0WksrJyyJAhbofT65LJ5Pvvvy8ipaWlhfBaRBF59913tdbBYPArX/mK27F8Ye3ataZp+v3+Y4891u1YnLBp06ampiYRmThxYiAQcDucXrdt27Y9e/aIyJgxY4qLi90Op9ft2bNn27ZtInLkkUceccQRbofT6xoaGj788EMR6d+//1FHHeV2OL0um82uW7dOROLx+Lhx49wOB4C3UcADAAAAAOABdKEHAAAAAMADKOABAAAAAPAA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AAAAeAAFPAAAAAAAHkABDwAAAACAB1DAAwAAAADgARTwAAAAAAB4AAU8AAAAAAAeQAEPAAAAAIAHUMADgOzateuiiy4aMmRILBb7xS9+4XY4eejGG29USiml3n777a7HnDhxolKqsrKy/UDbp59+esDmLrrootz4zzzzTGej7du3LxAI2KMde+yxXU9z6dKlqhPBYHDMmDFnnHHGHXfckU6nDxgeAADAoaGAB1DoMpnMKaec8tBDD+3YsSORSOzfv9/tiNCVJ554ousRMpnMc889151JPf7449ls1v57/fr1W7ZsObSQMpnMRx999Nxzz/3whz/88pe/fMCTFAAAAIfG73YAAOCy119/fcOGDSLyrW996/LLLx8+fLgDjd5444233HJLRUXF3r17HWgunzz++OPXXXddFyO89tprdXV13ZnUI4880vqfS5cuvfHGGw/4rQsvvHD69Omth9TW1n744YdPPPFEc3Pzli1bzj333A8++CAej3cnhjbmzp374osvbty48eijjz6ErwMAgPxGAQ+g0H388cf2H3feeWf//v3dDQZdCIVCqVRqzZo127ZtGzZsWGejPfnkkyISDoeTyWQXU9uxY8eqVatEZO7cuStXrkwkEo8++mh3CviZM2decskl7YffeuutZ5xxxtq1az///POf//znixcvPuCk2ti9e/crr7xysN8CAACFgy70AApdrhM11XsfN3HixAEDBkiXvehN07Rvej/55JO7ntrSpUu11iJy6aWXzps3T0Q2bdq0cePGQw5v0KBBDz/8sP33X/7yl4P9umma3/nOd0zTPOQAAABA3qOABwB4g9/vnz9/vog8/vjjnY3z+uuv7927Vyllj9kFu/98SUnJvHnzzj77bHvg0qVLDyfCMWPGHHnkkSLy4Ycf2mcHDmjv3r2rVq361a9+NWrUqJdffvlwWgcAAHmPAh5A4frlL3+plLryyivtf9pPFP/BD37QepxVq1add955EyZMKCsrKyoqGjdu3Omnn/7MM89YltV+gg0NDb/4xS9mzpxZVVUVi8XGjx9/9tlnv/nmm63H+f73v6+UuuWWW0Rk3759dqN33XWX/Wn//v2VUn/+85+11v/1X/81derU0tLSoqKiKVOm/PGPf8y18pOf/GT06NHRaLSysnLWrFkvvfRSm0iKiors6YjI//7v/37zm98cPHhwNBo9+uijL7nkkm3bth3m+G6xK+133nnn888/73AEu//88ccfX1VV1cV0tm7dunbtWnuCoVDo1FNPjUQictgFvIiUlZWJSFNTUyKROODIpmkOGDBgxowZixYt6s7T9QEAQIGjgAeATn33u9+dMWPGY489tmHDhrq6uqamps2bNz///PNnnXXW6aef3qa38+rVq4866qibbrpp5cqVO3fuTCQSH3zwwZNPPvm1r31t4cKFB9VuJpOZP3/+ZZddVltbO3bsWNM016xZ893vfveGG27Ytm3bMccc86tf/SoYDI4fP37//v1/+ctfTjnllAceeKDDSd1xxx0zZ858+eWXv/SlLw0dOnTTpk2///3vx4wZ88Ybb/TI+A6bOXNmRUWFdNKLXmv99NNPi8iCBQu6ns6jjz5q//Gtb31LROLx+CmnnCIiW7duXb9+/SGHl06nP/zwQxEZOnRoLBbrzlemt+LMAxQBAICHaQAobL/5zW863B7efffd9vARI0YsXrz4qaeeeuqpp2677bYRI0bYw++4447cyH//+98HDhwoIpFI5IorrliyZMmyZctuvfXW3PvMly9f3nri//qv/yoiFRUVbRq1q9Nx48YNGjTozTfftAdu377dfia5/YL0UaNGbdiwwf5o06ZNgwYNEpGysrJ0Op2bjv0I9Msuu8wwjFtuuSWTydjDX3vttaKiIhEZNmxY63YPdvyDZc+viLz11ltdj/mVr3xFRAYOHNh+4PTp07XW3/ve90Rk6tSp7b+bO8vw2Wefvfrqq/bfy5Ytaz/m2LFjRaSystI0TXvIf//3f9vjX3fddR0Glqv577///s6Cv/766+1xzjjjjK5ns0P33nuv/fWNGzcewtcBAEDe4wo8AHTMfiDZyJEj165du3Dhwvnz58+fP3/RokVr1qwZOnSoiKxYsSI38gsvvFBdXS0iTzzxxG9+85sLLrjgzDPP/MlPfrJy5cpAICAiTz31VPeb3rRp06OPPnr88cfb/6yqqrr11ltFRGtdU1Pz3HPPjR8/3v5o7NixP/nJT0Sktra2fR/s++6778Ybb7zhhhv8/i/eOTJr1qwbbrhBRLZt2/bJJ58c5viusHvRv/3229u3b2/zkd1/fvLkyV08o15E/vrXv27evFlEzj//fMP4Yj942mmnhUIhEXnssccONqT6+vp33nnnn//5n2+77TYR8fl89kIDAADoWRTwANCBTCbz6aeflpaWXnbZZcXFxa0/KikpmTVrloi0LmjXrVsnIsFgcO7cua1HHjly5Pe///2zzjqrvLy8+61PmzZtxowZrYdMmjTJ/mPBggWjRo1q/dGUKVPsP/72t7+1mU5paekPf/jDNgNPOOEE+4/2BfnBju+Kk046qV+/flpru1xvzT5LknsiXWdyr3+3+8/biouL58yZIyLbtm17++23u/j69773PfV/lZaWHnfccQ8//LDWWkR+/OMff/WrXz34OQMAADgACngA6EAgEKiurq6trf3Rj37U/tP6+vo2Q+z6PJ1Ot68q77rrrqeffvr222/vfut2j/HWSktLD/iRbvfY86997Wttzj6ISL9+/XpqfFf4/f4zzzxT2j2Lfu3atfbD9g54A7z9pLqRI0dOnjy59fDDfxb9EUcc8eSTT/7yl788tK8DAAB0ze92AADgDalU6rPPPvvoo4+WL1++bNmyNp+eddZZ9q3j55xzzrx58+bPn3/iiSce8jPJcjVzewd1Jf9gA/DKQ9TOOeecP/zhD6tXr96xY0fuafP2qZNjjjkm95CCDq1evdqu81tffredccYZwWAwnU4/9thj//7v/66U6nAKF1544fTp09sM7Nev34QJE0aOHJnrkw8AANDjKOABoFPV1dV/+MMfVq5cuWnTph07dnRxCXrChAl//OMfr7zyytra2uXLly9fvlxEBg4cOHv27AULFsybNy8YDDoY+Bf69+/fq+O7Zfbs2aWlpXV1dU899dTVV19tD7QL+ANefs/1n//Zz372s5/9rMNxdu7cuWrVqjZ3MeTMnDnzkksuOcTQAQAADgMXCgCgYw8//PDIkSOvv/76l156afv27f369Zs6deq3v/3t+++//7zzzms//re+9a0tW7b827/924wZM3w+n4hUV1c//PDD8+fPP+aYY959913H50A6u4bcU+MfggP2w+9OR/1AIHDGGWdIq170Gzdu3LJlixzoBnjLstp0vO/M4b8QHgAAoMdxBR4AOvDuu+9++9vftixr6NChixYtmjt3busHm69Zs6bDb1VUVFx77bXXXnttfX39m2++uXLlymeffXbz5s0ffvjhWWed9cEHH+TuVy809mvqRGTXrl1dj7lz504RaX8rfhvnnHPOgw8++MYbb+zatWvQoEH25fexY8fa74frzF/+8hf7ZQELFiz47ne/236ETCZz7rnnZjKZxx9//K677rJPxAAAAPQRFPAA0IHf/e53lmUFg8HXX3/9yCOPbPNpXV1dmyH2Y+2CwWAkEhGRkpKSuXPnzp0797bbbvvpT3/685//fNeuXStXrrSfvlaA7Bfvici6deu++c1vdjba559/vm/fPhHp+j1wIvKNb3yjuLi4oaHhySefvOqqq+wCvvvPn7/qqqu+/vWvdzjO7NmzX3jhhT179qxYseKkk07qeoIAAABOogs9AHTAfqf6yJEj21fv2Wx25cqVbQaOGTOmtLT0rLPOajNcKfVP//RP9t92aVqYZs+ebT/d7YEHHti9e3dnoy1atMj+Y968eV1PMBQK2b3on3jiia1bt27YsEEOdAN8Op223zNXWVnZ2f3t0hPPogcAAOglFPAA0IGjjjpKRP72t781Nja2Hm5Z1iWXXGKXoM3Nzbnhxx57rIisWLFi48aNbSb1xBNP2H+0fzd4Npvt6cD7qP79+9td1qurq+27CdqMUF9f/4Mf/MC+Ql5ZWXnxxRcfcJp2pb1q1arf/OY3IjJixIhjjjmmi/Ffeuml2tpa+4tdPCv+zDPP9Pv9IvLUU09lMpkDhgEAAOAYutADQAdmz579+9//vqmp6eSTT/7xj388fPjw2trav/71r//5n/+5ZcuWeDze1NT02Wef3XjjjWecccaUKVO+/e1vL1++PJ1Oz5o16/LLL584cWIkEtm9e/ezzz5rX/U9/vjjjz766Nz07RKxrq7uySefHDNmTL9+/SorK12bW0f8+te/fuuttz744IN33nlnwoQJJ5988vjx44cMGVJTU/Pxxx+/8MIL+/fvF5FwOLxkyZKioqIDTvDkk08uKipqbGy0C/juP3++w2cQ5pSXl5944omvvPJKTU3Nq6++Onfu3O7OIQAAQC+jgAeADlxwwQXLli177LHHVq9e3bpjvFLq8ssvv/jii6dNm5ZOp2+55ZaNGzc+/fTT55577sqVK3/729/u3bu3/cvJvvzlLz/zzDOtr/pOmjTJ/sO+jHznnXdec801vT9bbiorK3v99dd//vOf33PPPel0+oUXXnjhhRfajPONb3zj17/+ddcX0nPC4fBpp532yCOPWJYlB7oBPpFIPPvssyJSVVU1bdq0rqd89tlnv/LKKyKydOlSCngAANB30IUeADr26KOPPvLIIzNnzhw8eHA4HP7Sl770ve99791337377rsnTZr06quvLliw4Bvf+MYpp5xij3/33Xe/+eab55133oQJE8rKyuLx+Lhx404//fQnn3zyvffea/OK9dNOO+32228fNmxYKBQaPHhwRUXF4YQaj8eHDRuWe9K76+N3pl+/fnfeeefmzZsXLlx4xhlnjBs3LhqNDh069KSTTvr+97//8ssvv/zyy92s3m25on3o0KGTJ0/uYsznnnvOvuXhnHPOOeDb8ubPn28/f37ZsmWpVKr78QAAAPQq1Z037gIAAAAAAHdxBR4AAAAAAA+ggAcAAAAAwAN4iB0AoLuef/75jz766KC+EgqFrrzyyl6KBwAAoKBwDzwAoLsuuOCCRx999KC+Ulpaar99HQAAAIeJAh4AAAAAAA/gHngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8ID/H6ZjO04sNhpZAAAAAElFTkSuQmCC" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdd2AU1d438N+Z2b6bTQ+QBEhAICAISBEEBBUEBBULgiJ6VRR88apXBbug4lUUr1ixXdsjggWliFxEVAQFFOlSQgk1JKRvLzNz3j/GO0+eNDbJZjcbvp8/dDJz5pSZ3WF+O+ecYZxzAgAAAAAAAIDmTYh2BQAAAAAAAADgzBDAAwAAAAAAAMQABPAAAAAAAAAAMQABPAAAAAAAAEAMQAAPAAAAAAAAEAMQwAMAAAAAAADEAATwAAAAAAAAADEAATwAAAAAAABADEAADwAAAAAAABADEMADAAAAAAAAxAAE8AAAAAAAAAAxAAE8AAAAAAAAQAxAAA8AAAAAAAAQAxDAAwAAAAAAAMQABPD1IMsy+6+1a9eGssvf//53Nf0VV1xRef1HH33EKvniiy9Cr0NaWpq248CBA8+4y2uvvVa5rIMHD55xl379+rE62e32c84558Ybb1y5cmWINQ+vkydP3nbbbZ07dzabzVlZWeXl5VGpBkBMmzFjhvqN/uijj5oi/+b/PW2iS/GSJUu0TY888kgoGS5cuFBNP2LEiCbKCgAAAFoABPDNwueffx5iynXr1hUVFdUr808//bTyn4sXL67X7jVyOp2HDh1atGjR2LFjx4wZc+DAgcbnGbqCgoKePXt+8MEHBw4c8Pl8R48elWU5khUAgDOKxe9pU1yK582bt3PnzkZUqkmyAgAAgBiFAL5ZWLlypdvtDiXll19+Wa+cDx8+vGnTpsprFi1aFPrudrs9s5qkpKTKab799tsLL7ywuLi4XhVrjNmzZ5eUlBCRXq+/5JJL7rrrLqPRqG3VOkq0adMmYlUKRdu2bdWKDRkyJFx5NtvGNp26m9wUBzkm1NbwKH5C6v6eRky9jkBTXIolSbrjjjsURQkxfWSyAgAAgBiFAL5Z8Hq933zzzRmTKYry1Vdf1StnLVzXou49e/aE/gzn0UcfPV5NSUlJSUnJihUrevTooSYrLi6+77776lWxxvj999/VhbVr165du/bNN9+02WwRKx0AQhGL39MmuhT/9ttvb775ZiPq1SRZAQAAQCxCAB9l2kOhULpurl+/vrCwkIjS09NDzF/rPz9jxowOHTqoy43vRZ+UlDR27Nht27YNHTpUXbNw4cItW7Y0MtsQ5efnqwsXXHBBZEoEgPqKre9pU1+KH3300RMnTjS4ek2UFQAAAMQcBPBR1q1bt65duxLRt99+63Q6606sddq89tprQ8l8x44de/bsISLG2KRJk66//np1fViGwRORKIoffPCB9ufq1avDkm29KhDhEhvj8ssvv+6666677rphw4ZFuy4t1ll7kJtzw2Pie9pEl+K+fft27tyZiJxO5913392YGoYxKwAAAIhdCOCjjDGmxtU+n6/urpucc7XTZmpqqvbcu24LFy5UF4YNG9a2bVstgM/Ly6syML7BsrOzs7Ky1OUIT2UXdXl5ee+8886zzz575MiRUNK//fbbX3zxxRdffPHMM880cdWal/oeqMY4aw/yWdvwcGmiS7HJZHrrrbfU5WXLln399dcNrmEYswIAAIDYhQA++saPH68u1N1189dff1W7pF599dU6ne6M2XLOtSftN910ExH17t27U6dO6pp6TWVXNy2ALy0tre++Bw4cuOeee4YOHdqxY0ez2dymTZt+/fqNHz9++fLl1Sdq0l74VFBQoK7R6XTqGnWurCeeeIIxph2cgoICdWtiYmKVrBRF+eyzz66//voOHTpYLJbWrVsPGjToH//4x+HDh2urqvbCraNHjxLRc889l5OTM3Xq1Mcff/zPP/8MpbG1vbJLW6/m43K5Xn/99YEDB7Zu3dpqtfbs2fPGG2+sPjyhSRur2b59+913352Tk2Oz2VJSUi644IIXX3yxoqKCiJ566im1xD/++KPBB6peH4BQmnzG96IVFRU9//zzF110UXp6utFoTEtL69u37yOPPLJ///7aDkLDTlDdJk6cqOb5j3/8o/rWf//739qbw1599dXqCR5//HF164UXXlhbw0P/hGjKysqeffbZvn37pqSkWK3W8847b8KECZs3b65X0874PdXU6+xX5vF4Xn755auuuqp79+5WqzUzM/Oiiy6aNm1abm5u5WT1PQJNdCm++OKL//a3v6nLd999t8PhOOMuEcgKAAAAYhWHkEmSpB2377//PpRdtI6OY8eOrbz+ww8/VNcPHz6cc96tWzciMhqNFRUVtWWlzRK3Zs2apUuXqssDBgyoLf26devUNCaTqby8XF352GOPqStbt24ty3Jt+/bt21dN9vzzz5+xjZmZmWriyZMnnzGxRpbl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x47evXtv2LBB26QoyooVKy666CL1VE6aNKnpXhfXFMLYWJ1O989//lNdfu65526//faysjL1T0mSPv/88yFDhgSDQfVRJ9V/Vr9wfQCqN7kOc+bMUQeN//rrrwMGDKj8iPLEiRNjx459//331T9nzZqlPhKPGK0XvToYfvDgwZUPqV6vHzx4MBEdO3ZMbW/D+s/X63A1ncac/QsvvFBd+OWXX/7f//t/2seSiDjn69atu/LKK9U/x44dW/0k1vcINPhSHDpBEN555x31x9ZG9vkPY1YAAADQnCGAr7dZs2Zps4K53e558+add955NpstNTXVarVmZGSMHDnyhx9+UBPExcWtWLGi8vO0M9K6bh48eFBdE+Kkx9pD0VatWmmTYNVNy/nXX389duxY6JVsjPPPP1+NWILB4KhRo/r373/rrbdOmTLl4osvbtu27YwZMzwez9/+9jc13MrNzW3VqtXNN98cev6iKKqT6gcCgWHDhk2fPv32229XN2VlZX3wwQfqPe6ePXuGDBmSlJQ0ePDgwYMHp6enX3nllepQgiFDhrz99tthb3hTaKLGXnvttWPGjFGX33///eTk5C5dugwaNCg+Pn7ChAlut3vEiBH33nuvmqC+r+xq5AegjibXYfDgwdrY4N27d/fs2TM5OXno0KHt2rVr27btqlWr1E3jx4+/++6769WcxtMCeFXl/vOqKl366xXAN+xwNZ3GnP3Ro0drQ9PfeuutNm3a9OnT57LLLhs0aFBGRsawYcPU/vnZ2dmVP9INPgINvhTXS69eve67777mlhUAAAA0XxwaZOHChXW/pogxNmbMmCNHjtS4+4cffqgmGz58ePWtlWchio+P9/v9VRIsXbpU3TpgwAB1jaIoWVlZ6srp06eH2Irt27drBc2dO1db37dvX3Xl888/H2JW9XL69OmePXvWeNxSUlLef/99zvn06dO1ld27d6+8u9YLV5KkGvPXXt2sSkhIqLx19erVmZmZNZYuCMLkyZPLysqq5/nggw+qaT788MOGtbq2HELJecCAAWqagwcPRqCxnHOfz3fTTTfVuOPkyZPdbvdDDz2k/nn8+PH6NqeRH4A6mlx36QsWLIiLi6uxXJ1O98ADD9T4iWrkCQqFNjsmEW3atKnKVrXnvHZ8ZFmuVyUbfLhU3bt3V9MUFBTUq1G1fU8bc/YrKirqHv8/cODAffv2hX4Ewn4pVmmjAAYPHnzGA+V2u7Wrd/WahDErAAAAaAHwGrkGuvHGG6+//vply5Z99913mzdvzs/PLy8vNxqNiYmJOTk5gwYNmjhxotZBvb7Gjx+vjZ8PsdPmxo0btVdk1T3/fGU9e/bs1KnTgQMHiGjRokUzZ85sSHXrLzU1devWrZ988snixYsPHjx47NixpKSknJyccePG3XLLLfHx8UT06quv9uvXT30vVH0nFXv99ddTU1OXLFly4sQJo9GYk5NTeetll12Wm5v70UcfLV++fNeuXUVFRcnJyZ07d+7Wrdvdd9/dtWvX8DU0nBhjNXZWb6LGGo3G//mf/7n99tvffffdDRs2FBYWJiUl9enT56677rr88suJqLS0VK1VUlJSfdvSyA9A3U2uw7Rp06655pr33ntv1apVBw8eLCkpsdvt7dq1u+yyy2677TZ15H+D1XaCQjFq1Cj1obHFYqn+6r6+ffvabDaXy0UNeoFcgw9XE2nM2bfb7atXr968efOCBQsOHDhw/Pjx06dPp6WlZWVldezY8bbbbqvef4EacQQacCluAIvF8uabb6pfq+aTFQAAADRPjDePmY0AILZceOGFGzdubN++fd0vVwcAAAAAgHDBE3gA+D8OHDiwfPlyIurYseO4ceNqTJObm6u+nS701ysAAAAAAEAjIYAHgP/DZDKpQ6MTExNHjRpV45Tss2bNUl+ycPXVV0e6fgAAAAAAZyvMQg8A/0fbtm179epFRGVlZTfccIPH46m81ePx3HPPPZ999hkRJScnX3PNNdGpJQAAAADA2Qdj4AGgqu3bt1900UVOp5OI4uPjr7zyyuzsbFmW9+/fv3HjxpMnT6rJPvroo3q94Q8AAAAAABoDATwA1GDt2rVTpkypbYI6o9E4f/78adOmRbZSAAAAAABnNQTwAFAzSZI+/fTTr7/+Oi8v78iRI36/PyEhoUuXLkOHDp06dWp6enq0KwgAAAAAcHZBAA8AAAAAAAAQAzCJHQAAAAAAAEAMQAAPAAAAAAAAEAMQwAMAAAAAAADEAATwAAAAAAAAADEAATwAAAAAAABADEAADwAAAAAAABADEMADAAAAAAAAxAAE8AAAAAAAAAAxAAE8AAAAAAAAQAxAAA8AAAAAAAAQAxDAAwAAAAAAAMQABPAAAAAAAAAAMQABPAAAAAAAAEAMQAAPAAAAAAAAEAN00a5AbLj11ls9Hk+0awEA0Izce++9F154YSgpA4HA5MmTm7o+AACxZfbs2V27do12LQAgxiCAD0leXl5CQkJGRka0KwIAEH2SJP3xxx8VFRUhpuecHzp0qEOHDqmpqU1aMQCAmOD1enfu3ImHQwDQAAjgQzVgwIBrrrkm2rUAAIg+t9t9xx131Hev4cOHD04ekM4AACAASURBVBs2rAmqAwAQY06cODFz5sxo1wIAYhLGwAMAAAAAAADEAATwAAAAAAAAADEAATwAAAAAAABADEAADwAAAAAAABADEMADAAAAAAAAxAAE8AAAAAAAAAAxAAE8AAAAAAAAQAxAAA8AAAAAAAAQAxDAAwAAAAAAAMQABPAAAAAAAAAAMQABPAAAAAAAAEAMQAAPAAAAAAAAEAN00a4AQJjt2LHj66+/Pn78eH5+vs1my8jI6Nq164QJExISEmrbZfv27WvWrNmxY0dJSYnJZMrMzOzSpcuNN96YlJRUJeUNN9xQUFBQZaXFYsnMzOzatevNN99cfZd6FVFYWDhx4kQiWrVqlclkakj7AQAaB1dRAACAZgsBPLQcsiw/88wz69atIyJRFJOTk51O544dO3bs2LFs2bL7779/+PDhVXbx+Xxz58796aef1D9FUfT5fOXl5bt37165cuU999wzevTo6gWZTCad7q/vDufc4/Hk5ubm5uZ+//33L7zwQrdu3RpfRChKS0vffffd33//3eFwJCUlDRgwoMZ73/Amq2zfvn1///vfe/bsOW/ePG3luHHjKioq6tjr7bff7ty5s5bD4sWLDx8+XFpamp2dnZOTM3nyZLvdXo+jAADhg6toc7iKqvLy8hYuXJibm1tUVNSmTRv18timTZvGFwoAADENATy0HO+///66devi4+PvuuuuSy+9VL07zM/P/+STT1atWjVv3ryOHTtmZ2dr6WVZfuihh3bu3Gk0Gm+99dY+ffpkZ2cHg8G8vLzFixf//PPPL730Unp6es+ePasU9Pjjjw8aNEj70+fzbdu27bXXXjt16tSLL7743nvviaLYyCLOKD8/f8aMGfn5+USUlJRUWFi4bNmy9evXv/HGG61bt26iZJU5nc7Zs2dLklTfmuv1enXhgw8++OSTTxRFMZvNiYmJe/bs2b179y+//PLss89WPk0AEDG4ijaTq+iqVateeuklWZYNBkNiYuLx48fz8vLWrFnzzDPPDBgwoDGFAgBArMMYeGghfD7fZ599RkSzZ88eOXKk9mwnPT195syZI0aM8Pv9ixYtqrzLf/7zn507dyYlJb366qsTJkw455xzRFE0mUxdu3Z96qmnRo8eLcty9aci1ZlMpoEDBz799NNEdOTIkQMHDoS9iOqeeuqp/Pz8AQMGLFmyZMmSJYsXL87JySktLX3ttdeaLpmGc/7ss88WFhZW37R48eJVNVGPz4gRI9S7/82bN3/88cdGo/Gxxx5buXLlwoULly1bNmrUqFOnTs2ZM6cBBwQAGglX0WZyFT158uTLL7+sKMq999777bffLl68eOXKlTfffLMkSc8++6zL5WpwoQAA0AIggIcW4tChQ7IsJycn9+rVq/rWMWPGENHBgwe1NYFA4MMPPySiqVOnaj26K5s6daooiidOnKh8K1mHc845Jy0tjYiOHj3aREVo9u3bl5ubm5KSMnv2bLWrZKtWrZ5//nmj0bh58+aioqKmSFbZwoULN2/e3KFDh+qbTDXx+Xzz589v167d/fffryb7+OOPiWjatGnDhw9njBGRzWabOXNmjx49Dh8+vGXLlnodEABoPFxFm8lV9Pfffw8GgwMHDhw3bpzaE8FgMNx6662dOnVyuVw7d+5scKEAANACIICHFkIddx0MBmVZrr41Jydnzpw5d9xxh7Zm7dq1xcXFGRkZl156aY0ZxsfHP/DAA7fffnvovcQVRSEirQJNUYTq22+/JaKhQ4cajcbKufXv31+W5e+++64pkmm2bdv24Ycf9urV66abbgqxwnPnznW73bNnz1bnlJJl+dChQ0Q0ePDgyskYY0OHDiWiH374IcScASBccBVtJldRp9NJRAaDocp6dY3D4WhYoQAA0DIggIcWon379kTkcDjmz5/v8/mqbDUajYMGDRo4cKC2Ji8vj4j69u2rjbSsbvTo0TfddFPXrl1DqcDevXuLi4uJSHuiEvYiNMeOHSOi3r17V1l//vnna1vDnkxVUlLyzDPPxMfHP/HEE4IQ0gVk1apVmzZtmjRpkjZ0NhgMBgIBIqp+ZNQ70dOnT4eSMwCEEa6i1DyuokOHDjUYDBs2bPj111/VNZzzb7/9ds+ePTabTRsDX69CAQCgxcAkdtBCZGRkjBgxYs2aNd98882PP/44cODA/v379+nTp7bJeE+cOEFE6enpjS+6tLR069atb731FhF16tSpU6dOYS+iipKSEiJKTEyssl5dU1pa2hTJiEiW5aeeesrhcLz00kshznLs8/nee++9lJSU8ePHaytNJlNGRsaJEye2bNlS5cHaL7/8QkTo/AkQebiKUvO4irZr1+6FF16YM2fOY4891qZNm+Tk5IKCguLi4rZt286aNUt7mV/ohQIAQEuCAB5ajoceeigtLW3ZsmUul+v777///vvviSg7O/v8888fPnx4Tk5O5cSnTp0iolatWjWgoMcff7zG9QkJCTNnztSeFDWmiLqp923x8fFV1qtr1K1hT0ZE77zzzq5du6ZMmRL6hM+ffvppaWnpI488UuWFzFdcccWCBQveeOMNu93er18/InK5XO+///6mTZvU5RDzB4AwwlW0mVxFbTZbSkpKcXHxqVOn1INARK1bt7ZYLPVtAgAAtDAI4KHlEEVxypQpN99889atW//4448//vgj77+WLFly/vnnP/nkk9q9jvoQo+43ltem8huMiYgxlpGR0a1bt8mTJ2vPRhpZRMNwzokoGAw2RbL169d//vnnF1xwwY033hhifUpKSj7//PPs7OwRI0ZU2XTdddft3Lnzl19+mTlzptVqtdlsRUVFiqIMGTJk/fr1eIkxQFTgKtocrqJ//vnngw8+KEnS5MmTR44cqT6BX758+dKlS6dPn/7qq69mZmY2vm4AABCjEMBDS2MwGAYMGKCOEiwtLT169ChjbMOGDUuWLJk5c+aCBQvUMYeZmZnbt28/fvx4HVmdPHkyNzfXarX279+/8voqbzCuTWOKqFtycvKJEyccDkdGRkbl9erURykpKWFPdurUqblz57Zq1eqxxx5TJ40PxbJly/x+/9ixY6vvIgjCnDlzvvvuu9WrV+fl5cmyPGjQoDFjxni93vXr12t1A4DIw1U0ulfRV155xefz3XXXXddff726Jisr65577hEEYcmSJW+99Zb6rs0Q6wYAAC0MAnhoIe655579+/c/99xz6vw9qqSkJPVZbq9evQ4dOrR9+/aNGzeqd41t27Ylot27d9eR58KFC1etWjV8+PB63Rdqmq4I9b6tvLy8ynp1TWpqatiT7du3z+12i6J49913awncbjcR/fnnn7fccgsRzZ49W5umjogkSfrmm28MBsNll11WW0Muu+yyKlu//PLLynUDgIjBVZSawVU0NTVVfSVe9SvnyJEjlyxZsm3btnrVDQAAWhjMQg8tRLt27QKBwN69e2tLoA4d1AZXDxs2zGg07tu3b8OGDTWmlyRp8+bN9N8ZfRug6YpQb2q1twFrdu3aRUTa05jwJiMih8NxrBJ1jKXP51P/rNJj86effiorKxs6dKjNZqvehIKCgry8PPXmtTJ11uW+ffvWeQAAIPxwFaVmcBUVBIExxhjT6/VVclNfIycIgtpJPvRCAQCgJUEADy2E+g6hxYsXFxYWVt9aXFys3uVoQwfT0tLUedHfeOONo0ePVt/lww8/LC0ttVgsF1xwQcOq1HRFjB49moh+/vnnyq9r9vv9GzduFARh1KhRYU928cUX/1jN7NmziahPnz7qn507d65cyZUrV6o71tiEr7766rbbbvvoo48qrzxy5Mj27dtTUlJC6VsLAOGFq2hzuIpaLJbMzEzO+caNG6vUWV3TuXNntQd+iHUDAIAWBgE8tBCjRo0677zzXC7XtGnTvvrqq4KCAvWexuFwfP/99//4xz9cLteAAQO6deum7XLjjTemp6cXFBRMmzbt888/V0diy7J89OjRuXPnfvrpp0R07733NmZCtSYqolu3bp07d87Pz3/llVcURSEiSZKefvppt9t94YUXajM2hzdZvbjd7l27dgmC0KNHjxoTDB8+XBCEr776at26dUTEOd+3b9+MGTM45+PGjavjnc8A0ERwFW0mV9HrrruOiF555ZV169apD9tlWV6xYsX7779PRNdee21TFAoAALGCqf82QN2GDRs2atSoa665JtoVgboUFRU9+eST+/btU/8URVEQBK1fd69evebMmWO1WivvUlJSMmvWrD///FP9U6fTcc7Ve1a9Xj9p0iR1XKLmhhtuKCgomDNnTuiPiOtVRGFh4cSJE4nIbrfXOMvRxIkT1QQnT56cOXNmfn6+zWbLyso6ePCgz+fr3Lnzc889V/lGNrzJqli3bt3s2bP79Okzb968Kpt+/vnnWbNmderU6Z133qlt9//5n/9R70cTEhIURXE4HEQ0ePDg2bNnI4Bv5txu9x133PHMM8+ozwDPyO/3Dxo06M477xw2bFgTVw0aBVfRZnIVnTdvntqJyWg0Jicnnz59WpIkQRAmTZp02223NbJQaA5OnDgxc+bMt99+u0+fPtGuCwDEGExiBy1H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D6dMzNpajWR3yfRENsgvpbqvew2LD2cqpmsM5Iu+GTQPNtIvNhKHz2CcAUNmmi00wewbCNYTq7ucQgIEAIRozROJiAQESKKnpu8lxbpBY34Ha0vx5uTo1VxR3qq777774YcfBoArrrjCtrcz/u6mm276y1/+0tLScu65586cOfODH/xglP7AAw987GMfAwDTNM8///yDDjoIERctWnTHHXd4nnfFFVd0dnaedtppI9f50Y9+FEXvU6dOvfDCC6dOnQoAK1asuP3221etWvXII4/cfPPNn//850fO//SnP3333XcDQC6XO/vssw844ICenp5HHnnkySefPOuss0ai8Td0xx13RDvktba2nnfeefPnzy8Wi/fdd98f/vCH5cuXn3POOX/+858Z2/ywr7e395hjjimXywDwsY997Oijj85kMosWLfrJT35Sr9evueYaxtiVV175plr41ltvvfXWW7e7Cv0pp5xy++23P/LII67rWtY/fPuKuuUR8eyzz94yvVwun3zyyX19fbfeeusZZ5yRzWbXrVv3ve9975Zbbnn66ac/8YlPPPTQQyMn74rqKLuUCuAVZXdGQCIGQ6314sAGQ7ecWrGnLWCl1c3ZTo1jjCWCFYOsOcUNzVmy3l+41igF8VIMyIKUFAkelDyjzqLeKelJtnzIWuFpIqFNVtG7oii7M4wb2pQm82/dTXpbflOq33R13zB9XegiwDDQArOhVytV8ZsHxp9zspcjJAyXbWBLS3oZQIKM1ioFIIqCeGCAEoREiZUGy9n6tImsNanPatk8DEpR3h3uvPPOLbeRc123q6vrqaeeeuaZZwBgwYIFX/7yl7f7wj/+8Y8f/OAHf/nLX+bz+ZHEMAy/8IUvAEChUPjd73534IEHRunnnnvueeedd+KJJw4ODn7pS186+eSTRzrVo7Xup02b9vzzz6dSqZFLXXLJJfPmzduwYcPChQtHAvglS5ZE5++1116/+93vOjs7o/Srr776S1/60o033riTtW40Gl/96lej6zz66KPjx4+P0j/96U9feeWV3/ve9xYuXPjwww+ffPLJUfo3vvGNcrnMOf/Nb34zsib/GWeccckll5xwwgmrV6/+2te+dtZZZ23Vaf+WfeQjH7n99ttrtdpjjz124oknbnnoV7/6FQAccsghW61K0NXVBQAPPfTQSSedFKVMmjTp5ptvzufzX//613/3u98999xz73vf+8akOsrbp+bAK8ruLKYncm2dNb0MGQ1sY9yE6RCGfd7aTeternV1D7+2UvZXwA/JC2W5QSBllgubAIl7CIwkEDg+OT6EgsVNAvJf7iE3lDVvrGumKIqyC7GUxQoJfZ/2po5ZWiqhSagm6sVMGYhirqGF3DdEV2vfi8Wnnr3531747c+X/OcvVr/ydLlrQ1CrCQqlJA6IgIiAgMRYCATAgQAQMRszD5us79Wqonfl3eaSSy759BY++9nPfvvb346i9yOOOOK73/0u4vbftJzzW2+9dcvoHQB+/vOfR5Oor7vuupHoPXLggQdGPd7Lly//xS9+ESUGQbBmzZpMJnPhhRduGb0DQDqdPuqoowBg9erVI4nXXXcdEQHAXXfdNRK9AwAi3nDDDfPnz9/JWv/whz/s7u4GgJtvvnkkeo9861vfikryxBNPRCmrV6/+6U9/CgD//M//vNWOetOnT//JT34CAPV6/cc//vFO5v6GjjnmmEwmAwAPPPDAlulLly595ZVXAOCf/umftn3V4YcfPhK9j7jmmmsKhQIAfP3rXx+r6ihvnwrgFWV3ljBzcTObmjDRaG9KTRzvtzCf+akBy4wli3bRB9cN63KwLtYXsRwCgE9uNSwWnd5aUPTKZVn1he+Hnhf6ng++DEMgGa7sB1+tuqQoym6Oj0voM8ZZcyfGJ09x46IRb9QSDcEp0ELLM2t2XaBoGF7dGdYW9oTPbRzYuNKRNRAAxBgyQElACAAkNSAOjJAAGE/H9OkFsNQQSOU95sknn+zs7Lzvvvu2e/Too4+ePHnyVomLFi0CgEwms2DBgm1fcsEFFySTSQB49tlnoxRd13t7e4vF4nYHbEdjvLcUvfC4447bbqx+1VVXvX6NRkRL7s2ZM+cDH/jAVocMw/jOd75z5ZVXjiyq/+ijjwZBAABXXHHFtpf6wAc+MGfOHACInnq8I3Rdj0LxBx98cMtJAVH3u67rH//4x7d91QUXXLBtYiwWO++88wBg4cKFUcroV0d5+1QAryi7udb0lJbUZNNKsIQlMCCN2dmC1dwUS+WL+boIQtFX855YFf5tY7wLsysNc4CsupYZimf7E1ygRAEBkR8G5XrgOWHJ0aY0ofrqqSjKnkBjesqeNPXQTn+GFdjlVG3dpO6BppKvB8V0pZyqMsJkxXawUdPLugdWzUQiAAkAkpADSCJgKBAICIgYInakWWFsVkVRlDfkui79ozAMn3/++auuuopzXi6XzzzzzN///vfbvnC7G8tFveUzZ87cauZ2xLbtKCreslN9K57nLV++/MEHH7zooot++9vfbnmoUqn09/cDwMhQ8K3sKH1br732GgDss88+2z160UUXffe737344oujH1etWgUA7e3tW/XVj5g3bx4ALFmyZCdz3xkf+chHAGBoaOipp54aSYwC+A996ENbDXyIzJgxY7uXmj59OgA4jtPX1wdjVB3lbVLfwhVlN4fAWlNTdWaGMmDAMNuINfJc0130zJqhTcyEK/pFX1X0Vnm/H69zqWu+FqSHk7HACHhIgDrjEILWIM+p6+NNTMcwbrxxxoqiKO99mqZ1tu9lHHFOYuEDa93Xanq5nK7kiiliZLmW5RoICLr0ucx4BqAUDDQBSFICAXBEIEKUBCgQGHFuvX+a1px644wV5d2Bc77//vvvv//+Bx988Omnny6E+OIXv3j88cdvdVpLS8u2r42Cw9fZNL6jo2Px4sVbBfC9vb133nnnE0888eqrr27cuDEaJL+jiwPAtj3/kQkTJmiatqNN4EaEYbhu3bro/Nc/c8t8u7u7dzSbIDI0NLQzV9tJxx13XCKRqNVq999//5FHHgkAL7zwQlSS7Y6fB4CJEyduN31krsHatWubm5vHpDrK26QCeEXZ/ZlavC093Rduymoq663DsMJYXyOg7IROy0tIKMuyy1vTINHbNBSQz0JNI06MJCeUQASMMc/GxgwtNT2tTciOdYUURVFGCec8mxynzdabOifN7O565cXfbep52bXd3FBW8HDcYA4lVu1GwwpYXw4BQh5waUgkTpogQkDEzQvSIwJvScdPnQPGDrcRVZR3rdNOO+2II4548sknlyxZsmnTpra2ti2PGsZ2nuzvaMvxEZqmAYDruiMp99xzzyWXXFKr1aIf8/n8tGnTZsyYcfjhh//pT3/aci/07fbqbwkROedvGMB7nhedY5rm658ZiTqu35CUMgzDqIJvn2VZH/7wh3/9618/8MADN910EyJG3e/JZHJkab2tRAPjt9VoNLY8YUyqo7xNagi9ouwREJmp2Vm7tSnX0bb3vtnD5zQful/TtGl6axackIQkxw9sIJPzQBN6CEQSJHHJJUMESeRmXWPf8fakdnXbUBRlj6JpWjZVaB83dfZ+R33k/O+eeOpXZ2QPMox41sm6lu/E3Xwxl69myIBQo8AMJCMkJkECAjBEiJak55Kkff5BmFAjmJT3qpFB6dEi528o2gRu/fr1Ozph7dq1ADAyvfyvf/3reeedV6vVJk6c+KMf/Wjt2rWDg4PPPvvsXXfdtWDBgmz2H/oPJk+eHHUar1mzZrsX37Rpk+e98Zq78Xi8tbUVADZs2LAzlYp6sPfbbz96I+9suBuNot+4cePzzz9PRNGzjNNOOy0Wi233/GhYwbZGxjtMmTJlDKujvB3qN6Eoe5aEmUuYOWgCAACiQAwRSap6pDNm6YFJRlHnBKEhdF/TPV0TjAhIB72tkD1gTmx88xhXQFEUZSxEoQJn2tQ5R0ydc4S7rq/r6WedVethTdlyTKME1YQjsxr5IvSFFkYbRhMQSpIMAUBQPqZ1ZoCrh6DKe9VI5+1O7ig2ZcqUhQsXrlixwvf9bbvoXdeNJp+PBPC33XablNIwjCeffLKjo2Or80ul0pY/WpbV1tbW3d3917/+dbu5L168eGcKCQDTp0/v6el59dVXt3v0Zz/72WOPPZbJZG6++Wb4+9zyV199VQgxsvvdKDjhhBNisVij0XjggQd834+eoexo/DwALF68+PDDD982PVr5LxaLRY8txqo6ytuhPkUUZQ+GqHXmYifMMt8/hecTRjou8kxHLeHENV9DiXrIgBhqGrakCofun5s9E0311E9RFAWsSc3Tzjl17+s+N+fb/2/C2R8snHDI5A8eN+F9BxYmTNEMXWi+ZEgEhEQIAqTQQ7Mzz2PqFqq8V0kpo6XLc7ncjhY820q0ddzw8PBdd9217dGf/vSn0cLyBxxwQJQS9aVPmzZt2+g9DMORjdxGHHbYYQDw6KOPbjdW/9d//dedKST8fWTBokWLnnvuuW2Pfve7373nnntG+uf3228/AHBdd7sL8tfr9X322aezs/OGG27Yydx3UjweP+644wDg/vvvv/feewGgubn56KOP3tH5N91005ZL1kdWrlwZFfvQQw+NHkqOVXWUt2M3D+Dvvffek3cg2u9RUfZwyJk+ty1++jz7zH2sD0ybcObxsG+BGbouNE1ogBrTNJaJxaa3xo+aobYsVhRF+QeIvDVpn7Fv/HOHxT/5vuRnDkudeWDm4wdBNgYsQJSAIWMhmh4b36R1NLGcPdYlVpS3goi+9rWvLV26FAA+8YlP7OSrPvnJT0bjtK+77rqtYuznnnvuG9/4BgBMnTr1/PPPjxKj4dzr16+vVqtbniylXLBgQU9PDwDU6/WR9K9+9auMsSijrQbqf+tb39pywfbXd9VVV0WbvV966aVbzQn/6U9/GtX6gx/8YJRyyimnRLvWfe5zn1uxYsWWJxPR5ZdfvmTJknXr1u1oavrO2NG8/Y9+9KMAsGLFiuiByFlnnfU6feZr16697LLLtozhe3p6zj777GhhgpF94EehOso7bjd/Ehz9qSuK8vowGzOy4wHAAkjtM6Xy8//1n9kAxQZ4gtmGtv/E2AkzWHNyrIupKIryLoUMwdLQ0qyjphkHTtSPntb38EJatEEbFqhx3j7RSqSsw6ewvNpATnlXu/POO3Vd3zJFCLF27do///nP0Uj1jo6Ob37zmzt5NV3Xb7jhho9//OO9vb2HHXbYBRdccNBBBxHRs88++5Of/CSaoP7tb397JMdjjjnmjjvuqNVqxx133DXXXDNlypRisbhkyZKbb7555cqV0TLsa9eu/cpXvnLyyScfcMABs2fPPvfcc++6666XX355/vz555xzzgEHHDAwMPDII4/88Y9/tCxr8uTJOxoYv6VCofClL33pC1/4wvPPP7///vsvWLBg3333dV33D3/4w89//nMAOOCAAy688MLoZES86aabDjvssP7+/nnz5l144YXve9/7CoXCunXrfvazny1atAgAPv/5z++111472+hbiOaZl0ql//qv/5o5c2Yul4sGukdOPPFEwzB834+eYrzO+HkAiMViP/zhD1988cVTTjll4sSJL7zwwi9/+ctNmzYBwEknnXTIIYeMQnWUXWQ3D+CjbvZ///d/33auzk4uNakoexpeSGb/39HinLpYOywrDWJM68jok3Kg7eYDdhRFUd4BDFnSiu09vmOvs/z+ovvUGup3jFScT80be7ViTH/jKyjK2Lnkkkte5+ghhxxy1113xeNv4jnUxz72sXvvvffiiy8ul8s/+MEPfvCDH4wcymazt9122+mnnz6SctZZZ/32t7/9zW9+8+yzz5566qkj6Yj4mc985lOf+tQhhxzi+/7111//yiuvPPDAAwDwwx/+sK+v7/e///3g4OD3v//9kZfEYrG77777vvvu25kAHgCuvvpqXde/+MUvdnd3R0MDRsydO/fee+/d8rnGIYcc8vvf//5Tn/rUpk2bbrnlli1PRsSLLrro3/7t33a2gf7R/vvvH/0n6mz//ve/f9lll40cTafTxxxzzCOPPAIA06dPj3rOd+T+++8/66yznnnmmWeeeWbL9EMPPTR6KjEK1VF2kd0/gOecT5o0Sa3KoChvAkPenODNibEuh6IoynsVatxsazLPaAIAkKSmICnvXR0dHQcffPCxxx77yU9+Mhqy/qaceeaZBx988I033vjnP/852m+8vb392GOP/cIXvrDtXPpf/epXp5122m233fbaa68NDQ21tbUdddRRF198cRTZPvbYYzfddFOlUvnQhz4UnW/b9iOPPPLrX//6rrvuWrx4calUKhQKxxxzzNVXXz179ux6vd7S0nLwwQe/YSER8fLLLz/yyCO/973vPfXUU/39/a2trTNnzjzppJMuuuiibeOI44477uWXX77xxhsfffTR9evXE9HUqVPnzZt3xRVXzJ0798020YgTTzzxxhtv/I//+I+enp6mpqampqatTvjIRz4SBfCv3/0OAIcffvjSpUtvvPHG//7v/+7u7o7H43Pnzv3EJz5x/vnnb/tL3EXVUXaR3TmAL5fLjuOMHz9eRe+KoiiKoowZFb0r725Rb/Zbs9V89e3q6Oi49dZbd+ZqiHjmmWeeeeaZ2z16+OGHb3dl9TPOOOOMM87YNv3cc88999xzdybfyH777feLX/xiJ0/O5XLf+c53vvOd77z+aZxzItqZxMg111xzzTXX7OhqlUol+s/ZZ5/9hiVsa2vbatTD69jJ6ijvBrtzAB+Nnx8/fvzzzz+/cOHC3t7efD4/adKk448/PpPJjHXpFEVRFEVRFEVRdtbPfvYzADjwwAOnTp061mVRxszuHMBH6zS88MIL0QIMkWefffahhx669NJLo50ntrJixYrrr79+23Qppeu6W+0/+XaMrAn5Dl5z5zmO47ruaOYYrXgJANVqNdq1YjSz9jwvCIJRzjT6j+M4I5umjo7orTXK76uRp8iu645+U0spx6q+QRCMSdYjD+BHOd+Rpo76W3a0TO6OXu44zjvYXFsVadRE+dbrdcdxRjPfkU+Ncrk8yndRImo0GtFyU6NmpL61Wm2U6yuEEEKM1V1l9JtaSklEY1Vf3/dHOesxqe+IMAy3vItuu8uXoryORYsW/e1vfwOAc845Z6zL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iYJX0bPrKrp27dotW7b06dPnH//4R/1oHyHUyt19991NHMuMTPZByBCDAH7Tpk033nhjcXHxL9bMz88/dOhQ9C0iVN/IkSO/+OKLHTt2zJgxY+rUqUOGDMnMzBQEwePxfPfdd//61798Pt+gQYN69+4decsNN9ywfv36EydOzJgx49Zbbx04cGDHjh0B4Pjx48uWLfv8888B4J577jndTj9N0UJN9O7du0ePHvv27Vu8ePG9995LKdU07eGHH/b7/Zdccknkzju21ZpowoQJTz/99OLFiyVJuuyyywghuq6vWrXqtddeA4Dx48ef0achhOIGr6Jn11X0o48+AgAjR1T9dHqEkNppAhFCrU1ubm5ubm6ie4HOSiTK6ayHDx8uKChQFKUplZOSkjweTzTNJcrw4cNHjhz529/+NtEdQY2prKycM2dOUVGR8a0gCJTSyG1NYWHhwoULbbb/2r+0urp67ty5u3btMr4VRZFzrus6AEiSNGXKFGNdYsTkyZPLysoWLlzYlPRLzWiivLzceBzrcDgaHKmeNGmSUaGkpOTBBx88ceKE3W7v3LnzgQMHQqFQjx49Hn300do3srGtVkeDY0cA8OSTT65cuRIATCZTenp6RUWFpmmU0ilTptx2220NftS4cePcbvdbb73VEhs+o5jz+/233377ggULRo0a1ZT64XB46NChd9xxx/Dhw1u4aygqeBU9W66iuq6PGDHCOAkNysvLW7p0aeMnFiXQ8ePHH3zwwSVLlvTv3z/RfUEInWWifTr78MMPK4qSlJQ0a9asyy67LJqn7AhFKTMz86WXXtq0adPnn39+4sSJ0tJSWZZzcnLy8vLGjBnTr1+/+m9JT09/7rnnNm7c+J///GfPnj01NTV2uz0vLy8/P3/SpEkxeTLavCZO96grHA4bX+Tl5T333HOvvPLK1q1bi4qK0tPTR40adfvtt1ssltr1Y1utie6///6rr776/fffP3LkSFVVVfv27Tt37jx58uQePXo049MQQnGDV9Gz5SpaXl7eSPSOEEKoDYt2BL5379579uxZt27dFVdcEas+tUI4Ao8QQhE4Ao8QQtHAEXiEULNFm4XemELftqN3hBBCCCGEEEIo4aIN4FNTUzMyMmLSFYQQQgghhBBCCJ1OtAH8RRdd9OOPP+JCLIQQQgghhBBCqEVFG8Dfd999wWDw8ccfj0lvEEIIIYQQQggh1KBos9BfdtllTzzxxAMPPKAoyn333edwOGLSLYQQQgghhBBCCNUWbQC/cuXKnj17Tp8+ff78+YsXLx46dGjXrl0zMzMb3HwVAGbNmhVliwghhBBCCCGE0Dko2gB+zJgxka9dLtfKlSsbr48BPEIIIYQQQggh1AzRBvB2uz0m/UAIIYQQQgghhFAjog3gvV5vTPqBEEIIIYQQQgihRkSbhR4hhBBCCCGEEEJxgAE8QgghhBBCCCF0Foh2Cr2Bc37o0KGDBw9yzhupZrfbhw4dGpMWEUIIIYQQQgihc0oMAvhNmzbdeOONxcXFv1gzPz//0KFD0beYEN9+++2xY8cS3QuEEEo8TdOa8a61a9f+9NNPMe8MQgiddYLBYKK7gBA6W0UbwB8+fPjKK69UFKUplauqqqJsLlEKCgqCwaDP50t0RxBCqFU477zzZFluYmXO+XnnnQcAeBVFCCHDeeedRykuZUUInbFoA/iHH35YUZSkpKRZs2ZddtllaWlpMelWa7Nv3z6Px5PoXiCEUCvSxEe3AEAI2bVrV4t2BiGEzjqMsUR3ASF09ok2gN+yZQsALF++/IorrohFf1qv8ePHjxs3Llaf5vF4jKt2SkpKrD6zKTjnbrfbarU2fegsJgKBgHGvn5SUJAhCPJv2eDySJFkslng2GgqFQqEQAMT/VPv9fs653W6PZ6Oqqvr9fgAwmUzxP9WKojgcjng2yhgznuhJkmSz2eLZtKIogUDA4XDEedzG7XZzzimlxqn2+/0zZsw40w+ZPn36sGHDWqhLcWP89G02myRJ8WzX5/MZKxcS8tM3m80mkymejUb+atjtdlGMTb6eJvJ6vYIgWK3WeDZq/NMGAIvFEv9Tret6UlJSPBvVNM2YjyPLcpxPdTgcDoVCycnJ8WzUuPsCAFEUjT/Qx48f/+tf/xrPPiCE2owYTKEvKCho89E7AGRkZPTq1StWn1ZTU6PruvGxsfrMpuCcV1dX2+12s9kcz3a9Xm84HAaAlJSUON+K1dTUyLIc5ygrEAgYt2JJSUlxvhXzeDyc8zjfmiiKYgS0Fosl/qc6FArFee6Prus1NTUAIMtynKPHcDjs9XrT0tLiHMJVV1dzzgVBSE1NBYDmzUjKzc2N4VXU6BKlNCE/fYfDEednc263W1VVAEjIT99qtcb52ZzP5zMegyYnJ8f5WYnL5RIEIc4BbSgUMgJam80W/1OtaVqchxNUVTUCWrPZHOcnzsFgMBAIpKenx7NR4+4LACRJMv5Ax/kCghBqS6INpVJTU+McgiKEEEIIIYQSi3GtwlvsCVWqejjVmpNua28S4/oQH6FzU7QB/EUXXbR27Vpd1+M8LxohhBBCCCEUf8XOHev3vr7zxHq/4ooUSoKpZ/aQS7pMKuwwggBJYPcQatuinYZ33333BYPBxx9/PCa9QQghhBBCCLVOIdX3P9/c/ejnY7898mHt6B0AVD3884n/vLzpd4vW/Kbce7buG41Q6xdtAH/ZZZc98cQTs2fPnjdvHuZpRwghhBBCqE2q9pc8vuY33xWv4MAbqXao6sfHvhhXVP5Ny/Vk9uzZpAlyc3Nbrg/x9NVXXxlHlJ6ebuRDadC7775rVIthxpmIq6++mhCybdu2xqstWbKEEII5GltUtFPoV65c2bNnz+nTp8+fP3/x4sVDhw7t2rVrZmYmIQ3PnJk1a1aULSKEEEIIIYTiKaT6X9hcCOKxAAAgAElEQVRw2wn3vqZUDijuFzdMn3n1h3kpBS3RGbPZXCfzorHBU50tQuKcaDYOnE7nmjVrfv3rXzf46nvvvRfn/sSTruuiKKakpBiJhM9l0QbwY8aMiXztcrlWrlzZeH0M4BFCCCGEEDq7vPP930pcRU2vH9b8Szb9fs6vvxBp7DeSmDVrVp2YIj8//8iRI+++++7o0aNj3lwrQSlljL377rsNBvA+n++zzz4z6sS/byieog3g47z5B0IIIYQQQiiejtb8vKV4+Zm+q9x7aMOBpVf0uLUlunT28ng8mzZtys/PP9OJ7r169SovL1++fHkoFKq/IfQnn3wSDAaHDx/+5ZdfxqyvqFWKdg289wzFpNMIIYQQQgih+Fi/93XOmzOuu27vazHvTNM98sgjhJD6ybanTp1KCIlMHDaWji9evPjo0aM33HBDRkZGenr6mDFjjApHjhyZNm1anz597HZ7v379li5dWr+h7du3T5kypU+fPklJSRdddNEf/vCHsrKy2hXeeustQsgLL7ywZcuWbt26jR49+s033zzTw5Ekafz48R6PZ/Xq1fVfNebPX3/99bUL//WvfxFCrrnmmjqVy8vLRVG0WCyRFGa/eAgRX3zxxfDhw5OTk9u1a3fNNdd88MEHjXebMfbee+9dfvnlHTp0MJvNnTp1GjVq1KefflqnWlVV1cyZMwsLC5OSknJzc4cNG/bhhx9GXr3uuutEUQQAl8tFCElKSmq80bYt2gAeIYQQQggh1FYxru88sb457+RQ5Tt6RhPvE+jAgQMDBw4EgLlz544ePXrlypVjx4594YUXBgwYUFZWdvvtt9900007d+6cOnXqxx9/XPuNr7zyyqBBg95+++19+/ZlZmZu27btpZdeuuCCC+qPhJeXl48ZM6aystJkMqWnpzejkxMnTgSAZcuW1Sn3er2rV6/u1q1bv379apePHTtWkqQ1a9b4fL7a5e+//76u62PGjDHSBDT9EP7973+PHDnyq6++stls5eXln3766YQJE+69995G+jxz5syJEyd++eWX4XA4Pz/f5XKtXr36mmuueemllyJ1SktL+/btu2jRoqKiotzcXF3XN2zYMH78+MjDlyuvvPK2224DAFmWp0+ffvPNN5/JaWtrMIBHCCGEEEIINazKd8wXdjbnnQQA4IhzR2z700Kef/752bNnv/3223fdddebb745Y8YMxtidd955yy23rFy58p577nnxxRfnzZsHAG+88UbkXYcOHbrzzjsVRXn44Yc9Hs+hQ4ecTucNN9xQUVFxyy23KIpSu4mnnnoqOTn5P//5j9/vv//++5vRyWHDhuXk5HzyySd+v792+YoVK0Kh0MSJE+vkEU9NTb388svD4fBnn31Wu9x4BDBlypQzPYTFixdfeeWVZWVlJ06cqKmp+dvf/mYUrlmzpsEO79+//8knnzSbzStXrqyoqNizZ091dfVTTz0FAI899lik2kMPPVRaWjpu3LjS0tJ9+/ZVVFS89tprADB79uxgMAgAM2bMeOWVVwDAarW++uqrzz//fDPOXpsRmwBeVdW9e/d+8cUXnzfq66+/jklzCCGE0LlI97NwBVNqoNE9nBBCKIbcoYqo3h4sj1VPWlTXrl3/+Mc/Rr41EsU5HI4FCxZECo0MeYcO/f8u93PnzlVVdfr06bNnzzbWpScnJ7/11lv9+vUrLi5+9dVXazcRDAZXrFgxfPhwQRCa10lK6XXXXRcIBOpMQTfmzxvj83WMHz8eAD766KNIyfHjx7/++uuUlJRRo0ad6SEYjw+ys7MjJ+cPf/gDAMyZM6fBDn/zzTcAMHny5EjiPVEU77vvvvT09KNHj0bmBXz77bcAMGvW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rA7GdI2bjGlOWK76o5wbDJgblSveWCMoj9Z2Vv3xkjs0WH1mvLFnrL5rsLo1lP5CDzQhIeEQ4mz/EtBL2XjobP3CnHdm5nzmM59BxM997nP7tF9yySWIeN9998V/xlvHv/SlL/X19V188cUtLS3Nzc3nnntufMDu3bvf/e53r1u3LpPJrF+//q677trf0GOPPfbOd75z3bp12Wz2ta997d///d+PjIzsfcA3v/lNRLzlllv++Mc/rly58pxzzvnGN75xsMPRdf1tb3tbrVa7//779381zp9/xzvesXfj17/+dUT8m7/5m30OHh0d1TQtlUrVarUZDiHm97///cUXX9zb25vL5Y4//vgbbrjB9/2Z2zr//PM1TQOASqWCiNlsdu/Drr766hNOOCGTyaxYseKyyy578sknD2p+jhzmYMn85JNP3rRp0x133PGBD3zg+uuvf/jhhy+66KLpVzs6Os4+++zvfOc7N9988+xtJRxGIGDObEkbOQ0VMTNg2TFpOmB6UuQ1jXENEOrAgUgg1okBgQWKE0kCE6mZyTSqDKoMkAZkg7JBFZhgBDXUKsRHwGgQY4gcIQI2Afqk1GvIJYJgFkdLYyYS40wzocidxUyZoPk+75NCBsIPooagEAgAMJL+zolN//2Hjyz0nCUkJCTMMUJFblStuGOWlm6yW03ZGPXKDVFneo5phUD6kVEcKT/RzFNdrScrnvVFvTXTnTabWzOLOnO9aztef0z7GZ35XlNLF1JtGbOYsZoGK1tGajuHq9tr/viE079j4tHB6hZFcqHHmpCQcGgg5Q/9+KWdKupbRP2Zue3OIWL79u0bNmwAgOuuu+6cc8657777zjvvvFtuueX4448fGRl5z3vec+mllz7xxBOXXHLJj370o71P/OpXv3riiSfefffdW7dubW1tffTRR7/yla+86lWv2j8SPjo6eu65546Pj5umGQc7D5YLLrgAAL797W/v016v1++///6VK1euX79+7/bzzjtP1/UHHnig0Wjs3f69731PSnnuuefGMgEzHMItt9xy2mmnfetb3xoZGWlubv7LX/7y8Y9//JRTTomDtTOxdcYZZ1x++eUAYBjGFVdc8a53vSs+ZuPGjccdd9zNN9/85z//ub29vb+//+tf//prXvOaw2JX//wzNzlvbW1tl1122Ze+9KVrr7322GOPnW7P5/PDw8P33Xff+eefPyeGEg4vMmZxUWEdA/KjWkQRYxrnBjAdjKIwOitavplFRZAcqAJaCKgBIYIOQAAWqRTINKg0yipxD9ACZQC5iKggRCYIiFABoSIDlAkSOBDjkqUUMMuwOTLGNFDKkxMeH6jDHgPThmGF5EdUEypCQgICUoBASI+PbKx4ows9ZwkJCQlzicEtoSI/ahjcDJTS7R6d/Eg4KqwCKGH1bK31ydSiIL0kMJoso7i85dUaGqs7TlzfdebxS/7mNYvOXtv6hnyqHUApUkTKDSYBec0bQ0QArPulsjsyXN02UNkcCHehh5uQkDD3SHe38p8nGDtDosnDo4zFzTfffO211959991XX331N77xjSuvvFIp9f73v/+yyy677777PvjBD956662f+MQnAODOO++cPmvnzp3vf//7wzC8/vrra7Xazp07S6XSxRdfPDY2dtlll8We7TRf+MIX8vn8r371K8dxPvKRlxI3Ou200zo6On784x87jrN3+7333uv7/gUXXLBPseRisfiGN7whCIJYpGyaeAngne9858yH8MQTT3zgAx9gjP33f/93pVLZtWvXli1b1q5d++ijj372s5+doa0rr7zyq1/9KgDYtn377bfH8V3XdS+88MKRkZF//Md/rNVqO3bsqNVqH//4x8MwvPTSS3fuPFRSiIcv87Rp7eGHH37rW9962223zY+5hJcJOjeP7j69q/VEzWxNIy/qRrtm5Th6zHbsxQZP2wwZYoHJDCgTVQFkgYSJRAANQJ+YjsoHlkUpEAPAKnAXtCryDEkbiRCJQHFUgAJZSAg8ZZvNupYSKrD0DENNgHBFxedDBEIJiBoZVLrSA0IiAAAgBFBIRFEU3LrxvSPV7Qs8awkJCQlzAEXSFyrKp9q686tC6U04gwFBMdWWRcbcQeUPabk1dTQkM8rCbygabfQBQHtmyWuWnJPSMjmr7ai213YVVmlct/V8W3bZQHnLk8MPbhl7eNvoH3dPPj5ceWbT4APbxh/ZU9r0x90/+dnTtz64/a7dk5siGSz02BMSEuYS6Q/P7vShuerJIWXFihVXXXXV9J+xUFwul/vUpz413Rgr5O3tUl533XVRFF1xxRXXXnttvC89n89/85vfXL9+/Z49e26//fa9TXied++9955++umcv0RhP8bY+eef77ruT37yk73b40h1HJ/fh7e97W0A8IMf/GC6ZWBg4Le//W2hUDjrrLNmPoR/+Zd/UUpdd911f/d3fxf3v7e3N/bGp1MSXtTW8/Lv//7vw8PDF1100Y033phKpQDAsqzPfOYzl19+eRAEn//851/KTL2imScH/t577/3hD38YV5hLOKLIW60nrvlgd8dZUWpFZ6rbLhwD2aMjLQfMAtQ9MhQywZjGKA0qQgyRMaIKaB5pDrASaRqRJEAACYiEDCAERkgmEQcCRFAoET1CgTxSIQIvmG2MOAJjDAxmG7pVzLS05jsiXvX0baqwmbAOCoAUIYACImIEhLSn9MQPH//CWH3HQk9bQkJCwkvHDWsDlS1D1W2DlS2TTv+yllet7/nrrNWcNouYXlzsOi/TfprRcjLP9qKe07gBCBON/klnsOZPNNmLljYds67rDas7XteZX5nSs4okoayHJamiqj8eSjdr5RtB+enR320b/1N/+amB8uaB0hObh3774NZv3v/0rb/d+d0kFJ+Q8EqCZidyQdKbq54cUl7zmtfsHb5uamoCgHXr1sUu5d6NUj63Y+jBBx8EgA996EP7vNvVV18NAPukoJ944olHH330LPsZe+n33HPPdEu1Wv2f//mf1atXH3PMMfsf/5a3vIUxdt99903H0r/zne8Q0dvf/nbTNGc4BKXU/fffzzl/3/vet/cxJ5988mc/+9nzzz+fiGZi63mJt/TH5vbmve9973T3EvZmtir0ACClvOmmm37961/v2PH8bo/jOLt27QKAV14xxoSZkE215JtP2eNWxhnLpVvShiHcoYLdaWu/7xurBiqyQGgYcoIy8lAxDckDzINUgCHwScAeCCNiDeJ14AJYHbgLzEYpiSsAYKAUKiLgShH4YcXSdM4NBZKDARilkLfZdtUvBRAFvBypAEGBAiBEAgJgHEkREBDKp4YebM32vOXYj3I2B9+OhISEhHlGyHDC6R+ubdN5SikhVLii+dUrWo5vSS+KVKAzM59qt/Q0ABARQ5bSchy1IGpwpvlRo+aPpr28pWeyZpPGjbI7+oe+70oWVMKRvN6iMb0ptzJvtpW8cSHDMPJ84SChpIiI/Kg6UNnsRvXmTNcxnX+10DORkJAwN3CrfXand85VTw4pz+unHNh5CYJgcHBQ07Sjjjpqn5fWrVsH/ztWDwBLly6dbS8BTj755EWLFv30pz+t1Wpx9+69994wDJ83/A4AbW1tp5xyysaNG3/1q1+98Y1vhGdz2i+++OKZD6G/vz8Mw56enngJYxpE/NjHPjZDWy/E1q1bAeD222/fR9jP8zwAGBgYmMm0HFHM1kVRSp133nk//elPX/RIwzCSMnJHJghscWFd6Hsjzg7DLnLdbikcJ1WQQbU0GBNuvx9WTRA+8UAxgUyQYgg2KiLwASJgJdSQIOKsorRJ0uvAJDAHuERAIElISBxAEQCRgCBQQSBdRrrBgKIAhazWtoWiXpdCoCEoUiQZIkkgJMaAiAABAYAgUsFgZftgbdviwsHV9khISEh4OeBFdSKV1gtZq5lIjTf2uFG9Jbu4XV++z5GImNKzgWxMNgbzqQ5Jkkj1V7eU/dG0UejKryqk2p4c/sWTY7/UNRMY9YVPttqLAZilpYUIiCQgV1ISqkiGlp42tEzaagoid7Syc237qckyaELCKwNuL0NmknqJu2N4dl/P8BXDyMiIUqqtrW3/lPjOzk4A6O/v37txH+/3pYGI73jHO77whS/ce++9l1xyCbyA/vzevO1tb9u4ceMPfvCDN77xjTt37nz44Ye7u7tPO+20mQ9hz549ABDXHTswB7D1vIRhOD4+DgB33HHH8x7QaDSUUowlxUqfY7Zz8aMf/Sj23pcsWXLZZZe99a1vjZNPLrjggiuvvPLCCy+Mr3Qmk/nd7353yimnzL7HCYcjlpbpKR7T23LSsqbjWtLdwM2KjMa1TpXubUo1t2qcAUoEA8giqQADYoFCQjRANENUAz4B+ojUx0ivAUNCQRARKkKNEJBAxUp0AECSelYLaAAAIABJREFURBi5GpoMWY4ZzZquc6umgoYSHICRRCBAIgXAKU6VYgQIQAQECIgld7BcHyCgBZ61hISEhJcKMgYAiAwAEQDo+W9ozemuztyqrNVcSHXkrZa0kfPCetZozphNQ9WtQ5Wtu0tPAAAHjUgRqZH6biea2FN6uhFVCMBghqlbAIAAihQyBEJCCFUQCOd5LSYkJBx2oJY22k5/aecyvWC2vH5OuzMHlEqlOXmfjo4OxtjExMTeSfUxY2NjsJ/Hu4/C3EvmwgsvhGeD25VK5YEHHli3bt3atWtf6Pi//du/RcR7771XKRXn3l900UWxSzzDIbS1tcHM5u0Atp4XwzBiQf56vU7PR+K9789sp+O//uu/AGDlypVxJbnvf//7V1xxBQD89V//9Ve+8pVvfetb/f39l1xySaPReKFllYQjhJSW7cisXFRcmzGb6n6pNbO4pXk9tP0f0fJXjtkzwdJDZIySPgHaMOmDZE6AUSauA2NIGuEkcEAghYHiDYUCgAAYkgGKEQJg7JMjYwToRY2APFMzM1raRo4AtmZqqGVQWNPri4hEQAqIUCIQAU095Eo3rA3Vtu4Y/3Pdn1zIKUtISEg4eCw9jYiOX67745PukCRh6mnE5/+5Z6h15XuLdqfOjZSRHW/0deVXps181mxiwD3hBpEXShcQhIr80AGQQsjO/MrlTce0ZhcV7PZCulvXTE2zhBJKkZKRznSN62P1PZPO4DyPPSEh4RCRWvKul3aitfgiYPrcduZgof1WMLdt2zYn72yaZnd3txAiTgLfm6eeegoAent758TQPhx//PHLly9/4IEHSqXSD3/4wwPkz8f09PRs2LBhZGTkD3/4Q+xUT+e0z3AIy5YtY4z19/e77r4SJ5/+9Kc//OEPVyqVF7X1QqxYsQIANm/evE97GIaDg4MTExMHPv0IZLYO/Pbt2wHgiiuuyOfzcUusMfjQQw/Ff2qaduedd/b29t56662PPvroLM0lHP6gIsmRa8xARJZesok1/QmKu6TugC6RVYD3gyUAdVQMAUHZQBopRcwjBowAgDPQFAKCJHCRITLgnIgRQ1AAqJSSkXAbQc1gukFhgfMMok6hCzyQkgA46hpqjDHUAJFwagUgjlRRI5x8eNe9v9h6x8N9Px6obJYqWuhJS0hISJgpOreKqc6O3Iqs1dpsdy0qrG1Odx/g+EKqfUnTurbsUieoZMwmUiptFELpK5C2lm3LLlVEk05/xRkRKmCoZ62mrvxRx/W8qatwVM5q6UgvWdb06p7C2tbMoqzZhJx3FdcU7M7Byuahypbh6rZElD4h4RVAatE79OJrDvYs1DLZNf9yKPozQzRNg2fTv6fZuHHjXDnwAHDqqacCwJe+9KV92r/85S8DwOtff6iyDy644IIoir7//e/HTvKLVuyO9eFvuOGGTZs2rV69eu9y8TMZgmmaJ5xwQhRF++jq9/X1/eu//utdd9017Qke2NbzcvrppwPATTfdtE/7DTfc0NPTk6jQ789sHfhYV2Bv2YM1a9bAs2oEUzYYu/rqq4korjSQcCSDgDq3JIlGUPIjp+wMKbQ8KTIcWrlIg2gGmUORhUgDpRT4wDiQjhSH3AsgLCYJQTDSCCPiRFyhZrAUYxwJiClQCACkSCkZcZtZbT1GqoszYJYCDbiZMgo6M03DZsBJgVIIBIym0ugVkVBi0h/eMfbIY/0PbB757Wh9F5Fa6JlLSEhImClZq7mrcFRrZnFbdllXYZXGjAMczJnWlV/VZHcd3Xlab+sG00iP1ndPOgOduZUZu8nSU2ktL0hYWqY5s2Rly3GRCKTyu/K9r+k569ieM9d0n9qRX3HCkvNev/LCV/WcuartpA09ZxvMUqQ2Df3yqeGNw9VtXlSft7EnJCQcGjB//H+hljmoc/Lrb2bWi++aPnSsXr0aAO66667HHnssbtmyZcu73/3uAyiiHyyf+MQndF2//fbbb7zxxiiKAKDRaLzrXe965JFHFi9efOWVV86VoX2Is+hvu+22X/ziF8cdd9z+EnT7EDvVcfG5uCT7wQ7hhhtuAIBrrrnmu9/9bpzUMDo6eumllxLRRRddtPfugAPYmqbRaEyXsv/oRz9aKBTuuuuu6667LpavJ6Jvf/vbN9xwg2EYl19++UHPziud2Trw8crW3ixduhQRn3nmmb0bX/WqVwHAL37xi1maS3gFUEx1dOZ660Gp7A1nrZaGO5RhYAMbA6uPzHHQm0FwQACcRG0C9ApoOqg0yjxKE0gCEmAKAVDpDASCzg1dSyFqAAgKEIFAEVCk/PGwqswlgb0ytFd2FtbmcyvbcysQSOO6lKBIxHnzAKA4YlwanoAUeWHdF7WyN1JxhqreqJ9s5kxISDis0JhuG/mUnokFOg8MQ561mlszi5e1rF/e/OruwqrFxXVZs0mIwOKZjtwqW88yhi12D+cW41xjuqVnegpr1nWe3p5Z3tu6gSE2pbo0Zlia7UWOLxpldzhtFjJm01BtW8md+yrQblgdrDyzY+Iv28b+NFB5eqS2s+QMjjX6dkz8ub/0ZNkdVrTvfs6EhITZoOePLZ5wN3Jrhsdn1l6bWnLJIe3Si/LGN77x2GOPbTQaGzZsOOmkk9avX79u3TrDMD7ykY/MlYmVK1d++ctf1jTtox/9aC6XO+qoowqFwje+8Y3W1tY777wzLqt+KDj22GNXr179yCOPRFF0APm6aVasWBG7Y7BfTvsMh3Daaadde+21ruu+4x3vKBaLa9asWbJkyYMPPnjsscf+27/92wxtAQDnvKmpSQixfv36N73pTQDQ1NR055135nK566+/PpvNrl27tr29/aKLLoqi6I477njRtYkjkNkqxPb09FSr1TiRPsayrO7u7oGBgb6+vsWLF8eNxWIRAAYHk+1wCWDpme7CqnyqVSkpKRqvr+yfeJBA1hQFBA7ynAIdaVTpDMhnrKZYChUQIkAAaCjyGSmCDKoKMQ5cSUqZGQ5YlZMEU2n0iARAVW+Soznqo63nMqm2Y3PLx53+ijPiR/VA+IQEDKe0nRQSI0YAgIQIBH7kMZzor27JWM2caavaTlrgiUtISEg4xBjcassujf9f9caHa9uL6c4oUD7V3KDEOU+bBZOnmtOLAQCRpfRsSs+ONnYVUp2KpMaNmj++c+JRX7pImLbyJXfIjxyDmW2ZpYqkG1YByNKzKT07m356UX1P+cmnhx8qOcNOWGKoNWe7Rqp7xmrbpZI5s/nVi9+0ftGbugur9zmRgIgUw33FlhMSEmaC2XlO82m/Kv/+fOkdqLIX8lR+/S2ppS9x2/wcYlnWAw888MlPfvL+++//y1/+0t7efvXVV3/yk5/cuHHjhRde2NXV9RLes7u7+6ST/tcz4ZVXXnnCCSd8/vOf37RpU19f33HHHbdhw4brrrtuJprts+HCCy/8xCc+AQfUn9+bN7/5zZs2bTrppJOWL9+3KMkMh3D99defeuqpX/nKV/785z8PDQ0de+yxb33rW//hH/5h/4yGA9gCgNtuu+2f/umf+vr6puP2b37zmx977LFPfepTf/7zn7du3drV1XXmmWdec801Rx999Mwm48hitg782rVrn3rqqa9+9avvfe97pyslrl27dmBg4Gc/+9n73ve+uCX28FtaWmZpbgGRUsZZJXPCtJzGHL7nzO3O7VhmglJTKehCCCICwLTWBAAEZGvtBrd9EZnE6sg1oBpyCZhiPK0kV5BlchdYo6BrAG0Y1pHXgQMphQAIisjkRqGe4WXbjsDXg3rGVbqIE+Kl9Egp5FrZG/FEreqNSxVKEqH0CSIAQCAiBCQkIgXEARUBEiAAYigcX7h95adzZnt7etI2DlQLdG+mlTwXaqrn2ej0eJVSR8J4pz/PRLQgUx1F0YIosk6PN/53f1mgA3OIvg4LcvWFEHMlJjxD9v7VmJ+rL0RUbow2eNkLXRPtkhi0wgYJVUh3ZYyW6WkPIn+yNijsaKD8tBc1qt5oc6bb1pvq4UTFHRPkhZHvhjWGuqnZk84gAuvIrchZLYXUgR5t9/7VmGohqUhypiNg38Tm3+z4dsUZmvCGvKhBRE8Pe5IUByUBa8H4xNO7xxt9r1t6YUd+RUrPAQCRKnnDblAhIENLFVOdpmY/r+lY9Hih7qIL8qsx/7ey5y7rAk31gjx9wV530XgGDvYu+nJAb3pt6xufdrb9h7P9JhXsqy6GPJVadGHm6E/wVM88d2zXrl3P297W1nbLLbfs03juueeee+65039ecMEF+4vAve51r9v/Ai1ZsuR5y5KvX7/+7rvvPkD33vnOd75QMvlMOO200/bvzHXXXXfdddft03jCCSe80OcqdsdeSFLuRYcQc+aZZ5555pkvetiBbb397W9/+9vfvk/j0qVLv/a1r73oOyfA7B34q6+++rvf/e62bds2bNjwnve8J85IOe20037+85/fcMMNZ5111uLFi2u12o033ggAq1atmoMuLwREFARBtVqd83c+FO/5onie53ne/NsFgEajsU9L3uwZFWiRJpGAgAjqwKqoZ6Q0mJajKAWaQ5oCIAQBzESyQOlIHjBFjBCaS4We8Q4+4reg5ZthX8/gZLER6REKjLTAEzVTGkyBrxw3qBGQHzUkCQAkUAgIcRo9IjACBcQACQEICCSTIgo1sAdL29vNowqpg/6h3V+rc35YkM8VAARBEAQLIFi1UOONomhBTNfrC7OjWCkVjzfuwPQj+IsSP0x4njfn0zXdpXlmob7aMI9Xv+SNaZTum3hCqKDij6b1ljZ7NSNbk6latRpoU1e/Wiu7vjNY+oMbjY87/ZxzKUnRDl/5OhqWlknzplJ96An5EANWTHVljZbdY0+32ItVVuM4pU0tVBSIBoEyuG3w1N7dcByHSFX8ETeqAgBnGhA8OfrLHeOP+pFHqIgokj6RYgikGENSigLyn978S2/reJu1pKttXcuyFePBYGWkvzS+SymlacbSJccv7zlZf4FkYCnlQt1VfN/3fX/+7S7UeMMwjLe8zjMLNV4hxN530f0Ldx0WoJbOrPmXzOqPhZO/jUqPSm8ASDCrQ8sdbbafifz5l8YSFpZarfaDH/xA07QZhusPF1tHJrN14F//+tdfdtlld95559atWz/zmc/EDvzll19+ww037Nmzp7e3t7e3d/fu3bFKwXRA/rADES3LijcCzAnVajUOL8zhe84EIqpUKrZtz6F6x0xwHCf+hc7lcpz/r9zF0ShM2519zu5ACYWIQA4wpdAjlpaRzWkMNBNlFplFZIOsA8uCbCCPgCPwTJTqGG9p2ZmaTDW4YlzCoj3drrVbaBFwIEUNd1Qw21RM6MzQU54MhAqAEVC86R1xaqEyduenFhEAiSEhGKHyGZOLWnqbim351Ewvlud58RNYOp02jAPJR805jUaDiLLZWaWnHixRFMVLM5ZlpVKpFz1+DvF9PwiCvbVP5wEpZa1WAwBd1zOZg1P0mSVhGDqOk8/n5zkCX6lUiIhzHmdaxd/i/TVQXog4WG3b9hze8eIuMcYW5OpnMhldn9fCSPV6PV4xmber7/NJ3YXVna8dLO/QddMy7aWta3RuNYLJdM7OmlOXUmhdffVUXcBIZadQfhSFblhjnFk8Xci12FreE/WQ/HLQ32R3C+ZIPZ3W0plMmgxXAENAjel+WCKmRmrbO3IrTavV1nODk9vdwDG43ZLviFSDp5QvJzka5ajkB7XNE7/xQzciAUCSIiIJHEgCA84IAAgVBeTt9jeN1XYNjTyuhnnDjuySwepKycBW9pOV4ZRtHdt71v4F9mq1Guc8nU7PwyRPEwRBvCqUSqUO3abZ58V1XSHEdBLl/CCEiD1Y0zRte179vXiJpFAozKfR+OkLADRNi3+gy+UyPHsvPVxBbrScarScutD9SHgRpJRSymuuucbzvPPOOy+u6P4KsHUkM1sHHgDuuOOO448//q677prOXeno6Lj11lsvu+yyMAzjEoIAcOGFF75ohYOXM4yxObzPTudezvO9O/ZV53YsM2F6vPubtvTUpGwETG9EBDzOXUSLqxSXPrFB0g0FOleMIAUCAVKkdBYJQgmgdLtddHZXOh2zXsk5KFWhnPEsX5OADIgIEaVSgXRQS4NU1WhCMKkwrvlORLGMIxIRAgAjIAAFxAiBKwKN8UA6jahqm4VCumXm2yanH68Xaqrn2eh0DAERj4Tx7m19nk3HHy3O+YKk0MOzUx3/e7A55Ifo67AgV38B76LzdvU545aZaU0vdtyGYtLQNAIVSKersMrS7enhG0bKMEy/WleoJCki6Ys6KAJiSspsutAIJw2mdxeOUhQFym0EExV3cKy+s5ju9qN6ysgZ3Jx0hvJmi8aN4fo2R1Q8v+r4znB1RyjcZcGrEFUjrC5vWW9wq2/wqcf6/scJqiF5ACApjLVHUcXFQJUCZMQQuNSUmxaOGh+lEaUUd1lW5rOh1TbRxEFpI/5meqB3yeuydvP+U71QX21YoI/W/I93eovEAt5F59PodErz9HjjbszzTpyElxUf+9jH9tF+eyE+9KEP/cd//MdLNnTWWWdt3LgxCALDMPZPuZ9b5tPWkcwcOPAAcNVVV1111VV7byi65JJLVq9efdttt+3cuXPZsmVnnnnmRRddNCe2El5hGDylCEJFGicCEIAEyIg0BIeYACQAQ4LNhAksUFhmmiVpmQjGJZTJL7A8T6WUW097KcmlFRrDHeOBKVQEyACAAImIBxQKEIpkrFCnAIEAkICIETxXIy4uCA8ApBCZxa1cqnlN20lr2k+aD9EjReRHAICWDiz5UU84JMjIIyWZbjE2N/f/hFcqtpHrzK0cre9G4Ba3OWdOWFnSdEzKyFr6c9HprNncZPcI9QcloyBykGlESkmSPIwoGmnsVqSyZrPFLU+oofJWW88F0nOjmqmlW7OLWnHpQPlpAPTDmgBhaRnHLzlRNQjCMHJK/oAc87Kplki5o7WsE9Z3jm4KgiAIHUmKQBABMEKEWI8UGZACjbgmdcVUoPzYsyciAoVhlK0XJwulSFe5IGs1YMeuh1b1/tXM9U0SEohkbWK3CN1Cey/X5jVXIuEVxgc+8IG4FNyL0traOhtDRx111O9///ve3t4bb7zx1a9+9Wze6mVl60hmLh/g9skn3LBhw4YNG+bw/RNekQSRY+hZYDopIRQpRERkQBSrwQNwBF8hAqZRNRjjhHakrAhsKT0ZlFk/NkeZhik11TKe7+serKc91/an9ORj/x2UVEKBmqr0DsSAFAAoIJwqGw+AQDAVm4epAotN6e7XLX37qxedY2g2AAgZVrwxoQKpIo0Zlp6xjbzO52YzArmh6K+AUACAOmc9eWbPa+59wiseJaP6xG4ZeQAAyNLFbtOe1y08CYcXuVRrJIP27FJLVZm2zE6ls1aTpWUyVhOBqrijblhVRLaRbc8ua0q178FNAMAQgekaEWOahrwlsyil56r++JjT54cOMm6ZeRnINOYkhW5QGYyeliAqjZFCpqvqjXpBjWm8PbOy3V4OxPQwbRpZS08PTT4zUN1acoaDwA1VIJQPjBCIgBBRSWCIiACKNKVpoUaohBaQksiQCBgSEEokN+U1bFdoSmii4Khn/vKrKFIrVp1YTHXsn0ufkLAPleHND91xeb08zFBx3T7ujf/Ue2pSoTrhJdLZ2dnZ2TkPhm666aabbrppHgzNs60jmYNz4K+//vpyufzP//zP7e3tccuHP/xhAJhNXkfCEU7ZG0ZC08gFfkQsIiBQ6AEPUWFcDU4RIwiIj5DRjJGmpIWSOPkcfEkQjDfQiFa1tPSn96ydrHCvv30UiAEQTD3OEQAQSSSQAMiJJBBDxDhVPk62R4pl6wFjCTsg4ExvzS5f1XZSPtUGAFKJkfqOgcoWN6y5YRUA8nbbksK6lswi25j1FlxFor8ito6ztEFE5EYaEVvVNoP6zQkJM8UpD5QHH+eahZoufAeINMPm2rzKYSQcRiBgS2ZRQXUYYiSXKaTt55Q1xhv9bljtLz8dqkBKv2h3dTet2T7+aCQCjhpjGjBI6/nWzNLFxXV+6ITCZciReKh8g6eElq55jqGnM2bzaH1X1R8NhDfu9ofKDyMfETlqURhmjWZFkZBBf+mpwcozTlgTKkTUQYXASCFBvFCriDFEACWRAYGiSPfj/VDAUIu0bM3WJI+4IhQRD5HIDLjt6o7llLZvDwbLpcefbDvx+FetfNNC7UxJOCxQMvzlVy/y6hPxZy4M6o/ed11u8fr2pesXumsJCQlHFgfnwH/uc59zXff888+fduC/+MUvQuLAJ8yCUAUR+Qx14qYSChUBQwkoiRAICQgYMSSiBnIg1QGCE4xKrcK5ABBApWw5l8+5TSJAT2Uytpv1QyeWJgYARAZACATAEBQjJEbISCmIxeelIkbIgYgBASEhICIDS0s1pTsMLR1vUasHk/2lpxQgQx5KH4gYsOHadkSWMnI4O1ebAgFCsbTB2rMAoEZqIBQFAq0kyTlhrqDIbyDj6WIPIAa8BECRX+eZxIFPOBAa0w1uM3zuXiSVcMPqnslNmmY1GhNjzp6xel9HbllbbpkbVgVJSSEjU2MGZzoCBNKx9JzJUkHUQGJSeZPOgK6ZOaulEZa9qCYoqvtlABkIjyHjTB8ob5nQRnJGPhBhCO5YfZcT1CMKgBSQIlLTKfNAgFOSJhgnXAkuAYgpphgZkreOFVsnCvH+44nWSi3bSAVGytc825UajeSidNCgbX5QrRoNWtmyQc/PqwJowmFEdXRn0JhAIEJAICBSpB79zkfO/qdfLHTXEhISjiwOzj0oFAqu695yyy29vb2z3I+RkDCFAi+sBVEglFKAihPGT2UqDoUDIhIREtRACxE80FIKKAChc00gkzyMzNGgkkqzQqrDNouB9EMRCAoA4rxJBWrqLZEBAZBCUAQUh2eIKQAkhUjq2SRMAIulM2YTKVX1R9qyiwFgpLp9+8SjRDIQHudGMdWu85TODUVSyHCuEuljnlW7OeiqdZ4XDQ7WPC9qKoi2jqydJOEf8RDJ0K0oKbhuKSWIVNCYCCNXhYGeyif6SQkvAUVCqsiXrgyrup4SKgyla/D0us43VL0xJ6wAkFIkQThhxYnKUoUmtwt2O6GoB+V8qj1rto45uznTGIJQYcOvhLIBBIokkSJCxjQvquhcZ8DH6nucsKJIQJwoBXEyPCIBYpxhhVNlRRCQ4hVblIw0BblqtqmUc9OekwrNUGuazHpmMFms1zLMiIzAjJgMfTPUIl4fb4iNQl8aNS1dqdlF6Ex2xSfsy/ju3wFRLJCrFDAGoKhe3bHQ/UpISDjiODgH/g1veMM3v/nNu+++++677967feZPgdM6nAkJMQqUHzZ8WZMUURwCB0AiBFTxhyXenI4ARC5oHpLBwEqB3SBi4KRUpAklw8BzJUhJilRIJBFAxXF3hcQIFcbPeICAoIiQABmSkoAcQQICaVxHZEJFFk+lzELKLFaDkuOXnh79TckZ2D3x+M7JTRyYJMG4FghnUfFoIUMAmAN9O1MDjSknhJEaEZEnUOdoHlyRKt+Ltm0d3751rFr1LbPUe1TrUWvas9kkvnrkIqOgNr6DlBjb+UdkPPJq9fHtUkQidDUjnS/tyZ2S7N5MOGg0bgoVRTJEAkAFgLqWCqXjRg2dW8VUR0RhwergXItUuGv8cUvPKojGGn2RcIFBc7rLsLJ2kJdKOn4tlF4kPQa6oAABABVDZKikFH5YM7WME5Yi4SPDqQ1RHOK6IQg0FXNHUgTxXTi+0wMAMYWBnnEsyaluB0AgNCF0RaAkJyNCoUtQFBqh4nK8ONE93Nqojm3Ch1f1+S0ta62cLlKpmRdKTHhl49XHSv2P1Sb64scKBGIYLyWBCpVTGUgXeha6jwkJCUcQB51Cv2nTpieffPIQ9SbhSIOAat6YF9WFihDjmLiKwyqEiIigpiuvQBx7IYBAQ6mRyxhjEDEJ4KJSTAk3rPuiIWXIkEkJQISIwIiAAVdTWZYExBkoYBCX1AMAYgjIdZ2bikBDJUlF0i+7/UTqicFfT3gDblBxo5rGzIzVSqAmGn0Fs7XkDuWsFtvI81mreSNDvqiAiBRJAACd80WFfbPyCVTZJS8Czlgxheb/MkqBGN0ytuPx4XLdNbJGJOTmp0cyWWv1mqQC55GLWx2ujmyWgRs0xsb7HkNgvjMBSmiG7dVHvfowN+zVp7ybaUmmRsJBgIAt6e6SO7Rn8nFNs9pzy/sqT1fcsSCq+1EjYxaDyAMkpYQQPhFEFHh+3TLSfuQAgpQCATXNMFg6Ur4QYcYo1v0JBqhAAYGAiEkmQYJwPeVEMoiLfRIQMlRTPwqEEP+fESmGQDCtRkoAwBCAQzXr8EgDUMjACM1Ij6SmbNdEAC3U0ETNB9+K/FTYsIOmEek/2bd1sWKF9mIjZ2XTQoh5Lsme8DLEb0xUh7cMPfNgbWwrIcXRgPjzRoTI1ej23y0//h0L3c2EhIQjiINzPLq7ux999NGHHnpo+/btQggAeP/73w8AN9988yHpXcIrnYZfGqxsliTjWuzIQD3300gIjKbS5wEIGMT5k0CIAgB1AEDkACoCIlLSj0LGUEk1VRE41jCa2urOFBEQMQSlpjbHIxIqBECucWSaoaeCyAFkyBiBAtJD4fVXNiNjtlFwRCMQjqkvzRmtiiTnmqWlmuxOg1u+cLywRkApPZvSX+L+SWYbuLIFAgFxGbl9vXcSe8rkhGLnJABoK5q1JU2YnvK7VCOQfeXJR/pLfZVsa8oGVHlrZLRRrXhSKs4TWaYjFBm6RBT4tcmBJ6x00akMR14VEZFpMvLrk7sa5cHywOMrTnxnx8pTFrqzCYcTxXR3R1B2wyoRDZQ3R5Fbi2pASpBshJVQOMPlbWmrSCRzqbZiqtM36xm9ONboUySb04tC6Y7X9yxvXqRA+JFT8UY4msSllAqJjoFEAAAgAElEQVQANORKKYaclJQqjGuDkCJkqOI6IQjACGW8C14RIkOiOHcLnsurjzRRyzSQIO2mQiMCyeo5hzhYgeEZoWf7XDFkCECCJDGVK9vFgWbjMa5rj/EThHdyZC1qFq1aEoc/wgmc0vjuP3mVYWQakwAs/qyBBGRIpGBy4PGl69/CeLISmpCQME8c9M+SYRhnnHHGGWecEf8ZO/BXXXXVHPcr4chgtLZzvNFHSpECJFJx8bcpWSJSkmI3mwEAIDEkpZCxqZeJGAJJAEDgISkEIlScIM7EB0RkzyblEwHGoX0AmIrnExECATJQBCbqgfAUAWMaR85RFyrQuJY2i4yxtFlwo2o5GnHCisH0tJHrzB0FACV3WCoZSd+NagDQmVuZs1qK9osUBSFSofQA0NBSCEikhIo0biBDSD1/2ryqB+SEcqDCOrIUCrFjEk1NW9Ey9epIXeyY5PmUnvOwFiiDsZCKQaRPOlgPoJCam6uVcLiBjMvI9esTMvKkZgEJGQVAUoRu6NWQyPe9gSd/6pQH5Rle99r/s9D9TThsQMCewuq0kSu7I1JFkqKMsabsj5XdIakinacAoOQMtWQXmTyVMYs8QsvI22YOCTVucGSaZhJCa2ZJyRl0ozoRKakspjPUSCniLBKuAgFEDJFAIT5bK4QIEUihRIjrvjFFFK/UAgMgUEgM4tpxSicn5wpDSpBeKvTNwPZMiUqaEQGgYppkGGDKs5pLuUq2jgoKjZzrhdrPo8yE57xhmfYqTWtJ9sMf0ZCSMgoZ16UzSRyURM722sSBGNYno8A1E9GZhISE+WK268qf/vSn56QfCUcmEUWmbk9F3OM4MQEgoopT6NVU+B2REBgBIof46Q2QMYyV6BAVKQJAUKQYIZt6wCMFiIhA+Jy7P5XyxgBIxYEaZMRsM2cySwIFokGKGOMEghA404giKaHmTyCRpWeUEgqoLbPc0Kyu/FEEsH38EUVyadMxHPWx+i4AyFrNBxiyFzUmnX6pBABozDC45UV1AkJkhVR7zmp5/tN8IXZOstYMsw2wDVkLKJBABIigiAKBOm9rTucrXm2XY/VXdFNrI2gBkEuL1Ah4T2FuL1zCYYGZaco0LZnoewyRS+FbmXa/Nu67JSUiIopXsFQEk/2P7Xz4Ox2rTk1KyiXMHI3prZklKT1b8yfqwWTWaiGEydqAqaVz6TZFYWR3mty0zeLuyccIoLtgkVJOWM2n2nzh1b3JqjXWbPXkrJa0XvRFTYKoeZOIjEjVgxID9EQ93lBFU5rzwBBUfAdHAEmAjOKMenp2yxSgAmAERAigCEgwQD2STCEJRiBZnI8Vi4iDYpILLVdNl4u1esb1bD8oCyPUREmoJ3mOY1TMWokDf2QTK4D69VEpIsYYShXv08Cp/fCqMbmjMvRU24qTEJN8t4SEhPlgtg78NddcMyf9SDgyCUTDDery2SA5IEAsQcSBKVKxJnysHT8VVSdFsZ48KWJxmrwCQIZIRIxNKdURIQIwIEXIARSo2NMFBEIEUFM5mYCMENHU7MXFdZHwJt2RSHlAJElK6evM1DWr5k0EwuWaubTpGNvMWzzbml2SM5t0bgkV6sxQIA0tZfBUpAIACIUH8AKBdJKTTv9AZYulpQmo6o1nzKJSQtfMUARESmOGbeRAkWoEFElmGxjH5HWuLW9WY3XImBQIFUpNYxCLRzIEhiRUwdKP6czu2jORiYTtiXx7Op82oqdH9KM7WXOELxDbT3gFY2Va002LCx1rwkZJM1Oh30jlu0K/RhBSXORh6lslqmPPhG4llWtf6C4nHGaYWtrkqVC4XliNhI+cteWWdRV6a944ABGgG1YZaoZmI5ClpxWJgcrTofRSRsYLnTqfbM0ubk0vKaTanag6VN02Ut9edkd96QgRcqZJGU0txzIEJCUAGMQ39HidliGQgqm0LFAk4wXaqUg9B1CcQhBccV1oEReREZi+mWlYmjItT/NSISFxxRUDz4qI1a3AyFdbBQi3MWn/dndUyMolbbzZXuiZTlgw0oXuXNsq6dcnh57kzIq4CwSATCkVu/BOdaQy9FSmeUm6mEjZJSQkzAfJzq6EhaTmjgeiAShi3xwBVaxBpIAUwFQJdwWMA5EEYhTvbY9jh6SAkCEDVHHFNaWAM1KEHBUBAwRUOqYtM+2KmpQBxgr3sX4sIAESKEJsSXcrEhmr2Q2rFEmuoY52IN2MUcinOorpLi+s23pueeurm+zuSWcQSNX8cUCmMS2SPiBw4EQqkgEAcKbJFxhvIDypRErLFux2ACi7oyO1HStaj7f1bCDc4dr2tFFIYVruLlMoIN7DX0zxrjzLW2q8oWqB6KuSG/KevKwFPBCxlB1rsjVFYmepteRqvoBiyrItgxQM1ZVQoIj8xIE/Qsk0L+lYeTJjIMPAcyvjO3+vlCBFz24uQWQKENzamBT+Qnc24fBD5+aiprWRCkLpN6cXNdk9yDhnhqHZQkWBcNJmIWu1dOVXOmHV4qnRxh6pokZQESpY2bqh2e6OVNBkd2loNIKyhppSChSZWjrikSQpQZESCAxAkYq16Z4rZoMEigDZVCl4RYzFdUERkE3JoAAR41IgCVRcYrGWy9TtQiWrSZZppMdbSmnXEpzqOSfQIi3SFFdMIVPcbnBJbvDzLf6iJuvU5bwts4DznLCAMM1oXfrq0J0QUjZKfRC5RMhA8XgpCSF0qkNbftW6/MR0oRuS2pwJCQmHnsSBT1gwfOGWnKFaMKHUVEw8TgknDigJNCClpnTklcQ4ZT4WoyeK9exo6qdSIeFUnB6AMU2RZMg4MiQdAULlGYwHihOJ+GkvlqSPE+l1/f+z9+bRllXV/e+ca63dn/bec9vqW7oSQUDQRMWnI3k26YaxQ2yi0WgiJjpMjCbKb8SfTWITzVASNY+oBI0m+GIiSpI3oqJAiKCgQFFUUUXdqrrtuaff/Vpzvj/2rZJf0QSVqhLYn7/u2Wc3a+997917rjnn92sZymMTZjpOdBxmPUs67IjJ6lbfqU/XtxHrbrSAKEdJh5lH8SqgDOzaoc4dgDjmzVTd8ZXwUFHH6SjfVn6cxQ9z4j+2XSxMkVABQFF6x0C0OMzvXhKBDY7iQQIAWHFEzZWbx8xqaJYGZIgPdPBwnzuh/ZT1ohXIySoItGwljvT8xR6vhHamxUTFLAzJt6gfq60PV9Vf8jgGUVRaW1FaWdhdPfJDAGYiRsBCCYIYWDCw69ak+JndEEuekDS86dOnnr4yPAQC6m4rTIfd6Igl7FHWWRnNbWqc1fCnW8FGTfsRcaa+Y7KyaWl44HBvty1dS3losJ+0F/p7di/eEOVDYzQzkcmSbMDAlrRyoxEFMxTxeFG7XHRPFb/JRxVNEHGthKuoyVpbm9AACGRUxhv504vjE+2m1MJNnVzmGw7OKuaVyb4f2/V+VSBHTtqrjyojnxlkBpSZ/k33ZGHkn7PBmq5hK8BSFvSJh1ebnt7xzNWFu/IkwkJOl4GLOj+DKE3YP5RFPWbCn91WtqSkpOR/ogzgS04NxHr/0i03z30tNTFyEUwfVRomYMBiZpuZDYBYa4OEtWJ6KortARmJWawF9Ywg1qonEZWwLOkJFGQ0IkjhI1pxNgTJZIpNBAMJIZlgmHYppTFvVlNCbCRaY85MzW22R0cAYCrYgoBHunfF+cCWPpGxpJ2blIDSPLJqm1qVjYY1ALtWtelN4/EK8j/GUZ4UKsoHxIaBGXi6tm2YtHMriPPRTG27qyo0SgExHUcDmSUl718V4wHUXBQoaq6YrEoh9MFV0x5ykoumb9kSa66cqMBERbQC0R2YlRBbgZ4fiopFqxEIgaW4zhMYZXv1qZ2DlQPxYDFPQig6hAEYGaVgQ4ii1tpiBw+hv1BS8rD04sV+vFJMqY6SLrHpRPMro7lRsioQF4f3+k5tcbhvrrNbIkihiI0x+Sjt3rN8c8XejWgrqfav3tZP2lHaM5AzY6YTQmMJx7CxlENEIGxDCQOzBmBGgcxFXn6tP56BRCF0gogEJAork6JnChAACCRIJ7Xd2AIBi1Pt6iho9L0wSAzy2GrDyVVmGa6EUTUKK2HmaNNlJ87sPRj3MnP3SvX5u2SSq01jp/qSl5xsbK9WHd8crswh58XE0FE/ORACwFAyWCEyWE6DlpSUnBTKAL7k1DDX2/0f9/w/vXixeP6tybGt1fMCIwgEIkJx1PwdQTAcdZvDNZ85JBQIWqAAXlOYJ4GymCC3pANErh3YwqtVxjvhgpL2KO0ycjFXIIRQwrKVE+cjRLE8mgNGAgNIw6xLwN1knlnHesRkxisb6t6Ur6oLw3sVScOZJZ2csqXBwenazg2NMx7JWQuU48EGAChE7CaCjQxMbACg4ox5VrXijqVicdHMmcRGKShOfHJm5CYAYE3AAGmeH+yBo3iUc83Lbj4oW770LLMagSZ0FdZdXFeTjUA2fTaMnqU2PsBSvuSJhxCYDFeyqAeGCsluIkRkFCBtb/bM50qr9Lsu+YmJ81E/XlkeHvDsWq6TTjQ/TDqxHh3p7GZkKZzp2pZ9K7cYMsNsFYjCvH+wc0fdnVyJDtXcVpgNorwPzN1oPs4jW9pZnhmTAiITac6EsJCkkFJIO0lzYs0CJQALBlM8KYqnAgBgIV9aPB+AmRkEICMIKCaIAQBiL0kqUeoMa7FVGcnYj6QWU+1GamtmrA0CAHJibxBELOJc5I1BzQshGNhZnCb/sdv9lbPkVA3d8t3pCQeRDvuHmIihEGJYM7UBBhQIqILxjad0gCUlJU8gyodQySkgN8nh7h0Lg71MOTCTgOJJKKDQkkdGJgKAo4ZyhQEcIlPRFy8caWc6YyBk5sJ8jhCQAdGQQSHI6CjrujKwpKOU61u12vhUkg3jbNAOD8d5P6fckY5rVzxVj7NBokfACKhSHes8GaQdAUIJK80iN20bMpMmD6wGqYBId/Kl7cG6wG1aiZXoJMkG9z87Zkp1pClVwgEoCj5//K1nVdbVTyts5BzlAWCSh5pSSzqOCgBg4A7nxxfVQm5bfpwOpjaeEbuptyryvUv5D5fyu5cgzLDhghIcpial/GCXEq33tQFAbR1H1xLnzeBiCrYUUqht46IVnKT7WvJzDJks6i3lWYhQvIGiQERmoez69Jnrdv3fp3qAJY9J0ny0MNhXdyd9u8YOz3XvnO/fk5kkNqFnBXHeN5w70uvmy7b0LcsaZqv9pE1EtnA8VRsPpuc6d/aTdmYSARjnoc5Tg0aCQJCatSBCBkdUgHOBbAwIAVxoogAIRuK1f/1CAhkGYGGklSkShgUKI1gyEggEkUsk0Fbaq/WFjCZ6DU+TICtxuNmpKwO9xmoW9GcXJ4yEhck2IKiKiP20MUz9pToaTpcijokycp+2uZhcLnnikIza2ajLgAIYaU15p8g3MIPr1ytjZQBfUlJykigD+JJTQKKjJI81ay56Gn/8JAQAROSiv52xcIxjFMAEIAprdyFQGOYi6C/aHYs2+CLtUnxkYUmQjh2kOvHtJhFtnXxy4U5kFkymI5Co2Rijxxqz8/1Ip5pQE9NacbvOEdBTVQFiEC8TaUMpM3l2hcjknA2S1ZxSTXlRq3/s1OJ82B4djuJRkiQW2XZ7VpAFQoi6KyYrRfMkoihi9QLXCgB+/DGvs+g64+4mBHRwfDlYbiyvyj0m/tqd1I+pFwMBxoH1pHXSkTCuuBNnh/rCt7Du0nwf6gornjU7gbkBR8nJCrqlfF0JDFfnktGSkILYEjor5CWUEzRmzjzzuW/xatOneoAlj0mOiXcAQK6TUdodpm1tcgkizkYM1B7OeVYl1WHdnZQoG+50L15x7aqmvOa2AKQtXctyZaxGusdAgIyFHxyAAMlgUKgsDwFxzUCOi1osKhreUWIhVWcIBIMydnXkW5myU5ukibzEzR0Sxh95w1qkchl5USUSAw+GvnJCK6wkKrP92PZyA06qTWZxYuXCj7zcyiXJVOVG5qFZqvdrpofpN+8xg1j6tn3uulN75UtOMnkaIjALYAJmBkASjEVHklCTpz9byvJRW1JScpIoA/iSU4A2WTuci9MBFw3rgtGsVThiYd/LAECCsZB4hTXTXgQEQcRCGtCFHj0yoFBkNBWhP2PRGw8ClVCWcFBYrvQ3j509U9vh27Xr7/1CqgdF/BzrQU55N1oCIAJtTA5QqNQDMjNgqkcalK0EApOOUj2wpJVzXnPGibVrV5hZCduz1tSJDen26ND84B4wMo7CfKlr99rrva3AAJubuU5HzSTRI4Gy4oxV3XFgLqYA7m8eiyiw4aJflyAFj0Q/gsUo/e9lsxpBlDIhhBkEOfQiOGOKlkcgQnOkj4HNqZZTNWMb+dQN1vayn7nkx5DRRieWE9hOHVzIs0RnsVLW5LYLd170ytaWi0T56lnyU+FZ1dnajoXBvlRHw6TtWEHD37A82EtMYdoBkIjStSppPuoSIfIg6VhoCwRLuJ34iC8bg3Q1yaMi+GEmRgY2mo1EycBExIXqKAKCLIJ20oxKADEDgCn0GEEgIKClBTDkVi6NDIPID/1q6I1qYeJlmZUlDnMi4hi8uD7wUx4bRZW+nfqDWNrtClE1VlFeXTZCgXCRZXUU1A0KQiI2YAQIinL933OREPiWX1SzdayXjSdPFNZc3wlore+PZeGUKNXEpgvOeMbrT/UAS0pKnkCUAXzJKWCYrO5v32Y4Y2IUyAaw8PKFoyLCAHBMo4iKHAuCACYwgoG0UFKiLYRCZhASBKU6AUBZWMMLQEDHqjnSt6Rf9yY3jJ25feKCUboqQKaUzjS2EZnVcL6XLPWi+dxoTdkxZXtmFgLYsEEiJNZogWSOBuEhBoHAPaPr7iSR2dY6T6AaC9ZSMUk+Ija+VbOtqhMNlk17aPeTdSKQtfxguz09nM8XUAgGnqlt70YLCMjAiKLuTdbdiWInvl2bqW1fHh5Q0sl0PONsdtnNhgn3EzERCG3IQggz6kSwZ0kETnrjPEQ51F3Mjd69TJtq4szSzbvkOFhKJ2huytOwUK0Twprcev6u576tMXP6qR5byWMYW3njlfVCSEPalm6SR8ymHx1ZjeZzk3lWdba+o+lNh1m/KKcfZX0EUMrJTQbArcp6BKlQAQpXVQjyVCeGWCAzMAMBEheWn4ZAGEQkKtLzRx8UAtY8EQlsLVVuxV5aGI46qe2lTm7nRpjQT4xkqQUAhH4kXG3nnp9Y/qiC2haae/VRtx62x7uepmZo/HCjSCoGjDJ2NQxYsJEGM0QUkObpf9+Hn3PcZ++UO1toS/Qs0fRLqZHHN5RnluPn8RAAqBDZJUAhZnY+++xfemt1fPOpHmBJSckTiDKALzkFLAz39kbzxAQSiUAKYACBwLSWfUcClgAAzCQQiVgisCks4JEFSwBb+YHdYGCBmOlUG204J0QJSqIInHrDn1LCEmxtaOzaOPYkS9pNf2aqtuXupRvSPHaUC0yCBAsmkyEVjsJrMnlkAJEYEJA1MIPIKYuS9kAnCpVnVy3l+nYt1fG2iacUPnAAx3rdkZkHycrQdGwpVvLDI1P1JeaUOsIfq81qyg92fuSqAAAs6WQmZSZL2L5dB4C6N1lI3AGAQNnEljwSZvFQp5HpxOBKz9hATP0YDGftJZrvgyZWQlYcUohjFnUj1gZVKYdbsoaQVjC2zqmMVRrrk6gnUdl+ffO5L6pNbD3VQyv5eWGtxuknJ7Abvl3PTapNVnHGbtp/jabctxtKOlWnwcyB3aw549O1LQc7d3pKa5N2ooVWMNv01yEK1wJtImIthJDggoSkKL9iJm1YCkRmoCJoJ2KEonq+qLQHAC5EUhCAhMmcjJCZJAlKKplimak8tTNCdhObAEZ+ljpkm9TWEbNo9OrTi00AKw3aS9OrvXqcKzNYrU9y3hpY9VGgtOUmNgASEyADkwHG2CQ336dXhtZpU3JDQ21siqZnnT4NpcHc4xdUbn3ijPb8LUIT41r73tT2i576ovd7jdlTPbqSkpInFmUAX3KyyXX6o8P/2U9XyAAKAMNrsTqsWbwjAAso0vKIgpkBgQiKpDwJEMxG6xD6AGSLINJDQ5mUSpAgJiGEawXT9W2bmucg8GLvvoY3cyy/vWP8grsWvn3f6g+JSYAU0jJAdiJZSY0MjAwskFkAGURByAgsDBoGEoiUDkGIXKeW9Ct2s1XZOEq6dW9t544KEEWU9dNsZVUfGeiVauqtdg+1xHSS5Mu603C3AqASdk7ZYNTeMfFU1woyHS0M9vl2vQjgEXA8WNf0pw1pJW1kaFuLfaef+307FpwjZ7ZrV6AbUz+hdkhxDswIUvdC9hV3ejC3CsMMmt6DXv+SJybV8a0bdz1v0D4wWr0PAKdPu7gytlGo0l+wBPrx8iBZZTCWcMeCmfsrdDxCENCWri3dmjtR9VoT1U2+VevHK7Z0UGA7PFj1JgK7MeZ3VoYHGcgClZlUoYWAoUl6STtMe4AshSRmGx3HqcTZwLBGoMLxcE3iBOCY/iLzWr8VIgMgMWjBRmhhBCClbk5AkZPURgELzlAzg3HzXJrE1oIhSOW6Xs0LA604F6wFVBIGgSPPQuPEDiVePt6zrVwiISKSQG1ppdXarEEnSgdREkdVuTm/e9naOs6pts+aAbucOX18UmnOTmx7ajRaMMnI5CkjtTaf+wuXfNKpTJ7qoZWUlDzhKAP4kpPNDw5dt2f5vxgZkYFBqqLhHVgUFWkAgCBg7SUJirL6ohWeiprJotYeyIzSniXSIivPDL5dJ8oZwMYgScNRvFJxx1r+xqa3VlKe6nD38g1JHglhKRCWsuNsRHHKBGvZFSwmCYAFSiy8hRmYiokFQgAJAGQ4lyYP0nTlwHfWcaW2/hdQKgBQwqq7E1E2WEoPppBMNLbUqGF3eZ72rt909uzUuna2oIRtKNcmlUJa0gYARAkAzATEnBmwBEohUAopAQAQhmPxwo6Bk5GXSJ3led9AqtzIgkRzohGYmCnXKIAQs2Go9x7OV860ywC+5H5Iy53c/vRKa2sWd6VyLK/hBKWddQn0k5VevLQwuFei1JRFeX+mtt2zaz9dNr7mtqarWzrRfNOfqTiNldGhXCcKFZI+Es4vDPYmOmRGBATgTjLPQN3RYqpDZGAEbbQSNgoAJgtdLVJmyYWFJhFKCciFhyjgUdVTQCjqtvCoUgqCJJE4WXUYNAdVN7GtTA2qYeynuTRGEQELUlvu27rh8GwQ+b36MLcSRSi0gwRbD/mV1VmlfS+1rVwqLbUiK5ekSCtCRmkkMJuMZQ5013K8kqJr691LeqEvGr7aUv5ZPT5xKq2NT36BdNzuoTssrxaMbdh+0SvL6L2kpOSUUAbwJSeVOB/ubX9vmPZY81qMbhAFgwTBQHRUzY2ACbEQqVt7j2RmKPLx4uhLHAFqThU6CGAoj/IeMqKQlnQzimI9bDmbJytbakcz5HuWbz7UuyvKBlV3AtgwYIa54QQNsFV0owMgIjIgEyAzCGaQQITARYU/IiKzEVGoeUWxr+/9fu7M2NM7AWCYrPbjZUf5iCJLDoKyF2kYNGsjpInps2yb6zCxGh4BgPXNMxTa3XjRUUGSj2Zq253Qyo+sgCEAEA1PztaPzmFQzNGwlVTPnGTPhfl+tLdjg3QPCEqMQGDNACA0g0JEibYgG3Idl6nVkgeAfmPGb8yc6mGU/BwxSjqLw3snKhsM6fnunt2LNyR52PSnJyqbLOn8pHuTQrWqm8ZH9ylUwyS0haOENV3dNte7ayk8OEy7aR47VsWWKtXh6mheCTs3iRKutCxNGbFxla+UK0HkIs+TLKd4Lc0uFDNh8X9YoiEQIAANA68ppACBQADQwrDFAtDOlR96WhonseoYaGUiL0EAQWpstVHvVILYy+zMSRWoXKWuN5JOxONdjwHsxHFjG6jo4zICbDsTaOuiAV8ACURgIVI2y32hLDYI/TiquNVXX4DVn/i6lfz8g4hj659cGducJ0OhpFuZRFFWWwAAAHMyahNpt9Iq9VBLSk4OZQBfclKJ88Gh9o+YNIrC+geEZGZY+yCL7sbCOo4RAQALAznmtRwLEgAUNZMgEBgNcY4gDefasGBhyyDnLI8z3253R/PKc4NR04ik4U0Pk04vWqy448SagIbRihCi5rTCrAOMhZDeWrKdQSJTcRgDgGsm9QjABCw44lQ4jaC2tZckWftHTd8K/OlutLAwuLfiNLJ0SSdzCQ2lqg7N/syduvvI1ycnLhr3Z6eqWxveZGDXu9GiawUAUHXGPO15q0LvX0FPcWYUjKElxWQFABCFqnjaMqnIHbBJkKi4UvmyAjiKTUYAgAyEgAZFThw4WFUs6BTd4ZKSkscSxAYZBcjV6HAvWcpM0onmh+kqopipbf8pdjhb2yFADtPV6frOQbLcC5c15cBkTCYkCiMEMApVsZu2tMlQnPdSk3rKZcMgVN1vkZGjbFUJO7BrYcYEhoEMGWQ2QCiAGaRgYAYQhW8IAAAXU74IAALQiWwSFFZDjYwk3NQSBrzIFYyS1Oa5mVannttaauUmlp17qTf0EiQABJTaDiuhm9iKBAhwtBIERrAgNhJQQ9ECXdiXYiYozwWL/FCXrr5FJJl98Q7r7Bm0y/erxyG2X7f9+qkexc8Fyai9/3tfOnznv3WO3MFHhXuqra3rznzu1vNeXJ8+7dQOr6Tk8U35gCk5qURh104EEAOiQADBDEcl6IsGd+TCVrjQrxOIa29khU88AQpgRgQq6uaR0aCxUApARCWEkCRzTg1ly8P7kiwc+b1OdHgm3rpj4kIlrarbAuYoH/Si5USHlnTrzfU6y1KTEmpiBABEkOKojl2h60SIgovE/1phgIQjZr7bH+TZyNd3b8KVZm2Tb9V8q1Jxxqpoj1GciEalujXL+hDurdZ2uDIYxO2pWrXqjithT9W2pjrUJpMZqh7l+xbEZCBqLhjS+1fRUUUADwDTjR2Ds54yJz8NTrQAACAASURBVL/v5KOK64uKnFytUtZhTYCQ2jkSupnSwEDAo4Ranj3ePGX3uKSk5LGDozwCaoeHonxITBvHdjW96WHayXRsSEvxE78kWNJZ3zw90zEBHentGUQrqQ5HWT/JRpqMIZ1jJsgyzJpNqAexDpkoopyAbOGF8QAkZiZSKIWwHCsANhklCIIMIyCJNRtuAUjADIWzB4iirl4AMBAyEgojmIVgUEaMgqg+rI110cltP3JnlsZq/UroJYhsGctLlBCJtmJbO3bqhZ524ioA5BapXBhBIA0zMKAwAGtPAmYAhEJuDxhYsMgHcXjVrdnuZfvsde7zz1A7SjvPkschTOaub11x1zev0Fl43FfD9v67r//0nu/87ZbzXnTuC99je+VkR0nJCaGUTC05qYgY81wDEBcxeqH1zgAIDIjIiEd73BEFMMGaOhHDUYlkBizSJACAKAQAADFJ6VjSFWhpTHMTE5ssi5Kwv9Te2+7PLQ72Lg7uafnrGv4UIhrKGajhzTS8iSQfysBx7QDBUqBQSEYwRIgIKBCBEViuNeczAwEDc5hHh4f33je861C0fzE+fOfyDXfNX3+ke/co68KayJKwpGMJl6WU0k115NqBZ1cBINVRcTVs49iHjJxLzKGuWehzZoqTAgBe6/cHAKi549vXP/2Mp/7yhgufPn3xhdv+r18e27xZTtXCer442V4d63fGu4vjXUJiw7bl++Pj9kTjJN7VkpKSxypNf3Z94/Sa2xqlnbo74arAtSo/4z4R0FG+pyp1d2Kssm5peKAbz+ecIaBn1bVJR0mnEx5ZGhwYJsuGNLExrIExy9OUoijpSVSxDnNKmIkAJCpAAhTKdiUqWJtcZWYUzExr6nbARV88GaTYywDIzpSXWEAwsVrfemB2Zrm1Y//GdfOTwchP3NwmaWUqtUy/Hg+rmZCRG1ar/bGJxRl/FGjBhbApsjCSjGIEFCRImKNmp8DATCDXarRYEJosT/973/CL3xn+76/r3Ys/45UsKfl5I09G3/7sa3/4bx96YPR+DGbaf8s//vsnfnWwcu+JG8nBgweFEIh48803P9Q6X/jCFxBxfHw8z/MTN5Kfmk996lOI+M53vvOEHmXDhg34sFSr1UfrWF/60pcQ8fWvf/3PuJ+rr74aES+77LJHZVQn5zqfZMoMfMlJRYIYRItsCYuEQSpaGwGgyKrzMXEiYATkNQ36IsJnFLjm4wOiKGBc64dksGzLsSpMJtURESCyYMuOFYnUit2Rnk/CVQBx/rrnnbv+l+Z7+4bpajucW18/w7ca967e2okOA2zoR+04Hyb5MKMY2AAUbfIIBFiUZyIDIDKzhIRSNFnKwpW+FtCO5nPKh+mqq4JutGQbk8ppSA62dQ8gTtTYrNMK095qdLgSNVITVeyxpj9jHUn17qXMMYN0JZVta99yk7Y72gYAUfk/uigb/lTNa+UmkcKSY5jny0k4HKr9y2nPTZRWpFXusFVPHKVcq16m30tKSh4RlnRmajuGyaph3R4dBsBOdERTZivv4dPvmjJD2lYuPnQmoFXZMIhXPKtOREo42qSIhCiAAYFyyoumKSkcBrKV4yg/SgeB2wBNGk2mY0cFlnKjrIuAxMQ6IzDAwAIBAdeqohiKcnYQiIZZAIARplsPU0dLksqI+qjipHbq6F59uP7QVFhJDJBRVEns2Nbzs8vNbm28OzVypdDshwqZZGJpyY5BANBKp04WunEl9pkRkf2R52iLgcWaIz0ZACx6sYg4TuI7DvJH/63xwd8U4z+xqn9Jyc8nTPq7f/+Gxb3ffSQrD9sHvvmZS37psn/1qidE6m/Tpk3PeMYzrr/++i984QsXXnjhg67zT//0TwDwm7/5m5b1RG/OD4LgoS5CEJzi/1HGGKVUo9Hodrsn4XBvetOb/uZv/ub000/fvXv3STjcCaIM4EtOKuhbkYr92K11/W5rmKkMEIQGBAUMRhIhrfnJIReSwsxQhO5gAACIQTATgjgazwMKD6tNf5YBVkeHcpMJ5Tuh8If2MAiHztBKMguy+eW7bjTpmVO/uHPigkiHK+HBlr/eUb5r+7sXbpppbGHCue7t3Wh5lHZGeSeM+yQ1MWFRNk9Q1NAXswbEiMhMlGLWz/qcZzKhXIbzYjhKu9v47GpvZmSyQPkDb2AEzbcPLnQXIkV1bzozSeA08zydCGu50qvN3kJ6iNIhCMxkZba13fHHxdTxSTCBcs3eSRHaMp+wVlqDYJ9XGTlgoNscJU7WSFE0AuG6J/u+lpSUPGaRQjX8Kcfya27LkAYASzqtYMNDrU+sV0ZzSR4CgEA5FswG9oOX/CDgltY5o6y7Eh4YCSvKBsQaUQihJCpCImYUEpAVWhV7jJgcVRFCCQV5Hhk2nqxWnJqjvE54yIA2YJhZIBAwGuRCzlQgMKBAYGYWdi6FViBYSx5VI2C0jDTzhhEiL/ZTV1vGTtXSZMfWKsvVwU3ziZ2PrTZygcP6MLcyJ1MqswBZGdAWCY250u3xlaWpzobDk24cZI5BI+2hApSABIBowCDItakFBVpokSd757M7j7jP3Hli7ltJycnm9us+9Aij94Kov3DD37/xuW+8psjMPOpceuml119//Ze//OWPfvSjUh6vKTgaja677joAuOSSS07E0R9bXHPNNb/8y798qkdR8qhRBvAlJxXhOSzBzhQrRALBQqZSGpE6uUAhCEEKRuJCgk1woUsExAKOVc0X32DhMUcoJANoqovW+ulde5ZvjrN+blJvINjJ0YoRsSIbtaEfWvmydW+cdtc3ztw4dlac9DospLBGWce1/NzkVXd8x9RFR7p7Dnbv1KTJ4SQfAacMvFbQjlB05CMDFrX9BBmmJtQWWTAKjc0eiFGyMKfzyaWJFp5dI7sxEx/Be4w7tKXrCrI8aVgn+fDupe9a8VNGZulgdKCuJhvNidhJV9yl5uQ2zwt4mIJv44NaCitBo1Qv9JiMrYXSCrXwI9cySrgWrKvizKNWDVVSUvIEwbOqs/WdmU6EEJZ0H8ZGbjWcP7B6uxK2ElaqI2Ky695DSdYLlBubT9o18+wfzv9nmkdEmpgkEgtARgJTuI9IFICohCUAc51ElLPRjvJGetVkhnXGBJ70UkpzzIgYGYGLsqyinp2BAAAEC6UtI4xWJAmJkYBzqbVlpJFB5CsjkNAyipESK29vPNKvD3PLpH7iaIuAu/WRHzuCRWrnVi6bvboi282Ul1leYlkGczdio4wgLUAaw4wAQAIUI4MAAAMSWHCOIyKcX56BMoAveTww6hza892//Um3WrnvloM//NdNT/7VEzGkF7/4xZdddtni4uK3vvWt5zznOcd9e+2118ZxvG7dumc84xkn4ug/DwwGg+9+97tbtmw544wzTvVYHjO86EUv2r59+9jYY9vys+yBLzmpeKo6HqyzMlXUvktCFpTbmiVpadaq5Ytcyv1C9sLft2g6XNOBhzXNYUFgCZvJaJ1VnbEtzSc1/WnXqlQrLVcEG+zTA65XksAbecKyUWDdn8pMujy6z0avvXrfnsUbj/T2WMod99dXrLqmVFNqKE90jympIo4je8jiqORwUcHPAAIAkVEQGmBk1JByZncAO1my3D002jM3dt9KrZf6tr7niLWy5Gly0jRY7ZjVwwv9ffvbt+3v3nbr6P/bm9x+eHV31Guv9o+4TlX6jj7cM4d65khf71sxqw/SY0bdCH3Lc2szsDENIPdo0Ay1Y1ztYdOTZ0xCvbSQKykp+YkRKF0rsKX3MNE7M8f5UICcqGxo+jMVpwnAST56qPXjfLQyOphTtmPiwietf86W1pOr7riSNgISGwBpSQdR2E4FiOveZOA0HRW4wg2cpiMDBByGy8OkS7mGHBTYEhQIIQAFMKxphRSicoVGCmdWntmaJOXKFG1ajLA03b5v07wwKLUwtuk0B7GXdVrdxanVURCmVha5Sa8yHFZH2jKxqxem2ytj3cOzy6tj/dhNMpVnkpFUP0gzK3a0pYwQBMjqaNcXIK7F8giETIqEiLG71M3JPNo3qqTkFLDnu39L5qfpJL/rm1c86oMpaDQaL3zhCwHgi1/84gO//cd//EcAeNnLXiaEAAAi+vKXv/zsZz97w4YNrutu2rTpec973te+9rXjtmq32+94xzvOOeecarU6MzPzrGc96ytf+coDd37TTTddcsklO3bsqNVq559//gc+8IEkSY59+773vQ8R//zP//y4rV75ylci4rXXXvtQZ/RIBln0h3/yk5+8+eabt2/f/oIXvODzn//8w1+oR06x849//ONhGP7RH/3Rli1bPM877bTT3v72tz+wvv2qq656/vOfPzExsWPHjle96lW33377g+7ztttue8UrXrFr165qtfrUpz71d3/3dxcXf6wP8uIXv1gpBQC9Xu+BDfm9Xu8tb3lLcTV27tz5tre97YHDWFpauuyyyy688MJKpbJt27bXvOY1d9xxx8Oc49LS0tvf/vbvf//7xcdHeLOK9v6Pf/zjc3Nzl1xySavVGh8ff+ELX1iscN99973uda/btWtXpVI599xz//7v//5hBvCoUGbgS04qvl17yvYXfn/31VLLbnOgFWGROGEUBi0jM0sjgoGjcvBFVoUKqfqjyW84+h2jBBlAJcCGI726N7l57OxR2lkN50VfQzMdLh7u6DEO0+F0xDY03dkxbzbLY29ZKsPttIukUydZSrsA2PBaUdq3LH8y2JCagRMtaB41MVsFtSpkBkgG1vo3i5Q8FSl5QMOplWqlQy9SRhrJIIGzua5Zng9vl0Fcj5WVkpsH0ZElPHiEt1MyZmTgHpYHVUUoVG3VnqyvbwcddwXU8ohaI1TC9BMFKKrucXl4jnJzXzc4Y9NEFMqO5ji22VXaqU1MOb90Op87e4Jq1UpKSkqOVULx0R8XBvua/syDrpvqcGV438LgHgEiM9Hm5llT1a0S7UgP+vFyCH1AFqCqbsu1/MBqOMqfbG2c69ypSTPxIFoJs47HfmaiXAlNpuhwt9EWkk2eMhIX6nHAsKabghpNMdWKgBJQGFS5HAbR4XWLkZ+MdWuIyMCWEU5iC6MA85EXL0ytbjgyVR0GqZXdvfNeScII9hLntrP3zC621h0ZF7kEErGXyMQ3CMJIBABhBBRKp2SKuV0UgGtTCl6CZk9/cO/S+I7Zk3eDSkpOBMyH7/y3n27T3sJdo85cZWzjozuigle+8pXXXHPNNddcc8UVV9j2j7MXURR94xvfAICXv/zlxZJ3vOMdH/7whwFgYmJiy5Yt8/Pz11133XXXXXfFFVe86U1vKtZZWFg477zzFhYWHMfZuHFjr9e7/vrrr7/++g9+8IPveMc7ju38k5/85Fvf+tY8zyuVSqvV+sEPfnDrrbdec801N9544/3H8FPwSAZZsLS09MIXvrDdbjuOMz4+/rMc9IFEUfSsZz1LSvn6179eCHHllVd+5CMfuemmm7797W8XwTYRve51r/vsZz8LAMUpX3XVVV/96lePXe1jfPrTn37LW96SpqllWevXr7/11lu/973vXXPNNV/60pcuvvhiAHjOc55Tq9WuvPJK27Zf9apXOc6Pi7na7fbTnva0vXv37tq1a3x8/Pbbb//Lv/zLW2655Vvf+lYxKQMA119//Utf+tLFxUWl1MaNGw8dOvS5z33ui1/84lVXXfWSl7zk0b0sALBv374LLrjgOc95zuWXX/69733vqquu+sY3vvFXf/VXl19++YUXXvj6179+z549n/70p1/5ylfWarVf/dUTUnhSUGbgS04qiOKZWy5pJLXMTkEwMwAf+yUkO1fKyEL/fa1YngQaAAlriXgUDrmOthVJBGGxrHBtBrZON7ftnH7a+voZm8fP3jX77F/Y9pLzz/6Np57xmxedfclp6585tfNJtdmNzcY6364ygFzVPMz6y4dXR/Pz/d2Hunceat9x69zXbtz/z7cf+c+l3n4pLR9kTZgqc49VzmgzCGAhAJCYGRC58MBDZmYjwEjWSqduHrupEZoNZSYNRX/FWV10e/cEK8v7Fw/fe7CT6m6S5Hcute6w60c8wTg2vXFyertoOHP2/pD7085GrzIuJis45ou6C8wcZcdfRIEAIGwZbFzvjjeycclbGt7pM+4vbvOesQ3rZQN8SUnJiQIBXSswbDrh/CBZGaXd2foO7yGE64dpZ36wdyLYNFXbagln/+rtndFh364JlACshFV3W81garq2Y8vYOWPBjGfXAHC2vsNRXjc6EuZ9Rwau9CuyYYEk1szGJikQGYkAqdAWRQZgFmAEMBMAFPYlgCxyKQx6iVMZVmIn7TT7ALA0scoMoZtYuWp1GrV+MNarh0F8ZGb5nh0H9u2YO7hhae/2uf1bDu8+ff/+zUf2bz5y9877wrGuAu1ozqysEnlOpgAAGZnBoEEoHlpoiICBGJkBDLi3L5vbD5/MG1RSciIIe/NRb57/5xUfnJUD33s0R3M/nve8542NjfV6vSJcP8a1114bRdGOHTvOO+88ANi7d++HP/xh13Wvvfba5eXl3bt3r66ufuQjHwGAD37wg8e2ete73rWwsPDrv/7rCwsL99xzz/Ly8pVXXgkA7373u+M4Ltb50Y9+9Ja3vEUIcdVVV/V6vQMHDtx9991nnnnmrbfe+v73v/9nOZdHOMiCj3zkI/V6/Zvf/GYYhm9/+9t/luM+kA996EOnnXbaDTfc8K53veuP//iPb7nlltnZ2RtvvPGGG24oVrj66qs/+9nP2rb9qU99ajAYrKys/OAHP5icnPzUpz51//3s37//zW9+c5Zlf/ZnfzYYDPbv39/pdC655JLl5eXXvOY1WZYBwBvf+MZPf/rTAOD7/mc+85lPfOITxzb/h3/4ByHEPffcc9ttt912223/8R//oZT6zne+c8sttxQrRFH0spe9bHFx8Q//8A8Hg8G99947GAze9a53ZVn2qle9av/+/Y/uZQGAT3ziE+9+97u/8IUvXHbZZZ///Off+MY3EtGb3/zm17zmNddee+3v//7vX3HFFf/rf/0vAChmN04cZQBfcrKpeuNPrj7XIEktLSOUFpIkAANIrYiQ14rjsfD6RZbIpkh1C9eujQeb1uuN5yTnnxM/5UnZ+TP2pqDRcrx6a3xjq7K+yAkpYXl2zZkZG9t1+uZznnnGuc87d8fzZus7A2dseXSfHauZ3lTcoCUxD0rU0npuskGysjI6sDQ8MNf54crgPjRxrM0QpEbMAEkAH6udL3LvjMhCsBAsG/3K9NL45NL4WKcmSQEAIxhLa2m0MqGXj2weWjkY4Q9qxFBf8fSRrr8nm+y0pJHN6rqZsZ2Ttc3bW+e1go0S1gr2QRc9ncen00XNVVvHTTvsqJV4o+yerVdOC0dn2eGzqmLMe+D6JSUlJY8iY/66jc1d48G6mjsxU9/e9Gct+eDzhtrkAOBalXF/3dbWuePB+vHq+lSH/XhFCavuTzEJYI7z1VHaaY/m+slymPQMmVynmUmlABTSwUpMIebkGbtCjgTUnGWsSRZSp7A25QsIjFSYmAhGAGQ0ypBAYKwOPVc7jrYEILLoNYZO7lZHQatdb3TrMwutxrAybEbzs6vt8f6oGg6DKKyGo0qsVb400Vlc1+41Ygd07FDkx0aQ0hIBCKiwNWUAQkQGiQIZBK6VTclRLn7QPll3pqTkRBEPFgEeurXmf9x8uPQoDub+2Lb90pe+FB5QRV/ozx+Tr7vxxhsB4OUvf/nzn//8YolS6m1ve9v4+Pjc3NxotNYE9F//9V8A8Cd/8ifN5pqbz2/91m/92q/92nnnnXfo0KFiyZ/+6Z8S0eWXX37ppZcWynk7duwoQtB/+Zd/+VnO5REOsiCO469+9asXX3zxA9X7HpSXvOQlEw/BW9/61uNWTpLkox/9aJFsB4BarVYMqZBtL04fAD784Q+/4Q1vKHLm55xzzr//+78f26Tg8ssvz/P8t3/7t9/97ne7rgsA9Xr96quvPvfccw8ePPiZz3zm4ceMiFdfffXWrVuLj8997nOLjolj6vEf/ehHFxYWXv7yl//FX/yF53kA4Lru+973vte+9rVpmn7oQx96JFfmJ2Lbtm2/93u/d+xjcVlqtdp73/veYwtf8IIXAMCJmD64P2UJfckp4Pxzf/3b//3/IsUILFkYqQHQXqtIZCRERkQAgYCILFixQtuWbtUdr3uT65tbz688Z8bevJTPdb0OVVXNm9o0tgvxQSaklHTG7Op0c8NUdXMnXDScV0FZadpwJvy0aigNYcBsEISSinKdULw8Olw12qNcARtCL7OQIJeQK2YoSvgJQRRR9ni/su7wNADYmRIkD61bHFYibZnYSSRJrTQAubHtJq7Q0ggKIm/gh8blQExUj6hOvT/yO1Wvddrk06ZqW1WaZff1zKEeCODMiJkaBseXY2Fgy9l6Blke26OWVc/OSEQ8x4uh7XiNDajLDHxJSckJRAlrprY9MxEx2fLh3OZs6QLAKO14VhVRNP1pZNBEVWfMsYJMJ5awc5Pa0o3znmNV19dPq3njB1fvFAKJNYJUUnVgKRaxrWFMV4TvD2gBQUgADYQCkZiIi6ItIajwhEdAJBBGFkkKFoyMguSwHi1Oro73GpGfNPqWH7tzs0srUx03dSdWxnNFfW+khDJoWALmUhAKI0kRs8WgOK0HGcZ2HntpZvUFsBPZ1VEggAmERCAgYkQEwYaQESUS27k55o9aUvIYRWfRT7klAyDo9CFlMn52Lr300r/+67/+13/919FoVKlUACCO46Iz+VhF96tf/epXv/rVx20Yx7HWGgCMWROqKBqwv/KVr5x33nl49G/2n//5n49tQkTXXXedlPJ3fud37r+rpz/96UX6nZnxp/1jf4SDLLjooovOOuusR77zwWDwUF8dNzVQ7Hxqaur+S1qt1rExzM3NHThwoNlsHuf3vmXLlt/4jd8opAcKvv3tbwPAH/zBHxy3/8suu+y1r33tt771rfsHww/k/PPPP+ecc+6/pAjmiwsCAIXLwAPt4t/whjdceeWVxdEfXe7/iwEAhRLerl27iumD+y887n496pQBfMkpwH3Kxq0/PGuQ30wOAYOtLTI01qlqy0ADPahURNMfn/Sd+ubKmTkmsUiElFIqS3gT1c0b6jtacr0EtcnfsOmRJZwt6bYqG1uVjQBgTD9bPFQb+k3T6uSL6FlplhCQzbZrV7MsVLnItcXoN2DQ6tVCCarTyBphYuvISxkI1nyMQWplJU6mTBREtVHgh95YrxZEXr82JGEyyyCxxdLJbAAY1ELFwotcScIgRDKccU5HGyveZOA0fLvmqoBnXRuAhikAoKPEbA3lg8xKiKYngobsNjnsJaBXw15mtBELjfBgQ663pf+o3q6SkpKS/wNEXHO1fFjq3uT6xumHe3dH+WCmtn08WHdw9a4wXTVAaRwVTvKT1U07Ji7qxUsNf2pdfWcvXkaEDY3Twci5wR0CwHUDmQuJRlpuVwwNawWoZBDziJixMAcRCMxAa9ECEli55WU2MwCDzCUpYqRM6k59oJUpxFWkFp3m0MmdxiCojrxmt0pourUhuezGtgBELUgZO5ZeroK0UhvWVaZyKwfClfF2dyycXhwTJNzUEUyaQYIo2vIJEJjXdFvqQRm9lzzWcSutn3JLBABwT4wVfMHTn/70rVu37t+//6tf/eorXvEKAPjGN74RhuFTnvKU00477biVFxYW7rrrrn379u3Zs+frX/96v9+//7dvfOMbv/e9733gAx/48pe//Cu/8ivPetaznvnMZ95frvzQoUNZlq1fv/44DXNEfOc73/londHDD7Jg8+bNP9E+r7vuukduI/fwO9+3bx8AnHHGGe4DTIvPPffcYwF8mqZHjhxRSj3wLuzatQseQY56587jLTyOtb4X3HPPPQDwmc985jgZv6Lf4fDhR799qVarPcKFJ5rHfwDf6/U+97nP/eAHPxgOh41G44ILLnjZy17WaDy4aW3JyUHU3F88/9ULNx5c4gXLSDuzAcBOraqqbPe2nL3zeTMzpwX1VtUZL4ojiU2mE0S01cPJIz9C5HTVOmtmdgDd4UBGzr3ZHcpyiMixKigkZEZl6NtjmbTCnsLEshKvXUns2LVjYuDETYERGRlZGYEApLSVK6FF6uRGkpXJDYdnBS21Wz0jDOYYJI4gGVaGXuy1QlewzAJja2c0ozViZ3SY2FSd8U54pOFPZTOWmLJt4aL1cGVRlnSN1If7u0dZN3Ca2mRNb6o9mnP8ehnAl5SU/DwghZqp7ag645oySzpKOve2vy+FGiXtnJIw6UlUm5q7msH0uvpp3Xgx0WGSj6SwZ+unp5kZJG1b+fWgNUpWKBmmcZeJJAhgRCEBEZgKLT00QMgIApAQ0I0dN7O92MmUYcHaMSMVZ1ZuZyrxsthPLS0TN7Uzqxr5zVF1cnFMq5yQWu36kXXthcllALCMSt1EEFhAlcgRGVuZlTppauWZlRuL3cSaX7cEKptdaLpxILRFSAhFBRkRgACJvkILaJiK6oPb7JWUPCYImhtQKCb9021eHd/8qA7neC699NI/+7M/++IXv1gE8EUMeZyg2tVXX/3+97//rrvuKj4KIS644IJKpXL//PNrX/vaWq32nve8Z/fu3R/72Mc+9rGPKaUuvvji9773vRdddBEAHDx4EACmp6dP0Ik8kkEWnFAXtCB4uPnZpaUlAJiZeRDt0vsvXFxcJKLJyckHFvkXqx3rSngojjUyPChZlq2srADA3/3d3z3oCqPRiIiOi/kfNzzOA/jFxcX3vOc9hV1Bo9FYWVn5+te/ftNNN33oQx+anDyB04El/wMIm572i8/KXnPnj/69M5y3EqGk3fSnvE2z2874hZ07nnFcCFqYGz1qR5dCbR1vxbXz46mZ+J6t6YV7V27Zt3JLppPAaVTFrMq5VpnUDq+u7FNtp93qaASU1CnM7QAAIABJREFUVBsEuTLaMnYugaQgzhUhCyextSIAQEJBEPmpZazmoJL4ceSlyGBAZF462W75sVUbVlM3HXp5e9OA5FIqYZ1zVmA3l4cHoqzfj1eEkADgKH9Cbnqo2lRONCyOkuX5ZNDp6MNpJfSdBgPBmjNTSUlJyc8FUqi6t/a07cWLiR46yhf/P3t3HizJVR4K/jtLnlwra7916269b5K6JSEJSRgk2+hZPOyBJyyzzJjFxkNgeAbbA8gPeIjNAYg3E2MYAzbYQQRgbBM2nsC8QbJsY2EWISSB1t6X23332iv3PMv8UXLTtETrdut2X6l1fn8orqors05lVmXld5bvA8h4hDA2DbeXLO9d/F7Bqlbdqdn2o1E+8J2aa5YrzoTLKgYxmv62nuEu8YO+57J4pWqU2mKQK06B5hgpKQBG0+YBlEIIIYWthLmJE3gR5cgNnGEhGhZCoogTmTnmgokUi4xyJtpOYE/NjfW9YWqlbuj4Q08RpZToVHtYKTsxDUmLiV0MDG9oIwWpmSUsy6iIncjMDUlSSQLABSxG07IUUhhASAwYKMIICIFMQMpBB/Dac5lheWObXrh06HvnsC1l7tiW69e8SacaBfB33XVXu912Xfcf//EfEUKjtfEjn//850ertd/0pjf98i//8u7du7dv3+44zqZNm06LjW+99dZbb7117969d95553e+852777777rvv/pd/+Zdvf/vbL3nJS0axQ6fTObd2nnnD1TcSRrk/1sn09DQAnFoK7qRRbD8yPj6OMW61WkKI02L45eVleMb9IIyxarXabreHw+Fo6cTaOuezfGFc5AH8HXfcsbi4ePXVV7/jHe8YBfAf//jHDxw48Od//ufvf//717t1z28YXfNL/9vGq25YPPyTcGHRxgW3VPca49XpLQa5EDc6yDY8u74D6jsALm3+0g+P/r+H2w9keeTzQl0UKCkx29tHhkiFVsIAFM2xG1pDPzQ4VQBUIk4kBhTbcbuqxpYqCEFqpgohLEivOLRyVhqUDZFYCQkKIe0XMEDk5mG5vVJpK5v6PonMY8kgFkgShByjOEhaLTFXtGpcZplICKZ1b8OTW66E5Mc68b45A2SFl0mBMuIog2YinfGmTaSH3zVNe3ZCFJkOK2XiICMWyIxhC0B2ork4G3pGuWBXFciqNbUSzEolp0uXDdIVIXLfrE9t2inyOI06iUpreaeX9vI86A0W+/myQBIDkkoopJRCSKnEzhWJYiO1lZFYKZKISCywIJwUIocnMrbj3JAr1UEd4MimEyxhgnAswOd9ypaKMiYDKpVVDEoMG2NhnZMB45hy6oXebPNwt9x3YyuUuDIgqR1IoKBGteOQQvI/KqgAMTCyDdT04YzTqTTtOWHjC151bgH8zJ6XE3p+7+u2bdt27bXX3nvvvX/3d383NjYWBMENN9wwijNHRlnc/+Zv/uaVr3zlqRueGhhzztvtNiGkVqvt3Llz586d73znO5MkufXWW7/5zW9+7nOfe8lLXrJp0yaM8fHjx6Mocpyfud366Ec/2m63b7/99pOTfJU6PW3/gQMHzvAuVtPIZ4NNmzYBwGOPPZam6alV3wDg4YcfPvm3aZqTk5PHjx/fv3//rl27Tn3ao48+CgDbtm17hi3ZsmVLu91+/PHHr7nmmlMfHw3Om6Y5Wrq/Gmd7stbdxTmvYGT//v0HDx6sVqt/9Ed/NPo61ev122+/nTH2ox/9qNXSiWHXX92f3n3Fr133n39n96/cuvmFN4xvvOTCRO+nKdljL93xWy+/9O2/uOON11z2qoldV03kGyYHU7unfjFvoGJQqHT8cq/YLQ1jKyUCE0E44UgApyJ0kqEfzE4uzjWXIzuNrdTKmMTK4tZY3Lhu9prds5dOtJvc4oNKtDw1XGx2wkqW+8ou1XrJcj9ZagXHD6zcd6B13/LwaNGuF+2xijuJgcR5oJQcJu1WcLwTzWciGbVWBRlwCR4lE8Xq2MaZcOO4mpFKlJ1xy/AcQy8P0TTt2cg2CnVvJsi6nlVSCpnMsZinpMx46rBiyW1Mly8xqZOIwDMrnlneVnnhVROv2F6/7sqZl13avNFzmx0VSsN0rVrdnXKtKrVMRjyssIRR4RJACBQGUCCRxApxKhWonApBhBc4LDOmj49vPN6srpTNxKASUsZDN4qdBEssCkvD6lEHFuphcMURsX3BpSQohFllSRKe9UohKOh5w0Ep6BSH7Vp/sdEJnNQJ/YzkCitJuSIZYIEABOWc5lwJZFJaMLH3jEpDa9qzwaYXvMof23q2WxFqXnbTH56P9pzm9a9/PQB89atfHeWfP23+/Gg59I033njqg/fdd9+psUC73R4fH5+cnDw1YLYsazSSH4YhAJimee211+Z5floG9dnZ2Q984ANf/vKXi8UiAIySsY/m2590zz33nDkmXE0jnw2mpqZ27NjR7XZPOwhzc3OnZrADgBtuuAEA/uRP/uS0PXzqU58CgJe85CXPsCWjSvKf/vSnT3v8Yx/72NTU1Cqz0J/byVp3F3MAf/fddwPAi170IsZ++tvp+/5VV10lpfz2t7+9bi3TngQjgtF6zgchmM6UL9s98Us7N9xwxQv/y+Zrf7GxZ8/41sumr74+mzKGpWil1onsTGBppNRKmJkxhBGSgBRKDZ5ZecZEZgpuSibMUl5MfNmgm3bgK7epPTvZlQ1rc1rHyse4aFlWoVKcsgxXKmFSt5+sLA2PcZ71ooVBvBJl/Vwk/WTpeOfRB4/feah1/97l7+9fvnexfzDhIQAAF/xwm9keBpxBojCkPKlaE3VvZrK4fR1nVWmapp2BSR3frjcLW6fLl5bsBgHCRSKU8FjRIBZBRjdcXBgc6sfLXKRR1h8kLQOzieL2qdJOm/kO88cKM4zaDX8zIBBSUGw6dgkhAkoCYAwUkEIYpAU54worBKhXCmMnGYX1VJCFxkqr1vNDpzwoYEEklonJBRV2LlgmhJEMbMOOLC/NnHRIueAwUElUXKr6nZJCCoMycjzeLiOOOc2HhdyJqZ1ihSQgBWBIhASWsZX3/DAsJXyrSzafa/YvTXs2QZhee+snMT273qgrXv5etzx5npp0qte85jWGYdxzzz3/8A//QCm99dZbT/3XUR61U8PLe+6559d//ddHfx85cgQAGo3GzMxMlmW33XZbkjwxZDI7OzuKD1/0oheNHvnYxz4GAO973/u+9rWvjYZtl5aW3vCGNyilXve6143uwXbu3AkAX/7yl3/84x+Pttq7d++b3/zm08arT7OaRj4bIIRGZeTe9a53/eVf/mWe5wCwd+/em2+++WR++JEPfvCDhmF8/vOfv+OOO0ZPC4LgjW98449+9KOZmZm3vvWtpz45CIJRL8nq3XbbbaVS6ctf/vLtt98+qiqvlPrrv/7rj33sY4yx3/7t317NTs7tZK27i3kK/dzcHADs2bPntMf37Nnz/e9//ymTE0ZRdFofzElSytM+l8/Eyakaa7jP1b/u2r6X1b8unP+yCk/50mf7fgUBs1kzAaJAFtFM9fJhvPDjxeiQE7LGSskdFgyBQyce+GFipYmZGYL6ocOk1ffDiqiIrS6myCQEpd5x3kIV2yxsANmu0o2KIK54JmMTW2HSVQowJr5d5zLtRHMFq3ak/ZNOOB+m3V687JkVhJCUcmP1csvwT3T3YWSMF7YoA6ENJT7bc32PxCrLEmqUqOkz7EmhRi7w+T15Wi/8R0tKCRf8ezR6UQBYr0PNOV+XvCwn3+/ov0+ecnZm5+njsS5nXwixXlfRdTn7a3XuiqyxrXbNowv3NL1t87CPYbtoj5WdcQNb/WjpUPtBIfJB3PKMSiuYBTXXSecxk4kIKDYGUavubiCYJTwAgDDtpDJhlFJqijzHyKAUpVIhQJwKCZKA4iA4EqAQyynJjVa1L7EECRxxhQEhAASJmXKU25ySNLQT4g1dCTJy+hlYENet0LPiupTSClwiSGxnAivKiZkbsZUiwRQwS0mgCeLWqISUJJIKFGLRLfbVWFLiPOccqac5ZSevKutyFdW/Gufbye/vyUM9OgJnexVdX7UNV1176yd/8Lf/xyqz2W27/g3bf+G3znerRmq12ste9rJvfOMbYRi+/OUvP23u9Hvf+97Xve51b3nLWz71qU81Go0jR44cPnz4lltuuf766//2b//2uuuu+9CHPnTbbbd9+tOffuUrX/mZz3zmS1/60oYNG+I4PnLkiJTyuuuue8c73jHa1Y033vjf//t//+hHP/rqV7+6WCw2m80jR46kabpnz57RHHgAuPnmm/fs2fPQQw9dc801V199dZIkDz/88I4dO971rnf98R//8c97C6ts5Lkdn1e/+tWnDmee5tOf/vRrX/va1e/tNa95zT//8z//xV/8xZvf/Oa3v/3t5XJ5YWGBEPKJT3zi3e9+98mnbd269VOf+tQ73/nO22677fbbb5+ZmTl06JAQol6vf/GLXzyZxJ4QUqlUOp3OlVdeuXnz5lFxuNWoVCpf/OIX3/jGN374wx/++Mc/vmXLllartbKygjH+0pe+9OTs90/p3E7WuruYA/hR+oEnJ5wfPfKUyQn27dt3WlXDEc/zkiTp9Xpr3sjzsc+nFUVRFJ1rSc9nZjgcXvgXTdM0TdNz2BBLp8a2FMYbrqrUO5tbcNRu88yOu26cmGlq5AiQldseKs7ARuUQG3WDUogtyV1coH5AUMXZpiyyFB1yZNOEvGQ1+ukKKOhEJ4K0k4usak+5pDLkrUHanvAuKRi1hcH+IOsb2CSSLQZHfKs63z5klAtxnnS6K5aoAoDCOZTJyrFjfdUiYz4zaNQddsUSyR1GbHhmnysV59COIBPIpFB1wDqLq8Q5H+pnaF2+RwCQ5/m6vPQZCrqeV1LK0fsdfZFXfwc8ukmNomjND9fJJl1gZztQsIbW5ezHcTwqzPMMcSl6wy4FJ5Gd6cKeOA82+lcWrUacDzrBiaXeUan4dOnyg0sPBGl7urS7wKqzrb01J/KtMReNdQYnhBQLw4NHuz+OeZDJKEzyXCSEMAOZDJtcDYTKAABRkCClBIkAS8gNPigPicBIIaxIZnAgIJVguROZOTfUcjnP06Taw25mIBTnJLdCWutX3bgQO2mhZ7KMYkEzIxNYMkGJwIzThHEOLCbU5mSUdl6CkEhJCWZCciMbnDjeG/SM4VkkWFqrQ3221usqmmXZaOjsAluv98s5H7306It84Uc1nqGNV95iudXv/tXbs/gpapudhDC5/GW37brxrWd4zpr7zd/8zW984xvwpPnzAPDa177Wdd077rjjsccea7fbV1999Qc/+MHXv/71nU6n2Wzee++9ExMTAPCKV7ziu9/97h133PHQQw8dOHCgUqlcd911r3/969/0pjedWjLtwx/+8A033PDZz372gQcemJ+f37Nnzy233PKHf/iHJ8dsLcv6p3/6pw996EPf+ta3HnzwwUaj8Xu/93sf+tCH7rnnnte+9rWj13qyVTby3Jz5h+Np79wYY7t37z5ZXg5j/IUvfOHGG2/86le/ev/994dh+NKXvvQDH/jAJZdccv/995+6Iv2tb33rtdde+8lPfvInP/nJ7OzsFVdccc0119x+++2nZbD7sz/7s/e85z2zs7NnO430la985Y9//OOPfOQjDzzwwP79+ycmJm666ab3ve99l1566Sr3cG4n68wmJyevv/78Jm5Ez63Ov7Py6le/OkmSz33uc6cd/Ycffvh973vfhg0bnrxq4sEHH/x5Afwtt9wyqk6hPa8oJRMeCpVH2aAVHD7af+hg69/74aIUkgpqYKshpsbI5i2w029MLXpLS+KYabmMejEfYMCbK1cjwIvB/mPdhx3mO6yU8wgjs1HY1I0W5wePZzJEmCEFAOqSxg0+a8wNHw/SNkEmwdCO56UQNivMlPYQRMe9beOFJ1agqSBdaD+2ks+N4Sk84GkWRLw/NfMCb2r6jG/o6aRcHeupo0/c2aCNJbShBObF3NOnnYPhcPgbv/EbH/jAB17xiles5vlJkrz4xS/+gz/4g9XXodUuSlHe78bz3XjBoi5BNMz7Zbs57m1dDA4eaH+/G89zKYRKhchD3tlUfuG28gszGbusXLKaCR+shMceX76nny6PLrCJGMZ5gBABKRBCjLiZjDMRKaW4SCRIKTkAUiABMJZgJoY/8BCgxMo4zTkVjXY1MBOJhTR4MU5LYd5seYXQzJDpBjWnOy6VwSlP7byxMG4l1sL4yuzUEuMkNrN+cZCwfONss9IvjS2X7dACJAWSmSWJAqUgsdJ0im36rVezy2bW+8BrzzpHjx5961vf+qd/+qfXXnvterflrKVh+5F//tShe/9K8NMDP4TwxM5fuvw//7di4/Qi3pqmrZWL/778yX05oz6Lpxw7qtVqr3rVq578+F133UUpPbX77RlK03TUjDXc5yolSWIYxpOrMp5XeZ6PupkZYxd48meapoSQUY6Kc2PDKNHoxGRl67b8miuDXznceWCxv7+bLBMOLq5MOZe4/kxjeg9Jj3tJvWg1uOCHWj/KZQxIWaZtZNbO8etb4XGCcb2wgxG7Udi0pf6CRxbMWAQYG8N4MeVRwSwblBKCmGGnIgzSYSqiTMRIQjebu2TsRovZsewaxHRZCVmWaZStxRbrSzKfKZwX1ZgVI9RPUdk+w0SpM5OdgZgLUcMHz1TDBOZCWi+i4tN8SqWUoyEUQohhGOf20ueGcy6EuMBLlZRSo+5qjPE5H+pzI4TI89w0zQuc7GB0yUIIjQ71aDHb6r/Lo9YahrGGV7zRGsWTTbpgRmf/wl/KsiwbTf298Gc/SRJK6TO5iv4U5aFgprSKVg1AJeGAMUYZZYwV7CrCAEgNotYAVrIkDbNOL1s0qMFYw3UKFdqIVa9e3Mgio5ewojO2NDjqsYptFGxWliI1mUeApCKK87CTLCwPDysFgBQoUFJKjDJTKARObBFBANs5zZYrXTcyzYwlGHJARlZASTnN7RxTI6sYQIUBZmonhuoXIwSYKKKITIlIrXToJf7QdWI7NdN92496oe0GTmQnOeXlbrE8KBCJO3bHW9o3c/kGw3iaT+noqw0Aa3aoVy3Pc6XUBb6Ure+vBud8Xe6+4JRfjdGF6zlapNp0q1e94kOXv+y2hX3f7pz4STRYUlJYXq3Y2D656yarUF/vBmraRe5iDuCr1erc3NxwOGw2m6c+Ppr8WalUnrzJ9PT0e9/73ic/fvfddzPG1rDM4MmA9nyULjwDpVSSJKZpXuCfruFwOHq/juNc+FsTwzBcd23KyBeh1KxuumT6RY8sfHu2/VDBHqPY4CIv1iYc1/GTUp/Ph7KVpgklrGQ1I9nhPCg4hZI9vr15dcrjMO+a1KEEA8q2T1xDsXGiv29z/bJcpLlIMhhOVXesBLO9iPfiecd0Nhd3IyATxR2Y5AbDJwYP192ZOOvOlC+poebwxGF+bCmts8AIDaNoLMaZ2SNlXPGe4uO9GtzIcsuitRJQrExbxF2DMvp0n9KTcyAZY2t1qFcpiqIkSS7w90gIMQrgKaUX+KXTNM3z3HXdC98RBgAY49H7HUWSZ9sPaJrmGh6uk30K63L2Lcu6wAFPv98fHfZ1Ofumadq2/cx35Sg7hd7oOqmUNExaKY5VCrVQLReyQsH1lwZHc5QIlTW9rVHaeWzp36ZrO7Y1r6r6dYRwISmxwGCGzdMszjsGpQjT6dKlG6qXLQ0Pcsk74YJv1lQsPFEYECtWXAEoEABISTBTgwrsDe2MMUPgTnFIcx56caFPjJyAYH1qZmVkZUqpFHOes6jvR0qqyEvMzHAiJzezoRclLBWG4DT3hi4gxYlcrnZXar1CaMcsy4y8VwrQkUlORL8SLpKj9WCxPP008zmTJBkF8Gt1qFcvCALO+QX+HuV5PvrVMAzjAr90HMdCiHW5+wIAQsjopUdFyJ6jAfwIZc707pdP7375ejdE0553LuYAvlKpzM3N9funr9IZrQOpVqvr0SjtYoARLtmNzN9acsYpNpI0WD62v+Q6VasM1g7OREKTmrXJIDYxFaHIpG7JbhjEbIXHl4MjaR4RTDMej/tbPLN2iV2niAGomAcIkEGsieK2Y52HbMOteRtKzrgQOUa4Ey9mKlNKHWz9KEp7K8Ojm6pXzBQvG1j7OiwwTGeo+oP4BA3GWNCQNBorbMTorOdZIIsCgOxGyLfUIAUAZF3QsRFN0y5iGJG6twFjmvEYAGyjUHWnECDfqk6Wdh3rPoIwjvNB2R6P0iDmAUZUShllg4XBISHz+f6+hf4+IThRpB0uFKwqRkYm4/n+/jgfIgQlp2FSN8p6FitMVy5dCY71oiWkqAQuQVmJUWtV+sV+bggicb1dzFg29ALpDxVChiQ5Eyw1O35ABeW05STmcrW7XO+w3AAFhcApD4pWxAIn7paGSKHFyePcZVbMLKlyQkILu6FFOOVEHNk45+R205ghXUiTgIuMEl1MTtM0TVsDF3MAPzEx8fDDDz/66KOnZlMAgMceewwAThuW17TVQwgTTAVIAAUA+fHuuBqHIx1lpGObq6jpJkVI4hQACoXCyfm9SqkoGxBEau4UQjhIOwDACCtYT/Ql+fDErLMyjCPAgLCBzVzEKY9N6lLCpBCtYDZM+0HW6UTzADDhbkLbKsmJOVO6cdBbLi4XVOZGfCgXGbUrzlnk3gjSziBp5SSl04k7m5jDFADotjqpX9BhCk3TLm6M2k1/q1QcAJ3sZCzaDYIMg1jzvf1ZHh7rPKIkmKyQpsEgXVkaHlIgCTLn+/sxpozYmFDHLJbthmeWM5HGWV8o5ZoFiphvVdvBCdfA26du6iWtIyv3zy7el8swBCkRQqBAYUAC1BNLOxCC1BBEYaxQbKSdcmClRmbGCCkACNw4LEShUoVBQRicZtjMLCuJncSMnEFq80gCUDelUimLZoCVFRYCwklmyPGOwSJijo8jm0r1HMtVpmmapj1rXcwB/E033XTnnXd+73vfe8Mb3nByklKWZffddx9C6KUvfen6Nk97TitaY8LnC4ODKJTGMKNhwd44Axz44bZBCZ5+qmnk6GTBGAQACOGFwcGy89QdSfXCBoRwykMAoNhQCo73Hw3zXi7ihAcIcNlqdOIFp1TCVmI3akywnmoX7TFWK7tGkaMwzoZPLN5fhSDttMO5hcFBDFgU+MQlMw2jZlgOrrpAn8MT/DRNe3bC6GduPxCgglUVihfs6iBp95MVJaVFIou6uchmu4/UnI0YJ0HSHSTLuxovMZm7MjxWshvMsCbtZibTwysPdMMlx/RFIDIecZUrhXaOXW+kKcwf7GGTy25mpcu1bq1TyrOccrJcbSdWDoAAKwUqxyJluWDS73vFoduq9JDCw+JwlF7ejexyu9QrD0I7Kw4cDMrmmZ3FhUEpNqUVmakZZUbSrgwQx0RiQDyxkmgaoRpOjayfrpCMFsyqQZ5mMXyY9R5f+XbCo5nyrqnyrtHvhaZpmqaddDEH8Dt27NiyZcuhQ4c++9nPvu1tb0MIcc7vuOOOKIquu+66sbGx9W6g9hxWsKoYE8twhQpZv+81J7DJwATFiOJCCfnkTRAgy3CFEt1o3iAsyoZNf6tFn3rFOMXGuL+Zi0yBooQleZiJ+NHFe7rhUi6z6dIug5q24a8ExyqlCWQ7IJhwDGEAw2jUU4AQzkU66gLIRSYVJ9gomFWCf/qtHw0KYUSGSWdhcLDqTgJAP145zo8Ux2Ysu7D6A6KUHGatI72Dc4MfIwUbx67f1nihw4pndVQ1TXs+i7LByvBoxZvqRItC5EghAJTwYTIcRNlAKLk0OKwUtKLjVTQNAAoURqRg1bnMpko7D7UfwIAAwcbaFRQZEvJ2eBwptc3aOJueSFDaM4epF7VHPagKUisPvUiCVKP+VSSVgoRlotzPWeaEjiTS63nKj4gCI6N2Zpq5AYCqvaIb21Gk0kKOc1ZImRMUEE0zRJerMQCSAIXAxgaWRexMjSGED63cDwAT/raGv8n8OZd9ADjceeDvHvvgMFkSShJiXtG88c0v/lOCLuZbNU3TNO1sXeS/Cu95z3tuv/32O++887vf/e709PSRI0eSJNm6devb3va29W6a9pznspLLSlIlYldPzA+UJyEXkEtEMCJPPWpddaeEzHORAoBvjZWccUbPlKxotGZSKh6kHS4yx/QxIQwYgOQiS1AgRD7ArWHcMghDFu0N53PMg7QzUdmwNDg8SJYZsU/0Hk9FwkXmmqVNlcub/lZKWC7Sdjg3Cu9tw8tEDEoNk04m4pwn/WSlFZwo2Y3VH43F4MC9h//s0fa9XHBAsnD4b67Z+pqbL32njuE1TVslpSQg5JuV8cKmbrjUi5Z805NSJXwQ5QOTWBhhAEWpYRkuAVpxmplM0jywmW+zYt2ZLjpjFDPb8B1WpJgBgkk2MYAqOnRXkHSwJKEVrbgJEVhgyakCqRAGrDAoAACiEAAiEqzYqnaKAAAIFnBr6AaGIMWO58ZWZohqq5RZ6eO1pa4PHh42FyYI5HYiLe7SrCCwSKxsWAojL6w4omw3e/Fi1Z3MeDw/OECQUStMGcR6co6SiA+++tBtYdYFAIWRzOP75+6qPfQ/XnX5H13oM6FpmqY9i13kAXyz2bzjjju++MUvPvjggwcOHCiXyy996Uvf+MY3XvjyIdrFChcsaRsqycVsFwDo5iqq/9zRFYqNZnFbmkdScUYdileVH64VnjjcehADcWmx4kya1BEiA4SibGAQM+NpJ1qklKXZUCq5FB+M+fDx1r8Z2LRZ0WV+kgdR3q+404yYh9sP2Eah5k2tBMdmu48SZChQUvGCWQ3yHiTtftpO8sCkdi9eDNKOZ64qm33Cw4fm//EnK9/JQAAgUNAT4Q8P/u3G2rVXTuu635qmrYrNCgRTKYVBmG24rr+TYOpa/lywn+exQR0bYYvYQdStOXxT/XIJRl7UAAAgAElEQVTb8IQUC4OD/WRFgZoo7XSY3w5PdKL5xcGhyfKOTZUrrJJbQz5BJH24tySWD+NBYOQcCUBISQkYgUREIMIplZhlhgJAgCq9QmonAzfCCnuhmRrZwA+HhWh8paqQ5AaPzExiA3FDEEqQAOUoaQ1dgRSyEjN0435l4KBibuH9K/e6rKQAPLMUJN052MtVhgD5dv20TtIH5v9nkHURgFIKKSQBlIR/P/i1/7LnXVgPwmuapmn/4eL/SSiVSr//+7+/3q3QLl4I6MYKcpgKU0QJKtm4aEEU/fynI8s4i0JrUvE4GxJk1L1phDBjDgGDEVspnvAwzoeDeGWYrgwHLQPbKQ+iPEqzABCmhJJo3jErtuFW7KZHWBQeNTHOoy2pVclFalKn4kwoUMvBMYyIiexH2v8GCgECklGD7nOYv6vxCwjhky0ZJO1RLmXfqp56Q9mJ5o91f8ABQCGMsFIgpIhRPNfbqwN4TdNWqWQ3NlWu6MfLRbsRJ5EBtseqXT7bSeaJUXRMP04DIbOZyiWW4eU8ZcRWSk2XLlPAKTKCrNsJ5xl1JMj5/oGEhwSMydJ2t7FtyvYMv7Fw4Etx8BOVc4IQ5ignUkkgAtsZ4wiwICxnlCN/ULAjq+8HuSlyI3JDl0ocOlHqZLGVOaGV21nox43FujtwLSEHVu5xpKQFMncis1ceJHbqDguDyTRgQRTMDsiKzQqM2DEfShAmdVMeKlCM2A7zAUAqsTQ8tG/l30aJUTEgkBIjAKQSHqQ8to2zWNCkaZqmXdwu/gBe0847jMh4AeC83GAJKQCAEmMUSBvI9K1a3ZvJRLJ36XtxHrSjed+u5yJrh8dt5ivBDWoLmbmsKEGEaZthJnjfxAjieUIwZMsiOAwAo3WVg3ilHy704qWV/rFhvEKw4Vs1jGg7PLG5esUw7fhWDQCE5PP9/XP9faNWTZV2Nv1tJ5fTSyXDPFIKACkMIAGUAqEk5/H5OCaapl2UMCLj/paSPT7OoyAaiEwx4lrCWAmOJDwIkjYACvLe4uCoxVpx0rdMzyDW5uqVY4VtXOZpLwYEKQ970WLFaTLqLAwP2KzgmmW7OFG1zB1yuTsbn+g8ztMUKUykFEQauWHGlgmy3C1lLC/3fCM3GktVhaBV7VFOlYLUyO3YEVgQTjAgkAoLZMcmKEUlGTqdxbH+hlm3EHiL4+1ueZAx7qW2Qzzh443lSwdJK+XR8e7jnlmeKu3y7XrGvYXBQc+sjAL4dnjioYV/aUXHQQLCoECCQkoBxpIotTg4vKl6+XqfHE3TNO3ZQgfwmvasRjHDiGYiHiRtjHCcDYpWnVEHITzub3nw+F39ZLlkNgDAIGYuUoKZUBnGWCEluSDYlEomSSvOOoK6dX+XJ/pYhEJClA9THg2S1tHuIxShXtDCkRR5SP2xzMoaxU3taL7pbxs1ox8vz/X32dR3zEKcDU/09jqseLJMncfK08Vd3WRFAOZKCgWYIA4wNzjYjZfKZ7OWXtO05znLcC3DJcJOVAIAdXvj5VP/af/S90GhbrxgG8UgaSklEKgp59KcJ3EeKFAUGxiROBtKEAiwULlluBiIVGI0b6hgVjfXr4rTgRRyfrAf9zkShlScZazUKyCQtVbJSe3aSnHgB5mVxnbsRla/HKRUpCxjGU1ZzlmeAAgm3cDtVDupwWMnXa53nMhaGG97gbPYaCV2ZAk/N4nhewWz0ihu9K16KzzWjZaCrJvyuBUcO3V1kpA8ygZR3gepACGllEIwmviEpPI5HG4/OFncfuaEKZqmadrzhw7gNW01VCZSguipKdwvDIRQzZtSIJWSC4ODTX9ryRmn2KDY8Fh53N+4NDgkgftWFQHqxgsSRJQNGLXSPCqYFccoOqZXAsVU3CzvHvc2JiJcGh6LkAUACR+22w+Y6WJv2LeGZh4ARqY7ROa4Y5Ztk1qjLHoAkIkEAApWhWBKGI3yQcaTk430WKlZvGKu/9hysgJKEQBQSAIcbN3/g0Nfe9llb0e6EpKmaeekYFWpQRmxloZHFgaHhtGSxBCkHQB8vPtY1Z44+cyqO5nkwb7lH4RZd6Z8mU29lMcI0MnrdsluVLzJMX9DJ5zlRaXSmHCZszxhWaNdKQSuFzqcyNjOAj9YqfVCLxJEpkYOGPp+6GR2q9olgtgp6/pBu9pfqXUKgcsyQyLFaZ4bOeGoOCyYYBuNklWfMQ0nSSOMiFJACZ3wL1voHxCSV5yJbWPX2IYH/1ENJOepRBwTpIRSCiQgAIkAUeIMhvPtcL5Z3LIux1/TNE17ttEBvKY9jSjrt8N5qTgAOMyvulNPzh58XtlGYaK4Pc4GZadpG55BnkjBWPOmlVIIkfne/iDreVal7E5E8SCXWSz7Rau+sXp5xZmY9Lfw4T4ZHi34W6WCRxZ/cDweYLMuAcmsNeg97sYZG5p4mPeclBQqx/Nj9cW68rPJyZ0WdRUoBGiUby/loW34iQgBwPiP2B4AOvG8bZQvmfhfguN/E+VDQNjFFgGe8d6ji9+9adf//rSljzVN034e36oZxEQID+LlIV6Jsl6UDjOe2txzDd82vFEXocOKM9XdSsnZ/mNc5jEPmv5Wz6qcTOQR58NMJhvKuwtG5XD3IS6SVnAs5XEfRcoEL7Lb1b6bWIdnTmS2aJV7iigQCBBCEiSVK9U22oyqfd8KzV4x6JWHsZVjkUydaBRCW1CxONaO3BADdhGyq6XdG64te81OtBCm3aXhkS3Vq1xWTEXcCeeLdt23aqMiHRQzgimjFgYKCgAQUVghCYAkIIEVwmj0A6RpmqZpoAN4TTuzXKQrwfHFwUGD2kLmQuYYkao7dYGbQbFRsKpPfrxemLFZYaK4I8mHluE5Rqnfb2NCXddRIBh1S9YYQlgwV7oTfPD4g0v33bvyCKFWFrXa0TzN+k2eHpVMKacIDoU8yFbGze3luOog53DrwTDre2apZI8XrOqEv21+cKCfrADAhL/t1PakeUQx3Vl9yWPL346ysEhIhSAlVaZyj7cI0sPvmqatSpwHKQ8QYCl+pp901HEZ5xFX3ECGZTiUmB4rN/1tp16QTWJvqV9d9aaTfIgQdlnJt+sn/zXjEcVsU227Z1ZC3l8eHt1YuTLJg769PHD6DxT3kxwJIjkWiZ2CUgAIU6JAgMIUIc7U4mQrKAUsYoJISURuJi0zAYBC4FKBe+WBRLLWK5oO2+DvnHEuadS3BmmnE84jREr2mG/XYx7kMh33t5Sd5qhVCKGKM7Fz7EWPLXynn6wgDCAVUgiBwoCQYTlW/dQOU03TNO15TgfwmnYmcT5cGBwomBXPrCiQy4OjUTaonkUW+fPOM8ueWT75v0wWlFLFws9UXyf2JCKWIPbS0oORzIq00RseDtOeA7xNZKhyqtKIUDOTNvZYjtIs3rdyZzaUJadediav3fCKieL2scJGy3BzkRrELNpjjPx0QSbGWIJCGMr2+DA8hmRmQ8JBeghtMqhKFsGZuXBHRNO056ZOND9M2guDgwBQopMuqZ/Mvk6xUbTHJss7loPDJvUaxa0UMwQwVd512somgmnVnXzK/WNEFSipRNGqM2wZxCo6dU+USm59mc72rYVBOlAgAEApQBhTIIRSDI5BLQQoEwnnYeRmAzdGSAmpcG5JglvVnsTC4BRLZHMrd1PbLeGA9BaPFspjvlW3DR9jOt/fn/BIKrGhfFnRHju1YQ4rbqq84Bc3vunOg3/aSeYUVqAQAjCw1ahdsqm6p2DVzssR1zRN056DdACvaWemAAA9MWceAYACNZpVvq6tOmuYVXOpFBujRinKhxKkBCUBEkAMgWSZUNjoVb20bFH2mP+TlWQZ5WSYttM8vv/4/yzajao7aRneU+7cZaW6s6EVzu6oXx+GR7z0eAxYIrPsbdjVvEHx4QV+s5qmPefkIhkm7eXhkZI1FvPgYPu+otmc8i/11RMxfMluTBZ3MGIuD44QQoSCmfIlNjuL8h+eWW76W+d6+5aCI8vBUQRYihwQKAEbqrsHyeQgW+6Hi2E2VEIhAgQR0/B8VqGExTywhB1hI1YDBBhjqoYFlZHUzAG7bT8pRAkBjAgBxsKyikjQGp5whhMmdQxi1r0NBmaZSAimBbPqPykgN4h52fhNJXfqrgN/0okXorTtsPJM+ZIXb/9fp0q7dBk5TdM07SQdwGvamZjUbfpblwaHhcy5zCRIi7rPueh9hGCjYFZAKYmklBKUShEhEiMFjIoUqxALZcqusdTFHYYtkzkISDs64VnlUZqln6dojfWNft1DjG0bd9ze4jcjQZk9tnPs6hpG8ERCZU3TtJ8r5REAOKyoAFIedeP5ftSSUkbQ2lK/wjScQbwiZJrwSILqBYtScRPbHisXzKdYXvSUClZVyHyZzIZpz2NlixUUKJPYxfLYpL+94k5xmf3o+DePLD+EAWOi2uE8pWbNmeKKE2ykPKaGXTSrKU+ihPQEEkasEE7AlApBoW8LQJjZpr/Ru7yZbPCsGmCI88Agpm14dnGbUvLkgvynNFXY+bu/8Pmj/Qe74YLv1DdXryiYNaRXIWmapmmn0AG8pp2JSZ2yM44AKVAAYBCz8nMmZz77mdSdqe4+1n1kEK8MUZtiQyEeKcwo5EANw8WFiuNPzIX7eCwYYgw7UuaZSF1WsuiZlg0ghMt2s6QapmUWGrvy2u6s/wg1CkpktLAds8oZttU0TQMAgg0AyESSi6Q1nAVQFNPDnfv6edOg1DVLXGSLg0PdaOFEb69vVoHAse7DlDKCjbHCxlW+iml4NXeyW5gRUhateis4blC2tXpNs7jFYcVh0i7b45EXFO0aNcjxzt4w6zZK2wiQuf7eqfIlTW+LyZzF2cd+1Lk/ywAg4aayM9o1HB9kkVgGNmsw0Uwmx6a3x14G8DPdvWeO3kcoNndP/NJZHz5N0zTteUMH8Jr2NHyr7hjFlEeEGCZ1nqPD7wBAMJ0pX/oLm249MdjHlpyVwdFMximPMBCbODVnQ9Ef961qjy8hQKlIhOKpiD2zXC9sfMoUeqdBCBNMEXWpsxEhCkoAIGKNYUvXgdc07WlY1DWImeRBL1rsJSsuq4TpoGQ1UxHN9/e7rCylqLqTQnCKDwmV16wN0hTdcL5tjVXcyVGljKclFceYWEZhELeCrMMVJ5JihE3qAgAlbKq0czjsSiWkRP14GWHIeWyZlYJV3VF/4RXTN2d58sNjrQquKZvIfjowuilWVmb5ZmVqw/ZJtplxZln1wItSixcB/byVR5qmaZp2bnQAr2lPjxJGL4okwLZR2Nn8hYnyzs2VK9rR3PHeY2HSFUqMF7ZMlnZU3SkAVfc27l36Xmt4LMqDujezbeyF12961Vm9CjZr2KwqmSFkwCpGnDRN0xDCY95Gg5hH2w+nIiaS+UZNIDHhb0cYC5VjhChhEgQgHKT9RpGBSAmxCKZcpKsM4E3qIIQMbBbtsZwnjJgNf3PD3zTKhGcbnmdWACEhRTdcqPsbCKCKO4ERaRQ2jfmbMSImscpGo4gdq2zOqQaTJKd0s13cuWnTZVt/cXPt8kHSzng8ekcVp6mLaGqapmlrSwfwmvb8ggAXrXrRqjezbRsre7jMMSK+VbONwmh6Z9Wbbha2LAdHEx5N+Js3VV9gGueQdh8hrG9bNU07C5SwurfBol7Rrj9y4juDpDXp78KYYowopplIgrTDZRakHYqNfrRMsWEajkEssrroHQAoZkW7oZSaHxwY9zcDoInitlE9dgAAQI3Cpt2N/zTMl5lF0zxyWHE5OIqBTJZ31r1pAECEzNT28Nn+3vi47XoQzBQaU1svuWR8bLxkj9uG57JyJmIhBSPWaRnyNU3TNO2Z0z8tmvY85bDiKbetP2VRd+vYNVvHrrnwTdI07Xku5SHGuO5NT5cuPS4fT0RgC3uitIsZdpwN9y59T0jum1Wb+Vwkrulvqb3AZcXTRrkVKC4yjMhTxs9Fq25Tr2SPY4Rt5p82dI8RKTvNGpkqFAoAEGX9qjdFEHVZaTQPK86GYswYv3RPLd4mAFFs1jdtMWs/cy1lxIafKWOvaZqmaWtGB/Capmmapq0zBWpleCzOn6g6WbaaxcZEzAdg5FzkRavGcWoSmzFnsrhjmLQds1R1JipOs+j8TE31KBt0ojkhOQA4rFh1JzE6PZhm1GbUXk2rTuvo/Gmlek81Kxtr1pRXrIKhg3VN0zTtwtEBvKZpmqZp62wQt+J82ApmTcNL8sDFtTgNB2nLMPGJ3qOM2kqpmAeNQhkhVHOnh1m77IyXnPFTd8Jl1gqPz/f3m9TmIh8rbEQI19ypNWlhdrJSvd2QSiwms4TanjH29FtqmqZp2trRAbymaecLF1kmEoqNVQ52aZr2vJWKcGFwsO7NUMxsw9s//yOCrEGyAlnOsDkU8UL/oG24FFOlVNGuG8TCT5ohH2dDpaRnVgpmRSq5NDjcLG6Dc0ji8VRGqelsVrSNAgCkPBSSc5lRfDGkONU0TdOeK3QAr2naebEyPHqivy/jCQIoO80xf1OU9hQAxYZv1XRpJU3TToUAA4CQnGImlchkEiVLGNExe1oCnx/uRwiX7SYXPOEBAFzavNF9UhYPCXJhcNC36gCAEUYIKVAK1JqU/xylystFokAppbjIEEIXJk1dnA8zHhNsuKy4mmLymnYhKaWUUhjrT6amXSA6gNc0be0Nk86R9kOPLd6T5GGUD0pWvWDVKTEMYlXc5mRxZ8PfbNE1GhfTNO25z2XFpr91sX+YUTMXadWZkly4rJKJRAIfxh3AoEBRYljIHfe3VN3JJw99W9Rt+luXh0ek5LlMhRIWddYkegcAizqMWCmPlgdHFKhxf4vDSqN+h/NHgVoZHo3zYGFwsOlv7SfL44UtOrm9tu6klJ1Op9frRVGU5zkAEEJs2y4Wi5VKhTE9LUXTziP9G6Bp2trrRQtzvb1cZMOsE2f92c4jBrEKZsWzinVvQzc4OohfMF7cWrIbBrHWu7Gapq0/hxXLzjhCWCkJgOIockn1aO+BJBsO01bCA9esgEJpPjSoXXUnClb1yTsxqVOyGwghpRQAUMwqzuRatRAhXC9spMRM8gAh5LJSyW6s1c5/niDtxHnQCo8XrXonmk95ZFG3ukar+jXt3KysrCwsLIzi9pOEEEEQBEGwsLBQr9cnJib0mLymnSc6gNc0be0J4IuDQ71wkSojj2PO0zgbhEnLHuKFlfuKWD1OvVL9upsu+a9TxZ2j4kyapj3P+Va9YFa5zCk2AiNY6B2eKV4hSdSKjoX5oOZMW8yNsoHHSgVW/Xnj6kV7zDVLSR4STG3DgzUafh+h2Kh7M2u4w6eV5tHC4GDVmWTUto3C4vBwkocXsgGadiop5bFjxzqdzpmfs7S0NBwOt2zZcl6H4u+9997rrrsOAO644453v/vdT/mcZrO5uLi4d+/eHTt2PPlfX/WqV339618HgI985CPvf//7z19TNW1t6b4xTdPWXgFX6nwiCLvhyvIgWoFUYIEZl4Inicw7PO2krceO/3//592v/uajn07yYL3bq2naswJC2CAmQhghXLGnJv2d28eu39V48YbypTOVXUVrzGHFurfBMU9f/X4qiplnlm2jsLbR+7rAmAAAFxkAcJUDwMn582HWXRwcmu/vb4dPlM3TtPPtyJEjZ47eT4qiaP/+/ZxfiE/m7bfffvDgwbPdqtvtfvOb3xz9/ZWvfGWtG6Vp55EO4DVNW3ulYaHUtgupm6mUpkSBwgqoAASQSxUp3Jc0UZDx6FuPf+7/+fZv3z/7zVxm691qTdMukFFJtmHa5jI/w9MoZg7zPasilGgFJ8KsB6AMaprPygwaKsllO1L9BIRaq326rDThb+unK/P9/bOdR1xWNrAFAIOk1QpOHO08NNt99MDKDxcHh6QSa/WimvaUFhYWer3e6p+fpunRo0fPW3N+Ko7jt7zlLWe71de+9rUsy7Zt20YI2bt374MPPng+2qZp54OeQq9p2tqTUXYJXNWhi3PRoRY/IRXPWSoxAEKgkAKwEU8R5hK4yg607zv2w8f8H99hMds1Ky/f9V93jr9ovd+BpmnnyzDtdMN5BQoAEFqsudMO88/w/Io7sRWujrK+AsWoXXEmnoVZ3MTSULb+Y3I7wXRjBVlr0EiTOrXCTJj3+/Fykgcr4axvVc3UHiQrC4NDVXeSYrMXLw6SleXgaD9aFiCmS7u21K8i6Fl3iLTntDzPFxcXz3arfr/f7/eLxTNNmXmGms2mEOJf//Vfv/CFL/zO7/zO6jf88pe/DAC/+7u/+61vfeuuu+76q7/6qyuvvPK8NVPT1pK+vmuatvYQJQSMrcblE4OxI8v3Hy+dWBpvgZETJTFgAEWQAgVKIaSQBJVmw5UsAACE0L7Fe6fLO9943SerzpRteLpmkqY913GRjQbbGbEcVuyG8wv9Q55VUkqFeQ8jbLPCGXLFY0Rq3rSCKSnFszB0BwAV57IV8qMdXLIhEzJIESN081Ok2TsHJrEdwx9EK5urV0pQC4NDAKCUJIgyYo/+fvD4nZ1oth0upDzeUNl9pP3QS7a85szdIpp2VpaWlqSU57DhwsLCeQ3gi8Xi7bff/rrXve7d7373r/7qrzabzdVsdezYsX//938nhLzuda8rlUp33XXXV7/61U984hM68Z72nKA/ppqmrT1ctt3tU/VsvBZUd87v3HZk0+Yjm0rdoplTC4FSEAiSA0YACuBkpWaFlAQFSLV781/8t//2+X9+z9/94P/KRbre70bTtHOXiWR+cGDf8g8Ote7vxUvHOo8IJRxW8MxKwaoyYgvJ+Sq+5gguUNH1c6CijB9u44qDSzYe8xDFKuEg12YifcpjAHBM32a+y4oWdQAAAAmVR9kgE3ErOL4Sza0EJzCmDvOPdH6yf/kHh1bu15PqtTV0VpPnTxWGYZad3yVyr33ta3/t136t1+u9/e1vX+UmX/nKV5RSN9988/j4+C233MIYm5ubu+eee85rOzVtregAXtO0tYcrjj3VKO/eXviVPcUX7NwOu3d2dly5/4X15c1WYmKMOEZCIfnEkBtCCCGlEGAMGCmSoSTkvUG2dLj90N//8P9e3/eiadoz0Y+X5vv7PbNcdae64cLi8ECU9Ub52ADUKPsaQmR9G/lMYUQ3VyEXAABSgVSA1iyD3qjbIheZUlIqOUoXUnWnRmXh2+GcSRwkJSV2waqW7KbLiimPBvFyJpK1aYH2vJdlWZqee2d6EJz3VLWf+cxnCoXC17/+9b//+79fzfNH8+ff8IY3AECpVLr55pv///buPM6K6k74//fU3ZfeG6ShQZBNUDEoBCQyUTQqxKC46xiTaOI8UaOTGIzRMWYx6pBnRv1NEhOjmYk64IJKNIP7IzguKIsaFRRUULaWpvfuu1ed54/K3F8/3U3T0N1VXfd+3n/wutStW+db59tVdb+3TlWJyNKlSwc1SGCgUMADGBS+qlj8iHGjjps1/jvnjPjOKbUnzR17+OwTj/yH4yf9r2GlR/qMqBKltBiWiNJatBaltDbE51M+0TprZXLabM827Gz5sDmxx+21AXCQMrmUiMSDFUFfOBau8KmgiKRziT1t2/a0bctZmbA/5jcCbofZL0ZJWAxltaTMHS25z5p8YyuNsoiogangg/5IyB/NmEm7x0wrGw2WloQrR5SOnzjsi+Orjz2kbGwoGM3mkhkzlTZTPuU3lAoGop6/BT+GjC6PfD9Qg30GXkRGjx59++23i8hVV12138ECGzZs2LRpU2lp6cKFC+0p559/vogsX77cgVCB/huio9EAFAxfPHTI9OkVYyeYuXSgJH5ULDStZcFfd7247rOn69s+y5kJS1uiRXxiabHPygeMSMgXCapQTuXS6fa2ZEN5dLjb6wHgYAR8QRFJ5ToigXgq266UGh4fWx0fncp2KFGRYElldJTbMfab3/CNqVABn07nRCmjLGwcEh+oZStRw+KH+o1gMtsmIrFgWXl0hIiE/NGQPyoipaHq7RUf7Gr+aG/b9qAvEvKHK6I1VbFR9hXyQP+ZZr8ux+jnx/vou9/97tKlS1999dUf/vCH9957by9z2qffzzvvvEjkb9vIGWecEYlEmpqann766TPOOMOBaIH+oIAHMPj8RnDY/38Pm9ryKbXlU+ZN+ua7u1/+tH59R7Z5e8PGHa1bLDEDEg74wgEVihgVIsrQOhIu9/tCLsYOoD9KwsNqSifsbv2oOfm5iIwsnVQRq/EbQa0tpQZuoLnbjFjQmFAtpqWVUsYAr5TP8FfHR+/r3VAgOnfihaXRii17N2htVUZGThg2c1T5ZO4AioHi9/erXggEnBhio5T6wx/+MH369Pvuu++iiy6aN29ej7OZprls2TIR+frXv56fGI/Hv/rVry5fvnzp0qUU8Bj6KOABuCPsj88cvWDG6PlaW4bypXOJNZ889mH9m3sa6rJmMquThgSCKji55ouV8T7dVBbAEBQJxA8pGRf2x3JWNugPl0cO8RtBESnM8tI30LV734QDsVljz/7i2LOyuZSIBPzhXu7qDxyoUKhfP6P38+N9N2XKlBtvvPEnP/nJ5Zdf/u677+ZPsHf24osv2s/D+/KXv9z93aeeeqqtra2kpGTQYwX6gQIegJuUKPv+VSF/9MuTvv7lSV9v6NjxX+t/35psCPsjk0cdd+TouSE/A0EBDwsH4uHAgA0px74oUUH2lhgEPp8vHo8f3L3oDMNwsh6+/vrrH3nkkffee+/mm29esmRJ9xns8fPV1dXV1dVd3vr444+TyeQTTzxh39wOGLIo4AEMLVWx2kv+7hdZM23pXMAXNrx+e2oAADyusrLy4Ar4srIyJx+uHggE7r333jlz5vzrv/6rfWu6zhKJxBNPPCEiDzzwwGmnndbl3fPOO+/RRx9dunQpBTyGuEIcwAbA+wK+UMgfo3oHAMB11dXVBzESXik1cuTIwYinF7Nmzbr66qtN00thOFMAACAASURBVLzssstyuVznt1asWNHe3l5dXX3yySd3/+AFF1wgIi+88MKePTz7BkMaBTwAAHBHxky1pRoSmRZLm6lsR3OiriW5J2se/BOnAQwGpdSYMWPUAT4csaamJhwOD1JIvbjlllvGjh37zjvv7N27t/N0e/z8ueee2+Nt+RYsWFBSUmKa5sMPP+xQoMBBYQh9n2itU6lUS0vLQC0w/0SNAVxm3yWTyXTa0a9H+fVtb28/0L1/P1mWlU6nu/wEO9jy65tIJFKplJNN22vq8N+V1tp+4XxXW5altXZrfXO5nMNNW5YlIq2trQ5vR/nW7fVta2uTA3kykN1jyWRyALvLXqZb2e/o6Egmk062m9+ynM++fQQcjMcjt6bqW9P19utktjXoCzckdojIIfHxZaERIV9cRDo6OhxeX9M0TdN0ZdMWkWQy6fCTqE3TdHEvmslkXOlqV759iUj+T8seju7M89UGSmlpaW1t7fbt2/s4f2VlZU2NO/egjcViv/vd77oMkt+zZ8/zzz8vIhdeeGGPnwqHw2ecccaDDz64dOnS733ve04EChwUzsADAACnZa1Ua7p+b+Kz9kxTU2Lnp03vbG18uyRUHQtWft7+SXOqLl/jARgihg8fPm7cuL5c0z5ixIhx48Y5ENK+nHrqqZ0fFCciDz30UC6Xq62tPf744/f1KXsU/Zo1az7++ONBDxE4WJyB7xOlVDgcLisr2/+sfdPU1GT/7DqAy+wLrXVDQ0MkEnF4RFNbW5t9zj8ej/fzaaIHqqmpKRgMxmIxJxtNJBKJREJEotGoY09PsbW2tmqtHf67ymQyra2tIhIKhZzv6lQq5fD6mqbZ1NQkIn6/v7S01Mmm0+l0W1tbaWmpk/cEEpGGhgYRMQzD7mr7jKjP19c7FNjzRyKRAcxUQ0OD1lop5Ur2Y7FYMBh0st2WlpZsNisirmQ/HA73+ECm/mhL5dpa6oaVj4wFy5PZtjZzT8gfra4YocRo7FCGUqbO+lUwFos58xDpvObmZp/P5/BzpFKplH1KNhKJDHhX9669vT2Xyzm8HWWzWftEdDAYjMcdfUJBMplMJBKufPsSEZ/PZzdtr3Xf96JDR2VlZSwW27VrV2NjY48zxGKx2tpaB9I6a9as3n/mu//++++///78f6+++uqrr76692V+9atf5adDDH0U8AAAwGmGYdSUTmhN1duvtdamzmoRyzJzVlZ8wj0sgaEpFAqNGzeutra2paWlo6Mjm81alhUMBu1zXQ7/AgUUIQp4AADgtLC/xFC+jkxL1kznzIxhGCJGfes2LaLFigXLKeCBoSwQCPT4NHUAg40CHgAAOM1n+IfFDzWUL2dlRGR05VGGknQuaSgjFizzmbFMOut2jAAADDkU8AAAwAXhQGxU+WTTyhmGof7fu+q2t7eLUMADANAVBTwAAHCNz+CrCAAAfcVj5AAAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAGAiWdjsCAECB484xAAAA/WK1psy6NsmaYiijMuo7pMTtiAAAhYkCHgAA4ODpVM7c0Zz7uEEFfTpr+S0tPsNXHXM7LgBAAaKABwAAOHi6NZX7uMGoihplEZ0xc580BMJ+oYAHAAwCroEHAAA4eNq0REQFfPl/dc5yOSYAQIHiDDwAAMDBU9Gg/7Aqc3uzylqSytpT3A4KAFCYKOABAAAOnlEW1q1hGV2e+6TBf1iVEfD5RnATOwDAoKCABwAA6Bff6HLVnjYOiauA3ygJiaHcjggAUJgo4AEAAPrLiIckHnI7CgBAgeMmdgAAAAAAeAAFPAAAAAAAHkABDwAAAACAB1DAAwAAAADgAdzEDgAAoGdadEe6uT3dqEXKI8MjAZ4PBwBwEwU8AABAD7ToutZPPm/9eEfzByIyPH5obfmUmvKJSnhKHADAHRTwAAAAPehINzUldn3ettXSpiHGx3s3BALheLiiNDzM7dAAAEWKa+ABAAB6kDFTO5o3JbKtldGR1SVjYuGKXc0fJTNtbscFACheFPAAAAA98Cm/EpUzs1pbOStjWaahDKX47gQAcA1D6AEAAHoQC5WPqTgqnXtzR9MHPp8vHqwcW3FUNFjqdlwAgOJFAQ8AANADvxEcW3WUUr6mxC5D+UpCFSPKxsdDlW7HBQAoXhTwAAAAPQv5Y5OGz7S0aVpZnxEwlM/tiAAARY0CHgAAoDeG8hk+SncAgPu4EQsAAAAAAB5AAQ8AAAAAgAdQwAMAAAAA4AEU8AAAAAAAeAAFPAAAAAAAHlDgd6FftmzZsmXLenzr7rvvHjVqlMPxAAAAAABwcAr8DPzu3bvdDgEAAAAAgAFQ4Gfgd+7cKSJ33HFH95PtoVDIjYgAAAAAADgYhV/A+3y+sWPH+nw+t2MBAAAAAODgFfIQ+paWlkQiUVNTQ/UOAAAAAPC6Qj4Db4+fr62tXbdu3apVq+rq6qqqqsaOHTt//vzy8nK3owMAAAAA4AAUcgG/a9cuEVm/fv2aNWvyE19//fUnn3zyyiuvPP7447t/ZPv27Q888ED36ZZlZTKZ9vb2gYrNsiz7xQAus+/S6XQul3OyxXxziUTCMBwd92FZVjabdbif8+ubSqWy2azzTTu8vvm/50wmo7V2sulcLqe1dnh98+uYy+Ucbto0TRHp6OhQSjnZrs2yLHt9Ozo68sH0XTqdHsDusrOgTat9b7OI6KBPGU70id1uKpXKZDIONJeX723ns6+1TqfTB5rufsrvOZPJZDqddrJpy7Kc36vku9eVrnZ+ffNHDVcO0M6vb55pmnbTiURCOvUDAPRd4RfwlmVdcskls2fPrqqq2rFjxyOPPPLGG2/ceeed48aN635nu7179z7++OPdFxWPx3O5XCqV6mdIpmmlUqa2dCDoCwUN0dL/ZR6EbDbrcFWZ5/BXXlsul3P4B4s8t7ralb8rETFN0+Gvnja31teyLFeadrieydNa2+tr/9v3r5520ZvNZvvbXZbWyayYlkQDyu/Tyazsbk9mTRFRAZ+MLJGwQwc1V3ZlNley7+Je1K2udmVXJu51NUcNZ+SPGvaGTAEP4CAUcgE/derUSy+9dPLkyVOmTLGnTJw48cYbb/zpT3+6YcOGpUuXLl682Ml46na3f17XYZlWLmeNivujWassGpCwX42IS6iQEwEA/aRzlvnSJ/LCViOV07VxdfgwndNWKqsyljq0TPkMK5k1RGRchbgwNAEAAMAhhVA3Xnzxxa2trfn/zp07167MZ8yYMWPGjO7zn3HGGRs2bNiyZUv3tyZPntzjEPorr7wyHA4f9JXzlqXXvvHZxvc/31PXrpSOBI3PMubY0tD46lBNSdwXifknlIlTgz9bWlqi0WgwGHSgubxEImGfRSkpKXH4noKtra2BQCASiTjZaCqVsn9id76rOzo6tNbxeNzJRrPZrD2mOhQKOd/VmUymtLTUyUYty7L3OYFAIBaLOdl0JpNJJBKlpaUOX4rS0tKitTYMw+5qu3W/v69HEHvIdzQaPbi9qE5mW29+2vzvT7SZtbTPeiunnvzAMsTn95vxUOy0qcHTJummhBGO+sIxFQkcRBN9Z2c/FosFAoPbUBft7e32iVlXsh8Ohx1+9mr+qBGPx/v+lzYg2trafD5fNBp1slF70xaRSCTifFebpllSUuJko/nrj4LBoMNdnU6nU6lUWVmZk43a375ExO/32wdoe1/KXZYBHIRCKOCnT59uH/Zs48eP731+e+R8fX291rrLlYTRaDR/ur4LwzAO+jvEO2/tePXlrY2NSdO0RKlmbSmldidzHWF/1XBfXCsjZRql4YNb+AGxB7L2Z10OTr6ffT6f8007v775r9eurK8cSGU1IPKDAN3qaocbzQ/4VEq50rTf73e4hLPl19f+90CvxD7oP4+Wf1uVeWmLiFba0GIpMSwRZRmSMY3mVOqlLb5xFYGaEsPn8/v9apAzYqfArU1bXMp+se1Fnd+088PmXelqy7IcbjR/JxHn19e+rs2t9c3/admluyt3MwHgdYVQwF977bXdJ6ZSqeeff94wjAULFnTZPzY1NYlIbW2tM/vNTMZ8efXWvXsTIlqLNixtihiiEmnz/W3Nh5WFj6itkhwXQQFAN1pn397R8fDbYmmllBYRUSJaKaXEMrU2tKWaOrIf7vGVhX0Bnwo7elYcAADAYYVQwPcoHA6vXLly586dhxxySJeB9C+//LKITJo0yYEwtJYVy9/evq3Rsv+jtKWViIihtaXTOatpb1JrUVFHR1kDgAdonX1nV/t/bvBlc6ZSSolopcUSEdGixfIpnxZtWpavLBqYPNw3upwL4AEAQGFzYRCmYxYsWCAid91119tvv21PyWQyjz766F/+8pdoNHrhhRc6EMNzT3+wdu0OS2sllijRYogylNKiLVFiaPFXxVRlVDl152QA8AqrJZXb1pRe9UlO2z+BakubokWJGCJKDK20EjHKY6GTJvgnVA/21e8AAACuK+S68fTTT9+0adMrr7zyk5/8JB6Px2Kx+vp6y7Jisdg111xTXV092AF8tq3xxRc2a60NMSzLVD4tlhalRBsiSiltRAOjjhkVGOno/bcAwBN0Kptas1V1pH1iKLEsEVFKtNZ/G0WvRRtW0Ih+Y2ZoetdnggIAABSkQi7glVKLFy8+7rjjnn766V27drW0tIwfP37ixInnn39+RUXFYLdumdaTK961cpYWbSpTiYjlE/vcu6FEW8FQcNZxtaPGDfrvCADgRcpQmWc2m6JERIvyiRYRrZRPlCmWVoaqjgWunFV+3ky3IwUAAHBIIRfwIqKUmjt37ty5c51vuq6uZftnLcoQbRmG0lqJ1pbSSkT5fap6ePzLf3fo6HGlIQbPA0BP0i99kktnDDEMsUxRlijRWhtiWqZRHlXH1aqzjvBNHe52mAAAAM6hehws7/11t6VFtDKUZVlKDDHE0MoK+o2jvjBy+rGHVFWHeXwIAPQsZzb+6v8oUSKSE2WPX1JKazH80VDgtKm5+WNlfKWwFwUAAMWEAn5QJDoyqYxWoi2lRfsMpUVrrUxDGTOPGzt79thAKCui3Q4TAIao3GetKmMZSrRlGUoppbVWSgzROZl9WOiLtbnqmNsxAgAAOK2Q70LvIkvrklgwHPEr+05LSrSIUmrc+IrZc8aNGFnq89HzALBPVkdKfKaplTZEibK0VkosMaW2PD7/iMBh1aos5HaMAAAATqOMHBTBoL+8IlIzoiwWCxtKRHQgoCZNHn7u+ccMHx5jyCcA9M5/aEWottrnE9FKK621oS1LoqHKJQtDXxrrnzycwfMAAKAIMYR+UASDvtFjKsyctXnznva2TCQaOGpazdHTR3HROwD0hVEaDl36xdzvX1Pb92ptiE/JpKqahy+VIIctAABQvPgmNFiqh8Ui0cChh1VZllVaGo5EAm5HBABeEl90ZOTI4amXP7JSVmDmmPDMMcJPoAAAoLhRwA+iWCwYiwXdjgIAvMo3cXhsIg+KAwAA+BuugQcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPMDvdgCeYVmWaZoDtTSttf1iAJfZ93YHdl363q4rTdutO9yoZVn5F853tYvr63zT9p+Ww43mm3Orq03TzG9TDrPX1/73QGMYpM3Bley7uBd1JftFddRwdy9abOvr4l7UyUbzf8/59bXDcGtPDsDTKOD7RGudSqWampoGfMmDscz9SiQSiUTC+XZFpLW11flGTdNMpVLOtysiHR0dHR0dzrfryt+ViKRSKVe62q31zWazrjTd0tLifKMiYpqmvb5tbW0iksvl+vhB+0tqIpEY8O6yLMuVFLS3tzvfqM2V7CeTyWQy6Xy78j9/bA4zTTOTyTjfrrjX1W7tRdPpdDqddr5dt9Y3l8vZTdsbsvOnNAAUAAr4PlFKhUKhsrKygVpgW1ub/ePrAC6zL7TWra2tkUgkGAw62W4ikchmsyISj8d9Pp+TTbe1tQUCgXA47GSjqVTK/kYSjUYDgYCTTdu/F8RiMScbzeVydruhUMjhrk6n05lMpqSkxMlGLcuyi4pAIBCNRp1sOpvNJhKJkpISw3D0AqjW1lattWEYdlcrpUTE7+/rEcSePxKJDOAer0tIjrGz78qmbf9i4kr2Q6FQKBRystFkMmmX0LFYrO9/aQOivb3dMAyHN+1MJmPX7eFw2PmuNk0zHo872Wj+qBEMBiORiJNN2z8ZlJaWOtmo/e1LRPx+v32AtndcDn8jAlAYKOD7yufzDeDXNfvrrIg4/BXQPg82sOvSF/mvm36/3+GvYkopwzAcXl/71wpxqau11q78Xdmtu9LVDjeaP2eilHK4afuHv0Ag4HAJZ8uvr/1vfj/WR4O0ObiSfb/f73C7nY8azmff+V1Z/qysK13t/K4sv1dxpasty3K40Tznu9r+Icyto2R+L2p/FzrQvSgACDexAwAAAADAEyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPMDvdgAD4Jlnnvntb397zz33jBgxovu7zc3Nf/rTn9566622trby8vKZM2decMEF5eXlzscJAAAAAMBB8/wZeNM0n3nmmX29W1dXd91117344ouNjY2xWKy+vn7lypXXXHPNnj17nAwSAAAAAIB+8nABb1nWli1bbrvttk8++WRf8yxZsqSurm7GjBn333///ffff999902cOLGpqemee+5xMlQAAAAAAPrJq0Po77///hUrVuRyuV7m2bx580cffVRVVXX99dcHg0ERGTZs2M0333zppZeuW7du79691dXVTsULAAAAAEC/ePUMfG1t7bx580455ZRTTjklEAj0OM8LL7wgInPmzLGrd1tpaemxxx5rWdaqVaucCRUAAAAAgP7z6hn4efPmzZs3z369Zs2abDbbfZ6dO3eKyLRp07pMnzZt2uuvv75jx47uHzFNs6Ojo8cWtdZa634FvY/FDvgy+9Kcw+12DsCVpl3s56JaX+ebdqVRF9fXbs6tv6vOARzcZwtmL+puCophK+vcbjGsL0cNh7m+vm5tUAAKgFcL+L5obGwUke43nLen2O928de//vU73/lO9+nxeDyZTDY0NAx4kIOxzP1qb29vb293vl0RaWlpcb7RZDKZTCadb1fc62pX/q7Eva52a30zmYwrTTc1NTnfqIiYpmmvb1tbm4j0+Mtpj+yvqh0dHQPeXZZluZICuwdc4Ur2Ozo69vXr9mBrbW11vtFcLpdOp51vV0QSiUQikXC+Xbf2oqlUKpVKOd+uW+ubzWbtppubm0Wk90tBAaBHXh1C3xf2LrKkpKTL9NLSUnHvGzAAAAAAAAehkM/A25RSXabY54J6/NUzGo1OmTKl+/Tt27cbhuH3D1h35VsfwGX2vWnDMAzD0d9uLMuyLEtEfD5f94wMKtM0lVJFtb52u042qrW221VKOdy03dUOb0curq/dtCv7Dem0vnYAB/q3XRh7UTsF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bRORQw899JBDDnE7nEHX2tr6wQcfiMiwYcPGjRvndjiDLpfLbdiwQUTi8fjUqVPdDgeAt1HAAwAAAADgAQyhBwAAAADAAyjgAQAAAADwAAp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMAD/G4HUIyeeeaZ3/72t/fcc8+IESO6v9vc3PynP/3prbfeamtrKy8vnzlz5gUXXFBeXu58nANr2bJly5Yt6/Gtu+++e9SoUQ7HM0gKNX37UiRpLbZttpf1HQoZL7Z05A2FzndAAWewR0WS1mLbbIf4XhSAp3EG3mmmaT7zzDP7ereuru6666578cUXGxsbY7FYfX39ypUrr7nmGvtxuJ62e/dut0MYdAWcvn0phrQW2zbb+/q6nvFiS0dnrne+Awo7gz0qhrQW22Y7xPeiALyOM/DOsSzr448/fvjhhz/55JN9zbNkyZK6uroZM2ZcffXV5eXl9fX1t99++5YtW+65555/+qd/cjLaAbdz504RueOOO7r/uhwKhdyIaOAVcPr2pbDTWmzbbF/W18WMF1s6uivszc1W2BnsUWGntdg22yG+FwVQGCjgHXL//fevWLEil8v1Ms/mzZs/+uijqqqq66+/PhgMisiwYcNuvvnmSy+9dN26dXv37q2urnYq3oG3c+dOn883duxYn8/ndiyDorDTty8FnNZi22b7sr7iXsaLLR09KuDNzVbwGexRAae12DbbIb4XBVAwGELvkNra2nnz5p1yyimnnHJKIBDocZ4XXnhBRObMmWMfw2ylpaXHHnusZVmrVq1yJtTB0NLSkkgkampqCvhwVcDp25fCTmuxbbN9WV8XM15s6eiusDc3W2FnsEeFndZi22yH+F4UQMHgDLxD5s2bN2/ePPv1mjVrstls93nsUVXTpk3rMn3atGmvv/76jh07BjvIwWOvWm1t7bp161atWlVXV1dVVTV27Nj58+d7+i41nRVw+valsNNabNts39fXlYwXWzq6K+zNzVbYGexRYae12DbbIb4XBVAwKOCHkMbGRhHpvge3p9jvetSuXbtEZP369WvWrMlPfP3115988skrr7zy+OOPdy+0AVPA6duXYkhr74ot6UM844WdjiHe+QOisDPYo2JIa++KLelkHED/UcAPIQ0NDSJSUlLSZXppaamINDU1uRDTALGPWJZlXXLJJbNnz66qqtqxY8cjjzzyxhtv3HnnnePGjSuA56YUcPr2pRjS2rtiS/oQz3hhp2OId/6AKOwM9qgY0tq7Yks6GQfQf1wDP+QopbpM0VqLyH5vizKUTZ069dJLL7311lvPOeec2traSCQyceLEG2+88ZhjjslkMkuXLnU7wAFTkOnbl+JJa++KJ+meyHihpsMTnT8gCjWDPSqetPaueJJOxgH0H2fgB9LFF1/c2tqa/+/cuXMXL17c949XVVXt3Lmzra2tpqam8/S2tjYRqaysHKg4B8++emDGjBkzZszoPv8ZZ5yxYcOGLVu2OBfioCmA9B2oYkhr74ot6YOdcXahwl7U+xk8IMWQ1t4VW9LJOID+o4AfSNOnT08kEvn/jh8//oA+XllZuXPnzpaWli7T7S9zVVVV/Y9wsB1oD9hDxerr67XW3X+A95YCSN9AKaS09o6k2wYq4+xChb2o9zM4IAoprb0j6bbiyTiA/qOAH0jXXnttfz4+cuTId9999/333585c2bn6Rs3bhSRLj9OD0099kAqlXr++ecNw1iwYEGXw5J9eVttbW0BHK4KIH0HpEjS2ruiSroDGWcXKuxFvZ/BviuStPauqJJOxgEMCK6BH0JOPvlkEXnttdcsy8pPzGQya9euVUqddNJJ7oXWL+FweOXKlb///e/Xr1/f5a2XX35ZRCZNmuRGXAOsUNO3L0WS1t4VVdKHfsYLOB1Dv/MHRAFnsEdFktbeFVXSyTiAAUEBP4RMnjx5/PjxdXV1d999d/72LUuWLEkkErNmzRo+fLjbAR68BQsWiMhdd9319ttv21Mymcyjjz76l7/8JRqNXnjhha5GNzAKOH37Ugxp7V2xJX2IZ7yw0zHEO39AFHYGe1QMae1dsSWdjAPoP2XvLuEk+x5F99xzz4gRI7q8tXv37ptvvrmuri4ej48ePXrr1q2pVGrChAk/+clPuj8l1UO01r/61a9eeeUVEYnH47FYrL6+3rKsWCx2zTXXzJ492+0AB0ahpm9fiiStUnzb7L7Wd4hkvNjSYRsinT/YCjiDPSqStErxbbZDfC8KwNN8P/3pT92Ooeg8/vjj6XT6a1/7Wjwe7/JWSUnJ3LlzW1pa9uzZs3v37rKyshNPPPHaa6/tPqe3KKXmzJkzevTo1tbWRCLR3t4+duzY2bNn/+hHP5o4caLb0Q2YQk3fvhRJWqX4ttl9re8QyXixpcM2RDp/sBVwBntUJGmV4ttsh/heFICncQYeAAAAAAAP4Bp4AAAAAAA8gAIeAAAAAAAPoIAHAAAAAMADKOABAAAAAPAACngAAAAAADyAAh4AAAAAAA+ggAcAAAAAwAMo4AEAAAAA8AAKeAAAAAAAPIACHgAAAAAAD6CABwAAAADAAyjgAQAAAADwAAp4AJBdu3Zdcsklo0ePjsViv/jFL9wOpwDddNNNSiml1BtvvNH7nNOnT1dK1dTUdJ9o++STT/bb3CWXXJKf/89//vO+Ztu7d28gELBnO+aYY3pf5sMPP6z2IRgMHn744QsXLrzjjjsymcx+wwMAADg4FPAAil02mz3ttNMeeOCBHTt2JBKJxsZGtyNCb5YvX977DNls9qmnnurLoh599NFcLme/fuuttzZv3nxwIWWz2Q8//PCpp576wQ9+cNRRR+33RwoAAICD43c7AABw2csvv/zuu++KyEUXXXTFFVeMHz/egUZvuummW265pbq6ur6+3oHmCsmjjz563XXX9TLDiy++2Nzc3JdFLVu2rPN/H3744Ztuumm/n7r44ouPP/74zlOampo++OCD5cuXd3R0bN68+bzzznv//ffj8XhfYuhi/vz5zzzzzHvvvXfEEUccxMcBAEBho4AHUOw++ugj+8Wdd945bNgwd4NBL0KhUDqdXrdu3bZt28aOHbuv2R577DERCYfDqVSql6Xt2LHjlVdeEZH58+evXr06kUg89NBDfSngTzjhhMsuu6z79FtvvXXhwoXr16//7LPPfv7zny9ZsmS/i+pi9+7dzz///IF+CgAAFA+G0AModvlB1FTvQ9z06dOHDx8uvY6iN03Tvuj91FNP7X1pDz/8sNZaRL7zne8sWLBARDZu3Pjee+8ddHgjR4588MEH7dcvvfTSgX7cNM1vfvObpmkedAAAAKDgUcADALzB7/cvWrRIRB599NF9zfPyyy/X19crpew5e2GPny8rK1uwYME555xjT3z44Yf7E+Hhhx9+6KGHisgHH3xg/zqwX/X19a+88so///M/T5o06bnnnutP6wAAoOBRwAMoXr/85S+VUldddZX9X/uO4t///vc7z/PKK6+cf/7506ZNq6ioKCkpmTp16te+9rU///nPlmV1X2Bra+svfvGLE044oba2NhaLHXnkkeecc85rr73WeZ7vfve7SqlbbrlFRPbu3Ws3etddd9nvDhs2TCn1X//1X1rrP/zhD7Nnzy4vLy8pKZk5c+Z//Md/5Fv58Y9/PHny5Gg0WlNTM2/evGeffbZLJCUlJfZyROS///u/zzrrrFGjRkWj0SOOOOKyyy7btm1bP+d3i11pv/nmm5999lmPM9jj54877rja2tpelrNly5b169fbCwyFQl/96lcjkYj0u4AXkYqKChFpb29PJBL7ndk0zeHDh8+dO/f666/vy931AQBAkaOAB4B9+ta3vjV37txHHnnk3XffbW5ubm9v37Rp01/+8pczzzzza1/7WpfRzq+//vq4ceN+8pOfrF69eufOnYlE4v3333/ssce+9KUvLV68+IDazWazixYtuvzyy5uamqZMmWKa5rp16771rW/deOON27ZtO/roo//5n/85GAweeeSRjY2NL7300mmnnXbffff1uKg77rjjhBNOeO655w477LAxY8Zs3Ljxj3/84+GHH/7qq68OyPwOO+GEE6qrq2Ufo+i11k888YSInH322b0v56GHHrJfXHTRRSISj8dPO+00EdmyZctbb7110OFlMpkPPvhARMaMGROLxfrykeM7ceYGigAAwMM0ABS3X//61z3uD3/zm9/Y0ydMmLBkyZLHH3/88ccfv+222yZMmGBPv+OOO/Izf/755yNGjBCRSCRy5ZVXLl26dMWKFbfeemv+eeYrV67svPB/+qd/EpHq6uoujdrV6dSpU0eOHPnaa6/ZE7dv327fk9x+QPqkSZPeffdd+62NGzeOHDlSRCoqKjKZTH459i3QL7/8csMwbrnllmw2a09/8cUXS0pKRGTs2LGd2z3Q+Q+Uvb4ismbNmt7n/MIXviAiI0aM6D7x+OOP11p/+9vfFpHZs2d3/2z+V4atW7e+8MIL9usVK1Z0n3PKlCkiUlNTY5qmPeU///M/7fmvu+66HgPL1/z33nvvvoK/4YYb7HkWLlzY+2r26He/+5398ffee+8gPg4AAAoeZ+ABoGf2DckmTpy4fv36xYsXL1q0aNGiRddff/26devGjBkjIqtWrcrP/PTTT9fV1YnI8uXLf/3rX1944YVnnHHGj3/849WrVwcCARF5/PHH+970xo0bH3rooeOOO87+b21t7a233ioiWuuGhoannnrqyCOPtN+aMmXKj3/8YxFpamrqPgb7nnvuuemmm2688Ua//2/PHJk3b96NN94oItu2bfv444/7Ob8r7FH0b7zxxvbt27u8ZY+fnzFjRi/3qBeRd955Z9OmTSJywQUXGMbfjoOnn356KBQSkUceeeRAQ2ppaXnzzTe//vWv33bbbSLi8/nsTgMAABhYFPAA0INsNvvJJ5+Ul5dffvnlpaWlnd8qKyubN2+eiHQuaDds2CAiwWBw/vz5nWeeOHHid7/73TPPPLOqqqrvrc+ZM2fu3Lmdpxx77LH2i7PPPnvSpEmd35o5c6b94tNPP+2ynPLy8h/84AddJv7d3/2d/aJ7QX6g87vipJNOqqys1Frb5Xpn9q8k+TvS7Uv+8e/2+HlbaWnpKaecIiLbtm174403evn4t7/9bfX/Ki8vnzVr1oMPPqi1FpEf/ehHX/ziFw98zQAAAPaDAh4AehAIBOrq6pqamn74wx92f7elpaXLFLs+z2Qy3avKu+6664knnrj99tv73ro9Yryz8vLy/b6lu932/Etf+lKXXx9EpLKycqDmd4Xf7z/jjDOk273o169fb99sb78XwNt3qps4ceKMGTM6T+//vegPOeSQxx577Je//OXBfRwAAKB3frcDAABvSKfTW7du/fDDD1euXLlixYou75555pn2pePnnnvuggULFi1adOKJJx70PcnyNXN3B3Qm/0AD8MpN1M4999x///d/f/3113fs2JG/27z908nRRx+dv0lBj15//XW7zu98+t22cOHCYDCYyWQeeeSRf/mXf1FK9biEiy+++Pjjj+8ysbKyctq0aRMnTsyPyQcAABhwFPAAsE91dXX//u//vnr16o0bN+7YsaOXU9DTpk37j//4j6uuuqqpqWnlypUrV64UkREjRpx88slnn332ggULgsGgg4H/zbBhwwZ1frecfPLJ5eXlzc3Njz/++NVXX21PtAv4/Z5+z4+f/9nPfvazn/2sx3l27tz5yiuvdLmKIe+EE0647LLLDjJ0AACAfuBEAQD07MEHH5w4ceINN9zw7LPPbt++vbKycvbs2d/4xjfuvffe888/v/v8F1100ebNm//3//7fc+fO9fl8IlJXV/fggw8uWrTo6KOPXrt2reNrIPs6hzxQ8x+E/Y7D78tA/UAgsHDhQuk0iv69997bvHmz7O8CeMuyugy835f+PxAeAABgwHEGHgB6sHbt2m984xuWZY0ZM+b666+fP39+5xubr1u3rsdPVVdXX3vttddee21LS8trr722evXqJ598ctOmTR988MGZZ575/vvv569XLzb2Y+pEZNeuXb3PuXPnThHpfil+F+eee+7999//6quv7tq1a+TIkfbp9ylTptjPh9uXl156yX5YwNlnn/2tb32r+wzZbPa8887LZrOPPvroXXfdZf8QAwAAMERQwANAD37/+99blhUMBl9++eVDDz20y7vNzc1dpti3tQsGg5FIRETKysrmz58/f/7822677ac//enPf/7zXbt2rV692r77WhGyH7wnIhs2bDjrrLP2Ndtnn322d+9eEen9OXAi8pWvfKW0tLS1tfWxxx773ve+Zxfwfb///Pe+970vf/nLPc5z8sknP/3003v27Fm1atVJJ53U+wIBAACcxBB6AOiB/Uz1iRMndq/ec7nc6tWru0w8/PDDy8vLzzzzzC7TlVJ///d/b7+2S9PidPLJJ9t3d7vvvvt27969r9muv/56+8WCBQt6X2AoFLJH0S9fvnzLli3vvvuu7O8C+EwmYz9nrqamZl/Xt8tA3IseAABgkFDAA0APxo0bJyKffvppW1tb5+mWZV122WV2CdrR0ZGffswxx4jIqlWr3nvvvS6LWr58uf2i+7PBc7ncQAc+RA0bNswesl5XV2dfTdBlhpaWlu9///v2GfKamppLL710v8u0K+1XXnnl17/+tYhMmDDh6KOP7mX+Z599tqmpyf5gL/eKP+OMM/x+v4g8/vjj2Wx2v2EAAAA4hiH0ANCDk08++Y9//GN7e/upp576ox/9aPz48U1NTe+8886//du/bd68OR6Pt7e3b9269aabblq4cOHMmTO/8Y1vrFy5MpPJzJs374orrpg+fXokEtm9e/eTTz5pn/U97rjjjjjiiPzy7RKxubn5scceO/zwwysrK2tqalxbW0f86le/WrNmzfvvv//mm29Omzbt1FNPPfLII0ePHt3Q0PDRRx89/fTTjY2NIhIOh5cuXVpSUrLfBZ566qklJSVtbW12Ad/3+8/3eA/CvKqqqhNPPPH5559vaGh44YUX5s+f39c1BAAAGGQU8ADQgwsvvHDFihWPPPLI66+/3nlgvFLqiiuuuPTSS+fMmZPJZG655Zb33nvviSeeOO+881avXv3b3/62vr6++8PJjjrqqD//+c+dz/oee+yx9gv7NPKdd955zTXXDP5quamiouLll1/++c9/fvfdd2cymaeffvrpp5/uMs9XvvKVX/3qV72fSM8Lh8Onn376smXLLMuS/V0An0gknnzySRGpra2dM2dO70s+55xznn/+eRF5+OGHKeABAMDQwRB6AOjZQw89tGzZshNOOGHUqFHhcPiwww779re/vXbt2t/85jfHHnvsCy+8cPbZZ3/lK1857bTT7Pl/85vfvPbaa+eff/60adMqKiri8fjUqVO/9rWvPfbYY2+//XaXR6yffvrpt99++9ixY0Oh0KhRo6qrq/sTajweHzt2bP5O767Pvy+VlZV33nnnpk2bFi9evHDhwqlTp0aj0TFjxpx00knf/e53n3vuueeee66P1bstX7SPGTNmxowZvcz51FNP2Zc8nHvuuft9Wt6iRYvs+8+vWLEinU73PR4AAIBBpfryxF0AAAAAAOAuzsADAAAAAOABFPAAAAAAAHgAN7EDAPTVX/7ylw8//PCAPhIKha666qpBigcAAKCocA08AKCvLrzwwoceeuiAPlJeXm4/fR0AAAD9RAEPAAAAAIAHcA08AAAAAAAeQAEPAAAAAIAHUMADAAAAAOABFPAAAAAAAHgABTwAAAAAAB5AAQ8AAAAAgAdQwAMAAAAA4AEU8AAAAAAAeAAFPAAAAAAAHkABDwAAAACAB1DAAwAAAADgARTwAAAAAAB4AAU8AAAAAAAeQAEPAAAAAIAHUMADAAAAAOABFPAAAAAAAHjA/wWXaDe+T1IQtwAAAABJRU5ErkJggg==" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4639,17 +4661,22 @@ <h3>Integration with <code>harmony</code></h3> compared to the <code>fastMNN</code> UMAP:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImhhcm1vbnlfVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcInNhbXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgK1xuICBnZ3RpdGxlKFwiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGhhcm1vbnlcIikgK1xuICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImhhcm1vbnlfVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwic2FtcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArXG4gIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gXCJEYXJrMlwiLCBuYW1lID0gXCJzYW1wbGVcIikgK1xuICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255XCIpIn0= --> <pre class="r"><code>scater::plotReducedDim(merged_sce, dimred = "harmony_UMAP", - colour_by = "sample", + color_by = "sample", point_size = 0.5, point_alpha = 0.2) + - ggtitle("UMAP after integration with harmony") + - guides(colour = guide_legend(override.aes = list(size = 3, alpha = 1)))</code></pre> + scale_color_brewer(palette = "Dark2", name = "sample") + + guides(color = guide_legend(override.aes = list(size = 3, alpha = 1))) + + ggtitle("UMAP after integration with harmony")</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeXwV9b3/8c935uzZE0ggLBIgLAqogIqWKl4oaqtXtBWs2OLWK4pdrrYX9VdrvWrbe2292l4V20qvVtFK0daqdUVFQXFnV1nCGkgI2bezzHx/f5x2Ok0ghHCSk4mv5+PRR2c7cz4zc47kfb7f+Y7SWgsAAAAAAOjdjHQXAAAAAAAADo8ADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQICXCy64QP1dSUnJoTb7+te/7mzWv39/9yrVTl5enta6/U5+//vft9/4G9/4Rgfl/ehHP3JvPGjQINu2O3k47eXk5Jx00klz58597LHHDlphCtm2/eCDD06aNCk3N9fn82VlZf3hD3/o1nfssoEDBzqn6LHHHkt3OZ73+TmfXTvScDjsvOq55547+jJSvkMAAAD0TgT4blFbW7tx48b2y99+++0j3dWSJUvcs+Xl5W+88UaXC6uvr3///feXLFly6aWXfuELX1i/fn2Xd3VYt9xyy/z58z/88MO6ujrLshobG1tbW521d955pxM5Tj311O4rIy369tHJ5+AAjxLnBwAAAN2BAN9dVq5c2X7hkQb4t99+e+vWrW0WPv74410v6593/q//+q/Nzc0p2Vsbzc3NP//5z7tjzwAAAADw+USA7y6rVq1qs6SpqWndunVHtJNHH320/cJly5bFYrHOvDwQCJzgMmLEiEAg4N6grKzshz/84RGV1ElbtmxxF3nTTTe9+eabM2bM6I73AgAAAIDPA1+6C+iz2rfAv/vuu5ZldX4P8Xj8oDeNV1dXv/jii+edd95h91BcXPzRRx+12ef999//7//+784N8EuWLLn77rs7X1Un7d+/3z176623BoPBlL9LqixZssT5uWHChAnpLaYP+Pycz8/PkQIAAKA3oAU+xUpLS5MTW7ZsqaiocK9y+s8XFhbm5OQcdlcvvPDCgQMHktOBQMDZsxxFL3q/3//d7373sssuc5ZUVFQ479KxN99885JLLjnllFMGDBgQiURKS0vPPPPMm2++ee/evYd9bdfS+65du26++eZJkyYVFBSEQqFjjjnmq1/96pNPPtl++L2Kigr3WH0bNmwQkWeeeWbq1KlZWVnLly/v+I2+/OUvn/13H374YXJhTU3NOS47duxIJBK/+tWvTjnllLy8vPz8/KlTpy5cuLChoaELh3ZER+doaGi48847TzjhhMzMzMLCwlmzZr377rsicv/99zt1uj8bR3Rajub6tnHQ8+n24osvXnHFFaNHj87JyQmFQoMHDz777LP/53/+p76+vv3Gqb0QZ511lnNCLrroIveq++67z1llGEZdXZ2zas2aNe4zuWbNmk4eaSc9/PDDX/ziFwsKCpKHc+edd3ayl01Kdtj5S9+ZT9SOHTvc16upqam8vPzqq68eOnRo8lpfcskl7m/ZjTfeOHbs2EgkMmjQoOnTpy9evLiDr0B3f3K+973vuT8D7c/A1q1b3WfgnXfeOcyVAAAASC39uTdr1iznbAwbNuxQm1188cXOZv369XOvcp/Pb37zm6ZpJqeffvpp92bnnntucvmsWbNyc3Odl1x66aUHfcc5c+Y425x77rm33367M5uRkdHU1NTlw/nd737nrnnlypUdn6L6+voOer8HAoF7773X2fi666471JY33nhjxxusX7/e2c8DDzwQDocPutmUKVPKy8vdFe7bt6/Nfv7zP//TmX3llVc6PsBQKORs/Oyzzx50n2+//fYXvvCF9sUMGTJk7dq1nTn8Lh9d0po1a4455pg2G/v9/iVLlrjf9I477jjS05Kq6+sc4EHPZ1J5efkZZ5xxqD3k5eUlf8Lo4OJ28kIcintohkGDBrlXzZs3z71D98fmN7/5jbO8sLDQtu1DHemRnp+nn376ggsuaL/xmDFjKisrD3s4R7nDI7r07a/FQT9RbYbGfPnll/Pz89vveenSpRs3biwuLm7/vjNmzEgkEm1K7ZlPTpthSh566KE2+7z//vvdL3Q+CQAAAD2DFvgUy87OHj9+fHK6TS96p63moH9EttHQ0PDMM884s1/72tfcrYVNTU3utUdKKeWezcvL63j7b33rW6+88sqh1sZiseuvv76DDbpg0aJF11xzTUtLy0HXvvPOO6effnptbe2hXv7KK6/86Ec/SmE9IvJv//ZvBx2YcNeuXfPnz9dH8ky+LhxdRUXFjBkzduzY0WbjeDx++eWXd7Lt91Cnpceu7/79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T5in/zwAAEgjArycd9557vsnb7vttltuucUZKryuru43v/lNm6HaOzP+sPNH57Jly6qrq9ssPBT38HU+n++EQ3DfetqtAT75vGVn1mkHFpF169a5/24+Gu47bzMyMs4++2xn9mc/+1mbjW+66aYT/+72229PSQHd6uiP7qyzznI2qKysvPrqqxOJRHJ206ZNHdxhcVgpub6dvHHa/a1pamq67LLLGhsbnSUPPfSQu627BzKSO407naWdllWnF73zI8vAgQPd90V3XreOGdFlPfPVTol0fXIuvvhiZ/q22247aD0AAAA9jC700r9//xtuuOEnP/lJcjYWi91xxx133HFH8snGyW7wbtOmTXNnsENxboN39pCbm3vQIZQd0WjU/RDjr3zlK3/6058OuuVtt9324x//ODm9cePGtWvXuh9onELFxcUFBQXOfddz5849++yzx48fv3nz5qVLl7ZpCj4i7q7jn3766WeffTZ48OBgMGia5s9//vOXXnop+eTzP/7xj+ecc87cuXPz8vI+/fTT5cuXP/fcc8lX+Xy+Ix3Dr8ek9ujOO++8U045ZfXq1cnZRx555K233po6dWp5efnKlSuT/cC7psvXt4MDPNRLJk+efM455/z1r39Nzj733HMTJkw455xz8vPzV65c+dprrzlbRiKRhQsXdvmgOql9c3p+fr7zAPCTTjrpqaee6nj7DnTh/PSw7vtqp1y6PjmzZ89euHBh8mcO50fYQYMGHXYgUgAAgO5DgBcRufXWWz/++OPkUMOOlpaW9tFo5MiR7kbyDpx88sl+v9/d+Hbaaad13DT03HPPucdPvuSSSw615de//nUnwIvIkiVLuinAi8hXvvKVRx55JDnd0NCwdOlS51eG/Px85+/aRCLR2NiYmZnZyd06SUlEGhsbk71e169ff9xxx40ePfr66693WqdfeOGFF154oc3LlVI/+9nP3DvpVVJ+dD/96U+nT5/uNJlu27bN3f/ZNE1nfOwj1bXr28EBdvBeixcvnjx5svNUsLKysvZ3rCilfv3rXzujynWfcePGDRw40OlrIyKnnHKKM+3cBu84ogDftfPTw7rpq90d0vLJOeaYY6ZMmeKMYJJ00UUX0X8eAACkEV3oRUQCgcCf/vSn//3f/+1gdLpwOPyDH/xg9erVnXzueiQSOfHEE91LDjuCnXv8+aysrA5G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gys7duzYsWPH9773vW984xs33HAD86MPVjdv3vyWt7zlRS960Xnnnbdly5atW7e+853vPHDgwKpVq971rneddtpp559//r333nvXXXe9973v3bNnz2c+85lDHy4ib3rTm66++uqRkZHTTjtt27Ztd9xxxx133HHbbbd96UtfqtVqT/CmiqL42Mc+9ulPf/rgZYht27Zt27bt61//+kc+8pFPfOITT/XTCp4GR+oE/ic/+ckHPvCBDRs2vOxlLztCLxEEQRAEwW+y7gJmHoSxqI2gMoTFXejM4MC92PkDTN6L+Z2YewjNfaP1aM1otVGNBit2osFDFVhDpjuD2QfRnkRvPu11mlLN27PanqXuLHwmWB7t7hWWYCyYqRz5DoAUAAxABI4U6E+D57IlPfXHwImKIShDHAAQgxke/Qz5fhk897vfla3vymP88s9kwJaB5TifIAqjUIEoAEgBZCir5ctnFe3PtOs3slcnVtQ6rjo71I1HUqp07JCzg72oIUxVaUWuhf5BvYdLyeeJa0XQIk2rMaugUbUimjuRcBQfBE/eDTfcUEbvf/7nf3733XdPTk7+9Kc//ZM/+RMAV1111be//e2D97zwwgsXFhbWrFlz1VVXbdu2bXJy8q677rrooosA3HjjjTfddNOjnnlhYeGiiy66/vrrf/jDH15++eUHn/YTn/jEu9/97ssvv/wnP/nJ5Zdffuedd/7lX/4lgM997nPtdvvQZ7j00ks3b9786U9/em5u7rbbbtu7d+8tt9wyMjLyta997UMf+tATv69PfepT//AP/6Cqb3/723/4wx/u2bPnu9/97qte9SoAn/zkJz/3uc/9sh9c8Eugpzd1auvWrddcc80111zz8MMPH1z8NczOuv/++0866SQA559//g033PBMbycIgiAInlbikHcgHnEdNnmmd/OUqGDvFsxuAwSDa6AK75HUMPXf6M4jrmNgFarDqI0haYjP8jSjvB1Z5uowbAwQ9tyF1gH4YsEl3U53tP1A7DqkRT+uJqBs8G4MCgf1ogpdLlmn/gkHaznwreQhABkpj80JICMm4jK3X6UfnzMBHsrLjetwyAE+0K9ZJxCDE4aX8vz/ke53vBzkl4kAy9X1bMoEAZXycB+CKKUqWRPDp7aRa6wccW1Y4wHT2huls0ZzBceurVwe1nNKNR/VOqOnmMaKNHfD65+DsWNbOlB+VRuqRY3a448EDoLgcb397W+/4oorXvva1958880HF1X1ec973s9//vO/+qu/+vSnPw1gZmZm5cqVAG677bYzzzzz0Gc444wzfvjDH374wx/+1Kc+Va7s27dv3bp1AA4+vPTzn//85JNPBvCWt7zlqquuOrg+PT29atUqAFu2bDnttNMAfPCDH/zsZz8L4C/+4i/+6Z/+6dCX+853vvOa17wmSZLt27evXbsWwNatW0899VQAzjljDID9+/cff/zxnU7n4osvft/73vfY99toNHbs2DE6OvrLfnzBU/L0pNDff//911xzzebNmx944IFD14877rhNmzY9LS8RBEEQBMHjUldopw0QJTElVbgUS/ugisXdGN6A2mh/CvqzS9qEKtIWqsPozKC3gKSBVoZsCWQAYHYbqkPgBMZw3q3kLTAhGUZtDFCwRVxHVPVko+bkcGuSDakx8J5UoR4GEIBNP3ddFezhD4neaXmGnEoZeCsiMKlNBMouh+TKBF+oEpXd6QjwgCjAIAUxuEywp/51AZRz5rDcyj4TADCAh3D/5L9/BcH0U/SZ+ln64sFGteyVb5nFq/FxNYoqvui6eLCIRmuJqXJRFEvetct9C1eEsnIgnuOqJ9uMJ+rpVJQdiH1GbnZqqdiRjmbJSMzm+HV1a7iWhKT6IDhc5SBt59yhi0R06623djqdgYGBckVV//Vf/xXAGWec8ahnWL9+PYBWq/XYJz///PMP/XHjxo2Pu75y5cpqtdrr9RYXFw9dt9Z+4AMfeNRzvvrVr37BC16wZcuWSy+99O/+7u8e90198Ytf7HQ6z3ve89773vc+6qaLL77461//+tLS0ve///0Q5T1TfqkAfvv27eV5+z333HPoehm3v+ENb/jd3/3dX257QRAEQRD8QtrtuAfu8TsflLlJHrR29QSv3MBDDXRmEVVhEyzuBoB44Nl3Dl+kyJYwegy6MxAgaaDSQHcJtgb1sFX4OXQXUR+GROjOo+hgcAK1cUgOFRQ91EYRD3p23u2M4eG9cGKKHKyAQhlEkgwqx1CYookiBQvAYIJ4gMARpAALjIWpiVe1lihiCFwGZhJPJKplb3kABBboIcPkfRm2Lw+oK/U74TFQNp1aTrNX9P8rCiP9ovdykcradyEyikhIFcSEmnZMVJN4qDp6dNXYWHqulxbddkRqIATJXM8DRkVMRKQSD9eKubZdX4iJY5O0ZhZb93VrJ+Umt9zb3aLGcWtqq9eCQ1/6IDgsZ5555r/927/9+7//+2tf+9p3vOMdZ555ZqPRADAxMXHo3VauXPnmN7/5UY/dv3//7bfffujR/aMcddRRh/5YHo8/dv3Qmw519NFHr1mz5rHrp59++pYtW/7nf/7nF73uz3/+cwCvfOUriehRNw0ODp5yyillLX0I4J8pT+UX9O7du6+99trNmzdv2bLlsbfefffdIW4PgiAIgiPNzc/O3PZN/MddnKZEYKvRqrg2MUQTDRpdg7FjAULeQroElz77AnhjQYz6EOpjKLroLmBoHdp3QxySAeRdqIPLUSSoDSCugi16i2isRpEjXYBJ0NwPIgOqGKixgFXfo/KUu0xHZ1NQ1VeGUztab++2Ok8+ExjrMwWrsUwWEFFA2JEqJ5CCNGPJHhkLT0JAP0Qvs+TLeL784lt2sC+P+w2V8+bA5eg4ARgk/RP+5XP+fj28L8faoV8bX+b8qzqOiOCpWhASSYkT5G0eXFWJLUY3Yu4h8kWcL7B6B458ligRRNiImsIMsPYMiLNJN7DGR0nW1YJktW1LNfLze0R9b+f++aLtR46pV6JaEsL4IPhfvPvd777vvvuuuOKKW2655ZZbbmHmk0466YwzzjjnnHNe8YpXRNH/VZNyzz333HjjjVu2bNm2bduuXbu63e4TP/lj29o98fqjHH300Y+7fswxxwA4tN75UR588EEAF1988cUXX/yL7jM9PX04ewiOhCfxq/nAgQPXXXfd5s2bf/zjHx9a1v6c5zxn06ZNZ5555u///u8DCNF7EARBEBxpXtzuu79v7rir0k1ZRQWaIduZuT1Tpr4vHrovXjPE4+NMOYY3gAlDGxBVEdef6Y0/MUXRg3jYBEkDw0dhcReMRdpGVENzH0BY2gebIO8iqsEYNCeRd1F0UWSIErSmQIS0CVuBOHRnDRQuc7Ux7c5GmqHMQGcLZogwXJF1qmBKGsquSHuOo0QzEjE+BfW0PB73mdVcLTlw145WtG3QVYgC1nVAAlUQAwq/nAOvAka/q7wqwPAKXk7XRxmZyyN59WVfPVLAgAUgeAEv953vZ+BbiCozwwnF3iQwsZBljWIVThewuMt0l4xfykzFqYmUGF7ADrbLDatgU6OiVUHqizmg97BZyWzhM9OZLBR1t1QsZO0i7cx30vUn6WClXgkxfBA8EWa+7LLL3vOe91x33XW33HLL3Xfffd999913331f+MIXTjjhhK997WtlUbpz7h3veMeXv/xlVSWiY4899qyzzjruuONe+MIXXn/99d/85jePxN7yPH/c9TRNAfR6vce9FcD8/DyANWvWPEGVe1nSHzwjDvf38llnnfWDH/xARA6unHzyyRdccMGmTZue//znY7kCJAiCIAiCX4GlztzSgYdXdlNSJSWCKJFReCFZsr5ls8V2fd2CHTTcmkT7ADa8FBPPQ2UIA7+u37rEobkPPgcAIlRH0FgNG6Mzi6UptB5C2gQxhtagyFEbRW0llvaguRdZCwyYKqIaBiewsBPVEaw8AfN70J6CS5nEuiWtDVI7K+NkBauCo4op0tiIzeaJoKoEtrZGtmJ6i+QF4hRA+d1HiXxKppJyxFqLKTPw7J2CSJbL2kH9pPd+C3oCAV7BZcSOfpB/sAd+uUrLTeb7UboHCB7LM+ceifmFiEhZvTAilxqr5JHZEShElPf+FHmTi64A1hfse8RCgCAmaM0vaVwvjCUfZWqdIx/XozjaTsfURcayPUnRG/P7B42tdJsDnO2bamR+/UDivEhszfBAHJlHJ9MGQVB6/vOf//znP//jH/94p9O58847v/Od71x22WUPPPDA61//+u3bt1tr//Ef//GKK66Ioujv//7v//RP/3RkZOTgY7/3ve8doV3t2LHjcdcfeugh/OLzeQDHH3/8vn37Lrroor/92789QnsLfhmHG8Dffvvt5R9OPfXUTZs2XXDBBSeeeOKR2lQQBEEQBE8oo6IgR9qPR9GP/sh69SAhpbbp7qPKmPBAD60DrnO3n+/SupNrpsbVgSO4M+8gDjY+2Mj9cLWnMfcQbAU2Qd6GKobWob4Ck/di5n54h94CbAyXIamDDSQHGPUJ1IZgKugtYMVJmHguih4IWNyDuYeQtpBUyTuTL8HHqAzAxZK3SDIiAgxHcQSgcC4ZVK/Wd6g3i7hGkkP1kWR4AkAFR15N1XciQuQ78AWYAAEZQPrn5/24naAeQuAybqf+3085MR7ab2tXNpnn/mh3CPUT5qkcL8/9cb9lhTyxUOQQWThWASmJik0YvsWDDVODOqRdsAGR8ZkhJ0oFxSlihlY1Vd+JnOlGDcrzZmXNpD0uatQHinpvYW8t2zOs81m8QuKqVmLLil5zsb1ysd2/epB7WdFI0tyLIrZUjc1ji2OD4LdNURRlj/fzzz//+OOPB1Cv188+++yzzz773HPPPeOMM3bv3v3ggw+edNJJ1113HYB3vOMd73//+x/1JNu3bz9C29u9e/fPfvazssP8Qd1u91vf+haAcsOP68QTT7ztttvuvPPOx731xhtvdM699KUvXb169dO74eAwPbnMKGvthg0bjjvuuA0bNhyhDQVBEARB8L+Ko2q2ZmU2uMMs5GUfNWJoPzoEE0Hhl0zqYHNjB1Pf2Z3vb9HuAzLwX5UVE9EJp6A2rGkGZmIhC7BFMghiEe1lTqVIrEZRBXzYPclV0NyFbhNsEVVQG0d1uLxFVJ1Xw2T4F0R9LsXCDnTnMDABjlAZwuJuiKDoYGEXWpMocmRN2AQmQn0VMAcTI11CUsfAKtTGsLgTI+swdjw689j+faRNtCbhc0QJojqKFN7BGsBzGWZTBBUY4ylS5xgQY1Qswal6FU9YbkTf/1yZi1RIKlpQXOlPfS+70BEAA1JAIFxwolDLniCeDMgYdaRF/53T8kw5KkfZLXenB0BggshybA8oWElVuSyIz2AtRMgCUAOwEbXO+0S6nM5APVwPUDgPeFUQkYPJEQ1iSYmcHWhGa9TWxeY9O2qz+YrNubNjJKIRxlCW9mS2WazPoor0tCNZN3Hrxitz7WJyrjPTzKqJiS0bJibq5YVlU6/yisFavWoa1SiE88FvoSiKPve5z01OTh44cOBRo9EPdpVbsWIFgDKL+WBT+oN+9KMf/fjHP8aRmbqtqh/60Ie+9a1vHVqK//GPf3xyctIY82d/9me/6IFvetOb/uVf/qWs6n/Na15z6E3XXHPNhRdeWK1W9+3b97RvODhMhxvAn3baaf/1X//lnLvppptuuummer1+3nnnvfGNb3zVq171qPYMQRAEQRAcaQN2cOX/8/9O7z6w7u6HbAoDaL+JGhgggTIr1HetCkGErdp80c11hE1mY935P9hwkts/pbv/hyreDMTm6OeaieOK+thi2rOtvayuWxmPK0nN+AgFifRruZNh1Edgq8hayDr5wp5uc06dRvWBWncSrgOAkwG4HiaehxUnIBlqe7uY9r+dVmMzNpg8EuzlHaRNuAy9eczvQm8erkCjgE1QdJG3sbgLC3vQbcL3IB5FD8ag10RcQ1SD5JACS/vRm0eRwqXoTKHogBhZGzCiQHdeOSYCTMzOwRVQAyIkCYSgMHFVVCTLjCHVQjlmX5AUAEDSH89uCCJGHatTNeTanmJ+JHkeaiIS58kqWMkUZI10PFlnaiSFqMQgwC33okM5EE5BDA+VfrY8ERTEqkT9VvYiyrY8xAeogtyoemIiZmjhhSRjUzMLD6GTiOuxClQAQVlNL2rZD1C3QNVbQ1TJuDKfVnIeGk53t+OjF4rh9Uk6UuzrRasja326REWWNRdma8e6xlAu8rOdzaV2PtXMQFqP7Yqh2Hs6sJgu9nJrOGKsH6+efsLKwsl449nWJTEIng6vfOUrv/rVr15yySWrVq3atGnT+Ph4s9n80Y9+9JGPfATAi170ojKA/73f+72tW7d+6UtfOuuss84++2wi2rNnz1e+8pXPfOYz5Qi622+//YEHHjj66KPjOH4at/fd73737LPP/uu//uuTTz5527Ztl19++bXXXgvgrW9U4tFJAAAgAElEQVR9azlS/nG97GUv++M//uOvfvWr559//gc+8IELLrhgw4YNMzMz11577Sc+8QkA73nPew6tAgh+xejwr/ds27Zt8+bNV1999f33339wcWxsbNOmTW9605ue+9znls0MjsQFpKfd/ffff9JJJwE4//zzb7jhhmd6O0EQBEHwpGU+m+1Mzt92/dj/d3eUgaGAChGJKvdDQXjAEFugSuxFBmIyVbRTExGiWItcugWLqGXTMHa8UWw8NussJnVx4I5Waqao+Q4xx5yzCJIGGhNIGhhcJb1mb+9/0+yD1vcgBTlhAVjIkkYVYsteMLTSj2xcijfMRGuzsec6j/FGMlCxIwMxAGRLaE1hcTeyJXTmAQ8vAOB6qIxg9Gj4FCbB/f8HCzvhMpEyogYRE1kMrIB6sEVlCEOrEdWQNJyon36Il/YZ10HegTiQh5CaSCpDhojTFtTDxgBgDEyC4Y2uNaOdOSMZVF1UZSL2XfaFKKACETAt57FTPwIve8irgglqxVgCxFZTjXKNoYUKoshEkUVnyaJn4SACUlUFR0IMMINInVJErJCCxYEtVOWRr1KPHMULWVZPEIFh1bLqXhERCZQVQkQsHoDAQ61SOYBeHcU5VcRWLesijz3s10Ymqmj7AK2KB8fGkmI43bVoVjFksL2jUq344Y2L8dq7O6ubXb/YzfNcjGEvIgomKrymuQP1O/VVInPy+qGXPnd8w3jVmidZNBEEz37z8/OnnXbazp07H3vT+vXr/+M//qMc8z45OXnqqadOTU0BYGZrbdlh7i1vecsb3/jG1772tWUA9b3vfe/lL3/5vn371q1bVz5q1apVB58wy7JKpQLgZz/72SmnnHLoaw0ODrbb7fLhAD74wQ9+9rOffd3rXpdl2WNr7M8777wrr7xyaGio/HHr1q1lmr1z7mDiwMLCwkUXXVRm/j/K2972tiuuuCIU0TyDnkQK/XOe85yPfvSjH/3oR7du3bp58+bNmzfv3Llzbm7u0ksvvfTSSw+2IsyyLEnCVdggCIIgOLISk6ytr157+rlTE2vlmm/Tki/Pd4n6s9JUGSwARIh7JIaJDYxFZF2WU7sFVRjyAmSi847sgtn2s/qghW2k9dW15u4YhYsrgsSgx+QRD8B7+Ax7thRmQOYejvMl6wqfQz08CApOlKUFYoHybIsW9seVbeMrTgFm8+pEe9tCfXQEa47C4Ep05tDcg/o4si7ak1CCz2BjpC2IIKkhbaHaQFIrw+V+szeQqldmztuIqvApZBCNozB2jJ96wO27u2lX1nigmk1zOTtdFACJaJFDC1gLiuEdmKEEE6E3pwqw8bZuXGZ95slCCaYCcZAczFCAFb6cx86A7w9s53J4e5nzLq463jGrWpk3KIbySUfWSmHZGfH9+L+fQU+wdagXBWzFiINNOG3CxCADUna5AMKWxXkYAyEVg7wsnmdxy9PpQJqCDIhIFChA5ex6j3IMHRmBsjpS58TkFJMU4zLVjtbUivZKwv4mVta6hLzgSCuDKlKMrmhWNj64VN0733NeW12nhFjVC3JXtsSDYrl0XzQtZPd854T2wNrRij3sYosg+I0xOjp67733fvGLX7z++uv37NkzOzu7evXqjRs3/tEf/dHb3va2arVa3m1iYmLr1q2f/OQnb7311h07dtTr9Re84AXvfOc7/+AP/gDAl7/85auuuqpWq5Vx+9OlWq3eeOON//zP/3zllVc+8MADIyMjL3jBC84555y3v/3t/+tjR0ZGrr322muvvfb666+/5557du3atWHDhuc973nve9/7Tj/99Kdxk8FT8CRO4B/rjjvuuPrqq7/xjW9MTk4eXBwaGjrvvPMuvPDCV7ziFdb+mk4fCSfwQRAEwW8ExfwOzO/Iptvdm74jC0vLg8mUwQoQKSmpISIoKQ9GlFSk1zMkvidQT0TiiCBkwAOIVlgR4Ynh1tgxdmlvTVpaG8/JVjWNkPHgagyuQtpCr9lzqtMPRtKhnhYdZvJgVk+cFKYiFAFliEdc2CGyEeKqq00UeWYbK+vrTsTQepgES/tRG8P8wzhwD7rTiOroLqI6iOoYbAK26M6geUCyDlwX4iG+n7POzBwLR2ojHzeyNb+X1BqysDud3y+NtdXuvnj+QfKZ9o/LQcSeE8OGWaECJUQJbAX1FejMOBFfODZk8o43FU8mLhZYFSICDylj77IYHv14Xalfuq4EjsEQslmyIjd1ypoiWpUlK1nZlY6Ww97l0ncWOygKuIJRECmRATyDkAzBdSEihuEBKaAK9f1iey0b3Wk/p375gga4CgUkZRMJGFIAIhqDyjgbPVNbtGsS6eaIOlJd4pG0vjbO5mzRkahS1FYMVKJco8VolTODU9LYNd0BOBefZqKizASCF4VS/8oB+mPzFBiqRK/83YmXnjjG4UQuCJ4hs7Oz995774knnlg2litP4Ddt2lQmzAe/YX6pAPvFL37xi1/84osvvvj222+/+uqrr7/++oWFhWazedVVV1111VVjY2Ovf/3rL7zwwrPPPvvp2m4QBEEQBIcgDKyCSlzP5YxefvfPZHrapwWVR9aAKnHExEYiQ5FhK8hSGwnYolvAQxm0nKfNhhQWcJw34/b+XI2SVZtQ4UkyJoFPUWSoDiNrglmtMZlzEoFAEcAigqIZifcm9pwARgCJfEvFaNGzeTevbYh7c9j/3+AY9RXwOXqL/X711VWQHLYCMoiqGFwLl2J+R3largIq27ODoQKFEISM80S9ZrT9+6gMIanH2bxZSk3WJHX9dwUWMgISiowWZaoA2EAFyQAI6M2zF1YHsMIowSQReAT5EsixF1nOZ+h3m6P+Bw9FmVSvNiYTs/ikaMb5glchMAEMIfUgCyL08/8ZSrCxiIAYpApiccpMbASGxaE2Bu8YrOm8kkIcAAjAujxqDgD10/iJIeXkOUZUlaimSpQugiyxEYFBITCRuhE/VygppAZqGcptI7UjVVlyaUuGTxgcH+m1s+klmhgaSKYmxzRtuyinQVKIwpfFGVr+hLKigFXLnvqRpaGaDdF7EDyDxsfHzzrrrGd6F8GvyNNwQs7M5byEL3zhC9/97nevvvrqm266qd1uz83NXXbZZZdddtmzoio+CIIgCJ6V4jpGNlLeiU+tClVl727s3OmX5in3ZA1UQaDR4Wh0JdeqWJrVbtPWPATiSToKL6pKEdgCHIMGopGMKwVMRVzUrq6K3RJUGB4mBgzyFmqjWPO71Jzj5n5XdIAcapRIPbQwkhtKSXNj1HMMtiqkBCXJSEwdXQML6WHqPowei6iKhe3oNVEZ6k9fE0FUhYlQtOEyFF0wSzKecaPSm+y3cPeOSAAUHFtS9pmqk86U7bJKQfksi4O4R+rHQZ4rkTrEFeRtqIMr+sPqOrNwOQGqDlBSNmopLziOYSvwOcSzkqj2p8E9MgRueXI7WaqPMhl1Pfa5ZCkrQZ3AGiUQFAKNiAqAFZZIUOSW8nJcvMIqmNSpjxBXUBsCCHENzf3kCxUBAC0z9gmieGQYu4IZUDBBPIgEJrPDapJEhJhJnCk6UEPwVjISB6ql0WBe29DIW8yL2cAG6bhZWpXw8Ox8pZvZSLrV7oGjdHfFZ9O0IpbeARoFMy3PtQNAQmVdhqoQsTG6cWV9/VjtV/8/fhAEwW+npzPFPYqic84555xzzun1et/61rc2b9787W9/O8uyp/ElgiAIgiB4NLaoDPGqgeR3rJ5wcvHfW7WzqHkP3QU/swQb8+gKaoxyvc6nnW4iofZ+mXmYF+el2fGTC8oMJa6IGbLRaGLGRl2KytDxbolkxaqi6CSDliuKygBgUB3E4ATiwWR2W4cSv+8O1kVwKh0Pr77HUd1zpVBl7Rg1niIws4gDiIp21DuAngEmoAat/RhYi8owXA6bIF2CKkY3YnEXuvMYaaC9F6aKuMHqY009VYymSpYqCfIepIjyBfZObcXFQ74oErcEMMGVI9xJRUFgC7ZWHDOx60IU1QY8QEDWhetBHJGhg7nxvgshuB6Mhfp+3zz0K7/75/AkUAP2ACOuMhFQKIwXBjPljrkgEWVAIyECM1MFFAszFx0iD5WDOflKIBUCID3kEXwBY+FyUNkhjwGBVzDBlq3pl68mAFACsZooR+K43vLVmqTM1dh1YdnbGvlM1XhAlYnVVgesZUtxo9iVz+7JKIYb7M41K/UVPk983kkw366MNjkfKOYyjFQ0y0zVO2Eiv/zKqjBU5gPIYKVy8oahRj0MJAqCIPgVOSI16tVq9Q1veMMb3vCGZrP5zW9+80i8RBAEQRAEhyJj7Jp12mmbkbMQWZKUso6bmZaFjnIMwzQ8Eq3bQLU6xKEzi86MtFoyNyPNGWQexZytCQ+NKSW06iiT28aqcZ+n1EvitcfyqtWPfrmJkweG1vrjXixLU1iYp+6iHNgvszNoMLTN3ZZQrsbCAIZYUpCBjZC2EddgB1AZgvdIqkgGwBHYYuhotCdBio2nQ4GFh+G6UIeszcqIYvE5OQYpKTOpFBkTA0LOW5cRLGsKUgj6NepQAgmMqhh1JBBiIlDaAUfgBFEFRQcA1AMoj9YFwmXRu/h+IQJhueQbgEIUQjDl1DdiEcCjKFS8+IKEmUFQQ15VASMmKrzlKJFkwOZLhgDxYAPvoSD1RAxSwAkNoGhxkcEk0ALiH/m4y1NwAKLloMB+QT4BMAViQwDTiDvgvRBUbAzxJJ6hmal7qIFY9bFrWeaEHUG4aBZqhsQuZguO9tdoTJJqp0DGcVxlNo3V6cwSN7oCGDDghUi8MhmQqoBg2awfr64YSkL+fBAEwa/ML9XE7tkrNLELgiAIfiuoIst8r8eRRbVG5jGNwsWhO4+yj7x6iEo7LfZO8fgEVaoA/NQBu3qtWX/UE76KKMhPT/kd2ymOqJjX6T06vS0ajzgq0JpG1oJJEFeQtTE4gYmTMbgGsw9iZAPSNlyG+ijGnwNTQX0clQbSJez8EbZ/H3kHeQ9MqK+EtdKaZpfDxmjPC/lH4lgAZIACSv2C8/KEWAlMKkS0XIuuyvAgCxOBDYocUvTHpgvAy4GomrKJvfYnuQm8X54htzxPrhQPcjKAvCdFT0TFRAQxrgeCKiuZFBVRcrbOxIm0EmlDFVEMJ0BRHsODSMkIRaacJweS/kR3BSzUPfJyujwVXg2oLIM3HsbAAeQ1VvKIa2wSjWLTnVPviElFlUiU02RlXG/YOGFy8N7lWZq6DHFz+IRcLMCNWPL6xGRe67YWdnfqMzK64GKvAoJzBBUBmFgVIBmuxOf83prnrBkcqoUT+CAIgl+Rwz2Bv/nmm5/ya7zuda97yo8NgiAIguCpI0KlYiqVX3gHthhY+X+t2EUcWNSioEpVnYOq8v8235uYADu+AkUO7/2B3Kw/jhoRD9fQ3odsCeLQWI1kEO0pDKzE2PFo7oLroTMNr2gdABEW9+iK54oqm5iKFHMPw2WIB6ECl8NWMbaRixzdebgMkP4k9rI/PKHs8wYSCIGXO7RDoEz9LHgPtYAIwOohVJZxL5eXS/+kXQkQEAQHWwH23yOA5ZpzAAoygKLoQQoI4D1BSVhBQoZEAVKiRLOcK86wYdjc93vguaJfTk9GVaEsRF7/f/buPFizqrob/3etvc/wTHceeqaZRZqoiANqQLEQZ0AQp1/FecaYEseoVb4pNTGmEscYjRixQt4IDc4xUVCwFUcUFWlFaOj59nDnZzjD3mv9/jjPbftlkO6mO6jsT1HUfc7dzznn9r0Nd52111oEVUMsuvTcAKQwYCYt+43rGFAVjYjIc2y1ABt2paoQKxEUkZGc4ClJlJSgAgtr2fcUxNYaS+Q6wpaLDimR5gYysOdnbWoqR9RsNcvpYxqTO5PGvG3uyepY9AxyXgkqSszCgJBaplXjtfFWEqL3IAiC/00HGsA/85nPPORrPDiT/EEQBEHwx4gaDbNyld++zfe6EDHLVnCzdUDvNMauWCXtRWoNkHpetQozm2ETOEGxABMjb2NgFUbWAoLmchRdtFZg+nbUhuF6Wa+X3/HT3ug66cUjs79N83lECQZXIh/G4k74zLenRQ2blHzJtLSTXKpYlxREHmBemvFG/Yy67jdxTVU5IlKIgKzYVOGlZFW1UvQDeEi1/R5aNb2nqttcNTUNQiAsjWEXCMClOOGqAx8ZhpAvqly9kFVlEEhKVZsjZuMS8ezzfRcSImF2YhhMsAqnbMj1QKaqt1eIkjUKVSnAhphVhACwEoEMFN6k8JmFV4UyyOVArt6BABIQw+cl14mZW6O+6Ikrc1C9aMO7RLxRz07qNDsfLXNlrV2avDYyn05Mt4dTq8TOlWBAQEpV8QAiQ6Ot5KQ1g6vGQ/u6IAiC/1V/oHPagyAIgiB4QJCNzMQkRZEWBTFTa4AHhw70zcw8MNj/2A0iHYAvseqRWJxCZxoqaIxj9BiA0N2LsgfxUIU471zpZ4tOuyyjfO9UK7s1XphiUl2c0SjmKPWwueeeGa1JLxUnsP0Aux9jExGB+8E8tIq0q1Cc+lG3AnCkAMdAATaSNDRbVFsjl3mOIApSQwWwFPML9+vNqxbsujSZDvs1k6uS3MxQpWpm+9KmANaCiEQjQ2Dfyb1CM9Klnf8gGANlBTNBOSmjWiw9EWeqBxNVj3kVp6Zn6izVbn9DkAJpaeKG7wKu/+CAI6gY/t0AQVHPqlAldWJiCLJ4VDUqvENzeeIXcp+ZcjpHbKVH5ArUFuPxujrHcXd+ZmHwKIqMiDPEhXi2gCoLG9bImrFW+uhjRx6xdtjsKzoIgiAI/lccdAA/OTn5nOc854ILLnjkIx9JoWdJEARBEPzJoSQ1y1b0i70PmU3QnOx/PLgKvgQIxgKAL7CwA2kL236C3hygeevoxdwOoJu4aW1v6hYuqk3G3Smd3yIm8WzzpLWIVlxDaT3vWYxYFCARggcBbCEezP0wGwwCiLH/FkAFmIRjFidMrI6zRe+91UyURI0DpciAfYXuS9XmAKTKQDMU4H0n3VeXLhAs7eFfGjIniv74Nc9gI75B86lvE/l+UzgViO8/AiBD5EpTK+KRpp+hAqQeHJPrOTHzZkiEU6KYPHsHEgU8IkfMFBW2YX0OVvhIVFg9IIBRYq+AiZWscGxiaxtDe3xjV+24aHBtgk7d32ScFcRNnU7KecdUZF217LlXDA6PjrSoSO7cswggSUmFVJQZA7VobCA5cdXgyUcN1JO7tVQIgiAIjrADDeCvvvrq9evXf/WrX921a9cnPvGJT3ziE2vXrr3wwgsvuOCCxzzmMSGSD4IgCII/NYf3f+5mv0rp9m60p0CEseOw4xdIWmJrkgsR+zLPvcnAje5OKoU8FFqYhlOJFrYVw2sW4qNHzHbj2oY8iIUti4OWMDEUUAcANoIChlDm/fR41e8NLJw4qseWAEXRBkWqRFoqEjCJVv3ZuB+B79t/X4XZojC8dLAiULBhUelH/iBotd9eAAgZz1ZgrOZQEiYDLFXaW8CzaGkTx6lXWpRmqzUgPGA6O4vcke8YIWGOXNeSt1oWSHJGohlAMZxhU1Ak9Ykim0vdXFVeT9U9wBnnAVZKM46cGbBpI/dwZTea/81cpzNFK8bKoeXl3hoVHYmZoh7SIT+jYrbXJuujE3nciqSsRzaNHIFLL1SCDcYGk2Mmm6WTTuZGWvHh/AkJgiAIDsB9taVZcv75519++eV79uz56le/+tKXvnRkZOTOO+/8h3/4h9NPP33NmjVvfOMbN2zYICL3faIgCIIgCB7kXA4yGFyN8Ydg4mS4XuS6QzRXFsWC1rtZnmrWs422xi5q+JETZGiVdubizvZk+rf12Y25U2eaLhkCR+QFUBZl7zhKkDQRJ4jqUh8royGwBRuwASzAnqKSo4VoLIuGxCYwkWErAihFyCMtGQCZ3/Wir9rOE6Ff4o7+HPiqyRwL+gGzYumjpSF2UoXxwrFyIhQD3EazQA3KgIcKyAMAaaJFTboxuUHu1GTeuC6LM8YtjZ4nC4m1x+q6lHbMCBOl2qu5eRZHBHIZMylHTMoQqtr79esLhCS3Wha23kO97ePSuwb1lnU2ruzevKdIOkjhsgJmj11Jtm4MzZuRhcbaXuvoWmw6mRNFLTbWGgV5aC3hoUbsBQCSOCRvgiAIHgAHGsBX4jh+xjOe8ZnPfGbXrl3f/OY3X/Oa10xOTm7btu0jH/nIGWecsWLFite97nXf+ta3vPf3fa4gCIIgCB6c+g3hPIggJco8ptKIi5H5MuPmaF27Db9o4J1J1XWjxe2x9CJ1td6OWraLiDPTENuE+n7C2VY780smpaQhos65XKyjWEEK49h4sjAWHNfzGSNdiGdfgshwP2ttqsZyHIEikIWJYVOQWUqqA0L92BiKasSbqtLSVntV9Mvbl+J5hZXM+izS3KKIDAv3O8UvNckDIJCcXSd1c61sK8/tKHvzuZLJ5q3rKdRAPNjDCnGsRU27BqUhDyJhhpRxb8qSunjAIyYIdGmuHghqwKawg8pJWeZSupZbsIQmunV0T9RbY809eEFbi6jPR8tuaz7mzsE/bxxz2tqJlhcZH0iPW9EaHYibNTNYp/Gaj4z2CiFg2XBtqJE8MD88QRAED273dw68iHz3u9+96qqrrr766m3btlUHx8bGzjvvvAsuuODJT35yFP0hDhcJc+CDIAiC4AHTnUZ3BvPbUGaY24J8Hs1JsC323tnTJFc7UOwuhbLSp/keQ8IuE04cKNFcQTknc25wmOdit2DVEwmJ56p9XdIUU/dl13m1okyFNykgjpsd04q1jH2bSIkossw+l6KElFBRjsREUG+giFKUPQAwKcpFqLBCIEt755f22Pe70wO+P3muGju/9EVy1WBPhYUtsZZcV6XUzYP8UgZFgKWsPlVD6BIXNaAaucVqbhvAPdQBibRwFMWaG/IELZDC2EgzBlzUdFSLyjnjuxAFK5QVJCYu7GB36KRMMD7/85wSb2pwGXwxL41Ei0iLjNI9NAbiXY2Ts/rKiWNOfuTxI6WT0qk1ZLS8c+tUZ++umMsCSSFK6dDQ5PJjJlu1+OCSQEEQBMFhcX8D+H1U9Uc/+tFVV1111VVXbdq0qTo4NDR07rnnfvaznz0slziMQgAfBEEQBA8cRXsv8gXkC9j7W/RmMXocFDq9qZvls9qo93Z7mMJJ3J6JF3dELBJHRCWLgLQdjTtEjWJn4jOCt1T0++2R4bhZ1JfRwjbyXo0FGOKzZDgfPL4se9aaencKpLF0jApLKc5p2SOiPBpUgJ2LIqI4Ueel6BoUSwlt3w+z+13usV8lvECJCUJLiXoQYJb21RtvYkepkRxKrJ5RQBkqzKIi+5LlAAssVMqoSVJGWgil0ByqXk1Oseek5juAGBKoWhKhmOGhBBYlQ+KgHlU1PlhBBdc7ycRc87gV2W/izk4vrMayL3OK5qVl2KeaObCSnbardw4/avDYU//sxNWRIQWK0iNvm96u9h2/7LTnYhuV8UDH2YFlR40sXx01DngwQRAEQXBYHbanp0T0mMc85u///u9vv/32n/3sZ+985zsHBgbm5uYuu+yyw3WJIAiCIAj+JBCa4xg5BhMPRXMC3qE7g84eYk4bzYHhsdRo3JoYUBMtOmQp2hxlpYWAWbhW127sO4s85GCJqg7wBFWoiCqVbRJRY3tmMLMDCo0MD+j8sMmSfM7bBjXHucyhIgphI7amHCuMIWFWgkPey4XBiZD1lAK61MxOAVQX6n9AAhAYAHG/Zz0DBMMAK0VerbdNSlrEFqREVX87B3IiQqpMS3vylViFCcbnRkoSZVJmw1BLZaqFldJzlHNTYKoNAKw9iIABJfJFf3u/MgCFZtyajSa36sqoPUXZnIKYwVAYjuBaWGygC8BRouBhTI+mMjk2xATndddstns+n921bWHHHYiTBG6u3dvbEU0H/cwWLjsP3E9OEATBg91hngOvqj/84Q/Xr1+/fv36hYWFw3vyIAiCIAj+dBDBJhhag8VdgMLGIDaNkYGiI6tPjndtL2d2s5FsZLkt52R2NwPcJIWwZIUOiVNHNoGCFUL99HjRZi+kpRMonLdRYmOruR0Y9bUxmrmDsxnuLhAzfOmFMjtQRrUkTaPejIKVFa6tkhsplUmFCCJgrgL1/sz5arw8wNQfAg/uj7Sr5tiRwHmQBZFCkXchTpihiUaGXBcq/Tw5L+29F4A8YBylosTEipIkq0rliS3ga8hUKEYhpNwvwbdqLOnSID1fgKAwSkqAqM7xmPdQzUuPUlPLAiDyOREnXBC0oHpD2jnXC45zsrM9STvlrtnejplezH646NYKbTVSY2KKuJ4Y9UVWuvluORIS8EEQBA+QwxPAq+r3v//9K6+8cv369fsq4QcHB5/97GdfeOGFh+USQRAEQRD8CRpaA45QdECEsoP5HRhczUUHzZJ1kzTqXk2u9QSGVckkcblYChv2PVP36KlnKClAXGXJRV1ZmhqJS6QtPkZU48YIJh5iotSwwebvSm8WKiLKzBzFOQ87kdTU2GcRSoEhn1moiPVkVU2sZT/9rv1ke9VhXoXJRlAHkICgHiCw0Wq6O4REDBFMpMwlohiLigQ+hzgQ97f9V88CCIAVa4RrQoaNkAryBUDBDLAYo6KqnkmNwLE1RKRM4qogv7+zXwmkKiBSS+VQtj1BzRtWQUSlClN/20CsKCN1CXV7psYq8xjMkmW9xXxmscid7F3IJgaiTu4TKQupZTQ8brZLlPa8bOflnUXiTjHUCDPkgiAIHgD3K4AXke9973tVvn3Hjh3VweHh4XPPPffCCy88++yz4zj8xz0IgiAIgnvHFkOr4XKooOwhbqE7g/o4UiemSZmkAwOqoCilGqxldTYiX6esMDHnrmrl0+9FLwomNVZNrFGTyzaZ2A2uNnGEvI3BVZjbCnXSHO+WJvHdyC0kbrFuudTUiIgvTbkgClMNhIMu6GBsxEphVCb8sqQAACAASURBVKEepBACAWxARjkiAmA1SkRZvCCuixqU85HvOSREZLQkAUzETlTVFnNQWSqqB0BQMKmAwFDTZJtGvkvesYnBBA+oCBXWWw9Sw6LsjQEz4ClKuGyTy0CWyEI9AII3IAdbwjLJmOz2GhMzqXo2qlKYASGrgHfdBHkihbe1KI4LNeONpFf6O3a3m0k80EjFNzue03x3VC6Wtt7G4C4ZmPXpQpYM9RxAQ40/xEbFQRAEf9oOJYAXkQ0bNlx55ZVXXXXV1NRUdXB0dPS888678MIL/2A7zwdBEARB8AfKJgBgIrSn/dR2LbfK9LxGg7JnL89s5ZTtUD0aqWm2lwxT2bFkJ3S3GFGxCqGqKJ0IYBCRepC6eNDburGpj+po76Kiy/k8GmNSm2BnulmnOb9RKC6RZDwQk8R+Qb035AmiIILElItEnmKjDswQ6Texg6k2wHuyYhOjZcmpF8/eW98zUhLIoCi1buEIpXdl5HvG55ByabY82AAeMCpCIIU6Uy6Ky4gFALyT/h9NVW9fGiLRSDlSGKPwNrbERAwyMIR+O7yqQ74y1GrZxIKlUohLmLad8N5nlDapZxi5JLHJS6obAtKR1DB3phbmx+J6M42NQGe7JTDsen5oYk1tbO32edfh5qyaZZMDtdjsns+ZQgAfBEHwADiIAN57f/31169fv/7qq6/etWtXdXB8fPz8889/7nOf+8QnPtHaw1xRHwRBEATBgwhbX1rXsdrt+JmOemdGB5Asp7zLY1a7v3HCpVhj0qrxm2UuueHVss8ZTsmoivpSoKLciwbEDjWyBVcWRdpAQbbWSs28zecKH6O9N1MWJxlspG1lgRA48sTGF4AytIX5DHWCalQnGyGbhyjYKhlvakScm1ZMDs5HUCZvi0VSJfVgGDBrlyBQw2WHDKC+ak3PIjCmP++tmi3fL54viI0HG2Ol6EEcmKuW9YAArMweVm1qtEcq4kFkmQqIghQCgKEEAomLuL+x38PAmNTKfDTuPXLRmuYtnY98rnHqudb1cSauld+6K5lIqcbEzdS0EtNRLFu9ZmSykUSmPd3dPdUZGbS1xA7Uopl2Iaqi+03NC4Lgnuyc6e1eyBe6ZWR5oGbXjDeaaYiYgvvlQH+AXv3qV3/hC1/Ys2dP9XJycvI5z3nOc5/73DPOOMMYc8RuLwiCIAiCBwt1pTrQwDIeJNEa5W22HV6+VuYWifeKc3kJT6kyjM/yqGmBQpO0zIWMwJJ6JjCcVTi1iVtgSrno9oxlymxvu7QmynjAZLNxe7vNF0jzEnESZ+QcScchImbjC6GIUBKgasgyyBNZdoWQhVGY1MNaiAfFsUWWsS8hXYISLKgEtIqoiQCygDI5eDAJiAH0o/d+VzypNtIDgCiiWIXgHVRABHUgA+Wqdz2LaMQRvFEHhTMDVgRgaAn1UAWpcs0TCGLgmFRMXNdFEkZp4kY6k4yyDIo67u0gW4eI8xgsN0dmSCPK5n7Vq7WOGh/PnRjmY5fXhupRVeu+eqweGZ5ZLBLL3dw5L9ZQiN6D4N5kpb/+5t0/vm1mtl3sf5wIayeaT1w3sW7N4AN1b8EfuwMN4D/1qU9VH1Sh+xOe8ARjzO7du9evX3+f733e85536DcYBEEQBMGDA1Vz2tiotQCUCPUxnduFvITuLeMRdQuGxUIB6zQmFo4MSUTKTjlXMyCzRFZMTOpjKkx3m/qiZrumWxqfSWeXtiayaMB7jaKYSm9J03LRkhPvYt8GFKQsBcCAghBpyQBcFxwxkfgSsmBhENeNeixuUyh8AQWrgA0ACMMIfPVSGATv+rPo+jvw0Y/eq5z5Ugd9AFQuGmXAAwSq9vI7kAEBSqQu9l2AVYUgljw1RjDf6Wfg2QIgJsAqPAhE3vgcRGQS8lnU3THSxEz92EJVTBIXs3E2a9E1WtY5F7RLzCGamRhdkdRqorBMkSUvapjSyAzUIsO0ay4DMDmUDocmdkFwL27ZOv/5725pZ+7un1LFHbvad+xqH7us+f+duXagftjqUK688srPfe5zv/3tb7ds2bJ8+fJjjz32Wc961qtf/ep7a0n2hS984fLLL7/xxhunpqYmJiaOP/74pz/96RdffPHd14+Pj+/du/fuB0888cRzzz33jW984z1WTx/g+X/1q1+tW7eu2WwuLi7ej6/+wYWq7i/3vY4O/SnrAV7if9PGjRsf+tCHAjj//POvvvrqB/p2giAIgiAAVN22rX77ViSpzE7Lju3UiEyjZhpqOrfk7dlZtOrFTKJZCZshlXQ4zmdSN5fboUyZi84AFtiQgL1HRB5QklzJQoUhHilFCZddgQMs4IxXz5YMqy9ZHYGr+vmqtXu/S3zVIY+Y2cDnAmUy4AjqRRTQfliuHop+e3ksDY2Hcn9cHAEioGpBNYAOAESF+9F71dy+H+oz90fWAageDaiCGWSrbvugCEmdfYG8B3gQgayogG3BdWhhfMHwpA4wYPambrREfbjTXLu3qNU6O1gygCI3H8OpbXZrE/Paio87fc3xp6A2tGchn+uUqhpbHm0lVZjRy33uhAn1xFoT8u9BcA++u3HPF3+47UCin8FG9OqnHDc5lN7PK7bb7XPOOeeGG24AMDQ0tGLFip07d87OzgI46qijvvGNb5xwwgn7r9+zZ89FF1103XXXVS/Hx8dnZma89wCOPvror33tayeddNL+66sAfvny5UmSVEe89zt27Kje8vCHP/z73/9+mqaHdv6DCuBvv/32d7zjHdddd93i4uLatWtf9KIXvfWtb737E4fDu2x/l1122Ute8pL3vve973znO/cdbLVa7Xb73t6ydu3aO+64Y9/Lb3zjGx/72Md+8YtftNvtU0899ayzznrLW95ysPvZ+aBWB0EQBEEQHClEPDZmVq4yIyPRmrXRyQ+L1j3KrnuMWb6CBsZ4YFmUtuZ5JNOow4N7h0/pNNd0kslFNBcdFrUuFHWpmXE9Rx0mAsd5Mia2BhCJiEBUvMsAb3wJLUkcUWmlA1cwWGxd41TYQgWiSnF/T4D2x7+Ld6IEhUBFChEHSH+Qe/XbOinEgxVU/QNwFf8LVAQEVJXwUGJBP2fFVbK9iu2rhwXVpDr1/T+Wau57NZPeFwA5igFF2YbPYRhc5fNLwIuxBGVlsfXMjoCsqnpBV0xONec07uyo9XbmHqIqLvdqOtwqbc26xaEaxmme2rtmZxe3Tfe27On8evvCb3e2t033ssIDqCVmqBEN1KMQvQfBPfrl5rkDjN4BzHfKS6/Z1LmnRP1Bec1rXnPDDTecfPLJGzZsmJ2d/dWvfjUzM/PLX/7ynHPO2bx58/Of//w8z/ct7na7Z5111nXXXbdixYorrrhi165du3fvzrLs2muvPe200+64444LL7yw0+nc/Spf+cpX7liyZcuWbrd76aWX1mq1m2666X3ve9/9P/99+vnPf/6EJzzhyiuvXFhYmJyc/PWvf/3ud7/7KU95SlEUR27Z/jZu3Pj617/+YG97/0cbF1988TnnnPOVr3xFRCYmJr71rW+94x3veNrTnjY/P39Q5zzQAF7vh4O6oSAIgiAIHrS4VjcrVvHoOC9bHp/yZ9HxJ5oVq6g1inQwHhitDU2kg2NUGzZDK5tDKxDVTMQL6epec80Q5mtceFvzVKtpJ7KM+rBPhtU0PYyHETKkpToPVyjBiGMVKBRGyRQwVL00sZAFMwyrcjX4XcCAhzpAqox7vyO9CkQhsvQS4KWC9iomV4AUYOlvlDegGBxDDag/th1Af3d9f8JcRapEO6BggBTa34RPvrDV+Pf+dT2IIdViLqLBYvgENIaMtcxwsARh9VZdT9jlmeu0y6zblmSXTpQUd9FI/WJSzDb9YkMWfGd+fsuv9v7mhplNv2gVu8br7Jxu3dud75b/qz8HQfBHqJ25/7th80GFPtOL+dU/2HZ/Lrpjx47LL788SZKvfe1rT3jCE/YdX7du3Re/+MWHPvShP/vZz6699tp9xz/ykY/cfPPNp5xyyo9+9KPnPve5ExMTAKy1Z5111jXXXHPCCSfccsstH/7wh+/zunEcv+xlL3vXu94F4Iorrjjs578LVb3gggumpqYuvvji2dnZO++885ZbblmxYsX111//j//4j0do2f56vd5FF110j48eFhcX7zEEftOb3gTggx/8YLXsP//zPz/+8Y8vX778+uuv37Jlyy233LJ58+YnPelJ3/zmN9///vcf1J9GyMAHQRAEQfAHhIzhZpObLeybblMbxvDRSFoN0xuro3bSkwaOe3Rz+RrEAxoPl41ljXpjYeih2hq3aSsanOSVD48mH4J0oIxb7XjcmaRA5BEzNNLc2YSECJ7gQaLEAiL1EA827EuogQpcSXAkAgVVwbYAiv5u+d/drlYhOsD9kFsJotBq5hyLmv5AOCGBcRwvRfsMY0AG+2bg9bffS78kXhWEpZr5as3Sv7WAAiYGmf4AOSYYi/pwt3lMXl/u6+MQZ4sFllKJQSD1qugimtKRnX5ss6xoe3uHru5SMhut1LiBdLAcOn43jbUX5u3On0/O/Wzl/I/HOxubscx3y6IUBEHwe33zpqn84P+m/PyO2S17uod80RtvvBHAwx/+8KOOOuoun0rT9LzzzgNw0003VUcWFhaqePKjH/3oypUr77J+cHDwbW97G4AD6XFWOeeccwBs2rSpSlwf9vPvc80119x+++2nnnrqhz/84VqtBuCkk07693//dwAf/vCH9yWMD++y/b3hDW+4+eabqxLsA/Gtb33rn/7pn974xjc+85nPrI5UUfonPvGJM844ozqycuXKK6+8cnR09F//9V8PaldCGGMQBEEQBMEftsY4vANHcBkTx8OrMbDKLbQbRdnpzdhsZp6HYSjDZMRtM3miXXkCnLN3frclyPPZAvUyGYo0d0jjYkGFhNUoquAbTBbS5boSrAqRgRVxluGVuIrayXlvDBulKgPfr043/UZ0tJRI79OlzfAAIGxZFfDCxPDsi99V1wsDADGrSj9dD4Ch0g/mlUECAgsJpN/xTgES+BxwCiJjIQ4K2AjpYC21eXur8z0mjVA6MtUwOqfGKRZoaEdyXDuqDZS7c8fKvImPY06PbWTLzNy0GRuIXL3cM2PEAtreTZ6i+e6aFY+IbdgzHwS/j/P649umD+GNCvzg1r1rxtcc2nW73S6Aqakp59zdR3q/+c1vfuELXzg8PFy9vOyyy2ZmZh7/+MefeeaZ93i2Cy+8sCqeL4ri91eDV8qyxNJO7SNx/n0uu+wyABdddBHz79LPT3ziE5ctWzY1NfWzn/3s1FNPPezL9rn88ssvvfTSV73qVSMjI7fccst93u3c3NxLXvKShz3sYR/4wAeqI1mWbdy40Vr71Kc+df+Vo6OjZ5555tVXX33NNdece+65B/incaABfPV05z4x8/j4+MqVK+9P07sgCIIgCILfIcLgCrQm4B1sUiWl64MD3WJ1rczbd95Uz/dKVCtqY60yT7SDzgxmNrGUaXuP1YWFKI590Y7Ha709FkwqniwBQgQ1EAKhFw/LwKrRfCt39zhuCFzi50lEKFaoMYWBelgoCFoVrEMUVeMhUUCg/b7xTCT9dDoAEaUCiaWSSUWFtZ9eB6pcevUsoMrey9Kmeu4H+YT+kerXqv5K9IfM+VLJqgozVwtYpba4NSLL2V52PbBVX/1eLSW4pKhNTWY0UMaaL/CQgUQR52xnXTLINnbdmJ0pZqJ4BZVWinJg5mZXO6rXXVbmtcIlsQ07N4Pgnt22c/EQ0u+VX22Z18fh0IKn0047jZk3b978whe+8IMf/OBd8vDDw8P7oncAv/rVrwCcffbZ93a2gYGBSy655MCvXvUCP+GEE6r+dof9/Pv89re/BXCX5wJEdMYZZ1xxxRV33HFHFXIf3mWVW2+99TWvec26des+9KEP/c3f/M2B3O3b3va2rVu3XnHFFfva/nW7XedcFEV371dXbQHYunXrgZy5cqAB/GmnnXbgJ12xYsVf/uVfvvWtbw1hfBAEQRAEhwfbalJahYDx8dEs5SYXOrOJbUxRrUZH8fwWdPagswfEGFypcas5t3UuniidjU3kfCTEMUvkFgmcIyHikpNI85jzyEBtBEoZPagFl0oGqhCuQnchKyKGharS9KrEXRlUtZ0TEEt/LJwKDCmYJeekrc0GdVLpQlSihBUsJVDtkGfpv5f29a7vf5HqQQZgQclEqqReQQRm+Or0SgoVTzCwBvkiM0dqtN/xToyC4UFkSUuKvK0VVLfIFVRqPEk7Jv2dKqw0kHGjbM8Ql9DEkJswvTKJs2h50hytu52ze5tR2rj/7bKD4E/VztneIb+3nbnFXnloI+WOPfbYt7zlLR/4wAeuvPLK9evXn3baaeecc87ZZ599+umn332622233Qbg6KOPPuRbrYjI5s2bL7vssqpi/BWveMXhPf/d7dy5E8D4+PhdjldHpqamjsQyAFmWXXTRRSLy+c9/voq079PGjRsvvfTSCy644LGPfey+gyMjI6tWrdq2bdv3vve9/R8cdDqd66+/HsD27dsP5OSVI/IkdceOHW9/+9uf+tSnTk8fyk6SIAiCIAiCA5G2hlsnnD7wZ09tHn96Y/kxbGOZWFe0VjsvAkbejtIWRzWb1ClpIqoXcatnBpxtqrFg9mxgLcVppCV1dmea5qZFbkHLQkBKiRExqgArRQpm9cRM2Fearvtta6ffTXdXQIXghQ2IIvVMLF76Ze1ewAyusutWYEHcr5xnAi39owrdF9IzRImp39BOqk34QvBQURVECdjCe3FlWRalkihBlckTw5kkswOZHZqNV6ZJZMR1qVnjomaEVKEal3NU9iC6FSt3xMdx0bHFfK42SePG2LJmLYpUCiehMXEQ3JuF3v1qJr/QO/Q+kX/3d3/3H//xH4997GNV9cc//vF73/veM888c3h4+FnPetaXvvSlan5bpZpntnr16kO4ymmnnUZLjDHHHHPM//k//8d7/7SnPe2Nb3zj/T//76GqVVA9MjJyl0+Njo5iKeQ+vMsqf/VXf/Xzn//8ox/96IFXv7/97W8norv3pXvpS18K4FWvetUvf/nL6sjU1NTzn//8bdu2AagqCw7QgWbg//u///tAlpVluXHjxq985SsbNmz4xje+8Za3vOUzn/nMgd9NEARBEATBwWGL5iQALE6V87vneAhJq6gvjnZ/y2kSux4bNsV8JI2akRJNBbybFoGQsTYySZOlKBAXGpeaRmW3JSpR1PVpKh2rJQggo0IEz+oAErJGS2CpHL3a5a4MAoT6yRHikuteEUsWUyGgBCVBQWAIXCFEbGOFAXIoCUdLITsIHrTU0x6AKIiFqXo7FDBVuzvuz5zrH7TifelUXFFwnFBkjZKiQNKOlu2lCeeKdjS2jUcbZldqZ2PfY/hZO5G4BZPEDcqp2Wp62lmM+VZzJNuWI+kmY7USDUbJUdhVGQS/x/38+0H37wQveMELXvCCF0xNTV177bXXXnvtNddcs3Xr1q9+9atf/epXn/zkJ69fv35oaAjA2NjYpk2bDi3Duv8ceABJkpx88snPfOYzX/KSl+zbc31/zn8g7m1z911mvx2uZVdcccUnP/nJF7zgBS972csO8A5vuOGGL3/5yy972ctOOOGEu3zqXe9613XXXbdhw4aHPexhRx11VBzHt99+u7X2SU960re//e3JyckDvAQOPICvegweiGc+85lvfvOb3/3ud7/vfe+77LLL3vSmN61bt+7AbygIgiAIguBQ2KSb+fls1tRaLcNdiWlhJjPG0cjOaLJNg5nuHexsirVrVYQMMYvhuJhzJlVCBEnd7Ewynggb9oWvG4lJ2qbsAGD2EAXBkxGNcq7VZa5fow6CV5ilAnWphsCTAETGkzWSA5GSRRX2wwMEisCR2hSZU1UCwRhRqygjLwDAVYN6DzCIAdYqnCfyMAxnvIohT1WDOS8UO3Y5wSKPJGdCyXXypZh6zvUM6fzAcW7oaLhUNEu4PURlrSBn/LApcqRt09oyi7Zzu7W5SdacPjbZyHbOdcTLYntk7fD4skZiQwwfBPfm0DbAH663V5YtW/aiF73oRS96EYDdu3f/+Mc//uu//utrr732kksuufTSSwGccMIJP/rRj6qN7vfm29/+9szMzMMf/vBjjz12/+Nf+cpXHvnIR/7+G7g/5/89iGhycnLbtm0zMzPVk4h9ZmZmAKxYseKwL9u0adMrX/nK44477pOf/OQB3ieAD33oQwBe9apX3f1TcRxfd911H//4x6+44oqbb755dHT0ec973lvf+tZPf/rT3/72t+/etP/3OCJb6Inob/7mb9atWyci//Iv/3IkLhEEQRAEQbA/SQZ7raOkNjroZ8va6LbWI240p/2m9tibamf8PHrszoFH3mwfMS1DcM6isExW8iSf17JA2YvhIunYcr5WznZaR3doxPtCvIPLtT+h3Ved5w0pGzVMin4PeajCLE19B4D+HvhEihg9I1KYlrPNatpbv4k9BOIRNymKwVZgPRkntqBUuAFT/Srv+w3tAbDxUcPbluO04FqGxMN6y46ightqElGoiRejiZ5pZtGo2EbPDjoYWJvEZiAqB7jnEJdZ2ehuGcbMSFwO07zYxoCbEVtD2d21kO/qcl7mXY+5PLq1XJmNn0LLTvCTf1afOKZeS4YaB9EyOggebFaNHlCB9D0abETN2iGOBjvvvPNOOeWU22+//S7HJyYmnvGMZ3zpS18CcNlll+V5DqBKC//gBz+4t7M5584777wLL7zwoHqq7XPkzl8F1Xv37r3L8epI9dnDu2zDhg0LCwu9Xu+ss8561JLPfvazAP75n//5UY961LOf/ey7vH1qauqLX/ziSSed9JjHPOYevwpmfsMb3rBhw4bZ2dnbbrvt8ssvf9jDHrZjx4797+1AHKluosz8yle+EsBvfvObI3SJIAiCIAiCfbJS5pNle11zKj76zujEW/0xi/WjOq2j98arMyXqTU/YdtNkhnLDyiqkYqDMahggNirkHfsMi1NSdhYwmFMNMEoWCoDBBAJrabS02hUyHsaREa66ChNYlBlVDzoVQsnila3aGhnDUKgDATCAAVSyOcl7QpYZUO2Z5oydLGujPh5SivvLVMGkYPHiyXpbc/FQ24zM0khJMdhagkYW9XFXG+lFI7vTh8w0Tyg47nCrbUckHTW1wS4PejW+Ox/P3rZs9sbx9sZl7Vti352n5rb42D1uYKsbm5MWlb3dGM/RMuUCzW7uLM5xmQ3V6KjJ1kgrCen3IPg9jp5s1uK7Nhg/QOtWDx7yX684jm+++eaf/OQn9/jZFStWWGu999W0uYsuusha++Uvf/mnP/3pPa7/zne+s7CwkKbp6aeffgg3c+TOf9xxxwG44YYb7nL8+9//PoB9yfzDuwzA9u3bf7Kfqjx+x44dP/nJT/aVsu/z6U9/uizLl7/85ff4JWzZsuU3v/lNr/f/NDvM8/xb3/pWkiT7d7y7T0dwHEj1DObWW289cpcIgiAIgiBQxa65bHqx2LtQLtLAj6ainbunTT67Mr91wrYny83D5c7xfFMsu9q8sGiLBWYlAZTgyUaGxEYxua4hbeliq9yrXjSqdevLC0q8kJIBCJzApACz5s6TF8MKI54h6E+PYkCFI6UIURNxCjaq8BylbpGlgKJqSqdkFKyu1KzjFIUaItTQHTKdEtbZFGyqKXRVszpIoaqZp9l4lefY1AaMtY4bhoA48vWVbmDNotTntbUD47MuzjQu48Gk3rBJ7NjOanPa1VfSruPk1ibm4nK+I3FRFFxmMzq+pfWojbXTfomTt9m1Jk4nk4Vj3K+HOxu7e7aYxSnJFrOFPQ/kdzcI/hgYptMfMnYIb2Sixz3kru3QD1w1Kew973nPXSLDyv/8z/8454466qhqmNyJJ574ile8QlVf97rX3T3/7JyrZrw961nP2r/c/cAdufP/xV/8BZam1u3z05/+dPPmzevWrds39e0wLnvxi1+sd/P2t78dwHvf+15VrTr27a8aL3/BBRfc45fw/ve//yEPecjHP/7x/Q9+/vOfn5ubu+iii8bGDuKH5wgG8FVnv7t/84IgCIIgCA6j+W5RONk50xOl+W6xPM2HYjTddMeMuM70aPf2Ve7OmSieiuubE7sllnnj99iqoFxAMGytb/PAMopqXB/yUVMJ5LLF3LS11uO6opr0nqt3AusQC0eGPEiJFAQh42FFrUcibMBWyKhaqBKTescuA5Z610tJWgrgFQohdQ5WFBCxrhNnM2Upko4gqoGMCiuxIFGTLMQrtsXHdaMxMqZTX92ORrt2lE1iXCfLsrkcSbl4lN80WWypUTHi99bLOXTnim6XpaglWje+SYuFpsKxNToqe0dk9wj2dHpZWfi9PLEojTLrDXc2rXZ3jES9VUO1wbFlMre1PTf3QH53g+CPxFmnTDbSg94J/6jjR5YNH/qAxosvvvikk0769a9//bjHPe7rX/96lWkHsLi4+KlPfaqKVN/2trftW/+e97xnYmLihz/84SMe8Yirr756z549ALz3N95445Of/OSbbrppbGzsox/96CHfzxE6/1Oe8pSjjz56w4YN1eA6AHNzc9VX97rXve4ILTsot95662233bZq1aq1a9fe44LnPe95AN773vf+8Ic/BKCqX//611/72tcS0etf//qDutYhllsciC1btgA45phjjtwlgiAIgiAI8lJ2zWX1xMx2suUjqczNDbqd20wrc3F7UVbl2ViSz/jeTLezwqcjjqYtjENJiJiJWFyuUcvBUjKkUaPXk8KaITfX9uUMDY+AGtyFJyEWIlJxSJnZISat0u/i1BKjag1vBCAPKsmXANi7JmYIJaGEAKYaEQdhoyCrznt4wMHE4tT3AFtypASXDlE+j7IokZokIrJ16Vprp3WsaQpNh/NisEaL3N0mzneLbFDnkKDi/gAAIABJREFUEkhmauTmRaUkQ3nbcNmOBqRsk6HpdBmK6WGZGtD5RJFQUSAuCj+kt5MMOdcGYYgW58zgeNPVW/VBv6c0QxkRio6f3W4MIW4gGUDYTB8E96QWm5ecdfS//PdtXu5z4qJWfesnh9JnP/ogupfdXb1ev+KKK84///ybbrrp6U9/OoBly5YVRVH1YzPGXHLJJa997Wv3rZ+cnPzOd75z/vnnb9y4scoVT05Ozs7OVq3XV69efdlllx1UR/S7OLTzdzqd448//h5P+F//9V/HH388Ea1fv/5pT3vaJZdc8olPfGLNmjU/+MEPut3ui1/84qpqu3J4lx2Ur3/96wD+/M///N4WPOlJT7r44os/9rGPnX766ccff/zMzEyV5/7ABz5wbzXz9+YIBvBVXcG9fTOCIAiCIAgOi/5odqbRVjzb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a1l/1tU2itocNl+G3glpXLhyrOPPV3UuBfsuB7nHb047MvCNk2kwKSpNbVzmT2bVrU4XHqHvRRQ3W436MCtS7SxzYbkzSKNkQadJUKz3xazJJU1uHqbm8Moo8RL0MtZBBRoMgrWQSoUybKA66/KR5wovX5YyRz+HF6M2Az9+oT/8Uum599Qyls/j6e94xzve8Y53LC0t3XHHHXfcccftt99+7NixW2+99dZbb33961//uc99bmJiAsDU1NTBgwfX18+kwvHc3NyTH/MOguDCCy9861vf+pu/+ZsnM2Q8m/5Px4+m4vihU8qwna1mn/3sZz/96U+/4x3veHIy+af6+te//uY3v1lK+Rd/8RdXXnnl5OTknj17/uRP/uTP//zP77nnnttuu+3JWyFOc24/2ZkH8B/72Mc+9rGP7d69+53vfOc111yzadOmZzzlZS972ac+9akzHrFUOh2W7eLohLb5QrKwKd7c1Z29aw/1i956ssbkwJTZ7PDoYEVUAxltirccHhzUThNYkpDSc44tm9oI9ZRn+gS41Tr5xrVjsCBiJiEkBBhMzICgcRZ6BoQE+zLYWNtckREAB7uSLhOo5tfKjfSlUqn0z4G1bpCazrAQgnThPCWsdYIoMzyiGjiQJisysqMTPcShK9bC3cd5apu33OBBxSysCxmGFd8nw8UiTU+IPvsVwSyEyAwXSwea/f3WFQN/LjJDmyVgL69vKzonVN6Jajvr6B/tzWSmNuxuCCTykaKgVgltxRW78oej3n7L1vi+HwbIh+Hshao65yEc5kiPHyAaspyVUk02a2G6zCbLCxcFVQQ70TrH6xyRo67TG9uGJ7LDgq2EIbZgOAiQEwK+IutVOpnQRmbRxo1zyHOXpGBIx85aVxdpr50/UmT5oDOVHIYKRlSrm7URT8wGetPUzHpPryYI0qJqNdiQ7gln5TjpPRdS96RJwQzdBxycwerDmN5ZBvClF4XGM4dCP5YfI2o++yls2LDhN37jN37jN34DwMrKyt133/3+97//jjvuuP7662+44QYAO3fu/N73vjfe6P7jfO1rX2u32xdffPGOHTuefPzLX/7yy1/+8p88gWfT/09ARLOzs8ePH2+32+M7ESe1220A44f8z26zgwcP/s7v/M6555776U9/+idP77rrrsuy7MYbb/x3/+7fjY+84hWvuPXWW1/xild8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f9lll+3fv//Xfu3XiuJHv3dpml5yySVf/epXl5aWbrzxxpWVldXV1TzPb7/99gsvvHDv3r1XXXXVU5YJ/9KXvrT3MQcOHEjT9Prrr4+i6Hvf+94TA9pN9/9j3Xfffa997WtvuummwWAwPz//gx/84E//9E8vvfTS46LuE9vsib7//e+/+93vfsqXPvKRj7z2ta+9+eab0zTdtm3b7t27P/zhD59xxhkHDx58yvadTufzn//8T34Njtl8AL+4uPiGN7xhdXX1zjvvvOaaa84777y5ubmZp7LpQ1R+mqU27RXdlXT54GD/4fHB/cO93+/sPjQ+OLKDkR2v52vDvA8AsZdkZogAVqyDx1LWAQCAp3Tkx5HzQqPiQd6tST+BmT40ssfmK03m0CNOasGJsByrWzsZwAdAJAQlOMlyB6AQCBEUKgWTNYMwie5BGAmMAkfolzA1ktrAlOXYeCqTcWaG3WxjUPSZxYnNbGacKST3KURmTfrk+ilVBrtKpVJ5EWrGXrvm71yobZuJkkBFniKljUoUOBoe8cfL5NLCnz0K8/3U4nBF1h8ar+41e+4A96M1hlrRdMNfjLItuteEnlK+SlqeR/O45sXNWq2OwRQLzUSy1A79Wt1Q6LIhWCPxjEm22rmX2drWLF4yqDOIrQAIMilAAUAHvpPJODwACIggsKCqych29vV6fWAGWwSmG7hhE/tKqQYMvHR1FacH3myKtRxD67UyjEvm1KnU6mlZ2WIPL2LnJDoyh+seWOekFlGowSNamoq2Tsdbp+NGrBVy4pNXdhyGhYPSlqY0U9BtBeIH4VR5tDXeU+s9KDrQeR9XHoT+QTDZC3U3K5Xn1T2rd/6wt/sn20fgn/b8z9zlP77l0zhy5MhnP/vZIAj+9V//9bWvfe3j288555x//ud/Puuss+69997bb7/98e2f/OQnH3jggXPPPffOO+98y1veMjc3BwBa60suueS2227btWvX7t27r7vuuh97XN/33/GOd3zwgx8EgBtvvPGE938cEfmVX/mV5eXl97znPd1ud9++fbt3715aWvra17728Y9//Hlq9kRZll199dVP+ejh3nvv/cAHPhCG4c0337yysrJ79+7l5eVrrrlmeXn5He94x3GNjTFf/epXL7/88ucyyL35AH55eXl5ebnX6226h0rl6axlK2vZyu7OA3evfevO1Tse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/t3f/d2BAwcQ8TOf+czP/uzP3nDDDZ/4xCd27979zW9+M8uy66677pd/+ZfPNH56mz1JN95447e+9a3Pfe5zL3nJS5aXl9vt9uHDh4uiSNP0lltuObPw/ml07gH88573vCNHjtx5551nLYA/484774QnHKKv/E82tqPtYms1WwGApWS50PlMNAcAxAQAEoRhE4g4UQkTD9kSkpKKHDMwACDANKO7ZFyu71SoembbktegPEhGYCIUQASslKVMSWUJPBucBv/MwCAEGLBKass2wpCm2XcREYARkJmAJm5SC2pKysKzFIKJlQwQUDN48BIEIBKzZ/ZQTqfmSwwEOEJiAQKAQAJirBIplEDBwA584bJT41NaBAvx0g8rYlGpVCqVnyDos9zLWcw1o8gHUGYGkjxaLAcPjbxjNCO9rEenTHyZXti7tt5jDV0vZjtjj2U0XBE+scv7JqJmgMm6WTdAgXvFicCoB3FH19dKIAlyXo6afiVxXe19H6JxdEFDFkwkkxkd6IvUZtY6kNrCH/nHGXOKdDrZKlKxHXQWgv4JdGNAwSzBM4JDJAawIjFEIPgE7rjHnq+sWxYrqg88HgcyDKhO8VwLolVqZaWXwKUnACxKJ8g2ZRYDiHFORoXqBybEztQCZnaeAUAgdOqBrLLPV/4HUEL9xnN/5y++97+/vX72+uqzaBH84kXveCqr38+49NJLDx069KlPfepzn/vckSNHTpw40W63X/rSl1522WXvec97HhsYX3jhhffee++tt956++2333vvvdvb28vLywcOHPiZn/mZ97znPXEcP8XzOYfjM/MPy11/pqjb5Zdf/vWvf/29733vXXfddfLkyX379v3SL/3SDTfccNYH6ae32ZMhhPjsZz97xx133HTTTYcOHTp27NjFF1/80z/90x/4wAd+FNE7wDSSOSc33XTTu971Linlbbfd9uY3v/msvZ///OevueYa59xNN930zne+8ymf59Ps0KFDl1xyCQBcffXVZ61/qPxIFS4f2ZEnu5qt9O1gNpwLZTAww/l4findEYigX/b6pnek/xAjHur9e6/cHhSDsZ8weMECAAgIACQKBElMrbD1nJnnk3dHx0cc24kdl9YqKZgZGVl4BQEhAQCxt2Q807Tuo0Qdi7AW1IHRgyucIbbGWwuWmQAQEJAxUlEqksIXKIR1hhACqWu6RgyZ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urq9/fbbb7311oceeujEiRNLS0vnnXfeG97whl/5lV8Jgsf/YPm5z33u05/+9N133722tjY/P3/gwIHXve517373ux/bfm5ubmtr67EbL7zwwje+8Y2/9Vu/pfXjLAJ9kse///77L7300lqtNhqNnsLV/89y7pXb3/e+9/3rv/7rdCV8pXIWYmJmT86CK23unBmZ/tgMiNx6trqVb+VUsgRDFgEEhkooBs5cRkgI06gdEEAgaqkCoUIR18PGQrjQCTtaamCQKDXKacbfabZ5gYjMxGzIETMATYNzAmYQAAIEIKKYLpsnZER2AIzMgIAAwIAAiCw0agECgEtvCp8LBBDovGUmwSKzI+etZyelvqB9yY767nrQCGXYCtuLydKudFcnnN2d7tlR39UMGqUvtAqXkh3NqLEQz+2q72mEjZpsCJCZz4blKHcZopiJZrXUhSueycdWqVQqFQAA8MTGUahUI9bE3M/Maq9oxEEaykenV3OeASANpZaiHqlAoZa4PSonBReW5ltRjHa2mSzUVV251PUj023wsBxuS1SdVNdiPd+Id83GiHxsfXJsq+wX3B0bhRAUvRne6otOX84l5Xo4Wbf5sChN1ycj2XGsUlHOmDUz7rlxd3vlBAgd7ry01myNVRu8yzgSTGW8Y2LRMTtHAfoaZAmMIUgMi7EPbD6mkwdHa0eSzuLMjt37LrzwuTP5jjo3ls6vLV84kIu5qI9IWd1W9XkIagAA6SwsXQrJDMztAwCY9KHoQ7YJOpRRojr7agEHUdKEflPmohwCEbgS8j64EphlOWrZ1RnY0uDA500e7OBTqduel6MZcyopt5ixmQZZaU9u5ae3s3Hxn9Q5qlR+7Hg/+pOPPFH0/n1cluM/+5Py61996n2Ox+OXvvSl11577d/+7d+ur6/v27ev1+t96Utf+s3f/M0LLrjgwQcfPKv95ubmK1/5yje/+c1/8zd/c+zYsXq9fvr06a985Ss33HDDRRdddOjQocftZWlpae/37dq1q9vt/vM///ONN974Uz/1U0VRPPXjPxmHDx++9tpr5+fn4zi++OKL/+AP/sAY86Nu9mi33HILIv7hH/7hY3d9/etff+Mb37hv3756vf7CF77wfe9732AweGyzb3/7229605suvPDCNE2f+9znXn/99ceOHXtSF/8o5x7Av/KVr/z4xz/+jne847rrrrvjjjsOHjz4nR/inLuo/OSSKPumt5avHRsem/isBGO8mbh8ZIbdsr9VbFoqmVkIoYQCsJ44wFChAkACRABkAABiVqgkKUQxG80tpTv318+PRU2gAAAUSoIAFAqVYGRgRIlIAKiEkigRBTALFACECNPBdwImZkRGmC60Z0YGhOlMfIEikqEhI4RsBk3nnZYSUEpEQGQmC47YI4IUamQHQzN8Xuf5C8nybDDfief2NvYhyMLnrbATiqjwxcSOkVkImQRpO5w9v3HgQOvCXY29O9KdNVUXyIUvNKiZuB2JWGI14FCpVCrPvOkXyaV1TIwARJwE0hO3az8wdqSkAIDCEjOggPlmFIWqFskkknvnazO1II7CTl23I27CCNmFwkduMBhl31vN+5mdbwTL7dB52B6aSIvZRiARNwbFRm8kBTqdbphwZHUpGsb6SYl9Gw5WTvSO3pf3TtPWEbl2d3jkS/74/x0cuXvrobv7K8eKPBd5f8sldSyTOCiH26v90ji/azZppwGxR3JkxtqOJBtFpTbb2fZKkedBa0ets5jsfI5auEi3F8M4bNaC3HAt0kud+AeuWmhoLENjF7CHpAkMpGJb5ORBQhHFcRTHAXpZDiHrgg7AWZhswuAkmByStvAlBKnDMJRUlyUIrWstF7UTzXuavLOtjPPHNvKH10YPrU26ozIrq+n0lZ8kk9v+0h6678m2Zp78n1vc4YeeYqfvete7vvGNbzznOc/52te+1uv17r///m63++///u+vfe1rjx8//vM///NlWZ5pnGXZq171qn/6p39aXl6+7bbb1tfXNzY2iqL4yle+csUVVxw9evSaa66ZTCaP7eULX/jC0e87ceJElmWf/OQn4zi+5557Hh3QnvPx/1Pf+c53Xvayl91+++3D4XBhYeG73/3u7/3e71111VVnRd1Pb7NHO3To0K//+q8/7q4PfehDL3vZy+68884sy3bt2vXAAw/80R/90UUXXXTy5MlHN/voRz/64he/+POf/3yv17vggguOHDnyqU996pJLLrnjjjv+S7fi3AN4ANjY2ACAW2+99eqrr7788suf/0M8lS4qP4mMN/dt3Xvf9neODg8Pbc95g0AEBOBZMIMLUElUnrz3HkEgawLyYIn9NJpmAkAGBGC07AwYQB7bYb/YZuCd9Z31sJmqtKmbiao1ZC2RqUApUAAwskBk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kZW4v66wsPCmm2469dRTA4FATk7O5MmTt23b5nZbsmSJUsrj8Rx1Wnjfvn2VUnfeeefxn9efy7Is9+r6q6++euTWlStXlpSUZGVl9e/fv4mDuAF+9OjRsbGxvXv3dufA/+Qs+sbUXbp3z2oTvvnmm7/97W+LFi06ePDgif0uAABwkhDgASBaffLJJ/369Zs1a1ZRUVFNTc3WrVtffvnlfv36ffXVV/W7bd68uVevXvfff/+6deuKiooOHTq0ffv2FStWTJo06fLLLz/qHO9Zs2bdcccdbrxXStXfNHfu3EGDBpWVlY0ePTonJ+fLL7+88cYb77vvvqeffnrIkCElJSVjxozp27dvfn7+bbfd9uc//7n+vrt3787Ly7v++usXLly4devWioqKVatWPfPMM/3793/yySeP+h43btx47rnnLlu27Lzzzhs5cuS+fftmzZp15plnfvPNNyKSl5eXkJBg2/aiRYsa7Jifn++ehyuvvPK4z2xzuPzyy0VkwYIFR55hd/78uHHjGpzb+j799NMdO3aIyIQJE9wW9yL8unXrtm7degL1PPXUU+6Ls846q+meAwcOrFsDb8WKFSfwuwAAwMliAABRpe6e5Li4uJycnBUrVhw4cKCiouLpp592lysfOXJk/f7nnHOOiGRkZMycOXPz5s1FRUVr1qy5/vrr3YO89tprDY4cDAaDwWCvXr1ef/3177//3nEcY0xhYaGI+P3+YDC4ePFit7/jOFdffbWIaK211i+88ELdof74xz+KiMfjqaysrGt0H6tuWdbdd9+9atWqHTt2LFq0aMCAAW4ly5cvb1BJUlJSTk7O1KlTQ6GQ215cXJyTkyMil156qdvi5vPhw4c3OEvTpk0TkdNPP/3ETvJFF10kIhdddFETfd566y238nXr1tU1ui1z584Nh8OdO3cWkQ8//LD+XrZtu2vXrVq1qqyszO2/dOnSBgefOnWqiCQnJ9fW1rotGzZscDs/9NBDRxZzyy23iEhaWlqD9rKysv/+97+XXnqpu++4ceOO/SQYY4qKitwdV65ceVw7AgCAk4EADwBRpi7Ap6amlpWV1d/kThfPyMioaykuLnY7v//++w2OM2jQIBG5++67jzxyjx49qqur63d2A7yITJs2rX77pk2b3ParrrqqfvuePXsahNu6p6YtWLCgfs+ampohQ4aIyJlnnmnbdoNKBgwY0KDs559/XkQ6d+7s/uhee/f5fPVPheM47o0AjzzyyNFO4U/7+QHeGON+SzJ16tT6e7nPYzvllFMcx2kswNu2nZaWJiI33HBD/faePXu6J+rIYtwA37SuXbvu3r37uM4DAR4AgFaFKfQAEK2mTZuWmJhYv+X8888XkYqKiroWY8zs2bNnz57tbqrPjbiVlZVHPXJMTMxRf+mYMWPq/5iVlXXU9pSUlEAgICJ1GfXFF18UkUGDBjVYet3n8z388MMismHDhjVr1jT4dX/4wx8atLghdv/+/e6PF198cUJCQoPHqn/88cc//PCD1nrixIlHfRcto24Wvfkx2Eu99eebmD+/cuVKNzk3qN9di37Dhg1HrhrQtM6dO990000bN250vxcAAABRigAPANFq4MCBDVpiY2MbtKSkpEyaNGnSpEla//8Bf9euXXPmzFm2bFljRz777LMb23TqqafW/9GyrKO219/k+u6770Skbi53fb/85S87deokIkc+saxPnz5NH9bv948YMUJ+DMauOXPmiEhubu4pp5zS2BtpAbm5ucnJyTt37ly1apXbYoxZuHCh/BjFG+M+/j0lJeW0004rqSc3N9ft8Morrxx1x+Tk5C+OsGvXruLi4qeeeioYDDbjuwMAAC3PE+kCAAAn6MjM3JgNGzYsWrRo3bp1mzdvLigoqKqqarp/RkZGY5vqfxFwLO0u8+Os+Ozs7KN2yMrK2rdv35FL6DdRSZ3LL7/85Zdffuuttw4ePBgXFxcKhdy133//+9//5L4nlcfjGT169AsvvPDqq6+637asWbOmsLAwNTX1vPPOa2yvUCjkhvzi4uKUlJSj9nnllVfuv//+I9u9Xu9PrlEHAACiF1fgASBa+Xy+n+wTDoevu+66fv363XvvvUuWLAmFQhdccMFtt902e/bsBpPe6/P7/c1aqdTNIW9s3ri7/F5NTU2D9qa/F3BdfPHFwWCwurr6zTffFJG33367pKQkEAg0/ZT1prl1NnjMXgN1W5so0r3SPn/+fPcM1M2fb2KX5cuXl5aWNl3eN998k5+f33QfAADQ9hDgAaAte/TRR1944QWPx/OPf/yjpKRk8+bNS5cufeyxxyZNmtTg/vmTSmvdvXt3Eal7hHsD7qPRevXqdQIHj4mJqT+L3p0/P2rUqJ8zYzw5OVlEmr7VvG6ru9r8UV144YUdOnQoLCxcvXq1iBz7/PnExMRDhw4duXTN+vXr3W6NzaIHAABtGAEeANqy+fPni8iUKVPuuOOODh061N90Yo8TP2Hu4nNvvPHGkZvWr1+/d+9eOdEALz8uF7ds2bLS0lJ3XfqfOX++f//+IlJcXFwXmBswxixZskRE0tPTMzMzGzuO1+sdNWqUiMyfP/+LL77YunVrcnLy4MGDG+tfXV29ePFiERk9evRR50GcffbZ7lchBHgAANohAjwAtGWO44hIfHx8g/aPP/7YXVmt/gLpJ9U111wjIitXrnQDap1QKPSnP/1JRE477bS6Z8Ifr2HDhgWDwcrKyltuueXgwYMpKSl5eXk/p9qJEye633dcccUVdY/Eq+M4zr333vvRRx+JyG233dbEevJSbxa9+2XKmDFjGqzDV9+SJUsOHDggIr/73e8a6+N+W7Ft27a1a9ce+zsCAABtAAEeANoyNxI/++yz77zzjm3bjuMUFBT89a9/veSSS8LhsIisXLny22+/ra2tPdmVjBgxwn3e+9ixY++///7169fv2rXrjTfeGDRo0HvvvSci//rXv9w74U9ATEyMu769O/98woQJJ3woV0ZGhvvA+S1btnTv3v3OO+9csGDB2rVrly9f/uSTT/br1+/BBx8Ukby8vGnTpjV9qKFDhyYmJhYUFDzxxBMi0vSd+XPnzhWR5ORk90H0RzV+/Hj3BRfhAQBobwjwANCW/d///V9qampJSUleXp7P5wsEAllZWffee++YMWPefPNNpdSmTZt69+7tXkw+2WbNmnXBBReEw+EHHnigf//+mZmZv/3tb1evXh0IBJ544omLL7745xzcvS7tuvLKK392sXLZZZc999xzKSkpBw8e/Oc//zlu3LgBAwYMGzbs1ltv/fLLL7XWV1999Zw5c5q+/C4iPp9v5MiRIlJRUZGUlHThhRc21rO8vNy9xeCyyy5r4guI+rPoW2wCBQAAaA0I8ADQlqWlpeXn59966619+vTx+/0JCQnDhg1btGjRzJkzhw0b9uKLL+bm5l5yySUt87z0zMzMd999d8aMGWPGjOnevXswGPzVr351/fXXf/7557fccsvPPPjw4cPdOwV69+597rnnNke9ct11123ZsuXhhx8eNWpU3759Y2Nju3TpMmTIkBtvvPGLL7546aWX3LXuflLdqnUjR470er2NdXv99dfddfivuOKKpg/oXoQvLCz85JNPjvXNAACA6Kf48h4AcDLs27fvyy+/7N27d3p6ejMe1hizY8eOTZs2uXPm67dnZ2fv2LHjoYceuueee5rxNwIAALQSBHgAQFvwwQcf5ObmKqW2bduWlZUV6XIAAACaH1PoAQBtgbtE3KBBg0jvAACgrfpZi/QCABBZmzZtqqysfPfddxcsWCAiN998c4MOn3/++bZt2479gGeffXZ2dnZzlggAANBMmEIPAIhit99++2OPPea+zs3Nfe+99xosC3/jjTfOmDHj2A84Y8aMG264oTlLBAAAaCYEeABAFJsxY8YDDzxg2/bYsWMfeeSRhISESFcEAABwshDgAQAAAACIAixiBwAAAABAFCDAAwAAAAAQBQjwAAAAAABEAQI8AAAAAABRgAAPAAAAAEAUIMADAAAAABAFCPAAAAAAAEQBAjwAAAAAAFGAAA8AAAAAQBQgwAMAAAAAEAUI8AAAAAAARAECPAAAAAAAUeD/AUAwqVUb5jYQAAAAAElFTkSuQmCC" width="672" /></p> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeYAU5Z3/8e9TVX3O9NwHDPcNCoiAikoUFxY06oomghET4pEVxRyryaL+YoyrJtk1cWOyKiaRrEbRiJJT44knXkgQ5FA5h2NgYO67j6rn90cnld4ZGIZhZnpqfL/+qqurv1XVDfPp56mnlNZaAAAAAABA72akuwAAAAAAAHB0BHgAAAAAADyAAA8AAAAAgAcQ4AEAAAAA8AACPAAAAAAAHkCABwAAAADAAwjwAAAAAAB4AAEeAAAAAAAPIMADAAAAAOABBHgAAAAAADyAAA8AAAAAgAcQ4AEAAAAA8AACvFx88cXq74YNG3akzb70pS+5mxUWFqauUm3k5uZqrdvu5De/+U3bjb/85S+3U973vve91I0HDBjgOE4HD6et7OzsU045ZcGCBY8//vhhK+xCjuM89NBDU6ZMycnJsSwrEon89re/7dZ37LT+/fu7p+jxxx9Pdzme99k5n5070lAo5L7q2WefPf4yunyHAAAA6J0I8N2ipqZm8+bNbZe/8847x7qr5cuXp86WlZW9/vrrnS6srq7ugw8+WL58+RVXXHHmmWdu3Lix07s6qttuu23RokV//etfa2trbdtuaGhoaWlx1959991u5Dj99NO7r4y06NtHJ5+BAzxOnB8AAAB0BwJ8d1m9enXbhcca4N95553t27e3WvjEE090vqz/u/N/+Zd/aWpq6pK9tdLU1PTjH/+4O/YMAAAAAJ9NBPju8vbbb7da0tjY+NFHHx3TTh577LG2C5955plYLNaRl/v9/kkpRowY4ff7UzfYuXPnd7/73WMqqYO2bduWWuQtt9zy5ptvzpo1qzveCwAAAAA+C6x0F9BntW2Bf//9923b7vge4vH4YW8ar6qqeuGFFy688MKj7qGkpGTdunWt9vnAAw/827/9m3sD/PLly++9996OV9VBhw4dSp29/fbbA4FAl79LV1m+fLn7c8PEiRPTW0wf8Nk5n5+dIwUAAEBvQAt8Fxs1alRyYtu2beXl5amr3P7zRUVF2dnZR93V888/X1lZmZz2+/3unuU4etH7fL5vfvObX/3qV90l5eXl7ru0780337z88stPO+20fv36hcPhUaNGnXPOObfeeuv+/fuP+trOpfc9e/bceuutU6ZMyc/PDwaDQ4YM+cIXvvDUU0+1HX6vvLw8day+TZs2icgf//jH6dOnRyKRVatWtf9Gn//858/9u7/+9a/JhdXV1eelKC0tTSQSP//5z0877bTc3Ny8vLzp06cvWbKkvr6+E4d2TEfnqq+vv/vuuydNmpSZmVlUVDR37tz3339fRB544AG3ztTPxjGdluO5vq0c9nymeuGFF6666qoxY8ZkZ2cHg8GBAweee+65//3f/11XV9d24669EHPmzHFPyKWXXpq66v7773dXGYZRW1vrrlq/fn3qmVy/fn0Hj7SDHnnkkc997nP5+fnJw7n77rs72MumS3bY8UvfkU9UaWlp6vVqbGwsKyu79tprBw8enLzWl19+eeq37Oabbx43blw4HB4wYMDMmTOXLVvWzleguz853/rWt1I/A23PwPbt21PPwLvvvnuUKwEAANC19Gfe3Llz3bMxdOjQI2122WWXuZsVFBSkrko9n1/5yldM00xO/+53v0vd7IILLkgunzt3bk5OjvuSK6644rDvOH/+fHebCy644M4773RnMzIyGhsbO304v/71r1NrXr16dfunqK6urp3e736//7777nM3vuGGG4605c0339z+Bhs3bnT38+CDD4ZCocNuNm3atLKystQKDxw40Go///Ef/+HOvvzyy+0fYDAYdDf+85//fNh9vvPOO2eeeWbbYgYNGrRhw4aOHH6njy5p/fr1Q4YMabWxz+dbvnx56pveddddx3pauur6ugd42POZVFZWdvbZZx9pD7m5ucmfMNq5uB28EEeSOjTDgAEDUlctXLgwdYepH5tf/vKX7vKioiLHcY50pMd6fn73u99dfPHFbTceO3bswYMHj3o4x7nDY7r0ba/FYT9RrYbGfOmll/Ly8truecWKFZs3by4pKWn7vrNmzUokEq1K7ZlPTqthSh5++OFW+3zggQdSX+h+EgAAAHoGLfBdLCsra8KECcnpVr3o3baaw/4R2Up9ff0f//hHd/aLX/xiamthY2Nj6tpjpZRKnc3NzW1/+6997Wsvv/zykdbGYrEbb7yxnQ06YenSpdddd11zc/Nh17777rtnnXVWTU3NkV7+8ssvf+973+vCekTkX//1Xw87MOGePXsWLVqkj+WZfJ04uvLy8lmzZpWWlrbaOB6PX3nllR1s+z3Saemx63vo0KFp06a18xiF6urq+fPnP/LII+3s5DgvxOzZs93pffv27d27151NdmdwrVmz5rCrZs+e3eobdDxuu+223/3ud22Xf/zxx9/+9re7e4fHeek78kW75JJLqqqq2u756quvnj17dllZ2WF3+7Of/Sx1SY99cqZNm5b6M9lzzz3XauMXX3zRnf7iF7/YhZ8EAACAjiDAd73p06cnJ1L/WNy6dWtFRUVy+owzzjjqTp555hk34Pl8vosuumjMmDGpN9m2erzcMXnrrbfcacuyRo4c2c7Gr776auqt+Keddtott9xy9913X3nlleFwOLnQtu2lS5cmp4uLi8eOHTto0KDUnYwdO3bs2LGFhYXuBgUFBe7aYDCY3CA5xt7OnTtvvPFGd+3EiROXLl26YsWKxYsXu70btm3bdtNNNx2pZrdVsAv/vE4OQDhu3Li5c+eecsopqavefvtttzt6Nx3d3XffnTqsQL9+/ebPn/+5z33O7/dHo9G2IyYe1mFPS+eubzsH2I5rrrlm9+7d7uzgwYOvueaam2++ObVlVWt9/fXX79q160g76eCFOJIJEyb079/fnXV/Vqurq/v4449Tt2wnwLez/2M9P8n26pEjR1500UWt7qJ/9NFH9+zZ0/7hHM8Oj/XSt9WRL1p9fX1GRsbMmTPPPffc1Ftp6urqkr+ejBkzZu7cuWPGjEl9VateQj35yUnt+vTSSy/F43F3NpFIpH7AWt2CAQAA0BPS2v7fK3RtF/obbrjBvQnZ7/e3tLQkt3GbhgKBQEtLy1G70M+cOdPd4POf/3xyYWover/fX1VVdayHE4/H77//fsP4xw8348ePb//83H777e7Gc+bMSV2V2t41bNiw1FWtWu3a7vauu+5y106bNi111be+9S131Yknntjc3OyuSh2W3zTNPXv2JJe36isrIueff/4HH3zQ1NQUjUZjsVj7x9iRLvSBQCD1nohWwxC06mnctUdXWlqamv0uuOCCpqam5Ko1a9b069cvtZJ2utAf9rR07vq2c4BHOp+txlOcM2dObW2t+5Jf/epXqR/Lr3/960c6imO6EIf1la98xd3+xhtvTC585ZVXWp2rQYMGJVc1Nja6v62ISOoNDke6WaDj50dEli5d6q664447Ulf95S9/OerhdHqHnbj0HflEtepCP3z48J07dyZf/tFHH7W6c+TOO+9MrrJtO3VsDr/fH4/Hk6t6+JOzdu3a1OWrVq1yX5L60yf95wEAQFrQAt/13Bb4WCz2wQcfJKfdWyunTp161BHd9u3b9+qrr7qzbjtPaoNPLBZ75pln2t9PWVnZKSnGjRuXnZ29ePFix3HcbW699db2d2IYxgV/941vfCN1VbJFPakTTYVHktoq+N3vfjc1nCxYsGDSpEnJadu2H3/88cPu4dRTT/3Tn/40ZcqUUCjk9/t9Pt/xV/Wd73wn9ceRyy67LLV589NPP+3gfjpxdA899JA7AlkkEnnsscfcFDR16tQHH3ywg2992NPSY9f3qaeecqfD4fCjjz6alZXlLrn66qvnzZvnzq5YseJI+zn+C5HahO62wLvt7VOnTk1O7NmzJzkO5bp169znR0ycODG1Af/4LViw4Nprr3Vnb7nlloyMDHe2VaeArt3h8V/6jnzR7rjjjqFDhyanx48fn3oD0ahRo9x/fwzDuOaaa9xVsVjMHVyzhz85kydPTh0xNLUXPf3nAQBA2vEYua43cODAwYMHJzt8rl69OvkHq9vJuSP955944gk3Yyf7zyenk73oN2zY4G6W+idvW6m/IBzWWWed9aUvfan9Ytre45pIJHbt2rV27drU8au6SmlpaerIzzNmzGi1wdlnn/3hhx8mp1uNOOW64YYbuvxv69Q+EUmjR492r0VjY2NHdtK5o0tt97v88stbPcLgoosuGjVq1NatW4/67oc9LT12fVOPYv78+UVFRW3Le/LJJ5PTBw4c2LFjx/Dhw9vu5/gvxKxZs5RSWmsRWbt2bSwW8/v9bif5efPm7d69++DBgyKyZs2aCy64oOP95zuh1RhyPp9v+PDhyc7e0uHPVed2ePyXviNftFad1VM7H02ZMiW18Tx1Vaqe/+TMnz/f7UPx3HPP3XPPPcnp1ABP/3kAAJAWBPhuMX369OQ96sncXl9f73Yr7cgIdqkNy7NmzUodZO7SSy91/+J87bXXysrKDjuMc0dccsklDz30UAc3rq2tffHFF1944YU1a9Zs2bIl9b7QrrVz587U2fZbO1t11nW1f1d/56S2SSa16rfcEZ07utRXnXjiia02U0qddNJJHQnw7ZyWHri++/btc6fHjRvXdoOxY8emzu7du/ewMez4L0RxcfFJJ52U/KEkGo1++OGHp556qpvSTz/99KlTpybbXXsgwLc9nNQG8x7Y4fFc+o580Y4Uy9tflarnPzmXXXaZG+A3b968a9euoUOH1tTUuN00Bg4cOG3atI4UDwAA0LXoQt8t3JSeHMfu/fffd1vUTz/99PZfu2nTJrcNVtq086TOOo6T2rm0I5RSBQUFs2bNWr58+TPPPJM61FY7li1bNnTo0Hnz5j388MMbNmzovvQuItXV1ce/cWoP216lc0eXOiL9YX+vGTx4cEd2eKTT0jPXN/VJ3Yf95SI/Pz/17pJ2njJw/P75n//ZnX733XcPHDiQHFDNsqwpU6a4jcbJwOYG+GAw+LnPfa77qup5x3npe+aL1vOfnBNPPHH8+PHubPLXnFdeecW9k4L+8wAAIF1ogZfU4cHa6bCauuqoo227t8FXVFR8+umnbl/oUaNGte3/2UrqSGYictVVV1111VVH2viJJ55IHRStlaFDh7Zq8u2EFStWXH311e6s3++fOnXqySefPHny5KKiogsvvPA499+KZf3jM2kYxujRo9vZ+KgXorfp3NEVFxfX19cnp90bg1Ml+3t3To9d36ysLPdBDG3HQhOR6urqaDTqzkYika5667Zmz57t9ot+55133Ju0J06cGAqFUgN8ZWXljh07krNnn312J7pd9Fo9/NXutLR8cubPn+92gXnuueeuv/761P7zqXfdAwAA9CQCvBQXF7vThw4dqqmpOWzHztTBsVqN+93W+PHjs7Oza2trRWT16tVugD/qDfBa62N6Ptz777+/ffv2ESNGdPwlx+qWW25xp+fPn7906VL3/Pz5z3/u8rdr1Slg3bp1fSkyde7oRo4cuW3btuT0J5980naDLVu2dLqkHru+/fv3d5PwYcdma3UUXTtWXCvTp08PhULJJzW+++677jco2S/aHceuoqIitZNLl/efT68e/mp3Wlo+OfPnz7/tttuS06tWrWppaXEDPP3nAQBAGtGFXtxxv5MeeOCBttu88sorqcGp1UvaMgzD7Sr/1ltvuSNdH/UG+DfeeCP1cccd0ephSF2rsbHR/dNZRG6//fbUXzc6+PjxYzJx4kS3mdpxnE2bNnX5W6RR544u9Qeaxx57rKWlJXXtW2+91erBVx3Xk9c39cP/5JNPum2qrp///OfudEFBQasHg3etYDB41llnJad37dr1hz/8ITmdDGbFxcWDBg1KLrn//vvdV/WlAN/zX+1OS8snZ9SoUZMnT05ONzc3/+IXv3CfME//eQAAkEYEeLnwwgtT75+84447brvtNneo8Nra2l/+8pethmrvyPjD7h+dzzzzTFVVVauFR5I6fJ1lWZOOIPXW024N8MnnLbuzbjuwiHz00Uepfzcfj9Q7bzMyMs4991x39kc/+lGrjW+55ZaT/+7OO+/skgK61fEf3Zw5c9wNDh48eO211yYSieTsli1b2rnD4qi65Pp28Mbp1G9NY2PjV7/61YaGBnfJww8/nNrW3QMZKTWNu52l3ZZVtxe9+yNL//79U++L7rhuHTOi03rmq90l0vXJueyyy9zpO+6447D1AAAA9DC60EthYeFNN930gx/8IDkbi8Xuuuuuu+66K/lk42Q3+FQzZsxIzWBH4t4G7+4hJyfnsEMou6LRaOpDjM8///zf//73h93yjjvu+P73v5+c3rx584YNG1IfaNyFSkpK8vPz3fuuFyxYcO65506YMGHr1q0rVqxo1RR8TFK7jn/yySeffvrpwIEDA4GAaZo//vGPX3zxxeSTz59++unzzjtvwYIFubm5n3zyyapVq5599tnkqyzLOtYx/HpM1x7dhRdeeNppp7333nvJ2UcfffStt96aPn16WVnZ6tWrk/3AO6fT17edAzzSS6ZOnXreeef95S9/Sc4+++yzEydOPO+88/Ly8lavXv3qq6+6W4bD4SVLlnT6oDqobXN6Xl6e+wDwU045ZeXKle1v345OnJ8e1n1f7S6Xrk/OvHnzlixZkvyZw/0RdsCAAUcdiBQAAKD7EOBFRG6//fYPP/wwOdSwq7m5uW00GjlyZGojeTtOPfVUn8+X2vh2xhlntN809Oyzz6aOn3z55ZcfacsvfelLboAXkeXLl3dTgBeR888//9FHH01O19fXr1ixwv2VIS8vz/27NpFINDQ0ZGZmdnC3blISkYaGhmSv140bN5544oljxoy58cYb3dbp559//vnnn2/1cqXUj370o9Sd9CpdfnQ//OEPZ86c6TaZ7tixI7X/s2ma7vjYx6pz17edA2znvZYtWzZ16lT3qWA7d+5se8eKUuoXv/iFO6pc9xk/fnz//v3dvjYictppp7nT7m3wrmMK8J07Pz2sm77a3SEtn5whQ4ZMmzbNHcEk6dJLL6X/PAAASCO60IuI+P3+3//+9//zP//Tzuh0oVDoO9/5znvvvdfB566Hw+GTTz45dclRR7BLHX8+Eom0Mwr06NGj3fszReTJJ59M7Q3bte67777DDpJ3xhlnvPbaa6lLnnzyyY7vdtasWe3E77vvvvvGG2880h/KWVlZv/nNb2666aaOv10P6/KjO+ecc371q1+l3uvhuuyyy6688spOl9q569v+AR5Jv3793n333XYaMPPz81euXLlgwYJj3XPntMrkqSOTTZ06NfUCKaVmzZrV8T137vz0sG76aneHdH1yUnvRJ9F/HgAApBcB/m98Pt/ixYu3b9/+05/+dMGCBdOmTSssLIxEIpMmTfrCF75w2223bd++/b/+67/y8vI6vk+3F31S+zfAV1dXu92nReSSSy4JhULtbJ96W35paWmrZqIulJOTs379+jvuuGPy5MmRSCQ3N/ecc85J9uKeMGHC1VdfPevvWnVhaF84HH7ppZeuuuqqYcOGBQKBYDBYUFDgDvBmGMZPfvKT9evXL168+IQTTohEIuFweMyYMXPmzFm6dOm+fft6LON1Tncc3VVXXfXRRx9dd911w4cPDwQCOTk5Z5999m9/+9snnnjieAbq79z1bf8A2zFw4MC333772WefXbhw4ahRoyKRiN/vLykpmTNnzk9/+tNdu3bNnTu308dyrFoF+NQW+JycnJEjR7qzkyZNOuoDIFN1+vz0pG76aneTtHxyLr30UsP4x/+S9J8HAABpp7qv5RZAz/jyl7/sdt+45557vv3tb6e3HqDPmDFjxuuvv56c/uY3v/nTn/40vfUAAIDPuN7VIgSgrVWrVq1bty45nZGRsWjRotS1TU1NbsCQ//vMOQDHKRKJuNP0nwcAAGlHgAd6u/Ly8tRG9fr6+sWLF4fDYRHZs2fPokWL9uzZk1yVl5fXl55VDqTX/v373V/HBgwYcNRxTAAAALobXeiB3q6+vn769OkbNmxwl1iWNWHChGg0unXrVvdJBz6f78UXX5wxY0Z6qgT6in379tXX12/fvn3JkiWbNm1KLlyyZIn78AgAAIB0IcADHlBVVfXFL34x9ZHXrQwbNuwnP/nJxRdf3JNVAX3Sww8/fM0116QuCYVCO3fuLC4uTldJAAAASXShBzwgLy8veSf8L3/5y40bN+7Zs2f//v35+fmDBw8eMmTIRRddNG/ePNM0010m0Acppe69917SOwAA6A0I8IBnnHzyyQ888EC6qwD6uFAolJGREY/Hc3Nzp0yZct11111wwQXpLgoAAECELvQAAAAAAHiCke4CAAAAAADA0RHgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAe8BkN8Nu3bx8xYsSIESOuu+66dNcCAAAAAMDRWekuID1isdiOHTtEpLy8PN21AAAAAABwdJ/RFngAAAAAALyFAA8AAAAAgAcQ4AEAAAAA8AACPAAAAAAAHkCABwAAAADAAwjwAAAAAAB4AAEeAAAAAAAPIMADAAAAAOABBHgAAAAAADyAAA8AAAAAgAcQ4AEAAAAA8AACPAAAAAAAHkCABwAAAADAAwjwAAAAAAB4AAEeAAAAAAAPIMADAAAAAOABBHgAAAAAADyAAA8AAAAAgAcQ4AEAAAAA8AACPAAAAAAAHkCABwAAAADAAwjwAAAAAAB4AAEeAAAAAAAPIMADAAAAAOABBHgAAAAAADyAAA8AAAAAgAcQ4AEAAAAA8AACPAAAAAAAHkCABwAAAADAAwjwAAAAAAB4AAEeAAAAAAAPIMADAAAAAOABBHgAAAAAADzASncBAIDPOifaKI5tBMJi8L8SAADAEfGnEgAgfex4tHybjjWJiCjDlz/IzCxId00AAAC9FAEeAJA2sYrS6K612vSbgVC8saG+ISGRZstwMjODVmausvzpLhAAAKAXIcADANLETkRL1zbv+sA0A/Xb6qoqMuubt0XzMjIHNReMPbn/kGKreGTCCBuG8jktsQNbovu2iLbNguGB4lFGIGgEMkn4AADgM4UADwBIj+j+LU3rX49u3qr3+Rpri83GoqCpA0ZjzbZ4xf436kNWqGC8nTe2oilaE93vq1xTGPs4zy5VWvtKxkbGzzFzS8yMAiur0AhnG76QGKa2EzraoEXMYEQMM93HBwAA0MUI8ACAHqXjsUR5lb2vseGlNbE1hlSMlmjYr7MT2u/3iWlr2w5UtEhVqCXSsk/MettWTRn2odzChlB1NFFeGP3Ibqpxag/4CkdYeQMNK2DlDjCzisT0iWjTn+HEm5VpBQaMN8I56T5WAACArkSABwD0EO3Y0Q82NK5cH99YoyoSuilm2CVKi1bKEjNq6KjPZ2knq9E0bWWK6TOUGa8PmBKq1+EmqcwdvtcvGdFoVrPhNPjtxjoxDummiqad75vBiOELOlpbmblmKE/Ho4myfeETZ5r5+aJUuo8bAACgaxDgAQA9JLr+48bfbkysLtcNtjiGVoZoJcoRUUrE56jMFiduKsu2wy2GbYll20pLRrP2NatIg5NV54uFBpmNQSdjry8U0pVBu6ZSBjaLmYjV1JgBnzSpeHyvFRzlk+yW8FbVkh8cMdEckq98dKcHAAB9AQEeANBDYu+Xtvx1v7KVMpSjHdGiRGkxDK1FtKW0ERdDVMwwHCVG3PE52hARLZYtWhv5jQmr3hGVo21xorVG1NTVeWp3tlmbpVosZfsSVszWStsBR5lWf190/35VlRXwWdaQvHQfOgAAQBcgwAMAeoSjo1WNEk3YpmPaphYREaVEiVZi2KKVGI4SK6GVqS1xlC2Wo0WUbWi/rR1HWTphKEdsSycihm1qW4xmn5QHxPaLFqWVJSFLaa0cEWXHEobZmMiq9E8YJFqEfvQAAMD7CPAAgG4WTTTsrqjYecBZc8DXJFbC1ForLVqJ0srRSosjSrQoEVGiDdt2xDCUVqIcQycMJfK3RnglYmilnYAo07AdifsNLY7WhihRjhJTa22KoZW2Y9rZ1+j0b9YxW0jwAACgTyDAAwC6kWM7Ozdv2/e7tcWvlGfWJJRjaKWVNg0lCeWI1ko5jliOskWLobSIxHymo8Rn6xa/dpTZ7DMiLbaRSIZwQ2lHtKFa/FprEXGUoVSyN76htSNK21pEKUNM7YiOJYyQj3HsAABA32CkuwAAQF+2+9DBva9uzn1jf6QyprQ2RBtalIgtthhOwhKtlFa2Y5hKiRadMEQbjqiEGAlRklBi2rbWtiitRRxRIkr97f55rZS2xDG0OCKO0qKU0koMZThKG8oMWNaIAmt4frrPAQAAQNegBR4A0F1idqJxb4VsrsiussVQopUjokUbIloZhqNFGWIq26cTplYxx0iIIcovtkqIo8RW2mcry3ZMrUSLNpShtRIRw9AiWovSylZKiza0iBYtyW2UY4gKWf4ZY4JzxkiA/+kAAEAfwZ81AIDuEnNsoymRXREzbUeJ0iIiSiQZuZVoEZ+WkCUBy6+0tpu0o5JRXZSjlWUblqPFUYbf1obtaK212KIMR5SIbShTtO0YohzR+m930CvLcEwlheHwv4zPnD3OGlGY5lMAAADQdQjwAIDuErR82mdKZsD2NamYYxhaOyJKlNaOFsMQHfA5li+QF0k0NMYzLVFRLaZEo76YnTB8ImKJarEsS+uEaZiibW2KVkq0EsvRtihJmHZDrq3McDAYyhpWZIVD2tDhOeMCZ48Qi9vEAABAn0KABwB0F0sZ+f3yG0cWR/c0WpUttq2UEtHa0WIZRsJwlKnMgGlYhl2UkYg3+3wxsyaqlC1KKccIxlu5ZZEAACAASURBVLR2DEs5CVPZpmPaqsmyAnbCbyvTseOWdqy4jujYGQMzTp1YFAuYPlMMZYR9/mlDSO8AAKDvIcADALpR8eD+1RdNahLTfn2nqmqRRDLEK0eJhP1mOGjlhs1+mc39gtFSHaj1qWiTxBKxiOiYWM0qYWi/rRKmrgtJ1CeijYyo+JpjUb/TWKjNzGDOMF+/s0dnjBwlltKxhIoEjPwMZZLeAQBAH0SABwB0J1PlThqUlRtJnDosvr+27rUd9v56pyWqtBK/ZZbkWENyAicPiO04qAOhJp/jyxBDmmODTafFp6wWqbObjUCTZZTnt9RnGIYtec0tdrMTUZZ/UHF4VLa/pdo4FE/k1DsH6q3h+SoSJL0DAIC+igAPAOhmSplDc40BWf7meN2ZI6o+3J/ZGA1sPRTN9JnZIXP6MCPhhA812CcPikvc3Fpp7apQ/XObfH5/YYMuPVSV69ttmhKJO0aNY5jRsL+qOdtsyMjJMaxYbcCXr6uUaoob+Rn2rioRMbODjDwPAAD6JP7EAQD0BOUztWU6GS0ypiAQtGTqQKclXi46a2ShWdloFmflFWbkh32xSG6i2Yq2WDHD5/gsNSbkG5E5eEDILy0ZQW34QplF/U1/pr11h68lFgiYqiFk+DJUQYYScWxHRJymmEGABwAAfRF/4gAAeohSYlmGbTtNhrIyA81aivLDPsswQj7lMySWkKBlZQb0wKygI7boBsdJjCkpmDrAn2Fm5UWUMv0B0zAMEZEhJTqRULbEt1cmdlWK44hhSNwWEWWZaT5OAACA7kGABwD0nJzcsG3r8gN1IlJUHAkGrWDIJwHLN7ZIx+zEjkpreL45MFuFfaGonaFE8sL+rGAo5FNKtdqVsiyxREUCYutEaY0ylU44hs+UsC8dRwYAANDtCPAAgJ4TDFqFRZkZmX7taH/ACof9IiKGskYUODXNRn5Y+SwjNySGEpFAB3ZolWQr03Bqm0WLEfYZ/bIYxA4AAPRVBHgAQI/y+02/P9R6qaGMvHBndmcqsyTL7B8RUdK6kR4AAKBPIcADALyvTQd7AACAvod+hgAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAN6dYBfvHhxYWHhkdZu37593rx5RUVFoVBo3Lhxd911VywW68nyAAAAAADoMb03wFdVVf32t7890tr169dPnz59xYoVdXV1xcXFH3/88W233TZ79mwyPAAAAACgT+qNAT4ej7/22msXXHBBZWXlYTfQWn/hC184cODADTfcUF1dvWvXrs2bN5eUlLz++uv33ntvD1cLAAAAAEAP6HUBfvHixeFw+JxzznnnnXeOtM3LL7+8ffv2yZMn33fffaFQSETGjRv32GOPich9992nte65cgEAAAAA6BFWugtobcKECV/96ldFpKmpafny5Yfd5pFHHhGRefPmGcY/foCYMWNGv379Dhw4sG7dusmTJ/dIsQAAAAAA9JBeF+AXLVqUnCgvLz9SgN+6dauInH322akLlVJnnXXWU089tXPnTgI8AAAAAKCP6XUBviP2798vIm0HqE8uOXDgQNuXbNiw4S9/+Ys7e/Dgwe4sEAAAAACALua9AK+1Tkb0vLy8Vqvy8/PlCAH+gw8+uPnmm3ugPAAAAAAAukOvG8Su45RSh13Ok+QAAAAAAH2P91rglVLFxcV79+6tqqrKyclJXVVVVSUiJSUlbV915plnPvTQQ+7s/v37v//973dzpQAAAAAAdBnvBXgRKSkp2bt3b0VFxfDhw1OXV1RUyBEC/JgxY8aMGePObtmyhQAPAAAAAPAQT3ahHzlypIi8/fbbrZYnHx0/YsSINNQEAAAAAEB38mSA/8pXviIiK1euTF3417/+tbS0dPz48TxDDgAAAADQ93gywM+ePXvYsGFvvvnmvffem1xSU1OTTPXXX399WksDAAAAAKBbeDLAK6WefvrpoqKim266adSoUTNnzhwwYMCmTZsWLlz4ta99Ld3VAQAAAADQ9TwZ4EVk8uTJq1evvuSSS2pqalavXj148OB77rnn17/+tWV5clg+AAAAAADa13vjbnFxsda6nQ1Gjhz5zDPP9Fg9AAAAAACkkVdb4AEAAAAA+EwhwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHgAAR4AAAAAAA8gwAMAAAAA4AEEeAAAAAAAPIAADwAAAACABxDgAQAAAADwAAI8AAAAAAAeQIAHAAAAAMADCPAAAAAAAHiAle4CAAD/V8JJlNeL7ZgFGSrsT3c1AAAA6C0I8ADQizjVTY1Pr4+9v9upaVZ+X/CCEzK/dHK6iwIAAECvQIAHgF6k/k+bGp/8UFfVGwntOGJ/Uh7/ZH/u7Z8Xle7KAAAAkG7cAw8AvYXTFGt+f6+uajISoh1lakk0xVpWbqz63p9Ep7s4AAAApBsBHgB6i4SjneYWFbcdR2vHtkWLFonr6B8+rv7Jq+IQ4gEAAD7TCPAA0FuogCVFETGUJcoSQ4sopUS0xJymlRtq3tiW7gIBAACQTgR4AOgtLMu0rpiayAkmtHaU8unkje9KKceoadn/41ca9lWnuUQAAACkDwEeAHoLpSR3dGH8u//sWErEcUSLdkQ5WpQSnburdt9XH1u7/N3yQ7WJhJPuYgEAANDTCPAA0Iv4fGb2SSXlJxQ7f+tAr7UYjogW5Tg6sq8p8+erN65ct3dvdUtLIt3FAgAAoEcR4AGgdwmGA9aUomjQcESLNkRrQ4tytNKGITqrNjHg6XWfrFqz95Nt2o6nu1gAAAD0HAI8APQuGZmB/OnFB0dqx1SOKUoppZQttp1M9Eoy90dDf/i49I3VFZ9sJMMDAAB8dhDgAaB3UUpKxg/qd06wqjBqiBLRosRUpuGIVlo52rDVwF0x9WL9vjXrDu3ane56AQAA0EMI8ADQ6xih7KyJAxKFNY3BuBalRRwlIo4opZXShhOMy5C9iYPPV1VuK43F7HTXCwAAgJ5AgAeAXkdZft+IafFh4bpIvMWytWhDlNKG0lq0o7TS4oRaEiM/TtS8uKG+stJxdLpLBgAAQLcjwANAr1Nb01ybyIyPH18xtLExKxazxBERJVqbSkxDixIR0cGYFL8a3fKXN8v2VtXXR9NcNAAAALoZAR4AehetdUND9ODBhqJhg/pNzq/tX9McdBKWaENEOUocUUq0mGKIVqEWsZbvfv+PL+5f+1pLXU26awcAAEA3IsADQO+SSDhai99nhPuPCGTmh8LBpoLamoxYQmktopU4jiMijohybCVSdDBWsbly85pPqza97cSa010+AAAAugsBHgB6F8sylJJ43IlrnzlogsrMcLLs5ryW2ixTK6W0KCVKKa1sUaajdSAhJ38UVZua6j752G6oTHf5AAAA6C4EeADoXZRSkUiwsCizprqpLlSYNWVYICsn4fdpf5Nt2lpEiyEiWislYogo0cVV9oiPVWx9jW6kBR4AAKDPstJdAACgtazsoOUzgkGfiLQEx9Y1J2q3NSZydovY+YdChmM4WgxliIho0dowlRNpUhWbMxu2l+cNGpXm6gEAANA9CPAA0BuFw/5w2C8ih2IDa/s3xIwy3RJT4crwuxJuccQx1N/Cu1biaBErIeEKY+tr+6eeVmeGstJdPgAAALoeAR4AejUjEIn0GxjOydLRgVXBypr9O/w7or64Tj76XYmIo5TSSqtIc0Je2Xlw8of9/+WsNBcNAACAbsA98ADQqwWDvn6DCgI5xcGiEdknTgh/caw91HAspUUbYogjTrItXmxDJLvSafjFWvtAXbqrBgAAQNcjwANArxbO8IXD/oLCjIKijCHDCvJPGV349WnOIJ8TMByttaEMLSLiKFNEKS2h3bHaR98UrdNdOAAAALoYXegBoFdTSuXlhyNZgUTCsUzD58+JaZ/v9LqGTYcCW2uMprhhaK2ViCgRLcpMSMOqrZFLy33D+qW7dgAAAHQlWuABwAN8PjMU8vn8poj4+vfP+fyUzJOH6/EDxDSUNkQ5SjuO0mKIFm0filW/uSXdJQMAAKCL0QIPAB6jIgHf4Jy888fFThncaKnEu6WGY4hoJSJatBLRqmr9wYL6qBEJpLtYAAAAdBla4AHAe8z8DP+44swzhxb88PyW88ck/KYWpbVopROWFfX74odisT3V6S4TAAAAXYkWeADwJqVsQ+2saa6eMaaxPlG8Zlcg5tiWigUD8YARywzVVTYFbUdMfqgFAADoIwjwAOBVlRWNn24+ePBgQyAn0y7Ozqpt8TsiQUMNz/f3y07YjhikdwAAgL6DAA8AnmTburk5XlnVtH9PTXZto5EZqrXMnGg8EjAcn46XBItzgqLSXSUAAAC6DgEeADxJa32grH5/WXV9TbO/OVFn6MacYFXMKghIPGDkZBiNhf501wgAAICuRO9KAPCqffvq6mpjtiG2iJlw/HEnaijHl/CXGPuym6JmIt0FAgAAoCvRAg8AnhRtiRuGaC1aJGHp/PqWzGgi6pPq/r6CQJlT7ehoS7prBAAAQFciwAOANykVzvApQ4Jxe9qOysLqloy44yipbFK7BphDiyqyNAEeAACgT6ELPQB4UjBg9esfycn2jyyvz62PhRJ21K+0If1q7KEfx8SMFYWD6a4RAAAAXYkADwCeZFrGqNHFJ0zKKog3ZTfHE5bhiLZNW8TJa9SFw0bFrEC6awQAAEBXIsADgFeFQtaZZwwvGpuhDB1I2KYZ84ltiZZgyKy3JJyb7gIBAADQlQjwAOBh2dlFQy4+QQ0KW4ZkRJU/YSWyAomw31+R5d9SrWMMRA8AANB3MIgdAHhb4WmnhL4iDU+vj0VtbZhKSzgQCDyxuSGwNT51SGjuBCM/bGRzPzwAAIDnEeABwPNC55wQGD2g+d3Slo/2O5+Uq/Im3RJPOGIfatB1LaFLTxI7y8gLp7tMAAAAHBcCPAB4npmfYfjMkBbn40PRpoSuj4pobWt1oCG2fq/v5EHKbxLgAQAAvI574AGgL1BZQWtskRG2pLZZbC0JbWhlO9reWeNU1uq4I1qnu0YAAAAcFwI8APQRKmDpDEsrEe0YWrQ4hqOdeKLx2c0qYIpS6S4QAAAAx4UADwB9h/+kwUopURIXrbWhlRIRvb9B4jS/AwAAeB4BHgD6Dv/E/qogQ0QbIko5ohxDlETtlj9tSndpAAAAOF4EeADoO8yB2cF/Gql9flFKlFJiOiJaid3YbO+tSXd1AAAAOC4EeADoUyJLZvnHFChDtCgxRQUtIzckCXHqo+kuDQAAAMeFAA8AfYqyjKz/vNCa0N+IBFV+pjUgYo0uMiIBIyOQ7tIAAABwXHgOPAD0Nb6heVlLZkZf22ZvPqjDfrMkyz91gFGUke66AAAAcFwI8ADQB/knDVCZAfukEmVryQ75xxSpoC/dRQEAAOC4EOABoG/yjSzwjSzQtqNM7pYCAADoC/irDgD6MtI7AABAn8EfdgAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHEOABAAAAAPAAAjwAAAAAAB5AgAcAAAAAwAMI8AAAAAAAeAABHgAAAAAADyDAAwAAAADgAQR4AAAAAAA8gAAPAAAAAIAHeDXAf+Mb31CHM2zYsHSXBgAAAABA1/NqgN+2bVu6SwAAAAAAoOdYnXvZe++99/bbb+/YsWPkyJHz58/v169f220+/fTTFStWiMj/+3//77hqPJytW7eKSH19fWZmZpfvHAAAAACA3kZprY/pBQ0NDddff/1vfvMbd0k4HP7P//zPG264odWWf/jDH+bOnSsix/oWR5VIJEKhUHFx8d69ezu3hy1btpxwwgkicvHFF69cubJLqwMAAAAAoOsdcwv8/Pnzn3vuOREJh8PDhg3bsWNHU1PT17/+ddu2v/nNb3ZDhYdRWlqaSCTGjBnTM28HAAAAAEDaHds98H/605+ee+45pdSdd95ZW1u7cePGsrKyK6+8UkT+/d//fcuWLd1TZGvJ/vOjR49++umnFy5cOHPmzEWLFi1btiyRSPRMAQAAAAAA9LBja4H/3//9XxFZuHDhd7/73eSSnJycZcuW1dbWrly58oYbbnjllVe6vMS2kiPYPfLII0uXLk0uWbVq1UMPPfSzn/3sqaeeGj16dNuXvPrqqw8++KA7W1dX1wN1AgAAAADQVY4twG/atElErrnmmlbLH3zwwZdeemnVqlWvvfbajBkzuqq4I3GHoL///vvPO++8nJycNWvWfPvb316/fv3ll1/+3nvvmabZ6iU7d+5MjqgHAAAAAIAXHVsX+t27d4tI22etFxUV3XTTTSJy++23d1Vl7ZgxY8aPfvSjt9566/rrrx82bFhubu7s2bPfeOONoqKitWvXPvXUUz1QAwAAAAAAPenYAvzgwYNF5LBjv994442FhYVvvPHGH//4x64p7cjmzp27ZMmSyZMnpy7MyclZuHChiKxdu7btSy699NLtKV544YXuLhIAAAAAgC50bAF+1KhR8vc74VuJRCL33HOPiHz961+vrq7uitqOWfLu99LS0rarIpHI8BSDBg3q8eoAAAAAAOi8YwvwV1xxhYgsXbr01ltvbWhoaLV24cKFM2bM2L1799y5cysrK7usxv+rvr7+oYceevzxx9uuOnjwoPw9xgMAAAAA0JccW4CfP3/+P/3TP2mtf/jDH+bn50+aNOmDDz5I3WDZsmWDBg164403xo4d+5Of/KRLS/2bzMzMH/zgB1dcccWGDRtSlzuOk+y9P3Xq1O54XwAAAAAA0ujYAryI/P73v//GN75hGEYsFlu/fn15eXnq2mHDhr3xxhujRo2qqKh48803u67Of1BKXXXVVSIyb9685Kj4IlJXV7do0aL33nvv9NNPv+iii7rjfQEAAAAASCOlte7Eyz799NP33ntv48aNl1122cknn9xqbSKRWLFixbJly7Zs2VJWVuY4TleU+n/2f+65577yyiuGYQwbNszn823fvj0ej48aNerPf/5zR7rQb9my5YQTThCRiy++eOXKlV1bHgAAQEe0JOINsWjI58vwBdJdCwDAAzoZ4DuupaUlGAx2+W5jsdivf/3rZcuW7dy5Mx6PT5gwYebMmUuWLOngexHgAQBAujQmYgcb69Yd2rOvsSriC2UFgoMz8yYXDTGUSndpAIBezeruN+iO9C4ifr//2muvvfbaa7tj5wAAAF0u4dgHm+tros1lDTXrDu76tPbQ/obawnAkaFozBo7JCoRG5xSnbh937IRjB0wfwR4AkNTtAR4AAKDPcxqr7aYaETHDOUZGrq2dhOP4DNPN3oea6z+q2Lej9mCivqKxbLMdb1ax6MCMwsq4qRPWux+/NaBxzJDiYYlgpMYXjmtdG2sSESXKVEa/jKz8YGY6Dw8A0DsQ4AEAADpEx5sTdQfFjit/2MoqFsMUES267uDOeM0B49B2Syl/ybjK6nBVKEtrbShVHM4uDGXura/aVr3/+d0fZzdUDKneVVS6tsKfkdlU01ww3DQCCcM07WhV+ZaywsGNJWN3mKFDweywz1/WUNM/I0cpsXVJ0OQ+eQAAAR4AAKADnJaGWPmnsX2bRcRXMra57lCwZJwY5o6qsui+Lc0HtsYzCorCkeDOdTtte6tSlhVyMvImDjrBrtpdfai09FBpbmNtUbwxUbHzoBVU0caShoPx2rLMUH6j5S+2Yy35A/fvqZKtqwcWj9BZJe+pgJM3JGHb/TNz3t6/3dZOfjAz4g/mBsLpPhMAgLQhwAMAABxdvKascfcGvz/U3Fy3b+0fYpGSutrKinBObX2Fv6os1NJYdXBHzFBN+7c0JBLNuYMlkNGcN2Tzwa2hUIZU7oo01Wc31Bi+oNVc22wGrHg07jhK25nRukEtcTuzKBzOie77KNJ4yGqsyDSsAZGSpqaqyPDTttUerGxpPNRUnxfMOKlwYMQXCvv8CcfO9Af7hbN8hpnuEwMA6DkEeAAAgPY4Wpc11lTvXGfsXGsk4onKnc3V/5+9Ow2y66ruhv9fa5/hjj0Pas3yIMuWjU0MwQTiAgcyEJPYsUMReEImiiKVEDJA5qFIAQlJKqZCQiBgCicBC2yTYAoMeTH2CyRgUAyyhWRZkqVWSz0Pdz7T3mu9H25b0WsbPwYsFMP+fVH3vvees++5UqvX2WuvNZeG4cENl3116vJSZWhDa/HyhQPbk0a2eiLuNYuwnJfHpqOBHbMPAtLLenEUDXcbIZdWqqbFUTnvnu+6MelSXJPq2Eh71rIibRZkclDPuSaCwdXpENKrjk0jbLs0zHpZpb6WdrcMjEQcRsYA2D26cefQpC9x53me9/3DB/Ce53me53lPZq7bXGssLC0dGzpxP5oLnHWYgnKRXNBrYWX6oaGtLu/Z9mylOS9BWJiopm4kWZ2La7q2UM/XKC5zKy9lbRdVpnor7YENGVWq6Sqqo1oaTIkzkTQvSqsnB9vzBcg6m3KUsLGK9sr0uMqmrD0Rlgo2i0G5ObZj9/bLDcUFJHe2lSdDPqne8zzv+4YP4D3P8zzP876pTpEdWJ2bP3zfxY/cZ5qz3FpRl5cglqPBzuKFaXOoearHUalIkLdiVAvmIE2q7cXdebdSJJNFYjrL0cBEpT5Oa3OtoQ3LQ1OrUW0wqoS9NYUMJ72kPp44G+WJOEscVFQ39la6JlrstSftkdHuahBEdaKOopR1WwsPr65OT09eGA5OzbRXfn7X830A73me9/3jWw7gl5eX9+/ff+jQoampqcsvv3zbtm1nY1qe53me53nnXCtPj7WWH5o/Upv5Sj67P2yvmCIRQIhJNSzyIWcraVaEUSi5UVgKR1yqirH2IuzgKGm5SFksXBEmeXdoQ8JRtzy4Whm7P+nurI1sXTmeumR/dWOlPOSaJ3sqQVyptRfCIi2pTiVL2rGrcb3I09nywNbGTBeorKZxd1lcdqi1PL5h52rS3VQdOtfXyfM8z/su+RYC+CRJ/vRP//Smm25yzp0evPHGG9/1rndt2LDhLMzN8zzP8zzvXFrorj0y/8j2olOefyRIO6QCEMOxCjmritAhJobrQlSCIE7VaAqiUCwRUxAkzHWwS1sujLm7WhreNtZrLiW9uL1QrQ1YkFWsEH89rj+7MjKc9cpFmqipOekYIptGGox1l1IhU/SscyHRbHUkhMYz37h8eM3mzebY2NEgaua9XKUexLUwnqoORsanWHqe531v+hZ+vr/85S+/++67HzN4++23f+UrX9m/f3+9Xn9aJ+Z5nud5nvfdpYozCsJlc4c6990+OHtwJG1oa9ZxL5V8vgAAIABJREFU4MiYwFDhQFAAAjBIhQhKMM4qKwEQW3ESu0yD2Eb1PK6YrF3YojmyLYtrZvnY7qTtIKYxXWiRdRpxXOd4WFqLtfZ8YaI0CAcTN5I2liojWRCMWzuUtCt5K7CuY6JyVBtFMdVrlOb3u9qIzB/8z/Oef2h8J4DBuLJjYOzS0Y07hzcYX9nO8zzve9FTDeBvv/32fvS+e/fuP/7jP961a9fMzMzf//3f/8d//MeJEyf+8A//8F3vetfZnKfneZ7ned7ZIa5YO+k6q4ByqR6ObqUgLtZOzXztTn3gk3FzjlSCvBPY3AYlZBlAAAikRkihAAAGhEDqoCBAoUasWApCWxCpCWRw40J9Q495uL042ZoNioJL5UVElaJ3wfIjYdYdTlvlrLNaHrNBKQmrQ3kzV+0SjVkbiC27DKoVl5QbRVltLU+KqIzWLHUWR5Jm47Jqr1SrhfFa1ivENbPeSKl6bi+q53medzY81QD+n//5nwGcd955e/fuLZVKAK644oprr7325S9/+Sc/+cmPfvSjPoD3PM/zPO+ZKF8+nh75EtiACM6qzeONF6/MPZx/4/8Rm4XV0XaR1NOGgQmLVEU1CJSZnZAwwSoBAkdgBQECKAGqANjajIK2iVAblfpEubM00lkZac1CKZZcEjdK3DJhJMVkb63sMhI3ma4WecBqBSqitbRDNq3azHIgJuDCDmXdiIRJMw5gQlNkpfbi1MrhxW1XTbdXMynuX+Txss+L9DzP+970VAP4hx9+GMDv/M7v9KP3PiL6gz/4g09+8pOLi4vz8/N+J7zneZ7nec8s1uZzyyd6aZdGtlTyrlk7ttJthSsn2wuH8tVTlTyBOi0SdapMjsNAcgZZiqQUhkmLFEahDPNoAn4AWICIVFUNFzZdrY1Xq8P13vJEkRqXh6Sq2jVh2dm6y8pkcnC9SJkE4gZs6tgYJ6kJKi6L1A3mXSNiJFPHgBI0UHXg2KZwOdt8YO3k0MyDi2JWN+xsZr16WD7SWOwW2eb6cMmE5/oCe57neU+npxrAP/LIIwB27979mPHTIwsLCz6A9zzP8zzvmaJn89Wke7wxt7g4XU/a7tB/1hong5XjocuVw6i3ys052ISDWIqcXFFElYKJKXAmYCaV3IVxiEjzjCEKJTKAOFEQlBQAqTpm55xm7VTRq4xbi+G0GdpexdkYlpwGsMQmKFxiSsJBYIs8DOejsoEM2t6AzQkwEBAApwApLJtQHRUJAyAmcfXuAjdOqssbExcsJ53ZTmMxaRfidg5PMnEnT0WlEsYhm3N80T3P87zvzFMN4IuiADA09Ng+JY8f8TzP8zzP+19uNe2e7Kw9sHxqOWmPFm7z0lHMHsD8Q4BCEWSJMEdFBnVic4AJGrpUNVZoxhFxENpeoDBDU0g6Lm3AFiAQMcSB4EwgygQFOM06RWvOGS7pbEdYXBG6XIhhxUByCiyHBi6UPHDCDBLtlWuGZbzZMeKMqoCMqqK/u55YxYFAbImETDMaWAvLO1cfyUrV2azXzHvEJL1GN20sNk62wFllBEFIwFR1aKxcO9fX3vM8z/v2+S4jnud5nud9X5DuqmRdsOHqyGy3cbS5OFIqQyRJVuzqqdrCISSdgqlUZAJSYyBWoQFBIQLA2oBUiWNpu7AcqSNxedIkWxBIVRgQZWWQwopJoyhUzSqjgxBhGmjN1/K0FJaNilE16gB2TCAquwxEhgBIYKUqsiVdhBMmZXWsQo/WylNar5DnOGDAUlAQxTbd2Zy1YWk+baS99kxr7eGZg8PJSrm31jBB4mx12xWYvLBlCxDVotjn1Xue5z1z+QDe8zzP87xnKoVCQU/UMk3SjrqcwzJFZQDFwhGXNPPZgwBoapdE9bKJhksV21xCe9G0FhyMkAltSiKGwIUTBitkvSAdADCk/2eQd8kYJUbSIlWn0p8NSAFWBlgtGwU5dWHejWyqHLmIlLgR1YeTZlTkDmoERh0DllSJhE1hTGSL0V7bAXkQkSoBCnZQhkJIDGUUKDiGY5UAxLCVtJWoO395etPQ9jgMo95K69T+kxMXRqVqJVmbZC6TcFxV1U6R+QDe8zzvmcsH8J7neZ7nPfMU4k51G+0sgWrdJpPMQRCZ2iiiSjvvpXOHY5f2I1VTGzWVIZc086VHgpHNWqTF3EHEQ0IUczA0e6CyeFTynroMAKsYgvSDcYESDOAURFAQiEHEKgAch6rOKFQs9dvHE0TJMRHAQCBuLa6XkmZVCo5KEsaaFU5RsrmyIVJSIhICHEjJOMPrDepICWqIy1IoAA5yZlZHYAcuCM3SgCMznqyGqmpCFsk5zDmqSH5x1l4No7W1xW2ler0+nIo7kiaVY3tHqyNai9A/ged53qP27dt3xRVXALDWGuPLZDwD+ADe8zzP87xnGFU93lp+YPlUwByuzaDXKvLmZHmANuw8GdWLtEOdZVqdqVYGh5JGUBsBh3Z1Op7azaU6SvVs+Vg9S7amvdX5h+LGqcrS8UraIJerSxXqCKQE0n4M78zpqFdBqgKCgAyLiFioAkz91nEAVAKFReAQMFASV5c8koKSnIiM2CFRybvKTFADEWVrDAGWDEOMOCOOoQJyRCAO4BxxFlaNS/OoUoCNKzrleilLchOTK0hEgzBU5wyFwHl5czjgLK5od7nTWmg6dd21B0a3TrUaEYfjlXo9LD3JhfU8z/P+l/vWAvgf+ZEfCcMnTrt6kofm5ua+5Xl5nud5nud9E6krEluUg3BTGJAJVltzydj2olRtHL//kXi4HFeqC4caAxs25UlZJT/4uWBoI4B8+WhcfrYkzfzk/lLe4/pk0FrQ5WPcXdXeKjkrUChO15BnhRCMwimUAQBWmRXKBFVXkDoAygxxUCith/oECWHJSdk2DRuCKLFCWRy0f29AGQx1TJJxyTHiIheCgBjUP1LKUQhHymIMESGqswksUS+IIgXFA6WiEyA0NuEsU+hkEAloS3P2yOyDM5UNJ0sDIwtHNhQpDW0qGyy6bHNc21ofiUzgVHJnQw4C5nP3GXqe53nfjm8tgF9ZWfk2HvI8z/M8z3saWRUAERsuMp1/uBVEvTwrwriVdF1QnSiPI4w5CBfmj1eLdn1gMtq4O5s/lJ38RrE0bZtzrrUoRc8sz0QrJyRrS5HAKWG9zDv1Y3iFCpj/JyxnQLgfp4sSKQcKwyr9JXiBEBSAAgwllweAcgAFVIkc4dE8fHFKAUGZjRDFLiMLUXUmUKgaFgdllF1BzExkiGwQmiyJhIMgakVVyyYEhAxIyBi4gqBh0nEccOPklkP3xgNTxdBGJI1K0izBDUZBpbu0tTtatZsXimwx6ShARKOl6saqbyfkeZ73TPJUA/hf//VfP6vz8DzP8zzPe4rKJiKgXaQRpFEZOTmzvzYWhGIb7dVeXMtKA9HEBXLyAdNdhRbR5stMZdBEZUfkkoZrL6qzpjYmaVvShiRtURBDHYB+rfd+KE9ktP81MalACMT9gF2U4MgEpSrSFgOwjkBCIOmXi1dlQMAkYgsSpwRDEAUIDLA4ZRJVODHMomKUVB0JwJQHJcemJAWpkCmRCapp0zlLEhhbRGm3qAzAFWHWpbCkQRlFQWotkc17hDRw6XCvra25qEjT0mAAlZl9o8e/Fi/tXpg/uDow+Uh9KioPZLbQwfGIA99YzvM87xnkqQbw73rXu87qPDzP8zzP856igHljbQhEh1bn1opiwpittlfJXLZxVzQwccjaEbAMbt4WVsrtRXGFdFfzxiyZgOOKbYTSWgbBrs1qnioRiNQ6ACCwQhVM65XnCWCCFbAqCE5cv8ocBBwQ8i4rqxaAqIIUZKACQr8IHkiFdf2w7v+3vC8sUDARAcpECg3EkgIOEkZcqnPeZWchOWwBa40qWGHTQDXqFqoQFc56RBBVBqAuspKaklMu227Q6KwOTfWGpkaWT9S6y05cnrXaJx5olIenrnpVaXRLru5wY7EWxj6A9zzPewbxe588z/M8z/tfyiXNbO6hbOaBfP5hyTqnx9XZkTC+cHDih6Yu3LnzqtLOF5a3Pls3XTYwcX51ePO2+tjGzbt37HzB5OQFlY073drJ3qHPu5WZYuVkPncom/6aXZvNTuwrGrOiVq0lmwOOZH39XQElaL8WPKAKhoKhcvrXJiIiVmFiKJiNnm5kJ2CsZ9IT1l+y3oVOoYDrf6tQYjBIiUBQgSpkff0/yLrcXeEiATGpQ5aRWEBMkZArVCyKlGwOsSQFpAB0fQeAsyRFABiXK6TLca27WkvX0F4KkmbWWSxWT2F1pnXqG720xWD0bzx4nved+fznP3/DDTfs2rWrUqls3779JS95yR133KGP+8e1tLT0lre85bnPfe7U1FS5XD7vvPNe+tKXfvjDHy6K4synnTp1ioimpqYA3HfffS9/+cvHxsYqlcqznvWs97znPf3n3HvvvT/+4z8+Ojpaq9WuuOKKv/u7v3POnT7Cm9/8ZiJ629veBuCDH/zg85///IGBgaGhoec///k333zzU39fn/vc5376p396w4YN5XJ5586dr371q++7775v7xJ5T6OzW4VeVf/rv/7rBS94wVk9i+d5nud533skbRcLR/LZgyCCarTxkmjjLuKgWD4uaRsAheWpiR2d+uhyls7H5QDUzJPza0MXDk0aIl06ljROahgFI9va3bWk29T2MmzXZB3qtRAYkKGgRJqJK1QAhlEogfphumFWZdF+XK84XYuelIggIqIEw9aiX7EeSjAKwXr0fjpiB61H5qRgXt8lD1WigOIQzrJTISFAAGHD6qIiVRMRclgLUgZU9fQ0SOEIDCgRq6oxuYljm/Sr7ylgKGCbTzSOl6yN04YqCVGUZ6Rpl3luZcatzGpU/oHxbfXIF6X3vO/IG9/4xr/7u787/e309PT09PTdd9/9C7/wCx/84AdPjx8+fPh5z3ve2tra6ZFjx44dO3bss5/97Ec/+tGPfexj/Liiknv27HnNa17zvOc977rrrtu7d+++fft+9Vd/dW5ubnJy8td//devvPLK66+//sEHH/zKV77yxje+cWZm5q//+q/PfLmIvOpVr7r11luHh4evvPLKw4cPf/nLX/7yl798zz33/NM//VOlUnmSN1UUxZ/+6Z++4x3vOH0b4vDhw4cPH/7whz/8R3/0R29961u/3avlPQ3O1gr8V7/61Te96U1bt2594QtfeJZO4Xme53ne9zDbXEiP7SUTBoOTpj6ezx6wqyeTQ59v//cdyUP/b3bqG9n0/fnCkS3VoUtGpibL9dFS9fz60GRcLpkAa6fS6fvz5WOutdjurixz3FmZzhsn3copzVIl6q95QxTMxMaQIYUohHA6UCY14ABgsAEADgCAWRVQhlhl45TUOhLqR+/9hXDud5aj9ZCfABHwGSn0UICNCeL+6n5/6V36T1aBghSQnGzar4ffL5rX/0Va1u8ACECOTBEERalqK4Pt+ngSlNsDo7Y8lJQHHbTaa8dJEyJQR866pA2bxkk7APWydCAqO9Hxct2KJLZwKufgM/a8Z7iPfexj/ej9137t1+6///75+fmvfe1rv/iLvwjglltu+dSnPnX6ma985SvX1tY2btx4yy23HD58eH5+/itf+crrXvc6AB//+MfvvPPOxxx5bW3tda973R133PGFL3zh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elxf2b31GKN3AAc7y2+6+e8XHm+h/kl5+9vffuedd55xxhl33HHH4uLiD37wg4WFhe9///sXXnjh7t27X/e616VpeqRzt9u94IILbrvttqmpqWuuuebQoUMzMzNJktxyyy3nnnvuzp07L7/88k7ncaZ044037jxsz5493W7385//fKVSuffee//kT/7kqY//hO67776XvOQl1157bbPZHB8ff+CBB/7gD/7g5S9/eZZlT1+3o23btu2d73znk5320Y823vWud1144YU33nijiIyNjX3ta1/7vd/7vV/4hV9YXl5+UmMeawCvT8GTmlCpVCqVSqVnLW5E9uQRs6rfrh+MfmZj+PzVwcnjZmTE1kf6RtYNTmzsH91g+lc1xjePj2221UYQhMsjG7LRTaNZsy5e4jgPonreidjYgVVaG0Wl4U0gZD0z+4xcRnmmIFbP4gD1RE65x8aoB0SCUDggYhB5shAwSEHqnHqnUAY8BPCi4kVVxasIRHWlPjygCoBQDKIgkBIpQGoM2RAmVE8ogncCpMhMDwFAEAWw8l8FwKwKVoA8F79TuYx9puIgAvUkuTKTChRg04uHdc25tm88CGIDzW0E9SyOfdZUyjrNdnu+01taBO+pjGYmaAfVOGkHzdm+pF3rLqTN2V1bb37gm//08H1f6Vs+uC5upM59f27/dLf5jHweSqX/QeaS9v91x7XHGL0X9rQWPvTNLz6Vmx44cODqq6+OoujLX/7yS17ykiPtZ5555g033HD66ad/97vfveWWW460f+ITn9i6detZZ531rW996zWvec3Y2BgAa+0FF1xw8803b968+f777//4xz/+hPcNw/Atb3nL7//+7wO45pprTvj4j6Kql1122fT09Lve9a7FxcVdu3bdf//9U1NTt99++1/+5V8+Td2O1uv1rrjiisd99NBqtR43BP6d3/kdAB/96EeLbv/8z//86U9/enJy8vbbb9+zZ8/999+/e/fun/u5n/v3f//3P/3TP31SP41yBb5UKpVKpdKPEbLMAxUerCJY2VVo+ifCNWdxfXAwd+vjytqf/uWTzn315Elna3XI1Ed1ZMNgY7i57n+ZkQ1RY6xvfFPj9JcObv7poDaU1QZb/ZPOxqkJvI0h3krmwkgAVs+qBAUbGGPEq3hiw3kqpKqq4llzUg8ImEAkCig8s/Hu8JI7KWBUi1L0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dTtrKIh5crBb29eeN6i+uTC0vTA62W1wKUbd/MvKY9vKo6OZwqpMSSmVSL7yqWLT1Ye38H497tWa7flW5Pcb073Zvd7S/s7UA53mbI9zBaBY9Mwnkkr9Guvc/XdseeqFXtW+82958+RnrCwsLHz96183DOM//uM/Lr744mPHt23b9m//9m9nnXXWo48+es899xw7/vnPf37v3r3bt29/4IEH3vnOd1YqFQCglL7uda+7++67N27cuH///ptvvvnntqvr+vvf//4///M/B4Bbb731lNd/HKXUO97xjqWlpRtuuKHdbk9PT+/fv394ePgHP/jB5z73udNU7OnCMLz66quf9dXDo48++olPfMI0zW9961u1Wm3//v1LS0vXXnvt0tLS+9///hfT6HNJA/jUS1EUsaXF3qMPH/3p/dOPPTbPWCKYUkqBUivhO4BQoBjjUSQUV5xxlnAl1VObCa98KUIrcxMxJgBq5YxEoBQgUEqpTjfsdiMAEEKeybtNpVKpl7DxfGX72FYrP9gDPGg5JTOjFwb7w9seKa49Wlo9O3budOWshjPQMXJAiE80l4fSLvqISBYEQPpSJApwFHW7jTaQiOptMxdRo2dmG7pt6haNPeI1jbFtvLwuylY4MY7qbtMtx3YWgXQSHwtOEo/zmFp5LTvkbH61u/0yZ3iLOXY+tXIKaxhhfXiTcEpJaRUtrRLV9aA5iWCGQnZvsT39SHf2MbqwH9UOiqjf55FBSNl0h91CVbczi/vdhcfLcVDSNBoHKPJMnmDJkQSFV/6jenIKPSDk2znNrRQMt5z0SiKAfr3YnV/jNzIiCTkXiseCNSMfAAjCFtUtquV1CykcsBghpOMnN07CVo64Zb2yvtOt142syQOzt6Q3poTXiZcO9WuH/fbCUtB71lcqqdSvLSXbd/7vk7mORe27/+6km3344YcB4JxzzhkfP35be9M03/a2twHA7t27V470er3PfvazAPCFL3xhZGTkuPK5XO7GG28EgNtvv/0EW7/88ssBYGpqamUM+ZTXf8zdd989OTl53nnn3XzzzZZlAcCWLVu+9rWvAcDNN998bL3qqS32dH/wB3+wd+/es84665mn7rzzTinle9/73re85S3H7vTLX/4yIeQHP/hBGIYn3ehzSTexS720JAn3PFZb7B2ZbHS78eJCr+fFccSlEgohAKQkYIIkRwShhAnFBCVEKaxAIgRSrWx2DKAkAqSkRJgoJUEpwEQpiQEBQgoURkgJiAJGCCYkfVOWSqVSZ4aGyZrcQC+JDneXa21dKKF7rRameSu3t7gG7Jybq+K2mVt8YjpbjSQODEurHzCxLPhtSmisWRGiSrdxZ17q7sGB9dzKA9aKiSclH9e1TGYATFcBGL0llIg49o4WN4BEleXDupKhYQNDBo+xZFJJZ/Orza2XJ8tTrLsEPJAs0opjWmUdwjhKIm7kwqHNpD7FESagBIt4q18QYiAbNnWzSDQLkxldIzjbTcKFfjvjN9brhrG8rGeKanmql3ha4gMPsVx51QwSABQoDADAEQ7sEi6NrRbxnGapIEjCfgGFhkxEbqRjFQigye5yJMRFQ+sIwqaua5jct3AIEKzLDhiE4qdtSqeVx0mmzOIAP/CvWtCDyBO6KTmjkltJr4lwnhoJTiP41EtINPlT3lk8uWu9R/5t4LduOrlrgyAAgKWlJc45pcdHdn/0R3907bXXFgpP7pO3a9euVqt10UUXveY1r3nW2q666qp2uw0ASZI81+53T8cYg5VRLKVOR/3H7Nq1CwCuvvpqjH/2pfq1r33t4ODg0tLSo48+et55553yYsd8/etfv+WWW37v936vWCzu37//uL6t3JFh/Ld/8DRNI4QkSeJ53kq4/kIbfR5pXJF6CYkiXq95k4fqc3PtTjecm2szzuIwEVwqgQgAQpjSlT2GQCKQUkmhOGdSSiSVUmJl1jxCSCEMCAATBRIUAoywkkgpUApArCyTNwwyOJwpFO0zfd+pVCr1koYRcnVjwHILlXVHMtWG5hTjvpepbhlanxva7Ou2TvS8aY/nq6NUsSRASYJYkmASmPlIs1WmjO0s0szQKoBm+uW1cs35ZPOrWWVD7BRoZTWmGvDE8BqbMGPlNTGh86bbL6wK9ExiZECzJMYKE5wf8jR7YfFAc25PH2Fp57GVRbpBc1Vz/YWZwtBwptSV4AHmLDYFZ05eEWLL2HRLXWdgUQqQvILxaCZvEm1Vtrg9XymEHYKA95Z5eTUnJpYSARYY1MpUMQQrc8WQAoQRVzgQPBg/b6A4UrdysjguC0PULoYsGqV0a3EkY1jt2N+zPBcJPtVZXg77AUuEEId79U4chPyprbaUYs0Zf/d/kEe+aS4dUP0mUkpiIqgJdlZRyyCazA7GL3prrlTqV0g49cBJX8tqh09w37tn2rFjB8Z4Zmbm2muvnZmZOe5soVDYunXr8PDwyo/79u0DgEsvvfS5astmszt37ty5c+cJRtff+MY3AGDjxo0r4espr/+YQ4cOAcBx7wUQQq9+9asB4MiRI6ej2IqDBw9ef/3127Zt+9u//dtn7dtVV11FKd21a9cjjzyycoRz/olPfCJJkte+9rUDAwMn0ejzS0fgU7/+GBPzR7vNhtdqBUkkBkdytq23WoFSqteOhABAimAkpSJYUawJEEIAKAmAlFJKYgCQSiGEn5yKqACURAgpUEhhQAAKAQBghAApBRgD1cj4eOmsbUOmmf6VpVKp1Bk26hZeUV076+QfRNTvLmrGtvWZ4mhlfAs1W6E3L2Noz2Ua0+C3C73FlmbQEPlER0RDRLd5JCRvj21dLK5qN48WGlN7haxV17vEZN25ttcA3aT9Bg3aw1suecOa88YkOrIwkcsPouYhxEEnVCuOmbkqH98xo2f1qEtzw7FuDepmrjWr4hhruvKbhlse6DetwlDi1QUPWXGojnQaB3rOVW4VS5EoYUQ9xzeNsJzJD63NliuG7mdKjAWsPiUw5XbBiLqgOOYCMCj55N51CgAQEAmFqNU13JHRs2rz++yeyTVdBxn6ggOyESIYd6Igb1gbC4PzXnu613iivbQmV9Uw6kbhj5emRpzCiJsHgGh2d+/IQ537/3/RWdCtnGA+4hGWEhMNS6YMlyWhtfQE5qGqrkOaeaYffir1iyBOdvh9Be8sELf088s9w7p16z7+8Y/fdNNNt9122+23375jx47LL7/80ksvvfDCC5+Z3e3w4cMAsGbNmhfTVQCQUs7MzOzatWtl8fYHPvCBU1v/My0uLgLAsWD4mJUjS0tLp6MYAERRdPXVV0sp/+Vf/mVlIP2ZLrjggttuu+3973//jh07zjvvvGKxuHfv3sXFxcsuu+yf/umfXugtnIg0tEj9mlMKDh9cfvSRhShMmk1fozSOuW5pCCAMYy7Vk7MMEWCEuFC6qZJoZcde9FQCHrmydx0orJDCCEApIEgpIEAUkrCy7B0AJAAGTcNUw5mMMbY6n8mk8wdTqVTqzLOovqk4NOTmy2amGa1tRL0stXpxPGjl1mRKEY+Pep3B3sJwa3pPblWVgNDtvt/ISkZF7GsWYDwFknttjYVxr1ZQRLZmKobhdxb7ST8urspbeVO39OKqUadgzO7Z1J4WUQvnKgYIijNmcQzyw4tuMex3MgMbnKTbMVyOiATIDKxVPEGlCvOaWnF00HS4poUsDDHx86NeY8YJO2XFjwTd0aCVYI02pxc5z8UeDG8kbslc+xvCayLNBCXj4bPMsINYDFJiJQABViDRky+Zma4HmpWYmarh8MzAwvxEKeoQajSZT818rJlHeg2PRdtLo8NuHiE41FpK/JZOaUJoPU7MJHysMcskHzHMxvQjjcf/08eGbmRx5GvEAIQowWA6gkWSRXkZW/N7WONwrIQ5uj1NCJ96KZDJi8o6pF7E5Z/5zGfOPvvsz3/+8/fff/+DDz744IMPfupTn3Ic55JLLvnABz7w5je/mRCyUnJlmHdsbOwkWtmxY8ezHr/iiis+8pGPvPj6n4dSaiW+LRaLx50qlUrwVPR7aout+OhHP/rYY4/dcsstz7r6/Zjh4eGRkZF2u72yJQEAIITOPvts0zRf0C2coJMP4Hfu3Pme97znnHPOOfFL1q5de/311590i6nUCZJS+X4ihNQoieIk8JMkSqKIMya63SiMkrFVuSjmg4P5o/PdJGIAaCWQJwSiiEsBUimdKTthGFCi4dDAUiFA6skBdgAlASH0VGoeRJBSCgFWVMOuoxWKDkbIsl/Y7KBUKpVKnT4EoYJhO5o+2a3nDJsLEfLkkeXZCyqrAdOotNogqlte16dW2coYcsw48D1luCjsJlLEmIz3l+eMeKA5XUw8gaXQbNHsqkxBt3M6oQ1qFirrGDH5w/+O5h+jdsFByNBMtXaHjIIkMxDE0eLikenSasgOZLkbz090BZ8b3FCxsu7AeBh4VEh8+F4quBv3Vdhxh7eOG1Z3ZPMS41knv7a9nBNeEyOWG8kHXbS4v7tqW3XNudrAWmf7FVrlEOYsmdvdyI+6UQ8LbgoBT6U9lQg4phFg36nouWGPxUFmMK5u6sWBTbV2DlmZgWJhqBOFvSTiSsSCHe21teZ04ndUbaLmlvpckZGtjdB7uD67LFnUrXsSciCxkhSkINTUXZqt4PKquN9GItE6CxaoOAmQnddK48TOnemHn0qdds9MY/kCLx9+MZdfc80111xzzdLS0j333HPPPffcfffdc3Nzd9xxxx133PH617/+9ttvz+fzAFAul6empprNk5muPzQ09PRl3oZhbN269c1vfvN73/te9NRLuhdT/4lAz/E28Lg0bKeq2K233vrlL3/5mmuuefpm8s/0/e9//4orriCE/M3f/M1VV11VKpX27t37l3/5l5/97GcfeuihO++88+lTIU6wb8/v5AP4z33uc5/73Oe2bdv2nve859prrx0dHf25l5x77rlf+tKXTrrFVOpECKHqtX6S8NqSNzSc6Xajg0/U+17S7vpSAEaQxHx2rmcZRNfR6EhmbrabJAIBIIwIIVKBZNxNWCYWeT9GCrUcU2O8YxtIKoUAMEIEEfXUbvMrcTxCGEAobJpkcChvWRRAgYJGw0cAjmukE+lTqVTql0Ei+HLYX/A6GKOQMZNqsRAE4Z6I21o2pBqKvUCpbmeKaLYj4sWRlz2hu+ckfoX1M359ARM3U86YdixhKjtAJCOmqwAIpn0WB0ceLM4+igXzcsNu5AX9BkFYDG7qLx5E/Vph5GXdxN/j9zypapI4RI9aTeqqXDzlxN6OuQcrsw8CV2BYtp2RQbuw4ZX58toyNZpJ7B36CYiQugMmNQeKY2b7qIi9gMVZp0DW7DBWna3N7+22F+jghmWZFJcPk0BiwQhSACABIwUawhmd9s3sUc4CIcLy6rPcnBeHYZIYSCkFjCcFJRbrU/fG/XZrYah+uGg4npEte+0utdZgtL08eqTbnE4iCHoujxRj0msiEIjHoLjiEeo39agHSuGwzUEqnqDDP7HGd6QBfOqlQB/adNLXYitHcoMvvg+Dg4Pvfve73/3udwNAvV5/8MEHP/GJT9xzzz07d+685ZZbAGDjxo0PPPDAykT35/K9732v1Wqdc84569ate/rxb3/72+eff/7zd+DF1P88EELVavXo0aOtVmvlTcQxrVYLAFYW+Z/aYlNTU7/7u7+7fv36L3/5y8/fvRtuuCGKol27dv32b//2ypFXvOIVd9xxxyte8Yrvfe97X/va1973vvedYKMn6OQ3sVuZSLB3794bb7xxfHz89a9//Ve+8pV+v3/SFaZSp0SnHTwxUZuZbkspJw8thwEHhJsNLw4lSAAAJhSS0tBIwqVQClNkGMSydU0jChSLmVLIjkTWj31D61o0F8YGB11IiQAAAVJIIgCFCUIYEAIlASNMNVIdcHI5K+GCc2E7RrPp73ls/rHd85OHllfyyaVSqVTqzJIAXEomRVa3DUoBgQB5Vmn45dU1YaYEgxtLxeFt7cl8t+5GHTsJcNyvgFzQLZ1FsrqBDG/r28U+1tuGYxMTIZRIwVgsEIo1S499MzOgZSpZr7WQRF3GAsDtyO9KEWaqBSszDtxuz832l49g4wmkLwA63F2+f3Gy2a0ly5NEcHDzwi4oFimi02w1M7RxsLJm88imjUMb8kri9vwwAQeEqelANIAnR3I44F4SJkZmFuuG3yEsJgoEUAUYACOMECXUdMPi+KOcTfU70/3WwW7jUBiYbsnQ9XZjpje7p3L0kY1BoxL1W9N7qn4jY5i0MGTnKzQ/uCXxhjS65Hdn+435JOlbRa65WthRms6FRFKCwrLfjlvTvN9k/YYKfdlvqiQU/abwT9dYXCr1S8Xe+oaTTp3onH0FIic50vO2t71t+/btk5OTxx2vVCpvetOb/v3f/x0Adu3aFccxAGzcuBEA7r///ueqjXP+tre97aqrrpqbmzuJzpy++lfi20ajcdzxlSPHot9TWOy+++7r9XphGL7uda+74Clf+cpXAODv//7vL7jggt/8zd9cuWTfvn2apv3Wb/3W06s6duR73/veC+rbiTj5AH7fvn27d+/+4z/+47GxMSnlf/3Xf73vfe+rVqvXXHPNd77zHc75SdecSr0Yy8ve0aO9uZnO3seXDh1s7t49Nz/fBaUEl2HIOZeS8yRRlqs7jikTVSjYhbLjugYiijGBMCIgEIDAJCaYE5pgJEFhKTECBRJJJJCklGgawphgwETDUknL0ssDjmFqGBBCqN+PO52w34njmB+YqE9PNdNs8KlUKnXGDVgOwaRqZwGURXUllVJyQ27gwsF1l6w5+7Xnv+0NQxuydt4e2igrGwUmqxb2rlnYa7SX9uVGEzNXHVyrgUpYBJiuFf4wD/udpXmiKwVKiZg6fPRlyMokiZ9pzeDMgDm0OVdZq8xMz61IHtndxaGJu1YtT467haLpSgCfJ45uGEnYAdwujAsrr4qj2MojKQABIAwAWCTjBBUVX9ecMub3mUf39XLDxC1JpepBf67fnlienpvbP73/ntKhH2bbs3bUxyLRgQNIAIkQFk6lbxbmQOtgrWQ4NtHbkb+neXSyV2vPT1j95ub6xLbFvaXlw6x2KOfXcpLZUijO23HghZ4AeaBb/+nSkd3N2cX2wjwhcXl1fXCTTx2m29iwACMFEknAukGoASIBhBVg3luSXutMP/NU6hcBm5nMBe84uWtzF7/3pNvVdX3v3r0PPfTQs54dHh6mlAohVrLNXX311ZTSb33rW8f2Sz/Ovffe2+v1TNO88MILT6Izp6/+9evXA8CPf/zj447/5Cc/AYBjg/mnthgAzM/PP/Q0KyvVFxYWHnrooccffxwAVnLCaZr2zC0DHcc5iVs4ES8qjdzZZ5990003zczM3Hvvvddff32pVArD8J//+Z/f9KY3jYyMfPSjH32uX6ZU6jTxvGTycPPoXGtysjE321pa7M7PdL1OiAnCGACU4EpKIiXr95JiwS6VM65t5HNmJmMAYIwRAAgEgIAKSYQiQmhCAlIcEwUYIbQyBk8IwggBAkIRUqBrRAqlAGxTK5cszSCBnywc7SBQAwOuZdF63Vte9n0vYYk40x9SKpVKvXS5mnnR0LpeHMZcLHrdWtivB/0+iyt2ZltpZFt1VdbO2ZJZhZEEkz7ggCdBHCRYgeBV0x4D6Th53S3bdtF1Syg/nGx8VXNwSytb6XNhaHSZhc38SAzYsAvR2gvUjnfQyjqkuyURs+lHkvqRQa+x2m+W+jWmeC+OsCIEMDfsBXsgCDos6tPuggi7ojgaGBkmBfdavamH/OlHhladM3jW68qZUmZ40+qBcWRlZ/uNnxy8f//e/7P7vl3tA98rzj4yUD9gsJWNWAErhSUAgEI0RLhfHK07pQwm7SSIBaMEJYLnAUaJVg6a0s4nZpbHgZcEdWxSvx24Jcer09a8HXXm7FIT0b3NeVNKuzE1PPdYpzmnJ6FB9YxMtDgAFiOqgZIKISWllBJ4TAgxRrZhJ50/n3qpKL3j/z2JQXh782vsbc+Zd+3nWtlb7pOf/GQYPss2eHfeeSfnfHx8fCUV/KZNmz7wgQ8opT70oQ89cyiYc75z504AeMtb3nJcVvMTdPrqX5mdvpK17phHHnlkZmZm27ZtxzKon8Ji1113nXqGP/mTPwGAT33qU0qplR37isXi6tWrgyD44Q9/eFyf77zzTgA4tu7gBPt2Ik5BHniE0Kte9aovfelLi4uLd9xxx7XXXus4Tr1ev/nmmy+44IItW7b81V/91TPTEqZSp1wUsfmj7YXFbhILxrgUEIYsjFnEeBxJhLBSEmEgSAkBjaZ38FC92/UJJYGfNJZ9yZQSSikAhEND67p6PmL5iPUcnVHCNfzkXr4AoGTMRJxIwaSSyrCp65q5ok0oLpYtO2OwWARh4vWTWt1bWuzHkVhe9g4drE8ebszOthvLfaXUmf60UqlU6qUop1sYwXCmsOi3M4axrTTUY9FS0F05iwAZmWLilEV73g+9Lmc1aj/hVGf0zMHs8Fxx9VRu1Dj7zUMXXpPbfuni0JbZwtiMXYwNx7EyiZmDgTVZwylqRmH8XO2V/6Oz/lXTSTLDhZP4hYW9eaeYc/OssnadX6/EPSGUz2IOfMjJdu1i33DbVh7nqomZ9UurW+V1R5G+b8//2bv3nqOPfnu5OdeI+6Wx7WNbXzdoWAOZIuOs9sSPKot70CP/5jxxnz77mBEHmhRYiZWEpxKBwgCIAjXx0CanumFVdU1EKJdSKKVjfX2+OkiNVWHDcouehL5UXREzzhELDwXeownbR50kP2yMbCsMbqpJxQQf7C2fW9s/4C1nVZLFUFaxISWwBJBSsa9EoliCTRskR1ZeK6/Fmo60Z0+8lEr9+tHKqwfe9dkXdAnJlKu/c8uLafSGG27YsmXLgQMHXvnKV373u99dGWkHgH6//w//8A8rQeONN954rPwnP/nJSqXy05/+9Nxzz/3GN76xvLwMAEKIhx9++PWvf/3u3bvL5fIXvvCFk+7Paar/sssuW7NmzX333beSuA4AOp3Oyt196EMfOk3FTtDKHu3XXXfdylg6AIRh+Gd/9mff/va3S6XSO9/5zlPeKDodgUSr1brhhhuenvhuJcj/8Ic//M53vvO5Nt/7RZqYmFhZw3/llVce9yIk9aur2fAfenDu4BO15bonuVIKpFJSKMCAESCElARMACEihBBCGSYxDWpahmAijOMo5FIpxZFCEgAbCbe5AKUSSgKNSAQEIwWgpMIYKUCEYkIwKEUpzmQNxzUqZceyjXq9xxLZagdhyAyDWKZuGIRL5bi64NI06Nr1peGRfHUwY1nHT7ZJpVKp1Om26Hfump3I6mbesDO6edRrr80ObC+PrJzt+a3HH/jXqd3/2WvPGXEwm63O58e1xE9yI9roWRtKY2eVhkfdglTqiYl76eL+JkWXIYAAACAASURBVKYVtyi9Vs0pmeXxyyrjBUo1MyMyA0dDL+D/l717D5asqg9H//2utfaz392nz3POzJx5DzMIIhK8kiAaIfyERBPgRqxKjDEp6moSSySWSiqVlFZp6dWoqV+KqlC5pDSWIOIDY7xCBFRUnoLzYt4z53369Lv3cz2+948eR+7wEGcGIbg/VVDndK+91u7eM9P93Wut7zdFo9xH72JPfkMzW3Er9kuDzuKRjb9zX3l9BUHLtFgop8S5iramfVuGjNuxX107tcVa2rcyv0/0G1XLtoNmavvVLZesKY1D0OxObH9yYf/E6mF3ZX8zDs3hh8phU+gUjGFAOKweR0DIGbfQK7ibLi5f9H/+zC5/T+ldK0erlmOExVCste1Sd6m//FTCrHzYcZcPzNq5lvAXi6NLuVF0/LrljRcqGsx80POjzu+2j79q/jFVqIXFiQ0c3cM/0UlIaYjCoiRgbp7nqmJkPZDmfg0Y47myv/Hi3AVvZU7+pb3omcyvTeNLN7a/808vpCVzC1Pv+7q37dIzHHHXrl1ve9vbTqaOGx8fT9N0mBqNc/6+973vU5/61NPbP/XUU29729v27t07/HVsbKzdbg+zoE9PT992222XXXbZ09vX6/XV1dVHHnnklyaxO43+d+/evXPnTkR8rjXk//mf/7l582YAeOyxx6688sqVlZVNmzatXbv2xz/+cRiGf/qnf/qv//qvQvwig8DZbXaKD33oQx//+Mc/+tGPfuQjHzn5oDHmmmuuueuuuwBgcnKyUqkcOnQojuNcLvflL3/5LW95yxkO+kxnMzN2EATf/va377zzzm9961sns9nl8/larTZcZv/AAw/8y7/8y9e//vVisXgWx81khtJUx1EiOOecK6N1qomAMeCcM0ZKEWOIiESGjGEIRpNW1O2EXHCZECCRBkJDRIgQOzx1GNEwxzwgoAZCQEA0YBgyhsAZImfDyvBCsMXFHnIYBNJIozUhgZQ6SSJAEAzTVAf9hHNoNsMtW2PL4uMTBc7PwiqYTCaTybxwDrfOr08vBN2i7aVaKWPsnxdJBoCCXxlMnfdEY96x/HxnaWDlcunAaL3M+Fonf6zfLDt+2fGl0YNCPRqM2YB8sGpG1reV2TmyvjC5xbc9ALAANjm+MgYAmuObmodHw9ac9KusNZ8vT7x6fO15lXWeSSWZY/3WUzotja1vp4lOwqd6qzN+eWfQslcOpisHQreUR7Cr03HzKB15pF+dyo+sY92l/OGfsKV9WBrnSnlxV8gYhtMyCESAOCxyCoSATs6prh2EnbxVqDaObAk7BcsJtW47ucOm5EV93x/B5f0gw6Olyb7wl22361Uct9iT0ZIhy7YTpcI0LPUaVn8pEbbtFnNhG4yM0wRUBMIWMkJuoeU7a15ljW4gMBQHJmjpaJA2jvDjT3rrL0DLfamueCbz61R/+/9tjW5sfOkDpJLnaWaPbZ74q684a3ae+Yg7d+7cu3fvv/3bv911112HDx8+fvx4pVJ5/etff+65577//e8fRr9Pt3Xr1ieffPLf//3f77jjjieffLLZbE5OTm7evPnSSy99//vf73lnumrmNPonoufKXX+yvtoFF1zwwx/+8IMf/OADDzwwOzs7MzPz53/+5zfeeOMpc8Nnt9kLwRj76le/+rWvfe2WW27Zu3fv0aNHt2/ffvHFF998882npKY7W4OehRn4brd7991333nnnf/1X/91cvdFoVC46qqrrr322iuvvNJxnAceeODzn//8nXfeCQA33HDDS15MLpuBf0U6dKj5g/sPNZZ7UaTTVKWpIkLLYrYlDBgtCTkZA0oaAEJAxlHYnDQhIjLU2qSJJgAEAgIgIASGQAgAyJCMAQJggMANaSYEQySjAZCKZTefc8Mo1dqggSiSAKi05hYTnMl0mL7OEJFWxIWYmCq+9rVrd543kctlteIzmUzm18oQHeis7GrOD3/dXB5dW6iWHX/4a6Llf8/u+8+ju2yA2bldyaBpiALhlkY3bayOTeWry2Fva2W8aLtVN3e8s2wng248iJiDbu7V9elL15xaSkoa/fiT3w1//KVivmoPVvtOrggw8uqrnO4iAqCbX+msPB4GLa9Yqa2LvNJjzQVh1B/4bqVx6Oj8vp5wxl3ftxy+ctT38pX6elfGiUy6pAdHHuMyVCr2F/Yxo4Y56ZGGK+hRCQs4105Rjm2pnPe/5MjGlcM/EYXa0uqx40E/lXKpPjOorp1P4nzUs2XYTZOB7TY0kmX5wqrZuVYSREqN+0XXsnyjvdax7YPGq1Qvr9K8DFnQ0WGbjLbjgIO2kLFcxVn7KqsybYIO6Qi9ivBLojzB83V/55ut6vSv7RJnMi852TjSvOvv+w/fSfLUOkSiPFn5vfeXf/f/Ou2s9ZnfcKc/A7+6uvr1r3/9zjvvvPfee0/eGikUCldfffW11177e7/3e677i1utl1566aWXXvqxj33s5ptv/upXv/qSB/CZV55+P2ks9eNIRglJpR3PtmyuleGMMYFICISERiAgCU3aaDIGVGqEADJAREppBCIDxE7MugMCASIBADiuZQxJRQyIC0uS1towNiz3DgwZGUoT7XkWY0CI4SARglmCA6AxGobr+Y0hYqDV0kJv9+7FDZuqWQCfyWQyv2YMcUNpJG85oUoFspqXK9q/mBESjDvc8oUd6qSXG50DIY3JCWt7oVp186Ne4dzaZNnx614hb7kjbn5PayGfqwqVbq9Obq+Mq+6S7q8CaebkeWWqT3Ss11xO46Q8JQvVyuhGrpKlOCy15qxBU6uYAYqVw9OdxW5xKl09FtY3zoysn+u1loJeJGXDq0LrWK9v+oi25U5Pn1ucOic59CNcPZJzi+gVzOphCFpoFCEAMCBDAIbxxPaBc7C8xKuEhZrNOEN0kwG2ZjkyFnQT4U4u7jniVwgdv7a2EwcWEzzt12WymqTaUEclHLiGFBHHcsUC8hETTTmWxybdxX2qv6yN6hfHSq1Zw1Boo4wSaZgsHUiOP8G9oiiNQxrJlYO5bZfywhio9KW74JnMS8Cqz4z/5b+P/sn/Dnffky7sVd0ltFxRmfI2XezOvBZeBhuKM/9znX4APz4+rvWJfNrFYvFk3P48SQXf9KY33XzzzfxpC9UymTOntWksD/bsXp6bbStNHEkBSxNZrfm5nN1cjQQH2xbcYmE/jaUk0DIGAgPAEIEM00AkARkDrhEYgAFEIoLhdDwSEhoDliW0Sm2bKwNEAAhccGMQycRhmqY6TVU+7xgCTQo4KgOCCBkyRjIlIhqOOJycX10JOt24Plp4qd+/TCaT+Y1jMT6VLz/rUxzZmF/M2XZ3EEoVbCNlq6QgAIOWWxoBhIlceUt5zOIcACzGLM5TrQRjI26hmPRUZzFd2AvIgIw1fe6cWznYWYktv1UYiztzlCs7yEYnt4mkm7SOQdRPlg+k7Xm7MGpZ/mpuxNcyL+MLpzYX2rO8O5+3rcrYeicOB5YrtXRGZrjtIYDsLIpRz/PzXZVwncCJHKsGEQhAW07fq3HXFdzulqcoTduDbs5aMWFHDppHc2PCL23oLkmiueZxXZpGaU95OSds67gtAJbSYN543B1RzIyIQqhkKFUtn5vO10Z7CyNGIbMGbiliEaWBRZobQ2SQwERdVJpQg5JGRtwrmaiXzu5CblMWrmR+IzE3n3/NW+E1b32pTyTzinL6AbzWulgs/v7v//611157xRVXvJBiAIVC4X3ve9+2bdtOe9BM5hRam7nZ7kM/OjY33wp6klkYS41EhigYpAzQ87hSZNsCwKRSkcY01QA0nFc3BJZjUSrRBjKAKBKjkIb1GZA0EYBANEhSKaU1ImpDw5R4loW2K4yiJNFKAxiFgEkiOUeVaEdwQgINhGQ7ljFKG0MGOEfOGQBJpaNQvsRvXyaTyWT+/2IlNekJr9RPwm0q2Zy0qrafqN5i6m0XbMPoujWF6jB6JwDB+HS+6nAhGAOApHk4XXzKGtuIzFKdxSgamOZiNRn4zFotVA6SSS3vVZMbXcd3ji3ExsTzu7RKDIEIe9tyQdPz5lYOmsJI3nIG+TFvwpigPVadkoDAMD30sJMMjOurQVMng3D/D8I4wDRhxAA0DBfPIyAAKiWSniSpUSjSjdJ0sd+AyXPskZnVfpMPGh7p/KChmTW9vC/XXU7zZR8YCmtccMfKb7fY40gtIQp+tWh7c4OWAMp15maTsBZ1I6OoNn14bGurvXje3v+ykkBzC1AIkzBgxqTMcikNyGgTdgEwbR/jozMgn28zcCaTyWReuNMP4L/xjW9cfvnlv1IRvx07dnzmM5857REzmVOEYXrkcOvRR+eaK71uT8o01QEJLoRFqDGOlUwVY5yAokhyzgxBGEmjhwl+GBkCAhmnjisMgNFGp2a40p4BkUZEwxgDZACEGkAgd7hrCZko1xdgjEwVEhIg4+C6tuDMsrmWVBu100hZDg/6qW1zP+8IgccPNxMiIMMYA2KOK8IsgM9kMpmXmdV4cKDT2Fwdz5v0sOPI2IlH1qFWW4LVSdJby2PDta+xksf6zUQrABDI1hSqRcsmrZBbyG0AYI4nDz7IVMrQ8r3iuIyCYr0w/aqx2ppxk0Qrh0zcJyJWmjS0CLZXUDEPu4frm5tx5CXhmlL1gJGrhqXMqRVHtJIz4xvZ0t5ocZ9qHg3iUKWJSgZMSxTMlgzBGABOYAg4pMWkJ43sW16SWr5KoLLmELMKtZl4dTYXtFi/3bC8FadYV8E53a4jS0w4Wohg4+v96jSPB9b83l0II+VRm7HJfGl1+XANcQ2DpDLdXzlAYbdTyhdMDIwr5NxIBgwAgSPzipRGoFJIIxA2AZedhjVomfRZKlRnMplM5jScfgB/9dVXn8XzyGR+VVLqo0dau55cWJzrRmGaJIqIjKGUlCYQtuAAjDHL5lGYgDYpmSQxREBkEIEzUIoIERhIaYwxREYNM/8AM5oAgXEOQNoQAGgyoIAhJJrIEAPgNtORkUbbDufAhEACCENZLDi+bztVHxHzubRQcM979VQUJZyzudk2EHDOHM8aHyvkc3YQpNk2+Ewmk3n5SLUCgLxlC6O95rHALeYAHNuh2GJAYBQBmKh3vLuye9D1nBwiC2RMAFsr42i5pBLdX2WWI/tNqzQmgnbg1mLOhUpyiBs9f02hAjq1p87BPfdKMv00DgqjVr+Ri/uhHCwk4ZLI685yrBJNdCwKjscBrc6/2s/5WhedAgcTA0uBAq0cImKMtBpufWcEGgEZEKAwGpS0mO1qA2nYX9q3kCZV250cXSf3HddJ0GFWDnqjUdd3varlujJIomS5PdcvjimZhCpFoILlVD2/EQUzrr+524rLk6jig2F3pje/1vbyRlF5oiP8vBwUwjYyBtwlbpEZkDGMAxmDaChopfN7TNx7qS9sJpPJvEKcURm5ffv23XTTTT/5yU/a7fbzNLvrrruuuuqqMxkok3mm5eXB3GwnSbTRJok1ITHGiWkjCRC1NMhRGx0nCgBSrYxGAgIcbhUEZRAZABjSaFArMgwYEiACgQGGjCFDIAPD/e7D/2SqJRoAsBywDCitjYE0VpbFpORJknLGUq1tbYQxpbKnlPZztrAYT/n6marjsG4nLpb9Ws0v5O0kkTLVkHtp38hMJpPJ/IIrLADoxGHOLyYjM5X+8gjDImcK0bUdnYTNhd3tsH980IY09sa3dGyvnYRH+6s1169Xp0kl6fyegZKtwqiKA82dmp93EEUADurxNEQyIBxrdEM8/apuez7uLkriiszh2sYD1c1yZMYzuh0FR3qrNuNbq+MWssWgu9qcn4xW+zOvcS2hlw4GMhlwW9r5YtiyjAQAPsyoCif+j0CClKeSyKR2fzkCcONIu4UOt9BoA+AglqNOMe72gUJga/IjcPxxvXyw7daKoMzYRs+rtpOg4vo7qhPH+iuxSVcHLW77eTSxISvqVYRNhXqvMC4GK8yyuTHKdrVMkQwAKE0cNDAGRlPUpSgL4DOZTObsOP0A/tChQxdeeGEQBL+05c6dZ6HCYSbzdEqZTjtaXhxYFrNtwXiqFAAnxxKp0QRgcYYIcaLAEAAZAkREQCBjkCEZAAJkRIAcjSYGCEDGkBA4/MpBBBbnqZIARAR4oi4PAgABaKVCzRnjRmsDQAbTWHHOkCFpiuNUaSNTsh3OBXvi0YUokWPjOT/nSEWlsluv54TNtCRkWV6fTCaTeRkZ9QrbK+N720sRYa06JfziSNQBoKlNv1UYmVk8/kRn3/1LMllN4kAms/32annacDZIk7pbqI2udaZ26NxIo7N0MA59tySW9o1xyw9aTvOIU57g45ujAw+S7SUyXiiOLk6/ZsTZn0/Dhlfu5Ovklsb8clcmkUpl3G/H4UyxJoSzozqVJr286h8fdLxCKVaJNiohsFUqSDMY5q8blkQ5UQPVICdAY9nMGEnSinvR9EWWEOLoQ00UUXFiU+f4dLBCxtgqjRdUWKxxsFZlEnfni6Mb86VxqzQ5mStPkKrJQS1ferKdo/Z8UQajg0bKuBusRkFHMFGrrbEK2x3LSxHiJFS65XkFCLto1IlPOI6kJbP8l/rCZjKZzCvE6Qfw//AP/xAEwZYtW/72b/928+bNz5Nbft26dac9SiZzCiV1qxUmsVqc70ZJylNERoCGMeQcwYBtMwLkghutgQAAfx52EyASMgZAhMPycEJwzhERwDCDxIzRGoCAAWgykSIAJCIEQMaIgHFgiEoZY9CQHhaaAw0KNHBkgEbpKAQleRzHyKGYt7VSBOjaPI50rep3WlGnFfbakedZM5tGOM8C+Ewmk3kZEYxvroxV3VysVa82RYMmygiQFSuTI/nKvie/3VvcVyuOp2FndtA9SiwB7hVGRvzisV5zpjRS9woDv/xUZ7VWnqxWxo3tLyzsWTO/y1v76qg8Fs/v5mG72zwunWLY77TyFb72fEhCsDwYtMs60YPlenk6SONYSc9KBbMQUMrYWJ4FhPM/W7WcZOUoxYEP4OpEEyhAgUQAw/IqAACAgEi2J/1q2yuV+42wss72ckRkAeWTXmCXYmaTMY5KOaI3aKKWoeX1NLR6K0/xPGjKM7e/fLBcKEfdhZwQE7lyd9CppAMrX6OgK9LQ1qlw83YycMBEE1sGg2bXgCkIDBtO2EVDBo1hnHPBCzXM5V/Ki5rJZDKvIKcfwD/44IOVSuWHP/zhyMjIWTyhTOb5NZvh/FyHCJJEkSYnb487lpTaaFIalFSADAG10cYohmCGBd/QADAiIiQgRM6AjBDM9SyjNTJggiNjsU4MkNFoDAACGCKGaDiAITJkgBBBwM+LzBEAITICUhooUYojGeJSETmIpFIdRpx1Es+3uqEkA2mq/JwdhtL1uJ9z281g7rg1uaZUKDiYldjJZDKZlweL8fFcCQAAampkamnQi1SiGVtuHIbGESacvlcaJNF40gvN6CzjrbC7gSQGLelaZnSDIQIAizGwfZzYRu35Tm2dGlk3G4Vru8vJvvujXJWVhU56zuqRplPqrj+vzxzbLa2LWou6tBD1a6D/Dz/XlJYMW6W434n6M46tk57qLemo3ZRxBcGV0japAI1AgAAAiMMtXwheCbyicn3hj/m2zbntWM44w7DbUFy4pDmllaiVMobC4sgZgo57TKe5fH1Z5SqNp47J6KjCi4U5tnpwb646xkoTMjCFCpiwG3QDJ++n5Um/AsLKrz1XS5lKGQ3a6cyFg25DHh/UkXNBhIwBB+T2yHpRXvtSXtFMJpN5BTn9AH5ubu6tb31rFr1nfp2UMlJqZMwSrFRyW6uW5wrLFmOy2B0kMtGSo2Pz3iDRUksJRACARAYAAQkAGCAgMCIDTGujUyUczhCJUGtTrvhhGEeRITKcgVaEBhkSARIBQ0CGCJxIAxERMMaADAI3pA0gEDAEDszWyqQmBdRaExipjVSqN0hsz4piWS67MtVxkrbbKolVLm/HsazX81kMn8lkMi83q2G/lQwOdFYAYIMcLMWhTBNsHQ+jnp8GbhrVvYLVX+6FzRGLcR2kRnnFic3l0SO9VWlMrGXfLXp2brnXrOarg9VZNWgGY1vr1bWRAdFvxUm/FUe5vDfi5icZRcKhqFkgXesubpvcKvqtIO7DoJnOLdSSXmgoSga1/kosvLxJLWUEGRjecYZhKXggZLI8oabP50nAvLwAHkye4yHnxx7GOFTVNQ5gGTkXlpdoYhy5RToFREulxbC5BlFo2bHzLbdyUCcxJHNhnJrZi1xv68hUHllkdJSrFAVLW7MhExaznZGpxeZ81bKN7S3ZfuDli7bHhBs4Phjy/OLojjcx232JL2Qm82vX6yVP/nRh7+7lleXBYJBwzkplb+268o6d49t3jGVrMDOn7fQD+NHR0edZNp/JvBiIKIlVrxMlqWq3wlRpEyS21L1ebFk80WmSyiBMmSGlAZEsm2tFWg/DbGHQgNFMcG0IgchAlGguoVC2PFvEqUpTJRUBGIYINJxpN4YYoUZAQMYY00ojEgEi0olbA6CGCfE4kpPqYhJbnBtjXMYGCIHgeeCeZwdBEgySQt5tt6Ogn0ip/YJTr+ePHmnPbKimqXacM0oqmclkMpmzyxA14sHhXmO6UAlV+v35vRXuxk6hn4RO0I2RxYyPrh4K42Dcss3Yjlx1PJ3f41lutTQJAAc6K5vLo92xjR2VTA4ajgqJ40JtrZHJoNcY9Fd8N2fqMywdYIgVkIGWgvQ2vzAad+y153q9Rb6426pvjv1cstqXrTndW2ZachkVlWIAjAwiAAIhMAM0/JkoCdqBTq1CvbTm3Ept/VLUE8cf79S3zCs9YtkdrzLemXNsXyQDrqUZVl5hPBBOx6+iSo1KS4wlYJrxgIWNJFdPjdrfX15AcWl1Ta5xZEoIhzGqz5AxSWnSndju+tV2bzHfWSyHnaaUq7kxla+UjOprmQqntXLMPfJw/pw3Acs+5jK/EWSq7/nugR88cESm+uSDWuvGyqCxMnj04bl6Pfe/fn/7jp3jL+FJZv7nYqd95Fve8pYHH3xQKXUWzyaTeX5CsCBMm80AAITFozB1LCGQIcNgkA4GaRSqNNGJMgTEGLM4L+Yc37c5Y4wBAgDjRpthPnoCJEPa6DhOu50k6Kf9QSJTrQ0YQ0obBEJAQxqIEyDjzChjiMgQDrfRIxAZAiQgAEMa8qGs9BM7THOprvfjUiijIJVKE5FtC5nopcVutxVKpTlH1xVRlHAGs8daSppf9uozmUwm82uVakVELrcE8nYczBEcLtYNt5ykn0/DFa/alJI1Dq3rzKLwIGy1GodlezZd3DvJxaby6KVTW9YVapvGN6naumDinNXq+rmJnW0r3yPTXd6/mspDhbGWU4yY6CRh4Ja7Y1sj4arFp0RpbGpkbaE8CQCqtwQLu93CWGJUYhSXkdDSBsVJnaiqAsAADD9RLQUYirivZnctp6lYf8HO8644b2xmw9iG8U2/NTm11S3U6oirfj3w67I0of0SotDC1dyO7Vwu6HhRLxJuwF2NbBn5cbuU7y/Vo/ZhO79H0wNuLdx6WeQVqTypq+u661+7UN+8N42PNGaP9NpLs0+a5rEq6oPFsdncSMPyweiIOZ3lQ3OLB9uHHn5pr2Ym8+vR7cT/+/MPfu+eg0+P3k/RaAS33frIt765l4jO1rh33HHH1VdfvW3bNt/3N27cePnll3/+859P0/S52t91113XXHPNzMyM53nr1q373d/93U9/+tPP2r5er+MzjI6O/vZv//anPvUpKeWZ9L97925ELBQKZ/Laf9OcfgD/kY98JIqiD3zgA2fxbDKZ5yelyeeder0wMpKrj/g531FGR0mapmowiKWUw1TxRKCNIQJDlEhDxhS0qURJOZK2VIRIQIwI2TCTnZapTlKppCZN8PP8dkh8OL/O8MR0PCAMU+IBIgEjICJkDIf57Y0BoTQSJZyHguuii65wOHMECgH5gsM5dvpxr5cGsQxCiZwpqTnnKytBuZrjIltJlclkMi8vNheIGKu0m0aJViicqLwuXXt+rzTRr62LxrdBeXKVu3NOsdydT3rL/fldvdVj6fKhtHHIQxzx8iXHq7m5zeMb9wjvu6l50K31N13SrG08Or7jUHl6ILyepkF7HtsLT7WXdil9OOwtDDrtXidUKXIuypMm7mmZxEGzLzwJDAElswwAIGhkChkMq50qOvFZZUAAFQcrxbjnVda4whor1OpefjLpOe35cnvOahzK9ZeVbWvLc4TDhWNylZgxJ41qlORBW6QIdYtw2cov2f6+3MSewviyU1jkrvBKe+ub9m+8ZHb9RcfXXsA3XHS0t7o0v9eZfWwk7LhkXKOC0W2D+kadJl7QXC5PNya2L49uau27f3F+rzTPGc9kMq8MQZD+yz8/OD/XfSGN7//vQ1+/a/eZDzoYDF7/+tdfd911d9999/Ly8szMTLvd/u53v/vXf/3XW7Zs2b9//yntG43GZZdd9od/+Id33nnn0aNHC4XC/Pz8vffee+ONN27btm3v3r3POsrExMT6n5uenm61Wj/4wQ9uuummiy66KI7jM+//hTh06NB11103Ojrqed727ds/+tGPPusdh7Pb7Oluu+02RPzYxz72zKd++MMf/sEf/MHMzEyhUHjNa17zoQ99qNt9vj8G73nPe+r1+vMP91xOP4Bfs2bNPffc8+1vf/u3fuu3vvSlLz3xxBONRqP5bE57iEwGAMhQHKs00QDAObNtni/YpZLr5Rzb5UBotOn3YinJEBAQEREQAyRjlCIDeiRVZW0muvGafliNZC5RiEwRkQFCIGBKgVF0IgsQABv+xAwAEREiAwSOZLQxQAAg2DCvPUMAY4AMAAAyAkQCQiJNJk2V63BgkPc9rbHbjHrdJBwkaSpJU5LIQS9urYaN1cH4RMH1rGz9fCaTybzcMMRRr7ChNLoQdJeC3liutKY6vuiV2qSzDAAAIABJREFUl9xKV3ijpXrJ9Ug4IKyyiiZXDq12V7puGdwCaWmiE1/dbC7W5CtrcpWJXOmCqS2btv12ecMFK+VpVV9v5yqjaa9Xnpz3imr1yGDlyAKwuXx9bn5Xd/8P06UDorrWXXe+XZ2OtIqSPghLOvlEuAm3DTBOhhkwgAQM+Im6KwhaqNiP+2zlwPFDD3XTSBTqdnlKLh+oL+z2lvbVw9ZEbzFPGjnrMVvpyKQJF3YOUosILTe0vTSJN0eNzfFqWaXLtnvMLiZeCRj3uTVWqE1ObZ9ce9766Z0Od4syzi3uy5fWWPX13do6cgtl0mVhC4ZktMXZaL4y7hVdI3Vvqb98kNLoJb2kmcyLiAi+8P882mqGL/yQB79/9NGH585w3BtuuOHBBx/csWPH97///Xa7vXv37lar9bOf/eyKK644duzYH//xHydJcrJxGIZvfOMb77vvvsnJydtvv315eXllZSWO43vvvffCCy88cuTINddc86xlwr/5zW8e+bnjx4+HYXjrrbd6nvfTn/706QHtaff/Sz3xxBOXXHLJHXfc0ev1xsbG9u3b93d/93eXX375KVH32W32dHv37n3Pe97zrE994hOfuOSSS77xjW+EYTg9Pb1nz56Pf/zj27Ztm52dfdb2rVbry1/+8q/+Hpxw+gH8xMTEm9/85pWVlYceeuj6668///zzR0dHR57NaQ+R+U0WRbLbjRuNwfx8Z2mxNzfbPrB/ZXGhGwRJFMlmMwr6CQH4vhXGGhgorckAEOJwPTugsCzP4x6AC5TrxR1X9B27HMhcrAHoREF3g6QJiAwAkf551TkiQDwx+c6IAQEoA4wBZwAAyDhyBDAGgTMGSEAGiKVIBpmldDGSfj+WgdIWD9I0jtJmJ+z1IyIwiqJIamlSqW1HoDGWxaany1kGu0wmk3kZGvOL0/nK68Zndo5MVZ1c0XJtbqV2DsnolUO8dZzFvaQ4dTBXX44GpnE0OfLI8tFHGw9/hdQvlpU63FpbrGzhbJOKRpKeLVynPOELayZu5wqjY8VROz+ikU27/jnViUJpNLFd2W+QTHhlEupbrK2XYn1zUptJmR0IRyIYAsk4IBoExbgWHGG4MQyAAA0BE2UZhHNPzrfmiTTJyAubdtKvyYHgYiTti/bCvFtt5es9Kx/ZjvSqoZWLteoY6CAf7y/P9BY3pYNzwsZ03HOM0drUvIIrhMPE9srEztrUztpU3S8IMBXLZoNlZbmh1lGahMlgPG5P2I7r5evdxfLyU7ljj4HlskEzPvD9ZHGvSQYv4QXNZF48Tz6xcOjgrzxz+a1v7E2S09+SvLCw8MUvftFxnG9961uXXHLJycd37tz5ta997Zxzznn88cfvvffek49/7nOf27Vr17nnnvvQQw9de+21o6OjACCEeOMb33jPPfds2bJlz549n/3sZ3/puLZtv+td77r55psB4Pbbbz/r/Z+CiP7oj/5oaWnpve99b7vdPnr06J49eyYnJ++///5Pf/rTL1Kzp4ui6LrrrnvWWw+PP/74hz/8Ydd1v/GNbywvL+/Zs2dpaen6669fWlp617vedUpjKeV999131VVXnckk9+kH8EtLS0tLS51O57R7yGSeS3M1aK4GB55aeeKx+ccenTt8cHXXrqWf/Pj4j35w+Kl9jcWF3vJSL4wUAqaJYkRIKBhyzgCBDCJDxoAx4pzluMithtKxUoAYUTNgSKAN+3m8jHw4447D/D/G0LACENHPF80TMUBLMM65n3dshw/jdzYsKQ8ANKzhQ4Zh22OrBbfnWT3faVTcluDDDg0RIqpUSWWQAbcYIOYLdn08PzZWFOL0/yZmMplM5sUjjVZkcpZzXm3N6yY2nF+fvnx6x+/svMzZ8Lr9VqHljzSrM/NEyeoRMfdT6C7qfiN+6vuD5lzcmj/ZicMFax5T7dnO/u+3936PGoe3OdaIX2sUxpK4V3X8ccfZ4DilwWqtu1BcOeh3luXUzsPVDfft+t59e+9/rL3SHtva3vamxy96+2Nj5+6tbmx5pcTyesLvOvnYyRMwIHzaBwkBMouMH3Zahx46vue+lQf+lR15rLawy2scLXeXRNxzwq43WDYctVF9rVUahmg13WLPLcyEbVels05pzi317dyGqDWBlLed2CTNJNxaGRv3iwwRAAq2a7n5HlDTUKc5y9IoLY2x9ry/erQ0st5Zc4HKjUjhBPmR0C3Txtf5lTXp/B71tHcmk3kluff/PXAaRw0GyY9/eOy0B3300UcB4Pzzz1+3bt0pT7mu+9a3vhUAfvrTnw4f6fV6n/zkJwHg85///NTU1CntS6XSBz/4QQD4yle+8gJHv+KKKwDg8OHDw4nrs97/Sffcc8+hQ4cuuOCCz372s57nAcD27du/8IUvAMBnP/vZk6kEzm6zp/urv/qrXbt2nXPOOc986jvf+Y4x5p3vfOfVV1998pXecsstnPP7778/in6x7Og973mP7/uXXXbZj370o1/1HXi601+1e/DgwTMZOJN5LlEko0g2VwPXs3QzaCwPZFkP+mmzFZZKFvXiIEhLJd/zRBjKQT9SkrQhbnFtDBIhQwIAROScCFKAftn1+4nN0UhzIgE9QwREAGJIRICEpAEYIA2/lBABokFkRCA4Q86Ag+9YOd8JMCEiqXQSKyI0SgMwPBHEMy2sRt5wA5yjcK00lTYTgrhjcy11qgkJAIAj5lyLNCBjrpctns9kMpmXo4FMjvZWn2ovA8Dm8uiIl59x8wj46tG1dwv7sHDXFSpev7GwfLS+cqAU99JclaUBEMHsT3u7v2t7eVFby2xfR92qjNurx45wBxCmugt2vjqxdkefQjsduOnAIK54FV+HJuxA2BxJ+p2g88igk6wcG+/MHayt9+xcdWKLLE8vrqHxxT0lSpKwG6NAxmokfZ0axgxDVBoRJLMYA0rD3uJ+1ZplaVBe3o/BKpcpITIZpbbPAJxB+7g/0s2PeXE/ZFwLVou7JR07UgpbFtIIuRUxXmK8LMSa6iSSWZ8f8YRtsRNFiCZzZbXhNR3bXjz+s/6xR8uFaoHxdmWqFfbK1bVYGosaU6PtWT9f8dddUC2NuY6fDlpGZqvoM69AjUawtNg/vWN/9uTipW/ceHrHhmEIAEtLS0opIU79SvmBD3zg+uuvr1Qqw19vu+22Vqv1+te//tJLL33W3q655pp2uw0AaZratv1LRx9msKPhBtYXof+TbrvtNgC47rrrGPvFvco3vOEN4+PjS0tLjz/++AUXXHDWm530xS9+8dZbb/3Lv/zLarW6Z8+eU85t+Iocx3n6g5Zlcc7TNB0MBsN7BABw7rnnvvOd7wSAMAz/4z/+44W//FOcfuSwceNp/jnLZJ5fmqqV5X6x5AEQ5wwZCoszjoxTp50gAkOWxDKfE63WIAql71mMM9IGgAgBCBDBkJGpEmiBL3TC+9qp9qI01a28EzhiWAmeAFEbHGanR0YIDIGMQc5IEwzrujO0bCYszpAhopQ659vAIEk1EWhFhqGUhgCRCMAYQgRmEJBBIg1pShPFPZ4qLSwBpKTWnAtCiBNljB6t5wuFrDpuJpPJvBzNDdpPtZerjm9xfri3CgBl2/ctO5FqulA5f2xdFPY9GVWjJtq+4rYUNhGxdACDSB17LCyO2Otfu5wfDffeE+/+LljeqFMQlTWaRFkGtWA5N74h8fKO7cQiV+wtHWzMDtzi2vqG5OjDh+b3ptxeEzWXqusOK2UFCxuax3O1NedEHXew0rVzRsZc64Hl2Qo9LoBxTuRSwo1iRsUslwrX7S1YWuVkbPoNZhQAkCHGjNBJZOWI89DOL1veOOJ40HLTUOjUSoBIFbXe1j2+QOMpc5aKEzm/cl5tjc15ZNJ+GmsyHBkACMY2VCeT4ohXmT5YWzfiF5x8XTeOhkcezVvOiIqmHKe07bdNdxmBwJhg0LLIoHB+yfueyfwPdOjA6mkfO3u8mybKPq10SBdeeCFj7NixY9dff/0nP/nJU+bhK5XKyegdAHbv3g0Ab37zm5+rt2KxeOONN77w0b/61a8CwJYtW4bh61nv/6QDBw4AwCn3BRDxd37nd26//fYjR44MQ+6z22xo//79N9xww86dO//pn/7pH//xH595btdcc82nP/3p22677U/+5E+GByqlPvzhD6dp+oY3vOHpmepuuOGG4Q/Ly8svTQCfybxIOGOjY4VuN/Y8YQzKVKeJDAZpFCnPtQAh6MsgTJurwWCQMMaSxNg2iwJFwCwLjAFjCMgYY4A0Miss5wUPVy2ujB4ACzgM978DGcLhnTckMoCIDC3GFRkuOBhNHAVjnHFEbogshrbDkaNWxDlDQDAGERhHo2k4o48EAIYY0xoICRnTxgSDhHHGEAENECipGGfEOCB3bctxs7+GmUwm87KjjEm1crhV8/IAoAwBQKhS37JdbuWE7XKRtwUKseq4bTtXs3P5fgtIWjqVbhEBKA4X2ouHn/q+v3QAFg9E6cCtrSsiCsdbaRz100GxNOGStksTnHGVDDTDVKsmdxT3VXcZlR6E3YaVN6ksxR2ppSOj0f5CaOX7ophzi17c8+NOSrhgFz2iHCnLKATsu4WgPE6VtW5nPh90WNhCo8gYBIMEQGgB2EYHyLx0gMhrtlNKLH/Qj5Fzo1PODQA3en1/5cDEjpDbAeAmFZeZX+IuQ5Ra86ft/LK5VatNS684N2gXLTfJVwvF2ljraD7qWgz98uhKZSrpLC3PPzWWK/lT56wrjr1kFzWTedF0O/Evb/QciKjbjeuj+dM4duPGjTfddNMnPvGJO+644ytf+cqFF154xRVXvPnNb37d615nWdYpjYcLqGdmZk77VIeMMceOHbvtttuGO8bf/e53n93+n2lxcREAnpm2ffjI0tLSi9EMAOI4vu6664wxX/7yl09OpJ/ita997R133PGud73rwgsvvOCCC6rV6q5duxYXFy+//PIvfelLp/Fif6mzEDkYYx566KGDBw8eOHAgSZKtW7du3br1oosueuYqjkzmhXBda9DvLs53GcNmsy8snqSaC2Zb3LFZGCmllNKklTEEoMmy0bEFGTCGEMiyeRioNCVAAMakVLmcnXAPgMlE6lRhqIiIDAJDhsNN7AYQBWdcMCLixBgidyxA5jjMsfkgVEjAOENgRuooUkpprY0BEJwbrQmJaBjBIwEyQyd2IxoiAkIAZVCgTA0yEBwZQ61Vrxv2Bqf/z30mk8lkXjzDlVeKlDaGM5YaBQDD1eOCsYlcmQAOrhwTwpm2vaXadBI2K3FHpIkSAt1Cz86zlQOJm88tPlU4/tMBYyIe8KX9qrvUmXltzJ1gdBMrj3My6cLe1fLU7KDjx2GI8bFBc40QoTMyHyV7hFuOOyWjXKK+W5CkN2hZwEGaK6Wi7KXxip+3ZFRQMTdSaxoIV3E79kqt/MR40Bxwn1i/AgTGDD/uAABBx8xmoH0jPUSmk2LQssmg7QmtUsvtcyunJRNO0y0vcr9dngBDyhjPsi3GODJHCAAggKWg04j6gOhxmyGuyVcOdFa2VKdEb6mO2p7YSsJqB92DVlHUN3sjet6YydJkR9i1l/C6ZjIvjih69nLov4bDP/7xj5933nmf+9znfvzjHz/88MMPP/zwRz/60Vwud9lll7373e++6qqrOD+x7eXIkSMAMD09fRqjXHjhhc/6+JVXXvk3f/M3Z97/8yCiYVBdrVZPeapWq8HPQ+6z22zofe973xNPPHHrrbc+6+73kyYnJ6emptrt9jAlAQAg4nnnnee6L8oy2zONsb/zne/cdNNNP/vZz055/JxzzvnMZz5z+eWXn2H/md9AYZg6LheCLcx3261wEKSOI4ol1y84UxOFVjMe9FOltCUYEyyNZRJJ2xIj9XyaasGx3485Q2TgOjYXzPcsY8Dz7TiUwhYs1cCRaTAchxt2GBIIlss55bKdpkDaIEJ/kEhFgmvXc5VUYIyfc7SmQRArbYwmIdBxRBgmMjU/Lz83zHqnidiw+hwaQ+zEun7AYZr54SpC4oCAKGzBOVPKZEnsMplM5uUGAcuOv6FYP9RdYciUMdP5St4+sfx7xMvnLGfMLyrfP+IWsLPgEgV2jgmfcaHzNbV6xCmPQb/Bg2bMeZ/5tl/CsNdPw8O9Ti1fSmR0rNeczpUBIAFcdPKiMNpLBomSh5jNkshKglI6QMI1cU8DCnIUQVCZzifh1GClA7wvbCuNGAeQJjA8tu2+U6vKmNu+H67yoBP5NW4SAGOEBcZwowBIogVgHKmYJafTvh20MeownWolPaNtRA4UuKWySZ4sTna9gs3Y2kJ1MegNZLy+MLIQdjZXRm0mDnZWdjcX97UXkLDo2L8ztW0yXxr1CiLu+RObTb4sCnVATGd/RsDrYxuZ7VlK7h+0SzKtZVvHMq84ufyvsKP7mfL5M9pa8va3v/3tb3/70tLSvffee++9995zzz2zs7N333333Xff/aY3vekrX/lKuVwGgJGRkcOHD59e/vOJiYmnb/N2HGfHjh1XXXXVO9/5zpOllM6k/xfiuWo2nVL77Ww1u/3222+55Za3v/3tz0wm/3T33XfflVdeyTn/1Kc+dc0119RqtV27dv393//9Jz/5yUceeeQ73/nOM5dCnKEzCuA/97nPnbzjMjIysn79eiHEoUOHGo3Gnj17rrjiin/+539+rnJ5mcxzCcO01QwY5/1+0m4n2mggbMuwVs8JwZJEaq3ZcG5bajKUpiZOZAm9et1rLAVak1QaAQyQ7QjL5UJwW3CGrNMOwYDDhIQUDfBh2XZAxjhHIGKOBW7JbncS17H6SZQaHPQTo7Qh0JoQgYiSSFkWtyzR60ZKEuM4TIhHhgBO1LEjBkAaGZIBADSkEXkqAYYr7A0oZRgiAjmOldWPy2QymZenyVyZIXJkhihn2ZO5Mn9arndPWJ6wYN15EROH59bPtWZtZD6l3EAtCaw4xB1vYqWpFPeA8PK9pdRymRW3y2uqJskj9A/9pO3kc5ObR9dfkKRpbOX5yAZoHVsVbtpd6nN3zJjtcWfOLbSd4mR/GVXU9qoDv6gq0xR1O6DFoFUPmlYQMTAdy1u1y8BgtTAxKIxXZDyaRkXBwc3LpG+p1FguyRiADGMCGLcc0OlI+5hSiuKBBnBkgsOSLH5ZAy1Onp9arirW85aTgAIpS7a7HPZgFUqWd159+qeN2f+e3Vt1fQKIjdzfWZrMl0dyecN52l9RSWD8cqoSnYbGLinObQBlNAA8/T3MZF4xqlX/tI/lnBVLZ+G21vj4+Dve8Y53vOMdALCysvLwww9/+MMfvvfee2+88cZbb70VALZs2TJcN/08nXzve99rtVrnn3/+KfnOvvnNb77mNa95/hM4k/6fByKOjY3Nzc21Wq3hnYiTWq0WAExOTp71ZocPH/6Lv/iLTZs23XLLLc9/eu9973vjOB7ugR8+cvHFF999990XX3zx9773vS984Qt/9md/9gJf6Qt0+v+G7tmzZ1gJ4I1vfONPfvKTRqPx8MMP/+hHP1pZWXnkkUcuu+wyALjpppv2799/1k4285uBCKQ0/V4olbZssCymlFJay1QdOdRemO9KqY2hNFVxrACJcSY4ty0ehqofJkppxrnRJBOtpI4D1W2HUpk0kYN+mqZKGcWZMETGEGOMMeQco1j12lGvlywtDKIgSRIpbCE4Q0ADqKQZBMlgEA96KRAlUne7cZoaQDQGOGOcMy6QkBFyBGCEiMwYQ2gICYEjEIIZ5qpnDI02iFAsutWay3n2VSaTyWRejhjiZK68oza5c2RqQ6nuimebRUG2bs054+vPZ07BdnI+OgXLEWGnO7rZGt04kq+MOJ7NODcqj4jVNdryclol8aCrZdJvNMMYW1julLY1rHiu1w4Tq7vYYI6x/JKw8qQtK7dQWTtbXtMsTTDhLFSmWmNbktJYDnBD1BlLumUZ+ipaG7bWxa2i0er/Y+/Ogy27qsLxr7X3PvOd77v3ze/19Lo7PWQkCYOCwFcUIpIwRH+WVaEiImLU+hExRNHip1DforSUiIrRKiAR/FmADEHEMPyAQIDEzOkxPb/uN9x377vTufeMe+/1++M2bb6dkU5iSDifqlf9+px9zzn33K6us+7eay3SHW4kSLq+2SvPUHmeTCfK1QZOObIL2nTjfJW8EtoeAulBF5JAE5kyJYYRNwPTkdwNK3NhaVxO7Xa5qZVaG/hFy7lkfP6C2mwrHKyFfjMYPNQ6FcrUZIYtzOP91j2NE34SAwCzc8zOQ3Xu1PH7Ty0+3C1MYqF2uNc66bcbQX+hVC9aj59Hmsm8oC1sqz3RjO5T2rxQPefFmFdeeeXu3buPHDly1vZ6vX7FFVd86UtfAoBbbrkljmMA2Lp1KwD88Ic/fKKjSSmvvPLKt771rSdPnjyHi3nujj8KqlutsysFjraM9j67w7773e/2+/0wDF/zmtdc+iOf/OQnAeDv//7vL7300l/+5V8evWTv3r2GYfzKr/zKow91Zsu3vvWtH+udPh3nHjncdNNNURRdfvnlX/3qVy+77LJH77rkkkv+8z//87LLLgvD8K//+q+f8UVmfrrYtkhTFUZKJToMZJJopSiOZXt92GoN01RyxrUGrTUQaULHMxChP4iDIAGFnDGtFDIUHJM4HQRpGMrlUz3fT7SWUmqpdJwoICAArTUBAgBnQAhpquI4DcMkiqRSSnCmiUAD45imKo4VoCYNWlGaKEBCRETQSjMExjgCMKYATreFZ4gIDAkBkQAJGCIYHE2DWzavVJ2duycmJovP9/3OZDKZzFN48qdyg/HZiYXy9M4J26XKVJKrLU/udOYuKHgVK+zUp7YWTNse2yANt1ue13YuJA1zFwWzF626pTgsJMdUeVVOtmD6aKRXQyKwtKqkQSnpFWJ/KmjPcZyY3ObUFszCWJGJSn8lb+crw06u1xBKAZClyVZpPo0Tw1VWzgIqqhjcCttwUVxf6I2ft7zx8qObXp7MXgR2CRQEMom4SSpVjKdEBCAZBtwcMnHKLq945bXaQmXzpdPF2gX1uelcpWS7muB4b70x7KWUplp140GqJENkDA1kAFB38/SjNHujvnmVWwdz4yvVDYNcrSFcR5hTudL2ysRMrpwzsir0mRehQsHatPnsnOqn6cKLps75vKZp7tmz55577nncvVNTU0IIpdSo29zVV18thLjtttvuu+++xx1/xx139Pt927Zf9rKXncPFPHfH37JlCwB8//vfP2v7qKH6mcn8Z3cYACwtLd3zKKP0+OXl5XvuuWeUQj5qRGcYxmPXyXue92O9x6fv3AP4hx56CADe//73P24TP9M0//RP/xQAHnzwwXM+ReanEzJ0HZMBRLEChChKgjBJEu0PkziMNYCUUoNmyJAxxjBNlZQ6SZSUOo6TOJaMoWEYGogAEClJZJzIKEiURAIkRQiEAMBAAymtNREREIGSSikCYlqTklppQgZaE2ktOAME0kBIWmtEEpyZJiMkpUBq5AINkxMwTTRaKk+ECAhIiGq0yp4z5CYzbMNz7a1b6+dfOGMY/Pm+35lMJpN5ppxc2ajM6Jnd8fTutcmduPnlbnmWmkdFZdaZ2jl53s8VC+OVhZfVz3t1rr4lrM60hNNT0jUrKmErsb86xmgm7+TcQcp67sycjqcHK25/bc0uJoY10T1ZHjShtuH41IV73OphFMmwMyQdchEhGxhezI2UiZTzkBvt/GR1fKu3+fLQLfWt4mR5vFCslye2GrPnk+lJ0+HJ0CEl0hiQg1KciAFpxJiL0HQTw1txSmlhIhV5xljJcM6rTNSt3OFu42i/+UDz1MrQb4R+P4krTi7Rshn0l4bdnGFX7VzBPL0GWAFEXhXHt47PXzRe2zCXr2woVOdylR2VqYr9XD3RZjLPu194w7ZzeFW9nrv4JTPnfNJRbbkPfOADYRg+du/tt98upZyfnx81k9u2bds73vEOInr3u9/92PlnKeWox9sb3/jGs7qaP03P3fFHq9NHXevOuO+++06cOLFr164zXd+exWHXXHMNPcb73vc+APjgBz9IRKOKfZVKZcOGDUEQfO973zvrmm+//XYAeMq8g3Nw7gH8qNHf+eef/0QDLrzwwjPDMpmnKRgmAz9Gjk7OcDxDKS04N02RSpXEWipQKSgNpIk0ARBoSkIFBI4tUIPSECcqSXWaSq1ASiKpGTKtSCoNo2l3ZEAARJyhaXAEYAi5vKWkTqRWipTSAKgIpSKTM0IgRJkqrUlpUFoDERFqAJUq1Dj6msBxTK00aYJRZzoiQNI0KnHHAMkQiII5tqiU3K076rvPn3LdZ7mmRSaTyWSeF+NeaWpiocGskxqwWE9VCpT6YS9tHI4bBzutxVBLpbVpeXZ9gdllO+hU4kGztbS3vfL9ztKdy4cebi/btjVerEXFqV5ldt0pH6vMHSjONgtTXTO3n5l3J/FxM9+0Sj271ACjWZpL3ZLBmINkAPXd8onJHZ3als35cn16e3Hh5bntrxpTcWXjpQuXXLlj60u3+cupHOjENxnyNOLpkMuY61To1FAp15ppQm4WBe8WZvzahi2V8SmviIhDmbTiwXyhNpuvzBcqFhPtcHDX6pFjvbVuHKyE/XG3MF+o7B6bPjO1fnoi/syfgAgoWJYvlnmR27CxcvnL5n6sl3COV71tN2PnXg/puuuuO++88w4cOPDyl7/8q1/96mimHQB83//Hf/zHUaQ6ynoe+cAHPlCv1++6666LLrro85//fLPZBACl1L333vva1772gQceGBsb++hHP3rO1/McHf91r3vdxo0bv/vd744a1wFAt9sdvbt3v/vdz9Gwp2nU3f2aa64ZTeADQBiGf/zHf/zlL3+5Wq2+7W1v+3EP+JTOvYhdrVbzfX91dXVu7vH/pY467I2PZ90+M48vjmUYpJrItoXrnl7HEYTpWsMvld1iyel3on4/NDgfRum3Qn6fAAAgAElEQVSoUTtjSJoQAQlolGjEUBiMCxZGknMSJlcRIZAwOBFwBsIQyFSSKK3hdKv2023gUWtwHMGZyuVcIq01kYLRgYkICYg0Q5bLGWmiYlA6lYCAAFwwpZC0VgTEiCNzXIs0cM6ASGuQCJxAa2QcgIhxNAzGOTdM7rnmWNWt13OGyZUizrMSdplMJvOC5wizNrW93z7ldZZKpm0Xx1b9dWHl0oe/NhisDb16szpvAGt0GzxfPWqVpEqSNI4K1bgVV9sreVWcyBd6vnZqllepgsoNiJn9U2a+PublB83FRauwqLkZDyJKqt3VcueEw1nEzbywLSBp57E4PVndMChP57XqArn5yfXGQYsZvL3oWa5LOsdQrx6xGQe3zKSkwRpqmXBTcsFlCqSaTmnv9IXrbnXJyk81jpdVGnOrkcYp48Qw0UmYJogs0XJfezlVuifDOE0F4xY3Xje7c3OxNuqxBwAG47YwYiWXB13G2CCNJrHoZivnMz8FrnzLruba8OiRp1WGHRF++apdm7c8o76Krut+5jOfueqqqx544IE3vOENADAxMZEkyageG+f8+uuv/+3f/u0z48fHx++4446rrrpq//79b3nLW0ZbOp3OqPT67OzsLbfc8kzCt3M7/nA4XFhYeNwD/sd//MfCwgIifu5zn3v9619//fXXf+xjH5ubm/vhD38YBME111zzm7/5m2cGP7vDnqb3vve9d9111xe+8IWXv/zlU1NT5XL5yJEjURR5nnfLLbecSbx/Fp17AH/BBRccPXr0tttuOysB/ozbbrsNnnSKPvPTbDhMOu1greEDQH08H0eyXHEBQGsCAM5RJsowueeYRCD7sdZoGEhEWgPpUQwOoxzziYkCN7DXiZKUOGNCIBEjRciRNCDHONRcIAFKpRgQIBIBADAElWrGuVJSmJxQw+ngngBQAYDSwzBxHZMLoihlnAGRYRiI2hBcauAMGaAiICKptdaACMJgTGsJiKPvAhCBoeOYTCADRgCSVBLJlZWeMFitnjvnkieZTCaT+QkSD3yCukrslDDsOYP1gVvSpcl++9Q666VRMKzVsXEYixP5jRc+snJEaX0qTeY4RLJbX43YQIXbJjtOFICUMhwP24yJrf6yF9r3OWMNJiKlUoC5NKj2l3KDlgWqBeiP7xijRGnplKYcy7lMhunMhaTi9l3/70T3FDj5U+GAx93a5DY89bAddJFzJoSUCmWKoEFAbLqap1qpQ4XxO3IzDOTm3knWW/ZP3qMNRwvXKE/XuHXCdLtxzAEGKubA+nGIKqmpOB8xaZlpbcarTjz6ZszlKpooURIAOBZn8+Uz4X0m8yLGOXvHuy7/7L8+eP+9S08+0jD42371/Asvnn7mJ921a9f+/fs/8YlPfOELXzh69Oji4mK5XH7FK16xe/fu97znPY8NjLdt2/bQQw/deuutn/3sZx966KH19fWpqamFhYVXvepV73nPexznmZaZPIfjE9ET1a4/09Tt4osvvvPOO2+44YY77rjj5MmTGzdu/I3f+I3rr7/+rAfpZ3fY08EY+/znP//FL37x5ptv3r9///Hjx88777yXvvSl73//+5+L6B0AkIieetTjufnmm9/1rndxzj/zmc+8+c1vPmvvl770pbe+9a1Syptvvvmd73znM77OZ9n+/ft37NgBAFddddVZ+Q+Z51QcycEwVlKvrQ38bliueqbJfT+ujnnj43nD5P1e1O9Hx46tI8Dhg81uJ+z78WCYAAEyAo2jRfDIiCMjgHzR3r69LqVeOtVNYhlGSiYpMCQixlArFAaj0bcCRHGsRp3YAUEINE2Ry1sIkEqZpiSlTlOl0lFGPAIQIDq2sG0jTiVDTBNJhNzAQs7WQMEg0Zqk0krq0SvwR18NjBYIcEaWbcRRSgCeaxWKluuYKHDHjomJycJgkFQqzvhEPkuDz2QymReB9SN3rR75r1Url7cLsLwn6q6w8S3d1iJfXwy18sc2dQCMsY1hcbJUmrxz5XAz9AuhP5b6ldaKlTKobirPzq0VKkXbKbRP6sUHu0F/ys3JYe+gNzac2t1UUrUXt63u3bh6oKiTdW9saLqpVZitz81omS/U2fpxw/J8Yd3VbU4s73VlFNS3mEF/nEExV5HLe7TfojhCwUklSEBAmrHQyitgKbJvTlz0rfr2ctIfi31PhrNRf0vv1GJhihUm+oZ9sr79KLcUQphGkUy1jGeD1s7Yz4PykmDnwssu3/FKrzxjjM3Dj7rEEUCQxprINcxHt46LVRpJKRjzsjn5zIvXww+u/OdXDjSbw8fuQoRd50++/ortY7WsJETmXJz7DPw73/nOz372s9/85jff8pa3vPKVr7ziiis2bdoEAMeOHfvKV77yne98BwBe+9rXnsM6hMyLVRim663h6kq/2wkBIAjSOFGcM9MSWuswTAzTyResdiewLbG63DcsEccqiFLGQCkgBYgwmncXTCADzrCQtyoV5+jhVpLIWCqZSk1MxZJxRpqU1ipVaDCOQMgME7QmTZoh15qIdBzLQt5GhDRJGYBp8CDVgIBEhMQYcoGWzZXSgjMGmKaSAeeCMSBucBmlSipNgEQIDPB0yfrRFwaGIcpFK7JFnOh6PVeuerWaJww+M1tiDA2B8KMVB5lMJpN5wRmkcSRTk/O8aaPWHhe27dYL4yf9toF8urc8ECYfNkNuCH9NGs5ybVsaDucmy4e6a5JUJ/Irg5bwV7v5+kCnu9jajLWBGfb5Y/Mepf2otx/EySRkwmNK7egc5Vo5Sw8UGo/weCCdwlTQ9jm2B6FTqJTO/8WyjDDs9R75tgp6u7Rqm7mIIH/yAQshzdfXGXoEjIgxBCWZptQwY26CTFgSNNzaSqF+X2Vekqz1V4EZrkpqw/WOcKx4kLaPO1ZemTld3aSUZMTG7By0O/N+c2h6LuNV1cfF+/uOa5suCkOUT5fjQoDHhugrw14z9Ee/u8LcWBzL2sJnXpR2XzC5c/fEieOdfXsbzcbA92MuWLFoz28o79g5Xqmee9P4TObcA3hE/Od//udrrrnm61//+h133HHHHXecNeC1r33trbfemi0PzpzR70VrDR8ZU1KvtfxuO0IErShfsBZPtM+/YKrR8F3HFJz1ehEhKaWjJCVFo7R1QgAEw2AEwDkjpQ1LGAY7cayz3g7CQCECAQJpAtCaGBJDlABCEwhGShNozhiCQUoRUhIrrSFJleCYSI0aLFsIoVKpEIkxxgC00krqQlEILvxBogBVKoc+mg5HQIYAhKZgBERAWgM3OCIwjlppAASG5apn28bWbfW5+VIQpL1eGIUpIoSRLBTRMLIHl0wmk3mBIaKjvdbJQftQt7FQGh/3igvFOnJjTJgRg0KxyvwVXpmOBy0/jkoku9O7+8XJBtqxW+TDLhEFSbLFK9tRT9heYDqTVnWzm9tUqs0WJ1fTkGQcyyTm4AGUw/Z083jdXzbSyBm0hEo0ACWDSNiFqFtwq9b68ZWHv5aGbbN1LF1f5KRzKhWsD4ga0ZUJac3iPnKhnbwk5JGvddrPjccAZtCJEVvC/kFu6ohdtJPolDe2vbdUidoJkaUTW6u8xDQaVK185JaOcheBairJR91yOhyaRj2MoTIdkUrcYrJyAIV5JoB/rH4cNkP/WL9lMbEe9JIk1LPbt1bPvf52JvOTjDHcuKmycdM59pbLZJ7IuQfwADA5Ofm1r33tK1/5ysc//vFHHnlklLqwefPmrVu3Xnvttb/0S7/0LF1k5kVCSsUY01pHsZKpbjUHwJAjDoaJ58dS6upYjiEUS06nPdSa4kQmUhMAaGB4uuq84JxzJqWUSnsMCyU3TaTSJAQaJgOiSGtkCASEDDQxBMZQaxKCMYZaIxKkRAiAnGtNKlaaIwEqpdKh1BoYoiZATRJQR4owkUqMVR2GEjQRQRinqZSj76YMkzFERagTBYhMa2EZiMQsoYkpRTnXtGyDc+z1I85ZqWT3uhEAjE8USmWHZVV5M5lM5ieV1CpW0uTirPztZujvaS/91+oxR5hS64fWl5xNxmx52lIpLu+3ZUz5qpKhO38prB0nIYzOqelcbcAF5ioL1fmVoJ83LAQ1gdLpMihPzReq8zolYXUZKIn39ztWZ1lrWBBsvL0YDlfDJDCioaFTQ6UpNzQzPBlJblWSgTVsBX5DD9uUBim3Y2SuTl0VB8KJhMs5t0Fr4Imdg2QYOSVMY204QyAjiQLky065YResOK711lZz1ZAbLbuwabhGoCUgR2Qy7jvFzcNmoXlkbGzTSpLM2NZkOiwkw9Cyy6jDOEDT7ityKLaeNDFzIOND3bWcsOLOYrR2rB0NH/FX2fyuDTPnZzXqM5lM5ml6RgH8yBVXXHHFFVcAgNYaEbMp98wT4ZxprX0/TqXyu4lhcgDUSgsOAz8yDO5YIk71emuQpLrdHspUUUqkCRFP15DXlCTSsjgRcYNsh1crbhila40eGmw4TFSqtSaGoAE0aSRAhojIGXEOtmNZpuh1AwLOBWdIUZACQ6WIc0ActW3XhCAAtQbBwHEtw2Qq0f1+FASR0miajAuII0VEnHOlVKoIQBOCEJxzUEoTkRBckwqHsLrmmwbr9sLJqUIYJLNzlcnJfKns2I6RZb9nMpnMT6ylQbftt2jYQdDVQn2qvvHMrhODzg9Wjs7ky2XL9dNoudc95Xc2TG0BZDro6shXg3UAKNjO9s2Xrhy5q4o8XT/6qny1IYx52zY5D9MYwJgeX9BeeWrYNAfNfW5NDXpefvLkoNHxqmFpPuivVZkyTccG4MIGQwIp0NLQSlOkuMHdPBN2oonCHioJAAYDncQEzJSRIWywvX5pQSRRKIy2W8nZJbN90hLGqnBtFXGdNux8zExiYtdgOaeD/SryrdwJu0zVjRe3T85rP9K6ZxZyKmaMzYfr1eXextLsuDlRPP9/xWtHiiv7NOcuKChNtbtrjpev2/knuaWjBLVO+1TQPF7tN/wwWOquIIGvaW5iweQiUdLmRpYbn8lkMk/iWQjgz8jmEjNPrlh0pNSNtf7Qj+M0TVNlmkIIFsdKaUpTHSey2RwSQhxJAEpSrel077fREQhBa9KKEEFJ5vtJq+lrTXFEYSiVUloB4yBMYXIWxVKSBkQtiZmcMeSC25boMWAaGEIUKakJNTAGSAgcSBE3OENMUkVEhikqFbtU8ZZO9S1LpNJMYm1ZnHOMI5XPu0qTYWsZS625YYucY0Sx7HUDIFRKK6USANmNuYAoVEgAHAb7Vvp+tHPnZL5gP78fRyaTyWSeSCscnGgePXrk3nz7hCYKN19uxMPa7K7RXqklAHjCsrlBmgAgVRIAdNiX3RUwbDQdQG40DucMe0bFVKjQxE5EKvWbDx9/4JRX68RB3rT73tiuyqQcthcHHTdXznmlg80T968vTxXG6vMXHG4sPtg8SFahZubspGUCcFIKBTcMrjVwQUr7pdowGpiGI5BjEPNo4ACknEV2IRWWrsyJ2sZiOoDizFCDaB0D3gQhOYLQ1HNKiTAVsM3+iiUTU8ccWE/m93r1oeGlXkFKm4JuLW4nhmsg63OjHPs1wWfHN+W8SirEsaDvuTm3thlLU8MklMUJVnmyktoFy9lQHLvr5IN6ae8R0wuFmUNwTj7Q52IFRc3OWdwAgILpzOcr2YRQJpPJPK5nGsAPBoODBw92u90nGbNz586JiYknGZD5KeG4xhjLLWypBQM5HCZhkIZBSgCktWlwmaarjcHQjwGRISPUOtU4yn4HAAAcxe+ax1IZQhCoJFEnTvRA6yhOlCTGEDgyBq5rCoGAlMQoBCMgzhnnzHONdmsoJSmpOUNSCgGQSGtUQIzA4Aw0KE0MUAMBgOCs3wlNgbm8GSdyGCQ60MJAYQiG2nKEMI0kNvJ5y3LMQt46eKDBOGcMZKqJIJXacXmqtPTjNFVSKSJcOtULhsnFF0/NzGVpUZlMJvOTaHnQ2XfkPnft8NCrRoDx0Xvypl0dm2NOAQDKljfhFlaDbijdXhxOuIWqnQMAHfuAaFTnkTHGrXj14FihHsmEJra51VmBbF9/ba3f7HAPEcuWV3cLc+Mb1qPBieVHKsmQ9xrFQavaPeVY1mRlOhmTx9rHVxmayG3QmEagNTOslJtoWkIpcHMIJApj+dYAVBoLx04GDJFVNmhvzEA9Ibin0+ruXyxM7hweunPp1INxddaIBkbU9Znhg4A0KkNoyUQyFqORWl5BmAtJUIgHZJd8vzEe+/WgPbS8NSvXFc6sZU8yKi3ey/MTOuzWddTyNhjjC4lXHkahGN/Eufkkd1VpHaRJP4qS0O+BiCBFw1iPBizwHzx58IL63KRb9JNovlBtx8PRLc1kMpnMWc49gJdS3njjjR/5yEeklE8+8lvf+lYWwGdGbFvk8vZY1Tt+rJ2kkjHUGjSBBghDKQdpGkshOACBhlRp22RJqlM5WngHgBwASIH6UVr8cBABQao1EHDGEBCBojBmnCexRkYaAIHiJM3nrV4vZAZTgQaEJFWagAjYqF08aNIs1oqNSuUJ5nkGAK6vB45rcM6E4AxBcAQirRGJ4lQLkwXDtFhyGEIaybUoSVOtpD7d7Y5ASh1HUmlFGuI4ZZwLgYD80KFmteKWqznPe7JnnUwmk8k8L7rhoDPs1J2CqEx3k7ARD8KlvbThAnAKADCbK186vuHetROJkq5hXjg2u6VUBwCEUa8UAgDmlY3qnDmzczC2sbt2dKmzaig5SCPN3NlcRTA84a/nDGtjKdCajPZS0jvp5sbsYW8+WG+tW93yRKpVbmJL5Hj9sc3hifsmuyccFaf5ycR0gAtP2LGMmZ3jw7Zy8gli13BymqrpsOiWzU0XsSS2JhasDZdak9tVPEiX9nGlYkoN02apGXg5ngwF8Wro94SZAlqk3KjvA5gGzmLq+a1y0NWMacMuaBmFXUtY1bGpgt9IScXLB7lbFhsuqRAtdhuRmdtS31BxcqtBL1HKEUbVzrH/cwq9n0TH+639nZVVrc3qXGH9pCFMGIZHSjNlwF4S1Z18xfYcYR7qrhVNJwvgM5lM5nGdewD/t3/7t3/5l385+t1xHM6fMJt3165d53yWzItAHMnW+iCJlWkK1zP6/ajdC0mT4DxNJRecIQIR56g1EYFSinOWKK2kFiZ3XBuCRCqFjBFp0EBAShEnTAFIETLUWgEypTQQi0lZwAHAMBlJStKUASeCgR/nCnY0lABADHWqAJAzIgAEIkJkAKQ1ISPknOfyViK1ZTDbNsdqHmdYKDtJquq1HHLe6wSGyTlH23WjIJFK+f2EtJYEAKQ0cM5Ia4agpCYCTaNifAqRC0GcsWZz0OmEQGSY3DSfzWSWTCaTyTxDpmlXnELUXoSw30/TnFZ+aSYkGMWUnmGdPzYz4RXCNHGEOe4VXcMEAHSK5uT21smHB4BGGlfmzm/Z5aONxdWlAwAQyXRQmdO5sXEvH6SJIrpz5bDU8sLK+Jhl9jS20NBeZaKSgmGn4UACRshftv1np9KgM7mwuH5yxjCLQbcRBebk9uU40DJmjUfQZQW7XO2dcgCssG+4EyryeRwZtQ32pstFadI37KX2SscuKKBIGCUZWcK0CJLihFBS90XMRJpExTScD9ebpIamXbO9McSUlCkNxbhm3FS6CKrQW2WVOWZZau241nEpHsb1jdtK47w84brFtbB/sNMAgIVSvR0NF0rjj47hm6F/qLtWNl2nMB6n4ZpdjJUyPU8YzqkorHnmqUFHEZmMAwDPsjIzmUzmCZx72PCJT3wCAK6//vobbrihVqs9e5eUeVFJYnnokebyUk+RJk0Tk4UkVqR1Lm/6fsSRaaURAAGF4ILzKEyVIqVJEyBQEqckCRkIxpXUiAgMGKLWpJVWgJwBkQbgACAVGAK5BCK0TCaVDqUkDSko0FpJtt4KOIJSBBJBkwYABoigAREBCQEYQ9CoUym7Hc04emM5rVW7HVTHPNc1DUNIpYRgUmrPM7lgyFizEUmpldSIzLb4MNWcASAIwTRpBBitHJBSg0attQauJfX96NCBpjAQGZQrzrZtE0JkzyuZTCbzE2HaKx4o1CRnVvOYFUfIcDWJjsbRVDgYc3IAkDftvHl2KZO0MPbtYw+0oqQbD23DWpAqDvzD3Eqrm82o1/Pbwyhoi4ET+MuDzgm/VbcLNbdwatCdZWLeK6nimEAmBJuxC4Pi1IkkYTLRjUNx51TNslVpcnOxypEfXNzX1qowf5FOgkMg8oboBB1XxkVKoTLfGq6VEZVbLsy9JFzeZwF2uH0oDivFeqc0mUuGiQJRnEjdSq84mQx7fcvtEM91TxWJXKdQtHJuaarcXyobIlYhaKVL01KYHcMuKelVJu3p82RnBQCSlUMQh1YalPM1rzJ1Iugf7DQqtusqubb44Lhpr/VX6+Nb2I8m0mMlEYCRMmUwUDHJVOi0L6y+5egk6iZRouRcrlxz8i+f2lK0nP/hTzyTyWReKM49gD98+PDll19+ZhI+kzkLEQz86PAjrXvvO4kApin8ftzphK5rJrFOIgUAqdZExBkSqShKc56JiEqNFqnDKO1daW3ZnCOXBkmpOFKcKgAERoxAawBkQICggTFNCjhygVqBTBUqSrVmgISMtEaGqUYCGBW1ZwyIEBQBIoEGQkIgQiBAjqMidjKRjLP2ut/vhsiw34+CoXA9MwqlaaWVqru60k8SZRicFDFGSSLzRUulCgikAgLNBVdSaQ1AUmsgGM1HaK1g/75VIJ1IqlbcOIKLL5l6fj+yTCaTyYxMesXLFl7a75y6R0qBOFGcqk5uPuKvMy6qTu7RS8NTrZqhnyiJgPu6K3dEyVIqc4ZnW25r0M9F0eKgPwVaDzrj/mqjc5LVtuxJoiWNDNlYOUekE+Qk7JJgPOquBX6chEZhPOBGI2x5vZXe4Tv7hlMuVDcHfVMGOuzPJOF+ILl+ws/XZ+YvMDinftPgzGg80k4jMxx0crVOKsOlA/lBC9BuxVID1GZ2FTpL60OhuWma9tbtr/Sndp06dm8z6AoZB26pzw01tcN3xmbTrjuxEPRXU5WwtaMYdIJc3SlNO7VNZtqjNJFhWw3WKA1U5Ket46q7iojBoOuuHawCsKhvhP5aEuWKtQS0ObGNWR4AOEwYvdWktzJ1at/23spRpQeMN6ycO+wfMRxE6CdxP4k9wzGZyBtZndfMCx9Bumcl/tYReaytm0OwBa95xoVT1s9t4eNZhkjm3J17AG+aZrY2PvMk+r3Q9+OjR1t+P1ap5gbjHBvL/ULRMS0RJ0opNUoW1IScAWliDBlDrQCQiE73dGNIWrHalBcOk2EYKYkoNQARMRj1myUNjBEhaFKIAkErClWqNSgiJFRAHJEAARCRUAMydjpiH4XvQAioAYCAEBCZ7QhE5AyFwdNUJVKqgEbl8KVUUul80eQGS2LFGOOc2a6hTK5JB37MwaiMF8IgilNtcC4VKJkEgTQsARoMm9equULB6bSHSaosixsGLi33XNcYn3Cnp0vP76eWyWQyGQAQjG8sjv0g6NszuyKZUr5iGI5DpIlildrcGA2LlTzUbYzWjbejwbFea5jGlVwViLpJ2Gmv5C1Ht04kzcNzvcXU8Mq5Sq59ImfY9fGFRjToxuF9a4sEICoTE1M747B/LJZ2pQZOZU97NeytzS7vqfVX1u0K48j8Bl/Za89dkAeYbx1mtpcvTfaRnVeetAvV5cRvBj3Tyct8vdRvdpLg5MojOaUir+6LNiIGluPUt4UHvj2ZDs3Yzx389magzRsvPuLm11aPJCfu6RXG101PIPGwPwSqT5znGG7PzPWS0C3PTF/w+vlSndaP+w/+h14/TmksStNmfQsKQaSGB74jDt5RXDqAUZ9xocY2xHMvMfLlZGkf9yqjAH5MRhs5PrJ6oOCvzEY97lROGZbtN5ZyasItJNwM02ggI0bQT8Ln87PPZJ4N8bcO+3/9XXm4ddb28Et74c+/Yb9he/73fpbPFJ+Xa8u80J17AH/ppZc+9NBDz+KlZF5MiGAwSJprA9czSNMwiB3HkIhxrIoVIKJUKoaMGyxJJOPEuZBK+4MkTiQgIDECPSo/T8iIoLceWJ5wbbvbCUkR4wiglSQ8HZmPfkhrVDgqb0daawIAhgxQaeIAQBoJCUgTATAkzZADAoyW4SMCaiBCZIYQjmsMBpEmIEIETGLJOWMMiUBLHShdEMy02OR0QawOiEDYotcNcwU7l3c4QwLGOZoGd10cDMkDZlmcCe46xtx8JYrTleUUgKREwREAG6v9Xjeq11XWHD6TyWR+EiwNuo2wn2jVjYNUSdKaEAHAYP/9v3Qj6B/sNMqWmzetYRq3ooEmEIwpUqFMelFoaDmf+Ky30iDmIBsftDqGu7EyoSrjP1zXi/76dK5ctrzVODqan9LM7nN7prYh0dJZeaSz+ND0oFlQSWQYCRc87uu4j2GvygwPobl4n8zXL9x4Uc6wZ/PlcRm2wvapQXfCcoL6xrUk6RlOqTI1Obljtb3WSvyDXbmwenB72Cl0Fk3AaHnv0smH2Ev/r4vOf/1wcqFRnT58aq9juBvibkEnXcu1ODdLE5XtPzewvJli/bzxzcwrp9U53V0NZKqkMmqb0LB02JftU0nziDh2X4kbPcMx+quSWxsmg2JhKzV9kvHoXlnpcLK/qnPlZuOQMWjNDJtKeDmGFueIjKzcoDhhMrEWDSKZ+kn02AyFTOYFgRLV/3++Hn7h4SccoSn69/3xNw8X//cb7NdtfbbO+9nPfvbWW289dOjQ4uLi5OTk5s2b3/jGN/7Wb/2WaT5+veQvfOELn/70p++9997V1dV6vb6wsPCGN7zhuuuue+z4Wq3Wap39TUStVtu2bdub3vSm3//93zcM45yPv3fv3l27duVyOd/3n8G7/+ly7jm3N9544z333DPKhM9kzqI1EZFUWqYURVJJPegnQz/RSraaQbcdJLFEztNUAm08PscAACAASURBVJDgnHFAgDiUQAhIhBoQgQAADcGFyS2bFXLWWNUtVW1hcATNGecGjtrEn/5BxghAUyK1JtKESAAESJohAINRME4ECAyBAFGRJjodowON8usRELgA5AiESaKSOCFAZKC0JtCANBwmUiqlSAi+sHlscqqQy5uGIQolZ6yWm5gqVKrOzExxciKfy5tRpExDjI/n80WnNuZNz5TyBdN1TcZZEMqBH0eRZAiVas4QPI6foqdDJpPJZP4HpFoFMskJq+4UJOmloHugszrp5MuWy/G/n51iJQGgbLkWN8ZszxGGxfmi325HwSCNN5TGcqQ3lMY350sV0oW4Y/utStTrrZ8Q3JrySmNOflOhtntsiiPe11i8t72yFsdLg64ByPvN8aC17pSbuZrTPWmsnwz6a344XAbRdashYJGSWm+531sZdpaPHL0XuFnb/qp6dbbrVZWMfW6R1kl1U1tJSSqRKq+pnEb5aIB2ISJaBxEO1vt7vrF07N7qxMKWzZf8zIW/8DrP2+F6s1sun1p4xXphcmAV1gFir+6NbWReGQCM8rS18DOiOGnPXYCIst9QfjNZP8kM1/aKhdnzq0J4uXI16dd0jEGbSOkklP01nYREGgetWm9lMuxYOsEkGIv6C4NGfrA2r5KJ9qLTWwXCaa/YjcOHW0t715db0eB5+xeQyZwbqTvv/vyTRe8/QmHa/b+/FP7bU498SoPB4BWveMXVV1/97//+741GY+PGjZ1O5+tf//rv/d7vbd269ZFHHjlrfLPZfPWrX/3mN7/53/7t344fP57P55eWlr75zW9ef/3127dv379//+OeZXJycsOPzM7Ottvt733ve+9973svu+yyKIqe+fGfjiNHjlx99dX1et1xnPPOO++DH/xgkiTP9bBHu+WWWxDxQx/60GN33XnnnW9605s2btyYz+cv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AAI8AAAAAAAlgAAPAAAAAEAJIMADAAAAAFACCPAAAAAAAJQAAjwAAAAAACWAAA8AAAAAQAkgwAMAAAAAUAII8ABQYlasWKGqqtrc3FzsWgasGTNmqOqMGTP66PPoo48m/xAvv/zylkb92Lnnntv3r7j//vu3dH7ooYd21O2ggw5K+hx++OF9HO3iiy/W7clkMlOmTJkzZ859993Xdz0AAGD3R4AHAGDX+81vfhPHcR8dPk2iXr58+ZZvB55++um1a9d+1jLy+fyf//znBQsWnHjiiTNmzOjq6vqsRwAAALsPAjwAALvexo0bn3766R09m8/nH3zwwU88yN133y0iYRiKiPf+3nvv7bt/XV3dn/6vp5566qabbho7dqyIPP7441ddddVnexsi1157rar28V4AAEC/IcADALCLNTQ0iEgfefuxxx5rbW1NuvXhf/7nf0Tk6KOPnjZtmnyc5/uQSqW+9H9Nnz79wgsvfP3116dOnSoiN9xwQ1NT06d/I4VC4Y477vj0/QEAwBeKAA8AwC52wgkniMj999/vvd9uh2T+fNJtR5YuXfrnP/9ZRE499dQTTzxRRBYvXvz+++/vRD25XO6f//mfRSSO49dff/1Tvmrz5s1nn332O++8sxO/EQAAfBEI8ACA7Vu1atXdd9+9dOnSYhdSev76r/+6oaFh/fr1zz777LbPRlG0cOFCEZk7d24fB0mut5eXl8+ePTvpaWb33HPPzpU0efLk5MFbb73Vd89Vq1b94Ac/mDNnzvDhw++8886d+3UAAOCLQIAHgBK2cuXKM888c/jw4dlsdvz48aeffvry5cu37bZx48Zrrrnmy1/+8rBhw3K53NixY2fMmDF//vxCodC7W7K+/ciRI0XkhhtumDBhwimnnHLXXXeJyAcffKCqw4YNE5Hnn39+9uzZgwcPLisr22+//ebNm5e8fNGiRbNmzaqrq6uoqJg2bdqPf/zjbVdxM7Of//znc+fOHT9+fHV19SGHHHLeeecl15m3rST5datXr77gggtGjRqVy+UmTpx45plnrly5Mun2wAMPqGoYhtudFj516lRV/d73vvfZz+vnFQRBcnX917/+9bbPLlq0qLm5efTo0QceeGAfB0kC/Jw5c8rKyiZPnpzMgf/EWfQ7suXSfXJW+/Dmm2/+27/924IFCzo6OnbudwEAgC8IAR4AStVzzz03bdq0O++8c926dT09PStWrPjlL385bdq0N954o3e35cuXT5o06eqrr37ppZfWrVvX3d397rvvPv7446eddtpJJ5203Tned95552WXXZbEe1Xt/dTdd9996KGHtrS0zJkzZ+LEia+99tr5559/1VVX/fSnPz388MObm5uPP/74qVOnLl269NJLL/2nf/qn3q9du3btzJkzzznnnPvvv3/FihWtra2LFy++5ZZbDjzwwJtuumm77/H1118/6KCDHnrooa997WvHHntsU1PTnXfeud9++7355psiMnPmzKqqqjiOFyxYsNULly5dmpyH008//TOf2V3hpJNOEpH77rtv2zOczJ8/8cQTtzq3vf3xj3987733ROSUU05JWpKL8C+99NKKFSt2op6bb745efClL32p756HHHLIljXwHn/88Z34XQAA4ItiAICSsuWe5PLy8okTJz7++OPt7e2tra0//elPk+XKjz322N79DzjgABFpbGy84447li9fvm7duhdeeOGcc85JDvKb3/xmqyNXVlZWVlZOmjTpt7/97V/+8hfvvZmtXr1aRDKZTGVl5cKFC5P+3vuzzjpLRJxzzrlbb711y6H+4R/+QUTCMGxra9vSmGyrHgTB97///cWLF7/33nsLFiw4+OCDk0oeffTRrSqpqamZOHHiJZdcUigUkvYNGzZMnDhRRI455pikJcnnRx111FZn6VD23N4AAAnBSURBVPLLLxeRffbZZ+dO8je/+U0R+eY3v9lHn0ceeSSp/KWXXtrSmLTcfffdURQNGTJERJ555pner4rjOFm7bvHixS0tLUn/Bx98cKuDX3LJJSJSV1eXz+eTlldffTXpfN11121bzEUXXSQiQ4cO3aq9paXlf//3f4855pjktSeeeOKnPwlmtm7duuSFixYt+kwvBAAAXwQCPACUmC0BvqGhoaWlpfdTyXTxxsbGLS0bNmxIOj/11FNbHefQQw8Vke9///vbHnn8+PFdXV29OycBXkQuv/zy3u3Lli1L2s8444ze7evXr98q3G7ZNe2+++7r3bOnp+fwww8Xkf322y+O460qOfjgg7cq+xe/+IWIDBkyJPkxufaeTqd7nwrvfXIjwA9/+MPtncJP9vkDvJkl35JccsklvV+V7Mc2YsQI7/2OAnwcx0OHDhWRc889t3f7hAkTkhO1bTFJgO/bXnvttXbt2s90HgjwAADsVphCDwCl6vLLL6+uru7d8vWvf11EWltbt7SY2V133XXXXXclT/WWRNy2trbtHjmbzW73lx5//PG9fxw9evR22+vr63O5nIhsyai33XabiBx66KFbLb2eTqevv/56EXn11VdfeOGFrX7d3//932/VkoTYDz/8MPnxyCOPrKqq2mpb9T/84Q/vv/++c+7UU0/d7rvoH1tm0dvHwV56rT/fx/z5RYsWJcl5q/qTtehfffXVbVcN6NuQIUMuuOCC119/PfleAAAAlCgCPACUqkMOOWSrlrKysq1a6uvrTzvttNNOO825/z/gr1mzZv78+Q899NCOjrz//vvv6KlRo0b1/jEIgu22934q8fbbb4vIlrncvf3VX/3V4MGDRWTbHcumTJnS92Ezmczs2bPl42CcmD9/vohMnz59xIgRO3oj/WD69Ol1dXUffPDB4sWLkxYzu//+++XjKL4jyfbv9fX1e++9d3Mv06dPTzr86le/2u4L6+rq/rSNNWvWbNiw4eabb66srNyF7w4AAPS/sNgFAAB20raZeUdeffXVBQsWvPTSS8uXL1+1alVnZ2ff/RsbG3f0VO8vAj5Ne8I+nhU/duzY7XYYPXp0U1PTtkvo91HJFieddNIvf/nLRx55pKOjo7y8vFAoJGu//93f/d0nvvYLFYbhnDlzbr311l//+tfJty0vvPDC6tWrGxoavva1r+3oVYVCIQn5GzZsqK+v326fX/3qV1dfffW27alU6hPXqAMAAKWLK/AAUKrS6fQn9omi6Oyzz542bdqVV175wAMPFAqFb3zjG5deeuldd9211aT33jKZzC6tVLbMId/RvPFk+b2enp6t2vv+XiBx5JFHVlZWdnV1PfzwwyLy+9//vrm5OZfL9b3Let+SOrfaZm8rW57to8jkSvu9996bnIEt8+f7eMmjjz66adOmvst78803ly5d2ncfAAAw8BDgAWAg+9GPfnTrrbeGYfgf//Efzc3Ny5cvf/DBB2+88cbTTjttq/vnv1DOuXHjxonIli3ct5JsjTZp0qSdOHg2m+09iz6ZP3/cccd9nhnjdXV1ItL3reZbnk1Wm9+uI444ora2dvXq1c8//7yIfPr589XV1d3d3dsuXbNkyZKk245m0QMAgAGMAA8AA9m9994rIuedd95ll11WW1vb+6md2058pyWLz/3ud7/b9qklS5Zs3LhRdjbAy8fLxT300EObNm1K1qX/nPPnDzzwQBHZsGHDlsC8FTN74IEHRGTYsGHDhw/f0XFSqdRxxx0nIvfee++f/vSnFStW1NXVHXbYYTvq39XVtXDhQhGZM2fOdudB7L///slXIQR4AAD2QAR4ABjIvPciUlFRsVX7H/7wh2Rltd4LpH+hvv3tb4vIokWLkoC6RaFQ+Md//EcR2XvvvbfsCf9ZzZo1q7Kysq2t7aKLLuro6Kivr585c+bnqfbUU09Nvu/41re+tWVLvC2891deeeWzzz4rIpdeemkf68lLr1n0yZcpxx9//Fbr8PX2wAMPtLe3i8jf/u3f7qhP8m3FypUrX3zxxU//jgAAwABAgAeAgSyJxD/72c8ee+yxOI6996tWrfrXf/3Xo48+OooiEVm0aNFbb72Vz+e/6Epmz56d7Pc+d+7cq6++esmSJWvWrPnd73536KGHPvnkkyLyX//1X8md8Dshm80m69sn889POeWUnT5UorGxMdlw/p133hk3btz3vve9++6778UXX3z00UdvuummadOmXXvttSIyc+bMyy+/vO9DzZgxo7q6etWqVT/5yU9EpO878++++24RqaurSzai366TTz45ecBFeAAA9jQEeAAYyP7lX/6loaGhubl55syZ6XQ6l8uNHj36yiuvPP744x9++GFVXbZs2eTJk5OLyV+0O++88xvf+EYURddcc82BBx44fPjwv/mbv3n++edzudxPfvKTI4888vMcPLkunTj99NM/d7Fywgkn/PznP6+vr+/o6PjP//zPE0888eCDD541a9bFF1/82muvOefOOuus+fPn9335XUTS6fSxxx4rIq2trTU1NUccccSOem7evDm5xeCEE07o4wuI3rPo+20CBQAA2B0Q4AFgIBs6dOjSpUsvvvjiKVOmZDKZqqqqWbNmLViw4I477pg1a9Ztt902ffr0o48+un/2Sx8+fPgTTzwxb968448/fty4cZWVlV/5ylfOOeecV1555aKLLvqcBz/qqKOSOwUmT5580EEH7Yp65eyzz37nnXeuv/764447burUqWVlZSNHjjz88MPPP//8P/3pT7fffnuy1t0n2rJq3bHHHptKpXbU7be//W2yDv+3vvWtvg+YXIRfvXr1c88992nfDAAAKH3Kl/cAgC9CU1PTa6+9Nnny5GHDhu3Cw5rZe++9t2zZsmTOfO/2sWPHvvfee9ddd90PfvCDXfgbAQAAdhMEeADAQPD0009Pnz5dVVeuXDl69OhilwMAALDrMYUeADAQJEvEHXrooaR3AAAwUH2uRXoBACiuZcuWtbW1PfHEE/fdd5+IXHjhhVt1eOWVV1auXPnpD7j//vuPHTt2V5YIAACwizCFHgBQwr773e/eeOONyePp06c/+eSTWy0Lf/7558+bN+/TH3DevHnnnnvuriwRAABgFyHAAwBK2Lx586655po4jufOnfvDH/6wqqqq2BUBAAB8UQjwAAAAAACUABaxAwAAAACgBBDgAQAAAAAoAQR4AAAAAABKAAEeAAAAAIASQIAHAAAAAKAEEOABAAAAACgBBHgAAAAAAEoAAR4AAAAAgBJAgAcAAAAAoAQQ4AEAAAAAKAEEeAAAAAAASgABHgAAAACAEvD/AM9Cu47OEj7TAAAAAElFTkSuQmCC" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4659,29 +4686,33 @@ <h3>Integration with <code>harmony</code></h3> visibility:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImhhcm1vbnlfVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcImNlbGx0eXBlX2Jyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yLFxuICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZnkgdmFyaWFibGUgZm9yIGZhY2V0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9IFwic2FtcGxlXCIpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255XCIpICtcbiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICtcbiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImhhcm1vbnlfVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwiY2VsbHR5cGVfYnJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgU3BlY2lmeSB2YXJpYWJsZSBmb3IgZmFjZXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gXCJzYW1wbGVcIikgK1xuICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9IFwiRGFyazJcIiwgbmFtZSA9IFwiQnJvYWQgY2VsbHR5cGVcIiwgbmEudmFsdWUgPSBcImdyZXk4MFwiKSArXG4gIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICtcbiAgZ2d0aXRsZShcIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255XCIpICtcbiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpIn0= --> <pre class="r"><code>scater::plotReducedDim(merged_sce, dimred = "harmony_UMAP", - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size = 0.5, point_alpha = 0.2, # Specify variable for faceting other_fields = "sample") + + scale_color_brewer(palette = "Dark2", name = "Broad celltype", na.value = "grey80") + + guides(color = guide_legend(override.aes = list(size = 3))) + ggtitle("UMAP after integration with harmony") + - guides(colour = guide_legend(override.aes = list(size = 3))) + facet_wrap(vars(sample))</code></pre> <!-- rnb-source-end --> +<!-- rnb-message-begin eyJkYXRhIjoiU2NhbGUgZm9yIGNvbG91ciBpcyBhbHJlYWR5IHByZXNlbnQuXG5BZGRpbmcgYW5vdGhlciBzY2FsZSBmb3IgY29sb3VyLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHNjYWxlLlxuIn0= --> +<pre><code>Scale for colour is already present. +Adding another scale for colour, which will replace the existing scale.</code></pre> +<!-- rnb-message-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeWAV1d3w8d+ZuUv2fYGwGXYUUAEFW0RbELRFpS6gomi1z+Pe9lWfuvSxSqu1arX6WKzaaotVtKDWx6K27nUDWQUU2ULY1+w3yV1nzvvH2Ol9khBCSHK54fv5a5Zzz5wzczOZ3z3LKK21AAAAAACAI5uR6AIAAAAAAICDI4AHAAAAACAJEMADAAAAAJAECOABAAAAAEgCBPAAAAAAACQBAngAAAAAAJIAATwAAAAAAEmAAB4AAAAAgCRAAA8AAAAAQBIggAcAAAAAIAkQwAMAAAAAkAQI4AEAAAAASAIE8PK9731P/UtpaemBkl188cVussLCwvhdqpnc3FytdfNM/vznPzdPfNlll7VSvJ/97GfxiXv16mXbdhur01x2dvZJJ500c+bM559/vsUSdiDbtp988snRo0fn5OR4PJ7MzMy//OUvnXrEduvZs6d7ip5//vlEFyfpHT3ns301TU1NdT/1+uuvH34xOjxDAAAAHJkI4DtFTU3N2rVrm29ftGjRoWY1b968+NVdu3b985//bHfB6urqli1bNm/evEsvvfSb3/zmF1980e6sDurOO++85pprVqxYUVtba1lWfX19KBRy9957771uyHHKKad0XjESonvXTo6CCh4mzg8AAAA6AwF8Z/nkk0+abzzUAH7RokVlZWVNNr7wwgvtL9b/zfycc85pbGzskNyaaGxs/PWvf90ZOQMAAADA0YkAvrN8+umnTbY0NDSsWbPmkDJ57rnnmm98+eWXI5FIWz7u8/lOiDNgwACfzxefoLy8/L//+78PqUhttGnTpvhC3n777R999NGkSZM641gAAAAAcDTwJLoA3VbzFvglS5ZYltX2HKLRaIuDxquqqv7xj3+cffbZB82hpKRk5cqVTfJ8/PHH/9//+3/uAPh58+Y9/PDDbS9VG+3fvz9+9a677vL7/R1+lI4yb9489+eGkSNHJrYw3cDRcz6PnpoCAADgSEALfAcbNGiQs7Bp06a9e/fG73L7zxcVFWVnZx80q7///e+VlZXOss/nc3OWw+hF7/V6f/SjH11xxRXulr1797pHad1HH310ySWXjB07tkePHmlpaYMGDfrWt751xx137N69+6Cf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7LPjx0/Onj37zjvvdKcKr62t/f3vf99kqva2zD/sPnS+/PLLVVVVTTYeSPz0dR6P54QDiB962qkBvPO+ZXfVbQcWkTVr1sQ/Nx+O+JG36enpZ555prv6q1/9qkni22+//cR/+cUvftEhBehUh1+7KVOmuAn27dt39dVXx2IxZ/Wrr75qZYTFQXXI9W3jwOn4v5qGhoYrrriivr7e3fL000/Ht3V3QYwUH427naXdllW3F737I0vPnj3jx0W3XafOGdFuXfOn3SES9c256KKL3OXZs2e3WB4AAIAuRhd6KSwsvPnmm3/5y186q5FI5J577rnnnnucNxs73eDjnX766fEx2IG4w+DdHHJyclqcQtkVDofjX2L83e9+99VXX20x5ezZs++++25nee3atatXr45/oXEHKikpyc/Pd8ddz5w588wzzxwxYsTGjRsXLFjQpCn4kMR3HV+/fv2GDRt69+7t9/tN0/z1r3/91ltvOW8+f+mll84666yZM2fm5uauX7/+vffee/31151PeTyeQ53Dr8t0bO3OPvvssWPHfvbZZ87qs88++/HHH48fP37Xrl2ffPKJ0w+8fdp9fVup4IE+MmbMmLPOOuvNN990Vl9//fWRI0eeddZZeXl5n3zyyfvvv++mTEtLu/XWW9tdqTZq3pyel5fnvgD8pJNOeuWVV1pP34p2nJ8u1nl/2h0uUd+c6dOn33rrrc7PHO6PsL169TroRKQAAACdhwBeROSuu+76/PPPnamGXcFgsHloNHDgwPhG8lacfPLJXq83vvHtG9/4RutNQ6+//nr8/MmXXHLJgVJefPHFbgAvIvPmzeukAF5Evvvd7z777LPOciAQWLBggfsrQ15envtcG4vF6uvrMzIy2pitGymJSH19vdPr9YsvvjjuuOOGDBly0003ua3Tf//73//+9783+bhS6le/+lV8JkeUDq/dfffdN3HiRLfJdPPmzfH9n03TdOfHPlTtu76tVLCVYz3zzDNjxoxx3wpWXl7efMSKUuqpp55yZ5XrPMOHD+/Zs6fb10ZExo4d6y67w+BdhxTAt+/8dLFO+tPuDAn55vTr12/cuHHuDCaOCy+8kP7zAAAggehCLyLi8/leffXV3/72t63MTpeamvpf//Vfn332WRvfu56WlnbiiSfGbznoDHbx889nZma2Mgv04MGD3fGZIvLiiy/G94btWI8++miLk+R94xvf+OCDD+K3vPjii23PdtKkSa2E3/fee+9NN910oAflrKysP//5zzfffHPbD9fFOrx23/rWt/7whz/Ej/VwXXTRRd///vfbXdT2Xd/WK3ggPXr0WLx4cSsNmPn5+a+88srMmTMPNef2aRKTx89MNmbMmPgLpJSaNGlS23Nu3/npYp30p90ZEvXNie9F76D/PAAASCwC+K95vd7rr7++rKzskUcemTlz5rhx4woLCzMzM0844YTzzz//zjvvLCsre+CBB/Ly8tqep9uL3tH6APjq6mq3+7SInHfeeampqa2kjx+Wv3Xr1ibNRB0oJydn1apVs2fPHjVqVGZmZm5u7re+9S2nF/eIESOuuuqqSf/SpAtD69LS0t5+++0rr7yytLTU7/enpKQUFBS4E7wZhvHQQw+tWrXq+uuvP/bYYzMzM9PS0oYMGTJlypQnnnhi586dXRbjtU9n1O7KK69cs2bNtdde279/f7/fn5OTc9ppp/3lL3954YUXDmei/vZd39Yr2IrevXt/+umnr7/++uWXXz5o0KDMzEyfz1dSUjJlypRHHnlky5Yt06ZNa3ddDlWTAD6+BT4nJ2fgwIHu6gknnHDQF0DGa/f56Uqd9KfdSRLyzbnwwgsN49//Jek/DwAAEk51XsstgK5x2WWXud03HnzwwVtuuSWx5QG6jdNPP/2f//yns/yjH/3okUceSWx5AADAUe7IahEC0Nx77723cuVKZzk9Pf2aa66J39vY2OgGGPJ/3zkH4DBlZma6y/SfBwAACUcADxzp9u7dG9+oHggErr/++rS0NBHZvn37Nddcs337dmdXXl5ed3pXOZBYu3fvdn8d69Wr10HnMQEAAOhsdKEHjnSBQGD8+PGrV692t3g8nhEjRoTD4Y0bN7pvOvB6vW+99dbpp5+emFIC3cXOnTsDgUBZWdmtt9765ZdfOhtvvfVW9+URAAAAiUIADySBqqqqCy64IP6V102UlpY+9NBD3/ve97qyVEC39PTTT//gBz+I35KamlpeXl5cXJyoIgEAADjoQg8kgby8PGck/O9///svvvhi+/btu3fvzs/P79u3b79+/c4999zp06ebppnoYgLdkFLq4YcfJnoHAABHAgJ4IGmceOKJjz/+eKJLAXRzqamp6enp0Wg0Nzd39OjR11577dSpUxNdKAAAABG60AMAAAAAkBSMRBcAAAAAAAAcHAE8AAAAAABJgAAeAAAAAIAkQAAPAAAAAEASIIAHAAAAACAJEMADAAAAAJAECOABAAAAAEgCBPAAAAAAACQBAngAAAAAAJIAATwAAAAAAEmAAB4AAAAAgCRAAA8AAAAAQBIggAcAAAAAIAl4El2ARNqwYUMgEEh0KQDgKJWWljZs2LC2pFy9enU0Gu3s8gAAWpSXl1daWproUgAQoQUeAAAAAICkQAAPAAAAAEASIIAHAAAAACAJEMADAAAAAJAECOABAAAAAEgCBPAAAAAAACQBAngAAAAAAJIAATwAAAAAAEnAk+gCAJ3unXfeef3117dt27Znz56CgoLevXtPmDDhvPPO83q9LaZ///3333zzzXXr1lVUVOTl5fXt2/eb3/zm9OnTm6efNGlSTU1Nk425ubn9+vU77bTTLr74Yo+nhT+xNua/efPm6dOnp6Wlffjhh4dRewBIDtyrAQA4KKW1TnQZEmbDhg2BQCDRpUAnamxsvOGGG1avXi0imZmZhYWFFRUVdXV1ItKzZ885c+b07ds3Pn11dfVtt922fPlyZzU3N7e2tta2bREpKSl59NFHS0tL49M7D4UFBQU+n8/ZYlnW/v37nY8MHjz4T3/6k7vrUPM/pIfCHTt2/Pa3v12+fHlDQ0NJSclZZ501a9as5k+xHZss3sKFC+++++7rrrvuyiuvdDdOmDChsbHxQB8pKSl57bXX3NXFixfPnz9/48aNjY2NQ4cOPemkk2bNmmUY9BLqztLS0oYNG9aWlKtXr45Go51dHiQK9+pOTRavxXu1Y9WqVXPnzt20aVNNTU3fvn3HjRt3xRVXZGRkHP5B0Q3k5eU1+bMCkCgE8ATw3dmdd9755ptv9u/f/4477jjhhBOcjWVlZY888siiRYuGDBnyxz/+0X1oC4VCl19+eVlZWWFh4c033zxq1Ki8vDzLslasWPHYY4+tXbu2f//+c+fOTU1NdfN3Hgr//Oc/xwch0Wj0zTffvP/++8Ph8FVXXXXttde2L/+2PxRu2LDhxhtvrKys9Pl8+fn5u3fvFpFRo0bNmTMn/qGqY5PFKy8vnzVrVjAYPKQA/phjjnnppZec5QceeGD+/PkiUlxcnJaWtnXrVtu2x44de//99zd/fES3QQAPB/fqxN6rRWTu3LmPPfaYiOTl5WVnZ+/cuTMSieTn5z/77LPFxcWHc1B0DwTwwJGD1i10W/v373/zzTd9Pt+jjz7qPhGKyIABAx566KH+/fuvX79+6dKl7vYXX3yxrKxs4MCBc+fOnTRpUl5enoiYpnnSSSc9/vjjffv23bx58wsvvHDQ43q93nPOOeeqq64SkbfffrvD829Ca/2Tn/yksrJy+vTp77///t/+9rcFCxYUFhauWLHi+eef76Rk8cLh8G233RYMBpvv+vDDD5e1ZObMmSLyox/9yEn21ltvzZ8/v6Cg4Kmnnnr99dcXLFiwcOHCMWPGfPbZZ88888yhnhAAyYV7dcLv1evXr58zZ47P53v44YffeuutBQsWvPXWW2eeeWZlZeXs2bMP56AAgA5HAI9u66uvvhKRwYMH9+zZs8kun893+umni8j69eudLQ0NDc8++6yI/OQnPykqKmqSPiMj44orrhCRd999t41HP+WUU0Rk586dTrNhh+fvWrJkyY4dO4YOHXrLLbf4/X4RKS0t/cUvfiEiL7zwgtvFpmOTxXvggQfKysr69+/fxgIvXbp03rx5F1988amnnupscaL022+/fdSoUc6WoqKi+++/Pzs7+9VXX23xcRNAt8G9OuH36kWLFtm2ffbZZ0+YMMGt6R133GEYxooVK8LhcLsPCgDocExih24rFAqJSGVlpWVZpmk22XvppZeeeeaZmZmZzurChQvr6uqOP/54N4ZsYuLEic6AzGg02paOgrFYTES01s4zTYfn71q4cKGInHHGGfHDxUePHp2fn19ZWbl+/fqhQ4d2eDLXm2+++b//+7/nnXdeVlbW5s2bD1raQCBw9913Dxo06MYbb3S2RCKR8vJy0zSdx2hXdnb26NGj33vvvSVLlpx22mltPyEAkgv36oTfq50axc8CICIej8c0zWg02tjY6ITrh3pQAEBnoAUe3daxxx5rGMbu3bt/+tOfOuP04mVlZfXv37+wsNBZLSsrE5GxY8ceKLf09PRLL7300ksvbeMT2/vvvy8i/fr1cx6JOjx/17Zt20SkybOmUsrZsmvXrs5I5ia+7777BgwYcPPNN7extI899tjevXtvv/32+OGslmUppZo/uDuPjHv37m1j5gCSEfdqSfS9etKkSaZpLly4cN26dc4Wy7LmzJkTjUZHjx6dm5vbjoMCADoJLfDotnr37n3ZZZfNnTv3nXfeeffdd4cNG3bKKaeMHTt25MiRzd8YtGPHDhHp1avXYR7Utu09e/YsXLjwueeeE5Fp06Z1bP7NVVRUiIj7gOVytjh7OzyZiEQikdtuu8227fvuu8+JtA+qvLz81Vdf/fa3vz1ixAh3Y1ZWVlFR0b59+1atWhX/XBgMBp0poPft29eWzAEkKe7Vkuh79bHHHnv//ff//Oc/v+yyy4YOHReYMrMAACAASURBVJqVlVVWVlZRUTFu3Lhf/vKXh1oFAECnIoBHd3bjjTcOHjz4xRdfXLNmzdq1a9euXfv000+npqaOGTNm2rRpp556qtsPcOfOnSISP9du21122WUtbv/GN75x8cUXH37+rdBaV1ZWikhWVlaTXdnZ2SLi7O3YZI5f//rXGzZs+NnPftb20e+PPfaYUuqGG25osv2cc875wx/+cM899zzwwAMDBw50DnTPPfc4obvTtxNAN8a9OuH36sLCwsLCwrq6OmdKAhFRSg0ePNjtLXVIBwUAdB4CeHRzU6ZMmTJlSmVl5ZIlS5YuXfrZZ5/t3bv3o48++uijj04++eT777/fGVqZk5Ozc+fO2tradhwi/t3CIuL1egcMGDB+/Pizzz5bKeVsPJz828I9UBNN3rzVUcnefvvtV155ZcqUKeecc04bS7h69eoPP/zwnHPOafI+ZxG56qqrli9fvnLlyosvvrhnz54ej2fHjh0ej2fMmDHLli3Lz89v4yEAJC/u1Z2RrI336uXLl994442maf74xz+eOHFidnZ2WVnZk08++eyzz65du/a3v/1tfFeINpYNANBJCOBxVMjPzz/rrLPOOussEamqqlq7du2cOXOWLFnym9/85mc/+5mI9OvX78svv9y+fXsrmSxbtqyurm7w4MG9e/eO3/6b3/zmoO+yPpz8W6GUysvL27dvX11dnTvJk8N5AHUGjnZssp07d95zzz19+vT56U9/2sZyisi8efNE5Lzzzmu+y+v1PvnkkwsWLHj77bfLysqys7MnT548a9asV199ddmyZe7YVwDdHvfqhNyr77///kgkMnv27O9+97vOlhEjRjzyyCNXXHHFsmXL3njjjXPOOaeNBwUAdDYCeHRbN998844dOx566KEmz1h5eXnjx4/v37//Oeecs3Dhwttuu83n8znNwmvWrDlQbpZl3XzzzQ0NDU8++WTbH9pcnZd/YWHhvn37ampqmgzarKmpkbgnqg5MtnLlyoaGhvT09GuuucZN4Ew1t2DBgg8++KCgoODhhx+O/3hlZeUHH3xQWlo6fPjwFmthGMaMGTNmzJgRv9EZUclDIdC9ca+WhN6ra2pqNm/e7PF4zjjjjPisPB7P5MmT161bt2zZMqcBv41lAwB0KmahR7fl9XrLysrWrl3b4t7CwkLTNG3bdt5gdMYZZ5im+eGHH7pz8DaxYsWKhoYGn88XPwFb23Ve/n369BGRVatWNdnuPIC6z5cdm0xE9u3btzaOM/px//79a9eu3bRpU5OPv/rqq7FY7Nxzz22xCnv27Nm6dav7qmFHJBJZunRpu084gGTBvVoSeq925hfweDzNpwxMSUlpRxUAAJ2KAB7d1rHHHisiTz31VJPI0LFo0SLLsnr27OnMx9OvX79p06ZprX/1q185jQnxLMv6zW9+IyITJkxo8qbcNuq8/J0ej86bkFzr1q3bvXv3gAED3LfydmCyqVOnLmvmiiuuEJHrrrtu2bJlr732WpNCOm8P/va3v91iFZ555pnzzz9//vz58RvffvvtQCAwadKknJycQzgdAJIN9+rE3quzsrJKSkpCodDnn3/epMyLFy8WEXfcQRvLBgDoVATw6LamT59eWlq6ZcuW73//+59++qnTeiMijY2Nr7zyyl133SUil19+uZv+6quvzsvL++KLLy655JL33nuvurpaRGzb/uqrr6699toNGzbk5OT85Cc/aXd5Oin/cePGlZSUrFy58vnnn3e2BAIBZ7DohRde2EnJDsm2bdu2b99eVFRUUlLSYoLJkyeLyNNPP/3FF1+IiNb6008/ve+++5RS06dPb99BASQL7tUJv1eff/75InL33XevXr3a2RIOhx9//PEPP/wwOzt70qRJnXFQAED7KK11osuQMBs2bAgEAokuBTpRWVnZLbfc4k5HlJ+fH41GndeSGYZxySWX/PjHP45Pv3Xr1ltuuaW8vNxZzcvLCwQCzsy6xcXFs2fPHjNmTHz6SZMm1dTU/PnPfz7oxEjtyH/z5s3Tp09XSh2oX+Kjjz7qDNdct27dD3/4w6qqqj59+vTo0WPNmjWhUGjq1Kl33nmnaZpu+o5N1sRvf/vbP/3pT9ddd92VV17ZZNcLL7zw0EMPTZky5d577z3Qxx944IH58+crpfr06VNXV+c0fP3whz+cNWvWgU8nkl5aWlob/3ZWr17NHNfdGPfqxN6rbdu+9dZbnab1wsLCzMzMHTt2RCKR1NTU++67b/z48Yd5UHQDeXl5paWliS4FABEmsUP3NmDAgJdeeum11157//33d+7cuWfPnqysrOOPP37gwIEzZ85s/j6zfv36vfjii6+//vo777yzcePG2trawsLCPn36jB49eubMmX6//zDL0478tdYHmg85Fos5C0OHDn366acfe+yxFStW7N27t6Sk5Nxzz7300kubvOynY5O13aJFi0TkxBNPbCXNT37yk+HDh//lL38pLy/3er2nnHLKpZdeOnbs2PYdEUBy4V4dn77r79WGYTz44IMffPDBK6+8Ul5evnv37tLS0hEjRlx11VVNpqbr8H8QAIBDRQs8LfAAkBi0wANAUqAFHjhyMAYeAAAAAIAkQAAPAAAAAEASIIAHAAAAACAJEMADAAAAAJAECOABAAAAAEgCBPAAAAAAACQBAngAAAAAAJKAJ9EFSIzdu3fffffdtbW1paWlF1xwQaKLAwAAAADAQRylAXxNTc1TTz0lIhMnTpw5c2aiiwMARyOv19vGlD6fzzDoMgYAidH22zWAznaUBvCurKys4cOHJ7oUAIDWDB06NNFFAAAASDwaNAAAAAAASAIE8AAAAAAAJAECeAAAAAAAkgABPAAAAAAASYAAHgAAAACAJEAADwAAAABAEiCABwAAAAAgCRDAAwAAAACQBAjgAQAAAABIAgTwAAAAAAAkAQJ4AAAAAACSAAE8AAAAAABJwJPoAgAAACQHHbV02NK2Vj7D8HtEqUSXCABwdCGABwAAODi7MRrbXRfcXmPXRLwphlmU4emTbfhMqzpsRWPebJ+RnWr4vYkuJgCgOyOABxJNa6s2FNvfaAcjhukxS9LNTL/ymIkuFgDg33TICn6xJ7h+v9RHleiQYcrWWvXlPjPVq4NRMSRsGJLp8xdl2n7TTjckzZuam+FJ9SW64ACAboUAHkgkHbVju+tCZZXWzoBlaeVR5iZfyrBCX7885TdFRFtatBZTKaV0zFamoscmAHQpLbGqxuj26oaNlUZDTClDidbaFtFGvWU3RrWIiBItUhdu3N9omVrSTJ3ure+Tnt2nMC07I9EVAAB0HwTwQGJore2KhmhVMLK+MlZZr21RWiSirGgovK7CSPF5emfpQMRqjMTqgtIQkxTTzEox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6NCh9RuRZfmVV14Jr1lcXJyYmGhepZSGdqq74447Nm/eHNqv7rPPPjPrf/nll6mpqXWapZT+85//HDRoEGAC3wy4iR1CqFWwgN/w+YzyUhITQ3RdLyokHM+lWiMdF0IIoTMIBAy/n4gisVqBEDB0/VQJ+2XDbWq309j4yAaI2plLL730u+++W7hw4Zdffrl3715N07p37z58+PDZs2dbrb9+YYiOjv7oo48++uijNWvW7N+/Pz8/v0OHDj179nz44YfNo9cb69lnnz1x4sT//d//McaSk5PDL11//fV2u93j8XTv3r1///6nvV2W5ezs7H/+859vv/32jz/+GB0d3b9//5tuusk8uD5ci0duGjRo0N13333FFVfMnj3773//+/Lly3Nzc0VR7NWr1/3333/LLbc0vKnU1NRt27YtXbp069at+/fvLy0t7dGjR+/evWfNmlXnkPmkpKR9+/bNnz9/27ZteXl5Nputf//+991338033wwAy5Yte+edd6xWa1pamln/6quv3rt37wsvvPDdd9/t3btXEIQrrrhizpw5Q4YMqamp6dmz51k250dnR1i95R8Xg5ycnEsvvRQAxo0bF/6mDSHUUoyaajXnIHFGUZsNAIzyUhqXwKd3xFXuCCHU5jCm5ucZpSVgMACAqCgxq5tRW60dPUIkEUSJeX1cYiKNi6e2uitgEWpPGGOZmZnHjx+fP3/+k08+Wefqo48++uKLL06cONE8Ih6hiMAReIRQ6+B5LjnFqKoEqxV0nWkaUIrZO0IItS2MMUXRS0/pxUXa8VzOamVKEMptmiwTXgQCNDoWCGGCoBcXUYcTMIFH7dqOHTuOHz9OCDG3oEOoDcIEHiHUOnRdr6o0iov08jJqs3Ip6dQZFemYEEIIhVFVvewUCwTUE/l64QkaFU1j45gS1ApPsNpaGhMLDMAwgONANwAAflnmilB79corrwDA4MGDO3XqFOlYEDo9TOARQi3PqK0xqirB6yW8YCgKiUugUS5M4BFCqE3RT5UoB/YCoXpluV5STABYaFUqIcRq45JTjNIS4HimKlxKKrHaIhovQq3l4MGDbrd727Zt5tHl999//3l79A8//JCbm9vw+pdffnlmZmbrxYPaPkzgEUItj7lr9ZIimpBIBIFVV5HoaCIIOHSDEEJtiK7rp4qMqmpit4GmMFVRC44bisJZLNQRRZxOGh0DAEAIMAYcR10xRJIiHTRCreKNN974xz/+Yf55yJAhoWPhzoOlS5e+9tprDa//2muvNeSMd9SOYQKPEGppjDFNI5QnoggATLIYxUU0yoXpO0IItR2GpjFVY4RQjgPgqGgBAqBrNDae65AhpHYAQmhMLI2OYbpGOB5fwqJ2rFu3bklJSbquT5gwYcGCBeQM/9r/9re//e1vf2vZRy9evHjx4sUt2yZq35qYwO/atWvnzp25ublZWVm33HJLUlJS/TpHjhwxd2h86qmnmhUjQujCQggIAtM1w+clvMB8Hi45hYg4boMQQm0I5Tgi8KAG9VoAw6BRURAXz1lkrmOmkNXl1z1HCSG8ENFIEWp1M2fOnDlzZqSjQKhBGp3AezyeP/7xj++9916o5Mknn1ywYMEDDzxQp2ZOTs7TTz8NmMAjdPGh0TGgaXpRIQPgklOIxUJkOdJBIYQQCsPzNC6ROE9AIMg4CoKVj46mkpVIIg62I4RQm9XoBP6WW27ZtGkTAFit1oyMjNzcXJ/P96c//UnX9YceeqgVIkQIXXiobCXJKdTuYIZBJYnYHebXQRYMMq+HGQa1yMSOZxEhhFAkcUnJYq8+enGhXlFO7U4iSszQQZIwgUcIoTarcWcyr1+/ftOmTYSQ//mf/6mpqTlw4EBRUdFdd90FAHPmzMnJyWmdIBFCFx4iiDQmlouLJw7nz9m7z6uXFKlHDms/HdEryoyy0kjHiBBCFzUiSUJGZ6Frd7F7DyEjk0tK4dI68LHxkY4LIYTQGTVuBP7tt98GgOnTp5tz4wHA5XItW7aspqbm448/fuCBB7Zt29biISKE2gejskIvKSJRUYTjjZISQxJJTTWRZWp3UGcUDvgghFAEEMLFJ9LoGAgGgVJikfHTGCGE2rLGjcAfPHgQAO6+++465YsXL3Y4HNu3b//iiy9aKjKEUHvCdJ3pOvA8tdqIIOgBv3Jgv1ZYoJ8oMKqrjJrqSAeIEEIXL8ILxGYnshWzd4QQauMal8AXFBQAQEZGRp3yhISERx55BACeffbZlooMIdSeEEqBENB1pmks4IeAn0tI4hNTaHyCXlLEPO5IB4gQQgghhFBb17gEvkOHDgBw8uTJ+pdmzZoVHx+/Y8eOdevWtUxoCKH2hBDqdHKJyUZZqV5SrJeVUqtMLBbC84Tjma4DY5EOESGEEEIIoTatcQl8ly5d4JeV8HU4HI6//e1vAPCnP/2pqqqqJWJDCLUrNCqaRsfwHTpxHTLEXpeBJLFg0PC4maYRQcB5mwghhBBCCJ1d4xL4qVOnAsBrr7325JNPejyeOlenT58+ZMiQgoKCsWPHVlRUtFiMCKH2gRDqjOJSUoXOWVxKKpeQZFRVMrebS0mlMbGRDg4hhBBCCKG2rnEJ/C233HLttdcyxp5//vnY2Ng+ffrs3r07vMKyZcvS09N37NjRvXv3hQsXtmioCKH2g4tP5OLiha7dhe6XcMmpxCJHOiKEEEIIIYTausYl8ADwySefPPjgg5RSRVH27dt36tSp8KsZGRk7duzo0qVLeXn5l19+2XJxIoTaG2Kz05hY6oohghDpWBBCCCGEELoANDqBdzgcL730Uk5OzrvvvjtnzpyUlJQ6FTp16nTo0KEVK1YMGzYsNTWV4LpWhBBCCCGEEEKo2Qhr5Z2fA4GAxWJp1Uc0QU5OzqWXXgoA48aN+/jjjyMdDkIIIYQQQgghdA58az+gDWbvCCGEEEIIoTZL0YyAoqu6oRuMEkIpkXgqSzzFqb3ootfqCTxC6KJgGCwYBEqJKOKBcAghhBBqmoBq1HgVRTNOVQfCyxNdFuJVrSIXZRM4zOPRRazRa+ARQqgO5vNqhSf00hK9pEgvLmSqGumIEEIIIXSBYQCVHqWsJnCi3FfpVuwyH+0QY51irEN0WcVan3qqJpB7ylNSFQgoevMfd/DgQUKIw+FoflOtZMmSJYSQ+fPnRzoQ1LbgCDxCqFmYpunlZXpxIbHIYOgsqPCEcMmpkY4LIYQQQhcMxqDCHfQrellt0GUTJeE3o4w8B5JI7Yx5A1pxld9gLMYu2iyYyKCLEY7AI4SahQUDwBhYbdQVTWPiiMDigADIAAAgAElEQVQzRQHDiHRcCCGEELpgVPsUv6KX1wZj6mXvIZQQhyxEWcXS6kClR1E0/LJxXtXU1BBCevXqFelALnaYwCOEmsU8KjK0Fu2Xcy1a93gLhBBCCLUbimp4/FppbTDaLnDcOda3W0RqtwqnqgOVbqW1j9NCqA26UBP4Bx98kJxORkZGpEND6OJCJAuhlPm8RlWlUVEOmkYkCSgX6bgQQgghdGGo8amnqgMOC8/RBuUmVpETeKrqhl/BQXh00blQE/iffvop0iEghAAAgONoXDyXkk6jY2hsHNehExeXEOmYEEIIIXRhMBgENYNSYhEa8fbfbuFPVQd8Qa2VonrrrbcIIVOnTq1TvnbtWkLIsGHDAODNN98khCxfvnzv3r033HCDy+VKS0u75ZZbDh48CADr1q0bPXp0UlJSYmLiuHHjjh07Fmpk6NChgiAAwKpVqwYNGmS327t27Xr77bcfOnTotMHk5+ffc889vXv3ttvtvXr1eumllzStbsc//fTT8ePHZ2ZmulyuwYMHP/nkkz6fr35T2dnZY8aMSUtLi42Nveqqq9555x3DMBrS33HjxrlcLgA4cOAAIWTAgAGhOocPH54+fXqvXr1sNlv37t1nz55dWFjYoN8yapJGJ/Dl5eVffPHFkiVL1q1bl5+f3xoxNcTRo0cBwO12s9/Ky8uLVEgIXbSIbOXT0vmkFC45hU9OAR43lUEIIYRQgwQUnTEm8bRRp9AKPCUEAmprjcCPHTtWEIT169cHg8Hw8uXLlwPAHXfcESr59ttvhw8fftllly1atOiqq65atWrV0KFD582bd8cdd1x++eV/+ctf+vfv/8knn9x4442KooQ3NX/+/ClTpiQnJ8+aNat3796rVq0aOHDg+vXr60Ry+PDh/v37r169OiEhoUuXLgcOHHj44Yeffvrp8DqPPfbYqFGj1q5d6/F40tLSvv322+eff75Pnz5mxhTy0EMPjR07dt26dYIgJCQk7Nq1684777zzzjsb0t/Ro0ffd999ABAbG/vwww9PmTLFrPD+++/369fv3XffLS4uzsrKys/PX7hwYd++fXfv3t2EXztqENZgPp9v9uzZHPebd2MTJ04sLi5ueCMtQlVVnudTU1Ob3ELo/da4ceNaMDCEEEIIIYRQw9V4le+OVvxYWFtQ5m3U//bmVRWUeVVNb9pzDxw4AAB2u/1MFW644QYAWL9+/a+h1tRYLBabzWYOIr7xxhsAwHHcN998E6ozdOhQAJAk6cCBA2aJYRiXXXYZAOzcudMsGTJkCADwPJ+dnR26cfv27RaLJT4+3uPxmCWvvfaambBMmDAhVPj2228DgNPpNAwjdCMAuFyuUKhVVVWjR48GgFGjRoXa/+STTwCgY8eOe/bsCf0GUlJSAGDDhg0N6W91dTUA9OzZM1QhPz9flmWr1frBBx+YJT6f78EHHwSAjIwMn893jr8D1CSNGIEfPXr0iy++qOu/OXdx9erVAwcOdLvdjXtt0Dz5+fmapnXr1u18PhQhhBBCCCHUsgwGANC48XcAAODor7e3hsmTJwPA6tWrQyVr1qwJBALjx4+32+2hwuuvv37QoEGhH83k/NZbb+3Ro4dZQgi55pprAOD48ePh7U+YMOHmm28O/Th06NB77723rKxs8eLF4dXi4uLeeustm81m/jh9+vS0tLTa2tqysjKz5JlnngGAF1544aabbjJLXC7Xhx9+mJiYuGXLlp07d5qFTz75JAAsXbr08ssvN0t69OhhHjK/adOmhvc33LPPPuv3+xcsWHDrrbeaJbIsv/TSSyNHjszLy1u7du1p70LN1NAEfvXq1du2bQOAHj16fPDBBz/88MO6detGjBgBAAUFBeY/iPPGnA3StWvX1atXT58+/brrrps5c+ayZcvqrwYJKS8v/z6MuTQFIYQQQgihCxJjoPpBCwC70DdyYwBgND4RN+9ofOLfUGPGjBFFMTs7W1VVs6T+/HkACCXqJjPT7tmzZ/1C47eH7E6aNKnOE82Sr776Krxw1KhRDocjvCQpKQkAGGPm/92zZw/P83fddVd4HavVettttwHAnj17AKC2tvbQoUOpqalm+hZy66237t27d9asWQ3vb7idO3cSQswHhRs/fjwAfP3112e6ETVHQ5eqvvvuuwCQmZm5e/dui8UCAH369LnppptGjx69cePGVatWvfLKK60Y5m+ZO9i98847oYkl27dvX7Jkycsvv7xq1aquXbvWv2XdunV/+MMfzluECCF0YdM1YCpQASjuaIAQQm2P5ofKfKjKB28pUBHS+kFcVqRjaiKeo4kuiyfQ6O3oNJ0BAEdbK4N3uVwjRozYsGHD9u3bR44cWVxc/Pnnn6empl577bXh1czt6Oo4bWEdmZmZdUrM47Ryc3PrF55JYWGh3+/v3LmzKIp1LnXu3Bl+Gfg8cuTIaZ9osVjM6f3Q4P6GqKqam5vLGIuNjT1thYqKirNEjpqsod/MzL/1Rx55xMzeTYSQJ554YuPGjaWlpSUlJebboPMgtAX9P//5z+uvv97lcn333XezZ8/et2/fbbfdtmvXrjoL9RFCCDWCpxQCNQAAjIHFAY7kSAeEEEIoDGNQfQKOfQ4VR8HvBqZByX7oPAS6DI90ZE1hbj6vqAZYzln3V5puGAYTBdqEufcNN3ny5A0bNqxevXrkyJEffvihYRhTp06lDTvr7pxCA90h5gZyfr8/vFCSpLM0UmdUPxzP8wBg7pwXCASgAa8VGtVfTdN0XbdYLDNnzjxthUsvvfTsj0NN09AE3nwVVGeKSHjJqVOnzlsCP2TIkOTk5OHDh/ft29csGTFixI4dO7p16/b999+vWrUqtC9iSEZGRvg0ldra2q1bt56faBFC6ELir4ZADVSfANUP/moQrGBLgJTeYHGc+16EEELngRYATxlU5oK3HCgHhgLlP4KuAi9Dx4FAzz3226bwHBE4quqGohki39Dc2BfUE10Wq9i608RuvvlmSZI++eSTxYsXr1ixAgCmTZvWUo0fPXr0iiuuCC/JycmBX0bOGyg9PV2W5YKCAlVV6+Tn5ti7uWuYOUO5/nFdmqZ9/fXXsiybkTSqv7Isp6enFxQUzJ071+l0Njxm1EwN/Y/EfEVknv4Xrn5JC3I4HCSMucsCAIwdO/axxx4LZe+hSKZPnw4A33//ff2mhg4duirMokWLWi9shBC6gCleqC4AIFBbCNX5kPcFFHwJR7aAuzzSkSGEEPqFFgAtCAYD3gpAQdehNAd2LYZPn4PyHyMdXKM5ZD7RZfH4GzqLXtWNgGpQSmyW1k3go6KiRowYUV5evnTp0t27d/ft27f+cGaTLV26tE7Jyy+/DADhR6yfEyGkT58+qqq+99574eV+v9/MwM2MKSEhIS0tLS8vr84C+88//3zIkCGhJKux/e3Xrx8ArFmzpk75U089deWVV+7YsaPhHUEN1zIzQFrJhAkTbg1zzmkY5rulCJ5OjxBCFzwCYBig+sBfBb5qoDx4KqBwD+RtA391pINDCCEEwFtAdAAvgh4ELQiKD/QAGBp4a6BoL/zfQji+E/xVoPrP3VTbYLPwIk9V3aj1q+bebGdhGKzaqyZESVFWodXWv//K3Jt9zpw5cNbt3Jpgx44ds2bNMqe4B4PBWbNmbd261eVy/fnPf25UO/PmzTMj/Pe//22W1NTUTJkypbi4eNiwYeYG+KFqM2bMCG3mXVRUZG5fN2HChFBr5+xvZWVl6M9z587lOO6RRx4x97EHAMbYm2++uWDBguPHjw8cOLBRHUEN1KZ3JzLPOazD7XavWLHCbrfffvvtdS6VlpbCL2k8QgihphCs4EqFgl2g+AB0sEZD0AO6BjUnoSIX4rLAgtPkEEIoogiB5EvhZEfw14C/CvQgMADKASMAOlSfgK//AfGXQM+x4EwFe0Kkw22QOKdkMFZY4TcM5rQKZ1rZrmhGjU+Nd0o2ibO3xPC71+vt0qXLaS9t2rSpS5cu5qxyr9fL83z9VbrNMW3atEWLFi1evDgzM/PYsWPBYFCW5SVLlsTExDSqnWHDhj3yyCMLFy4cMWJEWlpabGzsoUOHVFXNysr617/+Fap25513/vvf//7ggw969eqVlZVlt9sPHToUDAYnTZoUnqifpb82m02SpKKiosGDB/fr1+8f//hHr169/vrXvz722GM33nhjampqenp6fn5+cXGx3W7Pzs4+++p91GRtegT+tOx2+1/+8pepU6fu378/vNwwjHXr1gFA//79IxQaQghd+CwusESDPQk4HhgDfy1wEogycBKU7IdTB6AyDxRPpKNECKGLm2CHATMg42qIyfx50TsBYDqYo9f+Gji5Cz5fADkbIHBh7ATOURLvtKTGykHVKK9VPAFN03+zPVtQNaq9SpVHiXdKdgsf7WiZ5JAx9tMZmGPjTqdz1KhRADBq1KiEhJZ8G/Lss8+uWrXqmmuuKSkpSU1NnTx58q5du8wB8MZ68cUXt2zZMmbMGEEQ8vLyBgwY8MQTT+zduzf83QQhZMWKFe+9997IkSPdbveJEycGDBjw9ttvr1y5Mryps/SX5/lXX301JSVl9+7doT3FZ82atXPnzkmTJtlstv3790dHR99///05OTl1lvejFkTOOU3l53qEAMDevXtDJw005FIrmTt37nPPPdetW7c1a9aYCzNqa2tnz579+uuvX3nllV999dU5N4fMyckxJ+SPGzfu448/Ph9BI4TQBcRfBT9uheL/B5oPRCsAgKsDBN1gTQDZCXFdIbYz8PhmHSGEIooxKPsJvvknVBwFMAAYGAYABcKAABgEOAE6D4GeE8AeD6It0uGem8FYrU91+7VT1QEAIAQoIeyXU+ITXRaOEpdNsErndRLxpEmTVq9evWrVqvontzeQoiiHDx+OjY1NTU0FgKFDh37xxRc//fRTo/arO2+a31/UqhqXwMfGxtY/fqCkpORMl0zFxcXNC7IuTdNGjRq1bds2SmlGRoYgCMeOHVNVtUuXLhs2bGjIFHpM4BFC6Bz8VZD/NZQeBt4GPAe+KuAEYAy0AHAWyLgKOgwCaP3VhwghhM6u4Hv4fglUngBgwAAIAGHAyM8/CgKkDYRu10NsFsituPl0C9J0wxfU/Yqu6cxgPx/2LvJUljiryJHWPDeuvvLy8tTUVFmWS0pKwo/Tbo62nMC3Rn9Ry2rc66uKijNOwjnLpRbH8/ymTZveeuutZcuW5eXlqao6aNCg66677rHHHsN/Zwgh1DLkaOh2PcRkgaZAyV7graDWgqaCvxYUNwgSGAw6DgTCRTpQhBC6uHXoB7Yn4PP5UHMSmAGEACNg/JLGayqU7AdOAMEKlig4v9lv0/AcdVqp0yoAgDnUGKmoDcN45plnFEX5wx/+cDFkGRdbfy9QDU3gH3jggVaNo7FEUbz33nvvvffeSAeCEELtF+EgvisE3aAFoHA3BAmofuBF0Dgo3APuEig7DF1Ggis10oEihNDFLTYDfj8Ltj4H/tqfl8Gb/48AMAKKDyrzoCof4roAd4GdEh/BFw7XXXfdnj17qqur7Xa7uSt7+3ax9ffC1dAE/pVXXmnVOBBCCLVFhIIlChK6ga8MagvB0MAwIFANug5aLngrgHDQazxIjkgHihBCF7e4S+DS0fDDSgANGAMCABQYA56AZkCwFgI1F8Twe9vRsWPHXbt2mdutd+rUKdLhtLqLrb8XroaugW9ncA08Qgg1AjOgNAeO/Buq8yDohaAXRBms8aD4ICoRek6AhEsiHSJCCF30mAY7X4cf1wMzfp56DhSAASFgj4c+t0PWtRfcCDxCqI7WPUaOMfb111+36iMQQgi1OkIhvht0GAiJvQAMYBqINpCsIMoQ8IAejHR8CCGEAAgPV82Egf/184bzlAAF4AhwFrDGQVQaZu8ItQOtdQbDd999t3LlypUrV548efLiHORHCKF2hfLQYRA4k8FXCuXHAACCXgi6IbUP2OIjHRxCCCEAACAEeoyDmCz47nUoPwE8AaDgTIXM30N0h0gHhxBqAS2cwO/bt8/M23Nzc1u2ZYQQQhFGCER3gksnQN4O8JQAAFhjIOFScCRHOjKEEEJhknvBiHlwbAd4SkC0QHRnSL4MJHukw0IItYCWSeBzcnJWrlz54Ycf/vjjj+HlWVlZEydObJFHIIQQahPiu4I9FiqPg66BMxmiUoG07moshBBCjWZxQY+bARgwhp/SCLUnzUrgjx07Zo6379+/P7zczNsnT558+eWXNy88hBBCbQwhYI0Da1yk40AIIXRO5ILdeZ6BGgAtCEwHIMDxwFuAEyMdFUKR15QEvqCg4KOPPvrwww93795d/+qePXswb0cIIYQQQgg1mqGBrxKCbmAGAEB1AQCAqwMAACeCHA2S44J9K4FQC2jEjJri4uJXXnnld7/7XadOnWbPnh3K3rt06fLEE09s3brV/BGzd4QQQgghhFCjBWuh6jiU/D+oLgBfOQRrwRoL1hjwV4O7BCp+As8pqDkButr8R23cuJEQQgi57LLLzlJtxIgRZrU333yz+Q9FqPkaOgI/dOjQHTt2GIYRKunRo8eECRMmTpzYq1cvAKioqGiVABFCCCGEEELtnq8CfJVQcwIkJ0hOoPUGGjUF3KWgB8DQwJkCvKVFHrt///4ff/yxW7du9S9VVlZ+/vnnLfIUhFpKQ0fgv/jiCzN779Onz//+7//m5OQcOHBg7ty5ZvaOEEIIIYQQQk0UqAFfJdScBFsCyK7TZO8AwItgjwfJCZV5UFsMutb8x1JKAeCjjz467dXs7GxN0+hpg7nQ1NTUEEIwd2sHGvfPkef5Dh06ZGVldeiAJ0kihBBCCCGEms3QwFsO1SfAFg+8dLaahIDsAtEGlbngLW3+kwcMGCCK4pkS+NWrVwPA7373u+Y/CKGW0tAEvl+/fgCgadq6detuvfXWhISEqVOnbty4UVVbYAkKQgghhBBC6CLlrYCq42BxniN7D7HGAOVB8YLqb+aTo6Ojhw8fbs6ir3Oppqbms88+69evX+fOnZv5FIRaUEMT+N27dx85cmTevHmXXHIJAHi93uXLl990003JyckzZ86sszweIYQQQgghhM6NMVA8QChIjgbfQ0CKguoCCNQ0//mTJk2C082iX79+vaIoEydOPO1dn3766fjx4zMzM10u1+DBg5988kmfzxdeYcmSJYSQ5cuXl5SUzJgxIzk52Waz9e7d++WXX9a0upP/z9maKTs7e8yYMWlpabGxsVddddU777xjpmBvvfUWIWTq1Kl16q9du5YQMmzYsHHjxrlcLgA4cOAAIWTAgAGhOocPH54+fXqvXr1sNlv37t1nz55dWFjYkN8bipRGTKHv0qXLM888c+jQob179z7++OOdOnUCgIqKiiVLlvz+97/v2bOnWS0YDLZGoAghhBBCCKH2RvUCM0CQgTRmba8oAxBQfcBYM58/ZsyY086iN+fPT5gwof4tjz322KhRo9auXevxeNLS0r799tvnn3++T58+R48erVOzpKRk4MCBPp9v3rx5zz33XHV19UMPPfTkk082obWHHnpo7Nix69atEwQhISFh165dd95555133gkAY8eOFQRh/fr1dRKx5cuXA8Add9wxevTo++67DwBiY2MffvjhKVOmmBXef//9fv36vfvuu8XFxVlZWfn5+QsXLuzbt+9pDwtHbQVrhm+++ebBBx9MSkoKbzAqKmr69OmbN29WVbU5jbeqQ4cOmdGOGzcu0rEghBBCCCF0sfJVsqOfsZPfs7Ijjftf7pes7AjTm5hxbNiwAQBGjRrFGLvhhhsA4PDhw6GrbrfbYrFcdtlljDEzSX7jjTfMS9u3bwcAl8u1fv16s6Sqqmr06NGh1kyvvfYaANjt9pdeeilUmJubK4qizWbTdb1RrX3yyScA0LFjxz179pglBw4cSElJAYANGzaEuhBqhDFWU1NjsVhsNpvb7WaMVVdXA0DPnj1DFfLz82VZtlqtH3zwwc9/FT7fgw8+CAAZGRk+n69pv1jU2pq1p+KgQYNeeumlwsLCbdu23X333dHR0QBQU1PzzjvvXH/99UlJSffcc4/5jxIhhBBCCCGE6jI0AADa0MOtf0U5AGiRvejrz6LfuHFjIBAwy+t45plnAOCFF1646aabzBKXy/Xhhx8mJiZu2bJl586d4ZXT0tIeeOCB0I8ZGRk9evTwer2haeoNbM0ctF+6dOnll19ulvTo0WP+/PkAsGnTJgCYPHky/DJrwLRmzZpAIDB+/Hi73X7aXj/77LN+v3/BggW33nqrWSLL8ksvvTRy5Mi8vLy1a9ee8/eGIqIFDkWglF577bWvv/76qVOn1q9ff9ttt5n/SioqKl5//fXrrruu+Y9ACCGEEEIItUcEAJo0E54BwOkPnGskcwp6eAJ/pvnzjLE9e/bwPH/XXXeFl1ut1ttuuw0A9uzZE15+9dVX1zmFzmazAYC5dr2BrdXW1h46dCg1NXXEiBHh1W699da9e/fOmjULflkIkJ2dHdpiPDR//ky93rlzJyHEfFC48ePHA8DXX399phtRZLXkqYaCINx0003Lly8vLS1duXLluHHjJKlhO0kihBBCCCGELkLmQLrR+JOtDB0AgHDND8HlcoXvRe/3+zdt2tSzZ8/u3bvXqVlYWOj3+zt27CiKYp1L5mb1dRaup6enn+W5DWztyJEjAJCZmVmnjjnJ36zpcrlGjBhRXV1tTn8uLi7+/PPPU1NTr7322tM+WlXV3NxcxlhsbCz5rXvvvRcAKioqzhI5iqDGT1ZpAFmWJ0+ePHny5JqaGpx9gRBCCCGEEDo93gKuDo0+1N3QQVeA8j/n/802adKkTZs2ffTRR08//fTmzZt9Pt9p58+f5eAtnucBQFGU8EKOO1t4DWwtEAgAgCAIZ+/C5MmTN2zYsHr16pEjR3744YeGYUydOpWeYYaCpmm6rlsslpkzZ562wqWXXnr2x6FIaZUEPiQqKsrc9QEhhBBCCCGE6uItQDhQg2BojVgJr3gBoDEnz53DmDFjzFn0Tz/9tDl//rQHyKWnp8uyXFBQoKpqnYzaHC3v1q1bwx/awNa6du0KAHl5eXVu1zTt66+/lmX5iiuuAICbb75ZkqRPPvlk8eLFK1asAIBp06ad6dGyLKenpxcUFMydO9fpdDY8ZhRxDf2PZOPGjU1+xo033tjkexFCCCGEEELtFiEgu4Clg68crHENusXQIVgLro5giWqpKKKjo4cNG7Z58+Z9+/Zt2LDhkksuOe0QNCGkT58+33zzzXvvvTdjxoxQud/vN3Pmvn37NvyhDWwtISEhLS0tLy/vq6++uvrqq0PVPv/88xEjRtx8883Z2dkAEBUVNWLEiPXr1y9dunT37t19+/bt0aPHWZ7er1+/goKCNWvW1FmB/9RTT23fvn3BggXXXHNNw/uCzpuGJvChfRGbgDX7eEaEEEIIIYRQ+yRHQ7AGFB9wtSCdazSYGeAth6g0kF3AnWNWeaNMmjRp8+bNM2fOdLvdp50/b5o3b97w4cPnzJmTnp4+fPhwAKipqZk+fXpxcfGwYcMam/Q2sLV58+bNmDFjxowZa9euNdPyoqIic/u68J32Jk+evH79+jlz5sAZtq+rrKwM/Xnu3Lnr1q175JFHEhMTzVPoGGPLli1bsGBBfHz8wIEDG9URdN605CZ2CCGEEEIIIdQ4hIA9GaI7gb8aArVnq2no4C0HPQi8BWyxLRuFuRf9t99+C2eYP28aNmzYI488UlFRMWLEiPT09D59+sTHx2dnZ2dlZf3rX/9q7EMb2Nqdd945ZcqUo0eP9urVq2vXrn379s3MzDxw4MCkSZPCE3VzFr3X6+V5fsqUKeEPstlskiQVFRUNHjz44YcfBoBevXr99a9/dbvdN954Y1pa2pVXXpmamnr33XfLspydnY2bkbdZjU7gExMT77vvvs8++6yqqqq6YVojboQQQgghhFA7IVjAkQTRnSBQDe4S0AJ1D5YzDAjWgrsY7AkQ1xWiUn4+f67lmLPoAaBLly69evU6S80XX3xxy5Yt5rL5vLy8AQMGPPHEE3v37u3SpUsTntuQ1gghK1aseO+990aOHOl2u0+cODFgwIC333575cqV4U05nc5Ro0YBwKhRoxISEsIv8Tz/6quvpqSk7N69+6effjILZ82atXPnzkmTJtlstv3790dHR99///05OTnmonrUNpEGzm9fu3bt6tWrN2zYUFv781uxTp06TZw4ccKECQMHDiSkhf/7aW05OTnmspZx48Z9/PHHkQ4HIYQQQgihi54WBG8pqAGoLgDKARWA8gAMdA0MBRiD6I4gOcEWB+RCnUfsdrsPHjzYu3dvq9XaGu1PmjRp9erVq1atOssqAHRBa2gC///Zu/O4qKr2AeDPuXdmYIZtBgQEATfUVMiFNJfMDXBBRFFMfZXMFrFfmbmv9cqbGaa5ZJmmlZZpKimy5ZJrbomopIi4gCgiq6wzzHLv+f1x3+adBsRhGBTw+X7ez+dtzj1zz3PHvM0z9znnCDQazeHDh6Ojo2NiYvQzKDw8PEJDQ8eOHdu3b9/HbVTQ0GACjxBCCCGEUEOkLgd1KWiUAAZ5CiMCiQykCmCNt0xHegUFBS1atJBKpQ8fPrS2tn7W4aB6Ubtt5CQSSVBQUFBQkE6nO378eHR09L59++7fv79+/fr169e7uroKmXz//v1r3vMQIYQQQgghhKphZQtWtkApcBrgOSAEGJFl16trknieX7p0qUajefPNNzF7b8Jq9wS+Kp7n//jjj+jo6F9//fX+/ftCY7NmzUaNGjVmzJjBgwcbbWnYQOATeIQQQgghhFDTMHjw4OTk5OLiYltb27/++qtVq1bPOiJUX+pa8c4wzKuvvrpu3bqsrKxz587NnTu3TZs2BQUFW7ZsGTZsmIuLy5QpUywRJ0IIIYQQQgihapNOnrUAACAASURBVLRs2VKr1fr5+SUmJmL23rTV9Ql8tS5fvrx3794vv/xSWPGuAe4Dj0/gEUIIIYQQQgg1LrWbA/9ElNLz58/v3bt37969+vXqEUIIIYQQQgghVEeWSeAppWfPnt2zZ8/evXv1M+EdHBxGjhw5duxYiwyBEEIIIYQQQgg9z+qUwPM8f/r0aeF5+4MHD4RGhUIREhIyduzYgIAAiQS3eUAIIYQQQgghhCzAnASe5/lTp07t2bMnOjr64cOHQqOTk9OoUaPGjh3bYFeeRwghhBBCCCGEGq9aJPAcx504cWLv3r2//vprbm6u0Ojs7Dx69OiwsLABAwaIRBaeUY8QQgghhBB6DvGU1/FajnKEMCxhRURECHnWQSH07Jmack+bNm3fvn35+fnCS1dX19DQ0LCwsFdffZVl2XoLDyGEEEIIIfQcKdeWV2jL1Jyawv+2smIIKxNJ7SUOYgan6KLnmqkJ/ObNm4V/EFL3V155hWXZvLy8vXv3PvG9r732mvkBIoQQQgghhJ4DGk5dUFmg5TU5ygcsYUSMhCUMAOUor+HUFMBN5m4rtnO0csKn8ei5Zeo+8HX5S4L7wCOEEEIIIYRqoNQpC1R5D5TZEkZiJ7GX/PNJO0/5Sp2qTFvqKnOTsBIXaXOW1KkKOD4+fsSIEQDw4osvXrly5XHdAgMDDx8+DABbtmx588036zJiba1evXrOnDlr16794IMPnua4qIHDWesIIYQQQgihZ0nNqfNVeTnKbFuRrZ3EvmoHhjAysY2VSFpUWaDmNQDQXOpukefwKSkpN27c6NChQ9VDRUVFx44dq/sQCFkQY2I/Wgf1egEIIYQQQgihxosCzVfl5iizHSTyarN3PZYwCmsnCSPRcJpiTVHdh2YYBgD27NlT7dGYmBidTif0QaiBwH8dEUIIIYQQQs9MibqYo5xUJJWJZE/sTIAoJI65ypwyTZmW19Zx6B49ekgkkscl8MJqX3379q3jKAhZECbwCCGEEEIIoWeDUlqmLXuofGAvrunZuyGGYWzEtg+U2WXa0jqOrlAoAgIChCp6o0MlJSVHjhzx8/Nr27ZtHUdByIJMTeAvmubSpUv379/HsnmEEEIIIYTQE6m5Sp5yYsaKqc2idDLWBgBUWmXdAwgLC4PqquhjY2M1Gs3YsWON2pcuXUoI2bZtm1G7p6cnIYTjOH3L3bt3IyIiOnXqJJPJvLy8goKCTp06ZfSumJiYkJAQDw8PJyenPn36bNu2jef5GqJNS0t7/fXXfX19bWxsXnjhhTlz5mRnZ9fqelFjZ+oidi+99JLpJ3V3d58xY8a8efNwgweEEEIIIYTQ42h4TU5tHr8LGIYREZGO6njK1SrzryokJESool+yZIlhu1A/P2bMmE8//dSM06ampvbu3bu0tLRZs2adO3fOyclJSEhITEyMj48fNmyY0OeDDz5Yv349ALRq1crOzu78+fNnz579/ffft2/fXu05f/rpp2nTpimVSicnJ29v7/T09NWrV//444/x8fG1StZQo1YvJfQPHjxYsGDB0KFDCwsL6+P8CCGEEEIIoSaAoxwAMKTWWQnLiPRvrwu5XO7v729URV9eXn7w4MEuXbq0a9fOvNPOnz+/tLR08eLFOTk5Fy5cuHfvXlRUFKX0448/FjrExMSsX7++ZcuWycnJGRkZ169fT0lJcXd3FxLyqifMysp65513AGDnzp0FBQVXrlwpKiqaMWNGXl7euHHjVCqVeXGiRsfUJ/C//fabKd20Wu3169djY2NPnTp16NChuXPnfvfdd3UIr76wLKtQKADAxsbmWceCEEIIIYTQc0qYe0ug1nW7whssMnE3LCwsISHB8CF8fHx8ZWWlUF1vnsuXLwPA22+/LRKJAIAQ8v777+fn51tZWQkdFi1aBACbN2/u1q2b0NK5c+fly5e/8cYbCQkJQUFBRif8+OOPVSrVl19+OX78eKFFKpWuW7fuxo0bBw8e3Ldv38SJE82OFjUipibwQ4YMMbHniBEj5syZs3Tp0uXLl2/btm3WrFk+Pj7mhldf2rdvX1RkgZ0nEEIIIYQQQmZjGRYAOFrTxO9q8ZQDALZu9fOCUaNGvfPOO4YJvL5+3uxztmvX7v79++++++4nn3wipOhSqfTzzz8XjpaWlqamprZo0SIwMNDwXePHj+/WrZutrW3VE545c4YQUjVLDw0NPXjw4OnTpzGBf07USwk9ISQyMtLHx4fn+W+++aY+hkAIIYQQQgg1dhJG4iZz1/DqWr2Lp7yW1zKEtUgCL5fLDdeiV6lUCQkJPj4+L7zwgtnn3LBhQ9u2bRMSErp37+7i4hISErJ27drMzEzhaHp6OgC0adPG6F3W1tZdunSpuu69Vqu9c+cOpdTJyYn807Rp0wAAZy4/P0x9Al9bDMO8/fbbH3zwQdUtGRBCCCGEEEIIAKxZKSFEw6l5yps+E17NVVIAmUhqqTAMq+gTExOVSmVt6+fV6n/8BtGpU6fU1NT9+/fHx8efOHHiwIEDBw4cmDNnzocffvj5559XVlYCgFgsNvHkOp2O4zhra+uIiIhqO3Tq1KlW0aLGq74SeABo3749/P3zEkIIIYQQQggZIYTYiGx5oBXacjuJSWvRU0rLNGVuMndbsZ2lwggJCRGLxUICL9TPV91Argbl5eX5+flGjRKJZNy4cePGjQOAnJwcIYFftWqVv7+/UFSfkZFh9BadTnf69GmpVNqzZ0/DdqlU6unpmZWVtWzZMnv72q3Yj5qYeimhFzg6OgJAQUFB/Q2BEEIIIYQQatTkVgp3mxYVunI1Z1Ihfam2mANOJpJZsdaWikGhUAhr0V+5ciUuLq5jx46Pe6Yt7JNtlK5HR0cbvszMzPT19R0wYIC+xc3Nbdq0acL6c+np6S4uLh4eHhkZGX/88YfhG48dOzZgwIDly5dXHdfPz6/qQACwePHi3r17nzx50uRrRY1bPSbwWVlZUN3UDoQQQgghhBASsIR1sm7WXOZerC5Sc5U19KRASzXFSp3K09bL0bqZZcMQauYjIiLKyspqqJ8XJqhv2bJFP+08KSlpwYIFLPu/2fheXl6ZmZknTpzYtGmTvjEjI+P48eMA0L17dwCIjIwEgKlTp167dk3o8ODBg1mzZsFjFs9btmwZy7KzZ89OSEgQWiilW7dujYqKyszMfPnll+tw6agxqccE/syZMwBg9t6JCCGEEEIIoeeBjchWYeXoKnN7pCkq05Tw1S1Kr+E1RZUFFTplCxsPZ2sXiyxfZ2jUqFFisfjcuXNQY/38yJEjPT09b9y44e3tPXz48J49e/bu3dvPzy8gIEDfh2GYlStXAkBERISXl1ffvn19fHy8vb1v3bo1derUvn37AsCUKVMmTJhw8+ZNX1/f9u3bd+/evU2bNlevXg0LCwsPD686rq+v78qVK8vKyoKCgjw8PHr37t2iRYu33npLKpXGxMTod6dDTV59JfC5ubmbN28GAKP5GwghhBBCCCFkxF7i4Cx1cZd5lOsq8lQPCysLy7VlSm2FUltRqi7JV+UVVhY4WTu3tG3lZtNCwlo+XxWq6AGgXbt2vr6+NXQ7ceLEpEmTbG1tjx49WlJSEhkZuX///v79+48dO1YosAeA6dOnx8XFCVn9xYsXS0tLBw0atHv37m+//VboQAj5+eeff/zxxyFDhpSVld27d69Hjx4//PDDL7/88rihZ82adebMmbCwMBsbm5SUFIVC8X//93/Xr1/HhOu5QiilFj/pxYsXx48ff+vWLVdX11u3blW7kyFCCCGEEEIIGeIpV6IpKdeWC9u85ygfAICbzB0AxIzEXuJgK8bMAj3XTF2F3rAmpAZarfb69et5eXnCy+XLl2P2jhBCCCGEEDIFQ1iFlaNcotDwai2vlVspCBCWYa0YKxFj6qZrCDVhpj6B11eDmEihUGzdunX06NFmRYUQQgghhBBCCKF/MPUJvDAh5IkIIU5OTn5+fhMnTnR3d69DYAghhBBCCCGEEPqfepkD31ikp6eXlZU96ygQQug5JZPJOnbsaErPlJQUrVZb3/EghBCqlqOjY+vWrZ91FAghgHrdRq6qO3fuGO6FiBBCCCGEEEIIIRM91QT+0qVLERERT3NEhBBCCCGEEEKoaXiqCTxCCCGEEEIIIYTMgwk8QgghhBBCCCHUCGACjxBCCCGEEGqQeB6e4yW3EarK1G3kEEIIIYQQQqi+Ua2WlpdRlQp02v9umMUwjJU1SKWMrR0Q8qwDROhZwgQeIYQQQggh9OxRjqPFj/iKcu5BNgAAwxCGAQDK6TgKrJs7LSkmcgVja/eMA0Xo2cESeoQQQgghhNAzRrVa7uED7c0bfG4OsbdnXVxZ1+aMswvj7MK6ujFOzWjxI939e3xhAVeQD1CnuvqFCxcSE8ydO9dSV/cMxcfHC5fTpUuXGroFBgYK3bZu3frUYjPF9OnTCSExMTHPOpCGAp/Ao6bvyJEj8fHxWVlZDx8+bNasmYeHx6uvvhoaGioWi6vtf+zYscTExLS0tIKCAkdHRy8vr759+44bN65qf39//+LiYqNGhULRsmXL/v37T5gwQSSq5q+Yiee/c+fOuHHjZDLZyZMn63D1CCHUOOC9GqHnGdXpuNwc7v49Ym3NOMiB+edTRkKIRAISCSOz4fIesi7NOQC2mbPZwykUilatWulf8jyflZUFAJ6enizLGnYze4gGKCUl5caNGx06dKh6qKio6NixY08/JGQGTOBRU6ZUKt97772UlBQAsLOza9GiRUFBwfnz58+fP//TTz999dVXXl5ehv0fPXq0YMGCixcvCi8VCkVeXt7Dhw///PPPX375Zd26da1bt646SrNmzSQSifDPHMfl5+dfvnz58uXLiYmJP/zwg/6Q2ec3xf379zds2HDx4sWKigp3d/dhw4aFh4dX/RZr2W6G4uLi/v3vf7/77rtTp041OnTlypVt27bdunWruLjYy8urV69eU6ZMsbW1fdypoqKiDh8+fOTIkdp8AAihRgzv1fXazVDd79XXrl377rvvMjIy8vLyPDw8OnXq9NZbb7m7u5v1eSD0N0r5gjzu/j0ikzEO8ho6EomEbebC5eWyLsBbWTF29uYNOG/evHnz5ulfVlRUCP+2X7p0ycnJybxzNnAMw/A8v2fPniVLllQ9GhMTo9PphD5PPzZUK5jAo6ZsxYoVKSkpbdq0WbRoUdeuXYXG27dvr1279uzZswsXLvz+++/1X9oqKysjIiJu377t7Ow8e/bs7t27Ozo6chyXnJz85Zdfpqamzp8/f9u2bVKp1GiUNWvWdOzYUf9Sq9UmJiZGRUWlp6dv3bp1+vTpdTz/E6Wnp7///vuFhYUSicTJySkzM3Pjxo3nz5//6quvDL/JWbaboYyMjKioqGoPbdu27csvvwQAR0dHV1fXO3fupKWlxcbGbt++3dXVtWr/0tLSQ4cOEVyfBqHnCd6rG8u9+ueff167di3P8wqFwsvL6969e7du3Tp48ODy5csHDBhQ2w8EIT2qrKBqNZGIGXuHJ/dmGEah4B4+AIZhZDZg8MAc1aBHjx6XLl16XAK/d+9eAOjbt++pU6eeemiodnAOPGqy8vPzExMTJRLJunXr9N8IAaBt27arV69u06bNjRs3Lly4oG/ftWvX7du3vb29t23b5u/v7+joCAAsy/bo0ePrr7/28vK6c+fOzp07nziuWCweOXLkm2++CQCHDx+2+PmNUErnzZtXWFg4bty4Y8eOxcbG7tmzx9nZOTk5eceOHfXUzZBarV6wYIFKpap66MaNG1999ZVEIvniiy8OHTq0Z8+eQ4cODR06tLCwcNmyZUaddTrdxYsXZ86cWVJSUtsPASHUeOG9urHcq7Ozszds2EApXbJkyeHDh3/++efff/89PDxcrVZHRkbm5eXV9jNBSI8rfsTlPCB2DiauME/EEiKzAZ7ny8vqO7aGJjc3NyEhITc3t7ZvVCgUAQEBQhW90aGSkpIjR474+fm1bdvWQmE2LGZ/aA0TJvCoybp+/ToAtG/f3s3NzeiQRCIRnhXob2EVFRXbt28HgHnz5rm4uBj1t7W1nTJlCgD8/vvvJo7eu3dvAMjOztZqtfVxfr0///zz/v37L7zwwpw5c6ysrACgdevW//nPfwBg586d9O+tUy3bzdDKlStv377dpk2bqofOnj3L83xwcPCrr76qv9JFixYxDJOcnKxWq/U9o6Ki+vbtO23aNKGGFiH0/MB7dWO5V8fExGg0mmHDho0aNUpokUgkM2bMePnll0tLS48fP17bzwQhAdVqQKcjEjExmMnyRIzMhst5QJXK+gsMAJYuXUoI2bZtm1G7p6cnIYTjOOHl1q1bCSE7duy4fPny8OHD5XK5h4fHa6+9du3aNQA4cOBAcHBw8+bNXV1dR48effv2baOzHTp0KDQ0tE2bNnK5vF+/fosWLVL+87o2bdpECImOjt65c2fr1q2DgoL++OMPMy4nLCwMAPbs2WPUHhsbq9Foxo4dW+270tLSXn/9dV9fXxsbG+G2k52dbdTn7t27ERERnTp1kslkXl5eQUFBVZ/kP/EyAYDn+S+++GLgwIEKhcLX1/edd955XNb9xKge96HV8Q+rIcAEHjVZlZWVAFBYWKi/vRqaNGnS7t27g4ODhZdxcXGlpaVdunTp3r17tWcbPHjwzJkzhw0bJnzJeyKdTgcAlFLhi5TFz68XFxcHAAEBAYzBci9+fn5OTk6FhYX6b72W7aaXmJgYExMTGhqq/9pnqLS0FAAk//zvsUgkYllWp9MZ3rW9vb2Dg4NHjRo1dOjQWl0+Qqixw3t1Y7lX37lzBwCqlsr36tULDH5kQajWKtUAABKr2r1LJCKsiGrU0GDmbJ87dy4gIKBLly5r1qzp06fP7t27Bw4cGBkZGR4e3q1bt08//fSll17av39/UFCQRqPRv2v+/PlDhw7dt29feXm5h4fHuXPnVqxY0bVr15s3bxqd//z58+Hh4QzD+Pn5Vf3F0xQhISESiaRqAi/Uz48ZM6bqW3766Sc/P7/t27fn5OR4e3vfvXt39erV3bt3T0pK0vdJTU198cUXN23alJ+f37lzZ57nExIS+vfvn5iYWKvLVCqVgYGBs2fPPn78uEQiKSoq+vbbb/v06SPcfGobVc0fmnl/WA0EJvCoyerUqRPDMDk5OYsXL87JyTE6am9v36ZNG2fn/65fKvzA9vLLLz/ubDY2NpMmTZo0aVLN6wPpCSt5tmzZUvhKZPHz6wmLphp91ySECC0PHjyoj276zitWrGjbtu3s2bOrjc3f359l2bi4uLS0NKGF47ivvvpKq9X6+fkZruw6ZsyYJUuWLFmyZNasWbW6fIRQY4f3amgk9+oXX3xx4sSJPj4+Rm8X8n87O9yXG5mJclou5wGwtV+ZS8QCAFT3298zsXHjxtjY2BUrVrzxxhtCQpifn//pp5+ePn06MjJy6tSpcXFxXbp0uXHjhn6NzGPHjq1cudLBwSE2NjYvL+/q1av5+fnBwcE3b96cMWOG0fm/+OKLiRMnPnjwICkpqU+fPmZEKJfL/f39jaroy8vLDx482KVLl3bt2hn1z8rKeueddwBg586dBQUFV65cKSoqmjFjRl5e3rhx4/RTcubPn19aWircwy9cuHDv3r2oqChK6ccff1yry1y1atXvv//u6el5+vTp3Nzc7OzsP//8U6fTHTp0yIyoav7QzPjDajgwgUdNloeHx+TJkwHgyJEjI0eODA8P37hxY3JysvC8xcj9+/cBoEWLFnUclOf5Bw8ebN68+aeffgIAfZ2hpc5fVUFBAVS3zYnQIhy1eDcA0Gg0CxYs4Hl+xYoVQgFnVZ06dYqKiiKETJ48efLkyf/3f/8XFBS0Y8eOXr16ff7552ZcLEKo6cF7NTSSe3V4ePisWbOMZhYUFRUJmzP37dv3iR8CQtWjFAAIU+usRFjyljaYJ/DDhg0TClIEQrnK+PHjO3fuLLQQQoQqmMzMTKFl6dKlAPDZZ5+NGDFCaJHL5bt27XJ1df3tt9/OnDljeH43N7fNmzfb25u58L6gahV9fHx8ZWWl0G7k448/VqlUUVFR48ePF1qkUum6deuGDBmSkZGxb98+ofHy5csA8PbbbwtbchJC3n///Tlz5gQGBpp+mRUVFcINZ9euXfpMu0ePHlXX9TAxKsHjPjQz/rAaDvNXoZ89e/bkyZMN15t5ojZt2kRERJg9IkK19f7777dv337Xrl1//fVXampqamrq1q1bpVLpSy+9NGrUqH79+umLD4VpM9Wui/5EwlfPqvr06TNhwoS6n78GlNLCwkIAqHpjcnBwAADhqGW7CVatWpWenv7RRx9VO6NSz9nZ2dnZubS0VJjmCgCEkPbt20tqM88NIdS04b26kd6rb926tWjRoqKiokGDBvXo0aOGngjVhGEBwIxKeMrzBICIGsoq9PrcT2BjYwMARkUrQqOwVRulNDk5WSQSvfHGG4Z9ZDLZxIkT16xZk5ycbPjQODAw8HE/w5lu1KhR77zzjuFa9DXUz585c4YQMnHiRKP20NDQgwcPnj59WjjUrl27+/fvv/vuu5988km3bt0AQCqV6n/+M/Eyb9y4UV5e3r17d6PigldeecXX1/evv/6qbVSCx31otf3DalDMT+C/+OKLL774wsfHZ/LkyRMnTvTw8HjiW7p167Zx40azR0TIDEOGDBkyZEhhYeGff/554cKF8+fP5+bmnjp16tSpUz179oyKihKq/uRyeXZ2tnnrnxvuLQwAYrG4bdu2r7zySnBwsH47tLqc3xSP23fNaJampbodPnz4119/HTJkyMiRI2uI6uLFi++//z7LsjNnzhw8eLCDg8Pt27c3bdq0ffv21NTUDRs2CL/UIoQQ3qvro1v93asfPXr07bffRkdHcxw3YMCATz75pIbzI1QzIhKxbu58aUnttpCllOq0QMh/8/8GoNqZNTVMt8nOzlapVG3btq36S5mwGrzRNHh3d/e6BymXywMCAhISEm7cuNGhQweVSpWQkODj4/PCCy8Y9dRqtXfu3KGUOjk5VXsq/W+FGzZsGDlyZEJCQkJCgrOzc+/evQcOHDhq1KhWrVqZfpnp6ekAUDUMAOjQoYM+gTc9KsHjPrTa/mE1KOZ/e+7UqVNqaurVq1fnz5+/cOHCAQMGTJ48ecyYMTgJCjVATk5Ow4YNGzZsGAAUFRWlpqZ+9dVXf/7555o1az766CMAaNmy5bVr1+7du1fDSZKSkkpLS9u3b2/0c5XR3sLVqsv5a0AIcXR0zMvLKy0tNfqrJ3wBFSaOWrZbdnb2J5984unpuXjx4prDi4qK0mg0y5YtCwoKElp8fX3Xrl07ZcqUpKSkhISEmr9TIoSeN3ivbhT36gMHDnzxxRfl5eUuLi7vvffe8OHDTfwcEKoWkUqBEFqpAjt7E7eRAwBeowaeMlKp6W+xIMOddMxWw6Nd4Vczo+XTrK2t6z4oAISFhSUkJAgP4RMTE5VKZbX18zqdjuM4a2vrxxVQd+rUSf8Pqamp+/fvj4+PP3HixIEDBw4cODBnzpwPP/zw888/N/Eya6j3Ydn//UZjelQCS31oDYr5Cfy1a9euXLny888/79y58969e0ePHj169Oi7774bEhIyefLkwMBAfLaGnq3Zs2ffv39/9erVRt+xHB0dX3nllTZt2owcOTIuLm7BggUSicTLywsADOtzjHAcN3v27IqKik2bNpn+pU2v/s7v7Oycl5dXXFxsNGmzuLgY/v4aZ9luly5dqqiosLGxMbx1Cpt87Nmz5/jx482aNfviiy+Ki4vv3LkjEokCAgIMTyUSiQIDA9PS0pKSkjCBRwjhvRoaz71aqVTOnz//7Nmz9vb2H374YVhYGM6HQhbAsMRaChzPq5SMzMbUd5WXsW7uxMa2PiN7zMjl5fn5+XU/j6enp1QqzcrK0mq1Rs9+hYfSHTp0qPsoVYWEhIjFYiGBF+rnq91ATiqVenp6ZmVlLVu27IkT7yUSybhx48aNGwcAOTk5QgK/atUqf3//wMBAUy7T29sbAPRLaRoSHs6bEVVTVadF7Lp06RIVFXX37t2TJ09GREQ4OTmpVKpdu3YFBQW1aNFi5syZVZfyR+ipEYvFt2/fTk1Nrfaos7Mzy7I8zws7GAUEBLAse/LkyWpvHACQnJxcUVEhkUh8fX3NCKb+zu/p6QkAV65cMWoXvoDqv19athsA5OXlpRoQCpby8/NTU1Nv3boFAMKcVZFIVPW3vCb5ayhCyDx4r4ZGcq/WarVz5sw5e/Zsnz599uzZ869//Quzd2QpjFzOurlDeZmJS8rzFeVUoyUSK2J6wm8WYaKKUboeHR1tqZN37dpVq9X++OOPhu0qlernn3+GKjtNWIpCoRDWor9y5UpcXFzHjh2Nnlrr+fn5QXXXu3jx4t69e588eRIAMjMzfX19DTeYdHNzmzZtmrDCXHp6uomX2a5dOwcHh+Tk5LNnzxp2S0pKunTpUm2jatossAo9IaRfv34bN27MycmJi4ubOHGijY1NXl7eunXrevTo0bFjx08//fTu3bt1HwihWhFuRps3b662zOns2bMcx7m5uQm/3rVs2XLUqFGU0s8++0x4gmGI47g1a9YAwKuvvmre95X6O79Q8SjshKSXlpaWk5PTtm1b/VQiC3YbMWJEUhVTpkwBgHfffTcpKenAgQMAYG9v7+7uXllZKaxNaujcuXMA8MRaVoTQ8wDv1Y3lXh0bG/vnn3/26dNnzZo1j5t9ipB5iMSK2DswLs35okLKVbMDhSGqUtKyUta9BevUrL4DEyZpb9myRT+zOikpacGCBYZF3XURGRkJAPPmzTt8+LDQUlJSMmHChJycHH9/f2EV9Pog1MxHRESUlZVVWz8vWLZsGcuys2fPTkhIEFoopVu3bo2KisrMzBR23PTy8srMc28YKQAAIABJREFUzDxx4sSmTZv0b8zIyDh+/Dj8nZybcplSqXT+/PkAMGHChPPnzwvdrl69WnWxOlOiatosuY2cWCwW9h3JysrSL+ialpa2ePHi1q1b9+/ff/fu3ZRSC46IUA3GjRvXunXrzMzMN95448yZM8LTGwBQKpW//vqrsDXl66+/ru8/bdo0R0dH4U5x9OjRR48eAQDP89evX58+fXp6erpcLp83b57Z8dTT+Xv16uXu7n7p0iX9NhtlZWXCZFHDO7Jlu5lIWNH03//+d0pKitCiVqu//vrrkydPOjg4+Pv71/aECKGmB+/VjeVevXv3bgB47733LJW6IGSIlSuITMY4u/AFBVSlrLYP5Xi+rIQvLmbdWjBOzaD+a0BGjhzp6el548YNb2/v4cOH9+zZs3fv3n5+fkZTTszm7+8/e/bswsLCwMBAT0/Prl27Ojs7x8TEeHt7f/311xYZolqjRo0Si8XCj3TV1s8LfH19V65cWVZWFhQU5OHh0bt37xYtWrz11ltSqTQmJkZY3Z1hmJUrVwJARESEl5dX3759fXx8vL29b926NXXqVGGDSRMv84MPPvD39797965wi2vdurWvr29ubq7hXvEmRtW0WXKaekVFRWJiYnR0dHx8fFlZmdBoa2vr5OQklNmfPHly48aNMTExz+2MBfQ0WVtbf/bZZ3PmzElPTxf+5js5OWm12tLSUgBgGGbSpEmG9yxHR8dvv/12zpw5GRkZwpczR0fHsrIyYTlfV1fXZcuWOTo6mh2PeedXqVSjR4+u9oTr1q3z8vIihKxcuXLGjBlr1qzZu3dv8+bN//rrr8rKyhEjRhi+0bLdTDR58uSrV68eO3Zs6tSpzs7OdnZ29+/f12g0Uql02bJl+smcCKHnGd6rG8W9Wq1W3759GwAmTZpU7er348eP//DDD2s7NEL/QwjbzIV/VAQAXM4DUlEO1lIikQBhgFLgOapW00oV8JRt4cE2cyFS6VMISqFQnDhx4qOPPjp+/PjRo0dbtmwZGRk5d+7cVatW2draPm4niFpZtWpVQEDAxo0bU1JSMjIyevTo0b9//8WLFwt7mNUToYo+MTGxXbt2NU8ImjVrVr9+/T7//PMrV66kpKS0atUqNDR0wYIFhlN1pk+f7uXltW7durS0tIsXL7q4uAwaNOidd94x3JrOlMuUyWQHDx5cu3ZtbGzs5cuX1Wr1mDFjVqxYkZWV9eDBA8P15E2JqgkjdX8kXlJSEhcXFx0d/dtvv6lUKqHRzs5uxIgRYWFhw4YNs7KyOnny5JdffinMVYiIiGggm8mlp6frf2hATRXHcQcOHDh27Fh2dvbDhw+FWkFvb+9//etfwmJFVfvHx8cfOXLk5s2bJSUlzZo18/T09PPz+9e//lX1Jz1/f//i4uIff/zR9Gpw089/584dYS2Qx9m9e7d+X9979+59+eWXycnJSqXS3d09JCSk2u9Ylu1maMOGDT/88MO77747depUo0PHjx//9ddfMzIyiouLvby8fH1933zzzcdl70VFRYGBgXK5/MiRIzUMh5oGmUxm4t+dlJQUow20UBOD92pDDfBe/cTLnDhx4qxZs2rogBo1R0fH1q1bP52xqLqSf1RE1WoA4HIe6NtZN3cghLG1Iw5y0mjLQDQaTVpampOTk9EKlKgBarB/WOYn8AUFBTExMdHR0b///rt+kwM7O7vg4OCwsLChQ4dWXadq+fLlS5YscXFxERZBfeYwgUcIoWcIE3iEEGoUnmYCL6BaLVUpqUYDPA8ECCsiVlZEKgPGkvN/EWqMzC+hb968Off3QpH29vb6vL2GiQeDBw9esmQJTp1CCCGEEEIIPQ4Ri4nY4VlH0XAVFRUJK3Q8kYeHx/MwLfy5Yn4Cz3Gcvb39yJEjw8LChgwZYsq/GXZ2djNnztSvoYoQQgghhBBCqFbWrFnzySefmNIzKSlJ2HcNNRnml9DHxsYGBgY26l90sIQeIYSeISyhRwihRuHpl9AjhB7H/CfwwcHBFowDIYQQQgghhBBCNajTOhBpaWnBwcEuLi7iGsXFxVkqXIQQQgghhBBC6Plk/hP427dvv/TSSxUVFU/s6ePjY/YoCCGEEEIIIYQQgrok8MuWLauoqGjfvv28efPatWtXw9ryLVu2NHsUhBBCCCGEEEIIQV0S+DNnzigUitOnTzdr1syCAT0dpaWlBw8ezMnJsbOze/HFF591OAghhBBCCCGE0BOYn8Dfv39/1KhRjTF7B4Ds7Oxx48YBwMCBAz///PNnHQ5CCCGEEELov7RqTqvmeB3P8xQAGJaIxKzYmmVFdVrAC6EmwPwE3sXFpYay+cZCLpfj1ogIIdTAYakUQgg9J9RKXWWFluf40kKV0SF7J6nYirW2lYjEmMaj55f5//YHBQWdOXNGp9NZMBqEEEIIIYTQc4jytKJYrSxVF+dVKEs11rYSW4W1naPUTmFt62BlLROXP6osfFBeVqjSqOqagCxcuJCYYO7cuRa5tGcrPj5euJwuXbrU0C0wMFDotnXrVssG0Lt3b0LI3bt3a+62evVqQsi6dessO3rTY/4T+MWLF+/bt2/OnDlr1661YEAIIYQQQgih5wqltPyRWqflKorVNg5W/yiVJ4QwRCJiJFKRplInPJnneWptIzZ7OIVC0apVK/1LnuezsrIAwNPT07DEWKFQmD1EA5SSknLjxo0OHTpUPVRUVHTs2LGnHxIyg/kJvIeHx5EjR8aMGXP27NmZM2d26tTJ3d2dYap5pO/k5FSHCBFCCCGEEEJNmbJEo9NyylKNzMGKkMd2k1iLWBFbVqQihIjEjEhi5nzeefPmzZs3T/+yoqLC1tYWAC5dutRUMxeGYXie37Nnz5IlS6oejYmJ0el0Qp+nH1u9KikpkcvlPj4+f/3117OOxTLMT+Dd3NwAoLKyMj09feLEiTX0pJSaPQpCCCGEEEKoCdNpOE2lrvxRpU2N2buAFRFrW0lJgZIwxMFZ+lQCbAp69Ohx6dKlxyXwe/fuBYC+ffueOnXqqYeGasf8OfAPHz58+PBhcXGxBaNBCCGEEEIIPVdU5drSQpWVjZgwT0rfAQBALGFFYpbneLVSW9+xNTS5ubkJCQm5ubm1faNCoQgICBCq6I0OlZSUHDlyxM/Pr23bthYKE9Uj8xP4WyazYLgIIYQQQgihJoPneJ2GYxhGXJt6eCupqLRQpank6i8wAFi6dCkhZNu2bUbtnp6ehBCO++/oW7duJYTs2LHj8uXLw4cPl8vlHh4er7322rVr1wDgwIEDwcHBzZs3d3V1HT169O3bt43OdujQodDQ0DZt2sjl8n79+i1atEipVBp22LRpEyEkOjp6586drVu3DgoK+uOPP8y4nLCwMADYs2ePUXtsbKxGoxk7dqxh4/fff08ImTRpklHnffv2EUL8/f1Nj19AKd2xY8fIkSOdnZ3btm07duzYP//8s+aA1Wr1N99806tXr+bNm0ulUm9v7/Hjx1+4cMGo2927dyMiIjp16iSTyby8vIKCgvR1BKNHj5bL5QBw9epVQkiPHj1qHrFRMD+Bb2syC4aLEEIIIYQQajK0ag4AxFa1y0pYMUMI0Wm4hjNX99y5cwEBAV26dFmzZk2fPn127949cODAyMjI8PDwbt26ffrppy+99NL+/fuDgoI0Go3+XfPnzx86dOi+ffvKy8s9PDzOnTu3YsWKrl273rx50+j858+fDw8PZxjGz89PmMtcWyEhIRKJpGoCL9TPjxkzxrBx1KhRYrE4NjZWrVYbtu/YsQMAwsPDaxt/ZGTkpEmTjhw54ujomJWVFR0d/corr2zevPlx0VJKJ0+ePH369AsXLigUis6dOxcVFf3yyy/9+vU7c+aMvltqauqLL764adOm/Pz8zp078zyfkJDQv3//xMREAAgODp4+fToAODk5zZw5c8KECbX8zBok+lxKTU0VLn/06NHPOhaEEEIIIYSeU8oydebV/IcZJUU55bX6X/aNoqKcck7H1T2G8vJyITUoKCgwbBemi//www9G/T08PABAp9MJL7ds2QIALMuePXtW32fgwIEAYGVldfXqVaGF53lhI7czZ84ILUePHgUAuVweGxsrtDx69Cg4OBgAhg4dqj/VN998I5w/PDy8pKSktlcXFxenP+Hw4cMBIC0tTX+0rKzM2tq6S5culNIpU6YAwJYtW4RDQmd9bJTSkpISa2trGxubsrIy0+Pv1auX8PEuWrRI+NAqKiref/99AJBKpffu3RO6rVq1CgDWrl0rvBSqDLy8vG7evCm0aDSaOXPmAMDkyZP1Jx8xYgQALF68WKvVCh9yVFQUAPTo0UPoIMz49vHxqe3n1mCZ/wRej+f5c+fO/fTTTx9//PGCBQu+//573B8eIYQQQggh9ESUpwBQ3U5WT0IAABrOounDhg3TZ6oAMGDAAAAYP358586dhRZCyKuvvgoAmZmZQsvSpUsB4LPPPhOyUACQy+W7du1ydXX97bffDJ8zA4Cbm9vmzZvt7e3rEmTVKvr4+PjKykqh3ci4cePg7+fzgujo6MrKytDQUGHR/lrFHxAQsHz5cmGXPplMtn79+uHDh6tUqtWrV1cbam5u7oABAyIjI729vYUWsVgsPE43fLx/+fJlAHj77bdFIhEAEELef//9OXPmBAYG1vbDaSzqmsAfPHiwa9euvXv3njx5cmRkZFRU1NSpU/v27dulS5dDhw5ZJESEEEIIIYRQkyQsXGdGIbzwlieuWv/U6BN1gY2NDQD4+PhUbRS2aqOUJicni0SiN954w7CPTCYTdvhKTk42bA8MDLSysqpjkEJhvGECX239vEAouY+JidFq/7tYoGH9fG3jf+utt4zOP2PGDPg7A68qNDT02LFjr7/+ur6F47j4+Hijbu3atQOAd99999KlS0KLVCr9/PPPP/nkk2pP2wTUKYFfv3790KFDhS31mjVr9tJLL/Xq1cvZ2RkAUlNThwwZ8tVXX1kmTIQQQgghhFCTw7KMvZOU52r9JJ3T8YQQhrVAQbFFiMViExsF2dnZKpWqZcuWEonE6JCwiJjRNHJ3d/e6BymXyw3XolepVAkJCT4+Pi+88EK1nQMDA4uLi4VS+ZycnGPHjrVo0WLQoEFmxN++fXujbh07dqzazZBGo9m3b9+sWbOCg4N9fX3t7OyEnN/Qhg0b2rZtm5CQ0L17dxcXl5CQkLVr1+prHJok8/+NT01NnT9/PgAMGjTo/Pnz+fn5Fy5cOHv2bF5eXlJSkjDrY+7cuenp6RYLFiGEEEIIIdSEiCQMAGg1tVtPntfxlFJWzDyTJ/BG67qZh3989b9QDW641h0AWFtb131Q+GcVfWJiolKprLZ+XmBYRb9r1y6e5ydNmsQwjBnxV0UpBQCpVFrt0WvXrnXo0CE0NPTbb78tLS3t06dPZGTkgQMHjLp16tQpNTX1l19+CQ8Pl8lkBw4c+PDDD729vefOnVvz6I2X+Qn8unXrKisrX3755cTExJ49exoe8vPz++2333r27KlSqdasWVPnIBFCCCGEEEJNEMMyrJjhOarT1OIhfKVKa+8klViL6i+wxykvL8/Pz6/7eTw9PaVSaVZWlr5AXU94KN2hQ4e6j1JVSEiIvopeyMyNNpAzNHLkSCsrq/379+t0up9//hkAJk+ebF78aWlpRt2EZcUfd5lTp07NzMz86KOP8vPzT5w4sWnTpjlz5girABqRSCTjxo3btm1bZmbmgwcPvvnmG6lUumrVqoMHD9b0QTRa5ifwKSkpALBkyZKqVRMAIJFIPvroIwC4cuWK2UMg9FzhyjTa/Ar+kYpqdMA3lD1REEII/QNP+QoNX6bGGzVCliK1Eds7SdVKLTXtr5VOw+s0PMMQibR+E3hCCAAYpevR0dGWOnnXrl21Wu2PP/5o2K5SqYRUuXv37hYZyIhCofD3909JSbly5UpcXFzHjh07der0uM4ODg6BgYEFBQWbN29OSkrq3r274Zp8tYpfWEvf0Lp16wCgb9++VcflOO7ChQsikeijjz4yLD04d+6cYbfMzExfX19hvUCBm5vbtGnTxo8fDwBNtRLc/AT+2rVrAPDiiy8+rkPXrl313RBCNaFUfauw4nyW8vTd0uN3yg/fLv39dsXpu5Xp+bSWFWUIIYTqBQUur6LibGZRbGrZoZsVf2SVHLpZ8We2+nq+rlAJPAVM5xEyl9haJLZiOY5Xlevok5az4zleVa62d5JK7SX1XT8vzOXesmVLYWGh0JKUlLRgwQJhKfW6i4yMBIB58+YdPnxYaCkpKZkwYUJOTo6/v7+wZH19EGrmIyIiysrKaqifFwhV9PPmzQOD7d8FtYr/xIkTM2fOFOrqKysrP/jgg4MHD7q6ugr7yRlhWbZFixY6ne78+fP6xpMnT7733ntg8JOKl5dXZmam8Hxe3y0jI+P48ePwz18QioqKar7MRsT8BF5YrO7hw4eP65CTkwMArq6uZg+B0HOBQsWlbOWZLPXtIu3DMs3DMs39Em3GI3V6geriA+WF+1TNCd2ojscHPggh9PSp7z4q2Xu1eN+1ypQ8/kGZ9qFSfbeIu1uiTnlQceF+xdHbZYk3Ky5mq24UVGYXa3PKKu8UqW/nc4VKqsZddREyiY3cSuFqo9PqVKXaGha002q4ilKNnaPU2kb8FOrnR44c6enpeePGDW9v7+HDh/fs2bN3795+fn4BAQEWOb+/v//s2bMLCwsDAwM9PT27du3q7OwcExPj7e399ddfW2SIaglr0QtPs2uonxcIVfQVFRUikWjChAnmxe/g4DB16tR169Y5ODh07tzZwcFh/fr1Dg4OP/zwg7AjXVUzZ84EgAEDBgwaNCgkJKRjx44DBgyYMGGCt7f37du327Zte/XqVYZhVq5cCQARERFeXl59+/b18fHx9va+deuWsDMaANjY2FhZWT148KBfv37CORs78xN4YQZC1YUE9IRDNTyiRwgBgPp+qTqtiFdpGZ4CBQYYSoFylNfxVKXV3C+pvF3AKzW6wgrukUpXqORK1ebstYIQQsgsuryKij/v6wqVhFLKU0IYylAGgKc8p6NUpdEWqTT3SlSXHqhOZJTHpj2KSS0/eKv8SOajxHTV9TxeaTw7FCFUFSHEztHa0c1W5iApL1ZXVmh0Gl5f2MLzvKaSU5aoVWUaO4W11FYstatmDq/FKRSKEydOTJo0ydbW9ujRoyUlJZGRkfv37+/fv//YsWOJJQoAVq1a9dtvvwnz0jMyMnr06LFw4cLLly8Lu6PVE6GKHgDatWvn6+tbc2d7e/uhQ4cCwNChQ11cXIyOmhL/wIEDQ0JCtmzZsn79+rZt2965c6dNmzavv/76xYsXhTNXa9asWd9///2LL7548eLFK1eu+Pj4HDp0aN26dbt37w4NDXVzcxNK66dPnx4XFyf8pHLx4sXS0tJBgwbt3r3722+/Fc4jEok2bNjg7u6elJR069Ytcz6vBoY8sUzlcTZt2hQREcGyrPAhGh2NiYkZO3asTqfbtGnTO++8U+c4Lez69evCZI/Ro0f/+uuvzzoc9DyiPKUqLeh45fn7msxHlOcpBUIYoDylDAAFhjKEoSyIveRWng4AhJGKeR3HOlgzMjFj8zT+u4UQQs85XqUtibsOBZUcoQAAFAhDKE+BAAEAylDgGYbwlAIPlBAglHKUZQgQoBSIvZXtyy2s2jpDg9mqGqEGrrJCW1muoRRKC1UAAAT0aby9k5QVMzI7iUhimQr2p0+j0aSlpTk5ObVo0eJZx1ILYWFhe/fu3b179xPr7dFTYH4CTykNCAj4/fffAeDVV18NCgpq06YNAGRkZMTHx584cQIABg8efPjwYYv8OmVZmMCjZ4ynukcqXW4590ilziiiFRpCGZ5SHigDBBgAjgdCCBBKiMhOxDpIRS0VIicZYQlXWilysmEdq99yAyGEkKVQjpYdu6259YihlKOUYYSJ7oQDSoCwhKEgPCEkPAGGAi+8JMAAAwR4nmcYRtrNTfpSC9JgtqpGqOGjFDQqrVbD8TrKc5QQICwRiRmxlUhs1VhT98aroKCgRYsWUqn04cOHltrKDtWF+VNHCCE//vjj66+/fvjw4ZMnT548edKow+DBg7dv394As3eEnjm+QqvLr+C1Ol7DEZYFhgGeAqUsMDzhCQUGCA9AgAKlvIYHpRYKK1g7CZFJgILZv7shhBAyHfeogrtbRijwFBiGAAVKCFBgAQAIRymlwDIEOI5QAFYEBAghhBIho2dZ4DhKeUoYzN4RqgVCwEomtpKJn3UgDVdRUdGjR49M6enh4WFlZWX2QDzPL126VKPRvPnmm5i9NxB1WvvBzc3t0KFD8fHx3333XXp6ujCpoG3btu3bt586deqIESMsFCRCTQ3leNDxVMkRhjB2Eq5Sx2t0hDAAlFDCMBQYIEA44f85CjxPK7RchUZYxI402soxhBBqRHglp9NpCAAQhgIV1h+hQAilQCgLDM8A4SllWEp5nvIsAZ4CoUApI9Q4sjKRyNUW6+cRQpa1Zs2aTz75xJSeSUlJfn5+5o0yePDg5OTk4uJiW1tbYRV61BBYYPHGoKCgoKAgAOB5nhCCj9wReiLCEMpxVK3lVFqqo4yM4RkR4YHTciwVHsZTIJQwhFJKCMtTwogZ1taKkYmJmMUJ8Agh9BSwtiwVMYwGgHCUZxgCAIQSKjxi5xjCUuCFBsoQQgkwLAEeeACGB2AZRtJGYdXa8VlfB0KoqfnPf/7zn//8p75Hadmy5fnz5/38/NauXduqVav6Hg6ZyJK7LzBYIYaQaYhUxDrZciVq4CgjYUEsFUs4ViGlOqrNKWGUOg4IC5QCEAKUBbFCKvGUi11sQMQQMT5+Rwihp4GxlVq7ynX3iyhlCAAPLKU8UMowhDCE8LxQUw+EBZZSCjyhVEcJwxCWMPbW0hecpV3c8PE7QqiR+u6777777rtnHQUyVtcEvry8/MaNG8XFxTX06dy5c/Pmzes4EEJNCRGzIoU17ygjYpZqKesgoVoqcpMRhqVShsstZ0vUVEt5QhkxETtKJZ5yiacDkeJkMIQQenqIhLV5xavslE6XXQbAU8oQliEAYEWAYxgWQMdToASAFYl1wAMwEhcJ28yGsZUwIlbSRoHZO0IIIcsyP4HX6XQLFy5cu3atTqerueexY8cwgUfICCOTiJrbAQEiFlFCGR4YKzEjFlk52+qsJVxRBag5sBKx9lKxi0zkbMPYYtk8Qgg9bazcSh70gu6RSn27SFuiZoASSnmgoOJAy1MWGCuJyFnGyq11JZW0UsvaWhE7CQOEsbciIqxMRAghZGHmJ/AbNmxYtWqV8M9SqZRlH1vW6+PjY/YoCDVZBFg7CYAd/L2kPGtnRSSsmLVn1TrwtCMMCzZiViICFp/gIITQs8MQkZNM5CQDClTHc6WVVMvzJSq+UkckLOsoFTnZEBEjVmp1j1R8uZpwlFFYEzGDC44ihBCyOPMT+O+//x4AZs+ePX/+fGdnZ8uFhNDzgliJRGKWajhKKZGwwi7BjK0EH7YjhFBDRICIGZGjjGp0ILemLGFErL5InpGJxRKWyq2BBxAzjJUI6+cRQghZnPkJ/K1bt15++WX9Q3iEkDkYQqxF+B0PIYQaDQLESgRQTXpORAwR4S+wCFkA5XlNpYrX6XiOA0IYlhVLrEQSCeB2V+i5Z34CL5FIsDYeIYQQQgghZCmcVqsqK9FWVlJKS/Ny9e32Lq6EMNa2tlI7e0zj0fPM/OVVevTokZKSYsFQEEIIIYQQQs+tyrKy0vzcgruZpQV5lWWl1vb2MrlCJldY29opSx6V5OaoykqLH+boNJo6DrRw4UJigrlz51rkup6t+Ph44XK6dOlSQ7fAwECh29atW59abMgM5j+BX7hw4eDBg7///vs33njDggEhhBBCCCGEnjcVxUXqioqS/Dypnb1EKv3HMYlEAjKe55WlJbrKSkp5W6dmYitrs8dSKBStWrXSv+R5PisrCwA8PT0NV+ZWKBRmD9EApaSk3Lhxo0OHDlUPFRUVHTt27OmHhMxgfgI/cODAL7/88q233jp+/Pjo0aNbtmzJMNU/z6/5xx6EEEIIIYTQ86yyrFRdUVFWkG+ncGRE1WcoDMPI7B00InFJ7kMgxN7ZhRWJzRtu3rx58+bN07+sqKiwtbUFgEuXLjk5OZl3zgaOYRie5/fs2bNkyZKqR2NiYnQ6ndDn6cf2RCUlJXK53MfH56+//nrWsTx75ifwAJCXlwcA27dv3759ew3d6N+7ZCGEEEIIIYSQIU6nVZaVlubn2SoUj8ve9SQyGaV8ycMcViSyd3Z9OhE2AT169Lh06dLjEvi9e/cCQN++fU+dOvXUQ0O1Y/4c+I0bN0ZGRjbMH2kQQgghhBBCjYKqtLQ096G1jS1j2hN1KxtbRiTSaTTaysr6jq2hyc3NTUhIyM3NfXLXf1IoFAEBAUIVvdGhkpKSI0eO+Pn5tW3b1kJhonpkfgL/1VdfAcCUKVOuXbtWUVFR+XiWixYhhBBCCCHUdFCe16iUwBCx0bz3Glnb2pbm5aqVFfUXGAAsXbqUELJt2zajdk9PT0IIx3HCy61btxJCduzYcfny5eHDh8vlcg8Pj9dee+3atWsAcODAgeDg4ObNm7u6uo4ePfr27dtGZzt06FBoaGibNm3kcnm/fv0WLVqkVCoNO2zatIkQEh0dvXPnztatWwcFBf3xxx9mXE5YWBgA7Nmzx6g9NjZWo9GMHTvWsPH7778nhEyaNMmo8759+wgh/v7+pscviImJCQkJ8fDwcHJy6tOnz7Zt24QnwU8caPTo0XK5HACuXr1KCOnRo4e+T1pa2uuvv+7r62tjY/PCCy/MmTMnOzu7th9Lo2N+An/79u2uXbt+9913nTp1kslkVo9nwXARQgghhBBCTYZWXQkAIok1qc3mcKxYAoRoKlXQYObqnjuLsWHNAAAgAElEQVR3LiAgoEuXLmvWrOnTp8/u3bsHDhwYGRkZHh7erVu3Tz/99KWXXtq/f39QUJDGYBX9+fPnDx06dN++feXl5R4eHufOnVuxYkXXrl1v3rxpdP7z58+Hh4czDOPn5+fm5mZGhCEhIRKJpGoCL9TPjxkzxrBx1KhRYrE4NjZWrVYbtu/YsQMAwsPDaxX/Bx98MGrUqAMHDojFYhcXl/Pnz0+ZMmXKlCmmDBQcHDx9+nQAcHJymjlz5oQJE4QOP/30k5+f3/bt23Nycry9ve/evbt69eru3bsnJSWZ8eE0JtRcjo6Ob775ptlvf7ZSU1OFyx89evSzjgUhhBBCCKHnlLK0JCP5woObaYX3s2r1v6yrlwvvZ3E6Xd1jKC8vF1KDgoICw3ZhuvgPP/xg1N/DwwMAdH8PvWXLFgBgWfbs2bP6PgMHDgQAKyurq1evCi08zwtre585c0ZoOXr0KADI5fLY2Fih5dGjR8HBwQAwdOhQ/am++eYb4fzh4eElJSW1vbq4uDj9CYcPHw4AaWlp+qNlZWXW1tZdunShlAoZ9ZYtW4RDQmd9bJTSkpISa2trGxubsrIy0+Pfv38/ALRs2TI5OVlouXr1qru7OwDExcWZMlBxcTEA+Pj46DvcvXtXKpXKZLKdO3cKLUqlcsaMGQDQunVrpVJZ20+pETH/CXzv3r3T09PNfjtCCCGEEELoOUd5HgAYg83bTEUYAOD/rmN/5oYNG9arVy/9ywEDBgDA+PHjO3fuLLQQQl599VUAyMzMFFqWLl0KAJ999tmIESOEFrlcvmvXLldX199+++3MmTOG53dzc9u8ebO9vX1dgqxaRR8fH19ZWSm0Gxk3bhz8/XxeEB0dXVlZGRoaKizab2L8ixYtAoDNmzd369ZNaOncufPy5csBICEhwZSBqvr4449VKlVUVNT48eOFFqlUum7duiFDhmRkZOzbt6/2n02jYX4Cv2TJknPnzgm/6CCEEEIIIYRQbf23cr72lfCE0v+9vQHQJ+oCGxsbAPDx8anaKMz9ppQmJyeLRKI33njDsI9MJps4cSIAJCcnG7YHBgbWfW6yUK9umMBXWz8vEEruY2JitFqt0GJYP29i/KWlpampqS1atAgMDDTsNn78+MuXL8+aNeuJA1XrzJkzhBBhIEOhoaEAcPr0aVM+jUbK/AS+V69e27Ztmzhx4vz588+dO5eTk5P7GBYMFyGEEEIIIdRkEIaxd3E140G6kAYzoto/uq8fYnE1S+hX2yjIzs5WqVQtW7aUSCRGh4TV4I2mkQs153Ukl8sN16JXqVQJCQk+Pj4vvPBCtZ0DAwOLi4uFUvmcnJxjx461aNFi0KBBpscvlGy3adPGqI9Qty/0rHmgqrRa7Z07dyilTk5O5J+mTZsGAIWFhXX5lBo48/eBF9ZO0Gg0K1euXLlyZQ09aYNZWwIhhBBCCCHUcIitrABAp1ZbyWxMfxfP87xOx4rFhJj/PNJsRsutmaeG3bhFIhEAGK51BwDW1tZ1HxQAwsLCEhIShA3hExMTlUpltfXzgnHjxsXFxe3du3fIkCG7du3ieX7SpEkMw5gev7AlWQ0/ZDxxoKp0Oh3HcdbW1hEREdV26NSpU83DNWrmJ/APHz60YBwIIYQQQgih5w0rljAsy2m1vE7HiEzNTbQqJQCILZTT1kp5eXl+fn7dz+Pp6SmVSrOysrRarVF+Kzy77tChQ91HqSokJESool+yZIlQP2+0gZyhkSNHWllZ7d+/f+PGjT///DMATJ48uVbxt2/fHgAyMjKMzqzT6U6fPi2VSnv27FnzQFVJpVJPT8+srKxly5bVcVGAxsj8n6zum8yC4SKEEEIIIYSaEmtbO3sX18qKMhP785xOrVQ6uDa3trGr18CECfZG6Xp0dLSlTt61a1etVvvjjz8atqtUKiGD7d69u0UGMqJQKPz9/VNSUq5cuRIXF9exY8canlc7ODgEBgYWFBRs3rw5KSmpe/fuhmvymRK/i4uLh4dHRkaG0d71x44dGzBggLCUXc0DVcvPzw+q+7NYvHhx7/9n787jpKiu/vGfc6t67559YIAZEFnGKIOKoqIhokHUuKKiYtwes6gxMS7ELV/zqDHJY1yi/kziFpfHuBE1QiIx7sAjgiAukX0b1mGYvffuqrrn90eZyQjDMMwMNDN83q+88qJu36o61R1In773njtu3Jw5czr5bvRGXU/gB3Val29xzTXXlJaW7uzVNWvWnH/++f369QsEAt/4xjfuvvvu7eaZAAAAAADAPs4fjhimaWeymUR8l51FdLKlOa+0nz+S15Xa9bvDXaH95JNPtq6pXrRo0S233GL00H3vuusuIrrpppvefvttt6WlpWXq1Kk1NTUTJ050S9bvCe6c+auuuioWi3Uwf97lloi/6aabaIeqcp2M3+12xRVXLFmyxG3ZsmWLW76ubfG8Dm7kamxsbP3znXfeaRjGjTfe6NaxJyIR+dOf/nTPPfdUV1cfffTRnXsneqUuJvCff/75z372s5tuumnPrW9vbGx8+eWXOwjgm9/85l/+8pdoNNq/f//ly5fffvvtkyZNQg4PAAAAANC7hItL8vsPyCQSqWi0g/xCO3aiqSlcVOLxB/zhPTv8TkRnnnlmRUXFihUrhg8f/p3vfOeoo44aN27cEUcccdJJJ/XI9SdOnHjjjTc2NDRMmjSpoqLisMMOKy0tnTFjxvDhw//whz/0yC3a5dainz9/PnU4f97lTm5PJBKmaU6dOrUL8V9++eVTp05dtWpVVVXVyJEjx4wZc+CBB3755ZdTpkxpm6h3cKNQKOTz+bZs2TJ+/PjrrruOiKqqqn7729/GYrHTTjutvLx83LhxgwYN+v73vx8IBGbMmNH9cv37si4m8EuXLr3vvvvuvffezZs392xARGRZ1gcffHD66afvrH6giJx77rlbt2798Y9/3NTUVF1dvXTp0oEDB86ePfuBBx7o8XgAAAAAAGDPMUxPpKS0YMBAK52KN9ZnU0mRr9VI046TjkXjDQ3homKP3x8uLNoLG8gVFhbOnj374osvDofD7733XktLy1133fX6668ff/zx5513Xo8EcN9997355pvuuvR169aNHTv21ltv/eyzz0aMGNH9i++MO4ueiEaMGFFVVdVx57y8vFNOOYWITjnllH79+m33amfiZ+YXXnjhueeeO/nkk2Ox2MaNG8eOHfvMM89sN1jbwY1M03zkkUcGDhy4aNGi1atXu4033HDDvHnzpkyZEgqFvvjii8LCwmuuuWbZsmXuovo+jLs2hF5dXT1y5EjLsmbMmHHmmWf2YEDXXHPN448/btu2e1hSUrJjlYi333570qRJY8aMWbhwYWtxwvfff//EE08sKyvbsmXLLv86LVu2zF3sMXny5Ndee60H4wcAAAAAgC7Qjp1sac6mUtFttcSsDEMZSrRo7YijiSi/bEAgHPFHemvdsmw2u3z58uLi4u6sMt77pkyZ8sorr0yfPn2X8+17y416tS5WoT/ggAN+85vfTJs27eabb540aVJP7WpARFVVVZdffjkRJZNJt/7Bjp599lkiOv/889tuLTBhwoSysrKtW7d++umne6jkAwAAAAAA7CHKMMNFJXY24wuGrEy67ebwpsfrCQT8oTDvZGuxXsHr9Y4ePTrXUeye+vr6mTNn5ufnn3HGGX3jRr1d17eRu/HGG0tKSn7yk5+MHj36Zz/72eGHHz5w4MB21xsUFxd3/rKtu/nV1tbuLIF3dyY4/vjj2zYy87e+9a3p06evW7cOCTwAAAAAQG9ken2m10dEIlrbjjsUvxcmzPcijY2NTU1NnelZXl7enQXhWuvbb789m81+73vf68Eh2xzeqA/oegJfUVHh/mHVqlU//OEPO+jZ44XuampqiGjHAvVuS7sb1L///vt//OMfWw+j0WjPhgQAAAAAAD2IWRmeXjzevuf87ne/u/vuuzvTc9GiRe6Oa13w7W9/e/Hixc3NzeFw2C0Ov4fstRv1DV1P4HO1wbuIuCl6UVHRdi+5Q/3tJvDr1q37y1/+shfCAwAAAAAA2HN++ctf/vKXv9zTdxkyZMiCBQuOOOKIBx988IADDugDN+obup7AtxYAzJWdTaTBTnIAAAAAAADd8dRTTz311FN96UZ9Q9cT+GHDhvVgHJ3HzP3799+0aVNjY2NBQUHblxobG4lo4MCBO5515plnLlq0qPVw3bp1qG0IAAAAAAAAvUjXE/hdymazc+fOLS8vr6ys7NkrDxw4cNOmTfX19QceeGDb9vr6etpJAl9SUlJSUtJ6GAwGezYkAAAAAAAAgD1qD5aFWLt27cSJE2+44YYev/Lw4cOJaN68edu1f/TRR5S7qQEAAAAAAAAAe063RuC11jNnzvz4449jsdh2L4nIBx98QESpVKo7t2jXpZde+sILL7z22mvXXXdda+PixYvXr18/atQo7CEHAAAAAAAAfU/XE3jLss4777yZM2d20Ecpddlll3X5FjszadKkoUOHzp0794EHHnBH+Jubmy+99FIi+tGPftTjtwMAAAAAgL1JbE1aRAsRsaHYVISd4AG6k8C//PLLbvY+fvz4ioqKN954o6WlZfLkyfn5+WvWrPnoo49s2541a9bJJ5/cc9F+hZlfeeWVU0899cYbb/zjH/84ePDg+fPnJ5PJyy677Ac/+EGP3w4AAAAAAPYGIZ2yJG2Lo7d7hb2GCnjYa+QkLoB9RNfXwD/99NNEdOWVV86ZM+f555///e9/T0RTpkx5+umn58yZ895774XD4ZdeeqnHIv26MWPGfPjhh+ecc05zc/OHH344ePDge++99+mnnzbNPViWDwAAAAAA9hDJOnZjUieydn1CRzM6aem0rVOWTmSdlrRdG3da0k5LmrR080YrVqxgZmZes2bNzvqcddZZzHz99dd381497v7772fmhx56aM/dIhKJcIeuvvrqHrnR1VdfzcwzZszozkUee+wxZv7Vr37VIyHthbe3m7qewK9du5aIvv/977uHEyZMIKKPP/7YPRw/fvy0adOeeeaZv/3tb127fv/+/UWkrq5uZx2GDx/+6quv1tXVpdPpZcuWTZs2bWc7wwMAAAAAwL5M0rYTTTsNSZ3IqnyfyvOpoEf5TRXwqJDXyPOpsE9HM3Zt3GlOi739+PxuqaysPOKII4jo5ZdfbrdDIpF46623iOiCCy7ozo16tYEDBx6wE8XFxbmObi+55JJLmPmkk07KdSD/0fUEvqamhogqKircw0GDBgUCgdWrV7d2cFe///GPf+xehAAAAAAA0JdJ1nHiWd2UViGvCnlZ7ZCkMLNHqYiXvcquT+hYhro3DH/RRRfRzhP4f/zjH+l0esiQIUcffXS3btObvfXWW+t24u67785VVC0tLcxcVVWVqwByrusJfEFBARElEonWliFDhixfvrz1cPDgwV6vd9GiRd2JDwAAAAAA+jItTjTtNCY5uKsl7swq5GOvadclnFimO/e88MILlVJffPFF2/yl1WuvvUZE559/Pmb47ue+973vPfnkk3tiZ/Qu63oCX15eTkQffvhha8vw4cPXrFnT3NzsHoqIbdttM3wAAAAAAIC2dMoiIfaZnSxQp4ImK5aM3Z2J9AMHDnSXAO84CJ/JZN544w3qu/Pna2trZ82aVVtbm+tAeoEJEyZ873vfO/XUU3MdyH90PYE/7bTTiOjWW2+dPXu21pqIxo4dKyJPPfWU2+Hdd9/VWh944IE9EigAAAAAAPQ9OmU7zWn2d7oWNTMHPE5TSqes7tx3Z7Po33333Wg0OmzYMHedPBFlMplHH330mGOOKSsrCwQCw4cPv/DCCxcuXLjdievXr7/qqqsOPvjgYDA4ePDg0047be7cudv1mTFjxllnnVVeXl5cXHzsscc+++yzbiZFRLfffjszP/vss9udUlFRwcyO4+zsQToTnlvp7dVXX33xxReHDh162mmn/d///V+n3qYOuZd9/vnnt27desUVVwwYMCAUCo0ePfrhhx+2bbttT631Aw88cMIJJxQWFlZVVf3whz/c2S8Ib7311jnnnHPggQcWFBSMHz/+tttuSyaT7kuTJ092p4F/+eWXzDx27Ni2J65fv/6HP/zh6NGjw+FwVVXVQw89tF0MRLR8+fLLLrusqqoqFAoddNBB06ZN27x58y4fsLVCXic/oz/96U/u2/LZZ5995zvfKSgoKC8vv+CCC5YsWUJEM2fOPOOMM8rKyvr37z958uQOKim2q+sJ/DXXXFNYWLh58+YJEya8+OKLRHT22WcT0S233HLttdfedttt7l+Jb3/7212+BQAAAAAA9GGSdUiEPQar3Zis7m4LL9md5rSdce655/p8vmXLlv3rX/9q2+7On28dfheRSy655Oqrr164cGFhYeEhhxzS2Nj48ssvjx8/ft68ea1nLV26dPTo0Y899lhdXd0hhxyitZ41a9bxxx//j3/8o7XPT3/607PPPnvmzJkej6dfv34LFiy4/PLLL7/88u48RSfDcy1YsODSSy9VSh1xxBEDBgzozn3b2rp169FHH51MJu+666477rijubn5pz/96W233dbaIZlMTpo06cYbb/zggw+8Xm9jY+MTTzxx7LHHumXR27r55ptPOeWUv/71r/F4vLy8fP78+b/5zW8OO+ywVatWEdEZZ5zhFsAvLi6+7rrrpk6d2nri8uXLjzzyyFdeeaVfv34jRoz48ssvr7vuuv/3//5f24v/+c9/PuKII/73f/+3pqZm+PDh69evv//++8eMGbOHFn3Pnz//pJNOOvTQQ3/3u98de+yx06dPP+GEE+66665LL7308MMP//Wvf33kkUe+/vrrp512Wjab3Y3rSjesWLHi8MMPd98Lt+W//uu/2l68rKystra2O7fYQ5YuXepGOHny5FzHAgAAAACwn9LJbHpFXXZji7Utvlv/yaxusLbFtaO7c/fJkycT0c9//vPWFtu2S0pKiOjzzz93W9yR6sGDB69atcptyWaz06ZNI6JLLrmk9cTTTz/dvZRlWSKitb7nnnvo35OUReT1118noiFDhixevNht+fLLLwcOHEhEf//730XEzTafeeaZ7YJ0Vy7btu0e3nfffUT04IMP7lZ4jz76KBEZhnHppZe2tLR0/LaEw2EiqqioGL4TCxYsaHvZcDj80EMPtZ6+du1ar9cbCoUcx3Fb7rzzTveCH374odvy8ccfDx482M3IXn/9dbfxvffeI6KCgoK//e1vbktTU9MZZ5xBRKeccorb4q7XHjVq1HaPRkTnnntuPB53G5955hkiysvL0/qr/4WsX78+EAgEg8EXX3zRbUkmk9deey0RDR06NJlMtvv2uhe/++673cNOfkZPPvmk+25/9NFHrX1OOOEEIvL5fF9++aXborU+9NBDiWjevHkdfyJtdX0EnohGjhy5ePHibdu2tRbWf/zxx3/1q18dfvjhhx566A9+8INPP/20X79+3bkFAAAAAAD0VeJu6r77peLYUETUzT3hd5xFP3fu3Pr6+oMOOmj06NFuS21t7YQJE+66667hw4e7LR6Pxx0HdoeFXZ999hkR/eAHPzBNk4iY+Sc/+cm0adMmTZrkdnBHpB9//HF3BJSIDjnkEHdu9qxZs7r8CJ0MzzVgwIDHH388Ly+vM1feuHHj6p1IpVJte5aXl//4xz9uPRw6dOghhxySSCTc2emJROLee+8lopdeeunYY491+4wdO/b555/f7o633347Ef3P//yP+2sIERUUFLz00kv9+/d/8803d5xQ0FZJScnTTz8dCoXcw8suu6y8vDwajbbuSv7f//3fqVTqnnvuufDCC92WQCDw0EMPnXzyyevWrfvrX//amfdkt5x66qnHHHNM66Fbc+HCCy885JBD3BZm/ta3vkVE1dXVnb9stxJ4V2lpaWuWbprmbbfdtnjx4s8+++zxxx8vKyvr/vUBAAAAAAB63Omnn56Xl7d69erFixe7LdvNnyeic8455/3333d3yHY5juNWuWtrxIgRRPSjH/3o008/dVsCgcC9997r7rgWjUaXLl06aNCg1nzedeGFF3722WfdKXLeyfBckyZN8vl8nbxy60Dxjo4//vi2Pb/5zW+qr+/85ybS7vL+FStWxOPxMWPGtGbvrWe13Q1ORBYvXmya5nZzuoPBoPs7S+tn1K5TTjklEom0bXFTUZGvfuKZN28eM7uXauucc86hr5dm7ymtibrLfU9GjRq1Y2NrHYTO6HStCAAAAAAAgJ7lLn3f/XF0cTS3nt5Vfr//nHPOeeaZZ15++eUxY8aIiDsSu139+Ww2+8Ybb8ydO3fVqlXV1dVr1qzZbgiaiB555JEzzzxz1qxZs2bNKi0tHTdu3AknnHD22WcfcMABRLRy5Uoi2rG8t9/vdydRd0dnwnO5M/Z7XEVFRQevus9+0EEH7fhSZWVlawGCzZs3p1KpYcOGeb3e7boNGzaM2ptQ0NbQoUM7eNWyrLVr14pIcXFxux0aGho6OL1rPB5PJxt3CxJ4AAAAAADIDTaUURjQ8Sz7OrWH3Fe0iBZSvFul79p10UUXPfPMM9OnT7/nnnsWLly4adOmqqqqb3zjG60dlixZcvrpp1dXV4fDYXcY+bLLLqusrDzzzDPbXufggw9eunTp66+//sYbb8yePXvmzJkzZ86cNm3a9ddff++996bTaepq8pbJdLTjfSfDc/n9/i4EsEuG0dFnt2NC3u6JHYxCu6sSOq701vHMAtu2Hcfx+/1XXXVVux0OPvjgDk7fpY4/o57VrQR+6dKlt95666JFi6LRaAfdYrFYd+4CAAAAAAB9EnsNYhZbi5bOZ+PackhE+XpgMPLEE08sKyurrq5esGBBu8PvV1xxRXV19S9+8Ytbb721NQHesGHDjpfyer3nn3/++eefT0Q1NTVuAn/fffdNnDjRXfe+bt267U6xbfvDDz8MBAJHHXVUu+HF4/HWVdzt6nx4ueIuzl++fPmOL7mD866KiopAILBhwwbLsrb7pcMde6+srOxyDIFAoKKiYsOGDXfeeWcnSwB03i4/o57V9TXwK1euHDt27MyZM7ds2RLvUA+GCwAAAAAAfYnym0aBX9Lbb9m9UyKSso3CwG5sHb9zhmG4GfvLL7+84wJ4x3EWLlxomuYvfvGLtsPX8+fPb3uR6urqqqoqt0qZa8CAAVdeeaVbL23lypX9+vUrLy9ft27ddruvv//++xMmTHBL2TEzEW2XCr766qsdBN/J8HJrxIgR+fn5ixcv/uijj9q2L1q0qLVeABEx82GHHWZZ1nPPPde2WyqVeuGFF4hozJgx3QnjiCOOoPbez5///Ofjxo2bM2dOZy7Shc+ox3U9gb/zzjuTyaTH4/nZz342c+bMd3auB8MFAAAAAIC+hIMeYpKMrTOd2tddJywSUX6TzR4oyE3/rkX/xBNPrFq1asyYMa3l3InIMIxBgwbZtr1gwYLWxjlz5rhF11sTucGDB1dXV8+ePfuxxx5r7bZu3boPPviA/p153nXXXUR0xRVXLFmyxO2wZcsWt3zdueeeS/9e6f3kk0+2rsdetGjRLbfc0sEE9U6Gl1uBQODmm28moqlTp7bG+eWXX+5YT859i2666aa3337bbWlpaZk6dWpNTc3EiRPdgu2uxsbG3Q3jzjvvNAzjxhtvbK35LyJ/+tOf7rnnnurq6qOPProzF+nCZ9Tjuv6rlfu7zsMPP7yzhQQAAAAAAAAdY8VGnp+InMaUZo/y7jxDEZJkVizHLAmpcGerqe/SUUcdNXz48NWrV9MO8+eJ6Lrrrps2bdqECRO++c1vRiKRlStXrlix4ic/+cmsWbNWr149bNiwGTNmjBo16re//e2PfvSjq6666le/+lVFRUVLS8uyZcu01ldcccVxxx1HRJdffvnbb7/94osvVlVVDR8+PBwOL126NJPJTJky5dJLLyWiM888s6KiYsWKFcOHDx83blx9ff2nn3568sknO47z5ptv7iz4TobXhbfl1FNP7WBheccl5bbz05/+9L333nvnnXeOOeaYAQMG+Hy+6urqvLy8a6+99uGHH27tNnHixBtvvPH++++fNGlSeXl5cXHx0qVLLcsaPnz4H/7wB7dPKBTy+XxbtmwZP378EUcc8eCDD3Yyhqqqqt/+9rc333zzaaedNmjQoIqKivXr19fU1ITD4RkzZnSyOH/XPqOe1fVfrTZt2kREF198cc8FAwAAAAAA+x32GirsNQoDkrB0PNvO7u5CktU6ltFZxywJGfn+Lmwd34HW0WB3BXtbN9xww9NPPz169OhPPvnk888/HzVq1FtvvfXQQw9Nnz79nHPOGTBggDt3/eqrr/773/9+0kknEdEnn3wSjUZPPPHE6dOnP/HEE189I/MLL7zw3HPPnXzyybFYbOPGjWPHjnUL4LsdCgsLZ8+effHFF4fD4ffee6+lpeWuu+56/fXXjz/++PPOO8+dvL2jTobXBR3sA+/+2NF5wWDwn//85/333z9hwoRUKhWNRs8999xFixadeeaZ5513Xtva+Pfdd9+bb7551llneTyedevWjR079tZbb/3ss8/cXfqIyDTNRx55ZODAgYsWLdrdMG644YZ58+ZNmTIlFAp98cUXhYWF11xzzbJly3ZWgGBHXfuMeha37oy3uwYOHFhbWxuLxYLBYM/G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/3AwGMy7CqK9Ttx93jXMwR//8R//xE/8xLyrICIi/M3f/M1rX/vaZ3r2Yx/72Nve9rbtrIeIiJ7W+fPnl5aW5l0F0V7HU+iJiIiIiIiIdoE9egR+Mpl8/vOfB9Dr9fbt27fNv/3ee++97bbbANx2222/9Vu/tc2/fbf44z/+4/e85z0A3vOe9/zLf/kv513ODvX7v//7Wy30m7/5mz/1Uz8173J2qF/91V+94447ANxxxx2vetWr5l3ODvWOd7zjrrvuAnDnnXfu379/O3/1kSNH6rp+pmfH4/FTFz1tv49//OP/6l/9KwDvfe97//k//+fzKmOH+53f+Z3f/d3fBfCBD3zgH/7DfzjvcnaoX/7lX/7EJz4B4BOf+MSNN94473J2qJ/+6Z/+whe+AOALX/jCwsLCvMvZoX7oh37o3LlzS0tLd9999zb/6mPHjqny4B/RnO3Ra+D7/f4b3vCGef32c+fObT0YDodXXXXVvMrY4Q4cOLD1YHl5maP0TFZWVrYe7N+/n6P0TEaj0daDI0eOcJSeSa/X23pwxRVXHDp0aL7FfKfBYDDHf7WnPstYWVlh8zyT5eXlrQcHDx7kKD2T4XC49eDo0aMcpWdSVdXWg2PHjvFU7WcSQtj6LxuJaG/ip2hEREREREREuwADPBEREREREdEuwABPREREREREtAvs0Wvg5+uKK6740Ic+BODaa6+ddy071y233LI1Slx17Fm85S1v2VqF8TWvec28a9m5/uk//ae33norgKuvvnretexcv/zLv/z2t78dABeO+k6vec1rtiairRaikupy1AAAFc1JREFUp/WTP/mTR48eBXDLLbfMu5ad6+d+7ude//rXA7jiiivmXcvO9Su/8iunTp0C0O/3513LzvWbv/mbs9nsWdb+JKJL2x5dhZ6IiIiIiIhod+Ep9ERERERERES7AAM8ERERERER0S7AAE9ERERERES0CzDAExEREREREe0CDPBEREREREREuwAD/Hb7pV/6pf379z/Tsw888MDtt99+4MCBXq/3spe97P3vf3/btttZ3k7znve8R57OlVdeOe/S5oyt8pzYPM+Oc9Fz4hBdPL7cngVb5Tmxf54d5yIi+u84baOzZ8+urq7u27fvaZ/94he/eOjQIQBVVT11n9g3vOENTdNsc507x1ve8pan7dtjx47Nu7R5YqtcDDbP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" width="672" /></p> +<p><img role="img" src="data:image/png;base64,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zpwHH3zQmSq8srLyD3/4Q6Op2lsz/7Dz0Pnuu++WlZU12ngk4dPXud3u044gfOhphwbw9vuWnVWnHVhENm3aFP7cfDzCR97Gx8dfdNFFzuqvf/3rRonvv//+0//ll7/8ZbsUoEMdf+0mT57sJCgpKbn55ptDoZC9+u2337YwwuKo2uX6tnLgdPhfTW1t7Y033lhTU+Nsefnll8PbujshRgqPxp3O0k7LqtOL3vmRpXv37uHjoluvQ+eMaLPO+dNuF5H65lx99dXO8pw5c5otDwAAQCejC71kZmbefffdv/rVr+zVQCDwyCOPPPLII/abje1u8OHOP//88BjsSJxh8E4OKSkpzU6h7PD7/eEvMb7kkkvef//9ZlPOmTPn4Ycftpe3bt26cePG8Bcat6OcnJz09HRn3PXMmTMvuuiiESNG7Ny5c+HChY2ago9JeNfx7du379ixo2fPnjExMS6X6ze/+c3HH39sv/n8nXfeufjii2fOnJmamrp9+/bPP/988eLF9qfcbvexzuHXadq3dpdeeunYsWNXrlxpr7722mtfffXV+PHjCwsLly1bZvcDb5s2X98WKnikj4wZM+biiy/+6KOP7NXFixePHDny4osvTktLW7Zs2ZIlS5yUPp/v3nvvbXOlWqlpc3paWprzAvAzzjjjvffeazl9C9pwfjpZx/1pt7tIfXOmT59+77332j9zOD/C9ujR46gTkQIAAHQcAngRkYceeuibb76xpxp21NfXNw2NBgwYEN5I3oIzzzzT4/GEN76dffbZLTcNLV68OHz+5GuvvfZIKa+55hongBeR+fPnd1AALyKXXHLJa6+9Zi9XV1cvXLjQ+ZUhLS3Nea4NhUI1NTUJCQmtzNaJlESkpqbG7vW6efPmU045ZfDgwXfddZfTOv33v//973//e6OPK6V+/etfh2dyQmn32j322GMTJkxwmkx3794d3v/Z5XI582Mfq7Zd3xYq2MKxXnnllTFjxjhvBcvPz286YkUp9dJLLzmzynWc4cOHd+/e3elrIyJjx451lp1h8I5jCuDbdn46WQf9aXeEiHxz+vTpM27cOGcGE9tVV11F/3kAABBBdKEXEfF6ve+///7vfve7Fmani4uL+6//+q+VK1e28r3rPp/v9NNPD99y1BnswuefT0xMbGEW6EGDBjnjM0XkrbfeCu8N276effbZZifJ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iq6BAB44cdC6hS7r0KFDH330kdfrffbZZ50nQhHp37//U0891a9fv+3bt69evdrZ/tZbb+Xl5Q0YMGDevHkTJ05MS0sTEZfLdcYZZzz//PO9e/fevXv3m2++edTjejyeqVOnzp49W0Q++eSTds+/Ea31z372s9LS0unTpy9ZsuRvf/vbwoULMzMz161b98Ybb3RQsnB+v/++++6rr69vumvp0qVrmjNz5kwR+clPfmIn+/jjjxcsWJCRkfHSSy8tXrx44cKFixYtGjNmzMqVK1955ZVjPSEAogv36ojfq7dv3z537lyv1/v0009//PHHCxcu/Pjjjy+66KLS0tI5c+Ycz0EBAO2OAB5d1rfffisigwYN6t69e6NdXq/3/PPPF5Ht27fbW2pra1977TUR+dnPfpaVldUofUJCwo033igin332WSuPftZZZ4lIQUGB3WzY7vk7Vq1adeDAgSFDhtxzzz0xMTEikpub+8tf/lJE3nzzTaeLTfsmC/fEE0/k5eX169evlQVevXr1/Pnzr7nmmnPOOcfeYkfp999//6hRo+wtWVlZjz/+eHJy8vvvv9/s4yaALoN7dcTv1cuXL7cs69JLLz333HOdmj7wwAOGYaxbt87v97f5oACAdsckduiyGhoaRKS0tNQ0TZfL1Wjvddddd9FFFyUmJtqrixYtqqqqOvXUU50YspEJEybYAzKDwWBrOgqGQiER0VrbzzTtnr9j0aJFInLhhReGDxcfPXp0enp6aWnp9u3bhwwZ0u7JHB999NFf//rXyy+/PCkpaffu3UctbXV19cMPPzxw4MA777zT3hIIBPLz810ul/0Y7UhOTh49evTnn3++atWq8847r/UnBEB04V4d8Xu1XaPwWQBExO12u1yuYDBYV1dnh+vHelAAQEegBR5d1rBhwwzDKCoq+vnPf26P0wuXlJTUr1+/zMxMezUvL09Exo4de6Tc4uPjr7vuuuuuu66VT2xLliwRkT59+tiPRO2ev2Pfvn0i0uhZUyllbyksLOyIZE7ixx57rH///nfffXcrS/vcc88VFxfff//94cNZTdNUSjV9cLcfGYuLi1uZOYBoxL1aIn2vnjhxosvlWrRo0bZt2+wtpmnOnTs3GAyOHj06NTW1DQcFAHQQWuDRZfXs2fP666+fN2/ep59++tlnnw0dOvSss84aO3bsyJEjm74x6MCBAyLSo0eP4zyoZVkHDx5ctGjR66+/LiLTpk1r3/ybOnz4sIg4D1gOe4u9t92TiUggELjvvvssy3rsscfsSPuo8vPz33///e9///sjRoxwNiYlJWVlZZWUlGzYsCH8ubC+vt6eArqkpKQ1mQOIUtyrJdL36mHDhj3++OP/8z//c/311w8ZMiQpKSkvL+/w4cPjxo371a9+dWjs+SUAACAASURBVKxVAAB0KAJ4dGV33nnnoEGD3nrrrU2bNm3dunXr1q0vv/xyXFzcmDFjpk2bds455zj9AAsKCkQkfK7d1rv++uub3X722Wdfc801x59/C7TWpaWlIpKUlNRoV3JysojYe9s3me03v/nNjh07fvGLX7R+9Ptzzz2nlLrjjjsabZ86deof//jHRx555IknnhgwYIB9oEceecQO3e2+nQC6MO7VEb9XZ2ZmZmZmVlVV2VMSiIhSatCgQU5vqWM6KACg4xDAo4ubPHny5MmTS0tLV61atXr16pUrVxYXF3/55ZdffvnlmWee+fjjj9tDK1NSUgoKCiorK9twiPB3C4uIx+Pp37//+PHjL730UqWUvfF48m8N50CNNHrzVnsl++STT957773JkydPnTq1lSXcuHHj0qVLp06d2uh9ziIye/bstWvXrl+//pprrunevbvb7T5w4IDb7R4zZsyaNWvS09NbeQgA0Yt7dUcka+W9eu3atXfeeafL5frpT386YcKE5OTkvLy8F1988bXXXtu6devvfve78K4QrSwbAKCDEMDjpJCenn7xxRdffPHFIlJWVrZ169a5c+euWrXqt7/97S9+8QsR6dOnz5YtW/bv399CJmvWrKmqqho0aFDPnj3Dt//2t7896rusjyf/Fiil0tLSSkpKqqqqnEmebPYDqD1wtH2TFRQUPPLII7169fr5z3/eynKKyPz580Xk8ssvb7rL4/G8+OKLCxcu/OSTT/Ly8pKTkydNmjRr1qz3339/zZo1zthXAF0e9+qI3Ksff/zxQCAwZ86cSy65xN4yYsSIZ5555sYbb1yzZs2HH344derUVh4UANDRCODRZd19990HDhx46qmnGj1jpaWljR8/vl+/flOnTl20aNF9993n9XrtZuFNmzYdKTfTNO++++7a2toXX3yx9Q9tjo7LPzMzs6SkpKKiotGgzYqKCgl7omrHZOvXr6+trY2Pj7/l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//790Tnheo4fPw4AnTp10n58+eWX33nnHZ7n//rXv9577711z5PTDk6Pik68Hzt2TNtJvmGz55aZmanX60Oh0IkTJ3r37n2Omh07djx9+vT999//3HPPnbfZi6HX68eOHbts2bJVq1ZNmjRJWz8/btw4s9lcr2ZRUdEZW9DWO0Tn51stcgT4DjxCKFYIyxCTDmRVOVmrnHKpfonwLGPgYx0XQgghhNoEl8ul7WDXtWvX81bWMu2NGzc2vLR79+6qqiqok8CvXLkSAGbOnPnoo4/WOw2+Xk6emJhotVrh12+MR9XdB+5sGIbJyckBgC1btjS8OmXKFFEUtY3uO3fuDAA7d+48Yzt5eXmrVq0qKys7b4+NMXnyZADYsGFDTU2Nti99w/XzAFBSUhLd3D4qEAisW7cOADp27KiVtGbkCBN4hFDMsGkWoXcamxnHptv4rslspg1Y/FBCCCGEEADAiy++CACEkMGDB5+38r333gsA33zzzdq1a+uWRyKRxx57DAC6dOkSPRNeVVUAMJlM9RrZvn27drRb3W3ztMPhX3vttf3799etXFhYuHDhwsYM5O677waAt956q95L+EVFRevXrw+FQr/5zW8AQNsBftOmTdo5bXV98skn48ePv/POO+vtvd9IDXcBHD16tLaKftasWX6/3+FwRM9sr3fjE088EYlE6hbOmzevvLycZVntiLgWjRw1hN+VEUIthlLVFVROu5VyLw3JDa8TjmUzbFxnB9/ZwXWwEz1OvyOEEEJXFqfTuf/X8vPz16xZM3Xq1FdeeQUAHnjgge7du5+3nbFjx2rnvU+cOPH555/fvXt3aWnpxo0bhwwZoh1gtmDBAu1NeADQMvnFixd/+eWXiqKoqlpcXPynP/3ppptukmUZAL5R2LhiAAAgAElEQVT55pvDhw9rb4A/+eSTNpstGAwOHDjw73//+549ew4ePLh48eIBAwb4/X6bzXbe2B566KHc3NxwODxw4MC33nrr8OHDpaWla9asGT16dDAY7Nmzp/aG/7XXXqtNg0+YMOGZZ57Zs2eP0+k8dOjQn/70p7vuuktrp956gUb68ccfJUnSHlto9Hq9tmP/xx9/DADTpk2L/nLq2bx58/XXX79+/fqioqIvvvhiypQpL7/8MgDMmDGjW7duWp2WixydQSueOd+GaEcdAMCECRNiHQtCly25pFYqKAusLQisLZD2l6ueUKwjQggh1BQqVT0hxelXA1KsQ0GXoeTk5POmKmPHjnW73dFboufAVVdXN2zw1KlTw4YNa9iIKIqLFi2qW7OsrCwpKUm7yjBMdHu5u+66a9OmTdH96r766iut/rfffpuWllavWYZh/vWvfw0aNAgA9u7de+7B7t+/v94h8JqMjIxDhw5Fq9XU1JztaLp77rlHVdVozejKdlmWz1ZCKf3d736nFfI8P2TIkLohffbZZ9HGf/rpp3oBa8e/33zzzcOHD28YzPjx410uV936jY8cXSTcxA4h1CKoT1I9IeWUi0k2g6zKx6sJz3DmxFjHhRBC6MyoP6L6gkQvMBY9EABFlU/URNdPMTaRTcOd51EradeuXf/+/SdPnnzbbbc1/q60tLQtW7YsXrx48+bN+fn5lZWV3bp169mz5+zZs6Nvv2uSk5P37dv34osvbtmypaioyGg09u/f/8EHH7zlllsAYMmSJUuXLjUYDNFD0a+99tq9e/e+9NJLP/300969e3mev+qqq+bOnTt06FC32929e/dz7L6u6dq1608//fTqq69+++23e/fulWW5c+fOI0aMmDNnjsFgiFaLi4v79NNPP/3001WrVuXn5xcXF2dmZnbv3v2RRx7Rjl5vqueee+7kyZP/93//RylNSUmpe+nGG280mUw+n69z5879+/c/4+2iKObl5f3rX/967733Dh8+HBcX179//zFjxmgH19fV7JGjsyG0wRsRV4KDBw9qm2FMmDCh7sMnhFBzUap90vfFxG5grSIAKKdcbLqN7+zAt9wRQqjNUal0oFw5UQuUAgCTYBT6pqvVfmn3KaLnQeSoN8xlxrHpVsYqxjpWhFDzoJRmZ2efOHHixRdffOqpp+pdfeyxx1555ZVJkyZpR8SjtgNn4BFCLYLwLJdtV8o9YBEhotCICgzB7B0hhNoWCjQUkU/WykVOOb+cWHXgjxCLnhgFoucBCJtsBoZQHScXOpl4A2ACj9DlYtu2bSdOnCCEaFvQoUsFJvAIoRZBI6pa4VEKa5TTLsYsch0T2QRjrINCCCH0XzQsKydd1CeFD1ephytIsolLsUJIlg5X0poAk2YBoKBSYAiVKQDALy8GI4QuA4sWLQKAIUOGtG/fPtaxoCbABB4h1PwUp1+t8KqeMAgcDUWYdD2TaGIwgUcIobZELqqRthdRBtQyb+REDccS6jATSgkAEAJmPZdtV07UgMDRkMx1SGCseAoUQpe8/fv3e73eLVu2aCfb//73v491RKhpMIFHCDU/6gzIhU42M47jWbXKxySZicDi1A1CCLUhsqoU1yoVXhIn0lAEwkqkoBz8EcasY+xGxm7kkswKABAClBKWYZLNRMTDPhG65L399tv/+Mc/tH8fOnTo5MmTYxsPaipM4BFCzY0CjSiEY4mOAwAQebnQySSaYh0WQgih/1IjCpVkYIFhicqyxMAxFKiisKlmrlsK1zERCGGTLazDTGWF8PgQFqHLRKdOnZKTkxVFmThx4vz588lZ/tf+29/+9re//a2VY0ONcYEJ/M6dO3fs2FFYWJiTk3Pbbbed8RTHI0eOaJsWPv300xcVI0Lo0kIAdByVFdUdIgJLPSEu287gvA1CCLUlhGWIwNGgrNIgqCpjN5I0C2sWuJ4pQq90YH75Ts8QIuB8D0KXj5kzZ86cOTPWUaAL1+RPZJ/P97vf/e6DDz6Iljz11FPz58+fNWtWvZoHDx585plnABN4hK48bJIZJEU+Xg0AXLadGAViEmIdFEIIof8iAsumW5kEA/XLwDLEKAjJVmLgiYDPWxFCqO1qcgJ/2223bdy4EQAMBkNWVlZhYWEgEPjDH/6gKMrDDz/cAhEihC49jFlHsu1MvAiySgwCE2cAAgBAgxHVHQSFEqPA2PAsIoQQiiUu266Tc+TjTrXUTeJEEDmqUiLy/51+Rwgh1MY07UzmdevWbdy4kRDypz/9ye12FxQUlJaW3nPPPQAwd+7cgwcPtkyQCKFLD9FzbLKFTbcx8b9k756QXOiUfjop7T6lnHYrJ12xjhEhhK5oROSFHilC/wx+YKbQM4XLsnOdHGyaNdZxIYQQOqumzcC/9957ADBjxgxtbTwA2Gy2JUuWuN3uzz77bNasWVu2bGn2EBFClwelzCMX1jAJRsIxclENETm52s+YBCZOZO1G3B4JIYRigCFcpo1NNtGgDAxhjAJOvyOEUFvWtBn4/fv3A8B9991Xr/z11183m81bt2795ptvmisyhNDlhMoKlVUiMIxFT/S8GpDC20/IhyvlQ5VqhU+p8sc6QIQQunIRgWOsesasw+wdIYTauKYl8CUlJQCQlZVVr9zhcDz66KMA8NxzzzVXZAihywlhGWAIlSmVFNUngT/MtovjsuLZdJtcVENrArEOECGEEEIIobauaQl8ZmYmAJw6darhpdmzZycmJm7btm3t2rXNExpC6HJCCBNv4NrHKadcSlGNXOJmzQJjEIjAEo6higoqjXWICCGEEEIItWlNS+Bzc3Phlzfh6zGbzX/7298A4A9/+ENtbW1zxIYQuqywDhObbOa7JnFdHfrrsonIq8GI6grSiEJ0HK7bRAghhBBC6NyalsBPnz4dAN54442nnnrK5/PVuzpjxoyhQ4eWlJSMHz/e6XQ2W4wIocsDIYzdyHVIEHqnsR3sbLt4tcKr1gS4DnY22RLr4BBCCCGEEGrrCKVNW7Z6ww03bN26FQAEQejSpcvbb7/dv3//6NWioqLf/OY3J0+eTEhI6NKly7fffgsATe2iFRw8eLBr164AMGHChM8++yzW4SB0JVLdIRqQgCGMTSS6pp2IgRBCCCGE0BWoaTPwALBmzZqHHnqIYRhJkvbt21dRUVH3alZW1rZt23Jzc6urq7XsHSGEzoix6tkUC5tkxuwdIYQQQgihxmhyAm82mxcuXHjw4MH3339/7ty5qamp9Sq0b9/+wIEDy5YtGz58eFpaGsGznRFCCCGEEEIIoYvW5CX0TRUKhfR6fYt2cQFwCT1CCCGEEEIIoUtLi69cbYPZO0IIIYQQQqjNCsqSRwqFFVlWFYYQjmENnGDRiRxp8vJhhC4z+OopQqg5qFQNSIRliJ4HfG8GIYQQQhfEGwmV+z1BWTrqqqxbnmtzEL/LJojJRivPsLEKD6GYw4dYCKGLpXpCkcOVSnGtXOiUj1fTsBzriBBCCCF0iaFAT/lqi9zV+dWnSrw1dtGUbo5rZ7G3M8enGqyVAc9xd+WPFSeO1FZ4pdDFd7d//35CiNlsvvimWsibb75JCHnxxRdjHQhqW3AGHiF0UWhEUU675WPVjEmgMqWhCBDCdbDHOi6EEEIIXTIopcVep0cKFXmqU41WI6+re1VgOaOgS6BqTch/qLZcoWqGKS5Ob4xVtAjFEM7AI4QuCg1IoFLGomccZjbVQgSWhiKgqLGOCyGEEEKXjLKA2yOFij3ODGN8vew9iiFMgmhOMViPuSpP+WoDstTKQV7h3G43IaRHjx6xDuRKhwk8Quii/OeoyF/ee2/hcy0QQgghdLkJRKTqoK/QU5VqsnHsedITk6BLNJiPuCpPeWtb+jgthNqgSzWBf+ihh8iZZGVlxTo0hK4sxCAQllHdYaXco5Z6IKIQkYfz/e2LEEIIIaSpCHiOuioT9KZG7k5nFUSR40NKxC0FWzo2hNqaS/VL9rFjx2IdAkIIAAA4hk2zcrkJbLKFSbXwXZPYdFusY0IIIYTQpUGmqk8Oswxj5ptw+HS83njUVekKB1ooqnfffZcQMn369Hrlq1evJoQMHz4cAN555x1CyEcffbR3796bbrrJZrOlp6ffdttt+/fvB4C1a9eOHTs2OTk5KSlpwoQJx48fjzYybNgwnucBYMWKFYMGDTKZTB07drzjjjsOHDhwxmCKi4vvv//+nj17mkymHj16LFy4UJbrbxj8xRdf3HrrrdnZ2TabbciQIU899VQgcIZfTl5e3rhx49LT0+12+9VXX7106VJVVRsz3gkTJthsNgAoKCgghAwYMCBa59ChQzNmzOjRo4fRaOzcufOcOXNOnz7dqN8yuiBNTuCrq6u/+eabN998c+3atcXFxS0RU2McPXoUALxeL/21oqKiWIWE0BWLmHV8x0Qu2851sHPZdiLg4S4IIYQQahSfFKKUmjjhPy/lNY7I8SwBXyTcQmvox48fz/P8unXrwuFw3fKPPvoIAO66665oyQ8//DBixIhevXotWLDg6quvXrFixbBhw1544YW77rqrT58+f/nLX/r3779mzZqbb75Zkn710v6LL744bdq0lJSU2bNn9+zZc8WKFQMHDly3bl29SA4dOtS/f/+VK1c6HI7c3NyCgoJHHnnkmWeeqVvn8ccfHz169OrVq30+X3p6+g8//PDXv/61d+/eWsYU9fDDD48fP37t2rU8zzscjp07d95999133313Y8Y7duzYBx98EADsdvsjjzwybdo0rcKHH37Yr1+/999/v6ysLCcnp7i4+NVXX+3bt++uXbsu4NeOGoU2WiAQmDNnDsv+6qv5pEmTysrKGt9Is4hEIhzHpaWlXXAL0edbEyZMaMbAEEIIIYQQQo1X7nevPPrzt6eP7Ks62aR/NhTt21d1MixHLqzfgoICADCZTGercNNNNwHAunXroiVut1uv1xuNRm0S8e233wYAlmW///77aJ1hw4YBgE6nKygo0EpUVe3VqxcA7NixQysZOnQoAHAcl5eXF71x69ater0+MTHR5/NpJW+88YaWsEycODFa+N577wGAxWJRVTV6IwDYbLZoqLW1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EEIInR9VFX8tMCxjtDf2FkI4U4JUelD2Vl98/5MnT4YzraJft26dJEmTJk06411ffPHFrbfemp2dbbPZhgwZ8tRTTwUCgboV3nzzTULIRx99VF5efu+996akpBiNxp49e7722muyLDe1NU1eXt64cePS09PtdvvVV1+9dOlSLQV79913CSHTp0+vV3/16tWEkOHDh0+YMMFmswFAQUEBIWTAgAHROocOHZoxY0aPHj2MRmPnzp3nzJlz+vTpxvzeUKw0YQl9bm7us88+e+DAgb179z7xxBPt27cHAKfT+eabb/7mN7/p3r27Vi0cboZtIRFCCCGEEEKXPSXoAaoyOhNpyqvmRG8GIDTkAUovMoBx48adcRW9tn5+4sSJDW95/PHHR48evXr1ap/Pl56e/sMPP/z1r3/t3bv30aNH69UsLy8fOHBgIBB44YUXnn/+eZfL9fDDDz/11FMX0NrDDz88fvz4tWvX8jzvcDh27tx5991333333QAwfvx4nufXrVtXLxH76KOPAOCuu+4aO3bsgw8+CAB2u/2RRx6ZNm2aVuHDDz/s16/f+++/X1ZWlpOTU1xc/Oqrr/bt2/eMh4WjtoJehO+///6hhx5KTk6u26DVap0xY8amTZsikcjFNN6iDhw4oEU7YcKEWMeCEEIIIYTQFSriKnN/94Gv4Itg0a4m/eP5aWWwaBeVpQvrd/369QAwevRoSulNN90EAIcOHYpe9Xq9er2+V69elFItSX777be1S1u3bgUAm822bt06raS2tnbs2LHR1jRvvPEGAJhMpoULF0YLCwsLBUEwGo2KojSptTVr1gBAu3btdu/erZUUFBSkpqYCwPr166NDiDZCKXW73Xq93mg0er1eSqnL5QKA7t27RysUFxeLomgwGD7++GOtJBAIPPTQQwCQlZUVCAQu7BeLWtpF7ak4aNCghQsXnj59esuWLffdd19cXBwAuN3upUuX3njjjcnJyffff7/2hxIhhBBCCCGE6qFKBAAYlm/qjYThAEBtjr3oG66i37BhQygU0srrefbZZwHgpZdeGjNmjFZis9mWL1+elJT0+eef79ixo27l9PT0WbNmRX/Mysrq1q2b3++PLlNvZGvapP3ixYv79OmjlXTr1u3FF18EgI0bNwLAlClT4JdVA5pVq1aFQqFbb73VZDKdcdTPPfdcMBicP3/+1KlT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ndXy+N0p2/369WvUx5237/Zs/kb7sixr06ZNWuusrCzxXddddx2AioqOrW6YXK3fB96tnZBIJB5++OGHH364mZ6t+USNiIiIiIi6OmGGAMCJANkHcZqytBMXRgDC6KDAmtGo3FrrNLMbt2maABrWugPg97doj70DmjBhwuzZs90N4d977726urom58+7Jk6c+M4777z55pvnnHPOG2+8oZS68sorpZQtj9/dkqyZDzIOeKN92bbtOI7f77/++uub7HDsscc2f7tOrfUJ/M6dO9sxDiIiIiIiOtIIIyikV9t1WsWFbOkUcW3tASA86R0ZWtNqa2t3797d9usUFBQEAoEtW7ZYltUov3XHrgcNGtT2u+zroosucmfR/+Y3v3HnzzfaQK6hsWPH+ny+GTNmPP3006+99hqAq6666qDiHzhwIIDi4uJGV7Zte+HChYFA4OSTT27+RvsKBAIFBQVbtmy5//7721gUoDNq/RT6bS3WjuESEREREVFXIv09zLRjdKylC2+1SqjEHjP9OMOX06GBCSEANErX33rrrfa6+AknnGBZ1ssvv9ywPRqNuhns0KFD2+VGjWRmZo4ePXr58uXLli175513jjnmmGbGq9PT08eMGVNeXj516tQlS5YMHTq0YU2+lsSfk5OTn59fXFzcaO/6Tz75ZNSoUW4pu+Zv1KRhw4ahqa/FPffcM2LEiPnz57fw3eiMWp/A92qxVt/ixhtv7N69+/6Obty4ceLEiTk5OYFA4JhjjnnwwQcbzTMhIiIiIqLDnPR1F4Zf2REd33Xg3lqp6DYjdZDhz4U8wMTsNnJXaD/33HP1a6qXLFly5513Gkb7zNt/4IEHANx+++1z5sxxW6qrqydNmlRaWjp69Gi3ZH1HcOfMX3/99TU1Nc3Mn3e5JeJvv/127FNVroXxu92uvfbalStXui07duxwy9c1LJ7XzI1clZWV9X++//77DcO47bbb3Dr2ALTWf//73x966KGSkpJTTjmlZe9Ep9TKBH7ZsmW//vWvb7/99o5b315ZWTlt2rRmAjj99NP/8Y9/hMPhHj16rFmz5t577x0zZgxzeCIiIiKiTkUYKf3N9MFOvELFSrXe7+JqrRJOXYmR0k960qUvt6PDGjt2bEFBwdq1awsLC3/4wx+efPLJI0aMGDZs2Nlnn90u1x89evRtt91WUVExZsyYgoKCE044oXv37jNnziwsLPzrX//aLrdokluL/osvvkCz8+dd7uT2SCRimuakSZNaEf8111wzadKk9evXFxUVDRw4cOjQof369VuxYsWECRMaJurN3CglJcXn8+3YsWPkyJE333wzgKKioocffrimpub888/Pz88fMWJEr169fvKTnwQCgZkzZ7a9XP/hrJUJ/KpVqx599NFHHnlk+/bt7RsQAMuyPv300wsuuGB/9QO11pdccsnOnTt/8Ytf7Nmzp6SkZNWqVXl5efPmzfvTn/7U7vEQEREREVHHEYbfDA0wM4aoRJUT2aQSVWiUxuuEipU5tZuMlH7Cky5T+kKIjo4qMzNz3rx5V155ZSgUmjt3bnV19QMPPDBjxowzzjjj0ksvFe0RwKOPPvr++++769KLi4uHDx9+1113ffPNNwMGDGj7xffHnUUPYMCAAUVFRc13TktLO/fccwGce+65OTmN1yy0JH4hxGuvvfbyyy+fc845NTU1W7duHT58+IsvvthosLaZG5mm+dRTT+Xl5S1ZsmTDhg1u46233vrZZ59NmDAhJSVl+fLlmZmZN9544+rVq91F9V2YaN0QeklJycCBAy3Lmjlz5tixY9sxoBtvvHHq1Km2bbsvs7Oz960SMWfOnDFjxgwdOnTx4sX1xQk/+eSTs846Kzc3d8eOHQf8dlq9erW72GPcuHFvv/12O8ZPREREREStoFVCRbeqRJUdXg0IYXiFMDU0lKWVBcCTPlj6c6W/w8feO0gikVizZk1WVlZbVhkfehMmTHjzzTenT59+wPn2neVGnVorq9AfddRRf/zjH6dMmXLHHXeMGTOmvXY1AFBUVHTNNdcAqKurc+sf7Oull14CMHHixIZbC4waNSo3N3fnzp1ff/11B5V8ICIiIiKiDiKk10jpL3210petrWo3ad97yAhKb4b0dYdo/S5aSef1eocMGZLsKA5OeXn5rFmz0tPTL7zwwq5xo86u9d8At912W3Z29i9/+cshQ4b8+te/PvHEE/Py8ppcb5CVldXyy9bv5ldWVra/BN7dmeCMM85o2CiE+P73vz99+vTi4mIm8EREREREnZEwQ4a7Obx2tEoAEtIjROtrb3c9lZWVe/bsaUnP/Pz8tiwIV0rde++9iUTixz/+cTsO2SbxRl1A6xP4goIC9w/r16//2c9+1kzPdi90V1paCmDfAvVuS5Mb1H/yySdPP/10/ctwONy+IRERERERUXsShjACyQ7icPTnP//5wQcfbEnPJUuWuDuutcIPfvCDpUuXVlVVhUIhtzh8BzlkN+oaWp/AJ2uDd621m6J369at0SF3qL/JBL64uPgf//jHIQiPiIiIiIio4/zud7/73e9+19F36dOnz6JFi4YNG/b4448fddRRXeBGXUPrE/j6AoDJsr9KddxJjoiIiIiIqC2ef/75559/vivdqGtofQLfv3//doyj5YQQPXr02LZtW2VlZUZGRsNDlZWVAPLy8vY9a+zYsUuWLKl/WVxczNqGRERERERE1Il0YBXHRCKxYMGC/Pz8QYMGte+V8/Lytm3bVl5e3q9fv4bt5eXl2E8Cn52dnZ2dXf8yGAy2b0hEREREREREHaoDyzlu2rRp9OjRt956a7tfubCwEMBnn33WqP3zzz9H8qYGEBEREREREXWcNo3AK6VmzZr15Zdf1tTUNDqktf70008BRKPRttyiSZMnT37ttdfefvvtm2++ub5x6dKlmzdvHjx4MPeQIyIiIiIioq6n9Qm8ZVmXXnrprFmzmukjpbz66qtbfYv9GTNmTN++fRcsWPCnP/3JHeGvqqqaPHkygJ///OftfjsiIiIiIjqUHCuunLhybEAYpsfwBIQ0kh0UUfK1PoGfNm2am72PHDmyoKDg3Xffra6uHjduXHp6+saNGz///HPbtmfPnn3OOee0X7R7CSHefPPN884777bbbnv66ad79+79xRdf1NXVXX311T/96U/b/XZERERERHQIaK3iteXxyB7Hjn/ngBAeX8gfyvb4U5MUGtFhofVr4F944QUA11133fz581999dW//OUvACZMmPDCCy/Mnz9/7ty5oVDojTfeaLdIv2vo0KELFy4cP358VVXVwoULe/fu/cgjj7zwwgum2YFl+YiIiIiIqINYsZrqnWvqqnfu2bEismdLtGZXPFIZq62oC+8M79pYsWVpTXlxTXmxVnYbb7R27VohhBBi48aN++tz0UUXCSFuueWWNt6r3T322GNCiCeeeKLjbpGamiqadcMNN7TLjW644QYhxMyZM9tykWeffVYI8fvf/75dQjoEb28btT7d3bRpE4Cf/OQn7stRo0YB+PLLLydNmgRg5MiRU6ZMue+++8aPH3/hhRe24vo9evTQWjfTobCw8K233mrFlYmIiIiI6LASj1RGqraHy9aZvlAoq480vA2Paq2dRF1txWblJJQdD2X1NTy+Vt9r0KBBw4YN++qrr6ZNm3b33Xfv2yESiXz44YcALrvsslbfpbPLy8vzer1NHsrKyjrEwSTLVVdd9corr4wePXrOnDnJjmWv1o/Al5aWAigoKHBf9urVKxAIbNiwob6Du/r96aefbluERERERETUlVmxcF3V9nDZhkBabjC9Z6PsHYAQwvSlpHQrMH2hPTtW1laWaOW05Y5XXHEFgGnTpjV59L333ovFYn369DnllFPacpdO7cMPPyzejwcffDBZUVVXVwshioqKkhVA0rU+gc/IyAAQiUTqW/r06bNmzZr6l7179/Z6vUuWLGlLfERERERE1IUpZddWbq0uWxdI79H8EnchZDC9p+lL2bN9RaRqe1tuevnll0sply9f3jB/qff2228DmDhxohCiLXehzu7HP/7xc8891xE7o7da6xP4/Px8AAsXLqxvKSws3LhxY1VVlftSa23bdsMMn4iIiIiIqKFYzW6tHE8g3eMLtaR/IDVXSDNRV2Vbrd+vOi8vz10CvO8gfDwef/fdd9F158+XlZXNnj27rKws2YF0AqNGjfrxj3983nnnJTuQ/9P6BP78888HcNddd82bN08pBWD48OFa6+eff97t8PHHHyul+vXr1y6BEhERERFRl6Pjkcrwro2+lG4tPEFI6UvpFt61Pl5b0ZYb728W/ccffxwOh/v37z9s2DC3JR6PP/PMM6eeempubm4gECgsLLz88ssXL17c6MTNmzdff/31xx57bDAY7N279/nnn79gwYJGfWbOnHnRRRfl5+dnZWWddtppL730kptJAbj33nuFEC+99FKjUwoKCoQQjrPfJQMtCc+t9PbWW2+9/vrrffv2Pf/88//973+36G1qlnvZV199defOnddee23Pnj1TUlKGDBny5JNP2vZ3ag0qpf70pz+deeaZmZmZRUVFP/vZz/b3CcKHH344fvz4fv36ZWRkjBw58u67766rq3MPjRs3zp0GvmLFCiHE8OHDG564efPmn/3sZ0OGDAmFQkVFRU888USjGACsWbPm6quvLioqSklJOfroo6dMmbJ9e3NTORpVyGvh1+jvf/+7+7Z88803P/zhDzMyMvLz8y+77LKVK1cCmDVr1oUXXpibm9ujR49x48Y1U0mxSa1P4G+88cbMzMzt27ePGjXq9ddfB3DxxRcDuPPOO2+66aa7777b/Zb4wQ9+0OpbEBERERFRF2bFarVyTF9AyoOorm36QoCwYjVtufUll1zi8/lWr179n//8p2G7O3++fvhda33VVVfdcMMNixcvzszMPO644yorK6dNmzZy5MjPPvus/qxVq1YNGTLk2Wef3b1793HHHaeUmj179hlnnPHee+/V9/nVr3518cUXz5o1y+Px5OTkLFq06Jprrrnmmo4HRbEAACAASURBVGva8hQtDM+1aNGiyZMnSymHDRvWs2fPtty3oZ07d55yyil1dXUPPPDAfffdV1VV9atf/aphdcC6uroxY8bcdtttn376qdfrrays/Nvf/nbaaae5ZdEbuuOOO84999x//vOftbW1+fn5X3zxxR//+McTTjhh/fr1AC688EK3AH5WVtbNN9/sVk93rVmz5qSTTnrzzTdzcnIGDBiwYsWKm2+++Te/+U3Di7/yyivDhg373//939LS0sLCws2bNz/22GNDhw7toEXfX3zxxdlnn3388cf/+c9/Pu2006ZPn37mmWc+8MADkydPPvHEE//whz+cdNJJM2bMOP/88xOJxEFcV7fB2rVrTzzxRPe9cFv+67/+q+HFc3Nzy8rK2nKLDrJq1So3wnHjxiU7FiIiIiKiI1S0ZlfxV2+Wrp1XsXXZQf23Zdm/KrYuc+xEW+4+btw4APfcc099i23b2dnZAJYtW+a2uCPVvXv3Xr9+vduSSCSmTJkC4Kqrrqo/8YILLnAvZVmW1lop9dBDD+HbScpa6xkzZgDo06fP0qVL3ZYVK1bk5eUBeOedd7TWbrb54osvNgrSXbls27b78tFHHwXw+OOPH1R4zzzzDADDMCZPnlxdXd382xIKhQAUFBQU7seiRYsaXjYUCj3xxBP1p2/atMnr9aakpDiO47bcf//97gUXLlzotnz55Ze9e/d2M7IZM2a4jXPnzgWQkZHxr3/9y23Zs2ePu6PZueee67a467UHDx7c6NEAXHLJJbW1tW7jiy++CCAtLU0p5bZs3rw5EAgEg8HXX3/dbamrq7vpppsA9O3bt66ursm31734gw8+6L5s4dfoueeec9/tzz//vL7PmWeeCcDn861YscJtUUodf/zxAD777LPmvyINtX4EHsDAgQOXLl26a9eus88+222ZOnXq73//+xNPPPH444//6U9/+vXXX+fk5LTlFkRERERE1FUpxwYgjIPe3No9RbVtT/h9Z9EvWLCgvLz86KOPHjJkiNtSVlY2atSoBx54oLCw0G3xeDzuOLA7LOz65ptvAPz0pz81TROAEOKXv/zllClTxowZ43ZwR6SnTp3qjoACOO6449y52bNnz271I7QwPFfPnj2nTp2alpbWkitv3bp1w35Eo9+pPpCfn/+LX/yi/mXfvn2PO+64SCTizk6PRCKPPPIIgDfeeOO0005z+wwfPvzVV19tdMd7770XwP/8z/+4n4YAyMjIeOONN3r06PH+++/vO6Ggoezs7BdeeCElJcV9efXVV+fn54fD4d27d7st//3f/x2NRh966KHLL7/cbQkEAk888cQ555xTXFz8z3/+syXvyUE577zzTj311PqXbs2Fyy+//LjjjnNbhBDf//73AZSUlLT8sm1K4F3du3evz9JN07z77ruXLl36zTffTJ06NTc3t+3XJyIiIiIiancXXHBBWlrahg0bli5d6rY0mj8PYPz48Z988om7Q7bLcRy3yl1DAwYMAPDzn//866+/dlsCgcAjjzzi7rgWDodXrVrVq1ev+nzedfnll3/zzTdtKXLewvBcY8aM8fl8Lbxy/UDxvs4444yGPU8//XQpv5NXuom0u7x/7dq1tbW1Q4cOrc/e689quBuc1nrp0qWmaTaa0x0MBt3PWeq/Rk0699xzU1O/s4WBm4pqrd2Xn332mRDCvVRD48ePx3dLs7eX+kTd5b4ngwcP3rexvg5CSxz0Z11ERERERETtwl36rp2DHkjXyq4/vdX8fv/48eNffPHFadOmDR06VGvtjsQ2qj+fSCTefffdBQsWrF+/vqSkZOPGjY2GoAE89dRTY8eOnT179uzZs7t37z5ixIgzzzzz4osvPuqoowCsW7cOwL7lvf1+vzuJui1aEp7LnbHf7goKCpo56j770Ucfve+hQYMG1Rcg2L59ezQa7d+/v9frbdStf//+aGpCQUN9+/Zt5qhlWZs2bdJaZ2VlNdmhoqJNBRGb5PF4Wth4UJjAExERERFRchgef1rOgLqq7d5gRsvPUspRVkIapjTamg5dccUVL7744vTp0x966KHFixdv27atqKjomGOOqe+wcuXKCy64oKSkJBQKucPIV1999aBBg8aOHdvwOscee+yqVatmzJjx7rvvzps3b9asWbNmzZoyZcott9zyyCOPxGIxtDZ5i8fjzRxtYXguv9/figAOyDCMZo7um5A3eWIzo9DuqoTmK701P7PAtm3Hcfx+//XXX99kh2OPPbaZ0w+o+a9R+2pTAr9q1aq77rpryZIl4XC4mW41NW2qD0lERERERF2Sxx8S0rATMaXslg+n27EaDe0NpLc9gLPOOis3N7ekpGTRokVNDr9fe+21JSUlv/3tb++66676BHjLli37Xsrr9U6cOHHixIkASktL3QT+0UcfHT16tLvuvbi4uPGD2PbChQsDgcDJJ5/cZHi1tbX1q7ib1PLwksVdnL9mzZp9D7mD866CgoJAILBlyxbLshp90uGOvQ8aNKjVMQQCgYKCgi1bttx///0tLAHQcgf8GrWv1q+BX7du3fDhw2fNmrVjx47aZrVjuERERERE1IUIX0q3tJz+iUhlC0/QSsUilWk5A7zBlm4d3wzDMNyMfdq0afsugHccZ/HixaZp/va3v204fP3FF180vEhJSUlRUZFbpczVs2fP6667zq2Xtm7dupycnPz8/OLi4ka7r3/yySejRo1yS9kJIQA0SgXfeuutZoJvYXjJNWDAgPT09KVLl37++ecN25csWVJfLwCAEOKEE06wLOvll19u2C0ajb722msAhg4d2pYwhg0bhqbez3vuuWfEiBHz589vyUVa8TVqd61P4O+///66ujqPx/PrX/961qxZH+1fO4ZLRERERERdiT+1uxBGIlqdaNm+7tHwTmjHl5JpegPtEoBb2Oxvf/vb+vXrhw4dWl/OHYBhGL169bJte9GiRfWN8+fPd4uu1ydyvXv3LikpmTdv3rPPPlvfrbi4+NNPP8W3mecDDzwA4Nprr125cqXbYceOHW75uksuuQTfrvR+7rnn6tdjL1my5M4772xmgnoLw0uuQCBwxx13AJg0aVJ9nCtWrNi3npz7Ft1+++1z5sxxW6qrqydNmlRaWjp69Gi3YLursrKlH/fUu//++w3DuO222+pr/mut//73vz/00EMlJSWnnHJKSy7Siq9Ru2v9FHr3c50nn3xyfwsJiIiIiIiImielGcrqraHCO9dDa29gvzOctVbRmjI7EcnMGxxMb7d6bCeffHJhYeGGDRuwz/x5ADfffPOUKVNGjRp1+umnp6amrlu3bu3atb/85S9nz569YcOG/v37z5w5c/DgwQ8//PDPf/7z66+//ve//31BQUF1dfXq1auVUtdee+33vvc9ANdcc82cOXNef/31oqKiwsLCUCi0atWqeDw+YcKEyZMnAxg7dmxBQcHatWsLCwtHjBhRXl7+9ddfn3POOY7jvP/++/sLvoXhteJtOe+885pZWN58SblGfvWrX82dO/ejjz469dRTe/bs6fP5SkpK0tLSbrrppieffLK+2+jRo2+77bbHHntszJgx+fn5WVlZq1atsiyrsLDwr3/9q9snJSXF5/Pt2LFj5MiRw4YNe/zxx1sYQ1FR0cMPP3zHHXecf/75vXr1Kigo2Lx5c2lpaSgUmjlzZguL87fua9S+Wj8Cv23bNgBXXnll+wVDRERERERHHI8/NSWjV1rugFhNWV31DuXsU65MayteW1u5xY7VZuQdl5rdV8j2HPOsHw12V7A3dOutt77wwgtDhgz56quvli1bNnjw4A8//PCJJ56YPn36+PHje/bs6c5dv+GGG955552zzz4bwFdffRUOh88666zp06f/7W9/c68jhHjttddefvnlc845p6amZuvWrcOHD3cL4LsdMjMz582bd+WVV4ZCoblz51ZXVz/wwAMzZsw444wzLr30Unfy9r5aGF4rNLMPvPthR8sFg8EPPvjgscceGzVqVDQaDYfDl1xyyZIlS8aOHXvppZc2rI3/6KOPvv/++xdddJHH4ykuLh4+fPhdd931zTffuLv0ATBN86mnnsrLy1uyZMnBhnHrrbd+9tlnEyZMSElJWb58eWZm5o033rh69er9FSDYV+u+Ru1L1O+Md7Dy8vLKyspqamqCwWD7xnQIrF692q00OG7cOHetCxERERERJZEVr41UblWOFd61Xpo+w/RLw9RKKWU5iajWTlrOAI8/NaVbQRt3j6OOVlNTs3LlyiFDhnTGVPFQSiQSa9asycrK6tWrVwtPaf1f/dGjR7/88stffPHFWWed1eqLEBERERERAfD4Qum5g+K1FYbH71ix7x4UXn+qPzXb9IWSExwdjNTU1FNPPTXZUXQCXq93yJAhB3VK6xP4++67b8aMGTfeeOOiRYvavRY/EREREREdaYSQ/tTu/tTuyrEcK6qVAwhpegzT375z5ok6qZYm8PV19uqlp6e/8sorV1xxxaBBg26//fYRI0b06dPH6/Xue25WVlZbwyQiIiIioiOG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oYWIWJWPfKTrrGRHR0RE1HpcA0/UUnl5aVdMHhaJJBxHe31GCushEREdllImD3d2hGvf+AqOhoCQ0FppCKypdGrjZoj/ehMRUWfFEXiig2B6jPSMQLesYCjk414mRESHKVOm/GokDOGWH9UQAAS0o5W9YXeygyMiImo9JvBERETU1RipfhSkaghoDa0AAUhpGoirZIdGRETUekzgiYiIqAvK+p+x8AstoYWbv8NzVHfZI5TsuIiIiFqPCTwRERF1Qb7B+d1+d6GRl24EfUZq0Ht0z9DEIrMwO9lxERERtR6L2BEREVHXFPjhsZ4T8qyvt+u4Y/TK8BblCj9/8yEiok6MP8aIiIioyzLzMsy8jGRHQURE1D44hZ6IiIiIiIioE2ACT0RERERERNQJMIEnIiIiIiIi6gSYwBMRERERERF1AkzgiYiIiIiIiDoBJvBEREREREREnQATeCIiIiIiIqJOgAk8ERERERERUSfABJ6IiIiIiIioE2ACT0RERERERNQJdNYE/qabbhJN6du3b7JDIyIiIiIiImp/nTWB37BhQ7JDICIiIiIiIjp0zGQH0Err168HUFNTEwqFkh0LERERERERUYfrlCPwtm2XlJT06tWL2TsREREREREdITplAr9582bbtgcNGpTsQIiIiIiIiIgOkU45hd6dPz9w4MA333zzX//617Zt2wYMGHDyySdPnjzZNDvlExERERERERE1r1Omu24Fu5deeumZZ55xW+bOnfvss88++eST06dPHzhw4L6nLF++/L333qt/uWvXrkMTKhEREREREVG76MQJPIC//OUv5513XkZGxuLFi6dMmbJs2bIrrrhi0aJFhmE0OmXJkiV33nnnIY+UiIiIiIiIqH10ygR+1KhRPXv2PPvss4cOHeq2jBkzZv78+YMGDfrqq6+mT58+adKk5EZIRERERERE1L46ZQJ/8cUX79uYkZFx9dVXP/LII1999dW+Cfz3vve9Z599tv5laWnpfffd16FBEhEREREREbWjTpnA74+7+n3z5s37Hho0aFDDqvWrV69mAk9ERERERESdSOdL4Gtqal577bVQKPSjH/2o0SG3NF2TReyIiIiIiIiIOrXOl8CHQqE//OEPW7ZsKSoqGjJkSH27UmrWrFkATjrppORFR0RERERERNQhZLIDOGhCiGuvvRbAxIkTV65c6TaG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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> -<p>With the faceted view, we can now see that the small amounts of -<code>Tumor_Myocyte</code> from other samples are “pulled” towards those -cells in <code>SCPCL000481</code>.</p> -<p>What other patterns do you see that are similar or different from the -<code>fastMNN</code> UMAP? How do you think <code>fastMNN</code> -vs. <code>harmony</code> performed in integrating these samples?</p> +<p>What do you now notice in this faceted view that wasn’t clear +previously? Are there other patterns you see that are similar or +different from the <code>fastMNN</code> UMAP? How do you think +<code>fastMNN</code> vs. <code>harmony</code> performed in integrating +these samples?</p> </div> <div id="export" class="section level3"> <h3>Export</h3> @@ -4712,7 +4743,7 @@ <h2>Print session info</h2> <!-- rnb-source-begin eyJkYXRhIjoic2Vzc2lvbkluZm8oKSJ9 --> <pre class="r"><code>sessionInfo()</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gU2luZ2xlQ2VsbEV4cGVyaW1lbnRfMS4yNi4wIFN1bW1hcml6ZWRFeHBlcmltZW50XzEuMzQuMFxuIFszXSBCaW9iYXNlXzIuNjQuMCAgICAgICAgICAgICAgR2Vub21pY1Jhbmdlc18xLjU2LjAgICAgICAgXG4gWzVdIEdlbm9tZUluZm9EYl8xLjQwLjAgICAgICAgICBJUmFuZ2VzXzIuMzguMCAgICAgICAgICAgICBcbiBbN10gUzRWZWN0b3JzXzAuNDIuMCAgICAgICAgICAgIEJpb2NHZW5lcmljc18wLjUwLjAgICAgICAgIFxuIFs5XSBNYXRyaXhHZW5lcmljc18xLjE2LjAgICAgICAgbWF0cml4U3RhdHNfMS4zLjAgICAgICAgICAgXG5bMTFdIGdncGxvdDJfMy41LjEgICAgICAgICAgICAgICBvcHRwYXJzZV8xLjcuNSAgICAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBncmlkRXh0cmFfMi4zICAgICAgICAgICAgIHJsYW5nXzEuMS4zICAgICAgICAgICAgICBcbiAgWzNdIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICAgc2NhdGVyXzEuMzIuMCAgICAgICAgICAgIFxuICBbNV0gUmNwcEFubm95XzAuMC4yMiAgICAgICAgICBjb21waWxlcl80LjQuMSAgICAgICAgICAgXG4gIFs3XSBmbGV4bWl4XzIuMy0xOSAgICAgICAgICAgIERlbGF5ZWRNYXRyaXhTdGF0c18xLjI2LjBcbiAgWzldIHZjdHJzXzAuNi41ICAgICAgICAgICAgICAgc3RyaW5ncl8xLjUuMSAgICAgICAgICAgIFxuIFsxMV0gcGtnY29uZmlnXzIuMC4zICAgICAgICAgICBjcmF5b25fMS41LjIgICAgICAgICAgICAgXG4gWzEzXSBmYXN0bWFwXzEuMS4xICAgICAgICAgICAgIFhWZWN0b3JfMC40NC4wICAgICAgICAgICBcbiBbMTVdIHNjdXR0bGVfMS4xNC4wICAgICAgICAgICAgbGFiZWxpbmdfMC40LjMgICAgICAgICAgIFxuIFsxN10gdXRmOF8xLjIuNCAgICAgICAgICAgICAgICBybWFya2Rvd25fMi4yNiAgICAgICAgICAgXG4gWzE5XSB0emRiXzAuNC4wICAgICAgICAgICAgICAgIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICBcbiBbMjFdIGdnYmVlc3dhcm1fMC43LjIgICAgICAgICAgcHVycnJfMS4wLjIgICAgICAgICAgICAgIFxuIFsyM10geGZ1bl8wLjQzICAgICAgICAgICAgICAgICBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgXG4gWzI1XSBibHVzdGVyXzEuMTQuMCAgICAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgICBcbiBbMjddIGNhY2hlbV8xLjAuOCAgICAgICAgICAgICAgYmVhY2htYXRfMi4yMC4wICAgICAgICAgIFxuIFsyOV0ganNvbmxpdGVfMS44LjggICAgICAgICAgICBoaWdocl8wLjEwICAgICAgICAgICAgICAgXG4gWzMxXSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICBcbiBbMzNdIGlybGJhXzIuMy41LjEgICAgICAgICAgICAgcGFyYWxsZWxfNC40LjEgICAgICAgICAgIFxuIFszNV0gY2x1c3Rlcl8yLjEuNiAgICAgICAgICAgICBSNl8yLjUuMSAgICAgICAgICAgICAgICAgXG4gWzM3XSBSQ29sb3JCcmV3ZXJfMS4xLTMgICAgICAgIGJzbGliXzAuNy4wICAgICAgICAgICAgICBcbiBbMzldIHN0cmluZ2lfMS44LjMgICAgICAgICAgICAgbGltbWFfMy42MC4wICAgICAgICAgICAgIFxuIFs0MV0ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG4gWzQzXSBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgIHJlYWRyXzIuMS41ICAgICAgICAgICAgICBcbiBbNDVdIGJhdGNoZWxvcl8xLjIwLjAgICAgICAgICAgTWF0cml4XzEuNy0wICAgICAgICAgICAgIFxuIFs0N10gc3BsaW5lc180LjQuMSAgICAgICAgICAgICBubmV0XzcuMy0xOSAgICAgICAgICAgICAgXG4gWzQ5XSBpZ3JhcGhfMi4wLjMgICAgICAgICAgICAgIHRpZHlzZWxlY3RfMS4yLjEgICAgICAgICBcbiBbNTFdIGFiaW5kXzEuNC01ICAgICAgICAgICAgICAgeWFtbF8yLjMuOCAgICAgICAgICAgICAgIFxuIFs1M10gdmlyaWRpc18wLjYuNSAgICAgICAgICAgICBjb2RldG9vbHNfMC4yLTIwICAgICAgICAgXG4gWzU1XSBsYXR0aWNlXzAuMjItNiAgICAgICAgICAgIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICBcbiBbNTddIHdpdGhyXzMuMC4wICAgICAgICAgICAgICAgZXZhbHVhdGVfMC4yMyAgICAgICAgICAgIFxuIFs1OV0gZ2V0b3B0XzEuMjAuNCAgICAgICAgICAgICBwaWxsYXJfMS45LjAgICAgICAgICAgICAgXG4gWzYxXSBnZW5lcmljc18wLjEuMyAgICAgICAgICAgIGhtc18xLjEuMyAgICAgICAgICAgICAgICBcbiBbNjNdIHNwYXJzZU1hdHJpeFN0YXRzXzEuMTYuMCAgbXVuc2VsbF8wLjUuMSAgICAgICAgICAgIFxuIFs2NV0gc2NhbGVzXzEuMy4wICAgICAgICAgICAgICBtaVFDXzEuMTIuMCAgICAgICAgICAgICAgXG4gWzY3XSBSaHBjQkxBU2N0bF8wLjIzLTQyICAgICAgIGdsdWVfMS43LjAgICAgICAgICAgICAgICBcbiBbNjldIG1ldGFwb2RfMS4xMi4wICAgICAgICAgICAgdG9vbHNfNC40LjEgICAgICAgICAgICAgIFxuIFs3MV0gQmlvY05laWdoYm9yc18xLjIyLjAgICAgICBTY2FsZWRNYXRyaXhfMS4xMi4wICAgICAgXG4gWzczXSBsb2NmaXRfMS41LTkuOSAgICAgICAgICAgIHNjcmFuXzEuMzIuMCAgICAgICAgICAgICBcbiBbNzVdIGNvd3Bsb3RfMS4xLjMgICAgICAgICAgICAgZ3JpZF80LjQuMSAgICAgICAgICAgICAgIFxuIFs3N10gZWRnZVJfNC4yLjAgICAgICAgICAgICAgICBjb2xvcnNwYWNlXzIuMS0wICAgICAgICAgXG4gWzc5XSBHZW5vbWVJbmZvRGJEYXRhXzEuMi4xMiAgIGJlZXN3YXJtXzAuNC4wICAgICAgICAgICBcbiBbODFdIEJpb2NTaW5ndWxhcl8xLjIwLjAgICAgICAgdmlwb3JfMC40LjcgICAgICAgICAgICAgIFxuIFs4M10gY2xpXzMuNi4yICAgICAgICAgICAgICAgICByc3ZkXzEuMC41ICAgICAgICAgICAgICAgXG4gWzg1XSBmYW5zaV8xLjAuNiAgICAgICAgICAgICAgIFM0QXJyYXlzXzEuNC4wICAgICAgICAgICBcbiBbODddIHZpcmlkaXNMaXRlXzAuNC4yICAgICAgICAgZHBseXJfMS4xLjQgICAgICAgICAgICAgIFxuIFs4OV0gdXdvdF8wLjIuMiAgICAgICAgICAgICAgICBSZXNpZHVhbE1hdHJpeF8xLjE0LjAgICAgXG4gWzkxXSBndGFibGVfMC4zLjUgICAgICAgICAgICAgIHNhc3NfMC40LjkgICAgICAgICAgICAgICBcbiBbOTNdIGRpZ2VzdF8wLjYuMzUgICAgICAgICAgICAgU3BhcnNlQXJyYXlfMS40LjAgICAgICAgIFxuIFs5NV0gZ2dyZXBlbF8wLjkuNSAgICAgICAgICAgICBkcXJuZ18wLjMuMiAgICAgICAgICAgICAgXG4gWzk3XSBmYXJ2ZXJfMi4xLjEgICAgICAgICAgICAgIGh0bWx0b29sc18wLjUuOC4xICAgICAgICBcbiBbOTldIGxpZmVjeWNsZV8xLjAuNCAgICAgICAgICAgaHR0cl8xLjQuNyAgICAgICAgICAgICAgIFxuIFsgcmVhY2hlZCBnZXRPcHRpb24oXCJtYXgucHJpbnRcIikgLS0gb21pdHRlZCAyIGVudHJpZXMgXVxuIn0= --> +<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gU2luZ2xlQ2VsbEV4cGVyaW1lbnRfMS4yNi4wIFN1bW1hcml6ZWRFeHBlcmltZW50XzEuMzQuMFxuIFszXSBCaW9iYXNlXzIuNjQuMCAgICAgICAgICAgICAgR2Vub21pY1Jhbmdlc18xLjU2LjAgICAgICAgXG4gWzVdIEdlbm9tZUluZm9EYl8xLjQwLjAgICAgICAgICBJUmFuZ2VzXzIuMzguMCAgICAgICAgICAgICBcbiBbN10gUzRWZWN0b3JzXzAuNDIuMCAgICAgICAgICAgIEJpb2NHZW5lcmljc18wLjUwLjAgICAgICAgIFxuIFs5XSBNYXRyaXhHZW5lcmljc18xLjE2LjAgICAgICAgbWF0cml4U3RhdHNfMS4zLjAgICAgICAgICAgXG5bMTFdIGdncGxvdDJfMy41LjEgICAgICAgICAgICAgICBvcHRwYXJzZV8xLjcuNSAgICAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBncmlkRXh0cmFfMi4zICAgICAgICAgICAgIHJsYW5nXzEuMS4zICAgICAgICAgICAgICBcbiAgWzNdIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICAgc2NhdGVyXzEuMzIuMCAgICAgICAgICAgIFxuICBbNV0gUmNwcEFubm95XzAuMC4yMiAgICAgICAgICBjb21waWxlcl80LjQuMSAgICAgICAgICAgXG4gIFs3XSBmbGV4bWl4XzIuMy0xOSAgICAgICAgICAgIERlbGF5ZWRNYXRyaXhTdGF0c18xLjI2LjBcbiAgWzldIHZjdHJzXzAuNi41ICAgICAgICAgICAgICAgc3RyaW5ncl8xLjUuMSAgICAgICAgICAgIFxuIFsxMV0gcGtnY29uZmlnXzIuMC4zICAgICAgICAgICBjcmF5b25fMS41LjIgICAgICAgICAgICAgXG4gWzEzXSBmYXN0bWFwXzEuMS4xICAgICAgICAgICAgIFhWZWN0b3JfMC40NC4wICAgICAgICAgICBcbiBbMTVdIHNjdXR0bGVfMS4xNC4wICAgICAgICAgICAgbGFiZWxpbmdfMC40LjMgICAgICAgICAgIFxuIFsxN10gdXRmOF8xLjIuNCAgICAgICAgICAgICAgICBybWFya2Rvd25fMi4yNiAgICAgICAgICAgXG4gWzE5XSB0emRiXzAuNC4wICAgICAgICAgICAgICAgIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICBcbiBbMjFdIGdnYmVlc3dhcm1fMC43LjIgICAgICAgICAgcHVycnJfMS4wLjIgICAgICAgICAgICAgIFxuIFsyM10geGZ1bl8wLjQzICAgICAgICAgICAgICAgICBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgXG4gWzI1XSBibHVzdGVyXzEuMTQuMCAgICAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgICBcbiBbMjddIGNhY2hlbV8xLjAuOCAgICAgICAgICAgICAgYmVhY2htYXRfMi4yMC4wICAgICAgICAgIFxuIFsyOV0ganNvbmxpdGVfMS44LjggICAgICAgICAgICBoaWdocl8wLjEwICAgICAgICAgICAgICAgXG4gWzMxXSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICBcbiBbMzNdIGlybGJhXzIuMy41LjEgICAgICAgICAgICAgcGFyYWxsZWxfNC40LjEgICAgICAgICAgIFxuIFszNV0gY2x1c3Rlcl8yLjEuNiAgICAgICAgICAgICBSNl8yLjUuMSAgICAgICAgICAgICAgICAgXG4gWzM3XSBic2xpYl8wLjcuMCAgICAgICAgICAgICAgIHN0cmluZ2lfMS44LjMgICAgICAgICAgICBcbiBbMzldIFJDb2xvckJyZXdlcl8xLjEtMyAgICAgICAgbGltbWFfMy42MC4wICAgICAgICAgICAgIFxuIFs0MV0ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG4gWzQzXSBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgIHJlYWRyXzIuMS41ICAgICAgICAgICAgICBcbiBbNDVdIGJhdGNoZWxvcl8xLjIwLjAgICAgICAgICAgTWF0cml4XzEuNy0wICAgICAgICAgICAgIFxuIFs0N10gc3BsaW5lc180LjQuMSAgICAgICAgICAgICBubmV0XzcuMy0xOSAgICAgICAgICAgICAgXG4gWzQ5XSBpZ3JhcGhfMi4wLjMgICAgICAgICAgICAgIHRpZHlzZWxlY3RfMS4yLjEgICAgICAgICBcbiBbNTFdIGFiaW5kXzEuNC01ICAgICAgICAgICAgICAgeWFtbF8yLjMuOCAgICAgICAgICAgICAgIFxuIFs1M10gdmlyaWRpc18wLjYuNSAgICAgICAgICAgICBjb2RldG9vbHNfMC4yLTIwICAgICAgICAgXG4gWzU1XSBsYXR0aWNlXzAuMjItNiAgICAgICAgICAgIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICBcbiBbNTddIHdpdGhyXzMuMC4wICAgICAgICAgICAgICAgZXZhbHVhdGVfMC4yMyAgICAgICAgICAgIFxuIFs1OV0gZ2V0b3B0XzEuMjAuNCAgICAgICAgICAgICBwaWxsYXJfMS45LjAgICAgICAgICAgICAgXG4gWzYxXSBnZW5lcmljc18wLjEuMyAgICAgICAgICAgIGhtc18xLjEuMyAgICAgICAgICAgICAgICBcbiBbNjNdIHNwYXJzZU1hdHJpeFN0YXRzXzEuMTYuMCAgbXVuc2VsbF8wLjUuMSAgICAgICAgICAgIFxuIFs2NV0gc2NhbGVzXzEuMy4wICAgICAgICAgICAgICBtaVFDXzEuMTIuMCAgICAgICAgICAgICAgXG4gWzY3XSBSaHBjQkxBU2N0bF8wLjIzLTQyICAgICAgIGdsdWVfMS43LjAgICAgICAgICAgICAgICBcbiBbNjldIG1ldGFwb2RfMS4xMi4wICAgICAgICAgICAgdG9vbHNfNC40LjEgICAgICAgICAgICAgIFxuIFs3MV0gQmlvY05laWdoYm9yc18xLjIyLjAgICAgICBTY2FsZWRNYXRyaXhfMS4xMi4wICAgICAgXG4gWzczXSBsb2NmaXRfMS41LTkuOSAgICAgICAgICAgIGZzXzEuNi40ICAgICAgICAgICAgICAgICBcbiBbNzVdIHNjcmFuXzEuMzIuMCAgICAgICAgICAgICAgY293cGxvdF8xLjEuMyAgICAgICAgICAgIFxuIFs3N10gZ3JpZF80LjQuMSAgICAgICAgICAgICAgICBlZGdlUl80LjIuMCAgICAgICAgICAgICAgXG4gWzc5XSBjb2xvcnNwYWNlXzIuMS0wICAgICAgICAgIEdlbm9tZUluZm9EYkRhdGFfMS4yLjEyICBcbiBbODFdIGJlZXN3YXJtXzAuNC4wICAgICAgICAgICAgQmlvY1Npbmd1bGFyXzEuMjAuMCAgICAgIFxuIFs4M10gdmlwb3JfMC40LjcgICAgICAgICAgICAgICBjbGlfMy42LjIgICAgICAgICAgICAgICAgXG4gWzg1XSByc3ZkXzEuMC41ICAgICAgICAgICAgICAgIGZhbnNpXzEuMC42ICAgICAgICAgICAgICBcbiBbODddIFM0QXJyYXlzXzEuNC4wICAgICAgICAgICAgdmlyaWRpc0xpdGVfMC40LjIgICAgICAgIFxuIFs4OV0gZHBseXJfMS4xLjQgICAgICAgICAgICAgICB1d290XzAuMi4yICAgICAgICAgICAgICAgXG4gWzkxXSBSZXNpZHVhbE1hdHJpeF8xLjE0LjAgICAgIGd0YWJsZV8wLjMuNSAgICAgICAgICAgICBcbiBbOTNdIHNhc3NfMC40LjkgICAgICAgICAgICAgICAgZGlnZXN0XzAuNi4zNSAgICAgICAgICAgIFxuIFs5NV0gU3BhcnNlQXJyYXlfMS40LjAgICAgICAgICBnZ3JlcGVsXzAuOS41ICAgICAgICAgICAgXG4gWzk3XSBkcXJuZ18wLjMuMiAgICAgICAgICAgICAgIGZhcnZlcl8yLjEuMSAgICAgICAgICAgICBcbiBbOTldIGh0bWx0b29sc18wLjUuOC4xICAgICAgICAgbGlmZWN5Y2xlXzEuMC40ICAgICAgICAgIFxuIFsgcmVhY2hlZCBnZXRPcHRpb24oXCJtYXgucHJpbnRcIikgLS0gb21pdHRlZCAzIGVudHJpZXMgXVxuIn0= --> <pre><code>R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.4 LTS @@ -4763,8 +4794,8 @@ <h2>Print session info</h2> [31] DelayedArray_0.30.0 BiocParallel_1.38.0 [33] irlba_2.3.5.1 parallel_4.4.1 [35] cluster_2.1.6 R6_2.5.1 - [37] RColorBrewer_1.1-3 bslib_0.7.0 - [39] stringi_1.8.3 limma_3.60.0 + [37] bslib_0.7.0 stringi_1.8.3 + [39] RColorBrewer_1.1-3 limma_3.60.0 [41] jquerylib_0.1.4 Rcpp_1.0.12 [43] knitr_1.46 readr_2.1.5 [45] batchelor_1.20.0 Matrix_1.7-0 @@ -4781,26 +4812,26 @@ <h2>Print session info</h2> [67] RhpcBLASctl_0.23-42 glue_1.7.0 [69] metapod_1.12.0 tools_4.4.1 [71] BiocNeighbors_1.22.0 ScaledMatrix_1.12.0 - [73] locfit_1.5-9.9 scran_1.32.0 - [75] cowplot_1.1.3 grid_4.4.1 - [77] edgeR_4.2.0 colorspace_2.1-0 - [79] GenomeInfoDbData_1.2.12 beeswarm_0.4.0 - [81] BiocSingular_1.20.0 vipor_0.4.7 - [83] cli_3.6.2 rsvd_1.0.5 - [85] fansi_1.0.6 S4Arrays_1.4.0 - [87] viridisLite_0.4.2 dplyr_1.1.4 - [89] uwot_0.2.2 ResidualMatrix_1.14.0 - [91] gtable_0.3.5 sass_0.4.9 - [93] digest_0.6.35 SparseArray_1.4.0 - [95] ggrepel_0.9.5 dqrng_0.3.2 - [97] farver_2.1.1 htmltools_0.5.8.1 - [99] lifecycle_1.0.4 httr_1.4.7 - [ reached getOption("max.print") -- omitted 2 entries ]</code></pre> + [73] locfit_1.5-9.9 fs_1.6.4 + [75] scran_1.32.0 cowplot_1.1.3 + [77] grid_4.4.1 edgeR_4.2.0 + [79] colorspace_2.1-0 GenomeInfoDbData_1.2.12 + [81] beeswarm_0.4.0 BiocSingular_1.20.0 + [83] vipor_0.4.7 cli_3.6.2 + [85] rsvd_1.0.5 fansi_1.0.6 + [87] S4Arrays_1.4.0 viridisLite_0.4.2 + [89] dplyr_1.1.4 uwot_0.2.2 + [91] ResidualMatrix_1.14.0 gtable_0.3.5 + [93] sass_0.4.9 digest_0.6.35 + [95] SparseArray_1.4.0 ggrepel_0.9.5 + [97] dqrng_0.3.2 farver_2.1.1 + [99] htmltools_0.5.8.1 lifecycle_1.0.4 + [ reached getOption("max.print") -- omitted 3 entries ]</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> </div> -<div id="rmd-source-code">LS0tCnRpdGxlOiAiSW50ZWdyYXRpbmcgc2NSTkEtc2VxIGRhdGFzZXRzIgphdXRob3I6IERhdGEgTGFiIGZvciBBTFNGCmRhdGU6IDIwMjMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUHJlcGFyZSBTQ0Ugb2JqZWN0cyBmb3IgaW50ZWdyYXRpb24KLSBBcHBseSBpbnRlZ3JhdGlvbiBtZXRob2RzIGluY2x1ZGluZyBgZmFzdE1OTmAgYW5kIGBoYXJtb255YAotIFZpc3VhbGx5IGV4cGxvcmUgdGhlIHJlc3VsdHMgb2YgaW50ZWdyYXRpb24KLSBVc2UgYHB1cnJyOjptYXAoKWAgZnVuY3Rpb25zIGZvciBpdGVyYXRpbmcgb3ZlciBsaXN0cwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBwZXJmb3JtIGludGVncmF0aW9uIG9uIHNjUk5BLXNlcSBkYXRhc2V0cyBmcm9tIHRoZSBbU2luZ2xlLWNlbGwgUGVkaWF0cmljIENhbmNlciBBdGxhcyAoYFNjUENBYCldKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvKSwgYSBkYXRhYmFzZSBvZiB1bmlmb3JtbHktcHJvY2Vzc2VkIHBlZGlhdHJpYyBzY1JOQS1zZXEgZGF0YSBidWlsdCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRGF0YSBMYWIuClRoZSBgU2NQQ0FgIGRhdGFiYXNlIGN1cnJlbnRseSBob3N0cyBzaW5nbGUtY2VsbCBwZWRpYXRyaWMgY2FuY2VyIHRyYW5zY3JpcHRvbWljIGRhdGEgZ2VuZXJhdGVkIGJ5IEFMU0YtZnVuZGVkIGxhYnMsIHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIHRoaXMgZGF0YSBlYXNpbHkgYWNjZXNzaWJsZSB0byBpbnZlc3RpZ2F0b3JzIChsaWtlIHlvdSEpLgpUaGUgZXhwcmVzc2lvbiBkYXRhIGluIGBTY1BDQWAgd2VyZSBtYXBwaW5nIGFuZCBxdWFudGlmaWVkIHdpdGggW2BhbGV2aW4tZnJ5YF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAyMi0wMTQwOC0zKSwgZm9sbG93ZWQgYnkgcHJvY2Vzc2luZyB3aXRoIEJpb2NvbmR1Y3RvciB0b29scyB1c2luZyB0aGUgc2FtZSBnZW5lcmFsIHByb2NlZHVyZXMgdGhhdCB3ZSBoYXZlIGNvdmVyZWQgaW4gdGhpcyB3b3Jrc2hvcC4KVGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgdXNlZCBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgYW5kIGBtaVFDYCB0byBmaWx0ZXIgdGhlIHJhdyBjb3VudHMgbWF0cml4LCBgc2N1dHRsZWAgdG8gbG9nLW5vcm1hbGl6ZSB0aGUgY291bnRzLCBhbmQgYHNjYXRlcmAgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24uClRoZSBwcm9jZXNzZWQgZGF0YSBhcmUgc3RvcmVkIGFzIGAucmRzYCBmaWxlcyBjb250YWluaW5nIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0cy4KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaG93IGRhdGEgaW4gdGhlIGBTY1BDQWAgaXMgcHJvY2Vzc2VkIGluIFt0aGUgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXShodHRwczovL3NjcGNhLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8pLgoKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogSW50ZWdyYXRpb24gT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfbWVyZ2UtaW50ZWdyYXRlLnBuZykKClRvIGxlYXJuIGFib3V0IGludGVncmF0aW9uLCB3ZSdsbCBoYXZlIGEgbG9vayBhdCBmb3VyIHNhbXBsZXMgZnJvbSB0aGUgW2BTQ1BDUDAwMDAwNWAgcHJvamVjdF0oaHR0cHM6Ly9zY3BjYS5hbGV4c2xlbW9uYWRlLm9yZy9wcm9qZWN0cy9TQ1BDUDAwMDAwNSkgKFtQYXRlbCBfZXQgYWwuXyAyMDIyXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBbRHllcl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2R5ZXItbGFiLmh0bWwpIGFuZCBbQ2hlbl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2NoZW4tbGFiLXRhb3NoZW5nLmh0bWwpIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhlIHBhcnRpY3VsYXIgbGlicmFyaWVzIHdlJ2xsIGludGVncmF0ZSBjb21lIGZyb20gdHdvIHJoYWJkb215b3NhcmNvbWEgKFJNUykgcGF0aWVudHMsIHdpdGggdHdvIHNhbXBsZXMgZnJvbSBlYWNoIG9mIHR3byBwYXRpZW50cywgYWxsIHNlcXVlbmNlZCB3aXRoIDEweCBDaHJvbWl1bSB2MyB0ZWNobm9sb2d5LgpFYWNoIGxpYnJhcnkgaXMgZnJvbSBhIHNlcGFyYXRlIGJpb2xvZ2ljYWwgc2FtcGxlLgoKV2UnbGwgYmUgaW50ZWdyYXRpbmcgdGhlc2Ugc2FtcGxlcyB3aXRoIHR3byBkaWZmZXJlbnQgdG9vbHMsIFtgZmFzdE1OTmBdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy8zLjE2L2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkgKFtIYWdodmVyZGkgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbmJ0LjQwOTEpKSBhbmQgW2BoYXJtb255YF0oaHR0cHM6Ly9wb3J0YWxzLmJyb2FkaW5zdGl0dXRlLm9yZy9oYXJtb255LykgKFtLb3JzdW5za3kgX2V0IGFsLl8gMjAxOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAxOS0wNjE5LTApKS4KSW50ZWdyYXRpb24gY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdGhhdCBhcmlzZSBmcm9tIGRpZmZlcmVudCBsaWJyYXJ5IHByZXBhcmF0aW9ucywgZ2VuZXRpYyBiYWNrZ3JvdW5kcywgYW5kIG90aGVyIHNhbXBsZS1zcGVjaWZpYyBmYWN0b3JzLCBzbyB0aGF0IGRhdGFzZXRzIGNhbiBiZSBqb2ludGx5IGFuYWx5emVkIGF0IHRoZSBjZWxsIGxldmVsLgpgZmFzdE1OTmAgY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdXNpbmcgYSBmYXN0ZXIgdmFyaWFudCBvZiB0aGUgbXV0dWFsLW5lYXJlc3QgbmVpZ2hib3JzIGFsZ29yaXRobSwgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIHdoaWNoIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBmcm9tIHRoaXMgW3ZpZ25ldHRlIGJ5IEx1biAoMjAxOSldKGh0dHBzOi8vbWFyaW9uaWxhYi5naXRodWIuaW8vRnVydGhlck1OTjIwMTgvdGhlb3J5L2Rlc2NyaXB0aW9uLmh0bWwpLgpgaGFybW9ueWAsIG9uIHRoZSBvdGhlciBoYW5kLCBjb3JyZWN0cyBmb3IgYmF0Y2ggZWZmZWN0cyB1c2luZyBhbiBpdGVyYXRpdmUgY2x1c3RlcmluZyBhcHByb2FjaCwgYW5kIHVubGlrZSBgZmFzdE1OTmAsIGl0IGlzIGFsc28gYWJsZSB0byBjb25zaWRlciBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgYmV5b25kIGp1c3QgdGhlIGJhdGNoIGdyb3VwaW5ncy4KClJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW50ZWdyYXRpb24gdG9vbCBpcyB1c2VkLCB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCAoU0NFKSBvYmplY3RzIGZpcnN0IG5lZWQgdG8gYmUgcmVmb3JtYXR0ZWQgYW5kIG1lcmdlZCBpbnRvIGEgc2luZ2xlICh1bmNvcnJlY3RlZCEpIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcy4KVGhpcyBtZXJnZWQgU0NFIGNhbiB0aGVuIGJlIHVzZWQgZm9yIGludGVncmF0aW9uIHRvIG9idGFpbiBhIGZvcm1hbGx5IGJhdGNoLWNvcnJlY3RlZCBTQ0Ugb2JqZWN0LgoKCiMjIFNldCB1cAoKYGBge3Igc2V0dXB9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAgIyBwbG90dGluZyB0b29scwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAjIHdvcmsgd2l0aCBTQ0Ugb2JqZWN0cwoKIyBTZXQgdGhlIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxMjM0NSkKYGBgCgoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKCldlIGhhdmUgYWxyZWFkeSBwcmVwYXJlZCBjb3VudCBkYXRhIGZvciB0aGUgZm91ciBzYW1wbGVzIHdlJ2xsIGJlIGludGVncmF0aW5nIChpLmUuLCBmaWx0ZXJlZCBjZWxscywgbm9ybWFsaXplZCBjb3VudHMsIGFuZCBjYWxjdWxhdGVkIFBDQSAmIFVNQVApLgpUaGVzZSBTQ0Ugb2JqZWN0cywgc3RvcmVkIGFzIFJEUyBmaWxlcywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYGRhdGEvcm1zL3Byb2Nlc3NlZC9gIGRpcmVjdG9yeSBhbmQgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGVpciBgU2NQQ0FgIGxpYnJhcnkgaWRzIDoKCi0gYFNDUENMMDAwNDc5LnJkc2AgKFBhdGllbnQgQSkKLSBgU0NQQ0wwMDA0ODAucmRzYCAoUGF0aWVudCBBKQotIGBTQ1BDTDAwMDQ4MS5yZHNgIChQYXRpZW50IEIpCi0gYFNDUENMMDAwNDgyLnJkc2AgKFBhdGllbnQgQikKClRvIGJlZ2luLCBsZXQncyBzZXQgdXAgb3VyIGRpcmVjdG9yaWVzIGFuZCBmaWxlczoKCmBgYHtyIGRpcmVjdG9yaWVzLCBsaXZlID0gVFJVRX0KIyBEZWZpbmUgZGlyZWN0b3J5IHdoZXJlIHByb2Nlc3NlZCBTQ0Ugb2JqZWN0cyB0byBiZSBpbnRlZ3JhdGVkIGFyZSBzdG9yZWQKaW5wdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAicHJvY2Vzc2VkIikKCiMgRGVmaW5lIGRpcmVjdG9yeSB0byBzYXZlIGludGVncmF0ZWQgU0NFIG9iamVjdCB0bwpvdXRwdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAiaW50ZWdyYXRlZCIpCgojIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKaWYgKCEoZGlyLmV4aXN0cyhvdXRwdXRfZGlyKSkpIHsKICBkaXIuY3JlYXRlKG91dHB1dF9kaXIpCn0KCiMgRGVmaW5lIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGVkIG9iamVjdAppbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChvdXRwdXRfZGlyLCAicm1zX2ludGVncmF0ZWRfc3Vic2V0LnJkcyIpCmBgYAoKCldlIGNhbiB1c2UgdGhlIGBkaXIoKWAgZnVuY3Rpb24gdG8gbGlzdCBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBkaXJlY3RvcnksIGZvciBleGFtcGxlIHRvIHNlZSBhbGwgdGhlIGZpbGVzIGluIG91ciBgaW5wdXRfZGlyYDoKCmBgYHtyIGlucHV0IGRpciwgbGl2ZSA9IFRSVUV9CmRpcihpbnB1dF9kaXIpCmBgYAoKV2Ugd2FudCB0byByZWFkIGluIGp1c3QgZm91ciBvZiB0aGVzZSBmaWxlcywgYXMgbGlzdGVkIHByZXZpb3VzbHkuClRvIHJlYWQgaW4gdGhlc2UgZmlsZXMsIHdlIGNvdWxkIHVzZSB0aGUgYHJlYWRyOjpyZWFkX3JkcygpYCBmdW5jdGlvbiAob3IgdGhlIGJhc2UgUiBgcmVhZFJEUygpYCkgZm91ciB0aW1lcywgb25jZSBmb3IgZWFjaCBvZiB0aGUgZmlsZXMuCldlIGNvdWxkIGFsc28gdXNlIGEgYGZvcmAgbG9vcCwgd2hpY2ggaXMgdGhlIGFwcHJvYWNoIHRoYXQgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgd291bGQgbGVhbiB0b3dhcmQuCkEgZGlmZmVyZW50IGFuZCBtb3JlIG1vZHVsYXIgY29kaW5nIGFwcHJvYWNoIHRvIHJlYWRpbmcgaW4gdGhlc2UgZmlsZXMgKGFuZCBtb3JlISkgaXMgdG8gbGV2ZXJhZ2UgdGhlIFtgcHVycnJgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvKSBgdGlkeXZlcnNlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIGxpc3RzLgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgYHB1cnJyYCBmdW5jdGlvbnMgYW5kIHRoZWlyIHBvd2VyIGFuZCB1dGlsaXR5IGluIFIgaW4gW3RoZSAiRnVuY3Rpb25hbHMiIGNoYXB0ZXIgb2YgdGhlIF9BZHZhbmNlZCBSXyBlLWJvb2tdKGh0dHBzOi8vYWR2LXIuaGFkbGV5Lm56L2Z1bmN0aW9uYWxzLmh0bWwpLgoKT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyB0aGUgW2BwdXJycjo6bWFwKClgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL21hcC5odG1sKSBmYW1pbHkgb2YgZnVuY3Rpb25zLCB3aGljaCBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgb2YgYSBsaXN0IChvciB2ZWN0b3IpIGluIG9uZSBjYWxsLgpUaGUgZ2VuZXJhbCBzeW50YXggZm9yIGBwdXJycjo6bWFwKClgIGFuZCBmcmllbmRzIGlzOgoKYGBgCiMgU3ludGF4IGZvciB1c2luZyB0aGUgbWFwIGZ1bmN0aW9uOgpwdXJycjo6bWFwKDxpbnB1dCBsaXN0IG9yIHZlY3Rvcj4sCiAgICAgICAgICAgPGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiB0aGUgaW5wdXQ+LAogICAgICAgICAgIDxhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGNhbiBnbyBoZXJlPiwKICAgICAgICAgICA8YW5kIGFsc28gaGVyZSBpZiB0aGVyZSBhcmUgZXZlbiBtb3JlIGFyZ3VtZW50cywgYW5kIHNvIG9uPikKYGBgCgoKVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYHB1cnJyOjptYXAoKWAgaXMgYWx3YXlzIGEgbGlzdCAoYnV0IG5vdGUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgYHB1cnJyOjptYXAoKWAgcmVsYXRpdmVzIHdoaWNoIHJldHVybiBvdGhlciBvYmplY3QgdHlwZXMsIGFzIHlvdSBjYW4gcmVhZCBhYm91dCBpbiBbdGhlIGBwdXJycjo6bWFwKClgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW5kZXguaHRtbCkpLgpJZiB0aGlzIGNvbmNlcHQgc291bmRzIGEgbGl0dGxlIGZhbWlsaWFyIHRvIHlvdSwgdGhhdCdzIGJlY2F1c2UgaXQgcHJvYmFibHkgaXMhCkJhc2UgUidzIGBsYXBwbHkoKWAgZnVuY3Rpb24gY2FuIHByb3ZpZGUgc2ltaWxhciB1dGlsaXR5LCBhbmQgdGhlIGBwdXJycjo6bWFwKClgIGZhbWlseSBvZiBmdW5jdGlvbnMgY2FuIChpbiBwYXJ0KSBiZSB0aG91Z2h0IG9mIGFzIGFuIGFsdGVybmF0aXZlIHRvIHNvbWUgb2YgdGhlIGJhc2UgUiBgYXBwbHlgIGZ1bmN0aW9ucywgd2l0aCBtb3JlIGNvbnNpc3RlbnQgYmVoYXZpb3IuCgpMZXQncyBzZWUgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGBwdXJycjo6bWFwKClgIGluIGFjdGlvbiwgaW5zcGlyZWQgYnkgY2FuY2VyIGdyb3VwcyB0aGUgRGF0YSBMYWIgaGFzIGFuYWx5emVkIHRocm91Z2ggdGhlIFtPcGVuUEJUQV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvKSBwcm9qZWN0OgoKYGBge3IgbWFwIGV4YW1wbGV9CiMgRGVmaW5lIGEgbGlzdCBvZiBjYW5jZXIgaGlzdG9sb2dpZXMKaGlzdG9sb2dpZXMgPC0gbGlzdCgKICAibG93LWdyYWRlIGdsaW9tYXMiICA9IGMoIlNFR0EiLCAiUEEiLCAiR05HIiwgIlBYQSIpLAogICJoaWdoLWdyYWRlIGdsaW9tYXMiID0gYygiRE1HIiwgIkRJUEciKSwKICAiZW1icnlvbmFsIHR1bW9ycyIgICA9IGMoIk1CIiwgIkFUUlQiLCAiRVRNUiIpCiApCgojIFRoZSBvdmVyYWxsIGxlbmd0aCBvZiB0aGUgbGlzdCBpcyAzCmxlbmd0aChoaXN0b2xvZ2llcykKCiMgSG93IGNhbiB3ZSBydW4gYGxlbmd0aCgpYCBvbiBlYWNoIGl0ZW0gb2YgdGhlIGxpc3Q/CiMgV2UgY2FuIHVzZSBvdXIgbmV3IGZyaWVuZCBwdXJycjo6bWFwKCk6CnB1cnJyOjptYXAoaGlzdG9sb2dpZXMsIGxlbmd0aCkKYGBgCgpPbmUgb3RoZXIgbmV3IGNvZGluZyBzdHJhdGVneSB3ZSdsbCBsZWFybiBpbiB0aGlzIG5vdGVib29rIGlzIHVzaW5nIHRoZSBbYGdsdWVgXShodHRwczovL2dsdWUudGlkeXZlcnNlLm9yZy8pIHBhY2thZ2UgdG8gY29tYmluZSBzdHJpbmdzLgpUaGlzIHBhY2thZ2Ugb2ZmZXJzIGEgY29udmVuaWVudCBmdW5jdGlvbiBgZ2x1ZTo6Z2x1ZSgpYCB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGJhc2UgUiBgcGFzdGUoKWAgZnVuY3Rpb24uCgpgYGB7ciBwYXN0ZX0KIyBEZWZpbmUgYSB2YXJpYWJsZSBmb3IgZXhhbXBsZToKb3JnX25hbWUgPC0gIkRhdGEgTGFiIgoKIyBXZSBjYW4gdXNlIHBhc3RlIHRvIGNvbWJpbmUgc3RyaW5ncyBhbmQgdmFyaWFibGVzOgpwYXN0ZSgiV2VsY29tZSB0byB0aGUiLCBvcmdfbmFtZSwgIndvcmtzaG9wIG9uIEFkdmFuY2VkIHNjUk5BLXNlcSEiKQpgYGAKCldlIGNhbiB1c2UgYGdsdWU6OmdsdWUoKWAgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBnb2FsIHdpdGggc29tZSBkaWZmZXJlbnQgc3ludGF4OgoKYGBge3IgZ2x1ZX0KIyBnbHVlOjpnbHVlIHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCAob25seSBvbmUgc2V0IG9mIHF1b3RlcyEpLCBhbmQKIyAgdmFyaWFibGVzIGNhbiBlYXNpbHkgYmUgaW5jbHVkZWQgaW5zaWRlIHtjdXJseSBicmFjZXN9CmdsdWU6OmdsdWUoIldlbGNvbWUgdG8gdGhlIHtvcmdfbmFtZX0gd29ya3Nob3Agb24gQWR2YW5jZWQgc2NSTkEtc2VxISIpCmBgYAoKKE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgYGdsdWU6OmdsdWUoKWAgb3V0cHV0IGlzbid0IGluIHF1b3RlcywgaXQgc3RpbGwgYmVoYXZlcyBsaWtlIGEgc3RyaW5nISkKCgpBbHJpZ2h0LCB0aW1lIGZvciB0aGUgZ29vZCBzdHVmZiEKTGV0J3MgdXNlIGBwdXJycjo6bWFwKClgIHRvIHJlYWQgaW4gb3VyIFNDRSBvYmplY3RzIHNvIHRoYXQgdGhleSBhcmUgaW1tZWRpYXRlbHkgc3RvcmVkIHRvZ2V0aGVyIGluIGEgbGlzdC4KCgpXZSdsbCBmaXJzdCBuZWVkIHRvIGRlZmluZSBhIHZlY3RvciBvZiB0aGUgZmlsZSBwYXRocyB0byByZWFkIGluLgpXZSdsbCBzdGFydCBieSBjcmVhdGluZyBhIHZlY3RvciBvZiBzYW1wbGUgbmFtZXMgdGhlbXNlbHZlcyBhbmQgdGhlbiBmb3JtYXR0aW5nIHRoZW0gaW50byB0aGUgY29ycmVjdCBwYXRocy4KVGhpcyB3YXkgKGZvcmVzaGFkb3dpbmchKSB3ZSBhbHNvIGhhdmUgYSBzdGFuZC1hbG9uZSB2ZWN0b3Igb2YganVzdCBzYW1wbGUgbmFtZXMsIHdoaWNoIHdpbGwgY29tZSBpbiBoYW5keSEKCmBgYHtyIHNhbXBsZSBuYW1lc30KIyBWZWN0b3Igb2YgYWxsIHRoZSBzYW1wbGVzIHRvIHJlYWQgaW46CnNhbXBsZV9uYW1lcyA8LSBjKCJTQ1BDTDAwMDQ3OSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MCIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MiIpCmBgYAoKCmBgYHtyIGRlZmluZSBzY2VfcGF0aHMsIGxpdmUgPSBUUlVFfQojIE5vdywgY29udmVydCB0aGVzZSB0byBmaWxlIHBhdGhzOiA8aW5wdXRfZGlyPi88c2FtcGxlX25hbWU+LnJkcwpzY2VfcGF0aHMgPC0gZmlsZS5wYXRoKGlucHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWVzfS5yZHMiKQopCiMgUHJpbnQgdGhlIHNjZV9wYXRocyB2ZWN0b3IKc2NlX3BhdGhzCmBgYAoKV2UgY2FuIG5vdyByZWFkIHRoZXNlIGZpbGVzIGluIGFuZCBjcmVhdGUgYSBsaXN0IG9mIGZvdXIgU0NFIG9iamVjdHMuClNpbmNlIGByZWFkcjo6cmVhZF9yZHMoKWAgY2FuIG9ubHkgb3BlcmF0ZSBvbiBvbmUgaW5wdXQgYXQgYSB0aW1lLCB3ZSdsbCBuZWVkIHRvIHVzZSBgcHVycnI6Om1hcCgpYCB0byBydW4gaXQgb24gYWxsIGlucHV0IGZpbGUgcGF0aHMgaW4gb25lIGNvbW1hbmQuCkFsdGhvdWdoIGBzY2VfcGF0aHNgIGlzIGEgdmVjdG9yIChub3QgYSBsaXN0KSwgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGlucHV0IHRvIGBwdXJycjptYXAoKWAuClRoZSBvdXRwdXQgZnJvbSB0aGlzIGNvZGUgd2lsbCBzdGlsbCBiZSBhIGxpc3QsIHNpbmNlIHRoYXQncyB3aGF0IGBwdXJycjo6bWFwKClgIGFsd2F5cyByZXR1cm5zLgoKYGBge3IgcmVhZCBzY2UgcGF0aHMsIGxpdmUgPSBUUlVFfQojIFVzZSBwdXJycjo6bWFwKCkgdG8gcmVhZCBhbGwgZmlsZXMgaW50byBhIGxpc3QgYXQgb25jZQpzY2VfbGlzdCA8LSBwdXJycjo6bWFwKAogIHNjZV9wYXRocywKICByZWFkcjo6cmVhZF9yZHMKKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IG91ciBsaXN0IG9mIFNDRSBvYmplY3RzOgoKYGBge3IgcHJpbnQgc2NlIGxpc3QsIGxpdmU9VFJVRX0KIyBQcmludCBzY2VfbGlzdApzY2VfbGlzdApgYGAKCldlIG5vdyBoYXZlIGEgbGlzdCBvZiBsZW5ndGggZm91ciwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgcHJvY2Vzc2VkIFNDRSBvYmplY3QhCkhvd2V2ZXIsIHdlJ2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBzYW1wbGUgZWFjaCBpdGVtIGlzLCBzbyBpdCdzIGhlbHBmdWwgdG8gYWRkIF9uYW1lc18gdG8gdGhpcyBsaXN0IHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgc2FtcGxlIG5hbWVzLgoKYGBge3IgYWRkIGxpc3QgbmFtZXMsIGxpdmUgPSBUUlVFfQojIEFzc2lnbiB0aGUgc2FtcGxlIG5hbWVzIGFzIHRoZSBuYW1lcyBmb3Igc2NlX2xpc3QKbmFtZXMoc2NlX2xpc3QpIDwtIHNhbXBsZV9uYW1lcwpgYGAKCmBgYHtyIHByaW50IG5hbWVkIGxpc3QsIGxpdmU9VFJVRX0KIyBQcmludCB0aGUgbGlzdCB0byBzZWUgaXQgd2l0aCBuYW1lcwpzY2VfbGlzdApgYGAKCklmIHlvdSBsb29rIGNsb3NlbHkgYXQgdGhlIHByaW50ZWQgU0NFIG9iamVjdHMsIHlvdSBtYXkgbm90aWNlIHRoYXQgdGhleSBhbGwgY29udGFpbiBgY29sRGF0YWAgdGFibGUgY29sdW1ucyBgY2VsbHR5cGVfZmluZWAgYW5kIGBjZWxsdHlwZV9icm9hZGAuClRoZXNlIGNvbHVtbnMgKHdoaWNoIHdlIGFkZGVkIHRvIFNDRSBvYmplY3RzIGR1cmluZyBbcHJlLXByb2Nlc3NpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3RyYWluaW5nLW1vZHVsZXMvdHJlZS9tYXN0ZXIvc2NSTkEtc2VxLWFkdmFuY2VkL3NldHVwL3JtcykpIGNvbnRhaW4gcHV0YXRpdmUgX2NlbGwgdHlwZSBhbm5vdGF0aW9uc18gYXMgYXNzaWduZWQgaW4gW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpLgpXZSB3aWxsIGVuZCB1cCBsZXZlcmFnaW5nIHRoZXNlIGNlbGwgdHlwZSBhbm5vdGF0aW9ucyB0byBleHBsb3JlIGhvdyBzdWNjZXNzZnVsIG91ciBpbnRlZ3JhdGlvbiBpczsgYWZ0ZXIgaW50ZWdyYXRpb24sIHdlIGV4cGVjdCBjZWxsIHR5cGVzIGZyb20gZGlmZmVyZW50IHNhbXBsZXMgdG8gZ3JvdXAgdG9nZXRoZXIsIHJhdGhlciB0aGFuIGJlaW5nIHNlcGFyYXRlZCBieSBiYXRjaGVzLgoKVGhhdCBzYWlkLCB0aGUgaW50ZWdyYXRpb24gbWV0aG9kcyB3ZSB3aWxsIGJlIGFwcGx5aW5nIF9kbyBub3QgYWN0dWFsbHkgdXNlXyB0aGVzZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMuCklmIHdlIGhhdmUgYW5ub3RhdGlvbnMsIHRoZXkgYXJlIGEgaGVscGZ1bCAiYm9udXMiIGZvciBhc3Nlc3NpbmcgdGhlIGludGVncmF0aW9uJ3Mgc3VjY2VzcywgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbnRlZ3JhdGlvbiBpdHNlbGYuCgoKIyMgUHJlcGFyZSB0aGUgU0NFIGxpc3QgZm9yIGludGVncmF0aW9uCgohW1NpbmdsZS1jZWxsIHJvYWRtYXA6IE1lcmdlXShkaWFncmFtcy9yb2FkbWFwX211bHRpX21lcmdlLnBuZykKCgpOb3cgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiBwcm9jZXNzZWQgU0NFIG9iamVjdHMsIHdlIG5lZWQgdG8gbWVyZ2UgdGhlIG9iamVjdHMgaW50byBvbmUgb3ZlcmFsbCBTQ0Ugb2JqZWN0IGZvciBpbnB1dCB0byBpbnRlZ3JhdGlvbi4KQSB3b3JkIG9mIGNhdXRpb24gYmVmb3JlIHdlIGJlZ2luOiAqKlRoaXMgbWVyZ2VkIFNDRSBvYmplY3QgaXMgTk9UIGFuIGludGVncmF0ZWQgU0NFISoqCk1lcmdpbmcgU0NFcyBkb2VzIG5vdCBwZXJmb3JtIGFueSBiYXRjaCBjb3JyZWN0aW9uLCBidXQganVzdCByZW9yZ2FuaXplcyB0aGUgZGF0YSB0byBhbGxvdyB1cyB0byBwcm9jZWVkIHRvIGludGVncmF0aW9uIG5leHQuCgpUbyBtZXJnZSBTQ0Ugb2JqZWN0cywgd2UgZG8gbmVlZCB0byBkbyBzb21lIHdyYW5nbGluZyBhbmQgYm9va2tlZXBpbmcgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYW5kIHRoYXQgd2UgZG9uJ3QgbG9zZSBpbXBvcnRhbnQgaW5mb3JtYXRpb24uCk92ZXJhbGwgd2UnbGwgd2FudCB0byB0YWtlIGNhcmUgb2YgdGhlc2UgaXRlbXM6CgoxLiBXZSBzaG91bGQgYmUgYWJsZSB0byB0cmFjZSBzYW1wbGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgb3JpZ2luYXRpbmcgc2FtcGxlLCBpbmNsdWRpbmcuLi4KICAgIC0gQ2VsbC1sZXZlbCBpbmZvcm1hdGlvbjogV2hpY2ggc2FtcGxlIGlzIGVhY2ggY2VsbCBmcm9tPwogICAgLSBMaWJyYXJ5LXNwZWNpZmljIGZlYXR1cmUgc3RhdGlzdGljcywgZS5nLiwgZ2VuZS1sZXZlbCBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGxpYnJhcnkgZm91bmQgaW4gYHJvd0RhdGFgLgogICAgV2hpY2ggc2FtcGxlIGlzIGEgZ2l2ZW4gZmVhdHVyZSBzdGF0aXN0aWMgZnJvbT8KMi4gU0NFIG9iamVjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIHNhbWUgZ2VuZXM6IEVhY2ggU0NFIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSByb3cgbmFtZXMuCjMuIFNDRSBjZWxsIG1ldGFkYXRhIGNvbHVtbnMgc2hvdWxkIG1hdGNoOiBUaGUgYGNvbERhdGFgIGZvciBlYWNoIFNDRSBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgY29sdW1uIG5hbWVzLgoKCldlJ2xsIGJlZ2luIGJ5IHRha2luZyBzb21lIHRpbWUgdG8gdGhvcm91Z2hseSBleHBsb3JlIG91ciBTQ0Ugb2JqZWN0cyBhbmQgZmlndXJlIG91dCB3aGF0IHdyYW5nbGluZyBzdGVwcyB3ZSBuZWVkIHRvIHRha2UgZm9yIHRoZXNlIHNwZWNpZmljIGRhdGEuCkRvbid0IHNraXAgdGhpcyBleHBsb3JhdGlvbiEKQmVhciBpbiBtaW5kIHRoYXQgdGhlIGV4YWN0IHdyYW5nbGluZyBzaG93biBoZXJlIHdpbGwgbm90IGJlIHRoZSBzYW1lIGZvciBvdGhlciBTQ0Ugb2JqZWN0cyB5b3Ugd29yayB3aXRoLCBidXQgdGhlIHNhbWUgZ2VuZXJhbCBwcmluY2lwbGVzIGFwcGx5LgoKCiMjIyMgUHJlc2VydmluZyBzYW1wbGUgaW5mb3JtYXRpb24gYXQgdGhlIGNlbGwgbGV2ZWwKCkhvdyB3aWxsIHdlIGJlIGFibGUgdG8gdGVsbCB3aGljaCBzYW1wbGUgYSBnaXZlbiBjZWxsIGNhbWUgZnJvbT8KClRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHNpbXBseSB0byBhZGQgYSBgY29sRGF0YWAgY29sdW1uIHdpdGggdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiwgc28gdGhhdCB3ZSBjYW4ga25vdyB3aGljaCBzYW1wbGUgZWFjaCByb3cgY2FtZSBmcm9tLgoKSW4gYWRkaXRpb24sIHdlIHdhbnQgdG8gcGF5IHNvbWUgYXR0ZW50aW9uIHRvIHRoZSBTQ0Ugb2JqZWN0J3MgY29sdW1uIG5hbWVzICh0aGUgY2VsbCBpZHMpLCB3aGljaCBtdXN0IHJlbWFpbiB1bmlxdWUgYWZ0ZXIgbWVyZ2luZyBzaW5jZSBkdXBsaWNhdGUgaWRzIHdpbGwgY2F1c2UgYW4gUiBlcnJvci4KSW4gdGhpcyBjYXNlLCB0aGUgU0NFIGNvbHVtbiBuYW1lcyBhcmUgYmFyY29kZXMgKHdoaWNoIGlzIHVzdWFsbHkgYnV0IG5vdCBhbHdheXMgdGhlIGNhc2UgaW4gU0NFIG9iamVjdHMpLCB3aGljaCBhcmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBfd2l0aGluXyBhIHNhbXBsZSBidXQgbWF5IGJlIHJlcGVhdGVkIGFjcm9zcyBzYW1wbGVzLgpTbywgYWZ0ZXIgbWVyZ2luZywgaXQncyB0ZWNobmljYWxseSBwb3NzaWJsZSB0aGF0IG11bHRpcGxlIGNlbGxzIHdpbGwgaGF2ZSB0aGUgc2FtZSBiYXJjb2RlLgpUaGlzIHdvdWxkIGJlIGEgcHJvYmxlbSBmb3IgdHdvIHJlYXNvbnM6CkZpcnN0LCB0aGUgY2VsbCBpZCB3b3VsZCBub3QgYmUgYWJsZSB0byBwb2ludCB1cyBiYWNrIHRvIGNlbGwncyBvcmlnaW5hdGluZyBzYW1wbGUuClNlY29uZCwgaXQgd291bGQgbGl0ZXJhbGx5IGNhdXNlIGFuIGVycm9yIGluIFIsIHdoaWNoIGRvZXMgbm90IGFsbG93IGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXMuCgoKT25lIHdheSB0byBlbnN1cmUgdGhhdCBjZWxsIGlkcyByZW1haW4gdW5pcXVlIGV2ZW4gYWZ0ZXIgbWVyZ2luZyBpcyB0byBhY3R1YWxseSBtb2RpZnkgdGhlbSBieSBfcHJlcGVuZGluZ18gdGhlIHJlbGV2YW50IHNhbXBsZSBuYW1lLgpGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlc2UgYmFyY29kZXMgZm9yIHRoZSBgU0NQQ0wwMDA0NzlgIHNhbXBsZToKCmBgYHtyIGJhcmNvZGVzfQojIExvb2sgYXQgdGhlIGNvbHVtbiBuYW1lcyBmb3IgdGhlIGBTQ1BDTDAwMDQ3OWAgc2FtcGxlLCBmb3IgZXhhbXBsZQpjb2xuYW1lcyhzY2VfbGlzdCRTQ1BDTDAwMDQ3OSkgfD4KICAjIE9ubHkgcHJpbnQgb3V0IHRoZSBmaXJzdCA2IGZvciBjb252ZW5pZW5jZQogIGhlYWQoKQpgYGAKClRoZXNlIGlkcyB3aWxsIGJlIHVwZGF0ZWQgdG8gYFNDUENMMDAwNDc5LUdHR0FDQ1RDQUFHQ0dHQVRgLCBgU0NQQ0wwMDA0NzktQ0FDQUdBVEFHVEdBR1RHQ2AsIGFuZCBzbyBvbiwgdGhlcmVieSBlbnN1cmluZyBmdWxseSB1bmlxdWUgaWRzIGZvciBhbGwgY2VsbHMgYWNyb3NzIGFsbCBzYW1wbGVzLgoKIyMjIyBQcmVzZXJ2aW5nIHNhbXBsZSBpbmZvcm1hdGlvbiBhdCB0aGUgZ2VuZSBsZXZlbAoKVGhlIGByb3dEYXRhYCB0YWJsZSBpbiBTQ0Ugb2JqZWN0cyB3aWxsIG9mdGVuIGNvbnRhaW4gYm90aCAiZ2VuZXJhbCIgYW5kICJsaWJyYXJ5LXNwZWNpZmljIiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CgpgYGB7ciByb3dkYXRhfQpyb3dEYXRhKHNjZV9saXN0JFNDUENMMDAwNDc5KSB8PgogIGhlYWQoKQpgYGAKCkhlcmUsIHRoZSByb3duYW1lcyBhcmUgRW5zZW1ibCBnZW5lIGlkcywgYW5kIGNvbHVtbnMgYXJlIGBnZW5lX3N5bWJvbGAsIGBtZWFuYCwgYW5kIGBkZXRlY3RlZGAuClRoZSBgZ2VuZV9zeW1ib2xgIGNvbHVtbiBpcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBnZW5lcywgbm90IHNwZWNpZmljIHRvIGFueSBsaWJyYXJ5IG9yIGV4cGVyaW1lbnQsIGJ1dCBgbWVhbmAgYW5kIGBkZXRlY3RlZGAgYXJlIGxpYnJhcnktc3BlY2lmaWMgZ2VuZSBzdGF0aXN0aWNzLgpTbywgYGdlbmVfc3ltYm9sYCBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYWNlZCBiYWNrIHRvIGl0cyBvcmlnaW5hdGluZyBzYW1wbGUsIGJ1dCBgbWVhbmAgYW5kIGBkZXRlY3RlZGAgZG8uClRvIHRoaXMgZW5kLCB3ZSBjYW4gdGFrZSBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gd2hhdCB3ZSdsbCBkbyBmb3IgY2VsbCBpZHM6CldlIGNhbiBjaGFuZ2UgdGhlIHNhbXBsZS1zcGVjaWZpYyBgcm93RGF0YWAgY29sdW1uIG5hbWVzIGJ5IHByZXBlbmRpbmcgdGhlIHNhbXBsZSBuYW1lLgpGb3IgZXhhbXBsZSwgcmF0aGVyIHRoYW4gYmVpbmcgY2FsbGVkIGBtZWFuYCwgdGhpcyBjb2x1bW4gd2lsbCBiZSBuYW1lZCBgU0NQQ0wwMDA0NzktbWVhbmAgZm9yIHRoZSBgU0NQQ0wwMDA0NzlgIHNhbXBsZS4KCkFsbCBvdXIgU0NFIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBgcm93RGF0YWAgY29sdW1ucyAoYXMgd2UgY2FuIHNlZSBpbiB0aGUgbmV4dCBjaHVuayksIHNvIHdlJ2xsIHBlcmZvcm0gdGhpcyByZW5hbWluZyBhY3Jvc3MgYWxsIFNDRXMuCgpgYGB7ciBjb21wYXJlIHJvd2RhdGEsIGxpdmUgPSBUUlVFfQojIFVzZSBgcHVycnI6Om1hcCgpYCB0byBxdWlja2x5IGV4dHJhY3Qgcm93RGF0YSBjb2x1bW4gbmFtZXMgZm9yIGFsbCBTQ0VzCnB1cnJyOjptYXAoc2NlX2xpc3QsCiAgICAgICAgICAgXCh4KSBjb2xuYW1lcyhyb3dEYXRhKHgpKSkKYGBgCgoKIyMjIyBFbnN1cmluZyB0aGF0IG9ubHkgc2hhcmVkIGdlbmVzIGFyZSB1c2VkCgpUaGUgbmV4dCBzdGVwIGluIGVuc3VyaW5nIFNDRSBjb21wYXRpYmlsaXR5IGlzIHRvIG1ha2Ugc3VyZSB0aGV5IGFsbCBjb250YWluIHRoZSBzYW1lIGdlbmVzLCB3aGljaCBhcmUgc3RvcmVkIGFzIHRoZSBTQ0Ugb2JqZWN0J3Mgcm93IG5hbWVzICh0aGVzZSBuYW1lcyBhcmUgYWxzbyBmb3VuZCB0aGUgYHJvd0RhdGFgIHNsb3QncyByb3cgbmFtZXMpLgpIZXJlLCB0aG9zZSBnZW5lIGlkcyBhcmUgdW5pcXVlIEVuc2VtYmwgZ2VuZSBpZHMuCgpXZSBjYW4gdXNlIHNvbWUgYHB1cnJyYCBtYWdpYyB0byBxdWlja2x5IGZpbmQgdGhlIHNldCBvZiBzaGFyZWQgZ2VuZXMgYW1vbmcgb3VyIHNhbXBsZXM6CgpgYGB7ciBzaGFyZWQgZ2VuZXN9CiMgRGVmaW5lIHZlY3RvciBvZiBzaGFyZWQgZ2VuZXMKc2hhcmVkX2dlbmVzIDwtIHNjZV9saXN0IHw+CiAgIyBnZXQgcm93bmFtZXMgKGdlbmVzKSBmb3IgZWFjaCBTQ0UgaW4gc2NlX2xpc3QKICBwdXJycjo6bWFwKHJvd25hbWVzKSB8PgogICMgcmVkdWNlIHRvIHRoZSBfaW50ZXJzZWN0aW9uXyBhbW9uZyBsaXN0cwogIHB1cnJyOjpyZWR1Y2UoaW50ZXJzZWN0KQpgYGAKCmBgYHtyIHByaW50IHNoYXJlZCBnZW5lcywgbGl2ZSA9IFRSVUV9CiMgVXNlIGhlYWQgdG8gbG9vayBhdCB0aGUgdmVjdG9yIG9mIHNoYXJlZCBnZW5lczoKaGVhZChzaGFyZWRfZ2VuZXMpCmBgYAoKSW4gdGhpcyBjYXNlLCB3ZSBoYXBwZW4gdG8ga25vdyB0aGF0IGFsbCBTQ0Ugb2JqZWN0cyB3ZSdyZSB3b3JraW5nIHdpdGggYWxyZWFkeSBjb250YWluZWQgdGhlIHNhbWUgZ2VuZXMuCldlIGRvIGEgcXVpY2stYW5kLWRpcnR5IGNoZWNrIGZvciB0aGlzIGJ5IGxvb2tpbmcgYXQgdGhlIG51bWJlciBvZiByb3dzIGFjcm9zcyBTQ0Ugb2JqZWN0cywgYW5kIHdlJ2xsIHNlZSB0aGF0IHRoZXkgYXJlIGFsbCB0aGUgc2FtZToKCmBgYHtyIGNoZWNrIHNoYXJlZCBnZW5lcywgbGl2ZSA9IFRSVUV9CiMgVGhlIG51bWJlciBvZiBnZW5lcyBpbiBhbiBTQ0UgY29ycmVzcG9uZHMgdG8gaXRzIG51bWJlciBvZiByb3dzOgpzY2VfbGlzdCB8PgogIHB1cnJyOjptYXAobnJvdykKYGBgCgpTbywgZm9yIG91ciBkYXRhLCB3ZSB3aWxsIG5vdCBoYXZlIHRvIHN1YnNldCB0byBzaGFyZWQgZ2VuZXMgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzaGFyZWQhCgojIyMjIEVuc3VyaW5nIG1hdGNoaW5nIGNvbHVtbnMgaW4gYGNvbERhdGFgCgpGaW5hbGx5LCB3ZSdsbCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgY29sdW1uIG5hbWVzIGFjcm9zcyBhbGwgU0NFIGBjb2xEYXRhYCB0YWJsZXMsIHNvIGxldCdzIGxvb2sgYXQgYWxsIHRob3NlIGNvbHVtbiBuYW1lcy4KV2UgY2FuIHVzZSBzaW1pbGFyIHN5bnRheCBoZXJlIHRvIHdoYXQgd2UgdXNlZCB0byBsb29rIGF0IGFsbCB0aGUgYHJvd0RhdGFgIGNvbHVtbiBuYW1lcy4KCmBgYHtyIGNvbXBhcmUgY29sZGF0YX0KcHVycnI6Om1hcChzY2VfbGlzdCwKICAgICAgICAgICBcKHgpIGNvbG5hbWVzKGNvbERhdGEoeCkpICkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBjb2x1bW4gbmFtZXMgYXJlIGFsbCBhbHJlYWR5IG1hdGNoaW5nIGFtb25nIFNDRXMsIHNvIHRoZXJlJ3Mgbm8gc3BlY2lmaWMgcHJlcGFyYXRpb24gd2UnbGwgbmVlZCB0byBkbyB0aGVyZS4KCiMjIyBQZXJmb3JtIFNDRSBtZXJnaW5nCgpBcyB5b3UgY2FuIHNlZSwgdGhlcmUncyBhIGxvdCBvZiBtb3ZpbmcgcGFydHMgdG8gY29uc2lkZXIhCkFnYWluLCB0aGVzZSBtb3ZpbmcgcGFydHMgbWF5ICh3aWxsISkgZGlmZmVyIGZvciBTQ0VzIHRoYXQgeW91IGFyZSB3b3JraW5nIHdpdGgsIHNvIHlvdSBoYXZlIHRvIGV4cGxvcmUgeW91ciBvd24gU0NFcyBpbiBkZXB0aCB0byBwcmVwYXJlIGZvciBtZXJnaW5nLgoKQmFzZWQgb24gb3VyIGV4cGxvcmF0aW9uLCBoZXJlIGlzIGEgc2NoZW1hdGljIG9mIGhvdyBvbmUgb2YgdGhlIFNDRSBvYmplY3RzIHdpbGwgdWx0aW1hdGVseSBiZSBtb2RpZmllZCBpbnRvIHRoZSBmaW5hbCBtZXJnZWQgU0NFOgoKIVtdKGRpYWdyYW1zL3RlY2huaWNhbF9tZXJnZV9zY2UucG5nKQoKCldlJ2xsIHdyaXRlIGEgX2N1c3RvbSBmdW5jdGlvbl8gKHNlZW4gaW4gdGhlIGNodW5rIGJlbG93KSB0YWlsb3JlZCB0byBvdXIgd3JhbmdsaW5nIHN0ZXBzIHRoYXQgcHJlcGFyZXMgYSBzaW5nbGUgU0NFIG9iamVjdCBmb3IgbWVyZ2luZy4KV2UnbGwgdGhlbiB1c2Ugb3VyIG5ldyBgcHVycnI6Om1hcCgpYCBwcm9ncmFtbWluZyBza2lsbHMgdG8gcnVuIHRoaXMgZnVuY3Rpb24gb3ZlciB0aGUgYHNjZV9saXN0YC4KVGhpcyB3aWxsIGdpdmUgdXMgYSBuZXcgbGlzdCBvZiBmb3JtYXR0ZWQgU0NFcyB0aGF0IHdlIGNhbiBwcm9jZWVkIHRvIG1lcmdlLgpJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSBgZm9ybWF0X3NjZSgpYCBmdW5jdGlvbiB3cml0dGVuIGJlbG93IGlzIG5vdCBhIGZ1bmN0aW9uIGZvciBnZW5lcmFsIHVzZSDigJMgaXQncyBiZWVuIHByZWNpc2VseSB3cml0dGVuIHRvIG1hdGNoIHRoZSBwcm9jZXNzaW5nIHdlIG5lZWQgdG8gZG8gZm9yIF90aGVzZV8gU0NFcywgYW5kIGRpZmZlcmVudCBTQ0VzIHlvdSB3b3JrIHdpdGggd2lsbCByZXF1aXJlIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9jZXNzaW5nLgoKYGBge3IgZm9ybWF0X3NjZSBmdW5jdGlvbn0KZm9ybWF0X3NjZSA8LSBmdW5jdGlvbihzY2UsIHNhbXBsZV9uYW1lKSB7CiAgIyBJbnB1dCBhcmd1bWVudHM6CiAgIyMgc2NlOiBBbiBTQ0Ugb2JqZWN0IHRvIGZvcm1hdAogICMjIHNhbXBsZV9uYW1lOiBUaGUgU0NFIG9iamVjdCdzIG5hbWUKICAjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZvcm1hdHRlZCBTQ0Ugb2JqZWN0LgoKICAjIyMjIyMgRW5zdXJlIHRoYXQgd2UgY2FuIGlkZW50aWZ5IHRoZSBvcmlnaW5hdGluZyBzYW1wbGUgaW5mb3JtYXRpb24gIyMjIyMjCiAgIyBBZGQgYSBjb2x1bW4gY2FsbGVkIGBzYW1wbGVgIHRoYXQgc3RvcmVzIHRoaXMgaW5mb3JtYXRpb24KICAjIFRoaXMgd2lsbCBiZSBzdG9yZWQgaW4gYGNvbERhdGFgCiAgc2NlJHNhbXBsZSA8LSBzYW1wbGVfbmFtZQoKCiAgIyMjIyMjIEVuc3VyZSBjZWxsIGlkcyB3aWxsIGJlIHVuaXF1ZSAjIyMjIyMKICAjIFVwZGF0ZSB0aGUgU0NFIG9iamVjdCBjb2x1bW4gbmFtZXMgKGNlbGwgaWRzKSBieSBwcmVwZW5kaW5nIGBzYW1wbGVfbmFtZWAKICBjb2xuYW1lcyhzY2UpIDwtIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZX0te2NvbG5hbWVzKHNjZSl9IikKCgogICMjIyMjIyBFbnN1cmUgZ2VuZS1sZXZlbCBzdGF0aXN0aWNzIGNhbiBiZSBpZGVudGlmaWVkIGluIGByb3dEYXRhYCAjIyMjIyMKICAjIFdlIHdhbnQgdG8gcmVuYW1lIHRoZSBjb2x1bW5zIGBtZWFuYCBhbmQgYGRldGVjdGVkYCB0byBjb250YWluIHRoZSBgc2FtcGxlX25hbWVgCiAgIyBSZWNhbGwgdGhlIG5hbWVzIGFyZTogImdlbmVfc3ltYm9sIiwgIm1lYW4iLCAiZGV0ZWN0ZWQiCiAgY29sbmFtZXMocm93RGF0YShzY2UpKSA8LSBjKCJnZW5lX3N5bWJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZX0tbWVhbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWV9LWRldGVjdGVkIikpCgogICMgUmV0dXJuIHRoZSBmb3JtYXR0ZWQgU0NFIG9iamVjdAogIHJldHVybihzY2UpCn0KYGBgCgpUbyBydW4gdGhpcyBmdW5jdGlvbiwgd2UnbGwgdXNlIHRoZSBgcHVycnI6Om1hcDIoKWAgZnVuY3Rpb24sIGEgcmVsYXRpdmUgb2YgYHB1cnJyOjptYXAoKWAgdGhhdCBhbGxvd3MgeW91IHRvIGxvb3Agb3ZlciBfdHdvXyBpbnB1dCBsaXN0cy92ZWN0b3JzLgpJbiBvdXIgY2FzZSwgd2Ugd2FudCB0byBydW4gYGZvcm1hdF9zY2UoKWAgb3ZlciBwYWlyZWQgYHNjZV9saXN0YCBpdGVtcyBhbmQgYHNjZV9saXN0YCBuYW1lcy4KCmBgYHtyIGZvcm1hdCBzY2VzIGZvciBtZXJnZSwgbGl2ZSA9IFRSVUV9CiMgV2UgY2FuIHVzZSBgcHVycnI6Om1hcDIoKWAgdG8gbG9vcCBvdmVyIHR3byBsaXN0L3ZlY3RvciBhcmd1bWVudHMKc2NlX2xpc3RfZm9ybWF0dGVkIDwtIHB1cnJyOjptYXAyKAogICMgRWFjaCAiaXRlcmF0aW9uIiB3aWxsIG1hcmNoIGRvd24gdGhlIGZpcnN0IHR3bwogICMgIGFyZ3VtZW50cyBgc2NlX2xpc3RgIGFuZCBgbmFtZXMoc2NlX2xpc3QpYCBpbiBvcmRlcgogIHNjZV9saXN0LAogIG5hbWVzKHNjZV9saXN0KSwKICAjIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIHJ1bgogIGZvcm1hdF9zY2UKKQoKIyBQcmludCByZXN1bHRpbmcgbGlzdApzY2VfbGlzdF9mb3JtYXR0ZWQKYGBgCgooUHNzdCwgbGlrZSBgcHVycnJgIGFuZCB3YW50IHRvIGRpdmUgZGVlcGVyPyBDaGVjayBvdXQgW3RoZSBgcHVycnI6OmltYXAoKWAgZnVuY3Rpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW1hcC5odG1sKSEpCgoKQXQgbG9uZyBsYXN0LCB3ZSBhcmUgcmVhZHkgdG8gbWVyZ2UgdGhlIFNDRXMsIHdoaWNoIHdlJ2xsIGRvIHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGBjYmluZCgpYC4KVGhlIGBjYmluZCgpYCBmdW5jdGlvbiBpcyBvZnRlbiB1c2VkIHRvIGNvbWJpbmUgZGF0YSBmcmFtZXMgb3IgbWF0cmljZXMgYnkgY29sdW1uLCBpLmUuICJzdGFjayIgdGhlbSBuZXh0IHRvIGVhY2ggb3RoZXIuClRoZSBzYW1lIHByaW5jaXBsZSBhcHBsaWVzIGhlcmUsIGJ1dCB3aGVuIHJ1biBvbiBTQ0Ugb2JqZWN0cywgYGNiaW5kKClgIHdpbGwgY3JlYXRlIGEgbmV3IFNDRSBvYmplY3QgYnkgY29tYmluaW5nIGBjb3VudHNgIGFuZCBgbG9nY291bnRzYCBtYXRyaWNlcyBieSBjb2x1bW4uCkZvbGxvd2luZyB0aGF0IHN0cnVjdHVyZSwgb3RoZXIgU0NFIHNsb3RzIChgY29sRGF0YWAsIGByb3dEYXRhYCwgcmVkdWNlZCBkaW1lbnNpb25zLCBhbmQgb3RoZXIgbWV0YWRhdGEpIGFyZSBjb21iaW5lZCBhcHByb3ByaWF0ZWx5LgoKU2luY2Ugd2UgbmVlZCB0byBhcHBseSBgY2JpbmQoKWAgdG8gYSBfbGlzdF8gb2Ygb2JqZWN0cywgd2UgbmVlZCB0byB1c2Ugc29tZSBzbGlnaHRseS1nbmFybHkgc3ludGF4OiBXZSdsbCB1c2UgdGhlIGZ1bmN0aW9uIGBkby5jYWxsKClgLCB3aGljaCBhbGxvd3MgdGhlIGBjYmluZCgpYCBpbnB1dCB0byBiZSBhIGxpc3Qgb2Ygb2JqZWN0cyB0byBjb21iaW5lLgoKYGBge3IgbWVyZ2VzIHNjZXMsIGxpdmUgPSBUUlVFfQojIE1lcmdlIFNDRSBvYmplY3RzCm1lcmdlZF9zY2UgPC0gZG8uY2FsbChjYmluZCwgc2NlX2xpc3RfZm9ybWF0dGVkKQoKIyBQcmludCB0aGUgbWVyZ2VkX3NjZSBvYmplY3QKbWVyZ2VkX3NjZQpgYGAKCldlIG5vdyBoYXZlIGEgc2luZ2xlIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcyB3ZSdkIGxpa2UgdG8gaW50ZWdyYXRlLgoKTGV0J3MgdGFrZSBhIHBlZWsgYXQgc29tZSBvZiB0aGUgaW5uYXJkcyBvZiB0aGlzIG5ldyBTQ0Ugb2JqZWN0OgoKYGBge3IgZXhwbG9yZSBtZXJnZWRfc2NlLCBsaXZlID0gVFJVRX0KIyBXaGF0IGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBpbiB0aGUgYHNhbXBsZWAgY29sdW1uPwp1bmlxdWUoIGNvbERhdGEobWVyZ2VkX3NjZSkkc2FtcGxlICkKCiMgV2hhdCBhcmUgdGhlIG5ldyBjZWxsIGlkcyAoY29sdW1uIG5hbWVzKT8KaGVhZCggY29sbmFtZXMobWVyZ2VkX3NjZSkgKQoKIyBXaGF0IGRvZXMgcm93RGF0YSBsb29rIGxpa2U/CmhlYWQoIHJvd0RhdGEobWVyZ2VkX3NjZSkgKQpgYGAKCgojIyBJbnRlZ3JhdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBJbnRlZ3JhdGVdKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfaW50ZWdyYXRlLnBuZykKCgpTbyBmYXIsIHdlJ3ZlIGNyZWF0ZWQgYSBgbWVyZ2VkX3NjZWAgb2JqZWN0IHdoaWNoIGlzIChhbG1vc3QhKSByZWFkeSBmb3IgaW50ZWdyYXRpb24uCgpUaGUgaW50ZWdyYXRpb24gbWV0aG9kcyB3ZSdsbCBiZSB1c2luZyBoZXJlIGFjdHVhbGx5IHBlcmZvcm0gYmF0Y2ggY29ycmVjdGlvbiBvbiBhIHJlZHVjZWQgZGltZW5zaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub3JtYWxpemVkIGdlbmUgZXhwcmVzc2lvbiB2YWx1ZXMsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50LgpgZmFzdE1OTmAgYW5kIGBoYXJtb255YCBzcGVjaWZpY2FsbHkgdXNlIFBDQSBmb3IgdGhpcywgYnV0IGJlIGF3YXJlIHRoYXQgZGlmZmVyZW50IGludGVncmF0aW9uIG1ldGhvZHMgbWF5IHVzZSBvdGhlciBraW5kcyBvZiByZWR1Y2VkIGRpbWVuc2lvbnMuCgpZb3UnbGwgbm90aWNlIHRoYXQgdGhlIG1lcmdlZCBTQ0Ugb2JqZWN0IG9iamVjdCBhbHJlYWR5IGNvbnRhaW5zIFBDQSBhbmQgVU1BUCByZWR1Y2VkIGRpbWVuc2lvbnMsIHdoaWNoIHdlcmUgY2FsY3VsYXRlZCBkdXJpbmcgb3VyIHByZS1wcm9jZXNzaW5nOgoKYGBge3IgbWVyZ2VkX3NjZSByZWRkaW0sIGxpdmUgPSBUUlVFfQojIFByaW50IHRoZSByZWR1Y2VkRGltTmFtZXMgb2YgdGhlIG1lcmdlZF9zY2UKcmVkdWNlZERpbU5hbWVzKG1lcmdlZF9zY2UpCmBgYAoKVGhlc2UgcmVwcmVzZW50IHRoZSBvcmlnaW5hbCBkaW1lbnNpb24gcmVkdWN0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIG9uIF9lYWNoIGluZGl2aWR1YWwgU0NFXyBiZWZvcmUgbWVyZ2luZywgYnV0IHdlIGFjdHVhbGx5IG5lZWQgdG8gY2FsY3VsYXRlIFBDQSAoYW5kIFVNQVAgZm9yIHZpc3VhbGl6YXRpb24pIGZyb20gdGhlIG1lcmdlZCBvYmplY3QgZGlyZWN0bHkuCgpXaHkgY2FuJ3Qgd2UgdXNlIHRoZSBzYW1wbGUtc3BlY2lmaWMgUENBIGFuZCBVTUFQIG1hdHJpY2VzPwpQYXJ0IG9mIHRoZXNlIGNhbGN1bGF0aW9ucyB0aGVtc2VsdmVzIGludm9sdmVzIHNjYWxpbmcgdGhlIHJhdyBkYXRhIHRvIGNlbnRlciB0aGUgbWVhbi4KV2hlbiBzYW1wbGVzIGFyZSBzZXBhcmF0ZWx5IGNlbnRlcmVkIGJ1dCBwbG90dGluZyB0b2dldGhlciwgeW91IHdpbGwgc2VlIHNhbXBsZXMgIm92ZXJsYXBwaW5nIiBpbiBzcGFjZSwgYnV0IHRoaXMgcGxhY2VtZW50IGlzIGFjdHVhbGx5IGp1c3QgYW4gYXJ0aWZhY3Qgb2YgdGhlIGluZGl2aWR1YWwgY2VudGVyaW5nLgpJbiBhZGRpdGlvbiwgdGhlIG1hdGhlbWF0aWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbiBkYXRhIGFuZCByZWR1Y2VkIGRpbWVuc2lvbiB2ZXJzaW9uIG9mIHRoYXQgZGF0YSB3aWxsIGRpZmZlciBhY3Jvc3Mgc2FtcGxlcywgbWVhbmluZyB3ZSBjYW4ndCBpbnRlcnByZXQgdGhlbSBhbGwgdG9nZXRoZXIuClRvIHNlZSBob3cgdGhpcyBsb29rcywgbGV0J3MgbG9vayBhdCB0aGUgVU1BUCB3aGVuIGNhbGN1bGF0ZWQgZnJvbSBpbmRpdmlkdWFsIHNhbXBsZXM6CgpgYGB7ciBwbG90IGluZGl2aWR1YWwgVU1BUHMsIGxpdmUgPSBUUlVFfQojIFBsb3QgVU1BUCBjYWxjdWxhdGVkIGZyb20gaW5kaXZpZHVhbCBzYW1wbGVzIHdpdGggc2VwYXJhdGUgc2NhbGluZwpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gIlVNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJzYW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBjYWxjdWxhdGVkIG9uIGVhY2ggc2FtcGxlIHNlcGFyYXRlbHkiKQpgYGAKCgpBcyB3ZSBzZWUgaW4gdGhpcyBVTUFQLCBhbGwgc2FtcGxlcyBhcmUgY2VudGVyZWQgYXQgemVybyBhbmQgYWxsIG92ZXJsYXBwaW5nLgpUaGlzIHZpc3VhbCBhcnRpZmFjdCBjYW4gZ2l2ZSB0aGUgX2luY29ycmVjdCBpbXByZXNzaW9uXyB0aGF0IGRhdGEgaXMgaW50ZWdyYXRlZCAtIHRvIGJlIGNsZWFyLCB0aGlzIGRhdGEgaXMgTk9UIGludGVncmF0ZWQhCgpGb3IgaW5wdXQgdG8gaW50ZWdyYXRpb24sIHdlJ2xsIHdhbnQgdGhlIHJlZHVjZWQgZGltZW5zaW9uIGNhbGN1bGF0aW9ucyB0byBjb25zaWRlciBub3JtYWxpemVkIGdlbmUgZXhwcmVzc2lvbiB2YWx1ZXMgZnJvbSBhbGwgc2FtcGxlcyBzaW11bHRhbmVvdXNseS4KU28gd2UnbGwgbmVlZCB0byByZWNhbGN1bGF0ZSBQQ0EgKGFuZCBVTUFQIGZvciB2aXN1YWxpemF0aW9uKSBvbiB0aGUgbWVyZ2VkIG9iamVjdC4KV2UnbGwgYWxzbyBzYXZlIHRoZXNlIG5ldyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBkaWZmZXJlbnQgbmFtZXMsIGBtZXJnZWRfUENBYCBhbmQgYG1lcmdlZF9VTUFQYCwgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIGFscmVhZHktcHJlc2VudCBgUENBYCBhbmQgYFVNQVBgLgoKRmlyc3QsIGFzIHVzdWFsLCB3ZSdsbCBkZXRlcm1pbmUgdGhlIGhpZ2gtdmFyaWFuY2UgZ2VuZXMgdG8gdXNlIGZvciBQQ0EgZnJvbSB0aGUgYG1lcmdlZF9zY2VgIG9iamVjdC4KRm9yIHRoaXMsIHdlJ2xsIG5lZWQgdG8gcHJvdmlkZSB0aGUgYXJndW1lbnQgYGJsb2NrID0gbWVyZ2VkX3NjZSRzYW1wbGVgIHdoZW4gbW9kZWxpbmcgZ2VuZSB2YXJpYW5jZSwgd2hpY2ggdGVsbHMgYHNjcmFuOjptb2RlbEdlbmVWYXIoKWAgdG8gZmlyc3QgbW9kZWwgdmFyaWFuY2Ugc2VwYXJhdGVseSBmb3IgZWFjaCBiYXRjaCBhbmQgdGhlbiBjb21iaW5lIHRob3NlIG1vZGVsaW5nIHN0YXRpc3RpY3MuCgpgYGB7ciBjYWxjIG1lcmdlZCBodiBnZW5lc30KIyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgZ2VuZXMgdG8gaWRlbnRpZnkKbnVtX2dlbmVzIDwtIDIwMDAKCiMgQ2FsY3VsYXRlIHZhcmlhdGlvbiBmb3IgZWFjaCBnZW5lCmdlbmVfdmFyaWFuY2UgPC0gc2NyYW46Om1vZGVsR2VuZVZhcihtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZ5IHRoZSBncm91cGluZyBjb2x1bW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG1lcmdlZF9zY2Ukc2FtcGxlKQoKIyBHZXQgdGhlIHRvcCBgbnVtX2dlbmVzYCBoaWdoLXZhcmlhbmNlIGdlbmVzIHRvIHVzZSBmb3IgZGltZW5zaW9uIHJlZHVjdGlvbgpodl9nZW5lcyA8LSBzY3Jhbjo6Z2V0VG9wSFZHcyhnZW5lX3ZhcmlhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbnVtX2dlbmVzKQpgYGAKClRvIGNhbGN1bGF0ZSB0aGUgUENBIG1hdHJpeCBpdHNlbGYsIHdlJ2xsIHVzZSBhbiBhcHByb2FjaCBmcm9tIHRoZSBgYmF0Y2hlbG9yYCBwYWNrYWdlLCB3aGljaCBpcyB0aGUgUiBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIGBmYXN0TU5OYCBtZXRob2QuClRoZSBbYGJhdGNoZWxvcjo6bXVsdGlCYXRjaFBDQSgpYF0oaHR0cHM6Ly9yZHJyLmlvL2Jpb2MvYmF0Y2hlbG9yL21hbi9tdWx0aUJhdGNoUENBLmh0bWwpIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBiYXRjaC13ZWlnaHRlZCBQQ0EgbWF0cml4LgpUaGlzIHdlaWdodGluZyBlbnN1cmVzIHRoYXQgYWxsIGJhdGNoZXMsIHdoaWNoIG1heSBoYXZlIHZlcnkgZGlmZmVyZW50IG51bWJlcnMgb2YgY2VsbHMsIGNvbnRyaWJ1dGUgZXF1YWxseSB0byB0aGUgb3ZlcmFsbCBzY2FsaW5nLgoKYGBge3IgbWFrZSBtZXJnZWRfcGNhLCBsaXZlID0gVFJVRX0KIyBVc2UgYmF0Y2hlbG9yIHRvIGNhbGN1bGF0ZSBQQ0EgZm9yIG1lcmdlZF9zY2UsIGNvbnNpZGVyaW5nIG9ubHkKIyAgdGhlIGhpZ2gtdmFyaWFuY2UgZ2VuZXMKIyBXZSdsbCBuZWVkIHRvIGluY2x1ZGUgdGhlIGFyZ3VtZW50IGBwcmVzZXJ2ZS5zaW5nbGUgPSBUUlVFYCB0byBnZXQKIyAgYSBzaW5nbGUgbWF0cml4IHdpdGggYWxsIHNhbXBsZXMgYW5kIG5vdCBzZXBhcmF0ZSBtYXRyaWNlcyBmb3IgZWFjaCBzYW1wbGUKbWVyZ2VkX3BjYSA8LSBiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0LnJvdyA9IGh2X2dlbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9IG1lcmdlZF9zY2Ukc2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZS5zaW5nbGUgPSBUUlVFKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSBvdXRwdXQ6CmBgYHtyIHByaW50IG1lcmdlZF9wY2EsIGxpdmUgPSBUUlVFfQojIFRoaXMgb3V0cHV0IGlzIG5vdCB2ZXJ5IGludGVyZXN0aW5nIQptZXJnZWRfcGNhCmBgYAoKV2UgY2FuIHVzZSBpbmRleGluZyBgW1sxXV1gIHRvIHNlZSB0aGUgUENBIG1hdHJpeCBjYWxjdWxhdGVkLCBsb29raW5nIGF0IGEgc21hbGwgc3Vic2V0IGZvciBjb252ZW5pZW5jZToKCmBgYHtyIHByaW50IG1lcmdlZF9wY2EgaW5kZXhlZCwgbGl2ZSA9IFRSVUV9Cm1lcmdlZF9wY2FbWzFdXVsxOjUsMTo1XQpgYGAKCldlIGNhbiBub3cgaW5jbHVkZSB0aGlzIFBDQSBtYXRyaXggaW4gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Q6CgpgYGB7ciBhZGQgbWVyZ2VkX3BjYSwgbGl2ZSA9IFRSVUV9CiMgYWRkIFBDQSByZXN1bHRzIHRvIG1lcmdlZCBTQ0Ugb2JqZWN0CnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgIm1lcmdlZF9QQ0EiKSA8LSBtZXJnZWRfcGNhW1sxXV0KYGBgCgpOb3cgdGhhdCB3ZSBoYXZlIHRoZSBQQ0EgbWF0cml4LCB3ZSBjYW4gcHJvY2VlZCB0byBjYWxjdWxhdGUgVU1BUCB0byB2aXN1YWxpemUgdGhlIHVuY29ycmVjdGVkIG1lcmdlZCBkYXRhLgoKV2UnbGwgY2FsY3VsYXRlIFVNQVAgYXMgInVzdWFsIiwgYnV0IGluIHRoaXMgY2FzZSB3ZSdsbCBzcGVjaWZ5IHR3byBhZGRpdGlvbmFsIGFyZ3VtZW50czoKCi0gYGRpbXJlZCA9ICJtZXJnZWRfUENBImAsIHdoaWNoIHNwZWNpZmllcyB3aGljaCBleGlzdGluZyByZWR1Y2VkIGRpbWVuc2lvbiBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGNhbGN1bGF0aW9uLgpXZSB3YW50IHRvIHVzZSB0aGUgYmF0Y2gtd2VpZ2h0ZWQgUENBLCB3aGljaCB3ZSBuYW1lZCBhYm92ZSBhcyBgIm1lcmdlZF9QQ0EiYC4KLSBgbmFtZSA9ICJtZXJnZWRfVU1BUCJgLCB3aGljaCBuYW1lcyB0aGUgZmluYWwgVU1BUCB0aGF0IHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcy4KVGhpcyBhcmd1bWVudCB3aWxsIHByZXZlbnQgdXMgZnJvbSBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmcgVU1BUCB3aGljaCBpcyBhbHJlYWR5IG5hbWVkICJVTUFQIiBhbmQgaW5zdGVhZCBjcmVhdGUgYSBzZXBhcmF0ZSBgIm1lcmdlZF9VTUFQImAuCgpgYGB7ciBjYWxjdWxhdGUgbWVyZ2VkIHVtYXAsIGxpdmUgPSBUUlVFfQojIGFkZCBtZXJnZWRfVU1BUCBmcm9tIG1lcmdlZF9QQ0EKbWVyZ2VkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gIm1lcmdlZF9QQ0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm1lcmdlZF9VTUFQIikKYGBgCgpOb3csIGxldCdzIHNlZSBob3cgdGhpcyBuZXcgYG1lcmdlZF9VTUFQYCBsb29rcyBjb21wYXJlZCB0byB0aGUgYFVNQVBgIGNhbGN1bGF0ZWQgZnJvbSBpbmRpdmlkdWFsIHNhbXBsZXM6CgpgYGB7ciBwbG90IHVuY29ycmVjdGVkIG1lcmdlZCBVTUFQfQojIFVNQVBzIHNjYWxlZCB0b2dldGhlciB3aGVuIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbWVyZ2VkIFNDRQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gIm1lcmdlZF9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSAic2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc3R5bGluZyB0byBoZWxwIHVzIHNlZSB0aGUgcG9pbnRzOgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICAjIE1vZGlmeSB0aGUgbGVnZW5kIGtleSBzbyBpdHMgcG9pbnRzIGFyZSBsYXJnZXIgYW5kIGVhc2llciB0byBzZWUKICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgIyBBZGQgYSBwbG90IHRpdGxlCiAgZ2d0aXRsZSgiVU1BUCBjYWxjdWxhdGVkIG9uIG1lcmdlZF9zY2UiKQpgYGAKClNhbXBsZXMgYXJlIG5vdyBzZXBhcmF0ZWQsIHdoaWNoIG1vcmUgcmVhc29uYWJseSByZWZsZWN0cyB0aGF0IHRoaXMgZGF0YSBpcyBfbm90IHlldCBiYXRjaC1jb3JyZWN0ZWRfLgpXZSBjYW4gdGhpbmsgb2YgdGhpcyBVTUFQIGFzIG91ciAiYmVmb3JlIiBVTUFQLCBhbmQgd2UgY2FuIGNvbXBhcmUgdGhpcyB0byB0aGUgImFmdGVyIiBVTUFQIHdlIHNlZSBwb3N0LWludGVncmF0aW9uLgoKTGV0J3MgZGlzY3VzcyBhIGxpdHRsZSBmaXJzdDogV2hhdCB2aXN1YWwgZGlmZmVyZW5jZXMgZG8geW91IHRoaW5rIHRoZSBVTUFQIG9uIHRoZSBpbnRlZ3JhdGVkIHZlcnNpb24gb2YgZGF0YSB3aWxsIGhhdmU/CldoYXQgc2ltaWxhcml0aWVzIGRvIHlvdSB0aGluayB0aGUgaW50ZWdyYXRlZCBVTUFQIHdpbGwgaGF2ZSB0byB0aGlzIHBsb3Q/CgoKIyMjIEludGVncmF0aW9uIHdpdGggYGZhc3RNTk5gCgpGaW5hbGx5LCB3ZSdyZSByZWFkeSB0byBpbnRlZ3JhdGUhClRvIHN0YXJ0LCB3ZSdsbCB1c2UgdGhlIGBmYXN0TU5OYCBhcHByb2FjaCBmcm9tIHRoZSBCaW9jb25kdWN0b3IgW2BiYXRjaGVsb3JgIHBhY2thZ2VdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy8zLjE2L2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkuCgpgZmFzdE1OTmAgdGFrZXMgYXMgaW5wdXQgdGhlIGBtZXJnZWRfc2NlYCBvYmplY3QgdG8gaW50ZWdyYXRlLCBhbmQgdGhlIGZpcnN0IHN0ZXAgaXQgcGVyZm9ybXMgaXMgYWN0dWFsbHkgdG8gcnVuIGBiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EoKWAgb24gdGhhdCBTQ0UuCkl0IHRoZW4gdXNlcyB0aGF0IGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGJhdGNoIGNvcnJlY3Rpb24uClRoZSBgYmF0Y2hgIGFyZ3VtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlmZmVyZW50IGdyb3VwaW5ncyB3aXRoaW4gdGhlIGBtZXJnZWRfc2NlYCAoaS5lLiB0aGUgb3JpZ2luYWwgc2FtcGxlIHRoYXQgZWFjaCBjZWxsIGJlbG9uZ3MgdG8pLCBhbmQgdGhlIGBzdWJzZXQucm93YCBhcmd1bWVudCBjYW4gb3B0aW9uYWxseSBiZSB1c2VkIHRvIHByb3ZpZGUgYSB2ZWN0b3Igb2YgaGlnaC12YXJpYW5jZSBnZW5lcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGlzIFBDQSBjYWxjdWxhdGlvbi4KYGZhc3RNTk5gIHdpbGwgcmV0dXJuIGFuIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhIGJhdGNoLWNvcnJlY3RlZCBQQ0EuCkxldCdzIHJ1biBpdCBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIGEgdmFyaWFibGUgY2FsbGVkIGBpbnRlZ3JhdGVkX3NjZWAuCgoKYGBge3IgcnVuIGZhc3Rtbm4sIGxpdmUgPSBUUlVFfQojIGludGVncmF0ZSB3aXRoIGZhc3RNTk4sIGFnYWluIHNwZWNpZnlpbmcgb25seSBvdXIgaGlnaC12YXJpYW5jZSBnZW5lcwppbnRlZ3JhdGVkX3NjZSA8LSBiYXRjaGVsb3I6OmZhc3RNTk4oCiAgbWVyZ2VkX3NjZSwKICBiYXRjaCA9IG1lcmdlZF9zY2Ukc2FtcGxlLAogIHN1YnNldC5yb3cgPSBodl9nZW5lcwopCmBgYAoKTGV0J3MgaGF2ZSBhIGxvb2sgYXQgdGhlIHJlc3VsdDoKCmBgYHtyIGZhc3Rtbm4gcmVzdWx0LCBsaXZlID0gVFJVRX0KIyBQcmludCB0aGUgaW50ZWdyYXRlZF9zY2Ugb2JqZWN0CmludGVncmF0ZWRfc2NlCmBgYAoKVGhlcmUgYXJlIGNvdXBsZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24gaGVyZSBvZiBpbnRlcmVzdDoKCi0gVGhlIGBjb3JyZWN0ZWRgIHJlZHVjZWQgZGltZW5zaW9uIHJlcHJlc2VudHMgdGhlIGJhdGNoLWNvcnJlY3RlZCBQQ0EgdGhhdCBgZmFzdE1OTmAgY2FsY3VsYXRlZC4KLSBUaGUgYHJlY29uc3RydWN0ZWRgIGFzc2F5IHJlcHJlc2VudHMgdGhlIGJhdGNoLWNvcnJlY3RlZCBub3JtYWxpemVkIGV4cHJlc3Npb24gdmFsdWVzLCB3aGljaCBgZmFzdE1OTmAgImJhY2stY2FsY3VsYXRlZCIgZnJvbSB0aGUgYmF0Y2gtY29ycmVjdGVkIFBDQSAoYGNvcnJlY3RlZGApLgpHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXNlIGV4cHJlc3Npb24gdmFsdWVzIGFyZSBub3Qgc3RhbmQtYWxvbmUgdmFsdWVzIHRoYXQgeW91IHNob3VsZCB1c2UgZm9yIG90aGVyIGFwcGxpY2F0aW9ucyBsaWtlIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24sIGFzIGRlc2NyaWJlZCBpbiBbX09yY2hlc3RyYXRpbmcgU2luZ2xlIENlbGwgQW5hbHlzZXNfXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EubXVsdGlzYW1wbGUvdXNpbmctY29ycmVjdGVkLXZhbHVlcy5odG1sKS4KSWYgdGhlIGBzdWJzZXQucm93YCBhcmd1bWVudCBpcyBwcm92aWRlZCAoYXMgaXQgd2FzIGhlcmUpLCBvbmx5IGdlbmVzIHByZXNlbnQgaW4gYHN1YnNldC5yb3dgIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlc2UgcmVjb25zdHJ1Y3RlZCBleHByZXNzaW9uIHZhbHVlcywgYnV0IHRoaXMgc2V0dGluZyBjYW4gYmUgb3ZlcnJpZGRlbiBzbyB0aGF0IGFsbCBnZW5lcyBoYXZlIHJlY29uc3RydWN0ZWQgZXhwcmVzc2lvbiB3aXRoIHRoZSBhcmd1bWVudCBgY29ycmVjdC5hbGwgPSBUUlVFYC4KCldlJ3JlIG1vc3RseSBpbnRlcmVzdGVkIGluIHRoZSBQQ0EgdGhhdCBgZmFzdE1OTmAgY2FsY3VsYXRlZCwgc28gbGV0J3Mgc2F2ZSB0aGF0IGluZm9ybWF0aW9uICh3aXRoIGFuIGluZm9ybWF0aXZlIGFuZCB1bmlxdWUgbmFtZSkgaW50byBvdXIgYG1lcmdlZF9zY2VgIG9iamVjdDoKCmBgYHtyIGZhc3Rtbm4gcGNzLCBsaXZlID0gVFJVRX0KIyBNYWtlIGEgbmV3IHJlZHVjZWREaW0gbmFtZWQgZmFzdG1ubl9QQ0EgZnJvbSB0aGUgY29ycmVjdGVkIHJlZHVjZWREaW0gaW4gaW50ZWdyYXRlZF9zY2UKcmVkdWNlZERpbShtZXJnZWRfc2NlLCAiZmFzdG1ubl9QQ0EiKSA8LSByZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLCAiY29ycmVjdGVkIikKYGBgCgpGaW5hbGx5LCB3ZSdsbCBjYWxjdWxhdGUgVU1BUCBmcm9tIHRoZXNlIGNvcnJlY3RlZCBQQ0EgbWF0cml4IGZvciB2aXN1YWxpemF0aW9uLgoKYGBge3IgY2FsY3VsYXRlIGZhc3Rtbm4gdW1hcCwgbGl2ZSA9IFRSVUV9CiMgQ2FsY3VsYXRlIFVNQVAKbWVyZ2VkX3NjZSA8LSBzY2F0ZXI6OnJ1blVNQVAoCiAgbWVyZ2VkX3NjZSwKICBkaW1yZWQgPSAiZmFzdG1ubl9QQ0EiLAogIG5hbWUgPSAiZmFzdG1ubl9VTUFQIgopCmBgYAoKRmlyc3QsIGxldCdzIHBsb3QgdGhlIGludGVncmF0ZWQgVU1BUCBoaWdobGlnaHRpbmcgdGhlIGRpZmZlcmVudCBiYXRjaGVzLgpBIHdlbGwtaW50ZWdyYXRlZCBkYXRhc2V0IHdpbGwgc2hvdyBiYXRjaCBtaXhpbmcsIGJ1dCBhIHBvb3JseS1pbnRlZ3JhdGVkIGRhdGFzZXQgd2lsbCBzaG93IG1vcmUgc2VwYXJhdGlvbiBhbW9uZyBiYXRjaGVzLCBzaW1pbGFyIHRvIHRoZSB1bmNvcnJlY3RlZCBVTUFQLgpOb3RlIHRoYXQgdGhpcyBpcyBhIG1vcmUgcXVhbGl0YXRpdmUgd2F5IHRvIGFzc2VzcyB0aGUgc3VjY2VzcyBvZiBpbnRlZ3JhdGlvbiwgYnV0IHRoZXJlIGFyZSBmb3JtYWwgbWV0cmljcyBvbmUgY2FuIHVzZSB0byBhc3Nlc3MgYmF0Y2ggbWl4aW5nLCB3aGljaCB5b3UgY2FuIHJlYWQgbW9yZSBhYm91dCBpbiBbdGhpcyBjaGFwdGVyIG9mIE9TQ0FdKGh0dHA6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTYvT1NDQS5tdWx0aXNhbXBsZS9jb3JyZWN0aW9uLWRpYWdub3N0aWNzLmh0bWwpLgoKYGBge3IgcGxvdCBmYXN0bW5uIHVtYXAgYmF0Y2hlc30Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICMgcGxvdCB0aGUgZmFzdE1OTiBjb29yZGluYXRlcwogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYnkgc2FtcGxlCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czoKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgIyBNb2RpZnkgbGVnZW5kIHNvIHRoZXkga2V5IGlzIGxhcmdlciBhbmQgZWFzaWVyIHRvIHNlZQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICAjIGFkZCBwbG90IHRpdGxlCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGZhc3RNTk4iKQpgYGAKClRoaXMgYGZhc3Rtbm5fVU1BUGAgY2VydGFpbmx5IGxvb2tzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgd2UgbWFkZSBmcm9tIGBtZXJnZWRfVU1BUGAhCldoYXQgZGlmZmVyZW50IHRyZW5kcyBkbyB5b3Ugc2VlPwpEbyBhbGwgc2FtcGxlcyBsb29rICJlcXVhbGx5IHdlbGwiIGludGVncmF0ZWQsIGZyb20gYSBmaXJzdCBsb29rPwoKSW1wb3J0YW50bHksIG9uZSByZWFzb24gdGhhdCBiYXRjaGVzIG1heSBzdGlsbCBhcHBlYXIgc2VwYXJhdGVkIGluIHRoZSBjb3JyZWN0ZWQgVU1BUCBpcyBpZiB0aGV5IF9zaG91bGRfIGJlIHNlcGFyYXRlZCAtIGZvciBleGFtcGxlLCBtYXliZSB0d28gYmF0Y2hlcyBjb250YWluIHZlcnkgZGlmZmVyZW50IGNlbGwgdHlwZXMsIGhhdmUgdmVyeSBkaWZmZXJlbnQgZGlhZ25vc2VzLCBvciBtYXkgYmUgZnJvbSBkaWZmZXJlbnQgcGF0aWVudHMuCgpSZWNhbGwgZnJvbSBlYXJsaWVyIHRoYXQgd2UgY29udmVuaWVudGx5IGhhdmUgY2VsbCB0eXBlIGFubm90YXRpb25zIGluIG91ciBTQ0VzLCBzbyB3ZSBjYW4gZXhwbG9yZSB0aG9zZSBoZXJlIQpMZXQncyB0YWtlIGEgcXVpY2sgZGV0b3VyIHRvIHNlZSB3aGF0IGtpbmRzIG9mIGNlbGwgdHlwZXMgYXJlIGluIHRoaXMgZGF0YSBieSBtYWtpbmcgYSBiYXJwbG90IG9mIHRoZSBjZWxsIHR5cGVzIGFjcm9zcyBzYW1wbGVzOgoKYGBge3IgZXhwbG9yZSBjZWxsdHlwZXN9CiMgQ2VsbCB0eXBlcyBhcmUgaW4gdGhlIGBjZWxsdHlwZV9icm9hZGAgYW5kIGBjZWxsdHlwZV9maW5lYCBjb2x1bW5zCm1lcmdlZF9zY2VfZGYgPC0gYXMuZGF0YS5mcmFtZShjb2xEYXRhKG1lcmdlZF9zY2UpKQoKIyBVc2UgZ2dwbG90MiB0byBtYWtlIGEgYmFycGxvdCB0aGUgY2VsbCB0eXBlcyBhY3Jvc3Mgc2FtcGxlcwpnZ3Bsb3QobWVyZ2VkX3NjZV9kZiwKICAgICAgIGFlcyh4ID0gc2FtcGxlLAogICAgICAgICAgIGZpbGwgPSBjZWxsdHlwZV9icm9hZCkpICsKICAjIEJhcnBsb3Qgb2YgY2VsbHR5cGUgcHJvcG9ydGlvbnMKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogICMgVXNlIGEgQ1ZELWZyaWVuZGx5IGNvbG9yIHNjaGVtZQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgIyBuaWNlciB0aGVtZQogIHRoZW1lX2J3KCkKYGBgCgpXZSBzZWUgdGhhdCBUdW1vciBjZWxsIHR5cGVzIGFyZSBieSBmYXIgdGhlIG1vc3QgcHJldmFsZW50IGFjcm9zcyBhbGwgc2FtcGxlcywgYW5kIG5vcm1hbCB0aXNzdWUgY2VsbCB0eXBlcyBhcmUgbm90IHZlcnkgY29tbW9uLgpXZSBzZWUgYWxzbyB0aGF0IGBTQ1BDTDAwMDQ4MWAgaGFzIGEgbGFyZ2VyIGBUdW1vcl9NeW9jeXRlYCBwb3B1bGF0aW9uLCB3aGlsZSBhbGwgb3RoZXIgc2FtcGxlcyBoYXZlIGxhcmdlciBgVHVtb3JfTWVzb2Rlcm1gIHBvcHVsYXRpb25zLgpUaGlzIGRpZmZlcmVuY2UgX21heV8gZXhwbGFpbiB3aHkgd2Ugb2JzZXJ2ZSB0aGF0IGBTQ1BDTDAwMDQ4MWAgaXMgc29tZXdoYXQgbW9yZSBzZXBhcmF0ZWQgZnJvbSB0aGUgb3RoZXIgc2FtcGxlcyBpbiB0aGUgYGZhc3RNTk5gIFVNQVAuCgpMZXQncyByZS1wbG90IHRoaXMgVU1BUCB0byBoaWdobGlnaHQgY2VsbCB0eXBlczoKCgpgYGB7ciBwbG90IGZhc3Rtbm4gdW1hcCBjZWxsdHlwZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IGJyb2FkIGNlbGx0eXBlcwogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgKwogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTiIpCmBgYAoKVGhpcyBVTUFQIHNob3dzIHRoYXQgdGhlIG5vcm1hbCB0aXNzdWUgY2VsbCB0eXBlcyAobW9zdGx5IHZhc2N1bGFyIGVuZG90aGVsaXVtLCBtdXNjbGUgY2VsbHMsIGFuZCBtb25vY3l0ZXMpIHRlbmQgdG8gY2x1c3RlciB0b2dldGhlciBhbmQgYXJlIGdlbmVyYWxseSBzZXBhcmF0ZWQgZnJvbSB0aGUgdHVtb3IgY2VsbCB0eXBlcywgd2hpY2ggaXMgYW4gZW5jb3VyYWdpbmcgcGF0dGVybiEKVHVtb3IgY2VsbCB0eXBlcyBmcm9tIGRpZmZlcmVudCBzYW1wbGVzIGFyZSBhbGwgYWxzbyBjbHVzdGVyaW5nIHRvZ2V0aGVyLCB3aGljaCBpcyBldmVuIG1vcmUgZW5jb3VyYWdpbmcgdGhhdCB3ZSBoYWQgc3VjY2Vzc2Z1bCBpbnRlZ3JhdGlvbi4KCkhvd2V2ZXIsIGl0J3MgYSBiaXQgY2hhbGxlbmdpbmcgdG8gc2VlIGFsbCB0aGUgcG9pbnRzIGdpdmVuIHRoZSBhbW91bnQgb2Ygb3ZlcmxhcCBpbiB0aGUgcGxvdC4KT25lIHdheSB3ZSBjYW4gc2VlIGFsbCB0aGUgcG9pbnRzIGEgYml0IGJldHRlciBpcyB0byBmYWNldCB0aGUgcGxvdCBieSBzYW1wbGUsIHVzaW5nIGBmYWNldF93cmFwKClgIGZyb20gdGhlIGBnZ3Bsb3QyYCBwYWNrYWdlICh3aGljaCB3ZSBjYW4gZG8gYmVjYXVzZSBgc2NhdGVyOjpwbG90UmVkdWNlZERpbSgpYCByZXR1cm5zIGEgYGdncGxvdDJgIG9iamVjdCk6CgpgYGB7ciBwbG90IGZhc3Rtbm4gdW1hcCBjZWxsdHlwZXMgZmFjZXRlZH0Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGZvciBmYWNldGluZyBieSBhIHZhcmlhYmxlIHVzaW5nIGBvdGhlcl9maWVsZHNgOgogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OIikgKwogICMgRmFjZXQgYnkgc2FtcGxlCiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICsKICAjIFVzZSBhIHRoZW1lIHdpdGggYmFja2dyb3VuZCBncmlkIHRvIG1vcmUgZWFzaWx5IGNvbXBhcmUgcGFuZWwgY29vcmRpbmF0ZXMKICB0aGVtZV9idygpCmBgYAoKV2hhdCB0cmVuZHMgZG8geW91IG9ic2VydmUgYmV0d2VlbiB0dW1vciBhbmQgaGVhbHRoeSB0aXNzdWVzIGFtb25nIHRoZXNlIGludGVncmF0ZWQgc2FtcGxlcz8KCgojIyMgSW50ZWdyYXRpb24gd2l0aCBgaGFybW9ueWAKCmBmYXN0TU5OYCBpcyBvbmx5IG9uZSBvZiBtYW55IGFwcHJvYWNoZXMgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbiwgYW5kIGRpZmZlcmVudCBtZXRob2RzIGhhdmUgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBhbmQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuCkZvciBleGFtcGxlLCBzb21lIG1ldGhvZHMgY2FuIGFjY29tbW9kYXRlIGFkZGl0aW9uYWwgY292YXJpYXRlcyAoZS5nLiwgdGVjaG5vbG9neSwgcGF0aWVudCwgZGlhZ25vc2lzLCBldGMuKSB0aGF0IGNhbiBpbmZsdWVuY2UgaW50ZWdyYXRpb24uCkluIGZhY3QgdGhlIGRhdGEgd2UgYXJlIHVzaW5nIGhhcyBhIGtub3duIF9wYXRpZW50XyBjb3ZhcmlhdGU7IGBTQ1BDTDAwMDQ3OWAgYW5kIGBTQ1BDTDAwMDQ4MGAgYXJlIGZyb20gdGhlIGZpcnN0IHBhdGllbnQsIGFuZCBgU0NQQ0wwMDA0ODFgIGFuZCBgU0NQQ0wwMDA0ODJgIGFyZSBmcm9tIHRoZSBzZWNvbmQgcGF0aWVudC4KClNvLCBsZXQncyBwZXJmb3JtIGludGVncmF0aW9uIHdpdGggYSBtZXRob2QgdGhhdCBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gLSBbYGhhcm1vbnlgXShodHRwczovL3BvcnRhbHMuYnJvYWRpbnN0aXR1dGUub3JnL2hhcm1vbnkvKSEKClRvIGJlZ2luIHNldHRpbmcgdXAgZm9yIGBoYXJtb255YCBpbnRlZ3JhdGlvbiwgd2UgbmVlZCB0byBhZGQgZXhwbGljaXQgcGF0aWVudCBpbmZvcm1hdGlvbiBpbnRvIG91ciBtZXJnZWQgU0NFLgpXZSdsbCBjcmVhdGUgYSBuZXcgY29sdW1uIGBwYXRpZW50YCB3aG9zZSB2YWx1ZSBpcyBlaXRoZXIgIkEiIG9yICJCIiBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHNhbXBsZSBuYW1lLCB1c2luZyB0aGUgW2BkcGx5cjo6Y2FzZV93aGVuKClgXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2Nhc2Vfd2hlbi5odG1sKSBmdW5jdGlvbi4KV2UgcHJvdmlkZSB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzZXQgb2YgbG9naWNhbCBleHByZXNzaW9ucyBhbmQgZWFjaCBhc3NpZ25lZCB2YWx1ZSBpcyBkZXNpZ25hdGVkIGJ5IGB+YC4KVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIsIHN0b3BwaW5nIGF0IHRoZSBfZmlyc3RfIG9uZSB0aGF0IGV2YWx1YXRlcyBhcyBgVFJVRWAgYW5kIHJldHVybmluZyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KCmBgYHtyIGFkZCBwYXRpZW50IGluZm99CiMgQ3JlYXRlIHBhdGllbnQgY29sdW1uIHdpdGggdmFsdWVzICJBIiBvciAiQiIgZm9yIHRoZSB0d28gcGF0aWVudHMKbWVyZ2VkX3NjZSRwYXRpZW50IDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgbWVyZ2VkX3NjZSRzYW1wbGUgJWluJSBjKCJTQ1BDTDAwMDQ3OSIsICJTQ1BDTDAwMDQ4MCIpIH4gIkEiLAogIG1lcmdlZF9zY2Ukc2FtcGxlICVpbiUgYygiU0NQQ0wwMDA0ODEiLCAiU0NQQ0wwMDA0ODIiKSB+ICJCIiwKKQpgYGAKCgpVbmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgY2FsY3VsYXRlIGNvcnJlY3RlZCBleHByZXNzaW9uIHZhbHVlcyBub3IgZG9lcyBpdCByZXR1cm4gYW4gU0NFIG9iamVjdC4KTGlrZSBgZmFzdE1OTmAsIGBoYXJtb255YCBwZXJmb3JtcyBpbnRlZ3JhdGlvbiBvbiBhIG1lcmdlZCBQQ0EgbWF0cml4LgpIb3dldmVyLCB1bmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgImJhY2stY2FsY3VsYXRlIiBjb3JyZWN0ZWQgZXhwcmVzc2lvbiBmcm9tIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBhbmQgaXQgb25seSByZXR1cm5zIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBpdHNlbGYuCkZvciBpbnB1dCwgYGhhcm1vbnlgIG5lZWRzIGEgY291cGxlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKCi0gRmlyc3QsIGBoYXJtb255YCBjYW4gZWl0aGVyIHRha2UgYSBtYXRyaXggb2Ygbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgZnJvbSB3aGljaCBpdCB3aWxsIGNhbGN1bGF0ZSBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggdG8gaW50ZWdyYXRlLCBvciBpdCBjYW4gdGFrZSBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggZGlyZWN0bHkgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbi4KU2luY2Ugd2UgYWxyZWFkeSBjYWxjdWxhdGVkIGEgYmF0Y2gtd2VpZ2h0ZWQgUENBIG1hdHJpeCAob3VyIGBtZXJnZWRfUENBYCByZWR1Y2VkIGRpbWVuc2lvbiksIHdlJ2xsIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseS4KICAtIFdlIHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IGBkb19wY2E9RkFMU0VgIHRvIHRlbGwgYGhhcm1vbnlgIHRoYXQgdGhlIGlucHV0IG1hdHJpeCB3ZSBwcm92aWRlZCBhbHJlYWR5IGlzIGEgUENBIG1hdHJpeC4KLSBTZWNvbmQsIHdlIG5lZWQgdG8gdGVsbCBgaGFybW9ueWAgYWJvdXQgdGhlIGNvdmFyaWF0ZXMgdG8gdXNlIC0gYHNhbXBsZWAgYW5kIGBwYXRpZW50YC4KVG8gZG8gdGhpcywgd2UgcHJvdmlkZSB0d28gYXJndW1lbnRzOgogIC0gYG1ldGFfZGF0YWAsIGEgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIGNvdmFyaWF0ZXMgYWNyb3NzIHNhbXBsZXMuCiAgV2UgY2FuIHNpbXBseSBzcGVjaWZ5IHRoZSBTQ0UgYGNvbERhdGFgIGhlcmUgc2luY2UgaXQgY29udGFpbnMgYHNhbXBsZWAgYW5kIGBwYXRpZW50YCBjb2x1bW5zLgogIC0gYHZhcnNfdXNlYCwgYSB2ZWN0b3Igb2Ygd2hpY2ggY29sdW1uIG5hbWVzIGluIGBtZXRhX2RhdGFgIHNob3VsZCBhY3R1YWxseSBiZSB1c2VkIGFzIGNvdmFyaWF0ZXMuCiAgT3RoZXIgY29sdW1ucyBpbiBgbWV0YV9kYXRhYCB3aGljaCBhcmUgbm90IGluIGB2YXJzX3VzZWAgYXJlIGlnbm9yZWQuCgpMZXQncyBnbyEKCmBgYHtyIHJ1biBoYXJtb255LCBsaXZlID0gVFJVRX0KIyBpbnRlZ3JhdGUgd2l0aCBoYXJtb255LCBzZXR0aW5nIHRoZSBhcmd1bWVudCBgZG9fcGNhID0gRkFMU0VgCiMgIHNpbmNlIHdlIGFyZSBwcm92aWRpbmcgYSBQQ0EgbWF0cml4IGRpcmVjdGx5Cmhhcm1vbnlfcGNhIDwtIGhhcm1vbnk6Okhhcm1vbnlNYXRyaXgoCiAgZGF0YV9tYXQgPSByZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJtZXJnZWRfUENBIiksCiAgZG9fcGNhID0gRkFMU0UsCiAgbWV0YV9kYXRhID0gY29sRGF0YShtZXJnZWRfc2NlKSwKICB2YXJzX3VzZSA9IGMoInNhbXBsZSIsICJwYXRpZW50IikKKQpgYGAKClRoZSByZXN1bHQgaXMgYSBQQ0EgbWF0cml4LgpMZXQncyBwcmludCBhIHN1YnNldCBvZiB0aGlzIG1hdHJpeCB0byBzZWUgaXQ6CgpgYGB7ciBwcmludCBoYXJtb255IHJlc3VsdCwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIGhhcm1vbnkgcmVzdWx0Cmhhcm1vbnlfcGNhWzE6NSwgMTo1XQpgYGAKCkFzIHdlIGRpZCB3aXRoIGBmYXN0TU5OYCByZXN1bHRzLCBsZXQncyBzdG9yZSB0aGlzIFBDQSBtYXRyaXggZGlyZWN0bHkgaW4gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Qgd2l0aCBhbiBpbmZvcm1hdGl2ZSBuYW1lIHRoYXQgd29uJ3Qgb3ZlcndyaXRlIGFueSBvZiB0aGUgZXhpc3RpbmcgUENBIG1hdHJpY2VzLgpXZSdsbCBhbHNvIGNhbGN1bGF0ZSBVTUFQIGZyb20gaXQuCgpgYGB7ciBzYXZlIGhhcm1vbnksIGxpdmUgPSBUUlVFfQojIFN0b3JlIFBDQSBhcyBgaGFybW9ueV9QQ0FgCnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgImhhcm1vbnlfUENBIikgPC0gaGFybW9ueV9wY2EKCiMgQXMgYmVmb3JlLCBjYWxjdWxhdGUgVU1BUCBvbiB0aGlzIFBDQSBtYXRyaXggd2l0aCBhcHByb3ByaWF0ZSBuYW1lcwptZXJnZWRfc2NlIDwtIHNjYXRlcjo6cnVuVU1BUChtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9QQ0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSAiaGFybW9ueV9VTUFQIikKYGBgCgoKTGV0J3Mgc2VlIGhvdyB0aGUgYGhhcm1vbnlgIFVNQVAsIGNvbG9yZWQgYnkgc2FtcGxlLCBsb29rcyBjb21wYXJlZCB0byB0aGUgYGZhc3RNTk5gIFVNQVA6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBiYXRjaGVzfQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImhhcm1vbnlfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255IikgKwogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpCmBgYAoKSG93IGRvIHlvdSB0aGluayB0aGlzIGBoYXJtb255YCBVTUFQIGNvbXBhcmVzIHRvIHRoYXQgZnJvbSBgZmFzdE1OTmAgaW50ZWdyYXRpb24/CgpMZXQncyBzZWUgaG93IHRoaXMgVU1BUCBsb29rcyBjb2xvcmVkIGJ5IGNlbGwgdHlwZSwgYW5kIGZhY2V0ZWQgZm9yIHZpc2liaWxpdHk6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBjZWxsdHlwZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWZ5IHZhcmlhYmxlIGZvciBmYWNldGluZwogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGhhcm1vbnkiKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzKSkpICsKICBmYWNldF93cmFwKHZhcnMoc2FtcGxlKSkKYGBgCgpXaXRoIHRoZSBmYWNldGVkIHZpZXcsIHdlIGNhbiBub3cgc2VlIHRoYXQgdGhlIHNtYWxsIGFtb3VudHMgb2YgYFR1bW9yX015b2N5dGVgIGZyb20gb3RoZXIgc2FtcGxlcyBhcmUgInB1bGxlZCIgdG93YXJkcyB0aG9zZSBjZWxscyBpbiBgU0NQQ0wwMDA0ODFgLgoKV2hhdCBvdGhlciBwYXR0ZXJucyBkbyB5b3Ugc2VlIHRoYXQgYXJlIHNpbWlsYXIgb3IgZGlmZmVyZW50IGZyb20gdGhlIGBmYXN0TU5OYCBVTUFQPwpIb3cgZG8geW91IHRoaW5rIGBmYXN0TU5OYCB2cy4gYGhhcm1vbnlgIHBlcmZvcm1lZCBpbiBpbnRlZ3JhdGluZyB0aGVzZSBzYW1wbGVzPwoKIyMjIEV4cG9ydAoKRmluYWxseSwgd2UnbGwgZXhwb3J0IHRoZSBmaW5hbCBTQ0Ugb2JqZWN0IHdpdGggYm90aCBgZmFzdE1OTmAgYW5kIGBoYXJtb255YCBpbnRlZ3JhdGlvbiB0byBhIGZpbGUuClNpbmNlIHRoaXMgb2JqZWN0IGlzIHZlcnkgbGFyZ2UgKG92ZXIgMSBHQiEpLCB3ZSdsbCBleHBvcnQgaXQgdG8gYSBmaWxlIHdpdGggc29tZSBjb21wcmVzc2lvbiwgd2hpY2gsIGluIHRoaXMgY2FzZSwgd2lsbCByZWR1Y2UgdGhlIGZpbmFsIHNpemUgdG8gYSBzbWFsbGVyIH4zNjAgTUIuClRoaXMgd2lsbCB0YWtlIGEgY291cGxlIG1pbnV0ZXMgdG8gc2F2ZSB3aGlsZSBjb21wcmVzc2lvbiBpcyBwZXJmb3JtZWQuCgpgYGB7ciBzYXZlIGludGVncmF0aW9uLCBsaXZlID0gVFJVRX0KIyBFeHBvcnQgdG8gUkRTIGZpbGUgd2l0aCAiZ3oiIGNvbXByZXNzaW9uCnJlYWRyOjp3cml0ZV9yZHMobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkX3NjZV9maWxlLAogICAgICAgICAgICAgICAgIGNvbXByZXNzID0gImd6IikKYGBgCgoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCgpBcyBhbHdheXMsIHdlJ2xsIHByaW50IHRoZSBzZXNzaW9uIGluZm8gdG8gYmUgdHJhbnNwYXJlbnQgYWJvdXQgd2hhdCBwYWNrYWdlcywgYW5kIHdoaWNoIHZlcnNpb25zLCB3ZXJlIHVzZWQgZHVyaW5nIHRoaXMgUiBzZXNzaW9uLgoKYGBge3Igc2Vzc2lvbmluZm99CnNlc3Npb25JbmZvKCkKYGBgCg==</div> +<div id="rmd-source-code">LS0tCnRpdGxlOiAiSW50ZWdyYXRpbmcgc2NSTkEtc2VxIGRhdGFzZXRzIgphdXRob3I6IERhdGEgTGFiIGZvciBBTFNGCmRhdGU6IDIwMjMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUHJlcGFyZSBTQ0Ugb2JqZWN0cyBmb3IgaW50ZWdyYXRpb24KLSBBcHBseSBpbnRlZ3JhdGlvbiBtZXRob2RzIGluY2x1ZGluZyBgZmFzdE1OTmAgYW5kIGBoYXJtb255YAotIFZpc3VhbGx5IGV4cGxvcmUgdGhlIHJlc3VsdHMgb2YgaW50ZWdyYXRpb24KLSBVc2UgYHB1cnJyOjptYXAoKWAgZnVuY3Rpb25zIGZvciBpdGVyYXRpbmcgb3ZlciBsaXN0cwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBwZXJmb3JtIGludGVncmF0aW9uIG9uIHNjUk5BLXNlcSBkYXRhc2V0cyBmcm9tIHRoZSBbU2luZ2xlLWNlbGwgUGVkaWF0cmljIENhbmNlciBBdGxhcyAoYFNjUENBYCldKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvKSwgYSBkYXRhYmFzZSBvZiB1bmlmb3JtbHktcHJvY2Vzc2VkIHBlZGlhdHJpYyBzY1JOQS1zZXEgZGF0YSBidWlsdCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRGF0YSBMYWIuClRoZSBgU2NQQ0FgIGRhdGFiYXNlIGN1cnJlbnRseSBob3N0cyBzaW5nbGUtY2VsbCBwZWRpYXRyaWMgY2FuY2VyIHRyYW5zY3JpcHRvbWljIGRhdGEgZ2VuZXJhdGVkIGJ5IEFMU0YtZnVuZGVkIGxhYnMsIHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIHRoaXMgZGF0YSBlYXNpbHkgYWNjZXNzaWJsZSB0byBpbnZlc3RpZ2F0b3JzIChsaWtlIHlvdSEpLgpUaGUgZXhwcmVzc2lvbiBkYXRhIGluIGBTY1BDQWAgd2VyZSBtYXBwaW5nIGFuZCBxdWFudGlmaWVkIHdpdGggW2BhbGV2aW4tZnJ5YF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAyMi0wMTQwOC0zKSwgZm9sbG93ZWQgYnkgcHJvY2Vzc2luZyB3aXRoIEJpb2NvbmR1Y3RvciB0b29scyB1c2luZyB0aGUgc2FtZSBnZW5lcmFsIHByb2NlZHVyZXMgdGhhdCB3ZSBoYXZlIGNvdmVyZWQgaW4gdGhpcyB3b3Jrc2hvcC4KVGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUgdXNlZCBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgYW5kIGBtaVFDYCB0byBmaWx0ZXIgdGhlIHJhdyBjb3VudHMgbWF0cml4LCBgc2N1dHRsZWAgdG8gbG9nLW5vcm1hbGl6ZSB0aGUgY291bnRzLCBhbmQgYHNjYXRlcmAgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24uClRoZSBwcm9jZXNzZWQgZGF0YSBhcmUgc3RvcmVkIGFzIGAucmRzYCBmaWxlcyBjb250YWluaW5nIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0cy4KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaG93IGRhdGEgaW4gdGhlIGBTY1BDQWAgaXMgcHJvY2Vzc2VkIGluIFt0aGUgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXShodHRwczovL3NjcGNhLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8pLgoKCiFbU2luZ2xlLWNlbGwgcm9hZG1hcDogSW50ZWdyYXRpb24gT3ZlcnZpZXddKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfbWVyZ2UtaW50ZWdyYXRlLnBuZykKClRvIGxlYXJuIGFib3V0IGludGVncmF0aW9uLCB3ZSdsbCBoYXZlIGEgbG9vayBhdCBmb3VyIHNhbXBsZXMgZnJvbSB0aGUgW2BTQ1BDUDAwMDAwNWAgcHJvamVjdF0oaHR0cHM6Ly9zY3BjYS5hbGV4c2xlbW9uYWRlLm9yZy9wcm9qZWN0cy9TQ1BDUDAwMDAwNSkgKFtQYXRlbCBfZXQgYWwuXyAyMDIyXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBbRHllcl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2R5ZXItbGFiLmh0bWwpIGFuZCBbQ2hlbl0oaHR0cHM6Ly93d3cuc3RqdWRlLm9yZy9yZXNlYXJjaC9sYWJzL2NoZW4tbGFiLXRhb3NoZW5nLmh0bWwpIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhlIHBhcnRpY3VsYXIgbGlicmFyaWVzIHdlJ2xsIGludGVncmF0ZSBjb21lIGZyb20gdHdvIHJoYWJkb215b3NhcmNvbWEgKFJNUykgcGF0aWVudHMsIHdpdGggdHdvIHNhbXBsZXMgZnJvbSBlYWNoIG9mIHR3byBwYXRpZW50cywgYWxsIHNlcXVlbmNlZCB3aXRoIDEweCBDaHJvbWl1bSB2MyB0ZWNobm9sb2d5LgpFYWNoIGxpYnJhcnkgaXMgZnJvbSBhIHNlcGFyYXRlIGJpb2xvZ2ljYWwgc2FtcGxlLgoKV2UnbGwgYmUgaW50ZWdyYXRpbmcgdGhlc2Ugc2FtcGxlcyB3aXRoIHR3byBkaWZmZXJlbnQgdG9vbHMsIFtgZmFzdE1OTmBdKGh0dHA6Ly93d3cuYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy8zLjE2L2Jpb2MvaHRtbC9iYXRjaGVsb3IuaHRtbCkgKFtIYWdodmVyZGkgX2V0IGFsLl8gMjAxOF0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbmJ0LjQwOTEpKSBhbmQgW2BoYXJtb255YF0oaHR0cHM6Ly9wb3J0YWxzLmJyb2FkaW5zdGl0dXRlLm9yZy9oYXJtb255LykgKFtLb3JzdW5za3kgX2V0IGFsLl8gMjAxOV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvczQxNTkyLTAxOS0wNjE5LTApKS4KSW50ZWdyYXRpb24gY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdGhhdCBhcmlzZSBmcm9tIGRpZmZlcmVudCBsaWJyYXJ5IHByZXBhcmF0aW9ucywgZ2VuZXRpYyBiYWNrZ3JvdW5kcywgYW5kIG90aGVyIHNhbXBsZS1zcGVjaWZpYyBmYWN0b3JzLCBzbyB0aGF0IGRhdGFzZXRzIGNhbiBiZSBqb2ludGx5IGFuYWx5emVkIGF0IHRoZSBjZWxsIGxldmVsLgpgZmFzdE1OTmAgY29ycmVjdHMgZm9yIGJhdGNoIGVmZmVjdHMgdXNpbmcgYSBmYXN0ZXIgdmFyaWFudCBvZiB0aGUgbXV0dWFsLW5lYXJlc3QgbmVpZ2hib3JzIGFsZ29yaXRobSwgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIHdoaWNoIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBmcm9tIHRoaXMgW3ZpZ25ldHRlIGJ5IEx1biAoMjAxOSldKGh0dHBzOi8vbWFyaW9uaWxhYi5naXRodWIuaW8vRnVydGhlck1OTjIwMTgvdGhlb3J5L2Rlc2NyaXB0aW9uLmh0bWwpLgpgaGFybW9ueWAsIG9uIHRoZSBvdGhlciBoYW5kLCBjb3JyZWN0cyBmb3IgYmF0Y2ggZWZmZWN0cyB1c2luZyBhbiBpdGVyYXRpdmUgY2x1c3RlcmluZyBhcHByb2FjaCwgYW5kIHVubGlrZSBgZmFzdE1OTmAsIGl0IGlzIGFsc28gYWJsZSB0byBjb25zaWRlciBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgYmV5b25kIGp1c3QgdGhlIGJhdGNoIGdyb3VwaW5ncy4KClJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW50ZWdyYXRpb24gdG9vbCBpcyB1c2VkLCB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCAoU0NFKSBvYmplY3RzIGZpcnN0IG5lZWQgdG8gYmUgcmVmb3JtYXR0ZWQgYW5kIG1lcmdlZCBpbnRvIGEgc2luZ2xlICh1bmNvcnJlY3RlZCEpIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcy4KVGhpcyBtZXJnZWQgU0NFIGNhbiB0aGVuIGJlIHVzZWQgZm9yIGludGVncmF0aW9uIHRvIG9idGFpbiBhIGZvcm1hbGx5IGJhdGNoLWNvcnJlY3RlZCBTQ0Ugb2JqZWN0LgoKCiMjIFNldCB1cAoKYGBge3Igc2V0dXB9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAgIyBwbG90dGluZyB0b29scwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAjIHdvcmsgd2l0aCBTQ0Ugb2JqZWN0cwoKIyBTZXQgdGhlIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxMjM0NSkKYGBgCgoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKCldlIGhhdmUgYWxyZWFkeSBwcmVwYXJlZCBjb3VudCBkYXRhIGZvciB0aGUgZm91ciBzYW1wbGVzIHdlJ2xsIGJlIGludGVncmF0aW5nIChpLmUuLCBmaWx0ZXJlZCBjZWxscywgbm9ybWFsaXplZCBjb3VudHMsIGFuZCBjYWxjdWxhdGVkIFBDQSAmIFVNQVApLgpUaGVzZSBTQ0Ugb2JqZWN0cywgc3RvcmVkIGFzIFJEUyBmaWxlcywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYGRhdGEvcm1zL3Byb2Nlc3NlZC9gIGRpcmVjdG9yeSBhbmQgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGVpciBgU2NQQ0FgIGxpYnJhcnkgaWRzIDoKCi0gYFNDUENMMDAwNDc5LnJkc2AgKFBhdGllbnQgQSkKLSBgU0NQQ0wwMDA0ODAucmRzYCAoUGF0aWVudCBBKQotIGBTQ1BDTDAwMDQ4MS5yZHNgIChQYXRpZW50IEIpCi0gYFNDUENMMDAwNDgyLnJkc2AgKFBhdGllbnQgQikKClRvIGJlZ2luLCBsZXQncyBzZXQgdXAgb3VyIGRpcmVjdG9yaWVzIGFuZCBmaWxlczoKCmBgYHtyIGRpcmVjdG9yaWVzLCBsaXZlID0gVFJVRX0KIyBEZWZpbmUgZGlyZWN0b3J5IHdoZXJlIHByb2Nlc3NlZCBTQ0Ugb2JqZWN0cyB0byBiZSBpbnRlZ3JhdGVkIGFyZSBzdG9yZWQKaW5wdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAicHJvY2Vzc2VkIikKCiMgRGVmaW5lIGRpcmVjdG9yeSB0byBzYXZlIGludGVncmF0ZWQgU0NFIG9iamVjdCB0bwpvdXRwdXRfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJybXMiLCAiaW50ZWdyYXRlZCIpCgojIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKZnM6OmRpcl9jcmVhdGUob3V0cHV0X2RpcikKCiMgRGVmaW5lIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGVkIG9iamVjdAppbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChvdXRwdXRfZGlyLCAicm1zX2ludGVncmF0ZWRfc3Vic2V0LnJkcyIpCmBgYAoKCldlIGNhbiB1c2UgdGhlIGBkaXIoKWAgZnVuY3Rpb24gdG8gbGlzdCBhbGwgY29udGVudHMgb2YgYSBnaXZlbiBkaXJlY3RvcnksIGZvciBleGFtcGxlIHRvIHNlZSBhbGwgdGhlIGZpbGVzIGluIG91ciBgaW5wdXRfZGlyYDoKCmBgYHtyIGlucHV0IGRpciwgbGl2ZSA9IFRSVUV9CmRpcihpbnB1dF9kaXIpCmBgYAoKV2Ugd2FudCB0byByZWFkIGluIGp1c3QgZm91ciBvZiB0aGVzZSBmaWxlcywgYXMgbGlzdGVkIHByZXZpb3VzbHkuClRvIHJlYWQgaW4gdGhlc2UgZmlsZXMsIHdlIGNvdWxkIHVzZSB0aGUgYHJlYWRyOjpyZWFkX3JkcygpYCBmdW5jdGlvbiAob3IgdGhlIGJhc2UgUiBgcmVhZFJEUygpYCkgZm91ciB0aW1lcywgb25jZSBmb3IgZWFjaCBvZiB0aGUgZmlsZXMuCldlIGNvdWxkIGFsc28gdXNlIGEgYGZvcmAgbG9vcCwgd2hpY2ggaXMgdGhlIGFwcHJvYWNoIHRoYXQgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgd291bGQgbGVhbiB0b3dhcmQuCkEgZGlmZmVyZW50IGFuZCBtb3JlIG1vZHVsYXIgY29kaW5nIGFwcHJvYWNoIHRvIHJlYWRpbmcgaW4gdGhlc2UgZmlsZXMgKGFuZCBtb3JlISkgaXMgdG8gbGV2ZXJhZ2UgdGhlIFtgcHVycnJgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvKSBgdGlkeXZlcnNlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIGxpc3RzLgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgYHB1cnJyYCBmdW5jdGlvbnMgYW5kIHRoZWlyIHBvd2VyIGFuZCB1dGlsaXR5IGluIFIgaW4gW3RoZSAiRnVuY3Rpb25hbHMiIGNoYXB0ZXIgb2YgdGhlIF9BZHZhbmNlZCBSXyBlLWJvb2tdKGh0dHBzOi8vYWR2LXIuaGFkbGV5Lm56L2Z1bmN0aW9uYWxzLmh0bWwpLgoKT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyB0aGUgW2BwdXJycjo6bWFwKClgXShodHRwczovL3B1cnJyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL21hcC5odG1sKSBmYW1pbHkgb2YgZnVuY3Rpb25zLCB3aGljaCBjYW4gYmUgdXNlZCB0byBydW4gYSBnaXZlbiBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQgb2YgYSBsaXN0IChvciB2ZWN0b3IpIGluIG9uZSBjYWxsLgpUaGUgZ2VuZXJhbCBzeW50YXggZm9yIGBwdXJycjo6bWFwKClgIGFuZCBmcmllbmRzIGlzOgoKYGBgCiMgU3ludGF4IGZvciB1c2luZyB0aGUgbWFwIGZ1bmN0aW9uOgpwdXJycjo6bWFwKDxpbnB1dCBsaXN0IG9yIHZlY3Rvcj4sCiAgICAgICAgICAgPGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiB0aGUgaW5wdXQ+LAogICAgICAgICAgIDxhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uIGNhbiBnbyBoZXJlPiwKICAgICAgICAgICA8YW5kIGFsc28gaGVyZSBpZiB0aGVyZSBhcmUgZXZlbiBtb3JlIGFyZ3VtZW50cywgYW5kIHNvIG9uPikKYGBgCgoKVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYHB1cnJyOjptYXAoKWAgaXMgYWx3YXlzIGEgbGlzdCAoYnV0IG5vdGUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgYHB1cnJyOjptYXAoKWAgcmVsYXRpdmVzIHdoaWNoIHJldHVybiBvdGhlciBvYmplY3QgdHlwZXMsIGFzIHlvdSBjYW4gcmVhZCBhYm91dCBpbiBbdGhlIGBwdXJycjo6bWFwKClgIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW5kZXguaHRtbCkpLgpJZiB0aGlzIGNvbmNlcHQgc291bmRzIGEgbGl0dGxlIGZhbWlsaWFyIHRvIHlvdSwgdGhhdCdzIGJlY2F1c2UgaXQgcHJvYmFibHkgaXMhCkJhc2UgUidzIGBsYXBwbHkoKWAgZnVuY3Rpb24gY2FuIHByb3ZpZGUgc2ltaWxhciB1dGlsaXR5LCBhbmQgdGhlIGBwdXJycjo6bWFwKClgIGZhbWlseSBvZiBmdW5jdGlvbnMgY2FuIChpbiBwYXJ0KSBiZSB0aG91Z2h0IG9mIGFzIGFuIGFsdGVybmF0aXZlIHRvIHNvbWUgb2YgdGhlIGJhc2UgUiBgYXBwbHlgIGZ1bmN0aW9ucywgd2l0aCBtb3JlIGNvbnNpc3RlbnQgYmVoYXZpb3IuCgpMZXQncyBzZWUgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGBwdXJycjo6bWFwKClgIGluIGFjdGlvbiwgaW5zcGlyZWQgYnkgY2FuY2VyIGdyb3VwcyB0aGUgRGF0YSBMYWIgaGFzIGFuYWx5emVkIHRocm91Z2ggdGhlIFtPcGVuUEJUQV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvKSBwcm9qZWN0OgoKYGBge3IgbWFwIGV4YW1wbGV9CiMgRGVmaW5lIGEgbGlzdCBvZiBjYW5jZXIgaGlzdG9sb2dpZXMKaGlzdG9sb2dpZXMgPC0gbGlzdCgKICAibG93LWdyYWRlIGdsaW9tYXMiICA9IGMoIlNFR0EiLCAiUEEiLCAiR05HIiwgIlBYQSIpLAogICJoaWdoLWdyYWRlIGdsaW9tYXMiID0gYygiRE1HIiwgIkRJUEciKSwKICAiZW1icnlvbmFsIHR1bW9ycyIgICA9IGMoIk1CIiwgIkFUUlQiLCAiRVRNUiIpCiApCgojIFRoZSBvdmVyYWxsIGxlbmd0aCBvZiB0aGUgbGlzdCBpcyAzCmxlbmd0aChoaXN0b2xvZ2llcykKCiMgSG93IGNhbiB3ZSBydW4gYGxlbmd0aCgpYCBvbiBlYWNoIGl0ZW0gb2YgdGhlIGxpc3Q/CiMgV2UgY2FuIHVzZSBvdXIgbmV3IGZyaWVuZCBwdXJycjo6bWFwKCk6CnB1cnJyOjptYXAoaGlzdG9sb2dpZXMsIGxlbmd0aCkKYGBgCgpPbmUgb3RoZXIgbmV3IGNvZGluZyBzdHJhdGVneSB3ZSdsbCBsZWFybiBpbiB0aGlzIG5vdGVib29rIGlzIHVzaW5nIHRoZSBbYGdsdWVgXShodHRwczovL2dsdWUudGlkeXZlcnNlLm9yZy8pIHBhY2thZ2UgdG8gY29tYmluZSBzdHJpbmdzLgpUaGlzIHBhY2thZ2Ugb2ZmZXJzIGEgY29udmVuaWVudCBmdW5jdGlvbiBgZ2x1ZTo6Z2x1ZSgpYCB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGJhc2UgUiBgcGFzdGUoKWAgZnVuY3Rpb24uCgpgYGB7ciBwYXN0ZX0KIyBEZWZpbmUgYSB2YXJpYWJsZSBmb3IgZXhhbXBsZToKb3JnX25hbWUgPC0gIkRhdGEgTGFiIgoKIyBXZSBjYW4gdXNlIHBhc3RlIHRvIGNvbWJpbmUgc3RyaW5ncyBhbmQgdmFyaWFibGVzOgpwYXN0ZSgiV2VsY29tZSB0byB0aGUiLCBvcmdfbmFtZSwgIndvcmtzaG9wIG9uIEFkdmFuY2VkIHNjUk5BLXNlcSEiKQpgYGAKCldlIGNhbiB1c2UgYGdsdWU6OmdsdWUoKWAgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSBnb2FsIHdpdGggc29tZSBkaWZmZXJlbnQgc3ludGF4OgoKYGBge3IgZ2x1ZX0KIyBnbHVlOjpnbHVlIHRha2VzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCAob25seSBvbmUgc2V0IG9mIHF1b3RlcyEpLCBhbmQKIyAgdmFyaWFibGVzIGNhbiBlYXNpbHkgYmUgaW5jbHVkZWQgaW5zaWRlIHtjdXJseSBicmFjZXN9CmdsdWU6OmdsdWUoIldlbGNvbWUgdG8gdGhlIHtvcmdfbmFtZX0gd29ya3Nob3Agb24gQWR2YW5jZWQgc2NSTkEtc2VxISIpCmBgYAoKKE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgYGdsdWU6OmdsdWUoKWAgb3V0cHV0IGlzbid0IGluIHF1b3RlcywgaXQgc3RpbGwgYmVoYXZlcyBsaWtlIGEgc3RyaW5nISkKCgpBbHJpZ2h0LCB0aW1lIGZvciB0aGUgZ29vZCBzdHVmZiEKTGV0J3MgdXNlIGBwdXJycjo6bWFwKClgIHRvIHJlYWQgaW4gb3VyIFNDRSBvYmplY3RzIHNvIHRoYXQgdGhleSBhcmUgaW1tZWRpYXRlbHkgc3RvcmVkIHRvZ2V0aGVyIGluIGEgbGlzdC4KCgpXZSdsbCBmaXJzdCBuZWVkIHRvIGRlZmluZSBhIHZlY3RvciBvZiB0aGUgZmlsZSBwYXRocyB0byByZWFkIGluLgpXZSdsbCBzdGFydCBieSBjcmVhdGluZyBhIHZlY3RvciBvZiBzYW1wbGUgbmFtZXMgdGhlbXNlbHZlcyBhbmQgdGhlbiBmb3JtYXR0aW5nIHRoZW0gaW50byB0aGUgY29ycmVjdCBwYXRocy4KVGhpcyB3YXkgKGZvcmVzaGFkb3dpbmchKSB3ZSBhbHNvIGhhdmUgYSBzdGFuZC1hbG9uZSB2ZWN0b3Igb2YganVzdCBzYW1wbGUgbmFtZXMsIHdoaWNoIHdpbGwgY29tZSBpbiBoYW5keSEKCmBgYHtyIHNhbXBsZSBuYW1lc30KIyBWZWN0b3Igb2YgYWxsIHRoZSBzYW1wbGVzIHRvIHJlYWQgaW46CnNhbXBsZV9uYW1lcyA8LSBjKCJTQ1BDTDAwMDQ3OSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MCIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MSIsCiAgICAgICAgICAgICAgICAgICJTQ1BDTDAwMDQ4MiIpCmBgYAoKCmBgYHtyIGRlZmluZSBzY2VfcGF0aHMsIGxpdmUgPSBUUlVFfQojIE5vdywgY29udmVydCB0aGVzZSB0byBmaWxlIHBhdGhzOiA8aW5wdXRfZGlyPi88c2FtcGxlX25hbWU+LnJkcwpzY2VfcGF0aHMgPC0gZmlsZS5wYXRoKGlucHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWVzfS5yZHMiKQopCiMgUHJpbnQgdGhlIHNjZV9wYXRocyB2ZWN0b3IKc2NlX3BhdGhzCmBgYAoKV2UgY2FuIG5vdyByZWFkIHRoZXNlIGZpbGVzIGluIGFuZCBjcmVhdGUgYSBsaXN0IG9mIGZvdXIgU0NFIG9iamVjdHMuClNpbmNlIGByZWFkcjo6cmVhZF9yZHMoKWAgY2FuIG9ubHkgb3BlcmF0ZSBvbiBvbmUgaW5wdXQgYXQgYSB0aW1lLCB3ZSdsbCBuZWVkIHRvIHVzZSBgcHVycnI6Om1hcCgpYCB0byBydW4gaXQgb24gYWxsIGlucHV0IGZpbGUgcGF0aHMgaW4gb25lIGNvbW1hbmQuCkFsdGhvdWdoIGBzY2VfcGF0aHNgIGlzIGEgdmVjdG9yIChub3QgYSBsaXN0KSwgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGlucHV0IHRvIGBwdXJycjptYXAoKWAuClRoZSBvdXRwdXQgZnJvbSB0aGlzIGNvZGUgd2lsbCBzdGlsbCBiZSBhIGxpc3QsIHNpbmNlIHRoYXQncyB3aGF0IGBwdXJycjo6bWFwKClgIGFsd2F5cyByZXR1cm5zLgoKYGBge3IgcmVhZCBzY2UgcGF0aHMsIGxpdmUgPSBUUlVFfQojIFVzZSBwdXJycjo6bWFwKCkgdG8gcmVhZCBhbGwgZmlsZXMgaW50byBhIGxpc3QgYXQgb25jZQpzY2VfbGlzdCA8LSBwdXJycjo6bWFwKAogIHNjZV9wYXRocywKICByZWFkcjo6cmVhZF9yZHMKKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IG91ciBsaXN0IG9mIFNDRSBvYmplY3RzOgoKYGBge3IgcHJpbnQgc2NlIGxpc3QsIGxpdmU9VFJVRX0KIyBQcmludCBzY2VfbGlzdApzY2VfbGlzdApgYGAKCldlIG5vdyBoYXZlIGEgbGlzdCBvZiBsZW5ndGggZm91ciwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgcHJvY2Vzc2VkIFNDRSBvYmplY3QhCkhvd2V2ZXIsIHdlJ2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBzYW1wbGUgZWFjaCBpdGVtIGlzLCBzbyBpdCdzIGhlbHBmdWwgdG8gYWRkIF9uYW1lc18gdG8gdGhpcyBsaXN0IHJlcHJlc2VudGluZyB0aGUgcmVsZXZhbnQgc2FtcGxlIG5hbWVzLgoKYGBge3IgYWRkIGxpc3QgbmFtZXMsIGxpdmUgPSBUUlVFfQojIEFzc2lnbiB0aGUgc2FtcGxlIG5hbWVzIGFzIHRoZSBuYW1lcyBmb3Igc2NlX2xpc3QKbmFtZXMoc2NlX2xpc3QpIDwtIHNhbXBsZV9uYW1lcwpgYGAKCmBgYHtyIHByaW50IG5hbWVkIGxpc3QsIGxpdmU9VFJVRX0KIyBQcmludCB0aGUgbGlzdCB0byBzZWUgaXQgd2l0aCBuYW1lcwpzY2VfbGlzdApgYGAKCklmIHlvdSBsb29rIGNsb3NlbHkgYXQgdGhlIHByaW50ZWQgU0NFIG9iamVjdHMsIHlvdSBtYXkgbm90aWNlIHRoYXQgdGhleSBhbGwgY29udGFpbiBgY29sRGF0YWAgdGFibGUgY29sdW1ucyBgY2VsbHR5cGVfZmluZWAgYW5kIGBjZWxsdHlwZV9icm9hZGAuClRoZXNlIGNvbHVtbnMgKHdoaWNoIHdlIGFkZGVkIHRvIFNDRSBvYmplY3RzIGR1cmluZyBbcHJlLXByb2Nlc3NpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3RyYWluaW5nLW1vZHVsZXMvdHJlZS9tYXN0ZXIvc2NSTkEtc2VxLWFkdmFuY2VkL3NldHVwL3JtcykpIGNvbnRhaW4gcHV0YXRpdmUgX2NlbGwgdHlwZSBhbm5vdGF0aW9uc18gYXMgYXNzaWduZWQgaW4gW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpLgpXZSB3aWxsIGVuZCB1cCBsZXZlcmFnaW5nIHRoZXNlIGNlbGwgdHlwZSBhbm5vdGF0aW9ucyB0byBleHBsb3JlIGhvdyBzdWNjZXNzZnVsIG91ciBpbnRlZ3JhdGlvbiBpczsgYWZ0ZXIgaW50ZWdyYXRpb24sIHdlIGV4cGVjdCBjZWxsIHR5cGVzIGZyb20gZGlmZmVyZW50IHNhbXBsZXMgdG8gZ3JvdXAgdG9nZXRoZXIsIHJhdGhlciB0aGFuIGJlaW5nIHNlcGFyYXRlZCBieSBiYXRjaGVzLgoKVGhhdCBzYWlkLCB0aGUgaW50ZWdyYXRpb24gbWV0aG9kcyB3ZSB3aWxsIGJlIGFwcGx5aW5nIF9kbyBub3QgYWN0dWFsbHkgdXNlXyB0aGVzZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMuCklmIHdlIGhhdmUgYW5ub3RhdGlvbnMsIHRoZXkgYXJlIGEgaGVscGZ1bCAiYm9udXMiIGZvciBhc3Nlc3NpbmcgdGhlIGludGVncmF0aW9uJ3Mgc3VjY2VzcywgYnV0IHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBpbnRlZ3JhdGlvbiBpdHNlbGYuCgoKIyMgUHJlcGFyZSB0aGUgU0NFIGxpc3QgZm9yIGludGVncmF0aW9uCgohW1NpbmdsZS1jZWxsIHJvYWRtYXA6IE1lcmdlXShkaWFncmFtcy9yb2FkbWFwX211bHRpX21lcmdlLnBuZykKCgpOb3cgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiBwcm9jZXNzZWQgU0NFIG9iamVjdHMsIHdlIG5lZWQgdG8gbWVyZ2UgdGhlIG9iamVjdHMgaW50byBvbmUgb3ZlcmFsbCBTQ0Ugb2JqZWN0IGZvciBpbnB1dCB0byBpbnRlZ3JhdGlvbi4KQSB3b3JkIG9mIGNhdXRpb24gYmVmb3JlIHdlIGJlZ2luOiAqKlRoaXMgbWVyZ2VkIFNDRSBvYmplY3QgaXMgTk9UIGFuIGludGVncmF0ZWQgU0NFISoqCk1lcmdpbmcgU0NFcyBkb2VzIG5vdCBwZXJmb3JtIGFueSBiYXRjaCBjb3JyZWN0aW9uLCBidXQganVzdCByZW9yZ2FuaXplcyB0aGUgZGF0YSB0byBhbGxvdyB1cyB0byBwcm9jZWVkIHRvIGludGVncmF0aW9uIG5leHQuCgpUbyBtZXJnZSBTQ0Ugb2JqZWN0cywgd2UgZG8gbmVlZCB0byBkbyBzb21lIHdyYW5nbGluZyBhbmQgYm9va2tlZXBpbmcgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYW5kIHRoYXQgd2UgZG9uJ3QgbG9zZSBpbXBvcnRhbnQgaW5mb3JtYXRpb24uCk92ZXJhbGwgd2UnbGwgd2FudCB0byB0YWtlIGNhcmUgb2YgdGhlc2UgaXRlbXM6CgoxLiBXZSBzaG91bGQgYmUgYWJsZSB0byB0cmFjZSBzYW1wbGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgb3JpZ2luYXRpbmcgc2FtcGxlLCBpbmNsdWRpbmcuLi4KICAgIC0gQ2VsbC1sZXZlbCBpbmZvcm1hdGlvbjogV2hpY2ggc2FtcGxlIGlzIGVhY2ggY2VsbCBmcm9tPwogICAgLSBMaWJyYXJ5LXNwZWNpZmljIGZlYXR1cmUgc3RhdGlzdGljcywgZS5nLiwgZ2VuZS1sZXZlbCBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGxpYnJhcnkgZm91bmQgaW4gYHJvd0RhdGFgLgogICAgV2hpY2ggc2FtcGxlIGlzIGEgZ2l2ZW4gZmVhdHVyZSBzdGF0aXN0aWMgZnJvbT8KMi4gU0NFIG9iamVjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIHNhbWUgZ2VuZXM6IEVhY2ggU0NFIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSByb3cgbmFtZXMuCjMuIFNDRSBjZWxsIG1ldGFkYXRhIGNvbHVtbnMgc2hvdWxkIG1hdGNoOiBUaGUgYGNvbERhdGFgIGZvciBlYWNoIFNDRSBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgY29sdW1uIG5hbWVzLgoKCldlJ2xsIGJlZ2luIGJ5IHRha2luZyBzb21lIHRpbWUgdG8gdGhvcm91Z2hseSBleHBsb3JlIG91ciBTQ0Ugb2JqZWN0cyBhbmQgZmlndXJlIG91dCB3aGF0IHdyYW5nbGluZyBzdGVwcyB3ZSBuZWVkIHRvIHRha2UgZm9yIHRoZXNlIHNwZWNpZmljIGRhdGEuCkRvbid0IHNraXAgdGhpcyBleHBsb3JhdGlvbiEKQmVhciBpbiBtaW5kIHRoYXQgdGhlIGV4YWN0IHdyYW5nbGluZyBzaG93biBoZXJlIHdpbGwgbm90IGJlIHRoZSBzYW1lIGZvciBvdGhlciBTQ0Ugb2JqZWN0cyB5b3Ugd29yayB3aXRoLCBidXQgdGhlIHNhbWUgZ2VuZXJhbCBwcmluY2lwbGVzIGFwcGx5LgoKCiMjIyMgUHJlc2VydmluZyBzYW1wbGUgaW5mb3JtYXRpb24gYXQgdGhlIGNlbGwgbGV2ZWwKCkhvdyB3aWxsIHdlIGJlIGFibGUgdG8gdGVsbCB3aGljaCBzYW1wbGUgYSBnaXZlbiBjZWxsIGNhbWUgZnJvbT8KClRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHNpbXBseSB0byBhZGQgYSBgY29sRGF0YWAgY29sdW1uIHdpdGggdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiwgc28gdGhhdCB3ZSBjYW4ga25vdyB3aGljaCBzYW1wbGUgZWFjaCByb3cgY2FtZSBmcm9tLgoKSW4gYWRkaXRpb24sIHdlIHdhbnQgdG8gcGF5IHNvbWUgYXR0ZW50aW9uIHRvIHRoZSBTQ0Ugb2JqZWN0J3MgY29sdW1uIG5hbWVzICh0aGUgY2VsbCBpZHMpLCB3aGljaCBtdXN0IHJlbWFpbiB1bmlxdWUgYWZ0ZXIgbWVyZ2luZyBzaW5jZSBkdXBsaWNhdGUgaWRzIHdpbGwgY2F1c2UgYW4gUiBlcnJvci4KSW4gdGhpcyBjYXNlLCB0aGUgU0NFIGNvbHVtbiBuYW1lcyBhcmUgYmFyY29kZXMgKHdoaWNoIGlzIHVzdWFsbHkgYnV0IG5vdCBhbHdheXMgdGhlIGNhc2UgaW4gU0NFIG9iamVjdHMpLCB3aGljaCBhcmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBfd2l0aGluXyBhIHNhbXBsZSBidXQgbWF5IGJlIHJlcGVhdGVkIGFjcm9zcyBzYW1wbGVzLgpTbywgYWZ0ZXIgbWVyZ2luZywgaXQncyB0ZWNobmljYWxseSBwb3NzaWJsZSB0aGF0IG11bHRpcGxlIGNlbGxzIHdpbGwgaGF2ZSB0aGUgc2FtZSBiYXJjb2RlLgpUaGlzIHdvdWxkIGJlIGEgcHJvYmxlbSBmb3IgdHdvIHJlYXNvbnM6CkZpcnN0LCB0aGUgY2VsbCBpZCB3b3VsZCBub3QgYmUgYWJsZSB0byBwb2ludCB1cyBiYWNrIHRvIGNlbGwncyBvcmlnaW5hdGluZyBzYW1wbGUuClNlY29uZCwgaXQgd291bGQgbGl0ZXJhbGx5IGNhdXNlIGFuIGVycm9yIGluIFIsIHdoaWNoIGRvZXMgbm90IGFsbG93IGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXMuCgoKT25lIHdheSB0byBlbnN1cmUgdGhhdCBjZWxsIGlkcyByZW1haW4gdW5pcXVlIGV2ZW4gYWZ0ZXIgbWVyZ2luZyBpcyB0byBhY3R1YWxseSBtb2RpZnkgdGhlbSBieSBfcHJlcGVuZGluZ18gdGhlIHJlbGV2YW50IHNhbXBsZSBuYW1lLgpGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlc2UgYmFyY29kZXMgZm9yIHRoZSBgU0NQQ0wwMDA0NzlgIHNhbXBsZToKCmBgYHtyIGJhcmNvZGVzfQojIExvb2sgYXQgdGhlIGNvbHVtbiBuYW1lcyBmb3IgdGhlIGBTQ1BDTDAwMDQ3OWAgc2FtcGxlLCBmb3IgZXhhbXBsZQpjb2xuYW1lcyhzY2VfbGlzdCRTQ1BDTDAwMDQ3OSkgfD4KICAjIE9ubHkgcHJpbnQgb3V0IHRoZSBmaXJzdCA2IGZvciBjb252ZW5pZW5jZQogIGhlYWQoKQpgYGAKClRoZXNlIGlkcyB3aWxsIGJlIHVwZGF0ZWQgdG8gYFNDUENMMDAwNDc5LUdHR0FDQ1RDQUFHQ0dHQVRgLCBgU0NQQ0wwMDA0NzktQ0FDQUdBVEFHVEdBR1RHQ2AsIGFuZCBzbyBvbiwgdGhlcmVieSBlbnN1cmluZyBmdWxseSB1bmlxdWUgaWRzIGZvciBhbGwgY2VsbHMgYWNyb3NzIGFsbCBzYW1wbGVzLgoKIyMjIyBQcmVzZXJ2aW5nIHNhbXBsZSBpbmZvcm1hdGlvbiBhdCB0aGUgZ2VuZSBsZXZlbAoKVGhlIGByb3dEYXRhYCB0YWJsZSBpbiBTQ0Ugb2JqZWN0cyB3aWxsIG9mdGVuIGNvbnRhaW4gYm90aCAiZ2VuZXJhbCIgYW5kICJsaWJyYXJ5LXNwZWNpZmljIiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CgpgYGB7ciByb3dkYXRhfQpyb3dEYXRhKHNjZV9saXN0JFNDUENMMDAwNDc5KSB8PgogIGhlYWQoKQpgYGAKCkhlcmUsIHRoZSByb3duYW1lcyBhcmUgRW5zZW1ibCBnZW5lIGlkcywgYW5kIGNvbHVtbnMgYXJlIGBnZW5lX3N5bWJvbGAsIGBtZWFuYCwgYW5kIGBkZXRlY3RlZGAuClRoZSBgZ2VuZV9zeW1ib2xgIGNvbHVtbiBpcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBnZW5lcywgbm90IHNwZWNpZmljIHRvIGFueSBsaWJyYXJ5IG9yIGV4cGVyaW1lbnQsIGJ1dCBgbWVhbmAgYW5kIGBkZXRlY3RlZGAgYXJlIGxpYnJhcnktc3BlY2lmaWMgZ2VuZSBzdGF0aXN0aWNzLgpTbywgYGdlbmVfc3ltYm9sYCBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYWNlZCBiYWNrIHRvIGl0cyBvcmlnaW5hdGluZyBzYW1wbGUsIGJ1dCBgbWVhbmAgYW5kIGBkZXRlY3RlZGAgZG8uClRvIHRoaXMgZW5kLCB3ZSBjYW4gdGFrZSBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gd2hhdCB3ZSdsbCBkbyBmb3IgY2VsbCBpZHM6CldlIGNhbiBjaGFuZ2UgdGhlIHNhbXBsZS1zcGVjaWZpYyBgcm93RGF0YWAgY29sdW1uIG5hbWVzIGJ5IHByZXBlbmRpbmcgdGhlIHNhbXBsZSBuYW1lLgpGb3IgZXhhbXBsZSwgcmF0aGVyIHRoYW4gYmVpbmcgY2FsbGVkIGBtZWFuYCwgdGhpcyBjb2x1bW4gd2lsbCBiZSBuYW1lZCBgU0NQQ0wwMDA0NzktbWVhbmAgZm9yIHRoZSBgU0NQQ0wwMDA0NzlgIHNhbXBsZS4KCkFsbCBvdXIgU0NFIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBgcm93RGF0YWAgY29sdW1ucyAoYXMgd2UgY2FuIHNlZSBpbiB0aGUgbmV4dCBjaHVuayksIHNvIHdlJ2xsIHBlcmZvcm0gdGhpcyByZW5hbWluZyBhY3Jvc3MgYWxsIFNDRXMuCgpgYGB7ciBjb21wYXJlIHJvd2RhdGEsIGxpdmUgPSBUUlVFfQojIFVzZSBgcHVycnI6Om1hcCgpYCB0byBxdWlja2x5IGV4dHJhY3Qgcm93RGF0YSBjb2x1bW4gbmFtZXMgZm9yIGFsbCBTQ0VzCnB1cnJyOjptYXAoc2NlX2xpc3QsCiAgICAgICAgICAgXCh4KSBjb2xuYW1lcyhyb3dEYXRhKHgpKSkKYGBgCgoKIyMjIyBFbnN1cmluZyB0aGF0IG9ubHkgc2hhcmVkIGdlbmVzIGFyZSB1c2VkCgpUaGUgbmV4dCBzdGVwIGluIGVuc3VyaW5nIFNDRSBjb21wYXRpYmlsaXR5IGlzIHRvIG1ha2Ugc3VyZSB0aGV5IGFsbCBjb250YWluIHRoZSBzYW1lIGdlbmVzLCB3aGljaCBhcmUgc3RvcmVkIGFzIHRoZSBTQ0Ugb2JqZWN0J3Mgcm93IG5hbWVzICh0aGVzZSBuYW1lcyBhcmUgYWxzbyBmb3VuZCB0aGUgYHJvd0RhdGFgIHNsb3QncyByb3cgbmFtZXMpLgpIZXJlLCB0aG9zZSBnZW5lIGlkcyBhcmUgdW5pcXVlIEVuc2VtYmwgZ2VuZSBpZHMuCgpXZSBjYW4gdXNlIHNvbWUgYHB1cnJyYCBtYWdpYyB0byBxdWlja2x5IGZpbmQgdGhlIHNldCBvZiBzaGFyZWQgZ2VuZXMgYW1vbmcgb3VyIHNhbXBsZXM6CgpgYGB7ciBzaGFyZWQgZ2VuZXN9CiMgRGVmaW5lIHZlY3RvciBvZiBzaGFyZWQgZ2VuZXMKc2hhcmVkX2dlbmVzIDwtIHNjZV9saXN0IHw+CiAgIyBnZXQgcm93bmFtZXMgKGdlbmVzKSBmb3IgZWFjaCBTQ0UgaW4gc2NlX2xpc3QKICBwdXJycjo6bWFwKHJvd25hbWVzKSB8PgogICMgcmVkdWNlIHRvIHRoZSBfaW50ZXJzZWN0aW9uXyBhbW9uZyBsaXN0cwogIHB1cnJyOjpyZWR1Y2UoaW50ZXJzZWN0KQpgYGAKCmBgYHtyIHByaW50IHNoYXJlZCBnZW5lcywgbGl2ZSA9IFRSVUV9CiMgVXNlIGhlYWQgdG8gbG9vayBhdCB0aGUgdmVjdG9yIG9mIHNoYXJlZCBnZW5lczoKaGVhZChzaGFyZWRfZ2VuZXMpCmBgYAoKSW4gdGhpcyBjYXNlLCB3ZSBoYXBwZW4gdG8ga25vdyB0aGF0IGFsbCBTQ0Ugb2JqZWN0cyB3ZSdyZSB3b3JraW5nIHdpdGggYWxyZWFkeSBjb250YWluZWQgdGhlIHNhbWUgZ2VuZXMuCldlIGRvIGEgcXVpY2stYW5kLWRpcnR5IGNoZWNrIGZvciB0aGlzIGJ5IGxvb2tpbmcgYXQgdGhlIG51bWJlciBvZiByb3dzIGFjcm9zcyBTQ0Ugb2JqZWN0cywgYW5kIHdlJ2xsIHNlZSB0aGF0IHRoZXkgYXJlIGFsbCB0aGUgc2FtZToKCmBgYHtyIGNoZWNrIHNoYXJlZCBnZW5lcywgbGl2ZSA9IFRSVUV9CiMgVGhlIG51bWJlciBvZiBnZW5lcyBpbiBhbiBTQ0UgY29ycmVzcG9uZHMgdG8gaXRzIG51bWJlciBvZiByb3dzOgpzY2VfbGlzdCB8PgogIHB1cnJyOjptYXAobnJvdykKYGBgCgpTbywgZm9yIG91ciBkYXRhLCB3ZSB3aWxsIG5vdCBoYXZlIHRvIHN1YnNldCB0byBzaGFyZWQgZ2VuZXMgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzaGFyZWQhCgojIyMjIEVuc3VyaW5nIG1hdGNoaW5nIGNvbHVtbnMgaW4gYGNvbERhdGFgCgpGaW5hbGx5LCB3ZSdsbCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgY29sdW1uIG5hbWVzIGFjcm9zcyBhbGwgU0NFIGBjb2xEYXRhYCB0YWJsZXMsIHNvIGxldCdzIGxvb2sgYXQgYWxsIHRob3NlIGNvbHVtbiBuYW1lcy4KV2UgY2FuIHVzZSBzaW1pbGFyIHN5bnRheCBoZXJlIHRvIHdoYXQgd2UgdXNlZCB0byBsb29rIGF0IGFsbCB0aGUgYHJvd0RhdGFgIGNvbHVtbiBuYW1lcy4KCmBgYHtyIGNvbXBhcmUgY29sZGF0YX0KcHVycnI6Om1hcChzY2VfbGlzdCwKICAgICAgICAgICBcKHgpIGNvbG5hbWVzKGNvbERhdGEoeCkpICkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBjb2x1bW4gbmFtZXMgYXJlIGFsbCBhbHJlYWR5IG1hdGNoaW5nIGFtb25nIFNDRXMsIHNvIHRoZXJlJ3Mgbm8gc3BlY2lmaWMgcHJlcGFyYXRpb24gd2UnbGwgbmVlZCB0byBkbyB0aGVyZS4KCiMjIyBQZXJmb3JtIFNDRSBtZXJnaW5nCgpBcyB5b3UgY2FuIHNlZSwgdGhlcmUncyBhIGxvdCBvZiBtb3ZpbmcgcGFydHMgdG8gY29uc2lkZXIhCkFnYWluLCB0aGVzZSBtb3ZpbmcgcGFydHMgbWF5ICh3aWxsISkgZGlmZmVyIGZvciBTQ0VzIHRoYXQgeW91IGFyZSB3b3JraW5nIHdpdGgsIHNvIHlvdSBoYXZlIHRvIGV4cGxvcmUgeW91ciBvd24gU0NFcyBpbiBkZXB0aCB0byBwcmVwYXJlIGZvciBtZXJnaW5nLgoKQmFzZWQgb24gb3VyIGV4cGxvcmF0aW9uLCBoZXJlIGlzIGEgc2NoZW1hdGljIG9mIGhvdyBvbmUgb2YgdGhlIFNDRSBvYmplY3RzIHdpbGwgdWx0aW1hdGVseSBiZSBtb2RpZmllZCBpbnRvIHRoZSBmaW5hbCBtZXJnZWQgU0NFOgoKIVtdKGRpYWdyYW1zL3RlY2huaWNhbF9tZXJnZV9zY2UucG5nKQoKCldlJ2xsIHdyaXRlIGEgX2N1c3RvbSBmdW5jdGlvbl8gKHNlZW4gaW4gdGhlIGNodW5rIGJlbG93KSB0YWlsb3JlZCB0byBvdXIgd3JhbmdsaW5nIHN0ZXBzIHRoYXQgcHJlcGFyZXMgYSBzaW5nbGUgU0NFIG9iamVjdCBmb3IgbWVyZ2luZy4KV2UnbGwgdGhlbiB1c2Ugb3VyIG5ldyBgcHVycnI6Om1hcCgpYCBwcm9ncmFtbWluZyBza2lsbHMgdG8gcnVuIHRoaXMgZnVuY3Rpb24gb3ZlciB0aGUgYHNjZV9saXN0YC4KVGhpcyB3aWxsIGdpdmUgdXMgYSBuZXcgbGlzdCBvZiBmb3JtYXR0ZWQgU0NFcyB0aGF0IHdlIGNhbiBwcm9jZWVkIHRvIG1lcmdlLgpJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSBgZm9ybWF0X3NjZSgpYCBmdW5jdGlvbiB3cml0dGVuIGJlbG93IGlzIG5vdCBhIGZ1bmN0aW9uIGZvciBnZW5lcmFsIHVzZSDigJMgaXQncyBiZWVuIHByZWNpc2VseSB3cml0dGVuIHRvIG1hdGNoIHRoZSBwcm9jZXNzaW5nIHdlIG5lZWQgdG8gZG8gZm9yIF90aGVzZV8gU0NFcywgYW5kIGRpZmZlcmVudCBTQ0VzIHlvdSB3b3JrIHdpdGggd2lsbCByZXF1aXJlIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9jZXNzaW5nLgoKYGBge3IgZm9ybWF0X3NjZSBmdW5jdGlvbn0KZm9ybWF0X3NjZSA8LSBmdW5jdGlvbihzY2UsIHNhbXBsZV9uYW1lKSB7CiAgIyBJbnB1dCBhcmd1bWVudHM6CiAgIyMgc2NlOiBBbiBTQ0Ugb2JqZWN0IHRvIGZvcm1hdAogICMjIHNhbXBsZV9uYW1lOiBUaGUgU0NFIG9iamVjdCdzIG5hbWUKICAjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZvcm1hdHRlZCBTQ0Ugb2JqZWN0LgoKICAjIyMjIyMgRW5zdXJlIHRoYXQgd2UgY2FuIGlkZW50aWZ5IHRoZSBvcmlnaW5hdGluZyBzYW1wbGUgaW5mb3JtYXRpb24gIyMjIyMjCiAgIyBBZGQgYSBjb2x1bW4gY2FsbGVkIGBzYW1wbGVgIHRoYXQgc3RvcmVzIHRoaXMgaW5mb3JtYXRpb24KICAjIFRoaXMgd2lsbCBiZSBzdG9yZWQgaW4gYGNvbERhdGFgCiAgc2NlJHNhbXBsZSA8LSBzYW1wbGVfbmFtZQoKCiAgIyMjIyMjIEVuc3VyZSBjZWxsIGlkcyB3aWxsIGJlIHVuaXF1ZSAjIyMjIyMKICAjIFVwZGF0ZSB0aGUgU0NFIG9iamVjdCBjb2x1bW4gbmFtZXMgKGNlbGwgaWRzKSBieSBwcmVwZW5kaW5nIGBzYW1wbGVfbmFtZWAKICBjb2xuYW1lcyhzY2UpIDwtIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZX0te2NvbG5hbWVzKHNjZSl9IikKCgogICMjIyMjIyBFbnN1cmUgZ2VuZS1sZXZlbCBzdGF0aXN0aWNzIGNhbiBiZSBpZGVudGlmaWVkIGluIGByb3dEYXRhYCAjIyMjIyMKICAjIFdlIHdhbnQgdG8gcmVuYW1lIHRoZSBjb2x1bW5zIGBtZWFuYCBhbmQgYGRldGVjdGVkYCB0byBjb250YWluIHRoZSBgc2FtcGxlX25hbWVgCiAgIyBSZWNhbGwgdGhlIG5hbWVzIGFyZTogImdlbmVfc3ltYm9sIiwgIm1lYW4iLCAiZGV0ZWN0ZWQiCiAgY29sbmFtZXMocm93RGF0YShzY2UpKSA8LSBjKCJnZW5lX3N5bWJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsdWU6OmdsdWUoIntzYW1wbGVfbmFtZX0tbWVhbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHVlOjpnbHVlKCJ7c2FtcGxlX25hbWV9LWRldGVjdGVkIikpCgogICMgUmV0dXJuIHRoZSBmb3JtYXR0ZWQgU0NFIG9iamVjdAogIHJldHVybihzY2UpCn0KYGBgCgpUbyBydW4gdGhpcyBmdW5jdGlvbiwgd2UnbGwgdXNlIHRoZSBgcHVycnI6Om1hcDIoKWAgZnVuY3Rpb24sIGEgcmVsYXRpdmUgb2YgYHB1cnJyOjptYXAoKWAgdGhhdCBhbGxvd3MgeW91IHRvIGxvb3Agb3ZlciBfdHdvXyBpbnB1dCBsaXN0cy92ZWN0b3JzLgpJbiBvdXIgY2FzZSwgd2Ugd2FudCB0byBydW4gYGZvcm1hdF9zY2UoKWAgb3ZlciBwYWlyZWQgYHNjZV9saXN0YCBpdGVtcyBhbmQgYHNjZV9saXN0YCBuYW1lcy4KCmBgYHtyIGZvcm1hdCBzY2VzIGZvciBtZXJnZSwgbGl2ZSA9IFRSVUV9CiMgV2UgY2FuIHVzZSBgcHVycnI6Om1hcDIoKWAgdG8gbG9vcCBvdmVyIHR3byBsaXN0L3ZlY3RvciBhcmd1bWVudHMKc2NlX2xpc3RfZm9ybWF0dGVkIDwtIHB1cnJyOjptYXAyKAogICMgRWFjaCAiaXRlcmF0aW9uIiB3aWxsIG1hcmNoIGRvd24gdGhlIGZpcnN0IHR3bwogICMgIGFyZ3VtZW50cyBgc2NlX2xpc3RgIGFuZCBgbmFtZXMoc2NlX2xpc3QpYCBpbiBvcmRlcgogIHNjZV9saXN0LAogIG5hbWVzKHNjZV9saXN0KSwKICAjIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIHJ1bgogIGZvcm1hdF9zY2UKKQoKIyBQcmludCByZXN1bHRpbmcgbGlzdApzY2VfbGlzdF9mb3JtYXR0ZWQKYGBgCgooUHNzdCwgbGlrZSBgcHVycnJgIGFuZCB3YW50IHRvIGRpdmUgZGVlcGVyPyBDaGVjayBvdXQgW3RoZSBgcHVycnI6OmltYXAoKWAgZnVuY3Rpb25dKGh0dHBzOi8vcHVycnIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvaW1hcC5odG1sKSEpCgoKQXQgbG9uZyBsYXN0LCB3ZSBhcmUgcmVhZHkgdG8gbWVyZ2UgdGhlIFNDRXMsIHdoaWNoIHdlJ2xsIGRvIHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGBjYmluZCgpYC4KVGhlIGBjYmluZCgpYCBmdW5jdGlvbiBpcyBvZnRlbiB1c2VkIHRvIGNvbWJpbmUgZGF0YSBmcmFtZXMgb3IgbWF0cmljZXMgYnkgY29sdW1uLCBpLmUuICJzdGFjayIgdGhlbSBuZXh0IHRvIGVhY2ggb3RoZXIuClRoZSBzYW1lIHByaW5jaXBsZSBhcHBsaWVzIGhlcmUsIGJ1dCB3aGVuIHJ1biBvbiBTQ0Ugb2JqZWN0cywgYGNiaW5kKClgIHdpbGwgY3JlYXRlIGEgbmV3IFNDRSBvYmplY3QgYnkgY29tYmluaW5nIGBjb3VudHNgIGFuZCBgbG9nY291bnRzYCBtYXRyaWNlcyBieSBjb2x1bW4uCkZvbGxvd2luZyB0aGF0IHN0cnVjdHVyZSwgb3RoZXIgU0NFIHNsb3RzIChgY29sRGF0YWAsIGByb3dEYXRhYCwgcmVkdWNlZCBkaW1lbnNpb25zLCBhbmQgb3RoZXIgbWV0YWRhdGEpIGFyZSBjb21iaW5lZCBhcHByb3ByaWF0ZWx5LgoKU2luY2Ugd2UgbmVlZCB0byBhcHBseSBgY2JpbmQoKWAgdG8gYSBfbGlzdF8gb2Ygb2JqZWN0cywgd2UgbmVlZCB0byB1c2Ugc29tZSBzbGlnaHRseS1nbmFybHkgc3ludGF4OiBXZSdsbCB1c2UgdGhlIGZ1bmN0aW9uIGBkby5jYWxsKClgLCB3aGljaCBhbGxvd3MgdGhlIGBjYmluZCgpYCBpbnB1dCB0byBiZSBhIGxpc3Qgb2Ygb2JqZWN0cyB0byBjb21iaW5lLgoKYGBge3IgbWVyZ2VzIHNjZXMsIGxpdmUgPSBUUlVFfQojIE1lcmdlIFNDRSBvYmplY3RzCm1lcmdlZF9zY2UgPC0gZG8uY2FsbChjYmluZCwgc2NlX2xpc3RfZm9ybWF0dGVkKQoKIyBQcmludCB0aGUgbWVyZ2VkX3NjZSBvYmplY3QKbWVyZ2VkX3NjZQpgYGAKCldlIG5vdyBoYXZlIGEgc2luZ2xlIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgY2VsbHMgZnJvbSBhbGwgc2FtcGxlcyB3ZSdkIGxpa2UgdG8gaW50ZWdyYXRlLgoKTGV0J3MgdGFrZSBhIHBlZWsgYXQgc29tZSBvZiB0aGUgaW5uYXJkcyBvZiB0aGlzIG5ldyBTQ0Ugb2JqZWN0OgoKYGBge3IgZXhwbG9yZSBtZXJnZWRfc2NlLCBsaXZlID0gVFJVRX0KIyBXaGF0IGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBpbiB0aGUgYHNhbXBsZWAgY29sdW1uPwp1bmlxdWUoIGNvbERhdGEobWVyZ2VkX3NjZSkkc2FtcGxlICkKCiMgV2hhdCBhcmUgdGhlIG5ldyBjZWxsIGlkcyAoY29sdW1uIG5hbWVzKT8KaGVhZCggY29sbmFtZXMobWVyZ2VkX3NjZSkgKQoKIyBXaGF0IGRvZXMgcm93RGF0YSBsb29rIGxpa2U/CmhlYWQoIHJvd0RhdGEobWVyZ2VkX3NjZSkgKQpgYGAKCgojIyBJbnRlZ3JhdGlvbgoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBJbnRlZ3JhdGVdKGRpYWdyYW1zL3JvYWRtYXBfbXVsdGlfaW50ZWdyYXRlLnBuZykKCgpTbyBmYXIsIHdlJ3ZlIGNyZWF0ZWQgYSBgbWVyZ2VkX3NjZWAgb2JqZWN0IHdoaWNoIGlzIChhbG1vc3QhKSByZWFkeSBmb3IgaW50ZWdyYXRpb24uCgpUaGUgaW50ZWdyYXRpb24gbWV0aG9kcyB3ZSdsbCBiZSB1c2luZyBoZXJlIGFjdHVhbGx5IHBlcmZvcm0gYmF0Y2ggY29ycmVjdGlvbiBvbiBhIHJlZHVjZWQgZGltZW5zaW9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub3JtYWxpemVkIGdlbmUgZXhwcmVzc2lvbiB2YWx1ZXMsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50LgpgZmFzdE1OTmAgYW5kIGBoYXJtb255YCBzcGVjaWZpY2FsbHkgdXNlIFBDQSBmb3IgdGhpcywgYnV0IGJlIGF3YXJlIHRoYXQgZGlmZmVyZW50IGludGVncmF0aW9uIG1ldGhvZHMgbWF5IHVzZSBvdGhlciBraW5kcyBvZiByZWR1Y2VkIGRpbWVuc2lvbnMuCgpZb3UnbGwgbm90aWNlIHRoYXQgdGhlIG1lcmdlZCBTQ0Ugb2JqZWN0IG9iamVjdCBhbHJlYWR5IGNvbnRhaW5zIFBDQSBhbmQgVU1BUCByZWR1Y2VkIGRpbWVuc2lvbnMsIHdoaWNoIHdlcmUgY2FsY3VsYXRlZCBkdXJpbmcgb3VyIHByZS1wcm9jZXNzaW5nOgoKYGBge3IgbWVyZ2VkX3NjZSByZWRkaW0sIGxpdmUgPSBUUlVFfQojIFByaW50IHRoZSByZWR1Y2VkRGltTmFtZXMgb2YgdGhlIG1lcmdlZF9zY2UKcmVkdWNlZERpbU5hbWVzKG1lcmdlZF9zY2UpCmBgYAoKVGhlc2UgcmVwcmVzZW50IHRoZSBvcmlnaW5hbCBkaW1lbnNpb24gcmVkdWN0aW9ucyB0aGF0IHdlcmUgcGVyZm9ybWVkIG9uIF9lYWNoIGluZGl2aWR1YWwgU0NFXyBiZWZvcmUgbWVyZ2luZywgYnV0IHdlIGFjdHVhbGx5IG5lZWQgdG8gY2FsY3VsYXRlIFBDQSAoYW5kIFVNQVAgZm9yIHZpc3VhbGl6YXRpb24pIGZyb20gdGhlIG1lcmdlZCBvYmplY3QgZGlyZWN0bHkuCgpXaHkgY2FuJ3Qgd2UgdXNlIHRoZSBzYW1wbGUtc3BlY2lmaWMgUENBIGFuZCBVTUFQIG1hdHJpY2VzPwpQYXJ0IG9mIHRoZXNlIGNhbGN1bGF0aW9ucyB0aGVtc2VsdmVzIGludm9sdmVzIHNjYWxpbmcgdGhlIHJhdyBkYXRhIHRvIGNlbnRlciB0aGUgbWVhbi4KV2hlbiBzYW1wbGVzIGFyZSBzZXBhcmF0ZWx5IGNlbnRlcmVkIGJ1dCBwbG90dGluZyB0b2dldGhlciwgeW91IHdpbGwgc2VlIHNhbXBsZXMgIm92ZXJsYXBwaW5nIiBpbiBzcGFjZSwgYnV0IHRoaXMgcGxhY2VtZW50IGlzIGFjdHVhbGx5IGp1c3QgYW4gYXJ0aWZhY3Qgb2YgdGhlIGluZGl2aWR1YWwgY2VudGVyaW5nLgpJbiBhZGRpdGlvbiwgdGhlIG1hdGhlbWF0aWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbiBkYXRhIGFuZCByZWR1Y2VkIGRpbWVuc2lvbiB2ZXJzaW9uIG9mIHRoYXQgZGF0YSB3aWxsIGRpZmZlciBhY3Jvc3Mgc2FtcGxlcywgbWVhbmluZyB3ZSBjYW4ndCBpbnRlcnByZXQgdGhlbSBhbGwgdG9nZXRoZXIuClRvIHNlZSBob3cgdGhpcyBsb29rcywgbGV0J3MgbG9vayBhdCB0aGUgVU1BUCB3aGVuIGNhbGN1bGF0ZWQgZnJvbSBpbmRpdmlkdWFsIHNhbXBsZXM6CgpgYGB7ciBwbG90IGluZGl2aWR1YWwgVU1BUHMsIGxpdmUgPSBUUlVFfQojIFBsb3QgVU1BUCBjYWxjdWxhdGVkIGZyb20gaW5kaXZpZHVhbCBzYW1wbGVzIHdpdGggc2VwYXJhdGUgc2NhbGluZwpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gIlVNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgKwogICMgVXNlIGEgQ1ZELWZyaWVuZGx5IGNvbG9yIHNjaGVtZSBhbmQgc3BlY2lmeSBsZWdlbmQgbmFtZQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgbmFtZSA9ICJzYW1wbGUiKSArCiAgIyBNb2RpZnkgdGhlIGxlZ2VuZCBrZXkgc28gaXRzIHBvaW50cyBhcmUgbGFyZ2VyIGFuZCBlYXNpZXIgdG8gc2VlCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBjYWxjdWxhdGVkIG9uIGVhY2ggc2FtcGxlIHNlcGFyYXRlbHkiKQoKYGBgCgoKQXMgd2Ugc2VlIGluIHRoaXMgVU1BUCwgYWxsIHNhbXBsZXMgYXJlIGNlbnRlcmVkIGF0IHplcm8gYW5kIGFsbCBvdmVybGFwcGluZy4KVGhpcyB2aXN1YWwgYXJ0aWZhY3QgY2FuIGdpdmUgdGhlIF9pbmNvcnJlY3QgaW1wcmVzc2lvbl8gdGhhdCBkYXRhIGlzIGludGVncmF0ZWQgLSB0byBiZSBjbGVhciwgdGhpcyBkYXRhIGlzIE5PVCBpbnRlZ3JhdGVkIQoKRm9yIGlucHV0IHRvIGludGVncmF0aW9uLCB3ZSdsbCB3YW50IHRoZSByZWR1Y2VkIGRpbWVuc2lvbiBjYWxjdWxhdGlvbnMgdG8gY29uc2lkZXIgbm9ybWFsaXplZCBnZW5lIGV4cHJlc3Npb24gdmFsdWVzIGZyb20gYWxsIHNhbXBsZXMgc2ltdWx0YW5lb3VzbHkuClNvIHdlJ2xsIG5lZWQgdG8gcmVjYWxjdWxhdGUgUENBIChhbmQgVU1BUCBmb3IgdmlzdWFsaXphdGlvbikgb24gdGhlIG1lcmdlZCBvYmplY3QuCldlJ2xsIGFsc28gc2F2ZSB0aGVzZSBuZXcgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggZGlmZmVyZW50IG5hbWVzLCBgbWVyZ2VkX1BDQWAgYW5kIGBtZXJnZWRfVU1BUGAsIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBhbHJlYWR5LXByZXNlbnQgYFBDQWAgYW5kIGBVTUFQYC4KCkZpcnN0LCBhcyB1c3VhbCwgd2UnbGwgZGV0ZXJtaW5lIHRoZSBoaWdoLXZhcmlhbmNlIGdlbmVzIHRvIHVzZSBmb3IgUENBIGZyb20gdGhlIGBtZXJnZWRfc2NlYCBvYmplY3QuCkZvciB0aGlzLCB3ZSdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlIGFyZ3VtZW50IGBibG9jayA9IG1lcmdlZF9zY2Ukc2FtcGxlYCB3aGVuIG1vZGVsaW5nIGdlbmUgdmFyaWFuY2UsIHdoaWNoIHRlbGxzIGBzY3Jhbjo6bW9kZWxHZW5lVmFyKClgIHRvIGZpcnN0IG1vZGVsIHZhcmlhbmNlIHNlcGFyYXRlbHkgZm9yIGVhY2ggYmF0Y2ggYW5kIHRoZW4gY29tYmluZSB0aG9zZSBtb2RlbGluZyBzdGF0aXN0aWNzLgoKYGBge3IgY2FsYyBtZXJnZWQgaHYgZ2VuZXN9CiMgU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGdlbmVzIHRvIGlkZW50aWZ5Cm51bV9nZW5lcyA8LSAyMDAwCgojIENhbGN1bGF0ZSB2YXJpYXRpb24gZm9yIGVhY2ggZ2VuZQpnZW5lX3ZhcmlhbmNlIDwtIHNjcmFuOjptb2RlbEdlbmVWYXIobWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmeSB0aGUgZ3JvdXBpbmcgY29sdW1uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXJnZWRfc2NlJHNhbXBsZSkKCiMgR2V0IHRoZSB0b3AgYG51bV9nZW5lc2AgaGlnaC12YXJpYW5jZSBnZW5lcyB0byB1c2UgZm9yIGRpbWVuc2lvbiByZWR1Y3Rpb24KaHZfZ2VuZXMgPC0gc2NyYW46OmdldFRvcEhWR3MoZ2VuZV92YXJpYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG51bV9nZW5lcykKYGBgCgpUbyBjYWxjdWxhdGUgdGhlIFBDQSBtYXRyaXggaXRzZWxmLCB3ZSdsbCB1c2UgYW4gYXBwcm9hY2ggZnJvbSB0aGUgYGJhdGNoZWxvcmAgcGFja2FnZSwgd2hpY2ggaXMgdGhlIFIgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBgZmFzdE1OTmAgbWV0aG9kLgpUaGUgW2BiYXRjaGVsb3I6Om11bHRpQmF0Y2hQQ0EoKWBdKGh0dHBzOi8vcmRyci5pby9iaW9jL2JhdGNoZWxvci9tYW4vbXVsdGlCYXRjaFBDQS5odG1sKSBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgYmF0Y2gtd2VpZ2h0ZWQgUENBIG1hdHJpeC4KVGhpcyB3ZWlnaHRpbmcgZW5zdXJlcyB0aGF0IGFsbCBiYXRjaGVzLCB3aGljaCBtYXkgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBudW1iZXJzIG9mIGNlbGxzLCBjb250cmlidXRlIGVxdWFsbHkgdG8gdGhlIG92ZXJhbGwgc2NhbGluZy4KCmBgYHtyIG1ha2UgbWVyZ2VkX3BjYSwgbGl2ZSA9IFRSVUV9CiMgVXNlIGJhdGNoZWxvciB0byBjYWxjdWxhdGUgUENBIGZvciBtZXJnZWRfc2NlLCBjb25zaWRlcmluZyBvbmx5CiMgIHRoZSBoaWdoLXZhcmlhbmNlIGdlbmVzCiMgV2UnbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBhcmd1bWVudCBgcHJlc2VydmUuc2luZ2xlID0gVFJVRWAgdG8gZ2V0CiMgIGEgc2luZ2xlIG1hdHJpeCB3aXRoIGFsbCBzYW1wbGVzIGFuZCBub3Qgc2VwYXJhdGUgbWF0cmljZXMgZm9yIGVhY2ggc2FtcGxlCm1lcmdlZF9wY2EgPC0gYmF0Y2hlbG9yOjptdWx0aUJhdGNoUENBKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNldC5yb3cgPSBodl9nZW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSBtZXJnZWRfc2NlJHNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmUuc2luZ2xlID0gVFJVRSkKYGBgCgpMZXQncyBoYXZlIGEgbG9vayBhdCB0aGUgb3V0cHV0OgpgYGB7ciBwcmludCBtZXJnZWRfcGNhLCBsaXZlID0gVFJVRX0KIyBUaGlzIG91dHB1dCBpcyBub3QgdmVyeSBpbnRlcmVzdGluZyEKbWVyZ2VkX3BjYQpgYGAKCldlIGNhbiB1c2UgaW5kZXhpbmcgYFtbMV1dYCB0byBzZWUgdGhlIFBDQSBtYXRyaXggY2FsY3VsYXRlZCwgbG9va2luZyBhdCBhIHNtYWxsIHN1YnNldCBmb3IgY29udmVuaWVuY2U6CgpgYGB7ciBwcmludCBtZXJnZWRfcGNhIGluZGV4ZWQsIGxpdmUgPSBUUlVFfQptZXJnZWRfcGNhW1sxXV1bMTo1LDE6NV0KYGBgCgpXZSBjYW4gbm93IGluY2x1ZGUgdGhpcyBQQ0EgbWF0cml4IGluIG91ciBgbWVyZ2VkX3NjZWAgb2JqZWN0OgoKYGBge3IgYWRkIG1lcmdlZF9wY2EsIGxpdmUgPSBUUlVFfQojIGFkZCBQQ0EgcmVzdWx0cyB0byBtZXJnZWQgU0NFIG9iamVjdApyZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJtZXJnZWRfUENBIikgPC0gbWVyZ2VkX3BjYVtbMV1dCmBgYAoKTm93IHRoYXQgd2UgaGF2ZSB0aGUgUENBIG1hdHJpeCwgd2UgY2FuIHByb2NlZWQgdG8gY2FsY3VsYXRlIFVNQVAgdG8gdmlzdWFsaXplIHRoZSB1bmNvcnJlY3RlZCBtZXJnZWQgZGF0YS4KCldlJ2xsIGNhbGN1bGF0ZSBVTUFQIGFzICJ1c3VhbCIsIGJ1dCBpbiB0aGlzIGNhc2Ugd2UnbGwgc3BlY2lmeSB0d28gYWRkaXRpb25hbCBhcmd1bWVudHM6CgotIGBkaW1yZWQgPSAibWVyZ2VkX1BDQSJgLCB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZXhpc3RpbmcgcmVkdWNlZCBkaW1lbnNpb24gc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBjYWxjdWxhdGlvbi4KV2Ugd2FudCB0byB1c2UgdGhlIGJhdGNoLXdlaWdodGVkIFBDQSwgd2hpY2ggd2UgbmFtZWQgYWJvdmUgYXMgYCJtZXJnZWRfUENBImAuCi0gYG5hbWUgPSAibWVyZ2VkX1VNQVAiYCwgd2hpY2ggbmFtZXMgdGhlIGZpbmFsIFVNQVAgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMuClRoaXMgYXJndW1lbnQgd2lsbCBwcmV2ZW50IHVzIGZyb20gb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIFVNQVAgd2hpY2ggaXMgYWxyZWFkeSBuYW1lZCAiVU1BUCIgYW5kIGluc3RlYWQgY3JlYXRlIGEgc2VwYXJhdGUgYCJtZXJnZWRfVU1BUCJgLgoKYGBge3IgY2FsY3VsYXRlIG1lcmdlZCB1bWFwLCBsaXZlID0gVFJVRX0KIyBhZGQgbWVyZ2VkX1VNQVAgZnJvbSBtZXJnZWRfUENBCm1lcmdlZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJtZXJnZWRfUENBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJtZXJnZWRfVU1BUCIpCmBgYAoKTm93LCBsZXQncyBzZWUgaG93IHRoaXMgbmV3IGBtZXJnZWRfVU1BUGAgbG9va3MgY29tcGFyZWQgdG8gdGhlIGBVTUFQYCBjYWxjdWxhdGVkIGZyb20gaW5kaXZpZHVhbCBzYW1wbGVzOgoKYGBge3IgcGxvdCB1bmNvcnJlY3RlZCBtZXJnZWQgVU1BUH0KIyBVTUFQcyBzY2FsZWQgdG9nZXRoZXIgd2hlbiBjYWxjdWxhdGVkIGZyb20gdGhlIG1lcmdlZCBTQ0UKc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJtZXJnZWRfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAic2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgc3R5bGluZyB0byBoZWxwIHVzIHNlZSB0aGUgcG9pbnRzOgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAic2FtcGxlIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgY2FsY3VsYXRlZCBvbiBtZXJnZWRfc2NlIikKYGBgCgpTYW1wbGVzIGFyZSBub3cgc2VwYXJhdGVkLCB3aGljaCBtb3JlIHJlYXNvbmFibHkgcmVmbGVjdHMgdGhhdCB0aGlzIGRhdGEgaXMgX25vdCB5ZXQgYmF0Y2gtY29ycmVjdGVkXy4KV2UgY2FuIHRoaW5rIG9mIHRoaXMgVU1BUCBhcyBvdXIgImJlZm9yZSIgVU1BUCwgYW5kIHdlIGNhbiBjb21wYXJlIHRoaXMgdG8gdGhlICJhZnRlciIgVU1BUCB3ZSBzZWUgcG9zdC1pbnRlZ3JhdGlvbi4KCkxldCdzIGRpc2N1c3MgYSBsaXR0bGUgZmlyc3Q6IFdoYXQgdmlzdWFsIGRpZmZlcmVuY2VzIGRvIHlvdSB0aGluayB0aGUgVU1BUCBvbiB0aGUgaW50ZWdyYXRlZCB2ZXJzaW9uIG9mIGRhdGEgd2lsbCBoYXZlPwpXaGF0IHNpbWlsYXJpdGllcyBkbyB5b3UgdGhpbmsgdGhlIGludGVncmF0ZWQgVU1BUCB3aWxsIGhhdmUgdG8gdGhpcyBwbG90PwoKCiMjIyBJbnRlZ3JhdGlvbiB3aXRoIGBmYXN0TU5OYAoKRmluYWxseSwgd2UncmUgcmVhZHkgdG8gaW50ZWdyYXRlIQpUbyBzdGFydCwgd2UnbGwgdXNlIHRoZSBgZmFzdE1OTmAgYXBwcm9hY2ggZnJvbSB0aGUgQmlvY29uZHVjdG9yIFtgYmF0Y2hlbG9yYCBwYWNrYWdlXShodHRwOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvMy4xNi9iaW9jL2h0bWwvYmF0Y2hlbG9yLmh0bWwpLgoKYGZhc3RNTk5gIHRha2VzIGFzIGlucHV0IHRoZSBgbWVyZ2VkX3NjZWAgb2JqZWN0IHRvIGludGVncmF0ZSwgYW5kIHRoZSBmaXJzdCBzdGVwIGl0IHBlcmZvcm1zIGlzIGFjdHVhbGx5IHRvIHJ1biBgYmF0Y2hlbG9yOjptdWx0aUJhdGNoUENBKClgIG9uIHRoYXQgU0NFLgpJdCB0aGVuIHVzZXMgdGhhdCBiYXRjaC13ZWlnaHRlZCBQQ0EgbWF0cml4IHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBiYXRjaCBjb3JyZWN0aW9uLgpUaGUgYGJhdGNoYCBhcmd1bWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpZmZlcmVudCBncm91cGluZ3Mgd2l0aGluIHRoZSBgbWVyZ2VkX3NjZWAgKGkuZS4gdGhlIG9yaWdpbmFsIHNhbXBsZSB0aGF0IGVhY2ggY2VsbCBiZWxvbmdzIHRvKSwgYW5kIHRoZSBgc3Vic2V0LnJvd2AgYXJndW1lbnQgY2FuIG9wdGlvbmFsbHkgYmUgdXNlZCB0byBwcm92aWRlIGEgdmVjdG9yIG9mIGhpZ2gtdmFyaWFuY2UgZ2VuZXMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3IgdGhpcyBQQ0EgY2FsY3VsYXRpb24uCmBmYXN0TU5OYCB3aWxsIHJldHVybiBhbiBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMgYSBiYXRjaC1jb3JyZWN0ZWQgUENBLgpMZXQncyBydW4gaXQgYW5kIHNhdmUgdGhlIHJlc3VsdCB0byBhIHZhcmlhYmxlIGNhbGxlZCBgaW50ZWdyYXRlZF9zY2VgLgoKCmBgYHtyIHJ1biBmYXN0bW5uLCBsaXZlID0gVFJVRX0KIyBpbnRlZ3JhdGUgd2l0aCBmYXN0TU5OLCBhZ2FpbiBzcGVjaWZ5aW5nIG9ubHkgb3VyIGhpZ2gtdmFyaWFuY2UgZ2VuZXMKaW50ZWdyYXRlZF9zY2UgPC0gYmF0Y2hlbG9yOjpmYXN0TU5OKAogIG1lcmdlZF9zY2UsCiAgYmF0Y2ggPSBtZXJnZWRfc2NlJHNhbXBsZSwKICBzdWJzZXQucm93ID0gaHZfZ2VuZXMKKQpgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSByZXN1bHQ6CgpgYGB7ciBmYXN0bW5uIHJlc3VsdCwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIGludGVncmF0ZWRfc2NlIG9iamVjdAppbnRlZ3JhdGVkX3NjZQpgYGAKClRoZXJlIGFyZSBjb3VwbGUgcGllY2VzIG9mIGluZm9ybWF0aW9uIGhlcmUgb2YgaW50ZXJlc3Q6CgotIFRoZSBgY29ycmVjdGVkYCByZWR1Y2VkIGRpbWVuc2lvbiByZXByZXNlbnRzIHRoZSBiYXRjaC1jb3JyZWN0ZWQgUENBIHRoYXQgYGZhc3RNTk5gIGNhbGN1bGF0ZWQuCi0gVGhlIGByZWNvbnN0cnVjdGVkYCBhc3NheSByZXByZXNlbnRzIHRoZSBiYXRjaC1jb3JyZWN0ZWQgbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgd2hpY2ggYGZhc3RNTk5gICJiYWNrLWNhbGN1bGF0ZWQiIGZyb20gdGhlIGJhdGNoLWNvcnJlY3RlZCBQQ0EgKGBjb3JyZWN0ZWRgKS4KR2VuZXJhbGx5IHNwZWFraW5nLCB0aGVzZSBleHByZXNzaW9uIHZhbHVlcyBhcmUgbm90IHN0YW5kLWFsb25lIHZhbHVlcyB0aGF0IHlvdSBzaG91bGQgdXNlIGZvciBvdGhlciBhcHBsaWNhdGlvbnMgbGlrZSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uLCBhcyBkZXNjcmliZWQgaW4gW19PcmNoZXN0cmF0aW5nIFNpbmdsZSBDZWxsIEFuYWx5c2VzX10oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xNi9PU0NBLm11bHRpc2FtcGxlL3VzaW5nLWNvcnJlY3RlZC12YWx1ZXMuaHRtbCkuCklmIHRoZSBgc3Vic2V0LnJvd2AgYXJndW1lbnQgaXMgcHJvdmlkZWQgKGFzIGl0IHdhcyBoZXJlKSwgb25seSBnZW5lcyBwcmVzZW50IGluIGBzdWJzZXQucm93YCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZXNlIHJlY29uc3RydWN0ZWQgZXhwcmVzc2lvbiB2YWx1ZXMsIGJ1dCB0aGlzIHNldHRpbmcgY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCBhbGwgZ2VuZXMgaGF2ZSByZWNvbnN0cnVjdGVkIGV4cHJlc3Npb24gd2l0aCB0aGUgYXJndW1lbnQgYGNvcnJlY3QuYWxsID0gVFJVRWAuCgpXZSdyZSBtb3N0bHkgaW50ZXJlc3RlZCBpbiB0aGUgUENBIHRoYXQgYGZhc3RNTk5gIGNhbGN1bGF0ZWQsIHNvIGxldCdzIHNhdmUgdGhhdCBpbmZvcm1hdGlvbiAod2l0aCBhbiBpbmZvcm1hdGl2ZSBhbmQgdW5pcXVlIG5hbWUpIGludG8gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Q6CgpgYGB7ciBmYXN0bW5uIHBjcywgbGl2ZSA9IFRSVUV9CiMgTWFrZSBhIG5ldyByZWR1Y2VkRGltIG5hbWVkIGZhc3Rtbm5fUENBIGZyb20gdGhlIGNvcnJlY3RlZCByZWR1Y2VkRGltIGluIGludGVncmF0ZWRfc2NlCnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgImZhc3Rtbm5fUENBIikgPC0gcmVkdWNlZERpbShpbnRlZ3JhdGVkX3NjZSwgImNvcnJlY3RlZCIpCmBgYAoKRmluYWxseSwgd2UnbGwgY2FsY3VsYXRlIFVNQVAgZnJvbSB0aGVzZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBmb3IgdmlzdWFsaXphdGlvbi4KCmBgYHtyIGNhbGN1bGF0ZSBmYXN0bW5uIHVtYXAsIGxpdmUgPSBUUlVFfQojIENhbGN1bGF0ZSBVTUFQCm1lcmdlZF9zY2UgPC0gc2NhdGVyOjpydW5VTUFQKAogIG1lcmdlZF9zY2UsCiAgZGltcmVkID0gImZhc3Rtbm5fUENBIiwKICBuYW1lID0gImZhc3Rtbm5fVU1BUCIKKQpgYGAKCkZpcnN0LCBsZXQncyBwbG90IHRoZSBpbnRlZ3JhdGVkIFVNQVAgaGlnaGxpZ2h0aW5nIHRoZSBkaWZmZXJlbnQgYmF0Y2hlcy4KQSB3ZWxsLWludGVncmF0ZWQgZGF0YXNldCB3aWxsIHNob3cgYmF0Y2ggbWl4aW5nLCBidXQgYSBwb29ybHktaW50ZWdyYXRlZCBkYXRhc2V0IHdpbGwgc2hvdyBtb3JlIHNlcGFyYXRpb24gYW1vbmcgYmF0Y2hlcywgc2ltaWxhciB0byB0aGUgdW5jb3JyZWN0ZWQgVU1BUC4KTm90ZSB0aGF0IHRoaXMgaXMgYSBtb3JlIHF1YWxpdGF0aXZlIHdheSB0byBhc3Nlc3MgdGhlIHN1Y2Nlc3Mgb2YgaW50ZWdyYXRpb24sIGJ1dCB0aGVyZSBhcmUgZm9ybWFsIG1ldHJpY3Mgb25lIGNhbiB1c2UgdG8gYXNzZXNzIGJhdGNoIG1peGluZywgd2hpY2ggeW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaW4gW3RoaXMgY2hhcHRlciBvZiBPU0NBXShodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EubXVsdGlzYW1wbGUvY29ycmVjdGlvbi1kaWFnbm9zdGljcy5odG1sKS4KCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGJhdGNoZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAjIHBsb3QgdGhlIGZhc3RNTk4gY29vcmRpbmF0ZXMKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGJ5IHNhbXBsZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN0eWxpbmcgdG8gaGVscCB1cyBzZWUgdGhlIHBvaW50czoKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gInNhbXBsZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggZmFzdE1OTiIpCmBgYAoKVGhpcyBgZmFzdG1ubl9VTUFQYCBjZXJ0YWlubHkgbG9va3MgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3ZSBtYWRlIGZyb20gYG1lcmdlZF9VTUFQYCEKV2hhdCBkaWZmZXJlbnQgdHJlbmRzIGRvIHlvdSBzZWU/CkRvIGFsbCBzYW1wbGVzIGxvb2sgImVxdWFsbHkgd2VsbCIgaW50ZWdyYXRlZCwgZnJvbSBhIGZpcnN0IGxvb2s/CgpJbXBvcnRhbnRseSwgb25lIHJlYXNvbiB0aGF0IGJhdGNoZXMgbWF5IHN0aWxsIGFwcGVhciBzZXBhcmF0ZWQgaW4gdGhlIGNvcnJlY3RlZCBVTUFQIGlzIGlmIHRoZXkgX3Nob3VsZF8gYmUgc2VwYXJhdGVkIC0gZm9yIGV4YW1wbGUsIG1heWJlIHR3byBiYXRjaGVzIGNvbnRhaW4gdmVyeSBkaWZmZXJlbnQgY2VsbCB0eXBlcywgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBkaWFnbm9zZXMsIG9yIG1heSBiZSBmcm9tIGRpZmZlcmVudCBwYXRpZW50cy4KClJlY2FsbCBmcm9tIGVhcmxpZXIgdGhhdCB3ZSBjb252ZW5pZW50bHkgaGF2ZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgaW4gb3VyIFNDRXMsIHNvIHdlIGNhbiBleHBsb3JlIHRob3NlIGhlcmUhCkxldCdzIHRha2UgYSBxdWljayBkZXRvdXIgdG8gc2VlIHdoYXQga2luZHMgb2YgY2VsbCB0eXBlcyBhcmUgaW4gdGhpcyBkYXRhIGJ5IG1ha2luZyBhIGJhcnBsb3Qgb2YgdGhlIGNlbGwgdHlwZXMgYWNyb3NzIHNhbXBsZXM6CgpgYGB7ciBleHBsb3JlIGNlbGx0eXBlc30KIyBDZWxsIHR5cGVzIGFyZSBpbiB0aGUgYGNlbGx0eXBlX2Jyb2FkYCBhbmQgYGNlbGx0eXBlX2ZpbmVgIGNvbHVtbnMKbWVyZ2VkX3NjZV9kZiA8LSBhcy5kYXRhLmZyYW1lKGNvbERhdGEobWVyZ2VkX3NjZSkpCgojIFVzZSBnZ3Bsb3QyIHRvIG1ha2UgYSBiYXJwbG90IHRoZSBjZWxsIHR5cGVzIGFjcm9zcyBzYW1wbGVzCmdncGxvdChtZXJnZWRfc2NlX2RmLAogICAgICAgYWVzKHggPSBzYW1wbGUsCiAgICAgICAgICAgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKwogICMgQmFycGxvdCBvZiBjZWxsdHlwZSBwcm9wb3J0aW9ucwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgIyBVc2UgYSBDVkQtZnJpZW5kbHkgY29sb3Igc2NoZW1lCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hLnZhbHVlID0gImdyZXk4MCIpICsKICAjIG5pY2VyIHRoZW1lCiAgdGhlbWVfYncoKQpgYGAKCldlIHNlZSB0aGF0IFR1bW9yIGNlbGwgdHlwZXMgYXJlIGJ5IGZhciB0aGUgbW9zdCBwcmV2YWxlbnQgYWNyb3NzIGFsbCBzYW1wbGVzLCBhbmQgbm9ybWFsIHRpc3N1ZSBjZWxsIHR5cGVzIGFyZSBub3QgdmVyeSBjb21tb24uCldlIHNlZSBhbHNvIHRoYXQgYFNDUENMMDAwNDgxYCBoYXMgYSBsYXJnZXIgYFR1bW9yX015b2N5dGVgIHBvcHVsYXRpb24sIHdoaWxlIGFsbCBvdGhlciBzYW1wbGVzIGhhdmUgbGFyZ2VyIGBUdW1vcl9NZXNvZGVybWAgcG9wdWxhdGlvbnMuClRoaXMgZGlmZmVyZW5jZSBfbWF5XyBleHBsYWluIHdoeSB3ZSBvYnNlcnZlIHRoYXQgYFNDUENMMDAwNDgxYCBpcyBzb21ld2hhdCBtb3JlIHNlcGFyYXRlZCBmcm9tIHRoZSBvdGhlciBzYW1wbGVzIGluIHRoZSBgZmFzdE1OTmAgVU1BUC4KCkxldCdzIHJlLXBsb3QgdGhpcyBVTUFQIHRvIGhpZ2hsaWdodCBjZWxsIHR5cGVzOgoKCmBgYHtyIHBsb3QgZmFzdG1ubiB1bWFwIGNlbGx0eXBlc30Kc2NhdGVyOjpwbG90UmVkdWNlZERpbShtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYnkgYnJvYWQgY2VsbHR5cGVzCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICsKICAjIGluY2x1ZGUgYXJndW1lbnQgdG8gc3BlY2lmeSBjb2xvciBvZiBOQSB2YWx1ZXMKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiQnJvYWQgY2VsbHR5cGUiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpKSArCiAgZ2d0aXRsZSgiVU1BUCBhZnRlciBpbnRlZ3JhdGlvbiB3aXRoIGZhc3RNTk4iKQpgYGAKClRoaXMgVU1BUCBzaG93cyB0aGF0IHRoZSBub3JtYWwgdGlzc3VlIGNlbGwgdHlwZXMgKG1vc3RseSB2YXNjdWxhciBlbmRvdGhlbGl1bSwgbXVzY2xlIGNlbGxzLCBhbmQgbW9ub2N5dGVzKSB0ZW5kIHRvIGNsdXN0ZXIgdG9nZXRoZXIgYW5kIGFyZSBnZW5lcmFsbHkgc2VwYXJhdGVkIGZyb20gdGhlIHR1bW9yIGNlbGwgdHlwZXMsIHdoaWNoIGlzIGFuIGVuY291cmFnaW5nIHBhdHRlcm4hClR1bW9yIGNlbGwgdHlwZXMgZnJvbSBkaWZmZXJlbnQgc2FtcGxlcyBhcmUgYWxsIGFsc28gY2x1c3RlcmluZyB0b2dldGhlciwgd2hpY2ggaXMgZXZlbiBtb3JlIGVuY291cmFnaW5nIHRoYXQgd2UgaGFkIHN1Y2Nlc3NmdWwgaW50ZWdyYXRpb24uCgpIb3dldmVyLCBpdCdzIGEgYml0IGNoYWxsZW5naW5nIHRvIHNlZSBhbGwgdGhlIHBvaW50cyBnaXZlbiB0aGUgYW1vdW50IG9mIG92ZXJsYXAgaW4gdGhlIHBsb3QuCk9uZSB3YXkgd2UgY2FuIHNlZSBhbGwgdGhlIHBvaW50cyBhIGJpdCBiZXR0ZXIgaXMgdG8gZmFjZXQgdGhlIHBsb3QgYnkgc2FtcGxlLCB1c2luZyBgZmFjZXRfd3JhcCgpYCBmcm9tIHRoZSBgZ2dwbG90MmAgcGFja2FnZSAod2hpY2ggd2UgY2FuIGRvIGJlY2F1c2UgYHNjYXRlcjo6cGxvdFJlZHVjZWREaW0oKWAgcmV0dXJucyBhIGBnZ3Bsb3QyYCBvYmplY3QpOgoKYGBge3IgcGxvdCBmYXN0bW5uIHVtYXAgY2VsbHR5cGVzIGZhY2V0ZWR9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiZmFzdG1ubl9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGZvciBmYWNldGluZyBieSBhIHZhcmlhYmxlIHVzaW5nIGBvdGhlcl9maWVsZHNgOgogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJzYW1wbGUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gIkJyb2FkIGNlbGx0eXBlIiwgbmEudmFsdWUgPSAiZ3JleTgwIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBmYXN0TU5OIikgKwogICMgRmFjZXQgYnkgc2FtcGxlCiAgZmFjZXRfd3JhcCh2YXJzKHNhbXBsZSkpICsKICAjIFVzZSBhIHRoZW1lIHdpdGggYmFja2dyb3VuZCBncmlkIHRvIG1vcmUgZWFzaWx5IGNvbXBhcmUgcGFuZWwgY29vcmRpbmF0ZXMKICB0aGVtZV9idygpCmBgYAoKV2hhdCB0cmVuZHMgZG8geW91IG9ic2VydmUgYmV0d2VlbiB0dW1vciBhbmQgaGVhbHRoeSB0aXNzdWVzIGFtb25nIHRoZXNlIGludGVncmF0ZWQgc2FtcGxlcz8KCgojIyMgSW50ZWdyYXRpb24gd2l0aCBgaGFybW9ueWAKCmBmYXN0TU5OYCBpcyBvbmx5IG9uZSBvZiBtYW55IGFwcHJvYWNoZXMgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbiwgYW5kIGRpZmZlcmVudCBtZXRob2RzIGhhdmUgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBhbmQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuCkZvciBleGFtcGxlLCBzb21lIG1ldGhvZHMgY2FuIGFjY29tbW9kYXRlIGFkZGl0aW9uYWwgY292YXJpYXRlcyAoZS5nLiwgdGVjaG5vbG9neSwgcGF0aWVudCwgZGlhZ25vc2lzLCBldGMuKSB0aGF0IGNhbiBpbmZsdWVuY2UgaW50ZWdyYXRpb24uCkluIGZhY3QgdGhlIGRhdGEgd2UgYXJlIHVzaW5nIGhhcyBhIGtub3duIF9wYXRpZW50XyBjb3ZhcmlhdGU7IGBTQ1BDTDAwMDQ3OWAgYW5kIGBTQ1BDTDAwMDQ4MGAgYXJlIGZyb20gdGhlIGZpcnN0IHBhdGllbnQsIGFuZCBgU0NQQ0wwMDA0ODFgIGFuZCBgU0NQQ0wwMDA0ODJgIGFyZSBmcm9tIHRoZSBzZWNvbmQgcGF0aWVudC4KClNvLCBsZXQncyBwZXJmb3JtIGludGVncmF0aW9uIHdpdGggYSBtZXRob2QgdGhhdCBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gLSBbYGhhcm1vbnlgXShodHRwczovL3BvcnRhbHMuYnJvYWRpbnN0aXR1dGUub3JnL2hhcm1vbnkvKSEKClRvIGJlZ2luIHNldHRpbmcgdXAgZm9yIGBoYXJtb255YCBpbnRlZ3JhdGlvbiwgd2UgbmVlZCB0byBhZGQgZXhwbGljaXQgcGF0aWVudCBpbmZvcm1hdGlvbiBpbnRvIG91ciBtZXJnZWQgU0NFLgpXZSdsbCBjcmVhdGUgYSBuZXcgY29sdW1uIGBwYXRpZW50YCB3aG9zZSB2YWx1ZSBpcyBlaXRoZXIgIkEiIG9yICJCIiBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHNhbXBsZSBuYW1lLCB1c2luZyB0aGUgW2BkcGx5cjo6Y2FzZV93aGVuKClgXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL2Nhc2Vfd2hlbi5odG1sKSBmdW5jdGlvbi4KV2UgcHJvdmlkZSB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzZXQgb2YgbG9naWNhbCBleHByZXNzaW9ucyBhbmQgZWFjaCBhc3NpZ25lZCB2YWx1ZSBpcyBkZXNpZ25hdGVkIGJ5IGB+YC4KVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgaW4gb3JkZXIsIHN0b3BwaW5nIGF0IHRoZSBfZmlyc3RfIG9uZSB0aGF0IGV2YWx1YXRlcyBhcyBgVFJVRWAgYW5kIHJldHVybmluZyB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KCmBgYHtyIGFkZCBwYXRpZW50IGluZm99CiMgQ3JlYXRlIHBhdGllbnQgY29sdW1uIHdpdGggdmFsdWVzICJBIiBvciAiQiIgZm9yIHRoZSB0d28gcGF0aWVudHMKbWVyZ2VkX3NjZSRwYXRpZW50IDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgbWVyZ2VkX3NjZSRzYW1wbGUgJWluJSBjKCJTQ1BDTDAwMDQ3OSIsICJTQ1BDTDAwMDQ4MCIpIH4gIkEiLAogIG1lcmdlZF9zY2Ukc2FtcGxlICVpbiUgYygiU0NQQ0wwMDA0ODEiLCAiU0NQQ0wwMDA0ODIiKSB+ICJCIiwKKQpgYGAKCgpVbmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgY2FsY3VsYXRlIGNvcnJlY3RlZCBleHByZXNzaW9uIHZhbHVlcyBub3IgZG9lcyBpdCByZXR1cm4gYW4gU0NFIG9iamVjdC4KTGlrZSBgZmFzdE1OTmAsIGBoYXJtb255YCBwZXJmb3JtcyBpbnRlZ3JhdGlvbiBvbiBhIG1lcmdlZCBQQ0EgbWF0cml4LgpIb3dldmVyLCB1bmxpa2UgYGZhc3RNTk5gLCBgaGFybW9ueWAgZG9lcyBub3QgImJhY2stY2FsY3VsYXRlIiBjb3JyZWN0ZWQgZXhwcmVzc2lvbiBmcm9tIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBhbmQgaXQgb25seSByZXR1cm5zIHRoZSBjb3JyZWN0ZWQgUENBIG1hdHJpeCBpdHNlbGYuCkZvciBpbnB1dCwgYGhhcm1vbnlgIG5lZWRzIGEgY291cGxlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKCi0gRmlyc3QsIGBoYXJtb255YCBjYW4gZWl0aGVyIHRha2UgYSBtYXRyaXggb2Ygbm9ybWFsaXplZCBleHByZXNzaW9uIHZhbHVlcywgZnJvbSB3aGljaCBpdCB3aWxsIGNhbGN1bGF0ZSBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggdG8gaW50ZWdyYXRlLCBvciBpdCBjYW4gdGFrZSBhIGJhdGNoLXdlaWdodGVkIFBDQSBtYXRyaXggZGlyZWN0bHkgdG8gcGVyZm9ybSBpbnRlZ3JhdGlvbi4KU2luY2Ugd2UgYWxyZWFkeSBjYWxjdWxhdGVkIGEgYmF0Y2gtd2VpZ2h0ZWQgUENBIG1hdHJpeCAob3VyIGBtZXJnZWRfUENBYCByZWR1Y2VkIGRpbWVuc2lvbiksIHdlJ2xsIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseS4KICAtIFdlIHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IGBkb19wY2E9RkFMU0VgIHRvIHRlbGwgYGhhcm1vbnlgIHRoYXQgdGhlIGlucHV0IG1hdHJpeCB3ZSBwcm92aWRlZCBhbHJlYWR5IGlzIGEgUENBIG1hdHJpeC4KLSBTZWNvbmQsIHdlIG5lZWQgdG8gdGVsbCBgaGFybW9ueWAgYWJvdXQgdGhlIGNvdmFyaWF0ZXMgdG8gdXNlIC0gYHNhbXBsZWAgYW5kIGBwYXRpZW50YC4KVG8gZG8gdGhpcywgd2UgcHJvdmlkZSB0d28gYXJndW1lbnRzOgogIC0gYG1ldGFfZGF0YWAsIGEgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIGNvdmFyaWF0ZXMgYWNyb3NzIHNhbXBsZXMuCiAgV2UgY2FuIHNpbXBseSBzcGVjaWZ5IHRoZSBTQ0UgYGNvbERhdGFgIGhlcmUgc2luY2UgaXQgY29udGFpbnMgYHNhbXBsZWAgYW5kIGBwYXRpZW50YCBjb2x1bW5zLgogIC0gYHZhcnNfdXNlYCwgYSB2ZWN0b3Igb2Ygd2hpY2ggY29sdW1uIG5hbWVzIGluIGBtZXRhX2RhdGFgIHNob3VsZCBhY3R1YWxseSBiZSB1c2VkIGFzIGNvdmFyaWF0ZXMuCiAgT3RoZXIgY29sdW1ucyBpbiBgbWV0YV9kYXRhYCB3aGljaCBhcmUgbm90IGluIGB2YXJzX3VzZWAgYXJlIGlnbm9yZWQuCgpMZXQncyBnbyEKCmBgYHtyIHJ1biBoYXJtb255LCBsaXZlID0gVFJVRX0KIyBpbnRlZ3JhdGUgd2l0aCBoYXJtb255LCBzZXR0aW5nIHRoZSBhcmd1bWVudCBgZG9fcGNhID0gRkFMU0VgCiMgIHNpbmNlIHdlIGFyZSBwcm92aWRpbmcgYSBQQ0EgbWF0cml4IGRpcmVjdGx5Cmhhcm1vbnlfcGNhIDwtIGhhcm1vbnk6Okhhcm1vbnlNYXRyaXgoCiAgZGF0YV9tYXQgPSByZWR1Y2VkRGltKG1lcmdlZF9zY2UsICJtZXJnZWRfUENBIiksCiAgZG9fcGNhID0gRkFMU0UsCiAgbWV0YV9kYXRhID0gY29sRGF0YShtZXJnZWRfc2NlKSwKICB2YXJzX3VzZSA9IGMoInNhbXBsZSIsICJwYXRpZW50IikKKQpgYGAKClRoZSByZXN1bHQgaXMgYSBQQ0EgbWF0cml4LgpMZXQncyBwcmludCBhIHN1YnNldCBvZiB0aGlzIG1hdHJpeCB0byBzZWUgaXQ6CgpgYGB7ciBwcmludCBoYXJtb255IHJlc3VsdCwgbGl2ZSA9IFRSVUV9CiMgUHJpbnQgdGhlIGhhcm1vbnkgcmVzdWx0Cmhhcm1vbnlfcGNhWzE6NSwgMTo1XQpgYGAKCkFzIHdlIGRpZCB3aXRoIGBmYXN0TU5OYCByZXN1bHRzLCBsZXQncyBzdG9yZSB0aGlzIFBDQSBtYXRyaXggZGlyZWN0bHkgaW4gb3VyIGBtZXJnZWRfc2NlYCBvYmplY3Qgd2l0aCBhbiBpbmZvcm1hdGl2ZSBuYW1lIHRoYXQgd29uJ3Qgb3ZlcndyaXRlIGFueSBvZiB0aGUgZXhpc3RpbmcgUENBIG1hdHJpY2VzLgpXZSdsbCBhbHNvIGNhbGN1bGF0ZSBVTUFQIGZyb20gaXQuCgpgYGB7ciBzYXZlIGhhcm1vbnksIGxpdmUgPSBUUlVFfQojIFN0b3JlIFBDQSBhcyBgaGFybW9ueV9QQ0FgCnJlZHVjZWREaW0obWVyZ2VkX3NjZSwgImhhcm1vbnlfUENBIikgPC0gaGFybW9ueV9wY2EKCiMgQXMgYmVmb3JlLCBjYWxjdWxhdGUgVU1BUCBvbiB0aGlzIFBDQSBtYXRyaXggd2l0aCBhcHByb3ByaWF0ZSBuYW1lcwptZXJnZWRfc2NlIDwtIHNjYXRlcjo6cnVuVU1BUChtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9QQ0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSAiaGFybW9ueV9VTUFQIikKYGBgCgoKTGV0J3Mgc2VlIGhvdyB0aGUgYGhhcm1vbnlgIFVNQVAsIGNvbG9yZWQgYnkgc2FtcGxlLCBsb29rcyBjb21wYXJlZCB0byB0aGUgYGZhc3RNTk5gIFVNQVA6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBiYXRjaGVzfQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKG1lcmdlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImhhcm1vbnlfVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAic2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBuYW1lID0gInNhbXBsZSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkpICsKICBnZ3RpdGxlKCJVTUFQIGFmdGVyIGludGVncmF0aW9uIHdpdGggaGFybW9ueSIpCmBgYAoKSG93IGRvIHlvdSB0aGluayB0aGlzIGBoYXJtb255YCBVTUFQIGNvbXBhcmVzIHRvIHRoYXQgZnJvbSBgZmFzdE1OTmAgaW50ZWdyYXRpb24/CgpMZXQncyBzZWUgaG93IHRoaXMgVU1BUCBsb29rcyBjb2xvcmVkIGJ5IGNlbGwgdHlwZSwgYW5kIGZhY2V0ZWQgZm9yIHZpc2liaWxpdHk6CgpgYGB7ciBwbG90IGhhcm1vbnkgdW1hcCBjZWxsdHlwZXN9CnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obWVyZ2VkX3NjZSwKICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSAiaGFybW9ueV9VTUFQIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpZnkgdmFyaWFibGUgZm9yIGZhY2V0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gInNhbXBsZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIG5hbWUgPSAiQnJvYWQgY2VsbHR5cGUiLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMpKSkgKwogIGdndGl0bGUoIlVNQVAgYWZ0ZXIgaW50ZWdyYXRpb24gd2l0aCBoYXJtb255IikgKwogIGZhY2V0X3dyYXAodmFycyhzYW1wbGUpKQpgYGAKCldoYXQgZG8geW91IG5vdyBub3RpY2UgaW4gdGhpcyBmYWNldGVkIHZpZXcgdGhhdCB3YXNuJ3QgY2xlYXIgcHJldmlvdXNseT8KQXJlIHRoZXJlIG90aGVyIHBhdHRlcm5zIHlvdSBzZWUgdGhhdCBhcmUgc2ltaWxhciBvciBkaWZmZXJlbnQgZnJvbSB0aGUgYGZhc3RNTk5gIFVNQVA/CkhvdyBkbyB5b3UgdGhpbmsgYGZhc3RNTk5gIHZzLiBgaGFybW9ueWAgcGVyZm9ybWVkIGluIGludGVncmF0aW5nIHRoZXNlIHNhbXBsZXM/CgojIyMgRXhwb3J0CgpGaW5hbGx5LCB3ZSdsbCBleHBvcnQgdGhlIGZpbmFsIFNDRSBvYmplY3Qgd2l0aCBib3RoIGBmYXN0TU5OYCBhbmQgYGhhcm1vbnlgIGludGVncmF0aW9uIHRvIGEgZmlsZS4KU2luY2UgdGhpcyBvYmplY3QgaXMgdmVyeSBsYXJnZSAob3ZlciAxIEdCISksIHdlJ2xsIGV4cG9ydCBpdCB0byBhIGZpbGUgd2l0aCBzb21lIGNvbXByZXNzaW9uLCB3aGljaCwgaW4gdGhpcyBjYXNlLCB3aWxsIHJlZHVjZSB0aGUgZmluYWwgc2l6ZSB0byBhIHNtYWxsZXIgfjM2MCBNQi4KVGhpcyB3aWxsIHRha2UgYSBjb3VwbGUgbWludXRlcyB0byBzYXZlIHdoaWxlIGNvbXByZXNzaW9uIGlzIHBlcmZvcm1lZC4KCmBgYHtyIHNhdmUgaW50ZWdyYXRpb24sIGxpdmUgPSBUUlVFfQojIEV4cG9ydCB0byBSRFMgZmlsZSB3aXRoICJneiIgY29tcHJlc3Npb24KcmVhZHI6OndyaXRlX3JkcyhtZXJnZWRfc2NlLAogICAgICAgICAgICAgICAgIGludGVncmF0ZWRfc2NlX2ZpbGUsCiAgICAgICAgICAgICAgICAgY29tcHJlc3MgPSAiZ3oiKQpgYGAKCgojIyBQcmludCBzZXNzaW9uIGluZm8KCkFzIGFsd2F5cywgd2UnbGwgcHJpbnQgdGhlIHNlc3Npb24gaW5mbyB0byBiZSB0cmFuc3BhcmVudCBhYm91dCB3aGF0IHBhY2thZ2VzLCBhbmQgd2hpY2ggdmVyc2lvbnMsIHdlcmUgdXNlZCBkdXJpbmcgdGhpcyBSIHNlc3Npb24uCgpgYGB7ciBzZXNzaW9uaW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK</div> </div> diff --git a/scRNA-seq-advanced/03-differential_expression-live.Rmd b/scRNA-seq-advanced/03-differential_expression-live.Rmd index 485227ad..a34e3ad9 100644 --- a/scRNA-seq-advanced/03-differential_expression-live.Rmd +++ b/scRNA-seq-advanced/03-differential_expression-live.Rmd @@ -79,9 +79,7 @@ sample_metadata_file <- file.path(data_dir, # directory to store output deseq_dir <- file.path("analysis", "rms", "deseq") -if(!dir.exists(deseq_dir)){ - dir.create(deseq_dir, recursive = TRUE) -} +fs::dir_create(deseq_dir) # results file to output from DE analysis deseq_output_file <- file.path(deseq_dir, @@ -223,7 +221,7 @@ The samples which could be further classified have a mix of `Tumor_Mesoderm`, `T scater::plotReducedDim(integrated_sce, dimred = "fastmnn_UMAP", # color each point by cell type - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size= 0.5, point_alpha = 0.4) ``` @@ -267,6 +265,7 @@ ggplot(tumor_cells_df, aes(x = sample, fill = celltype_broad)) + y = "Proportion of cells", fill = "Cell type" ) + + scale_fill_brewer(palette = "Dark2") + theme_bw() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))+ # facet by diagnosis group @@ -694,7 +693,7 @@ scater::plotExpression(tumor_sce, # a vector of genes to plot features = genes_to_plot, x = "diagnosis_group", - colour_by = "diagnosis_group", + color_by = "diagnosis_group", other_fields = "celltype_broad", point_size = 0.1) + # each celltype is its own column @@ -703,7 +702,7 @@ scater::plotExpression(tumor_sce, rows = vars(Feature)) + # change the font size of the facet labels theme(strip.text = element_text(size = 7)) + - guides(colour = guide_legend( + guides(color = guide_legend( title = "Subtype", # update the legend title # change the size of the legend colors override.aes = list(size = 3, alpha = 1)) diff --git a/scRNA-seq-advanced/03-differential_expression.nb.html b/scRNA-seq-advanced/03-differential_expression.nb.html index 19ee419c..8e9c72a1 100644 --- a/scRNA-seq-advanced/03-differential_expression.nb.html +++ b/scRNA-seq-advanced/03-differential_expression.nb.html @@ -2979,7 +2979,7 @@ <h3>Directories and files</h3> <p>To begin, let’s set up our directories and files:</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgc2V0IHVwIGZpbGUgcGF0aHMgIiwiIyBkYXRhIGRpcmVjdG9yeSBmb3IgUk1TIGRhdGEiLCJkYXRhX2RpciA8LSBmaWxlLnBhdGgoXCJkYXRhXCIsIFwicm1zXCIpIiwiIiwiIyBpbnRlZ3JhdGVkIGZpbGUgY29udGFpbmluZyBzYW1wbGVzIHRvIHVzZSBmb3IgREUgYW5hbHlzaXMiLCJpbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImludGVncmF0ZWRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19hbGxfc2NlLnJkc1wiKSIsIiIsIiMgc2FtcGxlIG1ldGFkYXRhIHRvIHNldCB1cCBERSBhbmFseXNpcyIsInNhbXBsZV9tZXRhZGF0YV9maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19zYW1wbGVfbWV0YWRhdGEudHN2XCIpIiwiIiwiIyBkaXJlY3RvcnkgdG8gc3RvcmUgb3V0cHV0IiwiZGVzZXFfZGlyIDwtIGZpbGUucGF0aChcImFuYWx5c2lzXCIsIFwicm1zXCIsIFwiZGVzZXFcIikiLCJpZighZGlyLmV4aXN0cyhkZXNlcV9kaXIpKXtcbiAgZGlyLmNyZWF0ZShkZXNlcV9kaXIsIHJlY3Vyc2l2ZSA9IFRSVUUpXG59IiwiIiwiIyByZXN1bHRzIGZpbGUgdG8gb3V0cHV0IGZyb20gREUgYW5hbHlzaXMiLCJkZXNlcV9vdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgoZGVzZXFfZGlyLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19teW9ibGFzdF9kZXNlcV9yZXN1bHRzLnRzdlwiKSIsIiIsIiMgb3V0cHV0IGludGVncmF0ZWQgc2NlIG9iamVjdCIsIm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImludGVncmF0ZWRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX3N1YnNldF9zY2UucmRzXCIpIl19 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgc2V0IHVwIGZpbGUgcGF0aHMgIiwiIyBkYXRhIGRpcmVjdG9yeSBmb3IgUk1TIGRhdGEiLCJkYXRhX2RpciA8LSBmaWxlLnBhdGgoXCJkYXRhXCIsIFwicm1zXCIpIiwiIiwiIyBpbnRlZ3JhdGVkIGZpbGUgY29udGFpbmluZyBzYW1wbGVzIHRvIHVzZSBmb3IgREUgYW5hbHlzaXMiLCJpbnRlZ3JhdGVkX3NjZV9maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImludGVncmF0ZWRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19hbGxfc2NlLnJkc1wiKSIsIiIsIiMgc2FtcGxlIG1ldGFkYXRhIHRvIHNldCB1cCBERSBhbmFseXNpcyIsInNhbXBsZV9tZXRhZGF0YV9maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19zYW1wbGVfbWV0YWRhdGEudHN2XCIpIiwiIiwiIyBkaXJlY3RvcnkgdG8gc3RvcmUgb3V0cHV0IiwiZGVzZXFfZGlyIDwtIGZpbGUucGF0aChcImFuYWx5c2lzXCIsIFwicm1zXCIsIFwiZGVzZXFcIikiLCJmczo6ZGlyX2NyZWF0ZShkZXNlcV9kaXIpIiwiIiwiIyByZXN1bHRzIGZpbGUgdG8gb3V0cHV0IGZyb20gREUgYW5hbHlzaXMiLCJkZXNlcV9vdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgoZGVzZXFfZGlyLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJtc19teW9ibGFzdF9kZXNlcV9yZXN1bHRzLnRzdlwiKSIsIiIsIiMgb3V0cHV0IGludGVncmF0ZWQgc2NlIG9iamVjdCIsIm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImludGVncmF0ZWRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX3N1YnNldF9zY2UucmRzXCIpIl19 --> <pre class="r"><code># set up file paths # data directory for RMS data data_dir <- file.path("data", "rms") @@ -2996,9 +2996,7 @@ <h3>Directories and files</h3> # directory to store output deseq_dir <- file.path("analysis", "rms", "deseq") -if(!dir.exists(deseq_dir)){ - dir.create(deseq_dir, recursive = TRUE) -} +fs::dir_create(deseq_dir) # results file to output from DE analysis deseq_output_file <- file.path(deseq_dir, @@ -3232,11 +3230,11 @@ <h3>Plotting with annotations</h3> multiple libraries or samples.</strong></p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcywgc2VwYXJhdGluZyBieSBkaWFnbm9zaXMgZ3JvdXAiLCJzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSBcImRpYWdub3Npc19ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC4yKSAiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcywgc2VwYXJhdGluZyBieSBkaWFnbm9zaXMgZ3JvdXAiLCJzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLFxuICAgICAgICAgICAgICAgICAgICAgICBkaW1yZWQgPSBcImZhc3Rtbm5fVU1BUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9IFwiZGlhZ25vc2lzX2dyb3VwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpICJdfQ== --> <pre class="r"><code># UMAP of all samples, separating by diagnosis group scater::plotReducedDim(integrated_sce, dimred = "fastmnn_UMAP", - colour_by = "diagnosis_group", + color_by = "diagnosis_group", point_size= 0.5, point_alpha = 0.2) </code></pre> <!-- rnb-source-end --> @@ -3264,12 +3262,12 @@ <h3>Plotting with annotations</h3> <code>Tumor_Myocyte</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcyBsYWJlbGVkIGJ5IGNlbGwgdHlwZSIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgZWFjaCBwb2ludCBieSBjZWxsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gXCJjZWxsdHlwZV9icm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsIFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCkiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcyBsYWJlbGVkIGJ5IGNlbGwgdHlwZSIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgZWFjaCBwb2ludCBieSBjZWxsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBcImNlbGx0eXBlX2Jyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwgXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC40KSJdfQ== --> <pre class="r"><code># UMAP of all samples labeled by cell type scater::plotReducedDim(integrated_sce, dimred = "fastmnn_UMAP", # color each point by cell type - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size= 0.5, point_alpha = 0.4)</code></pre> <!-- rnb-source-end --> @@ -3298,13 +3296,13 @@ <h3>Plotting with annotations</h3> be in their own plot panel.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcyIsIiMgc2VwYXJhdGluZyBieSBkaWFnbm9zaXMgZ3JvdXAgYW5kIGxhYmVsaW5nIGNlbGwgdHlwZSIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgZWFjaCBwb2ludCBieSBjZWxsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gXCJjZWxsdHlwZV9icm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsIFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIyB0ZWxsIHNjYXRlciB0byB1c2UgZGlhZ25vc2lzX2dyb3VwIGZvciBwbG90dGluZ1xuICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSBcImRpYWdub3Npc19ncm91cFwiKSArXG4gICMgaW5jbHVkZSBlYWNoIGRpYWdub3NpcyBncm91cCBhcyBpdHMgb3duIGNvbHVtblxuICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRpYWdub3Npc19ncm91cCkpIl19 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgVU1BUCBvZiBhbGwgc2FtcGxlcyIsIiMgc2VwYXJhdGluZyBieSBkaWFnbm9zaXMgZ3JvdXAgYW5kIGxhYmVsaW5nIGNlbGwgdHlwZSIsInNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgZWFjaCBwb2ludCBieSBjZWxsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSBcImNlbGx0eXBlX2Jyb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwgXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC40LFxuICAgICAgICAgICAgICAgICAgICAgICAjIHRlbGwgc2NhdGVyIHRvIHVzZSBkaWFnbm9zaXNfZ3JvdXAgZm9yIHBsb3R0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9IFwiZGlhZ25vc2lzX2dyb3VwXCIpICtcbiAgIyBpbmNsdWRlIGVhY2ggZGlhZ25vc2lzIGdyb3VwIGFzIGl0cyBvd24gY29sdW1uXG4gIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkiXX0= --> <pre class="r"><code># UMAP of all samples # separating by diagnosis group and labeling cell type scater::plotReducedDim(integrated_sce, dimred = "fastmnn_UMAP", # color each point by cell type - colour_by = "celltype_broad", + color_by = "celltype_broad", point_size= 0.5, point_alpha = 0.4, # tell scater to use diagnosis_group for plotting @@ -3324,7 +3322,7 @@ <h3>Plotting with annotations</h3> first.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgZmlsdGVyIGNvbGRhdGEgdG8gb25seSBpbmNsdWRlIHR1bW9yIGNlbGxzIiwidHVtb3JfY2VsbHNfZGYgPC0gY29sZGF0YV9kZiB8PlxuICAjIGZpbmQgcm93cyB3aGVyZSB0aGUgY2VsbCB0eXBlIG5hbWUgY29udGFpbnMgdGhlIHN0cmluZyBcIlR1bW9yXCJcbiAgZHBseXI6OmZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNlbGx0eXBlX2Jyb2FkLCBcIlR1bW9yXCIpKSIsIiIsIiMgY3JlYXRlIGEgc3RhY2tlZCBiYXJwbG90IiwiZ2dwbG90KHR1bW9yX2NlbGxzX2RmLCBhZXMoeCA9IHNhbXBsZSwgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9IFwiZmlsbFwiLCBjb2xvciA9IFwiYmxhY2tcIiwgc2l6ZSA9IDAuMikgK1xuICAgIGxhYnMoXG4gICAgICB4ID0gXCJTYW1wbGVcIixcbiAgICAgIHkgPSBcIlByb3BvcnRpb24gb2YgY2VsbHNcIiwgXG4gICAgICBmaWxsID0gXCJDZWxsIHR5cGVcIlxuICAgICkgK1xuICB0aGVtZV9idygpICtcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUpKStcbiAgIyBmYWNldCBieSBkaWFnbm9zaXMgZ3JvdXAgXG4gIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSwgXG4gICAgICAgICAgICAgIyBvbmx5IHNob3cgbm9uLU5BIHZhbHVlcyBvbiB4LWF4aXNcbiAgICAgICAgICAgICBzY2FsZXMgPSBcImZyZWVfeFwiLFxuICAgICAgICAgICAgIHNwYWNlID0gXCJmcmVlX3hcIikiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgZmlsdGVyIGNvbGRhdGEgdG8gb25seSBpbmNsdWRlIHR1bW9yIGNlbGxzIiwidHVtb3JfY2VsbHNfZGYgPC0gY29sZGF0YV9kZiB8PlxuICAjIGZpbmQgcm93cyB3aGVyZSB0aGUgY2VsbCB0eXBlIG5hbWUgY29udGFpbnMgdGhlIHN0cmluZyBcIlR1bW9yXCJcbiAgZHBseXI6OmZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNlbGx0eXBlX2Jyb2FkLCBcIlR1bW9yXCIpKSIsIiIsIiMgY3JlYXRlIGEgc3RhY2tlZCBiYXJwbG90IiwiZ2dwbG90KHR1bW9yX2NlbGxzX2RmLCBhZXMoeCA9IHNhbXBsZSwgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKyBcbiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9IFwiZmlsbFwiLCBjb2xvciA9IFwiYmxhY2tcIiwgc2l6ZSA9IDAuMikgK1xuICAgIGxhYnMoXG4gICAgICB4ID0gXCJTYW1wbGVcIixcbiAgICAgIHkgPSBcIlByb3BvcnRpb24gb2YgY2VsbHNcIiwgXG4gICAgICBmaWxsID0gXCJDZWxsIHR5cGVcIlxuICAgICkgK1xuICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gXCJEYXJrMlwiKSArXG4gIHRoZW1lX2J3KCkgK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSkpK1xuICAjIGZhY2V0IGJ5IGRpYWdub3NpcyBncm91cCBcbiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkaWFnbm9zaXNfZ3JvdXApLCBcbiAgICAgICAgICAgICAjIG9ubHkgc2hvdyBub24tTkEgdmFsdWVzIG9uIHgtYXhpc1xuICAgICAgICAgICAgIHNjYWxlcyA9IFwiZnJlZV94XCIsXG4gICAgICAgICAgICAgc3BhY2UgPSBcImZyZWVfeFwiKSJdfQ== --> <pre class="r"><code># filter coldata to only include tumor cells tumor_cells_df <- coldata_df |> # find rows where the cell type name contains the string "Tumor" @@ -3338,6 +3336,7 @@ <h3>Plotting with annotations</h3> y = "Proportion of cells", fill = "Cell type" ) + + scale_fill_brewer(palette = "Dark2") + theme_bw() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))+ # facet by diagnosis group @@ -3354,7 +3353,7 @@ <h3>Plotting with annotations</h3> generated.</code></pre> <!-- rnb-warning-end --> <!-- rnb-plot-begin --> -<p><img role="img" src="data:image/png;base64,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icgDDzzw7rvvtmzZ8u2333766adFZNOmTVauDgAAAACA2snaAH/hwgURmThxYnBwcGFjeHi4iAwZMkSj0SgtQ4YMEZGrV69auToAAAAAAGonawP89evXReSBBx4obImNjb19+7aIPProo4WNAQEBInLt2jUrVwcAAACgBjAYDHv37h01atSDDz7o7+/v7e3duXPnESNGrF69uqCgwPrlG41GjUaj0WhWrVpVdiOgItY+hd7X1zc7OzsnJ6ew5dChQyKi0+l69uxZ2JidnS0irq6uVq4OAAAAgNqdOHHi1VdfPXv2bNHGqKioqKior7/+evny5R999NGTTz5pr/IAh2XtGfjmzZuLyJEjRwpblBvgH3nkEW9v78LG6OhoEbn//vutXB0AAAAAVduxY0fv3r2V9N6kSZOJEyd+9NFH8+fPHz16tJIXLl++/NRTTym35drXnDlzNBpNvXr17F0I8P9ZewY+JCTkl19++eyzzwYNGvTEE098++23+/fvF5GhQ4cW9jl79uzatWtFpHXr1lauDgAAAIB6HT58+LnnnjMYDJ6ensuWLXvllVcKH5slIvn5+StXrpw+fbrJZHr++eejo6MDAwPtWC3gaKw9Az958uQ6derk5OQMGjTIzc3t2WefFRE/P7+XXnpJRHJycgYOHNilS5ekpCSls/UVAwAAAFCj3NzcsWPHGgwGFxeX3bt3jxkzpmh6FxEXF5epU6fOnz9fRJKSkhYtWmSnSgEHZW2A9/Hx2bNnT4MGDUQkPz9fRFxcXFauXOnv76+0/Pe//1Xax48f36NHD6sLBgAAAKBKGzduvHz5soj8/e9/79u3r6Vub7/9tpIvwsLCzGZztZUHOD5rA7yI9OzZ87ffftu4ceOkSZPmz5//66+/jhgxonBqgwYNBg0atH379pUrV1q/LgAAAAAqtX79ehFxcnKaNWtWGd20Wq1yYW9CQsKJEyeKTc3MzFy0aFGPHj38/f29vLweeuihN954IyYmxralvvHGGxqN5oMPPhCR5ORk5dn1K1as+PHHH5XP27ZtK3XGLl26aDSawrd0ffbZZxqN5sEHH1SW884777Rp08bDw6NevXr9+vX7/PPPTSZTqcupnq8J1bH2HnhF/fr1X3755ZdffrlYu4+Pz61bt2yyCgAAAADqFR8ff/r0aRF55plnmjZtWnbnjz766MMPP5QS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fe6553x9fcud8auvvvrqq69KnbRmzZrAwEDrVwEAAACgppo9e/bs2bOLtjRt2vTatWvbtm0bPHiwvaqqalqt1mQybdu2bdCgQSWnZmZm7t+/X+lT/bXB2gC/d+/eVq1ajRkz5r333luxYkWvXr2aN29er149jUZTav9ifwDlSkxMnDt3bmJiooj4+vomJSXt27fv+PHj//znP+vXr1/2vLdu3arqVQAAAACAA0pPTz9y5EjTpk0re6F7mzZtbt++/d133+Xm5rq5uRWbunv37pycnL59+x46dMhmtTqYex66amDtJfShoaGhoaHr168XkdTU1L1793788cdz5sx5x4LKloGADgAAIABJREFULn/JkiX/j707j2vqyv8/fhLCoiyiLIIgaAFFi1ZGFLC16MPOt7Witooi+nUpastoUTtjaytVHG1rS8cZd4u2Vqlat1pRcak6Lh0LVlG7anFHURBFRdZAwu+P+5s88g0hLImQyOv5F5yc5Hzu4Rrzzr333Nzc3JCQkJSUlJSUlC+++CIgIOD+/fvSiIbl5OQIIf71r39traZdu3YmGQIAAABAM/fhhx/KZLLqlxWPHTtWJpOlpaVJv0rXZi9ZsiQ7O3v06NGurq4uLi6RkZFSh2vXrk2cODEoKMjBwSE4OHjDhg3VBzp37tyYMWOCgoIcHR179+49ZcoU6TCkxsaNG2Uy2YoVK06ePOnv7z9o0KCUlJT6bo61tfXw4cMLCwv3799f/VHp/PmRI0fqfW5eXl58fHxoaKiDg4Ofn9+ECRN+/fVXnT53796dNWtWjx49HB0dPT09IyIiduzY0YCNlXz11Vcvv/yym5tbQEDAuHHjfvrpp4YVVtPUGf9XMy1jA7xDPdXrxbOysi5duuTi4vLuu+9KJ7S7ubklJiba2NicPn367t27hp+ek5NjZWXVoUMHu2o0JwgYOQQAAAAA1N2lS5d69eolhEhMTBw0aFBaWtqQIUNWrFgREhKSm5s7efLkcePG/fLLL2PHjt21a5f2E1evXh0WFrZp06asrCw3N7fMzMxVq1Y988wz1Y+E5+XlRUZG5ufn29rauri4NKDI6OhoIcTmzZt12h89erR//35/f//g4ODqzzp+/HiPHj2WL19+5syZtm3b3rhxY/369T179tS+Zv727dvdu3dPSkq6cOGCp6enSqU6fvz48OHDdb7+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rCtXrrz55ptKpXL+/PmFhYVXrlwpKCgYPXr0nTt3JkyYoFQqtYdYtGhRq1atjhw5UlxcPHPmzAYUGRER4eHhsXv37uLiYu321NTUsrKy6OhomUym3d66dev+/fuXl5fv27dPu136CmDMmDH13YQlS5YMGDAgNzf31q1b9+/ff//996XGgwcP6i344sWL//jHP+zs7NLS0u7cuXP+/Pl79+4tWrRICPHxxx9rus2ePfv27duvvPLK7du3s7Ky7ty5s3btWiHEnDlzSktLhRBxcXGrV68WQrRs2XLNmjXLly9vwOw9ViYI8IsWLRo+fPgff/whhHB0dPzTn/706quvjhgxIiQkRPqi5dKlS8OHD9++fbvxYwEAAACA5fLz85s6darmV2mhOCcnpwULFmgapRXyrly5omlJTEysqKiYNGnSnDlz7OzshBCtWrXauHFjcHDw9evX16xZoz1EaWlpampqv379rKysGlakXC4fMWJESUmJzino0vnz0vF5HcOHDxdCfPvtt5qWmzdvnjhxwtnZeeDAgfXdBOnrg7Zt22omZ8qUKUKIuXPn6i34hx9+EELExMRoFt5TKBR//etfXVxcsrOzNecFZGRkCCESEhJat24ttbz22mtDhw7t2bPnjRs36jtLTcLYAH/+/PlZs2YJIdzc3BYvXpybm5uZmbljx46tW7eeOnUqLy9v6dKlbm5uQog33ngjJyfHBCUDAAAAgGXq2bOn9uHrNm3aCCGCgoJatGih06hSqTQtx44dE0JUP4c8Pj5eCKFzCnpYWNjTTz9tZJ1SSt+yZYum5eHDhwcOHAgMDOzWrVv1/q+88opcLk9LS9McS9+6dWtVVVVUVJStrW19N+GNN96QQr7Gu+++K4Q4deqU3gu0x48fX1VVJR1O1ygtLa2srBRaMyld075jx46qqipNt507d6anp3fq1KnGuTAnxgb4ZcuWqVQqW1vbPXv2TJ8+vWXLltqP2tnZxcfH796929bWtqCgQPvsBQAAAABobvTeNN7wneTLy8tzcnIUCkXnzp11HgoKChL/91i9EKJDhw7GVilEnz592rdvv3fvXs36c6mpqUqlUu/hdyGEu7v7c889V1hYeOTIEalFOn9+9OjRDdiE7t2763Rr3769m5ubSqW6du2agbJv3759+PDh5OTkv/71r8HBwQ8fPtR+NC4uTgixcOHC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53Q6V+zKzSg8cu7/uDfZZyuX75+ZB1ZX1ZW7eSqDqKmrVEpVVVWd9r7X0NCwx5rjy18WG+x1NTU1p73z1NbWWsvyfTnOscrC2tra08apqamprm9YmLnV/VMZxM5jxy8/h+88q6urFRt4wIsYegNfUlKilAoNDT3peFhYmFLKZpOuBnSOt72QT/HbREZGjrhq+H714+/+L3uKtj3DunfvftoPBQYGjhs3rlBtdvNIxhHcSfXsOehMH01OTrbZDu5XB904kZHEquRuyWf64KBBg3buDF7vznkMZty4cYGBgRoHGD169MHy8oMaJ9ArOGxE735n+uDgwYN37drlu4/8gWrcuHGnffpdKdWjR48jR474bhylkkePONM713bs2LHH4C6+HKfvkMvatm172g9FRUUNveoqX37Yt/Tpd+mll+qeAoC7GXoD72IymU464nqh5rm8ruwcb3tenyIuLu72228/9fhnn30WEBAQHBwsj9SrV69//OMfZxv8Yml6eba/v3/zX/s3iODgYI1xnE5nbW2tUsrPz69Fixa6xhCkp6dr/Oy1tbWu/y/OeifXYt68eRo/e11dnevJjaCgoFMfTwzF39//vCb08/Pz8/M7l0V/9913L2CuC3XixAmllMlkMuaV0v7rv/5L42dvun8a83/eadOmTZs2Tddnb2hocH2tb9GihZ+f4X4P59prr7322mt1fXa73e56mXpgYOCZfv6iUb9+/YzwDVVAQIDeH56eletR0YB3bwC/jeEejpuzWCyFhYWVlZVt2rRpftz1YqGoqKgLv+1v+BTx8fEPPvjgqcc///xzs9ncsqWhX/vd0NDg+noTGBho8FHdz+FwuDbw/v7+xDlVXV2d0+k0mUzEOZXdbndtkEJCQgz+TVJAQMB5Tejv7+/n52f8RXf9gIn752k1v38a/AdM7ldVVeXawAcFBRl8G+Z+J06ccG3gW7RoYcwfjWnkQd9QuX5yZ/CvTQDOnaH/Z3btn8vLT/6lwYqKCqWUxWK58NteyKcAAAAAAMBtDL2Bj4+PV0plZ2efdDwnJ0cpddJz5r/tthfyKQAAAAAAcBtDb+BHjRqllNq4cWPzK2fW19dv2bLFZDJdddVVF37bC/kUAAAAAAC4jaE38N26devSpYvVal2yZEnTVeXS0tJqamoGDx4cGxvbdOa333779ddf79u373xve+6f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33fffSkpKTExMTk5OTt37hw0aFBUVJTukd2HOIKKioonn3yysLCwe/fu11133ZAhQ5xOZ1FR0ZAhQ2655ZZLL73Ubrfn5+fv2LEjPz9/2LBhPvW6SuJo9/e//10p9cQTT2RkZHzzzTdOp7Nr164BAbwxqlLEEfGwLyCOjEd+AAbBBt7Lvffee/v37588efKsWbNGjx5tsVh++OEHq9WakpIyderUyMjI8PDw7t27h4WFbdmypaamZujQobpHdh/iCD766KNt27aNGjVqzpw53bp1S0hIuPLKKysqKn788cdRo0aNHDnyqquuGjp06KZNm/bu3RsbG9u5c2fdI7sPcbRz7VEfeuihMWPGHDx48J///OfatWtDQ0M7duzIN83EEfCwLyCOjEd+AAbBK3y8XG5ubmBg4MSJE11/HT16tOtH5ldffXXz08aMGePv75+fn69hRH2II9i7d6/JZJoyZUrz7/hvvfVWk8m0evVq11/bt28/Z84cpVTTER9BHOMIDw+fN2/eQw891NjY+Nprrz344IPffPNNVVWV7rkMgTin4mFfQBwZj/wADIINvJcrLi6OjIw0m82uv5pMptjYWKVUXFxc89P8/f2jo6OPHj2qYUR9iCPIz8+Pi4tr1apV84OtWrWKjo52vfugS9euXUNDQw8dOuT2AXUijtGMGjXq7bffnjRpktVqTU9Pv+OOOxYuXOh6klD3aPoRpzke9gXEkfHID8Ag+KU4LxcdHX3s2LHGxsamy6KWlpYqpUpKStq0adN0mtPptNlsMTExeqbUhDiCyMhIm8126psGVVdXBwYGNv3VZDKZTCZfu1oPcQwoKCjo1ltvHTdu3Pfff79q1aq1a9euXbvWZDJ17ty5Z8+ed911l+4BdSJOEx72BcSR8cgPwCB4fPFynTt3rq+vX7VqleuvmzdvLi4uVkqtXbu2+WkbNmyor69v3769hhH1IY6gU6dOJ06c2LBhQ/ODW7duramp6dixY9ORDRs2VFRUND/iC4hjWFFRUbfeeuv777//2GOP9erVy8/Pb//+/V9++aXuuQyBOIqHfRFxZDzyAzAInoH3cjfffPOGDRvS09O3bdtmNps3bdpksVgiIyM//fTTkJCQ5OTkgICAzMzMt99+WymVkpKie163Io7g+uuv37hx4xtvvFFVVTVkyBA/P7/t27e/8847SqmrrrpKKVVTU7N8+fKvv/7adbLmcd2LOAYXEBAwYsSIESNG1NTUbNu2LSsrS/dEBuLjcXjYFxBHxiM/AIPgfeC93w8//LB48WK73a6UMpvNzzzzTEhISGpqam1trVLKZPrPfWDMmDEPPPCA5lndjjiCZcuWLV++/KSDgwcPfvLJJ5VSBQUFDzzwgMlkuuWWWyZNmqRjQJ2Io5frrc4/+eSToKAg3bMYDnFkPOwLiCPjkR+AEbCB9wlFRUXbtm2rqqoaOnRou3btlFK7d+9+6623Dhw4YDKZ4uPjx48fP27cON1j6kEcQVZW1ooVK/Ly8hoaGuLj48eOHTthwgTXr/8VFxd/8803f/jDHxISEnSPqQdxNLrtttuUUu+++y571FMR56x42BcQR8YjPwDt2MD7tOrqaj8/v+DgYN2DGBFxmjQ2NjY0NLAZOC3iAF6Dh30BcZrjkR+ARlzEzqeVlJQUFhbqnsKgiNPE39//pG9TCgoK9u3bp2seQyGOAbEEAuIIeNgXEKc5HvkBaMQz8D5t+vTphw8f/uqrr3QPYkTEERBHQBztWAIBcQTEERBHRh8AbsMz8AAAAAAAeACegfdyc+fOFT66e/fuurq6Pn36NB157rnnLv5QRkEcAXEExNGOJRAQR0AcAXFk9AFgELwPvJfLzs52vR+MYMeOHe4ZxmiIIyCOgDjasQQC4giIIyCOjD4ADIJn4L3c3r17FyxYUFxc3LFjx5tuusnf37/5R9PT00tLS1NTU5uOJCUlovrsfgAAIABJREFUuX1GbYgjII6AONqxBALiCIgjII6MPgAMgg2896usrFy4cGFWVlbPnj1nzZoVGRnZ9CGuuUIcAXEExNGOJRAQR0AcAXFk9AFgBFzEzvuFhobOnTv3tttuy87OfuSRR3bu3Kl7IgMhjoA4AuJoxxIIiCMgjoA4MvoAMAI28D7BZDLdfPPNzz33nMPhmDt37qeffsorL5oQR0AcAXG0YwkExBEQR0AcGX0AaMcG3of07t170aJFl1566UcfffTcc89VVlbqnshAiCMgjoA42rEEAuIIiCMgjow+ADTid+B9TmNj44cffvjFF1/ExMTU1tZWVlbyK1tNiCMgjoA42rEEAuIIiCMgjow+ALTgGXif4+/vP2XKlCeeeKK6upqfGZ+EOALiCIijHUsgII6AOALiyOgDQAuegfddR48ezc3NVUoNHz5c9yyGQxwBcQTE0Y4lEBBHQBwBcWT0AeBObOABAAAAAPAAAboHgJscP3587dq1hYWFpaWlNpvNbrdHRUVZLJb4+Pjk5OTY2FjdA+pEHAFxBMTRjiUQEEdAHAFxZPQBoBfPwHu/4uLi9PT0rKwsh8Nx2hP8/PwGDRp0//33h4eHu3k27YgjII6AONqxBALiCIgjII6MPgCMgA28lysrK3v44YdtNpvZbB4wYEDv3r0jIiLCwsKcTmdlZWVFRUVOTs6WLVtqamoSEhLmz58fFBSke2T3IY6AOALiaMcSCIgjII6AODL6ADAINvBebsmSJd9//31iYuK8efPCwsJOe059fX1aWlpmZmZKSsrUqVPdPKFGxBEQR0Ac7VgCAXEExBEQR0YfAAbB28h5uS1btiilUlNTz/TFRillNptTU1NbtGixefNmN46mH3EExBEQRzuWQEAcAXEExJHRB4BBsIH3cmVlZREREdHR0fJpAQEBnTp1stls7pnKIIgjII6AONqxBALiCIgjII6MPgAMgg28lwsNDS0rKysvL5dPczgchw4dEn6o7JWIIyCOgDjasQQC4giIIyCOjD4ADIINvJfr16+fUmrRokX19fVnOsfhcCxZsqS6urpv375uHE0/4giIIyCOdiyBgDgC4giII6MPAIPgInZerqysbPbs2Var1WKxJCUluS6aGhoaajKZKisry8vLs7OzN27caLVaW7du/fLLL/vUG58QR0AcAXG0YwkExBEQR0AcGX0AGAQbeO9ntVrT0tL27dsnnNOlS5fZs2e3adPGbVMZBHEExBEQRzuWQEAcAXEExJHRB4ARsIH3Fbm5uWvWrCkqKiotLS0pKVFKWSyWqKio+Pj40aNHJyYm6h5QJ+IIiCMgjnYsgYA4AuIIiCOjDwC92MADAAAAAOABuIgdAAAAAAAeIED3AHCT48ePr127trCwsLS01Gaz2e32qKgoi8USHx+fnJwcGxure0CdiCMgjoA42rEEAuIIiCMgjow+APTiJfTer7i4OD09PSsry+FwnPYEPz+/QYMG3X///T54xVTiCIgjII52LIGAOALiCIgjow8AI2AD7+XKysoefvhhm81mNpsHDBjgeteTsLAwp9NZWVlZUVGRk5OzZcuWmpqahISE+fPnBwUF6R7ZfYgjII6AONqxBALiCIgjII6MPgAMgg28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7Jtvvmn6qYRwFfqsrKwJEyYUFRWdNLyfn9+LL744e/bs8w0CAADwu+MZeACAUkpdddVVSqnGxsaxY8e+9dZbVVVV537bxYsXu3bvCQkJaWlpK1euXLly5YsvvpiQkKCU+u67715//fVTb/Xkk09u2bJl48aNe/bsycjIyM3N7dGjh1LqxRdfTEpKMpvNv/zyy86dOzMzM7dv3x4fH6+UmjVrlusX9ZsrLy8fP3780aNHlyxZUlJScvz48by8vAceeEAptWHDhj//+c9nnd9qtY4aNcq1e7/pppveeuut5cuXP/LIIy1btnQ4HI8//vgrr7xy7jUAAAAuFicAAE5naWlp27Ztm746BAUFpaSkvP7667t27TrrbYcMGaKU6tq1a3l5efPjZWVl7du3V0pNmDCh+fHo6GjXZ1m/fn3z419++aXruNls3rNnT/MPNf0IYPfu3U0H33333aaBv/rqq5Omevrpp10f2rx5s+uI3W53HXnjjTean3nfffcppfz9/T/77LPmx/fs2dOlSxelVMuWLQ8fPnzWDgAAABcVz8ADAJRSKjIyMjMzMzk52fXX2trar7/++sEHH7zssssuueSSKVOmLF++vLa29tQbNjQ0HDhwICIi4p577gkLC2v+ofDwcNc/uH///lNvmJSUNHz48OZHBgwY4PrDxIkTExMTm3/o8ssvd/0hPz//1H9q+PDhrivkN/f444+7flf/2WefPeN/tlL79+93/SDgwQcfvOGGG5p/KDEx8Z133lFKVVdXp6enC/8IAACAG7CBBwD8R3x8/L/+9a/s7Ow5c+YMGjTIz+8/XyMOHz78/vvvT548uW3btk899VTT89gugYGBVqvVZrPNnDnz1H+zvLz8TJ+ub9++Jx2JiIg464ecp7t0y9SpU089GBwcfPvttyulfvrppzPNoJRatWqV62X5M2bMOPWjI0eO7Nmzp+LC+wAAwADYwAMA/o/u3bu/8MILmzdvLikpWbly5fTp0y+99FKTyaSUKi0tfeGFF8aOHeu62tyZ1NXV7d69+8svv5w2bdoXX3xxptOioqLO9CGLxXJeM3fr1u20x11P49fU1Bw9evRMt923b59Sqm3btu3atTvtCb1791ZK7dix47xGAgAA+N0F6B4AAGBQERER119//fXXX6+UqqioWLNmzbx583Jycn788cdXXnll7ty5zU+2Wq3vv//+unXrcnJyXL8u7s5RXb9pf6pOnTq5/pCXlxcXF3fac1wb+MLCQtcPKc6k6cr2AAAAurCBBwCoH3744eeff1ZKzZw5s/n7vTUJCwubOHHiiBEj+vTpU1hY+OqrrzbfwH/88cf33Xdf04XrLRZL165du3XrNnz48DVr1qxYseJiz3/qpeldml4pcKYTlFLCk/PNORwOu93uehc6AAAALXgJPQBArV+/PjU1NTU11fV09JlYLJY//vGPSqmysrKmt0zfsmXL7bffXlVV1b59+8WLF+fl5R0/fjwjI+ODDz646667IiMj3TD/wYMHT3u86eJ5rovJn5brWfr+/fuf9bqv7N4BAIBefC8CAPj/97ebNm060++Tu1RUVLj+4HA4XH94++23HQ6H2Wxev359hw4dTjq/rKzs9x72NLZu3XrSBe1dMjIylFLBwcFt2rQ5021d/705OTmNjY2nffUBAACAQfAMPABAjR071nXN+SeeeEL4Ze/y8nLXFd3btWvX9KbxBw4cUEp17dr11N273W5ft27dRZq5uUWLFjU2Np50MDc399NPP1VKDR06VPj99v79+yulamtrXSefpLq6um/fvp06dXrxxRd/15EBAADOGxt4AIBq3br1nXfeqZQ6cuTI2LFjT/uWaQUFBddff/2RI0eUUtOnT2/aErtegp6fn19ZWdn8fIfDcdddd7nOr66uvqjz5+XlPfzww8338EeOHLnllltcLxOQ3wd+woQJAwcOVEo99NBDe/bsaf4hp9P52GOP7dix4+DBg+PHj784swMAAJwrXkIPAFBKqZdffjkzM3Pnzp0///zz0KFDhw8f3r179y5dugQGBhYWFu7atWvVqlWuHfKIESOav2X6qFGj/va3v1VVVY0dO/aBgpkoAAACwElEQVTxxx/v0qWLzWbbsWPH66+/npub26pVq6qqqry8vLlz544fP/7yyy+/GMMHBwe/+eab27ZtmzBhQvv27X/++edly5a5fks/JSUlKSlJuK3JZFq0aNGwYcOKi4t79+59zz33DBo0KCYm5uDBgx9++OGmTZuUUo888kiPHj0uxuQAAADnjg08AEAppSIjI9euXfv8888vWbKkrq7u3//+97///e+TzgkLC3v44YdTU1PNZnPTwcmTJ3/xxReffPJJRkbGdddd13TcZDJNnz59ypQpSUlJ9fX1zz///K+//vr5559fjOFXrlw5efLkjRs3nvTagaFDh3700UdnvXlSUtL3338/ZcqUoqKiN954o/mHTCbTtGnTXn311d95YgAAgPPHBh4A8B8Wi2XhwoUzZsx48803d+3adeDAgby8vODg4E6dOnXs2LFfv37Tpk077VXlly9ffv3117/99tt79+4tKSmJj49PTk6+9957BwwYoJT64YcfFi1aVFFRcfXVV1/IeK1atYqOjm7VqtWpHxo+fHh2dvZLL7307bffFhYWtmzZslevXn/+85/vvPNO1+/2n9XYsWN37tz50ksvrVq1Kj8/3+l0JiQk9O7de8aMGb169bqQsQEAAH4vJqfTqXsGAAB+i/fee+/uu+9WSlVVVbVs2VL3OAAAABcXF7EDAAAAAMADsIEHAAAAAMADsIEHAAAAAMADsIEHAAAAAMADsIEHAAAAAMADcBV6AAAAAAA8AM/AAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAdjAAwAAAADgAf4fOB6Em4UZrbgAAAAASUVORK5CYII=" width="672" /></p> +<p><img role="img" src="data:image/png;base64,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p0+f3rZtm42rAwAAAACgerI1wP/rX/8Skbp16549e3bJkiVqY3h4uIg88MAD7777bpMmTd5+++2nn35aRNatW2fj6gAAAAAAqJ5sDfDnzp0TkbFjx4aGhuY17t27V0QGDBigKIraMmDAABG5fPmyjasDAAAAAKB6sjXAX716VUQeeOCBvJaYmJibN2+KyKOPPprXGBgYKCJXrlyxcXUAAAAAqgCTybRz585hw4Y9+OCDAQEBPj4+7dq1GzJkyPLly3Nzc21fvtlsVhRFUZRly5aV3AhoiK1Poffz88vIyMjMzMxr2b9/v4jo9fouXbrkNWZkZIiIm5ubjasDAAAAoHVHjx599dVXT58+nb8xMjIyMjLy66+/Xrx48UcfffTkk086qjzAadl6Br5Ro0YicvDgwbwW9Qb4Rx55xMfHJ68xKipKRO6//34bVwcAAABA07Zs2dKtWzc1vTdo0GDs2LEfffTR7Nmzhw8fruaFixcvPvXUU+ptuY41Y8YMRVFq1arl6EKA/2HrGfiwsLBffvnls88+69u37xNPPPHtt9/u3r1bRAYOHJjX5/Tp0ytXrhSRZs2a2bg6AAAAANp14MCB5557zmQyeXl5LVq06JVXXsl7bJaI5OTkLF26dPLkyRaL5fnnn4+KigoKCnJgtYCzsfUM/Pjx42vUqJGZmdm3b193d/dnn31WRPz9/V966SURyczM7NOnT/v27RMTE9XOtlcMAAAAQIuysrJGjhxpMplcXV23b98+YsSI/OldRFxdXSdOnDh79mwRSUxMnDdvnoMqBZyUrQHe19d3x44dderUEZGcnBwRcXV1Xbp0aUBAgNry3//+V20fPXp0586dbS4YAAAAgCatXbv24sWLIvL3v/+9R48exXV7++231XwRHh5utVorrTzA+dka4EWkS5cuv/3229q1a8eNGzd79uxff/11yJAheVPr1KnTt2/fzZs3L1261PZ1AQAAANCo1atXi4jBYJg2bVoJ3XQ6nXphb3x8/NGjRwtMTUtLmzdvXufOnQMCAry9vR966KE33ngjOjravqW+8cYbiqJ88MEHIpKUlKQ+u37JkiU//vij+nnTpk1Fzti+fXtFUfLe0vXZZ58pivLggw+qy3nnnXeaN2/u6elZq1atnj17fv755xaLpcjlVM7XhObYeg+8qnbt2i+//PLLL79coN3X1/fG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yHjYFxBHxiM/ACMIfuaZZ3TPgIvIarWmpaXV19d36dKldevWR44c2blzZ25ubkFBwYQJE+67777U1NT4+Pjc3NydO3cOHjw4NjZW98jeQxxBZWXlk08+WVRU1KNHj+uuu27o0KFut7u4uHjo0KG33HLLpZde6nA4CgoKduzYUVBQMHz48IB6XSVxtPvrX/+qlHriiScyMzO//fZbt9vdrVu3kBDeGFUp4oh42BcQR8YjPwCDYAPv59577739+/dPmTJl9uzZY8aMsVgsP/74o9VqTU1NnTZtWkxMTMuWLXv06BEVFbVly5ba2tphw4bpHtl7iCP46KOPtm3bNnr06Llz53bv3j0xMfHKK6+srKz85z//OXr06FGjRl111VXDhg3btGnT3r17W7Vq1aVLF90jew9xtPPsUR966KGxY8cePHjw73//+9q1ayMjIzt16sQ3zcQR8LAvII6MR34ABsErfPxcXl5eaGjopEmTPH8dM2aM50fmV199ddPTxo4dGxwcXFBQoGFEfYgj2Lt3r8lkmjp1atPv+G+99VaTybR69WrPXzt06DB37lylVOORAEEc42jZsuX8+fMfeughp9P52muvPfjgg99++211dbXuuQyBOKfiYV9AHBmP/AAMgg28nyspKYmJiTGbzZ6/mkymVq1aKaVat27d9LTg4OC4uLijR49qGFEf4ggKCgpat27dokWLpgdbtGgRFxfnefdBj27dukVGRh46dMjrA+pEHKMZPXr022+/PXnyZKvVmpGRcccddyxatMjzJKHu0fQjTlM87AuII+ORH4BB8Etxfi4uLu7YsWNOp7PxsqhlZWVKqdLS0rZt2zae5na7bTZbfHy8nik1IY4gJibGZrOd+qZBNTU1oaGhjX81mUwmkynQrtZDHAMKCwu79dZbx48f/8MPP6xatWrt2rVr1641mUxdunTp1avXXXfdpXtAnYjTiId9AXFkPPIDMAgeX/xcly5d7Hb7qlWrPH/dvHlzSUmJUmrt2rVNT9uwYYPdbu/QoYOGEfUhjqBz584nTpzYsGFD04Nbt26tra3t1KlT45ENGzZUVlY2PRIIiGNYsbGxt9566/vvv//YY4/17t07KCho//79X331le65DIE4iod9EXFkPPIDMAiegfdzN99884YNGzIyMrZt22Y2mzdt2mSxWGJiYj777LOIiIiUlJSQ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NDMzc+7cubGxsQ0NDVVVVUqp8ePHe94BZceOHXv37v38889ramq6des2ZMgQ3SN7D3EExBEQRzuWQEAcAXEExJHRB4BxmNxut+4ZcBE5nc5ly5atXLnS5XIppUwm08iRIx966KHg4GCl1I033ui5zkrPnj1nzZplsVg0j+tdxBEQR0Ac7VgCAXEExBEQR0YfAAbBBj4g1NfX5+fnV1ZWdujQoenvZaWlpbVv3z4pKWn06NFBQQH6+xTEERBHQBztWAIBcQTEERBHRh8A2rGBBwAAAADAB/AzQgAAAAAAfAAbeAAAAAAAfAAbeAAAAAAAfAAbeAAAAAAAfAAbeAAAAAAAfAAbeAAAAAAAfAAbeAAAAAAAfAAbeADA/1FeXv7cc89NmjSpd+/ezZs379ixY0pKyrRp03766Sfdo10op9NpMplMJtObb76pexYAAIDzZnK73bpnAAAYgtvtfu21155//vmysrLTnjB27NhFixb16NHDy4P9VpxOZ0hIiFLqjTfeuP/++3WPAwAAcH5CdA8AADCKRYsWzZw5UykVFBQ0adKkIUOGdOjQoaSk5MCBAytWrCguLl69evX48eO3b98eExOje1gAAICAwwYeAKCUUtnZ2WlpaUqpSy65ZNWqVSc9zb5gwYJnn332xRdfLCwsnDp16hdffKFpTAAAgMDF78ADAJRS6rXXXmtoaFBK/e1vfzv1RfLNmjVbsGBBamqqUurLL788cOCAhhEBAAACGxt4AIBSSm3atEkplZCQMGTIkDOd86c//cnzh40bN3ppLAAAAPx/2MADAJRSqry8XCnVsmVL4Zwrrrjitttuu+222+Lj40/96IYNGyZPntynT5+YmJjIyMgePXqkpqZ+9dVXLpfrpDPj4+NNJtN3333ndrvfeeedK664Ijo6OjIy8vLLL//ggw8851RWVj7xxBPdu3ePiIho27ZtSkrK3//+95P+nffee89kMvXu3Vspdfz48aeeeuqyyy6LiIiIj48fNWrUX/7yl1M/taC6uvqll1664oorLBZLZGRk375977vvvry8vHP/FwAAAC4qrkIPAFBKqYEDB27dujU4OHjTpk2DBg0635vfeeedjXvvk1xzzTVff/11cHBw45H4+Pjjx49/8cUXH3zwwVdffZWUlBQbG7tjx44TJ04opebOnTtt2rRRo0YVFBT07NkzPDx8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r5POiYqKevjhh9PS0sxmc+PBKVOmfPnll59++mlmZuZ1113XeNxkMs2YMWPq1KnJycl2u/3555//97///cUXX1yM4VeuXDllypSNGzee9NqBYcOGffTRR2e9eXJy8g8//DB16tTi4uI33nij6YdMJtP06dNfffXV33hiAACA88cGHgDwHxaLZdGiRTNnznzzzTd37dp14MCB/Pz88PDwzp07d+rUqX///tOnTz/tVeVXrFhx/fXXv/3223v37i0tLU1ISEhJSbn33nsHDhyolPrxxx8XL15cWVl59dVXX8h4LVq0iIuLa9GixakfGjFiRE5OzksvvfTdd98VFRU1b968d+/ef/zjH++8807P7/af1bhx43bu3PnSSy+tWrWqoKDA7XYnJib26dNn5syZvXv3vpCxAQAAfismt9utewYAAH6N99577+6771ZKVVdXN2/eXPc4AAAAFxcXsQMAAAAAwAewgQcAAAAAwAewgQcAAAAAwAewgQcAAAAAwAewgQcAAAAAwAdwFXoAAAAAAHwAz8ADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD2MADAAAAAOAD/h9D9Z3x86oUhwAAAABJRU5ErkJggg==" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -4066,14 +4065,14 @@ <h3>Exploring the identified differentially expressed genes</h3> interest on a single-cell level.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgZmlsdGVyIHRvIGp1c3QgbXlvYmxhc3QgY2VsbHMgYW5kIHJlbW92ZSBhbnkgTkEncyBiZWZvcmUgcGxvdHRpbmciLCJteW9ibGFzdF9jb21iaW5lZF9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgPT0gXCJUdW1vcl9NeW9ibGFzdFwiKV0iLCIiLCIjIHBsb3QgUFRQUlQgKEVOU0cwMDAwMDE5NjA5MCkgZXhwcmVzc2lvbiBpbiBBUk1TIHZzLiBFUk1TIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShteW9ibGFzdF9jb21iaW5lZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9IFwiRU5TRzAwMDAwMTk2MDkwXCIsICNQVFBSVFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC40LFxuICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSBcImRpYWdub3Npc19ncm91cFwiKSArXG4gIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgZmlsdGVyIHRvIGp1c3QgbXlvYmxhc3QgY2VsbHMgYW5kIHJlbW92ZSBhbnkgTkEncyBiZWZvcmUgcGxvdHRpbmciLCJteW9ibGFzdF9jb21iaW5lZF9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgPT0gXCJUdW1vcl9NeW9ibGFzdFwiKV0iLCIiLCIjIHBsb3QgUFRQUlQgKEVOU0cwMDAwMDE5NjA5MCkgZXhwcmVzc2lvbiBpbiBBUk1TIHZzLiBFUk1TIiwic2NhdGVyOjpwbG90UmVkdWNlZERpbShteW9ibGFzdF9jb21iaW5lZF9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9IFwiZmFzdG1ubl9VTUFQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gXCJFTlNHMDAwMDAxOTYwOTBcIiwgI1BUUFJUXG4gICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjQsXG4gICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9IFwiZGlhZ25vc2lzX2dyb3VwXCIpICtcbiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkaWFnbm9zaXNfZ3JvdXApKSJdfQ== --> <pre class="r"><code># filter to just myoblast cells and remove any NA's before plotting myoblast_combined_sce <- rms_sce[, which(rms_sce$celltype_broad == "Tumor_Myoblast")] # plot PTPRT (ENSG00000196090) expression in ARMS vs. ERMS scater::plotReducedDim(myoblast_combined_sce, dimred = "fastmnn_UMAP", - colour_by = "ENSG00000196090", #PTPRT + color_by = "ENSG00000196090", #PTPRT point_size= 0.5, point_alpha = 0.4, other_fields = "diagnosis_group") + @@ -4120,7 +4119,7 @@ <h3>Exploring the identified differentially expressed genes</h3> previously.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGljayBhIGNvdXBsZSBnZW5lcyB0byBsb29rIGF0ICIsImdlbmVzX3RvX3Bsb3QgPC0gYyhcIkVOU0cwMDAwMDE5NjA5MFwiLCAjUFRQUlRcbiAgICAgICAgICAgICAgICAgICBcIkVOU0cwMDAwMDE0ODkzNVwiKSAjR0FTMiIsIiIsIiMgY3JlYXRlIGEgdmlvbGluIHBsb3QgIiwic2NhdGVyOjpwbG90RXhwcmVzc2lvbih0dW1vcl9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICMgYSB2ZWN0b3Igb2YgZ2VuZXMgdG8gcGxvdFxuICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGdlbmVzX3RvX3Bsb3QsIFxuICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJkaWFnbm9zaXNfZ3JvdXBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9IFwiZGlhZ25vc2lzX2dyb3VwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9IFwiY2VsbHR5cGVfYnJvYWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuMSkgK1xuICAjIGVhY2ggY2VsbHR5cGUgaXMgaXRzIG93biBjb2x1bW5cbiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhjZWxsdHlwZV9icm9hZCksXG4gICAgICAgICAgICAgIyBlYWNoIGZlYXR1cmUgKGdlbmUpIGlzIGl0cyBvd24gcm93XG4gICAgICAgICAgICAgcm93cyA9IHZhcnMoRmVhdHVyZSkpICsgXG4gICMgY2hhbmdlIHRoZSBmb250IHNpemUgb2YgdGhlIGZhY2V0IGxhYmVsc1xuICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyBcbiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChcbiAgICB0aXRsZSA9IFwiU3VidHlwZVwiLCAjIHVwZGF0ZSB0aGUgbGVnZW5kIHRpdGxlXG4gICAgIyBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBjb2xvcnNcbiAgICBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAzLCBhbHBoYSA9IDEpKVxuICAgICkiXX0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgcGljayBhIGNvdXBsZSBnZW5lcyB0byBsb29rIGF0ICIsImdlbmVzX3RvX3Bsb3QgPC0gYyhcIkVOU0cwMDAwMDE5NjA5MFwiLCAjUFRQUlRcbiAgICAgICAgICAgICAgICAgICBcIkVOU0cwMDAwMDE0ODkzNVwiKSAjR0FTMiIsIiIsIiMgY3JlYXRlIGEgdmlvbGluIHBsb3QgIiwic2NhdGVyOjpwbG90RXhwcmVzc2lvbih0dW1vcl9zY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICMgYSB2ZWN0b3Igb2YgZ2VuZXMgdG8gcGxvdFxuICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGdlbmVzX3RvX3Bsb3QsIFxuICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJkaWFnbm9zaXNfZ3JvdXBcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gXCJkaWFnbm9zaXNfZ3JvdXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gXCJjZWxsdHlwZV9icm9hZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMC4xKSArXG4gICMgZWFjaCBjZWxsdHlwZSBpcyBpdHMgb3duIGNvbHVtblxuICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGNlbGx0eXBlX2Jyb2FkKSxcbiAgICAgICAgICAgICAjIGVhY2ggZmVhdHVyZSAoZ2VuZSkgaXMgaXRzIG93biByb3dcbiAgICAgICAgICAgICByb3dzID0gdmFycyhGZWF0dXJlKSkgKyBcbiAgIyBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiB0aGUgZmFjZXQgbGFiZWxzXG4gIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArIFxuICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQoXG4gICAgdGl0bGUgPSBcIlN1YnR5cGVcIiwgIyB1cGRhdGUgdGhlIGxlZ2VuZCB0aXRsZVxuICAgICMgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgY29sb3JzXG4gICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSlcbiAgICApIl19 --> <pre class="r"><code># pick a couple genes to look at genes_to_plot <- c("ENSG00000196090", #PTPRT "ENSG00000148935") #GAS2 @@ -4130,7 +4129,7 @@ <h3>Exploring the identified differentially expressed genes</h3> # a vector of genes to plot features = genes_to_plot, x = "diagnosis_group", - colour_by = "diagnosis_group", + color_by = "diagnosis_group", other_fields = "celltype_broad", point_size = 0.1) + # each celltype is its own column @@ -4139,7 +4138,7 @@ <h3>Exploring the identified differentially expressed genes</h3> rows = vars(Feature)) + # change the font size of the facet labels theme(strip.text = element_text(size = 7)) + - guides(colour = guide_legend( + guides(color = guide_legend( title = "Subtype", # update the legend title # change the size of the legend colors override.aes = list(size = 3, alpha = 1)) @@ -4172,7 +4171,7 @@ <h2>Print session info</h2> <!-- rnb-source-begin eyJkYXRhIjoic2Vzc2lvbkluZm8oKSJ9 --> <pre class="r"><code>sessionInfo()</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gQmlvY1Npbmd1bGFyXzEuMjAuMCAgICAgICAgIERFU2VxMl8xLjQ0LjAgICAgICAgICAgICAgIFxuIFszXSBTaW5nbGVDZWxsRXhwZXJpbWVudF8xLjI2LjAgU3VtbWFyaXplZEV4cGVyaW1lbnRfMS4zNC4wXG4gWzVdIEJpb2Jhc2VfMi42NC4wICAgICAgICAgICAgICBHZW5vbWljUmFuZ2VzXzEuNTYuMCAgICAgICBcbiBbN10gR2Vub21lSW5mb0RiXzEuNDAuMCAgICAgICAgIElSYW5nZXNfMi4zOC4wICAgICAgICAgICAgIFxuIFs5XSBTNFZlY3RvcnNfMC40Mi4wICAgICAgICAgICAgQmlvY0dlbmVyaWNzXzAuNTAuMCAgICAgICAgXG5bMTFdIE1hdHJpeEdlbmVyaWNzXzEuMTYuMCAgICAgICBtYXRyaXhTdGF0c18xLjMuMCAgICAgICAgICBcblsxM10gZ2dwbG90Ml8zLjUuMSAgICAgICAgICAgICAgIG9wdHBhcnNlXzEuNy41ICAgICAgICAgICAgIFxuXG5sb2FkZWQgdmlhIGEgbmFtZXNwYWNlIChhbmQgbm90IGF0dGFjaGVkKTpcbiBbMV0gZ3JpZEV4dHJhXzIuMyAgICAgICAgICAgICBybGFuZ18xLjEuMyAgICAgICAgICAgICAgXG4gWzNdIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICAgc2NhdGVyXzEuMzIuMCAgICAgICAgICAgIFxuIFs1XSBjb21waWxlcl80LjQuMSAgICAgICAgICAgIGZsZXhtaXhfMi4zLTE5ICAgICAgICAgICBcbiBbN10gRGVsYXllZE1hdHJpeFN0YXRzXzEuMjYuMCB2Y3Ryc18wLjYuNSAgICAgICAgICAgICAgXG4gWzldIHN0cmluZ3JfMS41LjEgICAgICAgICAgICAgcGtnY29uZmlnXzIuMC4zICAgICAgICAgIFxuWzExXSBjcmF5b25fMS41LjIgICAgICAgICAgICAgIGZhc3RtYXBfMS4xLjEgICAgICAgICAgICBcblsxM10gWFZlY3Rvcl8wLjQ0LjAgICAgICAgICAgICBzY3V0dGxlXzEuMTQuMCAgICAgICAgICAgXG5bMTVdIGxhYmVsaW5nXzAuNC4zICAgICAgICAgICAgdXRmOF8xLjIuNCAgICAgICAgICAgICAgIFxuWzE3XSBybWFya2Rvd25fMi4yNiAgICAgICAgICAgIHR6ZGJfMC40LjAgICAgICAgICAgICAgICBcblsxOV0gVUNTQy51dGlsc18xLjAuMCAgICAgICAgICBnZ2JlZXN3YXJtXzAuNy4yICAgICAgICAgXG5bMjFdIGJpdF80LjAuNSAgICAgICAgICAgICAgICAgeGZ1bl8wLjQzICAgICAgICAgICAgICAgIFxuWzIzXSBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgICBcblsyNV0gY2FjaGVtXzEuMC44ICAgICAgICAgICAgICBiZWFjaG1hdF8yLjIwLjAgICAgICAgICAgXG5bMjddIGpzb25saXRlXzEuOC44ICAgICAgICAgICAgaGlnaHJfMC4xMCAgICAgICAgICAgICAgIFxuWzI5XSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICBcblszMV0gaXJsYmFfMi4zLjUuMSAgICAgICAgICAgICBwYXJhbGxlbF80LjQuMSAgICAgICAgICAgXG5bMzNdIFI2XzIuNS4xICAgICAgICAgICAgICAgICAgYnNsaWJfMC43LjAgICAgICAgICAgICAgIFxuWzM1XSBzdHJpbmdpXzEuOC4zICAgICAgICAgICAgIG51bURlcml2XzIwMTYuOC0xLjEgICAgICBcblszN10ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG5bMzldIGtuaXRyXzEuNDYgICAgICAgICAgICAgICAgcmVhZHJfMi4xLjUgICAgICAgICAgICAgIFxuWzQxXSBNYXRyaXhfMS43LTAgICAgICAgICAgICAgIHNwbGluZXNfNC40LjEgICAgICAgICAgICBcbls0M10gbm5ldF83LjMtMTkgICAgICAgICAgICAgICB0aWR5c2VsZWN0XzEuMi4xICAgICAgICAgXG5bNDVdIGFiaW5kXzEuNC01ICAgICAgICAgICAgICAgeWFtbF8yLjMuOCAgICAgICAgICAgICAgIFxuWzQ3XSB2aXJpZGlzXzAuNi41ICAgICAgICAgICAgIGNvZGV0b29sc18wLjItMjAgICAgICAgICBcbls0OV0gcGx5cl8xLjguOSAgICAgICAgICAgICAgICBsYXR0aWNlXzAuMjItNiAgICAgICAgICAgXG5bNTFdIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICAgd2l0aHJfMy4wLjAgICAgICAgICAgICAgIFxuWzUzXSBjb2RhXzAuMTktNC4xICAgICAgICAgICAgIGV2YWx1YXRlXzAuMjMgICAgICAgICAgICBcbls1NV0gZ2V0b3B0XzEuMjAuNCAgICAgICAgICAgICBwaWxsYXJfMS45LjAgICAgICAgICAgICAgXG5bNTddIGdlbmVyaWNzXzAuMS4zICAgICAgICAgICAgdnJvb21fMS42LjUgICAgICAgICAgICAgIFxuWzU5XSBlbWRib29rXzEuMy4xMyAgICAgICAgICAgIGhtc18xLjEuMyAgICAgICAgICAgICAgICBcbls2MV0gc3BhcnNlTWF0cml4U3RhdHNfMS4xNi4wICBtdW5zZWxsXzAuNS4xICAgICAgICAgICAgXG5bNjNdIHNjYWxlc18xLjMuMCAgICAgICAgICAgICAgbWlRQ18xLjEyLjAgICAgICAgICAgICAgIFxuWzY1XSBnbHVlXzEuNy4wICAgICAgICAgICAgICAgIGFwZWdsbV8xLjI2LjAgICAgICAgICAgICBcbls2N10gdG9vbHNfNC40LjEgICAgICAgICAgICAgICBCaW9jTmVpZ2hib3JzXzEuMjIuMCAgICAgXG5bNjldIFNjYWxlZE1hdHJpeF8xLjEyLjAgICAgICAgbG9jZml0XzEuNS05LjkgICAgICAgICAgIFxuWzcxXSBmb3JjYXRzXzEuMC4wICAgICAgICAgICAgIG12dG5vcm1fMS4yLTQgICAgICAgICAgICBcbls3M10gY293cGxvdF8xLjEuMyAgICAgICAgICAgICBncmlkXzQuNC4xICAgICAgICAgICAgICAgXG5bNzVdIGJibWxlXzEuMC4yNS4xICAgICAgICAgICAgYmRzbWF0cml4XzEuMy03ICAgICAgICAgIFxuWzc3XSBjb2xvcnNwYWNlXzIuMS0wICAgICAgICAgIEdlbm9tZUluZm9EYkRhdGFfMS4yLjEyICBcbls3OV0gYmVlc3dhcm1fMC40LjAgICAgICAgICAgICB2aXBvcl8wLjQuNyAgICAgICAgICAgICAgXG5bODFdIGNsaV8zLjYuMiAgICAgICAgICAgICAgICAgcnN2ZF8xLjAuNSAgICAgICAgICAgICAgIFxuWzgzXSBmYW5zaV8xLjAuNiAgICAgICAgICAgICAgIFM0QXJyYXlzXzEuNC4wICAgICAgICAgICBcbls4NV0gdmlyaWRpc0xpdGVfMC40LjIgICAgICAgICBkcGx5cl8xLjEuNCAgICAgICAgICAgICAgXG5bODddIGd0YWJsZV8wLjMuNSAgICAgICAgICAgICAgRW5oYW5jZWRWb2xjYW5vXzEuMjIuMCAgIFxuWzg5XSBzYXNzXzAuNC45ICAgICAgICAgICAgICAgIGRpZ2VzdF8wLjYuMzUgICAgICAgICAgICBcbls5MV0gU3BhcnNlQXJyYXlfMS40LjAgICAgICAgICBnZ3JlcGVsXzAuOS41ICAgICAgICAgICAgXG5bOTNdIGZhcnZlcl8yLjEuMSAgICAgICAgICAgICAgaHRtbHRvb2xzXzAuNS44LjEgICAgICAgIFxuWzk1XSBsaWZlY3ljbGVfMS4wLjQgICAgICAgICAgIGh0dHJfMS40LjcgICAgICAgICAgICAgICBcbls5N10gTUFTU183LjMtNjAuMiAgICAgICAgICAgICBiaXQ2NF80LjAuNSAgICAgICAgICAgICAgXG4ifQ== --> +<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gQmlvY1Npbmd1bGFyXzEuMjAuMCAgICAgICAgIERFU2VxMl8xLjQ0LjAgICAgICAgICAgICAgIFxuIFszXSBTaW5nbGVDZWxsRXhwZXJpbWVudF8xLjI2LjAgU3VtbWFyaXplZEV4cGVyaW1lbnRfMS4zNC4wXG4gWzVdIEJpb2Jhc2VfMi42NC4wICAgICAgICAgICAgICBHZW5vbWljUmFuZ2VzXzEuNTYuMCAgICAgICBcbiBbN10gR2Vub21lSW5mb0RiXzEuNDAuMCAgICAgICAgIElSYW5nZXNfMi4zOC4wICAgICAgICAgICAgIFxuIFs5XSBTNFZlY3RvcnNfMC40Mi4wICAgICAgICAgICAgQmlvY0dlbmVyaWNzXzAuNTAuMCAgICAgICAgXG5bMTFdIE1hdHJpeEdlbmVyaWNzXzEuMTYuMCAgICAgICBtYXRyaXhTdGF0c18xLjMuMCAgICAgICAgICBcblsxM10gZ2dwbG90Ml8zLjUuMSAgICAgICAgICAgICAgIG9wdHBhcnNlXzEuNy41ICAgICAgICAgICAgIFxuXG5sb2FkZWQgdmlhIGEgbmFtZXNwYWNlIChhbmQgbm90IGF0dGFjaGVkKTpcbiAgWzFdIGdyaWRFeHRyYV8yLjMgICAgICAgICAgICAgcmxhbmdfMS4xLjMgICAgICAgICAgICAgIFxuICBbM10gbWFncml0dHJfMi4wLjMgICAgICAgICAgICBzY2F0ZXJfMS4zMi4wICAgICAgICAgICAgXG4gIFs1XSBjb21waWxlcl80LjQuMSAgICAgICAgICAgIGZsZXhtaXhfMi4zLTE5ICAgICAgICAgICBcbiAgWzddIERlbGF5ZWRNYXRyaXhTdGF0c18xLjI2LjAgdmN0cnNfMC42LjUgICAgICAgICAgICAgIFxuICBbOV0gc3RyaW5ncl8xLjUuMSAgICAgICAgICAgICBwa2djb25maWdfMi4wLjMgICAgICAgICAgXG4gWzExXSBjcmF5b25fMS41LjIgICAgICAgICAgICAgIGZhc3RtYXBfMS4xLjEgICAgICAgICAgICBcbiBbMTNdIFhWZWN0b3JfMC40NC4wICAgICAgICAgICAgc2N1dHRsZV8xLjE0LjAgICAgICAgICAgIFxuIFsxNV0gbGFiZWxpbmdfMC40LjMgICAgICAgICAgICB1dGY4XzEuMi40ICAgICAgICAgICAgICAgXG4gWzE3XSBybWFya2Rvd25fMi4yNiAgICAgICAgICAgIHR6ZGJfMC40LjAgICAgICAgICAgICAgICBcbiBbMTldIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICAgZ2diZWVzd2FybV8wLjcuMiAgICAgICAgIFxuIFsyMV0gYml0XzQuMC41ICAgICAgICAgICAgICAgICB4ZnVuXzAuNDMgICAgICAgICAgICAgICAgXG4gWzIzXSBtb2RlbHRvb2xzXzAuMi0yMyAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgICBcbiBbMjVdIGNhY2hlbV8xLjAuOCAgICAgICAgICAgICAgYmVhY2htYXRfMi4yMC4wICAgICAgICAgIFxuIFsyN10ganNvbmxpdGVfMS44LjggICAgICAgICAgICBoaWdocl8wLjEwICAgICAgICAgICAgICAgXG4gWzI5XSBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgIEJpb2NQYXJhbGxlbF8xLjM4LjAgICAgICBcbiBbMzFdIGlybGJhXzIuMy41LjEgICAgICAgICAgICAgcGFyYWxsZWxfNC40LjEgICAgICAgICAgIFxuIFszM10gUjZfMi41LjEgICAgICAgICAgICAgICAgICBSQ29sb3JCcmV3ZXJfMS4xLTMgICAgICAgXG4gWzM1XSBic2xpYl8wLjcuMCAgICAgICAgICAgICAgIHN0cmluZ2lfMS44LjMgICAgICAgICAgICBcbiBbMzddIG51bURlcml2XzIwMTYuOC0xLjEgICAgICAganF1ZXJ5bGliXzAuMS40ICAgICAgICAgIFxuIFszOV0gUmNwcF8xLjAuMTIgICAgICAgICAgICAgICBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgXG4gWzQxXSByZWFkcl8yLjEuNSAgICAgICAgICAgICAgIE1hdHJpeF8xLjctMCAgICAgICAgICAgICBcbiBbNDNdIHNwbGluZXNfNC40LjEgICAgICAgICAgICAgbm5ldF83LjMtMTkgICAgICAgICAgICAgIFxuIFs0NV0gdGlkeXNlbGVjdF8xLjIuMSAgICAgICAgICBhYmluZF8xLjQtNSAgICAgICAgICAgICAgXG4gWzQ3XSB5YW1sXzIuMy44ICAgICAgICAgICAgICAgIHZpcmlkaXNfMC42LjUgICAgICAgICAgICBcbiBbNDldIGNvZGV0b29sc18wLjItMjAgICAgICAgICAgcGx5cl8xLjguOSAgICAgICAgICAgICAgIFxuIFs1MV0gbGF0dGljZV8wLjIyLTYgICAgICAgICAgICB0aWJibGVfMy4yLjEgICAgICAgICAgICAgXG4gWzUzXSB3aXRocl8zLjAuMCAgICAgICAgICAgICAgIGNvZGFfMC4xOS00LjEgICAgICAgICAgICBcbiBbNTVdIGV2YWx1YXRlXzAuMjMgICAgICAgICAgICAgZ2V0b3B0XzEuMjAuNCAgICAgICAgICAgIFxuIFs1N10gcGlsbGFyXzEuOS4wICAgICAgICAgICAgICBnZW5lcmljc18wLjEuMyAgICAgICAgICAgXG4gWzU5XSB2cm9vbV8xLjYuNSAgICAgICAgICAgICAgIGVtZGJvb2tfMS4zLjEzICAgICAgICAgICBcbiBbNjFdIGhtc18xLjEuMyAgICAgICAgICAgICAgICAgc3BhcnNlTWF0cml4U3RhdHNfMS4xNi4wIFxuIFs2M10gbXVuc2VsbF8wLjUuMSAgICAgICAgICAgICBzY2FsZXNfMS4zLjAgICAgICAgICAgICAgXG4gWzY1XSBtaVFDXzEuMTIuMCAgICAgICAgICAgICAgIGdsdWVfMS43LjAgICAgICAgICAgICAgICBcbiBbNjddIGFwZWdsbV8xLjI2LjAgICAgICAgICAgICAgdG9vbHNfNC40LjEgICAgICAgICAgICAgIFxuIFs2OV0gQmlvY05laWdoYm9yc18xLjIyLjAgICAgICBTY2FsZWRNYXRyaXhfMS4xMi4wICAgICAgXG4gWzcxXSBsb2NmaXRfMS41LTkuOSAgICAgICAgICAgIGZvcmNhdHNfMS4wLjAgICAgICAgICAgICBcbiBbNzNdIG12dG5vcm1fMS4yLTQgICAgICAgICAgICAgZnNfMS42LjQgICAgICAgICAgICAgICAgIFxuIFs3NV0gY293cGxvdF8xLjEuMyAgICAgICAgICAgICBncmlkXzQuNC4xICAgICAgICAgICAgICAgXG4gWzc3XSBiYm1sZV8xLjAuMjUuMSAgICAgICAgICAgIGJkc21hdHJpeF8xLjMtNyAgICAgICAgICBcbiBbNzldIGNvbG9yc3BhY2VfMi4xLTAgICAgICAgICAgR2Vub21lSW5mb0RiRGF0YV8xLjIuMTIgIFxuIFs4MV0gYmVlc3dhcm1fMC40LjAgICAgICAgICAgICB2aXBvcl8wLjQuNyAgICAgICAgICAgICAgXG4gWzgzXSBjbGlfMy42LjIgICAgICAgICAgICAgICAgIHJzdmRfMS4wLjUgICAgICAgICAgICAgICBcbiBbODVdIGZhbnNpXzEuMC42ICAgICAgICAgICAgICAgUzRBcnJheXNfMS40LjAgICAgICAgICAgIFxuIFs4N10gdmlyaWRpc0xpdGVfMC40LjIgICAgICAgICBkcGx5cl8xLjEuNCAgICAgICAgICAgICAgXG4gWzg5XSBndGFibGVfMC4zLjUgICAgICAgICAgICAgIEVuaGFuY2VkVm9sY2Fub18xLjIyLjAgICBcbiBbOTFdIHNhc3NfMC40LjkgICAgICAgICAgICAgICAgZGlnZXN0XzAuNi4zNSAgICAgICAgICAgIFxuIFs5M10gU3BhcnNlQXJyYXlfMS40LjAgICAgICAgICBnZ3JlcGVsXzAuOS41ICAgICAgICAgICAgXG4gWzk1XSBmYXJ2ZXJfMi4xLjEgICAgICAgICAgICAgIGh0bWx0b29sc18wLjUuOC4xICAgICAgICBcbiBbOTddIGxpZmVjeWNsZV8xLjAuNCAgICAgICAgICAgaHR0cl8xLjQuNyAgICAgICAgICAgICAgIFxuIFs5OV0gTUFTU183LjMtNjAuMiAgICAgICAgICAgICBiaXQ2NF80LjAuNSAgICAgICAgICAgICAgXG4ifQ== --> <pre><code>R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.4 LTS @@ -4206,62 +4205,63 @@ <h2>Print session info</h2> [13] ggplot2_3.5.1 optparse_1.7.5 loaded via a namespace (and not attached): - [1] gridExtra_2.3 rlang_1.1.3 - [3] magrittr_2.0.3 scater_1.32.0 - [5] compiler_4.4.1 flexmix_2.3-19 - [7] DelayedMatrixStats_1.26.0 vctrs_0.6.5 - [9] stringr_1.5.1 pkgconfig_2.0.3 -[11] crayon_1.5.2 fastmap_1.1.1 -[13] XVector_0.44.0 scuttle_1.14.0 -[15] labeling_0.4.3 utf8_1.2.4 -[17] rmarkdown_2.26 tzdb_0.4.0 -[19] UCSC.utils_1.0.0 ggbeeswarm_0.7.2 -[21] bit_4.0.5 xfun_0.43 -[23] modeltools_0.2-23 zlibbioc_1.50.0 -[25] cachem_1.0.8 beachmat_2.20.0 -[27] jsonlite_1.8.8 highr_0.10 -[29] DelayedArray_0.30.0 BiocParallel_1.38.0 -[31] irlba_2.3.5.1 parallel_4.4.1 -[33] R6_2.5.1 bslib_0.7.0 -[35] stringi_1.8.3 numDeriv_2016.8-1.1 -[37] jquerylib_0.1.4 Rcpp_1.0.12 -[39] knitr_1.46 readr_2.1.5 -[41] Matrix_1.7-0 splines_4.4.1 -[43] nnet_7.3-19 tidyselect_1.2.1 -[45] abind_1.4-5 yaml_2.3.8 -[47] viridis_0.6.5 codetools_0.2-20 -[49] plyr_1.8.9 lattice_0.22-6 -[51] tibble_3.2.1 withr_3.0.0 -[53] coda_0.19-4.1 evaluate_0.23 -[55] getopt_1.20.4 pillar_1.9.0 -[57] generics_0.1.3 vroom_1.6.5 -[59] emdbook_1.3.13 hms_1.1.3 -[61] sparseMatrixStats_1.16.0 munsell_0.5.1 -[63] scales_1.3.0 miQC_1.12.0 -[65] glue_1.7.0 apeglm_1.26.0 -[67] tools_4.4.1 BiocNeighbors_1.22.0 -[69] ScaledMatrix_1.12.0 locfit_1.5-9.9 -[71] forcats_1.0.0 mvtnorm_1.2-4 -[73] cowplot_1.1.3 grid_4.4.1 -[75] bbmle_1.0.25.1 bdsmatrix_1.3-7 -[77] colorspace_2.1-0 GenomeInfoDbData_1.2.12 -[79] beeswarm_0.4.0 vipor_0.4.7 -[81] cli_3.6.2 rsvd_1.0.5 -[83] fansi_1.0.6 S4Arrays_1.4.0 -[85] viridisLite_0.4.2 dplyr_1.1.4 -[87] gtable_0.3.5 EnhancedVolcano_1.22.0 -[89] sass_0.4.9 digest_0.6.35 -[91] SparseArray_1.4.0 ggrepel_0.9.5 -[93] farver_2.1.1 htmltools_0.5.8.1 -[95] lifecycle_1.0.4 httr_1.4.7 -[97] MASS_7.3-60.2 bit64_4.0.5 </code></pre> + [1] gridExtra_2.3 rlang_1.1.3 + [3] magrittr_2.0.3 scater_1.32.0 + [5] compiler_4.4.1 flexmix_2.3-19 + [7] DelayedMatrixStats_1.26.0 vctrs_0.6.5 + [9] stringr_1.5.1 pkgconfig_2.0.3 + [11] crayon_1.5.2 fastmap_1.1.1 + [13] XVector_0.44.0 scuttle_1.14.0 + [15] labeling_0.4.3 utf8_1.2.4 + [17] rmarkdown_2.26 tzdb_0.4.0 + [19] UCSC.utils_1.0.0 ggbeeswarm_0.7.2 + [21] bit_4.0.5 xfun_0.43 + [23] modeltools_0.2-23 zlibbioc_1.50.0 + [25] cachem_1.0.8 beachmat_2.20.0 + [27] jsonlite_1.8.8 highr_0.10 + [29] DelayedArray_0.30.0 BiocParallel_1.38.0 + [31] irlba_2.3.5.1 parallel_4.4.1 + [33] R6_2.5.1 RColorBrewer_1.1-3 + [35] bslib_0.7.0 stringi_1.8.3 + [37] numDeriv_2016.8-1.1 jquerylib_0.1.4 + [39] Rcpp_1.0.12 knitr_1.46 + [41] readr_2.1.5 Matrix_1.7-0 + [43] splines_4.4.1 nnet_7.3-19 + [45] tidyselect_1.2.1 abind_1.4-5 + [47] yaml_2.3.8 viridis_0.6.5 + [49] codetools_0.2-20 plyr_1.8.9 + [51] lattice_0.22-6 tibble_3.2.1 + [53] withr_3.0.0 coda_0.19-4.1 + [55] evaluate_0.23 getopt_1.20.4 + [57] pillar_1.9.0 generics_0.1.3 + [59] vroom_1.6.5 emdbook_1.3.13 + [61] hms_1.1.3 sparseMatrixStats_1.16.0 + [63] munsell_0.5.1 scales_1.3.0 + [65] miQC_1.12.0 glue_1.7.0 + [67] apeglm_1.26.0 tools_4.4.1 + [69] BiocNeighbors_1.22.0 ScaledMatrix_1.12.0 + [71] locfit_1.5-9.9 forcats_1.0.0 + [73] mvtnorm_1.2-4 fs_1.6.4 + [75] cowplot_1.1.3 grid_4.4.1 + [77] bbmle_1.0.25.1 bdsmatrix_1.3-7 + [79] colorspace_2.1-0 GenomeInfoDbData_1.2.12 + [81] beeswarm_0.4.0 vipor_0.4.7 + [83] cli_3.6.2 rsvd_1.0.5 + [85] fansi_1.0.6 S4Arrays_1.4.0 + [87] viridisLite_0.4.2 dplyr_1.1.4 + [89] gtable_0.3.5 EnhancedVolcano_1.22.0 + [91] sass_0.4.9 digest_0.6.35 + [93] SparseArray_1.4.0 ggrepel_0.9.5 + [95] farver_2.1.1 htmltools_0.5.8.1 + [97] lifecycle_1.0.4 httr_1.4.7 + [99] MASS_7.3-60.2 bit64_4.0.5 </code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <!-- rnb-text-end --> </div> -<div id="rmd-source-code">LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgZm9yIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6ICJEYXRhIExhYiBmb3IgQUxTRiIKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIE9iamVjdGl2ZXMgCgpUaGlzIG5vdGVib29rIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvOgoKLSBVc2UgcHNldWRvLWJ1bGtpbmcgdG8gcHJlcGFyZSBzY1JOQS1zZXEgbGlicmFyaWVzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgotIFBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCB0aGUgYERFU2VxMmAgcGFja2FnZQotIFVzZSBgZ2dwbG90MmAgYW5kIGBFbmhhbmNlZFZvbGNhbm9gIHRvIHZpc3VhbGl6ZSBnZW5lIGV4cHJlc3Npb24gY2hhbmdlcyBhY3Jvc3MgY2VsbCB0eXBlcyBhbmQgc2FtcGxlcwoKLS0tCgpKdXN0IGxpa2UgYnVsayBSTkEtc2VxLCBpdCBpcyBsaWtlbHkgdGhhdCBvbmUgb2YgdGhlIGdvYWxzIHdoZW4gcGVyZm9ybWluZyBzY1JOQS1zZXEgd2lsbCBiZSB0byBjb21wYXJlIHRoZSBnZW5lIGV4cHJlc3Npb24gb2YgbXVsdGlwbGUgc2FtcGxlcyB0byBlYWNoIG90aGVyLgpVbmxpa2UgYnVsayBSTkEtc2VxIGFuYWx5c2lzLCBzY1JOQS1zZXEgYW5hbHlzaXMgYWxsb3dzIHVzIHRvIGlkZW50aWZ5IGFuZCBhbm5vdGF0ZSBjZWxsIHR5cGVzIG9yIHN1YnBvcHVsYXRpb25zIG9mIGNlbGxzIHByZXNlbnQgaW4gZWFjaCBvZiBvdXIgc2FtcGxlcy4KVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBhY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiBjZWxsIHR5cGUgY29tcG9zaXRpb24gYWNyb3NzIHNhbXBsZXMgYW5kIHNwZWNpZmljYWxseSBmb2N1cyBvbiBjZWxsIHR5cGVzIG9yIHBvcHVsYXRpb25zIG9mIGludGVyZXN0IHdoZW4gcGVyZm9ybWluZyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiAoREUpIGFuYWx5c2lzLgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHdvcmsgd2l0aCBtdWx0aXBsZSBzYW1wbGVzIHRvIGlkZW50aWZ5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBhY3Jvc3MgY2VsbCB0eXBlcyBvZiBpbnRlcmVzdCB1c2luZyB0aGUgW2BERVNlcTJgXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvMy4xNi9iaW9jL2h0bWwvREVTZXEyLmh0bWwpIHBhY2thZ2UuIAoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbl0oZGlhZ3JhbXMvcm9hZG1hcF9kaWZmZXJlbnRpYWxfZXhwcmVzc2lvbi5wbmcpCgpXZSB3aWxsIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCBzYW1wbGVzIGZyb20gdGhlIFtgU0NQQ1AwMDAwMDVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMDUpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBEeWVyIGFuZCBDaGVuIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhpcyBwYXJ0aWN1bGFyIGRhdGFzZXQgY29udGFpbnMgMTAgZGlmZmVyZW50IHNhbXBsZXMgdGhhdCBoYXZlIGJlZW4gaW50ZWdyYXRlZCB1c2luZyBgZmFzdE1OTmAsIGZvbGxvd2luZyB0aGUgc2FtZSBwcm9jZWR1cmUgd2Ugb3V0bGluZWQgaW4gYDAzLWRhdGFzZXRfaW50ZWdyYXRpb24uUm1kYC4KVGhlc2UgMTAgc2FtcGxlcyByZXByZXNlbnQgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiByaGFiZG9teW9zYXJjb21hIChSTVMpOiBlbWJyeW9uYWwgcmhhYmRvbXlvc2FyY29tYSAoRVJNUykgYW5kIGFsdmVvbGFyIHJoYWJkb215b3NhcmNvbWEgKEFSTVMpLgpUaGVzZSB0d28gc3VidHlwZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBgUEFYMy9QQVg3LUZPWE8xYCBmdXNpb24gZ2VuZSwgd2hpY2ggaXMgcHJlc2VudCBvbmx5IGluIEFSTVMgcGF0aWVudHMuCkFkZGl0aW9uYWxseSwgY2VsbHMgZm91bmQgaW4gQVJNUyB0dW1vcnMgdGVuZCB0byBoYXZlIGFuIGluY3JlYXNlZCBtdXRhdGlvbmFsIGJ1cmRlbiB3aXRoIGNlbGxzIGluIGEgbW9yZSBkaWZmZXJlbnRpYXRlZCBzdGF0ZSBjb21wYXJlZCB0byBFUk1TIHR1bW9yIGNlbGxzIChbU2hlcm4gX2V0IGFsLl8gMjAxNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNTgvMjE1OS04MjkwLkNELTEzLTA2MzkpOyBbU3Rld2FydCBfZXQgYWwuXyAyMDE4XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmNjZWxsLjIwMTguMDcuMDEyKSkuClJNUyB0dW1vcnMsIHJlZ2FyZGxlc3Mgb2Ygc3VidHlwZSwgYXJlIG1hZGUgdXAgb2YgY2VsbHMgdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBkZXZlbG9wbWVudCBvZiBza2VsZXRhbCBtdXNjbGU6IG1lc29kZXJtLCBteW9ibGFzdHMsIGFuZCBteW9jeXRlcyAoW1NlYmlyZSBhbmQgTWFsb25lIDIwMDNdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTM2L2pjcC41Ni42LjQxMikpLgpbUGF0ZWwgX2V0IGFsLl8gKDIwMjIpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykgdGVzdGVkIHRoZSBoeXBvdGhlc2lzIHRoYXQgY2VsbCB0eXBlcyBoYXZlIGRpc3RpbmN0IGdlbmUgZXhwcmVzc2lvbiBwYXR0ZXJucyBpbiBBUk1TIHZzLiBFUk1TIHNhbXBsZXMuCkhlcmUgd2Ugd2lsbCBsb29rIGF0IGEgc3Vic2V0IG9mIHRoZSBzYW1wbGVzIHRoZXkgc2VxdWVuY2VkIGFuZCBpZGVudGlmeSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gdHVtb3IgY2VsbHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMuCgojIyBTZXQgdXAKCmBgYHtyIHNldHVwLCBtZXNzYWdlPUZBTFNFfQojIHNldCBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMjAyMikKCiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAjIHBsb3R0aW5nIGZ1bmN0aW9ucwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAKCiMgcGFja2FnZSB1c2VkIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcwpsaWJyYXJ5KERFU2VxMikKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIGZpbGVzCgpXZSB3aWxsIHN0YXJ0IGJ5IHJlYWRpbmcgaW4gYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggdGhlIHVuY29ycmVjdGVkIChtZXJnZWQgYnV0IG5vdCBpbnRlZ3JhdGVkKSBhbmQgY29ycmVjdGVkIChpbnRlZ3JhdGVkKSBnZW5lIGV4cHJlc3Npb24gZGF0YSBmb3IgYWxsIDEwIHNhbXBsZXMuCgpQcmlvciB0byBpbnRlZ3JhdGlvbiwgYWxsIDEwIHNhbXBsZXMgd2VudCB0aHJvdWdoIHRoZSBzYW1lIGZpbHRlcmluZywgbm9ybWFsaXphdGlvbiwgYW5kIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4KVGhlc2UgMTAgc2FtcGxlcyB3ZXJlIHRoZW4gbWVyZ2VkIGludG8gb25lIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0IGZvbGxvd2luZyB0aGUgc2FtZSBzdGVwcyBvdXRsaW5lZCBpbiBgMDMtZGF0YXNldF9pbnRlZ3JhdGlvbi5SbWRgLgpUaGUgbWVyZ2VkIG9iamVjdCB3YXMgdGhlbiBpbnRlZ3JhdGVkIHdpdGggYGZhc3RNTk5gIHRvIG9idGFpbiBhIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gYXNzYXkgYW5kIGNvcnJlY3RlZCByZWR1Y2VkIGRpbWVuc2lvbmFsaXR5IHJlc3VsdHMuClRoZSBmaW5hbCBTQ0Ugb2JqZWN0IHdhcyBzdG9yZWQgaW4gYGRhdGEvcm1zL2ludGVncmF0ZWQvcm1zX2FsbF9zY2UucmRzYC4KCldlIGFsc28gaGF2ZSBwcm92aWRlZCBhIG1ldGFkYXRhIGZpbGUsIGBkYXRhL3Jtcy9hbm5vdGF0aW9ucy9ybXNfc2FtcGxlX21ldGFkYXRhLnRzdmAsIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gZnJvbSBlYWNoIHNhbXBsZSwgc3VjaCBhcyBkaWFnbm9zaXMsIHNleCwgYWdlLCBldGMuCkVhY2ggcm93IGluIHRoaXMgZmlsZSBjb3JyZXNwb25kcyB0byBhIHNhbXBsZSBmb3VuZCBpbiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgoKVG8gYmVnaW4sIGxldCdzIHNldCB1cCBvdXIgZGlyZWN0b3JpZXMgYW5kIGZpbGVzOgoKYGBge3IgZmlsZXBhdGhzfQojIHNldCB1cCBmaWxlIHBhdGhzIAojIGRhdGEgZGlyZWN0b3J5IGZvciBSTVMgZGF0YQpkYXRhX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAicm1zIikKCiMgaW50ZWdyYXRlZCBmaWxlIGNvbnRhaW5pbmcgc2FtcGxlcyB0byB1c2UgZm9yIERFIGFuYWx5c2lzCmludGVncmF0ZWRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVncmF0ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19hbGxfc2NlLnJkcyIpCgojIHNhbXBsZSBtZXRhZGF0YSB0byBzZXQgdXAgREUgYW5hbHlzaXMKc2FtcGxlX21ldGFkYXRhX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm5vdGF0aW9ucyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19zYW1wbGVfbWV0YWRhdGEudHN2IikKCiMgZGlyZWN0b3J5IHRvIHN0b3JlIG91dHB1dApkZXNlcV9kaXIgPC0gZmlsZS5wYXRoKCJhbmFseXNpcyIsICJybXMiLCAiZGVzZXEiKQppZighZGlyLmV4aXN0cyhkZXNlcV9kaXIpKXsKICBkaXIuY3JlYXRlKGRlc2VxX2RpciwgcmVjdXJzaXZlID0gVFJVRSkKfQoKIyByZXN1bHRzIGZpbGUgdG8gb3V0cHV0IGZyb20gREUgYW5hbHlzaXMKZGVzZXFfb3V0cHV0X2ZpbGUgPC0gZmlsZS5wYXRoKGRlc2VxX2RpciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm1zX215b2JsYXN0X2Rlc2VxX3Jlc3VsdHMudHN2IikKCiMgb3V0cHV0IGludGVncmF0ZWQgc2NlIG9iamVjdApvdXRwdXRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdyYXRlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfc3Vic2V0X3NjZS5yZHMiKQpgYGAKCldlIGNhbiBnbyBhaGVhZCBhbmQgcmVhZCBpbiB0aGUgU0NFIG9iamVjdCBhbmQgdGhlIG1ldGFkYXRhIGZpbGUuCgpgYGB7ciByZWFkIGZpbGVzLCBsaXZlPVRSVUV9CiMgcmVhZCBpbiB0aGUgU0NFIG9iamVjdCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW50ZWdyYXRlZAppbnRlZ3JhdGVkX3NjZSA8LSByZWFkcjo6cmVhZF9yZHMoaW50ZWdyYXRlZF9zY2VfZmlsZSkKCiMgcmVhZCBpbiBzYW1wbGUgbWV0YWRhdGEgZmlsZSAKc2FtcGxlX21ldGFkYXRhIDwtIHJlYWRyOjpyZWFkX3RzdihzYW1wbGVfbWV0YWRhdGFfZmlsZSkKYGBgCgojIyBEYXRhc2V0IGV4cGxvcmF0aW9uCgpCZWZvcmUgd2UgZGl2ZSBpbnRvIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLCBsZXQncyBleHBsb3JlIG91ciBpbnRlZ3JhdGVkIFNDRSBvYmplY3QgYW5kIHRoZSBkYXRhc2V0IGEgbGl0dGxlIG1vcmUuCgpXZSdsbCBzdGFydCBieSBsb29raW5nIGF0IHdoYXQncyBpbnNpZGUgdGhlIG9iamVjdC4KSGVyZSB3ZSBzaG91bGQgaGF2ZSBib3RoIHRoZSBvcmlnaW5hbCAodW5jb3JyZWN0ZWQpIGRhdGEgYW5kIHRoZSBpbnRlZ3JhdGVkIChjb3JyZWN0ZWQpIGRhdGEgZm9yIGJvdGggdGhlIGdlbmUgZXhwcmVzc2lvbiBhbmQgdGhlIHJlZHVjZWQgZGltZW5zaW9uYWxpdHkgcmVzdWx0cy4KSG93IGFyZSB0aG9zZSBzdG9yZWQgaW4gb3VyIG9iamVjdD8KCmBgYHtyIHByaW50IHNjZSwgbGl2ZT1UUlVFfQojIHByaW50IG91dCBlbnRpcmUgb2JqZWN0CmludGVncmF0ZWRfc2NlCmBgYAoKCmBgYHtyIHByaW50IGFzc2F5IG5hbWVzLCBsaXZlPVRSVUV9CiMgbG9vayBhdCB0aGUgYXNzYXkgbmFtZXMgaW4gb3VyIG9iamVjdAphc3NheU5hbWVzKGludGVncmF0ZWRfc2NlKQpgYGAKCldoZW4gd2UgbG9vayBhdCB0aGUgYXNzYXkgbmFtZXMgd2Ugc2hvdWxkIHNlZSB0aGF0IHRoZXJlIGFyZSAzIG1hdHJpY2VzLCBgY291bnRzYCwgYGxvZ2NvdW50c2AsIGFuZCBgZmFzdG1ubl9jb3JyZWN0ZWRgLiAKVGhlIGBjb3VudHNgIGFuZCBgbG9nY291bnRzYCBhc3NheXMgY29ycmVzcG9uZCB0byB0aGUgdW5jb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEgdGhhdCBoYXMgYmVlbiBtZXJnZWQgYnV0IE5PVCBpbnRlZ3JhdGVkLgpUaGUgYGZhc3Rtbm5fY29ycmVjdGVkYCBkYXRhIGNvbnRhaW5zIHRoZSBjb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIGRhdGEgb2J0YWluZWQgZnJvbSBpbnRlZ3JhdGlvbi4gCkZvciB0aGlzIGV4ZXJjaXNlIHdlIHdpbGwgbm90IGJlIHVzaW5nIHRoZSBgZmFzdG1ubl9jb3JyZWN0ZWRgIGRhdGEgKG1vcmUgb24gd2h5IG5vdCBvbmNlIHdlIGdldCB0byBzZXR0aW5nIHVwIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiksIGJ1dCB3ZSBuZWVkIHRvIGJlIGF3YXJlIHRoYXQgaXQgaXMgcHJlc2VudCBhbmQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG91ciB1bmNvcnJlY3RlZCBkYXRhLiAKCgpgYGB7ciBwcmludCByZWR1Y2VkRGltIG5hbWVzLCBsaXZlPVRSVUV9CiMgbG9vayBhdCB0aGUgbmFtZXMgb2YgdGhlIGRpbWVuc2lvbiByZWR1Y3Rpb25zCnJlZHVjZWREaW1OYW1lcyhpbnRlZ3JhdGVkX3NjZSkKYGBgCgpJbiB0aGUgYHJlZHVjZWREaW1gIHNsb3RzIHlvdSBzaG91bGQgc2VlIGBQQ0FgIGFuZCBgVU1BUGAsIHdoaWNoIHdlcmUgYm90aCBjYWxjdWxhdGVkIGZyb20gdGhlIGNvbWJpbmVkIGRhdGEgX2JlZm9yZV8gaW50ZWdyYXRpb24uCllvdSBzaG91bGQgYWxzbyBzZWUgYGZhc3Rtbm5fUENBYCBhbmQgYGZhc3Rtbm5fVU1BUGAgcmVkdWNlZCBkaW1lbnNpb25zLCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBpbnRlZ3JhdGVkIHJlc3VsdHMuCgojIyMgQ2VsbCB0eXBlIGFubm90YXRpb25zCgpKdXN0IGxpa2UgaW4gdGhlIGludGVncmF0aW9uIG5vdGVib29rLCB0aGlzIGRhdGFzZXQgYWxzbyBjb250YWlucyB0aGUgY2VsbCB0eXBlIGFubm90YXRpb25zIGZvdW5kIGluIHRoZSBgY2VsbHR5cGVfZmluZWAgYW5kIGBjZWxsdHlwZV9icm9hZGAgY29sdW1ucyBvZiB0aGUgYGNvbERhdGFgLgpUaGVzZSBjZWxsIHR5cGVzIHdlcmUgb3JpZ2luYWxseSBhc3NpZ25lZCBpbiBbUGF0ZWwgX2V0IGFsLl8gKDIwMjIpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykuCldlIHdpbGwgdXNlIHRoZXNlIGNlbGwgdHlwZSBhc3NpZ25tZW50cyB0byBzZXQgdXAgdGhlIERFIGFuYWx5c2lzIGJlbG93LCBidXQgdGhleSBhcmUgbm90IHJlcXVpcmVkIGZvciBERSBhbmFseXNpcyBpdHNlbGYuCkl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBERSBhbmFseXNpcyBjYW4gYmUgYXBwbGllZCB0byBhbnkgc3VicG9wdWxhdGlvbiBvZiBpbnRlcmVzdCB0aGF0IGlzIHNoYXJlZCBhY3Jvc3Mgc2FtcGxlcyBiZXNpZGVzIGp1c3QgY2VsbCB0eXBlcy4KCkJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGJlIGRvaW5nIERFIGFuYWx5c2lzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzLCBsZXQncyBzdGFydCBieSBsYWJlbGluZyBjZWxscyBpbiB0aGUgaW50ZWdyYXRlZCBkYXRhc2V0IGJhc2VkIG9uIHRoZWlyIFJNUyBzdWJ0eXBlLgpUbyBkbyB0aGlzIHdlIHdpbGwgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHN1YnR5cGUgaXMgcHJlc2VudCBpbiB0aGUgYGNvbERhdGFgIG9mIHRoZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QuCklmIGl0J3Mgbm90IHRoZXJlLCB3ZSBuZWVkIHRvIGFkZCBpdCBpbi4KCmBgYHtyIGNvbGRhdGEgaGVhZCwgbGl2ZT1UUlVFfQojIGxvb2sgYXQgdGhlIGhlYWQgb2YgdGhlIGNvbGRhdGEKaGVhZChjb2xEYXRhKGludGVncmF0ZWRfc2NlKSkgfD4KICBhcy5kYXRhLmZyYW1lKCkKYGBgCgpVaCBvaCwgaXQgbG9va3MgbGlrZSB0aGUgUk1TIHN1YnR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSBTQ0Ugb2JqZWN0LgpGb3J0dW5hdGVseSB3ZSBhbHNvIGhhdmUgdGhlIHNhbXBsZSBtZXRhZGF0YSB0YWJsZSB0aGF0IHdlIHJlYWQgaW4gZWFybGllciwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgc2FtcGxlcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0LgoKYGBge3Igc2FtcGxlIG1ldGFkYXRhLCBsaXZlPVRSVUV9CiMgcHJpbnQgb3V0IHNhbXBsZSBtZXRhZGF0YQpoZWFkKHNhbXBsZV9tZXRhZGF0YSkKYGBgCgpMb29raW5nIGF0IHRoaXMgc2FtcGxlIHRhYmxlLCB3ZSBzZWUgYSBjb2x1bW4gbmFtZWQgYHN1YmRpYWdub3Npc2Agd2hpY2ggYWNjb3VudHMgZm9yIHRoZSBSTVMgc3VidHlwZSwgQVJNUyBvciBFUk1TLgpXZSBhbHNvIHNlZSBvdGhlciBjb2x1bW5zIHRoYXQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHNwZWNpZmljIHNhbXBsZS4KCldlIGNhbiBpbmNvcnBvcmF0ZSB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcyBzYW1wbGUgbWV0YWRhdGEgdGFibGUgaW50byB0aGUgYGNvbERhdGFgIG9mIHRoZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QuClRoaXMgd2lsbCBhbGxvdyB1cyB0byBtYXRjaCBlYWNoIG9mIHRoZSBzYW1wbGVzIGluIHRoZSBTQ0Ugb2JqZWN0IHdpdGggdGhlIFJNUyBzdWJ0eXBlIGFuZCBhbHNvIGFsbG93IHVzIHRvIHVzZSBhbnkgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSBmb3IgcGxvdHRpbmcuCgpgYGB7ciBtb2RpZnkgY29sZGF0YX0KIyBhZGQgc2FtcGxlIG1ldGFkYXRhIHRvIGNvbERhdGEgZnJvbSB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0CmNvbGRhdGFfZGYgPC0gY29sRGF0YShpbnRlZ3JhdGVkX3NjZSkgfD4KICAjIGNvbnZlcnQgZnJvbSBEYXRhRnJhbWUgdG8gZGF0YS5mcmFtZQogIGFzLmRhdGEuZnJhbWUoKSB8PgogICMgbWVyZ2Ugd2l0aCBzYW1wbGUgbWV0YWRhdGEgCiAgZHBseXI6OmxlZnRfam9pbihzYW1wbGVfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICJsaWJyYXJ5X2lkIikpIHw+CiAgIyBjcmVhdGUgbmV3IGNvbHVtbnMKICAjIGNlbGxfaWQgaXMgYSBjb21iaW5hdGlvbiBvZiBiYXJjb2RlIGFuZCBzYW1wbGUKICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBnbHVlOjpnbHVlKCJ7c2FtcGxlfS17YmFyY29kZX0iKSwKICAgICAgICAgICAgICAgICMgc2ltcGxpZnkgc3ViZGlhZ25vc2lzCiAgICAgICAgICAgICAgICBkaWFnbm9zaXNfZ3JvdXAgPSBmb3JjYXRzOjpmY3RfcmVjb2RlKAogICAgICAgICAgICAgICAgICBzdWJkaWFnbm9zaXMsCiAgICAgICAgICAgICAgICAgICJBUk1TIiA9ICJBbHZlb2xhciByaGFiZG9teW9zYXJjb21hIiwKICAgICAgICAgICAgICAgICAgIkVSTVMiID0gIkVtYnJ5b25hbCByaGFiZG9teW9zYXJjb21hIgogICAgICAgICAgICAgICAgKSkKCiMgYWRkIG1vZGlmaWVkIGRhdGEgZnJhbWUgYmFjayB0byBTQ0UgYXMgRGF0YUZyYW1lCmNvbERhdGEoaW50ZWdyYXRlZF9zY2UpIDwtIERhdGFGcmFtZShjb2xkYXRhX2RmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IGNvbGRhdGFfZGYkY2VsbF9pZCkKYGBgCgpOb3cgd2hlbiB3ZSBsb29rIGF0IHRoZSBgY29sRGF0YWAgb2YgdGhlIFNDRSBvYmplY3Qgd2Ugc2hvdWxkIHNlZSBuZXcgY29sdW1ucywgaW5jbHVkaW5nIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gd2hpY2ggaW5kaWNhdGVzIGlmIGVhY2ggY2VsbCBjb21lcyBmcm9tIGFuIEVSTVMgb3IgQVJNUyBzYW1wbGUuCgpgYGB7ciBwcmludCBuZXcgY29sZGF0YSwgbGl2ZT1UUlVFfQojIHRha2UgYSBsb29rIGF0IHRoZSBuZXcgbW9kaWZpZWQgY29sRGF0YQpoZWFkKGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCiMjIyBQbG90dGluZyB3aXRoIGFubm90YXRpb25zCgpXZSBjYW4gbm93IHVzZSB0aGF0IGNvbHVtbiB0byBsYWJlbCBhbnkgVU1BUCBwbG90cyAob3Igb3RoZXIgcGxvdCB0eXBlcykgdGhhdCB3ZSBtYWtlLgpJbiB0aGUgY2h1bmsgYmVsb3cgd2Ugd2lsbCBzdGFydCBieSB0YWtpbmcgYSBsb29rIGF0IG91ciBpbnRlZ3JhdGlvbiByZXN1bHRzIGFuZCBjb2xvciBvdXIgY2VsbHMgYnkgUk1TIHN1YnR5cGUuCgoqKlJlbWluZGVyOiBZb3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIGJhdGNoLWNvcnJlY3RlZCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gcmVzdWx0cyBmb3IgdmlzdWFsaXppbmcgZGF0YXNldHMgY29udGFpbmluZyBtdWx0aXBsZSBsaWJyYXJpZXMgb3Igc2FtcGxlcy4qKgoKYGBge3IgZGlhZ25vc2lzIGdyb3VwIFVNQVAsIGxpdmU9VFJVRX0KIyBVTUFQIG9mIGFsbCBzYW1wbGVzLCBzZXBhcmF0aW5nIGJ5IGRpYWdub3NpcyBncm91cApzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJkaWFnbm9zaXNfZ3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuMikgCmBgYAoKSW50ZXJlc3RpbmdseSwgaXQgbG9va3MgbGlrZSBzYW1wbGVzIGZyb20gdGhlIEFSTVMgYW5kIEVSTVMgc3VidHlwZXMgdGVuZCB0byBncm91cCB3aXRoIHNhbXBsZXMgb2YgdGhlIHNhbWUgc3VidHlwZSByYXRoZXIgdGhhbiBhbGwgdG9nZXRoZXIuIAoKSW4gdGhlIGludGVncmF0aW9uIG5vdGVib29rIHdlIGFsc28gbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgY2VsbCB0eXBlcyBhZnRlciBpbnRlZ3JhdGlvbi4KSW4gdGhhdCBub3RlYm9vaywgd2UgZGlzY3Vzc2VkIHRoYXQgY2VsbHMgb2YgdGhlIHNhbWUgY2VsbCB0eXBlIGFyZSBleHBlY3RlZCB0byBpbnRlZ3JhdGUgd2l0aCBvdGhlciBjZWxscyBvZiB0aGUgc2FtZSB0eXBlLgpJcyB0aGF0IHRoZSBjYXNlIHdpdGggdGhpcyBkYXRhc2V0PwoKQSB3b3JkIG9mIGNhdXRpb24gd2hlbiBldmFsdWF0aW5nIHRoZSBjZWxsIHR5cGUgcmVzdWx0cyBmb3IgdGhpcyBkYXRhc2V0OiBUaGUgY2VsbCB0eXBlcyBmb3IgdGhpcyBkYXRhc2V0IHdlcmUgYXNzaWduZWQgaW4gYSB0d28gc3RhZ2UgcHJvY2VzcyBhcyBkZXNjcmliZWQgaW4gW1BhdGVsIF9ldCBhbC5fICgyMDIyKV0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5kZXZjZWwuMjAyMi4wNC4wMDMpLgpUaGUgZmlyc3Qgc3RhZ2UgYXNzaWduZWQgY2VsbHMgYXMgdHVtb3Igb3Igbm9uLXR1bW9yLgpUaGUgbmV4dCBzdGFnZSBmdXJ0aGVyIGNsYXNzaWZpZWQgdHVtb3IgY2VsbHMgaW50byBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdHVtb3IgY2VsbHM6IG15b2JsYXN0LCBteW9jeXRlLCBvciBtZXNvZGVybS4KU29tZSBzYW1wbGVzIGNvdWxkIG5vdCBiZSBmdXJ0aGVyIGNsYXNzaWZpZWQsIHNvIGFsbCBvZiB0aGVpciB0dW1vciBjZWxscyBhcmUgZGVub3RlZCBgVHVtb3JgLgpUaGUgc2FtcGxlcyB3aGljaCBjb3VsZCBiZSBmdXJ0aGVyIGNsYXNzaWZpZWQgaGF2ZSBhIG1peCBvZiBgVHVtb3JfTWVzb2Rlcm1gLCBgVHVtb3JfTXlvYmxhc3RgLCBhbmQgYFR1bW9yX015b2N5dGVgLgoKYGBge3IgY2VsbHR5cGUgVU1BUH0KIyBVTUFQIG9mIGFsbCBzYW1wbGVzIGxhYmVsZWQgYnkgY2VsbCB0eXBlCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBlYWNoIHBvaW50IGJ5IGNlbGwgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZT0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCkKYGBgCgpVbmxpa2Ugd2l0aCB0aGUgcHJldmlvdXMgZGF0YXNldHMgd2UgaGF2ZSBzZWVuIHdoZXJlIGFsbCBjZWxscyBvZiB0aGUgc2FtZSBjZWxsIHR5cGUgYWx3YXlzIGdyb3VwZWQgdG9nZXRoZXIsIHRoaXMgZGF0YXNldCBzaG93cyBzb21lIHNsaWdodGx5IGRpZmZlcmVudCBwYXR0ZXJucyBhbmQgbm90IGFsbCBjZWxscyBvZiB0aGUgc2FtZSBjZWxsIHR5cGUgY2x1c3RlciB0b2dldGhlci4KT25lIHJlYXNvbiBpcyB0aGF0IHR1bW9yIGRhdGEgY2FuIGJlIGhldGVyb2dlbmVvdXMgYW5kIGV2ZXJ5IHR1bW9yIGlzIHVuaXF1ZS4KRGVwZW5kaW5nIG9uIHRoZSB0dW1vciB0eXBlIHdlIG1heSBub3QgZXhwZWN0IGV2ZXJ5IHNhbXBsZSB0byBpbnRlZ3JhdGUgcGVyZmVjdGx5IGFuZCBtb3JlIGhldGVyb2dlbmVvdXMgdHVtb3IgdHlwZXMgd2lsbCBiZSBtb3JlIGRpZmZpY3VsdCB0byBpbnRlZ3JhdGUgdG9nZXRoZXIuCkluIHRoaXMgcGFydGljdWxhciBjYXNlIHdlIGFyZSBsb29raW5nIGF0IHR3byBzdWJ0eXBlcyBvZiBSTVMgdGhhdCBoYXZlIGRpc3RpbmN0IG11dGF0aW9uIGJ1cmRlbnMgYW5kIGRpZmZlcmVudGlhdGlvbiBzdGF0ZXMsIHNvIGl0J3MgbGlrZWx5IHRoYXQgdGhvc2UgZGlmZmVyZW5jZXMgY29udHJpYnV0ZSB0byBob3cgd2VsbCB0aGV5IGludGVncmF0ZS4KClRvIGV4cGxvcmUgd2hldGhlciBjZWxscyBhcmUgZ3JvdXBpbmcgdG9nZXRoZXIgYm90aCBieSBjZWxsIHR5cGUgYW5kIGJ5IFJNUyBzdWJ0eXBlLCB3ZSBjYW4gY3JlYXRlIGEgcGxvdCB0aGF0IGluY29ycG9yYXRlcyBib3RoIHBpZWNlcyBvZiBtZXRhZGF0YS4KV2Ugd2lsbCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYGZhY2V0X2dyaWQoKWAgZnVuY3Rpb24gZnJvbSBgZ2dwbG90MmAgdG8gbG9vayBhdCB0d28gdmFyaWFibGVzIGluIHRoZSBgY29sRGF0YWAgYXQgb25jZSAtIHRoZSBjZWxsIHR5cGUgYW5kIHRoZSBzdWJkaWFnbm9zaXMuCkluIHRoZSBiZWxvdyBwbG90IHdlIHdpbGwgY29sb3Igb3VyIGNlbGxzIGJ5IGNlbGwgdHlwZSB3aGlsZSBhbHNvIHVzaW5nIGBmYWNldF9ncmlkKClgIHNvIHRoYXQgY2VsbHMgZnJvbSBkaWZmZXJlbnQgc3ViZGlhZ25vc2VzIHdpbGwgYmUgaW4gdGhlaXIgb3duIHBsb3QgcGFuZWwuCgpgYGB7ciBjZWxsdHlwZSBzdWJkaWFnbm9zaXMgVU1BUCwgbGl2ZT1UUlVFfQojIFVNQVAgb2YgYWxsIHNhbXBsZXMKIyBzZXBhcmF0aW5nIGJ5IGRpYWdub3NpcyBncm91cCBhbmQgbGFiZWxpbmcgY2VsbCB0eXBlCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBlYWNoIHBvaW50IGJ5IGNlbGwgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZT0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICAjIHRlbGwgc2NhdGVyIHRvIHVzZSBkaWFnbm9zaXNfZ3JvdXAgZm9yIHBsb3R0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZmllbGRzID0gImRpYWdub3Npc19ncm91cCIpICsKICAjIGluY2x1ZGUgZWFjaCBkaWFnbm9zaXMgZ3JvdXAgYXMgaXRzIG93biBjb2x1bW4KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRpYWdub3Npc19ncm91cCkpCmBgYAoKQXMgZXhwZWN0ZWQsIHdlIHNlZSB0aGF0IGNlbGwgdHlwZXMgYXJlIHNlcGFyYXRlZCwgbW9zdCBsaWtlbHkgZHVlIHRvIGRpZmZlcmVudCBSTVMgc3VidHlwZXMuCgpXZSBjYW4gYWxzbyB1c2UgYSBzdGFja2VkIGJhcnBsb3QgdG8gbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNlbGwgdHlwZXMgYWNyb3NzIGVhY2ggc2FtcGxlLCB3aGljaCB3aWxsIHJlcXVpcmUgYSBiaXQgb2Ygd3JhbmdsaW5nIGZpcnN0LgoKYGBge3IgY2VsbHR5cGUgYmFycGxvdH0KIyBmaWx0ZXIgY29sZGF0YSB0byBvbmx5IGluY2x1ZGUgdHVtb3IgY2VsbHMKdHVtb3JfY2VsbHNfZGYgPC0gY29sZGF0YV9kZiB8PgogICMgZmluZCByb3dzIHdoZXJlIHRoZSBjZWxsIHR5cGUgbmFtZSBjb250YWlucyB0aGUgc3RyaW5nICJUdW1vciIKICBkcGx5cjo6ZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY2VsbHR5cGVfYnJvYWQsICJUdW1vciIpKQoKIyBjcmVhdGUgYSBzdGFja2VkIGJhcnBsb3QKZ2dwbG90KHR1bW9yX2NlbGxzX2RmLCBhZXMoeCA9IHNhbXBsZSwgZmlsbCA9IGNlbGx0eXBlX2Jyb2FkKSkgKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICAgIGxhYnMoCiAgICAgIHggPSAiU2FtcGxlIiwKICAgICAgeSA9ICJQcm9wb3J0aW9uIG9mIGNlbGxzIiwgCiAgICAgIGZpbGwgPSAiQ2VsbCB0eXBlIgogICAgKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUpKSsKICAjIGZhY2V0IGJ5IGRpYWdub3NpcyBncm91cCAKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRpYWdub3Npc19ncm91cCksIAogICAgICAgICAgICAgIyBvbmx5IHNob3cgbm9uLU5BIHZhbHVlcyBvbiB4LWF4aXMKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLAogICAgICAgICAgICAgc3BhY2UgPSAiZnJlZV94IikKYGBgCgpTaW1pbGFyIHRvIHRoZSBVTUFQLCB0aGlzIHBsb3Qgc2hvd3MgdGhhdCBBUk1TIGFuZCBFUk1TIHNoYXJlIGEgbG90IG9mIHRoZSBzYW1lIGNlbGwgdHlwZXMuCgpXZSBhbHNvIHNlZSB0aGF0IG9ubHkgNiBvZiB0aGVzZSBsaWJyYXJpZXMgaGF2ZSB0dW1vciBjZWxscyB0aGF0IGhhdmUgYmVlbiBmdXJ0aGVyIGNsYXNzaWZpZWQgaW50byBtZXNvZGVybSwgbXlvYmxhc3QsIGFuZCBteW9jeXRlLiAKMyBsaWJyYXJpZXMgY29udGFpbiBjZWxscyB0aGF0IGFyZSBvbmx5IGNsYXNzaWZpZWQgYXMgdHVtb3Igb3Igbm9uLXR1bW9yLCBhbmQgdHVtb3IgY2VsbHMgYXJlIG5vdCBmdXJ0aGVyIGNsYXNzaWZpZWQsIGFuZCB0aGUgcmVtYWluaW5nIGxpYnJhcnkgaXMgbm90IGV2ZW4gcHJlc2VudCBpbiBvdXIgcGxvdCBiZWNhdXNlIGl0IHdhcyBub3QgYXNzaWduZWQgYW55IGNlbGwgdHlwZXMgKGFsbCBhcmUgYE5BYCkuCldlIHdpbGwgY29udGludWUgb3VyIGFuYWx5c2lzIG9ubHkgdXNpbmcgdGhlIDYgbGlicmFyaWVzIHdpdGggZnVsbHkgY2xhc3NpZmllZCBjZWxsIHR5cGVzLCByZW1vdmluZyB0aGUgb3RoZXIgNCBiZWZvcmUgd2UgcHJvY2VlZCB3aXRoIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLgoKIyMjIEZpbHRlcmluZyBzYW1wbGVzCgpUaGUgcmVhc29uIHdlIHdhbnQgdG8gcGFyZSBkb3duIG91ciBsaXN0IG9mIHNhbXBsZXMgdG8gY29uc2lkZXIgaXMgdGhhdCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBjZWxsIHR5cGVzIChvciBzdWJwb3B1bGF0aW9ucykgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUgcHJlc2VudCBpbiBhbGwgc2FtcGxlcyBpbmNsdWRlZCBpbiBvdXIgREUgYW5hbHlzaXMuIApXZSB3YW50IHRvIHJlbW92ZSBhbnkgc2FtcGxlcyB0aGF0IGRvIG5vdCBjb250YWluIG91ciBjZWxsIHBvcHVsYXRpb24ocykgb2YgaW50ZXJlc3QgYXMgdGhleSBoYXZlIG5vIGNvdW50cyB0byBjb250cmlidXRlIHRvIHRoZSBERSBhbmFseXNpcy4KCmBgYHtyIHN1YnNldCBzY2V9CiMgZGVmaW5lIHNhbXBsZXMgdG8ga2VlcApsaWJyYXJ5X2lkcyA8LSBjKAogICJTQ1BDTDAwMDQ3OSIsCiAgIlNDUENMMDAwNDgwIiwKICAiU0NQQ0wwMDA0ODEiLAogICJTQ1BDTDAwMDQ4NCIsCiAgIlNDUENMMDAwNDg4IiwKICAiU0NQQ0wwMDA0OTEiCikKCiMgc3Vic2V0IHNjZSB0byBvbmx5IGNvbnRhaW4gc2FtcGxlcyBvZiBpbnRlcmVzdCAKc2FtcGxlc190b19rZWVwIDwtIGludGVncmF0ZWRfc2NlJHNhbXBsZSAlaW4lIGxpYnJhcnlfaWRzCnJtc19zY2UgPC0gaW50ZWdyYXRlZF9zY2VbLCBzYW1wbGVzX3RvX2tlZXBdCgojIHByaW50IG91dCBvdXIgbmV3IFNDRSAKcm1zX3NjZQpgYGAKCkJlZm9yZSB3ZSBtb3ZlIG9uLCB3ZSdsbCByZW1vdmUgdGhlIG9yaWdpbmFsIGludGVncmF0ZWQgb2JqZWN0IGZyb20gb3VyIGVudmlyb25tZW50IHRvIHNhdmUgc29tZSBtZW1vcnkuIAoKYGBge3IgcmVtb3ZlIHNjZX0Kcm0oaW50ZWdyYXRlZF9zY2UpCmBgYAoKV2Ugd2lsbCBhbHNvIHNhdmUgb3VyIG5ldyBvYmplY3QgaW4gY2FzZSB3ZSB3YW50IHRvIHVzZSBpdCBmb3Igb3RoZXIgYW5hbHlzaXMgbGF0ZXIgb24uCgpgYGB7ciBzYXZlIHNjZX0KIyB3cml0ZSBSRFMgZmlsZSB3aXRoIGNvbXByZXNzaW9uCnJlYWRyOjp3cml0ZV9yZHMocm1zX3NjZSwgZmlsZSA9IG91dHB1dF9zY2VfZmlsZSwgY29tcHJlc3MgPSAiZ3oiKQpgYGAKCldlIG5vdyBoYXZlIGFuIHVwZGF0ZWQgU0NFIG9iamVjdCB0aGF0IGNvbnRhaW5zIDYgc2FtcGxlcyB0aGF0IHdlcmUgb2J0YWluZWQgZnJvbSBhIG1peCBvZiBBUk1TIGFuZCBFUk1TIHBhdGllbnRzLgpXZSBjYW4gdGhlbiBhc2sgdGhlIHF1ZXN0aW9uLCBkbyBzcGVjaWZpYyB0dW1vciBjZWxsIHR5cGVzIGNvbnRhaW4gc2V0cyBvZiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXM/CgpXZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYmlvbG9naWNhbCByZXBsaWNhdGVzIGZyb20gZWFjaCBncm91cCB0byBzZXQgdXAgb3VyIGV4cGVyaW1lbnQuIApJdCBpcyBpbXBlcmF0aXZlIHRvIGNvbnNpZGVyIGdvb2QgZXhwZXJpbWVudGFsIGRlc2lnbiBhbmQgZW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYmlvbG9naWNhbCByZXBsaWNhdGVzIChhdCBsZWFzdCAzIGZvciBlYWNoIGdyb3VwKSB3aGVuIHBlcmZvcm1pbmcgZGlmZmVyZW50aWFsIGdlbmUgZXhwcmVzc2lvbiBhbmFseXNpcy4KCklmIHdlIGxvb2sgYmFjayBhdCBvdXIgc3RhY2tlZCBiYXJwbG90IHdlIHNlZSB0aGF0IHdlIHBpY2tlZCAzIEFSTVMgYW5kIDMgRVJNUyBzYW1wbGVzLgpXZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2YgY2VsbHMgYXJlIHR1bW9yIGNlbGxzLCBpbiBwYXJ0aWN1bGFyIHRoZSBsYXJnZXN0IHBvcHVsYXRpb24gb2YgY2VsbHMgYXBwZWFycyB0byBiZSB0aGUgYFR1bW9yX015b2JsYXN0YC4gCkZvciB0aGlzIGV4YW1wbGUgd2Ugd2lsbCBmb2N1cyBvbiBpZGVudGlmeWluZyBERSBnZW5lcyBpbiB0aGVzZSBgVHVtb3JfTXlvYmxhc3RgIGNlbGxzLCBidXQgdGhlIHByaW5jaXBsZXMgYXBwbGllZCBiZWxvdyBjYW4gYmUgYXBwbGllZCB0byBhbnkgY2VsbCB0eXBlcyBvciBzdWJwb3B1bGF0aW9ucyBvZiBpbnRlcmVzdC4KCiMjIERpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzCgpOb3cgd2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHByZXBhcmluZyBmb3Igb3VyIERFIGFuYWx5c2lzLCB3aGVyZSB3ZSB3aWxsIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBvZiB0dW1vciBteW9ibGFzdCBjZWxscyBiZXR3ZWVuIEFSTVMgYW5kIEVSTVMgc2FtcGxlcy4KClRocm91Z2hvdXQgdGhlIG5vdGVib29rIHdlIGhhdmUgYmVlbiB3b3JraW5nIHdpdGggYW4gaW50ZWdyYXRlZCBkYXRhc2V0IHRoYXQgY29udGFpbnMgY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhIChgZmFzdG1ubl9jb3JyZWN0ZWRgIGFzc2F5KSBhbmQgYSBjb3JyZWN0ZWQgVU1BUC4KQXMgYSByZW1pbmRlciwgdGhlIHVuY29ycmVjdGVkIGdlbmUgZXhwcmVzc2lvbiBkYXRhLCBmb3VuZCBpbiB0aGUgYGNvdW50c2AgYW5kIGBsb2djb3VudHNgIGFzc2F5cywgY29ycmVzcG9uZCB0byBkYXRhIHRoYXQgaGFzIGJlZW4gbWVyZ2VkICh0aGUgZmlyc3Qgc3RlcCB3ZSB3YWxrZWQgdGhyb3VnaCBwcmlvciB0byBpbnRlZ3JhdGlvbikgaW50byB0aGUgc2FtZSBTQ0UgYnV0IG5vdCB5ZXQgaW50ZWdyYXRlZC4KV2UgZG8gbm90IHdhbnQgdG8gdXNlIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gdmFsdWVzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbjsgYERFU2VxMmAgZXhwZWN0cyB0aGUgb3JpZ2luYWwgcmF3IGNvdW50cyBhcyBpbnB1dCBzbyB3ZSB3aWxsIGJlIHVzaW5nIGRhdGEgZm91bmQgaW4gdGhlIGBjb3VudHNgIGFzc2F5IG9mIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4gCgpJdCBpcyBhZHZpc2VkIHRvIG9ubHkgdXNlIHRoZSBjb3JyZWN0ZWQgdmFsdWVzIGZvciBhbnkgYW5hbHlzZXMgYmVpbmcgcGVyZm9ybWVkIGF0IHRoZSBjZWxsIGxldmVsLCBlLmcuLCBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uCkluIGNvbnRyYXN0LCBpdCBpcyBub3QgYWR2aXNlZCB0byB1c2UgY29ycmVjdGVkIHZhbHVlcyBmb3IgYW55IGFuYWx5c2VzIHRoYXQgYXJlIGdlbmUtYmFzZWQsIHN1Y2ggYXMgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gb3IgbWFya2VyIGdlbmUgZGV0ZWN0aW9uLCBiZWNhdXNlIHdpdGhpbi1iYXRjaCBhbmQgYmV0d2Vlbi1iYXRjaCBnZW5lIGV4cHJlc3Npb24gZGlmZmVyZW5jZXMgYXJlIG5vIGxvbmdlciBwcmVzZXJ2ZWQuClRoZSByZWFzb24gZm9yIHRoaXMgaXMgdHdvLWZvbGQg4oCTIG1hbnkgb2YgdGhlIERFIG1vZGVscyB3aWxsIGV4cGVjdCB1bmNvcnJlY3RlZCBjb3VudHMgYmVjYXVzZSB0aGV5IHdpbGwgYWNjb3VudCBmb3IgYmV0d2Vlbi1zYW1wbGUgdmFyaWF0aW9uIHdpdGhpbiB0aGUgbW9kZWwsIGFuZCB3ZSB3YW50IHRvIGVuc3VyZSB3ZSBhcmUgcHJlc2VydmluZyB2YXJpYXRpb24gdGhhdCBpcyBwcmVzZW50IHNvIGFzIG5vdCB0byBhcnRpZmljaWFsbHkgaW5mbGF0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBvcHVsYXRpb25zLgpTZWUgdGhlIFtPU0NBIGNoYXB0ZXIgb24gVXNpbmcgdGhlIGNvcnJlY3RlZCB2YWx1ZXNdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE2L09TQ0EubXVsdGlzYW1wbGUvdXNpbmctY29ycmVjdGVkLXZhbHVlcy5odG1sI3VzaW5nLWNvcnJlY3RlZC12YWx1ZXMpIGZvciBtb3JlIGluc2lnaHQuCgojIyMgUHNldWRvLWJ1bGtpbmcgCgpCZWZvcmUgd2UgY2FuIGNvbXBhcmUgdGhlIGdlbmUgZXhwcmVzc2lvbiBwcm9maWxlcyBvZiBteW9ibGFzdHMgaW4gQVJNUyB2cy4gRVJNUyBzYW1wbGVzLCB3ZSB3aWxsIG5lZWQgdG8gInBzZXVkby1idWxrIiB0aGUgZ2VuZSBjb3VudHMuIApQc2V1ZG8tYnVsa2luZyBjcmVhdGVzIGEgbmV3IGNvdW50cyBtYXRyaXggdGhhdCBjb250YWlucyB0aGUgc3VtIG9mIHRoZSBjb3VudHMgZnJvbSBhbGwgY2VsbHMgd2l0aCBhIGdpdmVuIGxhYmVsIChlLmcuLCBjZWxsIHR5cGUpIGZvciBlYWNoIHNhbXBsZSAoW1R1bmcgX2V0IGFsLl8gMjAxN10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvc3JlcDM5OTIxKSkuIApJZiB3ZSB3ZXJlIHRvIGtlZXAgZWFjaCBjZWxsJ3MgY291bnRzIHNlcGFyYXRlLCB0aGV5IHdvdWxkIGJlIHRyZWF0ZWQgYXMgcmVwbGljYXRlcywgbGVhZGluZyB0byBpbmZsYXRlZCBzdGF0aXN0aWNzLiAKQnkgcHNldWRvLWJ1bGtpbmcgZmlyc3QsIHdlIHdpbGwgbm93IGhhdmUgb25lIGNvdW50IGZvciBlYWNoIGdlbmUgZm9yIGVhY2ggc2FtcGxlIGFuZCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2Ygd2VsbC1lc3RhYmxpc2hlZCBtZXRob2RzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiB3aXRoIGJ1bGsgUk5BLXNlcS4KClBzZXVkby1idWxraW5nIGlzIGltcGxlbWVudGVkIHByaW9yIHRvIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzIG9uIHNpbmdsZS1jZWxsIGRhdGEgYmVjYXVzZSBpdDogCgotIFByb2R1Y2VzIGxhcmdlciBhbmQgbGVzcyBzcGFyc2UgY291bnRzLCB3aGljaCBhbGxvd3MgdXMgdG8gdXNlIHN0YW5kYXJkIG5vcm1hbGl6YXRpb24gYW5kIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG1ldGhvZHMgdXNlZCBieSBidWxrIFJOQS1zZXEuIAotIENvbGxhcHNlcyBnZW5lIGV4cHJlc3Npb24gY291bnRzIGJ5IHNhbXBsZSwgc28gdGhhdCBzYW1wbGVzLCByYXRoZXIgdGhhbiBjZWxscywgcmVwcmVzZW50IHJlcGxpY2F0ZXMuCi0gTWFza3MgdmFyaWFuY2Ugd2l0aGluIGEgc2FtcGxlIHRvIGVtcGhhc2l6ZSB2YXJpYW5jZSBhY3Jvc3Mgc2FtcGxlcy4KVGhpcyBjYW4gYmUgYm90aCBnb29kIGFuZCBiYWQhIApNYXNraW5nIGludHJhLXNhbXBsZSB2YXJpYXRpb24gbWVhbnMgeW91IG1pZ2h0IG5vdCBpZGVudGlmeSBnZW5lcyB3aGVyZSBhdmVyYWdlIGV4cHJlc3Npb24gZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiBzYW1wbGVzIGJ1dCB0aGUgZGVncmVlIG9mIGNlbGwtdG8tY2VsbCB2YXJpYXRpb24gZG9lcy4KCkJlZm9yZSB3ZSBhcHBseSBwc2V1ZG8tYnVsa2luZyB0byBvdXIgZGF0YXNldCwgbGV0J3MgbG9vayBhdCBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyBwc2V1ZG8tYnVsa2luZyB3b3Jrcy4KV2UnbGwgc3RhcnQgYnkgY3JlYXRpbmcgYSBmYWtlIG1hdHJpeCBvZiBjb3VudHMuCgpgYGB7ciBjcmVhdGUgbWF0cml4fQojIGNyZWF0ZSBhbiBleGFtcGxlIGNvdW50cyBtYXRyaXgKY291bnRzX210eCA8LSBtYXRyaXgoCiAgMToxMiwgCiAgbmNvbCA9IDQsCiAgZGltbmFtZXMgPSBsaXN0KGMoImdlbmVBIiwgImdlbmVCIiwgImdlbmVDIiksCiAgICAgICAgICAgICAgICAgIGMoIkEtY2VsbDEiLCAiQS1jZWxsMiIsICJCLWNlbGwxIiwgIkItY2VsbDIiKSkKKQpjb3VudHNfbXR4CmBgYAoKTmV4dCB3ZSB3aWxsIGNyZWF0ZSBhIHBzZXVkby1idWxrZWQgdmVyc2lvbiBvZiB0aGlzIG1hdHJpeCB3aXRoIG9ubHkgMiBjb2x1bW5zOiAxIGZvciBncm91cCBgQWAgYW5kIDEgZm9yIGdyb3VwIGBCYC4KVG8gZG8gdGhpcyB3ZSB3aWxsIHVzZSB0aGUgYERlbGF5ZWRBcnJheTo6Y29sc3VtKClgIGZ1bmN0aW9uLCB3aGljaCBhbGxvd3MgdXMgdG8gc3VtIHRoZSBjb3VudHMgZm9yIGVhY2ggcm93IGFjcm9zcyBncm91cHMgb2YgY29sdW1ucy4KCmBgYHtyIHBzZXVkb2J1bGsgbWF0cml4LCBsaXZlPVRSVUV9CiMgZGVmaW5lIHRoZSBncm91cCB0aGF0IGVhY2ggY29sdW1uIGJlbG9uZ3MgdG8KZ3JvdXBzIDwtIGMoIkEiLCAiQSIsICJCIiwgIkIiKQoKIyBzdW0gY291bnRzIGFjcm9zcyBjZWxscyAoY29sdW1ucykgYnkgZ3JvdXAgbGFiZWwKcGJfY291bnRzIDwtIERlbGF5ZWRBcnJheTo6Y29sc3VtKGNvdW50c19tdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzKQpwYl9jb3VudHMgIApgYGAKCkxvb2tpbmcgYXQgdGhpcyBvdXRwdXQsIHlvdSBzaG91bGQgc2VlIHRoYXQgdGhlIG9yaWdpbmFsIDQgY29sdW1ucyBoYXZlIGJlZW4gY29uZGVuc2VkIHRvIG9ubHkgMiBjb2x1bW5zOiAxIGNvbHVtbiB0byByZXByZXNlbnQgYWxsIGNlbGxzIGZyb20gZ3JvdXAgYEFgLCBhbmQgMSBjb2x1bW4gdG8gcmVwcmVzZW50IGFsbCBjZWxscyBmcm9tIGdyb3VwIGBCYC4KCk5vdyB0aGUgYWN0dWFsIHBzZXVkby1idWxraW5nIGZvciBvdXIgZGF0YXNldCEgCgpXZSB3aWxsIHVzZSB0aGUgW2BzY3V0dGxlOjphZ2dyZWdhdGVBY3Jvc3NDZWxscygpYCBmdW5jdGlvbl0oaHR0cHM6Ly9yZHJyLmlvL2dpdGh1Yi9MVExBL3NjdXR0bGUvbWFuL2FnZ3JlZ2F0ZUFjcm9zc0NlbGxzLmh0bWwpIHRvIHBzZXVkby1idWxrIG91ciBkYXRhc2V0LgpUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IGFuIFNDRSBvYmplY3QgYW5kIHRoZSBncm91cGluZyBhc3NpZ25tZW50cyBmb3IgZWFjaCBjZWxsLgpUaGUgb3V0cHV0IHdpbGwgYmUgYW4gU0NFIG9iamVjdCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHBzZXVkby1idWxrZWQgY291bnRzIGZvciBhbGwgZ2VuZXMgYWNyb3NzIGFsbCBzcGVjaWZpZWQgZ3JvdXBzLCByYXRoZXIgdGhhbiBhY3Jvc3MgYWxsIGNlbGxzLiAKV2UgY2FuIHRoZW4gc3Vic2V0IHRoaXMgU0NFIHRvIGp1c3QgaW5jbHVkZSBvdXIgY2VsbCB0eXBlIG9mIGludGVyZXN0ICh0dW1vciBteW9ibGFzdHMpIGZvciBpbnB1dCB0byB0aGUgREUgYW5hbHlzaXMuIAoKV2UgY2FuIHBzZXVkby1idWxrIHVzaW5nIGFueSBncm91cGluZyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLgpGb3IgcmlnaHQgbm93LCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBsb29raW5nIGF0IGdlbmUgZXhwcmVzc2lvbiBhY3Jvc3MgY2VsbCB0eXBlcywgc28gd2Ugd2FudCB0byBncm91cCB0aGUgcHNldWRvLWJ1bGtlZCBjb3VudHMgbWF0cml4IGJ5IGJvdGggY2VsbCB0eXBlIGFuZCBvcmlnaW5hbCBzYW1wbGUuIAoKYGBge3IgcHNldWRvYnVsayBzY2V9CiMgZmlyc3Qgc3Vic2V0IHRoZSBjb2xkYXRhIAojIHRvIG9ubHkgaGF2ZSB0aGUgY29sdW1ucyB3ZSBjYXJlIGFib3V0IGZvciBwc2V1ZG8tYnVsa2luZyAKcGJfZ3JvdXBzIDwtIGNvbERhdGEocm1zX3NjZSlbLCBjKCJjZWxsdHlwZV9icm9hZCIsICJzYW1wbGUiKV0KCiMgY3JlYXRlIGEgbmV3IFNDRSBvYmplY3QgdGhhdCBjb250YWlucyAKIyB0aGUgcHNldWRvLWJ1bGtlZCBjb3VudHMgYWNyb3NzIHRoZSBwcm92aWRlZCBncm91cHMgCnBiX3NjZSA8LSBzY3V0dGxlOjphZ2dyZWdhdGVBY3Jvc3NDZWxscyhybXNfc2NlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gcGJfZ3JvdXBzKQoKIyBjb2x1bW4gbmFtZXMgYXJlbid0IGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHBzZXVkby1idWxrZWQgc2NlLCAKIyBzbyBsZXQncyBhZGQgdGhlbSBpbiAKY29sbmFtZXMocGJfc2NlKSA8LSBnbHVlOjpnbHVlKAogICJ7cGJfc2NlJGNlbGx0eXBlX2Jyb2FkfV97cGJfc2NlJHNhbXBsZX0iCikKCnBiX3NjZQpgYGAKCkhvdyBkb2VzIHRoZSBuZXcgcHNldWRvLWJ1bGtlZCBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIGxvb2sgZGlmZmVyZW50PyAKSG93IG1hbnkgY29sdW1ucyBkb2VzIGl0IGhhdmU/IAoKTGV0J3MgdGFrZSBhIGxvb2sgYXQgd2hhdCB0aGUgYGNvbERhdGFgIGxvb2tzIGxpa2UgaW4gdGhlIHBzZXVkby1idWxrZWQgU0NFIG9iamVjdC4gCgpgYGB7ciBwc2V1ZG9idWxrIGNvbERhdGEsIGxpdmU9VFJVRX0KIyBub3RlIHRoZSBuZXcgY29sdW1uIHdpdGggbnVtYmVyIG9mIGNlbGxzIHBlciBncm91cCAKaGVhZChjb2xEYXRhKHBiX3NjZSkpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKWW91IHNob3VsZCBzZWUgdGhhdCBjb2x1bW5zIHN1Y2ggYXMgYHN1bWAsIGBkZXRlY3RlZGAsIGBzdWJzZXRzX21pdG9fc3VtYCwgYW5kIG90aGVyIGNvbHVtbnMgdGhhdCB0eXBpY2FsbHkgY29udGFpbiBwZXIgY2VsbCBRQyBzdGF0aXN0aWNzIG5vdyBjb250YWluIGBOQWAgcmF0aGVyIHRoYW4gbnVtZXJpYyB2YWx1ZXMuIApUaGlzIGlzIGJlY2F1c2UgdGhlc2UgdmFsdWVzIHdlcmUgaW5pdGlhbGx5IGNhbGN1bGF0ZWQgb24gYSBwZXIgY2VsbCBsZXZlbCAod2UgZGlkIHRoaXMgdXNpbmcgYHNjdXR0bGU6OmFkZFBlckNlbGxRQ01ldHJpY3MoKWApLCBidXQgd2Ugbm8gbG9uZ2VyIGhhdmUgYSBzaW5nbGUgY29sdW1uIHBlciBjZWxsLgpJbnN0ZWFkLCBlYWNoIGNvbHVtbiBub3cgcmVwcmVzZW50cyBhIF9ncm91cF8gb2YgY2VsbHMsIGluIHRoaXMgY2FzZSBjb21wcmlzZWQgb2YgY2VsbHMgb2YgYSBnaXZlbiBjZWxsIHR5cGUgYW5kIHNhbXBsZSBjb21iaW5hdGlvbi4KVGhlcmVmb3JlLCB0aGUgdmFsdWVzIHRoYXQgd2UgY2FsY3VsYXRlZCBvbiBhIHBlci1jZWxsIGxldmVsIGFyZSBubyBsb25nZXIgYXBwbGljYWJsZSB0byB0aGlzIHBzZXVkby1idWxrZWQgU0NFIG9iamVjdC4KCllvdSBzaG91bGQgYWxzbyBzZWUgYSBuZXcgY29sdW1uIHRoYXQgd2Fzbid0IHByZXNlbnQgcHJldmlvdXNseSwgdGhlIGBuY2VsbHNgIGNvbHVtbi4KVGhpcyBjb2x1bW4gd2FzIGFkZGVkIGR1cmluZyBwc2V1ZG8tYnVsa2luZyBhbmQgaW5kaWNhdGVzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2VsbHMgdGhhdCB3ZXJlIHN1bW1lZCB0b2dldGhlciB0byBmb3JtIGVhY2ggY29sdW1uIG9mIHRoZSBTQ0Ugb2JqZWN0LgoKQmVmb3JlIHdlIHByb2NlZWQgd2Ugd2lsbCB3YW50IHRvIGZpbHRlciBvdXQgYW55IGNvbHVtbnMgdGhhdCBoYXZlIGEgbG93IG51bWJlciBvZiBjZWxscy4KQSBsb3cgbnVtYmVyIG9mIGNlbGxzIHdpbGwgdXN1YWxseSByZXN1bHQgaW4gc21hbGwgY291bnRzIHRoYXQgY2FuIGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBzdGF0aXN0aWNhbCBhcHByb3hpbWF0aW9ucyBtYWRlIGR1cmluZyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcy4KVGhpcyBpcyBlcXVpdmFsZW50IHRvIGZpbHRlcmluZyBvdXQgYW55IGxpYnJhcmllcyBpbiBidWxrIFJOQS1zZXEgYW5hbHlzaXMgdGhhdCBoYXZlIGxvdyBsaWJyYXJ5IHNpemVzLgoKV2UgY2FuIHNldCBhIHRocmVzaG9sZCBmb3IgdGhlIG51bWJlciBvZiBjZWxscyByZXF1aXJlZCB0byBjb250aW51ZSB3aXRoIG91ciBhbmFseXNpcyBhbmQgcmVtb3ZlIGFueSBncm91cHMgdGhhdCBkbyBub3QgbWVldCB0aGUgbWluaW11bSB0aHJlc2hvbGQuCkhlcmUgd2Ugd2lsbCB1c2UgMTAsIGJ1dCB0aGUgdGhyZXNob2xkIHlvdSB1c2UgZm9yIHlvdXIgZGF0YXNldCBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGNvbXBvc2l0aW9uIG9mIGNlbGwgdHlwZXMuCgpgYGB7ciBmaWx0ZXIgcHNldWRvYnVsaywgbGl2ZT1UUlVFfQojIHJlbW92ZSBhbnkgZ3JvdXBzIHdpdGggZmV3ZXIgdGhhbiAxMCBjZWxscwpmaWx0ZXJfcGJfc2NlIDwtIHBiX3NjZVssIHBiX3NjZSRuY2VsbHMgPj0gMTBdCmBgYAoKV2UgY2FuIHRoZW4gdGFrZSBhIGxvb2sgYW5kIHNlZSBob3cgbWFueSBjZWxsIHR5cGUtc2FtcGxlIGNvbHVtbnMgd2UgcmVtb3ZlZCwgaWYgYW55LgoKYGBge3IgcHJpbnQgZGltLCBsaXZlPVRSVUV9CiMgcHJpbnQgb3V0IGRpbWVuc2lvbnMgb2YgdW5maWx0ZXJlZCBwc2V1ZG9idWxrIHNjZQpkaW0ocGJfc2NlKQoKIyBkaW1lbnNpb25zIG9mIGZpbHRlcmVkIHBzZXVkb2J1bGsgc2NlIApkaW0oZmlsdGVyX3BiX3NjZSkKYGBgCgpJdCBsb29rcyBsaWtlIHdlIG9ubHkgZ290IHJpZCBvZiBvbmUgZ3JvdXAuCldlIGNhbiBkbyBhIHF1aWNrIGNoZWNrIHRvIHNlZSB3aGljaCBncm91cCB3YXMgcmVtb3ZlZCBieSBmaW5kaW5nIHdoaWNoIGNvbHVtbiBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgZmlsdGVyZWQgb2JqZWN0LgoKYGBge3IgcmVtb3ZlZCBjb2x1bW5zLCBsaXZlPVRSVUV9CiMgZmluZCByZW1vdmVkIGNvbHVtbnMKcmVtb3ZlZF9jb2xzIDwtICEoY29sbmFtZXMocGJfc2NlKSAlaW4lIGNvbG5hbWVzKGZpbHRlcl9wYl9zY2UpKQoKIyBwcmludCBvdXQgbWlzc2luZyBjb2x1bW5zCmNvbG5hbWVzKHBiX3NjZSlbcmVtb3ZlZF9jb2xzXQpgYGAKClRoZSBsYXN0IHN0ZXAgd2Ugd2FudCB0byBkbyB0byBwcmVwYXJlIG91ciBkYXRhc2V0IGZvciBERSBpcyB0byBzdWJzZXQgdGhlIHBzZXVkby1idWxrZWQgU0NFIG9iamVjdCB0byBjb250YWluIG9ubHkgdGhlIGNlbGwgdHlwZSB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluIGNvbXBhcmluZyBhY3Jvc3MgdGhlIHR3byBSTVMgc3VidHlwZXMuCkFzIG1lbnRpb25lZCBwcmV2aW91c2x5LCB3ZSBhcmUgc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGBUdW1vcl9NeW9ibGFzdGAgY2VsbCB0eXBlLgoKYGBge3IgZmlsdGVyIGNlbGx0eXBlfQojIGxvZ2ljYWwgdmVjdG9yIGluZGljYXRpbmcgaWYgY2VsbHMgYXJlIHR1bW9yIG15b2JsYXN0IG9yIG5vdApteW9ibGFzdF9jZWxscyA8LSBmaWx0ZXJfcGJfc2NlJGNlbGx0eXBlX2Jyb2FkID09ICJUdW1vcl9NeW9ibGFzdCIKCiMgY3JlYXRlIGEgbmV3IHNjZSB3aXRoIG9ubHkgdGhlIHR1bW9yIG15b2JsYXN0cwp0dW1vcl9teW9ibGFzdF9zY2UgPC0gZmlsdGVyX3BiX3NjZVssIG15b2JsYXN0X2NlbGxzXQpgYGAKCkFmdGVyIGZpbHRlcmluZyBmb3Igb3VyIGNlbGwgdHlwZSBvZiBpbnRlcmVzdCB3ZSBzaG91bGQgaGF2ZSBhIGRhdGFzZXQgd2l0aCA2IGNvbHVtbnMsIDEgZm9yIGVhY2ggZ3JvdXAgb2YgYFR1bW9yX015b2JsYXN0YCBjZWxscyBpbiBlYWNoIG9mIG91ciA2IHNhbXBsZXMuCgojIyMgUGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiB3aXRoIGBERVNlcTJgCgpOb3cgd2Ugd2lsbCB1c2UgdGhlIGBERVNlcTJgIHBhY2thZ2UgdG8gcGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiAoREUpIGFuYWx5c2lzIG9uIG91ciBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QuCkZyb20gdGhpcyBwb2ludCwgd2UgY2FuIHByb2NlZWQgaW4gdGhlIHNhbWUgd2F5IHdlIHdvdWxkIGlmIHdlIGhhZCBhIGJ1bGsgUk5BLXNlcSBkYXRhc2V0IHdpdGggNiBzYW1wbGVzLgpXZSB3aWxsIHN0YXJ0IHdpdGggdGhlIHVubm9ybWFsaXplZCByYXcgY291bnRzIGluIHRoZSBgY291bnRzYCBhc3NheSBvZiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0UgYW5kIGRvIHRoZSBmb2xsb3dpbmcgd2l0aCBgREVTZXEyYDoKCi0gQ3JlYXRlIGEgYERFU2VxRGF0YVNldGAgb2JqZWN0Ci0gTm9ybWFsaXplIGFuZCBsb2cgdHJhbnNmb3JtIHRoZSBjb3VudHMgZGF0YQotIEVzdGltYXRlIGRpc3BlcnNpb25zIGFuZCBzaHJpbmsgZXN0aW1hdGVzCi0gRml0IGEgbmVnYXRpdmUgYmlub21pYWwgbW9kZWwgYW5kIHBlcmZvcm0gaHlwb3RoZXNpcyB0ZXN0aW5nIHVzaW5nIFdhbGQgc3RhdGlzdGljcwoKWW91IGNhbiBhbHNvIHJlZmVyIHRvIG91ciBbbWF0ZXJpYWxzIGZyb20gb3VyIHByZXZpb3VzIHdvcmtzaG9wcyBjb3ZlcmluZyBidWxrIFJOQS1zZXFdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL3RyYWluaW5nLW1vZHVsZXMvdHJlZS9tYXN0ZXIvUk5BLXNlcSNyZWFkbWUpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIGBERVNlcWAuCgojIyMjIENyZWF0ZSB0aGUgYERFU2VxRGF0YVNldGAgb2JqZWN0CgpUbyBjcmVhdGUgdGhlIGBERVNlcURhdGFTZXRgIG9iamVjdCB3ZSB3aWxsIG5lZWQgdGhlIHVubm9ybWFsaXplZCBjb3VudHMgbWF0cml4LCB0aGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGVzLCBhbmQgYSBkZXNpZ24gZm9ybXVsYS4KVGhlIGZpcnN0IHR3byBpdGVtcyBhcmUgYWxyZWFkeSBzdG9yZWQgaW4gb3VyIFNDRSBvYmplY3QsIHNvIHdlIGNhbiBjcmVhdGUgYSBgREVTZXFEYXRhU2V0YCBvYmplY3QgZGlyZWN0bHkgZnJvbSB0aGF0IG9iamVjdCB1c2luZyB0aGUgYERFU2VxRGF0YVNldCgpYCBmdW5jdGlvbi4KVGhlIGRlc2lnbiBmb3JtdWxhIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggY29sdW1ucyBvZiB0aGUgbWV0YWRhdGEgbmVlZCB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBERSBjb21wYXJpc29uLgpGb3Igb3VyIGV4cGVyaW1lbnQgd2UgYXJlIGNvbXBhcmluZyBnZW5lIGV4cHJlc3Npb24gYmV0d2VlbiBkaWZmZXJlbnQgUk1TIHN1YnR5cGVzLgpUaGUgc3VidHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGBkaWFnbm9zaXNfZ3JvdXBgIGNvbHVtbiBvZiB0aGUgYGNvbERhdGFgIGluIHRoZSBwc2V1ZG8tYnVsa2VkIFNDRS4KCmBgYHtyIGRlc2VxIG9iamVjdCwgbGl2ZT1UUlVFfQojIHNldCB1cCB0aGUgZGVzZXEgb2JqZWN0LCBncm91cCBieSBkaWFnbm9zaXMKZGVzZXFfb2JqZWN0IDwtIERFU2VxMjo6REVTZXFEYXRhU2V0KHR1bW9yX215b2JsYXN0X3NjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IH4gZGlhZ25vc2lzX2dyb3VwKQpgYGAKClRoZSBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QgY29udGFpbnMgb25seSBvbmUgYXNzYXk6IHRoZSBgY291bnRzYCBhc3NheS4KVGhpcyBpcyBiZWNhdXNlIGBERVNlcTJgIGV4cGVjdHMgcmF3IGNvdW50cy4KV2hlbiB3ZSBydW4gYERFU2VxMmAgb24gb3VyIGRhdGFzZXQsIHJhdyBjb3VudHMgd2lsbCBmaXJzdCBiZSBub3JtYWxpemVkIHVzaW5nIHNpemUgZmFjdG9ycyB0byBhY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiB0b3RhbCBzYW1wbGUgY291bnRzLgpUaGVyZWZvcmUgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgbm9ybWFsaXphdGlvbiBvbiBvdXIgb3duIOKAkyB3ZSdsbCBsZXQgYERFU2VxMmAgZG8gYWxsIHRoZSB3b3JrIGZvciB1cy4KCkhvd2V2ZXIsIGJlZm9yZSB3ZSBkaXZlIGludG8gREUgYW5hbHlzaXMsIHdlIGNhbiBkbyBzb21lIGluaXRpYWwgZXhwbG9yYXRpb24gYW5kIHZpc3VhbGl6YXRpb24gb2Ygb3VyIGRhdGEgdG8gc2VlIGlmIG91ciBzYW1wbGVzIHNlcGFyYXRlIGJ5IG91ciBrbm93biBmYWN0b3Igb2YgaW50ZXJlc3QsIFJNUyBzdWJ0eXBlLgpJbiBwYXJ0aWN1bGFyLCB3ZSBjYW4gdXNlIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSkgb2Ygb3VyIHBzZXVkby1idWxrZWQgZGF0YXNldCB0byB2aXN1YWxpemUgYW55IHZhcmlhdGlvbiBiZXR3ZWVuIHNhbXBsZXMuCklmIHRoZXJlIGlzIHZhcmlhdGlvbiBiZXR3ZWVuIFJNUyBzdWJ0eXBlcywgd2UgZXhwZWN0IHRoZWlyIHJlc3BlY3RpdmUgc2FtcGxlcyB0byBzZXBhcmF0ZSBpbiBQQyBzcGFjZSwgbGlrZWx5IGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzLgpXZSBjYW4gZXZhbHVhdGUgdGhpcyBieSBwbG90dGluZyBQQzEgYW5kIFBDMi4KCkluIG9yZGVyIHRvIGNyZWF0ZSBvdXIgUENBIHBsb3QsIHdlIHdpbGwgZmlyc3QgbmVlZCB0byBub3JtYWxpemUgb3VyIGRhdGEgdG8gYWNjb3VudCBmb3IgYW55IHRlY2huaWNhbCB2YXJpYXRpb25zIGFjcm9zcyBzYW1wbGVzLgpBcyBhIHJlbWluZGVyLCB0aGlzIGlzIE5PVCByZXF1aXJlZCBmb3IgcnVubmluZyBgREVTZXEyYCBhbmFseXNpczsgd2UgYXJlIGp1c3QgdXNpbmcgaXQgdG8gdmlzdWFsaXplIG91ciBkYXRhIHByaW9yIHRvIERFIGFuYWx5c2lzLgoKYGBge3Igbm9ybWFsaXplfQojIGVzdGltYXRlIHNpemUgZmFjdG9ycyBmaXJzdApkZXNlcV9vYmplY3QgPC0gREVTZXEyOjplc3RpbWF0ZVNpemVGYWN0b3JzKGRlc2VxX29iamVjdCkKCiMgbm9ybWFsaXplIGFuZCBsb2cgdHJhbnNmb3JtIHRvIHVzZSBmb3IgdmlzdWFsaXphdGlvbgpub3JtYWxpemVkX29iamVjdCA8LSBERVNlcTI6OnJsb2coZGVzZXFfb2JqZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaW5kID0gVFJVRSkKbm9ybWFsaXplZF9vYmplY3QKYGBgCgpXZSBub3cgaGF2ZSBhIG5vcm1hbGl6ZWQgYW5kIHRyYW5zZm9ybWVkIG9iamVjdCB0aGF0IGNhbiBiZSBkaXJlY3RseSBpbnB1dCB0byB0aGUgYERFU2VxMjo6cGxvdFBDQSgpYCBmdW5jdGlvbiwgd2hpY2ggd2lsbCBib3RoIGNhbGN1bGF0ZSBhbmQgcGxvdCB0aGUgUEMgcmVzdWx0cy4KCmBgYHtyIHBsb3RQQ0EsIGxpdmU9VFJVRX0KREVTZXEyOjpwbG90UENBKG5vcm1hbGl6ZWRfb2JqZWN0LCBpbnRncm91cCA9ICJkaWFnbm9zaXNfZ3JvdXAiKQpgYGAKCkFzIGV4cGVjdGVkIHdlIHNlZSB0aGF0IHNhbXBsZXMgZ3JvdXAgdG9nZXRoZXIgYmFzZWQgb24gUk1TIHN1YnR5cGUgYW5kIGFyZSBzZXBhcmF0ZWQgYWxvbmcgdGhlIFBDMSBheGlzLCB0aGUgUEMgY29udHJpYnV0aW5nIHRoZSBoaWdoZXN0IGFtb3VudCBvZiB2YXJpYXRpb24uCgojIyMjIFJ1biBgREVTZXFgCgpXZSdsbCBub3cgdXNlIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBgREVTZXEoKWAgdG8gcGVyZm9ybSBvdXIgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuClRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGVzdGltYXRlcyBnZW5lLXdpc2UgZGlzcGVyc2lvbnMsIGZpdHMgYSBuZWdhdGl2ZSBiaW5vbWlhbCBtb2RlbCBhbmQgcGVyZm9ybXMgaHlwb3RoZXNpcyB0ZXN0aW5nIHVzaW5nIFdhbGQgc3RhdGlzdGljcy4KCmBgYHtyIGRlc2VxLCBsaXZlPVRSVUV9CiMgcnVuIERFU2VxCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxKGRlc2VxX29iamVjdCkKYGBgCgpXZSBjYW4gZXZhbHVhdGUgaG93IHdlbGwgdGhlIG1vZGVsIGZpdCBvdXIgZGF0YSBieSBsb29raW5nIGF0IHRoZSBkaXNwZXJzaW9uIGVzdGltYXRlcy4KV2UgZXhwZWN0IHRvIHNlZSB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMgZGVjcmVhc2UgYXMgbWVhbnMgYXJlIGluY3JlYXNpbmcgYW5kIGZvbGxvdyB0aGUgbGluZSBvZiBiZXN0IGZpdC4gCgpgYGB7ciBwbG90IGRpc3BlcnNpb24sIGxpdmU9VFJVRX0KcGxvdERpc3BFc3RzKGRlc2VxX29iamVjdCkKYGBgCgpOb3cgd2UgY2FuIGV4dHJhY3QgdGhlIHJlc3VsdHMgZnJvbSB0aGUgb2JqZWN0LCBzcGVjaWZ5aW5nIHRoZSBwLXZhbHVlIHRocmVzaG9sZCB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gdXNlLgoKYGBge3IgcmVzdWx0cywgbGl2ZT1UUlVFfQojIGV4dHJhY3QgdGhlIHJlc3VsdHMgYXMgYSBEYXRhRnJhbWUKZGVzZXFfcmVzdWx0cyA8LSBERVNlcTI6OnJlc3VsdHMoZGVzZXFfb2JqZWN0LCBhbHBoYSA9IDAuMDUpCmBgYAoKQnV0IHdlIGFyZW4ndCBkb25lIHlldCEKClRoZSBlc3RpbWF0ZXMgb2YgbG9nMiBmb2xkIGNoYW5nZSBjYWxjdWxhdGVkIGJ5IGBERVNlcSgpYCBhcmUgbm90IGNvcnJlY3RlZCBmb3IgZXhwcmVzc2lvbiBsZXZlbC4KVGhpcyBtZWFucyB0aGF0IHdoZW4gY291bnRzIGFyZSBzbWFsbCwgd2UgYXJlIGxpa2VseSB0byBlbmQgdXAgd2l0aCBzb21lIGxhcmdlIGZvbGQgY2hhbmdlIHZhbHVlcyB0aGF0IG92ZXJlc3RpbWF0ZSB0aGUgdHJ1ZSBleHRlbnQgb2YgdGhlIGNoYW5nZSBiZXR3ZWVuIGNvbmRpdGlvbnMuCgpXZSBjYW4gY29ycmVjdCB0aGlzIGJ5IGFwcGx5aW5nIGEgInNocmlua2FnZSIgcHJvY2VkdXJlLCB3aGljaCB3aWxsIGFkanVzdCBsYXJnZSB2YWx1ZXMgd2l0aCBzbWFsbCBjb3VudHMgZG93bndhcmQsIHdoaWxlIHByZXNlcnZpbmcgdmFsdWVzIHdpdGggbGFyZ2VyIGNvdW50cywgd2hpY2ggYXJlIGxpa2VseSB0byBiZSBtb3JlIGFjY3VyYXRlLgoKVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBsZmNTaHJpbmsoKWAgZnVuY3Rpb24sIGJ1dCBmaXJzdCB3ZSBuZWVkIHRvIGtub3cgdGhlIG5hbWUgYW5kL29yIHBvc2l0aW9uIG9mIHRoZSAiY29lZmZpY2llbnQiIHRoYXQgd2FzIGNhbGN1bGF0ZWQgYnkgYERFU2VxKClgLCB3aGljaCB3ZSBjYW4gZG8gd2l0aCB0aGUgYHJlc3VsdHNOYW1lcygpYCBmdW5jdGlvbi4KCmBgYHtyIGNvZWZmaWNpZW50LCBsaXZlPVRSVUV9CiMgaWRlbnRpZnkgcG9zaXRpb24gb2YgY29lZmZpY2llbnQKREVTZXEyOjpyZXN1bHRzTmFtZXMoZGVzZXFfb2JqZWN0KQpgYGAKCgpgYGB7ciBzaHJpbmthZ2V9CiMgYXBweWx5IGxvZ0ZDIHNocmlua2FnZSB1c2luZyB0aGUgZGVmYXVsdCBtb2RlbApzaHJpbmtfcmVzdWx0cyA8LSBERVNlcTI6OmxmY1NocmluaygKICBkZXNlcV9vYmplY3QsIAogIHJlcyA9IGRlc2VxX3Jlc3VsdHMsIAogIGNvZWYgPSAyLAogIHR5cGUgPSAiYXBlZ2xtIgopCmhlYWQoc2hyaW5rX3Jlc3VsdHMpCmBgYAoKSWYgeW91IGxvb2sgYXQgb3VyIGBzaHJpbmtfcmVzdWx0c2Agb2JqZWN0LCB3ZSBzZWUgdGhhdCB0aGUgZ2VuZXMgYXJlIGxhYmVsZWQgd2l0aCB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzLCBhcyB0aG9zZSB3ZXJlIHRoZSByb3cgbmFtZXMgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIHdlIHVzZWQgYXMgaW5wdXQgdG8gYnVpbGQgb3VyIGBERVNlcTJgIG9iamVjdC4KQWx0aG91Z2ggc29tZSBvZiB1cyBtYXkgaGF2ZSBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIG1lbW9yaXplZCBieSBoZWFydCwgaXQgY2FuIGJlIHVzZWZ1bCB0byBoYXZlIGEgaHVtYW4gcmVhZGFibGUgc3ltYm9sIGluIG91ciByZXN1bHRzLgpCZWZvcmUgd2Ugc2F2ZSB0aGUgcmVzdWx0cyBhcyBhIGZpbGUsIHdlIHdpbGwgZ3JhYiB0aGUgZ2VuZSBzeW1ib2xzIGZyb20gdGhlIGByb3dEYXRhYCBvZiBvdXIgb3JpZ2luYWwgU0NFIG9iamVjdCBhbmQgYWRkIHRoZW0gYXMgYSBuZXcgY29sdW1uLgoKYGBge3IgYWRkIGdlbmUgc3ltYm9sfQpkZXNlcV9yZXN1bHRzIDwtIHNocmlua19yZXN1bHRzIHw+CiAgIyBkaXJlY3RseSBhZGQgRW5zZW1ibCBpZCBhcyBhIGNvbHVtbgogICMgY29udmVydGluZyByZXN1bHRzIGludG8gYSBkYXRhIGZyYW1lCiAgdGliYmxlOjphc190aWJibGUocm93bmFtZXMgPSAiZW5zZW1ibF9pZCIpCgojIGNvbnZlcnQgcm93ZGF0YSB0byBkYXRhIGZyYW1lIApzY2Vfcm93ZGF0YV9kZiA8LSByb3dEYXRhKHR1bW9yX215b2JsYXN0X3NjZSkgfD4KICAjIGNyZWF0ZSBhIGNvbHVtbiB3aXRoIHJvd25hbWVzIHN0b3JlZCBhcyBlbnNlbWJsIGlkCiAgIyB1c2UgZm9yIGpvaW5pbmcgd2l0aCBkZXNlcSByZXN1bHRzCiAgdGliYmxlOjphc190aWJibGUocm93bmFtZXMgPSAiZW5zZW1ibF9pZCIpCgojIGNvbWJpbmUgZGVzZXEgcmVzdWx0cyB3aXRoIHJvd2RhdGEgYnkgZW5zZW1ibCBpZCAKZGVzZXFfcmVzdWx0cyA8LSBkZXNlcV9yZXN1bHRzIHw+CiAgZHBseXI6OmxlZnRfam9pbihzY2Vfcm93ZGF0YV9kZiwgYnkgPSAiZW5zZW1ibF9pZCIpCgpoZWFkKGRlc2VxX3Jlc3VsdHMpCmBgYAoKV2UgY2FuIHNhdmUgdGhlIG5ldyBkYXRhIGZyYW1lIHRoYXQgd2UgaGF2ZSBjcmVhdGVkIHdpdGggdGhlIEVuc2VtYmwgaWRlbnRpZmllcnMsIGdlbmUgc3ltYm9scywgYW5kIHRoZSBgREVTZXEyYCByZXN1bHRzIGFzIGEgdGFiIHNlcGFyYXRlZCAoYHRzdmApIGZpbGUuCgpgYGB7ciBzYXZlIGRlc2VxLCBsaXZlPVRSVUV9CiMgc2F2ZSBvdXIgcmVzdWx0cyBhcyB0c3YKcmVhZHI6OndyaXRlX3RzdihkZXNlcV9yZXN1bHRzLCBkZXNlcV9vdXRwdXRfZmlsZSkKYGBgCgpUaGUgbGFzdCB0aGluZyB0aGF0IHdlIHdpbGwgZG8gaXMgdGFrZSBhIGxvb2sgYXQgaG93IG1hbnkgZ2VuZXMgYXJlIHNpZ25pZmljYW50LgpIZXJlIHdlIHdpbGwgd2FudCB0byB1c2UgdGhlIGFkanVzdGVkIHAtdmFsdWUsIGZvdW5kIGluIHRoZSBgcGFkamAgY29sdW1uIG9mIHRoZSByZXN1bHRzLCBhcyB0aGlzIGFjY291bnRzIGZvciBtdWx0aXBsZSB0ZXN0IGNvcnJlY3Rpb24uCgpgYGB7ciBzaWduaWZpY2FudCByZXN1bHRzLCBsaXZlPVRSVUV9CiMgZmlyc3QgbG9vayBhdCB0aGUgc2lnbmlmaWNhbnQgcmVzdWx0cyAKZGVzZXFfcmVzdWx0c19zaWcgPC0gZGVzZXFfcmVzdWx0cyB8PgogICMgZmlsdGVyIGJhc2VkIG9uIGFkanVzdGVkIHB2YWx1ZQogIGRwbHlyOjpmaWx0ZXIocGFkaiA8PSAwLjA1KQoKaGVhZChkZXNlcV9yZXN1bHRzX3NpZykKYGBgCgoKIyMjIEV4cGxvcmluZyB0aGUgaWRlbnRpZmllZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgCgpOb3cgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBzZXQgb2YgZ2VuZXMgdGhhdCBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGluIHRoZSB0dW1vciBteW9ibGFzdHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHN1YnR5cGVzLCBsZXRzIGFjdHVhbGx5IHRha2UgYSBsb29rIGF0IHRoZW0gYW5kIHNlZSBpZiB3ZSBjYW4gbWFrZSBzb21lIGluZm9ybWF0aXZlIHBsb3RzLgpUaGUgZmlyc3QgcGxvdCB3ZSdsbCBtYWtlIGlzIGEgdm9sY2FubyBwbG90IHVzaW5nIHRoZSBbYEVuaGFuY2VkVm9sY2Fub2AgcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL2tldmluYmxpZ2hlL0VuaGFuY2VkVm9sY2FubykuClRoaXMgcGFja2FnZSBhdXRvbWF0aWNhbGx5IGNvbG9ycyB0aGUgcG9pbnRzIGJ5IGN1dG9mZnMgZm9yIGJvdGggc2lnbmlmaWNhbmNlIGFuZCBmb2xkIGNoYW5nZSBhbmQgbGFiZWxzIG1hbnkgb2YgdGhlIHNpZ25pZmljYW50IGdlbmVzIChzdWJqZWN0IHRvIHNwYWNpbmcpLgpgRW5oYW5jZWRWb2xjYW5vYCBoYXMgbWFueSwgbWFueSBvcHRpb25zLCB3aGljaCBpcyBhIGdvb2QgdGhpbmcgaWYgeW91IGRvbid0IGxpa2UgYWxsIG9mIGl0cyBkZWZhdWx0IHNldHRpbmdzLgpFdmVuIGJldHRlciwgaXQgb3V0cHV0cyBhIGBnZ3Bsb3QyYCBvYmplY3QsIHNvIGlmIHdlIHdhbnQgdG8gY3VzdG9taXplIHRoZSBwbG90IGZ1cnRoZXIsIHdlIGNhbiB1c2UgdGhlIHNhbWUgYGdncGxvdDJgIGNvbW1hbmRzIHdlIGhhdmUgdXNlZCBiZWZvcmUuCgpgYGB7ciB2b2xjYW5vfQpFbmhhbmNlZFZvbGNhbm86OkVuaGFuY2VkVm9sY2FubyhkZXNlcV9yZXN1bHRzLAogICAgICAgICAgICAgICAgeCA9ICdsb2cyRm9sZENoYW5nZScsICMgZm9sZCBjaGFuZ2Ugc3RhdGlzdGljIHRvIHBsb3QKICAgICAgICAgICAgICAgIHkgPSAncHZhbHVlJywgIyBzaWduaWZpY2FuY2UgdmFsdWVzCiAgICAgICAgICAgICAgICBsYWIgPSBkZXNlcV9yZXN1bHRzJGdlbmVfc3ltYm9sLCAjIGxhYmVscyBmb3IgcG9pbnRzCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMWUtMDUsICMgcCB2YWx1ZSBjdXRvZmYgKGRlZmF1bHQpCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsICMgZm9sZCBjaGFuZ2UgY3V0b2ZmIChkZWZhdWx0KQogICAgICAgICAgICAgICAgdGl0bGUgPSBOVUxMLCAjIG5vIHRpdGxlCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IE5VTEwsICMgb3Igc3VidGl0bGUKICAgICAgICAgICAgICAgIGNhcHRpb24gPSBOVUxMLCAjIG9yIGNhcHRpb24KICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwgIyBhZGQgc29tZSBmdW4gYXJyb3dzCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMyAgIyBzbWFsbGVyIGxhYmVscwogICAgICAgICAgICAgICAgKSArCiAgIyBjaGFuZ2UgdGhlIG92ZXJhbGwgdGhlbWUKICB0aGVtZV9idygpICsKICAjIG1vdmUgdGhlIGxlZ2VuZCB0byB0aGUgYm90dG9tCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAoKCldlIGNhbiBhbHNvIHJldHVybiBiYWNrIHRvIHRoZSBTQ0Ugb2JqZWN0IHRoYXQgd2UgdXNlZCB0byBjcmVhdGUgb3VyIHBzZXVkby1idWxrZWQgU0NFIGFuZCBsb29rIGF0IGdlbmUgZXhwcmVzc2lvbiBvZiBzb21lIG9mIHRoZSBzaWduaWZpY2FudCBnZW5lcy4gCldlIGNhbiBjcmVhdGUgVU1BUCBwbG90cyBhcyB3ZSBkaWQgcHJldmlvdXNseSwgYnV0IGluc3RlYWQgb2YgbGFiZWxpbmcgZWFjaCBjZWxsIHdpdGggbWV0YWRhdGEsIHdlIGNhbiBjb2xvciBjZWxscyBieSBhIHNwZWNpZmllZCBnZW5lJ3MgZXhwcmVzc2lvbiBsZXZlbHMuCldlIHdpbGwgYWxzbyB1c2Ugc29tZSBvZiB0aGUgYGdncGxvdDJgIHNraWxscyB3ZSBwaWNrZWQgdXAgZWFybGllciwgbGlrZSBgZmFjZXRfZ3JpZCgpYCB0byBwbG90IGNlbGxzIGZyb20gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcyBzZXBhcmF0ZWx5LgpUaGlzIGNhbiBoZWxwIHVzIHZhbGlkYXRlIHRoZSBgREVTZXEyYCByZXN1bHRzIHNvIHRoYXQgd2UgY2FuIHZpc3VhbGl6ZSBnZW5lIGV4cHJlc3Npb24gY2hhbmdlcyBhY3Jvc3Mgb3VyIGNlbGwgdHlwZSBvZiBpbnRlcmVzdCBvbiBhIHNpbmdsZS1jZWxsIGxldmVsLiAKCmBgYHtyIGV4cHJlc3Npb24gdW1hcCwgbGl2ZT1UUlVFfQojIGZpbHRlciB0byBqdXN0IG15b2JsYXN0IGNlbGxzIGFuZCByZW1vdmUgYW55IE5BJ3MgYmVmb3JlIHBsb3R0aW5nCm15b2JsYXN0X2NvbWJpbmVkX3NjZSA8LSBybXNfc2NlWywgd2hpY2gocm1zX3NjZSRjZWxsdHlwZV9icm9hZCA9PSAiVHVtb3JfTXlvYmxhc3QiKV0KCiMgcGxvdCBQVFBSVCAoRU5TRzAwMDAwMTk2MDkwKSBleHByZXNzaW9uIGluIEFSTVMgdnMuIEVSTVMKc2NhdGVyOjpwbG90UmVkdWNlZERpbShteW9ibGFzdF9jb21iaW5lZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyX2J5ID0gIkVOU0cwMDAwMDE5NjA5MCIsICNQVFBSVAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiZGlhZ25vc2lzX2dyb3VwIikgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkKYGBgCgpJbiB0aGUgYWJvdmUgcGxvdCB3ZSBvbmx5IHBsb3R0ZWQgdGhlIHR1bW9yIG15b2JsYXN0IGNlbGxzIHRoYXQgd2UgdXNlZCBpbiBvdXIgREUgYW5hbHlzaXMuIApIb3dldmVyLCB3ZSBtaWdodCBiZSBpbnRlcmVzdGVkIHRvIHNlZSB0aGUgZXhwcmVzc2lvbiBvZiBnZW5lcyB0aGF0IGFyZSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgaW4gb3RoZXIgY2VsbCB0eXBlcyBwcmVzZW50IGluIG91ciBzYW1wbGVzLgoKYGBge3IgY2VsbHR5cGUgY29tcGFyaXNvbn0KIyBsZXQncyBjb21wYXJlIGdlbmUgZXhwcmVzc2lvbiBhY3Jvc3Mgc29tZSBvdGhlciBjZWxsIHR5cGVzCiMgbG9vayBhdCBhbGwgdHVtb3IgY2VsbHMgYW5kIHBpY2sgb25lIG5vcm1hbCBjZWxsIHR5cGUKY2VsbHR5cGVzIDwtIGMoIlR1bW9yX015b2JsYXN0IiwgCiAgICAgICAgICAgICAgICJUdW1vcl9NZXNvZGVybSIsIAogICAgICAgICAgICAgICAiVHVtb3JfTXlvY3l0ZSIsIAogICAgICAgICAgICAgICAiVmFzY3VsYXIgRW5kb3RoZWxpdW0iKQoKIyBzdWJzZXQgdG8ganVzdCBjZWxsdHlwZXMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbgp0dW1vcl9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgJWluJSBjZWxsdHlwZXMpXQpgYGAKCk5leHQgd2Ugd2lsbCBsb29rIGF0IGEgZmV3IERFIGdlbmVzIHRoYXQgd2UgaWRlbnRpZmllZCwgb25lIHVwIHJlZ3VsYXRlZCBnZW5lIGFuZCBvbmUgZG93biByZWd1bGF0ZWQgZ2VuZSwgYW5kIGNvbXBhcmUgdGhlaXIgZXhwcmVzc2lvbiBpbiBteW9ibGFzdHMgdG8gb3RoZXIgY2VsbCB0eXBlcyBpbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMuCldlIHdpbGwgdXNlIHRoZSBgc2NhdGVyOjpwbG90RXhwcmVzc2lvbigpYCBmdW5jdGlvbiB0byBjcmVhdGUgYSB2aW9saW4gcGxvdCB3aXRoIFJNUyBzdWJ0eXBlIG9uIHRoZSB4LWF4aXMgYW5kIGdlbmUgZXhwcmVzc2lvbiBvbiB0aGUgeS1heGlzLgpXZSBjYW4gY29udGludWUgdXNpbmcgYGZhY2V0X2dyaWQoKWAgdG8gc2hvdyBzZXBhcmF0ZSBwYW5lbHMgZm9yIGVhY2ggY2VsbCB0eXBlLgpCZWNhdXNlIHdlIHdhbnQgdG8gc2hvdyBtdWx0aXBsZSBnZW5lcyBoZXJlLCB3ZSBhcmUgZ29pbmcgdG8gYWRkIGFuIGFkZGl0aW9uYWwgb3B0aW9uIHRvIGBmYWNldF9ncmlkKClgIHRvIGluY2x1ZGUgbXVsdGlwbGUgcm93cyBpbiBvdXIgcGxvdCBncmlkLCBvbmUgZm9yIGVhY2ggZ2VuZSBvZiBpbnRlcmVzdC4KT25lIG5lYXQgdHJpY2sgb2YgdGhlIGBzY2F0ZXI6OnBsb3RFeHByZXNzaW9uKClgIGZ1bmN0aW9uIGlzIHRoYXQgaXQgYWN0dWFsbHkgY3JlYXRlcyBhIGBGZWF0dXJlYCBjb2x1bW4gd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGZlYXR1cmVzIChpbiB0aGlzIGNhc2UgZ2VuZXMpIGJlaW5nIHVzZWQgaW4gcGxvdHRpbmcuCldlIGNhbiB0aGVuIGRpcmVjdGx5IHJlZmVyZW5jZSB0aGF0IGBGZWF0dXJlYCBjb2x1bW4gd2hlbiBwbG90dGluZywgaW5zdGVhZCBvZiB1c2luZyB0aGUgYG90aGVyX2ZpZWxkc2Agb3B0aW9uIHdlIHVzZWQgcHJldmlvdXNseS4KCmBgYHtyIG11bHRpLWdlbmUgcGxvdH0KIyBwaWNrIGEgY291cGxlIGdlbmVzIHRvIGxvb2sgYXQgCmdlbmVzX3RvX3Bsb3QgPC0gYygiRU5TRzAwMDAwMTk2MDkwIiwgI1BUUFJUCiAgICAgICAgICAgICAgICAgICAiRU5TRzAwMDAwMTQ4OTM1IikgI0dBUzIKCiMgY3JlYXRlIGEgdmlvbGluIHBsb3QgCnNjYXRlcjo6cGxvdEV4cHJlc3Npb24odHVtb3Jfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICMgYSB2ZWN0b3Igb2YgZ2VuZXMgdG8gcGxvdAogICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gZ2VuZXNfdG9fcGxvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJkaWFnbm9zaXNfZ3JvdXAiLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJfYnkgPSAiZGlhZ25vc2lzX2dyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiY2VsbHR5cGVfYnJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAwLjEpICsKICAjIGVhY2ggY2VsbHR5cGUgaXMgaXRzIG93biBjb2x1bW4KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGNlbGx0eXBlX2Jyb2FkKSwKICAgICAgICAgICAgICMgZWFjaCBmZWF0dXJlIChnZW5lKSBpcyBpdHMgb3duIHJvdwogICAgICAgICAgICAgcm93cyA9IHZhcnMoRmVhdHVyZSkpICsgCiAgIyBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiB0aGUgZmFjZXQgbGFiZWxzCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsgCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCgKICAgIHRpdGxlID0gIlN1YnR5cGUiLCAjIHVwZGF0ZSB0aGUgbGVnZW5kIHRpdGxlCiAgICAjIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIGNvbG9ycwogICAgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMywgYWxwaGEgPSAxKSkKICAgICkKYGBgCgpIb3cgZG8gdGhlIGV4cHJlc3Npb24gb2YgdGhlc2UgZ2VuZXMgY2hhbmdlIGFjcm9zcyBjZWxsIHR5cGVzIGFuZCBSTVMgc3VidHlwZXM/CgpHbyBhaGVhZCBhbmQgZXhwbG9yZSBzb21lIGdlbmVzIG9uIHlvdXIgb3duISAKRmVlbCBmcmVlIHRvIHBsb3QgYW55IG9mIHRoZSBnZW5lcyB0aGF0IGFyZSBpZGVudGlmaWVkIGFzIHNpZ25pZmljYW50LCBmb3VuZCBpbiB0aGUgREUgcmVzdWx0cyB0YWJsZSwgb3IgeW91ciBmYXZvcml0ZSBnZW5lLgpSZW1lbWJlciwgeW91IG5lZWQgdG8gdXNlIHRoZSBFbnNlbWJsIGdlbmUgaWRlbnRpZmllciB0byByZWZlciB0byBlYWNoIGdlbmUuCgpgYGB7ciBleHBsb3JlfQojIG5vdyBkbyBzb21lIGV4cGxvcmF0aW9uIG9mIG90aGVyIGdlbmVzIG9uIHlvdXIgb3duISAKYGBgCgojIyBQcmludCBzZXNzaW9uIGluZm8gCgpgYGB7ciBzZXNzaW9uIGluZm99CnNlc3Npb25JbmZvKCkKYGBgCgo=</div> +<div id="rmd-source-code">LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMgZm9yIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6ICJEYXRhIExhYiBmb3IgQUxTRiIKZGF0ZTogMjAyMwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIE9iamVjdGl2ZXMgCgpUaGlzIG5vdGVib29rIHdpbGwgZGVtb25zdHJhdGUgaG93IHRvOgoKLSBVc2UgcHNldWRvLWJ1bGtpbmcgdG8gcHJlcGFyZSBzY1JOQS1zZXEgbGlicmFyaWVzIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgotIFBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCB0aGUgYERFU2VxMmAgcGFja2FnZQotIFVzZSBgZ2dwbG90MmAgYW5kIGBFbmhhbmNlZFZvbGNhbm9gIHRvIHZpc3VhbGl6ZSBnZW5lIGV4cHJlc3Npb24gY2hhbmdlcyBhY3Jvc3MgY2VsbCB0eXBlcyBhbmQgc2FtcGxlcwoKLS0tCgpKdXN0IGxpa2UgYnVsayBSTkEtc2VxLCBpdCBpcyBsaWtlbHkgdGhhdCBvbmUgb2YgdGhlIGdvYWxzIHdoZW4gcGVyZm9ybWluZyBzY1JOQS1zZXEgd2lsbCBiZSB0byBjb21wYXJlIHRoZSBnZW5lIGV4cHJlc3Npb24gb2YgbXVsdGlwbGUgc2FtcGxlcyB0byBlYWNoIG90aGVyLgpVbmxpa2UgYnVsayBSTkEtc2VxIGFuYWx5c2lzLCBzY1JOQS1zZXEgYW5hbHlzaXMgYWxsb3dzIHVzIHRvIGlkZW50aWZ5IGFuZCBhbm5vdGF0ZSBjZWxsIHR5cGVzIG9yIHN1YnBvcHVsYXRpb25zIG9mIGNlbGxzIHByZXNlbnQgaW4gZWFjaCBvZiBvdXIgc2FtcGxlcy4KVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBhY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiBjZWxsIHR5cGUgY29tcG9zaXRpb24gYWNyb3NzIHNhbXBsZXMgYW5kIHNwZWNpZmljYWxseSBmb2N1cyBvbiBjZWxsIHR5cGVzIG9yIHBvcHVsYXRpb25zIG9mIGludGVyZXN0IHdoZW4gcGVyZm9ybWluZyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiAoREUpIGFuYWx5c2lzLgpJbiB0aGlzIG5vdGVib29rLCB3ZSB3aWxsIHdvcmsgd2l0aCBtdWx0aXBsZSBzYW1wbGVzIHRvIGlkZW50aWZ5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBhY3Jvc3MgY2VsbCB0eXBlcyBvZiBpbnRlcmVzdCB1c2luZyB0aGUgW2BERVNlcTJgXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvMy4xNi9iaW9jL2h0bWwvREVTZXEyLmh0bWwpIHBhY2thZ2UuIAoKIVtTaW5nbGUtY2VsbCByb2FkbWFwOiBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbl0oZGlhZ3JhbXMvcm9hZG1hcF9kaWZmZXJlbnRpYWxfZXhwcmVzc2lvbi5wbmcpCgpXZSB3aWxsIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCBzYW1wbGVzIGZyb20gdGhlIFtgU0NQQ1AwMDAwMDVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMDUpLCBhbiBpbnZlc3RpZ2F0aW9uIG9mIHBlZGlhdHJpYyBzb2xpZCB0dW1vcnMgbGVkIGJ5IHRoZSBEeWVyIGFuZCBDaGVuIGxhYnMgYXQgU3QuIEp1ZGUgQ2hpbGRyZW4ncyBSZXNlYXJjaCBIb3NwaXRhbC4KVGhpcyBwYXJ0aWN1bGFyIGRhdGFzZXQgY29udGFpbnMgMTAgZGlmZmVyZW50IHNhbXBsZXMgdGhhdCBoYXZlIGJlZW4gaW50ZWdyYXRlZCB1c2luZyBgZmFzdE1OTmAsIGZvbGxvd2luZyB0aGUgc2FtZSBwcm9jZWR1cmUgd2Ugb3V0bGluZWQgaW4gYDAzLWRhdGFzZXRfaW50ZWdyYXRpb24uUm1kYC4KVGhlc2UgMTAgc2FtcGxlcyByZXByZXNlbnQgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiByaGFiZG9teW9zYXJjb21hIChSTVMpOiBlbWJyeW9uYWwgcmhhYmRvbXlvc2FyY29tYSAoRVJNUykgYW5kIGFsdmVvbGFyIHJoYWJkb215b3NhcmNvbWEgKEFSTVMpLgpUaGVzZSB0d28gc3VidHlwZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBgUEFYMy9QQVg3LUZPWE8xYCBmdXNpb24gZ2VuZSwgd2hpY2ggaXMgcHJlc2VudCBvbmx5IGluIEFSTVMgcGF0aWVudHMuCkFkZGl0aW9uYWxseSwgY2VsbHMgZm91bmQgaW4gQVJNUyB0dW1vcnMgdGVuZCB0byBoYXZlIGFuIGluY3JlYXNlZCBtdXRhdGlvbmFsIGJ1cmRlbiB3aXRoIGNlbGxzIGluIGEgbW9yZSBkaWZmZXJlbnRpYXRlZCBzdGF0ZSBjb21wYXJlZCB0byBFUk1TIHR1bW9yIGNlbGxzIChbU2hlcm4gX2V0IGFsLl8gMjAxNF0oaHR0cHM6Ly9kb2kub3JnLzEwLjExNTgvMjE1OS04MjkwLkNELTEzLTA2MzkpOyBbU3Rld2FydCBfZXQgYWwuXyAyMDE4XShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmNjZWxsLjIwMTguMDcuMDEyKSkuClJNUyB0dW1vcnMsIHJlZ2FyZGxlc3Mgb2Ygc3VidHlwZSwgYXJlIG1hZGUgdXAgb2YgY2VsbHMgdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBkZXZlbG9wbWVudCBvZiBza2VsZXRhbCBtdXNjbGU6IG1lc29kZXJtLCBteW9ibGFzdHMsIGFuZCBteW9jeXRlcyAoW1NlYmlyZSBhbmQgTWFsb25lIDIwMDNdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTM2L2pjcC41Ni42LjQxMikpLgpbUGF0ZWwgX2V0IGFsLl8gKDIwMjIpXShodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmRldmNlbC4yMDIyLjA0LjAwMykgdGVzdGVkIHRoZSBoeXBvdGhlc2lzIHRoYXQgY2VsbCB0eXBlcyBoYXZlIGRpc3RpbmN0IGdlbmUgZXhwcmVzc2lvbiBwYXR0ZXJucyBpbiBBUk1TIHZzLiBFUk1TIHNhbXBsZXMuCkhlcmUgd2Ugd2lsbCBsb29rIGF0IGEgc3Vic2V0IG9mIHRoZSBzYW1wbGVzIHRoZXkgc2VxdWVuY2VkIGFuZCBpZGVudGlmeSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gdHVtb3IgY2VsbHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMuCgojIyBTZXQgdXAKCmBgYHtyIHNldHVwLCBtZXNzYWdlPUZBTFNFfQojIHNldCBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMjAyMikKCiMgbG9hZCBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKSAjIHBsb3R0aW5nIGZ1bmN0aW9ucwpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KSAKCiMgcGFja2FnZSB1c2VkIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcwpsaWJyYXJ5KERFU2VxMikKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIGZpbGVzCgpXZSB3aWxsIHN0YXJ0IGJ5IHJlYWRpbmcgaW4gYSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggdGhlIHVuY29ycmVjdGVkIChtZXJnZWQgYnV0IG5vdCBpbnRlZ3JhdGVkKSBhbmQgY29ycmVjdGVkIChpbnRlZ3JhdGVkKSBnZW5lIGV4cHJlc3Npb24gZGF0YSBmb3IgYWxsIDEwIHNhbXBsZXMuCgpQcmlvciB0byBpbnRlZ3JhdGlvbiwgYWxsIDEwIHNhbXBsZXMgd2VudCB0aHJvdWdoIHRoZSBzYW1lIGZpbHRlcmluZywgbm9ybWFsaXphdGlvbiwgYW5kIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4KVGhlc2UgMTAgc2FtcGxlcyB3ZXJlIHRoZW4gbWVyZ2VkIGludG8gb25lIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0IGZvbGxvd2luZyB0aGUgc2FtZSBzdGVwcyBvdXRsaW5lZCBpbiBgMDMtZGF0YXNldF9pbnRlZ3JhdGlvbi5SbWRgLgpUaGUgbWVyZ2VkIG9iamVjdCB3YXMgdGhlbiBpbnRlZ3JhdGVkIHdpdGggYGZhc3RNTk5gIHRvIG9idGFpbiBhIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gYXNzYXkgYW5kIGNvcnJlY3RlZCByZWR1Y2VkIGRpbWVuc2lvbmFsaXR5IHJlc3VsdHMuClRoZSBmaW5hbCBTQ0Ugb2JqZWN0IHdhcyBzdG9yZWQgaW4gYGRhdGEvcm1zL2ludGVncmF0ZWQvcm1zX2FsbF9zY2UucmRzYC4KCldlIGFsc28gaGF2ZSBwcm92aWRlZCBhIG1ldGFkYXRhIGZpbGUsIGBkYXRhL3Jtcy9hbm5vdGF0aW9ucy9ybXNfc2FtcGxlX21ldGFkYXRhLnRzdmAsIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gZnJvbSBlYWNoIHNhbXBsZSwgc3VjaCBhcyBkaWFnbm9zaXMsIHNleCwgYWdlLCBldGMuCkVhY2ggcm93IGluIHRoaXMgZmlsZSBjb3JyZXNwb25kcyB0byBhIHNhbXBsZSBmb3VuZCBpbiB0aGUgaW50ZWdyYXRlZCBTQ0Ugb2JqZWN0LgoKVG8gYmVnaW4sIGxldCdzIHNldCB1cCBvdXIgZGlyZWN0b3JpZXMgYW5kIGZpbGVzOgoKYGBge3IgZmlsZXBhdGhzfQojIHNldCB1cCBmaWxlIHBhdGhzIAojIGRhdGEgZGlyZWN0b3J5IGZvciBSTVMgZGF0YQpkYXRhX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAicm1zIikKCiMgaW50ZWdyYXRlZCBmaWxlIGNvbnRhaW5pbmcgc2FtcGxlcyB0byB1c2UgZm9yIERFIGFuYWx5c2lzCmludGVncmF0ZWRfc2NlX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVncmF0ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19hbGxfc2NlLnJkcyIpCgojIHNhbXBsZSBtZXRhZGF0YSB0byBzZXQgdXAgREUgYW5hbHlzaXMKc2FtcGxlX21ldGFkYXRhX2ZpbGUgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm5vdGF0aW9ucyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19zYW1wbGVfbWV0YWRhdGEudHN2IikKCiMgZGlyZWN0b3J5IHRvIHN0b3JlIG91dHB1dApkZXNlcV9kaXIgPC0gZmlsZS5wYXRoKCJhbmFseXNpcyIsICJybXMiLCAiZGVzZXEiKQpmczo6ZGlyX2NyZWF0ZShkZXNlcV9kaXIpCgojIHJlc3VsdHMgZmlsZSB0byBvdXRwdXQgZnJvbSBERSBhbmFseXNpcwpkZXNlcV9vdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgoZGVzZXFfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybXNfbXlvYmxhc3RfZGVzZXFfcmVzdWx0cy50c3YiKQoKIyBvdXRwdXQgaW50ZWdyYXRlZCBzY2Ugb2JqZWN0Cm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ3JhdGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJtc19zdWJzZXRfc2NlLnJkcyIpCmBgYAoKV2UgY2FuIGdvIGFoZWFkIGFuZCByZWFkIGluIHRoZSBTQ0Ugb2JqZWN0IGFuZCB0aGUgbWV0YWRhdGEgZmlsZS4KCmBgYHtyIHJlYWQgZmlsZXMsIGxpdmU9VFJVRX0KIyByZWFkIGluIHRoZSBTQ0Ugb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbnRlZ3JhdGVkCmludGVncmF0ZWRfc2NlIDwtIHJlYWRyOjpyZWFkX3JkcyhpbnRlZ3JhdGVkX3NjZV9maWxlKQoKIyByZWFkIGluIHNhbXBsZSBtZXRhZGF0YSBmaWxlIApzYW1wbGVfbWV0YWRhdGEgPC0gcmVhZHI6OnJlYWRfdHN2KHNhbXBsZV9tZXRhZGF0YV9maWxlKQpgYGAKCiMjIERhdGFzZXQgZXhwbG9yYXRpb24KCkJlZm9yZSB3ZSBkaXZlIGludG8gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24sIGxldCdzIGV4cGxvcmUgb3VyIGludGVncmF0ZWQgU0NFIG9iamVjdCBhbmQgdGhlIGRhdGFzZXQgYSBsaXR0bGUgbW9yZS4KCldlJ2xsIHN0YXJ0IGJ5IGxvb2tpbmcgYXQgd2hhdCdzIGluc2lkZSB0aGUgb2JqZWN0LgpIZXJlIHdlIHNob3VsZCBoYXZlIGJvdGggdGhlIG9yaWdpbmFsICh1bmNvcnJlY3RlZCkgZGF0YSBhbmQgdGhlIGludGVncmF0ZWQgKGNvcnJlY3RlZCkgZGF0YSBmb3IgYm90aCB0aGUgZ2VuZSBleHByZXNzaW9uIGFuZCB0aGUgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSByZXN1bHRzLgpIb3cgYXJlIHRob3NlIHN0b3JlZCBpbiBvdXIgb2JqZWN0PwoKYGBge3IgcHJpbnQgc2NlLCBsaXZlPVRSVUV9CiMgcHJpbnQgb3V0IGVudGlyZSBvYmplY3QKaW50ZWdyYXRlZF9zY2UKYGBgCgoKYGBge3IgcHJpbnQgYXNzYXkgbmFtZXMsIGxpdmU9VFJVRX0KIyBsb29rIGF0IHRoZSBhc3NheSBuYW1lcyBpbiBvdXIgb2JqZWN0CmFzc2F5TmFtZXMoaW50ZWdyYXRlZF9zY2UpCmBgYAoKV2hlbiB3ZSBsb29rIGF0IHRoZSBhc3NheSBuYW1lcyB3ZSBzaG91bGQgc2VlIHRoYXQgdGhlcmUgYXJlIDMgbWF0cmljZXMsIGBjb3VudHNgLCBgbG9nY291bnRzYCwgYW5kIGBmYXN0bW5uX2NvcnJlY3RlZGAuIApUaGUgYGNvdW50c2AgYW5kIGBsb2djb3VudHNgIGFzc2F5cyBjb3JyZXNwb25kIHRvIHRoZSB1bmNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gZGF0YSB0aGF0IGhhcyBiZWVuIG1lcmdlZCBidXQgTk9UIGludGVncmF0ZWQuClRoZSBgZmFzdG1ubl9jb3JyZWN0ZWRgIGRhdGEgY29udGFpbnMgdGhlIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gZGF0YSBvYnRhaW5lZCBmcm9tIGludGVncmF0aW9uLiAKRm9yIHRoaXMgZXhlcmNpc2Ugd2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIGBmYXN0bW5uX2NvcnJlY3RlZGAgZGF0YSAobW9yZSBvbiB3aHkgbm90IG9uY2Ugd2UgZ2V0IHRvIHNldHRpbmcgdXAgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uKSwgYnV0IHdlIG5lZWQgdG8gYmUgYXdhcmUgdGhhdCBpdCBpcyBwcmVzZW50IGFuZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gb3VyIHVuY29ycmVjdGVkIGRhdGEuIAoKCmBgYHtyIHByaW50IHJlZHVjZWREaW0gbmFtZXMsIGxpdmU9VFJVRX0KIyBsb29rIGF0IHRoZSBuYW1lcyBvZiB0aGUgZGltZW5zaW9uIHJlZHVjdGlvbnMKcmVkdWNlZERpbU5hbWVzKGludGVncmF0ZWRfc2NlKQpgYGAKCkluIHRoZSBgcmVkdWNlZERpbWAgc2xvdHMgeW91IHNob3VsZCBzZWUgYFBDQWAgYW5kIGBVTUFQYCwgd2hpY2ggd2VyZSBib3RoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY29tYmluZWQgZGF0YSBfYmVmb3JlXyBpbnRlZ3JhdGlvbi4KWW91IHNob3VsZCBhbHNvIHNlZSBgZmFzdG1ubl9QQ0FgIGFuZCBgZmFzdG1ubl9VTUFQYCByZWR1Y2VkIGRpbWVuc2lvbnMsIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGludGVncmF0ZWQgcmVzdWx0cy4KCiMjIyBDZWxsIHR5cGUgYW5ub3RhdGlvbnMKCkp1c3QgbGlrZSBpbiB0aGUgaW50ZWdyYXRpb24gbm90ZWJvb2ssIHRoaXMgZGF0YXNldCBhbHNvIGNvbnRhaW5zIHRoZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgZm91bmQgaW4gdGhlIGBjZWxsdHlwZV9maW5lYCBhbmQgYGNlbGx0eXBlX2Jyb2FkYCBjb2x1bW5zIG9mIHRoZSBgY29sRGF0YWAuClRoZXNlIGNlbGwgdHlwZXMgd2VyZSBvcmlnaW5hbGx5IGFzc2lnbmVkIGluIFtQYXRlbCBfZXQgYWwuXyAoMjAyMildKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouZGV2Y2VsLjIwMjIuMDQuMDAzKS4KV2Ugd2lsbCB1c2UgdGhlc2UgY2VsbCB0eXBlIGFzc2lnbm1lbnRzIHRvIHNldCB1cCB0aGUgREUgYW5hbHlzaXMgYmVsb3csIGJ1dCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgZm9yIERFIGFuYWx5c2lzIGl0c2VsZi4KSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IERFIGFuYWx5c2lzIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBzdWJwb3B1bGF0aW9uIG9mIGludGVyZXN0IHRoYXQgaXMgc2hhcmVkIGFjcm9zcyBzYW1wbGVzIGJlc2lkZXMganVzdCBjZWxsIHR5cGVzLgoKQmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gYmUgZG9pbmcgREUgYW5hbHlzaXMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMsIGxldCdzIHN0YXJ0IGJ5IGxhYmVsaW5nIGNlbGxzIGluIHRoZSBpbnRlZ3JhdGVkIGRhdGFzZXQgYmFzZWQgb24gdGhlaXIgUk1TIHN1YnR5cGUuClRvIGRvIHRoaXMgd2Ugd2lsbCBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgc3VidHlwZSBpcyBwcmVzZW50IGluIHRoZSBgY29sRGF0YWAgb2YgdGhlIGludGVncmF0ZWQgU0NFIG9iamVjdC4KSWYgaXQncyBub3QgdGhlcmUsIHdlIG5lZWQgdG8gYWRkIGl0IGluLgoKYGBge3IgY29sZGF0YSBoZWFkLCBsaXZlPVRSVUV9CiMgbG9vayBhdCB0aGUgaGVhZCBvZiB0aGUgY29sZGF0YQpoZWFkKGNvbERhdGEoaW50ZWdyYXRlZF9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKClVoIG9oLCBpdCBsb29rcyBsaWtlIHRoZSBSTVMgc3VidHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIFNDRSBvYmplY3QuCkZvcnR1bmF0ZWx5IHdlIGFsc28gaGF2ZSB0aGUgc2FtcGxlIG1ldGFkYXRhIHRhYmxlIHRoYXQgd2UgcmVhZCBpbiBlYXJsaWVyLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBzYW1wbGVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQuCgpgYGB7ciBzYW1wbGUgbWV0YWRhdGEsIGxpdmU9VFJVRX0KIyBwcmludCBvdXQgc2FtcGxlIG1ldGFkYXRhCmhlYWQoc2FtcGxlX21ldGFkYXRhKQpgYGAKCkxvb2tpbmcgYXQgdGhpcyBzYW1wbGUgdGFibGUsIHdlIHNlZSBhIGNvbHVtbiBuYW1lZCBgc3ViZGlhZ25vc2lzYCB3aGljaCBhY2NvdW50cyBmb3IgdGhlIFJNUyBzdWJ0eXBlLCBBUk1TIG9yIEVSTVMuCldlIGFsc28gc2VlIG90aGVyIGNvbHVtbnMgdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3BlY2lmaWMgc2FtcGxlLgoKV2UgY2FuIGluY29ycG9yYXRlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHNhbXBsZSBtZXRhZGF0YSB0YWJsZSBpbnRvIHRoZSBgY29sRGF0YWAgb2YgdGhlIGludGVncmF0ZWQgU0NFIG9iamVjdC4KVGhpcyB3aWxsIGFsbG93IHVzIHRvIG1hdGNoIGVhY2ggb2YgdGhlIHNhbXBsZXMgaW4gdGhlIFNDRSBvYmplY3Qgd2l0aCB0aGUgUk1TIHN1YnR5cGUgYW5kIGFsc28gYWxsb3cgdXMgdG8gdXNlIGFueSBvZiB0aGUgY29sdW1ucyBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhIGZvciBwbG90dGluZy4KCmBgYHtyIG1vZGlmeSBjb2xkYXRhfQojIGFkZCBzYW1wbGUgbWV0YWRhdGEgdG8gY29sRGF0YSBmcm9tIHRoZSBpbnRlZ3JhdGVkIFNDRSBvYmplY3QKY29sZGF0YV9kZiA8LSBjb2xEYXRhKGludGVncmF0ZWRfc2NlKSB8PgogICMgY29udmVydCBmcm9tIERhdGFGcmFtZSB0byBkYXRhLmZyYW1lCiAgYXMuZGF0YS5mcmFtZSgpIHw+CiAgIyBtZXJnZSB3aXRoIHNhbXBsZSBtZXRhZGF0YSAKICBkcGx5cjo6bGVmdF9qb2luKHNhbXBsZV9tZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gImxpYnJhcnlfaWQiKSkgfD4KICAjIGNyZWF0ZSBuZXcgY29sdW1ucwogICMgY2VsbF9pZCBpcyBhIGNvbWJpbmF0aW9uIG9mIGJhcmNvZGUgYW5kIHNhbXBsZQogIGRwbHlyOjptdXRhdGUoY2VsbF9pZCA9IGdsdWU6OmdsdWUoIntzYW1wbGV9LXtiYXJjb2RlfSIpLAogICAgICAgICAgICAgICAgIyBzaW1wbGlmeSBzdWJkaWFnbm9zaXMKICAgICAgICAgICAgICAgIGRpYWdub3Npc19ncm91cCA9IGZvcmNhdHM6OmZjdF9yZWNvZGUoCiAgICAgICAgICAgICAgICAgIHN1YmRpYWdub3NpcywKICAgICAgICAgICAgICAgICAgIkFSTVMiID0gIkFsdmVvbGFyIHJoYWJkb215b3NhcmNvbWEiLAogICAgICAgICAgICAgICAgICAiRVJNUyIgPSAiRW1icnlvbmFsIHJoYWJkb215b3NhcmNvbWEiCiAgICAgICAgICAgICAgICApKQoKIyBhZGQgbW9kaWZpZWQgZGF0YSBmcmFtZSBiYWNrIHRvIFNDRSBhcyBEYXRhRnJhbWUKY29sRGF0YShpbnRlZ3JhdGVkX3NjZSkgPC0gRGF0YUZyYW1lKGNvbGRhdGFfZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gY29sZGF0YV9kZiRjZWxsX2lkKQpgYGAKCk5vdyB3aGVuIHdlIGxvb2sgYXQgdGhlIGBjb2xEYXRhYCBvZiB0aGUgU0NFIG9iamVjdCB3ZSBzaG91bGQgc2VlIG5ldyBjb2x1bW5zLCBpbmNsdWRpbmcgdGhlIGBkaWFnbm9zaXNfZ3JvdXBgIGNvbHVtbiB3aGljaCBpbmRpY2F0ZXMgaWYgZWFjaCBjZWxsIGNvbWVzIGZyb20gYW4gRVJNUyBvciBBUk1TIHNhbXBsZS4KCmBgYHtyIHByaW50IG5ldyBjb2xkYXRhLCBsaXZlPVRSVUV9CiMgdGFrZSBhIGxvb2sgYXQgdGhlIG5ldyBtb2RpZmllZCBjb2xEYXRhCmhlYWQoY29sRGF0YShpbnRlZ3JhdGVkX3NjZSkpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKIyMjIFBsb3R0aW5nIHdpdGggYW5ub3RhdGlvbnMKCldlIGNhbiBub3cgdXNlIHRoYXQgY29sdW1uIHRvIGxhYmVsIGFueSBVTUFQIHBsb3RzIChvciBvdGhlciBwbG90IHR5cGVzKSB0aGF0IHdlIG1ha2UuCkluIHRoZSBjaHVuayBiZWxvdyB3ZSB3aWxsIHN0YXJ0IGJ5IHRha2luZyBhIGxvb2sgYXQgb3VyIGludGVncmF0aW9uIHJlc3VsdHMgYW5kIGNvbG9yIG91ciBjZWxscyBieSBSTVMgc3VidHlwZS4KCioqUmVtaW5kZXI6IFlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgYmF0Y2gtY29ycmVjdGVkIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiByZXN1bHRzIGZvciB2aXN1YWxpemluZyBkYXRhc2V0cyBjb250YWluaW5nIG11bHRpcGxlIGxpYnJhcmllcyBvciBzYW1wbGVzLioqCgpgYGB7ciBkaWFnbm9zaXMgZ3JvdXAgVU1BUCwgbGl2ZT1UUlVFfQojIFVNQVAgb2YgYWxsIHNhbXBsZXMsIHNlcGFyYXRpbmcgYnkgZGlhZ25vc2lzIGdyb3VwCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfYnkgPSAiZGlhZ25vc2lzX2dyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjIpIApgYGAKCkludGVyZXN0aW5nbHksIGl0IGxvb2tzIGxpa2Ugc2FtcGxlcyBmcm9tIHRoZSBBUk1TIGFuZCBFUk1TIHN1YnR5cGVzIHRlbmQgdG8gZ3JvdXAgd2l0aCBzYW1wbGVzIG9mIHRoZSBzYW1lIHN1YnR5cGUgcmF0aGVyIHRoYW4gYWxsIHRvZ2V0aGVyLiAKCkluIHRoZSBpbnRlZ3JhdGlvbiBub3RlYm9vayB3ZSBhbHNvIGxvb2tlZCBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNlbGwgdHlwZXMgYWZ0ZXIgaW50ZWdyYXRpb24uCkluIHRoYXQgbm90ZWJvb2ssIHdlIGRpc2N1c3NlZCB0aGF0IGNlbGxzIG9mIHRoZSBzYW1lIGNlbGwgdHlwZSBhcmUgZXhwZWN0ZWQgdG8gaW50ZWdyYXRlIHdpdGggb3RoZXIgY2VsbHMgb2YgdGhlIHNhbWUgdHlwZS4KSXMgdGhhdCB0aGUgY2FzZSB3aXRoIHRoaXMgZGF0YXNldD8KCkEgd29yZCBvZiBjYXV0aW9uIHdoZW4gZXZhbHVhdGluZyB0aGUgY2VsbCB0eXBlIHJlc3VsdHMgZm9yIHRoaXMgZGF0YXNldDogVGhlIGNlbGwgdHlwZXMgZm9yIHRoaXMgZGF0YXNldCB3ZXJlIGFzc2lnbmVkIGluIGEgdHdvIHN0YWdlIHByb2Nlc3MgYXMgZGVzY3JpYmVkIGluIFtQYXRlbCBfZXQgYWwuXyAoMjAyMildKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouZGV2Y2VsLjIwMjIuMDQuMDAzKS4KVGhlIGZpcnN0IHN0YWdlIGFzc2lnbmVkIGNlbGxzIGFzIHR1bW9yIG9yIG5vbi10dW1vci4KVGhlIG5leHQgc3RhZ2UgZnVydGhlciBjbGFzc2lmaWVkIHR1bW9yIGNlbGxzIGludG8gb25lIG9mIHRocmVlIHR5cGVzIG9mIHR1bW9yIGNlbGxzOiBteW9ibGFzdCwgbXlvY3l0ZSwgb3IgbWVzb2Rlcm0uClNvbWUgc2FtcGxlcyBjb3VsZCBub3QgYmUgZnVydGhlciBjbGFzc2lmaWVkLCBzbyBhbGwgb2YgdGhlaXIgdHVtb3IgY2VsbHMgYXJlIGRlbm90ZWQgYFR1bW9yYC4KVGhlIHNhbXBsZXMgd2hpY2ggY291bGQgYmUgZnVydGhlciBjbGFzc2lmaWVkIGhhdmUgYSBtaXggb2YgYFR1bW9yX01lc29kZXJtYCwgYFR1bW9yX015b2JsYXN0YCwgYW5kIGBUdW1vcl9NeW9jeXRlYC4KCmBgYHtyIGNlbGx0eXBlIFVNQVB9CiMgVU1BUCBvZiBhbGwgc2FtcGxlcyBsYWJlbGVkIGJ5IGNlbGwgdHlwZQpzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKGludGVncmF0ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgZWFjaCBwb2ludCBieSBjZWxsIHR5cGUKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZT0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCkKYGBgCgpVbmxpa2Ugd2l0aCB0aGUgcHJldmlvdXMgZGF0YXNldHMgd2UgaGF2ZSBzZWVuIHdoZXJlIGFsbCBjZWxscyBvZiB0aGUgc2FtZSBjZWxsIHR5cGUgYWx3YXlzIGdyb3VwZWQgdG9nZXRoZXIsIHRoaXMgZGF0YXNldCBzaG93cyBzb21lIHNsaWdodGx5IGRpZmZlcmVudCBwYXR0ZXJucyBhbmQgbm90IGFsbCBjZWxscyBvZiB0aGUgc2FtZSBjZWxsIHR5cGUgY2x1c3RlciB0b2dldGhlci4KT25lIHJlYXNvbiBpcyB0aGF0IHR1bW9yIGRhdGEgY2FuIGJlIGhldGVyb2dlbmVvdXMgYW5kIGV2ZXJ5IHR1bW9yIGlzIHVuaXF1ZS4KRGVwZW5kaW5nIG9uIHRoZSB0dW1vciB0eXBlIHdlIG1heSBub3QgZXhwZWN0IGV2ZXJ5IHNhbXBsZSB0byBpbnRlZ3JhdGUgcGVyZmVjdGx5IGFuZCBtb3JlIGhldGVyb2dlbmVvdXMgdHVtb3IgdHlwZXMgd2lsbCBiZSBtb3JlIGRpZmZpY3VsdCB0byBpbnRlZ3JhdGUgdG9nZXRoZXIuCkluIHRoaXMgcGFydGljdWxhciBjYXNlIHdlIGFyZSBsb29raW5nIGF0IHR3byBzdWJ0eXBlcyBvZiBSTVMgdGhhdCBoYXZlIGRpc3RpbmN0IG11dGF0aW9uIGJ1cmRlbnMgYW5kIGRpZmZlcmVudGlhdGlvbiBzdGF0ZXMsIHNvIGl0J3MgbGlrZWx5IHRoYXQgdGhvc2UgZGlmZmVyZW5jZXMgY29udHJpYnV0ZSB0byBob3cgd2VsbCB0aGV5IGludGVncmF0ZS4KClRvIGV4cGxvcmUgd2hldGhlciBjZWxscyBhcmUgZ3JvdXBpbmcgdG9nZXRoZXIgYm90aCBieSBjZWxsIHR5cGUgYW5kIGJ5IFJNUyBzdWJ0eXBlLCB3ZSBjYW4gY3JlYXRlIGEgcGxvdCB0aGF0IGluY29ycG9yYXRlcyBib3RoIHBpZWNlcyBvZiBtZXRhZGF0YS4KV2Ugd2lsbCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYGZhY2V0X2dyaWQoKWAgZnVuY3Rpb24gZnJvbSBgZ2dwbG90MmAgdG8gbG9vayBhdCB0d28gdmFyaWFibGVzIGluIHRoZSBgY29sRGF0YWAgYXQgb25jZSAtIHRoZSBjZWxsIHR5cGUgYW5kIHRoZSBzdWJkaWFnbm9zaXMuCkluIHRoZSBiZWxvdyBwbG90IHdlIHdpbGwgY29sb3Igb3VyIGNlbGxzIGJ5IGNlbGwgdHlwZSB3aGlsZSBhbHNvIHVzaW5nIGBmYWNldF9ncmlkKClgIHNvIHRoYXQgY2VsbHMgZnJvbSBkaWZmZXJlbnQgc3ViZGlhZ25vc2VzIHdpbGwgYmUgaW4gdGhlaXIgb3duIHBsb3QgcGFuZWwuCgpgYGB7ciBjZWxsdHlwZSBzdWJkaWFnbm9zaXMgVU1BUCwgbGl2ZT1UUlVFfQojIFVNQVAgb2YgYWxsIHNhbXBsZXMKIyBzZXBhcmF0aW5nIGJ5IGRpYWdub3NpcyBncm91cCBhbmQgbGFiZWxpbmcgY2VsbCB0eXBlCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0oaW50ZWdyYXRlZF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcmVkID0gImZhc3Rtbm5fVU1BUCIsCiAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBlYWNoIHBvaW50IGJ5IGNlbGwgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gImNlbGx0eXBlX2Jyb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICMgdGVsbCBzY2F0ZXIgdG8gdXNlIGRpYWdub3Npc19ncm91cCBmb3IgcGxvdHRpbmcKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiZGlhZ25vc2lzX2dyb3VwIikgKwogICMgaW5jbHVkZSBlYWNoIGRpYWdub3NpcyBncm91cCBhcyBpdHMgb3duIGNvbHVtbgogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkKYGBgCgpBcyBleHBlY3RlZCwgd2Ugc2VlIHRoYXQgY2VsbCB0eXBlcyBhcmUgc2VwYXJhdGVkLCBtb3N0IGxpa2VseSBkdWUgdG8gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcy4KCldlIGNhbiBhbHNvIHVzZSBhIHN0YWNrZWQgYmFycGxvdCB0byBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgY2VsbCB0eXBlcyBhY3Jvc3MgZWFjaCBzYW1wbGUsIHdoaWNoIHdpbGwgcmVxdWlyZSBhIGJpdCBvZiB3cmFuZ2xpbmcgZmlyc3QuCgpgYGB7ciBjZWxsdHlwZSBiYXJwbG90fQojIGZpbHRlciBjb2xkYXRhIHRvIG9ubHkgaW5jbHVkZSB0dW1vciBjZWxscwp0dW1vcl9jZWxsc19kZiA8LSBjb2xkYXRhX2RmIHw+CiAgIyBmaW5kIHJvd3Mgd2hlcmUgdGhlIGNlbGwgdHlwZSBuYW1lIGNvbnRhaW5zIHRoZSBzdHJpbmcgIlR1bW9yIgogIGRwbHlyOjpmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjZWxsdHlwZV9icm9hZCwgIlR1bW9yIikpCgojIGNyZWF0ZSBhIHN0YWNrZWQgYmFycGxvdApnZ3Bsb3QodHVtb3JfY2VsbHNfZGYsIGFlcyh4ID0gc2FtcGxlLCBmaWxsID0gY2VsbHR5cGVfYnJvYWQpKSArIAogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogICAgbGFicygKICAgICAgeCA9ICJTYW1wbGUiLAogICAgICB5ID0gIlByb3BvcnRpb24gb2YgY2VsbHMiLCAKICAgICAgZmlsbCA9ICJDZWxsIHR5cGUiCiAgICApICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41KSkrCiAgIyBmYWNldCBieSBkaWFnbm9zaXMgZ3JvdXAgCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhkaWFnbm9zaXNfZ3JvdXApLCAKICAgICAgICAgICAgICMgb25seSBzaG93IG5vbi1OQSB2YWx1ZXMgb24geC1heGlzCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94IiwKICAgICAgICAgICAgIHNwYWNlID0gImZyZWVfeCIpCmBgYAoKU2ltaWxhciB0byB0aGUgVU1BUCwgdGhpcyBwbG90IHNob3dzIHRoYXQgQVJNUyBhbmQgRVJNUyBzaGFyZSBhIGxvdCBvZiB0aGUgc2FtZSBjZWxsIHR5cGVzLgoKV2UgYWxzbyBzZWUgdGhhdCBvbmx5IDYgb2YgdGhlc2UgbGlicmFyaWVzIGhhdmUgdHVtb3IgY2VsbHMgdGhhdCBoYXZlIGJlZW4gZnVydGhlciBjbGFzc2lmaWVkIGludG8gbWVzb2Rlcm0sIG15b2JsYXN0LCBhbmQgbXlvY3l0ZS4gCjMgbGlicmFyaWVzIGNvbnRhaW4gY2VsbHMgdGhhdCBhcmUgb25seSBjbGFzc2lmaWVkIGFzIHR1bW9yIG9yIG5vbi10dW1vciwgYW5kIHR1bW9yIGNlbGxzIGFyZSBub3QgZnVydGhlciBjbGFzc2lmaWVkLCBhbmQgdGhlIHJlbWFpbmluZyBsaWJyYXJ5IGlzIG5vdCBldmVuIHByZXNlbnQgaW4gb3VyIHBsb3QgYmVjYXVzZSBpdCB3YXMgbm90IGFzc2lnbmVkIGFueSBjZWxsIHR5cGVzIChhbGwgYXJlIGBOQWApLgpXZSB3aWxsIGNvbnRpbnVlIG91ciBhbmFseXNpcyBvbmx5IHVzaW5nIHRoZSA2IGxpYnJhcmllcyB3aXRoIGZ1bGx5IGNsYXNzaWZpZWQgY2VsbCB0eXBlcywgcmVtb3ZpbmcgdGhlIG90aGVyIDQgYmVmb3JlIHdlIHByb2NlZWQgd2l0aCBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbi4KCiMjIyBGaWx0ZXJpbmcgc2FtcGxlcwoKVGhlIHJlYXNvbiB3ZSB3YW50IHRvIHBhcmUgZG93biBvdXIgbGlzdCBvZiBzYW1wbGVzIHRvIGNvbnNpZGVyIGlzIHRoYXQgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgY2VsbCB0eXBlcyAob3Igc3VicG9wdWxhdGlvbnMpIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gYXJlIHByZXNlbnQgaW4gYWxsIHNhbXBsZXMgaW5jbHVkZWQgaW4gb3VyIERFIGFuYWx5c2lzLiAKV2Ugd2FudCB0byByZW1vdmUgYW55IHNhbXBsZXMgdGhhdCBkbyBub3QgY29udGFpbiBvdXIgY2VsbCBwb3B1bGF0aW9uKHMpIG9mIGludGVyZXN0IGFzIHRoZXkgaGF2ZSBubyBjb3VudHMgdG8gY29udHJpYnV0ZSB0byB0aGUgREUgYW5hbHlzaXMuCgpgYGB7ciBzdWJzZXQgc2NlfQojIGRlZmluZSBzYW1wbGVzIHRvIGtlZXAKbGlicmFyeV9pZHMgPC0gYygKICAiU0NQQ0wwMDA0NzkiLAogICJTQ1BDTDAwMDQ4MCIsCiAgIlNDUENMMDAwNDgxIiwKICAiU0NQQ0wwMDA0ODQiLAogICJTQ1BDTDAwMDQ4OCIsCiAgIlNDUENMMDAwNDkxIgopCgojIHN1YnNldCBzY2UgdG8gb25seSBjb250YWluIHNhbXBsZXMgb2YgaW50ZXJlc3QgCnNhbXBsZXNfdG9fa2VlcCA8LSBpbnRlZ3JhdGVkX3NjZSRzYW1wbGUgJWluJSBsaWJyYXJ5X2lkcwpybXNfc2NlIDwtIGludGVncmF0ZWRfc2NlWywgc2FtcGxlc190b19rZWVwXQoKIyBwcmludCBvdXQgb3VyIG5ldyBTQ0UgCnJtc19zY2UKYGBgCgpCZWZvcmUgd2UgbW92ZSBvbiwgd2UnbGwgcmVtb3ZlIHRoZSBvcmlnaW5hbCBpbnRlZ3JhdGVkIG9iamVjdCBmcm9tIG91ciBlbnZpcm9ubWVudCB0byBzYXZlIHNvbWUgbWVtb3J5LiAKCmBgYHtyIHJlbW92ZSBzY2V9CnJtKGludGVncmF0ZWRfc2NlKQpgYGAKCldlIHdpbGwgYWxzbyBzYXZlIG91ciBuZXcgb2JqZWN0IGluIGNhc2Ugd2Ugd2FudCB0byB1c2UgaXQgZm9yIG90aGVyIGFuYWx5c2lzIGxhdGVyIG9uLgoKYGBge3Igc2F2ZSBzY2V9CiMgd3JpdGUgUkRTIGZpbGUgd2l0aCBjb21wcmVzc2lvbgpyZWFkcjo6d3JpdGVfcmRzKHJtc19zY2UsIGZpbGUgPSBvdXRwdXRfc2NlX2ZpbGUsIGNvbXByZXNzID0gImd6IikKYGBgCgpXZSBub3cgaGF2ZSBhbiB1cGRhdGVkIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyA2IHNhbXBsZXMgdGhhdCB3ZXJlIG9idGFpbmVkIGZyb20gYSBtaXggb2YgQVJNUyBhbmQgRVJNUyBwYXRpZW50cy4KV2UgY2FuIHRoZW4gYXNrIHRoZSBxdWVzdGlvbiwgZG8gc3BlY2lmaWMgdHVtb3IgY2VsbCB0eXBlcyBjb250YWluIHNldHMgb2YgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzYW1wbGVzPwoKV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpb2xvZ2ljYWwgcmVwbGljYXRlcyBmcm9tIGVhY2ggZ3JvdXAgdG8gc2V0IHVwIG91ciBleHBlcmltZW50LiAKSXQgaXMgaW1wZXJhdGl2ZSB0byBjb25zaWRlciBnb29kIGV4cGVyaW1lbnRhbCBkZXNpZ24gYW5kIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpb2xvZ2ljYWwgcmVwbGljYXRlcyAoYXQgbGVhc3QgMyBmb3IgZWFjaCBncm91cCkgd2hlbiBwZXJmb3JtaW5nIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMuCgpJZiB3ZSBsb29rIGJhY2sgYXQgb3VyIHN0YWNrZWQgYmFycGxvdCB3ZSBzZWUgdGhhdCB3ZSBwaWNrZWQgMyBBUk1TIGFuZCAzIEVSTVMgc2FtcGxlcy4KV2UgY2FuIGFsc28gc2VlIHRoYXQgdGhlIG1ham9yaXR5IG9mIGNlbGxzIGFyZSB0dW1vciBjZWxscywgaW4gcGFydGljdWxhciB0aGUgbGFyZ2VzdCBwb3B1bGF0aW9uIG9mIGNlbGxzIGFwcGVhcnMgdG8gYmUgdGhlIGBUdW1vcl9NeW9ibGFzdGAuIApGb3IgdGhpcyBleGFtcGxlIHdlIHdpbGwgZm9jdXMgb24gaWRlbnRpZnlpbmcgREUgZ2VuZXMgaW4gdGhlc2UgYFR1bW9yX015b2JsYXN0YCBjZWxscywgYnV0IHRoZSBwcmluY2lwbGVzIGFwcGxpZWQgYmVsb3cgY2FuIGJlIGFwcGxpZWQgdG8gYW55IGNlbGwgdHlwZXMgb3Igc3VicG9wdWxhdGlvbnMgb2YgaW50ZXJlc3QuCgojIyBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcwoKTm93IHdlIGFyZSByZWFkeSB0byBzdGFydCBwcmVwYXJpbmcgZm9yIG91ciBERSBhbmFseXNpcywgd2hlcmUgd2Ugd2lsbCBjb21wYXJlIHRoZSBnZW5lIGV4cHJlc3Npb24gb2YgdHVtb3IgbXlvYmxhc3QgY2VsbHMgYmV0d2VlbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMuCgpUaHJvdWdob3V0IHRoZSBub3RlYm9vayB3ZSBoYXZlIGJlZW4gd29ya2luZyB3aXRoIGFuIGludGVncmF0ZWQgZGF0YXNldCB0aGF0IGNvbnRhaW5zIGNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gZGF0YSAoYGZhc3Rtbm5fY29ycmVjdGVkYCBhc3NheSkgYW5kIGEgY29ycmVjdGVkIFVNQVAuCkFzIGEgcmVtaW5kZXIsIHRoZSB1bmNvcnJlY3RlZCBnZW5lIGV4cHJlc3Npb24gZGF0YSwgZm91bmQgaW4gdGhlIGBjb3VudHNgIGFuZCBgbG9nY291bnRzYCBhc3NheXMsIGNvcnJlc3BvbmQgdG8gZGF0YSB0aGF0IGhhcyBiZWVuIG1lcmdlZCAodGhlIGZpcnN0IHN0ZXAgd2Ugd2Fsa2VkIHRocm91Z2ggcHJpb3IgdG8gaW50ZWdyYXRpb24pIGludG8gdGhlIHNhbWUgU0NFIGJ1dCBub3QgeWV0IGludGVncmF0ZWQuCldlIGRvIG5vdCB3YW50IHRvIHVzZSBjb3JyZWN0ZWQgZ2VuZSBleHByZXNzaW9uIHZhbHVlcyBmb3IgZGlmZmVyZW50aWFsIGV4cHJlc3Npb247IGBERVNlcTJgIGV4cGVjdHMgdGhlIG9yaWdpbmFsIHJhdyBjb3VudHMgYXMgaW5wdXQgc28gd2Ugd2lsbCBiZSB1c2luZyBkYXRhIGZvdW5kIGluIHRoZSBgY291bnRzYCBhc3NheSBvZiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QuIAoKSXQgaXMgYWR2aXNlZCB0byBvbmx5IHVzZSB0aGUgY29ycmVjdGVkIHZhbHVlcyBmb3IgYW55IGFuYWx5c2VzIGJlaW5nIHBlcmZvcm1lZCBhdCB0aGUgY2VsbCBsZXZlbCwgZS5nLiwgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLgpJbiBjb250cmFzdCwgaXQgaXMgbm90IGFkdmlzZWQgdG8gdXNlIGNvcnJlY3RlZCB2YWx1ZXMgZm9yIGFueSBhbmFseXNlcyB0aGF0IGFyZSBnZW5lLWJhc2VkLCBzdWNoIGFzIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9yIG1hcmtlciBnZW5lIGRldGVjdGlvbiwgYmVjYXVzZSB3aXRoaW4tYmF0Y2ggYW5kIGJldHdlZW4tYmF0Y2ggZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2VzIGFyZSBubyBsb25nZXIgcHJlc2VydmVkLgpUaGUgcmVhc29uIGZvciB0aGlzIGlzIHR3by1mb2xkIOKAkyBtYW55IG9mIHRoZSBERSBtb2RlbHMgd2lsbCBleHBlY3QgdW5jb3JyZWN0ZWQgY291bnRzIGJlY2F1c2UgdGhleSB3aWxsIGFjY291bnQgZm9yIGJldHdlZW4tc2FtcGxlIHZhcmlhdGlvbiB3aXRoaW4gdGhlIG1vZGVsLCBhbmQgd2Ugd2FudCB0byBlbnN1cmUgd2UgYXJlIHByZXNlcnZpbmcgdmFyaWF0aW9uIHRoYXQgaXMgcHJlc2VudCBzbyBhcyBub3QgdG8gYXJ0aWZpY2lhbGx5IGluZmxhdGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwb3B1bGF0aW9ucy4KU2VlIHRoZSBbT1NDQSBjaGFwdGVyIG9uIFVzaW5nIHRoZSBjb3JyZWN0ZWQgdmFsdWVzXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xNi9PU0NBLm11bHRpc2FtcGxlL3VzaW5nLWNvcnJlY3RlZC12YWx1ZXMuaHRtbCN1c2luZy1jb3JyZWN0ZWQtdmFsdWVzKSBmb3IgbW9yZSBpbnNpZ2h0LgoKIyMjIFBzZXVkby1idWxraW5nIAoKQmVmb3JlIHdlIGNhbiBjb21wYXJlIHRoZSBnZW5lIGV4cHJlc3Npb24gcHJvZmlsZXMgb2YgbXlvYmxhc3RzIGluIEFSTVMgdnMuIEVSTVMgc2FtcGxlcywgd2Ugd2lsbCBuZWVkIHRvICJwc2V1ZG8tYnVsayIgdGhlIGdlbmUgY291bnRzLiAKUHNldWRvLWJ1bGtpbmcgY3JlYXRlcyBhIG5ldyBjb3VudHMgbWF0cml4IHRoYXQgY29udGFpbnMgdGhlIHN1bSBvZiB0aGUgY291bnRzIGZyb20gYWxsIGNlbGxzIHdpdGggYSBnaXZlbiBsYWJlbCAoZS5nLiwgY2VsbCB0eXBlKSBmb3IgZWFjaCBzYW1wbGUgKFtUdW5nIF9ldCBhbC5fIDIwMTddKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3NyZXAzOTkyMSkpLiAKSWYgd2Ugd2VyZSB0byBrZWVwIGVhY2ggY2VsbCdzIGNvdW50cyBzZXBhcmF0ZSwgdGhleSB3b3VsZCBiZSB0cmVhdGVkIGFzIHJlcGxpY2F0ZXMsIGxlYWRpbmcgdG8gaW5mbGF0ZWQgc3RhdGlzdGljcy4gCkJ5IHBzZXVkby1idWxraW5nIGZpcnN0LCB3ZSB3aWxsIG5vdyBoYXZlIG9uZSBjb3VudCBmb3IgZWFjaCBnZW5lIGZvciBlYWNoIHNhbXBsZSBhbmQgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHdlbGwtZXN0YWJsaXNoZWQgbWV0aG9kcyBmb3IgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCBidWxrIFJOQS1zZXEuCgpQc2V1ZG8tYnVsa2luZyBpcyBpbXBsZW1lbnRlZCBwcmlvciB0byBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBvbiBzaW5nbGUtY2VsbCBkYXRhIGJlY2F1c2UgaXQ6IAoKLSBQcm9kdWNlcyBsYXJnZXIgYW5kIGxlc3Mgc3BhcnNlIGNvdW50cywgd2hpY2ggYWxsb3dzIHVzIHRvIHVzZSBzdGFuZGFyZCBub3JtYWxpemF0aW9uIGFuZCBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBtZXRob2RzIHVzZWQgYnkgYnVsayBSTkEtc2VxLiAKLSBDb2xsYXBzZXMgZ2VuZSBleHByZXNzaW9uIGNvdW50cyBieSBzYW1wbGUsIHNvIHRoYXQgc2FtcGxlcywgcmF0aGVyIHRoYW4gY2VsbHMsIHJlcHJlc2VudCByZXBsaWNhdGVzLgotIE1hc2tzIHZhcmlhbmNlIHdpdGhpbiBhIHNhbXBsZSB0byBlbXBoYXNpemUgdmFyaWFuY2UgYWNyb3NzIHNhbXBsZXMuClRoaXMgY2FuIGJlIGJvdGggZ29vZCBhbmQgYmFkISAKTWFza2luZyBpbnRyYS1zYW1wbGUgdmFyaWF0aW9uIG1lYW5zIHlvdSBtaWdodCBub3QgaWRlbnRpZnkgZ2VuZXMgd2hlcmUgYXZlcmFnZSBleHByZXNzaW9uIGRvZXNuJ3QgY2hhbmdlIGJldHdlZW4gc2FtcGxlcyBidXQgdGhlIGRlZ3JlZSBvZiBjZWxsLXRvLWNlbGwgdmFyaWF0aW9uIGRvZXMuCgpCZWZvcmUgd2UgYXBwbHkgcHNldWRvLWJ1bGtpbmcgdG8gb3VyIGRhdGFzZXQsIGxldCdzIGxvb2sgYXQgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgcHNldWRvLWJ1bGtpbmcgd29ya3MuCldlJ2xsIHN0YXJ0IGJ5IGNyZWF0aW5nIGEgZmFrZSBtYXRyaXggb2YgY291bnRzLgoKYGBge3IgY3JlYXRlIG1hdHJpeH0KIyBjcmVhdGUgYW4gZXhhbXBsZSBjb3VudHMgbWF0cml4CmNvdW50c19tdHggPC0gbWF0cml4KAogIDE6MTIsIAogIG5jb2wgPSA0LAogIGRpbW5hbWVzID0gbGlzdChjKCJnZW5lQSIsICJnZW5lQiIsICJnZW5lQyIpLAogICAgICAgICAgICAgICAgICBjKCJBLWNlbGwxIiwgIkEtY2VsbDIiLCAiQi1jZWxsMSIsICJCLWNlbGwyIikpCikKY291bnRzX210eApgYGAKCk5leHQgd2Ugd2lsbCBjcmVhdGUgYSBwc2V1ZG8tYnVsa2VkIHZlcnNpb24gb2YgdGhpcyBtYXRyaXggd2l0aCBvbmx5IDIgY29sdW1uczogMSBmb3IgZ3JvdXAgYEFgIGFuZCAxIGZvciBncm91cCBgQmAuClRvIGRvIHRoaXMgd2Ugd2lsbCB1c2UgdGhlIGBEZWxheWVkQXJyYXk6OmNvbHN1bSgpYCBmdW5jdGlvbiwgd2hpY2ggYWxsb3dzIHVzIHRvIHN1bSB0aGUgY291bnRzIGZvciBlYWNoIHJvdyBhY3Jvc3MgZ3JvdXBzIG9mIGNvbHVtbnMuCgpgYGB7ciBwc2V1ZG9idWxrIG1hdHJpeCwgbGl2ZT1UUlVFfQojIGRlZmluZSB0aGUgZ3JvdXAgdGhhdCBlYWNoIGNvbHVtbiBiZWxvbmdzIHRvCmdyb3VwcyA8LSBjKCJBIiwgIkEiLCAiQiIsICJCIikKCiMgc3VtIGNvdW50cyBhY3Jvc3MgY2VsbHMgKGNvbHVtbnMpIGJ5IGdyb3VwIGxhYmVsCnBiX2NvdW50cyA8LSBEZWxheWVkQXJyYXk6OmNvbHN1bShjb3VudHNfbXR4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcykKcGJfY291bnRzICAKYGBgCgpMb29raW5nIGF0IHRoaXMgb3V0cHV0LCB5b3Ugc2hvdWxkIHNlZSB0aGF0IHRoZSBvcmlnaW5hbCA0IGNvbHVtbnMgaGF2ZSBiZWVuIGNvbmRlbnNlZCB0byBvbmx5IDIgY29sdW1uczogMSBjb2x1bW4gdG8gcmVwcmVzZW50IGFsbCBjZWxscyBmcm9tIGdyb3VwIGBBYCwgYW5kIDEgY29sdW1uIHRvIHJlcHJlc2VudCBhbGwgY2VsbHMgZnJvbSBncm91cCBgQmAuCgpOb3cgdGhlIGFjdHVhbCBwc2V1ZG8tYnVsa2luZyBmb3Igb3VyIGRhdGFzZXQhIAoKV2Ugd2lsbCB1c2UgdGhlIFtgc2N1dHRsZTo6YWdncmVnYXRlQWNyb3NzQ2VsbHMoKWAgZnVuY3Rpb25dKGh0dHBzOi8vcmRyci5pby9naXRodWIvTFRMQS9zY3V0dGxlL21hbi9hZ2dyZWdhdGVBY3Jvc3NDZWxscy5odG1sKSB0byBwc2V1ZG8tYnVsayBvdXIgZGF0YXNldC4KVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpbnB1dCBhbiBTQ0Ugb2JqZWN0IGFuZCB0aGUgZ3JvdXBpbmcgYXNzaWdubWVudHMgZm9yIGVhY2ggY2VsbC4KVGhlIG91dHB1dCB3aWxsIGJlIGFuIFNDRSBvYmplY3QgdGhhdCBjb250YWlucyBvbmx5IHRoZSBwc2V1ZG8tYnVsa2VkIGNvdW50cyBmb3IgYWxsIGdlbmVzIGFjcm9zcyBhbGwgc3BlY2lmaWVkIGdyb3VwcywgcmF0aGVyIHRoYW4gYWNyb3NzIGFsbCBjZWxscy4gCldlIGNhbiB0aGVuIHN1YnNldCB0aGlzIFNDRSB0byBqdXN0IGluY2x1ZGUgb3VyIGNlbGwgdHlwZSBvZiBpbnRlcmVzdCAodHVtb3IgbXlvYmxhc3RzKSBmb3IgaW5wdXQgdG8gdGhlIERFIGFuYWx5c2lzLiAKCldlIGNhbiBwc2V1ZG8tYnVsayB1c2luZyBhbnkgZ3JvdXBpbmcgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KRm9yIHJpZ2h0IG5vdywgd2UgYXJlIGludGVyZXN0ZWQgaW4gbG9va2luZyBhdCBnZW5lIGV4cHJlc3Npb24gYWNyb3NzIGNlbGwgdHlwZXMsIHNvIHdlIHdhbnQgdG8gZ3JvdXAgdGhlIHBzZXVkby1idWxrZWQgY291bnRzIG1hdHJpeCBieSBib3RoIGNlbGwgdHlwZSBhbmQgb3JpZ2luYWwgc2FtcGxlLiAKCmBgYHtyIHBzZXVkb2J1bGsgc2NlfQojIGZpcnN0IHN1YnNldCB0aGUgY29sZGF0YSAKIyB0byBvbmx5IGhhdmUgdGhlIGNvbHVtbnMgd2UgY2FyZSBhYm91dCBmb3IgcHNldWRvLWJ1bGtpbmcgCnBiX2dyb3VwcyA8LSBjb2xEYXRhKHJtc19zY2UpWywgYygiY2VsbHR5cGVfYnJvYWQiLCAic2FtcGxlIildCgojIGNyZWF0ZSBhIG5ldyBTQ0Ugb2JqZWN0IHRoYXQgY29udGFpbnMgCiMgdGhlIHBzZXVkby1idWxrZWQgY291bnRzIGFjcm9zcyB0aGUgcHJvdmlkZWQgZ3JvdXBzIApwYl9zY2UgPC0gc2N1dHRsZTo6YWdncmVnYXRlQWNyb3NzQ2VsbHMocm1zX3NjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHBiX2dyb3VwcykKCiMgY29sdW1uIG5hbWVzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBwc2V1ZG8tYnVsa2VkIHNjZSwgCiMgc28gbGV0J3MgYWRkIHRoZW0gaW4gCmNvbG5hbWVzKHBiX3NjZSkgPC0gZ2x1ZTo6Z2x1ZSgKICAie3BiX3NjZSRjZWxsdHlwZV9icm9hZH1fe3BiX3NjZSRzYW1wbGV9IgopCgpwYl9zY2UKYGBgCgpIb3cgZG9lcyB0aGUgbmV3IHBzZXVkby1idWxrZWQgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBsb29rIGRpZmZlcmVudD8gCkhvdyBtYW55IGNvbHVtbnMgZG9lcyBpdCBoYXZlPyAKCkxldCdzIHRha2UgYSBsb29rIGF0IHdoYXQgdGhlIGBjb2xEYXRhYCBsb29rcyBsaWtlIGluIHRoZSBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QuIAoKYGBge3IgcHNldWRvYnVsayBjb2xEYXRhLCBsaXZlPVRSVUV9CiMgbm90ZSB0aGUgbmV3IGNvbHVtbiB3aXRoIG51bWJlciBvZiBjZWxscyBwZXIgZ3JvdXAgCmhlYWQoY29sRGF0YShwYl9zY2UpKSB8PgogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCllvdSBzaG91bGQgc2VlIHRoYXQgY29sdW1ucyBzdWNoIGFzIGBzdW1gLCBgZGV0ZWN0ZWRgLCBgc3Vic2V0c19taXRvX3N1bWAsIGFuZCBvdGhlciBjb2x1bW5zIHRoYXQgdHlwaWNhbGx5IGNvbnRhaW4gcGVyIGNlbGwgUUMgc3RhdGlzdGljcyBub3cgY29udGFpbiBgTkFgIHJhdGhlciB0aGFuIG51bWVyaWMgdmFsdWVzLiAKVGhpcyBpcyBiZWNhdXNlIHRoZXNlIHZhbHVlcyB3ZXJlIGluaXRpYWxseSBjYWxjdWxhdGVkIG9uIGEgcGVyIGNlbGwgbGV2ZWwgKHdlIGRpZCB0aGlzIHVzaW5nIGBzY3V0dGxlOjphZGRQZXJDZWxsUUNNZXRyaWNzKClgKSwgYnV0IHdlIG5vIGxvbmdlciBoYXZlIGEgc2luZ2xlIGNvbHVtbiBwZXIgY2VsbC4KSW5zdGVhZCwgZWFjaCBjb2x1bW4gbm93IHJlcHJlc2VudHMgYSBfZ3JvdXBfIG9mIGNlbGxzLCBpbiB0aGlzIGNhc2UgY29tcHJpc2VkIG9mIGNlbGxzIG9mIGEgZ2l2ZW4gY2VsbCB0eXBlIGFuZCBzYW1wbGUgY29tYmluYXRpb24uClRoZXJlZm9yZSwgdGhlIHZhbHVlcyB0aGF0IHdlIGNhbGN1bGF0ZWQgb24gYSBwZXItY2VsbCBsZXZlbCBhcmUgbm8gbG9uZ2VyIGFwcGxpY2FibGUgdG8gdGhpcyBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QuCgpZb3Ugc2hvdWxkIGFsc28gc2VlIGEgbmV3IGNvbHVtbiB0aGF0IHdhc24ndCBwcmVzZW50IHByZXZpb3VzbHksIHRoZSBgbmNlbGxzYCBjb2x1bW4uClRoaXMgY29sdW1uIHdhcyBhZGRlZCBkdXJpbmcgcHNldWRvLWJ1bGtpbmcgYW5kIGluZGljYXRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNlbGxzIHRoYXQgd2VyZSBzdW1tZWQgdG9nZXRoZXIgdG8gZm9ybSBlYWNoIGNvbHVtbiBvZiB0aGUgU0NFIG9iamVjdC4KCkJlZm9yZSB3ZSBwcm9jZWVkIHdlIHdpbGwgd2FudCB0byBmaWx0ZXIgb3V0IGFueSBjb2x1bW5zIHRoYXQgaGF2ZSBhIGxvdyBudW1iZXIgb2YgY2VsbHMuCkEgbG93IG51bWJlciBvZiBjZWxscyB3aWxsIHVzdWFsbHkgcmVzdWx0IGluIHNtYWxsIGNvdW50cyB0aGF0IGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCB0aGUgc3RhdGlzdGljYWwgYXBwcm94aW1hdGlvbnMgbWFkZSBkdXJpbmcgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuClRoaXMgaXMgZXF1aXZhbGVudCB0byBmaWx0ZXJpbmcgb3V0IGFueSBsaWJyYXJpZXMgaW4gYnVsayBSTkEtc2VxIGFuYWx5c2lzIHRoYXQgaGF2ZSBsb3cgbGlicmFyeSBzaXplcy4KCldlIGNhbiBzZXQgYSB0aHJlc2hvbGQgZm9yIHRoZSBudW1iZXIgb2YgY2VsbHMgcmVxdWlyZWQgdG8gY29udGludWUgd2l0aCBvdXIgYW5hbHlzaXMgYW5kIHJlbW92ZSBhbnkgZ3JvdXBzIHRoYXQgZG8gbm90IG1lZXQgdGhlIG1pbmltdW0gdGhyZXNob2xkLgpIZXJlIHdlIHdpbGwgdXNlIDEwLCBidXQgdGhlIHRocmVzaG9sZCB5b3UgdXNlIGZvciB5b3VyIGRhdGFzZXQgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBjb21wb3NpdGlvbiBvZiBjZWxsIHR5cGVzLgoKYGBge3IgZmlsdGVyIHBzZXVkb2J1bGssIGxpdmU9VFJVRX0KIyByZW1vdmUgYW55IGdyb3VwcyB3aXRoIGZld2VyIHRoYW4gMTAgY2VsbHMKZmlsdGVyX3BiX3NjZSA8LSBwYl9zY2VbLCBwYl9zY2UkbmNlbGxzID49IDEwXQpgYGAKCldlIGNhbiB0aGVuIHRha2UgYSBsb29rIGFuZCBzZWUgaG93IG1hbnkgY2VsbCB0eXBlLXNhbXBsZSBjb2x1bW5zIHdlIHJlbW92ZWQsIGlmIGFueS4KCmBgYHtyIHByaW50IGRpbSwgbGl2ZT1UUlVFfQojIHByaW50IG91dCBkaW1lbnNpb25zIG9mIHVuZmlsdGVyZWQgcHNldWRvYnVsayBzY2UKZGltKHBiX3NjZSkKCiMgZGltZW5zaW9ucyBvZiBmaWx0ZXJlZCBwc2V1ZG9idWxrIHNjZSAKZGltKGZpbHRlcl9wYl9zY2UpCmBgYAoKSXQgbG9va3MgbGlrZSB3ZSBvbmx5IGdvdCByaWQgb2Ygb25lIGdyb3VwLgpXZSBjYW4gZG8gYSBxdWljayBjaGVjayB0byBzZWUgd2hpY2ggZ3JvdXAgd2FzIHJlbW92ZWQgYnkgZmluZGluZyB3aGljaCBjb2x1bW4gaXMgbm8gbG9uZ2VyIHByZXNlbnQgaW4gdGhlIGZpbHRlcmVkIG9iamVjdC4KCmBgYHtyIHJlbW92ZWQgY29sdW1ucywgbGl2ZT1UUlVFfQojIGZpbmQgcmVtb3ZlZCBjb2x1bW5zCnJlbW92ZWRfY29scyA8LSAhKGNvbG5hbWVzKHBiX3NjZSkgJWluJSBjb2xuYW1lcyhmaWx0ZXJfcGJfc2NlKSkKCiMgcHJpbnQgb3V0IG1pc3NpbmcgY29sdW1ucwpjb2xuYW1lcyhwYl9zY2UpW3JlbW92ZWRfY29sc10KYGBgCgpUaGUgbGFzdCBzdGVwIHdlIHdhbnQgdG8gZG8gdG8gcHJlcGFyZSBvdXIgZGF0YXNldCBmb3IgREUgaXMgdG8gc3Vic2V0IHRoZSBwc2V1ZG8tYnVsa2VkIFNDRSBvYmplY3QgdG8gY29udGFpbiBvbmx5IHRoZSBjZWxsIHR5cGUgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjb21wYXJpbmcgYWNyb3NzIHRoZSB0d28gUk1TIHN1YnR5cGVzLgpBcyBtZW50aW9uZWQgcHJldmlvdXNseSwgd2UgYXJlIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgVHVtb3JfTXlvYmxhc3RgIGNlbGwgdHlwZS4KCmBgYHtyIGZpbHRlciBjZWxsdHlwZX0KIyBsb2dpY2FsIHZlY3RvciBpbmRpY2F0aW5nIGlmIGNlbGxzIGFyZSB0dW1vciBteW9ibGFzdCBvciBub3QKbXlvYmxhc3RfY2VsbHMgPC0gZmlsdGVyX3BiX3NjZSRjZWxsdHlwZV9icm9hZCA9PSAiVHVtb3JfTXlvYmxhc3QiCgojIGNyZWF0ZSBhIG5ldyBzY2Ugd2l0aCBvbmx5IHRoZSB0dW1vciBteW9ibGFzdHMKdHVtb3JfbXlvYmxhc3Rfc2NlIDwtIGZpbHRlcl9wYl9zY2VbLCBteW9ibGFzdF9jZWxsc10KYGBgCgpBZnRlciBmaWx0ZXJpbmcgZm9yIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3Qgd2Ugc2hvdWxkIGhhdmUgYSBkYXRhc2V0IHdpdGggNiBjb2x1bW5zLCAxIGZvciBlYWNoIGdyb3VwIG9mIGBUdW1vcl9NeW9ibGFzdGAgY2VsbHMgaW4gZWFjaCBvZiBvdXIgNiBzYW1wbGVzLgoKIyMjIFBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gd2l0aCBgREVTZXEyYAoKTm93IHdlIHdpbGwgdXNlIHRoZSBgREVTZXEyYCBwYWNrYWdlIHRvIHBlcmZvcm0gZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gKERFKSBhbmFseXNpcyBvbiBvdXIgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0LgpGcm9tIHRoaXMgcG9pbnQsIHdlIGNhbiBwcm9jZWVkIGluIHRoZSBzYW1lIHdheSB3ZSB3b3VsZCBpZiB3ZSBoYWQgYSBidWxrIFJOQS1zZXEgZGF0YXNldCB3aXRoIDYgc2FtcGxlcy4KV2Ugd2lsbCBzdGFydCB3aXRoIHRoZSB1bm5vcm1hbGl6ZWQgcmF3IGNvdW50cyBpbiB0aGUgYGNvdW50c2AgYXNzYXkgb2YgdGhlIHBzZXVkby1idWxrZWQgU0NFIGFuZCBkbyB0aGUgZm9sbG93aW5nIHdpdGggYERFU2VxMmA6CgotIENyZWF0ZSBhIGBERVNlcURhdGFTZXRgIG9iamVjdAotIE5vcm1hbGl6ZSBhbmQgbG9nIHRyYW5zZm9ybSB0aGUgY291bnRzIGRhdGEKLSBFc3RpbWF0ZSBkaXNwZXJzaW9ucyBhbmQgc2hyaW5rIGVzdGltYXRlcwotIEZpdCBhIG5lZ2F0aXZlIGJpbm9taWFsIG1vZGVsIGFuZCBwZXJmb3JtIGh5cG90aGVzaXMgdGVzdGluZyB1c2luZyBXYWxkIHN0YXRpc3RpY3MKCllvdSBjYW4gYWxzbyByZWZlciB0byBvdXIgW21hdGVyaWFscyBmcm9tIG91ciBwcmV2aW91cyB3b3Jrc2hvcHMgY292ZXJpbmcgYnVsayBSTkEtc2VxXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS90cmFpbmluZy1tb2R1bGVzL3RyZWUvbWFzdGVyL1JOQS1zZXEjcmVhZG1lKSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBgREVTZXFgLgoKIyMjIyBDcmVhdGUgdGhlIGBERVNlcURhdGFTZXRgIG9iamVjdAoKVG8gY3JlYXRlIHRoZSBgREVTZXFEYXRhU2V0YCBvYmplY3Qgd2Ugd2lsbCBuZWVkIHRoZSB1bm5vcm1hbGl6ZWQgY291bnRzIG1hdHJpeCwgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxlcywgYW5kIGEgZGVzaWduIGZvcm11bGEuClRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGFscmVhZHkgc3RvcmVkIGluIG91ciBTQ0Ugb2JqZWN0LCBzbyB3ZSBjYW4gY3JlYXRlIGEgYERFU2VxRGF0YVNldGAgb2JqZWN0IGRpcmVjdGx5IGZyb20gdGhhdCBvYmplY3QgdXNpbmcgdGhlIGBERVNlcURhdGFTZXQoKWAgZnVuY3Rpb24uClRoZSBkZXNpZ24gZm9ybXVsYSBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIGNvbHVtbnMgb2YgdGhlIG1ldGFkYXRhIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgREUgY29tcGFyaXNvbi4KRm9yIG91ciBleHBlcmltZW50IHdlIGFyZSBjb21wYXJpbmcgZ2VuZSBleHByZXNzaW9uIGJldHdlZW4gZGlmZmVyZW50IFJNUyBzdWJ0eXBlcy4KVGhlIHN1YnR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBgZGlhZ25vc2lzX2dyb3VwYCBjb2x1bW4gb2YgdGhlIGBjb2xEYXRhYCBpbiB0aGUgcHNldWRvLWJ1bGtlZCBTQ0UuCgpgYGB7ciBkZXNlcSBvYmplY3QsIGxpdmU9VFJVRX0KIyBzZXQgdXAgdGhlIGRlc2VxIG9iamVjdCwgZ3JvdXAgYnkgZGlhZ25vc2lzCmRlc2VxX29iamVjdCA8LSBERVNlcTI6OkRFU2VxRGF0YVNldCh0dW1vcl9teW9ibGFzdF9zY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSB+IGRpYWdub3Npc19ncm91cCkKYGBgCgpUaGUgcHNldWRvLWJ1bGtlZCBTQ0Ugb2JqZWN0IGNvbnRhaW5zIG9ubHkgb25lIGFzc2F5OiB0aGUgYGNvdW50c2AgYXNzYXkuClRoaXMgaXMgYmVjYXVzZSBgREVTZXEyYCBleHBlY3RzIHJhdyBjb3VudHMuCldoZW4gd2UgcnVuIGBERVNlcTJgIG9uIG91ciBkYXRhc2V0LCByYXcgY291bnRzIHdpbGwgZmlyc3QgYmUgbm9ybWFsaXplZCB1c2luZyBzaXplIGZhY3RvcnMgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gdG90YWwgc2FtcGxlIGNvdW50cy4KVGhlcmVmb3JlIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IG5vcm1hbGl6YXRpb24gb24gb3VyIG93biDigJMgd2UnbGwgbGV0IGBERVNlcTJgIGRvIGFsbCB0aGUgd29yayBmb3IgdXMuCgpIb3dldmVyLCBiZWZvcmUgd2UgZGl2ZSBpbnRvIERFIGFuYWx5c2lzLCB3ZSBjYW4gZG8gc29tZSBpbml0aWFsIGV4cGxvcmF0aW9uIGFuZCB2aXN1YWxpemF0aW9uIG9mIG91ciBkYXRhIHRvIHNlZSBpZiBvdXIgc2FtcGxlcyBzZXBhcmF0ZSBieSBvdXIga25vd24gZmFjdG9yIG9mIGludGVyZXN0LCBSTVMgc3VidHlwZS4KSW4gcGFydGljdWxhciwgd2UgY2FuIHVzZSBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpIG9mIG91ciBwc2V1ZG8tYnVsa2VkIGRhdGFzZXQgdG8gdmlzdWFsaXplIGFueSB2YXJpYXRpb24gYmV0d2VlbiBzYW1wbGVzLgpJZiB0aGVyZSBpcyB2YXJpYXRpb24gYmV0d2VlbiBSTVMgc3VidHlwZXMsIHdlIGV4cGVjdCB0aGVpciByZXNwZWN0aXZlIHNhbXBsZXMgdG8gc2VwYXJhdGUgaW4gUEMgc3BhY2UsIGxpa2VseSBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4KV2UgY2FuIGV2YWx1YXRlIHRoaXMgYnkgcGxvdHRpbmcgUEMxIGFuZCBQQzIuCgpJbiBvcmRlciB0byBjcmVhdGUgb3VyIFBDQSBwbG90LCB3ZSB3aWxsIGZpcnN0IG5lZWQgdG8gbm9ybWFsaXplIG91ciBkYXRhIHRvIGFjY291bnQgZm9yIGFueSB0ZWNobmljYWwgdmFyaWF0aW9ucyBhY3Jvc3Mgc2FtcGxlcy4KQXMgYSByZW1pbmRlciwgdGhpcyBpcyBOT1QgcmVxdWlyZWQgZm9yIHJ1bm5pbmcgYERFU2VxMmAgYW5hbHlzaXM7IHdlIGFyZSBqdXN0IHVzaW5nIGl0IHRvIHZpc3VhbGl6ZSBvdXIgZGF0YSBwcmlvciB0byBERSBhbmFseXNpcy4KCmBgYHtyIG5vcm1hbGl6ZX0KIyBlc3RpbWF0ZSBzaXplIGZhY3RvcnMgZmlyc3QKZGVzZXFfb2JqZWN0IDwtIERFU2VxMjo6ZXN0aW1hdGVTaXplRmFjdG9ycyhkZXNlcV9vYmplY3QpCgojIG5vcm1hbGl6ZSBhbmQgbG9nIHRyYW5zZm9ybSB0byB1c2UgZm9yIHZpc3VhbGl6YXRpb24Kbm9ybWFsaXplZF9vYmplY3QgPC0gREVTZXEyOjpybG9nKGRlc2VxX29iamVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGluZCA9IFRSVUUpCm5vcm1hbGl6ZWRfb2JqZWN0CmBgYAoKV2Ugbm93IGhhdmUgYSBub3JtYWxpemVkIGFuZCB0cmFuc2Zvcm1lZCBvYmplY3QgdGhhdCBjYW4gYmUgZGlyZWN0bHkgaW5wdXQgdG8gdGhlIGBERVNlcTI6OnBsb3RQQ0EoKWAgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYm90aCBjYWxjdWxhdGUgYW5kIHBsb3QgdGhlIFBDIHJlc3VsdHMuCgpgYGB7ciBwbG90UENBLCBsaXZlPVRSVUV9CkRFU2VxMjo6cGxvdFBDQShub3JtYWxpemVkX29iamVjdCwgaW50Z3JvdXAgPSAiZGlhZ25vc2lzX2dyb3VwIikKYGBgCgpBcyBleHBlY3RlZCB3ZSBzZWUgdGhhdCBzYW1wbGVzIGdyb3VwIHRvZ2V0aGVyIGJhc2VkIG9uIFJNUyBzdWJ0eXBlIGFuZCBhcmUgc2VwYXJhdGVkIGFsb25nIHRoZSBQQzEgYXhpcywgdGhlIFBDIGNvbnRyaWJ1dGluZyB0aGUgaGlnaGVzdCBhbW91bnQgb2YgdmFyaWF0aW9uLgoKIyMjIyBSdW4gYERFU2VxYAoKV2UnbGwgbm93IHVzZSB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gYERFU2VxKClgIHRvIHBlcmZvcm0gb3VyIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzLgpUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgbm9ybWFsaXphdGlvbiBmYWN0b3JzLCBlc3RpbWF0ZXMgZ2VuZS13aXNlIGRpc3BlcnNpb25zLCBmaXRzIGEgbmVnYXRpdmUgYmlub21pYWwgbW9kZWwgYW5kIHBlcmZvcm1zIGh5cG90aGVzaXMgdGVzdGluZyB1c2luZyBXYWxkIHN0YXRpc3RpY3MuCgpgYGB7ciBkZXNlcSwgbGl2ZT1UUlVFfQojIHJ1biBERVNlcQpkZXNlcV9vYmplY3QgPC0gREVTZXEyOjpERVNlcShkZXNlcV9vYmplY3QpCmBgYAoKV2UgY2FuIGV2YWx1YXRlIGhvdyB3ZWxsIHRoZSBtb2RlbCBmaXQgb3VyIGRhdGEgYnkgbG9va2luZyBhdCB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMuCldlIGV4cGVjdCB0byBzZWUgdGhlIGRpc3BlcnNpb24gZXN0aW1hdGVzIGRlY3JlYXNlIGFzIG1lYW5zIGFyZSBpbmNyZWFzaW5nIGFuZCBmb2xsb3cgdGhlIGxpbmUgb2YgYmVzdCBmaXQuIAoKYGBge3IgcGxvdCBkaXNwZXJzaW9uLCBsaXZlPVRSVUV9CnBsb3REaXNwRXN0cyhkZXNlcV9vYmplY3QpCmBgYAoKTm93IHdlIGNhbiBleHRyYWN0IHRoZSByZXN1bHRzIGZyb20gdGhlIG9iamVjdCwgc3BlY2lmeWluZyB0aGUgcC12YWx1ZSB0aHJlc2hvbGQgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHVzZS4KCmBgYHtyIHJlc3VsdHMsIGxpdmU9VFJVRX0KIyBleHRyYWN0IHRoZSByZXN1bHRzIGFzIGEgRGF0YUZyYW1lCmRlc2VxX3Jlc3VsdHMgPC0gREVTZXEyOjpyZXN1bHRzKGRlc2VxX29iamVjdCwgYWxwaGEgPSAwLjA1KQpgYGAKCkJ1dCB3ZSBhcmVuJ3QgZG9uZSB5ZXQhCgpUaGUgZXN0aW1hdGVzIG9mIGxvZzIgZm9sZCBjaGFuZ2UgY2FsY3VsYXRlZCBieSBgREVTZXEoKWAgYXJlIG5vdCBjb3JyZWN0ZWQgZm9yIGV4cHJlc3Npb24gbGV2ZWwuClRoaXMgbWVhbnMgdGhhdCB3aGVuIGNvdW50cyBhcmUgc21hbGwsIHdlIGFyZSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggc29tZSBsYXJnZSBmb2xkIGNoYW5nZSB2YWx1ZXMgdGhhdCBvdmVyZXN0aW1hdGUgdGhlIHRydWUgZXh0ZW50IG9mIHRoZSBjaGFuZ2UgYmV0d2VlbiBjb25kaXRpb25zLgoKV2UgY2FuIGNvcnJlY3QgdGhpcyBieSBhcHBseWluZyBhICJzaHJpbmthZ2UiIHByb2NlZHVyZSwgd2hpY2ggd2lsbCBhZGp1c3QgbGFyZ2UgdmFsdWVzIHdpdGggc21hbGwgY291bnRzIGRvd253YXJkLCB3aGlsZSBwcmVzZXJ2aW5nIHZhbHVlcyB3aXRoIGxhcmdlciBjb3VudHMsIHdoaWNoIGFyZSBsaWtlbHkgdG8gYmUgbW9yZSBhY2N1cmF0ZS4KClRvIGRvIHRoaXMsIHdlIHdpbGwgdXNlIHRoZSBgbGZjU2hyaW5rKClgIGZ1bmN0aW9uLCBidXQgZmlyc3Qgd2UgbmVlZCB0byBrbm93IHRoZSBuYW1lIGFuZC9vciBwb3NpdGlvbiBvZiB0aGUgImNvZWZmaWNpZW50IiB0aGF0IHdhcyBjYWxjdWxhdGVkIGJ5IGBERVNlcSgpYCwgd2hpY2ggd2UgY2FuIGRvIHdpdGggdGhlIGByZXN1bHRzTmFtZXMoKWAgZnVuY3Rpb24uCgpgYGB7ciBjb2VmZmljaWVudCwgbGl2ZT1UUlVFfQojIGlkZW50aWZ5IHBvc2l0aW9uIG9mIGNvZWZmaWNpZW50CkRFU2VxMjo6cmVzdWx0c05hbWVzKGRlc2VxX29iamVjdCkKYGBgCgoKYGBge3Igc2hyaW5rYWdlfQojIGFwcHlseSBsb2dGQyBzaHJpbmthZ2UgdXNpbmcgdGhlIGRlZmF1bHQgbW9kZWwKc2hyaW5rX3Jlc3VsdHMgPC0gREVTZXEyOjpsZmNTaHJpbmsoCiAgZGVzZXFfb2JqZWN0LCAKICByZXMgPSBkZXNlcV9yZXN1bHRzLCAKICBjb2VmID0gMiwKICB0eXBlID0gImFwZWdsbSIKKQpoZWFkKHNocmlua19yZXN1bHRzKQpgYGAKCklmIHlvdSBsb29rIGF0IG91ciBgc2hyaW5rX3Jlc3VsdHNgIG9iamVjdCwgd2Ugc2VlIHRoYXQgdGhlIGdlbmVzIGFyZSBsYWJlbGVkIHdpdGggdGhlIEVuc2VtYmwgZ2VuZSBpZGVudGlmaWVycywgYXMgdGhvc2Ugd2VyZSB0aGUgcm93IG5hbWVzIG9mIHRoZSBwc2V1ZG8tYnVsa2VkIFNDRSB3ZSB1c2VkIGFzIGlucHV0IHRvIGJ1aWxkIG91ciBgREVTZXEyYCBvYmplY3QuCkFsdGhvdWdoIHNvbWUgb2YgdXMgbWF5IGhhdmUgYWxsIG9mIHRoZSBpZGVudGlmaWVycyBtZW1vcml6ZWQgYnkgaGVhcnQsIGl0IGNhbiBiZSB1c2VmdWwgdG8gaGF2ZSBhIGh1bWFuIHJlYWRhYmxlIHN5bWJvbCBpbiBvdXIgcmVzdWx0cy4KQmVmb3JlIHdlIHNhdmUgdGhlIHJlc3VsdHMgYXMgYSBmaWxlLCB3ZSB3aWxsIGdyYWIgdGhlIGdlbmUgc3ltYm9scyBmcm9tIHRoZSBgcm93RGF0YWAgb2Ygb3VyIG9yaWdpbmFsIFNDRSBvYmplY3QgYW5kIGFkZCB0aGVtIGFzIGEgbmV3IGNvbHVtbi4KCmBgYHtyIGFkZCBnZW5lIHN5bWJvbH0KZGVzZXFfcmVzdWx0cyA8LSBzaHJpbmtfcmVzdWx0cyB8PgogICMgZGlyZWN0bHkgYWRkIEVuc2VtYmwgaWQgYXMgYSBjb2x1bW4KICAjIGNvbnZlcnRpbmcgcmVzdWx0cyBpbnRvIGEgZGF0YSBmcmFtZQogIHRpYmJsZTo6YXNfdGliYmxlKHJvd25hbWVzID0gImVuc2VtYmxfaWQiKQoKIyBjb252ZXJ0IHJvd2RhdGEgdG8gZGF0YSBmcmFtZSAKc2NlX3Jvd2RhdGFfZGYgPC0gcm93RGF0YSh0dW1vcl9teW9ibGFzdF9zY2UpIHw+CiAgIyBjcmVhdGUgYSBjb2x1bW4gd2l0aCByb3duYW1lcyBzdG9yZWQgYXMgZW5zZW1ibCBpZAogICMgdXNlIGZvciBqb2luaW5nIHdpdGggZGVzZXEgcmVzdWx0cwogIHRpYmJsZTo6YXNfdGliYmxlKHJvd25hbWVzID0gImVuc2VtYmxfaWQiKQoKIyBjb21iaW5lIGRlc2VxIHJlc3VsdHMgd2l0aCByb3dkYXRhIGJ5IGVuc2VtYmwgaWQgCmRlc2VxX3Jlc3VsdHMgPC0gZGVzZXFfcmVzdWx0cyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oc2NlX3Jvd2RhdGFfZGYsIGJ5ID0gImVuc2VtYmxfaWQiKQoKaGVhZChkZXNlcV9yZXN1bHRzKQpgYGAKCldlIGNhbiBzYXZlIHRoZSBuZXcgZGF0YSBmcmFtZSB0aGF0IHdlIGhhdmUgY3JlYXRlZCB3aXRoIHRoZSBFbnNlbWJsIGlkZW50aWZpZXJzLCBnZW5lIHN5bWJvbHMsIGFuZCB0aGUgYERFU2VxMmAgcmVzdWx0cyBhcyBhIHRhYiBzZXBhcmF0ZWQgKGB0c3ZgKSBmaWxlLgoKYGBge3Igc2F2ZSBkZXNlcSwgbGl2ZT1UUlVFfQojIHNhdmUgb3VyIHJlc3VsdHMgYXMgdHN2CnJlYWRyOjp3cml0ZV90c3YoZGVzZXFfcmVzdWx0cywgZGVzZXFfb3V0cHV0X2ZpbGUpCmBgYAoKVGhlIGxhc3QgdGhpbmcgdGhhdCB3ZSB3aWxsIGRvIGlzIHRha2UgYSBsb29rIGF0IGhvdyBtYW55IGdlbmVzIGFyZSBzaWduaWZpY2FudC4KSGVyZSB3ZSB3aWxsIHdhbnQgdG8gdXNlIHRoZSBhZGp1c3RlZCBwLXZhbHVlLCBmb3VuZCBpbiB0aGUgYHBhZGpgIGNvbHVtbiBvZiB0aGUgcmVzdWx0cywgYXMgdGhpcyBhY2NvdW50cyBmb3IgbXVsdGlwbGUgdGVzdCBjb3JyZWN0aW9uLgoKYGBge3Igc2lnbmlmaWNhbnQgcmVzdWx0cywgbGl2ZT1UUlVFfQojIGZpcnN0IGxvb2sgYXQgdGhlIHNpZ25pZmljYW50IHJlc3VsdHMgCmRlc2VxX3Jlc3VsdHNfc2lnIDwtIGRlc2VxX3Jlc3VsdHMgfD4KICAjIGZpbHRlciBiYXNlZCBvbiBhZGp1c3RlZCBwdmFsdWUKICBkcGx5cjo6ZmlsdGVyKHBhZGogPD0gMC4wNSkKCmhlYWQoZGVzZXFfcmVzdWx0c19zaWcpCmBgYAoKCiMjIyBFeHBsb3JpbmcgdGhlIGlkZW50aWZpZWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIAoKTm93IHRoYXQgd2UgaGF2ZSBpZGVudGlmaWVkIGEgc2V0IG9mIGdlbmVzIHRoYXQgYXJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBpbiB0aGUgdHVtb3IgbXlvYmxhc3RzIGJldHdlZW4gQVJNUyBhbmQgRVJNUyBzdWJ0eXBlcywgbGV0cyBhY3R1YWxseSB0YWtlIGEgbG9vayBhdCB0aGVtIGFuZCBzZWUgaWYgd2UgY2FuIG1ha2Ugc29tZSBpbmZvcm1hdGl2ZSBwbG90cy4KVGhlIGZpcnN0IHBsb3Qgd2UnbGwgbWFrZSBpcyBhIHZvbGNhbm8gcGxvdCB1c2luZyB0aGUgW2BFbmhhbmNlZFZvbGNhbm9gIHBhY2thZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZpbmJsaWdoZS9FbmhhbmNlZFZvbGNhbm8pLgpUaGlzIHBhY2thZ2UgYXV0b21hdGljYWxseSBjb2xvcnMgdGhlIHBvaW50cyBieSBjdXRvZmZzIGZvciBib3RoIHNpZ25pZmljYW5jZSBhbmQgZm9sZCBjaGFuZ2UgYW5kIGxhYmVscyBtYW55IG9mIHRoZSBzaWduaWZpY2FudCBnZW5lcyAoc3ViamVjdCB0byBzcGFjaW5nKS4KYEVuaGFuY2VkVm9sY2Fub2AgaGFzIG1hbnksIG1hbnkgb3B0aW9ucywgd2hpY2ggaXMgYSBnb29kIHRoaW5nIGlmIHlvdSBkb24ndCBsaWtlIGFsbCBvZiBpdHMgZGVmYXVsdCBzZXR0aW5ncy4KRXZlbiBiZXR0ZXIsIGl0IG91dHB1dHMgYSBgZ2dwbG90MmAgb2JqZWN0LCBzbyBpZiB3ZSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgcGxvdCBmdXJ0aGVyLCB3ZSBjYW4gdXNlIHRoZSBzYW1lIGBnZ3Bsb3QyYCBjb21tYW5kcyB3ZSBoYXZlIHVzZWQgYmVmb3JlLgoKYGBge3Igdm9sY2Fub30KRW5oYW5jZWRWb2xjYW5vOjpFbmhhbmNlZFZvbGNhbm8oZGVzZXFfcmVzdWx0cywKICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCAjIGZvbGQgY2hhbmdlIHN0YXRpc3RpYyB0byBwbG90CiAgICAgICAgICAgICAgICB5ID0gJ3B2YWx1ZScsICMgc2lnbmlmaWNhbmNlIHZhbHVlcwogICAgICAgICAgICAgICAgbGFiID0gZGVzZXFfcmVzdWx0cyRnZW5lX3N5bWJvbCwgIyBsYWJlbHMgZm9yIHBvaW50cwogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDFlLTA1LCAjIHAgdmFsdWUgY3V0b2ZmIChkZWZhdWx0KQogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLCAjIGZvbGQgY2hhbmdlIGN1dG9mZiAoZGVmYXVsdCkKICAgICAgICAgICAgICAgIHRpdGxlID0gTlVMTCwgIyBubyB0aXRsZQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSBOVUxMLCAjIG9yIHN1YnRpdGxlCiAgICAgICAgICAgICAgICBjYXB0aW9uID0gTlVMTCwgIyBvciBjYXB0aW9uCiAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsICMgYWRkIHNvbWUgZnVuIGFycm93cwogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMgICMgc21hbGxlciBsYWJlbHMKICAgICAgICAgICAgICAgICkgKwogICMgY2hhbmdlIHRoZSBvdmVyYWxsIHRoZW1lCiAgdGhlbWVfYncoKSArCiAgIyBtb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGJvdHRvbQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCgpXZSBjYW4gYWxzbyByZXR1cm4gYmFjayB0byB0aGUgU0NFIG9iamVjdCB0aGF0IHdlIHVzZWQgdG8gY3JlYXRlIG91ciBwc2V1ZG8tYnVsa2VkIFNDRSBhbmQgbG9vayBhdCBnZW5lIGV4cHJlc3Npb24gb2Ygc29tZSBvZiB0aGUgc2lnbmlmaWNhbnQgZ2VuZXMuIApXZSBjYW4gY3JlYXRlIFVNQVAgcGxvdHMgYXMgd2UgZGlkIHByZXZpb3VzbHksIGJ1dCBpbnN0ZWFkIG9mIGxhYmVsaW5nIGVhY2ggY2VsbCB3aXRoIG1ldGFkYXRhLCB3ZSBjYW4gY29sb3IgY2VsbHMgYnkgYSBzcGVjaWZpZWQgZ2VuZSdzIGV4cHJlc3Npb24gbGV2ZWxzLgpXZSB3aWxsIGFsc28gdXNlIHNvbWUgb2YgdGhlIGBnZ3Bsb3QyYCBza2lsbHMgd2UgcGlja2VkIHVwIGVhcmxpZXIsIGxpa2UgYGZhY2V0X2dyaWQoKWAgdG8gcGxvdCBjZWxscyBmcm9tIGRpZmZlcmVudCBSTVMgc3VidHlwZXMgc2VwYXJhdGVseS4KVGhpcyBjYW4gaGVscCB1cyB2YWxpZGF0ZSB0aGUgYERFU2VxMmAgcmVzdWx0cyBzbyB0aGF0IHdlIGNhbiB2aXN1YWxpemUgZ2VuZSBleHByZXNzaW9uIGNoYW5nZXMgYWNyb3NzIG91ciBjZWxsIHR5cGUgb2YgaW50ZXJlc3Qgb24gYSBzaW5nbGUtY2VsbCBsZXZlbC4gCgpgYGB7ciBleHByZXNzaW9uIHVtYXAsIGxpdmU9VFJVRX0KIyBmaWx0ZXIgdG8ganVzdCBteW9ibGFzdCBjZWxscyBhbmQgcmVtb3ZlIGFueSBOQSdzIGJlZm9yZSBwbG90dGluZwpteW9ibGFzdF9jb21iaW5lZF9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgPT0gIlR1bW9yX015b2JsYXN0IildCgojIHBsb3QgUFRQUlQgKEVOU0cwMDAwMDE5NjA5MCkgZXhwcmVzc2lvbiBpbiBBUk1TIHZzLiBFUk1TCnNjYXRlcjo6cGxvdFJlZHVjZWREaW0obXlvYmxhc3RfY29tYmluZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJmYXN0bW5uX1VNQVAiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2J5ID0gIkVOU0cwMDAwMDE5NjA5MCIsICNQVFBSVAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemU9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9maWVsZHMgPSAiZGlhZ25vc2lzX2dyb3VwIikgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGlhZ25vc2lzX2dyb3VwKSkKYGBgCgpJbiB0aGUgYWJvdmUgcGxvdCB3ZSBvbmx5IHBsb3R0ZWQgdGhlIHR1bW9yIG15b2JsYXN0IGNlbGxzIHRoYXQgd2UgdXNlZCBpbiBvdXIgREUgYW5hbHlzaXMuIApIb3dldmVyLCB3ZSBtaWdodCBiZSBpbnRlcmVzdGVkIHRvIHNlZSB0aGUgZXhwcmVzc2lvbiBvZiBnZW5lcyB0aGF0IGFyZSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgaW4gb3RoZXIgY2VsbCB0eXBlcyBwcmVzZW50IGluIG91ciBzYW1wbGVzLgoKYGBge3IgY2VsbHR5cGUgY29tcGFyaXNvbn0KIyBsZXQncyBjb21wYXJlIGdlbmUgZXhwcmVzc2lvbiBhY3Jvc3Mgc29tZSBvdGhlciBjZWxsIHR5cGVzCiMgbG9vayBhdCBhbGwgdHVtb3IgY2VsbHMgYW5kIHBpY2sgb25lIG5vcm1hbCBjZWxsIHR5cGUKY2VsbHR5cGVzIDwtIGMoIlR1bW9yX015b2JsYXN0IiwgCiAgICAgICAgICAgICAgICJUdW1vcl9NZXNvZGVybSIsIAogICAgICAgICAgICAgICAiVHVtb3JfTXlvY3l0ZSIsIAogICAgICAgICAgICAgICAiVmFzY3VsYXIgRW5kb3RoZWxpdW0iKQoKIyBzdWJzZXQgdG8ganVzdCBjZWxsdHlwZXMgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbgp0dW1vcl9zY2UgPC0gcm1zX3NjZVssIHdoaWNoKHJtc19zY2UkY2VsbHR5cGVfYnJvYWQgJWluJSBjZWxsdHlwZXMpXQpgYGAKCk5leHQgd2Ugd2lsbCBsb29rIGF0IGEgZmV3IERFIGdlbmVzIHRoYXQgd2UgaWRlbnRpZmllZCwgb25lIHVwIHJlZ3VsYXRlZCBnZW5lIGFuZCBvbmUgZG93biByZWd1bGF0ZWQgZ2VuZSwgYW5kIGNvbXBhcmUgdGhlaXIgZXhwcmVzc2lvbiBpbiBteW9ibGFzdHMgdG8gb3RoZXIgY2VsbCB0eXBlcyBpbiBBUk1TIGFuZCBFUk1TIHNhbXBsZXMuCldlIHdpbGwgdXNlIHRoZSBgc2NhdGVyOjpwbG90RXhwcmVzc2lvbigpYCBmdW5jdGlvbiB0byBjcmVhdGUgYSB2aW9saW4gcGxvdCB3aXRoIFJNUyBzdWJ0eXBlIG9uIHRoZSB4LWF4aXMgYW5kIGdlbmUgZXhwcmVzc2lvbiBvbiB0aGUgeS1heGlzLgpXZSBjYW4gY29udGludWUgdXNpbmcgYGZhY2V0X2dyaWQoKWAgdG8gc2hvdyBzZXBhcmF0ZSBwYW5lbHMgZm9yIGVhY2ggY2VsbCB0eXBlLgpCZWNhdXNlIHdlIHdhbnQgdG8gc2hvdyBtdWx0aXBsZSBnZW5lcyBoZXJlLCB3ZSBhcmUgZ29pbmcgdG8gYWRkIGFuIGFkZGl0aW9uYWwgb3B0aW9uIHRvIGBmYWNldF9ncmlkKClgIHRvIGluY2x1ZGUgbXVsdGlwbGUgcm93cyBpbiBvdXIgcGxvdCBncmlkLCBvbmUgZm9yIGVhY2ggZ2VuZSBvZiBpbnRlcmVzdC4KT25lIG5lYXQgdHJpY2sgb2YgdGhlIGBzY2F0ZXI6OnBsb3RFeHByZXNzaW9uKClgIGZ1bmN0aW9uIGlzIHRoYXQgaXQgYWN0dWFsbHkgY3JlYXRlcyBhIGBGZWF0dXJlYCBjb2x1bW4gd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGZlYXR1cmVzIChpbiB0aGlzIGNhc2UgZ2VuZXMpIGJlaW5nIHVzZWQgaW4gcGxvdHRpbmcuCldlIGNhbiB0aGVuIGRpcmVjdGx5IHJlZmVyZW5jZSB0aGF0IGBGZWF0dXJlYCBjb2x1bW4gd2hlbiBwbG90dGluZywgaW5zdGVhZCBvZiB1c2luZyB0aGUgYG90aGVyX2ZpZWxkc2Agb3B0aW9uIHdlIHVzZWQgcHJldmlvdXNseS4KCmBgYHtyIG11bHRpLWdlbmUgcGxvdH0KIyBwaWNrIGEgY291cGxlIGdlbmVzIHRvIGxvb2sgYXQgCmdlbmVzX3RvX3Bsb3QgPC0gYygiRU5TRzAwMDAwMTk2MDkwIiwgI1BUUFJUCiAgICAgICAgICAgICAgICAgICAiRU5TRzAwMDAwMTQ4OTM1IikgI0dBUzIKCiMgY3JlYXRlIGEgdmlvbGluIHBsb3QgCnNjYXRlcjo6cGxvdEV4cHJlc3Npb24odHVtb3Jfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICMgYSB2ZWN0b3Igb2YgZ2VuZXMgdG8gcGxvdAogICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gZ2VuZXNfdG9fcGxvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJkaWFnbm9zaXNfZ3JvdXAiLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9ieSA9ICJkaWFnbm9zaXNfZ3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2ZpZWxkcyA9ICJjZWxsdHlwZV9icm9hZCIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDAuMSkgKwogICMgZWFjaCBjZWxsdHlwZSBpcyBpdHMgb3duIGNvbHVtbgogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoY2VsbHR5cGVfYnJvYWQpLAogICAgICAgICAgICAgIyBlYWNoIGZlYXR1cmUgKGdlbmUpIGlzIGl0cyBvd24gcm93CiAgICAgICAgICAgICByb3dzID0gdmFycyhGZWF0dXJlKSkgKyAKICAjIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIHRoZSBmYWNldCBsYWJlbHMKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQoCiAgICB0aXRsZSA9ICJTdWJ0eXBlIiwgIyB1cGRhdGUgdGhlIGxlZ2VuZCB0aXRsZQogICAgIyBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBjb2xvcnMKICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDMsIGFscGhhID0gMSkpCiAgICApCmBgYAoKSG93IGRvIHRoZSBleHByZXNzaW9uIG9mIHRoZXNlIGdlbmVzIGNoYW5nZSBhY3Jvc3MgY2VsbCB0eXBlcyBhbmQgUk1TIHN1YnR5cGVzPwoKR28gYWhlYWQgYW5kIGV4cGxvcmUgc29tZSBnZW5lcyBvbiB5b3VyIG93biEgCkZlZWwgZnJlZSB0byBwbG90IGFueSBvZiB0aGUgZ2VuZXMgdGhhdCBhcmUgaWRlbnRpZmllZCBhcyBzaWduaWZpY2FudCwgZm91bmQgaW4gdGhlIERFIHJlc3VsdHMgdGFibGUsIG9yIHlvdXIgZmF2b3JpdGUgZ2VuZS4KUmVtZW1iZXIsIHlvdSBuZWVkIHRvIHVzZSB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXIgdG8gcmVmZXIgdG8gZWFjaCBnZW5lLgoKYGBge3IgZXhwbG9yZX0KIyBub3cgZG8gc29tZSBleHBsb3JhdGlvbiBvZiBvdGhlciBnZW5lcyBvbiB5b3VyIG93biEgCmBgYAoKIyMgUHJpbnQgc2Vzc2lvbiBpbmZvIAoKYGBge3Igc2Vzc2lvbiBpbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoK</div> </div> diff --git a/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd b/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd new file mode 100644 index 00000000..2f9122b6 --- /dev/null +++ b/scRNA-seq-advanced/04-gene_set_enrichment_analysis-live.Rmd @@ -0,0 +1,281 @@ +--- +title: "Pathway analysis: Gene Set Enrichment Analysis (GSEA)" +output: + html_notebook: + toc: true + toc_float: true +author: CCDL for ALSF +date: 2024 +--- + +## Objectives + +This notebook will demonstrate how to: + +- Prepare tabular data of gene-level statistics for use with Gene Set Enrichment Analysis (GSEA) +- Access [Molecular Signatures Database gene set collections](https://www.gsea-msigdb.org/gsea/msigdb/collections.jsp) via the `msigdbr` package +- Perform GSEA with the `clusterProfiler` package +- Visualize GSEA results with the `enrichplot` package + +--- + +In this notebook, we'll analyze the differential expression results from the last notebook. + +GSEA is a functional class scoring (FCS) approach to pathway analysis that was first introduced in [Subramanian _et al._ (2005)](https://doi.org/10.1073/pnas.0506580102). +The rationale behind FCS approaches is that small changes in individual genes that participate in the same biological process or pathway can be significant and of biological interest. + +There are 3 general steps in FCS methods ([Khatri _et al._ 2012](https://doi.org/10.1371/journal.pcbi.1002375)): + +1. Calculate a gene-level statistic (here, we'll use the summary log fold changes in our DESeq2 results) +2. Aggregate gene-level statistics into a pathway-level statistic +3. Assess the statistical significance of the pathway-level statistic + +#### Other resources + +* For another example using `clusterProfiler` for GSEA, see [_Intro to DGE: Functional Analysis._ from Harvard Chan Bioinformatics Core Training.](https://hbctraining.github.io/Training-modules/DGE-functional-analysis/lessons/02_functional_analysis.html) +* The way we'll use `clusterProfiler` here uses `fgsea` (Fast Gene Set Enrichment Analysis) under the hood. +You can read more about `fgsea` in [Korotkevich _et al._ (2021)](https://doi.org/10.1101/060012). +* See the [refine.bio examples for "Gene set enrichment analysis - RNA-seq"](https://alexslemonade.github.io/refinebio-examples/03-rnaseq/pathway-analysis_rnaseq_02_gsea.html) from which this material has been adapted. + +## Set up + +### Libraries + +```{r libraries} +# Package to run GSEA +library(clusterProfiler) +# Package that contains the MSigDB gene sets in tidy format +library(msigdbr) +``` + +### Directories and Files + +#### Directories + +```{r create_dir, live = TRUE} +# We'll use the marker genes as GSEA input + +# We'll create a directory to specifically hold the pathway results if it doesn't +# exist yet + +``` + +#### Input files + + +```{r input_files} +input_file <- file.path(rms_analysis_dir, + "deseq", + "rms_myoblast_deseq_results.tsv") +``` + +#### Output files + +We'll save our table of GSEA results as a TSV. + +```{r output_files} +output_file <- file.path(results_dir, + "rms_myoblast_gsea_results.tsv") +``` + +## Gene sets + +We will use gene sets from the [Molecular Signatures Database (MSigDB)](https://www.gsea-msigdb.org/gsea/msigdb/index.jsp) from the Broad Institute ([Subramanian, Tamayo *et al.* 2005](https://doi.org/10.1073/pnas.0506580102)). +The [`msigdbr`](https://cran.r-project.org/web/packages/msigdbr/index.html) package contains MSigDB datasets already in the tidy format required by `clusterProfiler` and supports multiple organisms. + +Let's take a look at what organisms the package supports. + +```{r show_species} +msigdbr_species() +``` + +MSigDB contains 8 different gene set collections. + + H: hallmark gene sets + C1: positional gene sets + C2: curated gene sets + C3: motif gene sets + C4: computational gene sets + C5: GO gene sets + C6: oncogenic signatures + C7: immunologic signatures + +We'll use the Hallmark collection for GSEA. +Here's an excerpt of the [collection description](https://www.gsea-msigdb.org/gsea/msigdb/collection_details.jsp#H): + +> Hallmark gene sets summarize and represent specific well-defined biological states or processes and display coherent expression. These gene sets were generated by a computational methodology based on identifying gene set overlaps and retaining genes that display coordinate expression. The hallmarks reduce noise and redundancy and provide a better delineated biological space for GSEA. + +Notably, there are only 50 gene sets included in this collection. +The fewer gene sets we test, the lower our multiple hypothesis testing burden. + +We can retrieve only the Hallmark gene sets by specifying `category = "H"` to the `msigdbr()` function. + +```{r immunologic_sets, live = TRUE} + +``` + +## Gene Set Enrichment Analysis + +_Adapted from [refine.bio examples](https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/03-rnaseq/pathway-analysis_rnaseq_02_gsea.Rmd)_ + + + +**Figure 1. [Subramanian _et al._ (2005)](https://doi.org/10.1073/pnas.0506580102).** + +GSEA calculates a pathway-level metric, called an enrichment score (sometimes abbreviated as ES), by ranking genes by a gene-level statistic. +This score reflects whether or not a gene set or pathway is over-represented at the top or bottom of the gene rankings ([Subramanian _et al._ 2005](https://doi.org/10.1073/pnas.0506580102); [Yu](http://yulab-smu.top/clusterProfiler-book/chapter2.html#gene-set-enrichment-analysis)) + +Specifically, all genes are ranked from most positive to most negative based on their statistic and a running sum is calculated: +Starting with the most highly ranked genes, the running sum increases for each gene in the pathway and decreases for each gene not in the pathway. +The enrichment score for a pathway is the running sum's maximum deviation from zero. +GSEA also assesses statistical significance of the scores for each pathway through permutation testing. +As a result, each input pathway will have a p-value associated with it that is then corrected for multiple hypothesis testing ([Subramanian _et al._ 2005](https://doi.org/10.1073/pnas.0506580102); [Yu](http://yulab-smu.top/clusterProfiler-book/chapter2.html#gene-set-enrichment-analysis)). + +The implementation of GSEA we use in here examples requires a gene list ordered by some statistic and input gene sets. +When you use previously computed gene-level statistics with GSEA, it is called GSEA pre-ranked. + +## DESeq2 results + +```{r read_in_markers, live = TRUE} + +``` + +```{r deseq_head} +head(deseq_df) +``` + +This data frame uses Ensembl gene identifiers. +We'll need to make sure our gene sets use the same identifiers. +Let's take a look at the first few rows of the data frame that contains the hallmark gene sets. + +```{r hallmark_head, live = TRUE} + +``` + +We can see that the gene sets from `msigdbr` have Ensembl gene identifiers associated with them, so we don't need to do any conversion. +However, we'll need to pass the correct column to the function that runs GSEA. + +If we needed to do gene identifier conversion, we would likely use the `AnnotationDbi` package. +You can see an example in this Harvard Chan Bioinformatics Core Training material: <https://hbctraining.github.io/DGE_workshop_salmon_online/lessons/AnnotationDbi_lesson.html> + +One good thing about Ensembl gene identifiers is that they are less likely to be duplicated than, for example, gene symbols. +(Multiple Ensembl gene identifiers can map to the same symbol.) + +The GSEA approach requires on discriminating between genes that are in a gene set and those that are not. +Practically speaking, gene sets are just collections of gene identifiers! +When the function we use for GSEA pre-ranked gets a list with duplicated gene identifiers, it can produce unexpected results. +So, let's check for duplicates in the data frame of DESeq2 results. + +```{r check_duplicates, live = TRUE} + +``` + +There are no duplicates for us to worry about! + +### Pre-ranked list + +The `GSEA()` function takes a pre-ranked (sorted) named vector of statistics, where the names in the vector are gene identifiers. +This is step 1 -- gene-level statistics. + +```{r lfc_vector} +lfc_vector <- deseq_df |> + # Extract a vector of `log2FoldChange` named by `ensembl_id` + dplyr::pull(log2FoldChange, name = ensembl_id) +lfc_vector <- sort(lfc_vector, decreasing = TRUE) +``` + +Let's look at the top ranked values. + +```{r head_lfc, live = TRUE} +# Look at first entries of the log fold change vector + +``` + +And the bottom of the list. + +```{r tail_lfc, live = TRUE} +# Look at the last entries of the log fold change vector + +``` + +## Run GSEA + +Now for the analysis! + +We can use the `GSEA()` function to perform GSEA with any generic set of gene sets, but there are several functions for using specific, commonly used gene sets (e.g., `gseKEGG()`). + +```{r run_gsea} +gsea_results <- GSEA(geneList = lfc_vector, # ordered ranked gene list + minGSSize = 25, # minimum gene set size + maxGSSize = 500, # maximum gene set set + pvalueCutoff = 0.05, + pAdjustMethod = "BH", # correction for multiple hypothesis testing + TERM2GENE = dplyr::select(hs_hallmarks_df, + gs_name, + ensembl_gene)) # pass the correct identifier column +``` +Let's take a look at the GSEA results. + +```{r view_gsea, live = TRUE, eval = FALSE} + +``` + +Normalized enrichment scores (NES) are enrichment scores that are scaled to make gene sets that contain different number of genes comparable. + +Pathways with significant, highly positive NES are enriched in ERMS myoblasts, whereas pathways with significant, highly negative NES are enriched in ARMS myoblasts. + +Let's write these results to file. + +```{r write_gsea} +gsea_results@result |> readr::write_tsv(output_file) +``` + +### Visualizing GSEA results + +We can visualize GSEA results for individual pathways or gene sets using `enrichplot::gseaplot()`. +Let's take a look at 3 different pathways -- one with a highly positive NES, one with a highly negative NES, and one that was not a significant result -- to get more insight into how ES are calculated. + +#### Highly Positive NES + +Let's take look at a pathway with a highly positive NES (`HALLMARK_MYC_TARGETS_V2`) using a GSEA plot. + +```{r highly_pos} +enrichplot::gseaplot(gsea_results, + geneSetID = "HALLMARK_MYC_TARGETS_V2", + title = "HALLMARK_MYC_TARGETS_V2", + color.line = "#0066FF") +``` + +Notice how the genes that are in the gene set, indicated by the black bars, tend to be on the left side of the graph indicating that they have positive gene-level scores. + +#### Highly Negative NES + +The gene set `HALLMARK_MYOGENESIS` had a highly negative NES. + +```{r highly_neg} +enrichplot::gseaplot(gsea_results, + geneSetID = "HALLMARK_MYOGENESIS", + title = "HALLMARK_MYOGENESIS", + color.line = "#0066FF") +``` + +This gene set shows the opposite pattern -- genes in the pathway tend to be on the right side of the graph. + +#### A non-significant result + +The `@results` slot will only show gene sets that pass the `pvalueCutoff` threshold we supplied to `GSEA()`, but we can plot any gene set so long as we know its name. +Let's look at `HALLMARK_P53_PATHWAY`, which was not in the results we viewed earlier. + +```{r p53, live = TRUE} + +``` + +Genes in the pathway are distributed more evenly throughout the ranked list, resulting in a more "middling" score. + +*Note: The plots returned by `enrichplot::gseaplot` are ggplots, so we could use `ggplot2::ggsave()` to save them to file if we wanted to.* + +## Session Info + +```{r session_info} +sessionInfo() +``` diff --git a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html index 5197164f..306d4f57 100644 --- a/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html +++ b/scRNA-seq-advanced/04-gene_set_enrichment_analysis.nb.html @@ -2938,27 +2938,29 @@ <h2>Set up</h2> <h3>Libraries</h3> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBQYWNrYWdlIHRvIHJ1biBHU0VBXG5saWJyYXJ5KGNsdXN0ZXJQcm9maWxlcilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgUGFja2FnZSB0byBydW4gR1NFQSIsImxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKSJdfQ== --> <pre class="r"><code># Package to run GSEA library(clusterProfiler)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiXG5SZWdpc3RlcmVkIFMzIG1ldGhvZCBvdmVyd3JpdHRlbiBieSAnZGF0YS50YWJsZSc6XG4gIG1ldGhvZCAgICAgICAgICAgZnJvbVxuICBwcmludC5kYXRhLnRhYmxlICAgICBcbmNsdXN0ZXJQcm9maWxlciB2NC4xMi4wICBGb3IgaGVscDogaHR0cHM6Ly95dWxhYi1zbXUudG9wL2Jpb21lZGljYWwta25vd2xlZGdlLW1pbmluZy1ib29rL1xuXG5JZiB5b3UgdXNlIGNsdXN0ZXJQcm9maWxlciBpbiBwdWJsaXNoZWQgcmVzZWFyY2gsIHBsZWFzZSBjaXRlOlxuVCBXdSwgRSBIdSwgUyBYdSwgTSBDaGVuLCBQIEd1bywgWiBEYWksIFQgRmVuZywgTCBaaG91LCBXIFRhbmcsIEwgWmhhbiwgWCBGdSwgUyBMaXUsIFggQm8sIGFuZCBHIFl1LiBjbHVzdGVyUHJvZmlsZXIgNC4wOiBBIHVuaXZlcnNhbCBlbnJpY2htZW50IHRvb2wgZm9yIGludGVycHJldGluZyBvbWljcyBkYXRhLiBUaGUgSW5ub3ZhdGlvbi4gMjAyMSwgMigzKToxMDAxNDFcblxuQXR0YWNoaW5nIHBhY2thZ2U6IOKAmGNsdXN0ZXJQcm9maWxlcuKAmVxuXG5UaGUgZm9sbG93aW5nIG9iamVjdCBpcyBtYXNrZWQgZnJvbSDigJhwYWNrYWdlOnN0YXRz4oCZOlxuXG4gICAgZmlsdGVyXG4ifQ== --> -<pre><code> -Registered S3 method overwritten by 'data.table': - method from - print.data.table -clusterProfiler v4.12.0 For help: https://yulab-smu.top/biomedical-knowledge-mining-book/ +<!-- rnb-message-begin eyJkYXRhIjoiXG4ifQ== --> +<pre><code></code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiY2x1c3RlclByb2ZpbGVyIHY0LjEyLjAgIEZvciBoZWxwOiBodHRwczovL3l1bGFiLXNtdS50b3AvYmlvbWVkaWNhbC1rbm93bGVkZ2UtbWluaW5nLWJvb2svXG5cbklmIHlvdSB1c2UgY2x1c3RlclByb2ZpbGVyIGluIHB1Ymxpc2hlZCByZXNlYXJjaCwgcGxlYXNlIGNpdGU6XG5UIFd1LCBFIEh1LCBTIFh1LCBNIENoZW4sIFAgR3VvLCBaIERhaSwgVCBGZW5nLCBMIFpob3UsIFcgVGFuZywgTCBaaGFuLCBYIEZ1LCBTIExpdSwgWCBCbywgYW5kIEcgWXUuIGNsdXN0ZXJQcm9maWxlciA0LjA6IEEgdW5pdmVyc2FsIGVucmljaG1lbnQgdG9vbCBmb3IgaW50ZXJwcmV0aW5nIG9taWNzIGRhdGEuIFRoZSBJbm5vdmF0aW9uLiAyMDIxLCAyKDMpOjEwMDE0MVxuIn0= --> +<pre><code>clusterProfiler v4.12.0 For help: https://yulab-smu.top/biomedical-knowledge-mining-book/ If you use clusterProfiler in published research, please cite: -T Wu, E Hu, S Xu, M Chen, P Guo, Z Dai, T Feng, L Zhou, W Tang, L Zhan, X Fu, S Liu, X Bo, and G Yu. clusterProfiler 4.0: A universal enrichment tool for interpreting omics data. The Innovation. 2021, 2(3):100141 - -Attaching package: ‘clusterProfiler’ - -The following object is masked from ‘package:stats’: +T Wu, E Hu, S Xu, M Chen, P Guo, Z Dai, T Feng, L Zhou, W Tang, L Zhan, X Fu, S Liu, X Bo, and G Yu. clusterProfiler 4.0: A universal enrichment tool for interpreting omics data. The Innovation. 2021, 2(3):100141</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiXG5BdHRhY2hpbmcgcGFja2FnZTogJ2NsdXN0ZXJQcm9maWxlcidcbiJ9 --> +<pre><code> +Attaching package: 'clusterProfiler'</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiVGhlIGZvbGxvd2luZyBvYmplY3QgaXMgbWFza2VkIGZyb20gJ3BhY2thZ2U6c3RhdHMnOlxuXG4gICAgZmlsdGVyXG4ifQ== --> +<pre><code>The following object is masked from 'package:stats': filter</code></pre> -<!-- rnb-output-end --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBQYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIE1TaWdEQiBnZW5lIHNldHMgaW4gdGlkeSBmb3JtYXRcbmxpYnJhcnkobXNpZ2RicilcbmBgYCJ9 --> +<!-- rnb-message-end --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgUGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBNU2lnREIgZ2VuZSBzZXRzIGluIHRpZHkgZm9ybWF0IiwibGlicmFyeShtc2lnZGJyKSJdfQ== --> <pre class="r"><code># Package that contains the MSigDB gene sets in tidy format library(msigdbr)</code></pre> <!-- rnb-source-end --> @@ -2971,7 +2973,7 @@ <h3>Directories and Files</h3> <h4>Directories</h4> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBXZSdsbCB1c2UgdGhlIG1hcmtlciBnZW5lcyBhcyBHU0VBIGlucHV0XG5ybXNfYW5hbHlzaXNfZGlyIDwtIGZpbGUucGF0aChcImFuYWx5c2lzXCIsIFwicm1zXCIpXG5cbiMgV2UnbGwgY3JlYXRlIGEgZGlyZWN0b3J5IHRvIHNwZWNpZmljYWxseSBob2xkIHRoZSBwYXRod2F5IHJlc3VsdHMgaWYgaXQgZG9lc24ndFxuIyBleGlzdCB5ZXRcbnJlc3VsdHNfZGlyIDwtIGZpbGUucGF0aChybXNfYW5hbHlzaXNfZGlyLCBcInBhdGh3YXktYW5hbHlzaXNcIilcbmZzOjpkaXJfY3JlYXRlKHJlc3VsdHNfZGlyKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgV2UnbGwgdXNlIHRoZSBtYXJrZXIgZ2VuZXMgYXMgR1NFQSBpbnB1dCIsInJtc19hbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKFwiYW5hbHlzaXNcIiwgXCJybXNcIikiLCIiLCIjIFdlJ2xsIGNyZWF0ZSBhIGRpcmVjdG9yeSB0byBzcGVjaWZpY2FsbHkgaG9sZCB0aGUgcGF0aHdheSByZXN1bHRzIGlmIGl0IGRvZXNuJ3QiLCIjIGV4aXN0IHlldCIsInJlc3VsdHNfZGlyIDwtIGZpbGUucGF0aChybXNfYW5hbHlzaXNfZGlyLCBcInBhdGh3YXktYW5hbHlzaXNcIikiLCJmczo6ZGlyX2NyZWF0ZShyZXN1bHRzX2RpcikiXX0= --> <pre class="r"><code># We'll use the marker genes as GSEA input rms_analysis_dir <- file.path("analysis", "rms") @@ -2987,7 +2989,7 @@ <h4>Directories</h4> <h4>Input files</h4> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuaW5wdXRfZmlsZSA8LSBmaWxlLnBhdGgocm1zX2FuYWx5c2lzX2RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzZXFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX215b2JsYXN0X2Rlc2VxX3Jlc3VsdHMudHN2XCIpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiaW5wdXRfZmlsZSA8LSBmaWxlLnBhdGgocm1zX2FuYWx5c2lzX2RpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzZXFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX215b2JsYXN0X2Rlc2VxX3Jlc3VsdHMudHN2XCIpIn0= --> <pre class="r"><code>input_file <- file.path(rms_analysis_dir, "deseq", "rms_myoblast_deseq_results.tsv")</code></pre> @@ -3000,7 +3002,7 @@ <h4>Output files</h4> <p>We’ll save our table of GSEA results as a TSV.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub3V0cHV0X2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX215b2JsYXN0X2dzZWFfcmVzdWx0cy50c3ZcIilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoib3V0cHV0X2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFwicm1zX215b2JsYXN0X2dzZWFfcmVzdWx0cy50c3ZcIikifQ== --> <pre class="r"><code>output_file <- file.path(results_dir, "rms_myoblast_gsea_results.tsv")</code></pre> <!-- rnb-source-end --> @@ -3019,16 +3021,14 @@ <h2>Gene sets</h2> <p>Let’s take a look at what organisms the package supports.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubXNpZ2Ricl9zcGVjaWVzKClcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoibXNpZ2Ricl9zcGVjaWVzKCkifQ== --> <pre class="r"><code>msigdbr_species()</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInRibF9kZiIsInRibCIsImRhdGEuZnJhbWUiXSwibnJvdyI6MjAsIm5jb2wiOjIsInN1bW1hcnkiOnsiQSB0aWJibGUiOlsiMjAgw5cgMiJdfX0sInJkZiI6IlVrUllNd3BZQ2dBQUFBTUFCQVFBQUFNRkFBQUFBQVZWVkVZdE9BQUFCQUlBQUFBQkFBUUFDUUFBQUFGNEFBQURFd0FBQUFJQUFBQVFBQUFBRkFBRUFBa0FBQUFUUVc1dmJHbHpJR05oY205c2FXNWxibk5wY3dBRUFBa0FBQUFLUW05eklIUmhkWEoxY3dBRUFBa0FBQUFXUTJGbGJtOXlhR0ZpWkdsMGFYTWdaV3hsWjJGdWN3QUVBQWtBQUFBV1EyRnVhWE1nYkhWd2RYTWdabUZ0YVd4cFlYSnBjd0FFQUFrQUFBQUxSR0Z1YVc4Z2NtVnlhVzhBQkFBSkFBQUFGMFJ5YjNOdmNHaHBiR0VnYldWc1lXNXZaMkZ6ZEdWeUFBUUFDUUFBQUE1RmNYVjFjeUJqWVdKaGJHeDFjd0FFQUFrQUFBQUxSbVZzYVhNZ1kyRjBkWE1BQkFBSkFBQUFEVWRoYkd4MWN5Qm5ZV3hzZFhNQUJBQUpBQUFBREVodmJXOGdjMkZ3YVdWdWN3QUVBQWtBQUFBT1RXRmpZV05oSUcxMWJHRjBkR0VBQkFBSkFBQUFGVTF2Ym05a1pXeHdhR2x6SUdSdmJXVnpkR2xqWVFBRUFBa0FBQUFNVFhWeklHMTFjMk4xYkhWekFBUUFDUUFBQUJoUGNtNXBkR2h2Y21oNWJtTm9kWE1nWVc1aGRHbHVkWE1BQkFBSkFBQUFEMUJoYmlCMGNtOW5iRzlrZVhSbGN3QUVBQWtBQUFBUlVtRjBkSFZ6SUc1dmNuWmxaMmxqZFhNQUJBQUpBQUFBR0ZOaFkyTm9ZWEp2YlhsalpYTWdZMlZ5WlhacGMybGhaUUFFQUFrQUFBQWZVMk5vYVhwdmMyRmpZMmhoY205dGVXTmxjeUJ3YjIxaVpTQTVOekpvTFFBRUFBa0FBQUFLVTNWeklITmpjbTltWVFBRUFBa0FBQUFTV0dWdWIzQjFjeUIwY205d2FXTmhiR2x6QUFBQUVBQUFBQlFBQkFBSkFBQUFHME5oY205c2FXNWhJR0Z1YjJ4bExDQm5jbVZsYmlCaGJtOXNaUUFFQUFrQUFBQkhZbTkyYVc1bExDQmpZWFIwYkdVc0lHTnZkeXdnWkdGcGNua2dZMjkzTENCa2IyMWxjM1JwWXlCallYUjBiR1VzSUdSdmJXVnpkR2xqSUdOdmR5d2diM2dzSUc5NFpXNEFBQUFKLy8vLy93QUVBQWtBQUFBSlpHOW5MQ0JrYjJkekFBUUFDUUFBQURGc1pXOXdZWEprSUdSaGJtbHZMQ0I2WldKeVlTQmtZVzVwYnl3Z2VtVmljbUVnWm1semFDd2dlbVZpY21GbWFYTm9BQVFBQ1FBQUFBbG1jblZwZENCbWJIa0FCQUFKQUFBQUhXUnZiV1Z6ZEdsaklHaHZjbk5sTENCbGNYVnBibVVzSUdodmNuTmxBQVFBQ1FBQUFCZGpZWFFzSUdOaGRITXNJR1J2YldWemRHbGpJR05oZEFBRUFBa0FBQUFzWW1GdWRHRnRMQ0JqYUdsamEyVnVMQ0JqYUdsamEyVnVjeXdnUjJGc2JIVnpJR1J2YldWemRHbGpkWE1BQkFBSkFBQUFCV2gxYldGdUFBUUFDUUFBQUQ1eWFHVnpkWE1nYldGallYRjFaU3dnY21obGMzVnpJRzFoWTJGeGRXVnpMQ0JTYUdWemRYTWdiVzl1YTJWNUxDQnlhR1Z6ZFhNZ2JXOXVhMlY1Y3dBRUFBa0FBQUFaWjNKaGVTQnphRzl5ZEMxMFlXbHNaV1FnYjNCdmMzTjFiUUFFQUFrQUFBQVNhRzkxYzJVZ2JXOTFjMlVzSUcxdmRYTmxBQVFBQ1FBQUFERmtkV05yTFdKcGJHeGxaQ0J3YkdGMGVYQjFjeXdnWkhWamEySnBiR3dnY0d4aGRIbHdkWE1zSUhCc1lYUjVjSFZ6QUFRQUNRQUFBQXBqYUdsdGNHRnVlbVZsQUFRQUNRQUFBQ0JpY205M2JpQnlZWFFzSUU1dmNuZGhlU0J5WVhRc0lISmhkQ3dnY21GMGN3QUVBQWtBQUFBc1ltRnJaWEluY3lCNVpXRnpkQ3dnWW5KbGQyVnlKM01nZVdWaGMzUXNJRk11SUdObGNtVjJhWE5wWVdVQUFBQUovLy8vL3dBRUFBa0FBQUFiY0dsbkxDQndhV2R6TENCemQybHVaU3dnZDJsc1pDQmliMkZ5QUFRQUNRQUFBQ2wwY205d2FXTmhiQ0JqYkdGM1pXUWdabkp2Wnl3Z2QyVnpkR1Z5YmlCamJHRjNaV1FnWm5Kdlp3QUFCQUlBQUFBQkFBUUFDUUFBQUFWdVlXMWxjd0FBQUJBQUFBQUNBQVFBQ1FBQUFBeHpjR1ZqYVdWelgyNWhiV1VBQkFBSkFBQUFFM053WldOcFpYTmZZMjl0Ylc5dVgyNWhiV1VBQUFRQ0FBQUFBUUFFQUFrQUFBQUpjbTkzTG01aGJXVnpBQUFBRFFBQUFBS0FBQUFBLy8vLzdBQUFCQUlBQUFBQkFBUUFDUUFBQUFWamJHRnpjd0FBQUJBQUFBQUJBQVFBQ1FBQUFBcGtZWFJoTG1aeVlXMWxBQUFBL2dBQUJBSUFBQUFCQUFRQUNRQUFBQWR2Y0hScGIyNXpBQUFDRXdBQUFBWUFBQUFRQUFBQUFRQUVBQWtBQUFBQmNnQUFBQkFBQUFBQkFBUUFDUUFBQUF4emFHOTNYM053WldOcFpYTUFBQUFRQUFBQUFRQUVBQWtBQUFBRGNHNW5BQUFBQ2dBQUFBRUFBQUFBQUFBQURRQUFBQUVBQUFBVUFBQUFEUUFBQUFFQUFBQUNBQUFFQWdBQUF2OEFBQUFRQUFBQUJnQUVBQWtBQUFBR1pXNW5hVzVsQUFRQUNRQUFBQVZzWVdKbGJBQUVBQWtBQUFBRFpHVjJBQVFBQ1FBQUFBNXliM2R1WVcxbGN5NXdjbWx1ZEFBRUFBa0FBQUFLY205M2N5NTBiM1JoYkFBRUFBa0FBQUFLWTI5c2N5NTBiM1JoYkFBQUFQNEFBQUQrIn0= --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":["species_name"],"name":[1],"type":["chr"],"align":["left"]},{"label":["species_common_name"],"name":[2],"type":["chr"],"align":["left"]}],"data":[{"1":"Anolis carolinensis","2":"Carolina anole, green anole"},{"1":"Bos taurus","2":"bovine, cattle, cow, dairy cow, domestic cattle, domestic cow, ox, oxen"},{"1":"Caenorhabditis elegans","2":"NA"},{"1":"Canis lupus familiaris","2":"dog, dogs"},{"1":"Danio rerio","2":"leopard danio, zebra danio, zebra fish, zebrafish"},{"1":"Drosophila melanogaster","2":"fruit fly"},{"1":"Equus caballus","2":"domestic horse, equine, horse"},{"1":"Felis catus","2":"cat, cats, domestic cat"},{"1":"Gallus gallus","2":"bantam, chicken, chickens, Gallus domesticus"},{"1":"Homo sapiens","2":"human"},{"1":"Macaca mulatta","2":"rhesus macaque, rhesus macaques, Rhesus monkey, rhesus monkeys"},{"1":"Monodelphis domestica","2":"gray short-tailed opossum"},{"1":"Mus musculus","2":"house mouse, mouse"},{"1":"Ornithorhynchus anatinus","2":"duck-billed platypus, duckbill platypus, platypus"},{"1":"Pan troglodytes","2":"chimpanzee"},{"1":"Rattus norvegicus","2":"brown rat, Norway rat, rat, rats"},{"1":"Saccharomyces cerevisiae","2":"baker's yeast, brewer's yeast, S. cerevisiae"},{"1":"Schizosaccharomyces pombe 972h-","2":"NA"},{"1":"Sus scrofa","2":"pig, pigs, swine, wild boar"},{"1":"Xenopus tropicalis","2":"tropical clawed frog, western clawed frog"}],"options":{"columns":{"min":{},"max":[10],"total":[2]},"rows":{"min":[10],"max":[10],"total":[20]},"pages":{}}} +{"columns":[{"label":["species_name"],"name":[1],"type":["chr"],"align":["left"]},{"label":["species_common_name"],"name":[2],"type":["chr"],"align":["left"]}],"data":[{"1":"Anolis carolinensis","2":"Carolina anole, green anole"},{"1":"Bos taurus","2":"bovine, cattle, cow, dairy cow, domestic cattle, domestic cow, ox, oxen"},{"1":"Caenorhabditis elegans","2":"NA"},{"1":"Canis lupus familiaris","2":"dog, dogs"},{"1":"Danio rerio","2":"leopard danio, zebra danio, zebra fish, zebrafish"},{"1":"Drosophila melanogaster","2":"fruit fly"},{"1":"Equus caballus","2":"domestic horse, equine, horse"},{"1":"Felis catus","2":"cat, cats, domestic cat"},{"1":"Gallus gallus","2":"bantam, chicken, chickens, Gallus domesticus"},{"1":"Homo sapiens","2":"human"},{"1":"Macaca mulatta","2":"rhesus macaque, rhesus macaques, Rhesus monkey, rhesus monkeys"},{"1":"Monodelphis domestica","2":"gray short-tailed opossum"},{"1":"Mus musculus","2":"house mouse, mouse"},{"1":"Ornithorhynchus anatinus","2":"duck-billed platypus, duckbill platypus, platypus"},{"1":"Pan troglodytes","2":"chimpanzee"},{"1":"Rattus norvegicus","2":"brown rat, Norway rat, rat, rats"},{"1":"Saccharomyces cerevisiae","2":"baker's yeast, brewer's yeast, S. cerevisiae"},{"1":"Schizosaccharomyces pombe 972h-","2":"NA"},{"1":"Sus scrofa","2":"pig, pigs, swine, wild boar"},{"1":"Xenopus tropicalis","2":"tropical clawed frog, western clawed frog"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>MSigDB contains 8 different gene set collections.</p> @@ -3058,7 +3058,7 @@ <h2>Gene sets</h2> <code>category = "H"</code> to the <code>msigdbr()</code> function.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuaHNfaGFsbG1hcmtzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9IFwiSG9tbyBzYXBpZW5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IFwiSFwiKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiaHNfaGFsbG1hcmtzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9IFwiSG9tbyBzYXBpZW5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IFwiSFwiKSJ9 --> <pre class="r"><code>hs_hallmarks_df <- msigdbr(species = "Homo sapiens", category = "H")</code></pre> <!-- rnb-source-end --> @@ -3069,7 +3069,7 @@ <h2>Gene sets</h2> <h2>Gene Set Enrichment Analysis</h2> <p><em>Adapted from <a href="https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/03-rnaseq/pathway-analysis_rnaseq_02_gsea.Rmd">refine.bio examples</a></em></p> -<p><img src="data:image/jpeg;base64,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" /></p> +<p><img role="img" src="data:image/jpeg;base64,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" /></p> <p><strong>Figure 1. <a href="https://doi.org/10.1073/pnas.0506580102">Subramanian <em>et al.</em> (2005)</a>.</strong></p> <p>GSEA calculates a pathway-level metric, called an enrichment score @@ -3096,33 +3096,31 @@ <h2>Gene Set Enrichment Analysis</h2> <h2>DESeq2 results</h2> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGVzZXFfZGYgPC0gcmVhZHI6OnJlYWRfdHN2KGlucHV0X2ZpbGUpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZGVzZXFfZGYgPC0gcmVhZHI6OnJlYWRfdHN2KGlucHV0X2ZpbGUpIn0= --> <pre class="r"><code>deseq_df <- readr::read_tsv(input_file)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUm93czogNjAzMTkgQ29sdW1uczogMjdcbuKUgOKUgCBDb2x1bW4gc3BlY2lmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbkRlbGltaXRlcjogXCJcXHRcIlxuY2hyICAoMik6IGVuc2VtYmxfaWQsIGdlbmVfc3ltYm9sXG5kYmwgKDI1KTogYmFzZU1lYW4sIGxvZzJGb2xkQ2hhbmdlLCBsZmNTRSwgcHZhbHVlLCBwYWRqLCBTQ1BDTDAwMDQ3OC5tZWFuLCBTQ1BDTDAwMDQ3OC5kZXRlY3RlZCwgU0NQQ0wwMDA0NzkubWVhbiwgU0NQQ0wwMDA0NzkuZGUuLi5cblxu4oS5IFVzZSBgc3BlYygpYCB0byByZXRyaWV2ZSB0aGUgZnVsbCBjb2x1bW4gc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBkYXRhLlxu4oS5IFNwZWNpZnkgdGhlIGNvbHVtbiB0eXBlcyBvciBzZXQgYHNob3dfY29sX3R5cGVzID0gRkFMU0VgIHRvIHF1aWV0IHRoaXMgbWVzc2FnZS5cbiJ9 --> +<!-- rnb-message-begin eyJkYXRhIjoiUm93czogNjAzMTkgQ29sdW1uczogMjdcbuKUgOKUgCBDb2x1bW4gc3BlY2lmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbkRlbGltaXRlcjogXCJcXHRcIlxuY2hyICAoMik6IGVuc2VtYmxfaWQsIGdlbmVfc3ltYm9sXG5kYmwgKDI1KTogYmFzZU1lYW4sIGxvZzJGb2xkQ2hhbmdlLCBsZmNTRSwgcHZhbHVlLCBwYWRqLCBTQ1BDTDAwMDQ3OC5tZWFuLCBTLi4uXG5cbuKEuSBVc2UgYHNwZWMoKWAgdG8gcmV0cmlldmUgdGhlIGZ1bGwgY29sdW1uIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgZGF0YS5cbuKEuSBTcGVjaWZ5IHRoZSBjb2x1bW4gdHlwZXMgb3Igc2V0IGBzaG93X2NvbF90eXBlcyA9IEZBTFNFYCB0byBxdWlldCB0aGlzIG1lc3NhZ2UuXG4ifQ== --> <pre><code>Rows: 60319 Columns: 27 -── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────── +── Column specification ──────────────────────────────────────────────────────── Delimiter: "\t" chr (2): ensembl_id, gene_symbol -dbl (25): baseMean, log2FoldChange, lfcSE, pvalue, padj, SCPCL000478.mean, SCPCL000478.detected, SCPCL000479.mean, SCPCL000479.de... +dbl (25): baseMean, log2FoldChange, lfcSE, pvalue, padj, SCPCL000478.mean, S... ℹ Use `spec()` to retrieve the full column specification for this data. ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.</code></pre> -<!-- rnb-output-end --> +<!-- rnb-message-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuaGVhZChkZXNlcV9kZilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoiaGVhZChkZXNlcV9kZikifQ== --> <pre class="r"><code>head(deseq_df)</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInRibF9kZiIsInRibCIsImRhdGEuZnJhbWUiXSwibnJvdyI6NiwibmNvbCI6MjcsInN1bW1hcnkiOnsiQSB0aWJibGUiOlsiNiDDlyAyNyJdfX0sInJkZiI6IlVrUllNd3BZQ2dBQUFBTUFCQVFBQUFNRkFBQUFBQVZWVkVZdE9BQUFCQUlBQUFBQkFBUUFDUUFBQUFGNEFBQURFd0FBQUJzQUFBQVFBQUFBQmdBRUFBa0FBQUFQUlU1VFJ6QXdNREF3TURBd01EQXpBQVFBQ1FBQUFBOUZUbE5ITURBd01EQXdNREF3TURVQUJBQUpBQUFBRDBWT1UwY3dNREF3TURBd01EUXhPUUFFQUFrQUFBQVBSVTVUUnpBd01EQXdNREF3TkRVM0FBUUFDUUFBQUE5RlRsTkhNREF3TURBd01EQTBOakFBQkFBSkFBQUFEMFZPVTBjd01EQXdNREF3TURrek9BQUFBQTRBQUFBR1FGbERSZ1VqYjI1QUxpTzFyVGM4RDBCNzIxbmpqRjJBUUhIdzV2Y3hNWkZBZ1UzcTZoRnI3a0FXbU5GcnpPV2RBQUFBRGdBQUFBWS8ya3EyMGxXa1JEL24xbTh1dUtJWHY4bGdacnpoQUhhLzNjcHNrcS92bzcrNUZ4Y0tUYmZBUDhQYVNRZHZydjBBQUFBT0FBQUFCai9nUnM3MGVLTVlQKy9DVUU1VVEzcy8zR2RVVzIrYVp6L2crdVFpeVpzMlA5dG9oQVFlSWRrLzVQdWVKYXJJZ1FBQUFBNEFBQUFHUDlRYzRmd3dnRVUvdTFQNDdIQ01pai9qQlY0QVBlUFlQOUROc1ZGTW41OC82U1VvMXk4KzlqL21rMTI0a3RYSUFBQUFEZ0FBQUFZLzVPdnJSRm85UkQvWGttNXAwN0ZDUCtzMEF0eVhjTU0vNHpQRFVpcnlXei90MVVMZ1QwQzNQK3pOVmlwb3Ivc0FBQUFRQUFBQUJnQUVBQWtBQUFBR1ZGTlFRVTQyQUFRQUNRQUFBQVJVVGsxRUFBUUFDUUFBQUFSRVVFMHhBQVFBQ1FBQUFBVlRRMWxNTXdBRUFBa0FBQUFJUXpGdmNtWXhNVElBQkFBSkFBQUFBMFpIVWdBQUFBNEFBQUFHUDRJV2lEUzBhWkEvWVhiYnlQVFB5eiszaTZ6amdPcUZQNkptWG1xVU5tdy9zRXQ0ZnUyUHB6K09RQ3Bweko3aEFBQUFEZ0FBQUFZLzZkTjdUWFYwaFQvRmNNYjMya1BCUUI0Vy8vWUZPVVJBQ0I3ZjF0V01PRUFTMGtYdlpMRkxQKzZ5N2xjK1ZXQUFBQUFPQUFBQUJqK1NKVDBqcm5zVlAyV3FqY2RDOWtBL3NxL25GWGFPRFQrWGorQ1ZmemlyUDdUSk9aNWQxNE0vYWYvZFZZT04rUUFBQUE0QUFBQUdQL284aDY5TEZrWS94RS9rNnM3RzdFQVljQjlxZ01kVVAvKzgxYTdqRnRCQUdiVWR1UzJ6d3ovT2Q5ZGdOaXBoQUFBQURnQUFBQVkvcXF5a2ZmWmVHaitCZzNQQjVQMGZQN2JWdTF4UTkxZy9xdkdlWldCS1hUKzc2NmhNUUVMU1AyQXFranpUWDhjQUFBQU9BQUFBQmtBVFVERUpxb1ZPUCtxRjErdkt5VFJBSUpwald2Z1YwMEFVUXErYk91ZnJRQ05RTVFtcWhVMC95VUtFZndwRnVBQUFBQTRBQUFBR1A3QlZGeUtpclFzL2RuWGM5YWtndkQvT3ZBMUlLTkZGUDhIaWQzdWMrdGcvMFRrbVhHRVRrajl3YWRLemhYQ0hBQUFBRGdBQUFBWkFGL1ZxN2d4QmpEL2Z1RXlxNzhhUFFEUU9rK0hmY1haQUtOTElRUUZ1UjBBMU5OU2VNZFdDUDlieVFscjV0Y01BQUFBT0FBQUFCajlQSmZaRUl3cTFBQUFBQUFBQUFBQS9qRHBuTGIvQnNEOTNYSGl6R2tmOVA0Q01LdFF5bmF3L1R5WDJSQ01LdFFBQUFBNEFBQUFHUDdoVnFHVTdZRjBBQUFBQUFBQUFBRC96eFpqU1FENU1QK0M2NDhXWTBrQS80OFdZMGtBK1REKzRWYWhsTzJCZEFBQUFEZ0FBQUFZL2w1Tlk2OEY1TlQ5bVFmZTZBV1FQUDdSUlJSUlJSUlEvckRBdEdlSERBaisxaG9qWFFWaHBQMkdTWlVJQkdSc0FBQUFPQUFBQUJrQUI5ZmdxZHg5ZlA5RmppWWxSRmpoQUhZUG1GTjNZUDBBVWVrVlY2MGVsUUI3VXNWUk83VXMveDh1VHlXRjh1Z0FBQUE0QUFBQUdQNTVoakZCZnJYay9XV1NqSU1vODFUL0ZtSEdXdmtkQVA4Y1J0bndUS0lBL3g1dVBxSHdFcFQrQ2wyVWx1S04wQUFBQURnQUFBQVpBQmcxdTlBTVBqei9DYTkweXBQK2lRQ3hSZ2VKNEcyOUFMVnZvaUxiM2FrQXRXK2lJdHZkcVAra205OTNEdjRBQUFBQU9BQUFBQmorbEwvYW9WTC9iUDBBRUFRQkFFQVEvMnY2L3IrdjdBRC9HcGFscVdwYW1QOXZNU0dkdk1TTS9ickpYUUhySld3QUFBQTRBQUFBR1FBN2p1TzQ3anVRL3FRWkJrR1FaQmtBOHROZmdvdE5nUUN6V05ZMWpXTmRBT3F1QU5XS3VBVC9WNVhsZVY1WGxBQUFBRGdBQUFBWS9veUdzVEs0d2hUK3ZlWFpNbW5EY1A4SDBnWEpKcS80L3M0NUtjWHBQaVQvQ0RURUdTWVIrUDRSZHB1WkYwSXNBQUFBT0FBQUFCa0FNa1M4RTBrcm9RQkxzbVRUaHVLVkFLVmZBSUJkem1rQWNrUzhFMGtyb1FDaFJkcHVaRjBJLzdXa3ZVOUR4VGdBQUFBNEFBQUFHUDNxWCtWb0JxWDgvV1cvNXBBR1hBRC9BMW52S1lRMW9QNjFFZUs3aDFFZy92b2c0WGZIb2hEOTd2L2tRQWJ2OUFBQUFEZ0FBQUFZLzVGTWE2emxGTWovQ0VQdDd3U0VRUUNZVEpuczJZVE5BRldXMnBwSldYRUFqVmkwcWRMVmlQK0w0TzBIeEw0UUFBQVFDQUFBQUFRQUVBQWtBQUFBRmJtRnRaWE1BQUFBUUFBQUFHd0FFQUFrQUFBQUtaVzV6WlcxaWJGOXBaQUFFQUFrQUFBQUlZbUZ6WlUxbFlXNEFCQUFKQUFBQURteHZaekpHYjJ4a1EyaGhibWRsQUFRQUNRQUFBQVZzWm1OVFJRQUVBQWtBQUFBR2NIWmhiSFZsQUFRQUNRQUFBQVJ3WVdScUFBUUFDUUFBQUF0blpXNWxYM041YldKdmJBQUVBQWtBQUFBUVUwTlFRMHd3TURBME56Z3ViV1ZoYmdBRUFBa0FBQUFVVTBOUVEwd3dNREEwTnpndVpHVjBaV04wWldRQUJBQUpBQUFBRUZORFVFTk1NREF3TkRjNUxtMWxZVzRBQkFBSkFBQUFGRk5EVUVOTU1EQXdORGM1TG1SbGRHVmpkR1ZrQUFRQUNRQUFBQkJUUTFCRFREQXdNRFE0TUM1dFpXRnVBQVFBQ1FBQUFCUlRRMUJEVERBd01EUTRNQzVrWlhSbFkzUmxaQUFFQUFrQUFBQVFVME5RUTB3d01EQTBPREV1YldWaGJnQUVBQWtBQUFBVVUwTlFRMHd3TURBME9ERXVaR1YwWldOMFpXUUFCQUFKQUFBQUVGTkRVRU5NTURBd05EZ3pMbTFsWVc0QUJBQUpBQUFBRkZORFVFTk1NREF3TkRnekxtUmxkR1ZqZEdWa0FBUUFDUUFBQUJCVFExQkRUREF3TURRNE5DNXRaV0Z1QUFRQUNRQUFBQlJUUTFCRFREQXdNRFE0TkM1a1pYUmxZM1JsWkFBRUFBa0FBQUFRVTBOUVEwd3dNREEwT0RndWJXVmhiZ0FFQUFrQUFBQVVVME5RUTB3d01EQTBPRGd1WkdWMFpXTjBaV1FBQkFBSkFBQUFFRk5EVUVOTU1EQXdORGt4TG0xbFlXNEFCQUFKQUFBQUZGTkRVRU5NTURBd05Ea3hMbVJsZEdWamRHVmtBQVFBQ1FBQUFCQlRRMUJEVERBd01EUTVOUzV0WldGdUFBUUFDUUFBQUJSVFExQkRUREF3TURRNU5TNWtaWFJsWTNSbFpBQUVBQWtBQUFBUVUwTlFRMHd3TURBME9UZ3ViV1ZoYmdBRUFBa0FBQUFVVTBOUVEwd3dNREEwT1RndVpHVjBaV04wWldRQUFBUUNBQUFBQVFBRUFBa0FBQUFKY205M0xtNWhiV1Z6QUFBQURRQUFBQUtBQUFBQS8vLy8rZ0FBQkFJQUFBQUJBQVFBQ1FBQUFBVmpiR0Z6Y3dBQUFCQUFBQUFCQUFRQUNRQUFBQXBrWVhSaExtWnlZVzFsQUFBQS9nQUFCQUlBQUFBQkFBUUFDUUFBQUFkdmNIUnBiMjV6QUFBQ0V3QUFBQVlBQUFBUUFBQUFBUUFFQUFrQUFBQUJjZ0FBQUJBQUFBQUJBQVFBQ1FBQUFBcGtaWE5sY1Y5b1pXRmtBQUFBRUFBQUFBRUFCQUFKQUFBQUEzQnVad0FBQUFvQUFBQUJBQUFBQUFBQUFBMEFBQUFCQUFBQUJnQUFBQTBBQUFBQkFBQUFHd0FBQkFJQUFBTC9BQUFBRUFBQUFBWUFCQUFKQUFBQUJtVnVaMmx1WlFBRUFBa0FBQUFGYkdGaVpXd0FCQUFKQUFBQUEyUmxkZ0FFQUFrQUFBQU9jbTkzYm1GdFpYTXVjSEpwYm5RQUJBQUpBQUFBQ25KdmQzTXVkRzkwWVd3QUJBQUpBQUFBQ21OdmJITXVkRzkwWVd3QUFBRCtBQUFBL2c9PSJ9 --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":["ensembl_id"],"name":[1],"type":["chr"],"align":["left"]},{"label":["baseMean"],"name":[2],"type":["dbl"],"align":["right"]},{"label":["log2FoldChange"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["lfcSE"],"name":[4],"type":["dbl"],"align":["right"]},{"label":["pvalue"],"name":[5],"type":["dbl"],"align":["right"]},{"label":["padj"],"name":[6],"type":["dbl"],"align":["right"]},{"label":["gene_symbol"],"name":[7],"type":["chr"],"align":["left"]},{"label":["SCPCL000478.mean"],"name":[8],"type":["dbl"],"align":["right"]},{"label":["SCPCL000478.detected"],"name":[9],"type":["dbl"],"align":["right"]},{"label":["SCPCL000479.mean"],"name":[10],"type":["dbl"],"align":["right"]},{"label":["SCPCL000479.detected"],"name":[11],"type":["dbl"],"align":["right"]},{"label":["SCPCL000480.mean"],"name":[12],"type":["dbl"],"align":["right"]},{"label":["SCPCL000480.detected"],"name":[13],"type":["dbl"],"align":["right"]},{"label":["SCPCL000481.mean"],"name":[14],"type":["dbl"],"align":["right"]},{"label":["SCPCL000481.detected"],"name":[15],"type":["dbl"],"align":["right"]},{"label":["SCPCL000483.mean"],"name":[16],"type":["dbl"],"align":["right"]},{"label":["SCPCL000483.detected"],"name":[17],"type":["dbl"],"align":["right"]},{"label":["SCPCL000484.mean"],"name":[18],"type":["dbl"],"align":["right"]},{"label":["SCPCL000484.detected"],"name":[19],"type":["dbl"],"align":["right"]},{"label":["SCPCL000488.mean"],"name":[20],"type":["dbl"],"align":["right"]},{"label":["SCPCL000488.detected"],"name":[21],"type":["dbl"],"align":["right"]},{"label":["SCPCL000491.mean"],"name":[22],"type":["dbl"],"align":["right"]},{"label":["SCPCL000491.detected"],"name":[23],"type":["dbl"],"align":["right"]},{"label":["SCPCL000495.mean"],"name":[24],"type":["dbl"],"align":["right"]},{"label":["SCPCL000495.detected"],"name":[25],"type":["dbl"],"align":["right"]},{"label":["SCPCL000498.mean"],"name":[26],"type":["dbl"],"align":["right"]},{"label":["SCPCL000498.detected"],"name":[27],"type":["dbl"],"align":["right"]}],"data":[{"1":"ENSG00000000003","2":"101.051149","3":"0.41081019","4":"0.5086436","5":"0.3142629","6":"0.6537987","7":"TSPAN6","8":"0.008832039","9":"0.8070656","10":"0.017720180","11":"1.6397778","12":"0.052098408","13":"4.8283121","14":"0.063798376","15":"5.9896657","16":"0.0009505703","17":"0.09505703","18":"0.023023023","19":"2.2451022","20":"0.029668991","21":"2.7565593","22":"0.0413815575","23":"3.86119257","24":"0.037366280","25":"3.570890","26":"0.006492590","27":"0.6351447"},{"1":"ENSG00000000005","2":"15.069745","3":"0.74492606","4":"0.9924699","5":"0.1067501","6":"0.3683125","7":"TNMD","8":"0.002131871","9":"0.1675042","10":"0.002644803","11":"0.1586882","12":"0.008551506","13":"0.8288383","14":"0.005483497","15":"0.4956237","16":"0.0000000000","17":"0.00000000","18":"0.002717003","19":"0.2717003","20":"0.001549873","21":"0.1439167","22":"0.0004887586","23":"0.04887586","24":"0.061473557","25":"4.731053","26":"0.001552576","27":"0.1411433"},{"1":"ENSG00000000419","2":"445.709446","3":"-0.19825443","4":"0.4438067","5":"0.5944052","6":"0.8500990","7":"DPM1","8":"0.091975027","9":"7.5224608","10":"0.072996562","11":"6.1094948","12":"0.089198790","13":"8.3015393","14":"0.240113888","15":"20.0569440","16":"0.0137832700","17":"1.23574144","18":"0.079365079","19":"7.3788074","20":"0.168714713","21":"14.1591941","22":"0.4217986315","23":"28.70641903","24":"0.140274220","25":"12.671388","26":"0.131545519","27":"11.0374030"},{"1":"ENSG00000000457","2":"287.056388","3":"-0.46547999","4":"0.5306264","5":"0.2625545","6":"0.6000687","7":"SCYL3","8":"0.035937262","9":"3.0150754","10":"0.023009786","11":"1.9836022","12":"0.052624655","13":"5.0651230","14":"0.139723716","15":"12.4116841","16":"0.0057034221","17":"0.52281369","18":"0.055055055","19":"5.1194051","20":"0.180228053","21":"14.6795085","22":"0.1769305963","23":"14.41837732","24":"0.076389935","25":"7.141781","26":"0.057163020","27":"5.3493296"},{"1":"ENSG00000000460","2":"553.739704","3":"-0.09800858","4":"0.4282541","5":"0.7857861","6":"0.9322829","7":"C1orf112","8":"0.063651591","9":"4.7053449","10":"0.081195451","11":"6.4268712","12":"0.109064597","13":"9.6566241","14":"0.269113150","15":"21.2063693","16":"0.0080798479","17":"0.61787072","18":"0.084084084","19":"7.7077077","20":"0.184434850","21":"14.6795085","22":"0.4343434343","23":"26.66992506","24":"0.141027573","25":"12.159108","26":"0.119266055","27":"9.6683133"},{"1":"ENSG00000000938","2":"5.649236","3":"0.15509904","4":"0.6557151","5":"0.7054890","6":"0.9000655","7":"FGR","8":"0.014770824","9":"0.9593422","10":"0.003173764","11":"0.2380323","12":"0.001973425","13":"0.1973425","14":"0.004007171","15":"0.3585363","16":"0.0009505703","17":"0.09505703","18":"0.002145002","19":"0.1859002","20":"0.009077826","21":"0.7860069","22":"0.0037471489","23":"0.34213099","24":"0.009944252","25":"0.919090","26":"0.006774876","27":"0.5928017"}],"options":{"columns":{"min":{},"max":[10],"total":[27]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}} +{"columns":[{"label":["ensembl_id"],"name":[1],"type":["chr"],"align":["left"]},{"label":["baseMean"],"name":[2],"type":["dbl"],"align":["right"]},{"label":["log2FoldChange"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["lfcSE"],"name":[4],"type":["dbl"],"align":["right"]},{"label":["pvalue"],"name":[5],"type":["dbl"],"align":["right"]},{"label":["padj"],"name":[6],"type":["dbl"],"align":["right"]},{"label":["gene_symbol"],"name":[7],"type":["chr"],"align":["left"]},{"label":["SCPCL000478.mean"],"name":[8],"type":["dbl"],"align":["right"]},{"label":["SCPCL000478.detected"],"name":[9],"type":["dbl"],"align":["right"]},{"label":["SCPCL000479.mean"],"name":[10],"type":["dbl"],"align":["right"]},{"label":["SCPCL000479.detected"],"name":[11],"type":["dbl"],"align":["right"]},{"label":["SCPCL000480.mean"],"name":[12],"type":["dbl"],"align":["right"]},{"label":["SCPCL000480.detected"],"name":[13],"type":["dbl"],"align":["right"]},{"label":["SCPCL000481.mean"],"name":[14],"type":["dbl"],"align":["right"]},{"label":["SCPCL000481.detected"],"name":[15],"type":["dbl"],"align":["right"]},{"label":["SCPCL000483.mean"],"name":[16],"type":["dbl"],"align":["right"]},{"label":["SCPCL000483.detected"],"name":[17],"type":["dbl"],"align":["right"]},{"label":["SCPCL000484.mean"],"name":[18],"type":["dbl"],"align":["right"]},{"label":["SCPCL000484.detected"],"name":[19],"type":["dbl"],"align":["right"]},{"label":["SCPCL000488.mean"],"name":[20],"type":["dbl"],"align":["right"]},{"label":["SCPCL000488.detected"],"name":[21],"type":["dbl"],"align":["right"]},{"label":["SCPCL000491.mean"],"name":[22],"type":["dbl"],"align":["right"]},{"label":["SCPCL000491.detected"],"name":[23],"type":["dbl"],"align":["right"]},{"label":["SCPCL000495.mean"],"name":[24],"type":["dbl"],"align":["right"]},{"label":["SCPCL000495.detected"],"name":[25],"type":["dbl"],"align":["right"]},{"label":["SCPCL000498.mean"],"name":[26],"type":["dbl"],"align":["right"]},{"label":["SCPCL000498.detected"],"name":[27],"type":["dbl"],"align":["right"]}],"data":[{"1":"ENSG00000000003","2":"101.051149","3":"0.41081019","4":"0.5086436","5":"0.3142629","6":"0.6537987","7":"TSPAN6","8":"0.008832039","9":"0.8070656","10":"0.017720180","11":"1.6397778","12":"0.052098408","13":"4.8283121","14":"0.063798376","15":"5.9896657","16":"0.0009505703","17":"0.09505703","18":"0.023023023","19":"2.2451022","20":"0.029668991","21":"2.7565593","22":"0.0413815575","23":"3.86119257","24":"0.037366280","25":"3.570890","26":"0.006492590","27":"0.6351447"},{"1":"ENSG00000000005","2":"15.069745","3":"0.74492606","4":"0.9924699","5":"0.1067501","6":"0.3683125","7":"TNMD","8":"0.002131871","9":"0.1675042","10":"0.002644803","11":"0.1586882","12":"0.008551506","13":"0.8288383","14":"0.005483497","15":"0.4956237","16":"0.0000000000","17":"0.00000000","18":"0.002717003","19":"0.2717003","20":"0.001549873","21":"0.1439167","22":"0.0004887586","23":"0.04887586","24":"0.061473557","25":"4.731053","26":"0.001552576","27":"0.1411433"},{"1":"ENSG00000000419","2":"445.709446","3":"-0.19825443","4":"0.4438067","5":"0.5944052","6":"0.8500990","7":"DPM1","8":"0.091975027","9":"7.5224608","10":"0.072996562","11":"6.1094948","12":"0.089198790","13":"8.3015393","14":"0.240113888","15":"20.0569440","16":"0.0137832700","17":"1.23574144","18":"0.079365079","19":"7.3788074","20":"0.168714713","21":"14.1591941","22":"0.4217986315","23":"28.70641903","24":"0.140274220","25":"12.671388","26":"0.131545519","27":"11.0374030"},{"1":"ENSG00000000457","2":"287.056388","3":"-0.46547999","4":"0.5306264","5":"0.2625545","6":"0.6000687","7":"SCYL3","8":"0.035937262","9":"3.0150754","10":"0.023009786","11":"1.9836022","12":"0.052624655","13":"5.0651230","14":"0.139723716","15":"12.4116841","16":"0.0057034221","17":"0.52281369","18":"0.055055055","19":"5.1194051","20":"0.180228053","21":"14.6795085","22":"0.1769305963","23":"14.41837732","24":"0.076389935","25":"7.141781","26":"0.057163020","27":"5.3493296"},{"1":"ENSG00000000460","2":"553.739704","3":"-0.09800858","4":"0.4282541","5":"0.7857861","6":"0.9322829","7":"C1orf112","8":"0.063651591","9":"4.7053449","10":"0.081195451","11":"6.4268712","12":"0.109064597","13":"9.6566241","14":"0.269113150","15":"21.2063693","16":"0.0080798479","17":"0.61787072","18":"0.084084084","19":"7.7077077","20":"0.184434850","21":"14.6795085","22":"0.4343434343","23":"26.66992506","24":"0.141027573","25":"12.159108","26":"0.119266055","27":"9.6683133"},{"1":"ENSG00000000938","2":"5.649236","3":"0.15509904","4":"0.6557151","5":"0.7054890","6":"0.9000655","7":"FGR","8":"0.014770824","9":"0.9593422","10":"0.003173764","11":"0.2380323","12":"0.001973425","13":"0.1973425","14":"0.004007171","15":"0.3585363","16":"0.0009505703","17":"0.09505703","18":"0.002145002","19":"0.1859002","20":"0.009077826","21":"0.7860069","22":"0.0037471489","23":"0.34213099","24":"0.009944252","25":"0.919090","26":"0.006774876","27":"0.5928017"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>This data frame uses Ensembl gene identifiers. We’ll need to make @@ -3131,16 +3129,14 @@ <h2>DESeq2 results</h2> sets.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuaGVhZChoc19oYWxsbWFya3NfZGYpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiaGVhZChoc19oYWxsbWFya3NfZGYpIn0= --> <pre class="r"><code>head(hs_hallmarks_df)</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInRibF9kZiIsInRibCIsImRhdGEuZnJhbWUiXSwibnJvdyI6NiwibmNvbCI6MTUsInN1bW1hcnkiOnsiQSB0aWJibGUiOlsiNiDDlyAxNSJdfX0sInJkZiI6IlVrUllNd3BZQ2dBQUFBTUFCQVFBQUFNRkFBQUFBQVZWVkVZdE9BQUFCQUlBQUFBQkFBUUFDUUFBQUFGNEFBQURFd0FBQUE4QUFBQVFBQUFBQmdBRUFBa0FBQUFCU0FBRUFBa0FBQUFCU0FBRUFBa0FBQUFCU0FBRUFBa0FBQUFCU0FBRUFBa0FBQUFCU0FBRUFBa0FBQUFCU0FBQUFCQUFBQUFHQUFRQUNRQUFBQUFBQkFBSkFBQUFBQUFFQUFrQUFBQUFBQVFBQ1FBQUFBQUFCQUFKQUFBQUFBQUVBQWtBQUFBQUFBQUFFQUFBQUFZQUJBQUpBQUFBRlVoQlRFeE5RVkpMWDBGRVNWQlBSMFZPUlZOSlV3QUVBQWtBQUFBVlNFRk1URTFCVWt0ZlFVUkpVRTlIUlU1RlUwbFRBQVFBQ1FBQUFCVklRVXhNVFVGU1MxOUJSRWxRVDBkRlRrVlRTVk1BQkFBSkFBQUFGVWhCVEV4TlFWSkxYMEZFU1ZCUFIwVk9SVk5KVXdBRUFBa0FBQUFWU0VGTVRFMUJVa3RmUVVSSlVFOUhSVTVGVTBsVEFBUUFDUUFBQUJWSVFVeE1UVUZTUzE5QlJFbFFUMGRGVGtWVFNWTUFBQUFRQUFBQUJnQUVBQWtBQUFBRlFVSkRRVEVBQkFBSkFBQUFCVUZDUTBJNEFBUUFDUUFBQUFWQlEwRkJNZ0FFQUFrQUFBQUZRVU5CUkV3QUJBQUpBQUFBQlVGRFFVUk5BQVFBQ1FBQUFBVkJRMEZFVXdBQUFBMEFBQUFHQUFBQUV3QUFLN29BQUNqUkFBQUFJUUFBQUNJQUFBQWpBQUFBRUFBQUFBWUFCQUFKQUFBQUQwVk9VMGN3TURBd01ERTJOVEF5T1FBRUFBa0FBQUFQUlU1VFJ6QXdNREF3TVRrM01UVXdBQVFBQ1FBQUFBOUZUbE5ITURBd01EQXhOamN6TVRVQUJBQUpBQUFBRDBWT1UwY3dNREF3TURFeE5UTTJNUUFFQUFrQUFBQVBSVTVUUnpBd01EQXdNVEUzTURVMEFBUUFDUUFBQUE5RlRsTkhNREF3TURBeE1qSTVOekVBQUFBUUFBQUFCZ0FFQUFrQUFBQUZRVUpEUVRFQUJBQUpBQUFBQlVGQ1EwSTRBQVFBQ1FBQUFBVkJRMEZCTWdBRUFBa0FBQUFGUVVOQlJFd0FCQUFKQUFBQUJVRkRRVVJOQUFRQUNRQUFBQVZCUTBGRVV3QUFBQTBBQUFBR0FBQUFFd0FBSzdvQUFDalJBQUFBSVFBQUFDSUFBQUFqQUFBQUVBQUFBQVlBQkFBSkFBQUFEMFZPVTBjd01EQXdNREUyTlRBeU9RQUVBQWtBQUFBUFJVNVRSekF3TURBd01UazNNVFV3QUFRQUNRQUFBQTlGVGxOSE1EQXdNREF4Tmpjek1UVUFCQUFKQUFBQUQwVk9VMGN3TURBd01ERXhOVE0yTVFBRUFBa0FBQUFQUlU1VFJ6QXdNREF3TVRFM01EVTBBQVFBQ1FBQUFBOUZUbE5ITURBd01EQXhNakk1TnpFQUFBQVFBQUFBQmdBRUFBa0FBQUFGVFRVNU1EVUFCQUFKQUFBQUJVMDFPVEExQUFRQUNRQUFBQVZOTlRrd05RQUVBQWtBQUFBRlRUVTVNRFVBQkFBSkFBQUFCVTAxT1RBMUFBUUFDUUFBQUFWTk5Ua3dOUUFBQUJBQUFBQUdBQVFBQ1FBQUFBZ3lOamMzTVRBeU1RQUVBQWtBQUFBSU1qWTNOekV3TWpFQUJBQUpBQUFBQ0RJMk56Y3hNREl4QUFRQUNRQUFBQWd5TmpjM01UQXlNUUFFQUFrQUFBQUlNalkzTnpFd01qRUFCQUFKQUFBQUNESTJOemN4TURJeEFBQUFFQUFBQUFZQUJBQUpBQUFBQUFBRUFBa0FBQUFBQUFRQUNRQUFBQUFBQkFBSkFBQUFBQUFFQUFrQUFBQUFBQVFBQ1FBQUFBQUFBQUFRQUFBQUJnQUVBQWtBQUFBQUFBUUFDUUFBQUFBQUJBQUpBQUFBQUFBRUFBa0FBQUFBQUFRQUNRQUFBQUFBQkFBSkFBQUFBQUFBQUJBQUFBQUdBQVFBQ1FBQUFBQUFCQUFKQUFBQUFBQUVBQWtBQUFBQUFBUUFDUUFBQUFBQUJBQUpBQUFBQUFBRUFBa0FBQUFBQUFBQUVBQUFBQVlBQkFBSkFBQUFRMGRsYm1WeklIVndMWEpsWjNWc1lYUmxaQ0JrZFhKcGJtY2dZV1JwY0c5amVYUmxJR1JwWm1abGNtVnVkR2xoZEdsdmJpQW9ZV1JwY0c5blpXNWxjMmx6S1M0QUJBQUpBQUFBUTBkbGJtVnpJSFZ3TFhKbFozVnNZWFJsWkNCa2RYSnBibWNnWVdScGNHOWplWFJsSUdScFptWmxjbVZ1ZEdsaGRHbHZiaUFvWVdScGNHOW5aVzVsYzJsektTNEFCQUFKQUFBQVEwZGxibVZ6SUhWd0xYSmxaM1ZzWVhSbFpDQmtkWEpwYm1jZ1lXUnBjRzlqZVhSbElHUnBabVpsY21WdWRHbGhkR2x2YmlBb1lXUnBjRzluWlc1bGMybHpLUzRBQkFBSkFBQUFRMGRsYm1WeklIVndMWEpsWjNWc1lYUmxaQ0JrZFhKcGJtY2dZV1JwY0c5amVYUmxJR1JwWm1abGNtVnVkR2xoZEdsdmJpQW9ZV1JwY0c5blpXNWxjMmx6S1M0QUJBQUpBQUFBUTBkbGJtVnpJSFZ3TFhKbFozVnNZWFJsWkNCa2RYSnBibWNnWVdScGNHOWplWFJsSUdScFptWmxjbVZ1ZEdsaGRHbHZiaUFvWVdScGNHOW5aVzVsYzJsektTNEFCQUFKQUFBQVEwZGxibVZ6SUhWd0xYSmxaM1ZzWVhSbFpDQmtkWEpwYm1jZ1lXUnBjRzlqZVhSbElHUnBabVpsY21WdWRHbGhkR2x2YmlBb1lXUnBjRzluWlc1bGMybHpLUzRBQUFRQ0FBQUFBUUFFQUFrQUFBQUZibUZ0WlhNQUFBQVFBQUFBRHdBRUFBa0FBQUFHWjNOZlkyRjBBQVFBQ1FBQUFBbG5jMTl6ZFdKallYUUFCQUFKQUFBQUIyZHpYMjVoYldVQUJBQUpBQUFBQzJkbGJtVmZjM2x0WW05c0FBUUFDUUFBQUF0bGJuUnlaWHBmWjJWdVpRQUVBQWtBQUFBTVpXNXpaVzFpYkY5blpXNWxBQVFBQ1FBQUFCRm9kVzFoYmw5blpXNWxYM041YldKdmJBQUVBQWtBQUFBUmFIVnRZVzVmWlc1MGNtVjZYMmRsYm1VQUJBQUpBQUFBRW1oMWJXRnVYMlZ1YzJWdFlteGZaMlZ1WlFBRUFBa0FBQUFGWjNOZmFXUUFCQUFKQUFBQUIyZHpYM0J0YVdRQUJBQUpBQUFBQ0dkelgyZGxiMmxrQUFRQUNRQUFBQTluYzE5bGVHRmpkRjl6YjNWeVkyVUFCQUFKQUFBQUJtZHpYM1Z5YkFBRUFBa0FBQUFPWjNOZlpHVnpZM0pwY0hScGIyNEFBQVFDQUFBQUFRQUVBQWtBQUFBSmNtOTNMbTVoYldWekFBQUFEUUFBQUFLQUFBQUEvLy8vK2dBQUJBSUFBQUFCQUFRQUNRQUFBQVZqYkdGemN3QUFBQkFBQUFBQkFBUUFDUUFBQUFwa1lYUmhMbVp5WVcxbEFBQUEvZ0FBQkFJQUFBQUJBQVFBQ1FBQUFBZHZjSFJwYjI1ekFBQUNFd0FBQUFjQUFBQVFBQUFBQVFBRUFBa0FBQUFCY2dBQUFCQUFBQUFCQUFRQUNRQUFBQTFvWVd4c2JXRnlhMTlvWldGa0FBQUFDZ0FBQUFFQUFBQUJBQUFBRUFBQUFBRUFCQUFKQUFBQUEzQnVad0FBQUFvQUFBQUJBQUFBQUFBQUFBMEFBQUFCQUFBQUJnQUFBQTBBQUFBQkFBQUFEd0FBQkFJQUFBTC9BQUFBRUFBQUFBY0FCQUFKQUFBQUJtVnVaMmx1WlFBRUFBa0FBQUFGYkdGaVpXd0FCQUFKQUFBQUJHeHBkbVVBQkFBSkFBQUFBMlJsZGdBRUFBa0FBQUFPY205M2JtRnRaWE11Y0hKcGJuUUFCQUFKQUFBQUNuSnZkM011ZEc5MFlXd0FCQUFKQUFBQUNtTnZiSE11ZEc5MFlXd0FBQUQrQUFBQS9nPT0ifQ== --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":["gs_cat"],"name":[1],"type":["chr"],"align":["left"]},{"label":["gs_subcat"],"name":[2],"type":["chr"],"align":["left"]},{"label":["gs_name"],"name":[3],"type":["chr"],"align":["left"]},{"label":["gene_symbol"],"name":[4],"type":["chr"],"align":["left"]},{"label":["entrez_gene"],"name":[5],"type":["int"],"align":["right"]},{"label":["ensembl_gene"],"name":[6],"type":["chr"],"align":["left"]},{"label":["human_gene_symbol"],"name":[7],"type":["chr"],"align":["left"]},{"label":["human_entrez_gene"],"name":[8],"type":["int"],"align":["right"]},{"label":["human_ensembl_gene"],"name":[9],"type":["chr"],"align":["left"]},{"label":["gs_id"],"name":[10],"type":["chr"],"align":["left"]},{"label":["gs_pmid"],"name":[11],"type":["chr"],"align":["left"]},{"label":["gs_geoid"],"name":[12],"type":["chr"],"align":["left"]},{"label":["gs_exact_source"],"name":[13],"type":["chr"],"align":["left"]},{"label":["gs_url"],"name":[14],"type":["chr"],"align":["left"]},{"label":["gs_description"],"name":[15],"type":["chr"],"align":["left"]}],"data":[{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ABCA1","5":"19","6":"ENSG00000165029","7":"ABCA1","8":"19","9":"ENSG00000165029","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ABCB8","5":"11194","6":"ENSG00000197150","7":"ABCB8","8":"11194","9":"ENSG00000197150","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACAA2","5":"10449","6":"ENSG00000167315","7":"ACAA2","8":"10449","9":"ENSG00000167315","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADL","5":"33","6":"ENSG00000115361","7":"ACADL","8":"33","9":"ENSG00000115361","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADM","5":"34","6":"ENSG00000117054","7":"ACADM","8":"34","9":"ENSG00000117054","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADS","5":"35","6":"ENSG00000122971","7":"ACADS","8":"35","9":"ENSG00000122971","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."}],"options":{"columns":{"min":{},"max":[10],"total":[15]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}} +{"columns":[{"label":["gs_cat"],"name":[1],"type":["chr"],"align":["left"]},{"label":["gs_subcat"],"name":[2],"type":["chr"],"align":["left"]},{"label":["gs_name"],"name":[3],"type":["chr"],"align":["left"]},{"label":["gene_symbol"],"name":[4],"type":["chr"],"align":["left"]},{"label":["entrez_gene"],"name":[5],"type":["int"],"align":["right"]},{"label":["ensembl_gene"],"name":[6],"type":["chr"],"align":["left"]},{"label":["human_gene_symbol"],"name":[7],"type":["chr"],"align":["left"]},{"label":["human_entrez_gene"],"name":[8],"type":["int"],"align":["right"]},{"label":["human_ensembl_gene"],"name":[9],"type":["chr"],"align":["left"]},{"label":["gs_id"],"name":[10],"type":["chr"],"align":["left"]},{"label":["gs_pmid"],"name":[11],"type":["chr"],"align":["left"]},{"label":["gs_geoid"],"name":[12],"type":["chr"],"align":["left"]},{"label":["gs_exact_source"],"name":[13],"type":["chr"],"align":["left"]},{"label":["gs_url"],"name":[14],"type":["chr"],"align":["left"]},{"label":["gs_description"],"name":[15],"type":["chr"],"align":["left"]}],"data":[{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ABCA1","5":"19","6":"ENSG00000165029","7":"ABCA1","8":"19","9":"ENSG00000165029","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ABCB8","5":"11194","6":"ENSG00000197150","7":"ABCB8","8":"11194","9":"ENSG00000197150","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACAA2","5":"10449","6":"ENSG00000167315","7":"ACAA2","8":"10449","9":"ENSG00000167315","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADL","5":"33","6":"ENSG00000115361","7":"ACADL","8":"33","9":"ENSG00000115361","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADM","5":"34","6":"ENSG00000117054","7":"ACADM","8":"34","9":"ENSG00000117054","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."},{"1":"H","2":"","3":"HALLMARK_ADIPOGENESIS","4":"ACADS","5":"35","6":"ENSG00000122971","7":"ACADS","8":"35","9":"ENSG00000122971","10":"M5905","11":"26771021","12":"","13":"","14":"","15":"Genes up-regulated during adipocyte differentiation (adipogenesis)."}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>We can see that the gene sets from <code>msigdbr</code> have Ensembl @@ -3161,7 +3157,7 @@ <h2>DESeq2 results</h2> frame of DESeq2 results.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYW55KGR1cGxpY2F0ZWQoZGVzZXFfZGYkZW5zZW1ibF9pZCkpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiYW55KGR1cGxpY2F0ZWQoZGVzZXFfZGYkZW5zZW1ibF9pZCkpIn0= --> <pre class="r"><code>any(duplicated(deseq_df$ensembl_id))</code></pre> <!-- rnb-source-end --> <!-- rnb-output-begin eyJkYXRhIjoiWzFdIEZBTFNFXG4ifQ== --> @@ -3177,7 +3173,7 @@ <h3>Pre-ranked list</h3> identifiers. This is step 1 – gene-level statistics.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubGZjX3ZlY3RvciA8LSBkZXNlcV9kZiB8PlxuICAjIEV4dHJhY3QgYSB2ZWN0b3Igb2YgYGxvZzJGb2xkQ2hhbmdlYCBuYW1lZCBieSBgZW5zZW1ibF9pZGBcbiAgZHBseXI6OnB1bGwobG9nMkZvbGRDaGFuZ2UsIG5hbWUgPSBlbnNlbWJsX2lkKVxubGZjX3ZlY3RvciA8LSBzb3J0KGxmY192ZWN0b3IsIGRlY3JlYXNpbmcgPSBUUlVFKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbImxmY192ZWN0b3IgPC0gZGVzZXFfZGYgfD5cbiAgIyBFeHRyYWN0IGEgdmVjdG9yIG9mIGBsb2cyRm9sZENoYW5nZWAgbmFtZWQgYnkgYGVuc2VtYmxfaWRgXG4gIGRwbHlyOjpwdWxsKGxvZzJGb2xkQ2hhbmdlLCBuYW1lID0gZW5zZW1ibF9pZCkiLCJsZmNfdmVjdG9yIDwtIHNvcnQobGZjX3ZlY3RvciwgZGVjcmVhc2luZyA9IFRSVUUpIl19 --> <pre class="r"><code>lfc_vector <- deseq_df |> # Extract a vector of `log2FoldChange` named by `ensembl_id` dplyr::pull(log2FoldChange, name = ensembl_id) @@ -3188,26 +3184,30 @@ <h3>Pre-ranked list</h3> <p>Let’s look at the top ranked values.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBMb29rIGF0IGZpcnN0IGVudHJpZXMgb2YgdGhlIGxvZyBmb2xkIGNoYW5nZSB2ZWN0b3JcbmhlYWQobGZjX3ZlY3RvcilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgTG9vayBhdCBmaXJzdCBlbnRyaWVzIG9mIHRoZSBsb2cgZm9sZCBjaGFuZ2UgdmVjdG9yIiwiaGVhZChsZmNfdmVjdG9yKSJdfQ== --> <pre class="r"><code># Look at first entries of the log fold change vector head(lfc_vector)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiRU5TRzAwMDAwMjYzMzY2IEVOU0cwMDAwMDIyMzc2MCBFTlNHMDAwMDAyNTMzNzcgRU5TRzAwMDAwMjY1ODQzIEVOU0cwMDAwMDEwNDcyMiBFTlNHMDAwMDAyMjg4MzUgXG4gICAgICAxMS4zNjQ3MTQgICAgICAgMTAuNTczNzUyICAgICAgIDEwLjQ3Njk5MCAgICAgICAxMC4xOTk0NDkgICAgICAgMTAuMDE5NjUxICAgICAgICA5Ljg5ODgxOCBcbiJ9 --> -<pre><code>ENSG00000263366 ENSG00000223760 ENSG00000253377 ENSG00000265843 ENSG00000104722 ENSG00000228835 - 11.364714 10.573752 10.476990 10.199449 10.019651 9.898818 </code></pre> +<!-- rnb-output-begin eyJkYXRhIjoiRU5TRzAwMDAwMjYzMzY2IEVOU0cwMDAwMDIyMzc2MCBFTlNHMDAwMDAyNTMzNzcgRU5TRzAwMDAwMjY1ODQzIEVOU0cwMDAwMDEwNDcyMiBcbiAgICAgIDExLjM2NDcxNCAgICAgICAxMC41NzM3NTIgICAgICAgMTAuNDc2OTkwICAgICAgIDEwLjE5OTQ0OSAgICAgICAxMC4wMTk2NTEgXG5FTlNHMDAwMDAyMjg4MzUgXG4gICAgICAgOS44OTg4MTggXG4ifQ== --> +<pre><code>ENSG00000263366 ENSG00000223760 ENSG00000253377 ENSG00000265843 ENSG00000104722 + 11.364714 10.573752 10.476990 10.199449 10.019651 +ENSG00000228835 + 9.898818 </code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>And the bottom of the list.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBMb29rIGF0IHRoZSBsYXN0IGVudHJpZXMgb2YgdGhlIGxvZyBmb2xkIGNoYW5nZSB2ZWN0b3JcbnRhaWwobGZjX3ZlY3RvcilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgTG9vayBhdCB0aGUgbGFzdCBlbnRyaWVzIG9mIHRoZSBsb2cgZm9sZCBjaGFuZ2UgdmVjdG9yIiwidGFpbChsZmNfdmVjdG9yKSJdfQ== --> <pre class="r"><code># Look at the last entries of the log fold change vector tail(lfc_vector)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiRU5TRzAwMDAwMjY5MTg2IEVOU0cwMDAwMDI2ODM4OCBFTlNHMDAwMDAxNjU2MDYgRU5TRzAwMDAwMjg1NjQwIEVOU0cwMDAwMDExODQzMiBFTlNHMDAwMDAxODQyMjEgXG4gICAgICAtMTAuOTMyMTYgICAgICAgLTExLjM1MTE5ICAgICAgIC0xMS4zNjkyNSAgICAgICAtMTEuOTAwMzQgICAgICAgLTExLjkyMDgyICAgICAgIC0xMi4xMjU3NyBcbiJ9 --> -<pre><code>ENSG00000269186 ENSG00000268388 ENSG00000165606 ENSG00000285640 ENSG00000118432 ENSG00000184221 - -10.93216 -11.35119 -11.36925 -11.90034 -11.92082 -12.12577 </code></pre> +<!-- rnb-output-begin eyJkYXRhIjoiRU5TRzAwMDAwMjY5MTg2IEVOU0cwMDAwMDI2ODM4OCBFTlNHMDAwMDAxNjU2MDYgRU5TRzAwMDAwMjg1NjQwIEVOU0cwMDAwMDExODQzMiBcbiAgICAgIC0xMC45MzIxNiAgICAgICAtMTEuMzUxMTkgICAgICAgLTExLjM2OTI1ICAgICAgIC0xMS45MDAzNCAgICAgICAtMTEuOTIwODIgXG5FTlNHMDAwMDAxODQyMjEgXG4gICAgICAtMTIuMTI1NzcgXG4ifQ== --> +<pre><code>ENSG00000269186 ENSG00000268388 ENSG00000165606 ENSG00000285640 ENSG00000118432 + -10.93216 -11.35119 -11.36925 -11.90034 -11.92082 +ENSG00000184221 + -12.12577 </code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3221,7 +3221,7 @@ <h2>Run GSEA</h2> specific, commonly used gene sets (e.g., <code>gseKEGG()</code>).</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ3NlYV9yZXN1bHRzIDwtIEdTRUEoZ2VuZUxpc3QgPSBsZmNfdmVjdG9yLCAgIyBvcmRlcmVkIHJhbmtlZCBnZW5lIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgIG1pbkdTU2l6ZSA9IDI1LCAgIyBtaW5pbXVtIGdlbmUgc2V0IHNpemVcbiAgICAgICAgICAgICAgICAgICAgIG1heEdTU2l6ZSA9IDUwMCwgICMgbWF4aW11bSBnZW5lIHNldCBzZXRcbiAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsXG4gICAgICAgICAgICAgICAgICAgICBwQWRqdXN0TWV0aG9kID0gXCJCSFwiLCAgIyBjb3JyZWN0aW9uIGZvciBtdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgIFRFUk0yR0VORSA9IGRwbHlyOjpzZWxlY3QoaHNfaGFsbG1hcmtzX2RmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmUpKSAgIyBwYXNzIHRoZSBjb3JyZWN0IGlkZW50aWZpZXIgY29sdW1uXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZ3NlYV9yZXN1bHRzIDwtIEdTRUEoZ2VuZUxpc3QgPSBsZmNfdmVjdG9yLCAgIyBvcmRlcmVkIHJhbmtlZCBnZW5lIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgIG1pbkdTU2l6ZSA9IDI1LCAgIyBtaW5pbXVtIGdlbmUgc2V0IHNpemVcbiAgICAgICAgICAgICAgICAgICAgIG1heEdTU2l6ZSA9IDUwMCwgICMgbWF4aW11bSBnZW5lIHNldCBzZXRcbiAgICAgICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsXG4gICAgICAgICAgICAgICAgICAgICBwQWRqdXN0TWV0aG9kID0gXCJCSFwiLCAgIyBjb3JyZWN0aW9uIGZvciBtdWx0aXBsZSBoeXBvdGhlc2lzIHRlc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgIFRFUk0yR0VORSA9IGRwbHlyOjpzZWxlY3QoaHNfaGFsbG1hcmtzX2RmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnNlbWJsX2dlbmUpKSAgIyBwYXNzIHRoZSBjb3JyZWN0IGlkZW50aWZpZXIgY29sdW1uIn0= --> <pre class="r"><code>gsea_results <- GSEA(geneList = lfc_vector, # ordered ranked gene list minGSSize = 25, # minimum gene set size maxGSSize = 500, # maximum gene set set @@ -3231,17 +3231,25 @@ <h2>Run GSEA</h2> gs_name, ensembl_gene)) # pass the correct identifier column</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoidXNpbmcgJ2Znc2VhJyBmb3IgR1NFQSBhbmFseXNpcywgcGxlYXNlIGNpdGUgS29yb3RrZXZpY2ggZXQgYWwgKDIwMTkpLlxuXG5wcmVwYXJpbmcgZ2VuZVNldCBjb2xsZWN0aW9ucy4uLlxuR1NFQSBhbmFseXNpcy4uLlxuV2FybmluZyBpbiBwcmVwYXJlUGF0aHdheXNBbmRTdGF0cyhwYXRod2F5cywgc3RhdHMsIG1pblNpemUsIG1heFNpemUsIGdzZWFQYXJhbSwgIDpcbiAgVGhlcmUgYXJlIHRpZXMgaW4gdGhlIHByZXJhbmtlZCBzdGF0cyAoMjAuMzIlIG9mIHRoZSBsaXN0KS5cblRoZSBvcmRlciBvZiB0aG9zZSB0aWVkIGdlbmVzIHdpbGwgYmUgYXJiaXRyYXJ5LCB3aGljaCBtYXkgcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG5sZWFkaW5nIGVkZ2UgYW5hbHlzaXMuLi5cbmRvbmUuLi5cbiJ9 --> -<pre><code>using 'fgsea' for GSEA analysis, please cite Korotkevich et al (2019). - -preparing geneSet collections... -GSEA analysis... -Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam, : - There are ties in the preranked stats (20.32% of the list). -The order of those tied genes will be arbitrary, which may produce unexpected results. -leading edge analysis... -done...</code></pre> -<!-- rnb-output-end --> +<!-- rnb-message-begin eyJkYXRhIjoidXNpbmcgJ2Znc2VhJyBmb3IgR1NFQSBhbmFseXNpcywgcGxlYXNlIGNpdGUgS29yb3RrZXZpY2ggZXQgYWwgKDIwMTkpLlxuIn0= --> +<pre><code>using 'fgsea' for GSEA analysis, please cite Korotkevich et al (2019).</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoicHJlcGFyaW5nIGdlbmVTZXQgY29sbGVjdGlvbnMuLi5cbiJ9 --> +<pre><code>preparing geneSet collections...</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiR1NFQSBhbmFseXNpcy4uLlxuIn0= --> +<pre><code>GSEA analysis...</code></pre> +<!-- rnb-message-end --> +<!-- rnb-warning-begin eyJkYXRhIjoiV2FybmluZyBpbiBwcmVwYXJlUGF0aHdheXNBbmRTdGF0cyhwYXRod2F5cywgc3RhdHMsIG1pblNpemUsIG1heFNpemUsIGdzZWFQYXJhbSwgOiBUaGVyZSBhcmUgdGllcyBpbiB0aGUgcHJlcmFua2VkIHN0YXRzICgyMC4zMiUgb2YgdGhlIGxpc3QpLlxuVGhlIG9yZGVyIG9mIHRob3NlIHRpZWQgZ2VuZXMgd2lsbCBiZSBhcmJpdHJhcnksIHdoaWNoIG1heSBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiJ9 --> +<pre><code>Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam, : There are ties in the preranked stats (20.32% of the list). +The order of those tied genes will be arbitrary, which may produce unexpected results.</code></pre> +<!-- rnb-warning-end --> +<!-- rnb-message-begin eyJkYXRhIjoibGVhZGluZyBlZGdlIGFuYWx5c2lzLi4uXG4ifQ== --> +<pre><code>leading edge analysis...</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiZG9uZS4uLlxuIn0= --> +<pre><code>done...</code></pre> +<!-- rnb-message-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>Let’s take a look at the GSEA results.</p> @@ -3263,7 +3271,7 @@ <h2>Run GSEA</h2> <p>Let’s write these results to file.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZ3NlYV9yZXN1bHRzQHJlc3VsdCB8PiByZWFkcjo6d3JpdGVfdHN2KG91dHB1dF9maWxlKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiZ3NlYV9yZXN1bHRzQHJlc3VsdCB8PiByZWFkcjo6d3JpdGVfdHN2KG91dHB1dF9maWxlKSJ9 --> <pre class="r"><code>gsea_results@result |> readr::write_tsv(output_file)</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -3281,14 +3289,14 @@ <h4>Highly Positive NES</h4> (<code>HALLMARK_MYC_TARGETS_V2</code>) using a GSEA plot.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19NWUNfVEFSR0VUU19WMlwiLFxuICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcIkhBTExNQVJLX01ZQ19UQVJHRVRTX1YyXCIsXG4gICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gXCIjMDA2NkZGXCIpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19NWUNfVEFSR0VUU19WMlwiLFxuICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcIkhBTExNQVJLX01ZQ19UQVJHRVRTX1YyXCIsXG4gICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gXCIjMDA2NkZGXCIpIn0= --> <pre class="r"><code>enrichplot::gseaplot(gsea_results, geneSetID = "HALLMARK_MYC_TARGETS_V2", title = "HALLMARK_MYC_TARGETS_V2", color.line = "#0066FF")</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,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p9vtDlSD69evf+ihhxRFkf8ajUar1Wqz2eS/27dvz8jI2Lt3b0JCQqCOCAAAAACA9oxaHmzBggULFizIyMjQ8qDNVVpaunHjxkGDBn355ZeBavP48eMzZsyQWYb09PStW7fa7faamppvv/32sccekzNKcnJyHn744UAdEQAAAACAkNDj1AmbzeZ0Otu2bavlQc+cOfPII498/fXXBQUFAW98+vTpcnBEamrqgQMH1LvWtWvX559/vkePHrNmzRJCvPvuuzt37hw5cmTAAwAAAAAAQBuajmioq6Sk5NChQz4b33///V69esXExMTHx3fu3Hnx4sW1tbWaxbN9+/ZgZBmys7P3798vy2vXrq2fQJk5c+awYcNkedWqVQEPAAFRXl6+bt26devW7dy5M9SxAAAAAIB+hWBEw8GDB++7777c3Nx+/fodPXpU3b527drp06er/547d+7pp5/esWPHzp07o6Kigh1VVFSUz+IRxcXF+fn5l9/ypk2bZKF3796NTRuZPXv2vn37hBC7du0qLi5mpQYdunDhwkMPPSSEmDBhAqNOAAAAAKAxWo9o2LRp089+9rPc3Fyf7efPn58/f379+p9//vmiRYs0CKxXr14H/ptcuvLy7dixQxZ8LvZZ1+jRo81msxDC7Xbv2rUrIMdFkOzdu/cPf/hDqKMAAAAAAJ3SNNFQXV09Z84cl8v1P8c2/t/RX3/99crKSiFEcnLyP/7xj4MHD8pfj4UQr776at1LQrYuTqczLy9PlgcPHtxYtaioqH79+slyTk6OFpGhpcrLy7/99ttQRwEAAAAAOqVpouHll1++ePGiECIuLm7Lli3qygVCiA8++EAW1q1bd/vttw8cOHDt2rWTJ08WQtTU1KxZs0bLOAMoNzdXvUZmampqEzVTUlJk4cSJE0EPCwAAAACA4NA00fDZZ5/JwgsvvHDHHXdYrVb574ULF7Kzs4UQSUlJt956q1r/sccek4W6Szm0LhcuXFDLXbp0aaKmeuv58+eDGxMu27vvvpuSkvLMM8+EOhAAAAAA0B1NF4NUr+nwy1/+su72AwcOyMLNN99sMBjU7ddff73ZbHa73adPn9YsyMCqrq5WyzExMU3UjI2Nrb9LXbt3766/toXD4RBC2Gy2mpqaywo0aLxeryy43e6gBqkoivyrHkWeHCGEy+WSG+12u09UPqHKajab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K69UVVXJ8urVq2fPnq3eNG/evEmTJm3fvr3+Xjabre6/I0aM2LhxY6dOnYIUJAAAAICrRJs2bebPny+ESE9PD3UswBUuWImGEydOyML48ePrZhmEEFar9aOPPho9evSOHTsa233AgAFz5syZPHmy0ajpBTgBAAAAXJHi4+OXLl0a6iiAq0KwEg0FBQWyMH369AYrzJ8/X000zJo1q3Pnzg6HIz4+Pjk5efDgwYmJiUEKDAAAAAAABE/QEw3XXnttgxW6d++ulmfNmpWWlhakSAAAAAAAgGaClWgoLy+XhejoaFnIzc29/vrrhRDp6elffvllcnKyWrl9+/ZBCgMAAAAAmmvMmDEdOnQQQtT92gLAT8FKNKhMJpMsXHvttWazubq6+tSpU0KIsLAwtY7BYAh2GP4rLi7esGHDe++9l5+fX1VVlZycPGjQoKlTp44aNarFbSqKEhERUfdqGo0ZOnToZ5991uIDAQAAALh8d9xxxx133BHqKIDWStOlFn/84x8LIWw224ULF7Q8rv82b97cq1ev3//+959//vkPP/xgt9vz8/M3btw4evTosWPHFhUVtazZs2fP+pNlAAAAAACgtdM00fDEE0/IwvLly7U8rp/Wr19/zz33lJSUyH+NRmNkZKR66/bt2zMyMoqLi1vQcn5+fmBCBAAAAABA34I+daKucePGLVy48E9/+tOLL744ceJELQ99ScePH58xY4aiKEKI9PT05557buTIkWFhYd99993q1atXrlypKEpOTs7DDz/8zjvvNLdxNdEwePDgP//5z03UjIuLa1n8AAAAAADogaaJBiHEkiVLOnToMG/evBEjRmh86KZNnz7d7XYLIVJTUw8cONC2bVu5vWvXrs8//3yPHj1mzZolhHj33Xd37tw5cuTIZjX+zTffyMKAAQOGDx8e0MABAAAAANARTRMNq1evloUpU6b89a9/VbcPGjSoW7dudZeHrG/r1q3BCyw7O3v//v2yvHbtWjXLoJo5c+aWLVv27dsnhFi1alVzEw3qiIbU1NTLDhYAAAAAAP3SNNEwZ86cBrefPHny5MmTWkbiY9OmTbLQu3fvjIyMBuvMnj1bJhp27dpVXFyckJDgf/tqoiEtLe3yIgUAAAAAQNc0XQxSt3bs2CEL48aNa6zO6NGjzWazEMLtdu/atatZ7atTJxjRAAAAAAC4sgV9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k0WFLmpqathyvv32W90bUlrGb30PI7rEuS70OGj8+uuvmupHRkbqstINGzawJleuXNG9txzHJSUlxcTExMTELFq0SC6X166gd+QIckTiE7f6/SsBgEbF4A+D1OXcmi51AAAalRs3btCCs7Oz8vRr16717dtX+TIHMzMzGxsb+uAxQsizZ88iIyMfPXq0YMEClWU+e/Zs0KBBmZmZbIq9vb2lpSV7W9vTp08nTJjg4+PTqVMn7d0LCwuLiooihGzZsoXefvzOO++0atWKEFJnW55bwRQVFQ0fPvzRo0eEEJlM5ufnZ2Njc+fOnfLyckJIRUVFVFRU+/bthX2VvbArrddu5Djuo48+2rJlC121v78/XXVZWRkhpLKyMioqKjg4uPa3/4qKiuHDh//xxx9sikwmc3Z2ZveNFxUVzZo16+7du+vWrTMxMfiljufOnaOFNm3atGzZUnnWjh07xowZw/3v6QoaogqFgk5JSUkZNWrUgQMHND3ST9jPKD8/v3fv3n///TchxM3N7dixYyqvReS5e2NjYxctWqQ8xdraurq6mqYJ/vrrr/79+/v7++vSVePQ4zDC83BB6XfQCAgIoKvevXs3fcLugAED2rdvTwgJDQ3VZb3sYoSwsLDg4GAde0tFRERERERomivIwNQ72vmsXcB/JQDwMjNQAkMq/QQAMI56XdFw8uRJdta6T58+bHppaanyT47333//zJkzZWVlCoXi9u3ba9assbGxobNkMtnhw4dVFsu+8lpZWS1fvvzJkydssRs3bmSvDAgKClJpqOXcJv3KTgg5cuSIjq14bgU7lWdlZUUIMTU1jYuLe/78OZ1bWVkZGxvLfoKGhITUubd16bNBV8pp3Y1s1ZaWlnTVy5YtKygooHNLS0u//vprFi3h4eG1F678Zofu3bv/3//9H70i4OnTp3v37mVPAyGE6HFdQ32vaNizZw9b3YYNG5RnFRQUuLm50VkeHh6bN29+8eIFnVVdXX3y5Ml+/fqxtidPntS0o/T7jNRe0fD8+fOOHTvS6a6urmlpabW3iM/uTUlJYXNNTEwWLFiQlZXFcZxcLj937lztnFFDuKJB78MIpzXOteN50OA4bsCAAbSClgu+aquoqKDjjhCycOHCevW5Tnwih/8Ric/a+cQAADQehvoB/y+hGaifAADGoXui4cGDB8pf8tasWcNmLVmy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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,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lAZPnz790UcfffPNN1lZWYWFhYmJia1atRoxYsTgwYONRmOlrAIAAAAAUCWpm8D37Nmz7MLVq1evXr36htpp1qxZJUV0Yz777LPKasrlci1YsGDatGlWq1VZmJmZmZmZuW7dug4dOqxcubJ58+aVtToAAAAAQBXj613opQkTJmi/0gMHDmzatKmyWpsxY8bkyZOV7D0gICA8PFx59uDBg926dTt//nxlrQ4AAAAAUMWoewW+devW7g+PHj0qhIiPj69Tp46XLSQlJY0YMUL7Eeyys7Mffvhhp9NZKa1t3Ljx9ddfl+UWLVrMnz+/Z8+ewcHBFy5cWLRo0YIFC1wuV3Z29uDBg/ft2ydv+wcAAAAAwJ26CfyRI0fcH8rUdPTo0fPmzVN1vTctPz//4MGD33777bJly3JyciqlTZfLNXXqVFlOSUnZvXt3TEyMfFi/fv158+YlJyePHTtWCLF///41a9YMGTKkUtaLW7R48eILFy4IIWbMmBEWFqZ3OAAAAACqO02nkfNlx44d6969+++//17pLW/duvXQoUOyvGTJEiV7Vzz99NOrV6/+/vvvhRALFy4kgfcRH3/88e7du4UQL774Igk8AAAAAN1peg98enp6enp67969tVypl8xmsxrZuxBi7dq1stC6deu0tLRy64wfP14W9uzZw5x5vmb48OF6hwAAAAAA2l6BnzZtmjfVLBaLyWSKj49XOx53iYmJ6enp7ksOHz5cKaPQf/vtt7LQv3//iur06tXLaDTabDan07l58+b/+q//uvX1orLs2LFD7xAAAAAAQL8u9Dk5OSdOnEhNTXVfuGXLlmefffb48eMOhyMhIeGxxx6bOXNmRESEBvHUqVOn1PmFVatW3XoCbzabMzMzZbnUxroLDw9v3779vn37hBAZGRm3uFIAAAAAQNWjwzRyv/zyS5s2beLj40eMGOG+/Msvv3zggQeOHj3qcDiEEFevXp0/f35qampubq72QVaWkydPulwuWW7SpImHmo0bN5aFEydOqB4WboTD4Vi9evWWLVv0DgQAAABAtaZ1Av/pp5/ec889cj45dyaTacKECUquqzhy5Mjzzz+vVXSV79KlS0o5KSnJQ8169erJQlZWlrox4QZZrdahQ4dOmTJF70AAAAAAVGuadqE3mUwTJ060Wq3yYUDAf04ffPHFFxcvXhRCxMTELF68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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3302,14 +3310,14 @@ <h4>Highly Negative NES</h4> NES.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19NWU9HRU5FU0lTXCIsXG4gICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFwiSEFMTE1BUktfTVlPR0VORVNJU1wiLFxuICAgICAgICAgICAgICAgICAgICAgY29sb3IubGluZSA9IFwiIzAwNjZGRlwiKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19NWU9HRU5FU0lTXCIsXG4gICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IFwiSEFMTE1BUktfTVlPR0VORVNJU1wiLFxuICAgICAgICAgICAgICAgICAgICAgY29sb3IubGluZSA9IFwiIzAwNjZGRlwiKSJ9 --> <pre class="r"><code>enrichplot::gseaplot(gsea_results, geneSetID = "HALLMARK_MYOGENESIS", title = "HALLMARK_MYOGENESIS", color.line = "#0066FF")</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,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7u7ukZGRHh4eBQUFZ86cadq0aeVvdbu/j4hs27ZNDUav12dkZPzxxx/qZadz586lD1y/fn1CQkJSUpKnp2dQUFC9evViYmJ++umnc+fONWnS5I8//jAajWazuXv37iLStm3bCxcuqP2vhw8frn6nKygoUFP/4eHhvXv3/vHHH1NTU1evXh0cHJyXl+fu7n758uWIiIiuXbv279//hx9+OHfuXF5enqIoGRkZItK6devIyEj1nAMGDDh79uzGjRs3btxYq1YtPz+/jh07ln17bNy4Ua0/bNgwb2/vkydPvvnmm1ar1dvb+8yZM9nZ2X5+fi1atNi1a1dISIivr6/BYDh//vzly5eLi4vz8/PDw8NNJpOHh4eXl1eHDh0GDBigdi0/cuTInj17fvzxx0uXLpnNZn9/f4vFEhkZ+dBDDwUFBb388ssnTpzIy8tr27btyJEj+/btq7bgV199df78eZ1O17p1a0VREhMTPT09/fz8YmNju3fvbpuGzzUpimL7ya3a6Rx36rJq16594cIFPz8/dcU4m27duv36668icujQodJ3GFar1cvLq6ioKDAwUL0G1Tgffvjhww8/LCLqZaKSmvPnz3/22WdFJDw8vNzRE6+++uqaNWvsNjZv3vzIkSOffvpp2VHTAACgeuXk5Kg3JEFBQRV1VDSbzTt27BARPz+/Nm3ayN8TDXq9Xp3iulevXs2bN9cw9usyd+5cdfzR+++/P3jwYBEZPHiw+jKPHDny3HPPqbco27Zti4mJ0SakpKQk9Qeqfv36VTIdb0Vuu+029UvmxYsX9Xq9urFOnTrFxcUNGjRQh/RevRkzZrz77rtq+csvvyz32+CWLVtGjhwpIo888sg///nPaw24GuXn56sJAhGpX7++miRavXp1ly5dyq2fkZGhJsU6dOiwbt26KVOmqH/woKAg9eNw4MAB2xDghISEHj162I49duxY6WygxWIJDw9XywEBAUlJSXfccYf6LT05Odk2qlq1fv36sWPHisjkyZNfeumldu3a/fnnnyaT6dy5cyJSq1Yt9VvM0KFDV61apR4ybNiwtm3bTp8+XUTmzp374IMPdu/eXV0AW0QCAwObNGmi5gqPHTs2d+7cDz74QES++eYbNeYdO3aob28Reeihh9TeYSLy4IMPrl271haY3Ttk1qxZb775poh8+OGHq1evVieei4uL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8+dzHNeoUaPZs2fXKrZ66tatW7t27QIwcODAV155pWqCJUuWqFQqJyen+fPnazSa9957LyYmxs7O7v333x8xYsTt27d37twJoH///oMHDw4PDw8LC0tMTPT39580aVJQUNDfDO+bb75JTk4GsHjxYju7x4PT3rhxY8+ePTB69tZlcOsb9+9//zs2Ntba2nr58uURERH5+fkxMTEdO3ZELc9OFy9eZBeakSNHVrc2FArF0qVLAbRq1eq9994D8Pnnn8fHx8fGxvbt29fV1TU/Px/AG2+80b179xout86dPHnyzJkzAMaOHcvW27fffvvgwQMAixYtOnToEOv/e9asWQavJuaQnZ29fv16AB06dDDYKZhx69atY4OarVq1ip+5YMECrVbr5uY2Z86cWpV25MiR7du3Z2RkvPjii3PmzPH19a2a5t69ez/88AOAPn36vPpqXfZrrVQqP/zww6ioKAcHh3bt2tnY2HAcFxISUt1JuKysbNmyZQC8vLymTJmya9cudm/TqlUrLy8vPHl3kZmZuXHjxuvXr8tkMn9//yVLltja/jUmuUajWbhw4aVLl6ytrfv27btkyZIvvvji0aNHAJYvXy598uf02NjYHTt2AOjXr9+QIUNWrVpVWFhoZWXFgmnXrl1xcbFYLF61atX27dtjY2M9PDxmzJjRpk2bY8eOARg1alSPHj3Wr1+/devW9PR0JyenMWPGtG7d+uHDhwCWLFly8uRJvcv6/fv316xZc+vWrWbNmoWGhvJX5J07d96+fTshIeHhw4dWVlYDBw7UveyeOHHif//7H4Bx48bdunXr1q1bAD744IMmTZqwBJWVlWPHjk1NTbW3t/f29nZxcXF1dZ07d+7GjRszMzM5jrt9+3Z+fr6tre3evXulUunKlSuvXLkik8natm1rY2OjUCju3bvn7+/fpUuX8ePHV7dZ9dYPgN27d9+8eROATCbLysq6efPmSy+91KNHj1GjRulmzM7ObgQAGDFihJ27m5eXV58+fcLCwlJSUvz9/WNiYiQSiVar7d+/P4AhQ4YkJiYmJiYCWLBggaOjI4Di4uIVK1YA8PHxmTRp0ldffZWSknLgwAFXV9fy8nIrK6v8/PwmTZq89NJL06dP37x588OHD0tLSzmOKyws1Gg0gYGBnTp1YneqM2bMiIuL27FjR3h4uJubm4uLC7sDX7p0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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,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bt6CI1dbt27dsmWLonDx4sWrVq3KtYHA07i4uKxZs8Y8kjlz5jx48CD/9diJTz755PLly2pHYWF37txR3OEaPnz4O++8U6BKRowYoUiGT548af6MvdA0ESRgn0jgARRniuexHTt2rF69elBQkLzwwYMHVno6qjldunSR9zksymjh8kGJPDw8XnzxxSJFJoTQztksXbr00qVLFYUHDx607FH++eef7t27K36q1qpVKzw83A6zd2E3V9fs2bMVPZBjY2NnzZqV/xqmTJmiGCtr8uTJuY6YsG3bNkV27ebmtnfvXvM2Gvk0b968+fPnKwrfeeedZ8689fjxY0X/fyHEypUrzW9n5D8SxVcvOzt7xYoVhavNltq0aSO/dZKVlTVu3Dij0ahiSBan6H6l0+kWLlxYiHrmzJnj5eUlL9mzZ0+RIpPRRJCAfSKBB1Bs3blzRzHK1MiRI4UQQ4YMUTS6s7fRy9Xi6Ogon23r0qVLhXs2FRUVJX+0MmDAgPw0icybts5mt27dKlSoIC+5evWqXq+3VP3R0dEBAQGKVug1a9YMDw/39/e31FEsy06urtKlS69du1ZRGBISEhERkZ/djxw5okg8qlWr9tFHH5lvaTAYzO8LLF26tHv37vmP1tysWbMGDx4sL0lJSXlmO/B58+YpWhmMGDGioE87FdavX6+4yENCQux/brZGjRopesX/+eefa9asUSsea/jjjz/kq61atapevXoh6ilbtmzfvn3lJb/++msR4vr/aCJIwD6RwAMotjZt2iR/ruLs7Dx06FAhRKVKlbp06SLf8scffyzivMrFhuKpWuEek+7cuTMnJ8e0Kn3sRaS5s6kY68toNMbGxlqk5tjY2ICAAEX2W6NGjfDw8KpVq1rkEFZiJ1dXQEDAK6+8Ii8xGAwTJkx45mNYvV4/adIkReHKlSvLlCljvvGuXbsU7SMCAwPNe48XwhdffKEY0+77779XzCAol5CQ8N1338lLKleuvGrVqiKGUbZs2Q8//FBekpycbJtJE4voo48+UrTCmDFjhmJQA01TTEhRv379QlfVrVu3PGouCk0ECdgnEngAxdYPP/wgX33ppZfKly8vLSsSidjYWMXoaCVWp06d5BOPFS7Fskb7ec2dTfOZogrU0fpp4uPje/TooRiKrHr16uHh4eZj0dsb+7m6li1bppgvID+j2a1evfrS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WANbu3v3rq5guK97gX755ZdOnTrptiASiT7++OPY2Ng5c+Y4OXFJHyIiMiKRCN0b4M9xuDwLw9vDRn/fO40Wey+i87dotQDb/oayLMzxR0RElio538JfFS2g+7zRCZ3AJyUlde3ade7cuYWuxKbVapcsWdKuXbvk5GSjhmRvb+/l5aUr55/mPZdSqcydcM7X17dYu9i7d+/QoUN1U995e3tHRkauXr26cuXKJQ2ZiIio2BpVxw/vIy4UM/vCzeBcLufi8M561J2Obw7hOZeyIiIiU8g/YV19dxOEYW6ETuAnTZp04sQJXdne3r5nz555Gjg6OoaEhOTe4o6JiZk+fbqxo8oN49ChQ/raREVF6aYVEYlEPXr0KPrGk5OT33vvPd1CAh07doyOjm7fvv2rxUtERFRCVZ0wZwDuL8SaofAxOCAsPgWf/4aaUzHxV1x5JFR8RERlmnT+LOmC2ZJJn5o6EItU3oe/AxA4gT937tzWrVt15eDg4CdPnvzyyy952tjY2CxYsODq1atLly61srICsG7dutxb30by+uuv6wpRUVFXr14tsM26det0hdatW9eoUaPoG1+7dm1aWhoAT0/PgwcPuri4vFqwREREr8rOCqM64dpX2DsGXXwMtUzPxtIjaPwVAsNw8ApX8CEieiWiOp6iOp4ij2JkE+VW/l+ccj+BHSBwAv/9999rtVoAb7755vr16w2vGTN+/PgJEyYA0Gg0K1euNGpggYGBjRs31pXHjBmju1v+ouPHj2/btk1XnjRpUtG3rFKpVq1apSuHhoa+4vpzREREpUgsQn8/RExCzHQMbQMriaHGR26g7wr4foV1kchWChUiERGVV7xkXCBBl5G7efOmrvDll18Wpf3EiRO//vprACdPnjReVABEIlFoaGi/fv0AHD9+fNCgQatWrdLNTq/RaHbu3DlixAjdpYc2bdoEBQXl30JQUNC5c+d05ZMnT+beoj927NiDBw90ZScnp6ioqEKDsbGxadmyZWn8WUREREXSvBa2DMfCN7DiKNZGIi1afZkAACAASURBVDVTb8trCRi5BTP2YHRnBLeHB3uVERGRceTP33kHHgIn8Ldv3wZgY2PToEGDorSvVq2ak5NTWlpaQkKCkUND3759p02btmDBAgB79uw5ePBg48aNHRwcbt++nZiYqGtTvXr1nTt3Frj2YGJiYu66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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3325,14 +3333,14 @@ <h4>A non-significant result</h4> viewed earlier.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19QNTNfUEFUSFdBWVwiLFxuICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcIkhBTExNQVJLX1A1M19QQVRIV0FZXCIsXG4gICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gXCIjMDA2NkZGXCIpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZW5yaWNocGxvdDo6Z3NlYXBsb3QoZ3NlYV9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gXCJIQUxMTUFSS19QNTNfUEFUSFdBWVwiLFxuICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBcIkhBTExNQVJLX1A1M19QQVRIV0FZXCIsXG4gICAgICAgICAgICAgICAgICAgICBjb2xvci5saW5lID0gXCIjMDA2NkZGXCIpIn0= --> <pre class="r"><code>enrichplot::gseaplot(gsea_results, geneSetID = "HALLMARK_P53_PATHWAY", title = "HALLMARK_P53_PATHWAY", color.line = "#0066FF")</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,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v39/fn6+v79/eHg4++k0PDz80KFDHMc1btw4MjIyMzOzqKioadOm0dHR7DHX6/VslqWHh4dCoSgpKbly5Up2drarq2t0dDSL0MfHh/9EER4e7uXlxe4UewD379+fnZ2tUqliYmK8vb05jsvPz3dzcwsJCencuXNeXt7evXvv3LljNBoDAgLc3d1jYmKefPJJpVKZk5PD/jeMjo6WSqVnz57Nz8/38PBo3749W9yqNrdu3SooKMjMzGzSpAlbKTwrK8vJycnLy6tFixZBQUGW/ys1FCaTyX6JBonVT2e2YrlvnE3MmTPHtg3yvvjii1deeYWIXFxcLH/Nq27VqlWzZs0iosDAwHpOcLBh4++8806NiYb09PRt27bV+FEJAAAA7hWfaCgrK6uqqsrMzIyJiQkODn7sscdsfq2cnJwnn3xSr9fL5fIffvghLi6unicGBQUZjcZmzZqdPXv2Pq67Y8cOtrrKggULZsyYcR8tWJowYQL7iDJ48OB9+/YR0d69e7t16/aAzTrcrl27pkyZQkQTJkz44osviOj5559nSbS72rdv38SJE4lo1qxZLI/WsmXLoqIiHx8ffplwu9q+ffv06dOJaNGiRazACw4ONhgM4eHhf/zxBxF9//33r776KhGxb+9EdOfOHblcvnTp0jVr1lieeOXKldq2YB80aBCbPUdEM2bMYJPd9u7dO2nSJCKKjY1lmcoff/zRche2+Pj4bdu21XYXfvjhB/Yp+o033pg7d+6XX37JPiq/9957kydP3rRp07x586xOGT169OrVq/k/x40bxzKbvBEjRkRGRi5dupSIPv744xEjRrDjs2fP3rx5M1+NPQKsvH79+sWLF7Nynz59duzYsWbNGssWevXqZbWUe1ZW1ltvvbV161ar8Dp37vz7778T0UcfffSf//yHRbhq1apRo0YdPHiQiM6ePVtj5uWTTz555513iCg4OJgtxkREAwYMYC//Dh06WN1NIrJ6fD799FM2mXHixIlsENz777//4Ycf8hX+/vtvy6/ZBw4cGD16NP9nXFzczz//XFFRwSYVtm/fXqVSXb16lcXG3kzI4im0devWMWPGEJGnp2f//v3ZeDrLx/z27dssRd6zZ8/Q0FA2sI5hcySJaMiQIWFhYexJuHnz5oEDB3722Wfz589nwVfvfd7PP/+8bt266t+bDh061KZNm2nT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oEETOtGwefPmCRMm8H9GRkYOHjy4WbNm4eHhCoUiKysrKysrJSXln3/+4ets27btpZdeEiC2nTt3vvHGG/zIBSuBgYErV64cPXp0jbfeNdFARB999NHcuXNrXDysW7duW7duDQ8Pv8/QAQAAAAAAAMRB0ERDWVlZVFRUcXExEYWEhCxfvnzkyJHVpxuZzebt27fPmTPn1q1bROTv75+Zmenh4SFAhFVVVXv37v3+++8vXrx4584do9Ho7+/ftm3b/v37jxo1qo6V+euTaCCi7OzszZs3//jjjzk5OSqVKjg4+IknnhgzZsygQYMcshAmAAAAAAAAgG0JmmhYu3btf/7zHyJydXU9efJkmzZt6qh88eLFLl26sC03alwWAQAAAAAAAADERtBf0X/66SdWSEpKqjvLQERPPPFEUlKS1YkAAAAAAAAAIGaCJhr+L3v3GRfFtYYB/NmFBaSoFEUQEBXE3kXEgoo9dk2iKdaYGDVqmoldozHF5EZJYrzRxJIYTSyxRI0aiB0EUUQUxd5FpEpbys79cLjjusCCyi6LPv8fH86ePXPm3dlhZvfdM2diY2NFoWfPnqVp37t3b1E4e/asoWIiIiIiIiIiorJj1EsnrKys1Gp15cqVU1JSSnmjUQcHh+TkZCsrq6ysLEOHR0RERERERERPyagjGiwtLQFkZmYWeeeFwtRqdUZGBgArKyvDRkZEREREREREZcGoiYYaNWoAyMvLi4qKKk37U6dO5eTkyAsSERERERERkYkzaqLB399fFL7//vvStJebtW/f3lAxEREREREREVHZMWqiYciQIaKwbt26JUuW6G/87bffrl27VpQHDx5s2MiIiIiIiIiIqCwYdTJIAP7+/qGhoaLcq1evuXPn+vn56bQJDw+fP3/+rl275EWOHDlizCCJiIiIiIiI6MkYO9EQFxfXoUOHhIQEucbFxaV27dq1a9dWKBRXrly5cuXK7du35WednJyOHDlSr149YwZJRERERERERE/G2IkGAKdOnXrxxRcvXLhQYksvL6+NGzc2b97cCFERERERERER0dMz6hwNQrNmzaKioubPn+/i4lJcG2dn57lz50ZFRTHLQERERERERFSBlMOIBllubu7x48ePHj167dq15ORkAPb29h4eHv7+/m3atFGpVOUVGBERERERERE9mfJMNBARERERERHRM6Yc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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,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VH07m+b4Nztvb2/FCnDGw6PMGT8vhAgPD5c/46PT6RQnGlf+0BXgndXWNWrUkP5VFuuLL76w+htVQC2YxA6A+qxdu1aeYQYEBPTv3/+hZ0mDvQsKCuT1vPfee3YJUW0GDRo0d+5cafv27duHDh0qdvWgtLS0ffv2GXb79etX+vHzzm1NLy8vxfLCJdHr9WlpaUlJScaj2ePj459++un4+HirJz2eMmWKvCs4Kipq6tSp8imvc3Nzhw8ffuTIES8vFbxxBwQENGjQwJwjfXx8KlWqVLVq1SeeeKJ79+6VK1c256yFCxcuXLjQisAqVqz48ccfjxw50lBSWFj4yy+/jBgxwvxKvLy8jJOQW7duLV68ePHixTk5OYbC8+fPd+jQ4eTJk8V2ijqLXVuHf8621blzZ/kcdX/++WdOTo68W97ECvAK3bp1O3bsmGH3l19+kQ93v379uuKbrIc+AO/Eth43btx//vOf48ePK8p79uw5YMAAi6oC1EgFnwMAQEHx1Fz58uWnT59uzolhYWF379417J4/f/706dPNmze3cXwqJE/ghRAbNmwoNoG3x/zzzm3NChUq/Pnnn+Yfn5ube/Xq1Z9++mnOnDnyCZ+uXbvWv3//AwcOWJFgv/POO3PmzFEUvv/++9u3b5fHduLEiVmzZn344YeW1u94zZs3VzxP6zqGDh06derUO3fuGEr27NljUQJfrOrVq8+dO/ell17q37//xYsXDeVXr15dsmTJlClTSlm/Ddm1dfjnbFuKLFqr1R47dszQN56TkyMfVB8cHNymTZuSqurevfvMmTMNu4rH4BXd7x4eHg99AN6Jbe3h4fHtt98+/vjj8vcjf3//L7/80vxKAPUigQegMhcuXFAsdZOUlPT5559bV9uaNWv4jCiEaNmyZb169QzjwH/66acvvvjCeKFg+fj50NDQ0o+fV11r+vv7N23atGnTpkOHDh06dOiJEycMLx0+fDg2NtacPii5t99+W/7ViYG3t/cPP/zQunVr+dcEH3/8ca9evR5//HGr44ePj89TTz31448/Gkri4+NtVXnjxo137979+OOPJycnGwoXLVo0YcIEX19fW13FZanudnZ9rVu3LleuXEZGhqFEPpXDwYMH5V3ZTz75pIm5CaKjo0NDQw1rtt++fVueNiu+02nRokVYWJiJwJze1o8++mhUVJT8e4fO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sEwms7Kyat269ciRI3/44YezZ89Wv/AeAAAAAAAAgGfUIfRENGvWrA0b/j97dxof09XHAfw3k31fhBBBrKFiJ4idIKi19lq6b0ppVAlp7GqtUlqlimrLg6L2vZbYiX0XW1AR2ZfJZJJ5Xpz0djqZLMjcmcjv+8mLkztnzv3fde6599xzFop0o0aNpkyZEhAQMH36dKkJvUajuXz5cmho6JYtW0S2Hj16SDV5IiIiIiIiouJJ7gq8Wq3u3Lnzvn37pCkWFhaOjo4JCQkAateufe3aNd2G61WrVj169KiHh4ecQRIRERERERGZG7k74LW2tv7zzz8//PBDaUpmZqaovQO4cOGCbu29ZcuWBw4cYO2diIiIiIiIyAQj6Njb2//www/h4eG9e/cWnbrlVL9+/VWrVu3fv193PDYiIiIiIiKiYkvuJvR6VCrVqVOnrl+/Hhsbq1Kp3N3dvby8AgICSpcubcKoiIiIiIiIiMyNiSvwRERERERERFQQ8jWhnzlzpp2dnZ2dXf369WWbKREREREREdGrwVK2OaWnp6tUKgAPHjyQbaZERERERERErwb5nsDXrl1bJGJiYu7evSvbfImIiIiIiIheAfJV4Lt27ern5yfSq1evlm2+RERERERERK8AWTuxu3nzZps2bR4+fOjk5HT48OE6derINmsiIiIiIiKiIk3WceCrVq165MiRgICApKSkpk2bfvbZZ1FRUXIGQERERERERFREyfoE/ttvvwWQmZm5ePHi27dvA1AoFB4eHl5eXqVLl7ayssrju1u2bJEpSiIiIiIiIiLzI2sFXqFQvPB3OV49ERERERERFWeyNqEnIiIiIiIiohcj3zjwAJYtWybn7IiIiIiIiIheGbI2oSciIiIiIiKiF8Mm9ERERERERERFACvwREREREREREWAGVXgs7KyTB0CERERERERkZmStRM7XVqtdteuXdu2bTt+/Pjdu3fj4+MzMzNdXV3Lli3brFmzTp06de3aVak0o/sLRERERERERCZkmk7sduzYMWLEiFu3buWRp1KlSgsXLuzcubNsURERERERERGZLRM84p44cWLnzp3zrr0DiIyM7NKly+TJk+WJioiIiIiIiMicyf0EfunSpR988IH0r6+vb9euXX18fHx8fKysrO7cuRMZGblt27bLly9LeZYvX/7222/LGSQRERERERGR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Rnz77bdXr17NyspasWKFo6MjETEM8/HHHxugxuoY/FOABtxT97dv31acFdy8uCm7Fcexe/ny5eLFi9l0WFhYenr6t99+O3r06ObNm1tbW3PZGI2DzxvEmjVruCbXv39/7sn5b775Ruk5dj0PL/dSd7nv1FTCAJ5j7MuIea8YYWFhbOLVq1dr166tUNlz586prbN5e6XB926W/yMAYHAI4AEADK9z585sIj09/erVq2VlYxjmzz//VCpCRAkJCb/99ttvv/124cIF1VJubm7Tp0/nvqHevHlTtycty6Xnp4AK4Q5daWlpcnKyhpzp6elnzpw5c+bMrVu3jF0rbtxsxYfSz5w5k5+fT0SWlpY///yznZ2d2rImqJ7i7wVEtHr1arYyEomEHbuLo+fh7dSpE5vYvXu3hkHO4+LidLj3aySmv4yY94oxePDg5s2bs+mFCxfeuHFDy4JyuXzGjBlqV5m3V+q590ryfwQADA4BPACA4b3xxhvcC5mqT/NyduzYwT232bdvX2753r17R48ePXr06KlTp5ZVlnu2WSaTFRQUGKDSKvT8FFAhHh4ebdu2ZdNRUVEacoaGhr711ltvvfXW0aNHjV0r7n1axQA+KyuLTdSvX7+sWdNKSkri4uKMXT0l9evX56YfP3HixObNm7lVeh7eAQMGsInU1FR2YD+1Pv/8c13rbnimv4yY94ohFAq5B0OKiooGDhyoTSzNMMz7779f1txv5u2Veu69kvwfAQCDQwAPAGB41tbWkyZNYtP79u1T+40/OTl51qxZbLphw4ZchEBE7dq1YxNXrlxRe/OEiNiRhInIxcWldu3aFaqelrMB6/kpqjyDT6r80UcfsYkDBw788MMPavMsX748MTGRiGxsbMaMGWPYCqjiHoNX/HLPDUefmpr66tUr1VJSqTQsLIwbFYydy9o0pk+fzsUkM2fOVHzyX5/D27NnT24CuaioKHaCPUUMw3zxxRdnzpwx0OcwAINcRirUyM1+xQgJCZk2bRqbTk1N7dy584YNGzQ8fB4fH//GG29s2LCByh540ry9Up+9G/v/CACYCwJ4AACj+PTTTxs0aEBEDMNMmjRp4sSJV65cYR++TUlJWb9+fceOHblpk2NjYxW/Pnbt2pV9NphhmP79+//666+K9z+TkpKmTJny1VdfsX+OHz++onXTfporfT5FlWfw2cJG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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3348,11 +3356,11 @@ <h4>A non-significant result</h4> <h2>Session Info</h2> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2Vzc2lvbkluZm8oKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic2Vzc2lvbkluZm8oKSJ9 --> <pre class="r"><code>sessionInfo()</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4wICgyMDI0LTA0LTI0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9Qy5VVEYtOCAgICAgICBMQ19OVU1FUklDPUMgICAgICAgICAgIExDX1RJTUU9Qy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1DLlVURi04ICAgICBMQ19NT05FVEFSWT1DLlVURi04ICAgXG4gWzZdIExDX01FU1NBR0VTPUMuVVRGLTggICAgTENfUEFQRVI9Qy5VVEYtOCAgICAgICBMQ19OQU1FPUMgICAgICAgICAgICAgIExDX0FERFJFU1M9QyAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgIFxuWzExXSBMQ19NRUFTVVJFTUVOVD1DLlVURi04IExDX0lERU5USUZJQ0FUSU9OPUMgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzICAgICBncmFwaGljcyAgZ3JEZXZpY2VzIGRhdGFzZXRzICB1dGlscyAgICAgbWV0aG9kcyAgIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcblsxXSBtc2lnZGJyXzcuNS4xICAgICAgICAgIGNsdXN0ZXJQcm9maWxlcl80LjEyLjBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBEQklfMS4yLjIgICAgICAgICAgICAgICBnc29uXzAuMS4wICAgICAgICAgICAgICBzaGFkb3d0ZXh0XzAuMS4zICAgICAgICBncmlkRXh0cmFfMi4zICAgICAgICAgICBybGFuZ18xLjEuMyAgICAgICAgICAgIFxuICBbNl0gbWFncml0dHJfMi4wLjMgICAgICAgICAgRE9TRV8zLjMwLjAgICAgICAgICAgICAgY29tcGlsZXJfNC40LjAgICAgICAgICAgUlNRTGl0ZV8yLjMuNiAgICAgICAgICAgcG5nXzAuMS04ICAgICAgICAgICAgICBcbiBbMTFdIHZjdHJzXzAuNi41ICAgICAgICAgICAgIHJlc2hhcGUyXzEuNC40ICAgICAgICAgIHN0cmluZ3JfMS41LjEgICAgICAgICAgIHBrZ2NvbmZpZ18yLjAuMyAgICAgICAgIGNyYXlvbl8xLjUuMiAgICAgICAgICAgXG4gWzE2XSBmYXN0bWFwXzEuMS4xICAgICAgICAgICBYVmVjdG9yXzAuNDQuMCAgICAgICAgICBsYWJlbGluZ18wLjQuMyAgICAgICAgICBnZ3JhcGhfMi4yLjEgICAgICAgICAgICB1dGY4XzEuMi40ICAgICAgICAgICAgIFxuIFsyMV0gSERPLmRiXzAuOTkuMSAgICAgICAgICAgdHpkYl8wLjQuMCAgICAgICAgICAgICAgZW5yaWNocGxvdF8xLjI0LjAgICAgICAgVUNTQy51dGlsc18xLjAuMCAgICAgICAgcHVycnJfMS4wLjIgICAgICAgICAgICBcbiBbMjZdIGJpdF80LjAuNSAgICAgICAgICAgICAgIHhmdW5fMC40MyAgICAgICAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgIGNhY2hlbV8xLjAuOCAgICAgICAgICAgIGFwbG90XzAuMi4yICAgICAgICAgICAgXG4gWzMxXSBHZW5vbWVJbmZvRGJfMS40MC4wICAgICBqc29ubGl0ZV8xLjguOCAgICAgICAgICBibG9iXzEuMi40ICAgICAgICAgICAgICBCaW9jUGFyYWxsZWxfMS4zOC4wICAgICB0d2VlbnJfMi4wLjMgICAgICAgICAgIFxuIFszNl0gcGFyYWxsZWxfNC40LjAgICAgICAgICAgUjZfMi41LjEgICAgICAgICAgICAgICAgc3RyaW5naV8xLjguMyAgICAgICAgICAgUkNvbG9yQnJld2VyXzEuMS0zICAgICAgR09TZW1TaW1fMi4zMC4wICAgICAgICBcbiBbNDFdIFJjcHBfMS4wLjEyICAgICAgICAgICAgIGtuaXRyXzEuNDYgICAgICAgICAgICAgIHJlYWRyXzIuMS41ICAgICAgICAgICAgIElSYW5nZXNfMi4zOC4wICAgICAgICAgIE1hdHJpeF8xLjctMCAgICAgICAgICAgXG4gWzQ2XSBzcGxpbmVzXzQuNC4wICAgICAgICAgICBpZ3JhcGhfMi4wLjMgICAgICAgICAgICB0aWR5c2VsZWN0XzEuMi4xICAgICAgICBxdmFsdWVfMi4zNi4wICAgICAgICAgICByc3R1ZGlvYXBpXzAuMTYuMCAgICAgIFxuIFs1MV0geWFtbF8yLjMuOCAgICAgICAgICAgICAgdmlyaWRpc18wLjYuNSAgICAgICAgICAgY29kZXRvb2xzXzAuMi0yMCAgICAgICAgbGF0dGljZV8wLjIyLTYgICAgICAgICAgdGliYmxlXzMuMi4xICAgICAgICAgICBcbiBbNTZdIHBseXJfMS44LjkgICAgICAgICAgICAgIHRyZWVpb18xLjI4LjAgICAgICAgICAgIEJpb2Jhc2VfMi42NC4wICAgICAgICAgIHdpdGhyXzMuMC4wICAgICAgICAgICAgIEtFR0dSRVNUXzEuNDQuMCAgICAgICAgXG4gWzYxXSBncmlkR3JhcGhpY3NfMC41LTEgICAgICBzY2F0dGVycGllXzAuMi4yICAgICAgICBwb2x5Y2xpcF8xLjEwLTYgICAgICAgICBCaW9zdHJpbmdzXzIuNzIuMCAgICAgICBwaWxsYXJfMS45LjAgICAgICAgICAgIFxuIFs2Nl0gQmlvY01hbmFnZXJfMS4zMC4yMiAgICAgZ2d0cmVlXzMuMTIuMCAgICAgICAgICAgcmVudl8xLjAuNyAgICAgICAgICAgICAgc3RhdHM0XzQuNC4wICAgICAgICAgICAgZ2dmdW5fMC4xLjQgICAgICAgICAgICBcbiBbNzFdIGdlbmVyaWNzXzAuMS4zICAgICAgICAgIHZyb29tXzEuNi41ICAgICAgICAgICAgIGhtc18xLjEuMyAgICAgICAgICAgICAgIFM0VmVjdG9yc18wLjQyLjAgICAgICAgIGdncGxvdDJfMy41LjEgICAgICAgICAgXG4gWzc2XSB0aWR5dHJlZV8wLjQuNiAgICAgICAgICBtdW5zZWxsXzAuNS4xICAgICAgICAgICBzY2FsZXNfMS4zLjAgICAgICAgICAgICBnbHVlXzEuNy4wICAgICAgICAgICAgICBsYXp5ZXZhbF8wLjIuMiAgICAgICAgIFxuIFs4MV0gdG9vbHNfNC40LjAgICAgICAgICAgICAgZGF0YS50YWJsZV8xLjE1LjQgICAgICAgZmdzZWFfMS4zMC4wICAgICAgICAgICAgYmFiZWxnZW5lXzIyLjkgICAgICAgICAgZnNfMS42LjQgICAgICAgICAgICAgICBcbiBbODZdIGdyYXBobGF5b3V0c18xLjEuMSAgICAgIGZhc3RtYXRjaF8xLjEtNCAgICAgICAgIHRpZHlncmFwaF8xLjMuMSAgICAgICAgIGNvd3Bsb3RfMS4xLjMgICAgICAgICAgIGdyaWRfNC40LjAgICAgICAgICAgICAgXG4gWzkxXSBhcGVfNS44ICAgICAgICAgICAgICAgICB0aWR5cl8xLjMuMSAgICAgICAgICAgICBBbm5vdGF0aW9uRGJpXzEuNjYuMCAgICBjb2xvcnNwYWNlXzIuMS0wICAgICAgICBubG1lXzMuMS0xNjQgICAgICAgICAgIFxuIFs5Nl0gR2Vub21lSW5mb0RiRGF0YV8xLjIuMTIgcGF0Y2h3b3JrXzEuMi4wICAgICAgICAgZ2dmb3JjZV8wLjQuMiAgICAgICAgICAgY2xpXzMuNi4yICAgICAgICAgICAgICAgZmFuc2lfMS4wLjYgICAgICAgICAgICBcblsxMDFdIHZpcmlkaXNMaXRlXzAuNC4yICAgICAgIGRwbHlyXzEuMS40ICAgICAgICAgICAgIGd0YWJsZV8wLjMuNSAgICAgICAgICAgIHl1bGFiLnV0aWxzXzAuMS40ICAgICAgIGRpZ2VzdF8wLjYuMzUgICAgICAgICAgXG5bMTA2XSBCaW9jR2VuZXJpY3NfMC41MC4wICAgICBnZ3JlcGVsXzAuOS41ICAgICAgICAgICBnZ3Bsb3RpZnlfMC4xLjIgICAgICAgICBmYXJ2ZXJfMi4xLjEgICAgICAgICAgICBtZW1vaXNlXzIuMC4xICAgICAgICAgIFxuWzExMV0gbGlmZWN5Y2xlXzEuMC40ICAgICAgICAgaHR0cl8xLjQuNyAgICAgICAgICAgICAgR08uZGJfMy4xOS4xICAgICAgICAgICAgYml0NjRfNC4wLjUgICAgICAgICAgICAgTUFTU183LjMtNjAuMiAgICAgICAgICBcbiJ9 --> -<pre><code>R version 4.4.0 (2024-04-24) +<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzICAgICBncmFwaGljcyAgZ3JEZXZpY2VzIHV0aWxzICAgICBkYXRhc2V0cyAgbWV0aG9kcyAgIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcblsxXSBtc2lnZGJyXzcuNS4xICAgICAgICAgIGNsdXN0ZXJQcm9maWxlcl80LjEyLjAgb3B0cGFyc2VfMS43LjUgICAgICAgIFxuXG5sb2FkZWQgdmlhIGEgbmFtZXNwYWNlIChhbmQgbm90IGF0dGFjaGVkKTpcbiAgWzFdIERCSV8xLjIuMiAgICAgICAgICAgICAgIGdzb25fMC4xLjAgICAgICAgICAgICAgIHNoYWRvd3RleHRfMC4xLjMgICAgICAgXG4gIFs0XSBncmlkRXh0cmFfMi4zICAgICAgICAgICBybGFuZ18xLjEuMyAgICAgICAgICAgICBtYWdyaXR0cl8yLjAuMyAgICAgICAgIFxuICBbN10gRE9TRV8zLjMwLjAgICAgICAgICAgICAgY29tcGlsZXJfNC40LjEgICAgICAgICAgUlNRTGl0ZV8yLjMuNiAgICAgICAgICBcbiBbMTBdIHBuZ18wLjEtOCAgICAgICAgICAgICAgIHZjdHJzXzAuNi41ICAgICAgICAgICAgIHJlc2hhcGUyXzEuNC40ICAgICAgICAgXG4gWzEzXSBzdHJpbmdyXzEuNS4xICAgICAgICAgICBwa2djb25maWdfMi4wLjMgICAgICAgICBjcmF5b25fMS41LjIgICAgICAgICAgIFxuIFsxNl0gZmFzdG1hcF8xLjEuMSAgICAgICAgICAgWFZlY3Rvcl8wLjQ0LjAgICAgICAgICAgbGFiZWxpbmdfMC40LjMgICAgICAgICBcbiBbMTldIGdncmFwaF8yLjIuMSAgICAgICAgICAgIHV0ZjhfMS4yLjQgICAgICAgICAgICAgIEhETy5kYl8wLjk5LjEgICAgICAgICAgXG4gWzIyXSBybWFya2Rvd25fMi4yNiAgICAgICAgICB0emRiXzAuNC4wICAgICAgICAgICAgICBlbnJpY2hwbG90XzEuMjQuMCAgICAgIFxuIFsyNV0gVUNTQy51dGlsc18xLjAuMCAgICAgICAgcHVycnJfMS4wLjIgICAgICAgICAgICAgYml0XzQuMC41ICAgICAgICAgICAgICBcbiBbMjhdIHhmdW5fMC40MyAgICAgICAgICAgICAgIHpsaWJiaW9jXzEuNTAuMCAgICAgICAgIGNhY2hlbV8xLjAuOCAgICAgICAgICAgXG4gWzMxXSBhcGxvdF8wLjIuMiAgICAgICAgICAgICBHZW5vbWVJbmZvRGJfMS40MC4wICAgICBqc29ubGl0ZV8xLjguOCAgICAgICAgIFxuIFszNF0gYmxvYl8xLjIuNCAgICAgICAgICAgICAgaGlnaHJfMC4xMCAgICAgICAgICAgICAgQmlvY1BhcmFsbGVsXzEuMzguMCAgICBcbiBbMzddIHR3ZWVucl8yLjAuMyAgICAgICAgICAgIHBhcmFsbGVsXzQuNC4xICAgICAgICAgIFI2XzIuNS4xICAgICAgICAgICAgICAgXG4gWzQwXSBic2xpYl8wLjcuMCAgICAgICAgICAgICBzdHJpbmdpXzEuOC4zICAgICAgICAgICBSQ29sb3JCcmV3ZXJfMS4xLTMgICAgIFxuIFs0M10ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgR09TZW1TaW1fMi4zMC4wICAgICAgICAgUmNwcF8xLjAuMTIgICAgICAgICAgICBcbiBbNDZdIGtuaXRyXzEuNDYgICAgICAgICAgICAgIHJlYWRyXzIuMS41ICAgICAgICAgICAgIElSYW5nZXNfMi4zOC4wICAgICAgICAgXG4gWzQ5XSBNYXRyaXhfMS43LTAgICAgICAgICAgICBzcGxpbmVzXzQuNC4xICAgICAgICAgICBpZ3JhcGhfMi4wLjMgICAgICAgICAgIFxuIFs1Ml0gdGlkeXNlbGVjdF8xLjIuMSAgICAgICAgcXZhbHVlXzIuMzYuMCAgICAgICAgICAgeWFtbF8yLjMuOCAgICAgICAgICAgICBcbiBbNTVdIHZpcmlkaXNfMC42LjUgICAgICAgICAgIGNvZGV0b29sc18wLjItMjAgICAgICAgIGxhdHRpY2VfMC4yMi02ICAgICAgICAgXG4gWzU4XSB0aWJibGVfMy4yLjEgICAgICAgICAgICBwbHlyXzEuOC45ICAgICAgICAgICAgICB0cmVlaW9fMS4yOC4wICAgICAgICAgIFxuIFs2MV0gQmlvYmFzZV8yLjY0LjAgICAgICAgICAgd2l0aHJfMy4wLjAgICAgICAgICAgICAgS0VHR1JFU1RfMS40NC4wICAgICAgICBcbiBbNjRdIGV2YWx1YXRlXzAuMjMgICAgICAgICAgIGdyaWRHcmFwaGljc18wLjUtMSAgICAgIHNjYXR0ZXJwaWVfMC4yLjIgICAgICAgXG4gWzY3XSBnZXRvcHRfMS4yMC40ICAgICAgICAgICBwb2x5Y2xpcF8xLjEwLTYgICAgICAgICBCaW9zdHJpbmdzXzIuNzIuMCAgICAgIFxuIFs3MF0gZ2d0cmVlXzMuMTIuMCAgICAgICAgICAgcGlsbGFyXzEuOS4wICAgICAgICAgICAgc3RhdHM0XzQuNC4xICAgICAgICAgICBcbiBbNzNdIGdnZnVuXzAuMS40ICAgICAgICAgICAgIGdlbmVyaWNzXzAuMS4zICAgICAgICAgIHZyb29tXzEuNi41ICAgICAgICAgICAgXG4gWzc2XSBobXNfMS4xLjMgICAgICAgICAgICAgICBTNFZlY3RvcnNfMC40Mi4wICAgICAgICBnZ3Bsb3QyXzMuNS4xICAgICAgICAgIFxuIFs3OV0gdGlkeXRyZWVfMC40LjYgICAgICAgICAgbXVuc2VsbF8wLjUuMSAgICAgICAgICAgc2NhbGVzXzEuMy4wICAgICAgICAgICBcbiBbODJdIGdsdWVfMS43LjAgICAgICAgICAgICAgIGxhenlldmFsXzAuMi4yICAgICAgICAgIHRvb2xzXzQuNC4xICAgICAgICAgICAgXG4gWzg1XSBkYXRhLnRhYmxlXzEuMTUuNCAgICAgICBmZ3NlYV8xLjMwLjAgICAgICAgICAgICBiYWJlbGdlbmVfMjIuOSAgICAgICAgIFxuIFs4OF0gZnNfMS42LjQgICAgICAgICAgICAgICAgZ3JhcGhsYXlvdXRzXzEuMS4xICAgICAgZmFzdG1hdGNoXzEuMS00ICAgICAgICBcbiBbOTFdIHRpZHlncmFwaF8xLjMuMSAgICAgICAgIGNvd3Bsb3RfMS4xLjMgICAgICAgICAgIGdyaWRfNC40LjEgICAgICAgICAgICAgXG4gWzk0XSBhcGVfNS44ICAgICAgICAgICAgICAgICB0aWR5cl8xLjMuMSAgICAgICAgICAgICBBbm5vdGF0aW9uRGJpXzEuNjYuMCAgIFxuIFs5N10gY29sb3JzcGFjZV8yLjEtMCAgICAgICAgbmxtZV8zLjEtMTY0ICAgICAgICAgICAgcGF0Y2h3b3JrXzEuMi4wICAgICAgICBcblsxMDBdIEdlbm9tZUluZm9EYkRhdGFfMS4yLjEyXG4gWyByZWFjaGVkIGdldE9wdGlvbihcIm1heC5wcmludFwiKSAtLSBvbWl0dGVkIDIwIGVudHJpZXMgXVxuIn0= --> +<pre><code>R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.4 LTS @@ -3361,43 +3369,58 @@ <h2>Session Info</h2> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0 locale: - [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 - [6] LC_MESSAGES=C.UTF-8 LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C -[11] LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C + [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C + [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 + [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 + [7] LC_PAPER=en_US.UTF-8 LC_NAME=C + [9] LC_ADDRESS=C LC_TELEPHONE=C +[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C time zone: Etc/UTC tzcode source: system (glibc) attached base packages: -[1] stats graphics grDevices datasets utils methods base +[1] stats graphics grDevices utils datasets methods base other attached packages: -[1] msigdbr_7.5.1 clusterProfiler_4.12.0 +[1] msigdbr_7.5.1 clusterProfiler_4.12.0 optparse_1.7.5 loaded via a namespace (and not attached): - [1] DBI_1.2.2 gson_0.1.0 shadowtext_0.1.3 gridExtra_2.3 rlang_1.1.3 - [6] magrittr_2.0.3 DOSE_3.30.0 compiler_4.4.0 RSQLite_2.3.6 png_0.1-8 - [11] vctrs_0.6.5 reshape2_1.4.4 stringr_1.5.1 pkgconfig_2.0.3 crayon_1.5.2 - [16] fastmap_1.1.1 XVector_0.44.0 labeling_0.4.3 ggraph_2.2.1 utf8_1.2.4 - [21] HDO.db_0.99.1 tzdb_0.4.0 enrichplot_1.24.0 UCSC.utils_1.0.0 purrr_1.0.2 - [26] bit_4.0.5 xfun_0.43 zlibbioc_1.50.0 cachem_1.0.8 aplot_0.2.2 - [31] GenomeInfoDb_1.40.0 jsonlite_1.8.8 blob_1.2.4 BiocParallel_1.38.0 tweenr_2.0.3 - [36] parallel_4.4.0 R6_2.5.1 stringi_1.8.3 RColorBrewer_1.1-3 GOSemSim_2.30.0 - [41] Rcpp_1.0.12 knitr_1.46 readr_2.1.5 IRanges_2.38.0 Matrix_1.7-0 - [46] splines_4.4.0 igraph_2.0.3 tidyselect_1.2.1 qvalue_2.36.0 rstudioapi_0.16.0 - [51] yaml_2.3.8 viridis_0.6.5 codetools_0.2-20 lattice_0.22-6 tibble_3.2.1 - [56] plyr_1.8.9 treeio_1.28.0 Biobase_2.64.0 withr_3.0.0 KEGGREST_1.44.0 - [61] gridGraphics_0.5-1 scatterpie_0.2.2 polyclip_1.10-6 Biostrings_2.72.0 pillar_1.9.0 - [66] BiocManager_1.30.22 ggtree_3.12.0 renv_1.0.7 stats4_4.4.0 ggfun_0.1.4 - [71] generics_0.1.3 vroom_1.6.5 hms_1.1.3 S4Vectors_0.42.0 ggplot2_3.5.1 - [76] tidytree_0.4.6 munsell_0.5.1 scales_1.3.0 glue_1.7.0 lazyeval_0.2.2 - [81] tools_4.4.0 data.table_1.15.4 fgsea_1.30.0 babelgene_22.9 fs_1.6.4 - [86] graphlayouts_1.1.1 fastmatch_1.1-4 tidygraph_1.3.1 cowplot_1.1.3 grid_4.4.0 - [91] ape_5.8 tidyr_1.3.1 AnnotationDbi_1.66.0 colorspace_2.1-0 nlme_3.1-164 - [96] GenomeInfoDbData_1.2.12 patchwork_1.2.0 ggforce_0.4.2 cli_3.6.2 fansi_1.0.6 -[101] viridisLite_0.4.2 dplyr_1.1.4 gtable_0.3.5 yulab.utils_0.1.4 digest_0.6.35 -[106] BiocGenerics_0.50.0 ggrepel_0.9.5 ggplotify_0.1.2 farver_2.1.1 memoise_2.0.1 -[111] lifecycle_1.0.4 httr_1.4.7 GO.db_3.19.1 bit64_4.0.5 MASS_7.3-60.2 </code></pre> + [1] DBI_1.2.2 gson_0.1.0 shadowtext_0.1.3 + [4] gridExtra_2.3 rlang_1.1.3 magrittr_2.0.3 + [7] DOSE_3.30.0 compiler_4.4.1 RSQLite_2.3.6 + [10] png_0.1-8 vctrs_0.6.5 reshape2_1.4.4 + [13] stringr_1.5.1 pkgconfig_2.0.3 crayon_1.5.2 + [16] fastmap_1.1.1 XVector_0.44.0 labeling_0.4.3 + [19] ggraph_2.2.1 utf8_1.2.4 HDO.db_0.99.1 + [22] rmarkdown_2.26 tzdb_0.4.0 enrichplot_1.24.0 + [25] UCSC.utils_1.0.0 purrr_1.0.2 bit_4.0.5 + [28] xfun_0.43 zlibbioc_1.50.0 cachem_1.0.8 + [31] aplot_0.2.2 GenomeInfoDb_1.40.0 jsonlite_1.8.8 + [34] blob_1.2.4 highr_0.10 BiocParallel_1.38.0 + [37] tweenr_2.0.3 parallel_4.4.1 R6_2.5.1 + [40] bslib_0.7.0 stringi_1.8.3 RColorBrewer_1.1-3 + [43] jquerylib_0.1.4 GOSemSim_2.30.0 Rcpp_1.0.12 + [46] knitr_1.46 readr_2.1.5 IRanges_2.38.0 + [49] Matrix_1.7-0 splines_4.4.1 igraph_2.0.3 + [52] tidyselect_1.2.1 qvalue_2.36.0 yaml_2.3.8 + [55] viridis_0.6.5 codetools_0.2-20 lattice_0.22-6 + [58] tibble_3.2.1 plyr_1.8.9 treeio_1.28.0 + [61] Biobase_2.64.0 withr_3.0.0 KEGGREST_1.44.0 + [64] evaluate_0.23 gridGraphics_0.5-1 scatterpie_0.2.2 + [67] getopt_1.20.4 polyclip_1.10-6 Biostrings_2.72.0 + [70] ggtree_3.12.0 pillar_1.9.0 stats4_4.4.1 + [73] ggfun_0.1.4 generics_0.1.3 vroom_1.6.5 + [76] hms_1.1.3 S4Vectors_0.42.0 ggplot2_3.5.1 + [79] tidytree_0.4.6 munsell_0.5.1 scales_1.3.0 + [82] glue_1.7.0 lazyeval_0.2.2 tools_4.4.1 + [85] data.table_1.15.4 fgsea_1.30.0 babelgene_22.9 + [88] fs_1.6.4 graphlayouts_1.1.1 fastmatch_1.1-4 + [91] tidygraph_1.3.1 cowplot_1.1.3 grid_4.4.1 + [94] ape_5.8 tidyr_1.3.1 AnnotationDbi_1.66.0 + [97] colorspace_2.1-0 nlme_3.1-164 patchwork_1.2.0 +[100] GenomeInfoDbData_1.2.12 + [ reached getOption("max.print") -- omitted 20 entries ]</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> </div> diff --git a/scRNA-seq-advanced/05-aucell-live.Rmd b/scRNA-seq-advanced/05-aucell-live.Rmd new file mode 100644 index 00000000..76323182 --- /dev/null +++ b/scRNA-seq-advanced/05-aucell-live.Rmd @@ -0,0 +1,422 @@ +--- +title: "Pathway Analysis: AUCell" +output: + html_notebook: + toc: true + toc_float: true +author: CCDL for ALSF +date: 2024 +--- + +*Adapted from [the AUCell vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html) and [the `cell-type-ewings` module](https://github.com/AlexsLemonade/OpenScPCA-analysis/tree/main/analyses/cell-type-ewings) that is part of the Open Single-cell Pediatric Cancer Atlas project.* + +## Objectives + +- Introduce the `AUCell` R package +- Illustrate how AUC values are calculated +- Demonstrate how AUC values can be used for cell assignment and plotting + +--- + +In this notebook, we'll demonstrate how to use the AUCell method, introduced in [Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463). + +We can use AUCell when we are interested in a gene set's relative expression or activity in an individual cell. +Gene sets can come from a curated collection of prior knowledge, like the Hallmark collection we used in the last notebook, or we can use our own custom gene sets (e.g., a set of marker genes for a cell type of interest). + +A nice feature of AUCell is that it is based on ranking genes from highest to lowest expression value in an individual cell, which is helpful in the following ways ([AUCell vignette](https://bioconductor.org/packages/release/bioc/vignettes/AUCell/inst/doc/AUCell.html)): + +- It can take a number of different values as input (e.g., raw counts, TPM) +- It compensates for differences in library size, where something like averaging raw count values of genes in a gene set would not +- It scales to larger datasets, since creating rankings is not as resource-intensive as something like permutation testing, and we could split up the object into subsets of cells if needed + +AUCell calculates the area under the recovery curve (AUC), which "represents the proportion of expressed genes in the signature and their relative expression value compared to the other genes within the cell" ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)). +We will visualize some recovery curves in the notebook to give you a better intuition about the AUC and its meaning. + +The AUC values we get out of AUCell can be used in a number of ways ([Aibar _et al_. 2017.](https://doi.org/10.1038/nmeth.4463)): + +- As continuous values we can use for visualization or clustering +- For binary assignment (i.e., "on" and "off" or "expressed" and "not expressed") if we pick a threshold either automatically using built-in functionality or manually by inspecting the distribution of scores ourselves + +We will use an snRNA-seq of a Ewing sarcoma sample from the [`SCPCP000015` project](https://scpca.alexslemonade.org/projects/SCPCP000015) on the Single-cell Pediatric Cancer Atlas Portal and two relevant gene sets from the Molecular Signatures Database (MSigDB) to demonstrate this method. + +## Set up + +### Libraries + +```{r libraries} +# We will be loading a SingleCellExperiment object into our environment but don't need to see the startup messages +suppressPackageStartupMessages({ + library(SingleCellExperiment) +}) + +# Library we'll use for the gene set analysis itself +library(AUCell) + +# Libraries for accessing and working with gene sets +library(GSEABase) +library(msigdbr) +``` + +### Directories and files + +#### Directories + +```{r setup_directories} +# Input data +ewing_data_dir <- fs::path("data", "ewing-sarcoma") +processed_dir <- fs::path(ewing_data_dir, "processed") + +# Directory for holding pathway analysis results +analysis_dir <- fs::path("analysis", "ewing-sarcoma", "pathway-analysis") +# Create if it doesn't exist yet +fs::dir_create(analysis_dir) +``` + +#### Files + +The input will be a `SingleCellExperiment` for an individual Ewing sarcoma library. + +```{r setup_input_files} +sce_file <- fs::path(processed_dir, + "SCPCS000490", + "SCPCL000822_processed.rds") +``` + +We will save the AUCell results as a table in the analysis directory. + +```{r setup_output_files, live = TRUE} + +``` + + +### Functions + +The `source()` function allows us to load in custom functions we saved in an `.R` file. + +```{r source_functions} +source(fs::path("util", "aucell_functions.R")) +``` + +This loads one custom function, called `plot_recovery_curve()`, into our environment. +This function is adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd#L295-L316). + +## Set up gene sets + +We are going to use two gene sets pertaining to Ewing sarcoma. + +* [`ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION`](https://www.gsea-msigdb.org/gsea/msigdb/geneset_page.jsp?geneSetName=ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION), which are genes that were highly expressed in a rhabdomyosarcoma cell line engineered to express the EWSR1-FLI1 fusion. +* [`RIGGI_EWING_SARCOMA_PROGENITOR_UP`](https://www.gsea-msigdb.org/gsea/msigdb/cards/RIGGI_EWING_SARCOMA_PROGENITOR_UP), which are genes that were highly expressed in mesenchymal stem cells engineered to express the EWS-FLI1 fusion protein. + +We would expect both of these gene sets to have high expression in tumor cells. + +```{r genesets} +# Create a named vector with the relevant gene set names +ewing_gene_set_names <- c(zhang = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + riggi = "RIGGI_EWING_SARCOMA_PROGENITOR_UP") + +ewing_gene_set_names +``` + +These gene sets come from the C2 gene set collection from MSigDB. +Let's retrieve them using `msigdbr()`. + +```{r extract_genesets, live = TRUE} + +``` + +`AUCell` uses gene sets in a particular format that comes from the `GSEABase` package. +We need to create a `GeneSetCollection`. + +```{r gene_set_collection} +ewing_gene_set_collection <- ewing_gene_set_names |> + purrr::map( + # For each gene set + \(gene_set_name) { + ewing_gene_sets_df |> + # Subset to the rows in that gene set + dplyr::filter(gs_name == gene_set_name) |> + # Grab the Ensembl gene identifiers + dplyr::pull(ensembl_gene) |> + # Create a GeneSet object + GeneSet(setName = gene_set_name, + geneIdType = ENSEMBLIdentifier()) + } + ) |> + # Turn the list of GeneSet objects into a GeneSet collection + GeneSetCollection() +``` + +## Read in and prepare SingleCellExperiment + +```{r read_in_sce, live = TRUE} + +``` + +The `AUCell` functions takes an expression matrix with genes as rows and cells as column. +We can extract a counts matrix in sparse format for use with `AUCell`. + +```{r counts_matrix} +# Extract counts matrix +counts_matrix <- counts(sce) +``` + +There may be genes in our gene set that do not appear in the SingleCellExperiment object. +We can remove them using the `subsetGeneSets()` function. + +```{r subset_gene_sets, live = TRUE} +# Remove genes from gene sets if they are not in the SCE + +``` + +## AUCell + +AUCell relies on ranking genes from highest to lowest expression value to calculate the AUC. +The AUC is the area under the recovery curve, which captures the number of genes in a gene set that are present in the rankings above some threshold (i.e., it is the area under the curve to the left of this gene rank). +By default, the top 5% of genes are used as the threshold. + +Some genes will not be detected (i.e., have 0 counts). +Genes can also have the same expression level (i.e., ties). +These undetected genes and ties will be randomly ordered in our ranking. +To make our rankings – and therefore results – reproducible, we will set a seed. + +```{r set_seed, live = TRUE} + +``` + +### Cell ranking + +The first step in AUCell is to rank genes for each cell from highest to lowest expression value. +We can do this using the `AUCell_buildRankings()` function, which will output a visualization showing the distribution of the number of genes detected in the cells in our SingleCellExperiment object. + +```{r cell_rankings, live = TRUE} + +``` + +The AUCell authors recommend making sure most cells have at least the number of genes we will use as the max rank to calculate the AUC. + +The AUC max rank value tells AUCell the cutoff in the gene rankings to use for calculating AUC; we will visualize this curve and max rank in just a moment. +If we picked a max rank higher than the number of genes detected in most cells, the non-detected genes that are randomly ordered would play an outsized role in our AUC values. + +By default, the max rank is the top 5% highest expressed genes. +We can calculate the default max rank by taking into account the number of genes. + +```{r explore_auc_max_rank} +nrow(cell_rankings) * 0.05 +``` + +This number is probably too high, given the distribution of the number of genes detected by cell we visualized with `AUCell_buildRankings()`. + +What if we chose a 1% threshold? + +```{r lower_max_rank, live = TRUE} + +``` + +That is probably a more reasonable choice for this dataset. + +We can use a function called `ceiling()` to round this and save it to a variable for later use. + +```{r auc_max_rank, live = TRUE} + +``` + +### Plotting AUC + +The AUC values we get out of AUCell are the area under a recovery curve and estimate the proportion of genes in the gene set that are highly expressed (i.e., highly ranked). + +Let's plot the recovery curve for a cell with high AUC and a cell with low AUC to get a better intuition about AUC values. +Earlier, we loaded a custom function we adapted from [the AUCell vignette](https://github.com/aertslab/AUCell/blob/91753b327a39dc7a4bbed46408ec2271c485f2f0/vignettes/AUCell.Rmd) called `plot_recovery_curve()` with `source()`. + +First, we'll start with a cell with a high AUC. +We picked this barcode ahead of time when we wrote the notebook. + +```{r high_recovery_curve} +plot_recovery_curve(cell_rankings, + ewing_gene_set_collection, + gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + barcode = "CTGAGCGGTCTTTATC", + auc_max_rank = auc_max_rank) # 1% threshold +``` + +The x-axis is the gene ranks for all genes. +The y-axis is the number of genes in the signature at a given point in the gene ranking – the line will rise when a gene in the gene set is encountered in the ranking from highest to lowest. +The AUC is the area under this recovery curve at the max rank threshold chosen for this dataset. + +Now, let's look at an example with a low AUC. + +```{r low_recovery_curve} +plot_recovery_curve(cell_rankings, + ewing_gene_set_collection, + gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", + barcode = "AGATAGAGTCACAATC", + auc_max_rank = auc_max_rank) # 1% threshold +``` + +Far fewer genes in the gene set are ranked above the threshold, yielding a lower AUC value. + +### Calculating the AUC + +Once we have the rankings, we can calculate the AUC scores for both gene sets in all cells with the `AUCell_calcAUC()` function. + +```{r calc_auc, live=TRUE} + +``` + +This function returns an `aucellResults` object. + +```{r check_str, live = TRUE} + +``` + +It can be much more convenient to work with this in a tabular format. + +```{r auc_to_table} +# Extract AUC +auc_df <- cell_auc@assays@data$AUC |> + # Transpose + t() |> + # Convert to data frame + as.data.frame() |> + # Make the barcodes a column + tibble::rownames_to_column("barcodes") + +# Look at first few rows +head(auc_df) +``` + +### Assignments + +AUCell can assign cells as having an active gene set or not by picking a threshold automatically. +We'll explore these in a later plot, but for now, let's calculate the threshold and assign cells with `AUCell_exploreThresholds()`. + +```{r auc_assignments, live = TRUE} + +``` + +We're going to plot the distribution of AUC values with `ggplot2`, so we will want the AUC values in a longer format. + +```{r auc_plotting_df} +auc_plotting_df <- auc_df |> + tidyr::pivot_longer(!barcodes, + names_to = "gene_set", + values_to = "auc") |> + dplyr::mutate( + # Create a new logical column called assigned + assigned = dplyr::case_when( + # For Zhang gene set rows, set to TRUE when the barcode is in the + # assignment list + gene_set == ewing_gene_set_names[["zhang"]] & + barcodes %in% auc_assignments[[ewing_gene_set_names[["zhang"]]]]$assignment ~ TRUE, + # For Riggi gene set rows, set to TRUE when the barcode is in the + # assignment list + gene_set == ewing_gene_set_names[["riggi"]] & + barcodes %in% auc_assignments[[ewing_gene_set_names[["riggi"]]]]$assignment ~ TRUE, + # Otherwise, set to FALSE + .default = FALSE + ) + ) + +auc_plotting_df +``` + +To draw vertical lines representing the automatically chosen threshold, we can create a separate data frame. + +```{r auc_threshold_df} +auc_threshold_df <- data.frame( + gene_set = ewing_gene_set_names, + # Grab thresholds associated with each gene set from assignements object + threshold = c(auc_assignments[[ewing_gene_set_names["zhang"]]]$aucThr$selected, + auc_assignments[[ewing_gene_set_names["riggi"]]]$aucThr$selected) +) + +auc_threshold_df +``` + +Now let's make a density plot, plotting the density of the assigned and unassigned cells separately and drawing a vertical line for the threshold. + +```{r auc_density_plot} +auc_plotting_df |> + ggplot2::ggplot( + ggplot2::aes( + x = auc, # AUC values + color = assigned, # Group by assignment + fill = assigned, # Group by assignment + ) + ) + + ggplot2::geom_density(alpha = 0.2) + + # Draw a vertical dotted line showing the threshold for each gene set + ggplot2::geom_vline(data = auc_threshold_df, + mapping = ggplot2::aes(xintercept = threshold), + lty = 2) + + # Plot each gene set in its own facet + ggplot2::facet_grid(cols = ggplot2::vars(gene_set)) + + # Use a built-in theme + ggplot2::theme_bw() +``` + +For these particular gene sets, the AUC values appear to be bimodally distributed, and we can easily identify cells where the genes are highly expressed. + +Let's write this table to the output file. + +```{r save_auc} +auc_plotting_df |> + readr::write_tsv(output_file) +``` + +### UMAPs + +#### Adding AUC to `colData` + +We can also add the AUC values back into the SingleCellExperiment for convenience, e.g., for plotting. +We'll add it to the existing `colData`. + +First, let's rename the gene set columns to something more easily typed. + +```{r rename_gene_set} +auc_df <- auc_df |> + # Use shorter names + dplyr::rename(zhang_auc = ewing_gene_set_names[["zhang"]], + riggi_auc = ewing_gene_set_names[["riggi"]]) + +``` + +And join it to the existing `colData`. + +```{r coldata, live = TRUE} +# Extract the existing colData, and left join it with the AUC values by the +# barcodes + +``` + +Now, we're ready to add it back to the object. + +```{r add_back_colData, live = TRUE} +# We need to save this as a DataFrame + +``` + +#### Plotting UMAPs + +We can use the `plotUMAP()` function from the `scater` package to plot a UMAP with the points colored by the AUC value + +```{r plot_umap_zhang} +scater::plotUMAP(sce, colour_by = "zhang_auc") + + # Use the gene set name, replacing underscores with spaces + ggplot2::ggtitle(stringr::str_replace_all(ewing_gene_set_names[["zhang"]], + "\\_", + " ")) +``` + +Let's color the points by the AUC values for the other gene set. + +```{r plot_umap_riggi, live = TRUE} + +``` + +We would want to do something more formal to confirm, but it seems like the same cells have high AUC values for both gene sets! + +## Session Info + +```{r session_info} +sessionInfo() +``` diff --git a/scRNA-seq-advanced/05-aucell.nb.html b/scRNA-seq-advanced/05-aucell.nb.html index 696c8222..baa1d7f0 100644 --- a/scRNA-seq-advanced/05-aucell.nb.html +++ b/scRNA-seq-advanced/05-aucell.nb.html @@ -2946,41 +2946,45 @@ <h2>Set up</h2> <h3>Libraries</h3> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBXZSB3aWxsIGJlIGxvYWRpbmcgYSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmplY3QgaW50byBvdXIgZW52aXJvbm1lbnQgYnV0IGRvbid0IG5lZWQgdG8gc2VlIHRoZSBzdGFydHVwIG1lc3NhZ2VzXG5zdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoe1xuICBsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KVxufSlcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgV2Ugd2lsbCBiZSBsb2FkaW5nIGEgU2luZ2xlQ2VsbEV4cGVyaW1lbnQgb2JqZWN0IGludG8gb3VyIGVudmlyb25tZW50IGJ1dCBkb24ndCBuZWVkIHRvIHNlZSB0aGUgc3RhcnR1cCBtZXNzYWdlcyIsInN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7XG4gIGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpXG59KSJdfQ== --> <pre class="r"><code># We will be loading a SingleCellExperiment object into our environment but don't need to see the startup messages suppressPackageStartupMessages({ library(SingleCellExperiment) })</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiV2FybmluZzogcmVwbGFjaW5nIHByZXZpb3VzIGltcG9ydCDigJhTNEFycmF5czo6bWFrZU5pbmRleEZyb21BcnJheVZpZXdwb3J04oCZIGJ5IOKAmERlbGF5ZWRBcnJheTo6bWFrZU5pbmRleEZyb21BcnJheVZpZXdwb3J04oCZIHdoZW4gbG9hZGluZyDigJhTdW1tYXJpemVkRXhwZXJpbWVudOKAmVxuIn0= --> -<pre><code>Warning: replacing previous import ‘S4Arrays::makeNindexFromArrayViewport’ by ‘DelayedArray::makeNindexFromArrayViewport’ when loading ‘SummarizedExperiment’</code></pre> -<!-- rnb-output-end --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBMaWJyYXJ5IHdlJ2xsIHVzZSBmb3IgdGhlIGdlbmUgc2V0IGFuYWx5c2lzIGl0c2VsZlxubGlicmFyeShBVUNlbGwpXG5gYGAifQ== --> +<!-- rnb-warning-begin eyJkYXRhIjoiV2FybmluZzogcmVwbGFjaW5nIHByZXZpb3VzIGltcG9ydCAnUzRBcnJheXM6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgYnlcbidEZWxheWVkQXJyYXk6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgd2hlbiBsb2FkaW5nICdTdW1tYXJpemVkRXhwZXJpbWVudCdcbiJ9 --> +<pre><code>Warning: replacing previous import 'S4Arrays::makeNindexFromArrayViewport' by +'DelayedArray::makeNindexFromArrayViewport' when loading 'SummarizedExperiment'</code></pre> +<!-- rnb-warning-end --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgTGlicmFyeSB3ZSdsbCB1c2UgZm9yIHRoZSBnZW5lIHNldCBhbmFseXNpcyBpdHNlbGYiLCJsaWJyYXJ5KEFVQ2VsbCkiLCIiLCIjIExpYnJhcmllcyBmb3IgYWNjZXNzaW5nIGFuZCB3b3JraW5nIHdpdGggZ2VuZSBzZXRzIiwibGlicmFyeShHU0VBQmFzZSkiXX0= --> <pre class="r"><code># Library we'll use for the gene set analysis itself -library(AUCell)</code></pre> -<!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUmVnaXN0ZXJlZCBTMyBtZXRob2Qgb3ZlcndyaXR0ZW4gYnkgJ2RhdGEudGFibGUnOlxuICBtZXRob2QgICAgICAgICAgIGZyb21cbiAgcHJpbnQuZGF0YS50YWJsZSAgICAgXG4ifQ== --> -<pre><code>Registered S3 method overwritten by 'data.table': - method from - print.data.table </code></pre> -<!-- rnb-output-end --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBMaWJyYXJpZXMgZm9yIGFjY2Vzc2luZyBhbmQgd29ya2luZyB3aXRoIGdlbmUgc2V0c1xubGlicmFyeShHU0VBQmFzZSlcbmBgYCJ9 --> -<pre class="r"><code># Libraries for accessing and working with gene sets +library(AUCell) + +# Libraries for accessing and working with gene sets library(GSEABase)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBhbm5vdGF0ZVxuTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBBbm5vdGF0aW9uRGJpXG5Mb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IFhNTFxuTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBncmFwaFxuXG5BdHRhY2hpbmcgcGFja2FnZTog4oCYZ3JhcGjigJlcblxuVGhlIGZvbGxvd2luZyBvYmplY3QgaXMgbWFza2VkIGZyb20g4oCYcGFja2FnZTpYTUzigJk6XG5cbiAgICBhZGROb2RlXG4ifQ== --> -<pre><code>Loading required package: annotate -Loading required package: AnnotationDbi -Loading required package: XML -Loading required package: graph - -Attaching package: ‘graph’ - -The following object is masked from ‘package:XML’: +<!-- rnb-message-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBhbm5vdGF0ZVxuIn0= --> +<pre><code>Loading required package: annotate</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBBbm5vdGF0aW9uRGJpXG4ifQ== --> +<pre><code>Loading required package: AnnotationDbi</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBYTUxcbiJ9 --> +<pre><code>Loading required package: XML</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBncmFwaFxuIn0= --> +<pre><code>Loading required package: graph</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiXG5BdHRhY2hpbmcgcGFja2FnZTogJ2dyYXBoJ1xuIn0= --> +<pre><code> +Attaching package: 'graph'</code></pre> +<!-- rnb-message-end --> +<!-- rnb-message-begin eyJkYXRhIjoiVGhlIGZvbGxvd2luZyBvYmplY3QgaXMgbWFza2VkIGZyb20gJ3BhY2thZ2U6WE1MJzpcblxuICAgIGFkZE5vZGVcbiJ9 --> +<pre><code>The following object is masked from 'package:XML': addNode</code></pre> -<!-- rnb-output-end --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubGlicmFyeShtc2lnZGJyKVxuYGBgIn0= --> +<!-- rnb-message-end --> +<!-- rnb-source-begin eyJkYXRhIjoibGlicmFyeShtc2lnZGJyKSJ9 --> <pre class="r"><code>library(msigdbr)</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -2992,7 +2996,7 @@ <h3>Directories and files</h3> <h4>Directories</h4> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBJbnB1dCBkYXRhIFxuZXdpbmdfZGF0YV9kaXIgPC0gZnM6OnBhdGgoXCJkYXRhXCIsIFwiZXdpbmctc2FyY29tYVwiKVxucHJvY2Vzc2VkX2RpciA8LSBmczo6cGF0aChld2luZ19kYXRhX2RpciwgXCJwcm9jZXNzZWRcIilcblxuIyBEaXJlY3RvcnkgZm9yIGhvbGRpbmcgcGF0aHdheSBhbmFseXNpcyByZXN1bHRzXG5hbmFseXNpc19kaXIgPC0gZnM6OnBhdGgoXCJhbmFseXNpc1wiLCBcImV3aW5nLXNhcmNvbWFcIiwgXCJwYXRod2F5LWFuYWx5c2lzXCIpXG4jIENyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldFxuZnM6OmRpcl9jcmVhdGUoYW5hbHlzaXNfZGlyKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgSW5wdXQgZGF0YSAiLCJld2luZ19kYXRhX2RpciA8LSBmczo6cGF0aChcImRhdGFcIiwgXCJld2luZy1zYXJjb21hXCIpIiwicHJvY2Vzc2VkX2RpciA8LSBmczo6cGF0aChld2luZ19kYXRhX2RpciwgXCJwcm9jZXNzZWRcIikiLCIiLCIjIERpcmVjdG9yeSBmb3IgaG9sZGluZyBwYXRod2F5IGFuYWx5c2lzIHJlc3VsdHMiLCJhbmFseXNpc19kaXIgPC0gZnM6OnBhdGgoXCJhbmFseXNpc1wiLCBcImV3aW5nLXNhcmNvbWFcIiwgXCJwYXRod2F5LWFuYWx5c2lzXCIpIiwiIyBDcmVhdGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQiLCJmczo6ZGlyX2NyZWF0ZShhbmFseXNpc19kaXIpIl19 --> <pre class="r"><code># Input data ewing_data_dir <- fs::path("data", "ewing-sarcoma") processed_dir <- fs::path(ewing_data_dir, "processed") @@ -3011,7 +3015,7 @@ <h4>Files</h4> individual Ewing sarcoma library.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2NlX2ZpbGUgPC0gZnM6OnBhdGgocHJvY2Vzc2VkX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICBcIlNDUENTMDAwNDkwXCIsIFxuICAgICAgICAgICAgICAgICAgICAgXCJTQ1BDTDAwMDgyMl9wcm9jZXNzZWQucmRzXCIpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoic2NlX2ZpbGUgPC0gZnM6OnBhdGgocHJvY2Vzc2VkX2RpciwgXG4gICAgICAgICAgICAgICAgICAgICBcIlNDUENTMDAwNDkwXCIsIFxuICAgICAgICAgICAgICAgICAgICAgXCJTQ1BDTDAwMDgyMl9wcm9jZXNzZWQucmRzXCIpIn0= --> <pre class="r"><code>sce_file <- fs::path(processed_dir, "SCPCS000490", "SCPCL000822_processed.rds")</code></pre> @@ -3022,7 +3026,7 @@ <h4>Files</h4> directory.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub3V0cHV0X2ZpbGUgPC0gZnM6OnBhdGgoYW5hbHlzaXNfZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJld2luZ19zYXJjb21hX2F1Y2VsbF9yZXN1bHRzLnRzdlwiKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoib3V0cHV0X2ZpbGUgPC0gZnM6OnBhdGgoYW5hbHlzaXNfZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJld2luZ19zYXJjb21hX2F1Y2VsbF9yZXN1bHRzLnRzdlwiKSJ9 --> <pre class="r"><code>output_file <- fs::path(analysis_dir, "ewing_sarcoma_aucell_results.tsv")</code></pre> <!-- rnb-source-end --> @@ -3036,7 +3040,7 @@ <h3>Functions</h3> functions we saved in an <code>.R</code> file.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc291cmNlKGZzOjpwYXRoKFwidXRpbFwiLCBcImF1Y2VsbF9mdW5jdGlvbnMuUlwiKSlcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoic291cmNlKGZzOjpwYXRoKFwidXRpbFwiLCBcImF1Y2VsbF9mdW5jdGlvbnMuUlwiKSkifQ== --> <pre class="r"><code>source(fs::path("util", "aucell_functions.R"))</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -3062,7 +3066,7 @@ <h2>Set up gene sets</h2> tumor cells.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBDcmVhdGUgYSBuYW1lZCB2ZWN0b3Igd2l0aCB0aGUgcmVsZXZhbnQgZ2VuZSBzZXQgbmFtZXNcbmV3aW5nX2dlbmVfc2V0X25hbWVzIDwtIGMoemhhbmcgPSBcIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT05cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnZ2kgPSBcIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUFwiKVxuXG5ld2luZ19nZW5lX3NldF9uYW1lc1xuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgQ3JlYXRlIGEgbmFtZWQgdmVjdG9yIHdpdGggdGhlIHJlbGV2YW50IGdlbmUgc2V0IG5hbWVzIiwiZXdpbmdfZ2VuZV9zZXRfbmFtZXMgPC0gYyh6aGFuZyA9IFwiWkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByaWdnaSA9IFwiUklHR0lfRVdJTkdfU0FSQ09NQV9QUk9HRU5JVE9SX1VQXCIpIiwiIiwiZXdpbmdfZ2VuZV9zZXRfbmFtZXMiXX0= --> <pre class="r"><code># Create a named vector with the relevant gene set names ewing_gene_set_names <- c(zhang = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", riggi = "RIGGI_EWING_SARCOMA_PROGENITOR_UP") @@ -3073,13 +3077,17 @@ <h2>Set up gene sets</h2> <pre><code> zhang riggi "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION" "RIGGI_EWING_SARCOMA_PROGENITOR_UP" </code></pre> <!-- rnb-output-end --> +<!-- rnb-output-begin eyJkYXRhIjpbIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT05cbiIsIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUFxuIl19 --> +<pre><code>ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION +RIGGI_EWING_SARCOMA_PROGENITOR_UP</code></pre> +<!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>These gene sets come from the C2 gene set collection from MSigDB. Let’s retrieve them using <code>msigdbr()</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZXdpbmdfZ2VuZV9zZXRzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9IFwiSG9tbyBzYXBpZW5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IFwiQzJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNhdGVnb3J5ID0gXCJDR1BcIikgfD5cbiAgZHBseXI6OmZpbHRlcihnc19uYW1lICVpbiUgZXdpbmdfZ2VuZV9zZXRfbmFtZXMpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZXdpbmdfZ2VuZV9zZXRzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9IFwiSG9tbyBzYXBpZW5zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IFwiQzJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNhdGVnb3J5ID0gXCJDR1BcIikgfD5cbiAgZHBseXI6OmZpbHRlcihnc19uYW1lICVpbiUgZXdpbmdfZ2VuZV9zZXRfbmFtZXMpIn0= --> <pre class="r"><code>ewing_gene_sets_df <- msigdbr(species = "Homo sapiens", category = "C2", subcategory = "CGP") |> @@ -3092,7 +3100,7 @@ <h2>Set up gene sets</h2> <code>GeneSetCollection</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBld2luZ19nZW5lX3NldF9uYW1lcyB8PlxuICBwdXJycjo6bWFwKFxuICAgICMgRm9yIGVhY2ggZ2VuZSBzZXRcbiAgICBcXChnZW5lX3NldF9uYW1lKSB7XG4gICAgICBld2luZ19nZW5lX3NldHNfZGYgfD5cbiAgICAgICAgIyBTdWJzZXQgdG8gdGhlIHJvd3MgaW4gdGhhdCBnZW5lIHNldFxuICAgICAgICBkcGx5cjo6ZmlsdGVyKGdzX25hbWUgPT0gZ2VuZV9zZXRfbmFtZSkgfD5cbiAgICAgICAgIyBHcmFiIHRoZSBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnNcbiAgICAgICAgZHBseXI6OnB1bGwoZW5zZW1ibF9nZW5lKSB8PlxuICAgICAgICAjIENyZWF0ZSBhIEdlbmVTZXQgb2JqZWN0XG4gICAgICAgIEdlbmVTZXQoc2V0TmFtZSA9IGdlbmVfc2V0X25hbWUsXG4gICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEVOU0VNQkxJZGVudGlmaWVyKCkpXG4gICAgfVxuICApIHw+XG4gICMgVHVybiB0aGUgbGlzdCBvZiBHZW5lU2V0IG9iamVjdHMgaW50byBhIEdlbmVTZXQgY29sbGVjdGlvblxuICBHZW5lU2V0Q29sbGVjdGlvbigpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBld2luZ19nZW5lX3NldF9uYW1lcyB8PlxuICBwdXJycjo6bWFwKFxuICAgICMgRm9yIGVhY2ggZ2VuZSBzZXRcbiAgICBcXChnZW5lX3NldF9uYW1lKSB7XG4gICAgICBld2luZ19nZW5lX3NldHNfZGYgfD5cbiAgICAgICAgIyBTdWJzZXQgdG8gdGhlIHJvd3MgaW4gdGhhdCBnZW5lIHNldFxuICAgICAgICBkcGx5cjo6ZmlsdGVyKGdzX25hbWUgPT0gZ2VuZV9zZXRfbmFtZSkgfD5cbiAgICAgICAgIyBHcmFiIHRoZSBFbnNlbWJsIGdlbmUgaWRlbnRpZmllcnNcbiAgICAgICAgZHBseXI6OnB1bGwoZW5zZW1ibF9nZW5lKSB8PlxuICAgICAgICAjIENyZWF0ZSBhIEdlbmVTZXQgb2JqZWN0XG4gICAgICAgIEdlbmVTZXQoc2V0TmFtZSA9IGdlbmVfc2V0X25hbWUsXG4gICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEVOU0VNQkxJZGVudGlmaWVyKCkpXG4gICAgfVxuICApIHw+XG4gICMgVHVybiB0aGUgbGlzdCBvZiBHZW5lU2V0IG9iamVjdHMgaW50byBhIEdlbmVTZXQgY29sbGVjdGlvblxuICBHZW5lU2V0Q29sbGVjdGlvbigpIn0= --> <pre class="r"><code>ewing_gene_set_collection <- ewing_gene_set_names |> purrr::map( # For each gene set @@ -3117,7 +3125,7 @@ <h2>Set up gene sets</h2> <h2>Read in and prepare SingleCellExperiment</h2> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2NlIDwtIHJlYWRyOjpyZWFkX3JkcyhzY2VfZmlsZSlcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoic2NlIDwtIHJlYWRyOjpyZWFkX3JkcyhzY2VfZmlsZSkifQ== --> <pre class="r"><code>sce <- readr::read_rds(sce_file)</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -3127,7 +3135,7 @@ <h2>Read in and prepare SingleCellExperiment</h2> sparse format for use with <code>AUCell</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBFeHRyYWN0IGNvdW50cyBtYXRyaXhcbmNvdW50c19tYXRyaXggPC0gY291bnRzKHNjZSlcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgRXh0cmFjdCBjb3VudHMgbWF0cml4IiwiY291bnRzX21hdHJpeCA8LSBjb3VudHMoc2NlKSJdfQ== --> <pre class="r"><code># Extract counts matrix counts_matrix <- counts(sce)</code></pre> <!-- rnb-source-end --> @@ -3138,7 +3146,7 @@ <h2>Read in and prepare SingleCellExperiment</h2> <code>subsetGeneSets()</code> function.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBSZW1vdmUgZ2VuZXMgZnJvbSBnZW5lIHNldHMgaWYgdGhleSBhcmUgbm90IGluIHRoZSBTQ0VcbmV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24gPC0gc3Vic2V0R2VuZVNldHMoZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMoY291bnRzX21hdHJpeCkpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgUmVtb3ZlIGdlbmVzIGZyb20gZ2VuZSBzZXRzIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgU0NFIiwiZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBzdWJzZXRHZW5lU2V0cyhld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhjb3VudHNfbWF0cml4KSkiXX0= --> <pre class="r"><code># Remove genes from gene sets if they are not in the SCE ewing_gene_set_collection <- subsetGeneSets(ewing_gene_set_collection, rownames(counts_matrix))</code></pre> @@ -3160,7 +3168,7 @@ <h2>AUCell</h2> therefore results – reproducible, we will set a seed.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2V0LnNlZWQoMjAyNClcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoic2V0LnNlZWQoMjAyNCkifQ== --> <pre class="r"><code>set.seed(2024)</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -3174,20 +3182,20 @@ <h3>Cell ranking</h3> in the cells in our SingleCellExperiment object.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY2VsbF9yYW5raW5ncyA8LSBBVUNlbGxfYnVpbGRSYW5raW5ncyhjb3VudHNfbWF0cml4KVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiY2VsbF9yYW5raW5ncyA8LSBBVUNlbGxfYnVpbGRSYW5raW5ncyhjb3VudHNfbWF0cml4KSJ9 --> <pre class="r"><code>cell_rankings <- AUCell_buildRankings(counts_matrix)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUXVhbnRpbGVzIGZvciB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGJ5IGNlbGw6IFxuKE5vbi1kZXRlY3RlZCBnZW5lcyBhcmUgc2h1ZmZsZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmFua2luZy4gS2VlcCBpdCBpbiBtaW5kIHdoZW4gY2hvb3NpbmcgdGhlIHRocmVzaG9sZCBmb3IgY2FsY3VsYXRpbmcgdGhlIEFVQykuXG4ifQ== --> +<!-- rnb-message-begin eyJkYXRhIjoiUXVhbnRpbGVzIGZvciB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGJ5IGNlbGw6IFxuKE5vbi1kZXRlY3RlZCBnZW5lcyBhcmUgc2h1ZmZsZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmFua2luZy4gS2VlcCBpdCBpbiBtaW5kIHdoZW4gY2hvb3NpbmcgdGhlIHRocmVzaG9sZCBmb3IgY2FsY3VsYXRpbmcgdGhlIEFVQykuXG4ifQ== --> <pre><code>Quantiles for the number of genes detected by cell: (Non-detected genes are shuffled at the end of the ranking. Keep it in mind when choosing the threshold for calculating the AUC).</code></pre> -<!-- rnb-output-end --> +<!-- rnb-message-end --> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,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0i9+8YvEjZ911lnlP/rggw+q/CqhWbNmt9xyS0FBQYpd3HzzzYG11q5dW906//GPfwQ28n/+z/+pSYerUivjM7W6G2xjxoxJ3MKYMWMOviVQFwR4CM/cuXOfrkjiKYiWLVtW2GbSpEmJfy979OgRaPDuu+/WesEvvPBClQeLAT169HjttddSbzazAb6oqOj222+vcJrAZG3btn3ppZfKVqxZgN+zZ89tt91Wran1W7Ro8eijj6bZncoC/GeffXb88cenuce2bdtW6/uIEPpV5qOPPjr55JPT30UsFsvOzh43blxpaWm1dlRdy5Ytq9bzDi+++OLNmzfHa5qmav3drsUEG85IKDN58uT27dunv6PWrVs/9dRTh0b3Qx5yaaowwJeWlv7mN79p1KhRmqUeeeSRTz/9dGW7eOeddwLtH3jggerWOXLkyMQtNGnSZPv27QfV84rU1visTF0PNgEeokKAh/AMGTIk/b+71VW7h2XxeHzChAk1uyQ+Ozs78fxPsgwG+OLi4u985zvV6k5WVlZZKq5BgC8oKBg0aFC1dlduzJgxe/furXIXFQb4t99+u7rXZzZt2jT974BC6Fc8Hn/33XdbtGhRs73ceuutafalBhYuXJiXl1fdkvr06bN9+/YapKm6eLdrK8GGMxLK/PKXv6zZju67776odz/kIZe+CgP8z372s+qWmpWV9cgjj1S4i9LS0g4dOiQ2Pv3006tV5NatWwPfJtT6n8t4rY7PCoUw2AR4iAoBHsIToQB///33p95d6pvrsrKyJk6cWNnGMxXg9+3bN2LEiBT7atKkSYXLs7Oz33jjjeoG+M2bN6c+e9ykSZMGDVLNJHrRRRft378/9V6SA/zKlSsD6b1BgwbHHnvsoEGDTjrppBT/cN26dSsuLq7ybQynX6tXr06d3iv7xyr35JNPVtmXGvjwww8Tb2aplqFDh37/+99PXFLlr20dvdu1kmDDGQllAkExIPU5yaysrL///e/R7X7IQ65akgN84GKxavnd735X4V5uuummxGZZWVnVuusnuaQXX3yxlt6A/6t2x2eycAabAA9RIcBDeKIS4N9+++0KDwX69u37m9/8ZtmyZXv27InH47t37/7000/vvffeCu9PbtSo0eLFiyvc/gsvvDDl/+/aa69NXKtZs2ZT/l9LliyprX4Fsm6ZVq1a3XDDDe+8807Z1ANFRUUrV6584IEHevfundisXbt2Z511VuKSKgP8d7/73Qp3N3bs2DfeeGPbtm3xeHz//v2ff/75n//856FDh1b4zzp27Nhqder3v/994uMJ2rdv/9BDD23YsKG8fUlJyYoVK370ox9VuLsJEyZU+TaG06/zzjsvea3u3btPmDDhgw8+KLs2ePfu3UuXLp06derAgQOTG3fu3LmoqKjK7lTLnj17unXrlryvBg0aDBs27Iknnli2bNnOnTu3b9/+8ccf//73v08+5s7O/n/mjq3y17aO3u09e/Yk/pYFLkvp06dP4NewwjtpwxkJ8Xh8ypQpySs2bdr0qquumjNnzubNm0tLS3fu3PnBBx/89a9/PeWUUyqsKrELEep++EOuWgLB9Ygjjgic6z7vvPP+9re/rV27dteuXbt27Vq2bNmTTz45fPjwCm9iquyvxttvvx1oWdnp+gqdc845ievm5eWlM1dL+mp9fCYLZ7AJ8BAVAjyEJxIBfvfu3cnHi02bNn3wwQdLSkoqXGX//v333ntv8kmGU045pcqv/CdPnpy4Sps2bWqlF8mWLFmSfE/m0KFDv/zyywrb79+//5e//GWKcxqpA/zEiROTV/nRj360ZcuWylZ57bXXunTpElglKytr7ty5KXYUCPCJcxZcdNFFlU2IGI/H33rrreT57YYMGZJiX6H16913301u/9hjj1U2AuPx+JQpU5Lv+Jg6dWrq7lTXLbfcktz9Hj16vPPOO5Wt8sc//rFZs2bJa5VJ/Wsb2igaO3ZsYvsqh0GYtX399dfJV48PGDBgxYoVFbY/cODAI488kjyL2LXXXhvF7oc85KorxZnnvLy8Z599trIVP/jggwq/+T311FOT/2qUlJQcffTRic3OOeecNCv86quvAp8MP/vZz2rc32QhjM/QBpsAD1EhwEOGJU7w3qhRowrPDGzfvj3xj2X//v3rrp677ror8Fe/cePGVc5LF4/Hn3/++eSTKlVOnxNagD/jjDMCtY0YMeLAgQOp13rssceSj5zKpAjw+fn5zZs3D7S/9957qyxy48aNp556amDFk046KcUqFV5WEIvFLr300iq/PXn88ccDa2VnZ6cIyaH1K3ne6XRuE01+K370ox9VuVb6Pv300+QvdPr3779jx47UK/7rX/+qLFClSFNhjqLqJtgwa7viiisC7U8//fTCwsLUO3r22WcDazVu3Liy2c7rbfdDHnI1UFmAb9269ccff5x63T179gQuayrz5z//ObnxjTfemNimQYMGac6v/sADDwS2P3/+/Jp0tRJ1PT7D/F0T4CEqBHjIpPz8/MS/gieffHKFzQIXEP77v/97HdWzf//+wImOyg6nKvTwww8H1u3bt2/qVcIJ8O+9916gsD59+pTdCFCln/70p7GKpAjwd955Z6DxT3/60zRLzc/PP+qoowKrl8+En6zCAH/cccel2bvkA+gUh8Wh9StwGXBubm46s8oXFhYGrhaucvhVS/LUXMcee+w333yTzrovvvhi8j9TLGWaCnMUVTfBhlbb+vXrA/+mRx55ZIoTj4muuuqqwF6eeOKJClvW2+6HPORqoLIA/89//jOd1QsKCpLPww8YMCC55VtvvRVoNmnSpHR2EbhkvUePHtXrYUohjM8wPwcEeIgKAR4y6dVXX038K1jZCcMJEyYkNqtspp+Dl3xaYNCgQemvfuDAgW9961uBLcybNy/FKuEE+ORDpfSfmrZ169YKZ5CqbAt79+498sgjE1t26dIlncnhys2YMSOwrxTH3BUG+DSPnuPx+N133x1Yt7IrP8Ps1xFHHJHYbOTIkWnuInCwnpeXl355qe3evbtVq1aB+l9++eX0tzBq1Kjkf6nK3oGQR1G1EmyYtf3qV78KtEwztsXj8e3btwfC1ahRoypsWT+7H/KQq5kKA/xFF12U/haS72+PxWILFy4MNEu+in7YsGFVbnz58uWBLY8fP756PUyprsdnyJ8DAjxERaopK4G6tmTJksSXlU0zG2iWOEtZ7frb3/4WWHLPPfekv3rDhg3Hjx8fWPjEE08cbFkHZ9euXVOnTk1cMmjQoPQfJpebm5t8RXcKL7744qZNmxKXjBs3rsop0xONHDnytNNOS1zy2muv7du3L83Ve/XqNXz48DQbn3DCCWm2DLNfgXtG0n+Y3H333TchQfLXEzX24osv7ty5M3HJueeee/7556e/hfvvvz/95zJmfBTVh9riSXd5dO7c+eqrr05zL23atAncOPPpp5+mX2RlQut+yEOuFv3P//xP+o0HDx48evTowMJnnnkmsKRBgwaB7yPmzp0b+KBI9tRTTwWWXHnllenXlloI47M+fw4AGSTAQybVLMCnH7qq6/333098eeyxxw4ePLhaWzj//PMD56sD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/J133nn11VdrNo9DlUXW+KKSdH6t6vMoCq22hg0bNm/ePPEBHLt37z74vRyk0Lof8pCrLTUuMv1bBsquop84cWL5kpdffrnsq+3yJYHr57t163bGGWfUrLDKhDA+6/PnAJBZAjzwfwX+qO/atSv5SbzpSD5erN25f6ulTZs2WVlZiacyanY4W+MAP3jw4Jo9ja9eyXi/GjduPGrUqFGjRsXj8Y8++uiNN954880333333RSBYeXKlSNHjpw/f/7BzwuQfLxb4Qxb6ahZgK8/oyjM2tq2bZsYkOrDjbuhdT/kIVdbahzgky8XT/FXY/To0YkBfufOnbNnzz7//PPLXu7atevll19ObF/rp9/LK6zT8VmfPweAzHIJPfB/BQ4Z4/H4F198UYPtfPnll4ElGQzwDRs2DNyW+fnnn9dgOxs2bEinWXJPv/nmmxrsrr6pP/3Kyso69dRT/+M//uOll17aunXrokWLHnrooSFDhjRs2DC58aeffvrII48c/E6T01SNH6S8du3aKtvUn3c7WZi1BfYVwuMGqhRa90MecrVly5YtNbtzO/DA81gs1q5du8oap76K/vnnnw/cOXXllVfWoKQq1fX4rM+fA0BmOQMPda5t27ZTpkwJLHzooYc++uij8pd33XVXhQ+huf322/Pz88tfPvbYY8mzqR133HG1UmfyxcYfffRRDR66tnDhwsCSjh071riqg9elS5fE80KBx8KnKc21kv8tPvvssxrsrr6pn/1q0KDBKaeccsopp9x6661bt279/e9//+CDDwaO3SdMmHDHHXcc5I46dOjQunXrxDNsH374YQ228+WXX1Z5/X+svr7bZcKsrVOnTp988kn5y48//jgej9fRNI1pCq37IQ+5WrRo0aJzzz23umt98MEHiS8bN26c/GC5cg0bNgxcRf/iiy8eOHCg7G7/wPXzZ5xxRvfu3atbTzrqenzW588BILMEeKhzzZo1Sz4D8Otf/zrx5c0335w8TdeBAweuvvrq8pdt27b96U9/WkdFxmKx5GvzFixYEHhmTzoWLFhQ5ZbDdMYZZyTG73Xr1m3fvr26FwUkftuSwpFHHnnssccmnuR/5513brnllmrtqx6q//3Ky8sbP378pZdeevrppydm+Pz8/JUrVx7ksxuysrL69+//+uuvly/54IMPArfdpmP+/PnpNKvP73aYtZ1++umvvPJK+ctdu3Z99tln1X3a9vXXX594nfOYMWPKr7WugdC6H/KQq0XvvPNOdQN8SUnJ22+/nbjk5JNPTj0nXOAq+m3btr355pvnnnvu5s2b58yZk9iyjq6fj9X9+KzPnwNAZgnwkAFFRUWrV68uf9mpU6cKJ9letWpV4jPMK3vOXG3p3r17Xl7e1q1by5dMmzbt3nvvrdZG9u/f//zzzycu6dat2xFHHFE7JdbImWee+cc//rH8ZTwef/755//93/89/S1s3rw5/ePgM844I/GQ66233io/NZS+zz///K233kpccvnll9f6Y5CqJbR+zZkzJ/HEY6tWrc4777w0t3/iiSfedttt48ePD+z04B++OGDAgMQ0tWPHjhkzZqR4Un2Fnn766TRb1udRFFptyROPvfjii7/4xS/S38v69esnTZqUuOTCCy+sVp3JQut+yEOutjz11FN33313tVZ59dVXv/7668QlVX7ne/bZZx9xxBGbN28uXzJ9+vRzzz136tSpJSUl5QsbN2582WWXVauY9IUwPuvz5wCQSXEgdIGLIc8///wKmwWOvW655Za6LmzEiBGBj4h58+ZVawuB9B6LxX74wx+maD958uTExm3atDm4HlQg+RbQoUOHVmsLjz76aPKH56uvvlph4wkTJgRaPvXUU9WtOfCs486dO1fW8j//8z8TW55++unV2tGKFSsC1a5YsaLClqH169vf/nZimxYtWpSUlKS/i5kzZwbqfOaZZ6pbZzqbPe+886q1hc2bNycfNF966aUVNg55FI0dOzax5ZAhQ1JsNrTaduzYEcgqJ598crX2Evh4icVin3zySXKz+tn9kIdczVSYV99+++1qbST5moiXXnqpyrWuv/76xFWOPPLIkpKSM888M3HhRRddVNOeVS2E8Rny58CYMWMSW44ZM+bgWwJ1wSR2kAFLlixJfFnZqfU0m9Wi5KsN//u//zv91UtKSu68887Awh/84AcHW9bB6dq16znnnJO45PXXX3/nnXfSXH3v3r0PPfRQ+rsbM2ZM4BnODzzwQPJTjlNYvXp14MnG3/nOd9JfvY6E1q/AjAm7d+8O/CKk1qhRo8CSWrkAZNiwYYEHOM2ePTs5YqVw5513pv/45fo8ikKrrVWrVhdccEHiksWLFwcmGE/t73//e+LLtm3bHvy1GKF1P+QhV4tuv/32eNrP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oKBsxcDxWZqHm1988UV1Z0Ju3Ljx3XffvW/fvnS2n5EAH0K/4vH4J598UrMnL3Tt2rXKCbQO0vLly5OvFk7hkksuKRtINUtTdf1ul5aWDhs2LMXWUkxjGcJIKLNv377bb7899WnGgNatW0+fPv3Q6H7IQy5NyQE+Ho/v2LGjWlOdjx49usa3ulR4Ff1pp51Wi31MU92Nz3J1PdgEeIgKAR7CdvLJJyf+5duxY0dym9LS0sRr1I844ojw6yxTWFj461//Op0LODt27Pjoo4/u37+/WtsPP8CXmT59erdu3VJ0p3PnzpMmTUpcZdCgQYkNyoN9OmbNmtW/f/8q38OmTZteffXVy5YtS3/LBx/gW7du3atXr3POOWfMmDFjx47dsmVLfehXmf379z/00EMV3v9ZoT59+jzwwANFRUXV3VENlJaWPvHEE1Ve6t+pU6fHHnusfK2DSVN1+m5v2rQp8NGUqMrnUNT1SCi3evXqiy++OPUFybFYrGXLlrfddlv685lHovvhD7kqVRjgy/zlL39J/Rkbi8VOOOGEl1566SBruPbaawObrdZMeLWrjsZnorobbAI8REVWPB6v8lMAqC0HDhxo0aLF3r17y1527dp17dq1yc3WrVuX+DTs8847b9asWSGVWJGSkpL333//5ZdfXrBgwaZNmzZv3lxQUJCbm3vEEUccddRRgwYNGjFixKmnnlqzS+4zaP78+U899dRHH320fv36/Pz8tm3bdu7cuVu3bldccUXyNEs9e/ZcvXp12f/n5uZu3bq1urv74osvXnrppTlz5qxfv37Tpk1btmxp3Lhx2ds4cODAQYMGfec738nNza2dvoUohH699957b7/99uLFiz/99NPt27fv2rWrsLCwWbNmrVu3zsvLO+GEE0499dSzzz47eW7nECxatOi5556bP3/+119/vXHjxj179hx99NEdO3bs0aPH5Zdffu655wYG0p49e8r/v2HDhimedFChunu34/H4s88++/e//33dunWff/75/v37W7Vq1bFjx+7du99zzz0VzhkeWm0B27dvnzlz5syZM9etW/f1119v2rQpOzu7Xbt2ZTv69re/fe6551Y4j1cKEep+yEMuhX379u3fv7/8ZdOmTQO7fuedd5588smVK1eWfcY2bty4Y8eOHTt2PO2008aMGVODi+2T3XLLLY888kj5y0aNGuXn59fgjoNaVBfjM+BQ/WsCpEOAB6ja7t27W7duXVpaWvbyzDPPnDdvXmZLAjjM7du3r0OHDolfp15wwQUvvvhiBksCqGsVPMYDgICPP/64PL3HYrEKn5wHQJhmzJgRuBjqhz/8YaaKAQhHFXfpAERdPB7Pz89PXNKmTZvmzZtXayMzZsxIfFnhk5kBCNNf//rXxJetW7ceMWJEpooBCIcADxz6+vTps2vXrvKX119//cSJE9Nf/cCBA3/7298Sl6SesxqAupafn//aa68lLvn+979fi3f4A9RPLqEHDnFZWVknnnhi4pJnnnlm37596W/hscce+/rrr8tfHnfccSkmrAYgBH/5y19KSkoSl/zgBz/IVDEAoRHggUPf0KFDE19u37498Pi6FFauXHnHHXckLrn00ktrqzAAaqC4uPjRRx9NXNKlS5fBgwdnqh6A0AjwwKHvJz/5ScOGDROX3HDDDU899VSVKy5atOjss88uLCwsX9K4ceOrr7669ksEIG033HDD5s2bE5fceOONkXuUKUANeIwccFi4/vrrJ02alLikYcOG11xzzXXXXVfh9fDr169/4IEHJk2atHfv3sTld9xxxz333FO3tQKQ4IUXXli/fn3Xrl2bNGny5Zdf/vnPf37vvfcSGxx55JFr165t1qxZpioECI0ADxwWdu/efdJJJ61duzb5RyeeeGLPnj07dOjQrl273bt3b9my5V//+teyZcuSW3bp0mXp0qXVncEegINx2223PfjggykaPPzww2PHjg2tHoAMMgs9cFho0aLFnDlzzj333OQMv2TJkiVLllS5ha5du86ZM0d6B6hXBg0adP3112e6CoCQuAceOFx07dp13rx5NXtKcL9+/d59993jjjuu1qsCoMZOOumkl19+2dPjgMOHAA8cRo466qiXXnrpxRdfPPvss9Oc7uhb3/rWtGnTFixY0KFDh7ouD4A0ZWVlXXbZZbNmzWrTpk2mawEIj3vggcPU2rVrX3nllQ8//HDx4sXffPNNQUFBcXFxq1at2rRp06ZNm169eg0ePPiss8761re+ZWZjgAxatWrVhAkTZs+evWHDhuzs7F69eh1//PE33njjKaeckunSAMImwAMAAEAEuIQeAAAAIkCABwAAgAgQ4AEAACACBHgAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAAACI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zOECwIVzCz0ANIeuXbvm5ubm5uZG97137dp18ODBUUtGRkZ0R/ett96a+x91ripfS/VT9K+++mqdHQ4fPhwtdJeZmVnnanD1Fy2Gd/z48eq14mpZuXLl2Y4KIfztb38725mXLVv29NNPN/5O9YbVWrhw4dNPP/3rX/+6Vs8+ffrMnDnzxRdfjH7861//2pixAcBFIcADQLPavHlzCKHmFHHUUquxPr7yla+0bt06hDBv3rzjx48nd5g7d270fcHYsWMbeQd4dPtACCG6faCW999//7nnnktuv/3227OyskIIjz76aPWSezWVlJSMGjXqnnvueeWVVxo5wobVeu655+65555vfvObW7duTT6k+h6HtLS0xowNAC4KAR4AmtW7774b/jurRy3p6en1uW2+pp49e957770hhH/9619Dhgyp9Sbzn/70p3Pnzg0hZGZmzpo1q5HDHjlyZEFBQQhhxYoVkyZNOn36dPWukpKS22+/PXkJuhBCenp6FPg/+OCDkSNHbt++vebePXv2DB8+/MMPPwwh3H333Y0cYcNqVb9Gbtq0aTV/qRBCWVnZj370o2g7+t0B4NLyDDwANJ99+/ZFq6Mlz8D37du3AVPQM2fOXLhw4f79+9etW9enT58bb7wxNzf3/fffX7t2bfWU8uzZsy+77LLGD/7RRx8tKCg4ffr0U089tXz58sGDB3fv3n3z5s1vvPFGaWnp5z73uZ07d+7YsaNNmzY1j7rzzjufeeaZDRs2rF+/Pjc3d+jQoddee21qaurf//73JUuWnDp1KoQwefLks73K/oI0oNakSZN+9atfHT16dPny5T169Pj85z/fpUuXioqKkpKSJUuWHD58OIQwaNCgYcOGNX54ANBYVQBAc1m+fHn093fr1q3VjVdffXUIYdKkSQ07544dO6655po6/8qnpqY+9thjyYcUFhZGHR555JELqrVkyZI6H87/0pe+VFZWFr0KfurUqbWOOnz48JAhQ+ocYUpKyn333VdRUVHrkGjG+4orrqhzGNGXICGEe++9t/G1li5deo4VBwYNGnTo0KEL+pQAoImYgQeA5hNNtrdp06Z6Sbny8vKdO3eGC38Avlrv3r03b97829/+dvHixZs2bTp06FDbtm27d+8+dOjQiRMndu/e/SKNPYQQ7rjjjm3bts2fP3/p0qUlJSVt27bNzc2dOHHi6NGjKyoq9u7dG0Lo2LFjraMyMzNff/311157bcGCBWvXrt2/f3+HDh169+6dl5f3ne98p2fPnhdxhA2oNXz48JKSkp///OcrV67cs2fP3r1709PTs7Ozr7rqqgkTJnz605++iMMDgMZIVDVuxVcAgBBCcXFx9Az/7373u9GjRzd1uWPHju3bty8lJeVCFw4AgPgyAw8AnN+KFSsWLFgQQrj//vvz8/OTO1S/ia1fv37NMJ709PT09PRmKAQA/zsEeADg/LKysqIAf/LkyUWLFtVab++9996bP39+CKF///6mxAGgiXiNHABwfnl5eQMHDgwhLF68eOTIkatWrTpy5MiJEyfeeeedefPm5eXlRS+ir37vGgBw0XkGHgCol4MHD95www3Rknt1+v73v//www8355AA4CPFDDwAUC+dO3cuLCycP39+rZvkU1JSBg8evHTpUukdAJqUGXgA4IKdPHmyuLj46NGjGRkZPXr0SEtLu9QjAoD//wR4AAAAiAG30AMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQAwI8AAAAxIAADwAAADEgwAMAAEAMCPAAAAAQA/8Hn+5L1bEa1igAAAAASUVORK5CYII=" width="672" /></p> +<!-- rnb-plot-end --> <!-- rnb-output-begin eyJkYXRhIjoiICAgIG1pbiAgICAgIDElICAgICAgNSUgICAgIDEwJSAgICAgNTAlICAgIDEwMCUgXG4gMjEzLjAwICA0NjUuNzYgIDc5NS44MCAxMTAyLjIwIDIyMzguMDAgNjYwOC4wMCBcbiJ9 --> <pre><code> min 1% 5% 10% 50% 100% 213.00 465.76 795.80 1102.20 2238.00 6608.00 </code></pre> <!-- rnb-output-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,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MlZbctu3b7/++uvbtm2bfEdHHXXUDTfcsGvXroZ3BjLc66r1s5/9LH7jgwYNqvjRwoULq408Wrdu/fOf/3znzp1Vbf8nP/lJaJXVq1fXtMgnnngitJEHH3wwzQNOKqr+mUQt9bRLL700fvXzzz//0FsC9YigARqCV1555anKxH/50Lp160rbPPDAA/F/4Hv16hVqMH/+/MgLnj17dq9evZJ/pgnp06fPK6+8knyzWQ8apk2blpeXl8rehwwZsmnTpli6QcPevXt/9atfNW/ePPXjPeKII+6///4UD6SqoGHt2rWnnXZainvMy8ubPXt2jU5gbR9XLBZ77733TjrppNS3HwRB48aN/+u//qusrKxGx1JTq1evHj58eOpVjR49urwLpXfJF/mpjvAyOwPdoMK0adMKCgpS31Hnzp3/9re/NZgzkOFel6JKg4aysrLbb789SYYbUlhY+Oyzz1a6/TfeeCPU+I477qhpkRdeeGH8Fpo1a7Zt27ZDPfIEEfbPStVqTxM0wGFO0AANwdChQ1P/lFBT0X6CjMViDz/8cHp3eDZp0uTJJ59MsuXsBg333HNPjQ6nW7dumzdvTiNo2LVr17Bhw2q0rwo33XRTKsdSadCwYMGCDh061Gh3LVu2fPvtt1M8gRk4rnnz5qX96NYf//jHKR5IGpYvX96pU6ealnT88cdv27YtjUu+2jjVUV1mZ6AbVPjtb3+b3o7uuuuuBnAGMtzrUldp0PCjH/2opqU2atRoypQpidsvKysLXb3X6FayWCy2ZcuWUOQR+R/KWNT9M1Ft9zRBAxzmBA3QENSjoOG+++7LyclJsrvkX600atTooYceqmrjWQwaHnvssSTHVdVBff3rX1+6dGn8kmo/727btu3MM89MclzNmjVr1CjZRL9XXnllteNQEoOGzz77LDRcIjc3t1+/ft/4xjfOPvvs+NE3Ib169aoYJ5Ld41qxYkXLli2T7yLJT4MgePjhh6s9kDQsX748lTFElTr33HO/9a1vxS+p9he2lk51JJfZmene5f77v/87yXZyc3OT13/ffffV6zOQ4V5XI4lBw/33359eqTk5OZX+yfjxj38carZu3brUK0ysp6q7J9IWef8MyUBPEzTAYU7QAA1BfQkaFi1aVOm9DH369Pn973//8ccfl48v3blz55IlS37zm99UGhzk5uZ+9NFHlW7/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Oa7Em9trNHrixRdfDC2JZBbSRo0aXXnllaGF11133caNG1NZ/fXXX58yZUrqu6vLXSiTtf3whz8MLfnZz36W4nMEH3zwwdDd+BdffHGKRSaXsTOQ4V4Xoblz506dOjWVljt27Jg4cWIoyL7qqqsaN26cfMVzzjknNHoidFtKu3btqk0rDlFt98+6/D4ANDTZvqUCiNLXv/71+EeCZFEAACAASURBVF/wqu5Xj79MatKkyd69ezNQW2iWyiAImjZt+tJLL1W74mOPPZY4w//kyZOTr5WZoROxWCzxe7aBAwcmP6WlpaVjxoyp9D25qqETsVjsww8/TJx+/I477qi2wt27dycO/R05cmSSVTI2dCIzx5U44Vlubu7y5ctTOZZnnnmmfOb5Cv369UtlxVSsXbu2efPmodpOPPHErVu3Jl9x6dKlVT3bNclN7JnsQqErtIEDBybfRSZrS5yxdciQISUlJcl3tHTp0tatW4dWTHI/f509AxnudWmodOhEEATNmjV77bXXkq+7Z8+exAy6VatW69atS2XXEydOrHTX5crzi9pW2/0zYz3N0Ak4zAkaoEE56qijKv5Ut2zZsrS0NLFN6LnZffv2zUxtJSUliV8sN2/e/M4776y0zlgstm/fvptvvjl0mRcEwYABAw4ePJh8dxkLGnbs2JF47/S55567fv36Stv/85//HDt2bFCF5FcjP/3pTxNXueSSS7Zt21bVKosXL0782N24ceOFCxcm2VEmg4bMHFfXrl1DjTt06DB79uwkVZWWlk6dOjVxmvpbb701xfOQit/97neJx969e/dXX321qlWeeOKJqq73guou+TLWhUKX2T169Kj2VGSstvfeey/xXeWss85K0kvnz5+fOF5m7Nix9fQMZLjX1VRVQUMQBC1atPjTn/5U1RwrixYt6tu3b+Ja99xzT4q7njNnTlW7DoJg/vz50R1llTLQPzPT0wQNcJgTNEDDEXqwef/+/SttFnri14QJEzJW4dtvv13pzasnnnjinXfe+cknn5TfCFBSUrJs2bLf/va3lT6rvEWLFsmvWstlLGiIxWLz589P/IIoLy/vF7/4xYcfflj+TVRJSclHH3100003dezYsaJNz549Q6NbzznnnCQ7KikpOf744xPPSevWrb/3ve/Nmzdv48aNZWVlBw4c+PTTT1944YUJEyYk3gwSBMFNN92U/IgyHDRk4LgeeuihxPZBEAwcOPC+++5bunRped8rKysrLi5+55137rrrrmOPPTaxfffu3Xfv3l2js5HcgQMHTjrppMQd5eTkDB8+/NFHHy0qKtq9e/fu3btXrFjxwAMPJH6jGMqtkl/yZawLXX/99aFVXnjhheSrZKy2WCyWOOdLEATNmze/6qqrXn755S1btpQ32759+4svvjh+/PjEX/BmzZoVFRXV0zOQ4V5XU6GgITSnQBAEJ5988j333LN06dIdO3bs3bt35cqV06ZNu+iiiyr9+zJgwICqsuxEBw8ejM/r43Xv3r1Gk8geitrun5npaYIGOMwJGqDhmDVrVvyf6u9973uVNvvzn/8c3+y2227LZJH33HNPpZ/hyuXk5CTe/BmvSZMmTzzxRCo7ymTQEIvFfvvb3yYpu9KDatmy5ZIlS0JjaM8777zkO/roo49Co4hDmjVrlvhtWLwRI0bs378/+V4yHDRk4LgOHjz4ta99LcnqQRAcccQRidPpx8vNzU3ylW/aVqxYkfbskoMHDw7NCVLtJV9mulDofSYIgpycnAEDBowdO/ab3/zmGWec8dZbb2Wrtlgstn///gsvvDDJdpo3b96iRYskDaZOnVqvz0CGe12NhIKGv/71r506dUqv1GOPPXbt2rU12ntVoyduvvnmCI8xuQz0zwz0NEEDHOYEDdBw3HHHHfF/qv/0pz9V2iz0Keof//hHhut88MEHE79+SUXz5s2rfT5ZhQwHDbFYbNKkSakfS6NGjZ588slYLDZq1Kj45d/85jer3VFRUVHakxGOHDkylSk5Mh80ZOC4NmzYUOlNCilq3rz5iy++WKPzkLrly5encdXXq1evL7/8MjQYKpVLvgx0ofnz5yffzrx587JVW7kDBw6MHz8+jb3k5OSkks/W/TOQ4V6XulDQMG/evCVLlrRt27ampXbv3v3zzz+v6d6rGj2R/AaWyNV2/4zVfk8TNMBhTtAADccVV1wR/6f6jTfeqLTZwIED45tt2LAhw3XGYrEXX3yxppd8J598cqVfAFYl80FDLBb785//nHiXb6I2bdpU3EQdmr/ziiuuSGVHX3zxRVXTSValefPmt912W7VzW5TLStCQgeNau3Ztek9iO/30099///0anYSaWrVq1XnnnZd6SWPGjCkfUJ3eJV9tn+rS0tJzzz03ydaquszOQG3xRf7f//t/U/mdrdCuXbvnn3++wZyBDPe6FCUGDbFY7JNPPkkcwZHE2LFji4uL09h7paMnBgwYEOEBpqhW+2e5Wu1pggY4zAkaoOE45ZRT4v9Ub9++PbFNWVlZ/G38HTp0yHyd5fbt23f77bfHT1hQlW7duj3wwAOpD7Itl5WgIRaLrV69esSIEUkOZ9CgQR9//HFF+wEDBsT/9Lrrrkt9X6+88sqZZ55Z7Qls2bLl97///U8++ST1LWcraKjt44rFYmVlZQ8//HC1wygqnHXWWX/9619r2v3S9uSTT/bq1St5SYWFhX/+858rVjmUS75aPdXFxcUnnHBCVdtMcpmdgdrirV279rLLLks+aiYIgjZt2vzyl7/cuHFjwzsDGe511ao0aIjFYqWlpXfccUe1wyj69euX+r1vlfr+978f2mZVdwhmQO31zwq11NMEDXCYy4n963OGgXrq4MGDrVq12rdvX/nL7t27h56nXe6zzz6Lv5Vg+PDhs2fPzlCJlSkrK1u4cOHzzz+/cOHCjRs3btq06auvvsrLyzv66KOPPvros88++6KLLjr55JOzWGF6Vq5c+fjjj7/66qtr167dsGFD+/btu3bt2q9fv4kTJ5522mnxLQsLC9evX1/x8q677qp0PvAk1q1b99xzz82ZM2fdunUbN27cvHlzbm5uXl5ex44d+/fvP2jQoG984xtp3HWcdbV9XIsXL3711Vffe++9jz76aOvWrdu3b9+9e3erVq3atm2bn59/8skn9+/f/9xzz018VEoGLF68+Omnn16wYEFxcfGGDRt2797dqVOnY445plevXpdddtl5552X3uCjqtTeqS4rK5s2bdrjjz++Zs2azz///MCBA61bty4oKOjVq9ett95a7cVtrdYWsmPHjhdffHHmzJmrVq3auHHjxo0bmzRp0r59+w4dOgwYMODcc88dNmxYmzZtarrZenQGMtzr0lZWVvbKK69MmzatqKiouLi4uLg4Nze3oKDgmGOOGTBgwKWXXlrpgydq5Nprr7333nsrXjZt2rS4uLh9+/aHuNlDUUv9M15D/VMCZIugASBrSkpKjjjiiPj34RkzZiR5+CUAtWr//v0FBQVbtmypWHLRRRc9++yzWSwJoD6qE+E0wOGpfAxF/JL6ePsGQIPx3HPPxacMQRB8+9vfzlYxAPVXsufWAJDcgw8+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rVy58vzzz58+fXqrVq3if5SXl5eXl9ezZ88hQ4bccsstV1999aOPPjpp0qQpU6Zkq1oAAACoCxplu4C6a/78+UEQTJ48OZQyhDRt2nTy5MnNmjWbNWtWpkoDAACAOkrQUKVly5a1adOma9eu1bZs0aLFcccdt2XLlgxUBQAAAHWZoKFKhYWFO3bs+Oijj6ptuW3btmXLlhUUFGSgKgAAAKjLBA1VmjBhQhAE48aNW7VqVZJmmzdvHjVqVGlp6ejRozNVGgAAANRRJoOs0o033vjaa6/NmzevT58+55xzzogRI7p06ZKXl9emTZtdu3Zt3bp1/fr1s2fPnjt3bklJSdeuXW+++eZslwwAAABZJmioUtOmTWfMmDFx4sSnn356zpw5c+bMqarliBEjHnrooXbt2mWyPAAAAKiDBA3J5OXlTZ8+fenSpdOnT3/33XeLioq2b9++d+/e/Pz8Tp06derUqV+/fmPGjDn11FOzXSkAAADUCYKG6vXr169fv37ZrgIAAADqAZNBAgAAAJERNAAAAACRETQAAAAAkRE0AAAAAJExGWTl1q1bt2DBgpqudfHFF9dGMQAAAFBfCBoq9+abb1566aU1XSsWi9VGMQAAAFBfCBoqd8EFFzz88MP33HPPBx98EARBXl7esccem+2iAAAAoK4TNFSuVatW3/nOdy699NLhw4e/8cYbI0eOfOyxx7JdFAAAANR1JoNMplmzZj/72c+yXQUAAADUG4KGagwcODDbJQAAAEC9YehENdq3b3/DDTf07ds324UAAABAPSBoqN6tt96a7RIAAACgfjB0AgAAAIiMoAEAAACIjKABAAAAiIygAQAAAIiMoAEAAACIjKABAAAAiIygAQAAAIiMoAEAAACIjKABAAAAiIygAQAAAIiMoAEAAACIjKABAAAAiIygAQAAAIiMoAEAAACIjKABAAAAiIygAQAAAIiMoAEAAACITJNsFwAAddGGDRvee++9bFeRUccee2y7du2yXQUAUO8JGgDgX6xfviQIggceeOCBBx7Idi0Zddpppx1u2QoAUBsEDQDwL/bt3hkEQev2HdscdXS2a8mQ0oMHNn66rLi4ONuFAAANgaABACrR/+Irzpv4i2xXkSE7t2z+3fC+2a4CAGggTAYJAAAAREbQAAAAAERG0AAAAABERtAAAAAAREbQAAAAAETGUycAUrVx48aLL75448aN2S4ko7788stslwAAQH0iaABI1cKFC996661sVwEAAHWaoAEgVbFYLAiCngPOGXPTndmuJXP+8M3+sbKybFcBAEC9IWgAqJncFi3zjuma7SoAAKCOMhkkAAAAEBl3NNRdc+fOnTZtWhorvv3220EQ7Ny5M+qKAAAAoBqChrrrj3/847PPPpv26kVFRREWAwAAAKkQNNRd991330UXXXTw4MGarjh9+vQ5c+aceuqptVEVAAAAJCFoqLsKCgq++93vprHiihUr5syZ07hx48hLAgAAgORMBgkAAABERtAAAAAAREbQAAAAAERG0AAAAABERtAAAAAAwM7swwAAIABJREFUREbQAAAAAERG0AAAAABERtAAAAAAREbQAAAAAESmSeRbLC0tfeSRRxYuXNiuXbtBgwadf/75jRs3jnwvAAAAQB10SEHDzJkzJ0+evGLFipUrV5Yv2b9//7Bhw+bPn1/RZsSIEf/7v//bunXrQyoTAAAAqA/SHzoxadKkiy666IUXXti0aVPFwttvvz0+ZQiC4KWXXho/fnz6BQIAAAD1R5pBw/Lly//7v/87FosFQZCfn1++sKys7N577w2CoLCwcM6cOW+++ebgwYODIHjppZfefffdiAoGAAAA6q40g4Y//OEPZWVlQRA8+OCDa9asKV/41ltvffnll0EQ3H777cOGDRs4cODzzz/fqlWrIAj+8pe/RFMvAAAAUIelGTQsWbIkCIJzzjnn6quvrlj48ssvB0HQrFmziy66qHzJkUceeeGFFwZBUFRUdKiVAgAAAHVemkHD6tWrgyDo379//MJ33nknCILTTz/9iCOOqFjYo0ePivYAAABAw5Zm0HDw4MEgCFq0aFGxpKysbMGCBUEQDBw4ML5l+QiL7du3p18jAAAAUE+kGTSU36dQMTtDEASLFi0qTxOGDBkS3/LTTz8NgqBz585plwgAAADUF2kGDccdd1wQBM8++2zFrQpTpkwJgqB58+Zf//rXK5r985//nDVrVhAE/x97dx5QVZ3/f/x9gcvOlSUXEAEVRBLErXGp1NwSx1QcyslscvyqpONYOZk1jmlYTuM0VmMp5lJZaoqMWaOFW2romGmKIIpeNVMwFy6CbLLd3x/nO3z5gSxdD5x78fn46/I5n3PPCz4Z8OIsgYGBd5sUAAAAAABYPQuLhmef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Pn7jxo1JSUnqBli5cuWKFSss2FG5YuXq1avq5gEAAAAAoF53WzSIiKOj46hRo0aNGnX3b2VV0tPTDQZDYGBgvTNdXFw6dep05swZdQPs37//6NGjFu9+7do1FcMAAAAAANAQKhQNIlJRUWFn939XYRQWFhYUFLRs2VKVN9eKv7//2bNnU1NTIyIi6p6Zk5OTnp4eEBCgboDVq1fPmjWroqLil+64ZMmS9evX1xsbAAAAAADV3VXRUFRUtHTp0k2bNpWWlqakpFSOnz17tnv37l26dBk3btzLL7/s4KBOndHExo8f/9prrz3++OPbtm3r2LFjbdOuXbsWHR1dXl4+ZswYdQM4Ojp2797dgh1bt26tbhIAAAAAABrI8gogMzNz8ODBGRkZItK5c+dqW81mc1paWlpa2pdffpmQkKD6X/ubwNy5c/ft27d3796wsLABAwZERUUFBAR4e3sbDIb8/HyTyZSZmbljx47du3cXFRUFBgbOmzdP68gAAAAAAGjMwqKhoqJi9OjRSsug1+t79epVdauvr++TTz65bdu2vLy8w4cPT5w4cc+ePSqEbVp6vT4xMTE2Nnbz5s27du3atWtXbTOjoqJWr17t5eXVlPEAAAAAALBCFhYN69atU+5T+PDDD2/cuNHX17fq1latWq1fv/769etPPfXUzp07v/nmm02bNj3xxBMq5G1a3t7eCQkJaWlpCQkJR44cycjIyM3NLS4u9vHx8fX19fX1DQ8Pj46OtuwCBwAAAAAAmh8Li4bPPvtMRDw9Pbds2eLj43PHOS1btkxISAgJCbl+/XpiYqItFg2K8PDw8PBwrVMAAAAAAGAD7OqfcifHjx8XkVGjRtXWMihatGihPPby1KlTlh3IOpnNZqPRuHv37qysLK2zAAAAAABgRSwsGm7cuCEigYGB9c5s166diBiNRssOpLnExMRRo0Z9//33yodms/mDDz647777QkJChgwZ0rZt24CAgMTERG1DAgAAAABgJSwsGpQbHyo3g6zb6dOnRcTDw8OyA2krNjY2Jibmyy+/LCkpUUZmzJgRGxtrMpns7OzatGljZ2d36dKlmJiYl19+WduoAAAAAABYAwuLBuWeBd9++21BQUEd04qKipKTk0UkLCzMsgNpaMOGDR988IGrq+vixYu7du0qIt98883y5cudnZ3feeed/Pz8K1eu5Ofn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4OBgTUICAAAAAGA9OKOhLmPGjPn3v/8tIg4ODg4ODnl5eQsXLjx69OiWLVscHR21TgcAAAAAgNXhjIZabdiw4d///rfBYPj444/z8vIKCgq++uqrtm3bbt++fcGCBVqnAwAAAADAGlE01GrVqlUisnTp0t/97ncuLi52dnbDhw/ft2+fh4fH4sWLU1JStA4IAAAAAIDVoWio1enTpx0dHZ988smqgx07dnzjjTfKy8vnzJmjVTAAAAAAAKwW92iolclkcnNz0+v11canTZu2fPnypKSknTt3Dh06VJNsAADgLpWXlYrIwYMHa97muRnT6XSDBg3y9vbWOggAoDmjaKiVn5/f+fPn09LSwsPDq447ODi8++67w4YNmzZt2okTJ1xdXbVKCAAALHbVeEpE/v73v2sdpKk9+eST69ev1zoFAKA5o2io1bBhw+Lj46dNm7Z9+3YPD4+qm4YOHfr73//+ww8/nDhx4meub0E7AAAgAElEQVSffaZVQgAAYLHy0lIRCYx8wNDKV+ssTeTWjWs/HjuUk5OjdRAAQDNH0VCrF198ce3atcnJyb169Ro/fnzXrl2jo6Mrty5ZsmTv3r0JCQlXrlyJjY3VMCcAALBY/9/NuP+REVqnaCJnDu75cMY4rVMAAJo/bgZZq44dO37++edeXl5nzpxZsGDB9OnTq2719PRMTk7u0qVLcnLy008/rVVIAAAAAACsCmc01GXo0KE//vjjhx9+ePjw4YKCgmpb/fz8vvvuu48//njlypUnT568p24lBQAAAADAHVE01MNgMDz33HO1bXVzc5s+ffr06dPLy8svX77clMEAAAAAALBCXDqhDnt7+8DAQK1TAAAAAACgMYoGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGooGAAAAAACgGgetA6AZys3N/fjjj4uKirQO0nRycnK0jgAAQD1uZV8Tka+//lqn02mdpUl16NAhLS3NxcVF6yAAcK+gaID6li5dOm/ePK1TAACA/0/u1Syt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UEdubq6I1DwJ38fHR3mRl5fX1Jlwdxq4pupOQ2M7f/78lClTROT55593cnISFrp5eeGFF+6///4WLVrMnDkzNDR0x44dlacssdDNwLlz52bOnOnv7//ee+/VNoeFtnVK0fDtt99OmTLl6NGjTk5OP/744xdffDF69OinnnqqoqJCmcZC27QbN26ISHp6eu/evRctWrRz585Dhw4tX7580KBBM2bMMJvNyjRWGTaNogHqKC4ulipPyqlUOVJYWNjUmXB3Grim6k5D4ykrK3vvvfe6det2+fLlqKioyktAWejmJCcnx2QyKV/kmzdvpqSkVG5ioW1deXn5hAkTCgoKPv74Y09Pz9qmsdC2TikanJ2dV6xYcfPmzevXr+fl5S1evNjZ2Xn9+vX//Oc/lWkstE1Tvp7z588PCAhISkrKycn58ccf//a3vzk6Or7//vsrV65UprHKsGkUDVCH0obm5+dXG68sRyvrUtiKBq6putPQSHbu3Nm1a9c//vGPhYWFc+bM2bJli16vVzax0M3JRx999PPPPxcVFa1fv764uPgPf/jDX//6V2UTC23rFi5ceOjQoeeff37QoEF1TGOhbd24ceM+//zz48ePT506VfkN0MPDY/bs2QsXLhSRV199VTmpgYW2aXZ2diISGBj47bffDhs2zNPTMzAw8KWXXvrb3/4mIq+88opyUgOrDJtG0QB1+Pr6iojJZKo2roy4uLjU8ecXWKcGrqm606C63NzcyZMnDxs27NSpU8OGDTt69Oibb76pXDShYKGbHycnpyeffHLp0qUisnjxYuUHVhbapp04ceL111/v0qXLokWL6p7JQtu67t27jx49OjQ0tNr4tGnTdDrdrVu3lPu8stA2zc3NTURiY2OrPRZq6tSpdnZ2JpNJObGFVYZNo2iAOpT/eWVmZlYbz8rKEpG2bdtqkAl3p4Frqu40qCsrK6tHjx6rV6/u0KHDjh07kpKSIiMjq81hoW2ayWTauHHj1q1ba24aMmSIiNy8efPq1avCQtu4s2fPlpeXnzx50sXFRfdfnTt3FpH8/HzlQ+VvoSx0c+Xm5qY8REb54rPQNi0wMFBEaj72y8XFRbmz78WLF4VVho2jaIA6wsPDRWTHjh3VxpOSkkSkR48eGmTC3Wngmqo7DSoqKCh49NFHz58/HxMTc+LEiaFDh95xGgtt04qKin77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tyHHOnv2bKdOnWruHhkZeezYMeX1qlWrqu1VXFw8ceLEOx7X3t7+1VdfrXmghx56SERGjhy5fft2Jyenmjs6Ojr+61//qrmjBcfKz88fNmxYbbvExcU15CsDAICN0pnN5jt+FwQAANYvJyfnp59+EpHy8vLevXuXlZX98Y9//J//+R9l61tvvfXpp5+2bdt227ZtykhQUFCLFi3qfs+8vLwuXbpcvnxZRNzd3fv27dujR48rV64cOnTozJkzypz3339/+vTpyusbN25kZmZmZGSMGzdORGbOnDlp0iQRCQ4OdnNzq/tYubm5ERERly5dEpF27doNGDDAz8/vyJEjycnJJSUlvr6+V65cEZFVq1ZVflKK0aNHf/HFFyKi1+sHDRoUERFx+/btY8eOJScnKxOmTJnywQcfVN3l4YcfTk5O7tat208//WQyme6///6oqKiwsLCLFy9++OGHyufr6emZnp7u6+t7N8cym80xMTH/+te/RMRgMIwePTooKKioqOjw4cP79+8XEZ1O98UXX4wcObLuLw4AALZK66YDAACooLIC+PzzzysHR4wYISJRUVG/6K1eeeUV5a26det2/vz5yvGKioqFCxfa2dmJiI+Pz82bN6vudfz4cWWvN998s+HHmjdvnrLXE088UVRUVDl+4MCBli1bVv64Uu2MBuXXfhHp2bPnyZMnq27atWtX27Ztla3btm2rukk5o0Exffr027dvV27Kz8/v3r27sumTTz65y2MpN8sQkR49euTk5FTdpbKP+PWvf93wrxIAALaFezQAANAcnDx5UnkRERFROZiWliYilfeGbIhLly69/fbbIuLp6fnNN9+0b9++cpNOp/vLX/4ya9YsEcnOzn7zzTfvMnN2drZy2UVYWNhnn33m7Oxcualfv34ffvjhHfcqKSlRMnh7e2/duvX++++vunXw4MGffPKJTqcTkcoWo5oHHnjgvffeq/q8Tzc3t9dff115XdmYWHysgwcPKi+ee+45T0/PqrtMmTIlICDA3d2dOzUAAJoxigYAAJoDpWhwd3evrAby8vKUqyrCw8Mb/j7r169XHsTw/PPPV/slWfHiiy+6uLiIyJo1a+4y84YNG27duiUis2bNUn5dr2rEiBGhoaE19/r666+NRqOIzJw5s/KEgqoeeeSRhx9+WESOHTt248aNmhMWLFhQ83Bdu3ZV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" /></p> -<!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>The AUCell authors recommend making sure most cells have at least the @@ -3202,7 +3210,7 @@ <h3>Cell ranking</h3> genes.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDVcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoibnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDUifQ== --> <pre class="r"><code>nrow(cell_rankings) * 0.05</code></pre> <!-- rnb-source-end --> <!-- rnb-output-begin eyJkYXRhIjoiWzFdIDMwMTUuOTVcbiJ9 --> @@ -3216,7 +3224,7 @@ <h3>Cell ranking</h3> <p>What if we chose a 1% threshold?</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDFcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoibnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDEifQ== --> <pre class="r"><code>nrow(cell_rankings) * 0.01</code></pre> <!-- rnb-source-end --> <!-- rnb-output-begin eyJkYXRhIjoiWzFdIDYwMy4xOVxuIn0= --> @@ -3229,7 +3237,7 @@ <h3>Cell ranking</h3> save it to a variable for later use.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX21heF9yYW5rIDwtIGNlaWxpbmcobnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDEpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiYXVjX21heF9yYW5rIDwtIGNlaWxpbmcobnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDEpIn0= --> <pre class="r"><code>auc_max_rank <- ceiling(nrow(cell_rankings) * 0.01)</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> @@ -3249,15 +3257,15 @@ <h3>Plotting AUC</h3> barcode ahead of time when we wrote the notebook.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLFxuICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gXCJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSBcIkNUR0FHQ0dHVENUVFRBVENcIixcbiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQgXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoicGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLFxuICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gXCJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSBcIkNUR0FHQ0dHVENUVFRBVENcIixcbiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQgIn0= --> <pre class="r"><code>plot_recovery_curve(cell_rankings, ewing_gene_set_collection, gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", barcode = "CTGAGCGGTCTTTATC", auc_max_rank = auc_max_rank) # 1% threshold </code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAANhCAIAAADSYEQJAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzde3hU1b0//hU1JOFiBMQDgmjwhiggghYQFUUrRETRNqKoaL1BbcXLKZVaFS/lWGwVi1dAih6rKK09ohCUwqkXUEHAcjEqItcq1oBgAUlCMr8/xl/OfCcIONkwJLxef+SZWXutvT+z9/OI856918qIxWIBAAAAIAr7pLsAAAAAoPYQNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNACw92rYsGHGTmvYsGHnzp0HDBjw5z//Od2FAwDsuTJisVi6awCA9GjYsOH69etTGJifn//YY4+1bNky8pIAAGo6QQMAe6+Ug4YQQps2bd5///3MzMxoSwIAqOk8OgEAqfjggw9+//vfp7sKAIA9jjsaANh7Jd3RkJ2d3bp166Q+sVistLR09erV//73v5M25eTkrFq1qnHjxru8UACAmmO/dBcAAHuKI444Yv78+dvcVFZWNnbs2J/97GcVFRWVjd98883f/va3iy66aHcVCABQA3h0AgB2LDMzc9CgQT/96U+T2hcvXpyWegAA9liCBgDYWT179kxqWbt27Xd1fuedd/7zP//zhBNOaNq0aU5OztFHH33OOefcfvvtn3322c4cq7i4+LHHHuvTp8+RRx6Zm5ubk5PTokWLs88++/7779+4ceMOh1dUVEyePPn6668//vjjmzVrVqdOnSZNmhx77LFXXHHFs88++80331Qd8sorrySt6PnMM89sc+evv/56Us8nnngikjMwaNCgxN126dIl3v7VV1/98pe/bN++fU5OTvyuk+HDhyfVMHr06G3uc9OmTVlZWYk9hw8fvsMTWFUKV6RLly6Jxx00aNA2u11zzTWJ3U455ZTUzsmecAUBIIQQYgCwtzrggAMS/0087rjjtt9/3rx5Sf+M3nXXXVW7LV++vE+fPt/1L2+dOnV+8pOfrFu37ruOUl5e/pvf/Gb//ff/rj00bdp03LhxFRUV37WHwsLCY489djv/+jdt2vSxxx5LGlVaWtqwYcPEbv369dvm/m+77bbEbvvtt9+//vWvSM7AwIEDE3t27tw5ftoTJ8J477334ofIyMhI7HzOOedss9qXXnopqYClS5d+16nbppSvSOfOnRO7DRw4cJv7v/rqqxO7devWLbVzsidcQQCIxWLuaACAnbVy5cqklkMPPTSpZcGCBV26dJk0adJ37aS0tHTcuHGnnHLKNn8W3rJly4UXXnjbbbd9/fXX37WHNWvW/OQnP+nfv/82t/7Xf/1Xfn7+9p/pWLNmzaBBgy699NKSkpLKxszMzAsvvDCx26uvvlpeXl51+GuvvZb49owzzmjSpEnl22qegSRLly4966yzqt45cuihhyb98j99+vRNmzZV3UNhYWHi286dO7dq1WqHx61U/SsSue86J3vmFQRgLyRoAICdNXXq1MS3derUOeussxJb1q1b16tXr88//3yHu1q8ePHJJ5/81VdfJbUPHjz4f/7nf3ammOeee67qwwKPP/74r371q9jOLSn1pz/96YYbbkhsufjiixPffvXVV2+//XbSqHXr1s2dOzexJXE6zOqfgSQ333zzdz2fcumllya+3bJly7Rp06p2Swoakj7jDlXziuwK2zkne+AVBGAvJGgAgB0rLy8fO3Zs0tfISy655OCDD05sGTx4cOJvvBkZGT/96U9fe+21RYsWvfjiiz/84Q8TOy9fvvzuu+9ObJk2bVrSITIzM3/0ox+NGDHi8ccfv+666+rUqZN0uCVLllS+/fjjj2+88cakyvPy8gYNGvTEE0/ccsstHTp0SNo6evToxCcLunfv3rRp08QOkydPThoyffr0xKU3MjMz+/btG9UZSLJo0aLt/K7+ox/9KCsrK7GlaucPPvhgxYoVlW/33XffgoKC7RwxSTWvyK6w/XOyp11BAPZS6X52AwDSJmmOhuzs7E5VdOzYsV27dkk9Qwjt2rVbu3Zt4t6WL1++7777JvYZO3Zs0hF/9rOfJXbIzMz8+OOPK7eeeeaZiVvr1q1bWFiYOPzdd9/NzMxM7DNkyJDKrVdccUVSkRdeeOHGjRsrO5SXlw8dOjSpT8eOHRMP8fOf/zzpYyZ9hKQJBRJnRqj+GUiajyBun332ufDCC++5556nnnrq0Ucf/eyzzyr7X3DBBYk9mzRpUl5enni43/3ud4kdzjzzzNj3Uc0rsivmaNjhOUnvFQSAWCwmaABg71U1PthJPXv2TJo8LxaL3XHHHYl9kr7Ax23cuDHxYfgQwp133hnftGrVqqSjDB06tOoekr7mtW3bNt7+73//O+kbb/v27bc5YeRll12WdKA5c+ZUbp01a1bS1pUrVyYOb9myZeLWp59+OqozENvWl+qmTZvOnTu36n7iXnzxxaT+M2fOTOzQo0ePxK3jxo37rl1VVc0rEttlQcP2z0l6ryAAxEwGCQDfS3whwMLCwqTvWiGEv//974lve/XqVXV4vXr1unfvntjyv//7v/EXb775ZlLnAQMGVN3D5ZdfflyCzMzMWCwWQnjjjTfKysoSe959991J6zLE/frXv0761bqyhhBC586dk2a4nDJlSuXrjz76KHFGzKysrPPOO6/ybTXPwDb94Q9/OOGEE75ra35+ftI6C4mPFWzcuDHxrGZlZSXdAbF91bwiu872z8medgUB2Avtl+4CAKAmicVigwYNmj179sMPP5ydnZ3YPnv27MSec+fOvemmm6ruIWnpispp+ZLWzmzWrNnRRx9ddfiJJ564cOHCqu1z5sxJfJuZmXnOOeds8yMcddRRxx133D/+8Y9tjs3IyOjXr99vf/vbypYpU6Zcd9118ddJsy326tWrctHH6p+BqnYYDWRlZf34xz9OnEZh0qRJ9913X/z19OnTS0tLKzfl5+fn5uZuZ29JqnlFdpEdnpM96goCsHcSNADA91NRUfHkk09mZGSMGTOmsvHrr7/esmVLYrfCwsKk9Q62adOmTVu2bMnOzi4uLk5sb9Gixfeq6ssvv0x8e9hhhyXdtpDo8MMPTwwa/vWvfyVuTfqaOn369JKSkvi0i0nLIiauVlD9M7DNOrfzKeIuvfTSxKChqKhoyZIlRx55ZKj2ehPVvCK7yM6ckz3nCgKwd/LoBAB867jjjqv6kGFpaemnn3764IMPNmjQILHz2LFj33///cq369atS/m48aUK169fn9j4H//xH99rJxs2bEh8m7QcRpKk78xJxR9//PGJP91v2rQpfkd9WVlZ4k3ydevWPffcc79rJ9/Ldy3WWPlj+3Z069Yt6UmBl19+Of4i8UtygwYNevfu/b2qquYV2UV25pzsOVcQgL2ToAEAticzMzMvL+/GG29M/Ik4bubMmYndUj5ESUlJCKFevXqJjV999dX32knSQwGJKxRW9fnnnye+TcpQQpUf/+MP+b/zzjsbN26sbDznnHMSa67+GUhNRkZG//79E1vi0zR88MEHiXf4n3/++Tk5Od9rz9W8IulVg64gALWPoAEAdkrib79xy5Ytq3x94IEHJm393//9352cmblVq1YhhEaNGiUOr7rkwfYlTU65fPny8vLy7+q8ZMmS7YwNIfTr1y/x7eTJk8N277oPUZyBlF166aWJb996661169YlzoAYQrjkkku+726reUWq2tWTRCaqWVcQgFpG0AAAO6V58+ZJLYm3i2dnZyetGrj9ewqqOvbYYxPfrl69OmnKvbh58+Z1SdC9e/f419dOnToldisrK4t/t6zqk08+WbRoUWJL1SUMjj766OOPP77y7dKlSz/66KPEr6n169fPz89PHFL9M5CyY445JvEjlJeXT5kyJfG5iQMPPPDMM8/8vrut5hWpKmkejUpffPHF961th2rWFQSgljEZJACk6N///nfi2+7duz/99NOVbwsLC7f5K/qsWbMSV3lo0qRJvNupp56a2K2iouKhhx76/e9/nzR87Nix77zzTuXbTp06xdewPPXUUzMzMxNXuLzzzjvPPffcqitc3nnnnVu3bk1s2eaX8IsvvjhxEopnnnnmvffeq3zbp0+fqk8iVPMMVMell16auEjEn/70p7feeqvybUFBwX77fe//56nmFQkhHHTQQYk9582bt3Xr1qRKPvvss9dff/371rYzatYVBKBW2ck74gCg9jnggAMS/03c5mSQlao+hZ6fn5/YYerUqYlbMzMzX3rppaSdfPLJJ0lfPkeOHFm5tUOHDombsrKyXnjhhcThM2fOTPqa+pvf/KZy6+WXX55U4UUXXbRp06bKDuXl5bfeemtSn+OOO66ioqLq512+fHliSFG3bt3EUVU/WiRnYODAgYmbOnfu/F2XI8nnn3++nbUY3nzzzZ3cT5JqXpH//M//TKrkV7/6VXl5eWWHf/zjH0mHCCF069Yt8RApn5O0XEEAiMViGbHd+LggAOxRGjZsmLiywHHHHbdw4cLv6lxaWhpfILDSmWeeOW3atMSWE044Yf78+ZVvMzIyBg0a9MMf/vCYY45Zu3btq6+++tBDDyUesXnz5p988knluoDPP/980qP1GRkZffv2PeWUU+rXrz937txx48aVlpZWbm3UqNHixYubNm0af/vhhx+2b98+sUMI4YgjjsjPz2/fvv2SJUtee+21xJ/94/785z9feOGF2/zIJ5988qxZs6q25+bmfvHFF0lnI5IzMGjQoMcff7xya+fOnd9+++1t1lbV2WefnTQHQVzLli2TvnLvvGpekSeffPLqq69O2ufRRx994okn7rPPPh999NHs2bOr/p9Yt27d3nzzzcq31Tknu/8KAkAI7mgAYC/2ve5oqKioSPo39OSTT07q849//GPnv3HVrVv3tddeS9rDBRdcsJPDMzIyJk+enDT8kUce2cnhcddcc812PvIf/vCHbY4aMGDAdw2p5hlI+df7WCyWeM9/oiFDhuz8TqqqzhVZt25d1Yk2q0pa3iKqOxpi6biCABCLxUwGCQA7JSMjIymY+PDDD5P6tGvX7rnnntuZ72n777//q6++etZZZyW1jxs37rTTTtuZeu64446kyfxCCD/96U/vueeenfz1/tJLL3344Ye30+HHP/7xNp9HSFqtIFH1z0DK+vbtm/R0QFw1pw+ozhVp2LDhiBEjtj8qPz+/oKAg9fq2q2ZdQQBqDUEDAOysE088MfHt2rVr77333qQ+559//uuvv151HYdK++6778UXX/zuu+9269at6tbc3NzXXnttyJAh2/mmd8wxxxQWFg4bNmybW3/961+//PLLxxxzzHY+SLNmzZ544on//u//rlOnzna6NW3atHv37kmNjRo12v4KDtU8AymrX7/++eefn9R4zDHHtG/fvjq7reYVGTBgwIgRI7aZgIQQfvSjH02YMGE7s0tUU826ggDUGladAICddemllyZNynD77bf/+te/Tup20kknvffee5MnT540adLMmTPXrFnzzTff5OXlHXHEEW3atLnmmmtatWq1naPUqVPnt7/97eDBgydMmPDqq69+9NFHX375ZSwWO/DAA0844YTevXtfccUV219D4ZxzzunVq9eUKVOmTJkSL+Crr75q0KDBQQcddOKJJ5599tkXXnjhTt4e369fv+nTpye2XHDBBZmZmdsfVc0zkLJLL7302WefTWyJZDWE6lyRjIyMX/ziFz/60Y9Gjhy5ePHioqKidevWNW3atFOnTldcccU555xT/fK2r2ZdQQBqB5NBAgC1xNatW3NychIX71yyZMkRRxyRxpIAYC/k0QkAoJZYs2ZNYspw0kknSRkAYPcTNAAAtcRjjz2W+Pbiiy9OVyUAsDfz6AQAUIN99dVXDRs2/Pzzz0ePHn3vvfdW3tGw3377rVy5slmzZuktDwD2QiaDBABqsMsvv3zq1KmJT0zE9e7dW8oAAGnh0QkAoGarmjLss88+t99+e1qKAQAEDQBArbLffvuNGjXqhBNOSHchALCX8ugEAFCDNWzYsE6dOiGEgw466LDDDuvevfull1569NFHp7suANh7mQwSAAAAiIxHJwAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMjsl+4CiN7KlSufeOKJ8vLydBcCAACwt6tXr94tt9xSt27ddBey+wgaaqFHHnlkxIgR6a4CAACAEEI4+uijCwoK0l3F7iNoqIXKyspCCL179+7WrVu6awEAANh7Pf/88/Pnzy8tLU13IbuVoKHWOuOMM2666aZ0VwEAALD3WrRo0fz589Ndxe5mMkgAAAAgMoIGAAAAIDKCBgAAACAyggYAAAAgMoIGANJs6NChBQUFFRUV6S4EAIAICBoASLPx48dPnDixuLg43YUAABABQQMAaRaLxSr/AgBQ0wkaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyOyX7gIA2Nvl5eWVlZXl5uamuxAAACIgaAAgzWbMmFFSUpKdnZ3uQgAAiICgAYA0y8nJycnJSXcVAABEwxwNAAAAQGQEDQAAAEBkBA0AAABAZAQNAAAAQGQEDQCk2dChQwsKCioqKtJdCAAAERA0AJBm48ePnzhxYnFxcboLAQAgAoIGANIsFotV/gUAoKYTNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJHZL90FALC3y8vLKysry83NTXchAABEQNAAQJrNmDGjpKQkOzs73YUAABABQQMAaZaTk5OTk5PuKgAAiIY5GgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoASLOhQ4cWFBRUVFSkuxAAACIgaAAgzcaPHz9x4sTi4uJ0FwIAQAQEDQCkWSwWq/wLAEBNJ2gAAAAAIiNoAAAAACIjaAAAAAAiI2gAAAAAIiNoAAAAACIjaAAAAAAis1+6CwBgb5eXl1dWVpabm5vuQgAAiICgAYA0mzFjRklJSXZ2droLAQAgAoKGHdi0adO6des2bdq0cePGrKysBg0aNG7cuEGDBumuC6D2yMnJycnJSXcVAABEQ9CwDV988cVf/vKXKVOmLF68eMWKFbFYLKlD8+bN27Ztm5+f37dv3xYtWqSlSAAAANgDmQzy/7F+/fobb7yxRYsW119//eTJk5cvX141ZQgh/POf/5w6deoNN9zQqlWrgQMHFhcX7/5SAQAAYA/kjob/s2zZsjPPPPPTTz+tbMnJyWnZsmWzZs3q1q2blZVVWlq6efPmNWvWrFy5ctOmTSGEsrKyJ554Ytq0aVOmTDn66KPTVzsAAADsEQQN3yotLT333HPjKUOzZs2uvfba8847r127dvvuu2/VzrFYrKioqLCwcPTo0R9//PGnn37at2/fuXPnesYYAACAvZxHJ741duzYxYsXhxB69+5dVFQ0bNiwDh06bDNlCCFkZGS0adPmlltuWbhw4fXXXx9CKCoqGjNmzG6tGKC2GDp0aEFBQUVFRboLAQAgAoKGbz333HMhhGbNmr3wwgs7v5Z7nTp1Ro0a1aVLlxDChAkTdmF9ALXX+PHjJ06caL4bAIDaQdDwraKiohDCeeed930ff8jIyOjXr18IYcmSJbukMoDaLj7t7jYn3wUAoMYRNHxr8+bNIYQGDRqkMPaAAw4IIcSnhwQAAIC9maDhWy1btgwhzJkzJ4Wx8VEtWrSIuCYAAACoaQQN38rPzw8h/P3vf3/hhRe+18D33ntv3LhxIYQePXrsksoAAACg5hA0fOtnP/tZfHaG/v37Dxky5PPPP9/hkPXr148YMaJ79+6bN2/OzMwcNGjQri8TAAAA9mj7pbuAPUWrVq0eeuih6667buvWrffff/+DDz540kkn/eAHP2jVqtXBBx9ct27drKyssrKyzZs3r1mzZvny5XPmzJk1a9aWLVviw++777527dql9yMAAABA2gka/s8111xTr169G264Ye3atVu3bp01a9asWbN2OKpBgwajRo0aMGDAbqgQAAAA9nAenfh/XHLJJUuWLLn77rvbtGmzw86tW7e+/fbbly1bJmUAqI68vLxGjRrl5uamuxAAACLgjoZkDRs2vP3222+//faVK1cuWrTogw8+WLt27caNGzdv3pydnV2/fv0mTZq0bt26bdu2hx56aLqLBagNZsyYUVJSkp2dne5CAACIgKDhO7Vs2bJly5bx1SjSYtKkSc8880wKA2fPnh1CWLFiRdQVAewSOTk58el4AQCoBQQNe66nnnrqxRdfTHn4zJkzIywGAAAAdoag4Xtbvnz5ggULNmzY0LJlyy5dutSpU2cXHWj06NH9+/cvLy//vgN/+ctfLlu27OCDD94VVQEAAMB2CBqSrV+//p133nnvvffWrl171FFHXXLJJZXzkxUXF19//fUTJ06MxWLxltzc3BEjRlx77bW7opLGjRtfcMEFKQy87777li1blpGREXlJAAAAsH2Chv/H5MmTr7zyyi+//LKy5fbbb58yZcpJJ51UXFx8xhlnLFy4MLH/hg0brrvuuldfffWZZ57xgDEAAABY3vL/PPnkk717905M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O3du27Zt77rrrjfeeCO+6YsvvpgzZ859993XsWPH1atXhxDy8/PPPvvsqCoGAAAA9lj7pTxyzJgx69evf/nll9etWzds2LBhw4bF25Myhc6dOz/77LPVKREAAACoKVK8oyGEkJWVNWnSpJdeeumII47YZodmzZqNGzdu5syZubm5KR8FgFovLy+vUaNG/rEAAKgdUr+jIa5Pnz49e/acOnXqm2++uWrVqg0bNjRo0KB58+Zdu3bNz8+vV69eJFUCUIvNmDGjpKQkOzs73YUAABCB6gYNIYQ6der06dOnT58+1d8VAHuhnJycnJycdFcBAEA0Un90AgAAACBJBHc0JCkvL3/qqadmz57dsGHDbt269ezZc9999438KAAAAMAeqFpBwyuvvPL4449/+OGHn3zySbyltLS0R48eb731VmWfXr16Pf/88w0aNKhWmQAAAEBNkPqjE3fffXefPn0mT578xRdfVDaOGDEiMWUIIRQWFl500UWpFwgAAADUHCkGDUVFRXfddVcsFgshNG7cON5YUVHxhz/8IYTQokWLv/3tbzNnzjzllFNCCIWFhe+9915EBQNQ2wwdOrSgoKCioiLdhQAAEIEUg4bf/e538f8jHDNmzPLly+ONs2bN+vLLL0MII0aM6NGjR9euXV9++eX69euHEB577LFo6gWg1hk/fvzEiROLi4vTXQgAABFIMWhYsGBBCOG00067+uqrKxunTZsWQsjKyqpc6jI3N/fcc88NIXz00UfVrRSAWip+f1z8LwAANV2KQcOnn34aQjjppJMSG995550QQqdOnerVq1fZePjhh1f2BwAAAGq3FIOGrVu3hhBycnIqWyoqKt59990QQteuXRN7xp+w2LBhQ+o1AgAAADVEikFD/D6FytkZQghz5syJpwmnnnpqYs8lS5aEEA455JCUSwQAAABqihSDhqOOOiqE8NJLL1XeqjBu3LgQQnZ29hlnnFHZrbi4+NVXXw0hHHroodWtFAAAANjjpRg0DBw4MISwYcOGHj16PP3003fcccfYsWNDCGeccUbdunXjfZYtW3bFFVd8/fXXIYSzzjorooIBAACAPdd+qQ3r3r37WWedNW3atLlz5w4YMCDemJGRcccdd8RfP/jggzfffHP8dZMmTQYNGlT9WgEAAIA9XIp3NIQQ/vrXv/bt2/f/drTPPvfcc88PfvCD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Hz9x4sQ9f9pgAAB2RoqTQT7wwAPdunVbvHjxTTfdNGrUqIyMjGjL2v1atWr10EMPXXfddVu3br3//vsffPDBk0466Qc/+EGrVq0OPvjgunXrZmVllZWVbd68ec2aNcuXL58zZ86sWbO2bNkSH37fffe1a9cuvR8BoIaKxWKVfwEAqOlSDBpOPPHEv/71r5dddtkjjzwyZ86cO++8s1OnTgcddFC0xe1m11xzTb169W644Ya1a9du3bp11qxZs2bN2uGoBg0ajBo1asCAAbuhQgAAANjDpRg0nHvuuSGEQw45ZN26dbNnzz7nnHNCCPXr18/Ozv6uIV9++WVqx9qdLrnkkl69ej388MMTJkz44IMPtt+5devWP/7xjwcPHty4cePdUx4AAADs4VIMGl555ZWqjRs3bty4cWP16km/hg0b3n777bfffvvKlSsXLVr0wQcfrF27duPGjZs3b87Ozq5fv36TJk1at27dtm3bQw89dJdW8s033+ww7Nim+FKdAAAAsPulGDR069Yt2jr2QC1btmzZsmV8NYq0uOqqq5577rmUh3/22WcRFgMAAAA7I8Wg4c0334y2Dqrq2bPnJ598ksJ6b0VFRZs3b95///13RVUAAACwHSkGDXut1atXz507d926dY0aNTruuOMOP/zwXXesyy+//PLLL09hYMeOHefNm1e/fv3ISwIAAIDtEzQkW7BgwcSJE5csWTJhwoTE9k8//XTgwIHTpk1LbOzQocPjjz9+0kkn7d4aAWqVvLy8srKy3NzcdBcCAEAEogkaiouL582b9+WXX5aUlJx33nmNGzeOxWIZGRmR7Hy3qaiouOeee+6+++6KiorjjjsucdNTTz3105/+tOoki/Pnz+/atetNN900YsSIGvd5AfYQM2bMKCkp2c66RQAA1CDVDRomT558xx13zJ8/PxaLxVs6duzYuHHjIUOGrF69+uqrr+7Ro0e1i9xNBg0aNHr06Pjr/fb7vzNTVFR03XXXlZSUhBCaNm166qmnHnnkkf/617/mzJnz/vvvl5eX/+53vzv88MMHDhyYnroBaricnJycnJx0VwEAQDT2SXlkLBa79tpre/fuPW/evMqUodKWLVsmTJhw5pln3nbbbVW37oHefvvtMWPGhBDq16//+OOPJ852ecUVV8RThhtvvPGTTz55/vnn77333tGjR8+fP//5559v1KhRCOEXv/jFihUr0lU8AAAA7CFSDxruvPPO+DfzjIyMU089dfDgwYlb8/Ly4o8SDB8+/NZbb61mlbvBQw89FH/c49VXX73uuusqZ1L8xz/+MXv27BDCOeec8+CDD9arVy9xVEFBwdixY0MIGzdufOCBB3Z/2QAAALBHSTFoWLZs2fDhw0MIzZs3nz59+uuvvz5y5MjEDjfffPPs2bObNWsWQhg5cuSe/2v/okWLQghnn312165dE9vnzJkTf/GLX/ximwP79u174oknhhD+9re/7eIaAQAAYE+XYtAwatSo8vLyEMLTTz99+umnb7NPp06dCgsLMzIySktL9/xf+z/99NMQQtIckCGEdevWxV+0bdv2u8bGg4ZVq1btsuoAAACgZkgxaHjrrbdCCKeccsoZZ5yxnW7t27fv1atXCOH9999P7UC7TZMmTUIIX3/9dVJ7fAqGEMKWLVu+a2yNmIQCYI81dOjQgoKCioqKdBcCAEAEUgwali5dGkLo0KHDDnu2b98+hPDxxx+ndqDdJl7n5MmTy8rKEtuPP/74+IvtZCXvvvtuCKFFixa7skCAWmv8+PETJ04sLi5OdyEAAEQgxaAh/vN+VlbWDntmZmaGEDZs2JDagXabK664IoTwz3/+c/DgwYl3KHTq1KlNmzYhhHvvvXebv7a98MIL8+bNCyGcddZZu6lWgNol/l9dd4cBANQOKQYNBx98cPj/J1DcvgULFoQQmjZtmtqBdpvzzz//1FNPDSE89thjZ599djw7iHviiScyMzPffvvtQYMGbdq0KXHUCy+8cN1114UQMjMzr7322t1cMwAAAOxp9kttWPfu3T/55JPp06cXFRUdc8wx39Vt4cKFhYWFIYRu3bqlWODuss8++zzzzDOnn3760qVLp02bNm3atGOOOebUU09t0aJF06ZNr7nmmkcffXT06NGFhYU//OEPW7du/c9//vPtt9+OPzQRQrj33nuPPfbY9H4EAAAASLsUg4Yrr7xy7NixpaWll1122aRJk+I3OCRZvXp1fn5+SUlJCKF///7VKnO3OOSQQ955550rrrhi8uTJIYSioqKioqKkPqtWrXryyScTW3Jych544IGBAwfuvkIBAABgT5XioxNdu3a97LLLQghz585t27btXXfd9cYbb8Q3ffHFF3PmzLnvvvs6duy4evXqEEJ+fv7ZZ58dVcW71IEHHvjKK6/MmDGjb9++devW3X7nAw444Kqrrvrwww+lDAAAABCX4h0NIYQxY8asX7/+5ZdfXrdu3bBhw4YNGxZvT8oUOnfu/Oyzz1anxN3v9NNPP/3007/55pv58+d/+OGHy5Yt27hx4+bNm8vLy+vWrVu/fv28vLw2bdqcdNJJ8akuAQAAgLjUg4asrKxJkyZNmjTplltu+eSTT6p2aNas2W9+85sBAwbss0+K902kV05OTteuXbt27ZruQgAAAKDGSD1oiOvTp0/Pnj2nTp365ptvrlq1asOGDQ0aNGjevHnXrl3z8/Pr1asXSZUA1GJ5eXllZWW5ubnpLgQAgAhUN2gIIdSpU6dPnz59+vSp/q4A2AvNmDGjpKQkOzs73YUAABCBCIIGAKiOnJycnJycdFcBAEA0auTsCQAAAMCeKcU7Gp588smd7JmTk1O3bt3GjRsfddRR//Ef/5Ha4QAAAIAaIcWg4eqrr05hVMuWLS+66KIhQ4YceOCBqR0XAAAA2JPt1kcnVq5cef/997du3fr111/fnccFAAAAdo8U72goLi5etWpVr1691qxZE0Jo3bp1jx49DjnkkKZNm3755ZcrV678+9//vnDhwhBC//79f/jDH27YsGHJkiV//vOfP//887Vr15533nmLFy9u3rx5lB8FgJpp6NChS5cunTBhwj77mDkIAKDGSzFoaNCgwYABA9asWdOkSZM//vGP+fn5GRkZSX2mTp16xRVXPPfcc127dv35z38eQvj9738/bty4gQMHbtiwYfjw4Y888kh1yweg5hs/fvyaNWsefvjhgw46KN21AABQXSn+dvToo48uWLAgKyvrpZdeOuecc6qmDCGEnj17vvTSS5mZmTfccMPMmTNDCJmZmdddd93gwYNDCC+++GJ16gag1ojFYpV/AQCo6VIMGv70pz+FELp169alS5ftdPvBD35w2mmnlZeX//a3v61s7NevXwhhzZo1K1asSO3oAAAAwJ4pxaDh448/DiF07Nhxhz07deoUQnj33XcrW1q3bh1/8a9//Su1owMAAAB7phSDhvgNrp9//vkOe8b7bNy4MWlsCKFu3bqpHR0AAADYM6UYNBx11FEhhNdff72kpGQ73UpLS+MrWcb7xy1atCiEkJGR0apVq9SODgAAAOyZUgwa4vMsrFy5csCAAd81fVcs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V0OGDLntYFPRMGjQoPfee8+8MQHAAnl7e5eVlTk7O2sdBAAAACpQWDRs27bt1p35+fn5+fn1y6Mlg8GwbNmy4ODg55577sKFC48//vjLL7/8/vvvGwwGraMBgCWLiooqKSmpoaoGAABAE6KwaOjbt6+6ORqP4cOHx8fHP/fcc9u2bfv000937dr17bffdu/eXetcAGCxDAYDlS4AAIDFUFg07Nu3T90cjYqbm9vWrVs///zzOXPmnDx5snfv3vPmzXvjjTesra21jgYAAAAAQKOm8KkTzcH06dPj4uIefPDBsrKyN998s1+/fikpKVqHAgAAAACgUaNoqImvr+/Bgwf/9re/WVlZ/fLLL4GBgStWrNA6FAAAAAAAjRdFQy1sbW3ff//9qKgoLy+vgoKCadOmmZ64AQAAAAAAblWnNRoeeugh08a8efNGjBhRfU/dxcTE/NFDGo8BAwYcPXp0+vTpERERt33iBgBAsdDQ0JSUlIiICCsr6m8AAIAmr05FQ2xsrGkjKyvrpj3NR6tWrdasWTN8+PAZM2Zcv35d6zgAYDnCw8MzMjKWLl3q5uamdRYAAADUV52Khvbt25s2HBwcTBv33HNPQyVq3J555plRo0bl5eWJiJOTk9ZxAMASGI3Gqj8BAADQ1NWpaDh37txNe5KTkxsgTNPQsmXLli1bap0CAAAAAIDGiLthAQAAAACAaigaAAAAAACAaigaAAAAAACAaigaAAAAAACAaigaAAAAAACAaur01AkAABqOt7d3WVmZs7Oz1kEAAACgAooGAIDGoqKiSkpK9Hq91kEAAACgAooGAIDGDAaDwWDQOgUAAADUwRoNAAAAAABANRQNAAAAAABANRQNAAAAAABANeqv0VBRUfH1118fOnTIxcWlb9++Q4cOtba2Vv0sAAAAAACgEapX0bBt27Yvvvji5MmTp0+fNu0pLS0NCgrav39/1Zhhw4atXbvWycmpXjEBAJYrNDQ0JSUlIiLCyorr7AAAAJo85d/SLViwYNSoUdu3b798+XLVzg8++KB6yyAikZGRf/7zn5UHBABYuvDw8PXr12dmZmodBAAAACpQWDQkJib+v//3/4xGo4i4urqadlZWVn766aci0r59+z179vz888/9+vUTkcjIyNjYWJUCAwAsjemrielPAAAANHUKi4YPP/ywsrJSRFasWHHmzBnT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587Hjh376KOPPv7447y8PBGprKzMzMysPubJJ59csWJF69atq/Y4OjpOnTp10aJFje362JMnT4pI//79q7cMVV5++eWdO3fu2LFj06ZN0dHRAwcONHc+oNmodT0FGxsrJyc784QBAAAA8EcpLxpExNnZecGCBTNnzlyzZk1SUlJycnJqaqqdnV27du169+49duzYm57U8NVXX/n5+dnZNcafEJKSkkTkwQcfvNOAsLCwvXv3lpSUzJ49OzY29rbLUgBQgJUaAQAAAEtSr6LBpE2bNi+//HJdRj7wwAP1P10DMd3uYbrF47Z8fHzmzJnz7rvv/vbbb998883EiRPNmA5o8rKyit5++5eionLThxeN5creRNVQAAAAANSnQtFgGdzd3fPy8mJiYmoYExoa+vXXX58/f3727NlDhw696667zBYPaOr+/e/Tn6xLUOWtHBz4hwsAAABovPh+/YbevXufOnUqKioqMjL1Ky+FAAAgAElEQVRy2LBhtx3j6Oj48ccfjxkzJisra9KkSVu3brWx4X8gULvopCsJ2fkiEhDQdsiQTvV5KxsbXY8ePPkFAAAAaLz4OfmGp59++uuvvzYajU888cT333//1FNP3XbYU089NWbMmA0bNuzcuXPSpEkrV66s4W4LADetv9CpU8sRI3y0CgMAAADADBrXox809Nhjj40ePVpESktLx4wZExgY+NJLLy1evPjWkStXrrz//vtF5LvvvvP39//www+zsrLMHRdo9KKTrrDKI+rI29u7devWzs7OWgcBAACACrii4XerVq26fv363r17RSQ+Pj4+Pl6v18+aNeumYc7Ozv/9739HjRq1f//+06dP//Wvf9UiLNDonDyZff58nogcvXL91lfT02+zEzCJiooqKSnhAjEAAADLQNHwu1atWu3cufOrr7769NNPjx8/XsNIFxeXXbt2zZs3b+XKldeuXTNbQqDRys8v69btm2IX65qH8VxY3JbBYDAYDFqnAAAAgDooGv6HjY3N1KlTp06deurUqZMnT+bm5t5ppMFg+OCDD+bPn7927dqYmJjU1NSUlBRzRgUag6qbI7Kzi4tdrG1srAID295psL299dCh3uaKBgAAAEAbFA2316VLly5dutQ6zMHBYfLkyZMnTzZDJKAxqHnZhZYt7T78cKC5sgAAAABojCgaANwRqzkCAAAA+KMU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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdaXxV1b0//hUIMwgaDaCkEgVjlYL+ACsFqiUoMgsVq4AvxWtFrXXsT/3dogiovddWqSNOkbbXq2lVRCuDDGkVnBCIyqCoyFDibIIMGkA4/wfnf+O5h9GTwGEf3u8Hvs5eZ629v2fvB/jJXnuvrFgsFgAAAID9W610FwAAAADsngAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwA0XDwwQdn7bGGDRvm5+efc845U6ZMSXfhAAA1IysWi6W7BgDYvYMPPnjt2rUpDBw2bNg999xz8MEH13hJAAD7kgAPQDSkHOBDCG3btl20aFG9evVqtiQAgH3JFHoAMt/777//+9//Pt1VAABUizvwAERD0h34+vXrH3vssUl9YrHYF1988fHHH2/bti3pqwYNGqxateqwww7b64UCAOwd2ekuAABS0aZNm9LS0h1+tWnTpgceeOC6667bvHlzVeM333zz5ptvnnbaafuqQACAGmYKPQCZpl69eldeeeWVV16Z1P7OO++kpR4AgBohwAOQmXr16pXUsnz58p11/sc//nHllVeecMIJzZs3r1ev3hFHHHHSSSf99re/3dlN/iQff/zx+PHj+/Tpc9RRRzVp0qRBgwZ5eXm9e/e+4447Nm7cuNvhW7Zseeqppy6++OIf/ehHzZs3r1u37mGHHXbssccOHTr0kUceWbdu3fZDnn/++aSV8x577LEd7vzFF19M6vnggw/WyBm49NJLE3fbpUuXeHt5efl1113XoUOHBg0axIffdtttSTU89NBDO9znxo0b69Wrl9jztttu2+0J3F4KV6RLly6Jx7300kt32O2Xv/xlYrfu3bundk72hysIQPTEACAKmjVrlvjvV7t27Xbd/6233kr6J2/MmDHbd1u6dOmpp566i38ohw4d+sknn+zsKJs3b77uuusaNGiws+FHHHHEY489tm3btp3t4YknnmjduvUuCmjWrNktt9zy7bffJh03aWG8c845Z4f7/+1vf5vYLTs7+7PPPquRM3DJJZckdjv55JNjsdi8efMSC5s/f34sFlu5cmVWVlZi5759++6w2meffTbp6MuXL9/ZqduhlK/IySefnNjtkksu2eH+L7roosRu3bp1S+2c7A9XEIDIcQcegMz06aefJrUceeSRSS1z5879yU9+8s9//nMX+3n88cd/8pOfrFixYvuv1q1bd/rpp99+++3ffPPNzoaXlZUNHz783/7t37b/KhaLXXXVVeeee+7KlSt3UcDatWtHjRrVp0+fxFvxderU+fnPf57Y7YUXXti6dev2w2fMmJG42aNHj8Q3+VXzDCR57733evXqVVFRkdR+5JFHduvWLbFl9uzZO7wTPm3atMTNk08++aijjtrtcatU84rsDTs7J/vnFQRgPyfAA5CZkqJg3bp1k95gV1ZWNnDgwD1ZW/7DDz8844wzts+EF1100a6DU5WJEyduP0H61ltvveuuu/ZkeAhhxowZ559/fmLLueeem7hZUVHx6quvJo0qLy9fsGBBYssvfvGLqs/VPwNJrrnmmu2Tatzw4cMTNysrK2fOnLl9t6SrlvQbd6uaV2Rv2MU52Q+vIAD7OQEegEyzZcuWe+655/77709sHDZs2OGHH57Ycumll5aXlye2XHTRRdOnT1+0aNGkSZN+9rOfJX713nvv3XjjjYktTz/99JNPPpnYUq9evQEDBvzHf/zHhAkTfvnLX9apUyfpcKtWraraXLBgwejRo5Mqb9Omza9+9asHH3zw+uuvP+mkk5K+nTx58sSJE6s2Tz311BYtWiR2mDJlStKQ2bNnJ66oV6dOnUGDBtXUGUiyePHi7QuoMmTIkLp16ya2PPfcc0l9li5dmniKateuffbZZ+/iiEmqeUX2hl2fk/3tCgIQAemeww8AeyTpGfj69et32k7Hjh2PPPLI7OzkRVI7duxYUVGRuLelS5cmPZV99913Jx3xl7/8ZWKHhg0bJu4k6ZHpBg0azJgxI3H4Sy+9VLt27cQ+o0ePrvp28ODBSUUOGzbs66+/ruqwbdu2W265pVat//Wn9mOOOWbr1q1VfX79618nftu+ffukn5D0wHbik+fVPwNJz3vHFRQU/PWvf122bNmmTZsqKioqKyur+icmzxDCYYcdlvhbYrHYH/7wh8QOPXv2jH0f1bwie+MZ+N2ek/ReQQAiR4AHIBqSAvweysrKOuecc8rLy5P2dt111yUFp6QwGYvF1q9ff+ihh+4wIG3/Qvv//M//3L7mCy+8MLFPx44d4+3l5eVJybxTp047/NVJASyEMGfOnKpvX3nllaRvV69enTj8Bz/4QeK3f/nLX2rqDMR2FFZPPvnkTZs27fCHxGKxp59+Oqn/yy+/nNihsLAw8dtHH310Z7vaXjWvSGyvBfhdn5P0XkEAIscUegAyVlZW1n333ffEE08kve47hDBnzpzEzf79+ycl6hBC48aNTznllMSWkpKS+Ie5c+cmtteqVWvYsGHbF3DuuedmJ3j//fdjsVgI4cUXX0ycFx1CGDt27A5/wr//+78nTfx+6aWXqj6ffPLJSW/mmzp1atXnZcuWrV69umqzXr16AwcOrNqs5hnYobvuuitpnnyivn37Jv0VJnEW/YYNGxJLqlev3vaTFHahmldk79n1OdnfriAA+7nkSYYAkDFisdhll13297///YknnmjatGlie9KLwRYuXHj11Vdvv4c1a9Ykbla9Yyxpjbo2bdocccQR2w/v2bPnli1btm9PWpq7bt26269aH9e6det27dol9k+sPD6/4D//8z+rWqZOnTpy5Mj456S3xPXu3fuggw6Kf67+Gdhew4YNt39uP1G9evWGDBny8MMPV7U899xz//Ef/xH/PHv27M2bN1d91adPn8RLtlvVvCJ7yW7PyX51BQHY/wnwAGS4adOmXXjhhYnzt7/66qvErBjvk/T+8x369NNPN23aVK9evS+//DKxPTc393uV9MUX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D95www3FxcWzZs364IMPvvjii1gsduihh5544ol9+vS58MIL69Sps4s9DBs27Oyzz37mmWdmzJjx2muvffbZZxUVFQcddNBhhx3WsWPHnj17DhkyZGeRMsk555wze/bsxJbBgwfv+ujVPwMpGz58eHFxcWJLdW6/V6nmFbn88ssHDhx45513Ll68+J133vnyyy9btmzZsWPH4cOHx//i0Llz5w0bNlT1T1q+rpqidQUB2Pe8xA4ASIMtW7Y0atQoccG/999/v02bNmksCQD2c6bQAwBp8Omnnyam95NOOkl6B4BdE+ABgDRIeul6asu/A8ABxRR6AGAfWbt2bbNmzcrKyu65557f//7327Zti7dnZ2evXr26ZcuW6S0PAPZzXmIHAOwj55133gsvvJA4cz5u8ODB0jsA7JYp9ADAvrN9eq9fv/4tt9ySlmIAIFoEeAAgbRo1ajRlypS2bdumuxAAiABT6AGAfeTggw+uW7duLBZr1qxZ8+bN+/btO2LEiJpdSh0AMpiX2AEAAEAEmEIPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQARkp7sAat7q1asffPDBrVu3prsQAACAvaVRo0bXXnttw4YN013IviPAZ6D77rvv9ttvT3cVAAAAe1dBQcHZZ5+d7ir2HQE+A23ZsiWE0K9fv27duqW7FgAAgJr317/+tbS0dPPmzekuZJ8S4DNWjx49rr766nRXAQAAUPMWL15cWlqa7ir2NS+xAwAAgAgQ4AEAACACBHgAAACIAAEegBpQXl5eWFhYVFSU7kIAADKWAA9ADSgtLS0pKSkuLk53IQAAGUuAB6AGxGKxdJcAAJDhBHgAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAAACIAAEeAAAAIkCAB6AG5OXlZWdn5+fnp7sQAICMlZ3uAgDIBAUFBWVlZTk5OekuBAAgYwnwANSM3NzcdJcAAJDJTKEHAACACBDgAQAAIAIEeAAAAIgAAR4AAAAiQIAHoAaUl5cXFhYWFRWluxAAgIwlwANQA0pLS0tKSoqLi9NdCABAxhLgAagBsVgs3SUAAGQ4AR4AAAAiQIAHAACACBDgAQAAIAIEeAAAAIgAAR4AAAAiQIAHAACACBDgAagBeXl52dnZ+fn56S4EACBjZae7AAAyQUFBQVlZWU5OTroLAQDIWAI8ADUjNzc33SUAAGQyU+gBAAAgAgR4AAAAiAABHgAAACJAgAcAAIAIEOABqAHl5eWFhYVFRUXpLgQAIGMJ8ADUgNLS0pKSkuLi4nQXAgCQsQR4AGpALBZLdwkAABlOgAcAAIAIEOABAAAgAgR4AAAAiAABHgAAACJAgAcAAIAIEOABAAAgAgR4AGpAXl5ednZ2fn5+ugsBAMhY2ekuAIBMUFBQUFZWlpOTk+5CAAAylgAPQM3Izc1NdwkAAJnMFHoAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAakB5eXlhYWFRUVG6CwEAyFgCPAA1oLS0tKSkpLi4ON2FAABkLAEegBoQi8XSXQIAQIYT4AEAACACBHgAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAAACIgOx0FxABX3755dq1azds2PDtt982adLkoIMOatGiRbqLAti/5OXlZWdn5+fnp7sQAICMJcDv2KJFi5555pkZM2YsXbq0oqIi6dsmTZocd9xxp59++pAhQ370ox+lpUKA/UpBQUFZWVlOTk66CwEAyFgCfLIPPvjg2muvfe6553bRZ/369a+//vrrr78+bty4M888884773TTCSA3NzfdJQAAZDIB/n959dVX+/XrV15eXtVyyCGHtG7dOicnp2HDhiGEb775pry8fNWqVZ9//nm8w+TJk19++eVp06Z17NgxPUUDAABwABDgv1NRUXHWWWfF03vbtm2vuOKKvn377uzWellZ2cyZM++///433njj888///nPf75o0aImTZrs25IBAAA4UHgL/XcmTJjw0UcfhRCGDRv29ttvX3755buYGH/EEUdccMEFr7/++o033hhCWLVq1QMPPLDvagUAAOAAI8B/Z9KkSSGEvLy8iRMn1q9ff0+GZGVljR079tRTTw0hPPXUU3u1PAAAAA5kAvx3VqxYEULo169fnTp1vtfAwYMHhxCWL1++V8oCiILy8vLCwsKioqJ0FwIAkLEE+O98/fXXIYQUnmNv2rRp1XCAA1NpaWlJSUlxcXG6CwEAyFgC/HcOP/zwEEJpaen3Hfjmm29WDQc4MMVisXSXAACQ4QT475xyyikhhFmzZr3wwgt7Puqdd9555JFHqoYDAADA3iDAf2fkyJG1atWKxWJnnnnm7bffvn79+l3337Rp08SJE7t3775+/fpatWqNHDly39QJAADAAcg68N/58Y9/fP311//ud7+rrKy8/vrrx40b99Of/rRTp06tW7c+9NBDGzRokJWVVVlZWV5evmrVqoULF7744ovxReNDCDfccMNJJ52U3voBAADIYAL8/3LbbbcddNBBN91005YtWzZs2DB16tSpU6fuekidOnXGjh17ww037JsKAQAAODCZQp/shhtuWLZs2SWXXNK8efNd98zNzR05cuSyZcukdwAAAPY2d+B3ID8/f8KECffdd9+iRYuWLFny/vvvf/XVVxs3bozFYo0bN27atGnbtm2PO+649u3b16q1F/8Csnbt2vnz56cwcOXKlSGEbdu21XBBAAAApI8Av1O1atXq0KFDhw4d0lXAL3/5y6eeeirl4ZMmTbr22mtrsB6AXcjLy8vOzs7Pz093IQAAGUuA33+de+65X331VQpLK7/++uvr169v1KjR3qgKYIcKCgrKyspycnLSXQgAQMYS4L+38vLyBQsWfPTRR82bN+/atWuTJk320oEGDx48ePDgFAZ27Nhx4cKFDRs2rPGSAHYhNzc33SUAAGQyAX4HPvnkkzlz5sybN69+/fqnn3569+7d4+2xWOyWW265/fbbN2zYEG+pV6/eddddN3r06Nq1a6evXgAAADKfAJ/sv/7rvy655JKvv/46vnnLLbdceuml9913X1ZW1pVXXnnPPfckdt60adO4cePmzJnz9NNPH3LIIemoFwAAgAOCAP+//PGPf7z66quTGidMmHD00Ucff/zx8fSek5NTWFjYpk2bJUuWzJ49e8OGDf/85z9HjRp1//33p6NkAAAADggC/Hc+++yz0aNHhxBq1ap1ySWXnHrqqZ999tkDDzywePHiUaNGxZeF79at21NPPVW1RPx77703aNCgpUuXPvTQQ7/61a+OP/74dP4AAAAAMtdeXMY8cu68885169aFEB577LH77rtvyJAhv/rVr15//fUTTzyxsrJy1apV9evXf+KJJ6rSewjhmGOO+fOf/5yVlbV169aHHnoofbUDpFl5eXlhYWFRUVG6CwEAyFgC/HcWLFgQQjjxxBPPPffcqsaGDRvGb8uHEM4666xWrVoljerUqVO3bt1CCO+8886+qhRgv1NaWlpSUlJcXJzuQgAAMpYA/5133303hHDSSScltXfu3Dn+4bjjjtvhwHh7fDjAgSkWi6W7BACADCfAf+err74KITRu3Dip/aCDDop/2NmS7wcffHDVcAAAANgbBPjvFBQUhBA++OCDpPb3338//mH58uU7HBjvEB8OAAAAe4MA/51jjz02hDB9+vTVq1cntle9nW769Olbt25NGrVhw4aXXnqpajgAAADsDQL8d0aMGBFC2LRp04ABA5YsWRJCqKys/P3vf//www/HO7z77rt333130qhRo0Z9/vnnIYTCwsJ9Wy8AAAAHEOvAf6dHjx79+/f/+9///tZbb7Vr1y4nJ2fdunVbtmyJf9WhQ4fx48dfc80177777rBhw4466qilS5fef//9zz77bAihQ4cO5513Xrp/AQAAABlLgP9fHn744SFDhsyZMyeE8OWXX8Ybf/CDH/z5z39u2rTppEmTVq1a9dBDDyUt+V63bt277rqrVi3TGQAAANhbZM7/pXnz5iUlJWPHjj366KNr1arVtGnTc845Z+7cua1atWrSpElJScmRRx6ZNCQ/P3/u3LmnnHJKWgoG2E/k5eVlZ2fn5+enuxAAgIzlDnyy7OzsG2+88cYbb9y2bVvSTfWqafMvvvjixx9/3Lx58x49elx00UVNmzZNV7UA+4mCgoKysrKcnJx0FwIAkLEE+J3a4ZT4hg0b/uY3v/nNb36z7+sB2M/l5uamuwQAgExmCj0AAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwANaC8vLywsLCoqCjdhQAAZCwBHoAaUFpaWlJSUlxcnO5CAAAylgAPQA2IxWLpLgEAIMMJ8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPQA3Iy8vLzs7Oz89PdyEAABkrO90FAJAJCgoKysrKcnJy0l0IAEDGEuABqBm5ubnpLgEAIJOZQg8AAAARIMADAABABAjwAAAAEAECPAAAAESAAA9ADSgvLy8sLCwqKkp3IStjRZ0AACAASURBVAAAGUuAB6AGlJaWlpSUFBcXp7sQAICMJcADUANisVi6SwAAyHACPAAAAESAAA8AAAARIMADAABABAjwAAAAEAECPAAAAESAAA8AAAARIMADUAPy8vKys7Pz8/PTXQgAQMbKTncBAGSCgoKCsrKynJycdBcCAJCxBHgAakZubm66SwAAyGSm0AMAAEAECPAAAAAQAQI8AAAARIAADwAAABEgwANQA8rLywsLC4uKitJdCABAxhLgAagBpaWlJSUlxcXF6S4EACBjpbiM3KpVq0IIhx9+eJ06dXbdc926dRUVFXXr1m3ZsmVqxwJg/xeLxdJdAgBAhkvxDnzr1q1bt269dOnS3fb829/+1rp1627duqV2IAAAACDsgyn0devWDSGUlZXt7QMBAABABtvTKfR//vOft2987rnn3nzzzV2M+uabbyZMmBBCqFevXgrFAQAAAHF7GuAvuOCC7RtvuummPRx+wgkn7GFPAAAAYHv74i30zZo1+93vfrcPDgQAAACZak/vwE+fPj1x84wzzggh3HfffUcfffSuBzZo0KBDhw5NmzZNrT4AAAAg7HmA79Wr1/aNXbt27dChQ43WA0Ak5eXlZWdn5+fnp7sQAICMleI68FdddVUI4bDDDqvRYgCIqoKCgrKyspycnHQXAgCQsVIM8OPHj0/crKioWLBgwWeffVZZWTlw4MCcnJxYLJaVlVUTFQIQDbm5uekuAQAgk6UY4KvMnDlz1KhR8+fP37ZtW7ylY8eOOTk5RUVFkydPHjlyZP/+/atdJAAAABzoqvUW+ssuu+z000+fN29eVXqvsnXr1ilTpgwYMOCqq66KxWLVOQoAAACQeoC/+eabJ0yYEELIyso67bTTRo0alfjtEUccUbdu3RDCXXfdde2111azSgAAADjApRjgV65cecstt4QQmjdvPmvWrBkzZowbNy6xQ79+/ZYtW9auXbsQwr333rtixYrq1woAAAAHrBQD/N13371169YQwqOPPtqjR48d9mnduvW0adPq1q27ZcuWpJfeAZBhysvLCwsLi4qK0l0IAEDGSjHAz507N4TQpUuXPn367KJbq1atBgwYEEJ48803UzsQAJFQWlpaUlJSXFyc7kIAADJWigF++fLlIYROnTrttuexxx4bQnjvvfdSOxAAkeB9pQAAe1uKAb6ysjKEUK9evd323Lx5cwhh3bp1qR0IAAAACCkH+JYtW4YQFi9evNueS5YsCSG0aNEitQMBAAAAIeUAf8opp4QQZs+eHc/nO/Puu+/OmjUrhNC1a9fUDgQAAACElAP8iBEjQghbtmw577zz1qxZs8M+H3300fnnn79p06YQwtChQ1MuEQAAAMhObVi3bt2GDh36+OOPl5aWtm/f/oorrqhaTG7NmjUff/zxvHnz7rjjjvij77169erdu3eNlQwAAAAHnhQDfAihqKiooqJi2rRpFRUVY8aMGTNmTLy9X79+id06d+5sVSEAAACophSn0IcQ6tevP3Xq1Keffjo/P3+HHZo3b/7II4+89tprzZo1S/koAERCXl5ednb2zv5FAACg+lK/Ax83ePDgvn37Tp8+fc6cOf/617/WrVvXpEmTww8/vEuXLn369GnSpEmNVAnAfq6goKCsrCwnJyfdhQAAZKzqBvgQQr169QYOHDhw4MDq7wqA6MrNzU13CQAAmSz1KfQAAADAPlMDd+CTxGKx//7v/3711VcbNGjQrVu3M844o379+jV+FAAAADigVCvAT506dcKECQsWLPjoo4/iLbFYrH///lOmTIlv3nHHHV27dn322Wc9FQkAAADVkfoU+nHjxvXr1+/555//+OOPqxofeeSRqvQe9/LLL3s8HgAAAKopxQD/7rvvjhkzJhaLhRAS767/8Y9/DCE0a9bsueeee+ONN3r37h1CePnll+fMmVMT1QKwnyovLy8sLCwqKkp3IQAAGSvFAP/73/9+69atIYQJEyZ8/vnn8cYPPvhg6dKlIYRrr722f//+nTp1evrppw8++OAQwkMPPVRDBQOwPyotLS0pKSkuLk53IQAAGSvFAP/222+HEH76059ecsklWVlZ8caZM2fGPwwaNCj+oUGDBv379w8hvP/++9WtFID9WHxOFgAAe0+KAf7DDz8MIfz4xz9ObHzttddCCIceeujxxx9f1di6desQwsqVK1OtEAAAAEg1wH/77bchhKT14V555ZUQQteuXRMbs7OzQwjr1q1LsUAAAAAg5QB/9NFHhxBWrFhR1bJixYoPPvgghPCzn/0ssWd8hblWrVqlXiMAAAAc8FIM8AUFBSGEZ599try8PN7y8MMPxz/07du3qtuWLVuee+65EEJeXl61ygQAAIADW4oB/pJLLgkhrF+//mc/+9mf//znW2+99Q9/+EMI4fjjj2/Tpk28z9KlS/v37x+/A9+jR48aKhgAAAAORNmpDTvllFN69er1wgsvvP322xdccEFV+7hx4+IfioqKLrroovjnpk2bXn755dWrEwAAAA5oKd6BDyFMmjTprLPOSmy58sorqxaQi7/lLoRw8MEHP/bYY02bNk35QADs//Ly8rKzs/Pz89NdCABAxkrxDnwIoWHDhk8++eSSJUteeeWVb7/9tnPnzp06dar6tnHjxj169OjYseNll10WX0kOgAxWUFBQVlaWk5OT7kIAADJW6gE+7vjjj09c9b3KsGHDhg0bVs2dAxAhubm56S4BACCTpT6FHgAAANhnBHgAAACIAAEeAAAAIkCABwAAgAgQ4AGoAeXl5YWFhUVFRekuBAAgYwnwANSA0tLSkpKS4uLidBcCAJCxBHgAakAsFkt3CQAAGU6ABwAAgAgQ4AEAACACBHgAAACIgOwa2UtFRcWCBQs+++yzysrKgQMH5uTkxGKxrKysGtk5AAAAUN0AP3PmzFGjRs2fP3/btm3xlo4dO+bk5BQVFU2ePHnkyJH9+/evdpFp9uWXX65du3bDhg3ffvttkyZNDjrooBYtWqS7KAAAAA4s1Qrwl1122YQJE3b41datW6dMmTJlypQrr7xy/Pjxkbsbv2jRomeeeWbGjBlLly6tqKhI+rZJkybHHXfc6aefPmTIkB/96EdpqRAAAIADSurPwN98883x9J6VlXXaaaeNGjUq8dsjjjiibt26IYS77rrr2muvrWaV+9IHH3wwcODA9u3bjx49+uWXX94+vYcQ1q9f//rrr48bN659+/aDBg1asWLFvq8TYL+Sl5eXnZ2dn5+f7kIAADJWinfgV65cecstt4QQmjdv/vjjj/fo0SOEEG+J69ev37Jly/r377948eJ7773317/+dST+r+7VV1/t169feXl5VcshhxzSunXrnJychg0bhhC++eab8vLyVatWff755/EOkydPfvnll6dNm9axY8f0FA2wHygoKCgrK8vJyUl3IQAAGSvFAH/33Xdv3bo1hPDoo4/G0/v2WrduPW3atKOPPnrz5s3jx4+/++67Uy9zn6ioqDjrrLPi6b1t27ZXXHFF3759d/Z3h7KyspkzZ95///1vvPHG559//vOf/3zRokVNmjTZtyUD7Edyc3PTXQIAQCZLcQr93LlzQwhdunTp06fPLrq1atVqwIABIYQ333wztQPtSxMmTPjoo49CCMOGDXv77bcvv/zyXcwaOOKIIy644ILXX3/9xhtvDCGsWrXqgQce2He1AgAAcIBJMcAvX748hNCpU6fd9jz22GNDCO+9915qB9qXJk2aFELIy8ubOHFi/fr192RIVlbW2LFjTz311BDCU089tVfLAwAA4ECWYoCvrKwMIdSrV2+3PTdv3hxCWLduXWoH2pfi76Lr169fnTp1vtfAwYMHh//5owYAAADsDSkG+JYtW4YQFi9evNueS5YsCSFEYuH0r7/+OoSQwnPsTZs2rRoOAAAAe0OKAf6UU04JIcyePTuez3fm3XffnTVrVgiha9euqR1oXzr88MNDCKWlpd93YPwJ//hwgANTeXl5YWFhUVFRugsBAMhYKQb4ESNGhBC2bNly3nnnrVmzZod9Pvroo/PPP3/Tpk0hhKFDh6Zc4j4T/6vErFmzXnjhhT0f9c477zzyyCNVwwEOTKWlpSUlJcXFxekuBAAgY6UY4Lt16xbP5KWlpe3bt7/55ptfeuml+Fdr1qyZPn362LFjf/jDH86bNy+E0KtXr969e9dUxXvPyJEja9WqFYvFzjzzzNtvv339+vW77r9p06aJEyd27959/fr1tWrVGjly5L6pE2A/FIvF0l0CAECGS3Ed+BBCUVFRRUXFtGnTKioqxowZM2bMmHh7v379Ert17tw5KjdkfvzjH19//fW/+93vKisrr7/++nHjxv30pz/t1KlT69atDz300AYNGmRlZVVWVpaXl69atWrhwoUvvvhifNH4EMINN9xw0kknpbd+AAAAMljqAb5+/fpTp06dNGnSb37zm/j725M0b9781ltvHTFiRK1aKd7n3/duu+22gw466KabbtqyZcuGDRumTp06derUXQ+pU6fO2LFjb7jhhn1TIQAAAAem1AN83ODBg/v27Tt9+vQ5c+b861//WrduXZMmTQ4//PAuXbr06dMnhTe6p90NN9zwi1/84vbbb3/mmWc+/fTTXfTMzc0dNGjQ9ddfn5+fv8/KAwAA4MBU3QAfQqhXr97AgQMHDhxY/V3tJ/Lz8ydMmHDfffctWrRoyZIl77///ldffbVx48ZYLNa4ceOmTZu2bdv2uOOOa9++/d6eXLBu3bqtW7d+31EpDAEAAGA/VwMBPlPVqlWrQ4cOHTp0SFcB11xzzfjx41Me/vnnn9dgMQAAAKSXAL//atq06cEHH5zCwPXr13/77be1a9eu8ZIAAABIl2oF+I8//nj27NlvvfVWZWXlbjtfe+21rVu3rs7h9gcbN2585ZVXPvroowYNGrRt2/aEE07IysraS8caPXr06NGjUxjYsWPHhQsXHnLIITVeEsDO5OXlZWdneycIAMDek3qAnzx58ogRI9auXbuH/a+44oqUj7WPvfrqq3/729+aNm168803VzVu3rx57Nixf/jDHzZt2lTV+IMf/OC+++5LWjkP4ABUUFBQVlaWk5OT7kIAADJWiu9gW7FixS9+8Ys9T+8hhJYtW6Z2rH3p22+/veaaa37yk5/88Y9/LCsrq2pfs2ZNx44db7311sT0HkJYvXp1//79L7zwwi1btuzzYgH2L7m5uR7eAQDYe1K8A3/rrbdu3ry5du3a11xzzdlnn33kkUfu9n3sjRs3Tu1Y+9KFF174X//1X/HP2dnfnZxLLrlk8eLFIYQ6der07Nnzhz/84bZt2xYuXDhnzpxYLDZx4sQ2bdr8+7//e3qKBgAA4ACQYoB/4403Qgi33XbbddddV6P1pNOcOXPi6T0nJ2fChAlnnnlmvP3JJ5+cMmVKCKFdu3bFxcXHH3981ZB//OMf5513XllZ2bhx44YMGdK2bdu0VA4AAEDGS3EK/QcffFCrVq3LL7+8ZqtJr3vvvTeEULt27dmzZw8ZMqROnTrx9okTJ4YQ6tSp88QTTySm9xDCz372s7/85S8hhMrKyuos+QYAAAC7lmKAb9SoUW5ubsOGDWu2mvSKT5Lv3bt30trvCxYsCCGceuqp7dq1235Ujx49unXrFkL4xz/+sU/KBAAA4ECUYoAvKCj45JNPvvzyy5qtJr0+/PDDEMIPf/jDpPaKiooQwnHHHbezgSeccEIIYc2aNXuzOoD9Wnl5eWFhYVFRUboLAQDIWCkG+AsuuCCE8PTTT9dkLekWXzh9/fr1Se3xVZF2sdZ9LBar+i/Agam0tLSkpKS4uDjdhQAAZKzUA/xpp5121VVXxd9mlxmOPfbYEML06dO3bt2a2P5//s//Cf8zwX6H4nPsI7FOHsBe4o+YAAB7W4oBvnbt2k8++eRpp532k5/85OKLL164cOGGDRtqtrJ975xzzgkhrFy58oILLti2bVtV+4gRI0IIr7zyyquvvrr9qOnTp7/22mshhFNOOWVfVQoAAMABJ8UA379//+HDh2/dujU7O/vhhx/u2LFjkyZNcnNz83auZuveG4YPHx6/Cf/YY4+dddZZ8fvqIYSzzjqrb9++sVjs/PPPT7oPX1JSEo/34X8eKwAAAIC9IcV14J9//vntGz///PPqFZNmDRo0KC4u7tmz5xdffPHMM88888wzHTp0KCwsPPzwwwcNGvT222+///77nTp1GjBgwAknnLBx48b58+fPnDkzPmv04osvjr+LHgAAAPaGFAN8pobVDh06vPbaa8OHD4/Pin/rrbfeeuutxA6bNm168sknn3zyycTGiy+++P7779+nhQIAAHCASTHAz5kzp2br2H8cffTRr7766jPPPPPoo4/OnDlz06ZNO+tZp06dnj17/r//9/+6d+++LysEAADgAJRigM94gwYNGjRo0IYNG956660lS5asXr16/fr1GzdurFu3buPGjVu2bNmuXbvOnTs3a9Ys3ZUCAABwQBDgd6Vx48Zdu3bt2rVrugsB2N/l5eVlZ2fn5+enuxAAgIxVMwG+oqJiwYIFn332WWVl5cCBA3NycmKxWFZWVo3sHID9X0FBQVlZWU5OTroLAQDIWNUN8DNnzhw1atT8+fOrFk7v2LFjTk5OUVHR5MmTR44c2b9//2oXCUAE5ObmprsEAIBMluI68HGXXXbZ6aefPm/evKr0XmXr1q1TpkwZMGDAVVddFV9oDQAAAEhZ6gH+5ptvnjBhQgghKyvrtNNOGzVqVOK3RxxxRN26dUMId91117XXXlvNKgEAAOAAl2KAX7ly5S233BJCaN68+axZs2bMmDFu3LjEDv369Vu2bFm7du1CCPfee++KFSuqXysAAAAcsFIM8HfffffWrVtDCI8++miPHj122Kd169bTpk2rW7fuli1bxo8fn3qNAAAAcMBLMcDPnTs3hNClS5c+ffrsolurVq0GDBgQQnjzzTdTOxAAkVBeXl5YWFhUVJTuQgAAMlaKAX758uUhhE6dOu2257HHHhtCeO+991I7EACRUFpaWlJSUlxcnO5CAAAyVooBvrKyMoRQr1693fbcvHlzCGHdunWpHQiASLDgCADA3pZigG/ZsmUIYfHixbvtuWTJkhBCixYtUjsQAAAAEFIO8KecckoIYfbs2fF8vjPvvvvurFmzQghdu3ZN7UAAAABASDnAjxgxIoSwZcuW8847b82aNTvs89FHH51//vmbNm0KIQwdOjTlEgEAAIDs1IZ169Zt6NChjz/+eGlpafv27a+44oqqxeTWrFnz8ccfz5s374477og/+t6rV6/evXvXWMkAAABw4EkxwIcQioqKKioqpk2bVlFRMWbMmDFjxsTb+/Xrl9itc+fOXkoMAAAA1ZTiFPoQQv369adOnfr000/n5+fvsEPz5s0feeSR1157rVmzZikfBQAAAAjVuQMfN3jw4L59+06fPn3OnDn/+te/1q1b16RJk8MPP7xLly59+vRp0qRJjVQJwH4uLy8vOzt7Z3/SBQCg+qob4EMI9erVGzhw4MCBA6u/KwAiqqCgoKysLCcnJ92FAABkrBoI8AAQQsjNzU13CQAAmSz1Z+ABAACAfSbFO/DnnXfeHvasX79+48aNc3Jyjj322E6dOrVu3Tq1IwIAAMCBLMUA/9hjj6U2sHPnzqNHj+7bt29qwwEAAODAlOIU+nbt2rVr165p06a77XnMMccceeSR2dn//18K3njjjX79+v32t79N7bgAAABwYEoxwC9atOj+++/fsmVLCCE7O/u8887729/+9vrrr//rX/9auHDhpEmTfvWrX9WvXz+EcMwxx7z77ruVlZUrVqy48cYbGzduHEK47bbbpk6dWoM/A4D0Ki8vLywsLCoqSnchAAAZK8UAv3bt2rPPPvvrr78+5phjPvjgg7/85S9Dhgw56aSTWrVqdeKJJw4aNOjee+9dsWLFCSec8Pzzz48YMaJ27dqtW7ceO3ZsaWlpo0aNQgi33357jf4QANKptLS0pKSkuLg43YUAAGSsFAP83Xff/cknnzRq1Oj5558/8sgjd9inRYsWkydPbtq0aXFx8aRJk+KNbdq0GT16dAjh1VdfraysTO3oAOxvYrFYuksAAMhwKQb4p59+OoTQvXv3tm3b7qLbkUceeeqpp4YQ7r///qrGnj17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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3269,15 +3277,15 @@ <h3>Plotting AUC</h3> <p>Now, let’s look at an example with a low AUC.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLFxuICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gXCJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSBcIkFHQVRBR0FHVENBQ0FBVENcIixcbiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGRcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoicGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLFxuICAgICAgICAgICAgICAgICAgICBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gXCJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSBcIkFHQVRBR0FHVENBQ0FBVENcIixcbiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQifQ== --> <pre class="r"><code>plot_recovery_curve(cell_rankings, ewing_gene_set_collection, gene_set_name = "ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION", barcode = "AGATAGAGTCACAATC", auc_max_rank = auc_max_rank) # 1% threshold</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAANhCAIAAADSYEQJAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzde3hU1b0//hU1JOFiBMQDgmjwhiggghYQFUUrRETRNqKoaL1BbcXLKZVaFS/lWGwVi1dAih6rKK09ohCUwqkXUEHAcjEqItcq1oBgAUlCMr8/xl/OfCcIONkwJLxef+SZWXutvT+z9/OI856918qIxWIBAAAAIAr7pLsAAAAAoPYQNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJERNACw92rYsGHGTmvYsGHnzp0HDBjw5z//Od2FAwDsuTJisVi6awCA9GjYsOH69etTGJifn//YY4+1bNky8pIAAGo6QQMAe6+Ug4YQQps2bd5///3MzMxoSwIAqOk8OgEAqfjggw9+//vfp7sKAIA9jjsaANh7Jd3RkJ2d3bp166Q+sVistLR09erV//73v5M25eTkrFq1qnHjxru8UACAmmO/dBcAAHuKI444Yv78+dvcVFZWNnbs2J/97GcVFRWVjd98883f/va3iy66aHcVCABQA3h0AgB2LDMzc9CgQT/96U+T2hcvXpyWegAA9liCBgDYWT179kxqWbt27Xd1fuedd/7zP//zhBNOaNq0aU5OztFHH33OOefcfvvtn3322c4cq7i4+LHHHuvTp8+RRx6Zm5ubk5PTokWLs88++/7779+4ceMOh1dUVEyePPn6668//vjjmzVrVqdOnSZNmhx77LFXXHHFs88++80331Qd8sorrySt6PnMM89sc+evv/56Us8nnngikjMwaNCgxN126dIl3v7VV1/98pe/bN++fU5OTvyuk+HDhyfVMHr06G3uc9OmTVlZWYk9hw8fvsMTWFUKV6RLly6Jxx00aNA2u11zzTWJ3U455ZTUzsmecAUBIIQQYgCwtzrggAMS/0087rjjtt9/3rx5Sf+M3nXXXVW7LV++vE+fPt/1L2+dOnV+8pOfrFu37ruOUl5e/pvf/Gb//ff/rj00bdp03LhxFRUV37WHwsLCY489djv/+jdt2vSxxx5LGlVaWtqwYcPEbv369dvm/m+77bbEbvvtt9+//vWvSM7AwIEDE3t27tw5ftoTJ8J477334ofIyMhI7HzOOedss9qXXnopqYClS5d+16nbppSvSOfOnRO7DRw4cJv7v/rqqxO7devWLbVzsidcQQCIxWLuaACAnbVy5cqklkMPPTSpZcGCBV26dJk0adJ37aS0tHTcuHGnnHLKNn8W3rJly4UXXnjbbbd9/fXX37WHNWvW/OQnP+nfv/82t/7Xf/1Xfn7+9p/pWLNmzaBBgy699NKSkpLKxszMzAsvvDCx26uvvlpeXl51+GuvvZb49owzzmjSpEnl22qegSRLly4966yzqt45cuihhyb98j99+vRNmzZV3UNhYWHi286dO7dq1WqHx61U/SsSue86J3vmFQRgLyRoAICdNXXq1MS3derUOeussxJb1q1b16tXr88//3yHu1q8ePHJJ5/81VdfJbUPHjz4f/7nf3ammOeee67qwwKPP/74r371q9jOLSn1pz/96YYbbkhsufjiixPffvXVV2+//XbSqHXr1s2dOzexJXE6zOqfgSQ333zzdz2fcumllya+3bJly7Rp06p2Swoakj7jDlXziuwK2zkne+AVBGAvJGgAgB0rLy8fO3Zs0tfISy655OCDD05sGTx4cOJvvBkZGT/96U9fe+21RYsWvfjiiz/84Q8TOy9fvvzuu+9ObJk2bVrSITIzM3/0ox+NGDHi8ccfv+666+rUqZN0uCVLllS+/fjjj2+88cakyvPy8gYNGvTEE0/ccsstHTp0SNo6evToxCcLunfv3rRp08QOkydPThoyffr0xKU3MjMz+/btG9UZSLJo0aLt/K7+ox/9KCsrK7GlaucPPvhgxYoVlW/33XffgoKC7RwxSTWvyK6w/XOyp11BAPZS6X52AwDSJmmOhuzs7E5VdOzYsV27dkk9Qwjt2rVbu3Zt4t6WL1++7777JvYZO3Zs0hF/9rOfJXbIzMz8+OOPK7eeeeaZiVvr1q1bWFiYOPzdd9/NzMxM7DNkyJDKrVdccUVSkRdeeOHGjRsrO5SXlw8dOjSpT8eOHRMP8fOf/zzpYyZ9hKQJBRJnRqj+GUiajyBun332ufDCC++5556nnnrq0Ucf/eyzzyr7X3DBBYk9mzRpUl5enni43/3ud4kdzjzzzNj3Uc0rsivmaNjhOUnvFQSAWCwmaABg71U1PthJPXv2TJo8LxaL3XHHHYl9kr7Ax23cuDHxYfgQwp133hnftGrVqqSjDB06tOoekr7mtW3bNt7+73//O+kbb/v27bc5YeRll12WdKA5c+ZUbp01a1bS1pUrVyYOb9myZeLWp59+OqozENvWl+qmTZvOnTu36n7iXnzxxaT+M2fOTOzQo0ePxK3jxo37rl1VVc0rEttlQcP2z0l6ryAAxEwGCQDfS3whwMLCwqTvWiGEv//974lve/XqVXV4vXr1unfvntjyv//7v/EXb775ZlLnAQMGVN3D5ZdfflyCzMzMWCwWQnjjjTfKysoSe959991J6zLE/frXv0761bqyhhBC586dk2a4nDJlSuXrjz76KHFGzKysrPPOO6/ybTXPwDb94Q9/OOGEE75ra35+ftI6C4mPFWzcuDHxrGZlZSXdAbF91bwiu872z8medgUB2Avtl+4CAKAmicVigwYNmj179sMPP5ydnZ3YPnv27MSec+fOvemmm6ruIWnpispp+ZLWzmzWrNnRRx9ddfiJJ564cOHCqu1z5sxJfJuZmXnOOeds8yMcddRRxx133D/+8Y9tjs3IyOjXr99vf/vbypYpU6Zcd9118ddJsy326tWrctHH6p+BqnYYDWRlZf34xz9OnEZh0qRJ9913X/z19OnTS0tLKzfl5+fn5uZuZ29JqnlFdpEdnpM96goCsHcSNADA91NRUfHkk09mZGSMGTOmsvHrr7/esmVLYrfCwsKk9Q62adOmTVu2bMnOzi4uLk5sb9Gixfeq6ssvv0x8e9hhhyXdtpDo8MMPTwwa/vWvfyVuTfqaOn369JKSkvi0i0nLIiauVlD9M7DNOrfzKeIuvfTSxKChqKhoyZIlRx55ZKj2ehPVvCK7yM6ckz3nCgKwd/LoBAB867jjjqv6kGFpaemnn3764IMPNmjQILHz2LFj33///cq369atS/m48aUK169fn9j4H//xH99rJxs2bEh8m7QcRpKk78xJxR9//PGJP91v2rQpfkd9WVlZ4k3ydevWPffcc79rJ9/Ldy3WWPlj+3Z069Yt6UmBl19+Of4i8UtygwYNevfu/b2qquYV2UV25pzsOVcQgL2ToAEAticzMzMvL+/GG29M/Ik4bubMmYndUj5ESUlJCKFevXqJjV999dX32knSQwGJKxRW9fnnnye+TcpQQpUf/+MP+b/zzjsbN26sbDznnHMSa67+GUhNRkZG//79E1vi0zR88MEHiXf4n3/++Tk5Od9rz9W8IulVg64gALWPoAEAdkrib79xy5Ytq3x94IEHJm393//9352cmblVq1YhhEaNGiUOr7rkwfYlTU65fPny8vLy7+q8ZMmS7YwNIfTr1y/x7eTJk8N277oPUZyBlF166aWJb996661169YlzoAYQrjkkku+726reUWq2tWTRCaqWVcQgFpG0AAAO6V58+ZJLYm3i2dnZyetGrj9ewqqOvbYYxPfrl69OmnKvbh58+Z1SdC9e/f419dOnToldisrK4t/t6zqk08+WbRoUWJL1SUMjj766OOPP77y7dKlSz/66KPEr6n169fPz89PHFL9M5CyY445JvEjlJeXT5kyJfG5iQMPPPDMM8/8vrut5hWpKmkejUpffPHF961th2rWFQSgljEZJACk6N///nfi2+7duz/99NOVbwsLC7f5K/qsWbMSV3lo0qRJvNupp56a2K2iouKhhx76/e9/nzR87Nix77zzTuXbTp06xdewPPXUUzMzMxNXuLzzzjvPPffcqitc3nnnnVu3bk1s2eaX8IsvvjhxEopnnnnmvffeq3zbp0+fqk8iVPMMVMell16auEjEn/70p7feeqvybUFBwX77fe//56nmFQkhHHTQQYk9582bt3Xr1qRKPvvss9dff/371rYzatYVBKBW2ck74gCg9jnggAMS/03c5mSQlao+hZ6fn5/YYerUqYlbMzMzX3rppaSdfPLJJ0lfPkeOHFm5tUOHDombsrKyXnjhhcThM2fOTPqa+pvf/KZy6+WXX55U4UUXXbRp06bKDuXl5bfeemtSn+OOO66ioqLq512+fHliSFG3bt3EUVU/WiRnYODAgYmbOnfu/F2XI8nnn3++nbUY3nzzzZ3cT5JqXpH//M//TKrkV7/6VXl5eWWHf/zjH0mHCCF069Yt8RApn5O0XEEAiMViGbHd+LggAOxRGjZsmLiywHHHHbdw4cLv6lxaWhpfILDSmWeeOW3atMSWE044Yf78+ZVvMzIyBg0a9MMf/vCYY45Zu3btq6+++tBDDyUesXnz5p988knluoDPP/980qP1GRkZffv2PeWUU+rXrz937txx48aVlpZWbm3UqNHixYubNm0af/vhhx+2b98+sUMI4YgjjsjPz2/fvv2SJUtee+21xJ/94/785z9feOGF2/zIJ5988qxZs6q25+bmfvHFF0lnI5IzMGjQoMcff7xya+fOnd9+++1t1lbV2WefnTQHQVzLli2TvnLvvGpekSeffPLqq69O2ufRRx994okn7rPPPh999NHs2bOr/p9Yt27d3nzzzcq31Tknu/8KAkAI7mgAYC/2ve5oqKioSPo39OSTT07q849//GPnv3HVrVv3tddeS9rDBRdcsJPDMzIyJk+enDT8kUce2cnhcddcc812PvIf/vCHbY4aMGDAdw2p5hlI+df7WCyWeM9/oiFDhuz8TqqqzhVZt25d1Yk2q0pa3iKqOxpi6biCABCLxUwGCQA7JSMjIymY+PDDD5P6tGvX7rnnntuZ72n777//q6++etZZZyW1jxs37rTTTtuZeu64446kyfxCCD/96U/vueeenfz1/tJLL3344Ye30+HHP/7xNp9HSFqtIFH1z0DK+vbtm/R0QFw1pw+ozhVp2LDhiBEjtj8qPz+/oKAg9fq2q2ZdQQBqDUEDAOysE088MfHt2rVr77333qQ+559//uuvv151HYdK++6778UXX/zuu+9269at6tbc3NzXXnttyJAh2/mmd8wxxxQWFg4bNmybW3/961+//PLLxxxzzHY+SLNmzZ544on//u//rlOnzna6NW3atHv37kmNjRo12v4KDtU8AymrX7/++eefn9R4zDHHtG/fvjq7reYVGTBgwIgRI7aZgIQQfvSjH02YMGE7s0tUU826ggDUGladAICddemllyZNynD77bf/+te/Tup20kknvffee5MnT540adLMmTPXrFnzzTff5OXlHXHEEW3atLnmmmtatWq1naPUqVPnt7/97eDBgydMmPDqq69+9NFHX375ZSwWO/DAA0844YTevXtfccUV219D4ZxzzunVq9eUKVOmTJkSL+Crr75q0KDBQQcddOKJJ5599tkXXnjhTt4e369fv+nTpye2XHDBBZmZmdsfVc0zkLJLL7302WefTWyJZDWE6lyRjIyMX/ziFz/60Y9Gjhy5ePHioqKidevWNW3atFOnTldcccU555xT/fK2r2ZdQQBqB5NBAgC1xNatW3NychIX71yyZMkRRxyRxpIAYC/k0QkAoJZYs2ZNYspw0kknSRkAYPcTNAAAtcRjjz2W+Pbiiy9OVyUAsDfz6AQAUIN99dVXDRs2/Pzzz0ePHn3vvfdW3tGw3377rVy5slmzZuktDwD2QiaDBABqsMsvv3zq1KmJT0zE9e7dW8oAAGnh0QkAoGarmjLss88+t99+e1qKAQAEDQBArbLffvuNGjXqhBNOSHchALCX8ugEAFCDNWzYsE6dOiGEgw466LDDDuvevfull1569NFHp7suANh7mQwSAAAAiIxHJwAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMjsl+4CiN7KlSufeOKJ8vLydBcCAACwt6tXr94tt9xSt27ddBey+wgaaqFHHnlkxIgR6a4CAACAEEI4+uijCwoK0l3F7iNoqIXKyspCCL179+7WrVu6awEAANh7Pf/88/Pnzy8tLU13IbuVoKHWOuOMM2666aZ0VwEAALD3WrRo0fz589Ndxe5mMkgAAAAgMoIGAAAAIDKCBgAAACAyggYAAAAgMoIGANJs6NChBQUFFRUV6S4EAIAICBoASLPx48dPnDixuLg43YUAABABQQMAaRaLxSr/AgBQ0wkaAAAAgMgIGgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoAAACAyOyX7gIA2Nvl5eWVlZXl5uamuxAAACIgaAAgzWbMmFFSUpKdnZ3uQgAAiICgAYA0y8nJycnJSXcVAABEwxwNAAAAQGQEDQAAAEBkBA0AAABAZAQNAAAAQGQEDQCk2dChQwsKCioqKtJdCAAAERA0AJBm48ePnzhxYnFxcboLAQAgAoIGANIsFotV/gUAoKYTNAAAAACRETQAAAAAkRE0AAAAAJERNAAAAACRETQAAAAAkRE0AAAAAJHZL90FALC3y8vLKysry83NTXchAABEQNAAQJrNmDGjpKQkOzs73YUAABABQQMAaZaTk5OTk5PuKgAAiIY5GgAAAIDICBoAAACAyAgaAAAAgMgIGgAAAIDICBoASLOhQ4cWFBRUVFSkuxAAACIgaAAgzcaPHz9x4sTi4uJ0FwIAQAQEDQCkWSwWq/wLAEBNJ2gAAAAAIiNoAAAAACIjaAAAAAAiI2gAAAAAIiNoAAAAACIjaAAAAAAis1+6CwBgb5eXl1dWVpabm5vuQgAAiICgAYA0mzFjRklJSXZ2droLAQAgAoKGHdi0adO6des2bdq0cePGrKysBg0aNG7cuEGDBumuC6D2yMnJycnJSXcVAABEQ9CwDV988cVf/vKXKVOmLF68eMWKFbFYLKlD8+bN27Ztm5+f37dv3xYtWqSlSAAAANgDmQzy/7F+/fobb7yxRYsW119//eTJk5cvX141ZQgh/POf/5w6deoNN9zQqlWrgQMHFhcX7/5SAQAAYA/kjob/s2zZsjPPPPPTTz+tbMnJyWnZsmWzZs3q1q2blZVVWlq6efPmNWvWrFy5ctOmTSGEsrKyJ554Ytq0aVOmTDn66KPTVzsAAADsEQQN3yotLT333HPjKUOzZs2uvfba8847r127dvvuu2/VzrFYrKioqLCwcPTo0R9//PGnn37at2/fuXPnesYYAACAvZxHJ741duzYxYsXhxB69+5dVFQ0bNiwDh06bDNlCCFkZGS0adPmlltuWbhw4fXXXx9CKCoqGjNmzG6tGKC2GDp0aEFBQUVFRboLAQAgAoKGbz333HMhhGbNmr3wwgs7v5Z7nTp1Ro0a1aVLlxDChAkTdmF9ALXX+PHjJ06caL4bAIDaQdDwraKiohDCeeed930ff8jIyOjXr18IYcmSJbukMoDaLj7t7jYn3wUAoMYRNHxr8+bNIYQGDRqkMPaAAw4IIcSnhwQAAIC9maDhWy1btgwhzJkzJ4Wx8VEtWrSIuCYAAACoaQQN38rPzw8h/P3vf3/hhRe+18D33ntv3LhxIYQePXrsksoAAACg5hA0fOtnP/tZfHaG/v37Dxky5PPPP9/hkPXr148YMaJ79+6bN2/OzMwcNGjQri8TAAAA9mj7pbuAPUWrVq0eeuih6667buvWrffff/+DDz540kkn/eAHP2jVqtXBBx9ct27drKyssrKyzZs3r1mzZvny5XPmzJk1a9aWLVviw++777527dql9yMAAABA2gka/s8111xTr169G264Ye3atVu3bp01a9asWbN2OKpBgwajRo0aMGDAbqgQAAAA9nAenfh/XHLJJUuWLLn77rvbtGmzw86tW7e+/fbbly1bJmUAqI68vLxGjRrl5uamuxAAACLgjoZkDRs2vP3222+//faVK1cuWrTogw8+WLt27caNGzdv3pydnV2/fv0mTZq0bt26bdu2hx56aLqLBagNZsyYUVJSkp2dne5CAACIgKDhO7Vs2bJly5bx1SjSYtKkSc8880wKA2fPnh1CWLFiRdQVAewSOTk58el4AQCoBQQNe66nnnrqxRdfTHn4zJkzIywGAAAAdoag4Xtbvnz5ggULNmzY0LJlyy5dutSpU2cXHWj06NH9+/cvLy//vgN/+ctfLlu27OCDD94VVQEAAMB2CBqSrV+//p133nnvvffWrl171FFHXXLJJZXzkxUXF19//fUTJ06MxWLxltzc3BEjRlx77bW7opLGjRtfcMEFKQy87777li1blpGREXlJAAAAsH2Chv/H5MmTr7zyyi+//LKy5fbbb58yZcpJJ51UXFx8xhlnLFy4MLH/hg0brrvuuldfffWZZ57xgDEAAABY3vL/PPnkk717905M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O3du27Zt77rrrjfeeCO+6YsvvpgzZ859993XsWPH1atXhxDy8/PPPvvsqCoGAAAA9lj7pTxyzJgx69evf/nll9etWzds2LBhw4bF25Myhc6dOz/77LPVKREAAACoKVK8oyGEkJWVNWnSpJdeeumII47YZodmzZqNGzdu5syZubm5KR8FgFovLy+vUaNG/rEAAKgdUr+jIa5Pnz49e/acOnXqm2++uWrVqg0bNjRo0KB58+Zdu3bNz8+vV69eJFUCUIvNmDGjpKQkOzs73YUAABCB6gYNIYQ6der06dOnT58+1d8VAHuhnJycnJycdFcBAEA0Un90AgAAACBJBHc0JCkvL3/qqadmz57dsGHDbt269ezZc9999438KAAAAMAeqFpBwyuvvPL4449/+OGHn3zySbyltLS0R48eb731VmWfXr16Pf/88w0aNKhWmQAAAEBNkPqjE3fffXefPn0mT578xRdfVDaOGDEiMWUIIRQWFl500UWpFwgAAADUHCkGDUVFRXfddVcsFgshNG7cON5YUVHxhz/8IYTQokWLv/3tbzNnzjzllFNCCIWFhe+9915EBQNQ2wwdOrSgoKCioiLdhQAAEIEUg4bf/e538f8jHDNmzPLly+ONs2bN+vLLL0MII0aM6NGjR9euXV9++eX69euHEB577LFo6gWg1hk/fvzEiROLi4vTXQgAABFIMWhYsGBBCOG00067+uqrKxunTZsWQsjKyqpc6jI3N/fcc88NIXz00UfVrRSAWip+f1z8LwAANV2KQcOnn34aQjjppJMSG995550QQqdOnerVq1fZePjhh1f2BwAAAGq3FIOGrVu3hhBycnIqWyoqKt59990QQteuXRN7xp+w2LBhQ+o1AgAAADVEikFD/D6FytkZQghz5syJpwmnnnpqYs8lS5aEEA455JCUSwQAAABqihSDhqOOOiqE8NJLL1XeqjBu3LgQQnZ29hlnnFHZrbi4+NVXXw0hHHroodWtFAAAANjjpRg0DBw4MISwYcOGHj16PP3003fcccfYsWNDCGeccUbdunXjfZYtW3bFFVd8/fXXIYSzzjorooIBAACAPdd+qQ3r3r37WWedNW3atLlz5w4YMCDemJGRcccdd8RfP/jggzfffHP8dZMmTQYNGlT9WgEAAIA9XIp3NIQQ/vrXv/bt2/f/drTPPvfcc88PfvCD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Hz9x4sQ9f9pgAAB2RoqTQT7wwAPdunVbvHjxTTfdNGrUqIyMjGjL2v1atWr10EMPXXfddVu3br3//vsffPDBk0466Qc/+EGrVq0OPvjgunXrZmVllZWVbd68ec2aNcuXL58zZ86sWbO2bNkSH37fffe1a9cuvR8BoIaKxWKVfwEAqOlSDBpOPPHEv/71r5dddtkjjzwyZ86cO++8s1OnTgcddFC0xe1m11xzTb169W644Ya1a9du3bp11qxZs2bN2uGoBg0ajBo1asCAAbuhQgAAANjDpRg0nHvuuSGEQw45ZN26dbNnzz7nnHNCCPXr18/Ozv6uIV9++WVqx9qdLrnkkl69ej388MMTJkz44IMPtt+5devWP/7xjwcPHty4cePdUx4AAADs4VIMGl555ZWqjRs3bty4cWP16km/hg0b3n777bfffvvKlSsXLVr0wQcfrF27duPGjZs3b87Ozq5fv36TJk1at27dtm3bQw89dJdW8s033+ww7Nim+FKdAAAAsPulGDR069Yt2jr2QC1btmzZsmV8NYq0uOqqq5577rmUh3/22WcRFgMAAAA7I8Wg4c0334y2Dqrq2bPnJ598ksJ6b0VFRZs3b95///13RVUAAACwHSkGDXut1atXz507d926dY0aNTruuOMOP/zwXXesyy+//PLLL09hYMeOHefNm1e/fv3ISwIAAIDtEzQkW7BgwcSJE5csWTJhwoTE9k8//XTgwIHTpk1LbOzQocPjjz9+0kkn7d4aAWqVvLy8srKy3NzcdBcCAEAEogkaiouL582b9+WXX5aUlJx33nmNGzeOxWIZGRmR7Hy3qaiouOeee+6+++6KiorjjjsucdNTTz3105/+tOoki/Pnz+/atetNN900YsSIGvd5AfYQM2bMKCkp2c66RQAA1CDVDRomT558xx13zJ8/PxaLxVs6duzYuHHjIUOGrF69+uqrr+7Ro0e1i9xNBg0aNHr06Pjr/fb7vzNTVFR03XXXlZSUhBCaNm166qmnHnnkkf/617/mzJnz/vvvl5eX/+53vzv88MMHDhyYnroBaricnJycnJx0VwEAQDT2SXlkLBa79tpre/fuPW/evMqUodKWLVsmTJhw5pln3nbbbVW37oHefvvtMWPGhBDq16//+OOPJ852ecUVV8RThhtvvPGTTz55/vnn77333tGjR8+fP//5559v1KhRCOEXv/jFihUr0lU8AAAA7CFSDxruvPPO+DfzjIyMU089dfDgwYlb8/Ly4o8SDB8+/NZbb61mlbvBQw89FH/c49VXX73uuusqZ1L8xz/+MXv27BDCOeec8+CDD9arVy9xVEFBwdixY0MIGzdufOCBB3Z/2QAAALBHSTFoWLZs2fDhw0MIzZs3nz59+uuvvz5y5MjEDjfffPPs2bObNWsWQhg5cuSe/2v/okWLQghnn312165dE9vnzJkTf/GLX/ximwP79u174oknhhD+9re/7eIaAQAAYE+XYtAwatSo8vLyEMLTTz99+umnb7NPp06dCgsLMzIySktL9/xf+z/99NMQQtIckCGEdevWxV+0bdv2u8bGg4ZVq1btsuoAAACgZkgxaHjrrbdCCKeccsoZZ5yxnW7t27fv1atXCOH9999P7UC7TZMmTUIIX3/9dVJ7fAqGEMKWLVu+a2yNmIQCYI81dOjQgoKCioqKdBcCAEAEUgwali5dGkLo0KHDDnu2b98+hPDxxx+ndqDdJl7n5MmTy8rKEtuPP/74+IvtZCXvvvtuCKFFixa7skCAWmv8+PETJ04sLi5OdyEAAEQgxaAh/vN+VlbWDntmZmaGEDZs2JDagXabK664IoTwz3/+c/DgwYl3KHTq1KlNmzYhhHvvvXebv7a98MIL8+bNCyGcddZZu6lWgNol/l9dd4cBANQOKQYNBx98cPj/J1DcvgULFoQQmjZtmtqBdpvzzz//1FNPDSE89thjZ599djw7iHviiScyMzPffvvtQYMGbdq0KXHUCy+8cN1114UQMjMzr7322t1cMwAAAOxp9kttWPfu3T/55JPp06cXFRUdc8wx39Vt4cKFhYWFIYRu3bqlWODuss8++zzzzDOnn3760qVLp02bNm3atGOOOebUU09t0aJF06ZNr7nmmkcffXT06NGFhYU//OEPW7du/c9//vPtt9+OPzQRQrj33nuPPfbY9H4EAAAASLsUg4Yrr7xy7NixpaWll1122aRJk+I3OCRZvXp1fn5+SUlJCKF///7VKnO3OOSQQ955550rrrhi8uTJIYSioqKioqKkPqtWrXryyScTW3Jych544IGBAwfuvkIBAABgT5XioxNdu3a97LLLQghz585t27btXXfd9cYbb8Q3ffHFF3PmzLnvvvs6duy4evXqEEJ+fv7ZZ58dVcW71IEHHvjKK6/MmDGjb9++devW3X7nAw444Kqrrvrwww+lDAAAABCX4h0NIYQxY8asX7/+5ZdfXrdu3bBhw4YNGxZvT8oUOnfu/Oyzz1anxN3v9NNPP/3007/55pv58+d/+OGHy5Yt27hx4+bNm8vLy+vWrVu/fv28vLw2bdqcdNJJ8akuAQAAgLjUg4asrKxJkyZNmjTplltu+eSTT6p2aNas2W9+85sBAwbss0+K902kV05OTteuXbt27ZruQgAAAKDGSD1oiOvTp0/Pnj2nTp365ptvrlq1asOGDQ0aNGjevHnXrl3z8/Pr1asXSZUA1GJ5eXllZWW5ubnpLgQAgAhUN2gIIdSpU6dPnz59+vSp/q4A2AvNmDGjpKQkOzs73YUAABCBCIIGAKiOnJycnJycdFcBAEA0auTsCQAAAMCeKcU7Gp588smd7JmTk1O3bt3GjRsfddRR//Ef/5Ha4QAAAIAaIcWg4eqrr05hVMuWLS+66KIhQ4YceOCBqR0XAAAA2JPt1kcnVq5cef/997du3fr111/fnccFAAAAdo8U72goLi5etWpVr1691qxZE0Jo3bp1jx49DjnkkKZNm3755ZcrV678+9//vnDhwhBC//79f/jDH27YsGHJkiV//vOfP//887Vr15533nmLFy9u3rx5lB8FgJpp6NChS5cunTBhwj77mDkIAKDGSzFoaNCgwYABA9asWdOkSZM//vGP+fn5GRkZSX2mTp16xRVXPPfcc127dv35z38eQvj9738/bty4gQMHbtiwYfjw4Y888kh1yweg5hs/fvyaNWsefvjhgw46KN21AABQXSn+dvToo48uWLAgKyvrpZdeOuecc6qmDCGEnj17vvTSS5mZmTfccMPMmTNDCJmZmdddd93gwYNDCC+++GJ16gag1ojFYpV/AQCo6VIMGv70pz+FELp169alS5ftdPvBD35w2mmnlZeX//a3v61s7NevXwhhzZo1K1asSO3oAAAAwJ4pxaDh448/DiF07Nhxhz07deoUQnj33XcrW1q3bh1/8a9//Su1owMAAAB7phSDhvgNrp9//vkOe8b7bNy4MWlsCKFu3bqpHR0AAADYM6UYNBx11FEhhNdff72kpGQ73UpLS+MrWcb7xy1atCiEkJGR0apVq9SODgAAAOyZUgwa4vMsrFy5csCAAd81fVcs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T8XE/Px8zcMAQP2Jjo4uKSlxdXXVOwgAAAA0YDCbzSqmLV26dPbs2S4uLj///HOvXr1uNWzv3r0DBgwoLy//5Zdf+vTpo+x8+eWXP/zww9atW587d05l6oZh/PjxGzZsUD29W7ducXFxGuYBAAAAANyWSZMmffHFF2vXrn3yySf1zmI5Ks9o+Pe//y0iffv2raZlEJGePXsOGDBg+/bt//d//7dlyxZl54QJEz788MPMzMxTp07V90kBNm38+PGXLl1SMXHv3r35+flNmzbVPBIAAAAAANVTWTQcO3ZMRLp161bjyO7du2/fvn3v3r1Vezp37qxsXLhwwTqLhvLy8j///DMjI6Nly5YdO3as8RYMKSkpBQUFIhIcHKxhjHHjxo0bN07FxG7duu3fv9/d3V3DMAAAAAAA1IaDumnKBRe1ufZBGaP8PfzauSLi5uam7uj1x2w2L1u2rFWrVj169BgzZkzv3r1btGgxbty4hISEamY988wz995777333muxnAAAAAAAWCeVRUPHjh1F5JdffikpKalmWGlp6S+//FI1XpGYmCgiBoMhICBA3dHrSXZ29tChQ2fOnHnx4sWqnWazeePGjT169Ni4caOO2QAAAAAAsAkqi4YJEyaISHp6+uTJk291O0mz2fz000+npqaKyOOPP67sLC0tffPNN0Wkc+fORqNR3dHryezZs7dv3y4iBoPh/vvvnz59+pNPPtmmTRsRKSkpGT9+/KZNm/TOCAB2KCwsbPz48ZWVlXoHAQAAgAZUFg0vvPBChw4dRGTdunV33333qlWr0tPTy8vLRaS8vPz06dMRERFBQUFffPGFiHTq1GnWrFkismLFivvvv3/Hjh0i8r//+7+afRNa+O2335S03t7eP/744759+z755JO1a9empKQsWrTIYDBUVlZOmzYtMzNT76QAYG8iIiI2bNiQnZ2tdxAAAABoQOXNII1G4w8//BASEnL69Onk5ORp06aJiIODQ7NmzS5dulRRUVE1sn379tu2bVOejv7xxx8rNzsYMmTIE088oUV+zaxatUrZWLt2bUhISNV+Z2fnsLCwxo0bz5o1Kycn5/nnn//mm290yggA9kk5M07d45YBAABgbVSe0SAiHTp0OHTo0Lx580wmk7KnsrIyOzv72pbhL3/5S3x8fPv27av2uLu7v/zyy1u3bnVwUH/o+nDk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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdaXxV1b0//hUIMwgaDaCkEgVjlYL+ACsFqiUoMgsVq4AvxWtFrXXsT/3dogiovddWqSNOkbbXq2lVRCuDDGkVnBCIyqCoyFDibIIMGkA4/wfnf+O5h9GTwGEf3u8Hvs5eZ629v2fvB/jJXnuvrFgsFgAAAID9W610FwAAAADsngAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwA0XDwwQdn7bGGDRvm5+efc845U6ZMSXfhAAA1IysWi6W7BgDYvYMPPnjt2rUpDBw2bNg999xz8MEH13hJAAD7kgAPQDSkHOBDCG3btl20aFG9evVqtiQAgH3JFHoAMt/777//+9//Pt1VAABUizvwAERD0h34+vXrH3vssUl9YrHYF1988fHHH2/bti3pqwYNGqxateqwww7b64UCAOwd2ekuAABS0aZNm9LS0h1+tWnTpgceeOC6667bvHlzVeM333zz5ptvnnbaafuqQACAGmYKPQCZpl69eldeeeWVV16Z1P7OO++kpR4AgBohwAOQmXr16pXUsnz58p11/sc//nHllVeecMIJzZs3r1ev3hFHHHHSSSf99re/3dlN/iQff/zx+PHj+/Tpc9RRRzVp0qRBgwZ5eXm9e/e+4447Nm7cuNvhW7Zseeqppy6++OIf/ehHzZs3r1u37mGHHXbssccOHTr0kUceWbdu3fZDnn/++aSV8x577LEd7vzFF19M6vnggw/WyBm49NJLE3fbpUuXeHt5efl1113XoUOHBg0axIffdtttSTU89NBDO9znxo0b69Wrl9jztttu2+0J3F4KV6RLly6Jx7300kt32O2Xv/xlYrfu3bundk72hysIQPTEACAKmjVrlvjvV7t27Xbd/6233kr6J2/MmDHbd1u6dOmpp566i38ohw4d+sknn+zsKJs3b77uuusaNGiws+FHHHHEY489tm3btp3t4YknnmjduvUuCmjWrNktt9zy7bffJh03aWG8c845Z4f7/+1vf5vYLTs7+7PPPquRM3DJJZckdjv55JNjsdi8efMSC5s/f34sFlu5cmVWVlZi5759++6w2meffTbp6MuXL9/ZqduhlK/IySefnNjtkksu2eH+L7roosRu3bp1S+2c7A9XEIDIcQcegMz06aefJrUceeSRSS1z5879yU9+8s9//nMX+3n88cd/8pOfrFixYvuv1q1bd/rpp99+++3ffPPNzoaXlZUNHz783/7t37b/KhaLXXXVVeeee+7KlSt3UcDatWtHjRrVp0+fxFvxderU+fnPf57Y7YUXXti6dev2w2fMmJG42aNHj8Q3+VXzDCR57733evXqVVFRkdR+5JFHduvWLbFl9uzZO7wTPm3atMTNk08++aijjtrtcatU84rsDTs7J/vnFQRgPyfAA5CZkqJg3bp1k95gV1ZWNnDgwD1ZW/7DDz8844wzts+EF1100a6DU5WJEyduP0H61ltvveuuu/ZkeAhhxowZ559/fmLLueeem7hZUVHx6quvJo0qLy9fsGBBYssvfvGLqs/VPwNJrrnmmu2Tatzw4cMTNysrK2fOnLl9t6SrlvQbd6uaV2Rv2MU52Q+vIAD7OQEegEyzZcuWe+655/77709sHDZs2OGHH57Ycumll5aXlye2XHTRRdOnT1+0aNGkSZN+9rOfJX713nvv3XjjjYktTz/99JNPPpnYUq9evQEDBvzHf/zHhAkTfvnLX9apUyfpcKtWraraXLBgwejRo5Mqb9Omza9+9asHH3zw+uuvP+mkk5K+nTx58sSJE6s2Tz311BYtWiR2mDJlStKQ2bNnJ66oV6dOnUGDBtXUGUiyePHi7QuoMmTIkLp16ya2PPfcc0l9li5dmniKateuffbZZ+/iiEmqeUX2hl2fk/3tCgIQAemeww8AeyTpGfj69et32k7Hjh2PPPLI7OzkRVI7duxYUVGRuLelS5cmPZV99913Jx3xl7/8ZWKHhg0bJu4k6ZHpBg0azJgxI3H4Sy+9VLt27cQ+o0ePrvp28ODBSUUOGzbs66+/ruqwbdu2W265pVat//Wn9mOOOWbr1q1VfX79618nftu+ffukn5D0wHbik+fVPwNJz3vHFRQU/PWvf122bNmmTZsqKioqKyur+icmzxDCYYcdlvhbYrHYH/7wh8QOPXv2jH0f1bwie+MZ+N2ek/ReQQAiR4AHIBqSAvweysrKOuecc8rLy5P2dt111yUFp6QwGYvF1q9ff+ihh+4wIG3/Qvv//M//3L7mCy+8MLFPx44d4+3l5eVJybxTp047/NVJASyEMGfOnKpvX3nllaRvV69enTj8Bz/4QeK3f/nLX2rqDMR2FFZPPvnkTZs27fCHxGKxp59+Oqn/yy+/nNihsLAw8dtHH310Z7vaXjWvSGyvBfhdn5P0XkEAIscUegAyVlZW1n333ffEE08kve47hDBnzpzEzf79+ycl6hBC48aNTznllMSWkpKS+Ie5c+cmtteqVWvYsGHbF3DuuedmJ3j//fdjsVgI4cUXX0ycFx1CGDt27A5/wr//+78nTfx+6aWXqj6ffPLJSW/mmzp1atXnZcuWrV69umqzXr16AwcOrNqs5hnYobvuuitpnnyivn37Jv0VJnEW/YYNGxJLqlev3vaTFHahmldk79n1OdnfriAA+7nkSYYAkDFisdhll13297///YknnmjatGlie9KLwRYuXHj11Vdvv4c1a9Ykbla9Yyxpjbo2bdocccQR2w/v2bPnli1btm9PWpq7bt26269aH9e6det27dol9k+sPD6/4D//8z+rWqZOnTpy5Mj456S3xPXu3fuggw6Kf67+Gdhew4YNt39uP1G9evWGDBny8MMPV7U899xz//Ef/xH/PHv27M2bN1d91adPn8RLtlvVvCJ7yW7PyX51BQHY/wnwAGS4adOmXXjhhYnzt7/66qvErBjvk/T+8x369NNPN23aVK9evS+//DKxPTc393uV9MUX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D95www3FxcWzZs364IMPvvjii1gsduihh5544ol9+vS58MIL69Sps4s9DBs27Oyzz37mmWdmzJjx2muvffbZZxUVFQcddNBhhx3WsWPHnj17DhkyZGeRMsk555wze/bsxJbBgwfv+ujVPwMpGz58eHFxcWJLdW6/V6nmFbn88ssHDhx45513Ll68+J133vnyyy9btmzZsWPH4cOHx//i0Llz5w0bNlT1T1q+rpqidQUB2Pe8xA4ASIMtW7Y0atQoccG/999/v02bNmksCQD2c6bQAwBp8Omnnyam95NOOkl6B4BdE+ABgDRIeul6asu/A8ABxRR6AGAfWbt2bbNmzcrKyu65557f//7327Zti7dnZ2evXr26ZcuW6S0PAPZzXmIHAOwj55133gsvvJA4cz5u8ODB0jsA7JYp9ADAvrN9eq9fv/4tt9ySlmIAIFoEeAAgbRo1ajRlypS2bdumuxAAiABT6AGAfeTggw+uW7duLBZr1qxZ8+bN+/btO2LEiJpdSh0AMpiX2AEAAEAEmEIPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPAAAAESDAAwAAQARkp7sAat7q1asffPDBrVu3prsQAACAvaVRo0bXXnttw4YN013IviPAZ6D77rvv9ttvT3cVAAAAe1dBQcHZZ5+d7ir2HQE+A23ZsiWE0K9fv27duqW7FgAAgJr317/+tbS0dPPmzekuZJ8S4DNWjx49rr766nRXAQAAUPMWL15cWlqa7ir2NS+xAwAAgAgQ4AEAACACBHgAAACIAAEegBpQXl5eWFhYVFSU7kIAADKWAA9ADSgtLS0pKSkuLk53IQAAGUuAB6AGxGKxdJcAAJDhBHgAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAAACIAAEeAAAAIkCAB6AG5OXlZWdn5+fnp7sQAICMlZ3uAgDIBAUFBWVlZTk5OekuBAAgYwnwANSM3NzcdJcAAJDJTKEHAACACBDgAQAAIAIEeAAAAIgAAR4AAAAiQIAHoAaUl5cXFhYWFRWluxAAgIwlwANQA0pLS0tKSoqLi9NdCABAxhLgAagBsVgs3SUAAGQ4AR4AAAAiQIAHAACACBDgAQAAIAIEeAAAAIgAAR4AAAAiQIAHAACACBDgAagBeXl52dnZ+fn56S4EACBjZae7AAAyQUFBQVlZWU5OTroLAQDIWAI8ADUjNzc33SUAAGQyU+gBAAAgAgR4AAAAiAABHgAAACJAgAcAAIAIEOABqAHl5eWFhYVFRUXpLgQAIGMJ8ADUgNLS0pKSkuLi4nQXAgCQsQR4AGpALBZLdwkAABlOgAcAAIAIEOABAAAgAgR4AAAAiAABHgAAACJAgAcAAIAIEOABAAAgAgR4AGpAXl5ednZ2fn5+ugsBAMhY2ekuAIBMUFBQUFZWlpOTk+5CAAAylgAPQM3Izc1NdwkAAJnMFHoAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAakB5eXlhYWFRUVG6CwEAyFgCPAA1oLS0tKSkpLi4ON2FAABkLAEegBoQi8XSXQIAQIYT4AEAACACBHgAAACIAAEeAAAAIkCABwAAgAgQ4AEAACACBHgAAACIgOx0FxABX3755dq1azds2PDtt982adLkoIMOatGiRbqLAti/5OXlZWdn5+fnp7sQAICMJcDv2KJFi5555pkZM2YsXbq0oqIi6dsmTZocd9xxp59++pAhQ370ox+lpUKA/UpBQUFZWVlOTk66CwEAyFgCfLIPPvjg2muvfe6553bRZ/369a+//vrrr78+bty4M888884773TTCSA3NzfdJQAAZDIB/n959dVX+/XrV15eXtVyyCGHtG7dOicnp2HDhiGEb775pry8fNWqVZ9//nm8w+TJk19++eVp06Z17NgxPUUDAABwABDgv1NRUXHWWWfF03vbtm2vuOKKvn377uzWellZ2cyZM++///433njj888///nPf75o0aImTZrs25IBAAA4UHgL/XcmTJjw0UcfhRCGDRv29ttvX3755buYGH/EEUdccMEFr7/++o033hhCWLVq1QMPPLDvagUAAOAAI8B/Z9KkSSGEvLy8iRMn1q9ff0+GZGVljR079tRTTw0hPPXUU3u1PAAAAA5kAvx3VqxYEULo169fnTp1vtfAwYMHhxCWL1++V8oCiILy8vLCwsKioqJ0FwIAkLEE+O98/fXXIYQUnmNv2rRp1XCAA1NpaWlJSUlxcXG6CwEAyFgC/HcOP/zwEEJpaen3Hfjmm29WDQc4MMVisXSXAACQ4QT475xyyikhhFmzZr3wwgt7Puqdd9555JFHqoYDAADA3iDAf2fkyJG1atWKxWJnnnnm7bffvn79+l3337Rp08SJE7t3775+/fpatWqNHDly39QJAADAAcg68N/58Y9/fP311//ud7+rrKy8/vrrx40b99Of/rRTp06tW7c+9NBDGzRokJWVVVlZWV5evmrVqoULF7744ovxReNDCDfccMNJJ52U3voBAADIYAL8/3LbbbcddNBBN91005YtWzZs2DB16tSpU6fuekidOnXGjh17ww037JsKAQAAODCZQp/shhtuWLZs2SWXXNK8efNd98zNzR05cuSyZcukdwAAAPY2d+B3ID8/f8KECffdd9+iRYuWLFny/vvvf/XVVxs3bozFYo0bN27atGnbtm2PO+649u3b16q1F/8Csnbt2vnz56cwcOXKlSGEbdu21XBBAAAApI8Av1O1atXq0KFDhw4d0lXAL3/5y6eeeirl4ZMmTbr22mtrsB6AXcjLy8vOzs7Pz093IQAAGUuA33+de+65X331VQpLK7/++uvr169v1KjR3qgKYIcKCgrKyspycnLSXQgAQMYS4L+38vLyBQsWfPTRR82bN+/atWuTJk320oEGDx48ePDgFAZ27Nhx4cKFDRs2rPGSAHYhNzc33SUAAGQyAX4HPvnkkzlz5sybN69+/fqnn3569+7d4+2xWOyWW265/fbbN2zYEG+pV6/eddddN3r06Nq1a6evXgAAADKfAJ/sv/7rvy655JKvv/46vnnLLbdceuml9913X1ZW1pVXXnnPPfckdt60adO4cePmzJnz9NNPH3LIIemoFwAAgAOCAP+//PGPf7z66quTGidMmHD00Ucff/zx8fSek5NTWFjYpk2bJUuWzJ49e8OGDf/85z9HjRp1//33p6NkAAAADggC/Hc+++yz0aNHhxBq1ap1ySWXnHrqqZ999tkDDzywePHiUaNGxZeF79at21NPPVW1RPx77703aNCgpUuXPvTQQ7/61a+OP/74dP4AAAAAMtdeXMY8cu68885169aFEB577LH77rtvyJAhv/rVr15//fUTTzyxsrJy1apV9evXf+KJJ6rSewjhmGOO+fOf/5yVlbV169aHHnoofbUDpFl5eXlhYWFRUVG6CwEAyFgC/HcWLFgQQjjxxBPPPffcqsaGDRvGb8uHEM4666xWrVoljerUqVO3bt1CCO+8886+qhRgv1NaWlpSUlJcXJzuQgAAMpYA/5133303hHDSSScltXfu3Dn+4bjjjtvhwHh7fDjAgSkWi6W7BACADCfAf+err74KITRu3Dip/aCDDop/2NmS7wcffHDVcAAAANgbBPjvFBQUhBA++OCDpPb3338//mH58uU7HBjvEB8OAAAAe4MA/51jjz02hDB9+vTVq1cntle9nW769Olbt25NGrVhw4aXXnqpajgAAADsDQL8d0aMGBFC2LRp04ABA5YsWRJCqKys/P3vf//www/HO7z77rt333130qhRo0Z9/vnnIYTCwsJ9Wy8AAAAHEOvAf6dHjx79+/f/+9///tZbb7Vr1y4nJ2fdunVbtmyJf9WhQ4fx48dfc80177777rBhw4466qilS5fef//9zz77bAihQ4cO5513Xrp/AQAAABlLgP9fHn744SFDhsyZMyeE8OWXX8Ybf/CDH/z5z39u2rTppEmTVq1a9dBDDyUt+V63bt277rqrVi3TGQAAANhbZM7/pXnz5iUlJWPHjj366KNr1arVtGnTc845Z+7cua1atWrSpElJScmRRx6ZNCQ/P3/u3LmnnHJKWgoG2E/k5eVlZ2fn5+enuxAAgIzlDnyy7OzsG2+88cYbb9y2bVvSTfWqafMvvvjixx9/3Lx58x49elx00UVNmzZNV7UA+4mCgoKysrKcnJx0FwIAkLEE+J3a4ZT4hg0b/uY3v/nNb36z7+sB2M/l5uamuwQAgExmCj0AAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwANaC8vLywsLCoqCjdhQAAZCwBHoAaUFpaWlJSUlxcnO5CAAAylgAPQA2IxWLpLgEAIMMJ8AAAABABAjwAAABEgAAPAAAAESDAAwAAQAQI8AAAABABAjwAAABEgAAPQA3Iy8vLzs7Oz89PdyEAABkrO90FAJAJCgoKysrKcnJy0l0IAEDGEuABqBm5ubnpLgEAIJOZQg8AAAARIMADAABABAjwAAAAEAECPAAAAESAAA9ADSgvLy8sLCwqKkp3IStjRZ0AACAASURBVAAAGUuAB6AGlJaWlpSUFBcXp7sQAICMJcADUANisVi6SwAAyHACPAAAAESAAA8AAAARIMADAABABAjwAAAAEAECPAAAAESAAA8AAAARIMADUAPy8vKys7Pz8/PTXQgAQMbKTncBAGSCgoKCsrKynJycdBcCAJCxBHgAakZubm66SwAAyGSm0AMAAEAECPAAAAAQAQI8AAAARIAADwAAABEgwANQA8rLywsLC4uKitJdCABAxhLgAagBpaWlJSUlxcXF6S4EACBjpbiM3KpVq0IIhx9+eJ06dXbdc926dRUVFXXr1m3ZsmVqxwJg/xeLxdJdAgBAhkvxDnzr1q1bt269dOnS3fb829/+1rp1627duqV2IAAAACDsgyn0devWDSGUlZXt7QMBAABABtvTKfR//vOft2987rnn3nzzzV2M+uabbyZMmBBCqFevXgrFAQAAAHF7GuAvuOCC7RtvuummPRx+wgkn7GFPAAAAYHv74i30zZo1+93vfrcPDgQAAACZak/vwE+fPj1x84wzzggh3HfffUcfffSuBzZo0KBDhw5NmzZNrT4AAAAg7HmA79Wr1/aNXbt27dChQ43WA0Ak5eXlZWdn5+fnp7sQAICMleI68FdddVUI4bDDDqvRYgCIqoKCgrKyspycnHQXAgCQsVIM8OPHj0/crKioWLBgwWeffVZZWTlw4MCcnJxYLJaVlVUTFQIQDbm5uekuAQAgk6UY4KvMnDlz1KhR8+fP37ZtW7ylY8eOOTk5RUVFkydPHjlyZP/+/atdJAAAABzoqvUW+ssuu+z000+fN29eVXqvsnXr1ilTpgwYMOCqq66KxWLVOQoAAACQeoC/+eabJ0yYEELIyso67bTTRo0alfjtEUccUbdu3RDCXXfdde2111azSgAAADjApRjgV65cecstt4QQmjdvPmvWrBkzZowbNy6xQ79+/ZYtW9auXbsQwr333rtixYrq1woAAAAHrBQD/N13371169YQwqOPPtqjR48d9mnduvW0adPq1q27ZcuWpJfeAZBhysvLCwsLi4qK0l0IAEDGSjHAz507N4TQpUuXPn367KJbq1atBgwYEEJ48803UzsQAJFQWlpaUlJSXFyc7kIAADJWigF++fLlIYROnTrttuexxx4bQnjvvfdSOxAAkeB9pQAAe1uKAb6ysjKEUK9evd323Lx5cwhh3bp1qR0IAAAACCkH+JYtW4YQFi9evNueS5YsCSG0aNEitQMBAAAAIeUAf8opp4QQZs+eHc/nO/Puu+/OmjUrhNC1a9fUDgQAAACElAP8iBEjQghbtmw577zz1qxZs8M+H3300fnnn79p06YQwtChQ1MuEQAAAMhObVi3bt2GDh36+OOPl5aWtm/f/oorrqhaTG7NmjUff/zxvHnz7rjjjvij77169erdu3eNlQwAAAAHnhQDfAihqKiooqJi2rRpFRUVY8aMGTNmTLy9X79+id06d+5sVSEAAACophSn0IcQ6tevP3Xq1Keffjo/P3+HHZo3b/7II4+89tprzZo1S/koAERCXl5ednb2zv5FAACg+lK/Ax83ePDgvn37Tp8+fc6cOf/617/WrVvXpEmTww8/vEuXLn369GnSpEmNVAnAfq6goKCsrCwnJyfdhQAAZKzqBvgQQr169QYOHDhw4MDq7wqA6MrNzU13CQAAmSz1KfQAAADAPlMDd+CTxGKx//7v/3711VcbNGjQrVu3M844o379+jV+FAAAADigVCvAT506dcKECQsWLPjoo4/iLbFYrH///lOmTIlv3nHHHV27dn322Wc9FQkAAADVkfoU+nHjxvXr1+/555//+OOPqxofeeSRqvQe9/LLL3s8HgAAAKopxQD/7rvvjhkzJhaLhRAS767/8Y9/DCE0a9bsueeee+ONN3r37h1CePnll+fMmVMT1QKwnyovLy8sLCwqKkp3IQAAGSvFAP/73/9+69atIYQJEyZ8/vnn8cYPPvhg6dKlIYRrr722f//+nTp1evrppw8++OAQwkMPPVRDBQOwPyotLS0pKSkuLk53IQAAGSvFAP/222+HEH76059ecsklWVlZ8caZM2fGPwwaNCj+oUGDBv379w8hvP/++9WtFID9WHxOFgAAe0+KAf7DDz8MIfz4xz9ObHzttddCCIceeujxxx9f1di6desQwsqVK1OtEAAAAEg1wH/77bchhKT14V555ZUQQteuXRMbs7OzQwjr1q1LsUAAAAAg5QB/9NFHhxBWrFhR1bJixYoPPvgghPCzn/0ssWd8hblWrVqlXiMAAAAc8FIM8AUFBSGEZ599try8PN7y8MMPxz/07du3qtuWLVuee+65EEJeXl61ygQAAIADW4oB/pJLLgkhrF+//mc/+9mf//znW2+99Q9/+EMI4fjjj2/Tpk28z9KlS/v37x+/A9+jR48aKhgAAAAORNmpDTvllFN69er1wgsvvP322xdccEFV+7hx4+IfioqKLrroovjnpk2bXn755dWrEwAAAA5oKd6BDyFMmjTprLPOSmy58sorqxaQi7/lLoRw8MEHP/bYY02bNk35QADs//Ly8rKzs/Pz89NdCABAxkrxDnwIoWHDhk8++eSSJUteeeWVb7/9tnPnzp06dar6tnHjxj169OjYseNll10WX0kOgAxWUFBQVlaWk5OT7kIAADJW6gE+7vjjj09c9b3KsGHDhg0bVs2dAxAhubm56S4BACCTpT6FHgAAANhnBHgAAACIAAEeAAAAIkCABwAAgAgQ4AGoAeXl5YWFhUVFRekuBAAgYwnwANSA0tLSkpKS4uLidBcCAJCxBHgAakAsFkt3CQAAGU6ABwAAgAgQ4AEAACACBHgAAACIgOwa2UtFRcWCBQs+++yzysrKgQMH5uTkxGKxrKysGtk5AAAAUN0AP3PmzFGjRs2fP3/btm3xlo4dO+bk5BQVFU2ePHnkyJH9+/evdpFp9uWXX65du3bDhg3ffvttkyZNDjrooBYtWqS7KAAAAA4s1Qrwl1122YQJE3b41datW6dMmTJlypQrr7xy/Pjxkbsbv2jRomeeeWbGjBlLly6tqKhI+rZJkybHHXfc6aefPmTIkB/96EdpqRAAAIADSurPwN98883x9J6VlXXaaaeNGjUq8dsjjjiibt26IYS77rrr2muvrWaV+9IHH3wwcODA9u3bjx49+uWXX94+vYcQ1q9f//rrr48bN659+/aDBg1asWLFvq8TYL+Sl5eXnZ2dn5+f7kIAADJWinfgV65cecstt4QQmjdv/vjjj/fo0SOEEG+J69ev37Jly/r377948eJ7773317/+dST+r+7VV1/t169feXl5VcshhxzSunXrnJychg0bhhC++eab8vLyVatWff755/EOkydPfvnll6dNm9axY8f0FA2wHygoKCgrK8vJyUl3IQAAGSvFAH/33Xdv3bo1hPDoo4/G0/v2WrduPW3atKOPPnrz5s3jx4+/++67Uy9zn6ioqDjrrLPi6b1t27ZXXHFF3759d/Z3h7KyspkzZ95///1vvPHG559//vOf/3zRokVNmjTZtyUD7Edyc3PTXQIAQCZLcQr93LlzQwhdunTp06fPLrq1atVqwIABIYQ333wztQPtSxMmTPjoo49CCMOGDXv77bcvv/zyXcwaOOKIIy644ILXX3/9xhtvDCGsWrXqgQce2He1AgAAcIBJMcAvX748hNCpU6fd9jz22GNDCO+9915qB9qXJk2aFELIy8ubOHFi/fr192RIVlbW2LFjTz311BDCU089tVfLAwAA4ECWYoCvrKwMIdSrV2+3PTdv3hxCWLduXWoH2pfi76Lr169fnTp1vtfAwYMHh//5owYAAADsDSkG+JYtW4YQFi9evNueS5YsCSFEYuH0r7/+OoSQwnPsTZs2rRoOAAAAe0OKAf6UU04JIcyePTuez3fm3XffnTVrVgiha9euqR1oXzr88MNDCKWlpd93YPwJ//hwgANTeXl5YWFhUVFRugsBAMhYKQb4ESNGhBC2bNly3nnnrVmzZod9Pvroo/PPP3/Tpk0hhKFDh6Zc4j4T/6vErFmzXnjhhT0f9c477zzyyCNVwwEOTKWlpSUlJcXFxekuBAAgY6UY4Lt16xbP5KWlpe3bt7/55ptfeuml+Fdr1qyZPn362LFjf/jDH86bNy+E0KtXr969e9dUxXvPyJEja9WqFYvFzjzzzNtvv339+vW77r9p06aJEyd27959/fr1tWrVGjly5L6pE2A/FIvF0l0CAECGS3Ed+BBCUVFRRUXFtGnTKioqxowZM2bMmHh7v379Ert17tw5KjdkfvzjH19//fW/+93vKisrr7/++nHjxv30pz/t1KlT69atDz300AYNGmRlZVVWVpaXl69atWrhwoUvvvhifNH4EMINN9xw0kknpbd+AAAAMljqAb5+/fpTp06dNGnSb37zm/j725M0b9781ltvHTFiRK1aKd7n3/duu+22gw466KabbtqyZcuGDRumTp06derUXQ+pU6fO2LFjb7jhhn1TIQAAAAem1AN83ODBg/v27Tt9+vQ5c+b861//WrduXZMmTQ4//PAuXbr06dMnhTe6p90NN9zwi1/84vbbb3/mmWc+/fTTXfTMzc0dNGjQ9ddfn5+fv8/KAwAA4MBU3QAfQqhXr97AgQMHDhxY/V3tJ/Lz8ydMmHDfffctWrRoyZIl77///ldffbVx48ZYLNa4ceOmTZu2bdv2uOOOa9++/d6eXLBu3bqtW7d+31EpDAEAAGA/VwMBPlPVqlWrQ4cOHTp0SFcB11xzzfjx41Me/vnnn9dgMQAAAKSXAL//atq06cEHH5zCwPXr13/77be1a9eu8ZIAAABIl2oF+I8//nj27NlvvfVWZWXlbjtfe+21rVu3rs7h9gcbN2585ZVXPvroowYNGrRt2/aEE07IysraS8caPXr06NGjUxjYsWPHhQsXHnLIITVeEsDO5OXlZWdneycIAMDek3qAnzx58ogRI9auXbuH/a+44oqUj7WPvfrqq3/729+aNm168803VzVu3rx57Nixf/jDHzZt2lTV+IMf/OC+++5LWjkP4ABUUFBQVlaWk5OT7kIAADJWiu9gW7FixS9+8Ys9T+8hhJYtW6Z2rH3p22+/veaaa37yk5/88Y9/LCsrq2pfs2ZNx44db7311sT0HkJYvXp1//79L7zwwi1btuzzYgH2L7m5uR7eAQDYe1K8A3/rrbdu3ry5du3a11xzzdlnn33kkUfu9n3sjRs3Tu1Y+9KFF174X//1X/HP2dnfnZxLLrlk8eLFIYQ6der07Nnzhz/84bZt2xYuXDhnzpxYLDZx4sQ2bdr8+7//e3qKBgAA4ACQYoB/4403Qgi33XbbddddV6P1pNOcOXPi6T0nJ2fChAlnnnlmvP3JJ5+cMmVKCKFdu3bFxcXHH3981ZB//OMf5513XllZ2bhx44YMGdK2bdu0VA4AAEDGS3EK/QcffFCrVq3LL7+8ZqtJr3vvvTeEULt27dmzZw8ZMqROnTrx9okTJ4YQ6tSp88QTTySm9xDCz372s7/85S8hhMrKyuos+QYAAAC7lmKAb9SoUW5ubsOGDWu2mvSKT5Lv3bt30trvCxYsCCGceuqp7dq1235Ujx49unXrFkL4xz/+sU/KBAAA4ECUYoAvKCj45JNPvvzyy5qtJr0+/PDDEMIPf/jDpPaKiooQwnHHHbezgSeccEIIYc2aNXuzOoD9Wnl5eWFhYVFRUboLAQDIWCkG+AsuuCCE8PTTT9dkLekWXzh9/fr1Se3xVZF2sdZ9LBar+i/Agam0tLSkpKS4uDjdhQAAZKzUA/xpp5121VVXxd9mlxmOPfbYEML06dO3bt2a2P5//s//Cf8zwX6H4nPsI7FOHsBe4o+YAAB7W4oBvnbt2k8++eRpp532k5/85OKLL164cOGGDRtqtrJ975xzzgkhrFy58oILLti2bVtV+4gRI0IIr7zyyquvvrr9qOnTp7/22mshhFNOOWVfVQoAAMABJ8UA379//+HDh2/dujU7O/vhhx/u2LFjkyZNcnNz83auZuveG4YPHx6/Cf/YY4+dddZZ8fvqIYSzzjqrb9++sVjs/PPPT7oPX1JSEo/34X8eKwAAAIC9IcV14J9//vntGz///PPqFZNmDRo0KC4u7tmz5xdffPHMM88888wzHTp0KCwsPPzwwwcNGvT222+///77nTp1GjBgwAknnLBx48b58+fPnDkzPmv04osvjr+LHgAAAPaGFAN8pobVDh06vPbaa8OHD4/Pin/rrbfeeuutxA6bNm168sknn3zyycTGiy+++P7779+nhQIAAHCASTHAz5kzp2br2H8cffTRr7766jPPPPPoo4/OnDlz06ZNO+tZp06dnj17/r//9/+6d+++LysEAADgAJRigM94gwYNGjRo0IYNG956660lS5asXr16/fr1GzdurFu3buPGjVu2bNmuXbvOnTs3a9Ys3ZUCAABwQBDgd6Vx48Zdu3bt2rVrugsB2N/l5eVlZ2fn5+enuxAAgIxVMwG+oqJiwYIFn332WWVl5cCBA3NycmKxWFZWVo3sHID9X0FBQVlZWU5OTroLAQDIWNUN8DNnzhw1atT8+fOrFk7v2LFjTk5OUVHR5MmTR44c2b9//2oXCUAE5ObmprsEAIBMluI68HGXXXbZ6aefPm/evKr0XmXr1q1TpkwZMGDAVVddFV9oDQAAAEhZ6gH+5ptvnjBhQgghKyvrtNNOGzVqVOK3RxxxRN26dUMId91117XXXlvNKgEAAOAAl2KAX7ly5S233BJCaN68+axZs2bMmDFu3LjEDv369Vu2bFm7du1CCPfee++KFSuqXysAAAAcsFIM8HfffffWrVtDCI8++miPHj122Kd169bTpk2rW7fuli1bxo8fn3qNAAAAcMBLMcDPnTs3hNClS5c+ffrsolurVq0GDBgQQnjzzTdTOxAAkVBeXl5YWFhUVJTuQgAAMlaKAX758uUhhE6dOu2257HHHhtCeO+991I7EACRUFpaWlJSUlxcnO5CAAAyVooBvrKyMoRQr1693fbcvHlzCGHdunWpHQiASLDgCADA3pZigG/ZsmUIYfHixbvtuWTJkhBCixYtUjsQAAAAEFIO8KecckoIYfbs2fF8vjPvvvvurFmzQghdu3ZN7UAAAABASDnAjxgxIoSwZcuW8847b82aNTvs89FHH51//vmbNm0KIQwdOjTlEgEAAIDs1IZ169Zt6NChjz/+eGlpafv27a+44oqqxeTWrFnz8ccfz5s374477og/+t6rV6/evXvXWMkAAABw4EkxwIcQioqKKioqpk2bVlFRMWbMmDFjxsTb+/Xrl9itc+fOXkoMAAAA1ZTiFPoQQv369adOnfr000/n5+fvsEPz5s0feeSR1157rVmzZikfBQAAAAjVuQMfN3jw4L59+06fPn3OnDn/+te/1q1b16RJk8MPP7xLly59+vRp0qRJjVQJwH4uLy8vOzt7Z3/SBQCg+qob4EMI9erVGzhw4MCBA6u/KwAiqqCgoKysLCcnJ92FAABkrBoI8AAQQsjNzU13CQAAmSz1Z+ABAACAfSbFO/DnnXfeHvasX79+48aNc3Jyjj322E6dOrVu3Tq1IwIAAMCBLMUA/9hjj6U2sHPnzqNHj+7bt29qwwEAAODAlOIU+nbt2rVr165p06a77XnMMccceeSR2dn//18K3njjjX79+v32t79N7bgAAABwYEoxwC9atOj+++/fsmVLCCE7O/u8887729/+9vrrr//rX/9auHDhpEmTfvWrX9WvXz+EcMwxx7z77ruVlZUrVqy48cYbGzduHEK47bbbpk6dWoM/A4D0Ki8vLywsLCoqSnchAAAZK8UAv3bt2rPPPvvrr78+5phjPvjgg7/85S9Dhgw56aSTWrVqdeKJJw4aNOjee+9dsWLFCSec8Pzzz48YMaJ27dqtW7ceO3ZsaWlpo0aNQgi33357jf4QANKptLS0pKSkuLg43YUAAGSsFAP83Xff/cknnzRq1Oj5558/8sgjd9inRYsWkydPbtq0aXFx8aRJk+KNbdq0GT16dAjh1VdfraysTO3oAOxvYrFYuksAAMhwKQb4p59+OoTQvXv3tm3b7qLbkUceeeqpp4YQ7r///qrGnj17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27dPq9UeOHDg559/PnDggNFotAy7ePHixYsXN23aZPnRzc0tPz/firnrguULiODg4Erf7d2796RJk2JjY1etWjV37tz27dvbNh0AAAAAoEGr7XpsLi4uQUFBwcHBzzzzjIg4OTmJyKuvvpqbm2tZhf63334TO1nEznKNQDVXCixatGjNmjVFRUXz58+PjY21YTQAAAAAQENXJwuqT5w4MSgoyPL60qVLlifJ1cWOrCsgIODq1avlNwLczmAwzJw58/333//3v//9zDPPhIaG2jIeAAAAAKAhq+kidrdbuXLlypUr77333uqHtW7deujQoS+99JLiHdmMZZm6rVu3Hjx4sKox8+fPb9mypYhMnz49OzvbduEAAAAAAA2b8gI/derUqVOnNmvWrOLG2bNnz54921Jx7c6UKVNEpKSkJDw8fMuWLZWO8fb2Xrp0qYicO3du3Lhx165ds2lEAKivTCZTaGgoa3wCAABXNEadAAAgAElEQVTUHeUFvlJLlixZsmSJn5+fdT/WNkJDQx977DERSUlJGTZs2EMPPfT0009/9913twyLiIiw3PC/c+fOzp07v/vuu5yKBwCj0RgfH8/6IAAAAHWnTu6Bt19Lly5NTk4+duyYiBiNRqPReO3atTFjxtwy7J///KdWq42Ojk5LS3v55ZfVSAoA9YvZbFY7AgAAgIOz8hl4e9e6det9+/a99dZber2+mmFOTk7Lli1bunTpPffcY7NsAAAAAICGjDPwt2rcuPErr7zyyiuvnD59+vTp002aNKlq5AsvvPD888+vXr16165dZ8+ePXfunC1zAgAAAAAaFAp8ldq3b9++ffvqx2i12kmTJk2aNMk2kQAAAAAADRaX0AMAAAAAYAco8AAAAAAA2AEKPAAAAAAAdoACDwCwAr1er9VqDQaD2kEAAAAcFovYAQCsIDAwMCMjQ6fTqR0EAADAYVHgAQDW4ePjo3YEAAAAR8Yl9AAAAAAA2AEKPAAAAAAAdoACDwAAAACAHaDAAwAAAABgByjwAAArMJlMoaGhMTExagcBAABwWBR4AIAVGI3G+Pj42NhYtYMAAAA4LAo8AMAKzGaz2hEAAAAcHM+BBwAAAACob+XKY08/vaW0tIZnBZLrNk29xBl4AAAAAID69uy5WOP23kBxBh4AAAAAUF988smQZ57pcsdhU6Yc+eKLQzbIU69w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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3291,7 +3299,7 @@ <h3>Calculating the AUC</h3> function.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY2VsbF9hdWMgPC0gQVVDZWxsX2NhbGNBVUMoZ2VuZVNldHMgPSBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtpbmdzID0gY2VsbF9yYW5raW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y01heFJhbmsgPSBhdWNfbWF4X3JhbmspXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiY2VsbF9hdWMgPC0gQVVDZWxsX2NhbGNBVUMoZ2VuZVNldHMgPSBld2luZ19nZW5lX3NldF9jb2xsZWN0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmtpbmdzID0gY2VsbF9yYW5raW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y01heFJhbmsgPSBhdWNfbWF4X3JhbmspIn0= --> <pre class="r"><code>cell_auc <- AUCell_calcAUC(geneSets = ewing_gene_set_collection, rankings = cell_rankings, aucMaxRank = auc_max_rank)</code></pre> @@ -3301,7 +3309,7 @@ <h3>Calculating the AUC</h3> <p>This function returns an <code>aucellResults</code> object.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc3RyKGNlbGxfYXVjKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic3RyKGNlbGxfYXVjKSJ9 --> <pre class="r"><code>str(cell_auc)</code></pre> <!-- rnb-source-end --> <!-- rnb-output-begin eyJkYXRhIjoiRm9ybWFsIGNsYXNzICdhdWNlbGxSZXN1bHRzJyBbcGFja2FnZSBcIkFVQ2VsbFwiXSB3aXRoIDYgc2xvdHNcbiAgLi5AIG5HZW5lc0RldGVjdGVkIDogbnVtKDApIFxuICAuLkAgY29sRGF0YSAgICAgICAgOkZvcm1hbCBjbGFzcyAnREZyYW1lJyBbcGFja2FnZSBcIlM0VmVjdG9yc1wiXSB3aXRoIDYgc2xvdHNcbiAgLi4gLi4gLi5AIHJvd25hbWVzICAgICAgIDogY2hyIFsxOjQyNzddIFwiQUFHQ0FUQ1RDR1RUR0NDVFwiIFwiQ1RHVEFUVFRDQ0FBR0FHR1wiIFwiQ0FHQ0FHQ1RDQ1RDQUdBQVwiIFwiQUdHVENUQUFHR0dBQ1RHVFwiIC4uLlxuICAuLiAuLiAuLkAgbnJvd3MgICAgICAgICAgOiBpbnQgNDI3N1xuICAuLiAuLiAuLkAgZWxlbWVudFR5cGUgICAgOiBjaHIgXCJBTllcIlxuICAuLiAuLiAuLkAgZWxlbWVudE1ldGFkYXRhOiBOVUxMXG4gIC4uIC4uIC4uQCBtZXRhZGF0YSAgICAgICA6IGxpc3QoKVxuICAuLiAuLiAuLkAgbGlzdERhdGEgICAgICAgOiBOYW1lZCBsaXN0KClcbiAgLi5AIGFzc2F5cyAgICAgICAgIDpGb3JtYWwgY2xhc3MgJ1NpbXBsZUFzc2F5cycgW3BhY2thZ2UgXCJTdW1tYXJpemVkRXhwZXJpbWVudFwiXSB3aXRoIDEgc2xvdFxuICAuLiAuLiAuLkAgZGF0YTpGb3JtYWwgY2xhc3MgJ1NpbXBsZUxpc3QnIFtwYWNrYWdlIFwiUzRWZWN0b3JzXCJdIHdpdGggNCBzbG90c1xuICAuLiAuLiAuLiAuLiAuLkAgbGlzdERhdGEgICAgICAgOkxpc3Qgb2YgMVxuICAuLiAuLiAuLiAuLiAuLiAuLiQgQVVDOiBudW0gWzE6MiwgMTo0Mjc3XSAwLjExMDMgMC4xMjA2IDAuMDM1MiAwLjA1MzggMC4xNjcxIC4uLlxuICAuLiAuLiAuLiAuLiAuLiAuLiAuLi0gYXR0cigqLCBcImRpbW5hbWVzXCIpPUxpc3Qgb2YgMlxuICAuLiAuLiAuLiAuLiAuLiAuLiAuLiAuLiQgZ2VuZSBzZXRzOiBjaHIgWzE6Ml0gXCJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OXCIgXCJSSUdHSV9FV0lOR19TQVJDT01BX1BST0dFTklUT1JfVVBcIlxuICAuLiAuLiAuLiAuLiAuLiAuLiAuLiAuLiQgY2VsbHMgICAgOiBjaHIgWzE6NDI3N10gXCJBQUdDQVRDVENHVFRHQ0NUXCIgXCJDVEdUQVRUVENDQUFHQUdHXCIgXCJDQUdDQUdDVENDVENBR0FBXCIgXCJBR0dUQ1RBQUdHR0FDVEdUXCIgLi4uXG4gIC4uIC4uIC4uIC4uIC4uQCBlbGVtZW50VHlwZSAgICA6IGNociBcIkFOWVwiXG4gIC4uIC4uIC4uIC4uIC4uQCBlbGVtZW50TWV0YWRhdGE6IE5VTExcbiAgLi4gLi4gLi4gLi4gLi5AIG1ldGFkYXRhICAgICAgIDogbGlzdCgpXG4gIC4uQCBOQU1FUyAgICAgICAgICA6IGNociBbMToyXSBcIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT05cIiBcIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUFwiXG4gIC4uQCBlbGVtZW50TWV0YWRhdGE6Rm9ybWFsIGNsYXNzICdERnJhbWUnIFtwYWNrYWdlIFwiUzRWZWN0b3JzXCJdIHdpdGggNiBzbG90c1xuICAuLiAuLiAuLkAgcm93bmFtZXMgICAgICAgOiBOVUxMXG4gIC4uIC4uIC4uQCBucm93cyAgICAgICAgICA6IGludCAyXG4gIC4uIC4uIC4uQCBlbGVtZW50VHlwZSAgICA6IGNociBcIkFOWVwiXG4gIC4uIC4uIC4uQCBlbGVtZW50TWV0YWRhdGE6IE5VTExcbiAgLi4gLi4gLi5AIG1ldGFkYXRhICAgICAgIDogbGlzdCgpXG4gIC4uIC4uIC4uQCBsaXN0RGF0YSAgICAgICA6IE5hbWVkIGxpc3QoKVxuICAuLkAgbWV0YWRhdGEgICAgICAgOiBsaXN0KClcbiJ9 --> @@ -3340,7 +3348,7 @@ <h3>Calculating the AUC</h3> format.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBFeHRyYWN0IEFVQ1xuYXVjX2RmIDwtIGNlbGxfYXVjQGFzc2F5c0BkYXRhJEFVQyB8PlxuICAjIFRyYW5zcG9zZVxuICB0KCkgfD5cbiAgIyBDb252ZXJ0IHRvIGRhdGEgZnJhbWVcbiAgYXMuZGF0YS5mcmFtZSgpIHw+XG4gICMgTWFrZSB0aGUgYmFyY29kZXMgYSBjb2x1bW5cbiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oXCJiYXJjb2Rlc1wiKSBcblxuIyBMb29rIGF0IGZpcnN0IGZldyByb3dzXG5oZWFkKGF1Y19kZilcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgRXh0cmFjdCBBVUMiLCJhdWNfZGYgPC0gY2VsbF9hdWNAYXNzYXlzQGRhdGEkQVVDIHw+XG4gICMgVHJhbnNwb3NlXG4gIHQoKSB8PlxuICAjIENvbnZlcnQgdG8gZGF0YSBmcmFtZVxuICBhcy5kYXRhLmZyYW1lKCkgfD5cbiAgIyBNYWtlIHRoZSBiYXJjb2RlcyBhIGNvbHVtblxuICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbihcImJhcmNvZGVzXCIpICIsIiIsIiMgTG9vayBhdCBmaXJzdCBmZXcgcm93cyIsImhlYWQoYXVjX2RmKSJdfQ== --> <pre class="r"><code># Extract AUC auc_df <- cell_auc@assays@data$AUC |> # Transpose @@ -3353,13 +3361,11 @@ <h3>Calculating the AUC</h3> # Look at first few rows head(auc_df)</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbImRhdGEuZnJhbWUiXSwibnJvdyI6NiwibmNvbCI6Mywic3VtbWFyeSI6eyJEZXNjcmlwdGlvbiI6WyJkZiBbNiDDlyAzXSJdfX0sInJkZiI6IlVrUllNd3BZQ2dBQUFBTUFCQVFBQUFNRkFBQUFBQVZWVkVZdE9BQUFCQUlBQUFBQkFBUUFDUUFBQUFGNEFBQURFd0FBQUFNQUFBQVFBQUFBQmdBRUFBa0FBQUFRUVVGSFEwRlVRMVJEUjFSVVIwTkRWQUFFQUFrQUFBQVFRMVJIVkVGVVZGUkRRMEZCUjBGSFJ3QUVBQWtBQUFBUVEwRkhRMEZIUTFSRFExUkRRVWRCUVFBRUFBa0FBQUFRUVVkSFZFTlVRVUZIUjBkQlExUkhWQUFFQUFrQUFBQVFRVUZVVkZSRFExUkRWRU5IUVVkVVFRQUVBQWtBQUFBUVEwRkhWRlJCUjBOQlFVTkJWRU5IVkFBQUFBNEFBQUFHUDd3Nm1TOXRYc28vb2YvWWUwb0h0VC9GWTBaSXVtK3hQNzZ3UWh4cUJUMC94amxWSW1ZRVpUL0diQXcvSUdSSEFBQUFEZ0FBQUFZL3Z0MDRzdkk5aEQrcmlCYlZtQUk0UDhPZnA1WkNtSncvdlkyQlhvaHFSei9GZ1phdU5tTU9QOFBJL0V5Q0s2RUFBQVFDQUFBQUFRQUVBQWtBQUFBRmJtRnRaWE1BQUFBUUFBQUFBd0FFQUFrQUFBQUlZbUZ5WTI5a1pYTUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFBQkFJQUFBQUJBQVFBQ1FBQUFBbHliM2N1Ym1GdFpYTUFBQUFOQUFBQUFvQUFBQUFBQUFBR0FBQUVBZ0FBQUFFQUJBQUpBQUFBQldOc1lYTnpBQUFBRUFBQUFBRUFCQUFKQUFBQUNtUmhkR0V1Wm5KaGJXVUFBQUQrQUFBRUFnQUFBQUVBQkFBSkFBQUFCMjl3ZEdsdmJuTUFBQUlUQUFBQUJnQUFBQkFBQUFBQkFBUUFDUUFBQUFGeUFBQUFFQUFBQUFFQUJBQUpBQUFBREdGMVkxOTBiMTkwWVdKc1pRQUFBQkFBQUFBQkFBUUFDUUFBQUFOd2JtY0FBQUFLQUFBQUFRQUFBQUVBQUFBTkFBQUFBUUFBQUFZQUFBQU5BQUFBQVFBQUFBTUFBQVFDQUFBQy93QUFBQkFBQUFBR0FBUUFDUUFBQUFabGJtZHBibVVBQkFBSkFBQUFCV3hoWW1Wc0FBUUFDUUFBQUFOa1pYWUFCQUFKQUFBQURuSnZkMjVoYldWekxuQnlhVzUwQUFRQUNRQUFBQXB5YjNkekxuUnZkR0ZzQUFRQUNRQUFBQXBqYjJ4ekxuUnZkR0ZzQUFBQS9nQUFBUDQ9In0= --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["barcodes"],"name":[1],"type":["chr"],"align":["left"]},{"label":["ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION"],"name":[2],"type":["dbl"],"align":["right"]},{"label":["RIGGI_EWING_SARCOMA_PROGENITOR_UP"],"name":[3],"type":["dbl"],"align":["right"]}],"data":[{"1":"AAGCATCTCGTTGCCT","2":"0.11026914","3":"0.12056307","_rn_":"1"},{"1":"CTGTATTTCCAAGAGG","2":"0.03515507","3":"0.05377265","_rn_":"2"},{"1":"CAGCAGCTCCTCAGAA","2":"0.16709212","3":"0.15330977","_rn_":"3"},{"1":"AGGTCTAAGGGACTGT","2":"0.11987699","3":"0.11544045","_rn_":"4"},{"1":"AATTTCCTCTCGAGTA","2":"0.17362465","3":"0.16801723","_rn_":"5"},{"1":"CAGTTAGCAACATCGT","2":"0.17517236","3":"0.15457109","_rn_":"6"}],"options":{"columns":{"min":{},"max":[10],"total":[3]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}} +{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["barcodes"],"name":[1],"type":["chr"],"align":["left"]},{"label":["ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION"],"name":[2],"type":["dbl"],"align":["right"]},{"label":["RIGGI_EWING_SARCOMA_PROGENITOR_UP"],"name":[3],"type":["dbl"],"align":["right"]}],"data":[{"1":"AAGCATCTCGTTGCCT","2":"0.11026914","3":"0.12056307","_rn_":"1"},{"1":"CTGTATTTCCAAGAGG","2":"0.03515507","3":"0.05377265","_rn_":"2"},{"1":"CAGCAGCTCCTCAGAA","2":"0.16709212","3":"0.15330977","_rn_":"3"},{"1":"AGGTCTAAGGGACTGT","2":"0.11987699","3":"0.11544045","_rn_":"4"},{"1":"AATTTCCTCTCGAGTA","2":"0.17362465","3":"0.16801723","_rn_":"5"},{"1":"CAGTTAGCAACATCGT","2":"0.17517236","3":"0.15457109","_rn_":"6"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> </div> @@ -3371,21 +3377,11 @@ <h3>Assignments</h3> <code>AUCell_exploreThresholds()</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX2Fzc2lnbm1lbnRzIDwtIEFVQ2VsbF9leHBsb3JlVGhyZXNob2xkcyhjZWxsX2F1YywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RIaXN0ID0gRkFMU0UsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25DZWxscyA9IFRSVUUpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoiYXVjX2Fzc2lnbm1lbnRzIDwtIEFVQ2VsbF9leHBsb3JlVGhyZXNob2xkcyhjZWxsX2F1YywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RIaXN0ID0gRkFMU0UsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25DZWxscyA9IFRSVUUpIn0= --> <pre class="r"><code>auc_assignments <- AUCell_exploreThresholds(cell_auc, plotHist = FALSE, assignCells = TRUE)</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUmVnaXN0ZXJlZCBTMyBtZXRob2RzIG92ZXJ3cml0dGVuIGJ5ICdodG1sdG9vbHMnOlxuICBtZXRob2QgICAgICAgICAgICAgICBmcm9tICAgICAgICAgXG4gIHByaW50Lmh0bWwgICAgICAgICAgIHRvb2xzOnJzdHVkaW9cbiAgcHJpbnQuc2hpbnkudGFnICAgICAgdG9vbHM6cnN0dWRpb1xuICBwcmludC5zaGlueS50YWcubGlzdCB0b29sczpyc3R1ZGlvXG5SZWdpc3RlcmVkIFMzIG1ldGhvZCBvdmVyd3JpdHRlbiBieSAnaHRtbHdpZGdldHMnOlxuICBtZXRob2QgICAgICAgICAgIGZyb20gICAgICAgICBcbiAgcHJpbnQuaHRtbHdpZGdldCB0b29sczpyc3R1ZGlvXG4ifQ== --> -<pre><code>Registered S3 methods overwritten by 'htmltools': - method from - print.html tools:rstudio - print.shiny.tag tools:rstudio - print.shiny.tag.list tools:rstudio -Registered S3 method overwritten by 'htmlwidgets': - method from - print.htmlwidget tools:rstudio</code></pre> -<!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>We’re going to plot the distribution of AUC values with @@ -3393,7 +3389,7 @@ <h3>Assignments</h3> format.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX3Bsb3R0aW5nX2RmIDwtIGF1Y19kZiB8PlxuICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFiYXJjb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9IFwiZ2VuZV9zZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSBcImF1Y1wiKSB8PlxuICBkcGx5cjo6bXV0YXRlKFxuICAgICMgQ3JlYXRlIGEgbmV3IGxvZ2ljYWwgY29sdW1uIGNhbGxlZCBhc3NpZ25lZFxuICAgIGFzc2lnbmVkID0gZHBseXI6OmNhc2Vfd2hlbihcbiAgICAgICMgRm9yIFpoYW5nIGdlbmUgc2V0IHJvd3MsIHNldCB0byBUUlVFIHdoZW4gdGhlIGJhcmNvZGUgaXMgaW4gdGhlIFxuICAgICAgIyBhc3NpZ25tZW50IGxpc3RcbiAgICAgIGdlbmVfc2V0ID09IGV3aW5nX2dlbmVfc2V0X25hbWVzW1tcInpoYW5nXCJdXSAmIFxuICAgICAgICBiYXJjb2RlcyAlaW4lIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbW1wiemhhbmdcIl1dXV0kYXNzaWdubWVudCB+IFRSVUUsXG4gICAgICAjIEZvciBSaWdnaSBnZW5lIHNldCByb3dzLCBzZXQgdG8gVFJVRSB3aGVuIHRoZSBiYXJjb2RlIGlzIGluIHRoZSBcbiAgICAgICMgYXNzaWdubWVudCBsaXN0XG4gICAgICBnZW5lX3NldCA9PSBld2luZ19nZW5lX3NldF9uYW1lc1tbXCJyaWdnaVwiXV0gJiBcbiAgICAgICAgYmFyY29kZXMgJWluJSBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1tcInJpZ2dpXCJdXV1dJGFzc2lnbm1lbnQgfiBUUlVFLFxuICAgICAgIyBPdGhlcndpc2UsIHNldCB0byBGQUxTRVxuICAgICAgLmRlZmF1bHQgPSBGQUxTRVxuICAgIClcbiAgKVxuXG5hdWNfcGxvdHRpbmdfZGZcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjpbImF1Y19wbG90dGluZ19kZiA8LSBhdWNfZGYgfD5cbiAgdGlkeXI6OnBpdm90X2xvbmdlcighYmFyY29kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSBcImdlbmVfc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gXCJhdWNcIikgfD5cbiAgZHBseXI6Om11dGF0ZShcbiAgICAjIENyZWF0ZSBhIG5ldyBsb2dpY2FsIGNvbHVtbiBjYWxsZWQgYXNzaWduZWRcbiAgICBhc3NpZ25lZCA9IGRwbHlyOjpjYXNlX3doZW4oXG4gICAgICAjIEZvciBaaGFuZyBnZW5lIHNldCByb3dzLCBzZXQgdG8gVFJVRSB3aGVuIHRoZSBiYXJjb2RlIGlzIGluIHRoZSBcbiAgICAgICMgYXNzaWdubWVudCBsaXN0XG4gICAgICBnZW5lX3NldCA9PSBld2luZ19nZW5lX3NldF9uYW1lc1tbXCJ6aGFuZ1wiXV0gJiBcbiAgICAgICAgYmFyY29kZXMgJWluJSBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1tcInpoYW5nXCJdXV1dJGFzc2lnbm1lbnQgfiBUUlVFLFxuICAgICAgIyBGb3IgUmlnZ2kgZ2VuZSBzZXQgcm93cywgc2V0IHRvIFRSVUUgd2hlbiB0aGUgYmFyY29kZSBpcyBpbiB0aGUgXG4gICAgICAjIGFzc2lnbm1lbnQgbGlzdFxuICAgICAgZ2VuZV9zZXQgPT0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbW1wicmlnZ2lcIl1dICYgXG4gICAgICAgIGJhcmNvZGVzICVpbiUgYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1tbXCJyaWdnaVwiXV1dXSRhc3NpZ25tZW50IH4gVFJVRSxcbiAgICAgICMgT3RoZXJ3aXNlLCBzZXQgdG8gRkFMU0VcbiAgICAgIC5kZWZhdWx0ID0gRkFMU0VcbiAgICApXG4gICkiLCIiLCJhdWNfcGxvdHRpbmdfZGYiXX0= --> <pre class="r"><code>auc_plotting_df <- auc_df |> tidyr::pivot_longer(!barcodes, names_to = "gene_set", @@ -3416,20 +3412,18 @@ <h3>Assignments</h3> auc_plotting_df</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInRibF9kZiIsInRibCIsImRhdGEuZnJhbWUiXSwibnJvdyI6ODU1NCwibmNvbCI6NCwic3VtbWFyeSI6eyJBIHRpYmJsZSI6WyI4LDU1NCDDlyA0Il19fSwicmRmIjoiVWtSWU13cFlDZ0FBQUFNQUJBUUFBQU1GQUFBQUFBVlZWRVl0T0FBQUJBSUFBQUFCQUFRQUNRQUFBQUY0QUFBREV3QUFBQVFBQUFBUUFBQUQ2QUFFQUFrQUFBQVFRVUZIUTBGVVExUkRSMVJVUjBORFZBQUVBQWtBQUFBUVFVRkhRMEZVUTFSRFIxUlVSME5EVkFBRUFBa0FBQUFRUTFSSFZFRlVWRlJEUTBGQlIwRkhSd0FFQUFrQUFBQVFRMVJIVkVGVVZGUkRRMEZCUjBGSFJ3QUVBQWtBQUFBUVEwRkhRMEZIUTFSRFExUkRRVWRCUVFBRUFBa0FBQUFRUTBGSFEwRkhRMVJEUTFSRFFVZEJRUUFFQUFrQUFBQVFRVWRIVkVOVVFVRkhSMGRCUTFSSFZBQUVBQWtBQUFBUVFVZEhWRU5VUVVGSFIwZEJRMVJIVkFBRUFBa0FBQUFRUVVGVVZGUkRRMVJEVkVOSFFVZFVRUUFFQUFrQUFBQVFRVUZVVkZSRFExUkRWRU5IUVVkVVFRQUVBQWtBQUFBUVEwRkhWRlJCUjBOQlFVTkJWRU5IVkFBRUFBa0FBQUFRUTBGSFZGUkJSME5CUVVOQlZFTkhWQUFFQUFrQUFBQVFRMEZVUTBkRFZGUkRRVlJIVkVOVVZBQUVBQWtBQUFBUVEwRlVRMGREVkZSRFFWUkhWRU5VVkFBRUFBa0FBQUFRVkVkVVZGUkhWRlJEVkVkRFIwZERRUUFFQUFrQUFBQVFWRWRVVkZSSFZGUkRWRWREUjBkRFFRQUVBQWtBQUFBUVIwZEhRVWRVUVVGSFEwTkJRMEZCUndBRUFBa0FBQUFRUjBkSFFVZFVRVUZIUTBOQlEwRkJSd0FFQUFrQUFBQVFRMGRCUjBGQlIxUkRSME5VUVVOSFJ3QUVBQWtBQUFBUVEwZEJSMEZCUjFSRFIwTlVRVU5IUndBRUFBa0FBQUFRUVVkSFZFTkJWRlJEUjFSQlEwRkRRUUFFQUFrQUFBQVFRVWRIVkVOQlZGUkRSMVJCUTBGRFFRQUVBQWtBQUFBUVZFTkRWRU5VVkZSRFZFTlVWRU5CUVFBRUFBa0FBQUFRVkVORFZFTlVWRlJEVkVOVVZFTkJRUUFFQUFrQUFBQVFRVWRVUjBORFIwTkJSME5VVkVOSFJ3QUVBQWtBQUFBUVFVZFVSME5EUjBOQlIwTlVWRU5IUndBRUFBa0FBQUFRVkVORFFVZEJRVU5CUjFSQlIwRkhRd0FFQUFrQUFBQVFWRU5EUVVkQlFVTkJSMVJCUjBGSFF3QUVBQWtBQUFBUVFVRkhRMEZVUTFSRFZFZFVRMEZIUVFBRUFBa0FBQUFRUVVGSFEwRlVRMVJEVkVkVVEwRkhRUUFFQUFrQUFBQVFWRUZCVkZSRFEwRkhWRlJEUTBkSFF3QUVBQWtBQUFBUVZFRkJWRlJEUTBGSFZGUkRRMGRIUXdBRUFBa0FBQUFRUTBkQlFWUlVSMEZIUVVORFFVRkRSd0FFQUFrQUFBQVFRMGRCUVZSVVIwRkhRVU5EUVVGRFJ3QUVBQWtBQUFBUVIwZEJRVlJIUjBOQlFWUkhRVWREUndBRUFBa0FBQUFRUjBkQlFWUkhSME5CUVZSSFFVZERSd0FFQUFrQUFBQVFWRU5IUVVGSFZGUkRWRWRIUjBOQlF3QUVBQWtBQUFBUVZFTkhRVUZIVkZSRFZFZEhSME5CUXdBRUFBa0FBQUFRUTBOQlEwZEJSMEZIUjBOVVFVZERRUUFFQUFrQUFBQVFRME5CUTBkQlIwRkhSME5VUVVkRFFRQUVBQWtBQUFBUVEwRkJWRWRCUTFSRFExUlVRVlJIVkFBRUFBa0FBQUFRUTBGQlZFZEJRMVJEUTFSVVFWUkhWQUFFQUFrQUFBQVFRVWRCUVVOQlFVZFVSMGRCUTBOVVF3QUVBQWtBQUFBUVFVZEJRVU5CUVVkVVIwZEJRME5VUXdBRUFBa0FBQUFRUTBGVVFVTkRRMEZIUVVkRFZFZEJRd0FFQUFrQUFBQVFRMEZVUVVORFEwRkhRVWREVkVkQlF3QUVBQWtBQUFBUVExUkRRVUZVVkVkVVFVTlVWRWRVUndBRUFBa0FBQUFRUTFSRFFVRlVWRWRVUVVOVVZFZFVSd0FFQUFrQUFBQVFWRlJEVkVkVVFWUkRSMGREVkVOVVZBQUVBQWtBQUFBUVZGUkRWRWRVUVZSRFIwZERWRU5VVkFBRUFBa0FBQUFRUjBkQlZFZFVWRUZIUVVkRFIwRkRWQUFFQUFrQUFBQVFSMGRCVkVkVVZFRkhRVWREUjBGRFZBQUVBQWtBQUFBUVEwRkJSME5VUVZSRFIxUkRSMEZVUVFBRUFBa0FBQUFRUTBGQlIwTlVRVlJEUjFSRFIwRlVRUUFFQUFrQUFBQVFWRlJEUTBkSFZFTkJRVU5VVkVkSFZBQUVBQWtBQUFBUVZGUkRRMGRIVkVOQlFVTlVWRWRIVkFBRUFBa0FBQUFRUjBORFFVZEhWRUZIUTBGSFEwRkRRUUFFQUFrQUFBQVFSME5EUVVkSFZFRkhRMEZIUTBGRFFRQUVBQWtBQUFBUVIwRlVRMEZVUjBkVVFWUkRSMEZCUVFBRUFBa0FBQUFRUjBGVVEwRlVSMGRVUVZSRFIwRkJRUUFFQUFrQUFBQVFWRlJVUVVkVVEwTkJRVU5VUTBkQlZBQUVBQWtBQUFBUVZGUlVRVWRVUTBOQlFVTlVRMGRCVkFBRUFBa0FBQUFRVkVOVVEwRkRSMGRVUTBkRFFWUkRSd0FFQUFrQUFBQVFWRU5VUTBGRFIwZFVRMGREUVZSRFJ3QUVBQWtBQUFBUVZFZEJWRlJVUTBOQlIwTlVRVUZEVkFBRUFBa0FBQUFRVkVkQlZGUlVRME5CUjBOVVFVRkRWQUFFQUFrQUFBQVFWRU5EVkZSRFZGUkRRMEZIVkVGRFFRQUVBQWtBQUFBUVZFTkRWRlJEVkZSRFEwRkhWRUZEUVFBRUFBa0FBQUFRUVVOSFFWUkRRVUZIVkVORFIwTkRRUUFFQUFrQUFBQVFRVU5IUVZSRFFVRkhWRU5EUjBORFFRQUVBQWtBQUFBUVFWUkRRVU5VVkVOQlEwTkhSME5VUVFBRUFBa0FBQUFRUVZSRFFVTlVWRU5CUTBOSFIwTlVRUUFFQUFrQUFBQVFSMGREVkZSSFIwTkJRME5VUVVGQlF3QUVBQWtBQUFBUVIwZERWRlJIUjBOQlEwTlVRVUZCUXdBRUFBa0FBQUFRUTBGQlEwTkJRVWRVUVVORFIwZERWQUFFQUFrQUFBQVFRMEZCUTBOQlFVZFVRVU5EUjBkRFZBQUVBQWtBQUFBUVFVTkRSMVJVUTBOQlEwTlVSME5CUndBRUFBa0FBQUFRUVVORFIxUlVRME5CUTBOVVIwTkJSd0FFQUFrQUFBQVFWRU5VUjBkRFZFZFVRVU5IUjFSVVZBQUVBQWtBQUFBUVZFTlVSMGREVkVkVVFVTkhSMVJVVkFBRUFBa0FBQUFRUjFSSFIwZEJRVlJEVkZSRFEwTkhRUUFFQUFrQUFBQVFSMVJIUjBkQlFWUkRWRlJEUTBOSFFRQUVBQWtBQUFBUVIwZFVRVUZVUTFSRFFVRkhWRUZCUndBRUFBa0FBQUFRUjBkVVFVRlVRMVJEUVVGSFZFRkJSd0FFQUFrQUFBQVFRMVJCUVVORFEwZFVWRUZIUTFSQlF3QUVBQWtBQUFBUVExUkJRVU5EUTBkVVZFRkhRMVJCUXdBRUFBa0FBQUFRUjBGQlZFTkhWRU5CUjFSRFZGUkRRd0FFQUFrQUFBQVFSMEZCVkVOSFZFTkJSMVJEVkZSRFF3QUVBQWtBQUFBUVIwTkJRMGRIVkZSRFZFRlVRVU5IUndBRUFBa0FBQUFRUjBOQlEwZEhWRlJEVkVGVVFVTkhSd0FFQUFrQUFBQVFRMEZEVkVGQlIwRkhSMVJIUTBOVVF3QUVBQWtBQUFBUVEwRkRWRUZCUjBGSFIxUkhRME5VUXdBRUFBa0FBQUFRUjBkSFFVZFVRVlJEVkVkRFIwZEJRd0FFQUFrQUFBQVFSMGRIUVVkVVFWUkRWRWREUjBkQlF3QUVBQWtBQUFBUVIwRkhSME5CUVVOQlZFZERRVU5VUVFBRUFBa0FBQUFRUjBGSFIwTkJRVU5CVkVkRFFVTlVRUUFFQUFrQUFBQVFWRUZIUVVOVVIwTkJRMVJIUjBOSFZBQUVBQWtBQUFBUVZFRkhRVU5VUjBOQlExUkhSME5IVkFBRUFBa0FBQUFRUTBGVVFVTkJSMGRVUjBORFZFRkRSd0FFQUFrQUFBQVFRMEZVUVVOQlIwZFVSME5EVkVGRFJ3QUVBQWtBQUFBUVZFTkJRMEZVVkZSRFExUlVRMEZIUXdBRUFBa0FBQUFRVkVOQlEwRlVWRlJEUTFSVVEwRkhRd0FFQUFrQUFBQVFRVlJEUVVOQlIwTkJRMVJIVkVOSFJ3QUVBQWtBQUFBUVFWUkRRVU5CUjBOQlExUkhWRU5IUndBRUFBa0FBQUFRVkVOQlEwRlVWRlJEVkZSRFZFTkJRUUFFQUFrQUFBQVFWRU5CUTBGVVZGUkRWRlJEVkVOQlFRQUVBQWtBQUFBUVZFRkRRVWRIVkVGSFIwRlVSMVJVUVFBRUFBa0FBQUFRVkVGRFFVZEhWRUZIUjBGVVIxUlVRUUFFQUFrQUFBQVFWRU5CVkZSQlEwTkJRVU5VVkVOVVZBQUVBQWtBQUFBUVZFTkJWRlJCUTBOQlFVTlVWRU5VVkFBRUFBa0FBQUFRVkVkSFIwRkJSMVJEUTBOSFFVRkRSd0FFQUFrQUFBQVFWRWRIUjBGQlIxUkRRME5IUVVGRFJ3QUVBQWtBQUFBUVFVZEJRME5EUjBkVVIwTlVSMVJEUndBRUFBa0FBQUFRUVVkQlEwTkRSMGRVUjBOVVIxUkRSd0FFQUFrQUFBQVFRVWRVUjBGRFZFTkJSMGRCVkVkQlF3QUVBQWtBQUFBUVFVZFVSMEZEVkVOQlIwZEJWRWRCUXdBRUFBa0FBQUFRVkVkQlFVTkhWRUZIUTBGSFIxUkRRUUFFQUFrQUFBQVFWRWRCUVVOSFZFRkhRMEZIUjFSRFFRQUVBQWtBQUFBUVFVZFVRMEZVUjBOQlEwRkRRMVJIUndBRUFBa0FBQUFRUVVkVVEwRlVSME5CUTBGRFExUkhSd0FFQUFrQUFBQVFRVWREUjBORFFVRkhRMVJIUVVORFF3QUVBQWtBQUFBUVFVZERSME5EUVVGSFExUkhRVU5EUXdBRUFBa0FBQUFRUTBOVVEwRkRRVUZIUVVOQlZFTkRWQUFFQUFrQUFBQVFRME5VUTBGRFFVRkhRVU5CVkVORFZBQUVBQWtBQUFBUVEwZFVRVWRVUVVkVVExUkRRVWRCVkFBRUFBa0FBQUFRUTBkVVFVZFVRVWRVUTFSRFFVZEJWQUFFQUFrQUFBQVFWRWREUVZSSFFWUkRRVWRCUjBOSFFRQUVBQWtBQUFBUVZFZERRVlJIUVZSRFFVZEJSME5IUVFBRUFBa0FBQUFRVkVORFZFRkJWRU5CVkVGRFFVZEJRUUFFQUFrQUFBQVFWRU5EVkVGQlZFTkJWRUZEUVVkQlFRQUVBQWtBQUFBUVZGUkJSMGREUVZSRFFVTkhRVWRIUVFBRUFBa0FBQUFRVkZSQlIwZERRVlJEUVVOSFFVZEhRUUFFQUFrQUFBQVFSMEZEUTBOVVZFZFVSMEZEUVVGRFJ3QUVBQWtBQUFBUVIwRkRRME5VVkVkVVIwRkRRVUZEUndBRUFBa0FBQUFRVkVORFZFZERRVUZIUTBOSFZGUkJWQUFFQUFrQUFBQVFWRU5EVkVkRFFVRkhRME5IVkZSQlZBQUVBQWtBQUFBUVIwRkJWRU5CUTFSRFIwZERRMVJVVkFBRUFBa0FBQUFRUjBGQlZFTkJRMVJEUjBkRFExUlVWQUFFQUFrQUFBQVFRMVJEUVVkSFIwZFVRVUZEUVVOSFJ3QUVBQWtBQUFBUVExUkRRVWRIUjBkVVFVRkRRVU5IUndBRUFBa0FBQUFRUTBGVVZFZERRMEZIUjBkRFFWUkhWQUFFQUFrQUFBQVFRMEZVVkVkRFEwRkhSMGREUVZSSFZBQUVBQWtBQUFBUVEwTkJRMGRVVkVOQlFVRlVSMGRVUVFBRUFBa0FBQUFRUTBOQlEwZFVWRU5CUVVGVVIwZFVRUUFFQUFrQUFBQVFSMEZIUVVGQlZFRkhWRWRCVkZSRFF3QUVBQWtBQUFBUVIwRkhRVUZCVkVGSFZFZEJWRlJEUXdBRUFBa0FBQUFRVkZSSFIwZERSMGRVUVVkQlFVRkRWQUFFQUFrQUFBQVFWRlJIUjBkRFIwZFVRVWRCUVVGRFZBQUVBQWtBQUFBUVIwZEJSMGRVUVZSRFIwRkhWRU5VUVFBRUFBa0FBQUFRUjBkQlIwZFVRVlJEUjBGSFZFTlVRUUFFQUFrQUFBQVFRME5IVkVGSFIwRkhWRU5VVkVORFF3QUVBQWtBQUFBUVEwTkhWRUZIUjBGSFZFTlVWRU5EUXdBRUFBa0FBQUFRVkVkQlIwZEhRVU5CUTBkSFEwZFVWQUFFQUFrQUFBQVFWRWRCUjBkSFFVTkJRMGRIUTBkVVZBQUVBQWtBQUFBUVExUlVRVWRIUVVkVVEwTkRWRUZCUVFBRUFBa0FBQUFRUTFSVVFVZEhRVWRVUTBORFZFRkJRUUFFQUFrQUFBQVFRVUZVUTBkQlEwTkJRMGRCUTBkRFZBQUVBQWtBQUFBUVFVRlVRMGRCUTBOQlEwZEJRMGREVkFBRUFBa0FBQUFRUjFSVVIxUkRRMEZIVkZSSFEwZERRd0FFQUFrQUFBQVFSMVJVUjFSRFEwRkhWRlJIUTBkRFF3QUVBQWtBQUFBUVZFZERWRU5IVkVOQlIxUkhSMVJIUVFBRUFBa0FBQUFRVkVkRFZFTkhWRU5CUjFSSFIxUkhRUUFFQUFrQUFBQVFWRUZIVkVkRFFVTkJSMEZCUTBkRFFRQUVBQWtBQUFBUVZFRkhWRWREUVVOQlIwRkJRMGREUVFBRUFBa0FBQUFRUVZSRFZGUkRRVlJEVkVOQlFVTkhRUUFFQUFrQUFBQVFRVlJEVkZSRFFWUkRWRU5CUVVOSFFRQUVBQWtBQUFBUVEwRlVRVWRCUTBOQlIwTkJRVlJVUXdBRUFBa0FBQUFRUTBGVVFVZEJRME5CUjBOQlFWUlVRd0FFQUFrQUFBQVFRMEZVVkVkVVZFZFVSME5EVkVkQlF3QUVBQWtBQUFBUVEwRlVWRWRVVkVkVVIwTkRWRWRCUXdBRUFBa0FBQUFRUVVkQlZFTkhWRUZIVkZSVVEwRkhRd0FFQUFrQUFBQVFRVWRCVkVOSFZFRkhWRlJVUTBGSFF3QUVBQWtBQUFBUVEwRkRRVlJIUVVOQlFVZEJRVUZEVkFBRUFBa0FBQUFRUTBGRFFWUkhRVU5CUVVkQlFVRkRWQUFFQUFrQUFBQVFRME5VUTBGQlExUkRWRUZEVkVGVVF3QUVBQWtBQUFBUVEwTlVRMEZCUTFSRFZFRkRWRUZVUXdBRUFBa0FBQUFRUVVkVVIwTkRSMVJEUjBGQlEwZEhRUUFFQUFrQUFBQVFRVWRVUjBORFIxUkRSMEZCUTBkSFFRQUVBQWtBQUFBUVZFTkRWRWREUVVOQlZFZEJRMEZEVkFBRUFBa0FBQUFRVkVORFZFZERRVU5CVkVkQlEwRkRWQUFFQUFrQUFBQVFWRWRVUTBGSFFVZFVWRU5VUTBkRFZBQUVBQWtBQUFBUVZFZFVRMEZIUVVkVVZFTlVRMGREVkFBRUFBa0FBQUFRVkVkSFFVZEhRVlJEUTBOSFFVRkRSd0FFQUFrQUFBQVFWRWRIUVVkSFFWUkRRME5IUVVGRFJ3QUVBQWtBQUFBUVFVZEhWRU5CVkVGSFIwTkJRMEZCUXdBRUFBa0FBQUFRUVVkSFZFTkJWRUZIUjBOQlEwRkJRd0FFQUFrQUFBQVFRME5VUTBOVVEwRkhRVUZVVkVkRFFRQUVBQWtBQUFBUVEwTlVRME5VUTBGSFFVRlVWRWREUVFBRUFBa0FBQUFRUjBkQlZFTlVRVU5CUTBOQlIxUkJWQUFFQUFrQUFBQVFSMGRCVkVOVVFVTkJRME5CUjFSQlZBQUVBQWtBQUFBUVFVZERWRU5CUVZSRFFVTlVWRWRIUVFBRUFBa0FBQUFRUVVkRFZFTkJRVlJEUVVOVVZFZEhRUUFFQUFrQUFBQVFRMGRVUVVGSFZGUkRSME5IUjBGRFZBQUVBQWtBQUFBUVEwZFVRVUZIVkZSRFIwTkhSMEZEVkFBRUFBa0FBQUFRVkVORFZFZERRVWRVUjBkVVFVRlVRUUFFQUFrQUFBQVFWRU5EVkVkRFFVZFVSMGRVUVVGVVFRQUVBQWtBQUFBUVZFZERRVWRCVkVGSFExUlVWRU5VVkFBRUFBa0FBQUFRVkVkRFFVZEJWRUZIUTFSVVZFTlVWQUFFQUFrQUFBQVFRVUZEUVVGSFFWUkRRMEZEUTFSRFFRQUVBQWtBQUFBUVFVRkRRVUZIUVZSRFEwRkRRMVJEUVFBRUFBa0FBQUFRUTBkQlIxUkhRMEZIVkVkQlIwZERWQUFFQUFrQUFBQVFRMGRCUjFSSFEwRkhWRWRCUjBkRFZBQUVBQWtBQUFBUVIwRkJSME5EUTBkVVZFZERWRU5IUndBRUFBa0FBQUFRUjBGQlIwTkRRMGRVVkVkRFZFTkhSd0FFQUFrQUFBQVFRMGRIUVVOQlExUkRRME5CUjBkQlF3QUVBQWtBQUFBUVEwZEhRVU5CUTFSRFEwTkJSMGRCUXdBRUFBa0FBQUFRUVVORFIxUlVRMEZIUjBGVVZFTkRWQUFFQUFrQUFBQVFRVU5EUjFSVVEwRkhSMEZVVkVORFZBQUVBQWtBQUFBUVZFZERWRlJEUjBkVVExUkRRVWRIUXdBRUFBa0FBQUFRVkVkRFZGUkRSMGRVUTFSRFFVZEhRd0FFQUFrQUFBQVFRVU5EUVVOQlFVTkJRVWRVUjBkVVJ3QUVBQWtBQUFBUVFVTkRRVU5CUVVOQlFVZFVSMGRVUndBRUFBa0FBQUFRUVVGQlZFZEhRVlJEUVVkRFIwTkJRd0FFQUFrQUFBQVFRVUZCVkVkSFFWUkRRVWREUjBOQlF3QUVBQWtBQUFBUVFVRkRRMVJVVkVkVVFWUkhRVWRIUXdBRUFBa0FBQUFRUVVGRFExUlVWRWRVUVZSSFFVZEhRd0FFQUFrQUFBQVFRMEZCUjBkSFFVTkJSMGRVUjBGRFFRQUVBQWtBQUFBUVEwRkJSMGRIUVVOQlIwZFVSMEZEUVFBRUFBa0FBQUFRUVZSRFIxUkRRMVJEVkVkRFIwZERRUUFFQUFrQUFBQVFRVlJEUjFSRFExUkRWRWREUjBkRFFRQUVBQWtBQUFBUVZFTlVSME5EUVVkVVZFTkJRVWRVUXdBRUFBa0FBQUFRVkVOVVIwTkRRVWRVVkVOQlFVZFVRd0FFQUFrQUFBQVFRVUZEUVVOQlEwRkhWRU5CVkVkRFZBQUVBQWtBQUFBUVFVRkRRVU5CUTBGSFZFTkJWRWREVkFBRUFBa0FBQUFRVkVGQlExUlVRMEZIVkZSRFFWUkhRd0FFQUFrQUFBQVFWRUZCUTFSVVEwRkhWRlJEUVZSSFF3QUVBQWtBQUFBUVFWUlVRMVJCUTBOQlFVZERWRWRVVkFBRUFBa0FBQUFRUVZSVVExUkJRME5CUVVkRFZFZFVWQUFFQUFrQUFBQVFRMGRIVkVOQlIwZFVRMVJCUjFSSFZBQUVBQWtBQUFBUVEwZEhWRU5CUjBkVVExUkJSMVJIVkFBRUFBa0FBQUFRUVVkQlZFZERWRU5CUVVOQlEwRkRWQUFFQUFrQUFBQVFRVWRCVkVkRFZFTkJRVU5CUTBGRFZBQUVBQWtBQUFBUVZFZEJRMVJEUTBOQlFVTlVRMGRVUVFBRUFBa0FBQUFRVkVkQlExUkRRME5CUVVOVVEwZFVRUUFFQUFrQUFBQVFRMEZEUjBkSFZFTkJSME5VVkZSSFFRQUVBQWtBQUFBUVEwRkRSMGRIVkVOQlIwTlVWRlJIUVFBRUFBa0FBQUFRUTBGRFZFZFVRMGRVUTFSRFIwZEJRd0FFQUFrQUFBQVFRMEZEVkVkVVEwZFVRMVJEUjBkQlF3QUVBQWtBQUFBUVZFTkhRMVJEUVVOQlZFTkhSMEZVVkFBRUFBa0FBQUFRVkVOSFExUkRRVU5CVkVOSFIwRlVWQUFFQUFrQUFBQVFWRU5IUjBkQlExUkRRME5CUVVOVVF3QUVBQWtBQUFBUVZFTkhSMGRCUTFSRFEwTkJRVU5VUXdBRUFBa0FBQUFRVkVOQlIwTkJRVUZIUTBkQlEwRlVSd0FFQUFrQUFBQVFWRU5CUjBOQlFVRkhRMGRCUTBGVVJ3QUVBQWtBQUFBUVExUkRRVUZEUTBOQlZFRkRRVU5EUVFBRUFBa0FBQUFRUTFSRFFVRkRRME5CVkVGRFFVTkRRUUFFQUFrQUFBQVFSMGREUVVkVVEwRkhWRUZCUjBOQlZBQUVBQWtBQUFBUVIwZERRVWRVUTBGSFZFRkJSME5CVkFBRUFBa0FBQUFRVkZSRFEwRkRSME5CUVVkVVIwZEJRd0FFQUFrQUFBQVFWRlJEUTBGRFIwTkJRVWRVUjBkQlF3QUVBQWtBQUFBUVEwTlVSME5CVkVOQlIwRkhRME5EVkFBRUFBa0FBQUFRUTBOVVIwTkJWRU5CUjBGSFEwTkRWQUFFQUFrQUFBQVFSMVJIUjBGQlIxUkRRVlJIUVVGQlJ3QUVBQWtBQUFBUVIxUkhSMEZCUjFSRFFWUkhRVUZCUndBRUFBa0FBQUFRUVVGSFFVTkJRVlJEUjBGVVEwTkJRUUFFQUFrQUFBQVFRVUZIUVVOQlFWUkRSMEZVUTBOQlFRQUVBQWtBQUFBUVExUkhSMVJEVkVkVVZFTkJRVWRIUndBRUFBa0FBQUFRUTFSSFIxUkRWRWRVVkVOQlFVZEhSd0FFQUFrQUFBQVFRMVJVUTFSRFZGUkRRME5VVkVkVVJ3QUVBQWtBQUFBUVExUlVRMVJEVkZSRFEwTlVWRWRVUndBRUFBa0FBQUFRVkVkRFIwRkRSMEZIUjBGQlFVZEhWQUFFQUFrQUFBQVFWRWREUjBGRFIwRkhSMEZCUVVkSFZBQUVBQWtBQUFBUVFVZFVRMEZVUjFSRFZFTkRRVUZVVkFBRUFBa0FBQUFRUVVkVVEwRlVSMVJEVkVORFFVRlVWQUFFQUFrQUFBQVFRVlJVUjBkSFZFTkJWRlJIUTBOVVF3QUVBQWtBQUFBUVFWUlVSMGRIVkVOQlZGUkhRME5VUXdBRUFBa0FBQUFRVkVkRFIwZERRVU5CUVZSRFIwTkhRd0FFQUFrQUFBQVFWRWREUjBkRFFVTkJRVlJEUjBOSFF3QUVBQWtBQUFBUVZFTkJRMVJEUjBGSFEwTkhWRUZCUndBRUFBa0FBQUFRVkVOQlExUkRSMEZIUTBOSFZFRkJSd0FFQUFrQUFBQVFSMEZVUTBORFZFRkhWRUZVVkVkRFF3QUVBQWtBQUFBUVIwRlVRME5EVkVGSFZFRlVWRWREUXdBRUFBa0FBQUFRUTBGVVZFZERRMVJEVkVkQlZFZEhWQUFFQUFrQUFBQVFRMEZVVkVkRFExUkRWRWRCVkVkSFZBQUVBQWtBQUFBUVZGUkhRMEZVVkVGSFZFTkJWRWRIUndBRUFBa0FBQUFRVkZSSFEwRlVWRUZIVkVOQlZFZEhSd0FFQUFrQUFBQVFRVlJIUjBGVVEwZFVSMGREUVZSRFF3QUVBQWtBQUFBUVFWUkhSMEZVUTBkVVIwZERRVlJEUXdBRUFBa0FBQUFRVkVORFZFZERRVWRVVkVkRFZGUkhRUUFFQUFrQUFBQVFWRU5EVkVkRFFVZFVWRWREVkZSSFFRQUVBQWtBQUFBUVFVZERWRUZEUVZSRFZFZEhWRWREUndBRUFBa0FBQUFRUVVkRFZFRkRRVlJEVkVkSFZFZERSd0FFQUFrQUFBQVFRVU5CUTBGSFZFZFVSMGRCUVVGVVZBQUVBQWtBQUFBUVFVTkJRMEZIVkVkVVIwZEJRVUZVVkFBRUFBa0FBQUFRUTFSSFIwTkJSMGRVUjBGRFZFTlVRUUFFQUFrQUFBQVFRMVJIUjBOQlIwZFVSMEZEVkVOVVFRQUVBQWtBQUFBUVFWUlVRMVJCUTBGSFIwTlVWRU5EUndBRUFBa0FBQUFRUVZSVVExUkJRMEZIUjBOVVZFTkRSd0FFQUFrQUFBQVFRMEZVVkVORFIwTkJWRUZIUjFSVVF3QUVBQWtBQUFBUVEwRlVWRU5EUjBOQlZFRkhSMVJVUXdBRUFBa0FBQUFRUVVkQlEwTkRSMVJEVkVkVVEwRkhRUUFFQUFrQUFBQVFRVWRCUTBORFIxUkRWRWRVUTBGSFFRQUVBQWtBQUFBUVEwRkRRMEZCUVVkVVZFTkhRVWREUXdBRUFBa0FBQUFRUTBGRFEwRkJRVWRVVkVOSFFVZERRd0FFQUFrQUFBQVFRVlJEUjBkQlZFZFVRVlJIUVVkQlZBQUVBQWtBQUFBUVFWUkRSMGRCVkVkVVFWUkhRVWRCVkFBRUFBa0FBQUFRUVVGRFIwRkJRVU5CUTBGRFFVZERRd0FFQUFrQUFBQVFRVUZEUjBGQlFVTkJRMEZEUVVkRFF3QUVBQWtBQUFBUVEwRkhRMEZIUTFSRFExUkJRME5IVkFBRUFBa0FBQUFRUTBGSFEwRkhRMVJEUTFSQlEwTkhWQUFFQUFrQUFBQVFWRlJIUjFSVVZGUkRSME5EUVZSQlFRQUVBQWtBQUFBUVZGUkhSMVJVVkZSRFIwTkRRVlJCUVFBRUFBa0FBQUFRVkZSQlIwZEhWRWRVUVVkRFFVTkJSd0FFQUFrQUFBQVFWRlJCUjBkSFZFZFVRVWREUVVOQlJ3QUVBQWtBQUFBUVEwTlVRVlJEUjBOQlZGUkhSME5CVkFBRUFBa0FBQUFRUTBOVVFWUkRSME5CVkZSSFIwTkJWQUFFQUFrQUFBQVFRMVJVVkVOSFIwZFVSME5IUjBOVVZBQUVBQWtBQUFBUVExUlVWRU5IUjBkVVIwTkhSME5VVkFBRUFBa0FBQUFRUjBOQlZGUkJSMGRVUVZSRFEwTlVRd0FFQUFrQUFBQVFSME5CVkZSQlIwZFVRVlJEUTBOVVF3QUVBQWtBQUFBUVFVTlVRVlJIUjBOQlFVZEJRVUZVUXdBRUFBa0FBQUFRUVVOVVFWUkhSME5CUVVkQlFVRlVRd0FFQUFrQUFBQVFRVlJVUjBkSFZFZFVRME5CUTBkRFFRQUVBQWtBQUFBUVFWUlVSMGRIVkVkVVEwTkJRMGREUVFBRUFBa0FBQUFRUTBGSFFWUkJRMEZIUTBOQlEwTkhWQUFFQUFrQUFBQVFRMEZIUVZSQlEwRkhRME5CUTBOSFZBQUVBQWtBQUFBUVIxUkRWRWRVUTBGSFEwTkhRVlJVVkFBRUFBa0FBQUFRUjFSRFZFZFVRMEZIUTBOSFFWUlVWQUFFQUFrQUFBQVFRVU5CUTBOQlFVZFVWRU5EUVVOQlFRQUVBQWtBQUFBUVFVTkJRME5CUVVkVVZFTkRRVU5CUVFBRUFBa0FBQUFRUjBGVVIwRkRWRUZIUVZSSFFVTkJWQUFFQUFrQUFBQVFSMEZVUjBGRFZFRkhRVlJIUVVOQlZBQUVBQWtBQUFBUVZFTkRRVWRCUVVGSFIxUkhRMVJCUndBRUFBa0FBQUFRVkVORFFVZEJRVUZIUjFSSFExUkJSd0FFQUFrQUFBQVFRVlJVUTBOQlZFTkJRMVJEUTFSSFZBQUVBQWtBQUFBUVFWUlVRME5CVkVOQlExUkRRMVJIVkFBRUFBa0FBQUFRVkVGVVEwRkhSMVJEUVZSRFZFZFVWQUFFQUFrQUFBQVFWRUZVUTBGSFIxUkRRVlJEVkVkVVZBQUVBQWtBQUFBUVEwTkJRVlJVVkVOQlIwRkRSME5VUXdBRUFBa0FBQUFRUTBOQlFWUlVWRU5CUjBGRFIwTlVRd0FFQUFrQUFBQVFRMEZCUTBkSFEwRkhRMEZIUTBkQlZBQUVBQWtBQUFBUVEwRkJRMGRIUTBGSFEwRkhRMGRCVkFBRUFBa0FBQUFRUjBkSFZFTkJRMVJEUVVOVVFVZERRUUFFQUFrQUFBQVFSMGRIVkVOQlExUkRRVU5VUVVkRFFRQUVBQWtBQUFBUVFVRkhRMGRCUjBGSFFVZEhWRUZVVkFBRUFBa0FBQUFRUVVGSFEwZEJSMEZIUVVkSFZFRlVWQUFFQUFrQUFBQVFSME5CUjBkRFZFRkhWRWRCUTBOVVZBQUVBQWtBQUFBUVIwTkJSMGREVkVGSFZFZEJRME5VVkFBRUFBa0FBQUFRVkVOQlZGUlVSMVJEVkVGSFEwTlVRd0FFQUFrQUFBQVFWRU5CVkZSVVIxUkRWRUZIUTBOVVF3QUVBQWtBQUFBUVZFZERRVWRCVkVOQlFVRkhSME5CUXdBRUFBa0FBQUFRVkVkRFFVZEJWRU5CUVVGSFIwTkJRd0FFQUFrQUFBQVFSMVJVUVVOSFFWUkRRMEZEUVVGSFZBQUVBQWtBQUFBUVIxUlVRVU5IUVZSRFEwRkRRVUZIVkFBRUFBa0FBQUFRVkZSQlIwZERRVUZIUVVkSFIxUkJRUUFFQUFrQUFBQVFWRlJCUjBkRFFVRkhRVWRIUjFSQlFRQUVBQWtBQUFBUVFVTlVWRU5IUTFSRFIwRkRWRU5EVkFBRUFBa0FBQUFRUVVOVVZFTkhRMVJEUjBGRFZFTkRWQUFFQUFrQUFBQVFRVWRCUTBGQlFVZFVRME5CUTBGSFF3QUVBQWtBQUFBUVFVZEJRMEZCUVVkVVEwTkJRMEZIUXdBRUFBa0FBQUFRUjBkSFEwZFVWRlJEUjFSRFZFRkRRd0FFQUFrQUFBQVFSMGRIUTBkVVZGUkRSMVJEVkVGRFF3QUVBQWtBQUFBUVFVZEJWRUZIUVVkVVZFTkJWRU5IUVFBRUFBa0FBQUFRUVVkQlZFRkhRVWRVVkVOQlZFTkhRUUFFQUFrQUFBQVFWRUZVVkVkSFIxUkRRVU5CVkVGRFJ3QUVBQWtBQUFBUVZFRlVWRWRIUjFSRFFVTkJWRUZEUndBRUFBa0FBQUFRVkVORFEwRkRRVUZIVkVOQlExUkJRd0FFQUFrQUFBQVFWRU5EUTBGRFFVRkhWRU5CUTFSQlF3QUVBQWtBQUFBUVFVRkhRVUZEUVVGSFExUkRSMEZEUXdBRUFBa0FBQUFRUVVGSFFVRkRRVUZIUTFSRFIwRkRRd0FFQUFrQUFBQVFRMEZCUTBOVVEwTkJSMEZEUVVGVVFRQUVBQWtBQUFBUVEwRkJRME5VUTBOQlIwRkRRVUZVUVFBRUFBa0FBQUFRVkVGRFIwTlVRME5CUjBkQlIwRkRWQUFFQUFrQUFBQVFWRUZEUjBOVVEwTkJSMGRCUjBGRFZBQUVBQWtBQUFBUVFVTkJSMGRIUVZSRFIwRkRRMVJCUVFBRUFBa0FBQUFRUVVOQlIwZEhRVlJEUjBGRFExUkJRUUFFQUFrQUFBQVFRVWRVUTBGQlEwRkhRVWRIUVZSSFFRQUVBQWtBQUFBUVFVZFVRMEZCUTBGSFFVZEhRVlJIUVFBRUFBa0FBQUFRUjBGRFFWUkRRVUZIUTBGQlZFRkJRd0FFQUFrQUFBQVFSMEZEUVZSRFFVRkhRMEZCVkVGQlF3QUVBQWtBQUFBUVZFZEJSMGRIUVZSRFZFRkhRMEZVUndBRUFBa0FBQUFRVkVkQlIwZEhRVlJEVkVGSFEwRlVSd0FFQUFrQUFBQVFRVWRVVkVGSFEwRkhWRWREUVVORFF3QUVBQWtBQUFBUVFVZFVWRUZIUTBGSFZFZERRVU5EUXdBRUFBa0FBQUFRUVZSRFIwTkRWRlJEUTBkQlEwRkhRd0FFQUFrQUFBQVFRVlJEUjBORFZGUkRRMGRCUTBGSFF3QUVBQWtBQUFBUVExUlVRME5VVkZSRFExUkJWRlJVUndBRUFBa0FBQUFRUTFSVVEwTlVWRlJEUTFSQlZGUlVSd0FFQUFrQUFBQVFRMVJEVkVOQlIwZFVSMVJCUVVGVVJ3QUVBQWtBQUFBUVExUkRWRU5CUjBkVVIxUkJRVUZVUndBRUFBa0FBQUFRUTBGRFZGUkRSMVJEUVZSRFZFTlVRUUFFQUFrQUFBQVFRMEZEVkZSRFIxUkRRVlJEVkVOVVFRQUVBQWtBQUFBUVZFRlVRVU5EVkVGSFIwRkRRVU5VUndBRUFBa0FBQUFRVkVGVVFVTkRWRUZIUjBGRFFVTlVSd0FFQUFrQUFBQVFSMGRCUjBkQlZFRkhRME5VUjFSSFF3QUVBQWtBQUFBUVIwZEJSMGRCVkVGSFEwTlVSMVJIUXdBRUFBa0FBQUFRUjFSQlFVTkRRVU5CUVVOQlFVRkhWQUFFQUFrQUFBQVFSMVJCUVVORFFVTkJRVU5CUVVGSFZBQUVBQWtBQUFBUVEwTkJWRU5CUTBOQlIwTkRWRlJEVkFBRUFBa0FBQUFRUTBOQlZFTkJRME5CUjBORFZGUkRWQUFFQUFrQUFBQVFRVU5VUTFSRFIwZFVWRU5IUjFSRFJ3QUVBQWtBQUFBUVFVTlVRMVJEUjBkVVZFTkhSMVJEUndBRUFBa0FBQUFRVkVOQlFVZEJRME5CUVZSQlFVZEhWQUFFQUFrQUFBQVFWRU5CUVVkQlEwTkJRVlJCUVVkSFZBQUVBQWtBQUFBUVZFZEhSME5IVkZSRFEwZERRVlJCUVFBRUFBa0FBQUFRVkVkSFIwTkhWRlJEUTBkRFFWUkJRUUFFQUFrQUFBQVFSMVJEVkZSVVFVRkhRMVJIVkZSQlF3QUVBQWtBQUFBUVIxUkRWRlJVUVVGSFExUkhWRlJCUXdBRUFBa0FBQUFRVkVOQlIwTkRWRlJEUjBGVVZGUkRWQUFFQUFrQUFBQVFWRU5CUjBORFZGUkRSMEZVVkZSRFZBQUVBQWtBQUFBUVZGUkJRMGREUTFSRFFVZFVRMEZVUndBRUFBa0FBQUFRVkZSQlEwZERRMVJEUVVkVVEwRlVSd0FFQUFrQUFBQVFWRU5CVkVkRFEwRkhRME5CUVVkSFZBQUVBQWtBQUFBUVZFTkJWRWREUTBGSFEwTkJRVWRIVkFBRUFBa0FBQUFRUVZSVVEwRkhSME5CUjFSVVZFTkhRUUFFQUFrQUFBQVFRVlJVUTBGSFIwTkJSMVJVVkVOSFFRQUVBQWtBQUFBUVZGUkJSMGRIVkVkVVIwRkhWRUZIUXdBRUFBa0FBQUFRVkZSQlIwZEhWRWRVUjBGSFZFRkhRd0FFQUFrQUFBQVFRVU5EUTBGQlFVRkhRVWRIUVZSRFF3QUVBQWtBQUFBUVFVTkRRMEZCUVVGSFFVZEhRVlJEUXdBRUFBa0FBQUFRUTBGVVEwRkJSMEZIUjBkVVFVTkJRd0FFQUFrQUFBQVFRMEZVUTBGQlIwRkhSMGRVUVVOQlF3QUVBQWtBQUFBUVFVZERWRU5CUVVGSFIwTkRWRlJEUndBRUFBa0FBQUFRUVVkRFZFTkJRVUZIUjBORFZGUkRSd0FFQUFrQUFBQVFRMEZVVkVkVVZFRkhRMEZEUTFSSFF3QUVBQWtBQUFBUVEwRlVWRWRVVkVGSFEwRkRRMVJIUXdBRUFBa0FBQUFRVkZSRFExUkJRVU5CVkVGRFEwRkRRUUFFQUFrQUFBQVFWRlJEUTFSQlFVTkJWRUZEUTBGRFFRQUVBQWtBQUFBUVIxUkJSMGRCUjBkVVZFTkJRVWRVUXdBRUFBa0FBQUFRUjFSQlIwZEJSMGRVVkVOQlFVZFVRd0FFQUFrQUFBQVFRMVJEUVVOVVIxUkRWRWREUjBkQlF3QUVBQWtBQUFBUVExUkRRVU5VUjFSRFZFZERSMGRCUXdBRUFBa0FBQUFRUTBGRFIxUlVRMGRVVkVkQlZFZFVRd0FFQUFrQUFBQVFRMEZEUjFSVVEwZFVWRWRCVkVkVVF3QUVBQWtBQUFBUVZFTkRRMEZEUVVOQlEwZEJRMGRVUXdBRUFBa0FBQUFRVkVORFEwRkRRVU5CUTBkQlEwZFVRd0FFQUFrQUFBQVFSMVJIVkVORFZFZFVRMGRCUTFSSFF3QUVBQWtBQUFBUVIxUkhWRU5EVkVkVVEwZEJRMVJIUXdBRUFBa0FBQUFRUTBkQlZFZEhRMGRVUTBGVVZFTkRRd0FFQUFrQUFBQVFRMGRCVkVkSFEwZFVRMEZVVkVORFF3QUVBQWtBQUFBUVEwTkRRVUZEVkVkVVZFTkJRVU5IVkFBRUFBa0FBQUFRUTBORFFVRkRWRWRVVkVOQlFVTkhWQUFFQUFrQUFBQVFWRWRVUjBOSFIwZFVRVWRCUTBGRFJ3QUVBQWtBQUFBUVZFZFVSME5IUjBkVVFVZEJRMEZEUndBRUFBa0FBQUFRVkVORFZFTlVWRUZIUVVORFZFTkRSd0FFQUFrQUFBQVFWRU5EVkVOVVZFRkhRVU5EVkVORFJ3QUVBQWtBQUFBUVFWUkRRVU5CUjBGSFIwZEJSMEZCVkFBRUFBa0FBQUFRUVZSRFFVTkJSMEZIUjBkQlIwRkJWQUFFQUFrQUFBQVFRMGRIUVVGRFEwZFVSMEZCVkZSSFFRQUVBQWtBQUFBUVEwZEhRVUZEUTBkVVIwRkJWRlJIUVFBRUFBa0FBQUFRVkZSVVFVZFVRMEZIUjFSVVZFRkRRd0FFQUFrQUFBQVFWRlJVUVVkVVEwRkhSMVJVVkVGRFF3QUVBQWtBQUFBUVIwZERWRlJVUTFSRFZGUlVRVU5CUXdBRUFBa0FBQUFRUjBkRFZGUlVRMVJEVkZSVVFVTkJRd0FFQUFrQUFBQVFSMEZVUTBGRFFVTkJRMGRCUTBkVVF3QUVBQWtBQUFBUVIwRlVRMEZEUVVOQlEwZEJRMGRVUXdBRUFBa0FBQUFRUjFSRFFVZERSMEZIVkVOQlEwRkhSd0FFQUFrQUFBQVFSMVJEUVVkRFIwRkhWRU5CUTBGSFJ3QUVBQWtBQUFBUVZGUkhSMGRVUVVkVVExUkJRVU5VUndBRUFBa0FBQUFRVkZSSFIwZFVRVWRVUTFSQlFVTlVSd0FFQUFrQUFBQVFRVlJEUTFSQlZGUkRRVU5IUjBkQlFRQUVBQWtBQUFBUVFWUkRRMVJCVkZSRFFVTkhSMGRCUVFBRUFBa0FBQUFRUVZSVVZFTkJRMVJEVkVORFIwRlVRd0FFQUFrQUFBQVFRVlJVVkVOQlExUkRWRU5EUjBGVVF3QUVBQWtBQUFBUVIwRkRRMEZCVkVOQlIwTlVSMVJIUXdBRUFBa0FBQUFRUjBGRFEwRkJWRU5CUjBOVVIxUkhRd0FFQUFrQUFBQVFWRU5IUjBGVVFVRkhRMEZCUVZSRFFRQUVBQWtBQUFBUVZFTkhSMEZVUVVGSFEwRkJRVlJEUVFBRUFBa0FBQUFRVkZSQlIxUkRWRWRVUVZSVVIwZERWQUFFQUFrQUFBQVFWRlJCUjFSRFZFZFVRVlJVUjBkRFZBQUVBQWtBQUFBUVIwZEhRVWRCVkVGSFIwTlVSMEZCUXdBRUFBa0FBQUFRUjBkSFFVZEJWRUZIUjBOVVIwRkJRd0FFQUFrQUFBQVFRME5VUTBGQlExUkRSMVJVUTFSSFF3QUVBQWtBQUFBUVEwTlVRMEZCUTFSRFIxUlVRMVJIUXdBRUFBa0FBQUFRVkZSRFFVZEhRVU5CUTFSSFEwRkRSd0FFQUFrQUFBQVFWRlJEUVVkSFFVTkJRMVJIUTBGRFJ3QUVBQWtBQUFBUVEwRkhRMGRVUjBkVVEwRkhSMEZIVkFBRUFBa0FBQUFRUTBGSFEwZFVSMGRVUTBGSFIwRkhWQUFFQUFrQUFBQVFWRU5EUVZSSFEwTkJRVWRCUVZSSFZBQUVBQWtBQUFBUVZFTkRRVlJIUTBOQlFVZEJRVlJIVkFBRUFBa0FBQUFRUjBGSFFVTlVWRUZIUVVOVVFVTkRWQUFFQUFrQUFBQVFSMEZIUVVOVVZFRkhRVU5VUVVORFZBQUVBQWtBQUFBUVExUkhRVWREUjBkVVExUlVWRUZVUXdBRUFBa0FBQUFRUTFSSFFVZERSMGRVUTFSVVZFRlVRd0FFQUFrQUFBQVFWRWRVUVVGRFIwTkJRVlJVVkVOSFJ3QUVBQWtBQUFBUVZFZFVRVUZEUjBOQlFWUlVWRU5IUndBRUFBa0FBQUFRUVVkQlZFRkhRVWRVUTBGRFFVRlVRd0FFQUFrQUFBQVFRVWRCVkVGSFFVZFVRMEZEUVVGVVF3QUVBQWtBQUFBUVZFTlVRME5IUVVOQlEwRkhWRU5CVkFBRUFBa0FBQUFRVkVOVVEwTkhRVU5CUTBGSFZFTkJWQUFFQUFrQUFBQVFWRWRCUVZSRFIwTkJWRWRCVkVkRFZBQUVBQWtBQUFBUVZFZEJRVlJEUjBOQlZFZEJWRWREVkFBRUFBa0FBQUFRUVVGVVIwRkRRMGRVVkVOVVExUkJWQUFFQUFrQUFBQVFRVUZVUjBGRFEwZFVWRU5VUTFSQlZBQUVBQWtBQUFBUVFVZEhRVUZCVkVGSFIwZEJRME5CVkFBRUFBa0FBQUFRUVVkSFFVRkJWRUZIUjBkQlEwTkJWQUFFQUFrQUFBQVFWRUZCUTFSVVEwTkJSMEZEUVZSRFZBQUVBQWtBQUFBUVZFRkJRMVJVUTBOQlIwRkRRVlJEVkFBRUFBa0FBQUFRUTBGVVIwTkJRVWRVUTBOVVEwRkhSd0FFQUFrQUFBQVFRMEZVUjBOQlFVZFVRME5VUTBGSFJ3QUVBQWtBQUFBUVIwTkRRVWRVUjFSRFFVZEhRVUZCVkFBRUFBa0FBQUFRUjBORFFVZFVSMVJEUVVkSFFVRkJWQUFFQUFrQUFBQVFRME5IUTBGQlIwRkhWRU5IUTBOQlF3QUVBQWtBQUFBUVEwTkhRMEZCUjBGSFZFTkhRME5CUXdBRUFBa0FBQUFRVkVkVVZFZEJSMVJEUVVGRFZFZEJRd0FFQUFrQUFBQVFWRWRVVkVkQlIxUkRRVUZEVkVkQlF3QUVBQWtBQUFBUVZFZFVRME5CUTFSRFFVTkJSMVJIVkFBRUFBa0FBQUFRVkVkVVEwTkJRMVJEUVVOQlIxUkhWQUFFQUFrQUFBQVFSMGRIUVVORFZFRkhRVU5VUTBGVVF3QUVBQWtBQUFBUVIwZEhRVU5EVkVGSFFVTlVRMEZVUXdBRUFBa0FBQUFRVkVGRFFVZEhWRU5CVkVOSFFWUkhWQUFFQUFrQUFBQVFWRUZEUVVkSFZFTkJWRU5IUVZSSFZBQUVBQWtBQUFBUVFWUkRRVlJVUTBOQlIwRkRRME5IVkFBRUFBa0FBQUFRUVZSRFFWUlVRME5CUjBGRFEwTkhWQUFFQUFrQUFBQVFWRUZEUTBkQlFVZFVSME5VUjBGVVZBQUVBQWtBQUFBUVZFRkRRMGRCUVVkVVIwTlVSMEZVVkFBRUFBa0FBQUFRVkVOQlZFZERRMGRVVkVkSFZFRkhSd0FFQUFrQUFBQVFWRU5CVkVkRFEwZFVWRWRIVkVGSFJ3QUVBQWtBQUFBUVZFRkJSMVJEUjBkVVEwRlVSMEZEVkFBRUFBa0FBQUFRVkVGQlIxUkRSMGRVUTBGVVIwRkRWQUFFQUFrQUFBQVFWRlJVUVVOSFZFZFVRME5IUVVOSFZBQUVBQWtBQUFBUVZGUlVRVU5IVkVkVVEwTkhRVU5IVkFBRUFBa0FBQUFRUVVkVVZFRkhRMEZIUjFSSFExUkhRUUFFQUFrQUFBQVFRVWRVVkVGSFEwRkhSMVJIUTFSSFFRQUVBQWtBQUFBUVEwTkRSMGRCUVVGSFZFTkJWRU5IVkFBRUFBa0FBQUFRUTBORFIwZEJRVUZIVkVOQlZFTkhWQUFFQUFrQUFBQVFWRWRCUVZSSFEwZFVWRUZCUjBGQlF3QUVBQWtBQUFBUVZFZEJRVlJIUTBkVVZFRkJSMEZCUXdBRUFBa0FBQUFRUVZSQlIwRkRRMEZIUjBGRFZGUkRWQUFFQUFrQUFBQVFRVlJCUjBGRFEwRkhSMEZEVkZSRFZBQUVBQWtBQUFBUVEwZEJSMGRCUVVkVVFVTkhRMVJVUVFBRUFBa0FBQUFRUTBkQlIwZEJRVWRVUVVOSFExUlVRUUFFQUFrQUFBQVFRMEZCVkZSVVEwRkhWRlJVUTBGSFF3QUVBQWtBQUFBUVEwRkJWRlJVUTBGSFZGUlVRMEZIUXdBRUFBa0FBQUFRVkZSVVIwZFVWRUZIVkVGQlIwRkRWQUFFQUFrQUFBQVFWRlJVUjBkVVZFRkhWRUZCUjBGRFZBQUVBQWtBQUFBUVIwRkJSMEZCVkZSRFEwRkRSMGRCUXdBRUFBa0FBQUFRUjBGQlIwRkJWRlJEUTBGRFIwZEJRd0FFQUFrQUFBQVFWRlJEVkVkVVFVZFVSMGRVUVVGVVFRQUVBQWtBQUFBUVZGUkRWRWRVUVVkVVIwZFVRVUZVUVFBRUFBa0FBQUFRUTBORFZFZEJWRU5CVkZSSFZFRkhRd0FFQUFrQUFBQVFRME5EVkVkQlZFTkJWRlJIVkVGSFF3QUVBQWtBQUFBUVFVRkJRMGREVkVGSFIwRlVWRU5CUVFBRUFBa0FBQUFRUVVGQlEwZERWRUZIUjBGVVZFTkJRUUFFQUFrQUFBQVFRVWRIUVVkSFZGUkRRMEZEVkVGSFFRQUVBQWtBQUFBUVFVZEhRVWRIVkZSRFEwRkRWRUZIUVFBRUFBa0FBQUFRUjFSVVEwZERWRU5CUVVOVVEwZFVRUUFFQUFrQUFBQVFSMVJVUTBkRFZFTkJRVU5VUTBkVVFRQUVBQWtBQUFBUVZFTkJWRUZEVkZSRFFWUlVWRU5IVkFBRUFBa0FBQUFRVkVOQlZFRkRWRlJEUVZSVVZFTkhWQUFFQUFrQUFBQVFSME5VUVVORFZFZFVRMVJEUjBkQlF3QUVBQWtBQUFBUVIwTlVRVU5EVkVkVVExUkRSMGRCUXdBRUFBa0FBQUFRVkVGSFFVTlVSME5CUVZSVVZFTlVRd0FFQUFrQUFBQVFWRUZIUVVOVVIwTkJRVlJVVkVOVVF3QUVBQWtBQUFBUVZFTkJRVWREUVVGSFEwZEJSMVJEUVFBRUFBa0FBQUFRVkVOQlFVZERRVUZIUTBkQlIxUkRRUUFFQUFrQUFBQVFRVUZVUTBGRFIwRkhRVU5VUTFSQlF3QUVBQWtBQUFBUVFVRlVRMEZEUjBGSFFVTlVRMVJCUXdBRUFBa0FBQUFRVkZSQlFWUkRRMEZIUjBkVVZFRkJWQUFFQUFrQUFBQVFWRlJCUVZSRFEwRkhSMGRVVkVGQlZBQUVBQWtBQUFBUVEwTlVRMEZIVkVGSFIxUlVRMVJCUXdBRUFBa0FBQUFRUTBOVVEwRkhWRUZIUjFSVVExUkJRd0FFQUFrQUFBQVFRMVJIUjFSRFZFZFVRVlJEUTBOVVF3QUVBQWtBQUFBUVExUkhSMVJEVkVkVVFWUkRRME5VUXdBRUFBa0FBQUFRUVZSRFIxUkJSMGRVUVZSRFEwTlVRd0FFQUFrQUFBQVFRVlJEUjFSQlIwZFVRVlJEUTBOVVF3QUVBQWtBQUFBUVZFRlVRVU5EVkZSRFIwRkJRMGREUXdBRUFBa0FBQUFRVkVGVVFVTkRWRlJEUjBGQlEwZERRd0FFQUFrQUFBQVFWRU5VUjFSRFIxUkRRMGRVUjBGRFJ3QUVBQWtBQUFBUVZFTlVSMVJEUjFSRFEwZFVSMEZEUndBRUFBa0FBQUFRUjFSRFEwRkRWRU5CUVVGVVEwRkJSd0FFQUFrQUFBQVFSMVJEUTBGRFZFTkJRVUZVUTBGQlJ3QUVBQWtBQUFBUVFVZEJRVU5CUVVkVVFVZEhRMVJEUXdBRUFBa0FBQUFRUVVkQlFVTkJRVWRVUVVkSFExUkRRd0FFQUFrQUFBQVFRVWREUVZSRFFVTkJSMGRCUVZSQlZBQUVBQWtBQUFBUVFVZERRVlJEUVVOQlIwZEJRVlJCVkFBRUFBa0FBQUFRVkVGQlIwTkJRMGRVUVZSVVZFTkhSd0FFQUFrQUFBQVFWRUZCUjBOQlEwZFVRVlJVVkVOSFJ3QUVBQWtBQUFBUVZGUkRRVU5EUjFSRFExUkhSMVJEVkFBRUFBa0FBQUFRVkZSRFFVTkRSMVJEUTFSSFIxUkRWQUFFQUFrQUFBQVFSMVJEUVVOVVEwZFVRVlJIUjFSQlFRQUVBQWtBQUFBUVIxUkRRVU5VUTBkVVFWUkhSMVJCUVFBRUFBa0FBQUFRUjBGVVFVZERWRU5CUVZSSFEwRkhSd0FFQUFrQUFBQVFSMEZVUVVkRFZFTkJRVlJIUTBGSFJ3QUVBQWtBQUFBUVEwZEJSMVJVUVVOQlIwTlVRVU5EUndBRUFBa0FBQUFRUTBkQlIxUlVRVU5CUjBOVVFVTkRSd0FFQUFrQUFBQVFWRUZVUTBkRFEwTkJRMGRCUjBGQlF3QUVBQWtBQUFBUVZFRlVRMGREUTBOQlEwZEJSMEZCUXdBRUFBa0FBQUFRVkVGVVExUkhWRU5CUVVkQlExUkhSd0FFQUFrQUFBQVFWRUZVUTFSSFZFTkJRVWRCUTFSSFJ3QUVBQWtBQUFBUVZGUkhRVWRVUjBGSFZFRkhRMEZVUVFBRUFBa0FBQUFRVkZSSFFVZFVSMEZIVkVGSFEwRlVRUUFFQUFrQUFBQVFRVWRVUVVORFFVTkJRVWREUTFSSFF3QUVBQWtBQUFBUVFVZFVRVU5EUVVOQlFVZERRMVJIUXdBRUFBa0FBQUFRUjFSRFFVTkhSME5CUTBOQlFVTkJWQUFFQUFrQUFBQVFSMVJEUVVOSFIwTkJRME5CUVVOQlZBQUVBQWtBQUFBUVIwRlVWRlJEVkZSRFEwTkJRMEZIUndBRUFBa0FBQUFRUjBGVVZGUkRWRlJEUTBOQlEwRkhSd0FFQUFrQUFBQVFWRU5CUVZSRFZGUkRRVU5VUTBkQlFRQUVBQWtBQUFBUVZFTkJRVlJEVkZSRFFVTlVRMGRCUVFBRUFBa0FBQUFRUTBOSFIwZFVRVlJEUTBkQlIwZERWQUFFQUFrQUFBQVFRME5IUjBkVVFWUkRRMGRCUjBkRFZBQUVBQWtBQUFBUVFVTlVSMVJEUTBGSFIwZERRVUZEVkFBRUFBa0FBQUFRUVVOVVIxUkRRMEZIUjBkRFFVRkRWQUFFQUFrQUFBQVFRMVJEUVVGRFExUkRRVWRIUVVOSFFRQUVBQWtBQUFBUVExUkRRVUZEUTFSRFFVZEhRVU5IUVFBRUFBa0FBQUFRUjFSSFZGUkJSMEZIVkVkRFExUkRSd0FFQUFrQUFBQVFSMVJIVkZSQlIwRkhWRWREUTFSRFJ3QUVBQWtBQUFBUVFVTkhSMVJVUVZSRFZGUkRWRlJEUXdBRUFBa0FBQUFRUVVOSFIxUlVRVlJEVkZSRFZGUkRRd0FFQUFrQUFBQVFRMEZIUjFSQlZGUkRRVU5IUjBkQlFRQUVBQWtBQUFBUVEwRkhSMVJCVkZSRFFVTkhSMGRCUVFBRUFBa0FBQUFRUVVGSFZFTkhWRUZIUVVOSFIxUkRRUUFFQUFrQUFBQVFRVUZIVkVOSFZFRkhRVU5IUjFSRFFRQUVBQWtBQUFBUVZFZEJRMEZIVkVGSFZFTlVWRU5EUXdBRUFBa0FBQUFRVkVkQlEwRkhWRUZIVkVOVVZFTkRRd0FFQUFrQUFBQVFRMEZVVkZSRFFWUkRRVU5VUVVkRFFRQUVBQWtBQUFBUVEwRlVWRlJEUVZSRFFVTlVRVWREUVFBRUFBa0FBQUFRUTBGQlIwZEhRVUZIUjBkVVFVTkhWQUFFQUFrQUFBQVFRMEZCUjBkSFFVRkhSMGRVUVVOSFZBQUVBQWtBQUFBUVIxUkhRMEZIUTBOQlIwTlVSMVJEUndBRUFBa0FBQUFRUjFSSFEwRkhRME5CUjBOVVIxUkRSd0FFQUFrQUFBQVFRVWRCUVVOQlFVRkhWRUZCUjBGRFZBQUVBQWtBQUFBUVFVZEJRVU5CUVVGSFZFRkJSMEZEVkFBRUFBa0FBQUFRUjBGRFIwTlVSMGRVVkVOVVEwZERWQUFFQUFrQUFBQVFSMEZEUjBOVVIwZFVWRU5VUTBkRFZBQUVBQWtBQUFBUVFVZEJRMEZCUVVOQlFVRkRRVU5EVkFBRUFBa0FBQUFRUVVkQlEwRkJRVU5CUVVGRFFVTkRWQUFFQUFrQUFBQVFWRlJVUjFSVVIxUkRRMGRCVkZSQlJ3QUVBQWtBQUFBUVZGUlVSMVJVUjFSRFEwZEJWRlJCUndBRUFBa0FBQUFRVkVGSFEwRkRRVWRVUVVOVVEwZFVRUUFFQUFrQUFBQVFWRUZIUTBGRFFVZFVRVU5VUTBkVVFRQUVBQWtBQUFBUVExUkJRVU5EUTFSRFEwRlVRVU5CUndBRUFBa0FBQUFRUTFSQlFVTkRRMVJEUTBGVVFVTkJSd0FFQUFrQUFBQVFSMGRIUTFSQlEwTkJSME5EVkZSRFZBQUVBQWtBQUFBUVIwZEhRMVJCUTBOQlIwTkRWRlJEVkFBRUFBa0FBQUFRVkZSVVIwZFVWRWRVVkVOVVExUkJWQUFFQUFrQUFBQVFWRlJVUjBkVVZFZFVWRU5VUTFSQlZBQUVBQWtBQUFBUVZFZEhRVlJIVkVkVVZGUkRSMGREUndBRUFBa0FBQUFRVkVkSFFWUkhWRWRVVkZSRFIwZERSd0FFQUFrQUFBQVFSMVJIUjBGQlIwTkJWRU5CUjBOQlZBQUVBQWtBQUFBUVIxUkhSMEZCUjBOQlZFTkJSME5CVkFBRUFBa0FBQUFRUjBOVVZFTkJRMEZIUjFSVVFVRkJRd0FFQUFrQUFBQVFSME5VVkVOQlEwRkhSMVJVUVVGQlF3QUVBQWtBQUFBUVIwRkRRMGRVUjBkVVEwZFVRMEZVUVFBRUFBa0FBQUFRUjBGRFEwZFVSMGRVUTBkVVEwRlVRUUFFQUFrQUFBQVFWRU5EVkZSRFZFZFVRVlJEUVVGSFFRQUVBQWtBQUFBUVZFTkRWRlJEVkVkVVFWUkRRVUZIUVFBRUFBa0FBQUFRVkVkSFIwTkhWRWRVUTBkVVZGUkRRd0FFQUFrQUFBQVFWRWRIUjBOSFZFZFVRMGRVVkZSRFF3QUVBQWtBQUFBUVFWUlVRMEZVUTBkVVZFTkJRVUZIUVFBRUFBa0FBQUFRUVZSVVEwRlVRMGRVVkVOQlFVRkhRUUFFQUFrQUFBQVFSMVJCVkZSSFIwZFVRMGRCVkVkRFF3QUVBQWtBQUFBUVIxUkJWRlJIUjBkVVEwZEJWRWREUXdBRUFBa0FBQUFRUTBGRFZFRkJSME5CVkVORFZGUkhRd0FFQUFrQUFBQVFRMEZEVkVGQlIwTkJWRU5EVkZSSFF3QUVBQWtBQUFBUVIxUkhRVlJIVkZSRFZFZERSMGRIVkFBRUFBa0FBQUFRUjFSSFFWUkhWRlJEVkVkRFIwZEhWQUFFQUFrQUFBQVFWRWRCVkVkSFZGUkRWRlJEUjBOVVJ3QUVBQWtBQUFBUVZFZEJWRWRIVkZSRFZGUkRSME5VUndBRUFBa0FBQUFRUjBkVVFVRlVRME5CUTBGQlEwRlVRd0FFQUFrQUFBQVFSMGRVUVVGVVEwTkJRMEZCUTBGVVF3QUVBQWtBQUFBUVExUlVRMVJCUVVGSFExUkhRMGRCUVFBRUFBa0FBQUFRUTFSVVExUkJRVUZIUTFSSFEwZEJRUUFFQUFrQUFBQVFRMGRCUjFSSFExUkRWRlJVUjBGVVF3QUVBQWtBQUFBUVEwZEJSMVJIUTFSRFZGUlVSMEZVUXdBRUFBa0FBQUFRUVVGSFEwZEJSMGRVVkVkVVExUkJSd0FFQUFrQUFBQVFRVUZIUTBkQlIwZFVWRWRVUTFSQlJ3QUVBQWtBQUFBUVEwRlVWRWREUTBOQlEwRkRSMGRVUXdBRUFBa0FBQUFRUTBGVVZFZERRME5CUTBGRFIwZFVRd0FFQUFrQUFBQVFRMEZVUjBkQlZFZFVRMGREUVZSSFF3QUVBQWtBQUFBUVEwRlVSMGRCVkVkVVEwZERRVlJIUXdBRUFBa0FBQUFRUTBGSFIwZERWRUZIUVVGSFFVZERRUUFFQUFrQUFBQVFRMEZIUjBkRFZFRkhRVUZIUVVkRFFRQUVBQWtBQUFBUVZFZEJRMVJEUTBkVVEwTlVRMEZVUXdBRUFBa0FBQUFRVkVkQlExUkRRMGRVUTBOVVEwRlVRd0FFQUFrQUFBQVFRMEZEUVVGRFFVZFVSMGRCUTBGSFZBQUVBQWtBQUFBUVEwRkRRVUZEUVVkVVIwZEJRMEZIVkFBRUFBa0FBQUFRUTBOQlFVZERSME5CVkZSSFFVZERWQUFFQUFrQUFBQVFRME5CUVVkRFIwTkJWRlJIUVVkRFZBQUVBQWtBQUFBUVZFZEJWRWREUVVOQlEwTkhRVUZVVkFBRUFBa0FBQUFRVkVkQlZFZERRVU5CUTBOSFFVRlVWQUFFQUFrQUFBQVFSMGRCVkVOVVFWUkRSME5VUVVOQlFRQUVBQWtBQUFBUVIwZEJWRU5VUVZSRFIwTlVRVU5CUVFBRUFBa0FBQUFRUTBkVVFVRkhWRlJEUjBkQlZFRkJRUUFFQUFrQUFBQVFRMGRVUVVGSFZGUkRSMGRCVkVGQlFRQUVBQWtBQUFBUVZFTkRWRU5EUTFSRFZGUkJRMEZEVkFBRUFBa0FBQUFRVkVORFZFTkRRMVJEVkZSQlEwRkRWQUFFQUFrQUFBQVFWRWRCUVZSSFExUkRSMGRCUjBGVVJ3QUVBQWtBQUFBUVZFZEJRVlJIUTFSRFIwZEJSMEZVUndBRUFBa0FBQUFRUVVOQlEwRkhWRlJEUVVGSFExUkhWQUFFQUFrQUFBQVFRVU5CUTBGSFZGUkRRVUZIUTFSSFZBQUVBQWtBQUFBUVIwZEJSMEZCUTBOQlFVZERRVU5CUndBRUFBa0FBQUFRUjBkQlIwRkJRME5CUVVkRFFVTkJSd0FFQUFrQUFBQVFSMEZEUTFSVVEwTkJSMVJEUVVOSFF3QUVBQWtBQUFBUVIwRkRRMVJVUTBOQlIxUkRRVU5IUXdBRUFBa0FBQUFRUVZSSFIxUlVSMVJEUVZSQlIwTkJRd0FFQUFrQUFBQVFRVlJIUjFSVVIxUkRRVlJCUjBOQlF3QUVBQWtBQUFBUVIwRlVWRlJEVkVGSFEwTkJWRlJVUndBRUFBa0FBQUFRUjBGVVZGUkRWRUZIUTBOQlZGUlVSd0FFQUFrQUFBQVFSMEZEUTBkVVIwZFVWRWRCUTFSSFZBQUVBQWtBQUFBUVIwRkRRMGRVUjBkVVZFZEJRMVJIVkFBRUFBa0FBQUFRUTBkSFZFTkJSMVJEVkVGSFFWUkRSd0FFQUFrQUFBQVFRMGRIVkVOQlIxUkRWRUZIUVZSRFJ3QUVBQWtBQUFBUVFWUkRSMVJCUjBOQlEwRlVRVWREVkFBRUFBa0FBQUFRUVZSRFIxUkJSME5CUTBGVVFVZERWQUFFQUFrQUFBQVFRMEZCVkVkQlEwRkhRME5VVkVOVVF3QUVBQWtBQUFBUVEwRkJWRWRCUTBGSFEwTlVWRU5VUXdBRUFBa0FBQUFRUTBkRFIxUkhRVUZIUjBOQlIwZEhRUUFFQUFrQUFBQVFRMGREUjFSSFFVRkhSME5CUjBkSFFRQUVBQWtBQUFBUVZFZERSMEZEUjBkVVFVRkhRVlJVUndBRUFBa0FBQUFRVkVkRFIwRkRSMGRVUVVGSFFWUlVSd0FFQUFrQUFBQVFWRWRVUjBOSFIwTkJWRU5VUVVkQlF3QUVBQWtBQUFBUVZFZFVSME5IUjBOQlZFTlVRVWRCUXdBRUFBa0FBQUFRUjFSVVEwRlVWRlJEUTFSVVFWUkJRd0FFQUFrQUFBQVFSMVJVUTBGVVZGUkRRMVJVUVZSQlF3QUVBQWtBQUFBUVZFRkJSME5EUVVGSFExUlVSMVJVUndBRUFBa0FBQUFRVkVGQlIwTkRRVUZIUTFSVVIxUlVSd0FFQUFrQUFBQVFRVlJVVkVOVVIwZFVSMEZIVkVOQlJ3QUVBQWtBQUFBUVFWUlVWRU5VUjBkVVIwRkhWRU5CUndBRUFBa0FBQUFRUTBGQlZFTkhRVUZIUjBkQlIxUkhSd0FFQUFrQUFBQVFRMEZCVkVOSFFVRkhSMGRCUjFSSFJ3QUVBQWtBQUFBUVIxUkhSMVJVUVVkVVZFZEhWRUZIUndBRUFBa0FBQUFRUjFSSFIxUlVRVWRVVkVkSFZFRkhSd0FFQUFrQUFBQVFRMGRCVkVkSFEwRkhRMEZEUTBGSFFRQUVBQWtBQUFBUVEwZEJWRWRIUTBGSFEwRkRRMEZIUVFBRUFBa0FBQUFRUTBGQlFVZEJRVUZIVkVkRFFVTlVWQUFFQUFrQUFBQVFRMEZCUVVkQlFVRkhWRWREUVVOVVZBQUVBQWtBQUFBUVZFZEJWRU5CUjBGSFZGUlVRMVJVUXdBRUFBa0FBQUFRVkVkQlZFTkJSMEZIVkZSVVExUlVRd0FFQUFrQUFBQVFRMVJEUTFSRFEwZFVSMGREUVVkQlZBQUVBQWtBQUFBUVExUkRRMVJEUTBkVVIwZERRVWRCVkFBRUFBa0FBQUFRUTBORFZFRkJRMGRVUjBkSFZFTkJRUUFFQUFrQUFBQVFRME5EVkVGQlEwZFVSMGRIVkVOQlFRQUVBQWtBQUFBUVZFZEhRVWRIUVVkVVFVTkRSMVJEUndBRUFBa0FBQUFRVkVkSFFVZEhRVWRVUVVORFIxUkRSd0FFQUFrQUFBQVFRMGRCUTBGSFEwRkhWRlJIUjBGSFF3QUVBQWtBQUFBUVEwZEJRMEZIUTBGSFZGUkhSMEZIUXdBRUFBa0FBQUFRVkVkSFFWUkhWRUZIVkVORFEwZEhWQUFFQUFrQUFBQVFWRWRIUVZSSFZFRkhWRU5EUTBkSFZBQUVBQWtBQUFBUVZFZFVWRUZEVkZSRFIxUkhRVWRCUndBRUFBa0FBQUFRVkVkVVZFRkRWRlJEUjFSSFFVZEJSd0FFQUFrQUFBQVFSMEZVVkZSRFZFRkhSMGRCUjBGVVFRQUVBQWtBQUFBUVIwRlVWRlJEVkVGSFIwZEJSMEZVUVFBRUFBa0FBQUFRUjBGSFFVTkRRMEZIVkVGSFEwRkJWQUFFQUFrQUFBQVFSMEZIUVVORFEwRkhWRUZIUTBGQlZBQUVBQWtBQUFBUVZGUkRRVU5IUTBGSFFVZERRVlJEUndBRUFBa0FBQUFRVkZSRFFVTkhRMEZIUVVkRFFWUkRSd0FFQUFrQUFBQVFRVWRIUTBGVVZGUkRSMEZCUVVOQlFRQUVBQWtBQUFBUVFVZEhRMEZVVkZSRFIwRkJRVU5CUVFBRUFBa0FBQUFRUVVOVVFWUkhSMVJEUjBOQlEwZEhWQUFFQUFrQUFBQVFRVU5VUVZSSFIxUkRSME5CUTBkSFZBQUVBQWtBQUFBUVIwRkJWRUZIUVVOQlIwRkJRMGREUVFBRUFBa0FBQUFRUjBGQlZFRkhRVU5CUjBGQlEwZERRUUFFQUFrQUFBQVFRVWRCUjBORFExUkRRME5IUVVkSFZBQUVBQWtBQUFBUVFVZEJSME5EUTFSRFEwTkhRVWRIVkFBRUFBa0FBQUFRVkZSQlEwZFVWRlJEUTFSVVZFRkhWQUFFQUFrQUFBQVFWRlJCUTBkVVZGUkRRMVJVVkVGSFZBQUVBQWtBQUFBUVIxUkJSME5VUVVOQlEwZEJWRUZIUndBRUFBa0FBQUFRUjFSQlIwTlVRVU5CUTBkQlZFRkhSd0FFQUFrQUFBQVFWRUZVUjFSVVEwRkhRVlJCUTBGVVJ3QUVBQWtBQUFBUVZFRlVSMVJVUTBGSFFWUkJRMEZVUndBRUFBa0FBQUFRVkVOSFEwRkhSMEZIUjBkQlIxUkhSd0FFQUFrQUFBQVFWRU5IUTBGSFIwRkhSMGRCUjFSSFJ3QUVBQWtBQUFBUVIxUkJWRlJVUTBOQlIwTlVRVlJVUndBRUFBa0FBQUFRUjFSQlZGUlVRME5CUjBOVVFWUlVSd0FFQUFrQUFBQVFWRWRCVkVkSFZFRkhRVlJIUTFSQlFRQUVBQWtBQUFBUVZFZEJWRWRIVkVGSFFWUkhRMVJCUVFBRUFBa0FBQUFRVkZSSFEwZFVRME5CUjBGQlFVTkRSd0FFQUFrQUFBQVFWRlJIUTBkVVEwTkJSMEZCUVVORFJ3QUVBQWtBQUFBUVZFTkJWRU5CVkVGSFFVRkRRVUZIUndBRUFBa0FBQUFRVkVOQlZFTkJWRUZIUVVGRFFVRkhSd0FFQUFrQUFBQVFRMGRCUVVkSFFVRkhWRUZIUjBGVVZBQUVBQWtBQUFBUVEwZEJRVWRIUVVGSFZFRkhSMEZVVkFBRUFBa0FBQUFRUTBGQlZFRkRSMVJEUVVORFEwRlVRd0FFQUFrQUFBQVFRMEZCVkVGRFIxUkRRVU5EUTBGVVF3QUVBQWtBQUFBUVFVRkRRVUZIUVVGSFFVZEJSME5CUVFBRUFBa0FBQUFRUVVGRFFVRkhRVUZIUVVkQlIwTkJRUUFFQUFrQUFBQVFRMEZIVkVkRFIwZFVRMEZCVkVOVVJ3QUVBQWtBQUFBUVEwRkhWRWREUjBkVVEwRkJWRU5VUndBRUFBa0FBQUFRUjBGSFFWUkhSME5CVkVkSFZFRkRWQUFFQUFrQUFBQVFSMEZIUVZSSFIwTkJWRWRIVkVGRFZBQUVBQWtBQUFBUVZGUlVSMEZEVkZSRFFWUlVWRU5EUVFBRUFBa0FBQUFRVkZSVVIwRkRWRlJEUVZSVVZFTkRRUUFFQUFrQUFBQVFRMEZVVkVORFIwRkhWRWRCVkVGSFZBQUVBQWtBQUFBUVEwRlVWRU5EUjBGSFZFZEJWRUZIVkFBRUFBa0FBQUFRUVVOSFFWUkhWRWRVUVVORFEwZEJRd0FFQUFrQUFBQVFRVU5IUVZSSFZFZFVRVU5EUTBkQlF3QUVBQWtBQUFBUVExUkRRMVJEUTBkVVZFTlVSMEZIVkFBRUFBa0FBQUFRUTFSRFExUkRRMGRVVkVOVVIwRkhWQUFFQUFrQUFBQVFWRlJEVkVGQlEwTkJWRUZCUjBGVVJ3QUVBQWtBQUFBUVZGUkRWRUZCUTBOQlZFRkJSMEZVUndBRUFBa0FBQUFRVkZSSFZFZEhRVlJEUjBGRFIwRkhRUUFFQUFrQUFBQVFWRlJIVkVkSFFWUkRSMEZEUjBGSFFRQUVBQWtBQUFBUVFWUlVRVlJEUTBkVVZFTkhSMGRVUXdBRUFBa0FBQUFRUVZSVVFWUkRRMGRVVkVOSFIwZFVRd0FFQUFrQUFBQVFRVlJVUTBORFIwZFVRVU5IUTBkVVF3QUVBQWtBQUFBUVFWUlVRME5EUjBkVVFVTkhRMGRVUXdBRUFBa0FBQUFRUjFSSFIxUlVRVlJEUVVOQlEwTkhSd0FFQUFrQUFBQVFSMVJIUjFSVVFWUkRRVU5CUTBOSFJ3QUVBQWtBQUFBUVExUkRRVWRIUjBkVVIwRkRRVU5IUVFBRUFBa0FBQUFRUTFSRFFVZEhSMGRVUjBGRFFVTkhRUUFFQUFrQUFBQVFWRlJVUTBGVVIwTkJRME5CUVVGSFJ3QUVBQWtBQUFBUVZGUlVRMEZVUjBOQlEwTkJRVUZIUndBRUFBa0FBQUFRUjBkQlFWUkhSME5CUjBGSFFVRkJSd0FFQUFrQUFBQVFSMGRCUVZSSFIwTkJSMEZIUVVGQlJ3QUVBQWtBQUFBUVExUkJRME5EUVVGSFIwZERRVUZVUXdBRUFBa0FBQUFRUTFSQlEwTkRRVUZIUjBkRFFVRlVRd0FFQUFrQUFBQVFRVUZEUTFSSFFVTkJRVU5CVkVGRFF3QUVBQWtBQUFBUVFVRkRRMVJIUVVOQlFVTkJWRUZEUXdBRUFBa0FBQUFRUjBOQlFVTkRSME5CUTBGVVFWUkhRd0FFQUFrQUFBQVFSME5CUVVORFIwTkJRMEZVUVZSSFF3QUVBQWtBQUFBUVExUkhRMVJEUVVGSFExUkRRMGRCUXdBRUFBa0FBQUFRUTFSSFExUkRRVUZIUTFSRFEwZEJRd0FFQUFrQUFBQVFSME5VVkVOQlEwTkJSMGRVUVVOSFFRQUVBQWtBQUFBUVIwTlVWRU5CUTBOQlIwZFVRVU5IUVFBRUFBa0FBQUFRUVVGSFZFRkRRMEZIVkVGSFIxUlVRUUFFQUFrQUFBQVFRVUZIVkVGRFEwRkhWRUZIUjFSVVFRQUVBQWtBQUFBUVEwRkJSMEZEVkZSRFZFTkJRVlJEVkFBRUFBa0FBQUFRUTBGQlIwRkRWRlJEVkVOQlFWUkRWQUFFQUFrQUFBQVFRVUZVUjBORFFVRkhSMEZVUTBGRFJ3QUVBQWtBQUFBUVFVRlVSME5EUVVGSFIwRlVRMEZEUndBRUFBa0FBQUFRUVVORFIxUlVRMEZIUVZSVVFVTkRRd0FFQUFrQUFBQVFRVU5EUjFSVVEwRkhRVlJVUVVORFF3QUVBQWtBQUFBUVEwTkRWRU5VUTBOQlFVRkhRVUZEVkFBRUFBa0FBQUFRUTBORFZFTlVRME5CUVVGSFFVRkRWQUFFQUFrQUFBQVFWRlJEUjBGVVZFTkJRMEZIVkVORFJ3QUVBQWtBQUFBUVZGUkRSMEZVVkVOQlEwRkhWRU5EUndBRUFBa0FBQUFRUTBOVVEwTlVRMVJEVkZSSFEwRkhRUUFFQUFrQUFBQVFRME5VUTBOVVExUkRWRlJIUTBGSFFRQUVBQWtBQUFBUVIxUlVRMEZVVkZSRFIwRlVRME5EVkFBRUFBa0FBQUFRUjFSVVEwRlVWRlJEUjBGVVEwTkRWQUFFQUFrQUFBQVFWRU5CUjBkSFEwRkhWRWRCVkVkSFF3QUVBQWtBQUFBUVZFTkJSMGRIUTBGSFZFZEJWRWRIUXdBRUFBa0FBQUFRUTBOVVExUkRRME5CUjFSRFFVZFVWQUFFQUFrQUFBQVFRME5VUTFSRFEwTkJSMVJEUVVkVVZBQUVBQWtBQUFBUVIwRkJWRU5CUTFSRFEwTlVWRWRIVkFBRUFBa0FBQUFRUjBGQlZFTkJRMVJEUTBOVVZFZEhWQUFFQUFrQUFBQVFRVWRCUTBOQlZFZFVRVU5CUVVkVVFRQUVBQWtBQUFBUVFVZEJRME5CVkVkVVFVTkJRVWRVUVFBRUFBa0FBQUFRUVZSVVEwTkJWRU5CVkVOVVEwZFVRd0FFQUFrQUFBQVFRVlJVUTBOQlZFTkJWRU5VUTBkVVF3QUVBQWtBQUFBUVFWUkhSMVJVUjBOQlZFRkhWRU5CUXdBRUFBa0FBQUFRUVZSSFIxUlVSME5CVkVGSFZFTkJRd0FFQUFrQUFBQVFRVlJCUTBOVVZFRkhWRUZCUTBGSFZBQUVBQWtBQUFBUVFWUkJRME5VVkVGSFZFRkJRMEZIVkFBRUFBa0FBQUFRUTFSSFZFRkRRMGRVUjBORFZFRlVRUUFFQUFrQUFBQVFRMVJIVkVGRFEwZFVSME5EVkVGVVFRQUVBQWtBQUFBUVFVZERSMVJCVkVOQlIwTkhSMEZVUVFBRUFBa0FBQUFRUVVkRFIxUkJWRU5CUjBOSFIwRlVRUUFFQUFrQUFBQVFWRU5CUjBORFZFRkhWRWREUTBOSFZBQUVBQWtBQUFBUVZFTkJSME5EVkVGSFZFZERRME5IVkFBRUFBa0FBQUFRVkVGQlIwTkRRVWRVVkVOVVEwTlVSd0FFQUFrQUFBQVFWRUZCUjBORFFVZFVWRU5VUTBOVVJ3QUVBQWtBQUFBUVZFZEhRVUZEVkZSRFIwTkJRMGRCUXdBRUFBa0FBQUFRVkVkSFFVRkRWRlJEUjBOQlEwZEJRd0FFQUFrQUFBQVFRVlJVUTBOVVFWUkRSME5VUjBGVVFRQUVBQWtBQUFBUVFWUlVRME5VUVZSRFIwTlVSMEZVUVFBRUFBa0FBQUFRUTBGQlIwRkRWRU5CVkVkRFFVZEhRUUFFQUFrQUFBQVFRMEZCUjBGRFZFTkJWRWREUVVkSFFRQUVBQWtBQUFBUVFVZERRMEZEUjFSRFIwZFVSMVJVUVFBRUFBa0FBQUFRUVVkRFEwRkRSMVJEUjBkVVIxUlVRUUFFQUFrQUFBQVFWRlJVUjFSVVIwTkJSME5EUjFSRFFRQUVBQWtBQUFBUVZGUlVSMVJVUjBOQlIwTkRSMVJEUVFBRUFBa0FBQUFRVkVkVVZFTkRSME5CUjFSQlFVTkRWQUFFQUFrQUFBQVFWRWRVVkVORFIwTkJSMVJCUVVORFZBQUVBQWtBQUFBUVZFTkRWRlJVUTFSRFEwZERSMGRCVkFBRUFBa0FBQUFRVkVORFZGUlVRMVJEUTBkRFIwZEJWQUFFQUFrQUFBQVFWRlJEUTBkVVIwZFVWRU5IUjFSQlZBQUVBQWtBQUFBUVZGUkRRMGRVUjBkVVZFTkhSMVJCVkFBRUFBa0FBQUFRUVVkQlFVZFVRVU5CUTBGVVIwRkRWQUFFQUFrQUFBQVFRVWRCUVVkVVFVTkJRMEZVUjBGRFZBQUVBQWtBQUFBUVFVTkJSMEZCUVZSRFZFZFVRVUZEUndBRUFBa0FBQUFRUVVOQlIwRkJRVlJEVkVkVVFVRkRSd0FFQUFrQUFBQVFWRU5CUTBGQlIxUkRSMGRCUTBkVVF3QUVBQWtBQUFBUVZFTkJRMEZCUjFSRFIwZEJRMGRVUXdBRUFBa0FBQUFRUVVOQlEwZERSMVJEUTFSRFZFTkhRUUFFQUFrQUFBQVFRVU5CUTBkRFIxUkRRMVJEVkVOSFFRQUVBQWtBQUFBUVZFZEJWRWREUVVkVVEwRkJRVU5IUndBRUFBa0FBQUFRVkVkQlZFZERRVWRVUTBGQlFVTkhSd0FFQUFrQUFBQVFRVlJVVkVOQlEwZFVRME5IUjFSRFFRQUVBQWtBQUFBUVFWUlVWRU5CUTBkVVEwTkhSMVJEUVFBRUFBa0FBQUFRUjBORFFVZERRVlJEVkZSRFEwRkRSd0FFQUFrQUFBQVFSME5EUVVkRFFWUkRWRlJEUTBGRFJ3QUVBQWtBQUFBUVIxUkJSMVJCUTFSRFIwZERWRUZVUVFBRUFBa0FBQUFRUjFSQlIxUkJRMVJEUjBkRFZFRlVRUUFFQUFrQUFBQVFRMVJEUVVkQlFVTkJRME5IUTFSSFFRQUVBQWtBQUFBUVExUkRRVWRCUVVOQlEwTkhRMVJIUVFBRUFBa0FBQUFRUTBOSFIxUkJSMGRVUTBkRFZFTkhRUUFFQUFrQUFBQVFRME5IUjFSQlIwZFVRMGREVkVOSFFRQUVBQWtBQUFBUVZFRkRSME5VUTBGSFFVZFVRMVJVUXdBRUFBa0FBQUFRVkVGRFIwTlVRMEZIUVVkVVExUlVRd0FFQUFrQUFBQVFWRWREUjBGVVFWUkRRMVJEVkVGQlZBQUVBQWtBQUFBUVZFZERSMEZVUVZSRFExUkRWRUZCVkFBRUFBa0FBQUFRVkVOVVFVTkRSMGRVUVVOSFEwZFVRd0FFQUFrQUFBQVFWRU5VUVVORFIwZFVRVU5IUTBkVVF3QUVBQWtBQUFBUVFVRkhRVUZEUVVOQlIxUkJSMEZVUVFBRUFBa0FBQUFRUVVGSFFVRkRRVU5CUjFSQlIwRlVRUUFFQUFrQUFBQVFWRU5IUVVGRFFVTkJRMGRCVkVGSFJ3QUVBQWtBQUFBUVZFTkhRVUZEUVVOQlEwZEJWRUZIUndBRUFBa0FBQUFRUjBGRFFVZERRMEZIUTFSQlExUkJRd0FFQUFrQUFBQVFSMEZEUVVkRFEwRkhRMVJCUTFSQlF3QUVBQWtBQUFBUVFVTkJRMVJIUVZSRFFWUlVWRWRIUndBRUFBa0FBQUFRUVVOQlExUkhRVlJEUVZSVVZFZEhSd0FFQUFrQUFBQVFRVU5EVkVGRFExUkRWRlJEUjBkQlFRQUVBQWtBQUFBUVFVTkRWRUZEUTFSRFZGUkRSMGRCUVFBRUFBa0FBQUFRVkZSQlIxUkRWRlJEUVZSRFFVZFVSd0FFQUFrQUFBQVFWRlJCUjFSRFZGUkRRVlJEUVVkVVJ3QUVBQWtBQUFBUVFWUlVRMEZEVkZSRFExUkJRMVJIUXdBRUFBa0FBQUFRUVZSVVEwRkRWRlJEUTFSQlExUkhRd0FFQUFrQUFBQVFRMGRVUjBOVVZFTkJWRWRVVkVOSFFRQUVBQWtBQUFBUVEwZFVSME5VVkVOQlZFZFVWRU5IUVFBRUFBa0FBQUFRUVVOQlZFTkRRMEZIUTFSSFIwTlVRd0FFQUFrQUFBQVFRVU5CVkVORFEwRkhRMVJIUjBOVVF3QUVBQWtBQUFBUVFVRkRRMEZEUVVOQlZFRlVRVWREUXdBRUFBa0FBQUFRUVVGRFEwRkRRVU5CVkVGVVFVZERRd0FFQUFrQUFBQVFRME5VUVVGRFExUkRSMVJVUTFSQlZBQUVBQWtBQUFBUVEwTlVRVUZEUTFSRFIxUlVRMVJCVkFBRUFBa0FBQUFRUVVORFZFRkRRME5CUjBOSFZFRlVWQUFFQUFrQUFBQVFRVU5EVkVGRFEwTkJSME5IVkVGVVZBQUVBQWtBQUFBUVZGUlVRVU5VUjBGSFIxUkhRVlJEUndBRUFBa0FBQUFRVkZSVVFVTlVSMEZIUjFSSFFWUkRSd0FFQUFrQUFBQVFRMEZEVkVkVVEwTkJRVWRIUVZSSFF3QUVBQWtBQUFBUVEwRkRWRWRVUTBOQlFVZEhRVlJIUXdBRUFBa0FBQUFRUTBOVVFVRkRRMEZIUTBOVVIwRkhRUUFFQUFrQUFBQVFRME5VUVVGRFEwRkhRME5VUjBGSFFRQUVBQWtBQUFBUVExUkhWRUZEUTFSRFZFTkhRVU5IUndBRUFBa0FBQUFRUTFSSFZFRkRRMVJEVkVOSFFVTkhSd0FFQUFrQUFBQVFWRUZEUjBkSFEwZFVWRUZEUTBOVVF3QUVBQWtBQUFBUVZFRkRSMGRIUTBkVVZFRkRRME5VUXdBRUFBa0FBQUFRUjFSVVIwTlVRME5CUVVGRFFVTkhSd0FFQUFrQUFBQVFSMVJVUjBOVVEwTkJRVUZEUVVOSFJ3QUVBQWtBQUFBUVZFTlVSMGREVkVkVVFWUkRSMEZVUXdBRUFBa0FBQUFRVkVOVVIwZERWRWRVUVZSRFIwRlVRd0FFQUFrQUFBQVFRVWRVUVVORFFVZFVWRWREVkZSSFFRQUVBQWtBQUFBUVFVZFVRVU5EUVVkVVZFZERWRlJIUVFBRUFBa0FBQUFRVkVkVVZGUkhWRUZIUTBOVVEwRkRSd0FFQUFrQUFBQVFWRWRVVkZSSFZFRkhRME5VUTBGRFJ3QUVBQWtBQUFBUVEwRlVSMEZIVkVOQlZFTkRSMEZIUXdBRUFBa0FBQUFRUTBGVVIwRkhWRU5CVkVORFIwRkhRd0FFQUFrQUFBQVFWRU5VUTBGSFEwTkJRVWRCUjBkRFZBQUVBQWtBQUFBUVZFTlVRMEZIUTBOQlFVZEJSMGREVkFBRUFBa0FBQUFRVkVGRFZFZERRMVJEUVVOSFZFTkRWQUFFQUFrQUFBQVFWRUZEVkVkRFExUkRRVU5IVkVORFZBQUVBQWtBQUFBUVEwZEJSMVJVUVVOQlFVTkhRVlJEVkFBRUFBa0FBQUFRUTBkQlIxUlVRVU5CUVVOSFFWUkRWQUFFQUFrQUFBQVFWRlJEUTBkSFZFTkJRVWRVVkVOSFZBQUVBQWtBQUFBUVZGUkRRMGRIVkVOQlFVZFVWRU5IVkFBRUFBa0FBQUFRUTBkRFEwRlVWRUZIUjBGVVZGUkhRUUFFQUFrQUFBQVFRMGREUTBGVVZFRkhSMEZVVkZSSFFRQUVBQWtBQUFBUVExUkJRMVJCVkVkVVEwTkhWRUZEUndBRUFBa0FBQUFRUTFSQlExUkJWRWRVUTBOSFZFRkRSd0FFQUFrQUFBQVFRVU5CUTFSSFFWUkRSMEZCUTBOQlZBQUVBQWtBQUFBUVFVTkJRMVJIUVZSRFIwRkJRME5CVkFBRUFBa0FBQUFRUVVkRFZFTkJRVUZIUjFSVVIwZFVSd0FFQUFrQUFBQVFRVWREVkVOQlFVRkhSMVJVUjBkVVJ3QUVBQWtBQUFBUVFWUkhRVWRVUTFSRFIxUlVSME5EVkFBRUFBa0FBQUFRUVZSSFFVZFVRMVJEUjFSVVIwTkRWQUFFQUFrQUFBQVFRMVJIUTBGVVEwZFVWRUZEUTBOVVF3QUVBQWtBQUFBUVExUkhRMEZVUTBkVVZFRkRRME5VUXdBRUFBa0FBQUFRVkVGVVZFZEhSME5CUVZSVVExUkRWQUFFQUFrQUFBQVFWRUZVVkVkSFIwTkJRVlJVUTFSRFZBQUVBQWtBQUFBUVIxUkJSME5VUVVkVVFVZERWRWRVVkFBRUFBa0FBQUFRUjFSQlIwTlVRVWRVUVVkRFZFZFVWQUFFQUFrQUFBQVFSMEZCVkVOSFZFTkJSMVJCUjBGQlZBQUVBQWtBQUFBUVIwRkJWRU5IVkVOQlIxUkJSMEZCVkFBRUFBa0FBQUFRUVZSRFFWUlVRME5CUTBkSFZFTlVSd0FFQUFrQUFBQVFRVlJEUVZSVVEwTkJRMGRIVkVOVVJ3QUVBQWtBQUFBUVZFTkJWRWRCUjBGSFZFRkJRVU5CUXdBRUFBa0FBQUFRVkVOQlZFZEJSMEZIVkVGQlFVTkJRd0FFQUFrQUFBQVFRME5CUVZSVVZFTkJWRU5VUjFSVVZBQUVBQWtBQUFBUVEwTkJRVlJVVkVOQlZFTlVSMVJVVkFBRUFBa0FBQUFRUVVOQlFVRkhRVU5CUVVkVVFWUkJSd0FFQUFrQUFBQVFRVU5CUVVGSFFVTkJRVWRVUVZSQlJ3QUVBQWtBQUFBUVFVTkJRVU5EUVVGSFFVTkhRME5CUVFBRUFBa0FBQUFRUVVOQlFVTkRRVUZIUVVOSFEwTkJRUUFFQUFrQUFBQVFRVlJIUVVkVVExUkRSMVJVUTBORFFRQUVBQWtBQUFBUVFWUkhRVWRVUTFSRFIxUlVRME5EUVFBRUFBa0FBQUFRVkVkQlFWUkRSME5CUTBGSFZFTkRSd0FFQUFrQUFBQVFWRWRCUVZSRFIwTkJRMEZIVkVORFJ3QUVBQWtBQUFBUVEwZFVRVUZIVkVkVVFVRkRRVlJEUXdBRUFBa0FBQUFRUTBkVVFVRkhWRWRVUVVGRFFWUkRRd0FFQUFrQUFBQVFWRUZEUVVORFEwRkhWRUZVVkVkRFF3QUVBQWtBQUFBUVZFRkRRVU5EUTBGSFZFRlVWRWREUXdBRUFBa0FBQUFRUjBkVVZFRkJRMVJEUTBOQlFVTlVRd0FFQUFrQUFBQVFSMGRVVkVGQlExUkRRME5CUVVOVVF3QUVBQWtBQUFBUVFVRlVSME5EUVVGSFFVRkJSME5IUVFBRUFBa0FBQUFRUVVGVVIwTkRRVUZIUVVGQlIwTkhRUUFFQUFrQUFBQVFSMEZCUVZSSFFWUkRRMVJCUjBOVVF3QUVBQWtBQUFBUVIwRkJRVlJIUVZSRFExUkJSME5VUXdBRUFBa0FBQUFRUVVkVVIxUlVSME5CUjBOVVFVTkJWQUFFQUFrQUFBQVFRVWRVUjFSVVIwTkJSME5VUVVOQlZBQUVBQWtBQUFBUVFVTkJWRWREUVVkVVZFZERRMEZVUVFBRUFBa0FBQUFRUVVOQlZFZERRVWRVVkVkRFEwRlVRUUFFQUFrQUFBQVFSMVJVUVVORFEwTkJRME5VUjBOSFFRQUVBQWtBQUFBUVIxUlVRVU5EUTBOQlEwTlVSME5IUVFBRUFBa0FBQUFRUTBGQlZFRkRSMGRVVkVkSFFVTkRRd0FFQUFrQUFBQVFRMEZCVkVGRFIwZFVWRWRIUVVORFF3QUVBQWtBQUFBUVIwRkhWRU5VUVVOQlEwTkJRMEZVUVFBRUFBa0FBQUFRUjBGSFZFTlVRVU5CUTBOQlEwRlVRUUFFQUFrQUFBQVFRMGRIUVVkQlFVRkhWRUZIUjBGVVZBQUVBQWtBQUFBUVEwZEhRVWRCUVVGSFZFRkhSMEZVVkFBRUFBa0FBQUFRUVZSRFIwTkRWRWRVUTFSQlFVTkhWQUFFQUFrQUFBQVFRVlJEUjBORFZFZFVRMVJCUVVOSFZBQUVBQWtBQUFBUVIxUkRRVlJEUTBGSFExUkhWRlJCUXdBRUFBa0FBQUFRUjFSRFFWUkRRMEZIUTFSSFZGUkJRd0FFQUFrQUFBQVFWRU5EVkZSVVExUkRRMEZIVkZSRFF3QUVBQWtBQUFBUVZFTkRWRlJVUTFSRFEwRkhWRlJEUXdBRUFBa0FBQUFRUVVOSFIwRkJSMGRVUjFSSFFVTkRRd0FFQUFrQUFBQVFRVU5IUjBGQlIwZFVSMVJIUVVORFF3QUFBQkFBQUFQb0FBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUVBQWtBQUFBaVdraEJUa2RmVkVGU1IwVlVVMTlQUmw5RlYxTlNNVjlHVEVreFgwWlZVMGxQVGdBRUFBa0FBQUFoVWtsSFIwbGZSVmRKVGtkZlUwRlNRMDlOUVY5UVVrOUhSVTVKVkU5U1gxVlFBQVFBQ1FBQUFDSmFTRUZPUjE5VVFWSkhSVlJUWDA5R1gwVlhVMUl4WDBaTVNURmZSbFZUU1U5T0FBUUFDUUFBQUNGU1NVZEhTVjlGVjBsT1IxOVRRVkpEVDAxQlgxQlNUMGRGVGtsVVQxSmZWVkFBQkFBSkFBQUFJbHBJUVU1SFgxUkJVa2RGVkZOZlQwWmZSVmRUVWpGZlJreEpNVjlHVlZOSlQwNEFCQUFKQUFBQUlWSkpSMGRKWDBWWFNVNUhYMU5CVWtOUFRVRmZVRkpQUjBWT1NWUlBVbDlWVUFBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBUUFDUUFBQUNKYVNFRk9SMTlVUVZKSFJWUlRYMDlHWDBWWFUxSXhYMFpNU1RGZlJsVlRTVTlPQUFRQUNRQUFBQ0ZTU1VkSFNWOUZWMGxPUjE5VFFWSkRUMDFCWDFCU1QwZEZUa2xVVDFKZlZWQUFCQUFKQUFBQUlscElRVTVIWDFSQlVrZEZWRk5mVDBaZlJWZFRVakZmUmt4Sk1WOUdWVk5KVDA0QUJBQUpBQUFBSVZKSlIwZEpYMFZYU1U1SFgxTkJVa05QVFVGZlVGSlBSMFZPU1ZSUFVsOVZVQUFFQUFrQUFBQWlXa2hCVGtkZlZFRlNSMFZVVTE5UFJsOUZWMU5TTVY5R1RFa3hYMFpWVTBsUFRnQUVBQWtBQUFBaFVrbEhSMGxmUlZkSlRrZGZVMEZTUTA5TlFWOVFVazlIUlU1SlZFOVNYMVZRQUFRQUNRQUFBQ0phU0VGT1IxOVVRVkpIUlZSVFgwOUdYMFZYVTFJeFgwWk1TVEZmUmxWVFNVOU9BQVFBQ1FBQUFDRlNTVWRIU1Y5RlYwbE9SMTlUUVZKRFQwMUJYMUJTVDBkRlRrbFVUMUpmVlZBQUJBQUpBQUFBSWxwSVFVNUhYMVJCVWtkRlZGTmZUMFpmUlZkVFVqRmZSa3hKTVY5R1ZWTkpUMDRBQkFBSkFBQUFJVkpKUjBkSlgwVlhTVTVIWDFOQlVrTlBUVUZmVUZKUFIwVk9TVlJQVWw5VlVBQUFBQTRBQUFQb1A3dzZtUzl0WHNvL3Z0MDRzdkk5aEQraC85aDdTZ2UxUDZ1SUZ0V1lBamcveFdOR1NMcHZzVC9EbjZlV1FwaWNQNzZ3UWh4cUJUMC92WTJCWG9ocVJ6L0dPVlVpWmdSbFA4V0JscTQyWXc0L3htd01QeUJrUnovRHlQeE1naXVoUDhCeldDWlRHaE0vd0Vudi9zZ1Jrai9PclorcDRnQkNQOGtrVUZXaWlVNC93S1MrQ2NsM2R6L0VRUlJCRkVFVVA3QkgzOFNPeCtNL3VHa25yVVBjUFQvSXR1Vm0rcm5LUDhXdDJBY1hjTWcveG1BeE83eE4zVCsvd3VHRjBSVVZQNnNHV3RkREdBUS9wYVBtcXZKcEx6L0ZWc0tvdEZnSVA4TnNZWVBkL2Y4L3hMYTErdTBwY0QvQ0k2N285N2VtUDUxSjlVUW5YOVEvcXRNclErY251RC9IWG0xb0FpNkhQOFdHMmpsWkRMay95elIxcTQ5dkxqL0JZM1NlSzg5K1A4bnZ3QWVUQ1VjL3hVYm9FT05lWlQvRUZLOTNQL2NjUDhNRGZuYVRtYzQvd29qWHZ1c0t1RC9Da3pMZVdzdVJQOG0wZVBhZW1UVS93cUFRM1NGTjNUL0ZIaDRLUit6eFA4TllHdm9wRWFZL3g2VG0zN2l6eEQvRW1zSm5GdlFDUDZMMDNCYXoxdkEvcXRaSnp6NFJBVCtsTGV5NWVBclVQNlpWczdGTVdtWS94QkM3eTNQdm96L0RYaVlvSVhXalA2QkZQVklHd3VnL3F6dXFmOGF1d0QvRzBzdXgyU2FKUDhUVWQzamV6OFUveDNHSEpseFNwRC9FdmRvR3FMUjFQNUxxVWt5VHd3US9yZ0lXOWxpNVNEL0hoK3Z6NEh6NlA4VUxEZjlQd2o4L3lvM1MzM1EwSXovR3NJMUxqNlRQUDhmL0lySnJYbDQveGtVaGJRNmpFei9HanZTc3FxWkhQOEMzSFF1cDlvYy95bjZzek9ZWGZ6L0hFSGlJUUNwT1A4QjFVZnc1SGM4L3dSZ3p2SnNUZ1QvRUYvcUdhZjFXUDhQcmZqSHpvRlkvbjMzQkFkdUp3VCtzaGxBeHcwYm5QOGR5TDhMK1UrSS95RDBZUFJnOUdEL0VUQUxjYUYrMVA4T3lrTU1CZnVVL3hvdXBuWUNnRFQvQk4yVXVBREJaUDdDUVV4SXJVTjAvdWVZWjVobm1Hai9KUGVyVXRia1FQOFg3UGVoejdTWS93MVd1QjdxTi9UL0U3eTBCOXYxRVA4SDFUckVwODhrL3dPbi9US096K3ovSy9TSkdad2FWUDhVM0hXOTdZV1EveHljYUF0bkY3VC9GU0trL1JFR2VQOFc5Z2h0dEdrby94U3dBbnhYQ1VEL0ZEUDRoMDh5UVA4RVF5ekdzcVhRL3h2NUVFNTE0dVQvRXRuRjd1a3BvUDhmUVgwRjlCZlEvdzg1eHdGcEQ0RCtpV1d1eFdyRVFQNjR3R1gyYXFqby93UEhObjlRSktUL0FHc0lEUllrbFA4QmtNaFBFL1c4L3dSSmFkMWdlR1QrdTkyUXd3b3U1UDVMVTVqVXhYUjgveFlPTVE3eXN0VC9CMTNSNzI5TENQOFZRTElwZ1M1US93dS8vajdSbnh6L0dvMStrU016aFA4WEtnS2RGOEJVL3lhVlM1QkI4a1QvRzZSYnBGdWtYUDVCbmZTTHZBNmsvcXBUSVlSenVDRC9GKzJ1ZTZZOVhQOFF1d001MXBvZy94aFhFR0RuQkp6L0RQTSsyOEpob1A4T21DS3p2SmVnL3dabERnY2NIcGovRk44M205aDJCUDhKcDNpZ2JPSXcvcFlvaVloQzVLVCtuWlJVTDFhSWxQOGJuTnFsM1RTTS94VmZlSm92eTREK1R0OUV5QlVlSVA2Ynljb3NicFBFL3hVcm5wVkJCbmovRElrd1dqZGw5UDhpMjVXYjZ1Y28vdzBDMTVSMDhBei9FYzRlU1lLcHNQOEliZnJzemswWS9vTGFHanQrWkZqK3cxSTFPcmpBbVA4UWZPVUZnQ3dnL3hKL1VDWVF2R0QvRGtQVVlydjRQUDhRTWNORzVvR2Mvd0hYNm1Oc2ZEai9BNi9KanVnWElQOFYxRHMzUWtWQS92QktDUE1peU56L0lWaE4xOUFLOVA4VzhSVXVKWjdnL3daSGFUWnMzd1QvQ1l6MUFBb2pSUDhHOHFoSzlpTEkvdjZLRW9DdGd3aitja1lueTlnTXBQNjFGWHdoT2w1TS9tNThveWhRNDZUK2lrMlRIRURvbFA4ZVJKSVM4am1rL3gzMUJ3N2N5R2ovR0Y3M3VIOFRqUDhGVEZFS2poc0Evdjc1TTkrQUR5ai9DUFRqOXowMnFQOEZoSFFiRzI1cy93MzlLc0p6a1NEL0VrU3NhMnVKMVA3M3ZYN0pQUVpNL3hDRXpGMFlPeFQvQkc3WVpYTm56UDhtVzFXNGtZU3cvd2xKSEtsbjBWVC9HbXMrd0RyeXhQOFZWdVNiQU1uNC94ZzNjd0tHeU5UL0Q2MzR4ODZCV1A2dVBXaHJrR3dZL3NRaHBHek1XZ1QvSE9Zc2trZWpMUDhTTDhWRTZIK2cveFZ5d0ttWmpQVC9ETE5NczB5elRQOEcrbytpampHNC93OStadnJoRzhUL0MwS0p2NVpKelA4SzRDNnhOYnowL2wyYjlYRHcrdHordG0rNmkrbUUzUDhNaHBiRzhLNTAvd0RjRzBna3JTVCtoVnp2WlNNanRQN0ZUcWZ6RDBuMC93L3IvbXBIR2l6L0NsK0N2WFNsK1A4WkI1UmFnRkpVL3d1UWJISGtPWWovR2lRY3ErSnNTUDhNZU0vK3J4MDQveGVFVEpabGRpRC9GVDkvaGZUMFdQOGhNMnVVWDhVNC93WWpqSmo2KzZEK2xsS3dzTU0wV1A2TkozNTVzaVVrL3Z6bEJZQXNJUUQrNXNSS2xWR2hFUDhWQkJuZlNMdkEvdy9sVnZFVkxpVCtlTnhHSCtTQWRQNi84K21rRHpnRS94bGhKNUNRKzdEL0hHczIxMEE4UFA1ZE1wT0xzRE9nL3BtSXQzcWYvaVQvR3VSdlZLdlg1UDhPOVNjSDhRTkEveFJqWkpUZmkrei9ETjc0VWcxMVNQNWNDNEZ3TGdYQS9wZnM5NkhQdEpqL0Z3TTBxbHlDRVA4RzhXeUZZeUJrL3BXL0o2TUNIV2oreDg0ZGg2Z1pSUDhsR2VzanZ5VUEvdzBmc2gxWTNmRC9JakJXaDJHalpQOFRtTlRGZEhwTS95R3NuQ2pRcWxqL0RPM0paK3BKWlA2WDR5U3hoaWx3L3IrN3c5ZnkwT2ovQzFKWWJzWm5zUDhNcWZFUlIvZDAvd1ZuZVM5RE42RC9CYkRxR0VEK2JQOFhrWGpURFk4SS94TGRyQjBWelR6L0JKeWN2Rm00R1A4RFRZZHB0bUtzL3Y2VkZ0OVBVZUQrLzd2RDEvTFE2UDZGME5zVWcvN2cvc0xqZU9nclp3RCsvb0FEU3c4cUNQOEF4dzBibWdaNC94TzFndzNPUXl6L0NIamwxSDU5bVA4TWlUazVlTE53L3hkUnlBMnIzclQrZVJ1QTNLVDRBUDdJakdTN1hhK2cvdkRRREVSbFNWaisrUDdJMlRUaW1QOGptVVhTTEUzSS94cVFUSGpQL3JEL0ZxUmNqenZPd1A4UWdJYUZPUVFNL3gxaC81bEFqVWovR1dHNXJPR2FHUDhRWW95TUwvcFEveGkzdVFMZzhCaitRT0JFVlhxb0FQNmJWbUFJM3R4QS93WHpHdVZzUDZEL0VIKys0bU5KdlA4SytNVTR0YjVVL3dXVm50VUloVEQvRzNWVjcrVHAyUDhLM3A5cmlraFEveGJMNFVVMEdYVC9CZVJpRTFzSG5QOFpvR0pOVVhNNC93ZDEvcWRRMnZ6K1grb1pwL1ZXbVA2c29LNWpuZkxrL3BObWVhSGRyYnorZGxDSkdvUm9CUDVETG1pTWZ3TzgvcHBENENMK3F6ai9EWk5RYVNLcWhQOEUzbHhhMW51NC9tYUFOL3dCeW1qK3dFeWVQb2JDRFA2R21SVVU1WGxzL3RJWjczV0lIcUQvR3dhdkpaUVlwUDhKY09JWisrKzAveFRoMmc1Z2V3RC9EQnAwQjZvTVhQOGw3Szd1UUxOOC95TWpoQVQ3ekp6K2Y0ZDRDREVjSVA2NWl5ZFhlK1JvL3FBVVFOQjFwa3orMWNUWlNyaHBRUDhKTmtLMzJtcVkveFNTWUZDZFlSRC9KQkoyWnAweTZQOFRQbDc4bkEwTS9sYmJyL1JrTjFqK3Y1TTJ4SWo0TlA4a0Q5UDBGUzNzL3hQMytGOVBSWGovRlN1ZWxVRUdlUDhCQWxGekRWYmcveGc4dCtlVzBzei9Ec3BEREFYN2xQOHFTYnlmaVBOby94ZEM5dmZQQ3BqKzlyaEpFV0IwYlA4Q0JnQkRFTFBNL3haVlV5TkxPVkQvRFc1MVc2dGdYUDhULzBlVXJzNmsvdjZUYmlLeVB1RC9KM1U3bDJ1WnBQOFAzK0Y5UFJYby94YVI2MjJEcStEL0RIbVhvWVRYaVA1WWdUZUpaMVJNL3I4QW15K1VJOVQvR3BWbDZMdENkUDhFdkF4ZUduV1kvd256OHU0YjBUai9FcURZZi9jSU1QOFg2R21XbGpOby93MjFiRDJrbTVqL0FlcGJoU1NmRlA4SllJRytjNmI0L3hEdzBMVGhCMHovQytyaU9yeW15UDhWKzcvdE9vLzQveEIrOXorTmoyai9FSzd6aFppS3hQOExQb3FvT3MzUS95WUhCMmVRNVVqL0dFYWx4OUpuaVA4aGFyNzVpQzNRL3hFZTFLU3p3enovSXlBVlBidG9xUDhSbXRMSGNueE0vd0xTTXVQbVZXai9ESU82NWw5TnVQOGQySTI3S1cxcy94SmhyZnBYRkN6L0NqaHlqK3hTdVA4QlcvK1pFQW5NL3BFdGFQOFplZHoreDUzRUYrVDVYUDhVYUtsNTc1WGcveE9yakFsOThnRC9FYjVQbWxLTDBQNzh5bk5sZGI2MC9rYmkyWnZHQk9UK25yL0liKzRENVA4VHpUa1VsbkFBL3dmT0hZZW9HVVQvRk5TdDBiaGlHUDhYcEhGNkt3UzgveUZMSVpzbjhnei9EMUs3WENCWnlQNnpHT3VXV1pzYy9xcHlVdlhZMVBqL0hNYVBNK2RuYVA4WjV4TnhwUThBL3dZL2dkN1UwQkQvQUpkN1RxeWc0UDh0VXU2YVJyRE0veFlBSGFJcnVhaitkeUdxOXFFN3FQNi9Nb1BsQXJoay9pbzBxUXRJeTVEK3ZFWGhRNGdFSVA4TStvSjJVWW1nL3d1ZHJrSVZtUHorakIwMDRhL25PUDZvRlMxZC9BdkkveWdJeEtVc3NKVC9HTlBMNk84anFQOGtGUmpaSlRmay93dmFnZDgwWGdqL0t0cWpPc0lGWFA4UjV6OGRROC9FL3BCRmthQlh3NGorcUxxQU52cFgzUDhoMFg1c1FQQVUveFNxalFoKzhRVCtZM1JqanJ3SURQNnRseHRqYi9CYy94K3l4a0xNN2dEL0ZscVRhd1FtNlA4WGxyMjRIWmtBL3h0Z2cwMjVVbXovRlgxS2M3bWc0UDhMWk1EVEkzZU0vbXZhTUtCTDZJVCtxS3JuZmtmSmNQOE1SMXdLTURicy93M3Y2UEpDTWF6K25GL1B3UzZsSlA2eGZVbVFFNHRnL3grSW54cE1ua3ovRmc0bkZUTFRjUDhTWnV3OFU4cVkvd1IycE1ITXJ3VC9JMGVaODdPellQOFV1aVhCTVg5dy94UEtscUlPYXdUL0ZTMlA1TUUyOVA4Vndjb1ZpaUprL3dyOTBOenZaU2o5dTlNRytPb2ErUDZzUC91RUY3TVEveEpFckd0cmlkVC9DUjhBVUZLRC9QOGRmdnFGR01RUS94aHhpY085YnpEK2JkUUdoaytrM1A3RDRiSkVWcXVzL3dZSUxubXNaM2ovQ2M4K0VRRUFrUDhieWFSQTVZazgveEVNNVFPQUJkaitSNkNKMGdkcmhQNnNnWHp5T05ZSS94dUh4eEdkRExUL0V5R0VjN2dmTFA4YTdGYXNRK2JVL3hBU2tkV0JaTVQvSkEvVDlCVXQ3UDhMcTdlMUhMTEUveHBlRW9PUzJkei9DVFdkd29pZlRQOE5yYWppY3R4VS93RFlOUm40Q1lqK3VabjJWaVhuRlA2UEZGaDVWaUFZL3lQcThiQ2s2REQvRENGNHdTMlpRUDcxVjBFZUxkajQvdXE5TUFYK3M4eithaCtWZHdpanVQNkkvODdlN1djay9uZDErVWVoMnd6K3hYYzFCbmtpcVA2RlI5dlE0dnZjL3NBSmpZcTZLbkQvR0NKZmJrYWcvUDhaeGxLNmxIMkUveU1kY3Nzelk2ei9Ib3JCTHlpR0VQOFU3R1BZZ0k3cy93aEdOWHc2THJqL0hrYzBoWG8rb1A4Wi9PbEJCWEFBL3lKUDgrWEIzeWovRUNrdlI3ZUFGUDhYanRaZ2hZb00veEN2VUs5UXIxRC9BZ0lSaSt6TDZQOEtoUEZGaDVWay93U0U1cldSaTBUL0M0RFR1VEdySFA4Y2FsbUxUcmtRL3hFUE8rd0JOTkQvSHNNSGpITW92UDhHS2NtdnFNNHcveUlkNVdXcGdJVC9DWk15RnJmMTJQOEFIL0dzc1R4ay92cGFsb21QZmREK2tZeEJHam90TFA2MXRKSGppdGZNL3pSeURESDBKNkQvRGxob0xpRzR0UDhjcEU5aS95YW8veGM5Z1lQMjhsaitNME1TdnRucTBQNnJQUlJXNmhCMC94T1FvTXBkL1hEL0ZEVEwvRzRLaFA4Ykc4SzUxRUI4L3dlODlZbEtGalQrL2Z4STdINHcrUDhDaDNQWnA0VWMveGI5NzhWTWVCai9GV3k2YW1FcStQNzFwa3FLSG01ay92ZWhhK011MHNEL0FOaGMvZUtaRVA3MEFXejFycmlnL3hEemN5ZHBERVQrNy9qdXpFOFhlUDYzMzFzczRxSkkvc0RESnUxdFl0ei9KdzU4SkxMWFpQOFFXWWkzZXFBQS94WmlmMS96VWpqL0VOUy9OMk9ldlA3dzBBeEVaVWxZL3ZicThRdlNnNXovRVhuUCtJSUtUUDhOdEtTYXp1RkUveDQ4cXJ0YUtyVC9HRUJvc1NTVTlQNk0rb0oyVVltZy9zWkRoYTAxMHNqL0NUT2dSVkpsblA4RnpQeitUekg4L3grWWJjbDh2REQvRE4rLzlPTXZuUDhGZDBmZWMxV0UvdnIwL25yZG1XVCtrRHNIMWpldm5QN0VxVlVhRVAzay94b3hTT2lLaFN6L0Z5eFpoWmp2U1A4T0laU1IwN2Q4L3dwdGpEQjd2OEQvSkhhVFpzM3dNUDhrSHA3VjBDZ0UveDA5SFZYUVI0ei9FZnVGcHZpOEhQOGNsSUN6endqRS93bGJERXFianJqL0xFalhhcHk1dVA4S2dkSzZNS3dZL3grb1BIaXMyaFQvRVhKRnRBaWptUDhRcEdtN2VIYlkveGJLRjJCbk90VC9ERG92ellnZUJQOE5MQ3hLdElNVS9sdE4wVG5zbnlEK3V1dWkyTmpkalA4Y1NCbTZabmhRL3dmV3NZYlhHc3ovRUFPMGNROUhBUDhEL1AySGp5VHMveGswWGZXSXB3RC9BNTNaN2JSWnZQOFFpaEZDS0VVSS93a0xnV2x6VWZqL0dKT29xeDkzTFA4Uy96UjIvQmtNL29HOWtlb2NTbWordXEwLzlnNmozUDhWTTRYczJSVm8veE5BdGVVZFBBVCsreVVsY2RqU1BQOEFCemFpT1B0NC93NHNIbHZ6eTJqL0RQWmRaeGxLN1A4bjVvVFVSRy9VL3hwUVdsQmFVRnovREl2YnJBQzRiUDhHUjJ2YlluWmsveHFxZVh6N2Frei9FdTFFMWNoYnFQN3lyNG14R05QZy91dERVVzJYNHdqK1g2cmU2elRmRFA3TFNLM3RGVVA4L3h1YU9ETlZMNVQvRWhJakdTN1hiUDgxYWJJLzVmdlUveHB1eEI3cHN1RCsrZFBzTGRaVXJQOENSU3JJc0tmUS9xZG9EMXJEZ0x6K3pYdTNLOXkvMVA3KzVDQkxQK2RNL3Y2UVQ1ZGJWWmovSFMxT3BxQXBxUDhONGQ5L094ZmsveFp2cTV5YmF5RC9CcS9yRjBIOWJQOGNVcU9FaG93OC94YzQwN0wwbEd6L0VrZE8zZk9PMFA3NldwYUpqMzNRL3lnZ2VxdjAzV2ovRmNLQ1lqYzZUUDZweTBjbUNBUlUvc1hwRCtSZFpZei9KS3RFV1c1VHpQOEdGeEpybjFaOC94WEViSWdTSjF6L0MrN0lhT2xLWVA4U1ZIc2FtNmU0L3hwOWxUVEdodno5N0t6MGFzMTNBUDZyMlF1TjQ2Q3MvbGdYMWFRbWpSRCtxdCtBQXJxNTdQOGZpSjhhVEo1TS93aE95WHRwTUVEL01JanFNQXpDM1A4SnRrbTJTYlpJL3hQaVRLaldsOWovRHdTL3dLT1JyUDhaY1BZL3dSbVEveEZObnM3TGJvRC9MS3BSK0VWeUJQOFBkcHFlaDlTTS95eHkvcE1kQ1dqL0tCSU8wcVVpZ1A4SmVzSlpxdXdZL3dFbU1MVjAwYVQrdmpZK3hDNmVrUDZhRWZkdGtCYW8veEd4STEycWN1ai9FNUJBeGtWNHhQOFEzbCtUS09Scy93UDl4U3BrM3p6L0djMHI2Rm5INlA3c3RQVHRVdDg4L3lEaHY3WG5LdEQvRi9jYTVxb3F5UDU5RHl5b3JIQ3cvcUxJUnBsTnBRei9HZjg2YUhJbWpQOEkyKytjaGV4Zy94WmYzTzFyVFR6L0MyR2lSOHlPUVA4YkZuM1V4RGFFL3d5dW51SktWV0QvSEttVVNBOHduUDhCR2JhSUdTeUEveHlQTzg2Ky9zei9CeG41bU16NUdQOG93OUpvNWhJNC93NThSM0NKTTNqL0M3UFMvRzhmL1A4T3lrTU1CZnVVL3lURm5OSytoWnovQ2RsaFZkdDJ2UDdxRDhiSDJJWFUvdkxWK0xVWFBWRC9IUmc3RW1BQjBQOEZRaTNGczZUVS94ZjlmU3JXVzBEL0Ztcnp4b3h2cVA2RTNubnJvalNnL3IvNkpycTlDcGovRndNMHFseUNFUDhXazREWjlraFkvazJPQzRRU29JeitwL0xkWVVBRnFQOEtRdnhhREdhay93MHR1NUJmOTdqL0lQNjZvYjlobVA4UjE2WmtrVUZZL2tuRWh1Q0xkNUQrcU8rSGQ3L1ZzUDhaelN2b1djZm8veEtiWXd3ZTcvRC9GRzN1WHYrZjJQNzhYVVpZazluQS92NUxVbGh1eG1qL0FORXdZSFI4cFA4YXgzUm8wNkVZL3hEeG1jQkhqSnovSUkxeFpPYUxiUDhCNXM3UnE1YjAvdEp1MDVQcjJZais3cXNxanZ1V0NQOEswVUNDdlhPYy93WUVXeWVWM3NqL0dyenFuck9OTFA4Yzg2OG5XcHB3L2gvL0xUdzFmbkQrdFRmTUhmWmtiUDhhVTRpNWNzWHcveENpRHQ4ZlQ5eisrQ2tmczhNdHdQOERqWG1TTEJFQS9tZlJjVUFFUi96K3JpQmJWbUFJNFA4UFVJNEU3ZlJNL3dQMndIRGhVbGovRjN4bFBzMW5NUDhSM1J2WWFWbVUva3dudnF2UCt5VCtvdGZmVWdBemVQOGhqNkU4K0hPTS94RFgzY0s2aUFUK25vNVdtZExGSFA2ajUwQ3NpWHM0L3lRazU0aFZWY1QvRHBoYVZwZG5DUDhiOW0zYjdkM28veFhrMGw3elFHei9FSzd6aFppS3hQOEptamJRTzRLOC9pZVNOb05EMEhEK3NDbElQQkkzWVA4ZFNrbVNlR0IwL3d3QmY2enl3aFQvQjRPTzVpODB2UDhRQ0c2UXB1NlkvdDNiTUMyeGNtaitzekg5dzVzZk5QOGd4MmM4bHZrQS93bWtXaFVWK09qL0xGTmhOTHpOcFA4WElXNmQ2TDdNL3lNMUtOSDdrSUQvRGVkVTh4TXdKUDZJYzAyY2lQb0Evckg5TGVEKzZBei9EbHVLYVlRbEVQOE1Bdzd5bmphOC93OFJVMGd0Zk1EL0JFeUlhTGRoclA4cWZtMlNLVmNJL3hScllvTGUvUUQrTUtDZ050VHZzUDVxQ0VSMFRkbE0vdXFqVDlXWm5NVCsrYy9IVVBQd3FQOGNYOC9CTHFVay93OUF5N3JzbkdUL0kySHliUVBsTVA4SXNwcm1SbGxjL3Y3dXFoVmYremorOTM4YjVuTE1uUDUwRmRhSlczbEkvcmN4SUVyMkJJRC9DREZ3YlVCOWVQOEZaSDNDYjZyMC95VVBZVm1mRVJUL0JtUkdaRVprU1A4UndQSU0ycERJL3cvang2dHB1WUQrYkM1KzhVeUg2UDZjUm8veUF3Y28veE51WVBsMXZMRC9GRjRnc3EyZGpQNkREc3N1SHNmNC9waVloNUY3MDBEL0JmQjRjdVE2cFA4Qm5raXFCdWNZL283S01UUFU5a1QrdDZGcjR5N1N3UDhjNE9ldE41azQvd2xjbTVCSEExei9LQjNZT1d6WWJQOFZIZmNzRHFpSS93TFUxVlp1V21UL0JpcVJVbjZJaFA4VkRxT3BhTStzL3hONmF2YmxGOGorUUl2MkJIb0luUDYyQW8xL0I1L28vd1pVbFhNVTkrei9BU1ZwRXA4WFVQOEJOSkttZTBkay93RUZiLzVrUUNqL0duMnY0Zk1Wb1A3LzNoUFVydGNJL3lTclJGbHVVOHovRjVOSmU4MEJyUDhUWHBKS1JaN00vdzRpbVVxR2dJei9ISDl0SDQ3ZzdQOFhndWtnUkxqcy94MlpVdjVvOWVEL0RQeWFmY2NkZlA4REJ1UFdocmtJL3dvUmh5SDMzZHovR0lFM2lXZFVUUDhPTThGSTVJT2Mvd0NFRHF6aCthei9EWVJMS3d2QlhQOGtZWC9TamNoVS94QVl6dXd2TjFqK2IzbU9HMUxCMFA2bkpQMTAxK0RnL3lJckVhSlJtV3ovSEFkbGJHTVRKUDhNRisvOG45MUEvd3BTUU8xRFJvVC9GYlNkMk9JSmZQOE9sVHZMUUgzQS94Znk4MkMyUjFUL0NnQmZJNW5helA4Z005NHUxZUlRL3hORERNMmVhdnovQUxZZExQcFlVUDcvNHNHbHNUVDAvdzV0KzRzOFIvRCs3UWVlV2RJRlJQNk5lUGZ2MG5pMC9zUTZtTWVEcEVqL0NFa21kQWlxVFA4SlF0K1N1ZjdFL25lZ0lIQWlLcnorbjg4cHluZExwUDhRakxPMHNFb0Uvd1VEeXVMcGF5RC9JelVvMGZ1UWdQOFZ5OTRFTy9Zay92L0w5Nm9CbmFEL0NNSXpudmpueVA4TzBoaUxiUVU0L3cxQWN0UnBiMnoraERYZFNhRDEyUDY5azZXQTI0V1EveUF4Tzd4TjNSVC9FazcydGsyY2VQOHBhY3lZWDB3SS94TW1Na1M2ZlJqL0lhSVNYckNXYlA4TmRMSnlXVEx3L3pDTGpLS1V4OVQvR3dWRjRnc3EyUDhOcXdadjZ0ZFkveEdQSUR6c2tYaitJYzdiK2JqckdQNjJ0M2tRdUhwby93eUQ5RlJvcVhqL0JDWlNQYzYzOFA4WmFRN29LUXFnL3hQU2lkYzhWaEQrcU9OdngwWk9BUDZ2YmgrVHM0cFEvbC9xR2FmMVZwaitzUk03RG9pUHRQNlB2SkpjdHNDRS9xTElScGxOcFF6L0E1VW4vemZHQVA3K3dqaE15ZW9rL3lKczd0R2FGZlQvQ1grekw5akQwUDhlV2FXbk1tRjgveEtTend6djdtai9GeFdsekJTazdQOFJhYkcwMmFJUS94YkduR0FrRDREL0FReDB0K2ZORFA4ZWJCYkk2b1JjL3dqOWQvWnNPREQvRXljKzVSMDJOUDhSWmN1R3JQNTAveXJuejNkcUhrVC9Ha1kzQzMvYUxQOFZMa0VIeVF0MC92MHBsdjlRaWVUK1pSbnJJNzhsQVA2YU5FZHFUQnpNL3hFRFFkYVpLaWovREZRcEdYSG9JUDhmdXEyYVpQencveFd2QTN0WUNFVCtTNVExbmc3a05QN0JtbUo3MmtOOC94V0ZNY3RScjlUL0N2Yk1JMnZZUlA4TytaMUJaVS9zL3dDTHlNUW10aEQvQkhlNmVPbHlYUDhJQUFZOUZxM1UveFFCNmdjMjA2RC9Db0JEZElVM2RQN1VIdVR6RHdwby9ycWFpTElGTENqL0VoMG50WE0vSVA4Qk5jbHVKMkFRL3hPOWFtVm1VaHovRTY5eU42cVZuUDZIaTNZOXgwT3MvcjRRYTBaditQRC9Gd0NTTjlSOUZQOFQyWTZRditMMC93QUM5c0RaQlp6Kzd3S0J6SDBhQVA4VjVBbm1jbU1rL3c3K2dxbjF2eGorak5ybEYvRk4yUDYxVU1CNHJhNjAveUhVSU43STlSRC9HWURySGthMjhQNy94ckxFOFpPby93ZTVEMXNkY3BqK2tlQ1BhenJNa1A3TlRPMEJ4UlNRL3hreHU0TUFvZ2ovQjM5YVNWV1cyUDhLS0tQZ3ZEVFUvd3dnc1I1WDN2RC9KMmdQV3NPQXZQOFhSaFdESmZQZy94R3VnT3NpYmV6L0NQMTM5bXc0TVA4ZWUrVjRHcUk4L3hsUzZKY0V4ZnovRUttdW9JaUEwUDhGdjdzdUhkS0UveDRhYXVweDZmVC9EL0VKZTVzWStQOE5CNjZ5K2FLSS94V1ZSMzNMQTZ6L0Y2dlJURjNBMlA3ODhYRXpOQ0xFL3lZY0d2dlJEU1QvRzR6MmowL091UDhXbnhlcUs4VEkvd3RyeFl5bkJIRCt3UC9oczlyanlQNk1PbTBiNU9PSS94c3cxazRVYUZUL0Z4L2ZXRDFLSlA4SnQxcWo0MTZvL3dvcHM5blpiZEQrUE0veDYrdjVKUDdBQi81RkRyWE0vd3lMMjZ3QXVHei9CTWUrNktCZ2FQOEU3a2lhMGxLQS92ZG1KNHU3Z2xqL0RxQUtDMVNtbFA4SFluL0FjYWowL3FUbE9qRWV3V1QrMmYydzQ5c3FVUDZHSlNsbGhKNUUvcmt3c1k2amR5ai9HVTYyYnRqWTBQOFFvNTRreXNTQS94d2Q4cEhtS0tEL0RlRVgzR1Zka1A4ZFYzWFBJSGxjL3dsV1hubVpNTXovQnhlS2ptWm9nUDhOYW84dGZyekUveEQ3V244Qkd6ai9DU1U5WndCV2tQOGJnb0lzalFMQS93aGNDMHVhajdqL0dhcnNGM0dIS1A4UFZFcWh5ODVzL3h0MytHSnM3dEQvREtDVmIwTTdtUDhBR3F6SG9USncvd0lyYnNzam96ai9JLzFpMGwwTEVQOE50S1NhenVGRS9ueFJmSEpyQ2hEK25MQ2VjNDRDMVA4Z25VQVVGcWxNL3hITDg5b0xWb1QvSVNENmNxZWlXUDhMTVVqWUNXNVkvb1U5VWdiQzUvRCt1Y05OSTVoTGhQOGc2YWNOZnpuQS93NTVLT1V5U2pEL0dwQWhBNnM0Z1A4UHpybCszeExVL3BnTlM5b0dlU1Qrd2dxdUZCTVJ1UDhsNzFGZ3lMaDAvd20xZ2hOeisvai9DbzlqVTNUM0dQOEE3Z3JwV0dxRS94T0EwaHN0MzR6L0NiV0NFM1A3K1A4UFl2OG1waGNzL3ZDNHhVV3dJblQrUFNSQVBPeVlpUDZ2L1p5ZFVYVmsvb011YUl4L0E3eit5YnIzaDB3VU9QOGcvQmd2TjF5Yy94dk1JUlR2d3J6L0hseElHYnBtZVA4T1U3cGRIMXJJL2hFdGFQOFplZHorcnlOQ2c0MnJmUDhNeUhQMk9Tcjgvd0FkMUJSdkZzajkvWGlPamUwMzdQNnVoMHRNbEJ0QS9tcEp2SitJODJqK212dnFRQVp2QVA4Y3RzQ0V0MG1FL3hYOXhybXFpckQvR3ZiZ2RtUDZ3UDhUZmxFbEVidGcvdFhwVHN1Q2JSais5ZUhNeC9jT2JQNTlPVlBSTE1Cay9zUUVBa0VTc2REK1AzSmtjL0QwUlA2VjNjMmxiN09JQUFBQUtBQUFENkFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBQUFBQUFBQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFBQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQUFBQUFBQUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFDQUFBQUFRQUVBQWtBQUFBRmJtRnRaWE1BQUFBUUFBQUFCQUFFQUFrQUFBQUlZbUZ5WTI5a1pYTUFCQUFKQUFBQUNHZGxibVZmYzJWMEFBUUFDUUFBQUFOaGRXTUFCQUFKQUFBQUNHRnpjMmxuYm1Wa0FBQUVBZ0FBQUFFQUJBQUpBQUFBQ1hKdmR5NXVZVzFsY3dBQUFBMEFBQUFDZ0FBQUFQLy8vQmdBQUFRQ0FBQUFBUUFFQUFrQUFBQUZZMnhoYzNNQUFBQVFBQUFBQVFBRUFBa0FBQUFLWkdGMFlTNW1jbUZ0WlFBQUFQNEFBQVFDQUFBQUFRQUVBQWtBQUFBSGIzQjBhVzl1Y3dBQUFoTUFBQUFHQUFBQUVBQUFBQUVBQkFBSkFBQUFBWElBQUFBUUFBQUFBUUFFQUFrQUFBQVBZWFZqWDNCc2IzUjBhVzVuWDJSbUFBQUFFQUFBQUFFQUJBQUpBQUFBQTNCdVp3QUFBQW9BQUFBQkFBQUFBQUFBQUEwQUFBQUJBQUFoYWdBQUFBMEFBQUFCQUFBQUJBQUFCQUlBQUFML0FBQUFFQUFBQUFZQUJBQUpBQUFBQm1WdVoybHVaUUFFQUFrQUFBQUZiR0ZpWld3QUJBQUpBQUFBQTJSbGRnQUVBQWtBQUFBT2NtOTNibUZ0WlhNdWNISnBiblFBQkFBSkFBQUFDbkp2ZDNNdWRHOTBZV3dBQkFBSkFBQUFDbU52YkhNdWRHOTBZV3dBQUFEK0FBQUEvZz09In0= --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":["barcodes"],"name":[1],"type":["chr"],"align":["left"]},{"label":["gene_set"],"name":[2],"type":["chr"],"align":["left"]},{"label":["auc"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["assigned"],"name":[4],"type":["lgl"],"align":["right"]}],"data":[{"1":"AAGCATCTCGTTGCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.110269140","4":"TRUE"},{"1":"AAGCATCTCGTTGCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.120563072","4":"TRUE"},{"1":"CTGTATTTCCAAGAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.035155072","4":"FALSE"},{"1":"CTGTATTTCCAAGAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053772653","4":"FALSE"},{"1":"CAGCAGCTCCTCAGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167092119","4":"TRUE"},{"1":"CAGCAGCTCCTCAGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153309773","4":"TRUE"},{"1":"AGGTCTAAGGGACTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.119876987","4":"TRUE"},{"1":"AGGTCTAAGGGACTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.115440450","4":"TRUE"},{"1":"AATTTCCTCTCGAGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.173624651","4":"TRUE"},{"1":"AATTTCCTCTCGAGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.168017230","4":"TRUE"},{"1":"CAGTTAGCAACATCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175172358","4":"TRUE"},{"1":"CAGTTAGCAACATCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154571092","4":"TRUE"},{"1":"CATCGCTTCATGTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128520030","4":"TRUE"},{"1":"CATCGCTTCATGTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127256393","4":"TRUE"},{"1":"TGTTTGTTCTGCGGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.239673574","4":"TRUE"},{"1":"TGTTTGTTCTGCGGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.196420709","4":"TRUE"},{"1":"GGGAGTAAGCCACAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.130027537","4":"TRUE"},{"1":"GGGAGTAAGCCACAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158236057","4":"TRUE"},{"1":"CGAGAAGTCGCTACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.063596712","4":"FALSE"},{"1":"CGAGAAGTCGCTACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.095354538","4":"TRUE"},{"1":"AGGTCATTCGTACACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193081546","4":"TRUE"},{"1":"AGGTCATTCGTACACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.169367794","4":"TRUE"},{"1":"TCCTCTTTCTCTTCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174810557","4":"TRUE"},{"1":"TCCTCTTTCTCTTCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.124067397","4":"TRUE"},{"1":"AGTGCCGCAGCTTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.052782859","4":"FALSE"},{"1":"AGTGCCGCAGCTTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.042266091","4":"FALSE"},{"1":"TCCAGAACAGTAGAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166710217","4":"TRUE"},{"1":"TCCAGAACAGTAGAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151745023","4":"TRUE"},{"1":"AAGCATCTCTGTCAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.161825893","4":"TRUE"},{"1":"AAGCATCTCTGTCAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141713966","4":"TRUE"},{"1":"TAATTCCAGTTCCGGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.028602440","4":"FALSE"},{"1":"TAATTCCAGTTCCGGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052392342","4":"FALSE"},{"1":"CGAATTGAGACCAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182569195","4":"TRUE"},{"1":"CGAATTGAGACCAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.168177870","4":"TRUE"},{"1":"GGAATGGCAATGAGCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.212538441","4":"TRUE"},{"1":"GGAATGGCAATGAGCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.135847642","4":"TRUE"},{"1":"TCGAAGTTCTGGGCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.202629093","4":"TRUE"},{"1":"TCGAAGTTCTGGGCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166226395","4":"TRUE"},{"1":"CCACGAGAGGCTAGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.156881269","4":"TRUE"},{"1":"CCACGAGAGGCTAGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148544128","4":"TRUE"},{"1":"CAATGACTCCTTATGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.144801110","4":"TRUE"},{"1":"CAATGACTCCTTATGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145117148","4":"TRUE"},{"1":"AGAACAAGTGGACCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.200820084","4":"TRUE"},{"1":"AGAACAAGTGGACCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145509823","4":"TRUE"},{"1":"CATACCCAGAGCTGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164981608","4":"TRUE"},{"1":"CATACCCAGAGCTGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151126263","4":"TRUE"},{"1":"CTCAATTGTACTTGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184719905","4":"TRUE"},{"1":"CTCAATTGTACTTGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160972882","4":"TRUE"},{"1":"TTCTGTATCGGCTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.037024381","4":"FALSE"},{"1":"TTCTGTATCGGCTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052416140","4":"FALSE"},{"1":"GGATGTTAGAGCGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.041366003","4":"FALSE"},{"1":"GGATGTTAGAGCGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.043622604","4":"FALSE"},{"1":"CAAGCTATCGTCGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.156760668","4":"TRUE"},{"1":"CAAGCTATCGTCGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151310701","4":"TRUE"},{"1":"TTCCGGTCAACTTGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.031778256","4":"FALSE"},{"1":"TTCCGGTCAACTTGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053189591","4":"FALSE"},{"1":"GCCAGGTAGCAGCACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178307974","4":"TRUE"},{"1":"GCCAGGTAGCAGCACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162733969","4":"TRUE"},{"1":"GATCATGGTATCGAAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.183152097","4":"TRUE"},{"1":"GATCATGGTATCGAAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162043813","4":"TRUE"},{"1":"TTTAGTCCAACTCGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.018471991","4":"FALSE"},{"1":"TTTAGTCCAACTCGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.058609693","4":"FALSE"},{"1":"TCTCACGGTCGCATCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.183835501","4":"TRUE"},{"1":"TCTCACGGTCGCATCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.164399862","4":"TRUE"},{"1":"TGATTTCCAGCTAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.207453117","4":"TRUE"},{"1":"TGATTTCCAGCTAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.177262937","4":"TRUE"},{"1":"TCCTTCTTCCAGTACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.187473619","4":"TRUE"},{"1":"TCCTTCTTCCAGTACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.173984698","4":"TRUE"},{"1":"ACGATCAAGTCCGCCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176237664","4":"TRUE"},{"1":"ACGATCAAGTCCGCCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.130588179","4":"TRUE"},{"1":"ATCACTTCACCGGCTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.206990814","4":"TRUE"},{"1":"ATCACTTCACCGGCTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.180190150","4":"TRUE"},{"1":"GGCTTGGCACCTAAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128580330","4":"TRUE"},{"1":"GGCTTGGCACCTAAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133551089","4":"TRUE"},{"1":"CAACCAAGTACCGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.156981769","4":"TRUE"},{"1":"CAACCAAGTACCGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.155624174","4":"TRUE"},{"1":"ACCGTTCCACCTGCAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.030753151","4":"FALSE"},{"1":"ACCGTTCCACCTGCAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.055712229","4":"FALSE"},{"1":"TCTGGCTGTACGGTTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.183172198","4":"TRUE"},{"1":"TCTGGCTGTACGGTTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.189364462","4":"TRUE"},{"1":"GTGGGAATCTTCCCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.158569677","4":"TRUE"},{"1":"GTGGGAATCTTCCCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153886886","4":"TRUE"},{"1":"GGTAATCTCAAGTAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176137163","4":"TRUE"},{"1":"GGTAATCTCAAGTAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.134503028","4":"TRUE"},{"1":"CTAACCCGTTAGCTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.064702217","4":"FALSE"},{"1":"CTAACCCGTTAGCTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.101167315","4":"TRUE"},{"1":"GAATCGTCAGTCTTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.197202066","4":"TRUE"},{"1":"GAATCGTCAGTCTTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.171729792","4":"TRUE"},{"1":"GCACGGTTCTATACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.151052240","4":"TRUE"},{"1":"GCACGGTTCTATACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163549067","4":"TRUE"},{"1":"CACTAAGAGGTGCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.140298687","4":"TRUE"},{"1":"CACTAAGAGGTGCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132141030","4":"TRUE"},{"1":"GGGAGTATCTGCGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.210850033","4":"TRUE"},{"1":"GGGAGTATCTGCGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.165744476","4":"TRUE"},{"1":"GAGGCAACATGCACTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180880786","4":"TRUE"},{"1":"GAGGCAACATGCACTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166279941","4":"TRUE"},{"1":"TAGACTGCACTGGCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169845832","4":"TRUE"},{"1":"TAGACTGCACTGGCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.165405348","4":"TRUE"},{"1":"CATACAGGTGCCTACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164459006","4":"TRUE"},{"1":"CATACAGGTGCCTACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133325004","4":"TRUE"},{"1":"TCACATTTCCTTCAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.179634580","4":"TRUE"},{"1":"TCACATTTCCTTCAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161817727","4":"TRUE"},{"1":"ATCACAGCACTGTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186046512","4":"TRUE"},{"1":"ATCACAGCACTGTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154737681","4":"TRUE"},{"1":"TCACATTTCTTCTCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.035838476","4":"FALSE"},{"1":"TCACATTTCTTCTCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.058960721","4":"FALSE"},{"1":"TACAGGTAGGATGTTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.132379249","4":"TRUE"},{"1":"TACAGGTAGGATGTTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.125816585","4":"TRUE"},{"1":"TCATTACCAACTTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128057727","4":"TRUE"},{"1":"TCATTACCAACTTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133372601","4":"TRUE"},{"1":"TGGGAAGTCCCGAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.060481196","4":"FALSE"},{"1":"TGGGAAGTCCCGAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.018390271","4":"FALSE"},{"1":"AGACCCGGTGCTGTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.168077024","4":"TRUE"},{"1":"AGACCCGGTGCTGTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.139387665","4":"TRUE"},{"1":"AGTGACTCAGGATGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166509216","4":"TRUE"},{"1":"AGTGACTCAGGATGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147949166","4":"TRUE"},{"1":"TGAACGTAGCAGGTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176860767","4":"TRUE"},{"1":"TGAACGTAGCAGGTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170242387","4":"TRUE"},{"1":"AGTCATGCACACCTGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.200357782","4":"TRUE"},{"1":"AGTCATGCACACCTGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.178988327","4":"TRUE"},{"1":"AGCGCCAAGCTGACCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.016019778","4":"FALSE"},{"1":"AGCGCCAAGCTGACCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.051916372","4":"FALSE"},{"1":"CCTCACAAGACATCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171735242","4":"TRUE"},{"1":"CCTCACAAGACATCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157676793","4":"TRUE"},{"1":"CGTAGTAGTCTCAGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172539245","4":"TRUE"},{"1":"CGTAGTAGTCTCAGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150293316","4":"TRUE"},{"1":"TGCATGATCAGAGCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.153504452","4":"TRUE"},{"1":"TGCATGATCAGAGCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.137489737","4":"TRUE"},{"1":"TCCTAATCATACAGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.165765512","4":"TRUE"},{"1":"TCCTAATCATACAGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143855829","4":"TRUE"},{"1":"TTAGGCATCACGAGGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.042069506","4":"FALSE"},{"1":"TTAGGCATCACGAGGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.045693071","4":"FALSE"},{"1":"GACCCTTGTGACAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178931077","4":"TRUE"},{"1":"GACCCTTGTGACAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166744012","4":"TRUE"},{"1":"TCCTGCAAGCCGTTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.019255894","4":"FALSE"},{"1":"TCCTGCAAGCCGTTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.044818477","4":"FALSE"},{"1":"GAATCACTCGGCCTTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166348415","4":"TRUE"},{"1":"GAATCACTCGGCCTTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149484168","4":"TRUE"},{"1":"CTCAGGGGTAACACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193081546","4":"TRUE"},{"1":"CTCAGGGGTAACACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150412309","4":"TRUE"},{"1":"CATTGCCAGGGCATGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159775683","4":"TRUE"},{"1":"CATTGCCAGGGCATGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141464082","4":"TRUE"},{"1":"CCACGTTCAAATGGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.032642560","4":"FALSE"},{"1":"CCACGTTCAAATGGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.065743286","4":"FALSE"},{"1":"GAGAAATAGTGATTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157202870","4":"TRUE"},{"1":"GAGAAATAGTGATTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161127572","4":"TRUE"},{"1":"TTGGGCGGTAGAAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.152861249","4":"TRUE"},{"1":"TTGGGCGGTAGAAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156629660","4":"TRUE"},{"1":"GGAGGTATCGAGTCTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128600430","4":"TRUE"},{"1":"GGAGGTATCGAGTCTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132200526","4":"TRUE"},{"1":"CCGTAGGAGTCTTCCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167634821","4":"TRUE"},{"1":"CCGTAGGAGTCTTCCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.109657421","4":"TRUE"},{"1":"TGAGGGACACGGCGTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190126832","4":"TRUE"},{"1":"TGAGGGACACGGCGTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.169808065","4":"TRUE"},{"1":"CTTAGGAGTCCCTAAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.137263573","4":"TRUE"},{"1":"CTTAGGAGTCCCTAAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143653542","4":"TRUE"},{"1":"AATCGACCACGACGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.138570079","4":"TRUE"},{"1":"AATCGACCACGACGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.123573579","4":"TRUE"},{"1":"GTTGTCCAGTTGCGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.027898937","4":"FALSE"},{"1":"GTTGTCCAGTTGCGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057169885","4":"FALSE"},{"1":"TGCTCGTCAGTGGTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.026974332","4":"FALSE"},{"1":"TGCTCGTCAGTGGTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.036280774","4":"FALSE"},{"1":"TAGTGCACAGAACGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184116902","4":"TRUE"},{"1":"TAGTGCACAGAACGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.183510037","4":"TRUE"},{"1":"ATCTTCATCTCAACGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172599546","4":"TRUE"},{"1":"ATCTTCATCTCAACGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.135347874","4":"TRUE"},{"1":"CATAGACCAGCAATTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123997508","4":"TRUE"},{"1":"CATAGACCAGCAATTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142493366","4":"TRUE"},{"1":"CATTGTTGTGCCTGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.135776165","4":"TRUE"},{"1":"CATTGTTGTGCCTGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152322136","4":"TRUE"},{"1":"AGATCGTAGTTTCAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160680187","4":"TRUE"},{"1":"AGATCGTAGTTTCAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.116933805","4":"TRUE"},{"1":"CACATGACAAGAAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157263171","4":"TRUE"},{"1":"CACATGACAAGAAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133658183","4":"TRUE"},{"1":"CCTCAACTCTACTATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.199915580","4":"TRUE"},{"1":"CCTCAACTCTACTATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143135925","4":"TRUE"},{"1":"AGTGCCGTCGAACGGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176599465","4":"TRUE"},{"1":"AGTGCCGTCGAACGGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166678566","4":"TRUE"},{"1":"TCCTGCACATGACACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172298044","4":"TRUE"},{"1":"TCCTGCACATGACACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.155624174","4":"TRUE"},{"1":"TGTCAGAGTTCTCGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.053828064","4":"FALSE"},{"1":"TGTCAGAGTTCTCGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.066534585","4":"FALSE"},{"1":"TGGAGGATCCCGAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181443589","4":"TRUE"},{"1":"TGGAGGATCCCGAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160520711","4":"TRUE"},{"1":"AGGTCATAGGCACAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166891118","4":"TRUE"},{"1":"AGGTCATAGGCACAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149805447","4":"TRUE"},{"1":"CCTCCTCAGAATTGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.138630379","4":"TRUE"},{"1":"CCTCCTCAGAATTGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.155261248","4":"TRUE"},{"1":"GGATCTACACCAGTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.146992020","4":"TRUE"},{"1":"GGATCTACACCAGTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146241626","4":"TRUE"},{"1":"AGCTCAATCACTTGGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.022853812","4":"FALSE"},{"1":"AGCTCAATCACTTGGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057830293","4":"FALSE"},{"1":"CGTAAGTTCGCGGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149464332","4":"TRUE"},{"1":"CGTAAGTTCGCGGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126679280","4":"TRUE"},{"1":"TCCTGCAGTGGTAATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.033868666","4":"FALSE"},{"1":"TCCTGCAGTGGTAATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.067682862","4":"FALSE"},{"1":"TGCAGATAGCTTTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.156097365","4":"TRUE"},{"1":"TGCAGATAGCTTTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145259939","4":"TRUE"},{"1":"AACAAGATCCACCTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.173885952","4":"TRUE"},{"1":"AACAAGATCCACCTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147586240","4":"TRUE"},{"1":"CGAGTGCAGTGAGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176056763","4":"TRUE"},{"1":"CGAGTGCAGTGAGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149359226","4":"TRUE"},{"1":"GAAGCCCGTTGCTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.170931238","4":"TRUE"},{"1":"GAAGCCCGTTGCTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166500077","4":"TRUE"},{"1":"CGGACACTCCCAGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189845430","4":"TRUE"},{"1":"CGGACACTCCCAGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136989969","4":"TRUE"},{"1":"ACCGTTCAGGATTCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.042149907","4":"FALSE"},{"1":"ACCGTTCAGGATTCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.037672985","4":"FALSE"},{"1":"TGCTTCGGTCTCAGGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.121967398","4":"TRUE"},{"1":"TGCTTCGGTCTCAGGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.100358167","4":"TRUE"},{"1":"ACCACAACAAGTGGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166046914","4":"TRUE"},{"1":"ACCACAACAAGTGGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156046597","4":"TRUE"},{"1":"AAATGGATCAGCGCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.029506945","4":"FALSE"},{"1":"AAATGGATCAGCGCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062476945","4":"FALSE"},{"1":"AACCTTTGTATGAGGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174569355","4":"TRUE"},{"1":"AACCTTTGTATGAGGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.180505480","4":"TRUE"},{"1":"CAAGGGACAGGTGACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.022753311","4":"FALSE"},{"1":"CAAGGGACAGGTGACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.043717798","4":"FALSE"},{"1":"ATCGTCCTCTGCGGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177524070","4":"TRUE"},{"1":"ATCGTCCTCTGCGGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154214115","4":"TRUE"},{"1":"TCTGCCAGTTCAAGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164820808","4":"TRUE"},{"1":"TCTGCCAGTTCAAGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150138626","4":"TRUE"},{"1":"AACACACAGTCATGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.022471910","4":"FALSE"},{"1":"AACACACAGTCATGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.042932448","4":"FALSE"},{"1":"TAACTTCAGTTCATGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169946333","4":"TRUE"},{"1":"TAACTTCAGTTCATGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.138560668","4":"TRUE"},{"1":"ATTCTACCAAGCTGTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.041868505","4":"FALSE"},{"1":"ATTCTACCAAGCTGTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.070122205","4":"FALSE"},{"1":"CGGTCAGGTCTAGTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.197463368","4":"TRUE"},{"1":"CGGTCAGGTCTAGTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150632444","4":"TRUE"},{"1":"AGATGCTCAACACACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.191775040","4":"TRUE"},{"1":"AGATGCTCAACACACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163275384","4":"TRUE"},{"1":"TGACTCCCAACTCGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190770035","4":"TRUE"},{"1":"TGACTCCCAACTCGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150251669","4":"TRUE"},{"1":"CACGGGTCAGCTTTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.042913710","4":"FALSE"},{"1":"CACGGGTCAGCTTTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062369852","4":"FALSE"},{"1":"CACTGTCGTCTCGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.147112621","4":"TRUE"},{"1":"CACTGTCGTCTCGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149734052","4":"TRUE"},{"1":"TCGCTCACATCGGATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.135555064","4":"TRUE"},{"1":"TCGCTCACATCGGATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136115375","4":"TRUE"},{"1":"TCGGGACTCCCAACTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171031738","4":"TRUE"},{"1":"TCGGGACTCCCAACTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161847476","4":"TRUE"},{"1":"TCAGCAAAGCGACATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.134007357","4":"TRUE"},{"1":"TCAGCAAAGCGACATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.131450874","4":"TRUE"},{"1":"CTCAACCCATACACCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123615606","4":"TRUE"},{"1":"CTCAACCCATACACCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.124739704","4":"TRUE"},{"1":"GGCAGTCAGTAAGCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.034089767","4":"FALSE"},{"1":"GGCAGTCAGTAAGCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.065320863","4":"FALSE"},{"1":"TTCCACGCAAGTGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123535205","4":"TRUE"},{"1":"TTCCACGCAAGTGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126518640","4":"TRUE"},{"1":"CCTGCATCAGAGCCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163494201","4":"TRUE"},{"1":"CCTGCATCAGAGCCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141547377","4":"TRUE"},{"1":"GTGGAAGTCATGAAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149484432","4":"TRUE"},{"1":"GTGGAAGTCATGAAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170545818","4":"TRUE"},{"1":"AAGACAATCGATCCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.029567245","4":"FALSE"},{"1":"AAGACAATCGATCCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.070848059","4":"FALSE"},{"1":"CTGGTCTGTTCAAGGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.110168640","4":"TRUE"},{"1":"CTGGTCTGTTCAAGGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.118159426","4":"TRUE"},{"1":"CTTCTCTTCCCTTGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.194528753","4":"TRUE"},{"1":"CTTCTCTTCCCTTGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.176882162","4":"TRUE"},{"1":"TGCGACGAGGAAAGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169222729","4":"TRUE"},{"1":"TGCGACGAGGAAAGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157230572","4":"TRUE"},{"1":"AGTCATGTCTCCAATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182388294","4":"TRUE"},{"1":"AGTCATGTCTCCAATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.174573710","4":"TRUE"},{"1":"ATTGGGTCATTGCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157001869","4":"TRUE"},{"1":"ATTGGGTCATTGCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.173276693","4":"TRUE"},{"1":"TGCGGCACAATCGCGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.015838878","4":"FALSE"},{"1":"TGCGGCACAATCGCGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.044598341","4":"FALSE"},{"1":"TCACTCGAGCCGTAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.136620369","4":"TRUE"},{"1":"TCACTCGAGCCGTAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157224622","4":"TRUE"},{"1":"GATCCCTAGTATTGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.146429218","4":"TRUE"},{"1":"GATCCCTAGTATTGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.135907138","4":"TRUE"},{"1":"CATTGCCTCTGATGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178629575","4":"TRUE"},{"1":"CATTGCCTCTGATGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146229727","4":"TRUE"},{"1":"TTGCATTAGTCATGGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169524231","4":"TRUE"},{"1":"TTGCATTAGTCATGGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136508050","4":"TRUE"},{"1":"ATGGATCGTGGCATCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175051758","4":"TRUE"},{"1":"ATGGATCGTGGCATCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.139572103","4":"TRUE"},{"1":"TCCTGCAGTTGCTTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.023416615","4":"FALSE"},{"1":"TCCTGCAGTTGCTTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053040850","4":"FALSE"},{"1":"AGCTACATCTGGTGCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.040722800","4":"FALSE"},{"1":"AGCTACATCTGGTGCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.028885398","4":"FALSE"},{"1":"ACACAGTGTGGAAATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.016401680","4":"FALSE"},{"1":"ACACAGTGTGGAAATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.044074775","4":"FALSE"},{"1":"CTGGCAGGTGACTCTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.151514542","4":"TRUE"},{"1":"CTGGCAGGTGACTCTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.134508978","4":"TRUE"},{"1":"ATTCTACAGGCTTCCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.025024623","4":"FALSE"},{"1":"ATTCTACAGGCTTCCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062792275","4":"FALSE"},{"1":"CATTCCGCATAGGTTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.034471669","4":"FALSE"},{"1":"CATTCCGCATAGGTTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.080177061","4":"FALSE"},{"1":"AGACCCGTCTGTCAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177785371","4":"TRUE"},{"1":"AGACCCGTCTGTCAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143439356","4":"TRUE"},{"1":"CACCAAAGTTCGAGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.165785612","4":"TRUE"},{"1":"CACCAAAGTTCGAGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148639322","4":"TRUE"},{"1":"ATCGGATGTATGAGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.199071375","4":"TRUE"},{"1":"ATCGGATGTATGAGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.193630338","4":"TRUE"},{"1":"AACGAAACACACAGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.031135053","4":"FALSE"},{"1":"AACGAAACACACAGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.059347446","4":"FALSE"},{"1":"CAGCAGCTCCTACCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.046913630","4":"FALSE"},{"1":"CAGCAGCTCCTACCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.083758731","4":"FALSE"},{"1":"TTGGTTTTCGCCATAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.142992101","4":"TRUE"},{"1":"TTGGTTTTCGCCATAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.165179262","4":"TRUE"},{"1":"TTAGGGTGTAGCACAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195453358","4":"TRUE"},{"1":"TTAGGGTGTAGCACAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162585228","4":"TRUE"},{"1":"CCTATCGCATTGGCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.021205604","4":"FALSE"},{"1":"CCTATCGCATTGGCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062292507","4":"FALSE"},{"1":"CTTTCGGGTGCGGCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195433258","4":"TRUE"},{"1":"CTTTCGGGTGCGGCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.164001238","4":"TRUE"},{"1":"GCATTAGGTATCCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166348415","4":"TRUE"},{"1":"GCATTAGGTATCCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126970811","4":"TRUE"},{"1":"ACTATGGCAAGAAATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172338244","4":"TRUE"},{"1":"ACTATGGCAAGAAATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153886886","4":"TRUE"},{"1":"ATTGGGTGTCCACGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.207593817","4":"TRUE"},{"1":"ATTGGGTGTCCACGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170432775","4":"TRUE"},{"1":"CAGATACAGCCACCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.115937368","4":"TRUE"},{"1":"CAGATACAGCCACCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.128952034","4":"TRUE"},{"1":"GTCTGTCAGCCGATTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.168619726","4":"TRUE"},{"1":"GTCTGTCAGCCGATTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151233356","4":"TRUE"},{"1":"ACACCAAGTTCCACAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164057004","4":"TRUE"},{"1":"ACACCAAGTTCCACAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.123609277","4":"TRUE"},{"1":"GATGACTAGATGACAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.202066290","4":"TRUE"},{"1":"GATGACTAGATGACAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156004950","4":"TRUE"},{"1":"TCCAGAAAGGTGCTAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169082029","4":"TRUE"},{"1":"TCCAGAAAGGTGCTAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149365176","4":"TRUE"},{"1":"ATTCCATCACTCCTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.021607606","4":"FALSE"},{"1":"ATTCCATCACTCCTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062012875","4":"FALSE"},{"1":"TATCAGGTCATCTGTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176921067","4":"TRUE"},{"1":"TATCAGGTCATCTGTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.134247195","4":"TRUE"},{"1":"CCAATTTCAGACGCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.144439308","4":"TRUE"},{"1":"CCAATTTCAGACGCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161383405","4":"TRUE"},{"1":"CAACGGCAGCAGCGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171695041","4":"TRUE"},{"1":"CAACGGCAGCAGCGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151774771","4":"TRUE"},{"1":"GGGTCACTCACTAGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128741131","4":"TRUE"},{"1":"GGGTCACTCACTAGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143314414","4":"TRUE"},{"1":"AAGCGAGAGAGGTATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.158087275","4":"TRUE"},{"1":"AAGCGAGAGAGGTATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148276395","4":"TRUE"},{"1":"GCAGGCTAGTGACCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167936323","4":"TRUE"},{"1":"GCAGGCTAGTGACCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157218672","4":"TRUE"},{"1":"TCATTTGTCTAGCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157584772","4":"TRUE"},{"1":"TCATTTGTCTAGCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146961530","4":"TRUE"},{"1":"TGCAGATCAAAGGCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.199272376","4":"TRUE"},{"1":"TGCAGATCAAAGGCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.172413998","4":"TRUE"},{"1":"GTTACGATCCACAAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190267532","4":"TRUE"},{"1":"GTTACGATCCACAAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158438344","4":"TRUE"},{"1":"TTAGGCAAGAGGGTAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193604149","4":"TRUE"},{"1":"TTAGGCAAGAGGGTAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159384333","4":"TRUE"},{"1":"ACTTCGCTCGACTCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.130509939","4":"TRUE"},{"1":"ACTTCGCTCGACTCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149442521","4":"TRUE"},{"1":"AGACAAAGTCCACAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.183292798","4":"TRUE"},{"1":"AGACAAAGTCCACAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160901486","4":"TRUE"},{"1":"GGGCGTTTCGTCTACC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.144961910","4":"TRUE"},{"1":"GGGCGTTTCGTCTACC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127655017","4":"TRUE"},{"1":"AGATAGAGTTCATCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.039637394","4":"FALSE"},{"1":"AGATAGAGTTCATCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.069937767","4":"FALSE"},{"1":"TATTGGGTCACATACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164861008","4":"TRUE"},{"1":"TATTGGGTCACATACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163418175","4":"TRUE"},{"1":"TCCCACAAGTCACTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159655082","4":"TRUE"},{"1":"TCCCACAAGTCACTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.121866038","4":"TRUE"},{"1":"AAGAACAAGCTCGACC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.017306185","4":"FALSE"},{"1":"AAGAACAAGCTCGACC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.046264234","4":"FALSE"},{"1":"CAACCTCCAGACAATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163675102","4":"TRUE"},{"1":"CAACCTCCAGACAATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.140244410","4":"TRUE"},{"1":"TACGCTCCAGGAGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.165685112","4":"TRUE"},{"1":"TACGCTCCAGGAGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.171176478","4":"TRUE"},{"1":"ACAGGGATCGACCTAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190026331","4":"TRUE"},{"1":"ACAGGGATCGACCTAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154928069","4":"TRUE"},{"1":"AGTCAACAGAGGATGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.056199875","4":"FALSE"},{"1":"AGTCAACAGAGGATGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.051975868","4":"FALSE"},{"1":"GACATCAAGCAATAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181202388","4":"TRUE"},{"1":"GACATCAAGCAATAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.175591095","4":"TRUE"},{"1":"TGAGGGATCTAGCATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.137203272","4":"TRUE"},{"1":"TGAGGGATCTAGCATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126155713","4":"TRUE"},{"1":"AGTTAGCAGTGCACCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.213523346","4":"TRUE"},{"1":"AGTTAGCAGTGCACCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167969633","4":"TRUE"},{"1":"ATCGCCTTCCGACAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.029084843","4":"FALSE"},{"1":"ATCGCCTTCCGACAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062108069","4":"FALSE"},{"1":"CTTCCTTTCCTATTTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.012964564","4":"FALSE"},{"1":"CTTCCTTTCCTATTTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.060680160","4":"FALSE"},{"1":"CTCTCAGGTGTAAATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.150348737","4":"TRUE"},{"1":"CTCTCAGGTGTAAATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147687383","4":"TRUE"},{"1":"CACTTCGTCATCTCTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.037165082","4":"FALSE"},{"1":"CACTTCGTCATCTCTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.050821642","4":"FALSE"},{"1":"TATACCTAGGACACTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.203191896","4":"TRUE"},{"1":"TATACCTAGGACACTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.173490879","4":"TRUE"},{"1":"GGAGGATAGCCTGTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195473458","4":"TRUE"},{"1":"GGAGGATAGCCTGTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148151453","4":"TRUE"},{"1":"GTAACCACAACAAAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.208699323","4":"TRUE"},{"1":"GTAACCACAACAAAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159967396","4":"TRUE"},{"1":"CCATCACCAGCCTTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.039195192","4":"FALSE"},{"1":"CCATCACCAGCCTTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.051136972","4":"FALSE"},{"1":"ACTCTCGGTTCGGTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.191051436","4":"TRUE"},{"1":"ACTCTCGGTTCGGTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.165363700","4":"TRUE"},{"1":"TCAAGACCAATAAGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.024280919","4":"FALSE"},{"1":"TCAAGACCAATAAGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053510870","4":"FALSE"},{"1":"TGGGCGTTCCGCATAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186910816","4":"TRUE"},{"1":"TGGGCGTTCCGCATAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.168659789","4":"TRUE"},{"1":"GTCTTTAAGCTGTTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171071938","4":"TRUE"},{"1":"GTCTTTAAGCTGTTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.178470710","4":"TRUE"},{"1":"TCAGCCTTCGATTTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166971518","4":"TRUE"},{"1":"TCAGCCTTCGATTTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147253061","4":"TRUE"},{"1":"TTACGCCTCAGTCATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.026331129","4":"FALSE"},{"1":"TTACGCCTCAGTCATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.051107224","4":"FALSE"},{"1":"TCATGCCAGCCAAGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.148981930","4":"TRUE"},{"1":"TCATGCCAGCCAAGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152220993","4":"TRUE"},{"1":"ATTCAGGCAGTTTCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.045104621","4":"FALSE"},{"1":"ATTCAGGCAGTTTCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.055414748","4":"FALSE"},{"1":"TTAGGGTGTGAGTAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186589214","4":"TRUE"},{"1":"TTAGGGTGTGAGTAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.168076726","4":"TRUE"},{"1":"ACCCAAAAGAGGATCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160941489","4":"TRUE"},{"1":"ACCCAAAAGAGGATCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133717679","4":"TRUE"},{"1":"CATCAAGAGGGTACAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193905650","4":"TRUE"},{"1":"CATCAAGAGGGTACAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.165482693","4":"TRUE"},{"1":"AGCTCAAAGGCCTTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163655002","4":"TRUE"},{"1":"AGCTCAAAGGCCTTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166363236","4":"TRUE"},{"1":"CATTGTTAGCACCTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167494121","4":"TRUE"},{"1":"CATTGTTAGCACCTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146467711","4":"TRUE"},{"1":"TTCCTAACATACCACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.003778819","4":"FALSE"},{"1":"TTCCTAACATACCACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052856412","4":"FALSE"},{"1":"GTAGGAGGTTCAAGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160680187","4":"TRUE"},{"1":"GTAGGAGGTTCAAGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142814646","4":"TRUE"},{"1":"CTCACTGTCTGCGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182609395","4":"TRUE"},{"1":"CTCACTGTCTGCGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.172741227","4":"TRUE"},{"1":"CACGTTCGTTGATGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.026813531","4":"FALSE"},{"1":"CACGTTCGTTGATGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.066290651","4":"FALSE"},{"1":"TCCCACACACGACGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.136781170","4":"TRUE"},{"1":"TCCCACACACGACGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.144159259","4":"TRUE"},{"1":"GTGTCCTGTCGACTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.179272778","4":"TRUE"},{"1":"GTGTCCTGTCGACTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158301503","4":"TRUE"},{"1":"CGATGGCGTCATTCCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.017487086","4":"FALSE"},{"1":"CGATGGCGTCATTCCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052981354","4":"FALSE"},{"1":"CCCAACTGTTCAACGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178770276","4":"TRUE"},{"1":"CCCAACTGTTCAACGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162365092","4":"TRUE"},{"1":"TGTGCGGGTAGACACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177584370","4":"TRUE"},{"1":"TGTGCGGGTAGACACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156391675","4":"TRUE"},{"1":"TCCTCTTAGACCTCCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195433258","4":"TRUE"},{"1":"TCCTCTTAGACCTCCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147794476","4":"TRUE"},{"1":"ATCACAGAGGGAGAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176498965","4":"TRUE"},{"1":"ATCACAGAGGGAGAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142987185","4":"TRUE"},{"1":"CGGAACCGTGAATTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.151715543","4":"TRUE"},{"1":"CGGAACCGTGAATTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126649532","4":"TRUE"},{"1":"TTTAGTCAGGTTTACC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.059375691","4":"FALSE"},{"1":"TTTAGTCAGGTTTACC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.038613025","4":"FALSE"},{"1":"GGCTTTCTCTTTACAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195151856","4":"TRUE"},{"1":"GGCTTTCTCTTTACAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148692869","4":"TRUE"},{"1":"GATCACACACGACGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.114590661","4":"TRUE"},{"1":"GATCACACACGACGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.104237318","4":"TRUE"},{"1":"GTCAGCGAGTCACAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.025909027","4":"FALSE"},{"1":"GTCAGCGAGTCACAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.035644165","4":"FALSE"},{"1":"TTGGGTAGTCTAACTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.029165243","4":"FALSE"},{"1":"TTGGGTAGTCTAACTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.067837552","4":"FALSE"},{"1":"ATCCTATTCACGGGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.033828466","4":"FALSE"},{"1":"ATCCTATTCACGGGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062536441","4":"FALSE"},{"1":"ATTTCACTCTCCGATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172137243","4":"TRUE"},{"1":"ATTTCACTCTCCGATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.175341211","4":"TRUE"},{"1":"GACCAATCAGCTGTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193584049","4":"TRUE"},{"1":"GACCAATCAGCTGTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.184652364","4":"TRUE"},{"1":"TCGGATAAGCAAATCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.165866013","4":"TRUE"},{"1":"TCGGATAAGCAAATCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141160652","4":"TRUE"},{"1":"TTAGTCTGTATTGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184137002","4":"TRUE"},{"1":"TTAGTCTGTATTGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.175757684","4":"TRUE"},{"1":"GGGAGATAGGCTGAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.192016241","4":"TRUE"},{"1":"GGGAGATAGGCTGAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156564214","4":"TRUE"},{"1":"CCTCAACTCGTTCTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171011638","4":"TRUE"},{"1":"CCTCAACTCGTTCTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157587549","4":"TRUE"},{"1":"TTCAGGACACTGCACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.128922032","4":"TRUE"},{"1":"TTCAGGACACTGCACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145545521","4":"TRUE"},{"1":"CAGCGTGGTCAGGAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.133826456","4":"TRUE"},{"1":"CAGCGTGGTCAGGAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147467247","4":"TRUE"},{"1":"TCCATGCCAAGAATGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180498884","4":"TRUE"},{"1":"TCCATGCCAAGAATGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158319352","4":"TRUE"},{"1":"GAGACTTAGACTACCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.185081707","4":"TRUE"},{"1":"GAGACTTAGACTACCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.137037566","4":"TRUE"},{"1":"CTGAGCGGTCTTTATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.191634339","4":"TRUE"},{"1":"CTGAGCGGTCTTTATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143701139","4":"TRUE"},{"1":"TGTAACGCAATTTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.125243714","4":"TRUE"},{"1":"TGTAACGCAATTTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.119486191","4":"TRUE"},{"1":"AGATAGAGTCACAATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.039818295","4":"FALSE"},{"1":"AGATAGAGTCACAATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057473316","4":"FALSE"},{"1":"TCTCCGACACAGTCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.227432614","4":"TRUE"},{"1":"TCTCCGACACAGTCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153018242","4":"TRUE"},{"1":"TGAATCGCATGATGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180941087","4":"TRUE"},{"1":"TGAATCGCATGATGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170391128","4":"TRUE"},{"1":"AATGACCGTTCTCTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.014070069","4":"FALSE"},{"1":"AATGACCGTTCTCTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052362594","4":"FALSE"},{"1":"AGGAAATAGGGACCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163212800","4":"TRUE"},{"1":"AGGAAATAGGGACCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.164465308","4":"TRUE"},{"1":"TAACTTCCAGACATCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177946172","4":"TRUE"},{"1":"TAACTTCCAGACATCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.140113519","4":"TRUE"},{"1":"CATGCAAGTCCTCAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123032703","4":"TRUE"},{"1":"CATGCAAGTCCTCAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.129939671","4":"TRUE"},{"1":"GCCAGTGTCAGGAAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169906133","4":"TRUE"},{"1":"GCCAGTGTCAGGAAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166845155","4":"TRUE"},{"1":"CCGCAAGAGTCGCCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.114892163","4":"TRUE"},{"1":"CCGCAAGAGTCGCCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.116826711","4":"TRUE"},{"1":"TGTTGAGTCAACTGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.126650721","4":"TRUE"},{"1":"TGTTGAGTCAACTGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.113286688","4":"TRUE"},{"1":"TGTCCACTCACAGTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.158107375","4":"TRUE"},{"1":"TGTCCACTCACAGTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.109348041","4":"TRUE"},{"1":"GGGACCTAGACTCATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.058531487","4":"FALSE"},{"1":"GGGACCTAGACTCATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.063244446","4":"FALSE"},{"1":"TACAGGTCATCGATGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.201282386","4":"TRUE"},{"1":"TACAGGTCATCGATGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156933091","4":"TRUE"},{"1":"ATCATTCCAGACCCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.168720227","4":"TRUE"},{"1":"ATCATTCCAGACCCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157873130","4":"TRUE"},{"1":"TACCGAAGTGCTGATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.110168640","4":"TRUE"},{"1":"TACCGAAGTGCTGATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.116130606","4":"TRUE"},{"1":"TCATGCCGTTGGTAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159132480","4":"TRUE"},{"1":"TCATGCCGTTGGTAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151768822","4":"TRUE"},{"1":"TAAGTCGGTCATGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184056602","4":"TRUE"},{"1":"TAAGTCGGTCATGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.172366401","4":"TRUE"},{"1":"TTTACGTGTCCGACGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.037587184","4":"FALSE"},{"1":"TTTACGTGTCCGACGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.068616952","4":"FALSE"},{"1":"AGTTAGCAGGTGCTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.142972001","4":"TRUE"},{"1":"AGTTAGCAGGTGCTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136329561","4":"TRUE"},{"1":"CCCGGAAAGTCATCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186709815","4":"TRUE"},{"1":"CCCGGAAAGTCATCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150144576","4":"TRUE"},{"1":"TGAATGCGTTAAGAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.135675665","4":"TRUE"},{"1":"TGAATGCGTTAAGAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.120075203","4":"TRUE"},{"1":"ATAGACCAGGACTTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.039175092","4":"FALSE"},{"1":"ATAGACCAGGACTTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.067052202","4":"FALSE"},{"1":"CGAGGAAGTACGCTTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176157263","4":"TRUE"},{"1":"CGAGGAAGTACGCTTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170260236","4":"TRUE"},{"1":"CAATTTCAGTTTCAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.152599948","4":"TRUE"},{"1":"CAATTTCAGTTTCAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145367032","4":"TRUE"},{"1":"TTTGGTTAGTAAGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.196217161","4":"TRUE"},{"1":"TTTGGTTAGTAAGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.195546115","4":"TRUE"},{"1":"GAAGAATTCCACGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182106892","4":"TRUE"},{"1":"GAAGAATTCCACGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160122086","4":"TRUE"},{"1":"TTCTGTAGTGGTAATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180820486","4":"TRUE"},{"1":"TTCTGTAGTGGTAATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143272766","4":"TRUE"},{"1":"CCCTGATCATTGTAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.211493236","4":"TRUE"},{"1":"CCCTGATCATTGTAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145521722","4":"TRUE"},{"1":"AAACGCTAGGATTCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186830415","4":"TRUE"},{"1":"AAACGCTAGGATTCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159074953","4":"TRUE"},{"1":"AGGAGGTTCCACTAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157504372","4":"TRUE"},{"1":"AGGAGGTTCCACTAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.169510584","4":"TRUE"},{"1":"GTTCGCTCAACTCGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.148881430","4":"TRUE"},{"1":"GTTCGCTCAACTCGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150727638","4":"TRUE"},{"1":"TCATACTTCATTTCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.022291009","4":"FALSE"},{"1":"TCATACTTCATTTCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.060019753","4":"FALSE"},{"1":"GCTACCTGTCTCGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180237583","4":"TRUE"},{"1":"GCTACCTGTCTCGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.140309856","4":"TRUE"},{"1":"TAGACTGCAATTTCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.156278266","4":"TRUE"},{"1":"TAGACTGCAATTTCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132789538","4":"TRUE"},{"1":"TCAAGCAAGCGAGTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174227654","4":"TRUE"},{"1":"TCAAGCAAGCGAGTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132063685","4":"TRUE"},{"1":"AATCACGAGACTCTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157303371","4":"TRUE"},{"1":"AATCACGAGACTCTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142665905","4":"TRUE"},{"1":"TTAATCCAGGGTTAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.173001548","4":"TRUE"},{"1":"TTAATCCAGGGTTAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162103309","4":"TRUE"},{"1":"CCTCAGTAGGTTCTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.032099857","4":"FALSE"},{"1":"CCTCAGTAGGTTCTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.059900760","4":"FALSE"},{"1":"CTGGTCTGTATCCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166408715","4":"TRUE"},{"1":"CTGGTCTGTATCCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162603077","4":"TRUE"},{"1":"ATCGTAGGTATCCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.120258889","4":"TRUE"},{"1":"ATCGTAGGTATCCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.125055034","4":"TRUE"},{"1":"TATACCTTCGAACGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.152680348","4":"TRUE"},{"1":"TATACCTTCGAACGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150317115","4":"TRUE"},{"1":"TCTGTCGTCCGTGACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.202930594","4":"TRUE"},{"1":"TCTGTCGTCCGTGACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.176394293","4":"TRUE"},{"1":"GTCCACTCAAATCAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149504533","4":"TRUE"},{"1":"GTCCACTCAAATCAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.137263651","4":"TRUE"},{"1":"AGAACAAGTAGGCTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177081868","4":"TRUE"},{"1":"AGAACAAGTAGGCTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161966468","4":"TRUE"},{"1":"AGCATCACAGGAATAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.111997749","4":"TRUE"},{"1":"AGCATCACAGGAATAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.104748986","4":"TRUE"},{"1":"TAAGCACGTATTTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.023356314","4":"FALSE"},{"1":"TAAGCACGTATTTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.073519437","4":"FALSE"},{"1":"TTCACCGTCCTGGTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178910977","4":"TRUE"},{"1":"TTCACCGTCCTGGTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160294625","4":"TRUE"},{"1":"GTCACTCGTATGGTAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.229322024","4":"TRUE"},{"1":"GTCACTCGTATGGTAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.176626328","4":"TRUE"},{"1":"GATAGCTCAATGCAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.118972483","4":"TRUE"},{"1":"GATAGCTCAATGCAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.129433953","4":"TRUE"},{"1":"CGAGTTACAGCTACCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.050491447","4":"FALSE"},{"1":"CGAGTTACAGCTACCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.075667250","4":"FALSE"},{"1":"TATCGCCCACGAGAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123917107","4":"TRUE"},{"1":"TATCGCCCACGAGAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.123597377","4":"TRUE"},{"1":"TATCTGTCAAGACTGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181986292","4":"TRUE"},{"1":"TATCTGTCAAGACTGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152113899","4":"TRUE"},{"1":"TTGAGTGAGTAGCATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.168820727","4":"TRUE"},{"1":"TTGAGTGAGTAGCATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.138060900","4":"TRUE"},{"1":"AGTACCACAAGCCTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180317984","4":"TRUE"},{"1":"AGTACCACAAGCCTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170355430","4":"TRUE"},{"1":"GTCACGGCACCAACAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160700287","4":"TRUE"},{"1":"GTCACGGCACCAACAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.119486191","4":"TRUE"},{"1":"GATTTCTTCCCACAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.203372797","4":"TRUE"},{"1":"GATTTCTTCCCACAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167499613","4":"TRUE"},{"1":"TCAATCTTCACTCGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.051657253","4":"FALSE"},{"1":"TCAATCTTCACTCGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.068271874","4":"FALSE"},{"1":"CCGGGTATCCGAGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.196619163","4":"TRUE"},{"1":"CCGGGTATCCGAGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136894775","4":"TRUE"},{"1":"ACTGTCCAGGGCAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167514221","4":"TRUE"},{"1":"ACTGTCCAGGGCAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148306144","4":"TRUE"},{"1":"CTCAACCTCAGGACGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160800788","4":"TRUE"},{"1":"CTCAACCTCAGGACGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.176739371","4":"TRUE"},{"1":"GTGTTAGAGTGCCTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.006633033","4":"FALSE"},{"1":"GTGTTAGAGTGCCTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052660074","4":"FALSE"},{"1":"ACGGTTATCTTCTTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.021507105","4":"FALSE"},{"1":"ACGGTTATCTTCTTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.052184105","4":"FALSE"},{"1":"CAGGTATTCACGGGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186589214","4":"TRUE"},{"1":"CAGGTATTCACGGGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141226097","4":"TRUE"},{"1":"AAGTCGTAGACGGTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.219794577","4":"TRUE"},{"1":"AAGTCGTAGACGGTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143968872","4":"TRUE"},{"1":"TGACAGTAGTCTTCCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163835903","4":"TRUE"},{"1":"TGACAGTAGTCTTCCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154333107","4":"TRUE"},{"1":"CATTTCATCACTAGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174689956","4":"TRUE"},{"1":"CATTTCATCACTAGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158795321","4":"TRUE"},{"1":"CAAGGGAAGGGTACGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.212236940","4":"TRUE"},{"1":"CAAGGGAAGGGTACGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.155201752","4":"TRUE"},{"1":"GTGCAGCCAGCTGTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.211814838","4":"TRUE"},{"1":"GTGCAGCCAGCTGTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.203262771","4":"TRUE"},{"1":"AGAACAAAGTAAGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.143514703","4":"TRUE"},{"1":"AGAACAAAGTAAGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127244494","4":"TRUE"},{"1":"GACGCTGGTTCTCGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.061626902","4":"FALSE"},{"1":"GACGCTGGTTCTCGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.043979581","4":"FALSE"},{"1":"AGACAAACAAACACCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159554582","4":"TRUE"},{"1":"AGACAAACAAACACCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163209938","4":"TRUE"},{"1":"TTTGTTGTCCGATTAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157946574","4":"TRUE"},{"1":"TTTGTTGTCCGATTAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132795488","4":"TRUE"},{"1":"TAGCACAGTACTCGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175393459","4":"TRUE"},{"1":"TAGCACAGTACTCGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.106159045","4":"TRUE"},{"1":"CTAACCCTCCATACAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189222327","4":"TRUE"},{"1":"CTAACCCTCCATACAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.171807137","4":"TRUE"},{"1":"GGGCTACCAGCCTTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.030532050","4":"FALSE"},{"1":"GGGCTACCAGCCTTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.048233558","4":"FALSE"},{"1":"TTTGGTTGTTCTCTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175775361","4":"TRUE"},{"1":"TTTGGTTGTTCTCTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142302978","4":"TRUE"},{"1":"TGGATGTGTTTCGGCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.168700127","4":"TRUE"},{"1":"TGGATGTGTTTCGGCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147229263","4":"TRUE"},{"1":"GTGGAAGCATCAGCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177905972","4":"TRUE"},{"1":"GTGGAAGCATCAGCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149769750","4":"TRUE"},{"1":"GCTTCACAGGTTAAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180981287","4":"TRUE"},{"1":"GCTTCACAGGTTAAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127149300","4":"TRUE"},{"1":"GACCGTGGTCGTCATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180780286","4":"TRUE"},{"1":"GACCGTGGTCGTCATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.138870048","4":"TRUE"},{"1":"TCCTTCTGTATCAAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.204619003","4":"TRUE"},{"1":"TCCTTCTGTATCAAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153291924","4":"TRUE"},{"1":"TGGGCGTGTCGTTTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.147856324","4":"TRUE"},{"1":"TGGGCGTGTCGTTTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153886886","4":"TRUE"},{"1":"ATTCATCGTTCAAAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.196820164","4":"TRUE"},{"1":"ATTCATCGTTCAAAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.144236604","4":"TRUE"},{"1":"GTATTGGGTCGATGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.103575808","4":"TRUE"},{"1":"GTATTGGGTCGATGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.112144362","4":"TRUE"},{"1":"CACTAAGCATCCTTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181825491","4":"TRUE"},{"1":"CACTAAGCATCCTTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.135270529","4":"TRUE"},{"1":"GTGATGTTCTGCGGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171855842","4":"TRUE"},{"1":"GTGATGTTCTGCGGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.168784731","4":"TRUE"},{"1":"TGATGGTTCTTCGCTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.033627465","4":"FALSE"},{"1":"TGATGGTTCTTCGCTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062488844","4":"FALSE"},{"1":"GGTAATCCACAACATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169946333","4":"TRUE"},{"1":"GGTAATCCACAACATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.169094111","4":"TRUE"},{"1":"CTTCTAAAGCTGCGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.018934293","4":"FALSE"},{"1":"CTTCTAAAGCTGCGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.050756197","4":"FALSE"},{"1":"CGAGTGCTCTTTGATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.145042311","4":"TRUE"},{"1":"CGAGTGCTCTTTGATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150739538","4":"TRUE"},{"1":"AAGCGAGGTTGTCTAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189443428","4":"TRUE"},{"1":"AAGCGAGGTTGTCTAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159848404","4":"TRUE"},{"1":"CATTGCCCACACGGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.018009688","4":"FALSE"},{"1":"CATTGCCCACACGGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.051238116","4":"FALSE"},{"1":"CATGGATGTCGCATGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175393459","4":"TRUE"},{"1":"CATGGATGTCGCATGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161341758","4":"TRUE"},{"1":"CAGGGCTAGAAGAGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164901208","4":"TRUE"},{"1":"CAGGGCTAGAAGAGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.121449565","4":"TRUE"},{"1":"TGACTCCGTCCTCATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123334204","4":"TRUE"},{"1":"TGACTCCGTCCTCATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126595985","4":"TRUE"},{"1":"CACAACAGTGGACAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177302969","4":"TRUE"},{"1":"CACAACAGTGGACAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158093266","4":"TRUE"},{"1":"CCAAGCGCATTGAGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.188579124","4":"TRUE"},{"1":"CCAAGCGCATTGAGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.128714049","4":"TRUE"},{"1":"TGATGCACACCGAATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.080500894","4":"FALSE"},{"1":"TGATGCACACCGAATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.108074822","4":"TRUE"},{"1":"GGATCTATCGCTACAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.146127716","4":"TRUE"},{"1":"GGATCTATCGCTACAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136751984","4":"TRUE"},{"1":"CGTAAGTTCGGATAAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177222568","4":"TRUE"},{"1":"CGTAAGTTCGGATAAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.181546663","4":"TRUE"},{"1":"TCCTCCCTCTTACACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.011718357","4":"FALSE"},{"1":"TCCTCCCTCTTACACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057235331","4":"FALSE"},{"1":"TGAATGCTCGGAGATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176418564","4":"TRUE"},{"1":"TGAATGCTCGGAGATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157486405","4":"TRUE"},{"1":"ACACAGTTCAAGCTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.117344375","4":"TRUE"},{"1":"ACACAGTTCAAGCTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.131938743","4":"TRUE"},{"1":"GGAGAACCAAGCACAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.025346224","4":"FALSE"},{"1":"GGAGAACCAAGCACAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053772653","4":"FALSE"},{"1":"GACCTTCCAGTCACGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.154911459","4":"TRUE"},{"1":"GACCTTCCAGTCACGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.132741941","4":"TRUE"},{"1":"ATGGTTGTCATAGCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.170870937","4":"TRUE"},{"1":"ATGGTTGTCATAGCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159890051","4":"TRUE"},{"1":"GATTTCTAGCCATTTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.018592591","4":"FALSE"},{"1":"GATTTCTAGCCATTTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.048263306","4":"FALSE"},{"1":"GACCGTGGTTGACTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190548934","4":"TRUE"},{"1":"GACCGTGGTTGACTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157896929","4":"TRUE"},{"1":"CGGTCAGTCTAGATCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.046169926","4":"FALSE"},{"1":"CGGTCAGTCTAGATCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.048780923","4":"FALSE"},{"1":"ATCGTAGCACATAGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195594058","4":"TRUE"},{"1":"ATCGTAGCACATAGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153506110","4":"TRUE"},{"1":"CAATGACAGCCTTCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.179614480","4":"TRUE"},{"1":"CAATGACAGCCTTCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167761396","4":"TRUE"},{"1":"CGCGTGAAGGCAGGGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157584772","4":"TRUE"},{"1":"CGCGTGAAGGCAGGGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143754685","4":"TRUE"},{"1":"TGCGACGGTAAGATTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.012642962","4":"FALSE"},{"1":"TGCGACGGTAAGATTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.054766239","4":"FALSE"},{"1":"TGTGCGGCATCTAGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182207393","4":"TRUE"},{"1":"TGTGCGGCATCTAGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148448934","4":"TRUE"},{"1":"GTTCATTTCCTTATAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.139675584","4":"TRUE"},{"1":"GTTCATTTCCTTATAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156314330","4":"TRUE"},{"1":"TAAGCCAAGCTTGTTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.091656449","4":"TRUE"},{"1":"TAAGCCAAGCTTGTTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.056247695","4":"FALSE"},{"1":"ATTTCTGGTGAGTCAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189021326","4":"TRUE"},{"1":"ATTTCTGGTGAGTCAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143832030","4":"TRUE"},{"1":"CAATCGAAGGGAGTGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.211573637","4":"TRUE"},{"1":"CAATCGAAGGGAGTGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170176942","4":"TRUE"},{"1":"GTGGTTAGTTGGTAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193764949","4":"TRUE"},{"1":"GTGGTTAGTTGGTAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152155547","4":"TRUE"},{"1":"CGATGGCAGCACCAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.035376173","4":"FALSE"},{"1":"CGATGGCAGCACCAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.055658682","4":"FALSE"},{"1":"CAAAGAAAGTGCACTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.153042150","4":"TRUE"},{"1":"CAAAGAAAGTGCACTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148460834","4":"TRUE"},{"1":"TGATCAGAGTTTCTTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.154429057","4":"TRUE"},{"1":"TGATCAGAGTTTCTTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133396399","4":"TRUE"},{"1":"CTCCTCCGTGGCAGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.207995819","4":"TRUE"},{"1":"CTCCTCCGTGGCAGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.164881781","4":"TRUE"},{"1":"CCCTAACGTGGGTCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.013748467","4":"FALSE"},{"1":"CCCTAACGTGGGTCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.025886791","4":"FALSE"},{"1":"TGGAGGAGTACCGTCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.104138610","4":"TRUE"},{"1":"TGGAGGAGTACCGTCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.118956675","4":"TRUE"},{"1":"CGACAGCAGTTGGAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180418484","4":"TRUE"},{"1":"CGACAGCAGTTGGAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154791228","4":"TRUE"},{"1":"TGGATGTAGTCCCGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.194106651","4":"TRUE"},{"1":"TGGATGTAGTCCCGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141987649","4":"TRUE"},{"1":"TGTTACTTCGTGAGAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.123957307","4":"TRUE"},{"1":"TGTTACTTCGTGAGAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.116695820","4":"TRUE"},{"1":"GATTTCTAGGGAGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.028341139","4":"FALSE"},{"1":"GATTTCTAGGGAGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.058199169","4":"FALSE"},{"1":"GAGACCCAGTAGCAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.141002191","4":"TRUE"},{"1":"GAGACCCAGTAGCAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.135532312","4":"TRUE"},{"1":"TTCACGCAGAGCATCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.197382967","4":"TRUE"},{"1":"TTCACGCAGAGCATCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.137483787","4":"TRUE"},{"1":"AGGCATTTCGAAACAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159675182","4":"TRUE"},{"1":"AGGCATTTCGAAACAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156034698","4":"TRUE"},{"1":"ACTATGGTCGCACGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.026411529","4":"FALSE"},{"1":"ACTATGGTCGCACGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.045056462","4":"FALSE"},{"1":"GAATAGACAGAACGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.162951498","4":"TRUE"},{"1":"GAATAGACAGAACGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.164780638","4":"TRUE"},{"1":"AGAGCCCTCCCGAGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.032743060","4":"FALSE"},{"1":"AGAGCCCTCCCGAGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.043259677","4":"FALSE"},{"1":"TTACGTTTCCTTTAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.136600269","4":"TRUE"},{"1":"TTACGTTTCCTTTAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.128160735","4":"TRUE"},{"1":"GTAGCTACACGATAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.038471589","4":"FALSE"},{"1":"GTAGCTACACGATAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.058413356","4":"FALSE"},{"1":"TATGTTCAGATACATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181403389","4":"TRUE"},{"1":"TATGTTCAGATACATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143284665","4":"TRUE"},{"1":"TCGCAGGAGGGAGTGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.203352696","4":"TRUE"},{"1":"TCGCAGGAGGGAGTGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.166244244","4":"TRUE"},{"1":"GTATTTCCAGCTATTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.130530040","4":"TRUE"},{"1":"GTATTTCCAGCTATTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.137043516","4":"TRUE"},{"1":"TGATGGTAGATGCTAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166127314","4":"TRUE"},{"1":"TGATGGTAGATGCTAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163043349","4":"TRUE"},{"1":"TTGCGTCCAGAAACCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.015758477","4":"FALSE"},{"1":"TTGCGTCCAGAAACCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057622056","4":"FALSE"},{"1":"TCATCATAGAACAAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.137364073","4":"TRUE"},{"1":"TCATCATAGAACAAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127238544","4":"TRUE"},{"1":"CGAAGGAAGTAGGATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.127354224","4":"TRUE"},{"1":"CGAAGGAAGTAGGATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126994610","4":"TRUE"},{"1":"CAATACGTCACCCATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176740166","4":"TRUE"},{"1":"CAATACGTCACCCATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.124870596","4":"TRUE"},{"1":"AACAAGAAGAGAGCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.196619163","4":"TRUE"},{"1":"AACAAGAAGAGAGCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.171045586","4":"TRUE"},{"1":"CAGTGCGGTCAATCTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.162830898","4":"TRUE"},{"1":"CAGTGCGGTCAATCTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152607718","4":"TRUE"},{"1":"GAGATGGCATGGTACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.180659685","4":"TRUE"},{"1":"GAGATGGCATGGTACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170920644","4":"TRUE"},{"1":"TTTGACTTCATTTCCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182810396","4":"TRUE"},{"1":"TTTGACTTCATTTCCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150364712","4":"TRUE"},{"1":"CATTCCGAGTGATAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.130911941","4":"TRUE"},{"1":"CATTCCGAGTGATAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.144664977","4":"TRUE"},{"1":"ACGATGTGTACCCGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.172860847","4":"TRUE"},{"1":"ACGATGTGTACCCGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152738609","4":"TRUE"},{"1":"CTCCTCCGTTCTGAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.126007517","4":"TRUE"},{"1":"CTCCTCCGTTCTGAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151399945","4":"TRUE"},{"1":"TTCTAACCATAAGATG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.196056361","4":"TRUE"},{"1":"TTCTAACCATAAGATG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156439272","4":"TRUE"},{"1":"TTGTGGATCGACGAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.027215533","4":"FALSE"},{"1":"TTGTGGATCGACGAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.050363522","4":"FALSE"},{"1":"ATTATCCGTTCGGGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.191734840","4":"TRUE"},{"1":"ATTATCCGTTCGGGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.179743928","4":"TRUE"},{"1":"ATTCCCGGTACGCGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.148620128","4":"TRUE"},{"1":"ATTCCCGGTACGCGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145158795","4":"TRUE"},{"1":"GTGGTTATCACACCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167393620","4":"TRUE"},{"1":"GTGGTTATCACACCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153482312","4":"TRUE"},{"1":"CTCAGGGGTGACACGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171775442","4":"TRUE"},{"1":"CTCAGGGGTGACACGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.144534085","4":"TRUE"},{"1":"TTTCATGCACCAAAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.187895721","4":"TRUE"},{"1":"TTTCATGCACCAAAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162620926","4":"TRUE"},{"1":"GGAATGGCAGAGAAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.126389419","4":"TRUE"},{"1":"GGAATGGCAGAGAAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.124888445","4":"TRUE"},{"1":"CTACCCAAGGGCAATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.153182851","4":"TRUE"},{"1":"CTACCCAAGGGCAATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.106474375","4":"TRUE"},{"1":"AACCTGACAACATACC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.037828385","4":"FALSE"},{"1":"AACCTGACAACATACC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.066629779","4":"FALSE"},{"1":"GCAACCGCACATATGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.141183092","4":"TRUE"},{"1":"GCAACCGCACATATGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143088328","4":"TRUE"},{"1":"CTGCTCAAGCTCCGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.029205443","4":"FALSE"},{"1":"CTGCTCAAGCTCCGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.046781851","4":"FALSE"},{"1":"GCTTCACCAGGTACGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157323471","4":"TRUE"},{"1":"GCTTCACCAGGTACGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.134794560","4":"TRUE"},{"1":"AAGTACCAGTAGGTTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.193764949","4":"TRUE"},{"1":"AAGTACCAGTAGGTTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167571009","4":"TRUE"},{"1":"CAAGACTTCTCAATCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.124801512","4":"TRUE"},{"1":"CAAGACTTCTCAATCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142106641","4":"TRUE"},{"1":"AATGCCAAGGATCACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.153946654","4":"TRUE"},{"1":"AATGCCAAGGATCACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.150882328","4":"TRUE"},{"1":"ACCGTTCAGATTACCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.033305863","4":"FALSE"},{"1":"ACCGTTCAGATTACCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.061316770","4":"FALSE"},{"1":"CCCTCTCCAAAGAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.187875621","4":"TRUE"},{"1":"CCCTCTCCAAAGAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.160758695","4":"TRUE"},{"1":"TTCGATTCACAGTCCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.205885309","4":"TRUE"},{"1":"TTCGATTCACAGTCCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.162400790","4":"TRUE"},{"1":"CCTCCTCTCTTGCAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.190689634","4":"TRUE"},{"1":"CCTCCTCTCTTGCAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151280953","4":"TRUE"},{"1":"GTTCATTTCGATCCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.219814677","4":"TRUE"},{"1":"GTTCATTTCGATCCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.177774605","4":"TRUE"},{"1":"TCAGGGCAGTGATGGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.151695443","4":"TRUE"},{"1":"TCAGGGCAGTGATGGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159295089","4":"TRUE"},{"1":"CCTCTCCCAGTCAGTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.011939459","4":"FALSE"},{"1":"CCTCTCCCAGTCAGTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057967134","4":"FALSE"},{"1":"GAATCACTCCCTTGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149444232","4":"TRUE"},{"1":"GAATCACTCCCTTGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.133104868","4":"TRUE"},{"1":"AGACCATGTACAAGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174629656","4":"TRUE"},{"1":"AGACCATGTACAAGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163715656","4":"TRUE"},{"1":"ATTCCATCATCTCGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.051215051","4":"FALSE"},{"1":"ATTCCATCATCTCGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.054409262","4":"FALSE"},{"1":"ATGGTTGCATAGTCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.023416615","4":"FALSE"},{"1":"ATGGTTGCATAGTCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.055212461","4":"FALSE"},{"1":"ATACCTTAGTAACAGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.038933891","4":"FALSE"},{"1":"ATACCTTAGTAACAGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.048233558","4":"FALSE"},{"1":"CTGTACCGTGCCTATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.131997347","4":"TRUE"},{"1":"CTGTACCGTGCCTATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.123787765","4":"TRUE"},{"1":"AGCGTATCAGCGGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.192237342","4":"TRUE"},{"1":"AGCGTATCAGCGGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143552398","4":"TRUE"},{"1":"TCAGCCTAGTGCCCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184277703","4":"TRUE"},{"1":"TCAGCCTAGTGCCCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.161276312","4":"TRUE"},{"1":"TAAGCCAGTTCTCCTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.170087033","4":"TRUE"},{"1":"TAAGCCAGTTCTCCTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159009507","4":"TRUE"},{"1":"TGGAACTTCGCACGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169484030","4":"TRUE"},{"1":"TGGAACTTCGCACGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127048156","4":"TRUE"},{"1":"ATTCCTATCGCTGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184418404","4":"TRUE"},{"1":"ATTCCTATCGCTGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142558812","4":"TRUE"},{"1":"CAAGACTCATGCAGGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.162408796","4":"TRUE"},{"1":"CAAGACTCATGCAGGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.158979759","4":"TRUE"},{"1":"AGCCACGTCGGTGTTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.208799823","4":"TRUE"},{"1":"AGCCACGTCGGTGTTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.176316948","4":"TRUE"},{"1":"TTTGTTGCAGCCGTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.166368515","4":"TRUE"},{"1":"TTTGTTGCAGCCGTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.122228965","4":"TRUE"},{"1":"TGTTCCGCAGTAACCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.024682921","4":"FALSE"},{"1":"TGTTCCGCAGTAACCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.044045027","4":"FALSE"},{"1":"TCCTTTCTCCGCGGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.158227975","4":"TRUE"},{"1":"TCCTTTCTCCGCGGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149079594","4":"TRUE"},{"1":"TTCCGTGGTTCGGTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.186971116","4":"TRUE"},{"1":"TTCCGTGGTTCGGTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167350873","4":"TRUE"},{"1":"AGAAGTACACATGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.018451890","4":"FALSE"},{"1":"AGAAGTACACATGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.064065493","4":"FALSE"},{"1":"ACAGAAATCTGTAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167031818","4":"TRUE"},{"1":"ACAGAAATCTGTAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146414165","4":"TRUE"},{"1":"TCACAAGTCGGACGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.154248156","4":"TRUE"},{"1":"TCACAAGTCGGACGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126066469","4":"TRUE"},{"1":"ACACGCGTCCTCTCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.133725955","4":"TRUE"},{"1":"ACACGCGTCCTCTCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.140625186","4":"TRUE"},{"1":"TGATGCAGTCAAACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.164077104","4":"TRUE"},{"1":"TGATGCAGTCAAACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.145509823","4":"TRUE"},{"1":"ATTTCACGTCCGGTCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.082149103","4":"FALSE"},{"1":"ATTTCACGTCCGGTCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.059865063","4":"FALSE"},{"1":"GCCAGCATCTTCCACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.160378686","4":"TRUE"},{"1":"GCCAGCATCTTCCACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.127363486","4":"TRUE"},{"1":"GTAGTACTCGGCTATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163554501","4":"TRUE"},{"1":"GTAGTACTCGGCTATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163447923","4":"TRUE"},{"1":"CTCAGAACACCGCTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.034933971","4":"FALSE"},{"1":"CTCAGAACACCGCTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.061554754","4":"FALSE"},{"1":"CCGGTAGGTCGCTCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169926233","4":"TRUE"},{"1":"CCGGTAGGTCGCTCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163769202","4":"TRUE"},{"1":"TACGCTCAGAGTCTTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.125022613","4":"TRUE"},{"1":"TACGCTCAGAGTCTTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.108408001","4":"TRUE"},{"1":"TGCGATATCCTCTAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.167755422","4":"TRUE"},{"1":"TGCGATATCCTCTAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154285510","4":"TRUE"},{"1":"TCTACCGGTACGCGTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.037526884","4":"FALSE"},{"1":"TCTACCGGTACGCGTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.057282928","4":"FALSE"},{"1":"AAGAACACAGTAGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.191071536","4":"TRUE"},{"1":"AAGAACACAGTAGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.174811695","4":"TRUE"},{"1":"TCGAACACACGATAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.124781411","4":"TRUE"},{"1":"TCGAACACACGATAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.140083771","4":"TRUE"},{"1":"GACAGCCAGCTACTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.039979096","4":"FALSE"},{"1":"GACAGCCAGCTACTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.075488761","4":"FALSE"},{"1":"ACACTGATCATTTGGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174207554","4":"TRUE"},{"1":"ACACTGATCATTTGGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.139643499","4":"TRUE"},{"1":"ACCTACCTCTTCGGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.144841310","4":"TRUE"},{"1":"ACCTACCTCTTCGGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.148686919","4":"TRUE"},{"1":"TTAGTCTTCATCAGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.201965790","4":"TRUE"},{"1":"TTAGTCTTCATCAGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170456574","4":"TRUE"},{"1":"ATTCACTTCCTACTGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.159534482","4":"TRUE"},{"1":"ATTCACTTCCTACTGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142558812","4":"TRUE"},{"1":"CGTGCTTCATGTTCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184539004","4":"TRUE"},{"1":"CGTGCTTCATGTTCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.174460667","4":"TRUE"},{"1":"ACATCCCAGCTGGCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.157544572","4":"TRUE"},{"1":"ACATCCCAGCTGGCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.136228418","4":"TRUE"},{"1":"AACCACACATATAGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.183795301","4":"TRUE"},{"1":"AACCACACATATAGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.156135842","4":"TRUE"},{"1":"CCTAACCTCGTTCTAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.150449237","4":"TRUE"},{"1":"CCTAACCTCGTTCTAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167154535","4":"TRUE"},{"1":"ACCTACCCAGCGTATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.171232739","4":"TRUE"},{"1":"ACCTACCCAGCGTATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.122014779","4":"TRUE"},{"1":"TTTACTGAGGTGATCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.199433177","4":"TRUE"},{"1":"TTTACTGAGGTGATCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.178809838","4":"TRUE"},{"1":"CACTGTCCAAGGATGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.169182529","4":"TRUE"},{"1":"CACTGTCCAAGGATGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.147306608","4":"TRUE"},{"1":"CCTAACCAGCCTGAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.063476111","4":"FALSE"},{"1":"CCTAACCAGCCTGAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.037220814","4":"FALSE"},{"1":"CTGTACCTCTCGACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178106973","4":"TRUE"},{"1":"CTGTACCTCTCGACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.170165042","4":"TRUE"},{"1":"TACGGGCGTTACCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.143977005","4":"TRUE"},{"1":"TACGGGCGTTACCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.144849415","4":"TRUE"},{"1":"GTTGCTCCAAACACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.015235875","4":"FALSE"},{"1":"GTTGCTCCAAACACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.062530492","4":"FALSE"},{"1":"TCTGGCTGTATCGATC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149504533","4":"TRUE"},{"1":"TCTGGCTGTATCGATC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.134336439","4":"TRUE"},{"1":"AGTACCAGTTGCTTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.134630460","4":"TRUE"},{"1":"AGTACCAGTTGCTTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.116600626","4":"TRUE"},{"1":"TGTTTGTAGCCTCACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.153564752","4":"TRUE"},{"1":"TGTTTGTAGCCTCACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.139423363","4":"TRUE"},{"1":"CATGAGTCATCCGAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.049265341","4":"FALSE"},{"1":"CATGAGTCATCCGAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.087881817","4":"FALSE"},{"1":"TCTCAGCCAAGAGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.034250568","4":"FALSE"},{"1":"TCTCAGCCAAGAGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.059174907","4":"FALSE"},{"1":"TACTGCCTCACGTCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.174428655","4":"TRUE"},{"1":"TACTGCCTCACGTCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.157498304","4":"TRUE"},{"1":"CGAGTTACAACGATCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.179915982","4":"TRUE"},{"1":"CGAGTTACAACGATCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152107950","4":"TRUE"},{"1":"TTCCGGTCAAGTTCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.182307893","4":"TRUE"},{"1":"TTCCGGTCAAGTTCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143237069","4":"TRUE"},{"1":"CGCCATTAGGATTTGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.138851480","4":"TRUE"},{"1":"CGCCATTAGGATTTGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151203608","4":"TRUE"},{"1":"CTACTATGTCCGTACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.158167675","4":"TRUE"},{"1":"CTACTATGTCCGTACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.142862243","4":"TRUE"},{"1":"ACACTGATCGAACCAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178730076","4":"TRUE"},{"1":"ACACTGATCGAACCAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.141327241","4":"TRUE"},{"1":"AGCTCAAAGGTTGGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.175132158","4":"TRUE"},{"1":"AGCTCAAAGGTTGGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.154939968","4":"TRUE"},{"1":"ATGAGTCTCGTTGCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.178649675","4":"TRUE"},{"1":"ATGAGTCTCGTTGCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.149662657","4":"TRUE"},{"1":"CTGCATCGTTACCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.125203513","4":"TRUE"},{"1":"CTGCATCGTTACCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.129237616","4":"TRUE"},{"1":"TATTGGGCAATTCTCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.195292557","4":"TRUE"},{"1":"TATTGGGCAATTCTCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.151768822","4":"TRUE"},{"1":"GTAGCTAGTAGCTGTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.030351149","4":"FALSE"},{"1":"GTAGCTAGTAGCTGTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.045258749","4":"FALSE"},{"1":"GAATCGTCAGTAGAAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.188699725","4":"TRUE"},{"1":"GAATCGTCAGTAGAAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.159759159","4":"TRUE"},{"1":"ATCATTCCACGGTCTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189704730","4":"TRUE"},{"1":"ATCATTCCACGGTCTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.146860386","4":"TRUE"},{"1":"TCATGAGAGTAAACAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.033808366","4":"FALSE"},{"1":"TCATGAGAGTAAACAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.059454539","4":"FALSE"},{"1":"CCAATTTCATCTGTTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189282627","4":"TRUE"},{"1":"CCAATTTCATCTGTTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.153268126","4":"TRUE"},{"1":"ACAAAGACAAGTATAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.176880867","4":"TRUE"},{"1":"ACAAAGACAAGTATAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.155874058","4":"TRUE"},{"1":"ACAACCAAGACGCCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.042994111","4":"FALSE"},{"1":"ACAACCAAGACGCCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.064493866","4":"FALSE"},{"1":"ATGAGTCTCGTTCCCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.199091476","4":"TRUE"},{"1":"ATGAGTCTCGTTCCCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143962922","4":"TRUE"},{"1":"TGAATCGCACAGTCCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.145625214","4":"TRUE"},{"1":"TGAATCGCACAGTCCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.126816121","4":"TRUE"},{"1":"CGTAAGTGTAACATCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.163092199","4":"TRUE"},{"1":"CGTAAGTGTAACATCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.143962922","4":"TRUE"},{"1":"TACACCCAGTATTGCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.155052160","4":"TRUE"},{"1":"TACACCCAGTATTGCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.110079844","4":"TRUE"},{"1":"GGTTAACTCCCAACTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.015276075","4":"FALSE"},{"1":"GGTTAACTCCCAACTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.054682945","4":"FALSE"},{"1":"AATGCCAAGAAAGCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.032803361","4":"FALSE"},{"1":"AATGCCAAGAAAGCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.072002285","4":"FALSE"},{"1":"GAAATGATCCTAGCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.189423328","4":"TRUE"},{"1":"GAAATGATCCTAGCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.179291757","4":"TRUE"},{"1":"AGTGTTGCAGCTACAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.184297803","4":"TRUE"},{"1":"AGTGTTGCAGCTACAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.152982544","4":"TRUE"},{"1":"ACATGCAGTTGCCATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.009909349","4":"FALSE"},{"1":"ACATGCAGTTGCCATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.054266472","4":"FALSE"},{"1":"GTTACCCCACCTGCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.149966835","4":"TRUE"},{"1":"GTTACCCCACCTGCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.125227573","4":"TRUE"},{"1":"CAATACGGTTGGACCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.007658138","4":"FALSE"},{"1":"CAATACGGTTGGACCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.053968991","4":"FALSE"},{"1":"GAGTCTACACCACATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.025949227","4":"FALSE"},{"1":"GAGTCTACACCACATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.044425802","4":"FALSE"},{"1":"CGGAGAAAGTAGGATT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.181081787","4":"TRUE"},{"1":"CGGAGAAAGTAGGATT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.167951784","4":"TRUE"},{"1":"ATCGCCTGTCTAACGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.177664771","4":"TRUE"},{"1":"ATCGCCTGTCTAACGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.163073097","4":"TRUE"},{"1":"GTCATCCAGCTGTTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.083897811","4":"FALSE"},{"1":"GTCATCCAGCTGTTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.115119171","4":"TRUE"},{"1":"TCCTTTCTCCAGTTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.030572250","4":"FALSE"},{"1":"TCCTTTCTCCAGTTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.066421542","4":"FALSE"},{"1":"ACGGAAGGTGTGACCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.015557476","4":"FALSE"},{"1":"ACGGAAGGTGTGACCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.041926962","4":"FALSE"}],"options":{"columns":{"min":{},"max":[10],"total":[4]},"rows":{"min":[10],"max":[10],"total":[8554]},"pages":{}}} +{"columns":[{"label":["barcodes"],"name":[1],"type":["chr"],"align":["left"]},{"label":["gene_set"],"name":[2],"type":["chr"],"align":["left"]},{"label":["auc"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["assigned"],"name":[4],"type":["lgl"],"align":["right"]}],"data":[{"1":"AAGCATCTCGTTGCCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.11026914","4":"TRUE"},{"1":"AAGCATCTCGTTGCCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.12056307","4":"TRUE"},{"1":"CTGTATTTCCAAGAGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.03515507","4":"FALSE"},{"1":"CTGTATTTCCAAGAGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05377265","4":"FALSE"},{"1":"CAGCAGCTCCTCAGAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16709212","4":"TRUE"},{"1":"CAGCAGCTCCTCAGAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15330977","4":"TRUE"},{"1":"AGGTCTAAGGGACTGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.11987699","4":"TRUE"},{"1":"AGGTCTAAGGGACTGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.11544045","4":"TRUE"},{"1":"AATTTCCTCTCGAGTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17362465","4":"TRUE"},{"1":"AATTTCCTCTCGAGTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16801723","4":"TRUE"},{"1":"CAGTTAGCAACATCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17517236","4":"TRUE"},{"1":"CAGTTAGCAACATCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15457109","4":"TRUE"},{"1":"CATCGCTTCATGTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.12852003","4":"TRUE"},{"1":"CATCGCTTCATGTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.12725639","4":"TRUE"},{"1":"TGTTTGTTCTGCGGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.23967357","4":"TRUE"},{"1":"TGTTTGTTCTGCGGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.19642071","4":"TRUE"},{"1":"GGGAGTAAGCCACAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.13002754","4":"TRUE"},{"1":"GGGAGTAAGCCACAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15823606","4":"TRUE"},{"1":"CGAGAAGTCGCTACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.06359671","4":"FALSE"},{"1":"CGAGAAGTCGCTACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.09535454","4":"TRUE"},{"1":"AGGTCATTCGTACACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.19308155","4":"TRUE"},{"1":"AGGTCATTCGTACACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16936779","4":"TRUE"},{"1":"TCCTCTTTCTCTTCAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17481056","4":"TRUE"},{"1":"TCCTCTTTCTCTTCAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.12406740","4":"TRUE"},{"1":"AGTGCCGCAGCTTCGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.05278286","4":"FALSE"},{"1":"AGTGCCGCAGCTTCGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.04226609","4":"FALSE"},{"1":"TCCAGAACAGTAGAGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16671022","4":"TRUE"},{"1":"TCCAGAACAGTAGAGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15174502","4":"TRUE"},{"1":"AAGCATCTCTGTCAGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16182589","4":"TRUE"},{"1":"AAGCATCTCTGTCAGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.14171397","4":"TRUE"},{"1":"TAATTCCAGTTCCGGC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.02860244","4":"FALSE"},{"1":"TAATTCCAGTTCCGGC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05239234","4":"FALSE"},{"1":"CGAATTGAGACCAACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18256919","4":"TRUE"},{"1":"CGAATTGAGACCAACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16817787","4":"TRUE"},{"1":"GGAATGGCAATGAGCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.21253844","4":"TRUE"},{"1":"GGAATGGCAATGAGCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13584764","4":"TRUE"},{"1":"TCGAAGTTCTGGGCAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.20262909","4":"TRUE"},{"1":"TCGAAGTTCTGGGCAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16622639","4":"TRUE"},{"1":"CCACGAGAGGCTAGCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.15688127","4":"TRUE"},{"1":"CCACGAGAGGCTAGCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.14854413","4":"TRUE"},{"1":"CAATGACTCCTTATGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.14480111","4":"TRUE"},{"1":"CAATGACTCCTTATGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.14511715","4":"TRUE"},{"1":"AGAACAAGTGGACCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.20082008","4":"TRUE"},{"1":"AGAACAAGTGGACCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.14550982","4":"TRUE"},{"1":"CATACCCAGAGCTGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16498161","4":"TRUE"},{"1":"CATACCCAGAGCTGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15112626","4":"TRUE"},{"1":"CTCAATTGTACTTGTG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18471991","4":"TRUE"},{"1":"CTCAATTGTACTTGTG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16097288","4":"TRUE"},{"1":"TTCTGTATCGGCTCTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.03702438","4":"FALSE"},{"1":"TTCTGTATCGGCTCTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05241614","4":"FALSE"},{"1":"GGATGTTAGAGCGACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.04136600","4":"FALSE"},{"1":"GGATGTTAGAGCGACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.04362260","4":"FALSE"},{"1":"CAAGCTATCGTCGATA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.15676067","4":"TRUE"},{"1":"CAAGCTATCGTCGATA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15131070","4":"TRUE"},{"1":"TTCCGGTCAACTTGGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.03177826","4":"FALSE"},{"1":"TTCCGGTCAACTTGGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05318959","4":"FALSE"},{"1":"GCCAGGTAGCAGCACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17830797","4":"TRUE"},{"1":"GCCAGGTAGCAGCACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16273397","4":"TRUE"},{"1":"GATCATGGTATCGAAA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18315210","4":"TRUE"},{"1":"GATCATGGTATCGAAA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16204381","4":"TRUE"},{"1":"TTTAGTCCAACTCGAT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.01847199","4":"FALSE"},{"1":"TTTAGTCCAACTCGAT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05860969","4":"FALSE"},{"1":"TCTCACGGTCGCATCG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18383550","4":"TRUE"},{"1":"TCTCACGGTCGCATCG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16439986","4":"TRUE"},{"1":"TGATTTCCAGCTAACT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.20745312","4":"TRUE"},{"1":"TGATTTCCAGCTAACT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.17726294","4":"TRUE"},{"1":"TCCTTCTTCCAGTACA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18747362","4":"TRUE"},{"1":"TCCTTCTTCCAGTACA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.17398470","4":"TRUE"},{"1":"ACGATCAAGTCCGCCA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17623766","4":"TRUE"},{"1":"ACGATCAAGTCCGCCA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13058818","4":"TRUE"},{"1":"ATCACTTCACCGGCTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.20699081","4":"TRUE"},{"1":"ATCACTTCACCGGCTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.18019015","4":"TRUE"},{"1":"GGCTTGGCACCTAAAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.12858033","4":"TRUE"},{"1":"GGCTTGGCACCTAAAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13355109","4":"TRUE"},{"1":"CAACCAAGTACCGGCT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.15698177","4":"TRUE"},{"1":"CAACCAAGTACCGGCT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15562417","4":"TRUE"},{"1":"ACCGTTCCACCTGCAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.03075315","4":"FALSE"},{"1":"ACCGTTCCACCTGCAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.05571223","4":"FALSE"},{"1":"TCTGGCTGTACGGTTT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18317220","4":"TRUE"},{"1":"TCTGGCTGTACGGTTT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.18936446","4":"TRUE"},{"1":"GTGGGAATCTTCCCGA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.15856968","4":"TRUE"},{"1":"GTGGGAATCTTCCCGA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.15388689","4":"TRUE"},{"1":"GGTAATCTCAAGTAAG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.17613716","4":"TRUE"},{"1":"GGTAATCTCAAGTAAG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13450303","4":"TRUE"},{"1":"CTAACCCGTTAGCTAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.06470222","4":"FALSE"},{"1":"CTAACCCGTTAGCTAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.10116732","4":"TRUE"},{"1":"GAATCGTCAGTCTTCC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.19720207","4":"TRUE"},{"1":"GAATCGTCAGTCTTCC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.17172979","4":"TRUE"},{"1":"GCACGGTTCTATACGG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.15105224","4":"TRUE"},{"1":"GCACGGTTCTATACGG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16354907","4":"TRUE"},{"1":"CACTAAGAGGTGCCTC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.14029869","4":"TRUE"},{"1":"CACTAAGAGGTGCCTC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13214103","4":"TRUE"},{"1":"GGGAGTATCTGCGGAC","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.21085003","4":"TRUE"},{"1":"GGGAGTATCTGCGGAC","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16574448","4":"TRUE"},{"1":"GAGGCAACATGCACTA","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.18088079","4":"TRUE"},{"1":"GAGGCAACATGCACTA","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16627994","4":"TRUE"},{"1":"TAGACTGCACTGGCGT","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16984583","4":"TRUE"},{"1":"TAGACTGCACTGGCGT","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.16540535","4":"TRUE"},{"1":"CATACAGGTGCCTACG","2":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","3":"0.16445901","4":"TRUE"},{"1":"CATACAGGTGCCTACG","2":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","3":"0.13332500","4":"TRUE"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>To draw vertical lines representing the automatically chosen threshold, we can create a separate data frame.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX3RocmVzaG9sZF9kZiA8LSBkYXRhLmZyYW1lKFxuICBnZW5lX3NldCA9IGV3aW5nX2dlbmVfc2V0X25hbWVzLFxuICAjIEdyYWIgdGhyZXNob2xkcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBnZW5lIHNldCBmcm9tIGFzc2lnbmVtZW50cyBvYmplY3RcbiAgdGhyZXNob2xkID0gYyhhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1wiemhhbmdcIl1dXSRhdWNUaHIkc2VsZWN0ZWQsIFxuICAgICAgICAgICAgICAgIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbXCJyaWdnaVwiXV1dJGF1Y1RociRzZWxlY3RlZClcbilcblxuYXVjX3RocmVzaG9sZF9kZlxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbImF1Y190aHJlc2hvbGRfZGYgPC0gZGF0YS5mcmFtZShcbiAgZ2VuZV9zZXQgPSBld2luZ19nZW5lX3NldF9uYW1lcyxcbiAgIyBHcmFiIHRocmVzaG9sZHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZ2VuZSBzZXQgZnJvbSBhc3NpZ25lbWVudHMgb2JqZWN0XG4gIHRocmVzaG9sZCA9IGMoYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1tcInpoYW5nXCJdXV0kYXVjVGhyJHNlbGVjdGVkLCBcbiAgICAgICAgICAgICAgICBhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzW1wicmlnZ2lcIl1dXSRhdWNUaHIkc2VsZWN0ZWQpXG4pIiwiIiwiYXVjX3RocmVzaG9sZF9kZiJdfQ== --> <pre class="r"><code>auc_threshold_df <- data.frame( gene_set = ewing_gene_set_names, # Grab thresholds associated with each gene set from assignements object @@ -3439,13 +3433,11 @@ <h3>Assignments</h3> auc_threshold_df</code></pre> <!-- rnb-source-end --> -<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbImRhdGEuZnJhbWUiXSwibnJvdyI6MiwibmNvbCI6Miwic3VtbWFyeSI6eyJEZXNjcmlwdGlvbiI6WyJkZiBbMiDDlyAyXSJdfX0sInJkZiI6IlVrUllNd3BZQ2dBQUFBTUFCQVFBQUFNRkFBQUFBQVZWVkVZdE9BQUFCQUlBQUFBQkFBUUFDUUFBQUFGNEFBQURFd0FBQUFJQUFBQVFBQUFBQWdBRUFBa0FBQUFpV2toQlRrZGZWRUZTUjBWVVUxOVBSbDlGVjFOU01WOUdURWt4WDBaVlUwbFBUZ0FFQUFrQUFBQWhVa2xIUjBsZlJWZEpUa2RmVTBGU1EwOU5RVjlRVWs5SFJVNUpWRTlTWDFWUUFBQUFEZ0FBQUFJL3RjZ0hSdlYwVUQrMjNBZE1uWW1sQUFBRUFnQUFBQUVBQkFBSkFBQUFCVzVoYldWekFBQUFFQUFBQUFJQUJBQUpBQUFBQ0dkbGJtVmZjMlYwQUFRQUNRQUFBQWwwYUhKbGMyaHZiR1FBQUFRQ0FBQUFBUUFFQUFrQUFBQUpjbTkzTG01aGJXVnpBQUFBRUFBQUFBSUFCQUFKQUFBQUJYcG9ZVzVuQUFRQUNRQUFBQVZ5YVdkbmFRQUFCQUlBQUFBQkFBUUFDUUFBQUFWamJHRnpjd0FBQUJBQUFBQUJBQVFBQ1FBQUFBcGtZWFJoTG1aeVlXMWxBQUFBL2dBQUJBSUFBQUFCQUFRQUNRQUFBQWR2Y0hScGIyNXpBQUFDRXdBQUFBWUFBQUFRQUFBQUFRQUVBQWtBQUFBQmNnQUFBQkFBQUFBQkFBUUFDUUFBQUJCaGRXTmZkR2h5WlhOb2IyeGtYMlJtQUFBQUVBQUFBQUVBQkFBSkFBQUFBM0J1WndBQUFBb0FBQUFCQUFBQUFRQUFBQTBBQUFBQkFBQUFBZ0FBQUEwQUFBQUJBQUFBQWdBQUJBSUFBQUwvQUFBQUVBQUFBQVlBQkFBSkFBQUFCbVZ1WjJsdVpRQUVBQWtBQUFBRmJHRmlaV3dBQkFBSkFBQUFBMlJsZGdBRUFBa0FBQUFPY205M2JtRnRaWE11Y0hKcGJuUUFCQUFKQUFBQUNuSnZkM011ZEc5MFlXd0FCQUFKQUFBQUNtTnZiSE11ZEc5MFlXd0FBQUQrQUFBQS9nPT0ifQ== --> <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> -{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["gene_set"],"name":[1],"type":["chr"],"align":["left"]},{"label":["threshold"],"name":[2],"type":["dbl"],"align":["right"]}],"data":[{"1":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","2":"0.08508344","_rn_":"zhang"},{"1":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","2":"0.08929487","_rn_":"riggi"}],"options":{"columns":{"min":{},"max":[10],"total":[2]},"rows":{"min":[10],"max":[10],"total":[2]},"pages":{}}} +{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["gene_set"],"name":[1],"type":["chr"],"align":["left"]},{"label":["threshold"],"name":[2],"type":["dbl"],"align":["right"]}],"data":[{"1":"ZHANG_TARGETS_OF_EWSR1_FLI1_FUSION","2":"0.08508344","_rn_":"zhang"},{"1":"RIGGI_EWING_SARCOMA_PROGENITOR_UP","2":"0.08929487","_rn_":"riggi"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[10],"max":[10]},"pages":{}}} </script> </div> -<!-- rnb-frame-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>Now let’s make a density plot, plotting the density of the assigned @@ -3453,7 +3445,7 @@ <h3>Assignments</h3> threshold.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX3Bsb3R0aW5nX2RmIHw+XG4gIGdncGxvdDI6OmdncGxvdChcbiAgICBnZ3Bsb3QyOjphZXMoXG4gICAgICB4ID0gYXVjLCAgIyBBVUMgdmFsdWVzXG4gICAgICBjb2xvciA9IGFzc2lnbmVkLCAgIyBHcm91cCBieSBhc3NpZ25tZW50XG4gICAgICBmaWxsID0gYXNzaWduZWQsICAgIyBHcm91cCBieSBhc3NpZ25tZW50XG4gICAgKVxuICApICtcbiAgZ2dwbG90Mjo6Z2VvbV9kZW5zaXR5KGFscGhhID0gMC4yKSArXG4gICMgRHJhdyBhIHZlcnRpY2FsIGRvdHRlZCBsaW5lIHNob3dpbmcgdGhlIHRocmVzaG9sZCBmb3IgZWFjaCBnZW5lIHNldFxuICBnZ3Bsb3QyOjpnZW9tX3ZsaW5lKGRhdGEgPSBhdWNfdGhyZXNob2xkX2RmLFxuICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeGludGVyY2VwdCA9IHRocmVzaG9sZCksXG4gICAgICAgICAgICAgICAgICAgICAgbHR5ID0gMikgK1xuICAjIFBsb3QgZWFjaCBnZW5lIHNldCBpbiBpdHMgb3duIGZhY2V0XG4gIGdncGxvdDI6OmZhY2V0X2dyaWQoY29scyA9IGdncGxvdDI6OnZhcnMoZ2VuZV9zZXQpKSArXG4gICMgVXNlIGEgYnVpbHQtaW4gdGhlbWVcbiAgZ2dwbG90Mjo6dGhlbWVfYncoKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiYXVjX3Bsb3R0aW5nX2RmIHw+XG4gIGdncGxvdDI6OmdncGxvdChcbiAgICBnZ3Bsb3QyOjphZXMoXG4gICAgICB4ID0gYXVjLCAgIyBBVUMgdmFsdWVzXG4gICAgICBjb2xvciA9IGFzc2lnbmVkLCAgIyBHcm91cCBieSBhc3NpZ25tZW50XG4gICAgICBmaWxsID0gYXNzaWduZWQsICAgIyBHcm91cCBieSBhc3NpZ25tZW50XG4gICAgKVxuICApICtcbiAgZ2dwbG90Mjo6Z2VvbV9kZW5zaXR5KGFscGhhID0gMC4yKSArXG4gICMgRHJhdyBhIHZlcnRpY2FsIGRvdHRlZCBsaW5lIHNob3dpbmcgdGhlIHRocmVzaG9sZCBmb3IgZWFjaCBnZW5lIHNldFxuICBnZ3Bsb3QyOjpnZW9tX3ZsaW5lKGRhdGEgPSBhdWNfdGhyZXNob2xkX2RmLFxuICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoeGludGVyY2VwdCA9IHRocmVzaG9sZCksXG4gICAgICAgICAgICAgICAgICAgICAgbHR5ID0gMikgK1xuICAjIFBsb3QgZWFjaCBnZW5lIHNldCBpbiBpdHMgb3duIGZhY2V0XG4gIGdncGxvdDI6OmZhY2V0X2dyaWQoY29scyA9IGdncGxvdDI6OnZhcnMoZ2VuZV9zZXQpKSArXG4gICMgVXNlIGEgYnVpbHQtaW4gdGhlbWVcbiAgZ2dwbG90Mjo6dGhlbWVfYncoKSJ9 --> <pre class="r"><code>auc_plotting_df |> ggplot2::ggplot( ggplot2::aes( @@ -3472,8 +3464,8 @@ <h3>Assignments</h3> # Use a built-in theme ggplot2::theme_bw()</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,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//1YLCapJ4DsYrHY3Xfffc899+QSsKkFNWvWrDVr1owaNeqSSy45/PDD9V+ltm/f/vTTT//tb3+7++6799prr/3337/LXq+++mp7e/uoUaM+++yzzZs3v//++xMmTOjtJfI6wRKJxNVXX71ixYpAIHDhhRdOmTJlzJgxsVhs06ZNf//731955ZU//OEPI0eOPProo9O7NDc3X3bZZbW1tW63+6yzzjriiCMmTJjg9Xpra2vfe++9xx57bPPmzZdffvmsWbMOOuigzDBcLlcymXzllVd6TDS0tra+8847+jY9vq+8CiFH11577Re+8IX0P6PR6Lvvvjt79uxPP/30rrvuevjhhzN/VcirYAsrpWLOvT4vtC7yuigyffvb3/72t7+duUb/zf+GG2448sgju2xc8NkiRlSVBsrrVHGsX/7yl7396ZFHHpk7d67b7dZ/xCtSXlerE+rnvM7qAt5jvtWyefVAvu+0sHtWn4qpGfKt6/pk2VNKYYVZQE3Y0tLyxz/+cdWqVbkXQhaGF3iPSiJmQy6HYk7+gm/cgAMxRoNFvF7vkUceqbf3W79+fXNzc/bt586d+8Ybb4RCoTvuuOOnP/3poYceWllZqZSqqan5yle+8sADD+y///51dXX33ntv8XtZQ78N60nitLa2tlWrVvn9/kmTJsXj8RUrVmT+Vd84HA732UispqYmHA6vWLHi+eefzyUY8wqqoaHhtddeU0rdeeedRx55ZLrt69ChQy+++OLTTz9d/xWr+47z588Xka9//ev6DyMvv/xyXq+b5QR7/PHHV6xYMXz48Pvvv/+MM84YN26c2+0uLy+fNGnStdde+93vflfTtHvvvVfTtPQus2bNqq2tHTp06H333feDH/zgkEMOCQaDZWVl++6779e//vVHH3300EMPjUajN910U2NjY2YYY8eOraqqevPNN9va2roH+dZbb8VisQMPPLC3d1FkIeTC7/cfddRReveNjz766P3338++fZaCLayULLtI870oClbw2dKjfKtK8+R7qjjcW2+99ac//UlEfvSjH3V/tC1A7lerc+rnfJlXLTvnPRZ8z+qTsTWDBYp/SjGwMLOcPC+++OIll1xy5plnPvXUU0W9YQuVSsxGfYIFn/yW3bgBa5BosNQhhxyiL2zevDnLZjt37vzzn/8sIhdddFGPvwwHg8Err7xSRJYtW7Zz585i9rKMfgtfv359upmoiKxevToWix1yyCH6D4np3w3Sf5Xc+k0Eg0H9fvzAAw/U1dVl39jUgtJbUer9bLv/Vf/J4oMPPuiyftu2batXr3a73SeccML06dNF5OWXX+7tZ/8sup9gjY2Nf/vb30Tkhz/84dixY7vvcu655wYCgR07dqSfrtasWaP/zvazn/2sx+bi4XD4+uuv13980w+e5na7jzvuuJaWli4fpU7vN3HCCSf0GLxRhZCLffbZZ+jQoSKyadOmXLbvXrCFlZKVF2leF0XBijlbssixqrRAvqeKM23ZsuVXv/qVpmnTp08/44wzij9gXlerc+rnvJhXLTvnPUqh96w+mVQzmKr4pxTDC7PHmvDDDz/85JNPfD5fVVWVUir3o9moVGI25BMs5uS35sYNWIZEgz0CgUCWv7722muxWGz8+PFf+9rXettm3Lhx99577x133JFOuBa2l2UmT56slIrH4//973/TK5csWSIihx122OGHHy4i77zzTuYua9euldz6TYjI8ccff/TRRzc3N/f5E5CpBaX3DNy+ffvWrVu7/3W//fb75z//+eSTT3ZZP2/ePE3TDjvssHA4fOyxx3o8np07d+pPMIVJn2Cvv/56a2vr+PHjjzvuuB639Hq9N9100y9/+ct0n97nnntORI4++ugsjRIrKyvPP/98EXn++eczm0JIKo/wyiuvdNklEoksXrx41KhRvfWsNrwQstO/MLS3t+e1V7pgCysliy/S3C+KghV5tvQpe1VpjcJOFeeIRqPXXXddS0vLuHHjrrrqKkOOme/V6pD6OS/mVcvOeY9S6D2rT2bXDGYo/inFpMKUPWvCiy+++B8plZWVBRzNeqUSsyGfYJEnvwU3bsAyJBospQ8pFA6Hx4wZk2Wzt99+W0SOOuqo7E8YBx988NSpU9PDoRe2l2UqKyv33ntv2bNdon4Lnzp16j777BMOh7du3Zqu3D/77LNdu3ZJRka/T1dccUUwGFy4cOGCBQuybGZqQU2cODEcDre3t//4xz/+85//vGXLlsy/ulyuysrK7ndZvYHul7/8ZREJhUL6A42+Mi/dT7Dly5dL6vmpt72mTp164oknpsdk1g9yzDHHZH8tfYO6urqPPvooc/1BBx0UDocXLVoUjUYz1+v9KaZPn95bJEYVQi7WrVun/06Y41iD3Qu2sFKy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36X0n8WOP/74HntQH3nkkeXl5YlEQv+inrsuJ9gPf/jDCRMm7Nq16+KLL37yySc/+OCDRCKhaVptbe2dd975+OOPi8iVV16Z2Tr0mmuu0d/FxRdf/PDDD69du7a1tTWRSNTW1j733HMXXHDBkiVLQqHQbbfd5vf7ewtDfyJ/7rnnli1bts8+++y11149bmZSIZihS8EWVkr2XqRZLoqCGXK29CiXqrK7888/v7Kycu3atVdeeeWSJUv0IeVbW1tXrlz5s5/9bMmSJeXl5T/60Y/yPWxJiEQi119/fWtr64QJE6644grDj2/g1WpL/ZwLa6pl59ys87pn5cW8msFUxTylmFSYhdWEkPxvB0Z9gsae/GbcuAFrMBikpfTWWbFY7L333sv+k1pZWdl999136623vvPOO88+++yzzz4rIj6fT5+2x+/3X3HFFTNmzOjyg1VhexUvywzVInLZZZfp3zl1kydPXrFihb7Qfa/DDz9cf8773Oc+V2TbZr/f/9Of/vSqq67q/ifzCsrr9f7617+++uqra2trb7/9dhFxu90ejyc939LkyZP1ucr0WbJFpLepkrxe7xe+8IV58+a9/PLLp59+ei6v3uMJ5vf777rrrhtvvHHFihVz5syZM2eOx+PRNE2/ffp8vu9+97vHH3985nEqKyvvv//+22+/fdGiRX/605/+9Kc/6X0d078JTJky5ZJLLuky83MX48ePHzNmjJ7O7605gxmFYIYeC7awUirm3MvrQutRlouiYIacLV3kXlV2N2TIkJtuuum2225btWqV/k71ucrTR77qqqtGjx6d1zFLxTvvvLN582YR+fjjj88+++zeNjv66KMLOAeMvVptqZ/7ZFm1bG890OUd5XjPypcZNUPBrHlKMbwwi6kJTXLOOef02NR/5syZM2fOtD6e7PK9HRj1CRp78ptx4wasQaLBUoMHDx4xYsSnn3569913/+///m/2jUOh0B133LF06dJ58+atXr16165dHo9n9OjRRx111GmnnTZ48GARufDCC7sMl1jYXkXK3q4vHo9n/nPy5Mn6e++xYephhx2mlNI0rcjmDLqpU6fOmDFDbwDZhXkFNWzYsDlz5sybN2/hwoXvv/9+Q0ODz+cbO3bs6NGjTz311HQi/JVXXkkkEkOGDDnwwAN7O9QJJ5wwb9689957b+vWrSNHjuzzpXs7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4dlnn1V6IdVIUXoBF3bixIkvvvjil19+KSsra9KkSdu2bceMGZOdnV1pN6/Xu3Dhwq1bt9rt9k6dOvXp0+e2225T83CPvWFjjPx+IiKdXumlEBEyGgAAEsLjCV9mFaybICIiwWxhRETEbFYhq6myiwEAAAAR74GG77777j//+U8wGCSiZs2alZaWnjt3bseOHXfcccddd90l7VZcXDxjxozjx48TUVpa2q+//vrrr7/u3r376aeftlgUfg/UwHm9xBgRHyMnKDJ1goh4zWjYvXt3eXl5SkpK7969lV4LAEA9VaQPcBBoEB+wMmQ0/EEoFPrpp5+IyGg0Vr09AwAAEFdcBxpsNtvrr78eDAavvPLK+++/PzMzMxgM5ufnf/DBB59++mnPnj0vueQScc9Zs2YdP368R48ef/nLX7Kyss6ePfviiy/u3bt33rx5U6ZMUfanaNiYNHJCr3wnSPrD1AlOMxquvfbawsLCzMzMkpISpdcCAFBPzM5BJ0iRJdIhAqUTf+T1evv160dEOTk5u3btUno5AADcyczMPHfuHBGlpqYqvZYGiOseDevXr/f7/dnZ2U8++WRmZiYRqdXq0aNH33zzzYyxVatWibsdOHDgl19+MZvNf/vb37Kysojooosueu6559Rq9caNG4uKipT8GRo8abgDByMniKJLJzjNaAAAaACY3SY+EMwmZVcimDDhEgAA6kMQhObNmzdv3txgMCi9lgaI60DDkSNHiGjIkCGVWi0MHjxY+ioRff/990TUr1+/6CqJ5s2bZ2dnM8a2bt2auBU3PlJGAyfNIEkab8lrRgMAQENgt4cfmBQONJAlEmiwIdAAAAAKCwQCbrebiaXljRvXgYby8vKsrKzWrVtX2q7RaIhIbNxAREePHiWinJycSruJW8SvQrxIiQN8NIMUdFLpBDIaAADihTnCgQbBqORsSyISzOEFYOoEAEBy+frrr//0pz8NGTKkRYsWFoule/fuI0eOXLFiRSgUqrqzzWabMWPGkCFDWrdubTKZevToMWbMmC1btlR75Fru7HK5apo6sW3btjvuuOOiiy4yGAxdu3adNm2a0+k8ePCguH9BQYG0p8ViEQRh9erVTqfzwQcfbNKkiclk0uv1PXr0uP/++0+cOFHtCl0u17///e9BgwY1adLEYrH07t170qRJBw8erOl3tWrVqhEjRrRo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wVi7aV4JIEQGT4SDIAAAwLH3339/+fLlubm5bdq00el07du3v//++3/++edXXnllzJgxDz/8cHp6usFgaNu2rbj/yy+/vGvXrnHjxl166aWZmZlms7lXr1633HLL6tWrf/jhh7S0tOiD12nnat19991btmwZNWpUZmamyWQaMGDAwoUL33zzzaKiIiLS6/W62G6yDhs27Jdffnnqqad69eqVmppqsVhycnImTJiwZ8+eN954o9LOer0+Pz9/yZIlN954Y7NmzbRabatWre65556dO3fefvvtsSwj3mSYOtG5c+fp06dPnz597969n3zyySeffHL06FGHwyFGaJo3bz527Nhx48aJrTWgIWGR2gSBp4yGikGbXpRONBDzzxW4gkEiGp6R3rK6XLUbMtPfPHPWXh5cU1J6wutrr+fpCQnQwAQC4TAuNw0aiIiMmHAJAJBMRo8ePXr06KrbVSrVO++8884771Tafumlly5cuLCWB6/lziaTidXQQjgnJ2fFihWVNhYUFFBkBKbEIfUtqqJbt241HT8jI+OVV1555ZVXLrhI0W233XbbbbdV3b548eLFixfX8iAJJufUiZ49e77wwgtHjhzZsWPHX/7yl9atWxNRQUHB66+/3r9//27duv3zn/88cuSIjGcEhUmDW7nJniUiIfJBlCGjoUEIMXrn7Dnx8djmWdXuo1epRjVpQkQhog/PFSZucQCND+Nt5AQREUkNIJkDgQYAAKinFStW9OrVq1evXmfPnq30pWAwuGbNGiLKyclRYmnJJy7jLfv16/fqq6+eOnVq8+bNjzzyiFjEcujQoeeff75Lly4DBw6cM2dOSUlJPE4NiVTRDFLL0w3k6KkTkPy+Lis76vESUXejsXvNd1BHNskQH3xUUIjpdgBxVNEJkqdOTKZI6YQdpRMAAFBPvXr12rt37969exctWlTpSwsXLjxz5gwRjRkzRomlJR8ZSieqxRjbsWPH6tWrN2zY4JbuexMR0bZt27Zt2zZt2rTJkye/8MILarU6TmuAuJN6NHBVOlExdYLHQMNHH33k8Xh0Ol21A36hqg8iGQq3Nj3fRJtOBv3FRuMBt/uIx7vN7hiYitGmAHEhNmggIoGv0glp6gQCDWHl5eXz588noqysrFtvvVXp5QAAJIGOHTuOGDFi9erV06dPDwQCY8aMyczMPHLkyKpVq15+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4XD85Cc/MToWIiJKWqFQ6MEHHwSQm5t7ySWXGB0OERGNLEw0ECXUPffcU19fn5GRwUQDERENnVAodMsttwCYOXMmEw1ERJRgHDpBRERERERERHHDRAMRERERERERxQ0TDUREREREREQUN0w0EBEREREREVHcMNFARERERERERHHDRAMRERERERERxQ0TDUREREREREQUN0w0EBEREREREVHcWIwOwHTWrl37wgsvxLKG7u7ucDgMwOl0SpKJUjnhcLi7u9vlcgkhjI7lK6FQKBgMArDb7RaLiQ5IVVX9fr/D4ZBlOY6r9Xg8kiS5XK7BHWaKogQCAQBWq9Vms8UxsNj5fD6r1Wq1Wo0O5Cuapvl8PgCSJDmdTqPD+ZpAICCEsNvtRgfyNX6/X1VVACkpKUbH8jXBYFBRFLN9iQM822/evDnaNXd1dcXYEvFcEZWkPFeEQqG8vDwAQogYD6d9mflcEQ6HXS6X0YF8Da8MozLSrgxjNMCzfVNTUwKDIgKYaOjD7XZv2bJly5YtsaxEb3oBmKot0WmaZqq2BICmaZqm6ctm22NDsbs8Ho/b7Y7lss+0B5j+PZrtANN3lxDCbIGZeXeBR9fADHx3FRYWDny1drtdkqTY7wz5bUYl+XaXpmn5+fkYmkRD8u2uIWXa3QVzXxmas+02W0gY8AHm8XhMlSKhpCd67/EoXu64446///3vAF588cWpU6caHY7ZLVmy5MEHHwSwePHiBQsWGB2O2X355ZdXXnklgAULFixevNjocMzO5/PNnTsXwNSpU1988UWjwxkGFixYsHv3bkmSVq5caXQsw8Ctt976wQcfAHjllVcmTJhgdDhfs2bNmiuuuALAmWee+fOf/9zocMyO54po8VwRlcWLFy9btgzAkiVLJk6caHQ4Zvfiiy8+8sgjAO64447TTz/d6HDMbuXKlT/+8Y8BnHPOOYsWLTI6HKKvmC6xSkRERERERETDFxMNRERERERERBQ3TDQQERERERERUdww0UBEREREREREccNEAxERERERERHFDRMNRERERERERBQ3nN4y/srLyxsbGwFMmzYtJSXF6HDMrra2dvfu3QBGjx6dk5NjdDhm197eXlpaCiA7O3vMmDFGh2N2qqquWrUKQEpKyrRp04wOZxhYv359IBAAMGfOHKNjGQbKysqam5sBTJ8+3eVyGR3O13R0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VXXvl9XV1QkhhBBvvPHGvit566239Gd37drV56n169dfeeWV48aNczqdOTk5xx577GOPPRYMBofwIxERERHFwGJ0AERERMNVKBS6+OKLX3nllb0f3LJly5YtW959993vfOc777zzjizLsWzivvvuu+222xRF0f8bCAQaGho++eSTxx577J///GdJSUksKyciIiIaCkw0EBERDdKDDz6oZxkmTpx4xRVXjB8/XtO0bdu2Pffcc9u2bXv//fcfeeSRn/70p4Ne/wsvvHDrrbcCyMvLu+iii4444oi2trY33njj/fff37p160knnbRx40aLhU05ERERmQuvToiIiAbpySefBDB58uSVK1e63e7ex3/0ox8ddthhFRUVH3/88aATDYFA4LbbbgMwZcqUf/zjH8XFxfrjl19++eLFi3/9619v3bp1yZIlF110Ucyfg4iIiCieWKOBiIhoMLq7u1VVHTVq1I9//OO9swwAPB7PvHnzAJSXlw96/U888URlZSWARx99tDfLoLv77rvT09MBfPjhh4NePxEREdEQYY8GIiKiwbDb7bt3797fsw0NDTGu/4MPPgAwbdq0448/vs9TFovlySefrKioKCwsjHErRERERHHHRAMREVEcaJpWXV29c+fOLVu2/POf/3zvvfdiXOH27dsBzJgxo99nzz333BjXT0RERDREmGggIiIavE2bNj311FOffvrptm3b/H5/vFYbDof1eS6LioritU4iIiKixGCigYiIaJB+85vfLF68WJ970mazzZw5c8KECZMmTTrmmGOWLl363HPPDXrNwWAwHA4DsNvtcQuXiIiIKCGYaCAiIhqMDz/88Gc/+xmA6dOn//rXvz7hhBP2Tgq8+eabUa2tubl57/+6XK6CgoLq6mq9XwMRERHRMMJZJ4iIiAbj+eefB+B0OpcvX37qqaf26Xqg90fol6Zp+z64devWPo9MnDgRwMaNG/tdyb333nvEEUeceuqpUUZNRERENOSYaCAiIhoMfe7JsWPH5ubm9nlK07RVq1Yd+I17CwaDr732Wp8HjzrqKABffPHFZ5991ucpVVX/+Mc/rlq1yuVyDS54IiIioqHDRAMREdFgjB8/HsCOHTvq6+v3fjwQCFx33XVr164FoJdv0GVnZ6empgJ46aWX9u7voGnabbfdtnPnzj7rv/nmm71eL4BrrrmmpqZm76fuvfdefUjFiSeeGN8PRURERBQ7+Re/+IXRMRAREQ0/iqIsXbo0HA6///77GRkZqqpu2bLl7bffvuiii5YtW5aSkhIKhZqbm4888sjc3Fy73S6E+Oyzz7Zv315TU/Pxxx9nZmYGAoGPP/540aJFL774oiRJ+pCKG264Qc8vOJ1Om822bNmy2traJUuWtLa2tre3r1q16q677nriiScAHHPMMQ8//LAk8TcDIiIiMhfR70hRIiIiOqgf/vCHzz77bJ8HJUm6+eabZ8+efc455+iPnHHGGXptyD179syaNauhoWHfVf3mN79ZtGgRgIqKipKSkt7HH3/88Ztuuqm7u7vP6w8//PA333xz9OjR8fs0RERERPHBn0GIiIgG6ZlnnnnzzTfnz59fVFRkt9tHjx59+eWXr1279v7771+4cOFVV13l9XqdTmdxcbH++qKiotLS0ptuuumwww5LSUnRH0xLS3vhhRcuu+yyfjdxzTXXfP755xdeeGFxcbG+iZNPPvnxxx9ftWoVswxERERkTuzRQEREZIzKysqmpqapU6darVajYyEiIiKKGyYaiIiIiIiIiChuOHSCiIiIiIiIiOKGiQYiIiIiIiIiihsmGoiIiIiIiIgobphoICIiIiIiIqK4YaKBiIiIiIiIiOKGiQYiIiIiIiIiihsmGoiIiIiIiIgobphoICIiIiIiIqK4YaKBiIiIiIiIiOKGiQYiIiIiIiIiihsmGoiI6P/bsWMBAAAAgEH+1pPYWRgBAMBGNAAAAAAb0QAAAABsRAMAAACwEQ0AAADARjQAAAAAG9EAAAAAbEQDAAAAsBENAAAAwEY0AAAAAJsAXLbXWvkbtv8AAAAASUVORK5CYII=" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdeYBT9bnw8eckk212ggzLsMgqoCIIiEu1IlLl6rWLitRqW5fa2irV9hbfXhXr0kVq1ZZLrV61arX1WmvrUqssUgVEkX0RBARB9mWGmclkkplJzvvHmYQhM5NJcs7JOYf5fv7QkElOnjw5S578NkVVVQEAAAAAAPbmsjoAAAAAAADQOQp4AAAAAAAcgAIeAAAAAAAHoIAHAAAAAMABKOABAAAAAHAACngAAAAAAByAAh4AAAAAAAeggAcAAAAAwAEo4AEAAAAAcAAKeAAAAAAAHIACHgAAAAAAB6CABwAAAADAASjgAQAAAABwgAKrA7CXN954o7Gx0eooAACWKS4u/tKXvpThg9evX79582ZT4wEA2Ny5557bo0cPq6NAV0EBf4yHHnooFApZHQUAwDK9e/fOvIB/8803X3rpJVPjAQDY3OOPP04Bj7yhgE/15S9/+dJLL7U6CgCABV588cWPP/44q6cEg8EHH3zQpHgAAHa2Z8+ee+65x+oo0LVQwKfyeDxFRUVWRwEAsIDH48n2KYqicNUAgK4pEAhYHQK6HCaxAwAAAADAASjgAQAAAABwAAp4AAAAAAAcgAIeAAAAAAAHoIAHAAAAAMABKOABAAAAAHAACngAAAAAAByAAh4AAAAAAAeggAcAAAAAwAEo4AEAAAAAcAAKeAAAAAAAHKDA6gDs7vrrr9++fXvb+4uKiiorK0eNGvWNb3yjvLy89Z/uv//+d95559prr73++uvbPnHbtm1vv/328uXLDx482NTU1KdPn379+k2aNOkLX/iCoigdhZHVs9IHkN7UqVMPHjyY5gGBQODNN98Ukfnz5//85z9XFOXVV18tKSlp/Zjt27drL33zzTdPnTo1ZQu33XbbmjVrvvjFL/7sZz9rN9qNGzd+//vfF5Hvfve706ZNazeMyy+/vKqq6rnnnuvXr1/Kn3LLcCbWrFnz97///fPPP9+zZ09xcXFlZeWIESOuuuqqlB2gtZkzZy5atEhErr/++muvvbbdx+SwjyWtXr163rx5a9asOXz4sN/v79u370knnXT11VcHg8GOQvrkk0/mzp27atUqLT/BYHDEiBHnnXfeueee63K5UjZ+++23i0hJScnf//53t9vd7gYXLlx43333iUj//v2fffbZnPOQoa9//ev79u1LubOwsLBv374jRoz45je/mfLe9aQ381y1ltUemPkRJ7keGimH2NNPP/2nP/0pzStqgsHg3/72t9xSoSfnacRisQsvvFB7CwMHDmz7gEgkMmXKFBF58cUXe/bsqd2Z7Q6j091337148eL0j7n44ovvuOOO+vr6Sy+9NCXa1mpra7/85S+LyF//+tcTTjih7QM6PaxsdS7Nbccz+xRq0tGa25vN4RKToayO307f5le/+tXp06dn/ur5/16hyTyfJp2yMpdhzvfv368dyP/617/8fn+ax+v5HpihDGPO7bytyfwTTP9+M9//dZ4zgbyhgM+I3+8vKDiaq3g8Xl9fv3nz5s2bN//rX/+aM2fOgAEDOt1Ic3Pz7Nmz33jjjXg8rt3jdru3bdu2bdu2d999d8iQIXfffXf//v0NeZZOKe835U/ajTFjxoiIqqrr168/66yzWj9mxYoV2o1ly5alXGhjsdimTZtE5PTTT+80jGeeeebcc8+trKzMMGzzchWLxe6///53331X22b37t3r6urWrFmzZs2aV1999Uc/+pF2fUoRCoWWLl2q3Z4/f376wjXbfSwSiTz44IP//ve/k+80EokcOXJk/fr1//znP6dPn65dEVOe8vDDD8+fP19V1eSz9u7du3fv3nfeeWfIkCF33XVXu3tyXV3d8uXLJ0yY0G7kyRg6klUeMtQ6XaqqhsNhLVfz58+fNWvWyJEj0zxeMktvDrnKeQ/M5IhrLdtDozWv11tcXNz6nnA4HI/HU2IoLCzUbuS82xhy2jRKtjuMnhdKSW+Sqqr19fVGvVBWh5UdzqXZ7nhi8inU1KM12zeb2yUmE0Ydv635fL4cIsnn94rc8pnzKev1119/+OGHX3jhhT59+nSeiI4ZnvM0bB6zUUdEzvu/nosskAcU8Bn58Y9/nHKyaGhoWL58+W9/+9vDhw8/+OCDv//979NvIRaL/fSnP12+fLmITJkyZeLEicOGDSstLT148OAHH3zwl7/8ZevWrTNmzJgzZ0737t11Pku/++67b/z48ekf07179/79++/cuXPdunUpF9ply5ZpN9auXRuJRFpXIFu2bIlGo5K4TqcXjUYfeuihRx55JJOYTc3V008//e6775aVld18882TJk3SLld7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3313eQzvcrmU1d3CJje3dzgcS5cuvfxZq9XatWvXVq1azZgxQ95y/fXXE9H69esrjNVfe+21CMcTO5EG8J06dXr55ZePHz8ejcEA7zjrQo9l5BKS1etddfESERlE8ab0tAr3aaDXdzQZieiEw/lrmbXCfQCgUoyRw06kfgc7mS8Dj5XkAABiSV7M/MSJExbLn+6WSpJ07733FhQUEJHVGvhaJUe8mzZt+v3338sdSomBlWbsIe1coaeeekqeef7ggw/KneSU4T3++OOnT5+u3m9ZqSFDhsgLwk2cOPHAgQPBTzHGJk+evHv37uPHjw8ePFjeOG3aNFEUiejuu+8uV8D/8ssv//DDDxGOJ3YinQOfn58/derUZ5555rrrrhs9enRubq68SCDUTEoTuyT1m9gxBPCJ6atLxTavRETXp6UmVz4b9qa09L1WOxGtvHCxm9kUv/EB1AB2OzFGfEyAJwpaix4BPABAzPTr1++DDz4oKyvr37//k08+mZWVVVRUtHv37jfffPPgwYNms7msrOzYsWPPPvvs4MGDe/bsOW7cuLVr17pcrr59+06YMKFbt25Go7GgoODLL7/84osviOjaa6/t1KmTfPCQdq5Q06ZNH3nkkVdffXXbtm3y2bt27Xry5Mnly5d/9913PXr0OHjwoMViqaKbXdUEQZgzZ871119//vz57OzsBx54oFevXvXq1Tt+/PiHH364fft2Ipo0aZIyyI4dO44dO3bBggV79uzJyckZM2ZMz549CwsL165d+/XXXxsMhtatW0de2B8LkQbwOTk5eXl5jLGtW7du3br1kUceGTBgwOjRowcPHmw08vG9AaLIX0Iv8FBCjwA+MS2/4Lvn2reS9LvspvTUt88UENG6S0XPtURLf4AQMH8HO5bERwbegAw8AEDMjRo1asWKFZ999tm2bduCa90FQZgwYcI999xz3XXXuVyul1566ffff1++fHlubu7mzZvffvvtwsLC559/vtzRrr766pUrV4r+XEtIO1fm5ZdfFkVxxowZx44de+6555TtvXv3Xr16tTxp32QKP21z3XXXrVu37p577jlz5szcuXODnxIE4cEHH3z99deDN7711lvnzp1bt27dhQsX3njjDWW70Wj8+OOPly5dymcAH2kJ/c6dOw8dOvTSSy917tyZiNxu96pVq0aOHNmgQYNx48Z9/fXX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KImlQgJfVFQEYMuWLQc8btzqPmBYnoiIiIiIiCgZpUICf+aZZwJ455139q8AGQqFNmzYIIRYvHixeaERERERERERxUcqJPDTpk2bNGlSfX39ww8/PFC47q677urp6Zk/f35eXp7ZARIRERERERGNlCUKU43cj3/842XLlr322mtr164tLS3ds2dPb2/v5MmTv/Od75gdGhEREREREVEcpMIIPIDCwsK77rpr0aJFdrt9165dXq/3/PPPv/322/1HKt9KRERERERElBRSZAQegN/v//73v292FERERERERESjIkVG4ImIiIiIiIhSGxN4IiIiIiIioiTABJ6IiIiIiIgoCTCBJyIiIiIiIkoCqVPEjsgKrrrqqvPPPx/AxIkTzY6FiIisYsqUKRs3bgSQmZlpdixERJTEmMATxVNhYWFhYaHZURARkbU4nc65c+eaHQURESU9TqEnIiIiIiIiSgJM4ImIiIiIiIiSABN4IiIiIiIioiTABJ6IiIiIiIgoCTCBJyIiIiIiIkoCTOCJiIiIiIiIkgATeCIiIiIiIqIkwASeiIiIiIiIKAkwgSciIiIiIiJKAjazAyBKKWvXrl2zZg2ACy64YObMmWaHQ0REltDU1PTYY48BmD59+uc//3mzwyEiomTFBJ4onlatWrVs2TIApaWlTOCJiMhQV1d30003AbjkkkuYwBMR0bBxCj0RERERERFREmACT0RERERERJQEmMATERERERERJQEm8ERERERERERJgAk8ERERERERURJgAk9ERERERESUBJjAExERERERESUBJvBEREREREREScBmdgCW88EHHzzxxBPDfnlPT4+UUgjhcrniGNWw6boeDAadTqeiWOJmTcq3z+7duwsKCgBs2LAhHA4P9eVWax9N03p7e3n9HI4120dRFKfTaXYsgPXap7u7G0Ds9tm6desw3nYkvUY4HA6FQgDS0tJsNkt0ysFgUFVVh8NhdiAAEAqFjM/S9PR0VVXNDgcYbvvU1dUZvUN7e/tILpgDpEz7jBK2T2xsn9gG0z4tLS2JDYqICfxneb3ebdu2bdu2bdjvoOu6cWCRL6wAjITH7CiiUr59ent7CwsLAWzYsOHDDz8c6stTvn1GiO0TG9sntkG2T3Fx8eDfMy0tTVGUkeRjUkopJQAhhEXaaiAeswMB9msfS13VGHr7aJpm9A7xTeBTpn1GCdsnNmv2Gki29vH5fBa5/UFjhDD+TihezjrrrNbWVp/P98Ybb5gdixUtXrw4EAhkZmb+61//MjsWKzr99NO7urpycnJWrFhhdixWdMoppwSDwfz8/JdfftnsWKxo4cKFoVCoqKjohRdeMDsWKzrhhBN0XR83btzf//53s2P51G9/+9vf//73AO64444zzzzT7HAs58EHH/zjH/8I4O677z7jjDPMDsdy7r///ieffBLAvffee+qpp5odjuXce++9Tz/9NID7779/4cKFZodjOXffffczzzwD4MEHH5w/f77Z4VjO//3f//3tb38D8Mgjj8ydO9fscIiirHK/jYiIiIiIiIhiYAJPRERERERElASYwBMRERERERElASbwREREREREREmACTwRERERERFREmACT0RERERERJQEuI1cnG3evDkSidhstuOOO87sWKyI7RPbpk2bNE2z2+3HHnus2bFY0caNG3Vddzgcc+bMMTsWK9qwYYOUMi0t7ZhjjjE7Fit67733AKSnp8+ePdvsWD5VXV1dW1sLYPLkyVlZWWaHYzlVVVV1dXVg+xxGZWVlfX09gKlTp/r9frPDsZyB9pk2bVpGRobZ4VjOvn37GhoaAEyfPt3n85kdjuXs3bu3sbERbB+yGCbwREREREREREmAU+iJiIiIiIiIkgATeCIiIiIiIqIkwASeiIiIiIiIKAkwgSciIiIiIiJKAkzgiYiIiIiIiJKAzewArKu9vf2JJ554//33Ozs7/X7/8ccf/+Uvf3mQe7QM8rUjOYW5Rrtx/vKXv/zlL3855Msffvjh4uLiOPwMoykuv9kVK1Y89NBDjz76aEFBwSidwiyj3T5j+fqpqqp65pln9u3bV19fn52dPX78+C984QvTp0+P4ylMN9rtM+zrh71GbOw4YmPHERs7jtjYccRm2Y6DaBi4jdyh1dfX33rrrcbeoX6/v729HUBmZubdd9+dl5cXl9eO5BTmSkDj3HvvvatXrz7kO1j/czAuv1lN02644YaKiopDfs9I3osHCWmfMXv9vPHGGw888ICmaTabLTc3t6WlJRQKCSEuvvjiyy67LC6nMF0C2md41w97jdjYccTGjiM2dhyxseOIzbIdB9HwcAT+0O666676+vp58+Zdd911fr+/qanpjjvu2LVr16OPPnrLLbfE5bUjOYW5EtA4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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3483,7 +3475,7 @@ <h3>Assignments</h3> <p>Let’s write this table to the output file.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX3Bsb3R0aW5nX2RmIHw+IFxuICByZWFkcjo6d3JpdGVfdHN2KG91dHB1dF9maWxlKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiYXVjX3Bsb3R0aW5nX2RmIHw+IFxuICByZWFkcjo6d3JpdGVfdHN2KG91dHB1dF9maWxlKSJ9 --> <pre class="r"><code>auc_plotting_df |> readr::write_tsv(output_file)</code></pre> <!-- rnb-source-end --> @@ -3501,19 +3493,18 @@ <h4>Adding AUC to <code>colData</code></h4> typed.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYXVjX2RmIDwtIGF1Y19kZiB8PlxuICAjIFVzZSBzaG9ydGVyIG5hbWVzXG4gIGRwbHlyOjpyZW5hbWUoemhhbmdfYXVjID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbW1wiemhhbmdcIl1dLFxuICAgICAgICAgICAgICAgIHJpZ2dpX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1tcInJpZ2dpXCJdXSlcblxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoiYXVjX2RmIDwtIGF1Y19kZiB8PlxuICAjIFVzZSBzaG9ydGVyIG5hbWVzXG4gIGRwbHlyOjpyZW5hbWUoemhhbmdfYXVjID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbW1wiemhhbmdcIl1dLFxuICAgICAgICAgICAgICAgIHJpZ2dpX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1tcInJpZ2dpXCJdXSkifQ== --> <pre class="r"><code>auc_df <- auc_df |> # Use shorter names dplyr::rename(zhang_auc = ewing_gene_set_names[["zhang"]], - riggi_auc = ewing_gene_set_names[["riggi"]]) -</code></pre> + riggi_auc = ewing_gene_set_names[["riggi"]])</code></pre> <!-- rnb-source-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>And join it to the existing <code>colData</code>.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBFeHRyYWN0IHRoZSBleGlzdGluZyBjb2xEYXRhLCBhbmQgbGVmdCBqb2luIGl0IHdpdGggdGhlIEFVQyB2YWx1ZXMgYnkgdGhlXG4jIGJhcmNvZGVzXG5jb2xkYXRhX2RmIDwtIGNvbERhdGEoc2NlKSB8PlxuICBhcy5kYXRhLmZyYW1lKCkgfD5cbiAgZHBseXI6OmxlZnRfam9pbihcbiAgICBhdWNfZGYsXG4gICAgYnkgPSBcImJhcmNvZGVzXCJcbiAgKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgRXh0cmFjdCB0aGUgZXhpc3RpbmcgY29sRGF0YSwgYW5kIGxlZnQgam9pbiBpdCB3aXRoIHRoZSBBVUMgdmFsdWVzIGJ5IHRoZSIsIiMgYmFyY29kZXMiLCJjb2xkYXRhX2RmIDwtIGNvbERhdGEoc2NlKSB8PlxuICBhcy5kYXRhLmZyYW1lKCkgfD5cbiAgZHBseXI6OmxlZnRfam9pbihcbiAgICBhdWNfZGYsXG4gICAgYnkgPSBcImJhcmNvZGVzXCJcbiAgKSJdfQ== --> <pre class="r"><code># Extract the existing colData, and left join it with the AUC values by the # barcodes coldata_df <- colData(sce) |> @@ -3528,7 +3519,7 @@ <h4>Adding AUC to <code>colData</code></h4> <p>Now, we’re ready to add it back to the object.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBXZSBuZWVkIHRvIHNhdmUgdGhpcyBhcyBhIERhdGFGcmFtZVxuY29sRGF0YShzY2UpIDwtIERhdGFGcmFtZShcbiAgY29sZGF0YV9kZixcbiAgcm93Lm5hbWVzID0gY29sRGF0YShzY2UpJGJhcmNvZGVzXG4pXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjpbIiMgV2UgbmVlZCB0byBzYXZlIHRoaXMgYXMgYSBEYXRhRnJhbWUiLCJjb2xEYXRhKHNjZSkgPC0gRGF0YUZyYW1lKFxuICBjb2xkYXRhX2RmLFxuICByb3cubmFtZXMgPSBjb2xEYXRhKHNjZSkkYmFyY29kZXNcbikiXX0= --> <pre class="r"><code># We need to save this as a DataFrame colData(sce) <- DataFrame( coldata_df, @@ -3545,29 +3536,29 @@ <h4>Plotting UMAPs</h4> the AUC value</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9IFwiemhhbmdfYXVjXCIpICtcbiAgIyBVc2UgdGhlIGdlbmUgc2V0IG5hbWUsIHJlcGxhY2luZyB1bmRlcnNjb3JlcyB3aXRoIHNwYWNlc1xuICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbXCJ6aGFuZ1wiXV0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcXFxfXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcIikpXG5gYGAifQ== --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9IFwiemhhbmdfYXVjXCIpICtcbiAgIyBVc2UgdGhlIGdlbmUgc2V0IG5hbWUsIHJlcGxhY2luZyB1bmRlcnNjb3JlcyB3aXRoIHNwYWNlc1xuICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbXCJ6aGFuZ1wiXV0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcXFxfXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcIikpIn0= --> <pre class="r"><code>scater::plotUMAP(sce, colour_by = "zhang_auc") + # Use the gene set name, replacing underscores with spaces ggplot2::ggtitle(stringr::str_replace_all(ewing_gene_set_names[["zhang"]], "\\_", " "))</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAANhCAIAAADSYEQJAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdebwdRZk//uepqu4+y12zEEgCJEYS1gCyiQoOyL6My6CILCOKjDiAy+Dr6w7yQtyYGQFXUBiIiIj8GFERl2FYhQABWUISsockJLn7vWfr7qp6fn90OHO8SW5ukpv98/6ru2+d7uo63Tnpp6ueYhEhAAAAAAAAAICRoLZ3BQAAAAAAAABg14FAAwAAAAAAAACMGAQaAAAAAAAAAGDEINAAAAAAAAAAACMGgQYAAAAAAAAAGDEINAAAAAAAAADAiEGgAQAAAAAAAABGDAINAAAAAAAAADBiEGgAAAAAAAAAgBGDQAMAAAAAAAAAjBgEGgAAAAAAAABgxCDQAAAAAAAAAAAjBoGG9Vi9ejVvok984hP1j7e3t9e3X3jhhRs6ymWXXda4B+fcEFX62te+1lh4woQJ3vshyjfWoaWlZdWqVestduONNzbuduHChRva4YoVK37wgx+ceeaZU6dObWlpyefzEyZMOPHEE7/yla+8/vrrQ9RkXVdcccWmNi8zz5w5cwvb5LOf/exGj5LP56dPn37uuec+99xzGz2RzW6TQV/9Rv37v//7CLbbCy+8cOWVV5511lkHHXRQsVjca6+9jj322PPOO++aa66ZN2/eRs96CPPnz//Wt751wgknTJo0KZ/Pt7S0TJky5YwzzrjpppveeOONIT54wgknDP+MDjjggI3WZPNa+Nvf/nbjxnvvvXfQbq21hUKhXuCUU05Z99Cf+9znGnfy6KOPNv51Mxp/xK9bIvrjH/942WWXXXbZZQ888MBwytdt9jc16CyGebhB/xR/4xvf2KFO6v3vf399++TJkze0//POO69ebOzYsests6kXxvBbZrPvyhH/EQEAAIDdi8A6NvQ/qiFccskl9Y+3tbXVt19wwQUbOsonP/nJxj1Ya4eo0pQpUwYd8eGHHx6ifGMdiOiiiy5ab7Hvfe97jcUWLFiwbpnu7u7PfvazURRt6NzDMPyXf/mXJUuWDFGfRpdffvmmNi8RPf3001vYJp/5zGeGfzit9TXXXLOhXW1hmwz66jfqhhtuGJF2e+mll84+++yhy19wwQWdnZ3D/Crr1qxZ84lPfEJrvaHdFgqFL33pS7Vabb0f/4d/+Ifhn9H++++/0fpsXgu/+OKLjRuvuuqqQbt94YUXGgu0tLQ45waVOf744+sFmpubkyTZwsYfwes2472vPy1/5Stf2WhjNtrsb2rQWQzzcIP+Kb7uuut2qJN63/veV98+adKkDe3/wx/+cL3YmDFjBv118y6M4bTMFt6VI/gjAgAAALsh9GjYCTz11FPrvia6++67h7+HGTNmPPXUU5tx6Hnz5h199NH/+Z//GcfxhsokSfKTn/zk0EMPfemllzbjEJtny9tkaM65a6655pFHHln3TztsmwztmWeeeec73/nb3/526GI///nPTzjhhJ6enuHved68eW9/+9tvvfXWIXrlVCqV66+//qSTTuru7h7+nrex6dOnT5gwob767LPPDirwzDPPNK729/fPnTu3cYv3/vnnn6+vnnjiiUEQ0NZs/EGGuG7rNbzyyivnzJmz2YfYAe28J7UT3ZWb/SMCAAAAuyezvSuwIzLGHHbYYUOXmTdvXrVara8O8dZoy/385z9fd+N99933/e9/PwzD4exBRK644opnnnlGqU0ILS1duvRd73pXZ2fnoO3GmCAIGk+fiPr6+k4//fSnnnpqn332GXq3EyZMWLd558yZU39ub25uXre3QqFQaFzd8jYZVAfnXHd398qVK0WkvvHKK68cFCkY8TZh5kMPPXToqmbdrbek3dI0vfDCCwcGBurbc7nc9OnT99hjj66uroULF65Zs6b+p5dffvmqq6762c9+NnStMsuXL3/3u9+9evXqQdubmpqstbVarXHjE088ccoppzzxxBO5XG5DO8zn89OmTRviiJMmTRpOxeqG38JEdNppp9VPfNasWd77xltm3dDD008/feCBB9ZXX3vttVKpVF897bTTaKQbf/OuWyJKkuR3v/vdTTfdNGg0x2Yb8W9qM+zUJ7UT3ZW0uT8iAAAAsPvavh0qdlJ/+MMfGv+z1d7evnDhwvpfR3boRJIko0ePXu9398ADD2xo54N6vWZuueWWQcWG6PWaJMkRRxzR+Ne2trabbrrp+eefr9Vq3vtly5bdeeedb33rWxvLHHPMMcNtxL+3//7713dy2mmnDV1489pkOJ23X3755fHjxzcW6+npGfE2afzqc7ncsBtpPYbZbr/73e8aq/TRj360q6ur/ldr7f333z9mzJh6Aa11R0fHRo+epukxxxwzqEF+9KMfrVmzJiuwePHia665xpi/C2hefPHFg/bT2Hf9sMMO26yW+Dub3cK//vWvG6v6yiuvNP51+vTp2fZ6loFLL720scCMGTMaP75o0SLZ4sbf8uv2pJNOmjx58npH+mzJKINN+qZGfOjEjnBSWzh0YksujCFaZqTuyi3/EQEAAIDdGV5NbLJFixZ95CMfqecdVErdddddb3nLW7bS4R566KGurq5sOQzD/fbbr/6nTR0p8KUvfWn4nW9vv/32WbNm1VePPfbYF1988Yorrjj88MOjKGLmvffe+8ILL5wzZ875559fLzZz5swnnnhik2q1GUawTQY5+OCDv/jFLzZuaXwzvCO3ydAef/zx+vKECRNuu+22UaNG1bdord/3vvfdd9999S3Ouf/93//d6G7vvPPOxmSTRx555AsvvPDJT36y3kFg0qRJV1999WOPPTZx4sR6sdtvv32YOQu3vZNOOqnxAayxC0OlUpk9e3a2fOqpp2YLTz/9dOPHGy+PqVOnZgkCt1LjNxr6un3uuecWL148xEifndEucFI74125ST8iAAAAsDtDoGHTVCqV97///Y3/0/r6179++umnb70j3nXXXfXlU0455aKLLqqvPvDAA5VKZaN7qA/r6OzsvPrqq4dzUBH55je/WV/N5XK//OUv19v/3xhzyy23NKZS//Of/zycQ2yJLW+TIQyKGWVj7GmHb5OhNY71GD9+/HrT/h9//PHHHnvsW99ULpeH3qf3/rrrrquv5nK5++67b70dy4899tif/vSnjVuuvfbaTar/NtPa2vqOd7yjvtqYlOH555/Phrsz87/+679mG1955ZXGsRKNj2rZuAnaOo2/rg1dt7DD2onuys34EQEAAIDdHAINm+bSSy9tfFV49tlnf/nLX956hxsYGGicqu2cc8754Ac/WF8tl8vDmcjtrLPO2muvvbLlH/7why+//PJGP/L8888vWbKkvvrpT396iCwDhULhpZdeWvCm+jPYVjIibTKE+fPn15e11lOnTs2Wd+Q22ah99923vvzCCy8M6rNd99e//nX+mz760Y8Ovc9nn3128eLF9dWhG+TUU0898cQT66sPPfRQ4/P5DqUxbtjYo6EedJg2bdp73vOerOOD974eXPDeN05LUQ80bI3GX9eGrlsimj179vIGxx577KbufAe0C5zUTnRXbsaPCAAAAOzmEGjYBDfeeGPju/T99ttvxowZQ88J/+CDDx61AY19Yjfkvvvuq+cXDILgve9977Rp0+oDxYnoF7/4xUZ30tzc/J3vfCdbds5dccUVG/3IoDfwjWOM12vPPfec8qY99thjo/vfEiPSJhsyd+7celsR0XnnnVdPBrEjt8lGHX744fVla+3ZZ5/9rne969vf/vajjz7a39+/eft86KGHGlcvvvjioctfcskl9eU0TR9++OHNO+7W1hhoePHFF+ud8+uBhqOPPjqfz9cvufroiblz59ZfOEdR9O53vztb3hqNP8gQ1y0RjR8/fkKDIaZl3YnsAie1E92Vm/EjAgAAALs5zDoxXI899thVV11VXy0Wi/fff39ra+vQn+ru7t6S+fwa51Y4+eSTs+xcH/zgB+u9Kv74xz/29PS0t7cPvZ/zzz//Rz/60V//+lcievTRR++5555zzz13iPKDZo5cdy6D7Wik2uSoo45qXHXO9fT0LFu2rJ5948ADD7zhhhvqBbZSm9RqtaFjVZdccsmtt966hUc566yzTj/99D/84Q/1LU8++eSTTz5JRMw8adKk6dOnH3744SeffPIxxxwzzClUXnvttfqyMWajaUoaU2kQ0bx589Zb7G9/+9sQDfKFL3yhcQDLcGxqCx966KHjx49fuXIlEaVp+uKLLx599NHU0LshW33729+ezWRZDzQ0jps4/vjj6/OkjGzjb+p1u/WM+De1I9iWJ7UT3ZW06T8iAAAAsJtDj4ZhWbFixYc+9CFrbX3LbbfddtBBB23tgzam/qoPEGgcKZAkyXB6RjDzzTffXJ8p46qrrho6kUFHR0d9edy4cc3NzYMKPPnkk7wB55133kbrs9lGsE2e+3svvPDCkiVLsqc1Y8wnP/nJxx57bNy4cfXyO2ybDNOMGTMuuuiidR+iRGTx4sW/+c1vrrnmmne+851jxoz58pe/PGgCvPVqnDxv8uTJG00KMOiRZt2593Yc9VEP9GZ8oaura9GiRdmWLNBQT+xfDzQ0ZoJs3AONaONv6nULO7Kd6K7c1B8RAAAA2M0h0LBxSZKcc845jf8Du+qqqz70oQ9t7ePefffd9beU2RiBbHnQSIFhzrPwtre9rd5Ldvny5ddff/0QhUWkvpym6SZVe6sa2TbZkPb29oMPPnhQKGGHbZNhGj169B133PHcc89dfvnl+++//4Ze2/b29l5//fXTp0/fpJ44Q3cZyIRh2FhsR27DM844o76cjZiod2eIoujQQw8lore//e3ZltWrVy9dupT+vkdDfVqKzFZt/Lr1XrewI9u57spN+hEBAACA3RyGTmzcpz/96cZJ7E444YRvfetbw/zsBRdcMGPGjPX+6bOf/eygGcgHacwHcdJJJzWOBWgcKfDII4+sXLly/PjxG63MN77xjV/96le9vb1EdMMNNwwxfLfxjWh3d3dHR0fjHArb0Yi3yXp1dHRcfvnlM2fOvPPOO+sbt1KbMHP24Lohe++995Yfpe5tb3vb2972NiLq6+t76aWXXnrppRdffPGpp56aPXt2YyRl/vz5n/nMZxpPf12NDbJo0SJrbePEkOuaP39+4yE29O3k8/lp06ZtaCf1jHTDtxktnE1ymfVgykIM9QQNhx12WBiGRLTffvu1t7dnE9A8/fTTEydO/Nvf/paVmThx4nq7O41g46/Xeq/brWfEv6kdwXY5qR3/rqwb/o8IAAAA7OYQaNiI22+//cc//nF9deLEiffcc88wh8tuidmzZ9efW+jvhwZkq1/96lezZe/9r371q8985jMb3eeYMWOuvfbaK6+8kojiOP7c5z7XmHK80aAEBHPmzBn0UF0sFg877LD6arlcbkx6v5WMbJs0/veaiKrV6uzZs6+88sqnnnoq2zJjxowrrriiPiR+K7VJFEWNUxVsM62trccdd9xxxx2XrXZ0dPzwhz+8/vrrkyTJttx111233HJLLpfb0B4aO11baxctWtQ408G65s6du6GPN5o2bdrINshmtHA2yeVjjz1GRHPnzu3v72/MBJktMPMxxxyT5d57+umnDzrooHpP8kHdGda7/81u/E29breeEf+mdgTb96R22Luybvg/IgAAALCbw9CJocyaNetTn/pUfTWKovvuu2/bvNtvTHlIRB/72Mcax/zvv//+jX8d/kiBT33qUwcffHC2/MADDzz44IPrLXbyySc3rjaGWjKHHXbYCw22zczqW6lNMvl8/sgjjxz0trBx1P2O2SbDVG6w3t7RY8eOvfrqq7/73e/Wt3jvGxPLrWtQGoL/+q//GroOd9xxR305CIKTTjppODXfXupzT4jIrFmzBmWCzNTTNMycObNx3MSgltkajV+30esWtp7GiHN9Kpx1Nf6psX/BTnpXDvNHBAAAAHZzCDRsUGdn5wc+8IHG/Fvf//73Gx8zth4R2aQ5Gp955plBcyJsiNb6pptuqq/+6U9/Wm+xww8/vDFd+d133/34449vaJ8i8tOf/nTYld1MW69NGr31rW8tFov11WzqgcwO2CbDt9deezW96d/+7d82VOw973lP4+rQc+wdffTR++yzT331e9/73vLlyzdU+M9//nPjA8lpp53W0tIyrKpvJ42TXN57771r1qzJlhv/BainaXj++eezbPxEpLUe9LS2NRp/kCGuW9h6Ro0aVV9evXr1wMDAeos1hgYapx3dSe/KYf6IAAAAwG4OgYb1c859+MMfXrZsWX3LJZdc0jjl+Fb12GOPNR56OIb/Av+EE04YNOhgXcz8xS9+sXHLBRdc0Jioom5gYOBjH/vYI488Msyjb7at2iaNGrslNz457IBtMnyNKQPuv//+rq6u9Rarv7fPND6xrEsp9eUvf7m+Wq1WzznnnPV+RzNnzvz4xz/euOVrX/vacKq9HWWTXGbL9TQrbW1tjX3L60GHOI7vueeebPmYY47Jplyt2xqNv64NXbew9RxyyCGNq+v2ciKiRx99tHF4QuNHdt67cjg/IgAAALCbQ6Bh/b70pS/9z//8T331qKOO+v73v7/Njt6Y8tAYc9gGNL592qSH6htuuCGfzw9d5p//+Z+PPPLI+uqyZcuOO+64r371q0uWLCEiEVmwYMGMGTOmT5++0d65I2Jrt0ldYx/mQfO37WhtMnyNk6QsX7781FNPffLJJxsLWGt/9atfZUOvM4cccshGn3UvvvjiLIldZubMmYcffvhtt93W19dHRHEcP/vss1dfffVxxx33+uuvN36qsRl3WPVe6KVSKVs46qijGlP0jxo1qj4Avv6eeVDfddpqjT/IENctbCVnn31241CIr371q1dfffWqVauy1b6+vp/97GfnnntuY1qND3zgA/XlnfquHM6PCAAAAOzOkAxyPTo7O7/zne80bunq6nrXu941xEfe+973fuUrXxmRo8dxfO+999ZXzzzzzP/+7/9eb8mvf/3r11xzTbb86quvvvTSS41TPA5hn332+eIXvzj0+6sgCH79618fccQR9fds1trrrrvuuuuuKxaLzFx/+iIiZp46deq8efOGc/TNsA3apG6IaSy3RpvEcTycvH2D3mpuqksvvfTGG2/MZmEkolmzZr3rXe/ad999J02aNGrUqI6Ojrlz53Z2djZ+ZDg5JoIguP/++4888siOjo5sS3d398c//vGPf/zjo0aNGhgYWHfk+eGHH/6DH/xgS85lU212C59++um33XZb45Z1R04dc8wxg8bMrxto2EqNP8jONf3q0N/I6aeffu21126zymy2SZMmXXbZZTfffHO2Gsfxtddee+211+bz+TAMswf7RkcdddQ555xTX92p78rh/IgAAADA7gyBhvVwzg3asmjRokWLFg3xkcbpBrbQ73//+2zysMxHPvKRDZU877zz6g/VRPSLX/xi+A/Vn//852+77bbsVfyG7Lvvvo8//vgZZ5wxqFi5XB5U8pvf/GYURZ/97GeHefRNtW3aJJPL5eo9z7PJCxuNeJuISGMewa2kWCzed999J598cuMZLV26tP6QM8hVV131T//0T8PZ8z777PPII4+cccYZg3bV3d29buFjjz32gQce2MYvQje7hU8++eT6JJeZdQMNb3/72xvnrx09evQRRxwxqMzWa/xGQ1+3O5qhv5FBiV13ZDfccMP8+fOzyUfqqtXqurkhp0yZ8pvf/KaxR8zOflcO50cEAAAAdlsYOrHDaZxbobm5+eyzz95QyalTpzZ2kf3lL385aOq7IeRyuf/4j//YaLEDDjjgmWeeufTSSzc0o2cul7v55pv/3//7f4cffvgwD70Ztk2bZCZPnlxffuqpp+pvBet2kDbZVEccccSsWbMuvvjixs7e6xo7duztt9/emOh+ow488MCZM2dedNFFSm3w35N8Pv+FL3zh4YcfHjNmzCZUertqbW099thjG7es+x6+PvFE5pRTTllvI2y9xq/b6HULW0MYhr/73e++/vWvFwqFDZVRSl144YWzZs3aa6+9Bv1pp74rh/kjAgAAALsn9GjYsfT09Pz+97+vr37gAx8Y+kXTeeed9/zzz2fLS5cufeqpp97xjncM81jvf//7TzrppL/85S9DFxs7duxPfvKTz3/+8/fee++DDz64ZMmSNWvWtLS0TJw48cwzz7z44ounTJlCREceeWSWmKDxgWdEbMs2IaJzzjnnmWeeyZZXr179pS996dZbbx1UZru3yeaZPHnybbfddvXVV996662vvfbakiVLlixZUqlU9t1336zD9rvf/e73vve9jWkFh2ncuHF33HHHF77whfvuu+9Pf/rTkiVLOjo6jDFjx46d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r7rqqq997Wsi4pxLkmThwoULFy688847N6vc0NBw8sknP/nkk6Wnb7311o033vjII49885vf/ACX4X323ENvvfXWaaed9sQTT2wceemll1566aUHHnjgrrvuGj58eA/rMKMBAAAAALC9u+aaa9q2cNttt6mqiHz5y1/e7PjPfvazQ4cOfeyxx1pbW9va2q699tooijo7O7/97W9vPMZ7f9pppy1YsGDEiBE33XTTokWLVq9e/cILL3zpS18Skfvvv/++++7brGxTU9OFF144adKkRx55pLW1tbW19frrr8/lcp2dnd/61rc2PfL0009/8skna2pqrrnmmgULFvztb3/7t3/7tzVr1lx44YUf5Dq8j557btq0aU888URVVdVVV101d+7cxYsXX3/99YMHD37uueeOO+64NE17WIcZDQAAAACAHc+8efM++9nPeu+//vWvn3322Zu9WlVV9fzzz9fW1paennvuuStWrLj88stfeOGFjccsWbJk3rx5InLrrbcedthhpcHBgwfvt99+8+bNe+KJJ55//vlp06ZtWrZQKAwdOnTWrFk1NTWlkbPPPnv58uWXXXbZc889t/Gwp5566pFHHnHOPf744/vuu29pcN999x05cuS55577Qc76ffTcQ7fffvtzzz0XhuFTTz218VaUcePGffjDHz7wwANfffXVRx555BOf+ERPShE0AAAAAAB2MA0NDVOnTm1ra/vYxz7205/+dMsDLrrooo0pQ8mBBx4oIq2trRtH+vXrd++994rIoYceutnbhwwZIiLt7e1bVr7kkks2pgwlhx9+uIi0tLRsHLnqqqtE5KSTTtqYMpScddZZl19++fLly3tyju/o/fXcEz//+c9F5NRTT91swYv9999/2rRpr7/++sqVK3tYiqABAAAAALAjieP405/+9NKlSydOnHjHHXcEQbDlMYcccshmI/l8frORAQMGfOpTn9p0pLOzc+HChU8++eT999//bj/9oIMOes/Kr776qogce+yxm42HYXjEEUfcfPPN71b8Pb2/nnti/vz5IjJ16tQtX7rrrru2qhRBAwAAAABgR3Leeec99dRTtbW1999/f79+/d7xmNGjR/ew2mOPPXbfffe9+OKLCxcuXLdu3XseP3LkyH9+QJqmpU0o3vHI93x7T2xtz+9p9erVpRkZY8aM+eDVCBoAAAAAADuMn/3sZ7/5zW+CILjtttt22223dzssk8m8Z6nOzs7PfOYzDz30kIjU1NTss88+u+222/jx4w844IDrr7/+lltuecd3veeeDkmSJEkiIqWFKjcThh/oY/j763lLm23V0d3dXfpHT67beyJoAAAAAADsGP74xz+WNnf4z//8z+OPP/4DVrv88ssfeuihfD7/61//+tRTT930Fowbb7zxfZfNZrOjR49eunTpO67FsGzZsvddWcrX8+rVqzd9OmrUqFwu193dvXTp0r333nuzg9va2jo7O7PZ7LvNH9kM21sCAAAAAHYAr7766qmnnpqm6YwZM77xjW988IKleQHnn3/+6aefvtlCD83NzR+k8u677y4ijz/++GbjaZo+/fTTH6Ty++i5UChsNn9BRDbdfUNEnHOTJk0SkUcffXTLCp/5zGeGDBnyve99r4dNEjQAAAAAALZ3jY2NJ510Umtr68EHH3zNNdeUpWbpg/qWNzjMnj37HT9v99x5550nIvfcc8+cOXM2Hb/ppptKyze8b1vVc3V1tYh0dXW9/PLLmx185513bnZwaYvQ3/zmN6+99tqm4y+//PL//d//icjRRx/dwyYJGgAAAAAA27U4jk8++eTFixePHDnynnvuyWazZSl78MEHi8g111xz9913F4vFNE0XLlx46aWXHnLIIR0dHSIyb968NE3fR+WpU6d+6lOf8t4feeSRv/vd75YuXfrKK69cdtll55xzzsCBA+XtvKC3e54yZUoURSJyxhlnPPvss2marl+//uabbz7mmGO2PK/zzz9/9913LxaLBx100LXXXvvaa6+tXLnyD3/4w4knnhjH8X777bcV96oYNlHag0REpk2b1te9AAAAAADMzF566aXSJ7XSMgHv6JVXXjGzRYsWlY5saGjYrMhjjz0mIlVVVRtHGhsbR40aVTpeVUufyUXkk5/85A9+8IPSv2tra//yl79sWnn16tWbVS7dDRGG4aaDDQ0NRx555GYfwI855pjvfve7InLIIYe8v0uxVT2b2ZVXXrnxp288WETOPPNMEdl99903Lb5gwYJ99tlny9xg9OjRCxcu7HmTzGgAAAAAAOwYCoVC87t4H1MP6uvrX3rppQsvvHDy5Mn5fL6mpub444+/++67H3zwwQsuuOATn/hELpeLouj9bcTQv3//Rx999D/+4z8OPfTQysrKcePGff/73//jH//Y1NQkInV1de+j5vvo+YILLnjwwQePOeaYIUOGxHEsIplM5oc//OEll1yyZfFJkyb99a9//dGPfvTJT35yyJAhAwYMOOywwy677LL58+dPmDCh502qbbEmxK5s/vz5e+65p4hMmzbt7rvv7ut2AAAAAAA7nq6urmKxGEVRRUXFZi9NnTr1gQceuOCCCzada7BttLW1vfHGG+PHj9+yq/JiRgMAAAAAAOV09dVX9+vXr7SewqZWrVr18MMPi8hxxx237buqrq6ePHlyb6cMQtAAAAAAAEB5TZs2LZPJzJkz59vf/nZpjUYze/nll0sLK06ZMuVjH/tYX/fYi7h14h9w6wQAAAAA4IO7+eabZ8yY4b0Pw3Dw4MHr16/v6uoSkZEjRz766KO77babiMyePXvJkiU9r7nPPvuMGzeutzoun7CvGwAAAAAAYGfzuc997iMf+ciPfvSjWbNmLVu2bNiwYXvttdfBBx983nnn1dbWlo657rrrrrnmmp7XvOaaa/71X/+1d/otJ2Y0/ANmNAAAAAAA8EGwRgMAAAAAACgbggYAAAAAAFA2BA0AAAAAAKBsCBoAAAAAAEDZEDQAAAAAAICyIWgAAAAAAABlQ9AAAAAAAADKhqABAAAAAACUDUEDAAAAAAAoG4IGAAAAAABQNmFfNwAAAAAAwLvzzZa8WvaqKqFkDih7WQhBAwAAAABge2bxy8n6L5S/rlZHQ14qf1kQNAAAAAAAtmdeLJG07GVV0qjsRSEiBA0AAAAAgO2ZiSXmy15Wtfw1UULQAAAAAADYfplIIr0QNPRCTZQQNAAAAAAAtl9mvTOjwazsNVHyfoKGuXPnPvPMM6+88sqQIUOOPPLIQw899B0PW7Jkya233ioi3/nOdz5QjwAAAACAXZWJxL1Q1vVCTZRsXdDQ3d198cUXX3XVVZsOHnvssX/4wx8GDhy42cELFy689NJLhaABAAAAAPB+eZG4F2YfOGY09JqtC3FOPvnkUsoQRdGee+45YMAAEXnssccOP/zwtWvX9kqDAAAAAIBdmIkkvfNAL9mKoOHee+998MEHReSCCy5oaWmZN2/e2rVrb7/99tra2gULFpx77rm91iQAAAAAYBdlIolpbzz6+sx2WlsRNFx//fUiMn369CuvvDKfz4uIqk6fPv1Pf/pTGIb33XffHXfc0VttAgAAAAB2SV6kKFr2R2+s+4CSrQgaFixYICJf+tKXNhs/6KCDLrnkEhG55JJLisViGZsDAAAAAOzizDQx1xuPvj6zndZWXNkVK1aIyNixY7d86dvf/vaIESOWLl169dVXl601AAAAAMAuz0Rjcb3x6Osz22ltxZWtr68XkRdffHHLlyoqKn70ox+JyGWXXbZy5cpyNQcAAAAA2MV5kdhcbzz6+sx2WltxZadMmSIiv/vd77z3W756+umnf/zjH29paTnrrLOShPU7AQAAAABlYKKJhWV/pBb29ZnttLYiaDjjjDNE5N577z3zzDNbWlq2PODXv/51TU3NY4899rnPfa69vb1sPW6Nr371q/pO3vGODwAAAADAds5EmdGwY9mKK3vaaacdd9xxIvL73/9+0KBB++233y9/+ctNDxg5cuTNN9+czWZvu+22CRMm/PjHPy5zsz2wcOHCbf9DAQAAAAC9xIsmEvTGo6/PbKe1FUGDqt53333/8i//EoZhsVh88cUX586du9kxJ5100h//+Me6uro1a9Y8/vjjZW21RxYtWiQibW1t9o+WLl267ZsBAAAAAHxAZhpbUPYHu070nq27KSWXy/3617/+7ne/e8899yxbtmyvvfba8pijjjpqxYoVN99886233rpo0aK33nqrTK2+tyRJ3njjjeHDh1dVVW2zHwoAAICdQHtL5+ynFjzz6Msr32h0Lpg0ZdS0LxwxbHT/nlfoaOua+9ySlUvWdrZ2ZXLR4JH99/zI2EHD63qvZ2AXYSKJlX/2gfZCTZS8n9UvRowY8ZWvfOWfHFBZWfnFL37xi1/8ooh0d3e/z9a23htvvJEkyW677bbNfiIAAAB2dGnin7z7uVuufmxVQ4fXQFRE5LWFax+47fma2twv7vnqoOH1/7xCXEwe+MOzD/z+mfb27s6OQhSG2XyQC4N9Dp045eCJHz1xH3W6Lc4E2El5ccVeWLjRWAyy1/T6lc3lcr39IzYqLdAwadKkO++88/7771+5cuXEiRMPPPDAz3/+80HwzmFVQ0PDsmXLNj7lDgsAAIBdipk9cP3//eH6J5u6U8lmTURNRExU06w0dxRnHHnFd35x+qHH7/1uFebOWnLF129peqvFvIl6E02cdLW5MBfNfHx+mnhRPWLqPtvwnICdjdn2MqNh7dq13//+959++ukVK1YccMAB06dP/8IXvtCTNz7++ONXXXXVs88+29LSMnbs2P322+973/ve+PHjy1V/e6Nm1tc9lM0vfvGLr371q/l8vqura9Px/fbb7/bbb9/ytygiN9xww9lnn73l+LRp0+6+++7eahQAAADbh3nPLvzV9+9auLLVokjSVL2ImImoiqizwGkxzibJz+/+6ri9Rmz59r8+OveHX7qx2NYpiRcxU5FsRnNZcYGaN3UqNnhQ5QmnHXbMyR+pH1izzc8P2Bm82fHso29+s+xlM67qtAmP9Pz4OXPmTJ06dfny5dlsdvDgwcuXLxeRc88991e/+pVz/2y5hyuvvPLCCy80s1wuN2nSpMWLF3d0dGSz2TvuuOOkk0764PW3QztYu/9caUaDql5zzTVLly5dv379n/70pw996EN/+9vfTj/9dO99XzcIAACA7cvLT726eFmTRZGlqXoTMRFRETMx78V7y0RF0Ssvuj0ppqW3rF65/qH/mfXbnz9y7Q8fuPyc3xSb2qxQtDTx4oPKCheFkqRSLFp3QYpFi+PVb7Xe8F8Pff0T/3XDD/83frsIgJ7rtV0ntuLjcLFYnD59+vLly88777ympqZly5bNmzdv6NCh11133bXXXvtP3jh//vxvfetbZnbFFVc0Nze//PLLjY2NF198caFQOOuss1atWvUB62+fdqoZDQ8++OCiRYuOPvroyZMnbxxsamrabbfd1q1bd9ttt51yyimbveXxxx//1a9+tfFpa2vrww8/LMxoAAAA2AUkxeS/vnzD/z2z1MJIkrS0joKJbFxQwUQlE2ghziXJGd84/hOnHXLrr5+Y/eyiNWtaRaRzRYO1d0qainMSBlZdqUmqaSqipioiKmYmKubDQMXlQplyyMR/u/5fwpAl6ICtsLzjuQdXXlT2shlXefbEh3p48B133HHKKadMmTLlxRdf3Di/4M9//vOxxx47evTopUuXqr7zUixf+9rXrrrqqnPPPXezvOC444579NFHf/nLX55//vkfpP72aYdc/aK6urq9vX3j08svv/w73/mOiJxwwglbHlxXVzdjxoyf/OQns2bN2jJoOOqoo4466qiNT+fPn7/nnnv2TtcAAADYvnR1FLq70lKwsDFl+EcmZuJcsRDPnrlo7rxVc19aHncnUeQip9bVZWmqgbNMRqsrXDGRNDWnou7tN6uoBkCsCwAAIABJREFUmDdNUg21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rVq1fv36e++9V6leTfXEE0+sWbOmvLz8uN/u2LGjT+czmPU20DB79uyXX37Z2vfb/0ydOnXBggULFiyYNm0agObm5pycoBBCCCGEELlUVll4/x+/+/RDNc88sq6lqTMwlkCaOKp1RzLtE8NjKA0OoBQ5LrQmMGcycDQiDgIfimAIWiPiWqLupphhwCLMawhMuMKie5wIzLCWlQJDa1U9qryzIw1Aa0lnEOJYg2HphOd5ixYtqquru+222372s5/F4/GtW7fOnTt3yZIlM2bMuO222z5k302bNq1Zs+b5559/9tlnP2SznTt3Aujs7EwkEr0/scGpt4GGF198Mfxh5syZYXxh4sSJuTopIYQQQgghTiFSNP+mT11948WtjZ3JjnQk4lhjVtzz57Wrt7amfFIEV5PrQik4mgBOZdgLEIsAUWgFy2ALy2Am14GiME8BlskYGIPAEgMKYctMYmYGWyhrGUiU5JcPKWw63JGXH43G3IG+GUIMQmTtAAcannzyye3bt0+fPv1Xv/pVmL8wZcqUhx56aO7cuXfdddett95KdMLZ7rzzzhUrVnz4/EEQ7N27t7q6+mMQZUBfazS4rjtixIhx48aNGDEiRyckhBBCCCHEgCCi0orC0opCAMycKMpzwcoatgzHgctwNEhxKgUvgKNhGZ7PjkPGvD9LYEgRtCYCWauMYcMclpkMG1IADIK1pBUsx0vyJpwz4lBDGzMmTK76kGcVIc5YPAjaWz755JMArr/++p6rJGbPnl1ZWVlbW/vGG2/MnDnzRPv++Mc//ta3vgWgubn5mmuuOe42e/fuDYLgY/M6v7eBhnPPPff111/3ff+pp5566qmnEonENddc86UvfemKK65wXQm7CiGEEEKIjxUiuuhz09tbk889voFBrJXSirWCNcyA0gDQ1QVHU8QFVFh8gQALEBEsI/BhrWWQJjCUUswWzAwiMEjBcn5pQdX4inQqaGvtmnXxuFkXjx/gyxZiUOIcZTTYv77NUW+++SaAyy67rOegUurSSy/9wx/+sHnz5g8JNEyaNCn84dChQyfaJizQMGHChBUrVjz99NP79u0bP378BRdccOONN2qt+3Cig0NvAw0bN27csWPHY4899uijj27bti2ZTD7yyCOPPPJIWVnZdddd97d/+7eTJ0/O6YkKIYQQQghxKk06d3RrY+fmDXsO7jlM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1vS0r5L1K1VJOSu7RVM0N7deZSlLwUfaXhTK7k3cUGfJvCleyNmqWpLX2d1cbjuEHTbZD2MTcWwijE2G8V7o18GylVFloSIqRMmymbJbzmp6TEoqwuyDZhx1wmG/9uYXnfWq4/biAwemncWLF0vasGHD0443QcCSJUue54XP+f77JoIGAAAAHOhmzxk56JDZqrP6lapayZWzDbo8TtUvBFM0hdAMpTDTU7snzBSDxaAiehGUsudmJmVUldSvZfKUPLvMFKPFaL3a6lohWhk9Zev2vdv3Xk+TE+pXJqko5a5+X2oGZ2aXtEMVRVMxEXp96/Y95aYgwpsPl1sIWZZSM8DPZRZswaJZ5777jA9fcu5pv7IyhGeu0AbwjFatWiVpzZo1TzveHFm5cuXzvPA533/fRNAAAACAA11ZxtUnHR5ScpmCTTVEmBoP2UyIND11UEEalDZYVauqLWVPWSlbla1OoV8rBJWFOi1vlSpLK6I8NxslvF+p27OxbeHxTdq8Vd2eUmo+vE7e6+eqL3crC5WFBSk0WUOS58ECTG4mk9w9ZdW1qpRlXgZ3qU5KSXVtKTfNJCza3PmzfuvfnvXW33zpzJmdvfekgenq/PPPl3TllVfuePCWW25Zv379iSeeuHr16ud54XO+/76JoAEAAADQMasWzRhtK+em56I8K2erktV5UM5g5s0be7nMlZJVtff61u1pomf92qpk/cp6fWX3dss7LS8LbxXNjEwvCw9B7s2bf0tZde0peaplwWNQjBYLFYViUL9Wv9/0bvQQZWYmkytn5WRNZUQwd3czxSCXdSsP8roO2yas1w91spTNJVko4ozZI8eceNgRKxfu7ccMTFdnnXXWypUr16xZc8kllzRHNm/e/K53vUvSe9/73u2nuftll1122WWX3Xfffbt04U6eNl0QNAAAAADatmlbqKpQND0Xm00RpuyqkurU9IA0k1Kyfm3jvTg2Eca71qu8SiEnr2s10yVj8FahIii7pWQpDaZRxGDBJFNKHoLahcvcXTGqCIMgoambCEExeL/KdS1JIags3aa2Ogy6RWTLLncvo7eiNRdWVZjoW+0WCssul8stqGhFM3vBsgWrjptm/eSAfYeZXXnllYsXL/7ABz5w5JFHnn322UuWLFm7du2FF1747ne/e/tpOefzzz///PPP/853vrNLF+7kadMFQQMA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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAIAAAB7BESOAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdabhdRZU38LWq9nCGOydkIGESQpB0mCTMgghEQGnEFhWknRAUEFps+mlFRLHBdn5U0FZpQdsGlaHxiYpoizKIJECYhwCZyXznM+6hqtb7YYfT571Jbm6Gm+SG/+/T3vvU2UOdve+561TVKhYRAgAAAAAAAIBdm9rZJwAAAAAAAAAAm4cAHgAAAAAAAGAMQAAPAAAAAAAAMAYggAcAAAAAAAAYAxDAAwAAAAAAAIwBCOABAAAAAAAAxgAE8AAAAAAAAABjAAJ4AAAAAAAAgDEAATwAAAAAAADAGIAAHgAAAAAAAGAMQAAPAAAAAAAAMAZ4O/sEAGBHW7NmTV9fX6FQmDx5chiGO/t03lhQ+bBRuDEAAABgJNACvxFr167lLXTRRRc13t7Z2dnY/o//+I+bOsqVV17ZvAdr7TCndO211zYXnjJlinNumPLN59DW1rZmzZqNFvvud7/bvNtFixZtaofLli377ne/e/rppx9wwAGtra35fH7KlCmnnHLKF77whRUrVgxzJhu6/PLLt7R6mXnevHnbWCdDKnyjCoXCrFmzPvaxjz399NObvZCtrpNLLrlki679W9/61napt4GBgc997nN777335MmTZ8yYsd9+++VyucmTJx977LHnnXfeV7/61f7+/s1e9TCWL1/+ne9857TTTjvggAOKxWJnZ+eb3/zm97znPT/96U+H3/PJJ5888it685vfvNkz2boa/trXvta88c477xyyW2NMoVBoFJg9e/aGh/7MZz7TvJMHH3ww277Vlb/d79ttsdWf1JCrGOHhhvwpvuGGG3apizrnnHMa2/fbb79N7f+8885rFNtjjz2GvLp1N8bIa2arn8rt/iUCAAAA24fABjb1n8owPv7xjzfe3tHR0dh+wQUXbOoon/70p5v3YIwZ5pT233//IUf885//PEz55nMgog996EMbLfad73ynudjChQs3LLNu3bpLLrnE9/1NXXsYhpdddtmKFSuGOZ9mn/rUp7a0eolo7ty521gnQyp8eJ7nffnLX97UrraxTj75yU9u0bV/85vf3PZ6W7Zs2YY1NkRbW9s111xTKpVG+FE29PT0XH755Z63yR497e3tX/3qV6Mo2ujb3/a2t438ig466KDNns/W1fAzzzzTvPGqq64astunnnpqSHVZa4eUOfHEExsFWltbkyTZxsrfjvdtw5VXXpmVv+aaazZbuNlWf1JDrmKEhxvyp/j666/fpS7q3e9+d2P7vvvuu6n9f+ADH2gUGz9+fPNLW31jjKRmtvGp3I5fIgAAALAdoQV+DHj00Uc3bNb4xS9+MfI9/PznP3/00Ue34tDPPPPMkUce+R//8R9pmm6qTBzH3//+92fOnPnSSy9txSG2zrbXyfCMMddee+2999674Uu7bJ0M74ILLths41ipVLr++utPO+20SqUy8j0vWLDgyCOPvPHGG40xmyozODj42c9+9pRTTunt7R35nnewQw45ZMqUKY3Vxx9/fEiBxx57rHm1VCotWLCgeYtz7sknn2ysvv3tb89+5Rm9yh9imPu2obu7++abb97qQ+yaxuhFjaGncqu/RAAAAGD7whj4jfA877DDDhu+zMsvv1yv1xurWuvRO5///u//3nDj3XfffdNNNwVBMJI9iMjll1/+2GOPKbUFP9m8/PLLJ554YqlUGrLd87xcLjfkv8n+/v4zzjjj0UcfnTx58vC7nTJlyobV+9JLL8VxnC23trZu2CpVKBSaV7e9Toacg3MuiqJly5Y1ToOIPv3pT5955pnNxbZ7nTDzoYceOvypZt1ut6XeHnnkkYcffrh5u+/7M2fOnDx5ck9Pz8KFC5v/g583b96111777W9/e/izyixatOj444/v6+sbsr2lpcUYE0VR88ZHHnnkpJNOmjdvXrFY3NQO8/n89OnThznivvvuO5ITaxh5DRPR6aef/pOf/CRbnj9/vnOu+ZHZMKSfO3fuwQcf3Fh95ZVXmu+B008/nbZ35W/dfduwYsWK2bNnb8tvBA3b/ZPaamP0osbQU0lb+yUCAAAA29/O7gIwJv3+979v/iems7Nz0aJFjVe3bxf6JEnGjRu30c9uzpw5m9r5kN6PmR//+MdDig3T+7FerzdHJtll3nTTTU8//XQcxyLS399/2223DQknTjrppJFV4VAHHXRQYyenn3768IW3rk5G0ol39erVQ4K9devWNV7dXnXS3ME7l8uNsIo2aoT19sUvfrH5lP7+7/9+5cqVjVfTNL399ts7OzsbBcIwHElH+iiKjjjiiOY9t7a23njjjWvXrs0KLFmy5Nprrx3Siff8888fsp/mPsyHHXbYVtXE/2era/iuu+5qPtXnn3+++dVDDjkk294YxX3xxRc3F/j5z3/e/PbFixfLNlf+tt+31Wp14cKFf/zjHy+88MKWlpbmYtvS23yLPqnt3oV+V7iobexCvy03xjA1s72eym3/EgEAAIDRgJ/St9jixYvPP//8Rr40pdRtt932pje9aZQOd9999zXaYYIgmDZtWuOlLe0xfvXVV488S9mPf/zjF198sbF6wgknPPfcc5dddtmhhx6aNXF3dHScf/75f/vb35rb+h588MENWym3u+1YJ0NMmjRpSKTRXAm7cp0Mb9WqVY3lrq6uO+64Y88992xs8TzvvPPO++Uvf9nYEsfxX/7yl83u9uabb27uMT5z5swnnnjiU5/61IQJE7It++6773XXXfeXv/yl+XC33377I488si2XM3pOPfXU5sCm+YOr1WovvPBCtpw1rRPR3Llzm98+f/78xvKBBx6YJTYbpcpvNvx9O2XKlAMOOGD27Nk/+clPtksz9a5gN7iosfhUbtGXCAAAAIwGBPBbplarnXPOOc3/wVx33XVnnHHG6B3xtttuayzPnj37Qx/6UGN1zpw5tVpts3todO/v6ekZ0uazKc65r33ta43VfD7/i1/8onl4cPNLP/nJT5pbwP7whz+M5BDbYtvrZBhDurs3OuTv4nUyvLa2tsbyQQcdtNFJqmbPnj1+/PjG6vLly4ffpzHm61//emM1CIJ77rnnwAMP3LDkCSecMGR88iilE9927e3txx13XGO1edD7k08+mU0VwcyXXXZZtvH5559vjh6feOKJxnIjyB+Nyt/Qpu5b2GWNoadyK75EAAAAYJRgDPyWufjii5999tnG6llnnfX5z39+9A5XLpfnzJnTWH3ve997zDHHfOELX8hWq9XqnDlzmvtnbtS73vWuxx57bPXq1UT0gx/84KKLLpo5c+bwb3n88cebW4euvPLKqVOnbqrwpEmT5s2b1/hRo9HOM0q2S50MY9myZY1lrXXjf99duU42q/k/+BdeeGHt2rUTJ07csNhTTz3VGErd1dU1/D7nzp372muvNVYvvfTSYfJpn3nmmSeddFJjTrU//vGPg4OD7e3tI7+EHeaMM8546KGHsuXmFvhGMH/QQQe9/e1v9zzPGOOce+KJJ7I+2M655jT1jQB+NCp/Q5u6b4lo2rRp5XK5sbp8+fJt/JFrV7AbXNQYeiq34ksEAAAARgla4LfAd7/73ea232nTpv385z8ffk7je++9d9Ym3H777Zs94t13391Ilef7/tlnnz19+vTGQFwiGslOWltbG20y1trLL798s2/505/+1Lx67rnnDl/+4IMPPv51zR3aR8N2qZNNef7555vbr97//vc3BtvvynWyWe94xzsaGaoGBwdPOOGEn/3sZxum4ps6der+r2sefLtR//u//9u8evHFFw9fvrmAtXZLe4nvMM0dap555plG7NQI4I866qh8Pt8Yc97oRb9gwYJqtZoth2F40kknZcujUflDDHPfZmf+UpOjjjpqi3a+a9oNLmoMPZVb8SUCAAAAowQB/Eg99NBDV111VWO1WCzec889m21C7Ovre2IT1q1bt9mDNudaP+2007KsQs2h4x/+8IeRjEj84Ac/2OgY/OCDD/7qV78avvzSpUubVw844IDNHmKH2V51MuT3lMMPP3zKlCmHHHJIY1an/fff/xvf+Eaj/CjVSRRFPKyLLrpo24+yzz77/Pu//3tjdeHChR/5yEc6OzuPOOKISy+99Oabb37iiSea05iPxCuvvNJY1lpvtkKG9ON9+eWXN1rs6aefHqY2Pve5z23RSdKW1/Chhx7aGBucpmljcvhGa3wWKx599NHZaiOAb+4/f+KJJzbmTdi+lb+l9+3o2e6f1K5gR17UGHoqacu/RAAAAGCUoAv9iKxcufJ973tf84S6t9xyy4wZM0b7oM3tIY0Y9dxzz230GE+S5O677/74xz8+/K6Y+cYbb5w1a1aWe++qq64666yzhkzM1qz5x4WJEycOSfJMRM8888ymDjp79uzRG+G8HeukOdza0Dve8Y6bb765OcnTLlsnI3T55ZcfcMABl1122ZIlS7ItWZfvRq/vfD5/8sknv/Od7zz//PM3moB6iOYKedOb3pRNeD6MId0Quru7t+wCdqDTTz/9lltuyZYff/zxo446qre3d/HixdmWLIA/5phjfvCDH1BTAN+cwa7Rfz6zHSt/S+9b2JWNoadyS79EAAAAYJSgBX7zkiR573vfu3bt2saWq6666n3ve99oH/cXv/hFI9d91lc8Wx7SY3yEedePOOKIRni5YsWKr3zlKyM8jTRNN9xYqVQ21bOgEeeMhu1bJ5syZcqUa665Zq+99tpUgV2qTkbujDPOeOmll379619fdNFFM2bMGDKfc71ev/feey+77LKDDz74nnvu2aI987ADSTJBEDQX29KmxR2peRKBrOd8o/k9DMPsTmu0wK9duzYbf94cWr/jHe8Yss/Rq/yGzd63sAsaQ0/lVn+JAAAAwHaEFvjN+6d/+qfmyaJOPvnkr371qyN87wUXXDBkauiGK6+8csgMukM0j7c/9dRTm0c/nnvuuY1ceg888MCqVatG0uZ2ww033HHHHQMDA0T0zW9+86Mf/eimSjYnXevr61u3bt1OT8OW2e51slErV65861vf+m//9m/XXHNNY+Mo1QkzD5nBe4jtG4+FYXj22WdnP3xUq9Vnnnlm/vz5f/3rXx944IFG293q1av/4R/+4YEHHjjxxBOH2dUee+zRWF68eLExZsjM0kO88sorItJY3Wi+LiLK5/PTp0/f1E6G5Fofia2o4WwyuazHTRa6NwbAH3bYYVmC92nTpnV1dfX19RHR3Llzp06d+vTTT2dlpk6dutHuOdux8jdqo/ft6Nnun9SuYKdc1K7/VDaM/EsEAAAARgkC+M249dZbf/jDHzZWp06d+qtf/aoxp87oeeGFFxrxAG2QMq25x7hz7o477hgyC/RGjR8//stf/vIVV1xBRHEcf+Yzn3n729++0ZJDprV/6aWXdoUAfvvWSfO/rURUr9eff/75K664ovFjzRe/+MVzzz238d/8KNVJGIbNqct3pGKxeNxxxx133HGXX365tfauu+765Cc/mf1rLiKXXXbZc889N8zbm7NbG2MWL1680dmqGoYMr9133303Wmz69Onbt0K2ooazyeSyXPQLFiwolUrNGeyyBWY+6qij7rvvPiKaO3fujBkzGlnQN2x+39BWV/6W3rejZ7t/UruCnX5Ru+ZT2TDyLxEAAAAYJehCP5z58+dfeumljdUwDO++++7mJo7R05yqjYg+9rGPNedSOuigg5pfHXmP8UsvvfTv/u7vsuU5c+bce++9Gy126qmnNq8OmS6YiI4//nhp8tOf/nSEJ7AtRqlOMvl8ftasWf/1X//V2OKc++tf/9pY3TXrZCRE5O4mzWmuGrTW73//+2+66abGlueff374XICnnHJK82pz1W3UkK4oQ96+q2nkoheR+fPnD8lgl2n0op83b95GZ4CnUav8hs3etzB6sr4YmcYEBBtqfqnxlrH7VI7wSwQAAABGCQL4Terp6XnPe94TRVFjy0033bRjJisSkS2aC+2xxx5r5KAentb6e9/7XmP1j3/840aLveUtb2nuV3zbbbc98sgjm9qniPznf/7niE92K41enTSbNm1aY2InImqeUXkXrJMRYuYPf/jD733dt771rU2VPPzww5tX16xZM8xujz/++OYfs7797W+vWLFiU4Xvv//+3/72t43VY489dhfvYt08mdydd97Z6Mnc/BfgmGOOyRaefPLJv/3tb9my1rr5t55RqvwhhrlvYfQ0dzjv7u7O2sk31BycT5o0KVsYu0/lCL9EAAAAYJQggN84a+0HPvCB5cuXN7Z8/OMf32xi8+3loYceaj70SIy8wfnkk0/e7BzmSqnPfvazzVsuuOCCefPmbVhSRC6++OId0OI3qnXSrHl8RLlcbizvgnUycs25pufMmbN69eqNFmvO9UBEra2tw+wzDMPPfOYzjdV6vX7uueduNHR8/PHHL7zwwuYtO2aQ9rZonkyu0UrZ0dHRXJONYD6O48asWkcfffSQbOGjUfkb2tR9C6PnsMMOa17NZiUY4v7772/upt78lrH7VI7kSwQAAABGCQL4jbv66qvvv//+xuqsWbOa+zGOtuZUbZ7nHbYJbW1tjWJbFKx+85vfzOfzw5e58MILZ86c2VhdunTpCSeccM0118ybN69erxNRT0/PL3/5y8MPP3zHNDWPdp00NOdhHtItdlerk5F797vf3Vhes2bN6aef3nx7E5Ex5u67727OGnDIIYdMnTp1+N1+6lOfag5C5s6de9hhh/3oRz968cUXnXNxHD/xxBPXXXfd8ccfn+Vpz5x++unNad53WY2e8JVKJVuYNWtWc8rurq6uxgDjUqk05F0No1T5Qwxz38IoOeuss8IwbKxed911X/jCFxpx+ODg4M0333zeeec1v6U57h3TT+VIvkQAAABgNCCJ3Ub09PR8/etfb97S29t7wgknDPOWs88+e3s1KsZxfOeddzZW3/nOd/7617/eaMnrrrvuS1/6Urb84osvPvvss81TqQ1j7733/tznPnfttdcOUyYb8D9r1qzBwcFsizHmhhtuuOGGG7TWxWKxEbFkJkyY0DwF8fa1A+qkoTFNHW0wXdxo1Ekcx7NmzdrsWTXGYG+dK6644gc/+EHjZJ599tlTTz116tSpb3rTm8aNG9fT07NgwYIhU0A3MgIOo6Wl5e677z722GMbEWNfX98nP/lJIioUCmmabjjf3r777tv8W8wOsNU1fMYZZzRmg89sOILm6KOPHjJ6ecMAfpQqf4hh7ttd0PCfyBlnnPHlL395h53MVttjjz3++Z//uTGbWpIk119//fXXX5/P54MgaPyVaHjb297WfHuM6adyJF8iAAAAMBoQwG+EtXbIlsWLFw8/lfeQvpTb4ne/+13zWMrzzz9/UyXPO++8RrBKRLfffvvIg9V/+Zd/ueWWW5YuXTpMmWnTpj344IPvfOc7V65c2bzdWjskUr3yyiv32GOPq6++eoRH31I7pk4y+Xy+8Q/uhvmitnudiEhz/rNR0tnZedddd5155pmNxmQiWrFixabGx15++eXvfe97R7LnmTNnPvDAA2edddaQobmNlOzNDj/88N/85jddXV1bcu7baqtr+LTTTmtMJpfZMIA/5phjmtOAjRs37i1vecuQMqNX+c2Gv293NcN/IkMSUu7KvvjFLz799NNDErnV6/WsS06zAw44YEiQPNafypF8iQAAAMB2hy70u5zmXOutra1nnXXWpkoeeOCBRxxxRGP1l7/85ZAppoaRy+W+/e1vb7bYoYce+sQTT3zkIx9RauO3iu/7X/nKV771rW8NP9X2NtoxdZJpnofp0UcfHdICRrtMnWypt771rXPnzj3++OOHL9bZ2fnDH/6wOUnVZh155JHz588fpkKIqFgsXnPNNQ8//PCUKVNGvuedq729/dhjj23esmG7cSMRfWb27NkbrYTRq/yGzd63MBqCIPj1r3990003NbLTbSifz//Lv/zLvHnzGlkVGsb0UznCLxEAAADYvtACv2vp7+//3e9+11h9z3veM/w4w/POO+/JJ5/MlpctW/boo48ed9xxIzzWOeecc+qpp/7pT38avtikSZNuvfXWz372s3feeed99923bNmydevWtbW1TZky5YwzzvjoRz+aDQM+8sgjL7jgAmpKzb297Mg6IaL3v//9jYmg16xZc/XVV284Y9xOr5OtM2PGjL/+9a+PPfbYPffcs3DhwmXLli1durRare6999777LPP3nvvfeKJJ55zzjnN+cxHaM8997z11ls///nP/8///M999923ZMmStWvX+r4/ceLEgw466F3vetc555yzY+Zf3L7OPPPMhx9+OFvea6+9NszRfcgh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4AEAAAAAaAEEeAAAAAAAWgABHgAAAACAFkCABwAAAACgBRDgAQAAAABoAQR4AAAAAABaAAEeAAAAAIAWQIAHAAAAAKAFEOABAAAAAGgBBHgAAAAAwLNYtWqVqqrqtm3bJrqWQxcBHgAAAACAFkCABwAAAACgBRDgAQAAAABoAQR4AAAAAABaAAEeAAAAAIAWQIAHAAAAgEPX2972Nv3tli5duudHVq9efdlll82cObNUKi1YsODNb37zypUr97xsy5YtH/vYx0466aTp06eXy+V58+a9/OUv/+pXv5pl2a6XNfe3nz59uoisX7/+Pe95z5w5c8rl8qJFiy677LLVq1fv2XO1Wv3whz+8ePHicrk8bdq0iy+++IEHHgghNGuu1+t7/TSeY80/+clPVLW7u3vPHr7yla+o6pFHHrlbewjhs5/97IknntjZ2dnT03Paaad97GMfGxkZeV7lJc/3fgAAAAAAB41isdje3r5n++joqJnt2X7bbbddeumlw8PDzrkY46pVq1atWvXtb3/7rrvuWrJkyc7LVq5cecopp/T39+9sWbNmzZo1a2688cbrr7/+W9/6lnO7Dyc/+OCD5513XrFYPOOMM0IIN9xww3/8x39885vfvPvuuxcvXrzzsscee+zCCy984IEHmi9rtdr111///e9//+qrr34hz2Hvan6O1q9ff8kll9xyyy07W+6444477rjjX//1X2+//fY5c+Y8x34YgQcAAACAQ9fVV189vIevfe1rqioiV1555W7XX3LJJdOnT7/xxhuHhoaGhoY+//nPJ0nSHBLf9bI3velN/f39M2bMuPbaa1euXLlp06Y777zziiuuEJHvfOc73/3ud3frtlarvf71r7/44otXrVr11a9+9b/+678eeeSRRYsWjY6O/sVf/MXOy/I8f81rXvPAAw90d3dfffXVK1asuO+++z7zmc/EGN/ylre8wEfxfGt+jszswgsvvOWWWzo6Ov7lX/7lwQcfXLVq1Ze+9KXe3t6NGzdedNFFMcbn2BUj8AAAAACApy1fvvySSy6JMX7gAx94xzvesdu77e3td955Z1dXV/Plu9/97tWrV3/mM5+5++67d16zZcuWe+65R0S+8pWvnHPOOc3Gvr6+k046acWKFTfffPOdd9752te+dtduBwYGFi1adNVVV+1smTp16oc+9KHLL7/8V7/61c7GL3/5y48++mipVLrjjjsWLVrUbDz22GNPPPHEnT9o7+xFzc/RV7/61bvuuitJkltvvfWYY45pNs6bN+/oo48+7bTT7rzzznvvvfeEE054Ll0xAg8AAAAAGLd169bf//3fHx4efvnLX/6Zz3xmzws+9KEP7UzvTWeddZaIDA0N7Wwxs+uuu+66665rvrWrWbNmicjw8PCePX/gAx/YrWXhwoUisuuc9n/+538WkSuuuGJnem86++yzX/WqVz377f12e1fzc9Gs+dJLL92Z3ptOPfXUV77ylYcffvi99977HLtiBB4AAAAAICKSZdnrX//6NWvWLFy48Prrr/fe73nN6aefvltLpVLZraW3t/fSSy/drXHDhg033XTTD37wg9/203ddQt+0WwF5nj/66KMi8nu/93t7fvzVr371j3/849/W+bPau5qfi4cffrhZ3p5vPd+CCfAAAAAAABGRd7/73b/85S+7urq+973vTZo06Rmvee47rt1///3f+c537r777pUrV65bt65arf7u62fMmPG7L1i7dm1zN/i5c+e+kMJ+h+db87PatGnT4OCgiBx++OEvvDwCPAAAAABA/vEf//HLX/6y9/5rX/vaEUcc8dsuKxQKz9pVnufvete7rrnmGjNT1fnz55977rkLFiw46aSTvvnNb377299+xk896x7vtVqt+R/NDfZ2k6bpsxa2z2veU6PReMaan8tze1YEeAAAAAA41P3oRz9qbvb+D//wDy9wMXmzky9/+ctpmv793//929/+9l3PS7/xxhv3utsFCxY0z65bu3btbmvgRWTNmjV73bPsu5p3K2P27NmlUqlWq61du/b4449/IRUKm9gBAAAAwCHuoYceetOb3hRCeOtb3/pnf/ZnL7zDb3zjGyLyrne964Mf/OCuSVhEVq1atdfdlkql5kT0n/zkJ3u++7Of/Wyve5a9qrler5vZbo133HHHri+dcwsWLBCRn/70p3v2cNFFF5XL5fe9733PsUgCPAAAAAAcurZt23bBBRcMDQ2ddtppV1999T7ps3mweXt7+27tt9xyy+233y4ie+be56h5rN3VV1+9evXqXdvvuuuub33rW3vXZ9Pzqrmzs1NExsbGmifP7fSLX/zihhtu2K2Ht771rSLypS99aeXKlbu2r1mz5vvf/36twEyUKQAAIABJREFUVjv77LOfY5EEeAAAAAA4RGVZ9oY3vGHVqlWzZs369re/XSwW90m3J598soh88YtfvOGGG0IIMcZ169Z9/OMff/WrX53nuYjcdNNNjzzyyG7LxZ+LP/3TP501a1a1Wj355JOvueaalStXPvroo5///Odf+tKXTp8+vXnNs66lf+E1H3fccc017X/0R390++23hxC2bdt2zTXXnH/++bNnz96t5/e9730LFy6s1+unnHLKl770pUceeWTDhg3//d///apXvWpsbOzYY499zWte81yrNOzioYceaj6W173udRNdCwAAAADsX7/5zW+aCahYLE76LR544AEze+yxx5pXbt26dbdOmkvE29vbd7Zs3Lixr69vZ5zeuX/bW97ylh/96Ec7t6C78cYbf3fPt9xyi4gkSbJr47333jtv3rzdgu3s2bOb95Km6d49iudVs5n90z/9086fvnP/vMWLF990003N/9i18+XLl+92CHzTrFmzHn744edeJJvYAQAAAMChrl6v1+v1Z3wrhPB8e5s2bdp99933yU9+8qc//emaNWva2tpOPPHEd7/73RdccIGIXHPNNddee22lUjnssMP2otTjjz/+17/+9d/93d/dcsst991335QpUy688MK/+Zu/2bx5s4j09PTsRZ97UfP73//+RYsWffazn12+fPnAwMDcuXPf+MY3fvjDHx4eHr788sunTZu2a+dLliy56667PvvZz958882/+c1v8jxfvHjxy1/+8j//8z+vVCrPvUi1vV17cFBasWLFkiVLROR1r3vdC1xBAQAAAAB4Icxs7dq1y5cvP//885/14u985zuvfe1rzznnnJ///OcvQm0TgjXwAAAAAIADkarOnTt31/T+rne9q7u7+7LLLtvz4k996lMict5557149b3oCPAAAAAAgNZw/vnnDwwMXHfddZ/61KeGh4ebjWvXrn3jG994++23t7W1PWO2P2gwhf5/YQo9AAAAABzIPvKRj3zyk58UkSRJ+vr6hoaGmkk+TdNrr732kksuEZF77713t3PmfrelS5fuuTHeAYhN7AAAAAAALeMTn/jE+eeff9VVV913333r1q3r7Ow87rjjlixZ8t73vvfYY49tXvPFL37xeZ1pf/XVV//xH//x/ql3X2IE/n9hBB4AAAAAcGBiDTwAAAAAAC2AAA8AAAAAQAsgwAMAAAAA0AII8AAA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GAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAAAGAIEOABAAAAABgCBHgAAAAAAIYAAR4AAAAAgCFAgAcAAAAAYAgQ4AEAAAAAGAIEeAAAAAAAhgABHgAAAACAIUCABwAAAABgCBDgAQAAAAAYAgR4AAAAAACGAAEeAAAAAIAhQIAHAAAA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BwAAAAAgBQjwwEH7+7//e30/o0aNKnTV0G+tX79+/vz5w4YNKykpOfHEE2+99dZcLlfoSuFIQaOHgrjxxhuHDh26v6O0ijjcergDaRVRQAR44KCtW7eu0FXAkeW1116bPn36okWLmpqaqqur16xZ841vfGP27Nn8tYreQaOH3tfQ0HDfffft7yitIg63nu9AWkUUEAEeOGhr164VkebmZnu3jRs3Frpq6IfMbO7cuXV1dV/4whd27dq1adOmN954Y+TIkc8888ztt99e6NrhiECjh96Uz+effvrpT37ykzt37nzfArSKOKw+8A4UWkUUlJpZoesApEkURSUlJdXV1Zs3by50XXBEeOyxx2bPnj116tTly5c71/Wt61NPPXXuuecOHz78nXfeUdXC1hD9G40eetONN9744x//OIqi5MchQ4Zs3759nzK0ijh8DuQOpFVEYYWFrgCQMrW1tVEUjR8/vtAVwZHi7rvvFpH58+d3/50qIjNmzBg+fHhdXd0rr7wyderUwtUO/R+NHnrT5MmTr776ahFpa2u755573rcMrSIOnwO5A2kVUVgEeODgJIOmTjjhhPvvv//hhx/evHnzuHHjTjvttCuvvDIM+R8KH77kljvnnHP23qmqZ5999sKFCzdu3MifqjisaPTQm2644YZko76+fn/xiVYRh8+B34G0iigUbjLg4CTTltx9990/+tGPkj1PPvnkHXfc8e///u8LFy484YQTClo79ENbt24VkfdOhJvsqaurK0CdcCSh0UNfQ6uIwqJVRGExiR1wcLrnHf3hD3+4YcOGhoaGJUuWTJ48+bXXXluwYEEcx4WtHvoZM0v+GB08ePA+h6qqqoQ/VXH40eihT6FVRMHRKqKw6IEHDs6MGTNGjBgxa9as7hF6s2fPfvbZZ8ePH79ixYqFCxdefvnlha0h+qX9zcnEmkk43Gj00DfRKqJQaBVRWPTAA++voqJC9/Kd73wn2T9nzpybbrppn+frBg0adNVVV4nIihUrClBX9F+qWl1dLSINDQ37HEr2jBw5sgDVwpGERg99Cq0iCo5WEYVFDzzw/ubOndvZ2dn948SJE3sunzzyVFtbe3irhSPPyJEjN2/evGPHjtGjR++9f8eOHcKfqigcGj0UCq0i+iZaRfQOAjzw/u6666737mxubr7nnnvKy8uvuOKKfQ5t27ZN9rTdwIdo7NixL7300gsvvHDaaaftvX/p0qUiMmbMmALVC0cEGj30QbSKKCBaRRQcQ+iBg1BeXn7bbbd95jOfWbVq1d77vfcPPfSQiEybNq1AVUO/deWVV4rI4sWL9965cuXK2trak046idWScFjR6KEPolVEAdEqouAI8MBBUNVrrrlGRObPn//6668nO5uamm644YZly5adccYZF198cUEriH5o9uzZo0aNeu65526//fZkz+7du5O/Xz//+c8XtGro/2j00AfRKqKAaBVRcGpmha4DkCZRFJ1//vlPPPGEc27UqFGZTGb9+vX5fH7cuHGPPPII46ZwOKxcufKCCy7Ytm3b2LFjjz322BdffLGtre2qq6766U9/GoY8CYXDi0YPBVFfXz98+PAhQ4Zs3779vUdpFXG49XAH0iqisAjwwEHL5XJ33nnnz3/+840bN+bz+cmTJ8+cOfOmm24qLi4udNXQb61bt+6mm2569tlnm5ubR40a9Xd/93f/9E//tL9VlIAPF40eel/PAV5oFXGY9XwH0iqigAjwAAAAAACkAM/AAwAAAACQAgR4AAAAAABSgAAPAAAAAEAKEOABAAAAAEgBAjwAAAAAAClAgAcAAAAAIAUI8AAAAAAApAABHgAAAACAFCDAAwAAAACQAgR4AAAAAABSgAAPAAAAAEAKEOABAAAAAEgBAjwAoL+ZNWuWqs6aNauHMkuWLFFVVV2xYkX3Tt3j+uuv7/ktFi9e3F34t7/97f6KTZs2LSlz7rnn9nC2L37xi/p+ioqKJk6cOGfOnAceeKDn+gAAgCMBAR4AgH09+OCDcRz3UOBAEvXatWu7vx145plntm7derDVyOVyNTU1v/nNb+bNmzdr1qz29vaDPQMAAOhPCPAAAOxr+/btzzzzzP6O5nK5Rx555ANPcu+994pIGIYi4r2///77ey5fVVX16rs99dRTP/jBD0aPHi0ijz/++Le+9a2DuwyRW2+9VVV7uBYAAJAiBHgAAN6lurpaRHrI24899lhTU1NSrAe/+tWvROQTn/jEKaecInvyfA8ymczJ7zZjxowbb7xx9erVkyZNEpHbb799x44dB34h+Xz+7rvvPvDyAACgjyPAAwDwLpdeeqmILF682Hv/vgWS8fNJsf157bXXampqRGTBggXz5s0TkaVLl/7pT386hPqUlJR8/etfF5E4jlevXn2Ar2psbLz22mvXrVt3CO8IAAD6JgI8AADvMn369Orq6vr6+ueee+69R6Moeuihh0Rk7ty5PZwk6W8vKyu78MILk5JmtnDhwkOr0oQJE5KNN998s+eStbW1X/3qV+fMmXPUUUf94he/OLS3AwAAfRMBHgCAdwmCIOldX7Ro0XuPPv300zt37jz++ONPPfXUHk6SBPg5c+aUlpZOmDAhGQP/gaPo96e7637EiBE9l1yzZs13v/vd3/zmN62trYf2XgAAoM8iwAMAsK9PfepTIvLAAw+8dxR9Mn5+3rx5qrq/l7/44oubNm0SkcsvvzzZk3TCv/zyy+vXrz+E+vzwhz9MNk4++eSeS5555pndc+A9/vjjh/BeAACgzyLAAwCwr7PPPnvo0KF1dXXPP//83vu99w8++KB80Pj5ZPq6qqqq2bNnJ3uSx+BF5L777jvwajQ2Nr7wwgsXXnjhkiVLkpMcd9xxPb+koqKiew68k0466cDfCwAA9H0EeAAA9hUEwSWXXCLvmYv+D3/4Q319/dFHH3366afv77Xe++RZ93nz5mUymWTn5MmTx40bJz0G+Lq6On23QYMGnXXWWcmSdccee+z3v//9D+PiAABAWhHgAQB4H92j6M2se2f3/PM9jJ9/+umn6+rqRGTBggV770864VetWpXMTn/ghg4d+vnPf3716tXDhw8/qBcCAIB+Jix0BQAA6ItmzJhRVVW1ZcuWpUuXnnnmmSJiZosXL5a9xsO/r2T8/LBhw0488cSdO3fufcLvfve7InLffffdcsst731hVVXVE088sc/OYcOGfeDEdQAA4AhBgAcA4H2EYThnzpyf/exnixYtSgL8Sy+9tHnz5urq6rPOOmt/r8rn80nI37Zt27Bhw963zP4CfCaT+cA56gAAwJGMIfQAgP4mGd+ez+d7KNN91Ln9/ipMetrvv//+ZBR99/j5Hl6yZMmShoaGnqu3Zs2a1157recyAAAA70WABwD0N1VVVSLS86Pm3UeHDh26vzIzZ86srKzcvHnzsmXLROTAx88PHDiwo6PD3mPlypVJsYOaix4AACBBgAcA9DennnqqiGzbtq07MO/DzB5++GERGTFixFFHHbW/82QymYsvvlhE7r///ldffXX9+vVVVVXnnHPO/sq3t7c/9NBDIjJnzpyioqL3FvjIRz4yZswYIcADAIBDQoAHAPQ3CxYsqKysFJHLLrusvr5+n6Pe+29+85vPPfeciPzDP/xDD/PJy16j6JP15C655JIgCPZX+OGHH25paRGRT3/60/srk0xuv2HDhuXLlx/4FQEAAAgBHgDQ/4wcOfKnP/2piKxbt27MmDFf+tKXHnjggeXLly9ZsuQHP/jBKaeccuutt4rI7Nmzv/zlL/d8qlmzZg0cOLC2tjZZg33u3Lk9FL733ntFpKqq6rzzzttfmfnz5ycbdMIDAICDRYAHAPRDl1566U9+8pNhw4a1trZ+73vfmzdv3mmnnXb++ed/8Ytf/OMf/+icu/rqq++5556eu99FJJvNXnTRRSLS1NQ0aNCgmTNn7q9kY2Pjo48+mrx1GO53kZe9R9HvvcI8AADAByLAAwD6p2uvvXbdunW33XbbxRdfPGnSpNLS0mOOOebcc8/93Oc+9+qrr955553JXHcfqHvWuosuuiiTyeyv2K9//evOzk4Rueyyy3o+YdIJv3nz5hdeeOFALwYAAEBE+fofAAAAAIC+jx54AAAAAABSgAAPAAAAAEAKEOABAAAAAEgBAjwAAAAAAClAgAcAAAAAIAUI8AAAAAAApAABHgAAAACAFCDAAwAAAACQAgR4AAAAAABSgAAPAAAAAEAKEOABAAAAAEgBAjwAAAAAAClAgMw1XIEAAAA4SURBVAcAAAAAIAUI8AAAAAAApAABHgAAAACAFCDAAwAAAACQAgR4AAAAAABSgAAPAAAAAEAK/H8cPEmIez72sQAAAABJRU5ErkJggg==" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> <p>Let’s color the points by the AUC values for the other gene set.</p> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9IFwicmlnZ2lfYXVjXCIpICsgXG4gIGdncGxvdDI6OmdndGl0bGUoc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV3aW5nX2dlbmVfc2V0X25hbWVzW1tcInJpZ2dpXCJdXSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcXF9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiKSlcbmBgYCJ9 --> +<!-- rnb-source-begin eyJkYXRhIjoic2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9IFwicmlnZ2lfYXVjXCIpICsgXG4gIGdncGxvdDI6OmdndGl0bGUoc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV3aW5nX2dlbmVfc2V0X25hbWVzW1tcInJpZ2dpXCJdXSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcXF9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiKSkifQ== --> <pre class="r"><code>scater::plotUMAP(sce, colour_by = "riggi_auc") + ggplot2::ggtitle(stringr::str_replace_all(ewing_gene_set_names[["riggi"]], "\\_", " "))</code></pre> <!-- rnb-source-end --> -<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= --> -<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAANhCAIAAADSYEQJAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAgAElEQVR4nOzdebwcVZk//uc5p6p6uVtWMCRAYiAsQtiXsIQR2VRQcVBkgIwwyqgsooMvHR0F5+UyjuiouAEqgxGRJcNXVMYRfxFkTUKIITAEAtlIQpK75G69VZ3zPL8/6qanvTf35ia3bxLC5/1HUl196vTpU6e6bz19FlZVAgAAAAAAAACoB7O7CwAAAAAAAAAAew8EGgAAAAAAAACgbhBoAAAAAAAAAIC6QaABAAAAAAAAAOoGgQYAAAAAAAAAqBsEGgAAAAAAAACgbhBoAAAAAAAAAIC6QaABAAAAAAAAAOoGgQYAAAAAAAAAqBsEGgAAAAAAAACgbhBoAAAAAAAAAIC6QaABAAAAAAAAAOoGgYZBfepTn+LtyeVyM2fOvPjii5955pl+h2/atKk25Ve/+tXBXmj9+vU/+MEP3v3ud8+YMaO5uTmXy02ePPnMM8/8l3/5l9dee234Bd65fIZfzqqPf/zj262ZWt/61reI6Bvf+Ebtzvvuu69fts65fD5fTXDOOecMfOlPf/rTtZk8+uijQ7+FsWPHVvc3Nzdv3Lhxm+/ou9/9bm0Or7766mDvvV4na6AlS5Zcd911559//tve9raGhoZJkybNmjXrkksuuemmm1566aVhZvKlL32p9o1MnjxZRIZIP8JGPtD8+fM/9alPHXvssZMmTcpkMvvtt99xxx13/fXX//nPf1bV4byFFStW/Nu//dvb3/72qVOn5nK55ubm6dOnv+td7/re9773+uuvD3HgwJKPHTt2my86d+7cgYkvv/zyITLf0YodzIUXXjhEVbe0tJxwwgmXXnrpXXfdNbDkdT9ZO13V/ez0RbFznySpEV7a2/zQuPbaa3eoPKkFCxbUsW7rfparatvetGnTBkt2ySWXVJNNnDhxsBwGGrr1AgAAwJuOwiCuv/764Vejtfamm26qPbzfH75f+cpXBr5ER0fHpz71qUwmM1i2URT94z/+4+rVq4cu6kjyGU45+/nYxz42/JohoptvvllVly5dWrvzhhtu6JftkiVLahM0Nzd77/ulmT17djVBU1NTHMdDv4UxY8bUPjVnzpxtvqPvfOc7tcleeeWV+lby0J577rkLLrhg6Dq87LLL2tratpvV9OnT+x04f/78IdKPsJHXWrBgwaxZs4Y4/OSTT16yZMkQhdm8efNHP/pRa+1gOeTz+c9//vPlcnmbh2/zkOeff35gyo9//OMDU1522WVDlG1HK3Yw73vf+4ZR00REs2bNWrZsWe2xdTxZI6zqqhFeFDv3SZIa4aW9zQ+Na665ZofKk3r66afrWLd1PMv91La9qVOnDpbsQx/6UDXZhAkTBsthaANbLwAAALzZoEdDfXjvb7rppkceeWT4h7z00ksnnnjif/zHf1QqlcHSxHF86623HnXUUc8999xo5zPaZs6cOXny5OrDRYsW9UuwcOHC2ofd3d3Lly+v3SMizz77bPXhmWeeGYbhDpVh7ty5Tz311A4dkhq9Sl64cOGpp576m9/8Zuhkv/jFL97+9rdv2bJliDRPPfXUwL4Yd9999/ALM7QhGvk999wze/bsoev26aefPvHEEx988MFtPvvSSy+dfPLJt99+u/d+sByKxeLXvva1s846q6OjY5hlfuKJJwbu3NE2MNoVO9iLvuc97ykWizt3+BAnq15VvUd98uz0pV1fo9SMB7MT3zu7xghbLwAAAOwFgt1dgDeMo48+uvah976jo2PDhg1a81PqddddN8y/p9esWXPaaae1tbX12x8EQRiGpVKpdmdXV9c73/nOp5566oADDhilfHYaMx911FFDp6n2vz3vvPN++tOfptuLFy8WEWP+L9Q1MPTw9NNPH3744dWHL7/8cm9vb/Xheeedt6OlVdVrr7124cKFta+7XaNXyUmSXH755T09PdU92Wx25syZ++yzT3t7+6uvvrp58+bqU8uWLbvhhhuqFTjQL37xi4E7582b9/3vfz+Kou0Whna2kT/88MOXXHKJDuhT0NDQUCqVaocYJEnygQ984OGHH67tmUJE69atO+OMMzZt2tQvh8bGRudcuVyu3fn444+fc845jz/+eDab3e47evLJJ6+66qraPYVCYdmyZds9sNbIK3aboiiqbd49PT2vvfZaHMfVPatWrfqXf/mXb3/729s8fOdOVr2quu4XxQ59kgy0c5d2P5MnT+5Xq0T04osvViMpTU1NA/u25PP5dGM0mnF9v3fqaIStFwAAAPZ+u7E3xR6uXxfWbaZZtmzZfvvtV5tsy5Yt6VND9OeP4/i4446rfXbMmDHf+973nn322XK5LCJr1679+c9/ftBBB9WmOemkk/q9el3yGeHQiWw2O/wqvf/++2tfq1+39pkzZ6b7mTnduOqqq2oTzJ07t/bwlStXbvct9Otfnbrtttv6FWyIoRP1Olnb9Nvf/rb2qA9/+MPt7e3VZ51zDzzwwIQJE6oJrLWtra3bzCqO4/Hjxw98s0T04IMPDlaAETZyVW1vb993331rn50yZcrcuXNXrFghInEcL168+AMf+EBtgre97W1JklRzSJLkpJNO6lfDP/rRjzZv3pwmWLVq1U033RQEfxUVveKKK/qVc5vv/aCDDuqXbP78+dtMOdjQiZ2r2MEM3X09juPvfOc71fZPRPvuu2/12ZGfrHpVdb0uip3+JNERX9rD/9w79NBDq8nOO++8wZLVq25HfpYHU9+hEzvaegEAAODNBoGGQQ3nDz5VveWWW2qTPfroo+n+If6QvfXWW2ufmjVr1po1awbmnCTJpZdeWpvyscceq01Ql3x2ZaChs7Oz9u/sO+64o/pUoVCojmqudlWYOXNm7eG1Z2TGjBnDeQvbvBuZMGFCR0dHbc5DBBrqdbK26bOf/Ww1fTq/4MA06YSXVffee+82s6odkhBF0cEHH1x9mHY32KYRNnJV/fKXv1z71Omnn75p06aBOfTrVvCrX/2q+lS/PhrHH3/8qlWrBubw5JNPTpkypTblokWLahPUPlX79jdu3FibrDpX6D777NPS0lJNNligYecqdjDDudm78sora99LdW6OkZ+selV1vS6Kugcahn9p1z3QUK+6HflZHsxoBxpSg7VeAAAAeLPBHA0j9da3vrX24XZnDVDVr3/969WH2Wz2V7/61TZ7FAdBcNttt9X2Fn744Yfrns+u1NLScsopp1Qf1k7K8Oyzz6ajmpn56quvTnc+//zztWMlaqdY34lxE9VARltb24033jicQ0a7kmt7nu+33361PwZWzZ49e9asWQdtVSgUtpnVXXfdVd0+55xz5syZU3344IMPjnCw9GCN3Hv/gx/8oLo/iqK77rprn332GZjDt7/97cbGxurDp59+Ot0Qka985SvV/dlsdt68eVOnTh2Yw6xZs37yk5/U7vnXf/3XwQo8a9as6ul+8skna5+qjuQ/5ZRTtlnh/YxqxW5Tv3Elw19zJDXYyapXVe+Bnzw7cWnX1yg14yHs6PfOLjPC1gsAAAB7DQQaRmrFihXVbWvtjBkzhk7/7LPPrl69uvrwk5/85BDjlvP5/HPPPffKVtU78Drms4u9853vrG7XTspQDToccsgh73jHO9KODyJSDS6ISO2yFDsRaDj//PMnTZqUbv/whz8czkD90a7kAw88sLq9ZMmSfiMpqp588skVW334wx8emKCnp6f2h/eLLrqodrRCoVAYbArGYRqskS9ZsqR2FomPfOQj+++//zZzaGho+Na3vnXNVtV+AYsWLVq1alU12dA1fO6555555pnVh7///e9r41C1mpubjzzyyHR7sEDDqaeeOtgLVY12xQ7H2LFjdyj9YCerXlW9B37y7MSlXV+j1IyHsKPfO7vLjrZeAAAA2Gsg0DAiy5cv//d///fqw0suuWSw4dxV/X7Tq+2nuk1vectbpm9V+1txvfLZxWoDDUuXLq3OslYNNJx44onpKvHpw+pP38uXL6/+mJ/JZM4444wdfemmpqbqyfLeX3vttds9ZLQr+ZhjjqluO+cuuOCC00477Rvf+Majjz7a3d293cOr5s2bV51+LwzD9773vYcccki1Donol7/85fBz62eIRv7YY4/Vphy6fq666qpbtvrEJz6R7vz9739fm+aKK64YujAf+chHqttJkgw24QIRnXbaaelG7cITL7/8cnt7e7pd27lmMKNasYOprdUgCPrNdDC0IU5Wvap6D/zk2YlLu75Grxlv00587+wyI2m9AAAAsDfBqhPDdcIJJ9Q+9N5v2bJl7dq11Un1Dz/88Jtvvnm7+fRbJ2/gHObDVK98RqhcLg/d//wjH/nI7bffXn141FFH7bfffhs2bCCiJEmWLl164oknUk3vhvThySefnK5kWQ001I6bmD17dnWm9x1y6aWX/uhHP0p/4n700Ufvueeeiy++eIj0o13J559//jvf+c7//u//ru554okn0htjZp46derMmTOPOeaYs88++6STTqr2Dx+odlmEs88+Ox2+/oEPfKA6F/3//M//bNmyZbu/Lu5oI1+7dm1t+mnTpg2d/0Avv/xydTsIgn4dwgeqnSKBhuyYfeqpp37/+98nosWLF5fL5XRu/2p3hkwm0286w22qV8UOk3Putttuu+OOO6p7Dj300MF6xe/oyapXVY/SRbGjnyT97OilXV+j14zr9b2zC+xQ6wUAAIC9Hno0DNczf23JkiWrV69O/9oLguBjH/vYn//8537T729Ta2trdXvfffdtamrql+CJJ57gQVxyySV1z2fXqx31kMYX2tvbV65cme5JAw3V+durgYbFixdvM4cdwsy33HJLdQG8G264Yegx9rugkufOnTtnzpyBt1iqumrVql//+tc33XTTqaeeOmHChC984Qv9VshLrV+//k9/+lP1YbVvf20n/ziO582bt93C7Ggjr/YOIKIoivrNhD8ctWsBTps2bbu3Jf3u0AYuJVhV7dEQx3E1SlUNNBx//PGZTGbo16pjxW7Thg0bTqhx2GGHtbS0XH311bULgn7+858f7PAdPVn1quo985NnRy/t+hq9Zlyv7526G2HrBQAAgL0eAg11MHbs2COOOGLgH9zbpDXT4ydJstMvWq98dr13vetd1e10xES1O0MmkznqqKOI6OSTT073bNq0ac2aNfTXPRrOPffcnX71Y489ttpved26dV/72teGSLwLKnn8+PF33nnnM888c8011xx66KGD/ajb2dn5ta99bebMmR0dHf2euvvuu6t/3Kfd+9Ptfp3877777pGUc5uNvLZ+wjCs3ubtnOFMzRhFUW2yIU7KlClTquPkq9M01M4Eud3XGu2KTSMgVcuXL+93bzx79uyduzPf7ifSSKp6j/3k2aFLe/TUtxkPYYe+d+pu9FovAAAA7B0wdKIOWltbr7nmmgULFvz85z/fbuLaX586OjpaW1trZ2UfvnrlM0LMnIYGBjNwdsCzzjorCALnHG0NMVQnaDj66KOjKCKigw8+eOzYsVu2bCGip59+esqUKX/5y1/SNFOmTHnb2942kjJ/9atfvffeezs7O4no5ptvHmJA9S6r5GOPPfbYY48loq6urueee+65555bunTpU0899cILL9Te161YseL666/v18xql0U466yzarvx13byf+SRRzZs2LATnQ5S22zktSPDC4VCW1vbhAkTdijb2hpeuXKlc652AdSBVqxYUVshQ7+d0047LZ1DIR2N0tPT8/zzz6dPDWcmyF1TsYN5//vf328VyeHb5smqV1WP0kWxE58kAw3/0q6vUW3Gg9mh751dbCStFwAAAPYO6NEwXP3WBS0Wi4sWLZo1a1Y1wdy5c2uXURhMvyHNL774Yr8EDQ0NR9fo18m27vmMUCaTWTKkL33pS/0OqV3kcvny5d3d3bUzQaYbzFw7euLFF1+s/lw2ku4MqQkTJlSXlKtU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cMEF/XI44IADHnnkkYExl46OjoFzZM6aNesPf/jDMH+vPvHEE/vd451yyim1HWcG2pUVOxqGPln1quq6XxQ7/UkymOFc2vU1es14oJ373rn55psHdgorlUppt4ta06dP//Wvfz30lQIAAAAwBAQaRmratGnV7aeeeqq1tXWYBx522GELFy686qqr+t2hVWWz2VtuueWzn/3sMcccswvy2cVaWlr6LTF4wgkn9EtTXXgidc455xhT5xabzWa//e1vbzfZ6FXycccdt3jx4iuuuGKICd6JaOLEiXfccUft8hO1yyI0NTUNvHuvmjFjRm2n7l/96lf617//b9d2G/lHP/rRP/7xjzNnzhwik/PPP3/ZsmWD3XMefvjhCxYsmDNnzhCnOJfLfe5zn5s/f/7wV87L5/P9zsh2Z4LclRU7GrZ7supV1Xv4J88wL+36GqVmPNDOfe9EUfTb3/72y1/+cj6fHyyNMebyyy9fvHjxpEmTdrp4AAAAAEPd28BwXHTRRQsXLky3N23a9PnPf/72228f5rETJ0689dZbP/OZz9x3330PPfTQ6tWrN2/e3NzcPGXKlHe/+91XXHFFumT98ccfnw51rv3jcjTy2cXe9a53Veer33///Qf+XTtz5sxcLlf9Vfzcc88djWJceOGFZ5111h//+Mehk41eJU+bNu1nP/vZjTfeePvtt7/88surV69evXp1sVg88MADDzzwwKlTp55xxhnvfe97+/2G+bvf/a768P3vf//QP41ecsklzz77bLq9Zs2ap556arv327WG08j/5m/+ZsmSJQ899NBvfvObJ598cuPGjV1dXS0tLZMnT541a9Yll1wye/bsoV9l3333vfPOOz/3uc/NmzfvD3/4w+rVq1tbW4MgmDhx4iGHHHLeeed98IMf3Imbn9NOO61aeNreBA27uGJHw3BOVr2qeg//5BnmpV1fo9SM+9np7x1r7Ze+9KVrrrlm7ty58+fPX7p0aVtbm3Nu/PjxM2bMmD179pw5c9KzBgAAADASvCf8BAcAAAAAAAAAewcMnQAAAAAAAACAukGgAQAAAAAAAADqBoEGAAAAAAAAAKgbBBoAAAAAAAAAoG4QaAAAAAAAAACAukGgAQAAAAAAAADqBoEGAAAAAAAAAKgbBBoAAAAAAAAAoG4QaAAAAAAAAACAukGgAQAAAAAAAADqBoEG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p5/+8MMPR1G07W3Tpk1T1a5du+44w8MPP6yqhxxyyHbjSZL87Gc/O/roozt37lxeXj5q1Kif/vSnuVyuReVxRgMAAAAAYB/ywQcfnHjiiWvXrhUR53b5X983bNhw0UUXvfrqq/m3q1evfvDBB59//vnvfOc7rby5lebOnTtu3LjFixc3jSxbtmzZsmV//etfJ02aNHny5M/4Up9t9erVX/rSl1555ZWmkTlz5syZM+eZZ555/PHH+/bt28x5WNEAAAAAANhXxHH8pS99qUePHs8999y6devyKxp26rLLLnv11Vc7deo0YcKExYsXv/XWWz/4wQ/Wrl174403tvLm1vDef+lLX1q8ePH+++//0EMPvf/++2vWrJk1a9b1118vIlOmTHnqqad2e/KxY8e+8sorZWVl995777x58z744INf//rXFRUVM2bMOPPMM5MkaeY8rGgAAAAAAOwr1qxZE4bhe++9V1xc/Bm3/e1vf3v++eedcy+//PIRRxyRHzziiCP69et39dVXt+bmVlq6dOn8+fNF5JFHHjnhhBPygxUVFUceeeT8+fNfeeWVN998c+zYsbsx86RJk2bMmBGG4d/+9rdRo0blBwcOHHj44Ycfc8wxCxYseP75588555zmTMWKBgAAAADAPuSmm2767JRBRO69914RueCCC5qCg7wrrrjigAMOaM3NrdSlS5fJkydPnjz5+OOP3+5Sr169RKS2tnb3Zv7f//1fEbn00kubUoa8o48+euzYsYcddtiqVauaORUrGgAAAAAA+5Dt4oCdWrBggYicfvrp242HYXjSSSdNnDhxt29upR49enzxi1/cdqSurm7JkiWvvvrqlClTWjPzwoULRWTMmDE7Xnr88cdbNBVBAwAAAABgH/K5qwySJPnggw9EJN+iYjvbDbbo5kJ58cUXn3rqqbfffnvJkiXr169v/YRr1qyprq4Wkf79+7d+NoIGAAAAAMA+5HP3TcRxHMexiOy0CWUYhrt9c+vV1dVdfPHFzz77rIh06tRp1KhRQ4cOHTRo0OjRo3/9618//PDDzZzHzLZ929DQkP9HOp1ufZEEDQAAAAAAfCKTyRx44IHLli2rrKzc8eqKFSt2++bW++lPf/rss88WFxf/6le/uvTSS4MgaLr04IMPNn+eNWvWbPv2gAMOKCoqamhoWLZs2ciRI7e7uaampq6uLpPJdOnSpTmTcxgkAAAAAACfcvDBB4vIyy+/vN14kiSvvfZaa25upfxahuuuu+6yyy7bNmUQkc2bN+/0kWw2u936BRGZNWvWtm+dc0OGDBGRF154YccZLr744l69ev34xz9uZpEEDQAAAAAAfMq1114rIk8++eTcuXO3HX/ooYfyJzLs9s2tlA8XdtymMXv27B0zgvLychGpr69/5513trv5scce2+7mK6+8UkR+85vfLFq0aNvxd95556WXXhKRU089tZlFEjQAAAAAAPApY8aM+eIXv+i9P/nkk3//+98vW7bs3Xffvf3226+66qqePXvKx3/w78bNrXTssceKyIQJE5544olcLpckyZIlS2699dbjjjtu69atIjJ//vwkSfI3jxgxIpVKiciXv/zlN954I0mSTZs2TZw48bTTTmu6p8l111138MEH53K5L3zhC/fff/+iRYtWrVr1xz/+8fzzz4+i6Mgjjzz77LObWSRnNAAAAAAAsL3f/OY31dXVr7zyyhVXXNE0eNppp51wwgm33XZbaWnpbt/cGrfffvuUKVMqKysvvPBCVQ3DMIoiETn33HOPPfbYH/zgBy+//HL37t2feeaZE044obS09K677vr2t789f/784447LpVK5W8Wkcsvv3y7Mx3CMHzqqacuvfTS2bNnX3PNNdteOvDAA//0pz81/5xIVjQAAAAAALC97t27v/DCC//5n/95/PHHl5aWDhw48LbbbvvLX/5SVVUlIl27dt3tm1ujW7duc+bMufHGG4cPH15cXNypU6ezzz77iSeemDp16g033HDOOecUFRWlUqmmUOCGG26YOnXqaaed1qtXr3zKkE6n/+u//uvmm2/ecfIhQ4b84x//uPPOO88999xevXr16NHjhBNOuP322xcuXHjQQQc1v0jd8UyIfdnChQuHDRsmImPHjn3iiSfauxwAAAAAQDuor6/P5XKpVKqkpGS7S2PGjHnmmWduuOGGe+65Zzdubkc1NTXLly8fNGjQjnUWFisaAAAAAAD4lPvuu69Lly75AxG29dFHH02bNk1EzjzzzN27uR2Vl5cPHz68rVMGIWgAAAAAAGA7Y8eOTafTc+fOveWWW/KHLJrZO++8kz8ZccSIEWecccbu3bwvYOvEp7B1AgAAAAAgIhMnThw/frz3PgzDioqKTZs21dfXi0i/fv1eeOGF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9LY+zjbzQe99XV2diHTr1m27S927dxeR2tralhaznfyKBlWdMGHCWWed1blz5zfffPPGG2986623Lrvsstdff72ZjS0Koq2ChpkzZ06aNGnSpEmrVq0ys89/AAAAAPhn1blLyfBRB6xasdFUxEw+/vPeRd4CyR+pkBSl8nsfXM6LEwvUbdkqkVdxviQtqlaUdnVZzcVWlDLRIPIaBKaqIuq9SP7YSFEv5lRUxZuomGvqYyH5fRY12Wxc5RYtWvPB++sOGsweCuDzVUd135n+qaAhsng3Tm24eua9Tj55qjjMPHb8rc15UFVTqVQURbsKB1ufApx11lmDBg069dRThw8f3jQyevTooUOHzpgx49FHH73kkkta+RHNV+Cg4Z133snnC0uXLi3szAAAAEB7GXDQfs7pluq64uJ0bTayT1pVStDgfSI+peJckglN1Vys3jQba33ktuZ8cSpIEgsDrc1qnGgisjWWTFqcehUJNH9mZONRkiYWSD5lUBMfqATq80dMirMgkMiHNVGu3M19p/KJJ2d+97vnsagB+Fxmtjm34+qDFv9tvyWX2/Zt87dOqGqvXr1Wrly5adOmLl26bHsp38CxT58+LS1mO+edd96Og127dh0/fvzdd989c+bMvS9oWLhw4aRJk/70pz8tXrx42/GDDjrooosuKshHAAAAAO2lpDQz8qgB3tubM5dpPhT45NhHcZF3sZjzYmIpNS9BTSSWuNqsL06pqOa8NCSamJr54iINAsm3rggC71RUxGn+IEkL1Zy6XCJipo1NKCRwQTZRn1jKaWxiJg1xTnXVh1UzZi79wug9uvUa2BuZaNIGZzS0aM7evXuvXLlyw4YNAwcO3HY8HzT07du3wMV9bMiQIVKIMyBapFVBwwcffJBfvzB37txtx/P5wrhx40aNGtW68gAAAIB/Ciecekj15rr6htym19/LJl5UZdsNwtbYM0LrkqAhcqpSF4mIqFMT8aaxVzMLQs23v4xjZ96KRFR80Pi3ipqZqCZeveUnt0DU+7AmNnUu9iIigdNcIpJocWr1muo331p29JEDgmDPbb0G9kZmLWtF2UwtmnPIkCFvvvnm9OnTR48eve349OnTRWTw4MGtqaSmpubZZ58tLS09//zzt7u0bt06EdnDbS93J2iorKx89NFH//SnP82aNWvHq2+//Tb5AgAAADoY5/T8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kzeLaHtHjoimTB69x9UmTxl95FET2rsKQgB274FPABMBFHtZeu8z5b40Yw5qh0tGw+OPP37TTTcNw4EHY78yGkTkmWeeue++++6///4tW7YkG2traz/96U9/5jOfWbRoUSqVGoqTNMYYY4wx5jAxqWEsgDAVHHNiw3trGrs6c6paLMaxiHMuIIwaO6JqZAUA72Xjxh1RFB8xu766OrvH1WYdOT78k8vFkTKgRH/98aoCRMmMC92waUf5L86YgxQpqAyjEfdhze3bt3/nO995+umnN23atGDBgssuu+yaa64Z1Ar/8i//snr16m9+85tlWn9I7EugQUSeeuqpZcuW3X///du2bUs2jhkz5sILL7z00ksXLlwYhuGQnqQxxhhjjDGHiXknNcw/Zfprz6+bNG3McSdPj4q+s7M311vc3tLd2tQRjEgjm2re0VUsxh2d+blHTRwzuuqcs47a22qpVLBo8bxHnn67EEVg2nVqppYaP5BAABSL3ntxbih7tBlzyFBQGUZRDnbN11577VOf+tTGjRvT6XRdXd1DDz300EMPPffcc7fddhvzgP5uPvjgg0899dSYMWPKtP5QGUSgwXv/l7/8ZdmyZQ888EBTU1Oycdy4cRdddNGll1569tlnO+fKc5LGGGOMMcYcJqpHVpxzwXHi9fUX1u3Y3llVnXWOWDVUnT5nvCdMOWZSMpZimuO5R08647TZqdQH/dJ+9DGTR42s6G7pgIru2mGSUGo4KQRSF6BQiCsqLOPYfDjtXlg0NAazZrFYvOyyyzZu3Hjdddf94Ac/yGazq1atWrRo0R133HHsscded911H7Dvyy+//NRTTz366KN//OMfy7H+kBtooOFLX/rSgw8+2NzcnHxbX19/8cUXf+Yznzn99NMtvmCMMcYYY8zAHTl/SrYyPXJUZduObgBvvLh+7onTJk8fd/QJ0+adPH1HW0++EI2oyk4YX5NO/+1MYXZ8yokzNv35FYVS0qlh53+gKsQEUPWITDo9xJ3gjTlkHAQZDb/5zW/efvvt+fPn//jHP07yC4466qi777570aJFN99887XXXrt77dMubrrppmXLlpVv/SE30H9r7rjjjuSLJMRw2mmnOeeampr+5tUCuPzyy/f9BI0xxhhjjDnsTJ1Z9/n/9bGmza3NjR0fXTx3RE3FpGljspVpAKPHjBjsald98Yzf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v3/VqlX1en3y5Ml33nnnnXfeed999337298OgQlgAAAAqNLYCSO/9I0/+fxffu+JR1bGPJpMptB0T9yzxKNbez6CyV1yizutiBho/WhmblIwKXrZBlKmch9Lb/dSUIxWuElKTB5cbrHc+lIqokleS7yexnriVnZ3aL9E2VnSTUEKsmxsY8K4EQdMGnXisTPPOWV+Z0e2528agH3esAkaFi9efPfdd//0pz+9/fbbX+ucZrN54YUXrlq16qMf/ejXvva1jo6OJ5988r3vfe8111xz1FFHffSjH92TBQMAAGB/UKunf/eti//0wm9u3LIjtmL5IT/0FSqiLLi5lWHBznMZJGmw0aN7UZgnngYv5zN4mQ8M5BBBSSsqSjKXm5lnUmFurrIlZAieBm/vUtneksKkGORJsCK6WephRJqc/O65H1/4nhEjGnv4FgHY3wybP/JfeeWVn/70p2+77bYY42udc8sttzz11FMLFiz45je/2dHRIWnevHnf+973JP3d3/2du7/WEwEAAIA3Lasl537gmK7OLOlKVQuSJ3lMevKkLw+5y0xFfFnKUG5Iaa0omRVSXigvBuc7uLtc5m6Fh1YxsHHm4DoMUzClIWZBaYgdWWxkngRJFmVRkjyYgll0c5s8ftSpx875iz9998f/86mkDAD2gGEzo+GKK6749Kc/LWnTpk0f+MAHXvWcW265RdJFF1208yqJ97znPZMnT165cuXDDz98zDHH7JlqAQAAsF9593sO+92y5xc/tnpHmuep2QutkLsrhlQxN09De1OJksmTxPJorWKg7aNZ4V64aokHt7IjQyu36P6yDSAGdrV0ydxksmahujwMbFThskImd1MwTZ8+4Y/++MSjj5o+YfyIPXlDAOzPhk3QcOihh5ZfrFu37rXOeeSRRySdcsopOx8MIZx88sk//OEPlyxZQtAAAACA3eHAgyecetrhnbXs3gef7vHQ6pL35NaK3nKlskKeJnIf2AkiWF5YHq3Z8o66FS6L8oFdKi2Y3Lycxmsv24FCktwlmZmrbNngZSsHmUneXpIhhWBvmzb2E395+lFH0e4RwB41bIKGN2LlypWSJk2a9LLjEydOHHz0ZX70ox99+ctfHvy2r69vdxYIAACAfda7Tps3akznqFEd69ZtW7x4ZdFhrVAURQyt6EGK7VXLJinmIS+88GJUx8hGzVpF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" /></p> +<!-- rnb-plot-begin --> +<p><img role="img" src="data:image/png;base64,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XgAAABgwBPD9lQ4gu3vnO9952223dZmdqEebNm2qbI8bNy49QDSxZMmST33qUz2ee/rpp1cGTFbrOkNvzpw5lS95ixYtOvbYY7ds2bJy5crkSBLAH3/88T/5yU8oFcAn8XzlCgN76mQw9owZM5K1zb70pS+dddZZffwWMASFfNlll02ZMuXSSy9dtWpVciQZLFAZL5DL5d7+9re/613vOv/883ucuGvdunXpFrxKi+g555xT6ewdRdHcuXN7y2rFjlby9Cp3mUxmAMsTpkv4wAMP3O7X/S5NuJs3b+4tZaUFPoqi5557btasWZQK4I855pjt/ixSxYLt0fr169PhWUdHx5o1a7oMqv/a177W2+k7erOqVdS75yfPjr61q2vwqnG1/u9U3U7WXgAAABgwBPBVMHHixKuuumqfffbZ0RPjOO5+sKOjo7cvbb017FTrOkPjzDPPrATwCxcuvPTSSyvN75lMJumffNxxxyVHNm7cuHr16v322y/9Wt75zncO+NmPOuqoT33qU7feeisRrV279rrrrrvmmmv6c+LgFfIZZ5yxbNmyhx9++MEHH3zmmWeWLVuWXju9VCo99NBDDz300DXXXPPjH//47LPP7nL63XffXUmfdPNOtpPO3pW24rvvvntgcWaix0ouqbnftdb9mROuD/05PQgCZq48b3o17C4mTZq07777JnP+zZs3LwngkxZa6l//+cEu2OSXhT4SnHTSSeedd94ArrzdT6RqFfVu9ckz4Ld2dVW3GvdhwP93qmLwai8AAAD0DWPgq2DdunVve9vb+vllMT2N09atW9NNNzukWtfZScx8RJ+6f7+cPXt2ZTG5JHSvDIA/4ogjkumUp06dWpmtbf78+dbayvxnkyZNOvTQQ3cmz9dee22lKfuHP/zhihUreks5ZIWcyWTe+9733nrrrUuXLm1ra5s3b96PfvSjD33oQ+kMbNiw4QMf+EBlCsCK9DTps2fPTnfnTo9Pfvzxx9Nzj+2oHit5euRtsVisDC/vv7322quyvXLlSmNM3+lfe+219K8GPc75V1FphE/i9vb29qVLlyZHkni+b0NTsL15//vfP3fu3IGd2+PNqlZRD9KbYgCfJN31/61dXYNajXuzQ/93htjO1F4AAADoGwL4/uqy/l6xWFy4cOHxxx9fSfDNb36zP0vmHHjggendZcuWDSw/1brOTspkMi/06eqrr+5ySnoxuVdeeaWtrS09g12ywcyV7fnz5y9btqzSOXNnmt8TY8aM+c53vpNsh2H4hS98obeUu6SQa2pqTjjhhMsuu+x3v/vd+vXr77nnnkpMIiKVNfYS//znPys/bVC3GcXSu865e++9t++n3tFK3qXvbnpm7H5KT9ZtjKmMpOhNl7fY/vvv30fiSpSezGO3cOHCSov6zJkz+36i6hZsPzHzmDFjZs+efdddd82dOze9fGB3O3qzqlXUg/SmGMAnSXf9f2tX1+BV42r93xkCO1R7AQAAYMAQwA9QLpebMWPGb3/728oR51x6At7ezJ49O73bfVqmWbNmpb+x/frXvx7U6+wSlbnoRWTx4sVdZrBLVHrRL1iwYCdXgO/us5/97Fvf+tZk+4EHHnjooYd6TDaohSwic1PS82BVaK3PPffcZDK2xNKlSyuLctF/zrJGRBdeeCGnTJs2Lf3o3Xff3f/sUT8qeZd27Mrq7j36/ve/f/Y2X/ziF5ODp556ajpN+rl6dMcdd6R3u5zeRaUFvqmp6bXXXqsMgJ86dep21zMb1IJN7L///l3CM+fc5s2b//rXvw6g7/F2b1a1ino3/+Tp51u7uga1GqcN+P8O/eda8ZUVPbpLP9TH8vLVrb0AAADQfwjgd8rUqVMry4ARUXop4N4cffTR6b6gd955Z5e1uNJE5Be/+MWgXmeXSC8md99991V64aYD+Eor0/PPP18Zuqy17hI/DIzW+kc/+lFlt7fIc1ALmZk/9rGPfXCb66+/vreURx55ZHq3sbGx8ow7tIzZwoULB9CpuI9KPmPGjPr6+sruDTfc0FtgICI33HDDH7apzGQ+a9asdPfjG264Ye3atb3l5NFHH/3Tn/5U2Z05c2bf0+a99a1vrSyvPW/evEoAv90B8ENTsIOhj5tVraLezT95+vnWrq5BrcbdDeD/Dv1nR/3Nmze3tLT0mCz9S+L48eN3KGMAAAAwBBDA7yytdWW7vb19u+mVUldeeWX6yAUXXLBgwYLuKUXk4osv7q11pVrX2SWSxeSS7Upj1IgRI9KTM1eC+TAMf/e73yXbxx13XI8zsQ/A29/+9u0uYT3YhZx+vQ888MCGDRt6TFaZij9RV1eXbDz55JPJJG39N7C24t4qeRAEF110UWW3qanp8ssv73Fis+uvv37jxo2V3VNOOSXZyGQy6X7OpVLpnHPO6TEgWbRo0Sc/+cn0kauuuqrvbCulKl3ln3766UoxbncA/JAV7GDo7WZVq6h3/0+e/ry1q2tQq3GPdvT/DhEdccQR6d1kmY8uHn300XSH/C6nAAAAwO4AAfzOSk8g3Ee/xLRPfvKT06dPr+y+/vrrJ5544lVXXbVgwYJSqURETU1N99xzz5FHHtl341W1rrNLVHrCd3R0JBszZsxIT+A8atSoymrJbW1tXc6qih/+8Ie5XK7vNINayO973/sq242NjXPmzHn00UfTCYwxc+fO/fznP185cthhh02aNCnZTs+y5nleb7N/pRvJBxZn9lHJr7jiivT1f/WrX51yyinz5s2rzFmwZs2aK6644itf+UolTU1NTbqT7ec+97n0Dxnz588/4ogjfv7zn7/88svOuTAMn3vuuW9/+9uzZs1Kj7GfM2fOmWeeud2cV2L1uXPnbt26tcvB3gxZwQ6GPm5WtYp69//k6c9bu7oGtRp3N4D/O2eddVZ66cRvf/vb3/jGNyo/Gra2tt52221der8P8e8gAAAA0B9YRm5npVf86rHtsbtMJjN37twZM2a0trYmR4wx11577bXXXqu1rqmpqcSribFjx/Y41XO1rrMzwjBMrwbcm8oo94ozzjijsphcIt1/PnHcccd1GRle3QB+3333/epXv9r35FiDWsiXX375T37yk0r6l156afbs2ZMmTTrwwANHjx7d1NT0yiuvdFkjurICeRiG9913X+X4u971rj/84Q89Psu3v/3tb33rW8n2yy+//NJLLyVr9fVfH5V84sSJP//5z9Pf+5955pkTTzxRa73vvvtu2bKlS/kQ0XXXXZee4Kq2tnbu3LkzZ86sxCFbt279zGc+Q0T5fD6O4+5vq/333z8dY/ehMgy+cvtGjBjxlre8pY9ThrJgB0MfN6taRT0Yb4oBf5L0qD9v7eoa1Grc3QD+7+y1115f/OIXr7vuumQ3iqJrrrnmmmuuyeVyQRBUbmXFKaecUt3PWwAAAKgKtMDvrHQ7T3p2sb5NnTr1iSeemDhxYpfj1tou332vuOKKdAPsIF1nwETkuX7ofuJpp51WWUwu0T2AT0+2TESjR48++uijq5v/L3/5y33PZE6DWcgjR478/e9/X1tbmz64du3aJ5988v7773/qqae6RO+XXXbZBz/4wWT7wQcfTI9iPf/883t7li6tajs0ujvRdyX/8Ic/fNNNNyn1Hx8m1tpVq1Z1j97/3//7f5dffnmXg9OnT3/88ce7D7gtFovdg5Mjjzzy6aefrqwy2Ldjjz3W9/30kRNOOKHvlbqHsmAHQ983q1pFXfU3xYA/SXrTn7d2dQ1eNe5uYP93vvnNb3Zv8C+VSt2j9ylTpgz4xwUAAAAYVAjgd1Z6AaFnn322S8TVh8MPP/y55577+Mc/3iXyqfB9/7rrrrv++usPP/zwIbjOEGtoaOiylFf39rfKRPSJ008/vbfXOGDZbPaGG27YbrLBK+S3ve1t8+fP326n7pEjR/7sZz9Lz86Vnia9rq7urLPO6u3cgw466Kijjqrs3nPPPZJag7o/tlvJL7/88j//+c+HHHJIHxc59thjH3nkkRtvvLHHR4855pjFixf3UcJEVFNTc9VVVz311FPd48be5PP5LlMAbncGu6Es2MGw3ZtVraLezT95+vnWrq5BqsbdDez/ThAEf/jDH2655ZY+ZqfL5XJf/vKXFyxY0GWRSAAAANhNoAv9zjr33HNfeOGFZLuxsfFrX/ta93WVejN+/Pjbb7/9yiuvvO+++x5++OHVq1dv2rSpvr5+4sSJZ5xxxic+8YlkEPgxxxxzwQUXULcW6apfZ4ideeaZTz31VLK9zz77dJ+K+bDDDsvlcsmoWqrGCvA9Ovvss2fPnv23v/2t72SDV8iHHnro008/vXDhwvvvv3/58uWrV69+/fXXC4XCvvvuu99+++27774nnXTS2WefnZ53urm5+cEHH6zsvv/97+97xO955533/PPPJ9urV69+9tlntxvHpvWnkp9++ukvvfTSgw8++Mc//vHZZ59tbGxsbW2tr68fP378scce+4EPfODd735338+y995733777V//+tf/93//9+GHH161atXGjRt93x83bty0adPe/e53n3322em5vvvpxBNPXLhwYWW3799KhrhgB0N/bla1ino3/+Tp51u7ugapGncx4P87vu9feumln/jEJ2677bZFixatWLFixYoV5XJ58uTJkydPPuSQQy655JIdnRUfAAAAhhLvDk1GAAAAAAAAANA3dKEHAAAAAAAAGAYQwAMAAAAAAAAMAwjgAQAAAAAAAIYBBPAAAAAAAAAAwwACeAAAAAAAAIBhAAE8AAAAAAAAwDCAAB4AAAAAAABg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SgABHgAAAACAEkCABwAAAACgBBDgAQAAAAAoAQR4AAAAAABKAAEeAAAAAIASQIAHAAAAAKAEEOABAAAAACgBBHgAAAAAAEoAAR4AAAAAgBJAgAcAAAAAoAQQ4AEAAAAAKAEEeAAAAAAASgABHgAAAACAEkCABwAAAACgBBDgAQAAAAAoAQR4AAAAAABKAAEeAAAAAIASQIAHAAAAAKAEEOABAAAAACgBBHgAAAAAwEHxs5/9TFVV9dZbb+1P79VXCPAAAAAAAJSAsK87AAAAAADon4YMGXLyySeLSF1dXX96r76iZtbXfTiMLF++fPLkySJy9tln33nnnX3dHQAAAAAoMWvXrl20aNGkSZOOPfbYvu5Lf8MUegAAAADA/lu5cqWqjhw5UkRuvPHG8ePHX3jhhbfccsvOl1S1ubl510symcxXv/rVo446qqysrKGh4fzzz3/55ZfjOC5WzuVy+1H5nd5rn2zbtu2b3/zm9OnThw4dWlZWduSRR55xxhm33XZboVDYtdqDDz6oqgMHDnx7C7feequqTpo0abfyOI5/8IMfTJs2rbq6ura29pRTTvnmN7/Z2dm5T91jCj0AAAAAoBf8+te/vuaaa4o/q+o7VXvzzTfPOeecl19+ufg0m80uXLjwd7/73bx58w6w8gFasWLFSSed1NraurNk9erVq1evfvjhhxcuXHjnnXc6t59D4Bs2bLjwwgufeuqpnSXPPvvss88++7Of/WzRokVHHHHEXrbDCDwAAAAA4EBt3779qquumjhx4t13371u3bobbrhhj9WiKProRz/68ssvDxw4cN68ecuXL1+6dOl//Md/eO8vvvjiA6l84C644ILW1tZhw4YtWLBgxYoVjY2Nixcvvvzyy0Xknnvuuffee/evWTM755xznnrqqaqqqh//+MevvPLKypUrb7755iFDhmzevPm8887z3u9lU4zAAwAAAAAOVEdHx7hx41566aV0Ov0u1X7xi1+88cYb6XT62WefnTBhQrFwypQp06ZNmzlz5oFUPkDbtm178cUXReTWW2/d2Xh9ff306dOXL1/+5JNPLl68eO7cufvR8m233fanP/0pDMOnn376mGOOKRYeeeSRRx999CmnnLJ48eIlS5accMIJe9MUI/AAAAAAgF5w7bXXvnt6F5Ef/ehHInL55ZfvDORFM2bMmD179oFUPkBmdsstt9xyyy2nnXbabi8Vl/d3dHTsX8vFu7jooot2pveik08++SMf+cjo0aOXLFmyl00xAg8AAAAA6AXHH3/8u1eIouiNN94QkbPOOuvtr86ZM+eBBx7Yv8oHbsiQIRdddNFuhZs2bXrsscd+//vfH0jLr732mojMmTPn7S/t6y0Q4AEAAAAAvWDYsGHvXmHNmjXF7dzHjBnz9ld328ttnyr3lj//+c/33HPP888/v2LFirVr12YymQNssLGxcfv27SIyevToA+8eAR4AAAAA0AtSqdS7V8hms8Uf9rhHfSKR2O/KBy6KoiuvvHL+/Plmpqpjx4790Ic+NG7cuOnTp//2t7+966679rKdfD6/69Odd5FMJg+8kwR4AAAAAMChMG7cOOec937NmjW7LWsXkdWrV+935QP37//+77/4xS8SicT3vve9Sy+9dNcz3h9++OG9b2e3jo0aNSqdTmez2TVr1hx33HEH2Ek2sQMAAAAAHArpdLo4k/zBBx98+6uPPvroflc+cHfccYeIXHnllddcc82u6V1EVq5cucdLcrmcme1W+Oyzz+761Dk3btw4EXnkkUfe3sJ5551XVlb2uc99bi87SYAHAAAAABwil112mYjMmzdv1apVu5b/6U9/uvPOOw+k8gEqHsZeWVm5W/lTTz21aNEiEdk1q1dXV4tId3d38eS5nR5//PGHHnpotxY+9alPicjNN9+8YsWKXctXr179u9/9LpvNzpgxYy87SYAHAAAAABwiX/ziF0eOHJnJZE488cT58+evWLHijTfe+O///u8Pf/jDQ4cOLdZxzu1H5QN04oknisj//M//PPTQQ3Ece+/Xrl37rW99a86cOVEUichjjz32+uuvF5e4H3vsscU17f/wD/+waNGiOI6bm5vnz5//sY99bNSoUbu1/LnPfW78+PG5XO6kk066+eabX3/99U2bNt19992zZ8/u7u6eMmXKRz/60b3spL59xP+9bPny5ZMnTxaRs88+u9e/0QEAAACA/mflypXFWeJNTU21tbV/9aWXXnrp3HPP3W1QfdSoUffee+9xxx2XSCR23Qdu7yu/Szf2RmNj43HHHbdlyxYRcc6FYVhs+eKLL77wwgvnzJlTzM4PP/zwrFmzROSmm276whe+ULw2kUgUN8w/6qij5s2bN3PmzKOOOmr58uU7G1+2bNkFF1zw8ssv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BHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACrQzwV1111cqVK5/0pV/7tV+zJ3PKKacc4YsEAAAAAOBZ1L4APzU19dGPfvSpXr3nnnuO5MUAAAAAAHBktCnAV1X1xS9+8TWvec2ePXue6j133323pAMHDvjjbdmy5QheKQAAAAAAz7LiaF/A03XVVVf98R//cV3X3+M9dV3ff//9xx9//OTk5BG7MAAAAAAAjoDWBPhzzjnnrW99q6SZmZlrrrnmSd+zdevWuq5PP/30I3plAAAAAAAcfq0J8G9729uav9i1a9dTBfimfv6000772Mc+9qlPfeqhhx7auHHjhRdeePnllxfFk3/TLVu23HTTTfMPt23b9mxfOAAAAAAAz4LWBPino+lg95GPfORDH/pQ88wXvvCFP/qjP/r93//9a6+99rTTTnviIddff/0VV1xxRK8SAAAAAIBnrk1N7L6v+Rb0H/zgB++7776pqanPfvaz55xzzne+852f//mfTykd3csDAAAAAOAHtqBW4C+99NK1a9e+4hWvOP/885tnLrvssi996Uunn376N77xjWuvvfbnfu7nvuuQTZs2vetd75p/uGfPng9/+MNH7ooBAAAAAHh6jq0Av2jRooMHD84/fO973/vud7/76R/++te//olPLl269C1vecv73ve+b3zjG08M8Js3b968efP8w9tvv50ADwAAAAA4Bh1bAf6Nb3xjv9+ff3jWWWc9K6dtdr9v3br1WTkbAAAAAABH3rEV4K+++uof+NgDBw5cc801k5OTb37zm7/rpYcfflijGA8AAAAAQBsdWwH+hzE5Ofnbv/3bDzzwwDnnnLNp06b553POn/zkJyUdWioPAAAAAEC7LJwu9Gb2i7/4i5Le9KY33Xrrrc2T+/fvf9vb3nbjjTdefPHFr3vd647qBQIAAAAA8INbOCvwkt797nd/+ctf/vznP79p06ZTTjmlLMt77723qqqNGzdeffXVISycXysAAAAAAD9qFlSmLYriM5/5zIc+9KHNmzfv379/586dF1100W/8xm/cfPPNbIAHAAAAALRa+1bgV69e7e5P9Wqn07nyyiuvvPLKI3lJAAAAAAAcbgtqBR4AAAAAgIWKAA8AAAAAQAsQ4AEAAAAAaAECPAAAAAAALUCABwAAAACgBQjwAAAAAAC0AAEeAAAAAIAWIMADAAAAANACBHgAAAAAAFqAAA8AAAAAQAsQ4AEAAAAA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" width="672" /></p> <!-- rnb-plot-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3580,11 +3571,11 @@ <h4>Plotting UMAPs</h4> <h2>Session Info</h2> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2Vzc2lvbkluZm8oKVxuYGBgIn0= --> +<!-- rnb-source-begin eyJkYXRhIjoic2Vzc2lvbkluZm8oKSJ9 --> <pre class="r"><code>sessionInfo()</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4wICgyMDI0LTA0LTI0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9Qy5VVEYtOCAgICAgICBMQ19OVU1FUklDPUMgICAgICAgICAgIExDX1RJTUU9Qy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1DLlVURi04ICAgICBMQ19NT05FVEFSWT1DLlVURi04ICAgIExDX01FU1NBR0VTPUMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9Qy5VVEYtOCAgICAgICBMQ19OQU1FPUMgICAgICAgICAgICAgIExDX0FERFJFU1M9QyAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICBMQ19NRUFTVVJFTUVOVD1DLlVURi04IExDX0lERU5USUZJQ0FUSU9OPUMgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyBkYXRhc2V0cyAgdXRpbHMgICAgIG1ldGhvZHMgICBiYXNlICAgICBcblxub3RoZXIgYXR0YWNoZWQgcGFja2FnZXM6XG4gWzFdIG1zaWdkYnJfNy41LjEgICAgICAgICAgICAgICBHU0VBQmFzZV8xLjY2LjAgICAgICAgICAgICAgZ3JhcGhfMS44Mi4wICAgICAgICAgICAgICAgIGFubm90YXRlXzEuODIuMCAgICAgICAgICAgICBYTUxfMy45OS0wLjE2LjEgICAgICAgICAgICBcbiBbNl0gQW5ub3RhdGlvbkRiaV8xLjY2LjAgICAgICAgIEFVQ2VsbF8xLjI2LjAgICAgICAgICAgICAgICBTaW5nbGVDZWxsRXhwZXJpbWVudF8xLjI2LjAgU3VtbWFyaXplZEV4cGVyaW1lbnRfMS4zNC4wIEJpb2Jhc2VfMi42NC4wICAgICAgICAgICAgIFxuWzExXSBHZW5vbWljUmFuZ2VzXzEuNTYuMCAgICAgICAgR2Vub21lSW5mb0RiXzEuNDAuMCAgICAgICAgIElSYW5nZXNfMi4zOC4wICAgICAgICAgICAgICBTNFZlY3RvcnNfMC40Mi4wICAgICAgICAgICAgQmlvY0dlbmVyaWNzXzAuNTAuMCAgICAgICAgXG5bMTZdIE1hdHJpeEdlbmVyaWNzXzEuMTYuMCAgICAgICBtYXRyaXhTdGF0c18xLjMuMCAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBEQklfMS4yLjIgICAgICAgICAgICAgICAgIGdyaWRFeHRyYV8yLjMgICAgICAgICAgICAgcmxhbmdfMS4xLjMgICAgICAgICAgICAgICBtYWdyaXR0cl8yLjAuMyAgICAgICAgICAgIHNjYXRlcl8xLjMyLjAgICAgICAgICAgICBcbiAgWzZdIGNvbXBpbGVyXzQuNC4wICAgICAgICAgICAgUlNRTGl0ZV8yLjMuNiAgICAgICAgICAgICBEZWxheWVkTWF0cml4U3RhdHNfMS4yNi4wIHBuZ18wLjEtOCAgICAgICAgICAgICAgICAgdmN0cnNfMC42LjUgICAgICAgICAgICAgIFxuIFsxMV0gc3RyaW5ncl8xLjUuMSAgICAgICAgICAgICBwa2djb25maWdfMi4wLjMgICAgICAgICAgIGNyYXlvbl8xLjUuMiAgICAgICAgICAgICAgZmFzdG1hcF8xLjEuMSAgICAgICAgICAgICBYVmVjdG9yXzAuNDQuMCAgICAgICAgICAgXG4gWzE2XSBzY3V0dGxlXzEuMTQuMCAgICAgICAgICAgIGxhYmVsaW5nXzAuNC4zICAgICAgICAgICAgdXRmOF8xLjIuNCAgICAgICAgICAgICAgICB0emRiXzAuNC4wICAgICAgICAgICAgICAgIGdnYmVlc3dhcm1fMC43LjIgICAgICAgICBcbiBbMjFdIFVDU0MudXRpbHNfMS4wLjAgICAgICAgICAgcHVycnJfMS4wLjIgICAgICAgICAgICAgICBiaXRfNC4wLjUgICAgICAgICAgICAgICAgIHhmdW5fMC40MyAgICAgICAgICAgICAgICAgYmVhY2htYXRfMi4yMC4wICAgICAgICAgIFxuIFsyNl0gemxpYmJpb2NfMS41MC4wICAgICAgICAgICBjYWNoZW1fMS4wLjggICAgICAgICAgICAgIGpzb25saXRlXzEuOC44ICAgICAgICAgICAgYmxvYl8xLjIuNCAgICAgICAgICAgICAgICBEZWxheWVkQXJyYXlfMC4zMC4wICAgICAgXG4gWzMxXSBCaW9jUGFyYWxsZWxfMS4zOC4wICAgICAgIGlybGJhXzIuMy41LjEgICAgICAgICAgICAgcGFyYWxsZWxfNC40LjAgICAgICAgICAgICBSNl8yLjUuMSAgICAgICAgICAgICAgICAgIHN0cmluZ2lfMS44LjMgICAgICAgICAgICBcbiBbMzZdIFJjcHBfMS4wLjEyICAgICAgICAgICAgICAga25pdHJfMS40NiAgICAgICAgICAgICAgICBtaXh0b29sc18yLjAuMCAgICAgICAgICAgIFIudXRpbHNfMi4xMi4zICAgICAgICAgICAgcmVhZHJfMi4xLjUgICAgICAgICAgICAgIFxuIFs0MV0gTWF0cml4XzEuNy0wICAgICAgICAgICAgICBzcGxpbmVzXzQuNC4wICAgICAgICAgICAgIHRpZHlzZWxlY3RfMS4yLjEgICAgICAgICAgdmlyaWRpc18wLjYuNSAgICAgICAgICAgICByc3R1ZGlvYXBpXzAuMTYuMCAgICAgICAgXG4gWzQ2XSBhYmluZF8xLjQtNSAgICAgICAgICAgICAgIHlhbWxfMi4zLjggICAgICAgICAgICAgICAgY29kZXRvb2xzXzAuMi0yMCAgICAgICAgICBsYXR0aWNlXzAuMjItNiAgICAgICAgICAgIHRpYmJsZV8zLjIuMSAgICAgICAgICAgICBcbiBbNTFdIHdpdGhyXzMuMC4wICAgICAgICAgICAgICAgS0VHR1JFU1RfMS40NC4wICAgICAgICAgICBzdXJ2aXZhbF8zLjUtOCAgICAgICAgICAgIGtlcm5sYWJfMC45LTMzICAgICAgICAgICAgQmlvc3RyaW5nc18yLjcyLjAgICAgICAgIFxuIFs1Nl0gcGlsbGFyXzEuOS4wICAgICAgICAgICAgICBCaW9jTWFuYWdlcl8xLjMwLjIyICAgICAgIHJlbnZfMS4wLjcgICAgICAgICAgICAgICAgcGxvdGx5XzQuMTAuNCAgICAgICAgICAgICBnZW5lcmljc18wLjEuMyAgICAgICAgICAgXG4gWzYxXSB2cm9vbV8xLjYuNSAgICAgICAgICAgICAgIGhtc18xLjEuMyAgICAgICAgICAgICAgICAgZ2dwbG90Ml8zLjUuMSAgICAgICAgICAgICBzcGFyc2VNYXRyaXhTdGF0c18xLjE2LjAgIG11bnNlbGxfMC41LjEgICAgICAgICAgICBcbiBbNjZdIHNjYWxlc18xLjMuMCAgICAgICAgICAgICAgeHRhYmxlXzEuOC00ICAgICAgICAgICAgICBnbHVlXzEuNy4wICAgICAgICAgICAgICAgIGxhenlldmFsXzAuMi4yICAgICAgICAgICAgdG9vbHNfNC40LjAgICAgICAgICAgICAgIFxuIFs3MV0gQmlvY05laWdoYm9yc18xLjIyLjAgICAgICBkYXRhLnRhYmxlXzEuMTUuNCAgICAgICAgIFNjYWxlZE1hdHJpeF8xLjEyLjAgICAgICAgYmFiZWxnZW5lXzIyLjkgICAgICAgICAgICBmc18xLjYuNCAgICAgICAgICAgICAgICAgXG4gWzc2XSBjb3dwbG90XzEuMS4zICAgICAgICAgICAgIGdyaWRfNC40LjAgICAgICAgICAgICAgICAgdGlkeXJfMS4zLjEgICAgICAgICAgICAgICBjb2xvcnNwYWNlXzIuMS0wICAgICAgICAgIG5sbWVfMy4xLTE2NCAgICAgICAgICAgICBcbiBbODFdIEdlbm9tZUluZm9EYkRhdGFfMS4yLjEyICAgYmVlc3dhcm1fMC40LjAgICAgICAgICAgICBCaW9jU2luZ3VsYXJfMS4yMC4wICAgICAgIHZpcG9yXzAuNC43ICAgICAgICAgICAgICAgcnN2ZF8xLjAuNSAgICAgICAgICAgICAgIFxuIFs4Nl0gY2xpXzMuNi4yICAgICAgICAgICAgICAgICBmYW5zaV8xLjAuNiAgICAgICAgICAgICAgIHNlZ21lbnRlZF8yLjEtMyAgICAgICAgICAgUzRBcnJheXNfMS40LjAgICAgICAgICAgICB2aXJpZGlzTGl0ZV8wLjQuMiAgICAgICAgXG4gWzkxXSBkcGx5cl8xLjEuNCAgICAgICAgICAgICAgIGd0YWJsZV8wLjMuNSAgICAgICAgICAgICAgUi5tZXRob2RzUzNfMS44LjIgICAgICAgICBkaWdlc3RfMC42LjM1ICAgICAgICAgICAgIGdncmVwZWxfMC45LjUgICAgICAgICAgICBcbiBbOTZdIFNwYXJzZUFycmF5XzEuNC4wICAgICAgICAgZmFydmVyXzIuMS4xICAgICAgICAgICAgICBodG1sd2lkZ2V0c18xLjYuNCAgICAgICAgIG1lbW9pc2VfMi4wLjEgICAgICAgICAgICAgaHRtbHRvb2xzXzAuNS44LjEgICAgICAgIFxuWzEwMV0gUi5vb18xLjI2LjAgICAgICAgICAgICAgICBsaWZlY3ljbGVfMS4wLjQgICAgICAgICAgIGh0dHJfMS40LjcgICAgICAgICAgICAgICAgYml0NjRfNC4wLjUgICAgICAgICAgICAgICBNQVNTXzcuMy02MC4yICAgICAgICAgICAgXG4ifQ== --> -<pre><code>R version 4.4.0 (2024-04-24) +<!-- rnb-output-begin eyJkYXRhIjoiUiB2ZXJzaW9uIDQuNC4xICgyMDI0LTA2LTE0KVxuUGxhdGZvcm06IHg4Nl82NC1wYy1saW51eC1nbnVcblJ1bm5pbmcgdW5kZXI6IFVidW50dSAyMi4wNC40IExUU1xuXG5NYXRyaXggcHJvZHVjdHM6IGRlZmF1bHRcbkJMQVM6ICAgL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYmJsYXMuc28uMyBcbkxBUEFDSzogL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS9vcGVuYmxhcy1wdGhyZWFkL2xpYm9wZW5ibGFzcC1yMC4zLjIwLnNvOyAgTEFQQUNLIHZlcnNpb24gMy4xMC4wXG5cbmxvY2FsZTpcbiBbMV0gTENfQ1RZUEU9ZW5fVVMuVVRGLTggICAgICAgTENfTlVNRVJJQz1DICAgICAgICAgICAgICBcbiBbM10gTENfVElNRT1lbl9VUy5VVEYtOCAgICAgICAgTENfQ09MTEFURT1lbl9VUy5VVEYtOCAgICBcbiBbNV0gTENfTU9ORVRBUlk9ZW5fVVMuVVRGLTggICAgTENfTUVTU0FHRVM9ZW5fVVMuVVRGLTggICBcbiBbN10gTENfUEFQRVI9ZW5fVVMuVVRGLTggICAgICAgTENfTkFNRT1DICAgICAgICAgICAgICAgICBcbiBbOV0gTENfQUREUkVTUz1DICAgICAgICAgICAgICAgTENfVEVMRVBIT05FPUMgICAgICAgICAgICBcblsxMV0gTENfTUVBU1VSRU1FTlQ9ZW5fVVMuVVRGLTggTENfSURFTlRJRklDQVRJT049QyAgICAgICBcblxudGltZSB6b25lOiBFdGMvVVRDXG50emNvZGUgc291cmNlOiBzeXN0ZW0gKGdsaWJjKVxuXG5hdHRhY2hlZCBiYXNlIHBhY2thZ2VzOlxuWzFdIHN0YXRzNCAgICBzdGF0cyAgICAgZ3JhcGhpY3MgIGdyRGV2aWNlcyB1dGlscyAgICAgZGF0YXNldHMgIG1ldGhvZHMgIFxuWzhdIGJhc2UgICAgIFxuXG5vdGhlciBhdHRhY2hlZCBwYWNrYWdlczpcbiBbMV0gbXNpZ2Ricl83LjUuMSAgICAgICAgICAgICAgIEdTRUFCYXNlXzEuNjYuMCAgICAgICAgICAgIFxuIFszXSBncmFwaF8xLjgyLjAgICAgICAgICAgICAgICAgYW5ub3RhdGVfMS44Mi4wICAgICAgICAgICAgXG4gWzVdIFhNTF8zLjk5LTAuMTYuMSAgICAgICAgICAgICBBbm5vdGF0aW9uRGJpXzEuNjYuMCAgICAgICBcbiBbN10gQVVDZWxsXzEuMjYuMCAgICAgICAgICAgICAgIFNpbmdsZUNlbGxFeHBlcmltZW50XzEuMjYuMFxuIFs5XSBTdW1tYXJpemVkRXhwZXJpbWVudF8xLjM0LjAgQmlvYmFzZV8yLjY0LjAgICAgICAgICAgICAgXG5bMTFdIEdlbm9taWNSYW5nZXNfMS41Ni4wICAgICAgICBHZW5vbWVJbmZvRGJfMS40MC4wICAgICAgICBcblsxM10gSVJhbmdlc18yLjM4LjAgICAgICAgICAgICAgIFM0VmVjdG9yc18wLjQyLjAgICAgICAgICAgIFxuWzE1XSBCaW9jR2VuZXJpY3NfMC41MC4wICAgICAgICAgTWF0cml4R2VuZXJpY3NfMS4xNi4wICAgICAgXG5bMTddIG1hdHJpeFN0YXRzXzEuMy4wICAgICAgICAgICBvcHRwYXJzZV8xLjcuNSAgICAgICAgICAgICBcblxubG9hZGVkIHZpYSBhIG5hbWVzcGFjZSAoYW5kIG5vdCBhdHRhY2hlZCk6XG4gIFsxXSBqc29ubGl0ZV8xLjguOCAgICAgICAgICAgIG1hZ3JpdHRyXzIuMC4zICAgICAgICAgICBcbiAgWzNdIGdnYmVlc3dhcm1fMC43LjIgICAgICAgICAgZmFydmVyXzIuMS4xICAgICAgICAgICAgIFxuICBbNV0gcm1hcmtkb3duXzIuMjYgICAgICAgICAgICBmc18xLjYuNCAgICAgICAgICAgICAgICAgXG4gIFs3XSB6bGliYmlvY18xLjUwLjAgICAgICAgICAgIHZjdHJzXzAuNi41ICAgICAgICAgICAgICBcbiAgWzldIG1lbW9pc2VfMi4wLjEgICAgICAgICAgICAgRGVsYXllZE1hdHJpeFN0YXRzXzEuMjYuMFxuIFsxMV0gaHRtbHRvb2xzXzAuNS44LjEgICAgICAgICBTNEFycmF5c18xLjQuMCAgICAgICAgICAgXG4gWzEzXSBCaW9jTmVpZ2hib3JzXzEuMjIuMCAgICAgIFNwYXJzZUFycmF5XzEuNC4wICAgICAgICBcbiBbMTVdIHNhc3NfMC40LjkgICAgICAgICAgICAgICAgYnNsaWJfMC43LjAgICAgICAgICAgICAgIFxuIFsxN10gaHRtbHdpZGdldHNfMS42LjQgICAgICAgICBwbG90bHlfNC4xMC40ICAgICAgICAgICAgXG4gWzE5XSBjYWNoZW1fMS4wLjggICAgICAgICAgICAgIGxpZmVjeWNsZV8xLjAuNCAgICAgICAgICBcbiBbMjFdIHBrZ2NvbmZpZ18yLjAuMyAgICAgICAgICAgcnN2ZF8xLjAuNSAgICAgICAgICAgICAgIFxuIFsyM10gTWF0cml4XzEuNy0wICAgICAgICAgICAgICBSNl8yLjUuMSAgICAgICAgICAgICAgICAgXG4gWzI1XSBmYXN0bWFwXzEuMS4xICAgICAgICAgICAgIEdlbm9tZUluZm9EYkRhdGFfMS4yLjEyICBcbiBbMjddIGRpZ2VzdF8wLjYuMzUgICAgICAgICAgICAgY29sb3JzcGFjZV8yLjEtMCAgICAgICAgIFxuIFsyOV0gc2NhdGVyXzEuMzIuMCAgICAgICAgICAgICBpcmxiYV8yLjMuNS4xICAgICAgICAgICAgXG4gWzMxXSBSU1FMaXRlXzIuMy42ICAgICAgICAgICAgIGJlYWNobWF0XzIuMjAuMCAgICAgICAgICBcbiBbMzNdIGxhYmVsaW5nXzAuNC4zICAgICAgICAgICAgZmFuc2lfMS4wLjYgICAgICAgICAgICAgIFxuIFszNV0gaHR0cl8xLjQuNyAgICAgICAgICAgICAgICBhYmluZF8xLjQtNSAgICAgICAgICAgICAgXG4gWzM3XSBjb21waWxlcl80LjQuMSAgICAgICAgICAgIGJpdDY0XzQuMC41ICAgICAgICAgICAgICBcbiBbMzldIHdpdGhyXzMuMC4wICAgICAgICAgICAgICAgQmlvY1BhcmFsbGVsXzEuMzguMCAgICAgIFxuIFs0MV0gdmlyaWRpc18wLjYuNSAgICAgICAgICAgICBEQklfMS4yLjIgICAgICAgICAgICAgICAgXG4gWzQzXSBoaWdocl8wLjEwICAgICAgICAgICAgICAgIFIudXRpbHNfMi4xMi4zICAgICAgICAgICBcbiBbNDVdIE1BU1NfNy4zLTYwLjIgICAgICAgICAgICAgRGVsYXllZEFycmF5XzAuMzAuMCAgICAgIFxuIFs0N10gdG9vbHNfNC40LjEgICAgICAgICAgICAgICB2aXBvcl8wLjQuNyAgICAgICAgICAgICAgXG4gWzQ5XSBiZWVzd2FybV8wLjQuMCAgICAgICAgICAgIFIub29fMS4yNi4wICAgICAgICAgICAgICBcbiBbNTFdIGdsdWVfMS43LjAgICAgICAgICAgICAgICAgbmxtZV8zLjEtMTY0ICAgICAgICAgICAgIFxuIFs1M10gZ3JpZF80LjQuMSAgICAgICAgICAgICAgICBnZW5lcmljc18wLjEuMyAgICAgICAgICAgXG4gWzU1XSBndGFibGVfMC4zLjUgICAgICAgICAgICAgIHR6ZGJfMC40LjAgICAgICAgICAgICAgICBcbiBbNTddIFIubWV0aG9kc1MzXzEuOC4yICAgICAgICAgdGlkeXJfMS4zLjEgICAgICAgICAgICAgIFxuIFs1OV0gZGF0YS50YWJsZV8xLjE1LjQgICAgICAgICBobXNfMS4xLjMgICAgICAgICAgICAgICAgXG4gWzYxXSBCaW9jU2luZ3VsYXJfMS4yMC4wICAgICAgIFNjYWxlZE1hdHJpeF8xLjEyLjAgICAgICBcbiBbNjNdIHV0ZjhfMS4yLjQgICAgICAgICAgICAgICAgWFZlY3Rvcl8wLjQ0LjAgICAgICAgICAgIFxuIFs2NV0gZ2dyZXBlbF8wLjkuNSAgICAgICAgICAgICBwaWxsYXJfMS45LjAgICAgICAgICAgICAgXG4gWzY3XSBzdHJpbmdyXzEuNS4xICAgICAgICAgICAgIGJhYmVsZ2VuZV8yMi45ICAgICAgICAgICBcbiBbNjldIHZyb29tXzEuNi41ICAgICAgICAgICAgICAgc3BsaW5lc180LjQuMSAgICAgICAgICAgIFxuIFs3MV0gZHBseXJfMS4xLjQgICAgICAgICAgICAgICBnZXRvcHRfMS4yMC40ICAgICAgICAgICAgXG4gWzczXSBsYXR0aWNlXzAuMjItNiAgICAgICAgICAgIHN1cnZpdmFsXzMuNS04ICAgICAgICAgICBcbiBbNzVdIGJpdF80LjAuNSAgICAgICAgICAgICAgICAgdGlkeXNlbGVjdF8xLjIuMSAgICAgICAgIFxuIFs3N10gQmlvc3RyaW5nc18yLjcyLjAgICAgICAgICBzY3V0dGxlXzEuMTQuMCAgICAgICAgICAgXG4gWzc5XSBrbml0cl8xLjQ2ICAgICAgICAgICAgICAgIGdyaWRFeHRyYV8yLjMgICAgICAgICAgICBcbiBbODFdIHhmdW5fMC40MyAgICAgICAgICAgICAgICAgbWl4dG9vbHNfMi4wLjAgICAgICAgICAgIFxuIFs4M10gc3RyaW5naV8xLjguMyAgICAgICAgICAgICBVQ1NDLnV0aWxzXzEuMC4wICAgICAgICAgXG4gWzg1XSBsYXp5ZXZhbF8wLjIuMiAgICAgICAgICAgIHlhbWxfMi4zLjggICAgICAgICAgICAgICBcbiBbODddIGV2YWx1YXRlXzAuMjMgICAgICAgICAgICAgY29kZXRvb2xzXzAuMi0yMCAgICAgICAgIFxuIFs4OV0ga2VybmxhYl8wLjktMzMgICAgICAgICAgICB0aWJibGVfMy4yLjEgICAgICAgICAgICAgXG4gWzkxXSBjbGlfMy42LjIgICAgICAgICAgICAgICAgIHh0YWJsZV8xLjgtNCAgICAgICAgICAgICBcbiBbOTNdIHNlZ21lbnRlZF8yLjEtMyAgICAgICAgICAgbXVuc2VsbF8wLjUuMSAgICAgICAgICAgIFxuIFs5NV0ganF1ZXJ5bGliXzAuMS40ICAgICAgICAgICBSY3BwXzEuMC4xMiAgICAgICAgICAgICAgXG4gWzk3XSBwbmdfMC4xLTggICAgICAgICAgICAgICAgIHBhcmFsbGVsXzQuNC4xICAgICAgICAgICBcbiBbOTldIGdncGxvdDJfMy41LjEgICAgICAgICAgICAgcmVhZHJfMi4xLjUgICAgICAgICAgICAgIFxuIFsgcmVhY2hlZCBnZXRPcHRpb24oXCJtYXgucHJpbnRcIikgLS0gb21pdHRlZCA5IGVudHJpZXMgXVxuIn0= --> +<pre><code>R version 4.4.1 (2024-06-14) Platform: x86_64-pc-linux-gnu Running under: Ubuntu 22.04.4 LTS @@ -3593,48 +3584,88 @@ <h2>Session Info</h2> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0 locale: - [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 - [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C + [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C + [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 + [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 + [7] LC_PAPER=en_US.UTF-8 LC_NAME=C + [9] LC_ADDRESS=C LC_TELEPHONE=C +[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C time zone: Etc/UTC tzcode source: system (glibc) attached base packages: -[1] stats4 stats graphics grDevices datasets utils methods base +[1] stats4 stats graphics grDevices utils datasets methods +[8] base other attached packages: - [1] msigdbr_7.5.1 GSEABase_1.66.0 graph_1.82.0 annotate_1.82.0 XML_3.99-0.16.1 - [6] AnnotationDbi_1.66.0 AUCell_1.26.0 SingleCellExperiment_1.26.0 SummarizedExperiment_1.34.0 Biobase_2.64.0 -[11] GenomicRanges_1.56.0 GenomeInfoDb_1.40.0 IRanges_2.38.0 S4Vectors_0.42.0 BiocGenerics_0.50.0 -[16] MatrixGenerics_1.16.0 matrixStats_1.3.0 + [1] msigdbr_7.5.1 GSEABase_1.66.0 + [3] graph_1.82.0 annotate_1.82.0 + [5] XML_3.99-0.16.1 AnnotationDbi_1.66.0 + [7] AUCell_1.26.0 SingleCellExperiment_1.26.0 + [9] SummarizedExperiment_1.34.0 Biobase_2.64.0 +[11] GenomicRanges_1.56.0 GenomeInfoDb_1.40.0 +[13] IRanges_2.38.0 S4Vectors_0.42.0 +[15] BiocGenerics_0.50.0 MatrixGenerics_1.16.0 +[17] matrixStats_1.3.0 optparse_1.7.5 loaded via a namespace (and not attached): - [1] DBI_1.2.2 gridExtra_2.3 rlang_1.1.3 magrittr_2.0.3 scater_1.32.0 - [6] compiler_4.4.0 RSQLite_2.3.6 DelayedMatrixStats_1.26.0 png_0.1-8 vctrs_0.6.5 - [11] stringr_1.5.1 pkgconfig_2.0.3 crayon_1.5.2 fastmap_1.1.1 XVector_0.44.0 - [16] scuttle_1.14.0 labeling_0.4.3 utf8_1.2.4 tzdb_0.4.0 ggbeeswarm_0.7.2 - [21] UCSC.utils_1.0.0 purrr_1.0.2 bit_4.0.5 xfun_0.43 beachmat_2.20.0 - [26] zlibbioc_1.50.0 cachem_1.0.8 jsonlite_1.8.8 blob_1.2.4 DelayedArray_0.30.0 - [31] BiocParallel_1.38.0 irlba_2.3.5.1 parallel_4.4.0 R6_2.5.1 stringi_1.8.3 - [36] Rcpp_1.0.12 knitr_1.46 mixtools_2.0.0 R.utils_2.12.3 readr_2.1.5 - [41] Matrix_1.7-0 splines_4.4.0 tidyselect_1.2.1 viridis_0.6.5 rstudioapi_0.16.0 - [46] abind_1.4-5 yaml_2.3.8 codetools_0.2-20 lattice_0.22-6 tibble_3.2.1 - [51] withr_3.0.0 KEGGREST_1.44.0 survival_3.5-8 kernlab_0.9-33 Biostrings_2.72.0 - [56] pillar_1.9.0 BiocManager_1.30.22 renv_1.0.7 plotly_4.10.4 generics_0.1.3 - [61] vroom_1.6.5 hms_1.1.3 ggplot2_3.5.1 sparseMatrixStats_1.16.0 munsell_0.5.1 - [66] scales_1.3.0 xtable_1.8-4 glue_1.7.0 lazyeval_0.2.2 tools_4.4.0 - [71] BiocNeighbors_1.22.0 data.table_1.15.4 ScaledMatrix_1.12.0 babelgene_22.9 fs_1.6.4 - [76] cowplot_1.1.3 grid_4.4.0 tidyr_1.3.1 colorspace_2.1-0 nlme_3.1-164 - [81] GenomeInfoDbData_1.2.12 beeswarm_0.4.0 BiocSingular_1.20.0 vipor_0.4.7 rsvd_1.0.5 - [86] cli_3.6.2 fansi_1.0.6 segmented_2.1-3 S4Arrays_1.4.0 viridisLite_0.4.2 - [91] dplyr_1.1.4 gtable_0.3.5 R.methodsS3_1.8.2 digest_0.6.35 ggrepel_0.9.5 - [96] SparseArray_1.4.0 farver_2.1.1 htmlwidgets_1.6.4 memoise_2.0.1 htmltools_0.5.8.1 -[101] R.oo_1.26.0 lifecycle_1.0.4 httr_1.4.7 bit64_4.0.5 MASS_7.3-60.2 </code></pre> + [1] jsonlite_1.8.8 magrittr_2.0.3 + [3] ggbeeswarm_0.7.2 farver_2.1.1 + [5] rmarkdown_2.26 fs_1.6.4 + [7] zlibbioc_1.50.0 vctrs_0.6.5 + [9] memoise_2.0.1 DelayedMatrixStats_1.26.0 + [11] htmltools_0.5.8.1 S4Arrays_1.4.0 + [13] BiocNeighbors_1.22.0 SparseArray_1.4.0 + [15] sass_0.4.9 bslib_0.7.0 + [17] htmlwidgets_1.6.4 plotly_4.10.4 + [19] cachem_1.0.8 lifecycle_1.0.4 + [21] pkgconfig_2.0.3 rsvd_1.0.5 + [23] Matrix_1.7-0 R6_2.5.1 + [25] fastmap_1.1.1 GenomeInfoDbData_1.2.12 + [27] digest_0.6.35 colorspace_2.1-0 + [29] scater_1.32.0 irlba_2.3.5.1 + [31] RSQLite_2.3.6 beachmat_2.20.0 + [33] labeling_0.4.3 fansi_1.0.6 + [35] httr_1.4.7 abind_1.4-5 + [37] compiler_4.4.1 bit64_4.0.5 + [39] withr_3.0.0 BiocParallel_1.38.0 + [41] viridis_0.6.5 DBI_1.2.2 + [43] highr_0.10 R.utils_2.12.3 + [45] MASS_7.3-60.2 DelayedArray_0.30.0 + [47] tools_4.4.1 vipor_0.4.7 + [49] beeswarm_0.4.0 R.oo_1.26.0 + [51] glue_1.7.0 nlme_3.1-164 + [53] grid_4.4.1 generics_0.1.3 + [55] gtable_0.3.5 tzdb_0.4.0 + [57] R.methodsS3_1.8.2 tidyr_1.3.1 + [59] data.table_1.15.4 hms_1.1.3 + [61] BiocSingular_1.20.0 ScaledMatrix_1.12.0 + [63] utf8_1.2.4 XVector_0.44.0 + [65] ggrepel_0.9.5 pillar_1.9.0 + [67] stringr_1.5.1 babelgene_22.9 + [69] vroom_1.6.5 splines_4.4.1 + [71] dplyr_1.1.4 getopt_1.20.4 + [73] lattice_0.22-6 survival_3.5-8 + [75] bit_4.0.5 tidyselect_1.2.1 + [77] Biostrings_2.72.0 scuttle_1.14.0 + [79] knitr_1.46 gridExtra_2.3 + [81] xfun_0.43 mixtools_2.0.0 + [83] stringi_1.8.3 UCSC.utils_1.0.0 + [85] lazyeval_0.2.2 yaml_2.3.8 + [87] evaluate_0.23 codetools_0.2-20 + [89] kernlab_0.9-33 tibble_3.2.1 + [91] cli_3.6.2 xtable_1.8-4 + [93] segmented_2.1-3 munsell_0.5.1 + [95] jquerylib_0.1.4 Rcpp_1.0.12 + [97] png_0.1-8 parallel_4.4.1 + [99] ggplot2_3.5.1 readr_2.1.5 + [ reached getOption("max.print") -- omitted 9 entries ]</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> </div> -<div id="rmd-source-code">LS0tCnRpdGxlOiAiUGF0aHdheSBBbmFseXNpczogQVVDZWxsIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ0NETCBmb3IgQUxTRgpkYXRlOiAyMDI0Ci0tLQoKKkFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvQVVDZWxsL2luc3QvZG9jL0FVQ2VsbC5odG1sKSBhbmQgW3RoZSBgY2VsbC10eXBlLWV3aW5nc2AgbW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuU2NQQ0EtYW5hbHlzaXMvdHJlZS9tYWluL2FuYWx5c2VzL2NlbGwtdHlwZS1ld2luZ3MpIHRoYXQgaXMgcGFydCBvZiB0aGUgT3BlbiBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIHByb2plY3QuKgoKIyMgT2JqZWN0aXZlcwoKLSBJbnRyb2R1Y2UgdGhlIGBBVUNlbGxgIFIgcGFja2FnZQotIElsbHVzdHJhdGUgaG93IEFVQyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQKLSBEZW1vbnN0cmF0ZSBob3cgQVVDIHZhbHVlcyBjYW4gYmUgdXNlZCBmb3IgY2VsbCBhc3NpZ25tZW50IGFuZCBwbG90dGluZwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBBVUNlbGwgbWV0aG9kLCBpbnRyb2R1Y2VkIGluIFtBaWJhciBfZXQgYWxfLiAyMDE3Ll0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbm1ldGguNDQ2MykuCgpXZSBjYW4gdXNlIEFVQ2VsbCB3aGVuIHdlIGFyZSBpbnRlcmVzdGVkIGluIGEgZ2VuZSBzZXQncyByZWxhdGl2ZSBleHByZXNzaW9uIG9yIGFjdGl2aXR5IGluIGFuIGluZGl2aWR1YWwgY2VsbC4KR2VuZSBzZXRzIGNhbiBjb21lIGZyb20gYSBjdXJhdGVkIGNvbGxlY3Rpb24gb2YgcHJpb3Iga25vd2xlZGdlLCBsaWtlIHRoZSBIYWxsbWFyayBjb2xsZWN0aW9uIHdlIHVzZWQgaW4gdGhlIGxhc3Qgbm90ZWJvb2ssIG9yIHdlIGNhbiB1c2Ugb3VyIG93biBjdXN0b20gZ2VuZSBzZXRzIChlLmcuLCBhIHNldCBvZiBtYXJrZXIgZ2VuZXMgZm9yIGEgY2VsbCB0eXBlIG9mIGludGVyZXN0KS4KCkEgbmljZSBmZWF0dXJlIG9mIEFVQ2VsbCBpcyB0aGF0IGl0IGlzIGJhc2VkIG9uIHJhbmtpbmcgZ2VuZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBleHByZXNzaW9uIHZhbHVlIGluIGFuIGluZGl2aWR1YWwgY2VsbCwgd2hpY2ggaXMgaGVscGZ1bCBpbiB0aGUgZm9sbG93aW5nIHdheXMgKFtBVUNlbGwgdmlnbmV0dGVdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvdmlnbmV0dGVzL0FVQ2VsbC9pbnN0L2RvYy9BVUNlbGwuaHRtbCkpOgoKLSBJdCBjYW4gdGFrZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFsdWVzIGFzIGlucHV0IChlLmcuLCByYXcgY291bnRzLCBUUE0pIAotIEl0IGNvbXBlbnNhdGVzIGZvciBkaWZmZXJlbmNlcyBpbiBsaWJyYXJ5IHNpemUsIHdoZXJlIHNvbWV0aGluZyBsaWtlIGF2ZXJhZ2luZyByYXcgY291bnQgdmFsdWVzIG9mIGdlbmVzIGluIGEgZ2VuZSBzZXQgd291bGQgbm90IAotIEl0IHNjYWxlcyB0byBsYXJnZXIgZGF0YXNldHMsIHNpbmNlIGNyZWF0aW5nIHJhbmtpbmdzIGlzIG5vdCBhcyByZXNvdXJjZS1pbnRlbnNpdmUgYXMgc29tZXRoaW5nIGxpa2UgcGVybXV0YXRpb24gdGVzdGluZywgYW5kIHdlIGNvdWxkIHNwbGl0IHVwIHRoZSBvYmplY3QgaW50byBzdWJzZXRzIG9mIGNlbGxzIGlmIG5lZWRlZAoKQVVDZWxsIGNhbGN1bGF0ZXMgdGhlIGFyZWEgdW5kZXIgdGhlIHJlY292ZXJ5IGN1cnZlIChBVUMpLCB3aGljaCAicmVwcmVzZW50cyB0aGUgcHJvcG9ydGlvbiBvZiBleHByZXNzZWQgZ2VuZXMgaW4gdGhlIHNpZ25hdHVyZSBhbmQgdGhlaXIgcmVsYXRpdmUgZXhwcmVzc2lvbiB2YWx1ZSBjb21wYXJlZCB0byB0aGUgb3RoZXIgZ2VuZXMgd2l0aGluIHRoZSBjZWxsIiAoW0FpYmFyIF9ldCBhbF8uIDIwMTcuXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9ubWV0aC40NDYzKSkuCldlIHdpbGwgdmlzdWFsaXplIHNvbWUgcmVjb3ZlcnkgY3VydmVzIGluIHRoZSBub3RlYm9vayB0byBnaXZlIHlvdSBhIGJldHRlciBpbnR1aXRpb24gYWJvdXQgdGhlIEFVQyBhbmQgaXRzIG1lYW5pbmcuCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIEFVQ2VsbCBjYW4gYmUgdXNlZCBpbiBhIG51bWJlciBvZiB3YXlzIChbQWliYXIgX2V0IGFsXy4gMjAxNy5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L25tZXRoLjQ0NjMpKToKCi0gQXMgY29udGludW91cyB2YWx1ZXMgd2UgY2FuIHVzZSBmb3IgdmlzdWFsaXphdGlvbiBvciBjbHVzdGVyaW5nCi0gRm9yIGJpbmFyeSBhc3NpZ25tZW50IChpLmUuLCAib24iIGFuZCAib2ZmIiBvciAiZXhwcmVzc2VkIiBhbmQgIm5vdCBleHByZXNzZWQiKSBpZiB3ZSBwaWNrIGEgdGhyZXNob2xkIGVpdGhlciBhdXRvbWF0aWNhbGx5IHVzaW5nIGJ1aWx0LWluIGZ1bmN0aW9uYWxpdHkgb3IgbWFudWFsbHkgYnkgaW5zcGVjdGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHNjb3JlcyBvdXJzZWx2ZXMKCldlIHdpbGwgdXNlIGFuIHNuUk5BLXNlcSBvZiBhIEV3aW5nIHNhcmNvbWEgc2FtcGxlIGZyb20gdGhlIFtgU0NQQ1AwMDAwMTVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMTUpIG9uIHRoZSBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIFBvcnRhbCBhbmQgdHdvIHJlbGV2YW50IGdlbmUgc2V0cyBmcm9tIHRoZSBNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSAoTVNpZ0RCKSB0byBkZW1vbnN0cmF0ZSB0aGlzIG1ldGhvZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3IgbGlicmFyaWVzfQojIFdlIHdpbGwgYmUgbG9hZGluZyBhIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdCBpbnRvIG91ciBlbnZpcm9ubWVudCBidXQgZG9uJ3QgbmVlZCB0byBzZWUgdGhlIHN0YXJ0dXAgbWVzc2FnZXMKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQp9KQoKIyBMaWJyYXJ5IHdlJ2xsIHVzZSBmb3IgdGhlIGdlbmUgc2V0IGFuYWx5c2lzIGl0c2VsZgpsaWJyYXJ5KEFVQ2VsbCkKCiMgTGlicmFyaWVzIGZvciBhY2Nlc3NpbmcgYW5kIHdvcmtpbmcgd2l0aCBnZW5lIHNldHMKbGlicmFyeShHU0VBQmFzZSkKbGlicmFyeShtc2lnZGJyKQpgYGAKCiMjIyBEaXJlY3RvcmllcyBhbmQgZmlsZXMKCiMjIyMgRGlyZWN0b3JpZXMKCmBgYHtyIHNldHVwX2RpcmVjdG9yaWVzfQojIElucHV0IGRhdGEgCmV3aW5nX2RhdGFfZGlyIDwtIGZzOjpwYXRoKCJkYXRhIiwgImV3aW5nLXNhcmNvbWEiKQpwcm9jZXNzZWRfZGlyIDwtIGZzOjpwYXRoKGV3aW5nX2RhdGFfZGlyLCAicHJvY2Vzc2VkIikKCiMgRGlyZWN0b3J5IGZvciBob2xkaW5nIHBhdGh3YXkgYW5hbHlzaXMgcmVzdWx0cwphbmFseXNpc19kaXIgPC0gZnM6OnBhdGgoImFuYWx5c2lzIiwgImV3aW5nLXNhcmNvbWEiLCAicGF0aHdheS1hbmFseXNpcyIpCiMgQ3JlYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0CmZzOjpkaXJfY3JlYXRlKGFuYWx5c2lzX2RpcikKYGBgCgojIyMjIEZpbGVzCgpUaGUgaW5wdXQgd2lsbCBiZSBhIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgZm9yIGFuIGluZGl2aWR1YWwgRXdpbmcgc2FyY29tYSBsaWJyYXJ5LgoKYGBge3Igc2V0dXBfaW5wdXRfZmlsZXN9CnNjZV9maWxlIDwtIGZzOjpwYXRoKHByb2Nlc3NlZF9kaXIsIAogICAgICAgICAgICAgICAgICAgICAiU0NQQ1MwMDA0OTAiLCAKICAgICAgICAgICAgICAgICAgICAgIlNDUENMMDAwODIyX3Byb2Nlc3NlZC5yZHMiKQpgYGAKCldlIHdpbGwgc2F2ZSB0aGUgQVVDZWxsIHJlc3VsdHMgYXMgYSB0YWJsZSBpbiB0aGUgYW5hbHlzaXMgZGlyZWN0b3J5LgoKYGBge3Igc2V0dXBfb3V0cHV0X2ZpbGVzLCBsaXZlID0gVFJVRX0Kb3V0cHV0X2ZpbGUgPC0gZnM6OnBhdGgoYW5hbHlzaXNfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAiZXdpbmdfc2FyY29tYV9hdWNlbGxfcmVzdWx0cy50c3YiKQpgYGAKCgojIyMgRnVuY3Rpb25zCgpUaGUgYHNvdXJjZSgpYCBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gbG9hZCBpbiBjdXN0b20gZnVuY3Rpb25zIHdlIHNhdmVkIGluIGFuIGAuUmAgZmlsZS4KCmBgYHtyIHNvdXJjZV9mdW5jdGlvbnN9CnNvdXJjZShmczo6cGF0aCgidXRpbCIsICJhdWNlbGxfZnVuY3Rpb25zLlIiKSkKYGBgCgpUaGlzIGxvYWRzIG9uZSBjdXN0b20gZnVuY3Rpb24sIGNhbGxlZCBgcGxvdF9yZWNvdmVyeV9jdXJ2ZSgpYCwgaW50byBvdXIgZW52aXJvbm1lbnQuClRoaXMgZnVuY3Rpb24gaXMgYWRhcHRlZCBmcm9tIFt0aGUgQVVDZWxsIHZpZ25ldHRlXShodHRwczovL2dpdGh1Yi5jb20vYWVydHNsYWIvQVVDZWxsL2Jsb2IvOTE3NTNiMzI3YTM5ZGM3YTRiYmVkNDY0MDhlYzIyNzFjNDg1ZjJmMC92aWduZXR0ZXMvQVVDZWxsLlJtZCNMMjk1LUwzMTYpLgoKIyMgU2V0IHVwIGdlbmUgc2V0cwoKV2UgYXJlIGdvaW5nIHRvIHVzZSB0d28gZ2VuZSBzZXRzIHBlcnRhaW5pbmcgdG8gRXdpbmcgc2FyY29tYS4KCiogW2BaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OYF0oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2dlbmVzZXRfcGFnZS5qc3A/Z2VuZVNldE5hbWU9WkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiksIHdoaWNoIGFyZSBnZW5lcyB0aGF0IHdlcmUgaGlnaGx5IGV4cHJlc3NlZCBpbiBhIHJoYWJkb215b3NhcmNvbWEgY2VsbCBsaW5lIGVuZ2luZWVyZWQgdG8gZXhwcmVzcyB0aGUgRVdTUjEtRkxJMSBmdXNpb24uCiogW2BSSUdHSV9FV0lOR19TQVJDT01BX1BST0dFTklUT1JfVVBgXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvY2FyZHMvUklHR0lfRVdJTkdfU0FSQ09NQV9QUk9HRU5JVE9SX1VQKSwgd2hpY2ggYXJlIGdlbmVzIHRoYXQgd2VyZSBoaWdobHkgZXhwcmVzc2VkIGluIG1lc2VuY2h5bWFsIHN0ZW0gY2VsbHMgZW5naW5lZXJlZCB0byBleHByZXNzIHRoZSBFV1MtRkxJMSBmdXNpb24gcHJvdGVpbi4KCldlIHdvdWxkIGV4cGVjdCBib3RoIG9mIHRoZXNlIGdlbmUgc2V0cyB0byBoYXZlIGhpZ2ggZXhwcmVzc2lvbiBpbiB0dW1vciBjZWxscy4KCmBgYHtyIGdlbmVzZXRzfQojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciB3aXRoIHRoZSByZWxldmFudCBnZW5lIHNldCBuYW1lcwpld2luZ19nZW5lX3NldF9uYW1lcyA8LSBjKHpoYW5nID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2dpID0gIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUCIpCgpld2luZ19nZW5lX3NldF9uYW1lcwpgYGAKClRoZXNlIGdlbmUgc2V0cyBjb21lIGZyb20gdGhlIEMyIGdlbmUgc2V0IGNvbGxlY3Rpb24gZnJvbSBNU2lnREIuCkxldCdzIHJldHJpZXZlIHRoZW0gdXNpbmcgYG1zaWdkYnIoKWAuCgpgYGB7ciBleHRyYWN0X2dlbmVzZXRzLCBsaXZlID0gVFJVRX0KZXdpbmdfZ2VuZV9zZXRzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9ICJIb21vIHNhcGllbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9ICJDMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNhdGVnb3J5ID0gIkNHUCIpIHw+CiAgZHBseXI6OmZpbHRlcihnc19uYW1lICVpbiUgZXdpbmdfZ2VuZV9zZXRfbmFtZXMpCmBgYAoKYEFVQ2VsbGAgdXNlcyBnZW5lIHNldHMgaW4gYSBwYXJ0aWN1bGFyIGZvcm1hdCB0aGF0IGNvbWVzIGZyb20gdGhlIGBHU0VBQmFzZWAgcGFja2FnZS4KV2UgbmVlZCB0byBjcmVhdGUgYSBgR2VuZVNldENvbGxlY3Rpb25gLgoKYGBge3IgZ2VuZV9zZXRfY29sbGVjdGlvbn0KZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBld2luZ19nZW5lX3NldF9uYW1lcyB8PgogIHB1cnJyOjptYXAoCiAgICAjIEZvciBlYWNoIGdlbmUgc2V0CiAgICBcKGdlbmVfc2V0X25hbWUpIHsKICAgICAgZXdpbmdfZ2VuZV9zZXRzX2RmIHw+CiAgICAgICAgIyBTdWJzZXQgdG8gdGhlIHJvd3MgaW4gdGhhdCBnZW5lIHNldAogICAgICAgIGRwbHlyOjpmaWx0ZXIoZ3NfbmFtZSA9PSBnZW5lX3NldF9uYW1lKSB8PgogICAgICAgICMgR3JhYiB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzCiAgICAgICAgZHBseXI6OnB1bGwoZW5zZW1ibF9nZW5lKSB8PgogICAgICAgICMgQ3JlYXRlIGEgR2VuZVNldCBvYmplY3QKICAgICAgICBHZW5lU2V0KHNldE5hbWUgPSBnZW5lX3NldF9uYW1lLAogICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEVOU0VNQkxJZGVudGlmaWVyKCkpCiAgICB9CiAgKSB8PgogICMgVHVybiB0aGUgbGlzdCBvZiBHZW5lU2V0IG9iamVjdHMgaW50byBhIEdlbmVTZXQgY29sbGVjdGlvbgogIEdlbmVTZXRDb2xsZWN0aW9uKCkKYGBgCgojIyBSZWFkIGluIGFuZCBwcmVwYXJlIFNpbmdsZUNlbGxFeHBlcmltZW50CgpgYGB7ciByZWFkX2luX3NjZSwgbGl2ZSA9IFRSVUV9CnNjZSA8LSByZWFkcjo6cmVhZF9yZHMoc2NlX2ZpbGUpCmBgYAoKVGhlIGBBVUNlbGxgIGZ1bmN0aW9ucyB0YWtlcyBhbiBleHByZXNzaW9uIG1hdHJpeCB3aXRoIGdlbmVzIGFzIHJvd3MgYW5kIGNlbGxzIGFzIGNvbHVtbi4KV2UgY2FuIGV4dHJhY3QgYSBjb3VudHMgbWF0cml4IGluIHNwYXJzZSBmb3JtYXQgZm9yIHVzZSB3aXRoIGBBVUNlbGxgLgoKYGBge3IgY291bnRzX21hdHJpeH0KIyBFeHRyYWN0IGNvdW50cyBtYXRyaXgKY291bnRzX21hdHJpeCA8LSBjb3VudHMoc2NlKQpgYGAKClRoZXJlIG1heSBiZSBnZW5lcyBpbiBvdXIgZ2VuZSBzZXQgdGhhdCBkbyBub3QgYXBwZWFyIGluIHRoZSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmplY3QuCldlIGNhbiByZW1vdmUgdGhlbSB1c2luZyB0aGUgYHN1YnNldEdlbmVTZXRzKClgIGZ1bmN0aW9uLgoKYGBge3Igc3Vic2V0X2dlbmVfc2V0cywgbGl2ZSA9IFRSVUV9CiMgUmVtb3ZlIGdlbmVzIGZyb20gZ2VuZSBzZXRzIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgU0NFCmV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24gPC0gc3Vic2V0R2VuZVNldHMoZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhjb3VudHNfbWF0cml4KSkKYGBgCgojIyBBVUNlbGwKCkFVQ2VsbCByZWxpZXMgb24gcmFua2luZyBnZW5lcyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGV4cHJlc3Npb24gdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBBVUMuClRoZSBBVUMgaXMgdGhlIGFyZWEgdW5kZXIgdGhlIHJlY292ZXJ5IGN1cnZlLCB3aGljaCBjYXB0dXJlcyB0aGUgbnVtYmVyIG9mIGdlbmVzIGluIGEgZ2VuZSBzZXQgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcmFua2luZ3MgYWJvdmUgc29tZSB0aHJlc2hvbGQgKGkuZS4sIGl0IGlzIHRoZSBhcmVhIHVuZGVyIHRoZSBjdXJ2ZSB0byB0aGUgbGVmdCBvZiB0aGlzIGdlbmUgcmFuaykuCkJ5IGRlZmF1bHQsIHRoZSB0b3AgNSUgb2YgZ2VuZXMgYXJlIHVzZWQgYXMgdGhlIHRocmVzaG9sZC4KClNvbWUgZ2VuZXMgd2lsbCBub3QgYmUgZGV0ZWN0ZWQgKGkuZS4sIGhhdmUgMCBjb3VudHMpLgpHZW5lcyBjYW4gYWxzbyBoYXZlIHRoZSBzYW1lIGV4cHJlc3Npb24gbGV2ZWwgKGkuZS4sIHRpZXMpLgpUaGVzZSB1bmRldGVjdGVkIGdlbmVzIGFuZCB0aWVzIHdpbGwgYmUgcmFuZG9tbHkgb3JkZXJlZCBpbiBvdXIgcmFua2luZy4KVG8gbWFrZSBvdXIgcmFua2luZ3Mg4oCTIGFuZCB0aGVyZWZvcmUgcmVzdWx0cyDigJMgcmVwcm9kdWNpYmxlLCB3ZSB3aWxsIHNldCBhIHNlZWQuCgpgYGB7ciBzZXRfc2VlZCwgbGl2ZSA9IFRSVUV9CnNldC5zZWVkKDIwMjQpCmBgYAoKIyMjIENlbGwgcmFua2luZwoKVGhlIGZpcnN0IHN0ZXAgaW4gQVVDZWxsIGlzIHRvIHJhbmsgZ2VuZXMgZm9yIGVhY2ggY2VsbCBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGV4cHJlc3Npb24gdmFsdWUuCldlIGNhbiBkbyB0aGlzIHVzaW5nIHRoZSBgQVVDZWxsX2J1aWxkUmFua2luZ3MoKWAgZnVuY3Rpb24sIHdoaWNoIHdpbGwgb3V0cHV0IGEgdmlzdWFsaXphdGlvbiBzaG93aW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBpbiB0aGUgY2VsbHMgaW4gb3VyIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdC4KCmBgYHtyIGNlbGxfcmFua2luZ3MsIGxpdmUgPSBUUlVFfQpjZWxsX3JhbmtpbmdzIDwtIEFVQ2VsbF9idWlsZFJhbmtpbmdzKGNvdW50c19tYXRyaXgpCmBgYAoKVGhlIEFVQ2VsbCBhdXRob3JzIHJlY29tbWVuZCBtYWtpbmcgc3VyZSBtb3N0IGNlbGxzIGhhdmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBnZW5lcyB3ZSB3aWxsIHVzZSBhcyB0aGUgbWF4IHJhbmsgdG8gY2FsY3VsYXRlIHRoZSBBVUMuCgpUaGUgQVVDIG1heCByYW5rIHZhbHVlIHRlbGxzIEFVQ2VsbCB0aGUgY3V0b2ZmIGluIHRoZSBnZW5lIHJhbmtpbmdzIHRvIHVzZSBmb3IgY2FsY3VsYXRpbmcgQVVDOyB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGlzIGN1cnZlIGFuZCBtYXggcmFuayBpbiBqdXN0IGEgbW9tZW50LgpJZiB3ZSBwaWNrZWQgYSBtYXggcmFuayBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGluIG1vc3QgY2VsbHMsIHRoZSBub24tZGV0ZWN0ZWQgZ2VuZXMgdGhhdCBhcmUgcmFuZG9tbHkgb3JkZXJlZCB3b3VsZCBwbGF5IGFuIG91dHNpemVkIHJvbGUgaW4gb3VyIEFVQyB2YWx1ZXMuCgpCeSBkZWZhdWx0LCB0aGUgbWF4IHJhbmsgaXMgdGhlIHRvcCA1JSBoaWdoZXN0IGV4cHJlc3NlZCBnZW5lcy4KV2UgY2FuIGNhbGN1bGF0ZSB0aGUgZGVmYXVsdCBtYXggcmFuayBieSB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBudW1iZXIgb2YgZ2VuZXMuCgpgYGB7ciBleHBsb3JlX2F1Y19tYXhfcmFua30KbnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDUKYGBgCgpUaGlzIG51bWJlciBpcyBwcm9iYWJseSB0b28gaGlnaCwgZ2l2ZW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGJ5IGNlbGwgd2UgdmlzdWFsaXplZCB3aXRoIGBBVUNlbGxfYnVpbGRSYW5raW5ncygpYC4KCldoYXQgaWYgd2UgY2hvc2UgYSAxJSB0aHJlc2hvbGQ/CgpgYGB7ciBsb3dlcl9tYXhfcmFuaywgbGl2ZSA9IFRSVUV9Cm5yb3coY2VsbF9yYW5raW5ncykgKiAwLjAxCmBgYAoKVGhhdCBpcyBwcm9iYWJseSBhIG1vcmUgcmVhc29uYWJsZSBjaG9pY2UgZm9yIHRoaXMgZGF0YXNldC4KCldlIGNhbiB1c2UgYSBmdW5jdGlvbiBjYWxsZWQgYGNlaWxpbmcoKWAgdG8gcm91bmQgdGhpcyBhbmQgc2F2ZSBpdCB0byBhIHZhcmlhYmxlIGZvciBsYXRlciB1c2UuCgpgYGB7ciBhdWNfbWF4X3JhbmssIGxpdmUgPSBUUlVFfQphdWNfbWF4X3JhbmsgPC0gY2VpbGluZyhucm93KGNlbGxfcmFua2luZ3MpICogMC4wMSkKYGBgCgojIyMgUGxvdHRpbmcgQVVDCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIEFVQ2VsbCBhcmUgdGhlIGFyZWEgdW5kZXIgYSByZWNvdmVyeSBjdXJ2ZSBhbmQgZXN0aW1hdGUgdGhlIHByb3BvcnRpb24gb2YgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0IHRoYXQgYXJlIGhpZ2hseSBleHByZXNzZWQgKGkuZS4sIGhpZ2hseSByYW5rZWQpLgoKTGV0J3MgcGxvdCB0aGUgcmVjb3ZlcnkgY3VydmUgZm9yIGEgY2VsbCB3aXRoIGhpZ2ggQVVDIGFuZCBhIGNlbGwgd2l0aCBsb3cgQVVDIHRvIGdldCBhIGJldHRlciBpbnR1aXRpb24gYWJvdXQgQVVDIHZhbHVlcy4KRWFybGllciwgd2UgbG9hZGVkIGEgY3VzdG9tIGZ1bmN0aW9uIHdlIGFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9naXRodWIuY29tL2FlcnRzbGFiL0FVQ2VsbC9ibG9iLzkxNzUzYjMyN2EzOWRjN2E0YmJlZDQ2NDA4ZWMyMjcxYzQ4NWYyZjAvdmlnbmV0dGVzL0FVQ2VsbC5SbWQpIGNhbGxlZCBgcGxvdF9yZWNvdmVyeV9jdXJ2ZSgpYCB3aXRoIGBzb3VyY2UoKWAuCgpGaXJzdCwgd2UnbGwgc3RhcnQgd2l0aCBhIGNlbGwgd2l0aCBhIGhpZ2ggQVVDLgpXZSBwaWNrZWQgdGhpcyBiYXJjb2RlIGFoZWFkIG9mIHRpbWUgd2hlbiB3ZSB3cm90ZSB0aGUgbm90ZWJvb2suCgpgYGB7ciBoaWdoX3JlY292ZXJ5X2N1cnZlfQpwbG90X3JlY292ZXJ5X2N1cnZlKGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSAiQ1RHQUdDR0dUQ1RUVEFUQyIsCiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQgCmBgYAoKVGhlIHgtYXhpcyBpcyB0aGUgZ2VuZSByYW5rcyBmb3IgYWxsIGdlbmVzLgpUaGUgeS1heGlzIGlzIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIHNpZ25hdHVyZSBhdCBhIGdpdmVuIHBvaW50IGluIHRoZSBnZW5lIHJhbmtpbmcg4oCTIHRoZSBsaW5lIHdpbGwgcmlzZSB3aGVuIGEgZ2VuZSBpbiB0aGUgZ2VuZSBzZXQgaXMgZW5jb3VudGVyZWQgaW4gdGhlIHJhbmtpbmcgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdC4KVGhlIEFVQyBpcyB0aGUgYXJlYSB1bmRlciB0aGlzIHJlY292ZXJ5IGN1cnZlIGF0IHRoZSBtYXggcmFuayB0aHJlc2hvbGQgY2hvc2VuIGZvciB0aGlzIGRhdGFzZXQuCgpOb3csIGxldCdzIGxvb2sgYXQgYW4gZXhhbXBsZSB3aXRoIGEgbG93IEFVQy4KCmBgYHtyIGxvd19yZWNvdmVyeV9jdXJ2ZX0KcGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLAogICAgICAgICAgICAgICAgICAgIGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfbmFtZSA9ICJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OIiwKICAgICAgICAgICAgICAgICAgICBiYXJjb2RlID0gIkFHQVRBR0FHVENBQ0FBVEMiLAogICAgICAgICAgICAgICAgICAgIGF1Y19tYXhfcmFuayA9IGF1Y19tYXhfcmFuaykgICMgMSUgdGhyZXNob2xkCmBgYAoKRmFyIGZld2VyIGdlbmVzIGluIHRoZSBnZW5lIHNldCBhcmUgcmFua2VkIGFib3ZlIHRoZSB0aHJlc2hvbGQsIHlpZWxkaW5nIGEgbG93ZXIgQVVDIHZhbHVlLgoKIyMjIENhbGN1bGF0aW5nIHRoZSBBVUMKCk9uY2Ugd2UgaGF2ZSB0aGUgcmFua2luZ3MsIHdlIGNhbiBjYWxjdWxhdGUgdGhlIEFVQyBzY29yZXMgZm9yIGJvdGggZ2VuZSBzZXRzIGluIGFsbCBjZWxscyB3aXRoIHRoZSBgQVVDZWxsX2NhbGNBVUMoKWAgZnVuY3Rpb24uCgpgYGB7ciBjYWxjX2F1YywgbGl2ZT1UUlVFfQpjZWxsX2F1YyA8LSBBVUNlbGxfY2FsY0FVQyhnZW5lU2V0cyA9IGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICByYW5raW5ncyA9IGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y01heFJhbmsgPSBhdWNfbWF4X3JhbmspCmBgYAoKVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBhdWNlbGxSZXN1bHRzYCBvYmplY3QuCgpgYGB7ciBjaGVja19zdHIsIGxpdmUgPSBUUlVFfQpzdHIoY2VsbF9hdWMpCmBgYAoKSXQgY2FuIGJlIG11Y2ggbW9yZSBjb252ZW5pZW50IHRvIHdvcmsgd2l0aCB0aGlzIGluIGEgdGFidWxhciBmb3JtYXQuCgpgYGB7ciBhdWNfdG9fdGFibGV9CiMgRXh0cmFjdCBBVUMKYXVjX2RmIDwtIGNlbGxfYXVjQGFzc2F5c0BkYXRhJEFVQyB8PgogICMgVHJhbnNwb3NlCiAgdCgpIHw+CiAgIyBDb252ZXJ0IHRvIGRhdGEgZnJhbWUKICBhcy5kYXRhLmZyYW1lKCkgfD4KICAjIE1ha2UgdGhlIGJhcmNvZGVzIGEgY29sdW1uCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oImJhcmNvZGVzIikgCgojIExvb2sgYXQgZmlyc3QgZmV3IHJvd3MKaGVhZChhdWNfZGYpCmBgYAoKIyMjIEFzc2lnbm1lbnRzCgpBVUNlbGwgY2FuIGFzc2lnbiBjZWxscyBhcyBoYXZpbmcgYW4gYWN0aXZlIGdlbmUgc2V0IG9yIG5vdCBieSBwaWNraW5nIGEgdGhyZXNob2xkIGF1dG9tYXRpY2FsbHkuCldlJ2xsIGV4cGxvcmUgdGhlc2UgaW4gYSBsYXRlciBwbG90LCBidXQgZm9yIG5vdywgbGV0J3MgY2FsY3VsYXRlIHRoZSB0aHJlc2hvbGQgYW5kIGFzc2lnbiBjZWxscyB3aXRoIGBBVUNlbGxfZXhwbG9yZVRocmVzaG9sZHMoKWAuCgpgYGB7ciBhdWNfYXNzaWdubWVudHMsIGxpdmUgPSBUUlVFfQphdWNfYXNzaWdubWVudHMgPC0gQVVDZWxsX2V4cGxvcmVUaHJlc2hvbGRzKGNlbGxfYXVjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90SGlzdCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25DZWxscyA9IFRSVUUpCmBgYAoKV2UncmUgZ29pbmcgdG8gcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIEFVQyB2YWx1ZXMgd2l0aCBgZ2dwbG90MmAsIHNvIHdlIHdpbGwgd2FudCB0aGUgQVVDIHZhbHVlcyBpbiBhIGxvbmdlciBmb3JtYXQuCgpgYGB7ciBhdWNfcGxvdHRpbmdfZGZ9CmF1Y19wbG90dGluZ19kZiA8LSBhdWNfZGYgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFiYXJjb2RlcywKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImdlbmVfc2V0IiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhdWMiKSB8PgogIGRwbHlyOjptdXRhdGUoCiAgICAjIENyZWF0ZSBhIG5ldyBsb2dpY2FsIGNvbHVtbiBjYWxsZWQgYXNzaWduZWQKICAgIGFzc2lnbmVkID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgIyBGb3IgWmhhbmcgZ2VuZSBzZXQgcm93cywgc2V0IHRvIFRSVUUgd2hlbiB0aGUgYmFyY29kZSBpcyBpbiB0aGUgCiAgICAgICMgYXNzaWdubWVudCBsaXN0CiAgICAgIGdlbmVfc2V0ID09IGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0gJiAKICAgICAgICBiYXJjb2RlcyAlaW4lIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJ6aGFuZyJdXV1dJGFzc2lnbm1lbnQgfiBUUlVFLAogICAgICAjIEZvciBSaWdnaSBnZW5lIHNldCByb3dzLCBzZXQgdG8gVFJVRSB3aGVuIHRoZSBiYXJjb2RlIGlzIGluIHRoZSAKICAgICAgIyBhc3NpZ25tZW50IGxpc3QKICAgICAgZ2VuZV9zZXQgPT0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJyaWdnaSJdXSAmIAogICAgICAgIGJhcmNvZGVzICVpbiUgYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dXV0kYXNzaWdubWVudCB+IFRSVUUsCiAgICAgICMgT3RoZXJ3aXNlLCBzZXQgdG8gRkFMU0UKICAgICAgLmRlZmF1bHQgPSBGQUxTRQogICAgKQogICkKCmF1Y19wbG90dGluZ19kZgpgYGAKClRvIGRyYXcgdmVydGljYWwgbGluZXMgcmVwcmVzZW50aW5nIHRoZSBhdXRvbWF0aWNhbGx5IGNob3NlbiB0aHJlc2hvbGQsIHdlIGNhbiBjcmVhdGUgYSBzZXBhcmF0ZSBkYXRhIGZyYW1lLgoKYGBge3IgYXVjX3RocmVzaG9sZF9kZn0KYXVjX3RocmVzaG9sZF9kZiA8LSBkYXRhLmZyYW1lKAogIGdlbmVfc2V0ID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXMsCiAgIyBHcmFiIHRocmVzaG9sZHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZ2VuZSBzZXQgZnJvbSBhc3NpZ25lbWVudHMgb2JqZWN0CiAgdGhyZXNob2xkID0gYyhhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzWyJ6aGFuZyJdXV0kYXVjVGhyJHNlbGVjdGVkLCAKICAgICAgICAgICAgICAgIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbInJpZ2dpIl1dXSRhdWNUaHIkc2VsZWN0ZWQpCikKCmF1Y190aHJlc2hvbGRfZGYKYGBgCgpOb3cgbGV0J3MgbWFrZSBhIGRlbnNpdHkgcGxvdCwgcGxvdHRpbmcgdGhlIGRlbnNpdHkgb2YgdGhlIGFzc2lnbmVkIGFuZCB1bmFzc2lnbmVkIGNlbGxzIHNlcGFyYXRlbHkgYW5kIGRyYXdpbmcgYSB2ZXJ0aWNhbCBsaW5lIGZvciB0aGUgdGhyZXNob2xkLgoKYGBge3IgYXVjX2RlbnNpdHlfcGxvdH0KYXVjX3Bsb3R0aW5nX2RmIHw+CiAgZ2dwbG90Mjo6Z2dwbG90KAogICAgZ2dwbG90Mjo6YWVzKAogICAgICB4ID0gYXVjLCAgIyBBVUMgdmFsdWVzCiAgICAgIGNvbG9yID0gYXNzaWduZWQsICAjIEdyb3VwIGJ5IGFzc2lnbm1lbnQKICAgICAgZmlsbCA9IGFzc2lnbmVkLCAgICMgR3JvdXAgYnkgYXNzaWdubWVudAogICAgKQogICkgKwogIGdncGxvdDI6Omdlb21fZGVuc2l0eShhbHBoYSA9IDAuMikgKwogICMgRHJhdyBhIHZlcnRpY2FsIGRvdHRlZCBsaW5lIHNob3dpbmcgdGhlIHRocmVzaG9sZCBmb3IgZWFjaCBnZW5lIHNldAogIGdncGxvdDI6Omdlb21fdmxpbmUoZGF0YSA9IGF1Y190aHJlc2hvbGRfZGYsCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHhpbnRlcmNlcHQgPSB0aHJlc2hvbGQpLAogICAgICAgICAgICAgICAgICAgICAgbHR5ID0gMikgKwogICMgUGxvdCBlYWNoIGdlbmUgc2V0IGluIGl0cyBvd24gZmFjZXQKICBnZ3Bsb3QyOjpmYWNldF9ncmlkKGNvbHMgPSBnZ3Bsb3QyOjp2YXJzKGdlbmVfc2V0KSkgKwogICMgVXNlIGEgYnVpbHQtaW4gdGhlbWUKICBnZ3Bsb3QyOjp0aGVtZV9idygpCmBgYAoKRm9yIHRoZXNlIHBhcnRpY3VsYXIgZ2VuZSBzZXRzLCB0aGUgQVVDIHZhbHVlcyBhcHBlYXIgdG8gYmUgYmltb2RhbGx5IGRpc3RyaWJ1dGVkLCBhbmQgd2UgY2FuIGVhc2lseSBpZGVudGlmeSBjZWxscyB3aGVyZSB0aGUgZ2VuZXMgYXJlIGhpZ2hseSBleHByZXNzZWQuCgpMZXQncyB3cml0ZSB0aGlzIHRhYmxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KCmBgYHtyfQphdWNfcGxvdHRpbmdfZGYgfD4gCiAgcmVhZHI6OndyaXRlX3RzdihvdXRwdXRfZmlsZSkKYGBgCgojIyMgVU1BUHMKCiMjIyMgQWRkaW5nIEFVQyB0byBgY29sRGF0YWAKCldlIGNhbiBhbHNvIGFkZCB0aGUgQVVDIHZhbHVlcyBiYWNrIGludG8gdGhlIFNpbmdsZUNlbGxFeHBlcmltZW50IGZvciBjb252ZW5pZW5jZSwgZS5nLiwgZm9yIHBsb3R0aW5nLgpXZSdsbCBhZGQgaXQgdG8gdGhlIGV4aXN0aW5nIGBjb2xEYXRhYC4KCkZpcnN0LCBsZXQncyByZW5hbWUgdGhlIGdlbmUgc2V0IGNvbHVtbnMgdG8gc29tZXRoaW5nIG1vcmUgZWFzaWx5IHR5cGVkLgoKYGBge3IgcmVuYW1lX2dlbmVfc2V0fQphdWNfZGYgPC0gYXVjX2RmIHw+CiAgIyBVc2Ugc2hvcnRlciBuYW1lcwogIGRwbHlyOjpyZW5hbWUoemhhbmdfYXVjID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJ6aGFuZyJdXSwKICAgICAgICAgICAgICAgIHJpZ2dpX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1sicmlnZ2kiXV0pCgpgYGAKCkFuZCBqb2luIGl0IHRvIHRoZSBleGlzdGluZyBgY29sRGF0YWAuCgpgYGB7ciBjb2xkYXRhLCBsaXZlID0gVFJVRX0KIyBFeHRyYWN0IHRoZSBleGlzdGluZyBjb2xEYXRhLCBhbmQgbGVmdCBqb2luIGl0IHdpdGggdGhlIEFVQyB2YWx1ZXMgYnkgdGhlCiMgYmFyY29kZXMKY29sZGF0YV9kZiA8LSBjb2xEYXRhKHNjZSkgfD4KICBhcy5kYXRhLmZyYW1lKCkgfD4KICBkcGx5cjo6bGVmdF9qb2luKAogICAgYXVjX2RmLAogICAgYnkgPSAiYmFyY29kZXMiCiAgKQpgYGAKCk5vdywgd2UncmUgcmVhZHkgdG8gYWRkIGl0IGJhY2sgdG8gdGhlIG9iamVjdC4KCmBgYHtyIGFkZF9iYWNrX2NvbERhdGEsIGxpdmUgPSBUUlVFfQojIFdlIG5lZWQgdG8gc2F2ZSB0aGlzIGFzIGEgRGF0YUZyYW1lCmNvbERhdGEoc2NlKSA8LSBEYXRhRnJhbWUoCiAgY29sZGF0YV9kZiwKICByb3cubmFtZXMgPSBjb2xEYXRhKHNjZSkkYmFyY29kZXMKKQpgYGAKCiMjIyMgUGxvdHRpbmcgVU1BUHMKCldlIGNhbiB1c2UgdGhlIGBwbG90VU1BUCgpYCBmdW5jdGlvbiBmcm9tIHRoZSBgc2NhdGVyYCBwYWNrYWdlIHRvIHBsb3QgYSBVTUFQIHdpdGggdGhlIHBvaW50cyBjb2xvcmVkIGJ5IHRoZSBBVUMgdmFsdWUKCmBgYHtyIHBsb3RfdW1hcF96aGFuZ30Kc2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9ICJ6aGFuZ19hdWMiKSArCiAgIyBVc2UgdGhlIGdlbmUgc2V0IG5hbWUsIHJlcGxhY2luZyB1bmRlcnNjb3JlcyB3aXRoIHNwYWNlcwogIGdncGxvdDI6OmdndGl0bGUoc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXF8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpKQpgYGAKCkxldCdzIGNvbG9yIHRoZSBwb2ludHMgYnkgdGhlIEFVQyB2YWx1ZXMgZm9yIHRoZSBvdGhlciBnZW5lIHNldC4KCmBgYHtyIHBsb3RfdW1hcF9yaWdnaSwgbGl2ZSA9IFRSVUV9CnNjYXRlcjo6cGxvdFVNQVAoc2NlLCBjb2xvdXJfYnkgPSAicmlnZ2lfYXVjIikgKyAKICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKYGBgCgpXZSB3b3VsZCB3YW50IHRvIGRvIHNvbWV0aGluZyBtb3JlIGZvcm1hbCB0byBjb25maXJtLCBidXQgaXQgc2VlbXMgbGlrZSB0aGUgc2FtZSBjZWxscyBoYXZlIGhpZ2ggQVVDIHZhbHVlcyBmb3IgYm90aCBnZW5lIHNldHMhCgojIyBTZXNzaW9uIEluZm8KCmBgYHtyIHNlc3Npb25faW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK</div> +<div id="rmd-source-code">LS0tCnRpdGxlOiAiUGF0aHdheSBBbmFseXNpczogQVVDZWxsIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ0NETCBmb3IgQUxTRgpkYXRlOiAyMDI0Ci0tLQoKKkFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL3JlbGVhc2UvYmlvYy92aWduZXR0ZXMvQVVDZWxsL2luc3QvZG9jL0FVQ2VsbC5odG1sKSBhbmQgW3RoZSBgY2VsbC10eXBlLWV3aW5nc2AgbW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuU2NQQ0EtYW5hbHlzaXMvdHJlZS9tYWluL2FuYWx5c2VzL2NlbGwtdHlwZS1ld2luZ3MpIHRoYXQgaXMgcGFydCBvZiB0aGUgT3BlbiBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIHByb2plY3QuKgoKIyMgT2JqZWN0aXZlcwoKLSBJbnRyb2R1Y2UgdGhlIGBBVUNlbGxgIFIgcGFja2FnZQotIElsbHVzdHJhdGUgaG93IEFVQyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQKLSBEZW1vbnN0cmF0ZSBob3cgQVVDIHZhbHVlcyBjYW4gYmUgdXNlZCBmb3IgY2VsbCBhc3NpZ25tZW50IGFuZCBwbG90dGluZwoKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSdsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBBVUNlbGwgbWV0aG9kLCBpbnRyb2R1Y2VkIGluIFtBaWJhciBfZXQgYWxfLiAyMDE3Ll0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvbm1ldGguNDQ2MykuCgpXZSBjYW4gdXNlIEFVQ2VsbCB3aGVuIHdlIGFyZSBpbnRlcmVzdGVkIGluIGEgZ2VuZSBzZXQncyByZWxhdGl2ZSBleHByZXNzaW9uIG9yIGFjdGl2aXR5IGluIGFuIGluZGl2aWR1YWwgY2VsbC4KR2VuZSBzZXRzIGNhbiBjb21lIGZyb20gYSBjdXJhdGVkIGNvbGxlY3Rpb24gb2YgcHJpb3Iga25vd2xlZGdlLCBsaWtlIHRoZSBIYWxsbWFyayBjb2xsZWN0aW9uIHdlIHVzZWQgaW4gdGhlIGxhc3Qgbm90ZWJvb2ssIG9yIHdlIGNhbiB1c2Ugb3VyIG93biBjdXN0b20gZ2VuZSBzZXRzIChlLmcuLCBhIHNldCBvZiBtYXJrZXIgZ2VuZXMgZm9yIGEgY2VsbCB0eXBlIG9mIGludGVyZXN0KS4KCkEgbmljZSBmZWF0dXJlIG9mIEFVQ2VsbCBpcyB0aGF0IGl0IGlzIGJhc2VkIG9uIHJhbmtpbmcgZ2VuZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBleHByZXNzaW9uIHZhbHVlIGluIGFuIGluZGl2aWR1YWwgY2VsbCwgd2hpY2ggaXMgaGVscGZ1bCBpbiB0aGUgZm9sbG93aW5nIHdheXMgKFtBVUNlbGwgdmlnbmV0dGVdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvdmlnbmV0dGVzL0FVQ2VsbC9pbnN0L2RvYy9BVUNlbGwuaHRtbCkpOgoKLSBJdCBjYW4gdGFrZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFsdWVzIGFzIGlucHV0IChlLmcuLCByYXcgY291bnRzLCBUUE0pIAotIEl0IGNvbXBlbnNhdGVzIGZvciBkaWZmZXJlbmNlcyBpbiBsaWJyYXJ5IHNpemUsIHdoZXJlIHNvbWV0aGluZyBsaWtlIGF2ZXJhZ2luZyByYXcgY291bnQgdmFsdWVzIG9mIGdlbmVzIGluIGEgZ2VuZSBzZXQgd291bGQgbm90IAotIEl0IHNjYWxlcyB0byBsYXJnZXIgZGF0YXNldHMsIHNpbmNlIGNyZWF0aW5nIHJhbmtpbmdzIGlzIG5vdCBhcyByZXNvdXJjZS1pbnRlbnNpdmUgYXMgc29tZXRoaW5nIGxpa2UgcGVybXV0YXRpb24gdGVzdGluZywgYW5kIHdlIGNvdWxkIHNwbGl0IHVwIHRoZSBvYmplY3QgaW50byBzdWJzZXRzIG9mIGNlbGxzIGlmIG5lZWRlZAoKQVVDZWxsIGNhbGN1bGF0ZXMgdGhlIGFyZWEgdW5kZXIgdGhlIHJlY292ZXJ5IGN1cnZlIChBVUMpLCB3aGljaCAicmVwcmVzZW50cyB0aGUgcHJvcG9ydGlvbiBvZiBleHByZXNzZWQgZ2VuZXMgaW4gdGhlIHNpZ25hdHVyZSBhbmQgdGhlaXIgcmVsYXRpdmUgZXhwcmVzc2lvbiB2YWx1ZSBjb21wYXJlZCB0byB0aGUgb3RoZXIgZ2VuZXMgd2l0aGluIHRoZSBjZWxsIiAoW0FpYmFyIF9ldCBhbF8uIDIwMTcuXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9ubWV0aC40NDYzKSkuCldlIHdpbGwgdmlzdWFsaXplIHNvbWUgcmVjb3ZlcnkgY3VydmVzIGluIHRoZSBub3RlYm9vayB0byBnaXZlIHlvdSBhIGJldHRlciBpbnR1aXRpb24gYWJvdXQgdGhlIEFVQyBhbmQgaXRzIG1lYW5pbmcuCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIEFVQ2VsbCBjYW4gYmUgdXNlZCBpbiBhIG51bWJlciBvZiB3YXlzIChbQWliYXIgX2V0IGFsXy4gMjAxNy5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L25tZXRoLjQ0NjMpKToKCi0gQXMgY29udGludW91cyB2YWx1ZXMgd2UgY2FuIHVzZSBmb3IgdmlzdWFsaXphdGlvbiBvciBjbHVzdGVyaW5nCi0gRm9yIGJpbmFyeSBhc3NpZ25tZW50IChpLmUuLCAib24iIGFuZCAib2ZmIiBvciAiZXhwcmVzc2VkIiBhbmQgIm5vdCBleHByZXNzZWQiKSBpZiB3ZSBwaWNrIGEgdGhyZXNob2xkIGVpdGhlciBhdXRvbWF0aWNhbGx5IHVzaW5nIGJ1aWx0LWluIGZ1bmN0aW9uYWxpdHkgb3IgbWFudWFsbHkgYnkgaW5zcGVjdGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mIHNjb3JlcyBvdXJzZWx2ZXMKCldlIHdpbGwgdXNlIGFuIHNuUk5BLXNlcSBvZiBhIEV3aW5nIHNhcmNvbWEgc2FtcGxlIGZyb20gdGhlIFtgU0NQQ1AwMDAwMTVgIHByb2plY3RdKGh0dHBzOi8vc2NwY2EuYWxleHNsZW1vbmFkZS5vcmcvcHJvamVjdHMvU0NQQ1AwMDAwMTUpIG9uIHRoZSBTaW5nbGUtY2VsbCBQZWRpYXRyaWMgQ2FuY2VyIEF0bGFzIFBvcnRhbCBhbmQgdHdvIHJlbGV2YW50IGdlbmUgc2V0cyBmcm9tIHRoZSBNb2xlY3VsYXIgU2lnbmF0dXJlcyBEYXRhYmFzZSAoTVNpZ0RCKSB0byBkZW1vbnN0cmF0ZSB0aGlzIG1ldGhvZC4KCiMjIFNldCB1cAoKIyMjIExpYnJhcmllcwoKYGBge3IgbGlicmFyaWVzfQojIFdlIHdpbGwgYmUgbG9hZGluZyBhIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdCBpbnRvIG91ciBlbnZpcm9ubWVudCBidXQgZG9uJ3QgbmVlZCB0byBzZWUgdGhlIHN0YXJ0dXAgbWVzc2FnZXMKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQp9KQoKIyBMaWJyYXJ5IHdlJ2xsIHVzZSBmb3IgdGhlIGdlbmUgc2V0IGFuYWx5c2lzIGl0c2VsZgpsaWJyYXJ5KEFVQ2VsbCkKCiMgTGlicmFyaWVzIGZvciBhY2Nlc3NpbmcgYW5kIHdvcmtpbmcgd2l0aCBnZW5lIHNldHMKbGlicmFyeShHU0VBQmFzZSkKbGlicmFyeShtc2lnZGJyKQpgYGAKCiMjIyBEaXJlY3RvcmllcyBhbmQgZmlsZXMKCiMjIyMgRGlyZWN0b3JpZXMKCmBgYHtyIHNldHVwX2RpcmVjdG9yaWVzfQojIElucHV0IGRhdGEgCmV3aW5nX2RhdGFfZGlyIDwtIGZzOjpwYXRoKCJkYXRhIiwgImV3aW5nLXNhcmNvbWEiKQpwcm9jZXNzZWRfZGlyIDwtIGZzOjpwYXRoKGV3aW5nX2RhdGFfZGlyLCAicHJvY2Vzc2VkIikKCiMgRGlyZWN0b3J5IGZvciBob2xkaW5nIHBhdGh3YXkgYW5hbHlzaXMgcmVzdWx0cwphbmFseXNpc19kaXIgPC0gZnM6OnBhdGgoImFuYWx5c2lzIiwgImV3aW5nLXNhcmNvbWEiLCAicGF0aHdheS1hbmFseXNpcyIpCiMgQ3JlYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0CmZzOjpkaXJfY3JlYXRlKGFuYWx5c2lzX2RpcikKYGBgCgojIyMjIEZpbGVzCgpUaGUgaW5wdXQgd2lsbCBiZSBhIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgZm9yIGFuIGluZGl2aWR1YWwgRXdpbmcgc2FyY29tYSBsaWJyYXJ5LgoKYGBge3Igc2V0dXBfaW5wdXRfZmlsZXN9CnNjZV9maWxlIDwtIGZzOjpwYXRoKHByb2Nlc3NlZF9kaXIsIAogICAgICAgICAgICAgICAgICAgICAiU0NQQ1MwMDA0OTAiLCAKICAgICAgICAgICAgICAgICAgICAgIlNDUENMMDAwODIyX3Byb2Nlc3NlZC5yZHMiKQpgYGAKCldlIHdpbGwgc2F2ZSB0aGUgQVVDZWxsIHJlc3VsdHMgYXMgYSB0YWJsZSBpbiB0aGUgYW5hbHlzaXMgZGlyZWN0b3J5LgoKYGBge3Igc2V0dXBfb3V0cHV0X2ZpbGVzLCBsaXZlID0gVFJVRX0Kb3V0cHV0X2ZpbGUgPC0gZnM6OnBhdGgoYW5hbHlzaXNfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAiZXdpbmdfc2FyY29tYV9hdWNlbGxfcmVzdWx0cy50c3YiKQpgYGAKCgojIyMgRnVuY3Rpb25zCgpUaGUgYHNvdXJjZSgpYCBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gbG9hZCBpbiBjdXN0b20gZnVuY3Rpb25zIHdlIHNhdmVkIGluIGFuIGAuUmAgZmlsZS4KCmBgYHtyIHNvdXJjZV9mdW5jdGlvbnN9CnNvdXJjZShmczo6cGF0aCgidXRpbCIsICJhdWNlbGxfZnVuY3Rpb25zLlIiKSkKYGBgCgpUaGlzIGxvYWRzIG9uZSBjdXN0b20gZnVuY3Rpb24sIGNhbGxlZCBgcGxvdF9yZWNvdmVyeV9jdXJ2ZSgpYCwgaW50byBvdXIgZW52aXJvbm1lbnQuClRoaXMgZnVuY3Rpb24gaXMgYWRhcHRlZCBmcm9tIFt0aGUgQVVDZWxsIHZpZ25ldHRlXShodHRwczovL2dpdGh1Yi5jb20vYWVydHNsYWIvQVVDZWxsL2Jsb2IvOTE3NTNiMzI3YTM5ZGM3YTRiYmVkNDY0MDhlYzIyNzFjNDg1ZjJmMC92aWduZXR0ZXMvQVVDZWxsLlJtZCNMMjk1LUwzMTYpLgoKIyMgU2V0IHVwIGdlbmUgc2V0cwoKV2UgYXJlIGdvaW5nIHRvIHVzZSB0d28gZ2VuZSBzZXRzIHBlcnRhaW5pbmcgdG8gRXdpbmcgc2FyY29tYS4KCiogW2BaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OYF0oaHR0cHM6Ly93d3cuZ3NlYS1tc2lnZGIub3JnL2dzZWEvbXNpZ2RiL2dlbmVzZXRfcGFnZS5qc3A/Z2VuZVNldE5hbWU9WkhBTkdfVEFSR0VUU19PRl9FV1NSMV9GTEkxX0ZVU0lPTiksIHdoaWNoIGFyZSBnZW5lcyB0aGF0IHdlcmUgaGlnaGx5IGV4cHJlc3NlZCBpbiBhIHJoYWJkb215b3NhcmNvbWEgY2VsbCBsaW5lIGVuZ2luZWVyZWQgdG8gZXhwcmVzcyB0aGUgRVdTUjEtRkxJMSBmdXNpb24uCiogW2BSSUdHSV9FV0lOR19TQVJDT01BX1BST0dFTklUT1JfVVBgXShodHRwczovL3d3dy5nc2VhLW1zaWdkYi5vcmcvZ3NlYS9tc2lnZGIvY2FyZHMvUklHR0lfRVdJTkdfU0FSQ09NQV9QUk9HRU5JVE9SX1VQKSwgd2hpY2ggYXJlIGdlbmVzIHRoYXQgd2VyZSBoaWdobHkgZXhwcmVzc2VkIGluIG1lc2VuY2h5bWFsIHN0ZW0gY2VsbHMgZW5naW5lZXJlZCB0byBleHByZXNzIHRoZSBFV1MtRkxJMSBmdXNpb24gcHJvdGVpbi4KCldlIHdvdWxkIGV4cGVjdCBib3RoIG9mIHRoZXNlIGdlbmUgc2V0cyB0byBoYXZlIGhpZ2ggZXhwcmVzc2lvbiBpbiB0dW1vciBjZWxscy4KCmBgYHtyIGdlbmVzZXRzfQojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciB3aXRoIHRoZSByZWxldmFudCBnZW5lIHNldCBuYW1lcwpld2luZ19nZW5lX3NldF9uYW1lcyA8LSBjKHpoYW5nID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2dpID0gIlJJR0dJX0VXSU5HX1NBUkNPTUFfUFJPR0VOSVRPUl9VUCIpCgpld2luZ19nZW5lX3NldF9uYW1lcwpgYGAKClRoZXNlIGdlbmUgc2V0cyBjb21lIGZyb20gdGhlIEMyIGdlbmUgc2V0IGNvbGxlY3Rpb24gZnJvbSBNU2lnREIuCkxldCdzIHJldHJpZXZlIHRoZW0gdXNpbmcgYG1zaWdkYnIoKWAuCgpgYGB7ciBleHRyYWN0X2dlbmVzZXRzLCBsaXZlID0gVFJVRX0KZXdpbmdfZ2VuZV9zZXRzX2RmIDwtIG1zaWdkYnIoc3BlY2llcyA9ICJIb21vIHNhcGllbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9ICJDMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNhdGVnb3J5ID0gIkNHUCIpIHw+CiAgZHBseXI6OmZpbHRlcihnc19uYW1lICVpbiUgZXdpbmdfZ2VuZV9zZXRfbmFtZXMpCmBgYAoKYEFVQ2VsbGAgdXNlcyBnZW5lIHNldHMgaW4gYSBwYXJ0aWN1bGFyIGZvcm1hdCB0aGF0IGNvbWVzIGZyb20gdGhlIGBHU0VBQmFzZWAgcGFja2FnZS4KV2UgbmVlZCB0byBjcmVhdGUgYSBgR2VuZVNldENvbGxlY3Rpb25gLgoKYGBge3IgZ2VuZV9zZXRfY29sbGVjdGlvbn0KZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiA8LSBld2luZ19nZW5lX3NldF9uYW1lcyB8PgogIHB1cnJyOjptYXAoCiAgICAjIEZvciBlYWNoIGdlbmUgc2V0CiAgICBcKGdlbmVfc2V0X25hbWUpIHsKICAgICAgZXdpbmdfZ2VuZV9zZXRzX2RmIHw+CiAgICAgICAgIyBTdWJzZXQgdG8gdGhlIHJvd3MgaW4gdGhhdCBnZW5lIHNldAogICAgICAgIGRwbHlyOjpmaWx0ZXIoZ3NfbmFtZSA9PSBnZW5lX3NldF9uYW1lKSB8PgogICAgICAgICMgR3JhYiB0aGUgRW5zZW1ibCBnZW5lIGlkZW50aWZpZXJzCiAgICAgICAgZHBseXI6OnB1bGwoZW5zZW1ibF9nZW5lKSB8PgogICAgICAgICMgQ3JlYXRlIGEgR2VuZVNldCBvYmplY3QKICAgICAgICBHZW5lU2V0KHNldE5hbWUgPSBnZW5lX3NldF9uYW1lLAogICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEVOU0VNQkxJZGVudGlmaWVyKCkpCiAgICB9CiAgKSB8PgogICMgVHVybiB0aGUgbGlzdCBvZiBHZW5lU2V0IG9iamVjdHMgaW50byBhIEdlbmVTZXQgY29sbGVjdGlvbgogIEdlbmVTZXRDb2xsZWN0aW9uKCkKYGBgCgojIyBSZWFkIGluIGFuZCBwcmVwYXJlIFNpbmdsZUNlbGxFeHBlcmltZW50CgpgYGB7ciByZWFkX2luX3NjZSwgbGl2ZSA9IFRSVUV9CnNjZSA8LSByZWFkcjo6cmVhZF9yZHMoc2NlX2ZpbGUpCmBgYAoKVGhlIGBBVUNlbGxgIGZ1bmN0aW9ucyB0YWtlcyBhbiBleHByZXNzaW9uIG1hdHJpeCB3aXRoIGdlbmVzIGFzIHJvd3MgYW5kIGNlbGxzIGFzIGNvbHVtbi4KV2UgY2FuIGV4dHJhY3QgYSBjb3VudHMgbWF0cml4IGluIHNwYXJzZSBmb3JtYXQgZm9yIHVzZSB3aXRoIGBBVUNlbGxgLgoKYGBge3IgY291bnRzX21hdHJpeH0KIyBFeHRyYWN0IGNvdW50cyBtYXRyaXgKY291bnRzX21hdHJpeCA8LSBjb3VudHMoc2NlKQpgYGAKClRoZXJlIG1heSBiZSBnZW5lcyBpbiBvdXIgZ2VuZSBzZXQgdGhhdCBkbyBub3QgYXBwZWFyIGluIHRoZSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmplY3QuCldlIGNhbiByZW1vdmUgdGhlbSB1c2luZyB0aGUgYHN1YnNldEdlbmVTZXRzKClgIGZ1bmN0aW9uLgoKYGBge3Igc3Vic2V0X2dlbmVfc2V0cywgbGl2ZSA9IFRSVUV9CiMgUmVtb3ZlIGdlbmVzIGZyb20gZ2VuZSBzZXRzIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgU0NFCmV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24gPC0gc3Vic2V0R2VuZVNldHMoZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhjb3VudHNfbWF0cml4KSkKYGBgCgojIyBBVUNlbGwKCkFVQ2VsbCByZWxpZXMgb24gcmFua2luZyBnZW5lcyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGV4cHJlc3Npb24gdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBBVUMuClRoZSBBVUMgaXMgdGhlIGFyZWEgdW5kZXIgdGhlIHJlY292ZXJ5IGN1cnZlLCB3aGljaCBjYXB0dXJlcyB0aGUgbnVtYmVyIG9mIGdlbmVzIGluIGEgZ2VuZSBzZXQgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcmFua2luZ3MgYWJvdmUgc29tZSB0aHJlc2hvbGQgKGkuZS4sIGl0IGlzIHRoZSBhcmVhIHVuZGVyIHRoZSBjdXJ2ZSB0byB0aGUgbGVmdCBvZiB0aGlzIGdlbmUgcmFuaykuCkJ5IGRlZmF1bHQsIHRoZSB0b3AgNSUgb2YgZ2VuZXMgYXJlIHVzZWQgYXMgdGhlIHRocmVzaG9sZC4KClNvbWUgZ2VuZXMgd2lsbCBub3QgYmUgZGV0ZWN0ZWQgKGkuZS4sIGhhdmUgMCBjb3VudHMpLgpHZW5lcyBjYW4gYWxzbyBoYXZlIHRoZSBzYW1lIGV4cHJlc3Npb24gbGV2ZWwgKGkuZS4sIHRpZXMpLgpUaGVzZSB1bmRldGVjdGVkIGdlbmVzIGFuZCB0aWVzIHdpbGwgYmUgcmFuZG9tbHkgb3JkZXJlZCBpbiBvdXIgcmFua2luZy4KVG8gbWFrZSBvdXIgcmFua2luZ3Mg4oCTIGFuZCB0aGVyZWZvcmUgcmVzdWx0cyDigJMgcmVwcm9kdWNpYmxlLCB3ZSB3aWxsIHNldCBhIHNlZWQuCgpgYGB7ciBzZXRfc2VlZCwgbGl2ZSA9IFRSVUV9CnNldC5zZWVkKDIwMjQpCmBgYAoKIyMjIENlbGwgcmFua2luZwoKVGhlIGZpcnN0IHN0ZXAgaW4gQVVDZWxsIGlzIHRvIHJhbmsgZ2VuZXMgZm9yIGVhY2ggY2VsbCBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGV4cHJlc3Npb24gdmFsdWUuCldlIGNhbiBkbyB0aGlzIHVzaW5nIHRoZSBgQVVDZWxsX2J1aWxkUmFua2luZ3MoKWAgZnVuY3Rpb24sIHdoaWNoIHdpbGwgb3V0cHV0IGEgdmlzdWFsaXphdGlvbiBzaG93aW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBpbiB0aGUgY2VsbHMgaW4gb3VyIFNpbmdsZUNlbGxFeHBlcmltZW50IG9iamVjdC4KCmBgYHtyIGNlbGxfcmFua2luZ3MsIGxpdmUgPSBUUlVFfQpjZWxsX3JhbmtpbmdzIDwtIEFVQ2VsbF9idWlsZFJhbmtpbmdzKGNvdW50c19tYXRyaXgpCmBgYAoKVGhlIEFVQ2VsbCBhdXRob3JzIHJlY29tbWVuZCBtYWtpbmcgc3VyZSBtb3N0IGNlbGxzIGhhdmUgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBnZW5lcyB3ZSB3aWxsIHVzZSBhcyB0aGUgbWF4IHJhbmsgdG8gY2FsY3VsYXRlIHRoZSBBVUMuCgpUaGUgQVVDIG1heCByYW5rIHZhbHVlIHRlbGxzIEFVQ2VsbCB0aGUgY3V0b2ZmIGluIHRoZSBnZW5lIHJhbmtpbmdzIHRvIHVzZSBmb3IgY2FsY3VsYXRpbmcgQVVDOyB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGlzIGN1cnZlIGFuZCBtYXggcmFuayBpbiBqdXN0IGEgbW9tZW50LgpJZiB3ZSBwaWNrZWQgYSBtYXggcmFuayBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGluIG1vc3QgY2VsbHMsIHRoZSBub24tZGV0ZWN0ZWQgZ2VuZXMgdGhhdCBhcmUgcmFuZG9tbHkgb3JkZXJlZCB3b3VsZCBwbGF5IGFuIG91dHNpemVkIHJvbGUgaW4gb3VyIEFVQyB2YWx1ZXMuCgpCeSBkZWZhdWx0LCB0aGUgbWF4IHJhbmsgaXMgdGhlIHRvcCA1JSBoaWdoZXN0IGV4cHJlc3NlZCBnZW5lcy4KV2UgY2FuIGNhbGN1bGF0ZSB0aGUgZGVmYXVsdCBtYXggcmFuayBieSB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBudW1iZXIgb2YgZ2VuZXMuCgpgYGB7ciBleHBsb3JlX2F1Y19tYXhfcmFua30KbnJvdyhjZWxsX3JhbmtpbmdzKSAqIDAuMDUKYGBgCgpUaGlzIG51bWJlciBpcyBwcm9iYWJseSB0b28gaGlnaCwgZ2l2ZW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGdlbmVzIGRldGVjdGVkIGJ5IGNlbGwgd2UgdmlzdWFsaXplZCB3aXRoIGBBVUNlbGxfYnVpbGRSYW5raW5ncygpYC4KCldoYXQgaWYgd2UgY2hvc2UgYSAxJSB0aHJlc2hvbGQ/CgpgYGB7ciBsb3dlcl9tYXhfcmFuaywgbGl2ZSA9IFRSVUV9Cm5yb3coY2VsbF9yYW5raW5ncykgKiAwLjAxCmBgYAoKVGhhdCBpcyBwcm9iYWJseSBhIG1vcmUgcmVhc29uYWJsZSBjaG9pY2UgZm9yIHRoaXMgZGF0YXNldC4KCldlIGNhbiB1c2UgYSBmdW5jdGlvbiBjYWxsZWQgYGNlaWxpbmcoKWAgdG8gcm91bmQgdGhpcyBhbmQgc2F2ZSBpdCB0byBhIHZhcmlhYmxlIGZvciBsYXRlciB1c2UuCgpgYGB7ciBhdWNfbWF4X3JhbmssIGxpdmUgPSBUUlVFfQphdWNfbWF4X3JhbmsgPC0gY2VpbGluZyhucm93KGNlbGxfcmFua2luZ3MpICogMC4wMSkKYGBgCgojIyMgUGxvdHRpbmcgQVVDCgpUaGUgQVVDIHZhbHVlcyB3ZSBnZXQgb3V0IG9mIEFVQ2VsbCBhcmUgdGhlIGFyZWEgdW5kZXIgYSByZWNvdmVyeSBjdXJ2ZSBhbmQgZXN0aW1hdGUgdGhlIHByb3BvcnRpb24gb2YgZ2VuZXMgaW4gdGhlIGdlbmUgc2V0IHRoYXQgYXJlIGhpZ2hseSBleHByZXNzZWQgKGkuZS4sIGhpZ2hseSByYW5rZWQpLgoKTGV0J3MgcGxvdCB0aGUgcmVjb3ZlcnkgY3VydmUgZm9yIGEgY2VsbCB3aXRoIGhpZ2ggQVVDIGFuZCBhIGNlbGwgd2l0aCBsb3cgQVVDIHRvIGdldCBhIGJldHRlciBpbnR1aXRpb24gYWJvdXQgQVVDIHZhbHVlcy4KRWFybGllciwgd2UgbG9hZGVkIGEgY3VzdG9tIGZ1bmN0aW9uIHdlIGFkYXB0ZWQgZnJvbSBbdGhlIEFVQ2VsbCB2aWduZXR0ZV0oaHR0cHM6Ly9naXRodWIuY29tL2FlcnRzbGFiL0FVQ2VsbC9ibG9iLzkxNzUzYjMyN2EzOWRjN2E0YmJlZDQ2NDA4ZWMyMjcxYzQ4NWYyZjAvdmlnbmV0dGVzL0FVQ2VsbC5SbWQpIGNhbGxlZCBgcGxvdF9yZWNvdmVyeV9jdXJ2ZSgpYCB3aXRoIGBzb3VyY2UoKWAuCgpGaXJzdCwgd2UnbGwgc3RhcnQgd2l0aCBhIGNlbGwgd2l0aCBhIGhpZ2ggQVVDLgpXZSBwaWNrZWQgdGhpcyBiYXJjb2RlIGFoZWFkIG9mIHRpbWUgd2hlbiB3ZSB3cm90ZSB0aGUgbm90ZWJvb2suCgpgYGB7ciBoaWdoX3JlY292ZXJ5X2N1cnZlfQpwbG90X3JlY292ZXJ5X2N1cnZlKGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgZXdpbmdfZ2VuZV9zZXRfY29sbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9uYW1lID0gIlpIQU5HX1RBUkdFVFNfT0ZfRVdTUjFfRkxJMV9GVVNJT04iLAogICAgICAgICAgICAgICAgICAgIGJhcmNvZGUgPSAiQ1RHQUdDR0dUQ1RUVEFUQyIsCiAgICAgICAgICAgICAgICAgICAgYXVjX21heF9yYW5rID0gYXVjX21heF9yYW5rKSAgIyAxJSB0aHJlc2hvbGQgCmBgYAoKVGhlIHgtYXhpcyBpcyB0aGUgZ2VuZSByYW5rcyBmb3IgYWxsIGdlbmVzLgpUaGUgeS1heGlzIGlzIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIHNpZ25hdHVyZSBhdCBhIGdpdmVuIHBvaW50IGluIHRoZSBnZW5lIHJhbmtpbmcg4oCTIHRoZSBsaW5lIHdpbGwgcmlzZSB3aGVuIGEgZ2VuZSBpbiB0aGUgZ2VuZSBzZXQgaXMgZW5jb3VudGVyZWQgaW4gdGhlIHJhbmtpbmcgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdC4KVGhlIEFVQyBpcyB0aGUgYXJlYSB1bmRlciB0aGlzIHJlY292ZXJ5IGN1cnZlIGF0IHRoZSBtYXggcmFuayB0aHJlc2hvbGQgY2hvc2VuIGZvciB0aGlzIGRhdGFzZXQuCgpOb3csIGxldCdzIGxvb2sgYXQgYW4gZXhhbXBsZSB3aXRoIGEgbG93IEFVQy4KCmBgYHtyIGxvd19yZWNvdmVyeV9jdXJ2ZX0KcGxvdF9yZWNvdmVyeV9jdXJ2ZShjZWxsX3JhbmtpbmdzLAogICAgICAgICAgICAgICAgICAgIGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfbmFtZSA9ICJaSEFOR19UQVJHRVRTX09GX0VXU1IxX0ZMSTFfRlVTSU9OIiwKICAgICAgICAgICAgICAgICAgICBiYXJjb2RlID0gIkFHQVRBR0FHVENBQ0FBVEMiLAogICAgICAgICAgICAgICAgICAgIGF1Y19tYXhfcmFuayA9IGF1Y19tYXhfcmFuaykgICMgMSUgdGhyZXNob2xkCmBgYAoKRmFyIGZld2VyIGdlbmVzIGluIHRoZSBnZW5lIHNldCBhcmUgcmFua2VkIGFib3ZlIHRoZSB0aHJlc2hvbGQsIHlpZWxkaW5nIGEgbG93ZXIgQVVDIHZhbHVlLgoKIyMjIENhbGN1bGF0aW5nIHRoZSBBVUMKCk9uY2Ugd2UgaGF2ZSB0aGUgcmFua2luZ3MsIHdlIGNhbiBjYWxjdWxhdGUgdGhlIEFVQyBzY29yZXMgZm9yIGJvdGggZ2VuZSBzZXRzIGluIGFsbCBjZWxscyB3aXRoIHRoZSBgQVVDZWxsX2NhbGNBVUMoKWAgZnVuY3Rpb24uCgpgYGB7ciBjYWxjX2F1YywgbGl2ZT1UUlVFfQpjZWxsX2F1YyA8LSBBVUNlbGxfY2FsY0FVQyhnZW5lU2V0cyA9IGV3aW5nX2dlbmVfc2V0X2NvbGxlY3Rpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICByYW5raW5ncyA9IGNlbGxfcmFua2luZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y01heFJhbmsgPSBhdWNfbWF4X3JhbmspCmBgYAoKVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGBhdWNlbGxSZXN1bHRzYCBvYmplY3QuCgpgYGB7ciBjaGVja19zdHIsIGxpdmUgPSBUUlVFfQpzdHIoY2VsbF9hdWMpCmBgYAoKSXQgY2FuIGJlIG11Y2ggbW9yZSBjb252ZW5pZW50IHRvIHdvcmsgd2l0aCB0aGlzIGluIGEgdGFidWxhciBmb3JtYXQuCgpgYGB7ciBhdWNfdG9fdGFibGV9CiMgRXh0cmFjdCBBVUMKYXVjX2RmIDwtIGNlbGxfYXVjQGFzc2F5c0BkYXRhJEFVQyB8PgogICMgVHJhbnNwb3NlCiAgdCgpIHw+CiAgIyBDb252ZXJ0IHRvIGRhdGEgZnJhbWUKICBhcy5kYXRhLmZyYW1lKCkgfD4KICAjIE1ha2UgdGhlIGJhcmNvZGVzIGEgY29sdW1uCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oImJhcmNvZGVzIikgCgojIExvb2sgYXQgZmlyc3QgZmV3IHJvd3MKaGVhZChhdWNfZGYpCmBgYAoKIyMjIEFzc2lnbm1lbnRzCgpBVUNlbGwgY2FuIGFzc2lnbiBjZWxscyBhcyBoYXZpbmcgYW4gYWN0aXZlIGdlbmUgc2V0IG9yIG5vdCBieSBwaWNraW5nIGEgdGhyZXNob2xkIGF1dG9tYXRpY2FsbHkuCldlJ2xsIGV4cGxvcmUgdGhlc2UgaW4gYSBsYXRlciBwbG90LCBidXQgZm9yIG5vdywgbGV0J3MgY2FsY3VsYXRlIHRoZSB0aHJlc2hvbGQgYW5kIGFzc2lnbiBjZWxscyB3aXRoIGBBVUNlbGxfZXhwbG9yZVRocmVzaG9sZHMoKWAuCgpgYGB7ciBhdWNfYXNzaWdubWVudHMsIGxpdmUgPSBUUlVFfQphdWNfYXNzaWdubWVudHMgPC0gQVVDZWxsX2V4cGxvcmVUaHJlc2hvbGRzKGNlbGxfYXVjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90SGlzdCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25DZWxscyA9IFRSVUUpCmBgYAoKV2UncmUgZ29pbmcgdG8gcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIEFVQyB2YWx1ZXMgd2l0aCBgZ2dwbG90MmAsIHNvIHdlIHdpbGwgd2FudCB0aGUgQVVDIHZhbHVlcyBpbiBhIGxvbmdlciBmb3JtYXQuCgpgYGB7ciBhdWNfcGxvdHRpbmdfZGZ9CmF1Y19wbG90dGluZ19kZiA8LSBhdWNfZGYgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKCFiYXJjb2RlcywKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImdlbmVfc2V0IiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJhdWMiKSB8PgogIGRwbHlyOjptdXRhdGUoCiAgICAjIENyZWF0ZSBhIG5ldyBsb2dpY2FsIGNvbHVtbiBjYWxsZWQgYXNzaWduZWQKICAgIGFzc2lnbmVkID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgIyBGb3IgWmhhbmcgZ2VuZSBzZXQgcm93cywgc2V0IHRvIFRSVUUgd2hlbiB0aGUgYmFyY29kZSBpcyBpbiB0aGUgCiAgICAgICMgYXNzaWdubWVudCBsaXN0CiAgICAgIGdlbmVfc2V0ID09IGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0gJiAKICAgICAgICBiYXJjb2RlcyAlaW4lIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJ6aGFuZyJdXV1dJGFzc2lnbm1lbnQgfiBUUlVFLAogICAgICAjIEZvciBSaWdnaSBnZW5lIHNldCByb3dzLCBzZXQgdG8gVFJVRSB3aGVuIHRoZSBiYXJjb2RlIGlzIGluIHRoZSAKICAgICAgIyBhc3NpZ25tZW50IGxpc3QKICAgICAgZ2VuZV9zZXQgPT0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJyaWdnaSJdXSAmIAogICAgICAgIGJhcmNvZGVzICVpbiUgYXVjX2Fzc2lnbm1lbnRzW1tld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dXV0kYXNzaWdubWVudCB+IFRSVUUsCiAgICAgICMgT3RoZXJ3aXNlLCBzZXQgdG8gRkFMU0UKICAgICAgLmRlZmF1bHQgPSBGQUxTRQogICAgKQogICkKCmF1Y19wbG90dGluZ19kZgpgYGAKClRvIGRyYXcgdmVydGljYWwgbGluZXMgcmVwcmVzZW50aW5nIHRoZSBhdXRvbWF0aWNhbGx5IGNob3NlbiB0aHJlc2hvbGQsIHdlIGNhbiBjcmVhdGUgYSBzZXBhcmF0ZSBkYXRhIGZyYW1lLgoKYGBge3IgYXVjX3RocmVzaG9sZF9kZn0KYXVjX3RocmVzaG9sZF9kZiA8LSBkYXRhLmZyYW1lKAogIGdlbmVfc2V0ID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXMsCiAgIyBHcmFiIHRocmVzaG9sZHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZ2VuZSBzZXQgZnJvbSBhc3NpZ25lbWVudHMgb2JqZWN0CiAgdGhyZXNob2xkID0gYyhhdWNfYXNzaWdubWVudHNbW2V3aW5nX2dlbmVfc2V0X25hbWVzWyJ6aGFuZyJdXV0kYXVjVGhyJHNlbGVjdGVkLCAKICAgICAgICAgICAgICAgIGF1Y19hc3NpZ25tZW50c1tbZXdpbmdfZ2VuZV9zZXRfbmFtZXNbInJpZ2dpIl1dXSRhdWNUaHIkc2VsZWN0ZWQpCikKCmF1Y190aHJlc2hvbGRfZGYKYGBgCgpOb3cgbGV0J3MgbWFrZSBhIGRlbnNpdHkgcGxvdCwgcGxvdHRpbmcgdGhlIGRlbnNpdHkgb2YgdGhlIGFzc2lnbmVkIGFuZCB1bmFzc2lnbmVkIGNlbGxzIHNlcGFyYXRlbHkgYW5kIGRyYXdpbmcgYSB2ZXJ0aWNhbCBsaW5lIGZvciB0aGUgdGhyZXNob2xkLgoKYGBge3IgYXVjX2RlbnNpdHlfcGxvdH0KYXVjX3Bsb3R0aW5nX2RmIHw+CiAgZ2dwbG90Mjo6Z2dwbG90KAogICAgZ2dwbG90Mjo6YWVzKAogICAgICB4ID0gYXVjLCAgIyBBVUMgdmFsdWVzCiAgICAgIGNvbG9yID0gYXNzaWduZWQsICAjIEdyb3VwIGJ5IGFzc2lnbm1lbnQKICAgICAgZmlsbCA9IGFzc2lnbmVkLCAgICMgR3JvdXAgYnkgYXNzaWdubWVudAogICAgKQogICkgKwogIGdncGxvdDI6Omdlb21fZGVuc2l0eShhbHBoYSA9IDAuMikgKwogICMgRHJhdyBhIHZlcnRpY2FsIGRvdHRlZCBsaW5lIHNob3dpbmcgdGhlIHRocmVzaG9sZCBmb3IgZWFjaCBnZW5lIHNldAogIGdncGxvdDI6Omdlb21fdmxpbmUoZGF0YSA9IGF1Y190aHJlc2hvbGRfZGYsCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gZ2dwbG90Mjo6YWVzKHhpbnRlcmNlcHQgPSB0aHJlc2hvbGQpLAogICAgICAgICAgICAgICAgICAgICAgbHR5ID0gMikgKwogICMgUGxvdCBlYWNoIGdlbmUgc2V0IGluIGl0cyBvd24gZmFjZXQKICBnZ3Bsb3QyOjpmYWNldF9ncmlkKGNvbHMgPSBnZ3Bsb3QyOjp2YXJzKGdlbmVfc2V0KSkgKwogICMgVXNlIGEgYnVpbHQtaW4gdGhlbWUKICBnZ3Bsb3QyOjp0aGVtZV9idygpCmBgYAoKRm9yIHRoZXNlIHBhcnRpY3VsYXIgZ2VuZSBzZXRzLCB0aGUgQVVDIHZhbHVlcyBhcHBlYXIgdG8gYmUgYmltb2RhbGx5IGRpc3RyaWJ1dGVkLCBhbmQgd2UgY2FuIGVhc2lseSBpZGVudGlmeSBjZWxscyB3aGVyZSB0aGUgZ2VuZXMgYXJlIGhpZ2hseSBleHByZXNzZWQuCgpMZXQncyB3cml0ZSB0aGlzIHRhYmxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KCmBgYHtyIHNhdmVfYXVjfQphdWNfcGxvdHRpbmdfZGYgfD4gCiAgcmVhZHI6OndyaXRlX3RzdihvdXRwdXRfZmlsZSkKYGBgCgojIyMgVU1BUHMKCiMjIyMgQWRkaW5nIEFVQyB0byBgY29sRGF0YWAKCldlIGNhbiBhbHNvIGFkZCB0aGUgQVVDIHZhbHVlcyBiYWNrIGludG8gdGhlIFNpbmdsZUNlbGxFeHBlcmltZW50IGZvciBjb252ZW5pZW5jZSwgZS5nLiwgZm9yIHBsb3R0aW5nLgpXZSdsbCBhZGQgaXQgdG8gdGhlIGV4aXN0aW5nIGBjb2xEYXRhYC4KCkZpcnN0LCBsZXQncyByZW5hbWUgdGhlIGdlbmUgc2V0IGNvbHVtbnMgdG8gc29tZXRoaW5nIG1vcmUgZWFzaWx5IHR5cGVkLgoKYGBge3IgcmVuYW1lX2dlbmVfc2V0fQphdWNfZGYgPC0gYXVjX2RmIHw+CiAgIyBVc2Ugc2hvcnRlciBuYW1lcwogIGRwbHlyOjpyZW5hbWUoemhhbmdfYXVjID0gZXdpbmdfZ2VuZV9zZXRfbmFtZXNbWyJ6aGFuZyJdXSwKICAgICAgICAgICAgICAgIHJpZ2dpX2F1YyA9IGV3aW5nX2dlbmVfc2V0X25hbWVzW1sicmlnZ2kiXV0pCgpgYGAKCkFuZCBqb2luIGl0IHRvIHRoZSBleGlzdGluZyBgY29sRGF0YWAuCgpgYGB7ciBjb2xkYXRhLCBsaXZlID0gVFJVRX0KIyBFeHRyYWN0IHRoZSBleGlzdGluZyBjb2xEYXRhLCBhbmQgbGVmdCBqb2luIGl0IHdpdGggdGhlIEFVQyB2YWx1ZXMgYnkgdGhlCiMgYmFyY29kZXMKY29sZGF0YV9kZiA8LSBjb2xEYXRhKHNjZSkgfD4KICBhcy5kYXRhLmZyYW1lKCkgfD4KICBkcGx5cjo6bGVmdF9qb2luKAogICAgYXVjX2RmLAogICAgYnkgPSAiYmFyY29kZXMiCiAgKQpgYGAKCk5vdywgd2UncmUgcmVhZHkgdG8gYWRkIGl0IGJhY2sgdG8gdGhlIG9iamVjdC4KCmBgYHtyIGFkZF9iYWNrX2NvbERhdGEsIGxpdmUgPSBUUlVFfQojIFdlIG5lZWQgdG8gc2F2ZSB0aGlzIGFzIGEgRGF0YUZyYW1lCmNvbERhdGEoc2NlKSA8LSBEYXRhRnJhbWUoCiAgY29sZGF0YV9kZiwKICByb3cubmFtZXMgPSBjb2xEYXRhKHNjZSkkYmFyY29kZXMKKQpgYGAKCiMjIyMgUGxvdHRpbmcgVU1BUHMKCldlIGNhbiB1c2UgdGhlIGBwbG90VU1BUCgpYCBmdW5jdGlvbiBmcm9tIHRoZSBgc2NhdGVyYCBwYWNrYWdlIHRvIHBsb3QgYSBVTUFQIHdpdGggdGhlIHBvaW50cyBjb2xvcmVkIGJ5IHRoZSBBVUMgdmFsdWUKCmBgYHtyIHBsb3RfdW1hcF96aGFuZ30Kc2NhdGVyOjpwbG90VU1BUChzY2UsIGNvbG91cl9ieSA9ICJ6aGFuZ19hdWMiKSArCiAgIyBVc2UgdGhlIGdlbmUgc2V0IG5hbWUsIHJlcGxhY2luZyB1bmRlcnNjb3JlcyB3aXRoIHNwYWNlcwogIGdncGxvdDI6OmdndGl0bGUoc3RyaW5ncjo6c3RyX3JlcGxhY2VfYWxsKGV3aW5nX2dlbmVfc2V0X25hbWVzW1siemhhbmciXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXF8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIpKQpgYGAKCkxldCdzIGNvbG9yIHRoZSBwb2ludHMgYnkgdGhlIEFVQyB2YWx1ZXMgZm9yIHRoZSBvdGhlciBnZW5lIHNldC4KCmBgYHtyIHBsb3RfdW1hcF9yaWdnaSwgbGl2ZSA9IFRSVUV9CnNjYXRlcjo6cGxvdFVNQVAoc2NlLCBjb2xvdXJfYnkgPSAicmlnZ2lfYXVjIikgKyAKICBnZ3Bsb3QyOjpnZ3RpdGxlKHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChld2luZ19nZW5lX3NldF9uYW1lc1tbInJpZ2dpIl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKSkKYGBgCgpXZSB3b3VsZCB3YW50IHRvIGRvIHNvbWV0aGluZyBtb3JlIGZvcm1hbCB0byBjb25maXJtLCBidXQgaXQgc2VlbXMgbGlrZSB0aGUgc2FtZSBjZWxscyBoYXZlIGhpZ2ggQVVDIHZhbHVlcyBmb3IgYm90aCBnZW5lIHNldHMhCgojIyBTZXNzaW9uIEluZm8KCmBgYHtyIHNlc3Npb25faW5mb30Kc2Vzc2lvbkluZm8oKQpgYGAK</div> </div> diff --git a/scRNA-seq/04-dimension_reduction_scRNA-live.Rmd b/scRNA-seq/04-dimension_reduction_scRNA-live.Rmd index e530a1aa..d8bb8320 100644 --- a/scRNA-seq/04-dimension_reduction_scRNA-live.Rmd +++ b/scRNA-seq/04-dimension_reduction_scRNA-live.Rmd @@ -87,6 +87,8 @@ Cell Ranger also outputs both filtered and raw matrices; today we will start wit ```{r read10x, live = TRUE} + # ensure barcodes are set as column names in the SCE object + ``` How many potential cells are there here? diff --git a/scRNA-seq/04-dimension_reduction_scRNA.nb.html b/scRNA-seq/04-dimension_reduction_scRNA.nb.html index d6199227..96812feb 100644 --- a/scRNA-seq/04-dimension_reduction_scRNA.nb.html +++ b/scRNA-seq/04-dimension_reduction_scRNA.nb.html @@ -3106,8 +3106,12 @@ <h2>Reading Cell Ranger data</h2> </div> <!-- rnb-text-end --> <!-- rnb-chunk-begin --> -<!-- rnb-source-begin eyJkYXRhIjoiaG9kZ2tpbnNfc2NlIDwtIERyb3BsZXRVdGlsczo6cmVhZDEweENvdW50cyhyYXdfbWF0cml4X2RpcikifQ== --> -<pre class="r"><code>hodgkins_sce <- DropletUtils::read10xCounts(raw_matrix_dir)</code></pre> +<!-- rnb-source-begin eyJkYXRhIjoiaG9kZ2tpbnNfc2NlIDwtIERyb3BsZXRVdGlsczo6cmVhZDEweENvdW50cyhcbiAgcmF3X21hdHJpeF9kaXIsIFxuICAjIGVuc3VyZSBiYXJjb2RlcyBhcmUgc2V0IGFzIGNvbHVtbiBuYW1lcyBpbiB0aGUgU0NFIG9iamVjdFxuICBjb2wubmFtZXMgPSBUUlVFXG4pIn0= --> +<pre class="r"><code>hodgkins_sce <- DropletUtils::read10xCounts( + raw_matrix_dir, + # ensure barcodes are set as column names in the SCE object + col.names = TRUE +)</code></pre> <!-- rnb-source-end --> <!-- rnb-warning-begin eyJkYXRhIjoiV2FybmluZzogcmVwbGFjaW5nIHByZXZpb3VzIGltcG9ydCAnUzRBcnJheXM6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgYnlcbidEZWxheWVkQXJyYXk6Om1ha2VOaW5kZXhGcm9tQXJyYXlWaWV3cG9ydCcgd2hlbiBsb2FkaW5nICdIREY1QXJyYXknXG4ifQ== --> <pre><code>Warning: replacing previous import 'S4Arrays::makeNindexFromArrayViewport' by @@ -3489,18 +3493,18 @@ <h4>Storing PCA results with the raw data</h4> <pre class="r"><code># print the top corner of the PCA matrix reducedDim(normalized_sce, "PCA")[1:10, 1:5]</code></pre> <!-- rnb-source-end --> -<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgICAgUEMxICAgICAgICBQQzIgICAgICAgIFBDMyAgICAgICAgIFBDNCAgICAgICAgUEM1XG4gWzEsXSAxNS4zNzk4ODkgICA3LjkyOTUzNyAgMTEuNzkwOTcyICAgMy45ODQ1ODQ3ICAgOC4yMzI2MDNcbiBbMixdIC0xLjIyMDQyNCAgIDYuMDUzNDQzICAgMi4xMDAxNjEgLTEwLjc1MzIwNzEgIC02Ljc2OTg4OFxuIFszLF0gIDAuNjQ3NjI2ICAtNy41NjYwOTggLTEyLjAwNDU0NyAgLTAuOTg2MjUzNSAgIDguOTM2MzI4XG4gWzQsXSAgNy45MjI5NTggLTIxLjk3NTE2NyAgIDQuMTU2NjM0IC0xMC4wNzk4NTQ2ICAgNS4zODMxNThcbiBbNSxdICAxLjU3NzY4NSAtMjYuNTEwOTkyICAxMS4wODkyMTggIDEwLjUyNTk0NDEgLTExLjY2MDgxMlxuIFs2LF0gIDUuNjc2NDM1IC0yNy41NzE3MDggIDEzLjY1NTk0NSAgLTkuMzAwNjA0NSAgIDIuNTk0MzIwXG4gWzcsXSAtMy42MjM3MDQgIC0yLjA1MjM2MiAgLTkuMDYxMDQ4ICAtNS43OTQxODEwICAgOS4xMTI0MzRcbiBbOCxdICA5LjU3NzU4OCAgMTIuOTc3NDQ1ICAtNC4xMjU4ODUgIC0wLjE5NDkyNTIgLTEwLjc1Nzk3MFxuIFs5LF0gIDkuMzkzNDgzICAtNy4yODg4OTYgLTEyLjY2MTU1MiAgIDYuNDUwMjgyNyAgLTIuMzcxMzE1XG5bMTAsXSAtNy45MTc2MjEgIC04LjA1MjU0OCAgLTkuMDYxOTE1ICAgMC44Njc1MTU3ICAgOS4wMzQzOTBcbiJ9 --> -<pre><code> PC1 PC2 PC3 PC4 PC5 - [1,] 15.379889 7.929537 11.790972 3.9845847 8.232603 - [2,] -1.220424 6.053443 2.100161 -10.7532071 -6.769888 - [3,] 0.647626 -7.566098 -12.004547 -0.9862535 8.936328 - [4,] 7.922958 -21.975167 4.156634 -10.0798546 5.383158 - [5,] 1.577685 -26.510992 11.089218 10.5259441 -11.660812 - [6,] 5.676435 -27.571708 13.655945 -9.3006045 2.594320 - [7,] -3.623704 -2.052362 -9.061048 -5.7941810 9.112434 - [8,] 9.577588 12.977445 -4.125885 -0.1949252 -10.757970 - [9,] 9.393483 -7.288896 -12.661552 6.4502827 -2.371315 -[10,] -7.917621 -8.052548 -9.061915 0.8675157 9.034390</code></pre> +<!-- rnb-output-begin eyJkYXRhIjoiICAgICAgICAgICAgICAgICAgICAgICAgIFBDMSAgICAgICAgUEMyICAgICAgICBQQzMgICAgICAgICBQQzQgICAgICAgIFBDNVxuQUFBQ0NDQUNBR0dUVENHQy0xIDE1LjM3OTg4OSAgIDcuOTI5NTM3ICAxMS43OTA5NzIgICAzLjk4NDU4NDcgICA4LjIzMjYwM1xuQUFBQ0NDQUNBVENHQVRDQS0xIC0xLjIyMDQyNCAgIDYuMDUzNDQzICAgMi4xMDAxNjEgLTEwLjc1MzIwNzEgIC02Ljc2OTg4OFxuQUFBQ0NDQUdUQVRUVENDVC0xICAwLjY0NzYyNiAgLTcuNTY2MDk4IC0xMi4wMDQ1NDcgIC0wLjk4NjI1MzUgICA4LjkzNjMyOFxuQUFBQ0dBQUdUR0dHVEFURy0xICA3LjkyMjk1OCAtMjEuOTc1MTY3ICAgNC4xNTY2MzQgLTEwLjA3OTg1NDYgICA1LjM4MzE1OFxuQUFBQ0dBQVRDQ1RUQVRDQS0xICAxLjU3NzY4NSAtMjYuNTEwOTkyICAxMS4wODkyMTggIDEwLjUyNTk0NDEgLTExLjY2MDgxMlxuQUFBQ0dDVEFHVENUVENHQS0xICA1LjY3NjQzNSAtMjcuNTcxNzA4ICAxMy42NTU5NDUgIC05LjMwMDYwNDUgICAyLjU5NDMyMFxuQUFBQ0dDVEdUVENUVEdUVC0xIC0zLjYyMzcwNCAgLTIuMDUyMzYyICAtOS4wNjEwNDggIC01Ljc5NDE4MTAgICA5LjExMjQzNFxuQUFBR0FBQ0FHQVRUQ0dBQS0xICA5LjU3NzU4OCAgMTIuOTc3NDQ1ICAtNC4xMjU4ODUgIC0wLjE5NDkyNTIgLTEwLjc1Nzk3MFxuQUFBR0FBQ0NBR0dDQUNBQS0xICA5LjM5MzQ4MyAgLTcuMjg4ODk2IC0xMi42NjE1NTIgICA2LjQ1MDI4MjcgIC0yLjM3MTMxNVxuQUFBR0FBQ1RDQ0FBQ0FDQS0xIC03LjkxNzYyMSAgLTguMDUyNTQ4ICAtOS4wNjE5MTUgICAwLjg2NzUxNTcgICA5LjAzNDM5MFxuIn0= --> +<pre><code> PC1 PC2 PC3 PC4 PC5 +AAACCCACAGGTTCGC-1 15.379889 7.929537 11.790972 3.9845847 8.232603 +AAACCCACATCGATCA-1 -1.220424 6.053443 2.100161 -10.7532071 -6.769888 +AAACCCAGTATTTCCT-1 0.647626 -7.566098 -12.004547 -0.9862535 8.936328 +AAACGAAGTGGGTATG-1 7.922958 -21.975167 4.156634 -10.0798546 5.383158 +AAACGAATCCTTATCA-1 1.577685 -26.510992 11.089218 10.5259441 -11.660812 +AAACGCTAGTCTTCGA-1 5.676435 -27.571708 13.655945 -9.3006045 2.594320 +AAACGCTGTTCTTGTT-1 -3.623704 -2.052362 -9.061048 -5.7941810 9.112434 +AAAGAACAGATTCGAA-1 9.577588 12.977445 -4.125885 -0.1949252 -10.757970 +AAAGAACCAGGCACAA-1 9.393483 -7.288896 -12.661552 6.4502827 -2.371315 +AAAGAACTCCAACACA-1 -7.917621 -8.052548 -9.061915 0.8675157 9.034390</code></pre> <!-- rnb-output-end --> <!-- rnb-chunk-end --> <!-- rnb-text-begin --> @@ -3978,7 +3982,7 @@ <h2>Session Info</h2> <!-- rnb-chunk-end --> </div> -<div id="rmd-source-code">LS0tCnRpdGxlOiAiRGltZW5zaW9uIFJlZHVjdGlvbiB3aXRoIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6IENDREwgZm9yIEFMU0YKZGF0ZTogMjAyMQpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciBwb3N0LXF1YW50aWZpY2F0aW9uIGNlbGxzIHVzaW5nIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYAotIEFwcGx5IGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBtZXRob2RzIHRvIHNpbmdsZSBjZWxsIGRhdGEKLSBWaXN1YWxpemUgc2FtcGxlcyBpbiByZWR1Y2VkIGRpbWVuc2lvbmFsIHNwYWNlCgotLS0KCkluIHRoaXMgbm90ZWJvb2ssIHdlJ2xsIHRyeSBvdXQgc29tZSBkaW1lbnNpb24gcmVkdWN0aW9uIHRlY2huaXF1ZXMgb24gc2luZ2xlLWNlbGwgUk5BLXNlcSBkYXRhLgoKVmlzdWFsaXppbmcgaGlnaGx5IGRpbWVuc2lvbmFsIGRhdGEgaXMgYSBjb21tb24gY2hhbGxlbmdlIGluIGdlbm9taWNzLCBhbmQgZXNwZWNpYWxseSB3aXRoIFJOQS1zZXEgZGF0YS4KVGhlIGV4cHJlc3Npb24gb2YgZXZlcnkgZ2VuZSB3ZSBsb29rIGF0IGlzIGFub3RoZXIgZGltZW5zaW9uIGRlc2NyaWJpbmcgYSBzYW1wbGUuCldoZW4gd2UgYWxzbyBoYXZlIGh1bmRyZWRzIG9yIHRob3VzYW5kcyBvZiBpbmRpdmlkdWFsIHNhbXBsZXMsIGFzIGluIHRoZSBjYXNlIG9mIHNpbmdsZS1jZWxsIGFuYWx5c2lzLCBmaWd1cmluZyBvdXQgaG93IHRvIGNsZWFybHkgZGlzcGxheSBhbGwgb2YgdGhlIGRhdGEgaW4gYSBtZWFuaW5nZnVsIHdheSBpcyBkaWZmaWN1bHQuCgpBIGNvbW1vbiBwcmFjdGljZSBpcyB0byBjb21tb24gdG8gdXNlIGRpbWVuc2lvbiByZWR1Y3Rpb24gdGVjaG5pcXVlcyBzbyBhbGwgb2YgdGhlIGRhdGEgaXMgaW4gYSBtb3JlIG1hbmFnZWFibGUgZm9ybSBmb3IgcGxvdHRpbmcsIGNsdXN0ZXJpbmcsIGFuZCBvdGhlciBkb3duc3RyZWFtIGFuYWx5c2VzLgoKIyMgU2V0IFVwCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc2NhdGVyKQpsaWJyYXJ5KHNjcmFuKQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKVGhlIGRhdGEgd2Ugd2lsbCBiZSB1c2luZyBmb3IgdGhpcyBtb2R1bGUgY29tZXMgZnJvbSBhIGEgMTB4IEdlbm9taWNzIGRhdGEgc2V0IG9mIFtleHByZXNzaW9uIGRhdGEgZnJvbSBhIEhvZGdraW4ncyBMeW1waG9tYSB0dW1vcl0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9zaW5nbGUtY2VsbC1nZW5lLWV4cHJlc3Npb24vZGF0YXNldHMvNC4wLjAvUGFyZW50X05HU0MzX0RJX0hvZGdraW5zTHltcGhvbWEpLgpUaGUgZGF0YSB3YXMgZ2VuZXJhdGVkIHdpdGggdGhlIDEwWHYzLjEgY2hlbWlzdHJ5LCBhbmQgcHJvY2Vzc2VkIHdpdGggQ2VsbCBSYW5nZXIgYW5kIDEweCBHZW5vbWljcyBzdGFuZGFyZCBwaXBlbGluZS4KCgpUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZpbGVzIHRoYXQgeW91IHdpbGwgb2Z0ZW4gc2VlIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCB3aGljaCBhcmUgZGVzY3JpYmVkIGluIGRldGFpbCBpbiBbMTB4IEdlbm9taWNzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vc2luZ2xlLWNlbGwtZ2VuZS1leHByZXNzaW9uL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L292ZXJ2aWV3KS4KV2UgaGF2ZSBpbmNsdWRlZCBzb21lIG9mIHRoZXNlIGluIHRoZSBgZGF0YS9ob2RraW5zL2NlbGxyYW5nZXJgIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRoZSBgd2ViX3N1bW1hcnkuaHRtbGAgZmlsZSB0aGF0IGluY2x1ZGVzIHNvbWUgc2ltaWxhciBRQyBzdGF0aXN0aWNzIHRvIHRob3NlIHdlIGdlbmVyYXRlZCB3aXRoIGBhbGV2aW5RQ2AuClRoZSBtYWluIGZpbGUgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGggYXJlIHRoZSBmZWF0dXJlIGJ5IGJhcmNvZGUgbWF0cmljZXMuCkNlbGwgUmFuZ2VyIGRvZXMgc29tZSBmaWx0ZXJpbmcgb24gaXRzIG93biwgYnV0IHdlIHdpbGwgc3RhcnQgd2l0aCB0aGUgcmF3IGRhdGEuCgpgYGB7ciBmaWxlcGF0aHN9CiMgbWFpbiBkYXRhIGRpcmVjdG9yeQpkYXRhX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAiaG9kZ2tpbnMiKQojIHJlZmVyZW5jZSBmaWxlcwpyZWZfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJyZWZlcmVuY2UiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXgKcmF3X21hdHJpeF9kaXIgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAiY2VsbHJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCiMgUGF0aCB0byBtaXRvY2hvbmRyaWFsIGdlbmVzIHRhYmxlCm1pdG9fZmlsZSA8LSBmaWxlLnBhdGgocmVmX2RpciwgImhzX21pdG9jaG9uZHJpYWxfZ2VuZXMudHN2IikKCiMgRGlyZWN0b3J5IGFuZCBmaWxlIHRvIHNhdmUgb3V0cHV0Cm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgIm5vcm1hbGl6ZWQiKQpmczo6ZGlyX2NyZWF0ZShub3JtYWxpemVkX2RpcikKCm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgobm9ybWFsaXplZF9kaXIsICJub3JtYWxpemVkX2hvZGdraW5zX3NjZS5yZHMiKQoKYGBgCgojIyBSZWFkaW5nIENlbGwgUmFuZ2VyIGRhdGEKCkNlbGwgUmFuZ2VyIG91dHB1dCBpbmNsdWRlcyBjb3VudCBkYXRhIGluIHR3byBtYWluIGZvcm1hdHMuClRoZSBmaXJzdCBpcyBhIGZvbGRlciB3aXRoIGEgZmVhdHVyZSBsaXN0LCBhIGJhcmNvZGUgbGlzdCwgYW5kIGEgc3BhcnNlIG1hdHJpeCBpbiBbIk1hdHJpeCBFeGNoYW5nZSIgZm9ybWF0XShodHRwczovL21hdGgubmlzdC5nb3YvTWF0cml4TWFya2V0L2Zvcm1hdHMuaHRtbCkuClRoZSBgRHJvcGxldFV0aWxzOjpyZWFkMTB4Q291bnRzKClgIGZ1bmN0aW9uIHRha2VzIHRoaXMgZGlyZWN0b3J5IGFuZCByZWFkcyBpbiB0aGUgZGF0YSBmcm9tIHRoZXNlIHRocmVlIGZpbGVzLCBhc3NlbWJsaW5nIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdCB3ZSBoYXZlIHdvcmtlZCB3aXRoIGJlZm9yZS4KCkFsdGVybmF0aXZlbHksIHdlIGNvdWxkIHVzZSB0aGUgYEhERjVgIGZvcm1hdCBmaWxlIHRoYXQgQ2VsbCBSYW5nZXIgb3V0cHV0cyBhcyBhIGZpbGUgd2l0aCB0aGUgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjb250YWlucyB0aGUgc2FtZSBkYXRhLgpGb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgd2F5IHlvdSByZWFkIHRoZSBkYXRhIGFmZmVjdHMgaG93IGl0IGlzIHN0b3JlZCBpbiBSLgpSZWFkaW5nIGZyb20gdGhlIGRpcmVjdG9yeSByZXN1bHRzIGluIHNtYWxsZXIgb2JqZWN0cyBpbiBSLCBzbyB0aGF0IGlzIHdoYXQgd2Ugd2lsbCBkbyBoZXJlLgoKQ2VsbCBSYW5nZXIgYWxzbyBvdXRwdXRzIGJvdGggZmlsdGVyZWQgYW5kIHJhdyBtYXRyaWNlczsgdG9kYXkgd2Ugd2lsbCBzdGFydCB3aXRoIHRoZSByYXcgbWF0cml4IGFuZCBwZXJmb3JtIG91ciBvd24gZmlsdGVyaW5nLgoKIVtSb2FkbWFwOiBQcmVwcm9jZXNzaW5nIGFuZCBJbXBvcnRdKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX3ByZXByb2Nlc3NfYWxldmluLnBuZykKCmBgYHtyIHJlYWQxMHgsIGxpdmUgPSBUUlVFfQpob2Rna2luc19zY2UgPC0gRHJvcGxldFV0aWxzOjpyZWFkMTB4Q291bnRzKHJhd19tYXRyaXhfZGlyKQpgYGAKCkhvdyBtYW55IHBvdGVudGlhbCBjZWxscyBhcmUgdGhlcmUgaGVyZT8KCmBgYHtyIGNlbGxjb3VudCwgbGl2ZSA9IFRSVUV9CmRpbShob2Rna2luc19zY2UpCmBgYAoKVGhhdCBpcyBhIGxvdCBvZiBjZWxscyEKSW4gZmFjdCwgaXQgaXMgcmVhbGx5IGV2ZXJ5IHBvc3NpYmxlIGJhcmNvZGUsIHdoZXRoZXIgdGhlcmUgd2VyZSByZWFkcyBhc3NvY2lhdGVkIHdpdGggaXQgb3Igbm90LgpXZSBzaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGFib3V0IHRoYXQuCgoKIyMgUUMgYW5kIG5vcm1hbGl6YXRpb24KCiFbUm9hZG1hcDogUUMgYW5kIGZpbHRlcmluZ10oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfcWNfbm9ybS5wbmcpCgojIyMgQmFzaWMgUUMgc3RhdHMKCldlIHdpbGwgc3RhcnQgYnkgY2FsY3VsYXRpbmcgdGhlIGJhc2ljIFFDIHN0YXRzIGFzIHdlIGhhdmUgZG9uZSBwcmV2aW91c2x5LCBhZGRpbmcgdGhvc2UgdG8gb3VyIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgoKVGhlIGZpcnN0IHN0ZXAgYWdhaW4gaXMgcmVhZGluZyBpbiBvdXIgdGFibGUgb2YgbWl0b2Nob25kcmlhbCBnZW5lcyBhbmQgZmluZGluZyB0aGUgb25lcyB0aGF0IHdlcmUgcXVhbnRpZmllZCBvdXIgZGF0YSBzZXQuCgpgYGB7ciBtaXRvZ2VuZXN9Cm1pdG9fZ2VuZXMgPC0gcmVhZHI6OnJlYWRfdHN2KG1pdG9fZmlsZSkgfD4KICBkcGx5cjo6ZmlsdGVyKGdlbmVfaWQgJWluJSByb3duYW1lcyhob2Rna2luc19zY2UpKSB8PgogIGRwbHlyOjpwdWxsKGdlbmVfaWQpCmBgYAoKTmV4dCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgUUMgc3RhdHMgdGhhdCB3ZSB1c2VkIGJlZm9yZS4KTm90ZSB0aGF0IHRoaXMgaXMgbXVjaCBzbG93ZXIgdGhhbiBiZWZvcmUsIGFzIHdlIGhhdmUgbWFueSBtb3JlIGdlbmVzIGluIHRoZSB1bmZpbHRlcmVkIHNldCEKCmBgYHtyIGNhbGN1bGF0ZVFDfQpob2Rna2luc19zY2UgPC0gc2NhdGVyOjphZGRQZXJDZWxsUUMoCiAgaG9kZ2tpbnNfc2NlLAogIHN1YnNldHMgPSBsaXN0KG1pdG8gPSBtaXRvX2dlbmVzKSkKYGBgCgpXZSBjYW4gbm93IGRvIHRoZSBtb3N0IGJhc2ljIGxldmVsIG9mIGZpbHRlcmluZzogZ2V0dGluZyByaWQgb2YgImNlbGxzIiB3aXRoIG5vIHJlYWRzLgoKYGBge3IgcmVtb3ZlX3plcm8sIGxpdmUgPSBUUlVFfQpob2Rna2luc19zY2UgPC0gaG9kZ2tpbnNfc2NlWywgaG9kZ2tpbnNfc2NlJHRvdGFsID4gMF0KZGltKGhvZGdraW5zX3NjZSkKYGBgCgojIyMgRmlsdGVyaW5nIHdpdGggYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgCgpUaGUgYERyb3BsZXRVdGlsc2AgcGFja2FnZSB0aGF0IHdlIHVzZWQgdG8gcmVhZCBpbiB0aGUgMTB4IGRhdGEgaGFzIGEgbnVtYmVyIG9mIG90aGVyIHVzZWZ1bCBmZWF0dXJlcy4KT25lIGlzIHRoZSBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgZnVuY3Rpb24sIHdoaWNoIHVzZXMgdGhlIG92ZXJhbGwgZ2VuZSBleHByZXNzaW9uIHBhdHRlcm5zIGluIHRoZSBzYW1wbGUgdG8gaWRlbnRpZnkgZHJvcGxldHMgdGhhdCBhcmUgbGlrZWx5IHRvIG5vdCBjb250YWluIGFuIGludGFjdCBjZWxsLCBidXQgbWF5IHNpbXBseSBoYXZlIGNvbnRhaW5lZCBsb29zZSBhbWJpZW50IFJOQSByZWxlYXNlZCBkdXJpbmcgY2VsbCBzZXBhcmF0aW9uLgpUaGlzIG1ldGhvZCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgW0x1biAqZXQgYWwuKiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzA1OS0wMTktMTY2Mi15KSBhbmQgaW1wbGVtZW50ZWQgYXMgdGhlIGZ1bmN0aW9uIGBlbXB0eURyb3BzKClgLCBidXQgaGFzIHNpbmNlIGJlZW4gYWRhcHRlZCBhcyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kIHVzZWQgYnkgQ2VsbCBSYW5nZXIuIApUaGUgYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uIGVtdWxhdGVzIHRoZSB2YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24gdGhhdCB1c2VkIGJ5IENlbGwgUmFuZ2VyLCBtYWtpbmcgdGhlIHJlc3VsdHMgbW9yZSBjb21wYXJhYmxlIGJldHdlZW4gdGhlIHR3byBtZXRob2RzLgoKVGhlIEVtcHR5IERyb3BzIG1ldGhvZCB1c2VzIHRoZSBkcm9wbGV0cyB3aXRoIHZlcnkgbG93IFVNSSBjb3VudHMgdG8gZXN0aW1hdGUgdGhlICJhbWJpZW50IiBleHByZXNzaW9uIHBhdHRlcm4gb2YgUk5BIGNvbnRlbnQgb3V0c2lkZSBvZiBjZWxscy4KSXQgdGhlbiBzY29yZXMgdGhlIHJlbWFpbmluZyBjZWxscyBiYXNlZCBob3cgbXVjaCB0aGV5IGRldmlhdGUgZnJvbSB0aGF0IHBhdHRlcm4sIGFzc2lnbmluZyBhIHNtYWxsIFAgdmFsdWUgd2hlbiB0aGUgZHJvcGxldCdzIGV4cHJlc3Npb24gZGV2aWF0ZXMgZnJvbSB0aGUgYW1iaWVudCBleHByZXNzaW9uIHBhdHRlcm4uCkJlY2F1c2UgaXQgdXNlcyB0aGUgbG93IFVNSSBjb3VudCBkcm9wbGV0cywgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gb3RoZXIgZmlsdGVyaW5nIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICh3aGljaCBpcyB1bmZvcnR1bmF0ZWx5IHRoZSBjYXNlIHdpdGggdGhlIHZlcnNpb24gb2YgYHNhbG1vbiBhbGV2aW5gIHdlIHVzZWQpLgoKVGhpcyBtZXRob2Qgc2VlbXMgdG8gcGVyZm9ybSB3ZWxsIHRvIGV4Y2x1ZGUgZmFsc2UgImNlbGxzIiB3aGlsZSByZXRhaW5pbmcgY2VsbHMgd2l0aCBkaXN0aW5jdCBleHByZXNzaW9uIHByb2ZpbGVzIGJ1dCBsb3cgY291bnRzIHRoYXQgbWlnaHQgaGF2ZSBmYWlsZWQgYSBzaW1wbGUgY3V0b2ZmLgpOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWxzbyByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcXVhbnRpZmllZCwgd2l0aCByZWFkcyBhc3NpZ25lZCB0byBnZW5lcywgYXMgY29tcGFyZWQgdG8gYSBzaW1wbGUgdG90YWwgVU1JIGNvdW50IGZpbHRlciB3aGljaCBjYW4gYmUgcGVyZm9ybWVkIG11Y2ggZWFybGllciBpbiB0aGUgcGlwZWxpbmUuCgpUaGUgYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uIHRha2VzIHRoZSBgY291bnRzYCBtYXRyaXggZnJvbSBvdXIgU2luZ2xlQ2VsbEV4cGVyaW1lbnQsIGFuZCByZXR1cm5zIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBzdGF0aXN0aWNzIGl0IGNhbGN1bGF0ZXMuClRoaXMgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gcnVuLCBidXQgd2UgY2FuIHNwZWVkIGl0IHVwIGJ5IGFsbG93aW5nIHBhcmFsbGVsIHByb2Nlc3NpbmcuCgpgYGB7ciBlbXB0eWRyb3BzLCBsaXZlID0gVFJVRX0KZHJvcGxldF9zdGF0cyA8LSBEcm9wbGV0VXRpbHM6OmVtcHR5RHJvcHNDZWxsUmFuZ2VyKAogIGNvdW50cyhob2Rna2luc19zY2UpLAogIEJQUEFSQU0gPSBCaW9jUGFyYWxsZWw6Ok11bHRpY29yZVBhcmFtKDQpKSAjIHVzZSBtdWx0aXByb2Nlc3NpbmcKYGBgCgpXZSB3aWxsIHVzZSBhIGZhbHNlIGRpc2NvdmVyeSByYXRlIChGRFIpIG9mIDAuMDEgYXMgb3VyIGN1dG9mZiBmb3IgInJlYWwiIGNlbGxzLgpTaW5jZSBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgdXNlcyBsb3cgY291bnQgY2VsbHMgdG8gZXN0aW1hdGUgdGhlICJhbWJpZW50IiBleHByZXNzaW9uIHBhdHRlcm4sIHRob3NlIGNlbGxzIGFyZSBub3QgYXNzaWduZWQgYW4gRkRSIHZhbHVlLCBhbmQgaGF2ZSBhIHZhbHVlIG9mIE5BLgpUaGVzZSBOQXMgY2FuIGJlIGEgcHJvYmxlbSBmb3IgZmlsdGVyaW5nIHdpdGggYSBCb29sZWFuIHZlY3RvciwgYXMgd2UgZGlkIGFib3ZlLCBzbyBpbnN0ZWFkIHdlIHdpbGwgdXNlIHRoZSBgd2hpY2goKWAgZnVuY3Rpb24gdG8gZ2V0IHRoZSAqcG9zaXRpb25zKiBvZiB0aGUgY2VsbHMgdGhhdCBwYXNzIG91ciBmaWx0ZXIgYW5kIHNlbGVjdCB0aGUgY29sdW1ucyB3ZSB3YW50IHVzaW5nIHRoYXQuCgpgYGB7ciBmaWx0ZXJfZW1wdHksIGxpdmUgPSBUUlVFfQpjZWxsc190b19yZXRhaW4gPC0gd2hpY2goZHJvcGxldF9zdGF0cyRGRFIgPD0gMC4wMSkKCmZpbHRlcmVkX3NjZSA8LSBob2Rna2luc19zY2VbLCBjZWxsc190b19yZXRhaW5dCmRpbShmaWx0ZXJlZF9zY2UpCmBgYAoKSG93IGRvZXMgdGhpcyBjb21wYXJlIHRvIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIENlbGwgUmFuZ2VyIGZpbHRlcmVkIGRhdGE/Ckxvb2tpbmcgdGhlIGB3ZWJfc3VtbWFyeS5odG1sYCByZXBvcnQgZnJvbSBDZWxsIFJhbmdlciwgaXQgc2VlbXMgdGhhdCBpdCB3b3VsZCBoYXZlIGtlcHQgMywzOTQgY2VsbHMsIHNvIHdlIHNlZW0gdG8gYmUgZ2V0dGluZyBicm9hZGx5IHNpbWlsYXIgcmVzdWx0cy4KCiMjIyBDaGVja2luZyBtaXRvY2hvbmRyaWFsIGNvbnRlbnQKCldoaWxlIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBzaG91bGQgaGF2ZSBmaWx0ZXJlZCBvdXQgZHJvcGxldHMgY29udGFpbmluZyBubyBjZWxscywgaXQgd2lsbCBub3QgbmVjZXNzYXJpbHkgZmlsdGVyIG91dCBkYW1hZ2VkIGNlbGxzLgpGb3IgdGhhdCB3ZSB3aWxsIHN0aWxsIHdhbnQgdG8gbG9vayBhdCBtaXRvY2hvbmRyaWFsIGNvbnRlbnQsIGFzIHdlIGRpZCBwcmV2aW91c2x5LgpUaGUgc3RhdGlzdGljcyB3ZSBjYWxjdWxhdGVkIGVhcmxpZXIgd2l0aCBgYWRkUGVyQ2VsbFFDKClgIGFyZSByZXRhaW5lZCBpbiBvdXIgbmV3IG9iamVjdCwgc28gd2UgY2FuIHBsb3QgdGhvc2UgZGlyZWN0bHkuCgpgYGB7ciBtaXRvX3BlcmNlbnRfcGxvdH0KIyBQbG90IHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRzIHN0b3JlZCBpbiBgZmlsdGVyZWRfc2NlYApnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gZmlsdGVyZWRfc2NlJHN1YnNldHNfbWl0b19wZXJjZW50KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCmBgYApUaGVyZSBhcmUgY2VydGFpbmx5IHNvbWUgY2VsbHMgd2l0aCBoaWdoIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZXMhCkZvciBub3csIHdlIHdpbGwgdXNlIGEgY3V0b2ZmIG9mIDIwJSB0byBmaWx0ZXIgb3V0IHRoZSB3b3JzdCBvZiB0aGUgY2VsbHMuCgpgYGB7ciBsaXZlID0gVFJVRX0KZmlsdGVyZWRfc2NlIDwtIGZpbHRlcmVkX3NjZVssIGZpbHRlcmVkX3NjZSRzdWJzZXRzX21pdG9fcGVyY2VudCA8IDIwXQpgYGAKCgpXZSBjYW4gYWxzbyBmaWx0ZXIgYnkgZmVhdHVyZXMgKGdlbmVzIGluIG91ciBjYXNlKSB1c2luZyBgc2NhdGVyOjphZGRQZXJGZWF0dXJlUUMoKWAgd2hpY2ggd2lsbCBjb21wdXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB3aGVyZSBlYWNoIGdlbmUgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBtZWFuIGNvdW50IGFjcm9zcyBhbGwgZ2VuZXMuCldlIGNhbiB0aGVuIHVzZSB0aG9zZSBkYXRhIChzdG9yZWQgaW4gYHJvd0RhdGFgKSB0byBmaWx0ZXIgYnkgcm93IHRvIG9ubHkgdGhlIGdlbmVzIHRoYXQgYXJlIGRldGVjdGVkIGluIGF0IGxlYXN0IDUlIG9mIGNlbGxzLCBhbmQgd2l0aCBhIG1lYW4gY291bnQgPiAwLjEuCgpgYGB7ciBnZW5lX3FjfQpmaWx0ZXJlZF9zY2UgPC0gc2NhdGVyOjphZGRQZXJGZWF0dXJlUUMoZmlsdGVyZWRfc2NlKQpkZXRlY3RlZCA8LSByb3dEYXRhKGZpbHRlcmVkX3NjZSkkZGV0ZWN0ZWQgPiA1CmV4cHJlc3NlZCA8LSByb3dEYXRhKGZpbHRlcmVkX3NjZSkkbWVhbiA+IDAuMQoKIyBmaWx0ZXIgdGhlIGdlbmVzIChyb3dzKSB0aGlzIHRpbWUKZmlsdGVyZWRfc2NlIDwtIGZpbHRlcmVkX3NjZVtkZXRlY3RlZCAmIGV4cHJlc3NlZCwgXQpgYGAKCkhvdyBtYW55IGNlbGxzIGRvIHdlIGhhdmUgbm93PwoKYGBge3IgZmlsdGVyZWRfZGltfQpkaW0oZmlsdGVyZWRfc2NlKQpgYGAKCgojIyMgTm9ybWFsaXplCgpOb3cgd2Ugd2lsbCBwZXJmb3JtIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gc3RlcHMgd2UgZGlkIGluIGEgcHJldmlvdXMgZGF0YXNldCwgdXNpbmcgYHNjcmFuOjpjb21wdXRlU3VtRmFjdG9ycygpYCBhbmQgYHNjYXRlcjo6bG9nTm9ybUNvdW50cygpYC4KWW91IG1pZ2h0IHJlY2FsbCB0aGF0IHRoZXJlIGlzIGEgYml0IG9mIHJhbmRvbW5lc3MgaW4gc29tZSBvZiB0aGVzZSBjYWxjdWxhdGlvbnMsIHNvIHdlIHNob3VsZCBiZSBzdXJlIHRvIGhhdmUgdXNlZCBgc2V0LnNlZWQoKWAgZWFybGllciBpbiB0aGUgbm90ZWJvb2sgZm9yIHJlcHJvZHVjaWJpbGl0eS4KCmBgYHtyIHN1bWZhY3RvcnN9CiMgQ2x1c3RlciBzaW1pbGFyIGNlbGxzCnFjbHVzdCA8LSBzY3Jhbjo6cXVpY2tDbHVzdGVyKGZpbHRlcmVkX3NjZSkKCiMgQ29tcHV0ZSBzdW0gZmFjdG9ycyBmb3IgZWFjaCBjZWxsIGNsdXN0ZXIgZ3JvdXBpbmcuCmZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoZmlsdGVyZWRfc2NlLCBjbHVzdGVycyA9IHFjbHVzdCwgcG9zaXRpdmUgPSBGQUxTRSkKYGBgCgpJdCB0dXJucyBvdXQgaW4gdGhpcyBjYXNlIHdlIGVuZCB1cCB3aXRoIHNvbWUgbmVnYXRpdmUgc2l6ZSBmYWN0b3JzLgpUaGlzIGlzIHVzdWFsbHkgYW4gaW5kaWNhdGlvbiB0aGF0IG91ciBmaWx0ZXJpbmcgd2FzIG5vdCBzdHJpbmdlbnQgZW5vdWdoLCBhbmQgdGhlcmUgcmVtYWluIGEgbnVtYmVyIG9mIGNlbGxzIG9yIGdlbmVzIHdpdGggbmVhcmx5IHplcm8gY291bnRzLgpUaGlzIHByb2JhYmx5IGhhcHBlbmVkIHdoZW4gd2UgcmVtb3ZlZCB0aGUgaW5mcmVxdWVudGx5LWV4cHJlc3NlZCBnZW5lczsgY2VsbHMgd2hpY2ggaGFkIGhpZ2ggY291bnRzIGZyb20gdGhvc2UgcGFydGljdWxhciBnZW5lcyAoYW5kIGZldyBvdGhlcnMpIGNvdWxkIGhhdmUgaGFkIHRoZWlyIHRvdGFsIGNvdW50cyBkcmFtYXRpY2FsbHkgcmVkdWNlZC4KClRvIGFjY291bnQgZm9yIHRoaXMsIHdlIHdpbGwgcmVjYWxjdWxhdGUgdGhlIHBlci1jZWxsIHN0YXRzIGFuZCBmaWx0ZXIgb3V0IGxvdyBjb3VudHMuClVuZm9ydHVuYXRlbHksIHRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gZmlyc3QgcmVtb3ZlIHRoZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgc3RhdGlzdGljcywgd2hpY2ggd2Ugd2lsbCBkbyBieSBzZXR0aW5nIHRoZW0gdG8gYE5VTExgLgoKYGBge3IgcmVRQ30KIyByZW1vdmUgcHJldmlvdXMgY2FsY3VsYXRpb25zCmZpbHRlcmVkX3NjZSRzdW0gPC0gTlVMTApmaWx0ZXJlZF9zY2UkZGV0ZWN0ZWQgPC0gTlVMTApmaWx0ZXJlZF9zY2UkdG90YWwgPC0gTlVMTApmaWx0ZXJlZF9zY2Ukc3Vic2V0c19taXRvX3N1bSA8LSBOVUxMCmZpbHRlcmVkX3NjZSRzdWJzZXRzX21pdG9fZGV0ZWN0ZWQgPC0gTlVMTApmaWx0ZXJlZF9zY2Ukc3Vic2V0c19taXRvX3N1bSA8LSBOVUxMCgojIHJlY2FsY3VsYXRlIGNlbGwgc3RhdHMKZmlsdGVyZWRfc2NlIDwtIHNjYXRlcjo6YWRkUGVyQ2VsbFFDKGZpbHRlcmVkX3NjZSwgc3Vic2V0cyA9IGxpc3QobWl0byA9IG1pdG9fZ2VuZXMpKQoKIyBwcmludCB0aGUgbnVtYmVyIG9mIGNlbGxzIHdpdGggZmV3ZXIgdGhhbiA1MDAgVU1JcwpzdW0oZmlsdGVyZWRfc2NlJHN1bSA8IDUwMCkKYGBgCgpOb3cgd2UgY2FuIGZpbHRlciBhZ2Fpbi4KSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGtlZXAgY2VsbHMgd2l0aCBhdCBsZWFzdCA1MDAgVU1JcyBhZnRlciByZW1vdmluZyB0aGUgbG93bHkgZXhwcmVzc2VkIGdlbmVzLgpUaGVuIHdlIHdpbGwgcmVkbyB0aGUgc2l6ZSBmYWN0b3IgY2FsY3VsYXRpb24sIGhvcGVmdWxseSB3aXRoIG5vIG1vcmUgd2FybmluZ3MuCgoKYGBge3IgcmVmaWx0ZXJ9CmZpbHRlcmVkX3NjZSA8LSBmaWx0ZXJlZF9zY2VbLCBmaWx0ZXJlZF9zY2Ukc3VtID49IDUwMF0KCnFjbHVzdCA8LSBzY3Jhbjo6cXVpY2tDbHVzdGVyKGZpbHRlcmVkX3NjZSkKCmZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoZmlsdGVyZWRfc2NlLCBjbHVzdGVycyA9IHFjbHVzdCkKYGBgCgpMb29rcyBnb29kISBOb3cgd2UnbGwgZG8gdGhlIG5vcm1hbGl6YXRpb24uCgpgYGB7ciBub3JtYWxpemV9CiMgTm9ybWFsaXplIGFuZCBsb2cgdHJhbnNmb3JtLgpub3JtYWxpemVkX3NjZSA8LSBzY2F0ZXI6OmxvZ05vcm1Db3VudHMoZmlsdGVyZWRfc2NlKQpgYGAKCkF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBmZXcgZGlmZmVyZW50IHZlcnNpb25zIG9mIG91ciBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KVGhlIG9yaWdpbmFsIChtb3N0bHkpIHVuZmlsdGVyZWQgdmVyc2lvbiBpcyBpbiBgaG9kZ2tpbnNfc2NlYCwgdGhlIGZpbHRlcmVkIHZlcnNpb24gaW4gYGZpbHRlcmVkX3NjZWAsIGFuZCB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIGluIGBub3JtYWxpemVkX3NjZWAuCldlIGNhbiBjbGVhbiB0aG9zZSB1cCBhIGJpdCB0byBzYXZlIG1lbW9yeSwga2VlcGluZyBvbmx5IHRoZSBsYXRlc3QgYG5vcm1hbGl6ZWRfc2NlYCB2ZXJzaW9uLCB3aGljaCBub3cgaGFzIHR3byBgYXNzYXlgczoKYGNvdW50c2Agd2l0aCB0aGUgcmF3IGRhdGEgYW5kIGBsb2djb3VudHNgIHdpdGggdGhlIG5vcm1hbGl6ZWQgYW5kIHRyYW5zZm9ybWVkIGRhdGEuCgpgYGB7ciBjbGVhbl91cCwgbGl2ZSA9IFRSVUV9CmFzc2F5TmFtZXMobm9ybWFsaXplZF9zY2UpCnJtKGhvZGdraW5zX3NjZSwgZmlsdGVyZWRfc2NlKQpgYGAKCgojIyBEaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gYW5kIGRpc3BsYXkKCiFbUm9hZG1hcDogRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uXShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9kaW1lbnNpb25fcmVkdWN0aW9uLnBuZykKCiMjIyBQcmluY2lwYWwgQ29tcG9uZW50cyBBbmFseXNpcwoKUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKSBpcyBhIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiB0ZWNobmlxdWUgdGhhdCBhbGxvd3MgdXMgdG8gaWRlbnRpZnkgdGhlIGxhcmdlc3QgY29tcG9uZW50cyBvZiB2YXJpYXRpb24gaW4gYSBjb21wbGV4IGRhdGFzZXQuCk91ciBleHByZXNzaW9uIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgbWFwcGluZyBlYWNoIHNhbXBsZSBpbiBhIG11bHRpZGltZW5zaW9uYWwgc3BhY2UgZGVmaW5lZCBieSB0aGUgZXhwcmVzc2lvbiBsZXZlbCBvZiBlYWNoIGdlbmUuClRoZSBleHByZXNzaW9uIG9mIG1hbnkgb2YgdGhvc2UgZ2VuZXMgYXJlIGNvcnJlbGF0ZWQsIHNvIHdlIGNhbiBvZnRlbiBnZXQgYSBiZXR0ZXIsIHNpbXBsZXIgcGljdHVyZSBvZiB0aGUgZGF0YSBieSBjb21iaW5pbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhvc2UgY29ycmVsYXRlZCBnZW5lcy4KClBDQSByb3RhdGVzIGFuZCB0cmFuc2Zvcm1zIHRoaXMgc3BhY2Ugc28gdGhhdCBlYWNoIGF4aXMgaXMgbm93IGEgY29tYmluYXRpb24gb2YgbXVsdGlwbGUgY29ycmVsYXRlZCBnZW5lcywgb3JkZXJlZCBzbyB0aGUgZmlyc3QgYXhlcyBjYXB0dXJlIHRoZSBtb3N0IHZhcmlhdGlvbiBmcm9tIHRoZSBkYXRhLgpUaGVzZSBuZXcgYXhlcyBhcmUgdGhlICJwcmluY2lwYWwgY29tcG9uZW50cy4iCklmIHdlIGxvb2sgYXQgdGhlIGZpcnN0IGZldyBjb21wb25lbnRzLCB3ZSBjYW4gb2Z0ZW4gZ2V0IGEgbmljZSBvdmVydmlldyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBzYW1wbGVzIGluIHRoZSBkYXRhLgoKIyMjIyBTdG9yaW5nIFBDQSByZXN1bHRzIHdpdGggdGhlIHJhdyBkYXRhCgpXZSB3aWxsIHN0b3JlIHRoZSBQQ0EgcmVzdWx0cyBpbiBvdXIgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QsIGFzIHdlIHdpbGwgd2FudCB0byB1c2UgdGhlbSBsYXRlci4KVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBydW5QQ0EoKWAgZnVuY3Rpb24gZnJvbSBgc2NhdGVyYCwgd2hpY2ggcGVyZm9ybXMgdGhlIFBDQSBjYWxjdWxhdGlvbnMgYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHJlc3VsdHMgc3RvcmVkIGluIHRoZSBgcmVkdWNlZERpbWAgc2xvdC4KSWYgd2Ugd2FudGVkIHRvLCB3ZSBjb3VsZCBnZXQgdGhlIHJhdyByZXN1bHRzIGFzIGEgbWF0cml4IGluc3RlYWQgd2l0aCBgY2FsY3VsYXRlUENBKClgIGZ1bmN0aW9uLCBhcyB3ZSBkaWQgaW4gYSBwcmV2aW91cyBub3RlYm9vay4KCldlIHdpbGwgYWxzbyB1c2UgdGhlIGBudG9wYCBhcmd1bWVudCB0byBjYWxjdWxhdGUgdGhlIFBDQSB1c2luZyAyMDAwIGdlbmVzIHdpdGggdGhlIGhpZ2hlc3QgdmFyaWFuY2UuClRoZSBkZWZhdWx0IGlzIGBudG9wID0gNTAwYC4KCmBgYHtyIHJ1blBDQSwgbGl2ZSA9IFRSVUV9CiMgY2FsY3VsYXRlIFBDQSB1c2luZyB0aGUgdG9wIDIwMDAgZ2VuZXMKbm9ybWFsaXplZF9zY2UgPC0gcnVuUENBKG5vcm1hbGl6ZWRfc2NlLCBudG9wID0gMjAwMCkKYGBgCgpXZSBjYW4gc2VlIHdoYXQgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSBtYXRyaWNlcyBhcmUgc3RvcmVkIGluIHRoZSBvYmplY3Qgd2l0aCB0aGUgYHJlZHVjZWREaW1OYW1lcygpYCBmdW5jdGlvbi4KCmBgYHtyIHJlZHVjZWRfZGltX25hbWVzLCBsaXZlID0gVFJVRX0KIyBwcmludCB0aGUgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSB0YWJsZXMgYXZhaWxhYmxlCnJlZHVjZWREaW1OYW1lcyhub3JtYWxpemVkX3NjZSkKYGBgCgpUbyBleHRyYWN0IHRoZW0gYnkgbmFtZSwgd2UgdXNlIHRoZSBgcmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgbXVjaCBsaWtlIHRoZSBgYXNzYXkoKWAgZnVuY3Rpb24gdG8gZXh0cmFjdCBvcmlnaW5hbCBkYXRhLgoKYGBge3IgZXh0cmFjdF9yZWR1Y2VkLCBsaXZlID0gVFJVRX0KIyBwcmludCB0aGUgdG9wIGNvcm5lciBvZiB0aGUgUENBIG1hdHJpeApyZWR1Y2VkRGltKG5vcm1hbGl6ZWRfc2NlLCAiUENBIilbMToxMCwgMTo1XQpgYGAKCiMjIyMgUGxvdHRpbmcgUENBIHJlc3VsdHMKCklmIHdlIGhhdmUgdGhlIFBDQSByZXN1bHRzIHN0b3JlZCBpbiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QsIHdlIGNhbiB1c2UgdGhlIGBzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKClgIGZ1bmN0aW9uIHRvIHBsb3QgaXQgd2l0aCBzb21lIG5pY2UgZGVmYXVsdHMgZWFzaWx5LgpPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgdXNlcyBgZ2dwbG90MmAgdW5kZXIgdGhlIGhvb2QsIHNvIGlmIHdlIHdhbnRlZCB0byBjdXN0b21pemUgaXQgbGF0ZXIsIHdlIGNvdWxkLgoKYGBge3IgcGxvdFBDQSwgbGl2ZSA9IFRSVUV9CiMgcGxvdCBQQ0EgcmVzdWx0cwpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIpCmBgYApQQ0EgZ2l2ZXMgdXMgYSBtYXRyaXggd2l0aCBtb3JlIHRoYW4ganVzdCB0d28gZGltZW5zaW9ucywgYW5kIHdlIG1pZ2h0IHdhbnQgdG8gbG9vayBhdCBzb21lIGhpZ2hlciBkaW1lbnNpb25zIHRvby4KV2UgY2FuIGRvIHRoYXQgd2l0aCB0aGUgYG5jb21wb25lbnRzYCBhcmd1bWVudC4KCmBgYHtyIHBsb3RQQ0EzNCwgbGl2ZSA9IFRSVUV9CiMgcGxvdCBQQzMgYW5kIFBDNApwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIsIG5jb21wb25lbnRzID0gYygzLDQpKQpgYGAKCiMjIyBNb2RlbGluZyB2YXJpYW5jZQoKVGhlIHZhcmlhdGlvbiBpbiBnZW5lIGV4cHJlc3Npb24gd2Ugc2VlIGFtb25nIGNlbGxzIGNvbWVzIGZyb20gYSBjb21iaW5hdGlvbiBvZiB2YXJpYXRpb24gZHVlIHRvIHRlY2huaWNhbCBlZmZlY3RzIGFuZCB0aGUgYmlvbG9neSB3ZSByZWFsbHkgY2FyZSBhYm91dC4KSW4gb3JkZXIgdG8gcm91Z2hseSBhY2NvdW50IGZvciB0aGlzIHdlIGNvdWxkIGp1c3QgdGFrZSB0aGUgbGFyZ2VzdCB2YXJpYW5jZSBnZW5lcywgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBsb3cgdmFyaWFuY2UgZ2VuZXMgYXJlIG1vc3RseSBqdXN0IG5vaXNlLgpUaGlzIGlzIHRoZSBkZWZhdWx0IGFwcHJvYWNoIHRoYXQgYHJ1blBDQSgpYCBhbmQgYGNhbGN1bGF0ZVBDQSgpYCB0YWtlLCB1c2luZyB0aGUgZ2VuZXMgd2l0aCB0aGUgZ3JlYXRlc3QgdmFyaWFuY2UgYWNyb3NzIGNlbGxzIHRvIGNhbGN1bGF0ZSB0aGUgUENBIG1hdHJpeC4KCklmIHdlIHdhbnQgdG8gYmUgYSBiaXQgbW9yZSBjYXJlZnVsIGFib3V0IGl0LCB3ZSBjYW4gbW9kZWwgdGhlIHZhcmlhbmNlIGluIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG1lYW4gZXhwcmVzc2lvbiBmb3IgdGhhdCBnZW5lLgpUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHdlIGdlbmVyYWxseSBleHBlY3QgdGhlIHZhcmlhbmNlIHRvIGluY3JlYXNlIGFzIG1lYW4gZXhwcmVzc2lvbiBpbmNyZWFzZXMsIGV2ZW4gaWYgdGhlcmUgaXMgbm8gYmlvbG9naWNhbCBzaWduYWwgaW4gdGhlIGV4cHJlc3Npb24gdmFyaWF0aW9uLgoKV2Ugd2lsbCBkbyB0aGlzIG1vZGVsaW5nIG9mIHZhcmlhbmNlIGJ5IGV4cHJlc3Npb24gd2l0aCB0aGUgYHNjcmFuOjptb2RlbEdlbmVWYXIoKWAgZnVuY3Rpb24sIHNhdmluZyB0aGUgcmVzdWx0cyB0byBhIG5ldyB2YXJpYWJsZS4KCmBgYHtyIG1vZGVsX3ZhcmlhbmNlfQpnZW5lX3ZhcmlhbmNlIDwtIHNjcmFuOjptb2RlbEdlbmVWYXIobm9ybWFsaXplZF9zY2UpCmBgYAoKTm93IGxldCdzIHBsb3QgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdlbmUgZXhwcmVzc2lvbiBhbmQgdmFyaWFuY2Ugd2Ugd2VyZSBkaXNjdXNzaW5nLgpIZXJlIHdlIHdpbGwgYWxzbyBhZGQgdGhlIGZpdHRpbmcgY3VydmUgdGhhdCBgc2NyYW46Om1vZGVsR2VuZVZhcigpYCBjcmVhdGVkLCB3aGljaCBpcyBzdG9yZWQgYXMgZnVuY3Rpb24gaW4gdGhlICBgJHRyZW5kYCBzbG90IG9mIHRoZSBgZ2VuZV92YXJpYW5jZWAgb2JqZWN0LgpXZSBjYW4gYWRkIGEgZnVuY3Rpb24gbGlrZSB0aGF0IGN1cnZlIHRvIGEgYGdncGxvdGAgd2l0aCBhIGBzdGF0X2Z1bmN0aW9uYCBsYXllci4KCmBgYHtyIHBsb3RfdmFyaWFuY2V9CmdncGxvdChhcy5kYXRhLmZyYW1lKGdlbmVfdmFyaWFuY2UpLCBhZXMoeCA9IG1lYW4sIHkgPSB0b3RhbCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4xKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBtZXRhZGF0YShnZW5lX3ZhcmlhbmNlKSR0cmVuZCwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKAogICAgeCA9ICJNZWFuIGxvZy1leHByZXNzaW9uIiwKICAgIHkgPSAiVmFyaWFuY2UiKSArCiAgdGhlbWVfYncoKQpgYGAKCk5vdyB3ZSBjYW4gdXNlIGBzY3Jhbjo6Z2V0VG9wSFZHcygpYCB0byBzZWxlY3QgdGhlIGdlbmVzIHRoYXQgaGF2ZSB0aGUgbW9zdCBiaW9sb2dpY2FsIHZhcmlhdGlvbiAoYWNjb3JkaW5nIHRvIHRoZSBtb2RlbCkgYW5kIHJlY2FsY3VsYXRlIFBDQSBzY29yZXMgdXNpbmcgb25seSB0aG9zZSBnZW5lcy4KKEluIHByYWN0aWNlLCB3ZSBhcmUgc2VsZWN0aW5nIHRoZSBnZW5lcyB3aXRoIHRoZSBsYXJnZXN0IHJlc2lkdWFsIHZhcmlhdGlvbiBhZnRlciByZW1vdmluZyB0ZWNobmljYWwgdmFyaWF0aW9uIG1vZGVsZWQgYnkgdGhlIG1lYW4vdmFyaWFuY2UgcmVsYXRpb25zaGlwLikKCkhlcmUgd2UgYXJlIHBpY2tpbmcgdGhlIDIwMDAgdG9wIGdlbmVzIHRvIG1hdGNoIHRoZSBudW1iZXIgb2YgZ2VuZXMgZnJvbSBvdXIgZWFybGllciBjYWxjdWxhdGlvbnMuCgpgYGB7ciBnZXRfaGlnaHZhciwgbGl2ZSA9IFRSVUV9CiMgc2VsZWN0IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzCmhpZ2h2YXJfZ2VuZXMgPC0gc2NyYW46OmdldFRvcEhWR3MoZ2VuZV92YXJpYW5jZSwgbiA9IDIwMDApCiMgY2FsY3VsYXRlIGEgUENBIG1hdHJpeCB1c2luZyB0aG9zZSBnZW5lcwpub3JtYWxpemVkX3NjZSA8LSBydW5QQ0Eobm9ybWFsaXplZF9zY2UsIHN1YnNldF9yb3cgPSBoaWdodmFyX2dlbmVzKQpgYGAKCk5vdyB3ZSBjYW4gcGxvdCBvdXIgbmV3IFBDQSB2YWx1ZXMgZm9yIGNvbXBhcmlzb24uCllvdSBtaWdodCByZWFsaXplIHRoYXQgb3VyIG9sZCBQQ0EgdmFsdWVzIHdlcmUgcmVwbGFjZWQgd2hlbiB3ZSByYW4gYHJ1blBDQSgpYCBhZ2Fpbiwgc28gd2UgY2FuJ3QgcmVjcmVhdGUgdGhlIGVhcmxpZXIgcGxvdHMgYXQgdGhpcyBzdGFnZSBvZiB0aGUgbm90ZWJvb2suCllvdSB3aWxsIGhhdmUgdG8gc2Nyb2xsIHVwIHRvIHlvdXIgZWFybGllciBwbG90cyB0byBjb21wYXJlLgoKYGBge3IgcGxvdFBDQV9oaWdodmFyLCBsaXZlID0gVFJVRX0KIyBwbG90IHRoZSBuZXcgUENBIHJlc3VsdHMKcGxvdFJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsICJQQ0EiKQpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIsIG5jb21wb25lbnRzID0gYygzLDQpKQpgYGAKCiMjIyBVTUFQCgoqKlVNQVAqKiAoVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uKSBpcyBhIG1hY2hpbmUgbGVhcm5pbmcgdGVjaG5pcXVlIGRlc2lnbmVkIHRvIHByb3ZpZGUgbW9yZSBkZXRhaWwgaW4gaGlnaGx5IGRpbWVuc2lvbmFsIGRhdGEgdGhhbiBhIHR5cGljYWwgcHJpbmNpcGFsIGNvbXBvbmVudHMgYW5hbHlzaXMuCldoaWxlIFBDQSBhc3N1bWVzIHRoYXQgdGhlIHZhcmlhdGlvbiB3ZSBjYXJlIGFib3V0IGhhcyBhIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uIChub3JtYWwsIGJyb2FkbHkgc3BlYWtpbmcpLCBVTUFQIGFsbG93cyBtb3JlIGNvbXBsaWNhdGVkIGRpc3RyaWJ1dGlvbnMgdGhhdCBpdCBsZWFybnMgZnJvbSB0aGUgZGF0YS4KVGhlIHVuZGVybHlpbmcgbWF0aGVtYXRpY3MgYXJlIGJleW9uZCBtZSwgYnV0IGlmIHlvdSBhcmUgbW9yZSBhbWJpdGlvdXMgdGhhbiBJLCB5b3UgY2FuIGxvb2sgYXQgdGhlIHBhcGVyIGJ5IFtNY0lubmVzLCBIZWFseSwgJiBNZWx2aWxsZSAoMjAxOCldKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xODAyLjAzNDI2KS4KVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgY2hhbmdlIGluIHVuZGVybHlpbmcgYXNzdW1wdGlvbnMgaXMgdGhhdCBVTUFQIGNhbiBkbyBhIGJldHRlciBqb2Igc2VwYXJhdGluZyBjbHVzdGVycywgZXNwZWNpYWxseSB3aGVuIHNvbWUgb2YgdGhvc2UgY2x1c3RlcnMgbWF5IGJlIG1vcmUgc2ltaWxhciB0byBlYWNoIG90aGVyIHRoYW4gb3RoZXJzLgoKQW5vdGhlciBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gdGVjaG5pcXVlIHRoYXQgeW91IG1heSBoYXZlIGhlYXJkIG9mIGlzICoqdC1TTkUqKiAodC1kaXN0cmlidXRlZCBTdG9jaGFzdGljIE5laWdoYm9yIEVtYmVkZGluZyksIHdoaWNoIGhhcyBzaW1pbGFyIHByb3BlcnRpZXMgdG8gVU1BUCwgYW5kIG9mdGVuIHByb2R1Y2VzIHNpbWlsYXIgcmVzdWx0cy4KVGhlcmUgaXMgc29tZSBvbmdvaW5nIGRlYmF0ZSBhYm91dCB3aGljaCBvZiB0aGVzZSB0d28gdGVjaG5pcXVlcyBpcyBzdXBlcmlvciwgYW5kIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2VzIGFyZSBkdWUgdG8gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIG9yIHRvIGltcGxlbWVudGF0aW9uIGFuZCBwYXJhbWV0ZXIgaW5pdGlhbGl6YXRpb24gZGVmYXVsdHMuClJlZ2FyZGxlc3Mgb2Ygd2h5LCBpbiBvdXIgZXhwZXJpZW5jZSwgVU1BUCBzZWVtcyB0byBwcm9kdWNlIHNsaWdodGx5IGJldHRlciByZXN1bHRzIGFuZCBydW4gYSBiaXQgZmFzdGVyLCBidXQgdGhlIGRpZmZlcmVuY2VzIGNhbiBiZSBzdWJ0bGUuCgojIyMjIERlZmF1bHQgcGFyYW1ldGVycwoKRm9yIGVhc2Ugb2YgdXNlIHdpdGggdGhpcyBkYXRhLCB3ZSB3aWxsIGJlIHVzaW5nIHRoZSBgc2NhdGVyOjpjYWxjdWxhdGVVTUFQKClgIGFuZCBgc2NhdGVyOjpydW5VTUFQKClgIGZ1bmN0aW9uIHRvIGFwcGx5IFVNQVAgdG8gb3VyIHNpbmdsZSBjZWxsIGRhdGEsIGJ1dCBzaW1pbGFyIGZ1bmN0aW9ucyB0aGUgYHV3b3RgIHBhY2thZ2UgKG5vdGFibHkgYHV3b3Q6OnVtYXAoKWApIGNhbiBiZSB1c2VkIHRvIGFwcGx5IFVNQVAgdG8gYW55IG51bWVyaWNhbCBtYXRyaXguCgpVTUFQIGNhbiBiZSBzbG93IGZvciBhIGxhcmdlIGRhdGEgc2V0IHdpdGggbG90cyBvZiBwYXJhbWV0ZXJzLgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgYHNjYXRlcjo6Y2FsY3VsYXRlVU1BUCgpYCBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBkb2VzIFBDQSBmaXJzdCwgYW5kIHRoZW4gcnVucyBVTUFQIG9uIHRoZSB0b3AgNTAgUENzLgpJZiB3ZSBoYXZlIGFscmVhZHkgY2FsY3VsYXRlZCBQQ0EgKGFzIHdlIGhhdmUpIHdlIGNhbiB0ZWxsIGl0IHRvIHVzZSB0aG9zZSByZXN1bHRzIHdpdGggdGhlIGBkaW1yZWRgIGFyZ3VtZW50LgoKQXMgd2l0aCBQQ0EsIHRoZXJlIGFyZSB0d28gZnVuY3Rpb25zIHdlIGNvdWxkIHVzZToKYHNjYXRlcjo6Y2FsY3VsYXRlVU1BUCgpYCB3aWxsIHJldHVybiBhIG1hdHJpeCBvZiByZXN1bHRzLCB3aXRoIG9uZSByb3cgZm9yIGVhY2ggc2FtcGxlLCBhbmQgYSBjb2x1bW4gZm9yIGVhY2ggb2YgdGhlIFVNQVAgZGltZW5zaW9ucyByZXR1cm5lZC4KYHNjYXRlcjo6cnVuVU1BUCgpYCBwZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiwgYnV0IHJldHVybnMgdGhlIHJlc3VsdHMgaW4gYSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmplY3QuCgpMZXQncyBzZWUgaG93IGl0IGxvb2tzIHdpdGggdGhlIChtb3N0bHkpIGRlZmF1bHQgcGFyYW1ldGVyczoKCmBgYHtyIGNhbGN1bGF0ZV91bWFwLCBsaXZlID0gVFJVRX0KIyBSdW4gVU1BUApub3JtYWxpemVkX3NjZSA8LSBydW5VTUFQKG5vcm1hbGl6ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJQQ0EiKSAjIHVzZSBhbHJlYWR5IHN0b3JlZCBQQ0EgcmVzdWx0cwpgYGAKCk5vdyB3ZSBjYW4gcGxvdCB3aXRoIHRoZSBzYW1lIGBwbG90UmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgc3BlY2lmeWluZyB3ZSB3YW50IHRvIHBsb3QgdGhlIFVNQVAgcmVzdWx0cyB0aGlzIHRpbWUuCldlIHdpbGwgYWxzbyBhZGQgc29tZSBjb2xvciB0aGlzIHRpbWUgd2l0aCB0aGUgYGNvbG9yX2J5YCBhcmd1bWVudCwgdXNpbmcgdGhlIG51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBpbiBlYWNoIGNlbGwgdG8gYXNzaWduIGEgaHVlLgoKYGBge3IgcGxvdF91bWFwLCBsaXZlID0gVFJVRX0KIyBtYWtlIGEgVU1BUCBwbG90IHdpdGggYHBsb3RSZWR1Y2VkRGltKClgCnBsb3RSZWR1Y2VkRGltKG5vcm1hbGl6ZWRfc2NlLCAiVU1BUCIsIGNvbG9yX2J5ID0gImRldGVjdGVkIikKYGBgCgpUaGVyZSBpcyBjbGVhcmx5IGEgbG90IG9mIHN0cnVjdHVyZSBpbiB0aGVyZSwgYnV0IGlzIGl0IG1lYW5pbmdmdWw/CkRvIHRoZSBjbHVzdGVycyB3ZSBzZWUgZGlmZmVyZW50aWF0ZSBjZWxsIHR5cGVzPyBIb3cgc2hvdWxkIHdlIGRpdmlkZSB0aGVtIHVwPwoKV2Ugd2lsbCBjb21lIGJhY2sgdG8gdGhpcyBxdWVzdGlvbiBsYXRlciEKCiMjIyBVTUFQIGV4cGVyaW1lbnRzCgpOb3cgdGhhdCB3ZSBoYXZlIGFuIGlkZWEgb2Ygd2hhdCBhIFVNQVAgcGxvdCB3aXRoIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgbG9va3MgbGlrZSwgbGV0J3MgdHJ5IGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgYG5fbmVpZ2hib3JzYCBwYXJhbWV0ZXIuCkZpcnN0LCB3ZSBzaG91bGQgc2VlIHdoYXQgdGhpcyBwYXJhbWV0ZXIgaXMsIGFuZCB3aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGlzLgpJbiB0aGUgY29uc29sZSwgcnVuIGA/c2NhdGVyOjpjYWxjdWxhdGVVTUFQYCB0byBzZWUgd2hhdCB0aGlzIChhbmQgb3RoZXIgcGFyYW1ldGVycykgYXJlLgpGb3IgZXZlbiBtb3JlIHBhcmFtZXRlcnMsIHlvdSBjYW4gbG9vayBhdCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBjb2RlIHRoYXQgYGNhbGN1bGF0ZVVNQVAoKWAgdXNlcywgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uIGB1d290Ojp1bWFwKClgCgpJbiBvcmRlciB0byBtYWtlIG91ciBleHBlcmltZW50YXRpb24gZWFzaWVyLCB3ZSB3aWxsIGNyZWF0ZSBhICpmdW5jdGlvbiogdGhhdCBhbGxvd3MgdXMgdG8gcmVydW4gdGhlIHNhbWUgY29kZSBlYXNpbHksIGJ1dCBjcmVhdGUgYW4gYXJndW1lbnQgdGhhdCBhbGxvd3MgdXMgdG8gY2hhbmdlIG9uZSB2YXJpYWJsZTogdGhlIGBuX25laWdoYm9yc2AgdmFyaWFibGUuCkhlcmUgd2UgYXJlIHNhdmluZyBvbmx5IGEgbGluZSBvZiBjb2RlLCBidXQgd2UgY291bGQgYXBwbHkgdGhpcyB0byBhIG11Y2ggbW9yZSBjb21wbGV4IHNlcmllcyBvZiBvcGVyYXRpb25zIGlmIHdlIHdhbnRlZCB0byEKCmBgYHtyIFVNQVAtZnVuY3Rpb259ClVNQVBfcGxvdF93cmFwcGVyIDwtIGZ1bmN0aW9uKHNjZSA9IG5vcm1hbGl6ZWRfc2NlLCBubl9wYXJhbSA9IDE1KSB7CiAgIyBQdXJwb3NlOiBSdW4gVU1BUCBhbmQgcGxvdCB0aGUgb3V0cHV0CiAgIyBBcmdzOiBubl9wYXJhbTogYSBzaW5nbGUgbnVtZXJpYyBhcmd1bWVudCB0aGF0IHdpbGwgY2hhbmdlIHRoZQogICMgICAgICAgICAgICAgICAgIG5fbmVpZ2hib3JzIHZhcmlhYmxlIGluIHRoZSBjYWxjdWxhdGVVTUFQKCkgZnVuY3Rpb24uCiAgIyBPdXRwdXQ6IGEgc2NhdHRlcnBsb3Qgd2l0aCB0aGUgdHdvIFVNQVAgY29vcmRpbmF0ZXMgcGxvdHRlZCBhbmQKICAjICAgICAgICAgY2VsbC10eXBlcyBsYWJlbGVkIHdpdGggZGF0YSBwb2ludCBjb2xvcnMuCgogICMgUnVuIFVNQVAgd2l0aCBhIHNwZWNpZmllZCBuX25laWdoYm9ycyBwYXJhbWV0ZXIKICBzY2VfdW1hcCA8LSBzY2F0ZXI6OnJ1blVNQVAoc2NlLCBkaW1yZWQgPSAiUENBIiwgbl9uZWlnaGJvcnMgPSBubl9wYXJhbSkKICBzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKHNjZV91bWFwLCAiVU1BUCIsIGNvbG9yX2J5ID0gImRldGVjdGVkIikgKwogICAgIyBtYWtlIHRoZSBsZWdlbmQgbGFiZWwgbW9yZSBpbmZvcm1hdGl2ZSAodGhpcyBpcyBnZ3Bsb3QyIGNvZGUhKQogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfY29sb3JiYXIodGl0bGU9ImdlbmVzXG5leHByZXNzZWQiKSkKfQpgYGAKCkxldCdzIG1ha2Ugc3VyZSB0aGF0IHdvcmtzIGFuZCBnaXZlcyB0aGUgc2FtZSByZXN1bHQgYXMgYmVmb3JlIHdoZW4gd2UgdXNlIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCgpgYGB7ciBmdW5jdGlvbi10ZXN0fQpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDE1KQpgYGAKCipLaW5kIG9mPyoKClRoaXMgaXNuJ3QgeW91ciBmYXVsdCEKVU1BUCBpcyBhIG5vbi1kZXRlcm1pbmlzdGljIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmFuZG9tIGNvbXBvbmVudCB0byB0aGUgcmVzdWx0cy4KV2UgY2FuIHVzZSBgc2V0LnNlZWQoKWAgdG8gYmUgc3VyZSB0aGF0IGFuIGluZGl2aWR1YWwgcnVuIChvciBzZXQgb2YgcnVucykgaXMgdGhlIHNhbWUgZXZlcnkgdGltZSB5b3UgcnVuIHlvdXIgYW5hbHlzaXMsIGJ1dCBpdCBpcyBpbXBvcnRhbnQgdG8gY2hlY2sgeW91ciByZXN1bHRzIGEgZmV3IHRpbWVzIHdpdGggZGlmZmVyZW50IHJhbmRvbSBzdGFydGluZyBwb2ludHMgdG8gYmUgc3VyZSB0aGF0IHRoZSByYW5kb20gY29tcG9uZW50IGlzIG5vdCBnaXZpbmcgeW91IGFub21hbG91cyByZXN1bHRzLgpTZXR0aW5nIGEgZGlmZmVyZW50IHJhbmRvbSBudW1iZXIgc2VlZCB3aXRoIGBzZXQuc2VlZCgpYCBpcyBvbmUgd2F5IHRvIGRvIHRoaXMsIG9yIHlvdSBjYW4gcnVuIHRoZSBhbmFseXNpcyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzZXNzaW9uLCBhcyB3ZSBoYXZlIGRvbmUgaGVyZS4KCkZpbGwgaW4gdGhlIG5leHQgZmV3IGNvZGUgY2h1bmtzIHdpdGggdGhlIGZ1bmN0aW9uIGFuZCB0aGUgYG5fbmVpZ2hib3JzYCBhcmd1bWVudCB5b3Ugd291bGQgbGlrZSB0byB1c2UgZm9yIGVhY2guCihGZWVsIGZyZWUgdG8gYWRkIG1vcmUgdGVzdHMhKQpUaGVuIHJ1biB0aGUgY2h1bmtzIGFuZCBjb21wYXJlIHlvdXIgb3V0cHV0IGdyYXBocy4KCmBgYHtyIHJ1bi1VTUFQLTEsIGxpdmUgPSBUUlVFfQojIFRyeSBzb21ldGhpbmcgbG93PwpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDMpCmBgYAoKYGBge3IgcnVuLVVNQVAtMiwgbGl2ZSA9IFRSVUV9CiMgVHJ5IHNvbWV0aGluZyBoaWdoPwpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDEwMCkKYGBgCgpgYGB7ciBydW4tVU1BUC0zLCBsaXZlID0gVFJVRX0KIyBUcnkgd2hhdGV2ZXIgeW91IGxpa2UhClVNQVBfcGxvdF93cmFwcGVyKG5uX3BhcmFtID0gNSkKYGBgCgojIyMjIFNvbWUgJ2JpZyBwaWN0dXJlJyB0aG91Z2h0cyB0byB0YWtlIGZyb20gdGhpcyBleHBlcmltZW50OgoKMS4gQW5hbHlzZXMgc3VjaCBhcyBVTUFQIGhhdmUgdmFyaW91cyBsaW1pdGF0aW9ucyBmb3IgaW50ZXJwcmV0YWJpbGl0eS4KVGhlIGNvb3JkaW5hdGVzIG9mIFVNQVAgb3V0cHV0IGZvciBhbnkgZ2l2ZW4gY2VsbCBjYW4gY2hhbmdlIGRyYW1hdGljYWxseSBkZXBlbmRpbmcgb24gcGFyYW1ldGVycywgYW5kIGV2ZW4gcnVuIHRvIHJ1biB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuClRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB5b3Ugc2hvdWxkbid0IHJlbHkgb24gdGhlIGV4YWN0IHZhbHVlcyBvZiBVTUFQJ3Mgb3V0cHV0LgoKICAgIC0gT25lIHBhcnRpY3VsYXIgbGltaXRhdGlvbiBvZiBVTUFQIChhbmQgdC1TTkUpIGlzIHRoYXQgd2hpbGUgb2JzZXJ2ZWQgY2x1c3RlcnMgaGF2ZSBzb21lIG1lYW5pbmcsIHRoZSBkaXN0YW5jZSAqYmV0d2VlbiogY2x1c3RlcnMgdXN1YWxseSBkb2VzIG5vdCAobm9yIGRvZXMgY2x1c3RlciBkZW5zaXR5KS4KICAgIFRoZSBmYWN0IHRoYXQgdHdvIGNsdXN0ZXJzIGFyZSBuZWFyIGVhY2ggb3RoZXIgc2hvdWxkIE5PVCBiZSBpbnRlcnByZXRlZCB0byBtZWFuIHRoYXQgdGhleSBhcmUgbW9yZSByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdGhhbiB0byBtb3JlIGRpc3RhbnQgY2x1c3RlcnMuCiAgICAoVGhlcmUgaXMgc29tZSBkaXNhZ3JlZW1lbnQgYWJvdXQgd2hldGhlciBVTUFQIGRpc3RhbmNlcyBoYXZlIG1vcmUgbWVhbmluZywgYnV0IGl0IGlzIHByb2JhYmx5IHNhZmVyIHRvIGFzc3VtZSB0aGV5IGRvbid0LikKCgoyLiBQbGF5aW5nIHdpdGggcGFyYW1ldGVycyBzbyB5b3UgY2FuIGZpbmUtdHVuZSB0aGVtIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3UgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgYW5hbHlzaXMgYXMgd2VsbCBhcyB0aGUgZGF0YSBpdHNlbGYuCgozLiBXaGVyZSByZXN1bHRzIGFyZSBjb25zaXN0ZW50LCB0aGV5IGFyZSBtb3JlIGxpa2VseSB0byBoYXZlIG1lYW5pbmcuCldoaWxlIHdlIGRvIG5vdCBoYXZlIGxhYmVsZWQgY2VsbCB0eXBlcyBpbiB0aGlzIGNhc2UsIHRoZXJlIGRvZXMgc2VlbSB0byBiZSBzb21lIGNvbnNpc3RlbmN5IG9mIHRoZSBvdmVyYWxsIHBhdHRlcm5zIHRoYXQgd2Ugc2VlIChpZiBub3QgcHJlY2lzZSB2YWx1ZXMpLCBhbmQgdGhpcyBsaWtlbHkgcmVmbGVjdHMgYmlvbG9naWNhbCBpbmZvcm1hdGlvbiAob3IgdGVjaG5pY2FsIGFydGlmYWN0cykuCgpJbiBzdW1tYXJ5LCBpZiB0aGUgcmVzdWx0cyBvZiBhbiBhbmFseXNpcyBjYW4gYmUgY29tcGxldGVseSBjaGFuZ2VkIGJ5IGNoYW5naW5nIGl0cyBwYXJhbWV0ZXJzLCB5b3Ugc2hvdWxkIGJlIG1vcmUgY2F1dGlvdXMgd2hlbiBpdCBjb21lcyB0byB0aGUgY29uY2x1c2lvbnMgeW91IGRyYXcgZnJvbSBpdCBhcyB3ZWxsIGFzIGhhdmluZyBnb29kIHJhdGlvbmFsZSBmb3IgdGhlIHBhcmFtZXRlcnMgeW91IGNob29zZS4KCiMjIyB0LVNORSBjb21wYXJpc29uCgpJbiB0aGUgYmxvY2sgYmVsb3cgaXMgYSBzaW1pbGFyIGFuYWx5c2lzIGFuZCBwbG90IHdpdGggdC1TTkUgKHQtZGlzdHJpYnV0ZWQgU3RvY2hhc3RpYyBOZWlnaGJvciBFbWJlZGRpbmcpLgpOb3RlIHRoYXQgdGhpcyBhbmFseXNpcyBhbHNvIHVzZXMgUENBIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIGZhbmN5IG1hY2hpbmUgbGVhcm5pbmcuCgpgYGB7ciB0c25lLCBsaXZlID0gVFJVRX0KIyBSdW4gVFNORQpub3JtYWxpemVkX3NjZSA8LSBydW5UU05FKG5vcm1hbGl6ZWRfc2NlLCBkaW1yZWQgPSAiUENBIikKCiMgcGxvdCB3aXRoIHNjYXRlciBmdW5jdGlvbgpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlRTTkUiLCBjb2xvcl9ieSA9ICJkZXRlY3RlZCIpCmBgYAoKRGlmZmVyZW50ISAoU2xvd2VyISkgSXMgaXQgYmV0dGVyIG9yIHdvcnNlPyBIYXJkIHRvIHNheSEKRGlmZmVyZW50IHBlb3BsZSBsaWtlIGRpZmZlcmVudCB0aGluZ3MsIGFuZCBvbmUgcGxvdCBtaWdodCBpbGx1c3RyYXRlIGEgcGFydGljdWxhciBwb2ludCBiZXR0ZXIgdGhhbiBhbm90aGVyLgoKIyMgU2F2ZSByZXN1bHRzCgpXZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgZGF0YSBtb3JlIGluIHRoZSBuZXh0IG5vdGVib29rLCBzbyBsZXQncyBzYXZlIGl0IGFzIGFuIGBSRFNgIGZpbGUuCgpgYGB7ciBzYXZlfQpyZWFkcjo6d3JpdGVfcmRzKG5vcm1hbGl6ZWRfc2NlLCBmaWxlID0gb3V0cHV0X3NjZV9maWxlKQpgYGAKCgojIyMgU29tZSBmdXJ0aGVyIHJlYWRpbmcgb24gZGltZW5zaW9uIHJlZHVjdGlvbjoKCi0gVGhpcyB3ZWJzaXRlIGV4cGxhaW5zIFtQQ0EgdmlzdWFsbHldKGh0dHA6Ly9zZXRvc2EuaW8vZXYvcHJpbmNpcGFsLWNvbXBvbmVudC1hbmFseXNpcy8pLgotIFtCZWNodCAqZXQgYWwuKiAoMjAxOCldKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvbmJ0LjQzMTQpIGRpc2N1c3NlcyB1c2luZyBbVU1BUF0oaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXApIGZvciBzaW5nbGUtY2VsbCBkYXRhLgotIFtXYXR0ZW5iZXJnICpldCBhbC4qICgyMDE2KV0oaHR0cHM6Ly9kaXN0aWxsLnB1Yi8yMDE2L21pc3JlYWQtdHNuZS8pIGRpc2N1c3MgaG93IHRvIHVzZSB0LVNORSBwcm9wZXJseSB3aXRoIGdyZWF0IHZpc3VhbHMuCihUaGUgbGVzc29ucyBhcHBseSB0byBVTUFQIGFzIHdlbGwsIHdpdGggYSBicm9hZCBzdWJzdGl0dXRpb24gb2YgdGhlIGBuX25laWdoYm9yc2AgcGFyYW1ldGVyIGZvciBgcGVycGxleGl0eWAuKQotIFtOZ3V5ZW4gJiBIb2xtZXMgKDIwMTkpXShodHRwczovL2pvdXJuYWxzLnBsb3Mub3JnL3Bsb3Njb21wYmlvbC9hcnRpY2xlP2lkPTEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDY5MDcpIGxheSBvdXQgZ3VpZGVsaW5lcyBvbiBjaG9vc2luZyBkaW1lbnNpb25zIHJlZHVjdGlvbiBtZXRob2RzLgotIFtGcmVpdGFnICgyMDE5KV0oaHR0cHM6Ly9ycHVicy5jb20vU2Fza2lhLzUyMDIxNikgaXMgYSBuaWNlIGV4cGxhbmF0aW9uIGFuZCBjb21wYXJpc29uIG9mIG1hbnkgZGlmZmVyZW50IGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiB0ZWNobmlxdWVzIHRoYXQgeW91IG1heSBlbmNvdW50ZXIuCgoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7ciBzZXNzaW9ufQpzZXNzaW9uSW5mbygpCmBgYAo=</div> +<div id="rmd-source-code">LS0tCnRpdGxlOiAiRGltZW5zaW9uIFJlZHVjdGlvbiB3aXRoIHNjUk5BLXNlcSBkYXRhIgphdXRob3I6IENDREwgZm9yIEFMU0YKZGF0ZTogMjAyMQpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKIyMgT2JqZWN0aXZlcwoKVGhpcyBub3RlYm9vayB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0bzoKCi0gUmVhZCBDZWxsIFJhbmdlciBkYXRhIGludG8gUgotIEZpbHRlciBwb3N0LXF1YW50aWZpY2F0aW9uIGNlbGxzIHVzaW5nIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYAotIEFwcGx5IGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBtZXRob2RzIHRvIHNpbmdsZSBjZWxsIGRhdGEKLSBWaXN1YWxpemUgc2FtcGxlcyBpbiByZWR1Y2VkIGRpbWVuc2lvbmFsIHNwYWNlCgotLS0KCkluIHRoaXMgbm90ZWJvb2ssIHdlJ2xsIHRyeSBvdXQgc29tZSBkaW1lbnNpb24gcmVkdWN0aW9uIHRlY2huaXF1ZXMgb24gc2luZ2xlLWNlbGwgUk5BLXNlcSBkYXRhLgoKVmlzdWFsaXppbmcgaGlnaGx5IGRpbWVuc2lvbmFsIGRhdGEgaXMgYSBjb21tb24gY2hhbGxlbmdlIGluIGdlbm9taWNzLCBhbmQgZXNwZWNpYWxseSB3aXRoIFJOQS1zZXEgZGF0YS4KVGhlIGV4cHJlc3Npb24gb2YgZXZlcnkgZ2VuZSB3ZSBsb29rIGF0IGlzIGFub3RoZXIgZGltZW5zaW9uIGRlc2NyaWJpbmcgYSBzYW1wbGUuCldoZW4gd2UgYWxzbyBoYXZlIGh1bmRyZWRzIG9yIHRob3VzYW5kcyBvZiBpbmRpdmlkdWFsIHNhbXBsZXMsIGFzIGluIHRoZSBjYXNlIG9mIHNpbmdsZS1jZWxsIGFuYWx5c2lzLCBmaWd1cmluZyBvdXQgaG93IHRvIGNsZWFybHkgZGlzcGxheSBhbGwgb2YgdGhlIGRhdGEgaW4gYSBtZWFuaW5nZnVsIHdheSBpcyBkaWZmaWN1bHQuCgpBIGNvbW1vbiBwcmFjdGljZSBpcyB0byBjb21tb24gdG8gdXNlIGRpbWVuc2lvbiByZWR1Y3Rpb24gdGVjaG5pcXVlcyBzbyBhbGwgb2YgdGhlIGRhdGEgaXMgaW4gYSBtb3JlIG1hbmFnZWFibGUgZm9ybSBmb3IgcGxvdHRpbmcsIGNsdXN0ZXJpbmcsIGFuZCBvdGhlciBkb3duc3RyZWFtIGFuYWx5c2VzLgoKIyMgU2V0IFVwCgpgYGB7ciBzZXR1cH0KIyBMb2FkIGxpYnJhcmllcwpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc2NhdGVyKQpsaWJyYXJ5KHNjcmFuKQoKIyBTZXR0aW5nIHRoZSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkKc2V0LnNlZWQoMTIzNDUpCmBgYAoKIyMjIERpcmVjdG9yaWVzIGFuZCBmaWxlcwoKVGhlIGRhdGEgd2Ugd2lsbCBiZSB1c2luZyBmb3IgdGhpcyBtb2R1bGUgY29tZXMgZnJvbSBhIGEgMTB4IEdlbm9taWNzIGRhdGEgc2V0IG9mIFtleHByZXNzaW9uIGRhdGEgZnJvbSBhIEhvZGdraW4ncyBMeW1waG9tYSB0dW1vcl0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9zaW5nbGUtY2VsbC1nZW5lLWV4cHJlc3Npb24vZGF0YXNldHMvNC4wLjAvUGFyZW50X05HU0MzX0RJX0hvZGdraW5zTHltcGhvbWEpLgpUaGUgZGF0YSB3YXMgZ2VuZXJhdGVkIHdpdGggdGhlIDEwWHYzLjEgY2hlbWlzdHJ5LCBhbmQgcHJvY2Vzc2VkIHdpdGggQ2VsbCBSYW5nZXIgYW5kIDEweCBHZW5vbWljcyBzdGFuZGFyZCBwaXBlbGluZS4KCgpUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZpbGVzIHRoYXQgeW91IHdpbGwgb2Z0ZW4gc2VlIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIG91dHB1dCBmcm9tIENlbGwgUmFuZ2VyLCB3aGljaCBhcmUgZGVzY3JpYmVkIGluIGRldGFpbCBpbiBbMTB4IEdlbm9taWNzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vc2luZ2xlLWNlbGwtZ2VuZS1leHByZXNzaW9uL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L292ZXJ2aWV3KS4KV2UgaGF2ZSBpbmNsdWRlZCBzb21lIG9mIHRoZXNlIGluIHRoZSBgZGF0YS9ob2RraW5zL2NlbGxyYW5nZXJgIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRoZSBgd2ViX3N1bW1hcnkuaHRtbGAgZmlsZSB0aGF0IGluY2x1ZGVzIHNvbWUgc2ltaWxhciBRQyBzdGF0aXN0aWNzIHRvIHRob3NlIHdlIGdlbmVyYXRlZCB3aXRoIGBhbGV2aW5RQ2AuClRoZSBtYWluIGZpbGUgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGggYXJlIHRoZSBmZWF0dXJlIGJ5IGJhcmNvZGUgbWF0cmljZXMuCkNlbGwgUmFuZ2VyIGRvZXMgc29tZSBmaWx0ZXJpbmcgb24gaXRzIG93biwgYnV0IHdlIHdpbGwgc3RhcnQgd2l0aCB0aGUgcmF3IGRhdGEuCgpgYGB7ciBmaWxlcGF0aHN9CiMgbWFpbiBkYXRhIGRpcmVjdG9yeQpkYXRhX2RpciA8LSBmaWxlLnBhdGgoImRhdGEiLCAiaG9kZ2tpbnMiKQojIHJlZmVyZW5jZSBmaWxlcwpyZWZfZGlyIDwtIGZpbGUucGF0aCgiZGF0YSIsICJyZWZlcmVuY2UiKQoKIyBQYXRoIHRvIHRoZSBDZWxsIFJhbmdlciBtYXRyaXgKcmF3X21hdHJpeF9kaXIgPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCAiY2VsbHJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCiMgUGF0aCB0byBtaXRvY2hvbmRyaWFsIGdlbmVzIHRhYmxlCm1pdG9fZmlsZSA8LSBmaWxlLnBhdGgocmVmX2RpciwgImhzX21pdG9jaG9uZHJpYWxfZ2VuZXMudHN2IikKCiMgRGlyZWN0b3J5IGFuZCBmaWxlIHRvIHNhdmUgb3V0cHV0Cm5vcm1hbGl6ZWRfZGlyIDwtIGZpbGUucGF0aChkYXRhX2RpciwgIm5vcm1hbGl6ZWQiKQpmczo6ZGlyX2NyZWF0ZShub3JtYWxpemVkX2RpcikKCm91dHB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgobm9ybWFsaXplZF9kaXIsICJub3JtYWxpemVkX2hvZGdraW5zX3NjZS5yZHMiKQoKYGBgCgojIyBSZWFkaW5nIENlbGwgUmFuZ2VyIGRhdGEKCkNlbGwgUmFuZ2VyIG91dHB1dCBpbmNsdWRlcyBjb3VudCBkYXRhIGluIHR3byBtYWluIGZvcm1hdHMuClRoZSBmaXJzdCBpcyBhIGZvbGRlciB3aXRoIGEgZmVhdHVyZSBsaXN0LCBhIGJhcmNvZGUgbGlzdCwgYW5kIGEgc3BhcnNlIG1hdHJpeCBpbiBbIk1hdHJpeCBFeGNoYW5nZSIgZm9ybWF0XShodHRwczovL21hdGgubmlzdC5nb3YvTWF0cml4TWFya2V0L2Zvcm1hdHMuaHRtbCkuClRoZSBgRHJvcGxldFV0aWxzOjpyZWFkMTB4Q291bnRzKClgIGZ1bmN0aW9uIHRha2VzIHRoaXMgZGlyZWN0b3J5IGFuZCByZWFkcyBpbiB0aGUgZGF0YSBmcm9tIHRoZXNlIHRocmVlIGZpbGVzLCBhc3NlbWJsaW5nIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdCB3ZSBoYXZlIHdvcmtlZCB3aXRoIGJlZm9yZS4KCkFsdGVybmF0aXZlbHksIHdlIGNvdWxkIHVzZSB0aGUgYEhERjVgIGZvcm1hdCBmaWxlIHRoYXQgQ2VsbCBSYW5nZXIgb3V0cHV0cyBhcyBhIGZpbGUgd2l0aCB0aGUgYC5oNWAgZXh0ZW5zaW9uLCB3aGljaCBjb250YWlucyB0aGUgc2FtZSBkYXRhLgpGb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgd2F5IHlvdSByZWFkIHRoZSBkYXRhIGFmZmVjdHMgaG93IGl0IGlzIHN0b3JlZCBpbiBSLgpSZWFkaW5nIGZyb20gdGhlIGRpcmVjdG9yeSByZXN1bHRzIGluIHNtYWxsZXIgb2JqZWN0cyBpbiBSLCBzbyB0aGF0IGlzIHdoYXQgd2Ugd2lsbCBkbyBoZXJlLgoKQ2VsbCBSYW5nZXIgYWxzbyBvdXRwdXRzIGJvdGggZmlsdGVyZWQgYW5kIHJhdyBtYXRyaWNlczsgdG9kYXkgd2Ugd2lsbCBzdGFydCB3aXRoIHRoZSByYXcgbWF0cml4IGFuZCBwZXJmb3JtIG91ciBvd24gZmlsdGVyaW5nLgoKIVtSb2FkbWFwOiBQcmVwcm9jZXNzaW5nIGFuZCBJbXBvcnRdKGRpYWdyYW1zL3JvYWRtYXBfc2luZ2xlX3ByZXByb2Nlc3NfYWxldmluLnBuZykKCmBgYHtyIHJlYWQxMHgsIGxpdmUgPSBUUlVFfQpob2Rna2luc19zY2UgPC0gRHJvcGxldFV0aWxzOjpyZWFkMTB4Q291bnRzKAogIHJhd19tYXRyaXhfZGlyLCAKICAjIGVuc3VyZSBiYXJjb2RlcyBhcmUgc2V0IGFzIGNvbHVtbiBuYW1lcyBpbiB0aGUgU0NFIG9iamVjdAogIGNvbC5uYW1lcyA9IFRSVUUKKQpgYGAKCkhvdyBtYW55IHBvdGVudGlhbCBjZWxscyBhcmUgdGhlcmUgaGVyZT8KCmBgYHtyIGNlbGxjb3VudCwgbGl2ZSA9IFRSVUV9CmRpbShob2Rna2luc19zY2UpCmBgYAoKVGhhdCBpcyBhIGxvdCBvZiBjZWxscyEKSW4gZmFjdCwgaXQgaXMgcmVhbGx5IGV2ZXJ5IHBvc3NpYmxlIGJhcmNvZGUsIHdoZXRoZXIgdGhlcmUgd2VyZSByZWFkcyBhc3NvY2lhdGVkIHdpdGggaXQgb3Igbm90LgpXZSBzaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGFib3V0IHRoYXQuCgoKIyMgUUMgYW5kIG5vcm1hbGl6YXRpb24KCiFbUm9hZG1hcDogUUMgYW5kIGZpbHRlcmluZ10oZGlhZ3JhbXMvcm9hZG1hcF9zaW5nbGVfcWNfbm9ybS5wbmcpCgojIyMgQmFzaWMgUUMgc3RhdHMKCldlIHdpbGwgc3RhcnQgYnkgY2FsY3VsYXRpbmcgdGhlIGJhc2ljIFFDIHN0YXRzIGFzIHdlIGhhdmUgZG9uZSBwcmV2aW91c2x5LCBhZGRpbmcgdGhvc2UgdG8gb3VyIGBTaW5nbGVDZWxsRXhwZXJpbWVudGAgb2JqZWN0LgoKVGhlIGZpcnN0IHN0ZXAgYWdhaW4gaXMgcmVhZGluZyBpbiBvdXIgdGFibGUgb2YgbWl0b2Nob25kcmlhbCBnZW5lcyBhbmQgZmluZGluZyB0aGUgb25lcyB0aGF0IHdlcmUgcXVhbnRpZmllZCBvdXIgZGF0YSBzZXQuCgpgYGB7ciBtaXRvZ2VuZXN9Cm1pdG9fZ2VuZXMgPC0gcmVhZHI6OnJlYWRfdHN2KG1pdG9fZmlsZSkgfD4KICBkcGx5cjo6ZmlsdGVyKGdlbmVfaWQgJWluJSByb3duYW1lcyhob2Rna2luc19zY2UpKSB8PgogIGRwbHlyOjpwdWxsKGdlbmVfaWQpCmBgYAoKTmV4dCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgUUMgc3RhdHMgdGhhdCB3ZSB1c2VkIGJlZm9yZS4KTm90ZSB0aGF0IHRoaXMgaXMgbXVjaCBzbG93ZXIgdGhhbiBiZWZvcmUsIGFzIHdlIGhhdmUgbWFueSBtb3JlIGdlbmVzIGluIHRoZSB1bmZpbHRlcmVkIHNldCEKCmBgYHtyIGNhbGN1bGF0ZVFDfQpob2Rna2luc19zY2UgPC0gc2NhdGVyOjphZGRQZXJDZWxsUUMoCiAgaG9kZ2tpbnNfc2NlLAogIHN1YnNldHMgPSBsaXN0KG1pdG8gPSBtaXRvX2dlbmVzKSkKYGBgCgpXZSBjYW4gbm93IGRvIHRoZSBtb3N0IGJhc2ljIGxldmVsIG9mIGZpbHRlcmluZzogZ2V0dGluZyByaWQgb2YgImNlbGxzIiB3aXRoIG5vIHJlYWRzLgoKYGBge3IgcmVtb3ZlX3plcm8sIGxpdmUgPSBUUlVFfQpob2Rna2luc19zY2UgPC0gaG9kZ2tpbnNfc2NlWywgaG9kZ2tpbnNfc2NlJHRvdGFsID4gMF0KZGltKGhvZGdraW5zX3NjZSkKYGBgCgojIyMgRmlsdGVyaW5nIHdpdGggYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgCgpUaGUgYERyb3BsZXRVdGlsc2AgcGFja2FnZSB0aGF0IHdlIHVzZWQgdG8gcmVhZCBpbiB0aGUgMTB4IGRhdGEgaGFzIGEgbnVtYmVyIG9mIG90aGVyIHVzZWZ1bCBmZWF0dXJlcy4KT25lIGlzIHRoZSBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgZnVuY3Rpb24sIHdoaWNoIHVzZXMgdGhlIG92ZXJhbGwgZ2VuZSBleHByZXNzaW9uIHBhdHRlcm5zIGluIHRoZSBzYW1wbGUgdG8gaWRlbnRpZnkgZHJvcGxldHMgdGhhdCBhcmUgbGlrZWx5IHRvIG5vdCBjb250YWluIGFuIGludGFjdCBjZWxsLCBidXQgbWF5IHNpbXBseSBoYXZlIGNvbnRhaW5lZCBsb29zZSBhbWJpZW50IFJOQSByZWxlYXNlZCBkdXJpbmcgY2VsbCBzZXBhcmF0aW9uLgpUaGlzIG1ldGhvZCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgW0x1biAqZXQgYWwuKiAoMjAxOSldKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzA1OS0wMTktMTY2Mi15KSBhbmQgaW1wbGVtZW50ZWQgYXMgdGhlIGZ1bmN0aW9uIGBlbXB0eURyb3BzKClgLCBidXQgaGFzIHNpbmNlIGJlZW4gYWRhcHRlZCBhcyB0aGUgbWFpbiBmaWx0ZXJpbmcgbWV0aG9kIHVzZWQgYnkgQ2VsbCBSYW5nZXIuIApUaGUgYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uIGVtdWxhdGVzIHRoZSB2YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24gdGhhdCB1c2VkIGJ5IENlbGwgUmFuZ2VyLCBtYWtpbmcgdGhlIHJlc3VsdHMgbW9yZSBjb21wYXJhYmxlIGJldHdlZW4gdGhlIHR3byBtZXRob2RzLgoKVGhlIEVtcHR5IERyb3BzIG1ldGhvZCB1c2VzIHRoZSBkcm9wbGV0cyB3aXRoIHZlcnkgbG93IFVNSSBjb3VudHMgdG8gZXN0aW1hdGUgdGhlICJhbWJpZW50IiBleHByZXNzaW9uIHBhdHRlcm4gb2YgUk5BIGNvbnRlbnQgb3V0c2lkZSBvZiBjZWxscy4KSXQgdGhlbiBzY29yZXMgdGhlIHJlbWFpbmluZyBjZWxscyBiYXNlZCBob3cgbXVjaCB0aGV5IGRldmlhdGUgZnJvbSB0aGF0IHBhdHRlcm4sIGFzc2lnbmluZyBhIHNtYWxsIFAgdmFsdWUgd2hlbiB0aGUgZHJvcGxldCdzIGV4cHJlc3Npb24gZGV2aWF0ZXMgZnJvbSB0aGUgYW1iaWVudCBleHByZXNzaW9uIHBhdHRlcm4uCkJlY2F1c2UgaXQgdXNlcyB0aGUgbG93IFVNSSBjb3VudCBkcm9wbGV0cywgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gb3RoZXIgZmlsdGVyaW5nIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICh3aGljaCBpcyB1bmZvcnR1bmF0ZWx5IHRoZSBjYXNlIHdpdGggdGhlIHZlcnNpb24gb2YgYHNhbG1vbiBhbGV2aW5gIHdlIHVzZWQpLgoKVGhpcyBtZXRob2Qgc2VlbXMgdG8gcGVyZm9ybSB3ZWxsIHRvIGV4Y2x1ZGUgZmFsc2UgImNlbGxzIiB3aGlsZSByZXRhaW5pbmcgY2VsbHMgd2l0aCBkaXN0aW5jdCBleHByZXNzaW9uIHByb2ZpbGVzIGJ1dCBsb3cgY291bnRzIHRoYXQgbWlnaHQgaGF2ZSBmYWlsZWQgYSBzaW1wbGUgY3V0b2ZmLgpOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWxzbyByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcXVhbnRpZmllZCwgd2l0aCByZWFkcyBhc3NpZ25lZCB0byBnZW5lcywgYXMgY29tcGFyZWQgdG8gYSBzaW1wbGUgdG90YWwgVU1JIGNvdW50IGZpbHRlciB3aGljaCBjYW4gYmUgcGVyZm9ybWVkIG11Y2ggZWFybGllciBpbiB0aGUgcGlwZWxpbmUuCgpUaGUgYGVtcHR5RHJvcHNDZWxsUmFuZ2VyKClgIGZ1bmN0aW9uIHRha2VzIHRoZSBgY291bnRzYCBtYXRyaXggZnJvbSBvdXIgU2luZ2xlQ2VsbEV4cGVyaW1lbnQsIGFuZCByZXR1cm5zIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBzdGF0aXN0aWNzIGl0IGNhbGN1bGF0ZXMuClRoaXMgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gcnVuLCBidXQgd2UgY2FuIHNwZWVkIGl0IHVwIGJ5IGFsbG93aW5nIHBhcmFsbGVsIHByb2Nlc3NpbmcuCgpgYGB7ciBlbXB0eWRyb3BzLCBsaXZlID0gVFJVRX0KZHJvcGxldF9zdGF0cyA8LSBEcm9wbGV0VXRpbHM6OmVtcHR5RHJvcHNDZWxsUmFuZ2VyKAogIGNvdW50cyhob2Rna2luc19zY2UpLAogIEJQUEFSQU0gPSBCaW9jUGFyYWxsZWw6Ok11bHRpY29yZVBhcmFtKDQpKSAjIHVzZSBtdWx0aXByb2Nlc3NpbmcKYGBgCgpXZSB3aWxsIHVzZSBhIGZhbHNlIGRpc2NvdmVyeSByYXRlIChGRFIpIG9mIDAuMDEgYXMgb3VyIGN1dG9mZiBmb3IgInJlYWwiIGNlbGxzLgpTaW5jZSBgZW1wdHlEcm9wc0NlbGxSYW5nZXIoKWAgdXNlcyBsb3cgY291bnQgY2VsbHMgdG8gZXN0aW1hdGUgdGhlICJhbWJpZW50IiBleHByZXNzaW9uIHBhdHRlcm4sIHRob3NlIGNlbGxzIGFyZSBub3QgYXNzaWduZWQgYW4gRkRSIHZhbHVlLCBhbmQgaGF2ZSBhIHZhbHVlIG9mIE5BLgpUaGVzZSBOQXMgY2FuIGJlIGEgcHJvYmxlbSBmb3IgZmlsdGVyaW5nIHdpdGggYSBCb29sZWFuIHZlY3RvciwgYXMgd2UgZGlkIGFib3ZlLCBzbyBpbnN0ZWFkIHdlIHdpbGwgdXNlIHRoZSBgd2hpY2goKWAgZnVuY3Rpb24gdG8gZ2V0IHRoZSAqcG9zaXRpb25zKiBvZiB0aGUgY2VsbHMgdGhhdCBwYXNzIG91ciBmaWx0ZXIgYW5kIHNlbGVjdCB0aGUgY29sdW1ucyB3ZSB3YW50IHVzaW5nIHRoYXQuCgpgYGB7ciBmaWx0ZXJfZW1wdHksIGxpdmUgPSBUUlVFfQpjZWxsc190b19yZXRhaW4gPC0gd2hpY2goZHJvcGxldF9zdGF0cyRGRFIgPD0gMC4wMSkKCmZpbHRlcmVkX3NjZSA8LSBob2Rna2luc19zY2VbLCBjZWxsc190b19yZXRhaW5dCmRpbShmaWx0ZXJlZF9zY2UpCmBgYAoKSG93IGRvZXMgdGhpcyBjb21wYXJlIHRvIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIENlbGwgUmFuZ2VyIGZpbHRlcmVkIGRhdGE/Ckxvb2tpbmcgdGhlIGB3ZWJfc3VtbWFyeS5odG1sYCByZXBvcnQgZnJvbSBDZWxsIFJhbmdlciwgaXQgc2VlbXMgdGhhdCBpdCB3b3VsZCBoYXZlIGtlcHQgMywzOTQgY2VsbHMsIHNvIHdlIHNlZW0gdG8gYmUgZ2V0dGluZyBicm9hZGx5IHNpbWlsYXIgcmVzdWx0cy4KCiMjIyBDaGVja2luZyBtaXRvY2hvbmRyaWFsIGNvbnRlbnQKCldoaWxlIGBlbXB0eURyb3BzQ2VsbFJhbmdlcigpYCBzaG91bGQgaGF2ZSBmaWx0ZXJlZCBvdXQgZHJvcGxldHMgY29udGFpbmluZyBubyBjZWxscywgaXQgd2lsbCBub3QgbmVjZXNzYXJpbHkgZmlsdGVyIG91dCBkYW1hZ2VkIGNlbGxzLgpGb3IgdGhhdCB3ZSB3aWxsIHN0aWxsIHdhbnQgdG8gbG9vayBhdCBtaXRvY2hvbmRyaWFsIGNvbnRlbnQsIGFzIHdlIGRpZCBwcmV2aW91c2x5LgpUaGUgc3RhdGlzdGljcyB3ZSBjYWxjdWxhdGVkIGVhcmxpZXIgd2l0aCBgYWRkUGVyQ2VsbFFDKClgIGFyZSByZXRhaW5lZCBpbiBvdXIgbmV3IG9iamVjdCwgc28gd2UgY2FuIHBsb3QgdGhvc2UgZGlyZWN0bHkuCgpgYGB7ciBtaXRvX3BlcmNlbnRfcGxvdH0KIyBQbG90IHRoZSBtaXRvY2hvbmRyaWFsIHBlcmNlbnRzIHN0b3JlZCBpbiBgZmlsdGVyZWRfc2NlYApnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gZmlsdGVyZWRfc2NlJHN1YnNldHNfbWl0b19wZXJjZW50KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCmBgYApUaGVyZSBhcmUgY2VydGFpbmx5IHNvbWUgY2VsbHMgd2l0aCBoaWdoIG1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZXMhCkZvciBub3csIHdlIHdpbGwgdXNlIGEgY3V0b2ZmIG9mIDIwJSB0byBmaWx0ZXIgb3V0IHRoZSB3b3JzdCBvZiB0aGUgY2VsbHMuCgpgYGB7ciBsaXZlID0gVFJVRX0KZmlsdGVyZWRfc2NlIDwtIGZpbHRlcmVkX3NjZVssIGZpbHRlcmVkX3NjZSRzdWJzZXRzX21pdG9fcGVyY2VudCA8IDIwXQpgYGAKCgpXZSBjYW4gYWxzbyBmaWx0ZXIgYnkgZmVhdHVyZXMgKGdlbmVzIGluIG91ciBjYXNlKSB1c2luZyBgc2NhdGVyOjphZGRQZXJGZWF0dXJlUUMoKWAgd2hpY2ggd2lsbCBjb21wdXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB3aGVyZSBlYWNoIGdlbmUgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBtZWFuIGNvdW50IGFjcm9zcyBhbGwgZ2VuZXMuCldlIGNhbiB0aGVuIHVzZSB0aG9zZSBkYXRhIChzdG9yZWQgaW4gYHJvd0RhdGFgKSB0byBmaWx0ZXIgYnkgcm93IHRvIG9ubHkgdGhlIGdlbmVzIHRoYXQgYXJlIGRldGVjdGVkIGluIGF0IGxlYXN0IDUlIG9mIGNlbGxzLCBhbmQgd2l0aCBhIG1lYW4gY291bnQgPiAwLjEuCgpgYGB7ciBnZW5lX3FjfQpmaWx0ZXJlZF9zY2UgPC0gc2NhdGVyOjphZGRQZXJGZWF0dXJlUUMoZmlsdGVyZWRfc2NlKQpkZXRlY3RlZCA8LSByb3dEYXRhKGZpbHRlcmVkX3NjZSkkZGV0ZWN0ZWQgPiA1CmV4cHJlc3NlZCA8LSByb3dEYXRhKGZpbHRlcmVkX3NjZSkkbWVhbiA+IDAuMQoKIyBmaWx0ZXIgdGhlIGdlbmVzIChyb3dzKSB0aGlzIHRpbWUKZmlsdGVyZWRfc2NlIDwtIGZpbHRlcmVkX3NjZVtkZXRlY3RlZCAmIGV4cHJlc3NlZCwgXQpgYGAKCkhvdyBtYW55IGNlbGxzIGRvIHdlIGhhdmUgbm93PwoKYGBge3IgZmlsdGVyZWRfZGltfQpkaW0oZmlsdGVyZWRfc2NlKQpgYGAKCgojIyMgTm9ybWFsaXplCgpOb3cgd2Ugd2lsbCBwZXJmb3JtIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gc3RlcHMgd2UgZGlkIGluIGEgcHJldmlvdXMgZGF0YXNldCwgdXNpbmcgYHNjcmFuOjpjb21wdXRlU3VtRmFjdG9ycygpYCBhbmQgYHNjYXRlcjo6bG9nTm9ybUNvdW50cygpYC4KWW91IG1pZ2h0IHJlY2FsbCB0aGF0IHRoZXJlIGlzIGEgYml0IG9mIHJhbmRvbW5lc3MgaW4gc29tZSBvZiB0aGVzZSBjYWxjdWxhdGlvbnMsIHNvIHdlIHNob3VsZCBiZSBzdXJlIHRvIGhhdmUgdXNlZCBgc2V0LnNlZWQoKWAgZWFybGllciBpbiB0aGUgbm90ZWJvb2sgZm9yIHJlcHJvZHVjaWJpbGl0eS4KCmBgYHtyIHN1bWZhY3RvcnN9CiMgQ2x1c3RlciBzaW1pbGFyIGNlbGxzCnFjbHVzdCA8LSBzY3Jhbjo6cXVpY2tDbHVzdGVyKGZpbHRlcmVkX3NjZSkKCiMgQ29tcHV0ZSBzdW0gZmFjdG9ycyBmb3IgZWFjaCBjZWxsIGNsdXN0ZXIgZ3JvdXBpbmcuCmZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoZmlsdGVyZWRfc2NlLCBjbHVzdGVycyA9IHFjbHVzdCwgcG9zaXRpdmUgPSBGQUxTRSkKYGBgCgpJdCB0dXJucyBvdXQgaW4gdGhpcyBjYXNlIHdlIGVuZCB1cCB3aXRoIHNvbWUgbmVnYXRpdmUgc2l6ZSBmYWN0b3JzLgpUaGlzIGlzIHVzdWFsbHkgYW4gaW5kaWNhdGlvbiB0aGF0IG91ciBmaWx0ZXJpbmcgd2FzIG5vdCBzdHJpbmdlbnQgZW5vdWdoLCBhbmQgdGhlcmUgcmVtYWluIGEgbnVtYmVyIG9mIGNlbGxzIG9yIGdlbmVzIHdpdGggbmVhcmx5IHplcm8gY291bnRzLgpUaGlzIHByb2JhYmx5IGhhcHBlbmVkIHdoZW4gd2UgcmVtb3ZlZCB0aGUgaW5mcmVxdWVudGx5LWV4cHJlc3NlZCBnZW5lczsgY2VsbHMgd2hpY2ggaGFkIGhpZ2ggY291bnRzIGZyb20gdGhvc2UgcGFydGljdWxhciBnZW5lcyAoYW5kIGZldyBvdGhlcnMpIGNvdWxkIGhhdmUgaGFkIHRoZWlyIHRvdGFsIGNvdW50cyBkcmFtYXRpY2FsbHkgcmVkdWNlZC4KClRvIGFjY291bnQgZm9yIHRoaXMsIHdlIHdpbGwgcmVjYWxjdWxhdGUgdGhlIHBlci1jZWxsIHN0YXRzIGFuZCBmaWx0ZXIgb3V0IGxvdyBjb3VudHMuClVuZm9ydHVuYXRlbHksIHRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gZmlyc3QgcmVtb3ZlIHRoZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgc3RhdGlzdGljcywgd2hpY2ggd2Ugd2lsbCBkbyBieSBzZXR0aW5nIHRoZW0gdG8gYE5VTExgLgoKYGBge3IgcmVRQ30KIyByZW1vdmUgcHJldmlvdXMgY2FsY3VsYXRpb25zCmZpbHRlcmVkX3NjZSRzdW0gPC0gTlVMTApmaWx0ZXJlZF9zY2UkZGV0ZWN0ZWQgPC0gTlVMTApmaWx0ZXJlZF9zY2UkdG90YWwgPC0gTlVMTApmaWx0ZXJlZF9zY2Ukc3Vic2V0c19taXRvX3N1bSA8LSBOVUxMCmZpbHRlcmVkX3NjZSRzdWJzZXRzX21pdG9fZGV0ZWN0ZWQgPC0gTlVMTApmaWx0ZXJlZF9zY2Ukc3Vic2V0c19taXRvX3N1bSA8LSBOVUxMCgojIHJlY2FsY3VsYXRlIGNlbGwgc3RhdHMKZmlsdGVyZWRfc2NlIDwtIHNjYXRlcjo6YWRkUGVyQ2VsbFFDKGZpbHRlcmVkX3NjZSwgc3Vic2V0cyA9IGxpc3QobWl0byA9IG1pdG9fZ2VuZXMpKQoKIyBwcmludCB0aGUgbnVtYmVyIG9mIGNlbGxzIHdpdGggZmV3ZXIgdGhhbiA1MDAgVU1JcwpzdW0oZmlsdGVyZWRfc2NlJHN1bSA8IDUwMCkKYGBgCgpOb3cgd2UgY2FuIGZpbHRlciBhZ2Fpbi4KSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGtlZXAgY2VsbHMgd2l0aCBhdCBsZWFzdCA1MDAgVU1JcyBhZnRlciByZW1vdmluZyB0aGUgbG93bHkgZXhwcmVzc2VkIGdlbmVzLgpUaGVuIHdlIHdpbGwgcmVkbyB0aGUgc2l6ZSBmYWN0b3IgY2FsY3VsYXRpb24sIGhvcGVmdWxseSB3aXRoIG5vIG1vcmUgd2FybmluZ3MuCgoKYGBge3IgcmVmaWx0ZXJ9CmZpbHRlcmVkX3NjZSA8LSBmaWx0ZXJlZF9zY2VbLCBmaWx0ZXJlZF9zY2Ukc3VtID49IDUwMF0KCnFjbHVzdCA8LSBzY3Jhbjo6cXVpY2tDbHVzdGVyKGZpbHRlcmVkX3NjZSkKCmZpbHRlcmVkX3NjZSA8LSBzY3Jhbjo6Y29tcHV0ZVN1bUZhY3RvcnMoZmlsdGVyZWRfc2NlLCBjbHVzdGVycyA9IHFjbHVzdCkKYGBgCgpMb29rcyBnb29kISBOb3cgd2UnbGwgZG8gdGhlIG5vcm1hbGl6YXRpb24uCgpgYGB7ciBub3JtYWxpemV9CiMgTm9ybWFsaXplIGFuZCBsb2cgdHJhbnNmb3JtLgpub3JtYWxpemVkX3NjZSA8LSBzY2F0ZXI6OmxvZ05vcm1Db3VudHMoZmlsdGVyZWRfc2NlKQpgYGAKCkF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBmZXcgZGlmZmVyZW50IHZlcnNpb25zIG9mIG91ciBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIG9iamVjdC4KVGhlIG9yaWdpbmFsIChtb3N0bHkpIHVuZmlsdGVyZWQgdmVyc2lvbiBpcyBpbiBgaG9kZ2tpbnNfc2NlYCwgdGhlIGZpbHRlcmVkIHZlcnNpb24gaW4gYGZpbHRlcmVkX3NjZWAsIGFuZCB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIGluIGBub3JtYWxpemVkX3NjZWAuCldlIGNhbiBjbGVhbiB0aG9zZSB1cCBhIGJpdCB0byBzYXZlIG1lbW9yeSwga2VlcGluZyBvbmx5IHRoZSBsYXRlc3QgYG5vcm1hbGl6ZWRfc2NlYCB2ZXJzaW9uLCB3aGljaCBub3cgaGFzIHR3byBgYXNzYXlgczoKYGNvdW50c2Agd2l0aCB0aGUgcmF3IGRhdGEgYW5kIGBsb2djb3VudHNgIHdpdGggdGhlIG5vcm1hbGl6ZWQgYW5kIHRyYW5zZm9ybWVkIGRhdGEuCgpgYGB7ciBjbGVhbl91cCwgbGl2ZSA9IFRSVUV9CmFzc2F5TmFtZXMobm9ybWFsaXplZF9zY2UpCnJtKGhvZGdraW5zX3NjZSwgZmlsdGVyZWRfc2NlKQpgYGAKCgojIyBEaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gYW5kIGRpc3BsYXkKCiFbUm9hZG1hcDogRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uXShkaWFncmFtcy9yb2FkbWFwX3NpbmdsZV9kaW1lbnNpb25fcmVkdWN0aW9uLnBuZykKCiMjIyBQcmluY2lwYWwgQ29tcG9uZW50cyBBbmFseXNpcwoKUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKSBpcyBhIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiB0ZWNobmlxdWUgdGhhdCBhbGxvd3MgdXMgdG8gaWRlbnRpZnkgdGhlIGxhcmdlc3QgY29tcG9uZW50cyBvZiB2YXJpYXRpb24gaW4gYSBjb21wbGV4IGRhdGFzZXQuCk91ciBleHByZXNzaW9uIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgbWFwcGluZyBlYWNoIHNhbXBsZSBpbiBhIG11bHRpZGltZW5zaW9uYWwgc3BhY2UgZGVmaW5lZCBieSB0aGUgZXhwcmVzc2lvbiBsZXZlbCBvZiBlYWNoIGdlbmUuClRoZSBleHByZXNzaW9uIG9mIG1hbnkgb2YgdGhvc2UgZ2VuZXMgYXJlIGNvcnJlbGF0ZWQsIHNvIHdlIGNhbiBvZnRlbiBnZXQgYSBiZXR0ZXIsIHNpbXBsZXIgcGljdHVyZSBvZiB0aGUgZGF0YSBieSBjb21iaW5pbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhvc2UgY29ycmVsYXRlZCBnZW5lcy4KClBDQSByb3RhdGVzIGFuZCB0cmFuc2Zvcm1zIHRoaXMgc3BhY2Ugc28gdGhhdCBlYWNoIGF4aXMgaXMgbm93IGEgY29tYmluYXRpb24gb2YgbXVsdGlwbGUgY29ycmVsYXRlZCBnZW5lcywgb3JkZXJlZCBzbyB0aGUgZmlyc3QgYXhlcyBjYXB0dXJlIHRoZSBtb3N0IHZhcmlhdGlvbiBmcm9tIHRoZSBkYXRhLgpUaGVzZSBuZXcgYXhlcyBhcmUgdGhlICJwcmluY2lwYWwgY29tcG9uZW50cy4iCklmIHdlIGxvb2sgYXQgdGhlIGZpcnN0IGZldyBjb21wb25lbnRzLCB3ZSBjYW4gb2Z0ZW4gZ2V0IGEgbmljZSBvdmVydmlldyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBzYW1wbGVzIGluIHRoZSBkYXRhLgoKIyMjIyBTdG9yaW5nIFBDQSByZXN1bHRzIHdpdGggdGhlIHJhdyBkYXRhCgpXZSB3aWxsIHN0b3JlIHRoZSBQQ0EgcmVzdWx0cyBpbiBvdXIgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QsIGFzIHdlIHdpbGwgd2FudCB0byB1c2UgdGhlbSBsYXRlci4KVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgdGhlIGBydW5QQ0EoKWAgZnVuY3Rpb24gZnJvbSBgc2NhdGVyYCwgd2hpY2ggcGVyZm9ybXMgdGhlIFBDQSBjYWxjdWxhdGlvbnMgYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHJlc3VsdHMgc3RvcmVkIGluIHRoZSBgcmVkdWNlZERpbWAgc2xvdC4KSWYgd2Ugd2FudGVkIHRvLCB3ZSBjb3VsZCBnZXQgdGhlIHJhdyByZXN1bHRzIGFzIGEgbWF0cml4IGluc3RlYWQgd2l0aCBgY2FsY3VsYXRlUENBKClgIGZ1bmN0aW9uLCBhcyB3ZSBkaWQgaW4gYSBwcmV2aW91cyBub3RlYm9vay4KCldlIHdpbGwgYWxzbyB1c2UgdGhlIGBudG9wYCBhcmd1bWVudCB0byBjYWxjdWxhdGUgdGhlIFBDQSB1c2luZyAyMDAwIGdlbmVzIHdpdGggdGhlIGhpZ2hlc3QgdmFyaWFuY2UuClRoZSBkZWZhdWx0IGlzIGBudG9wID0gNTAwYC4KCmBgYHtyIHJ1blBDQSwgbGl2ZSA9IFRSVUV9CiMgY2FsY3VsYXRlIFBDQSB1c2luZyB0aGUgdG9wIDIwMDAgZ2VuZXMKbm9ybWFsaXplZF9zY2UgPC0gcnVuUENBKG5vcm1hbGl6ZWRfc2NlLCBudG9wID0gMjAwMCkKYGBgCgpXZSBjYW4gc2VlIHdoYXQgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSBtYXRyaWNlcyBhcmUgc3RvcmVkIGluIHRoZSBvYmplY3Qgd2l0aCB0aGUgYHJlZHVjZWREaW1OYW1lcygpYCBmdW5jdGlvbi4KCmBgYHtyIHJlZHVjZWRfZGltX25hbWVzLCBsaXZlID0gVFJVRX0KIyBwcmludCB0aGUgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSB0YWJsZXMgYXZhaWxhYmxlCnJlZHVjZWREaW1OYW1lcyhub3JtYWxpemVkX3NjZSkKYGBgCgpUbyBleHRyYWN0IHRoZW0gYnkgbmFtZSwgd2UgdXNlIHRoZSBgcmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgbXVjaCBsaWtlIHRoZSBgYXNzYXkoKWAgZnVuY3Rpb24gdG8gZXh0cmFjdCBvcmlnaW5hbCBkYXRhLgoKYGBge3IgZXh0cmFjdF9yZWR1Y2VkLCBsaXZlID0gVFJVRX0KIyBwcmludCB0aGUgdG9wIGNvcm5lciBvZiB0aGUgUENBIG1hdHJpeApyZWR1Y2VkRGltKG5vcm1hbGl6ZWRfc2NlLCAiUENBIilbMToxMCwgMTo1XQpgYGAKCiMjIyMgUGxvdHRpbmcgUENBIHJlc3VsdHMKCklmIHdlIGhhdmUgdGhlIFBDQSByZXN1bHRzIHN0b3JlZCBpbiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCBvYmplY3QsIHdlIGNhbiB1c2UgdGhlIGBzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKClgIGZ1bmN0aW9uIHRvIHBsb3QgaXQgd2l0aCBzb21lIG5pY2UgZGVmYXVsdHMgZWFzaWx5LgpPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaXQgdXNlcyBgZ2dwbG90MmAgdW5kZXIgdGhlIGhvb2QsIHNvIGlmIHdlIHdhbnRlZCB0byBjdXN0b21pemUgaXQgbGF0ZXIsIHdlIGNvdWxkLgoKYGBge3IgcGxvdFBDQSwgbGl2ZSA9IFRSVUV9CiMgcGxvdCBQQ0EgcmVzdWx0cwpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIpCmBgYApQQ0EgZ2l2ZXMgdXMgYSBtYXRyaXggd2l0aCBtb3JlIHRoYW4ganVzdCB0d28gZGltZW5zaW9ucywgYW5kIHdlIG1pZ2h0IHdhbnQgdG8gbG9vayBhdCBzb21lIGhpZ2hlciBkaW1lbnNpb25zIHRvby4KV2UgY2FuIGRvIHRoYXQgd2l0aCB0aGUgYG5jb21wb25lbnRzYCBhcmd1bWVudC4KCmBgYHtyIHBsb3RQQ0EzNCwgbGl2ZSA9IFRSVUV9CiMgcGxvdCBQQzMgYW5kIFBDNApwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIsIG5jb21wb25lbnRzID0gYygzLDQpKQpgYGAKCiMjIyBNb2RlbGluZyB2YXJpYW5jZQoKVGhlIHZhcmlhdGlvbiBpbiBnZW5lIGV4cHJlc3Npb24gd2Ugc2VlIGFtb25nIGNlbGxzIGNvbWVzIGZyb20gYSBjb21iaW5hdGlvbiBvZiB2YXJpYXRpb24gZHVlIHRvIHRlY2huaWNhbCBlZmZlY3RzIGFuZCB0aGUgYmlvbG9neSB3ZSByZWFsbHkgY2FyZSBhYm91dC4KSW4gb3JkZXIgdG8gcm91Z2hseSBhY2NvdW50IGZvciB0aGlzIHdlIGNvdWxkIGp1c3QgdGFrZSB0aGUgbGFyZ2VzdCB2YXJpYW5jZSBnZW5lcywgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBsb3cgdmFyaWFuY2UgZ2VuZXMgYXJlIG1vc3RseSBqdXN0IG5vaXNlLgpUaGlzIGlzIHRoZSBkZWZhdWx0IGFwcHJvYWNoIHRoYXQgYHJ1blBDQSgpYCBhbmQgYGNhbGN1bGF0ZVBDQSgpYCB0YWtlLCB1c2luZyB0aGUgZ2VuZXMgd2l0aCB0aGUgZ3JlYXRlc3QgdmFyaWFuY2UgYWNyb3NzIGNlbGxzIHRvIGNhbGN1bGF0ZSB0aGUgUENBIG1hdHJpeC4KCklmIHdlIHdhbnQgdG8gYmUgYSBiaXQgbW9yZSBjYXJlZnVsIGFib3V0IGl0LCB3ZSBjYW4gbW9kZWwgdGhlIHZhcmlhbmNlIGluIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG1lYW4gZXhwcmVzc2lvbiBmb3IgdGhhdCBnZW5lLgpUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHdlIGdlbmVyYWxseSBleHBlY3QgdGhlIHZhcmlhbmNlIHRvIGluY3JlYXNlIGFzIG1lYW4gZXhwcmVzc2lvbiBpbmNyZWFzZXMsIGV2ZW4gaWYgdGhlcmUgaXMgbm8gYmlvbG9naWNhbCBzaWduYWwgaW4gdGhlIGV4cHJlc3Npb24gdmFyaWF0aW9uLgoKV2Ugd2lsbCBkbyB0aGlzIG1vZGVsaW5nIG9mIHZhcmlhbmNlIGJ5IGV4cHJlc3Npb24gd2l0aCB0aGUgYHNjcmFuOjptb2RlbEdlbmVWYXIoKWAgZnVuY3Rpb24sIHNhdmluZyB0aGUgcmVzdWx0cyB0byBhIG5ldyB2YXJpYWJsZS4KCmBgYHtyIG1vZGVsX3ZhcmlhbmNlfQpnZW5lX3ZhcmlhbmNlIDwtIHNjcmFuOjptb2RlbEdlbmVWYXIobm9ybWFsaXplZF9zY2UpCmBgYAoKTm93IGxldCdzIHBsb3QgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdlbmUgZXhwcmVzc2lvbiBhbmQgdmFyaWFuY2Ugd2Ugd2VyZSBkaXNjdXNzaW5nLgpIZXJlIHdlIHdpbGwgYWxzbyBhZGQgdGhlIGZpdHRpbmcgY3VydmUgdGhhdCBgc2NyYW46Om1vZGVsR2VuZVZhcigpYCBjcmVhdGVkLCB3aGljaCBpcyBzdG9yZWQgYXMgZnVuY3Rpb24gaW4gdGhlICBgJHRyZW5kYCBzbG90IG9mIHRoZSBgZ2VuZV92YXJpYW5jZWAgb2JqZWN0LgpXZSBjYW4gYWRkIGEgZnVuY3Rpb24gbGlrZSB0aGF0IGN1cnZlIHRvIGEgYGdncGxvdGAgd2l0aCBhIGBzdGF0X2Z1bmN0aW9uYCBsYXllci4KCmBgYHtyIHBsb3RfdmFyaWFuY2V9CmdncGxvdChhcy5kYXRhLmZyYW1lKGdlbmVfdmFyaWFuY2UpLCBhZXMoeCA9IG1lYW4sIHkgPSB0b3RhbCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4xKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBtZXRhZGF0YShnZW5lX3ZhcmlhbmNlKSR0cmVuZCwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKAogICAgeCA9ICJNZWFuIGxvZy1leHByZXNzaW9uIiwKICAgIHkgPSAiVmFyaWFuY2UiKSArCiAgdGhlbWVfYncoKQpgYGAKCk5vdyB3ZSBjYW4gdXNlIGBzY3Jhbjo6Z2V0VG9wSFZHcygpYCB0byBzZWxlY3QgdGhlIGdlbmVzIHRoYXQgaGF2ZSB0aGUgbW9zdCBiaW9sb2dpY2FsIHZhcmlhdGlvbiAoYWNjb3JkaW5nIHRvIHRoZSBtb2RlbCkgYW5kIHJlY2FsY3VsYXRlIFBDQSBzY29yZXMgdXNpbmcgb25seSB0aG9zZSBnZW5lcy4KKEluIHByYWN0aWNlLCB3ZSBhcmUgc2VsZWN0aW5nIHRoZSBnZW5lcyB3aXRoIHRoZSBsYXJnZXN0IHJlc2lkdWFsIHZhcmlhdGlvbiBhZnRlciByZW1vdmluZyB0ZWNobmljYWwgdmFyaWF0aW9uIG1vZGVsZWQgYnkgdGhlIG1lYW4vdmFyaWFuY2UgcmVsYXRpb25zaGlwLikKCkhlcmUgd2UgYXJlIHBpY2tpbmcgdGhlIDIwMDAgdG9wIGdlbmVzIHRvIG1hdGNoIHRoZSBudW1iZXIgb2YgZ2VuZXMgZnJvbSBvdXIgZWFybGllciBjYWxjdWxhdGlvbnMuCgpgYGB7ciBnZXRfaGlnaHZhciwgbGl2ZSA9IFRSVUV9CiMgc2VsZWN0IHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzCmhpZ2h2YXJfZ2VuZXMgPC0gc2NyYW46OmdldFRvcEhWR3MoZ2VuZV92YXJpYW5jZSwgbiA9IDIwMDApCiMgY2FsY3VsYXRlIGEgUENBIG1hdHJpeCB1c2luZyB0aG9zZSBnZW5lcwpub3JtYWxpemVkX3NjZSA8LSBydW5QQ0Eobm9ybWFsaXplZF9zY2UsIHN1YnNldF9yb3cgPSBoaWdodmFyX2dlbmVzKQpgYGAKCk5vdyB3ZSBjYW4gcGxvdCBvdXIgbmV3IFBDQSB2YWx1ZXMgZm9yIGNvbXBhcmlzb24uCllvdSBtaWdodCByZWFsaXplIHRoYXQgb3VyIG9sZCBQQ0EgdmFsdWVzIHdlcmUgcmVwbGFjZWQgd2hlbiB3ZSByYW4gYHJ1blBDQSgpYCBhZ2Fpbiwgc28gd2UgY2FuJ3QgcmVjcmVhdGUgdGhlIGVhcmxpZXIgcGxvdHMgYXQgdGhpcyBzdGFnZSBvZiB0aGUgbm90ZWJvb2suCllvdSB3aWxsIGhhdmUgdG8gc2Nyb2xsIHVwIHRvIHlvdXIgZWFybGllciBwbG90cyB0byBjb21wYXJlLgoKYGBge3IgcGxvdFBDQV9oaWdodmFyLCBsaXZlID0gVFJVRX0KIyBwbG90IHRoZSBuZXcgUENBIHJlc3VsdHMKcGxvdFJlZHVjZWREaW0obm9ybWFsaXplZF9zY2UsICJQQ0EiKQpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlBDQSIsIG5jb21wb25lbnRzID0gYygzLDQpKQpgYGAKCiMjIyBVTUFQCgoqKlVNQVAqKiAoVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uKSBpcyBhIG1hY2hpbmUgbGVhcm5pbmcgdGVjaG5pcXVlIGRlc2lnbmVkIHRvIHByb3ZpZGUgbW9yZSBkZXRhaWwgaW4gaGlnaGx5IGRpbWVuc2lvbmFsIGRhdGEgdGhhbiBhIHR5cGljYWwgcHJpbmNpcGFsIGNvbXBvbmVudHMgYW5hbHlzaXMuCldoaWxlIFBDQSBhc3N1bWVzIHRoYXQgdGhlIHZhcmlhdGlvbiB3ZSBjYXJlIGFib3V0IGhhcyBhIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uIChub3JtYWwsIGJyb2FkbHkgc3BlYWtpbmcpLCBVTUFQIGFsbG93cyBtb3JlIGNvbXBsaWNhdGVkIGRpc3RyaWJ1dGlvbnMgdGhhdCBpdCBsZWFybnMgZnJvbSB0aGUgZGF0YS4KVGhlIHVuZGVybHlpbmcgbWF0aGVtYXRpY3MgYXJlIGJleW9uZCBtZSwgYnV0IGlmIHlvdSBhcmUgbW9yZSBhbWJpdGlvdXMgdGhhbiBJLCB5b3UgY2FuIGxvb2sgYXQgdGhlIHBhcGVyIGJ5IFtNY0lubmVzLCBIZWFseSwgJiBNZWx2aWxsZSAoMjAxOCldKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xODAyLjAzNDI2KS4KVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgY2hhbmdlIGluIHVuZGVybHlpbmcgYXNzdW1wdGlvbnMgaXMgdGhhdCBVTUFQIGNhbiBkbyBhIGJldHRlciBqb2Igc2VwYXJhdGluZyBjbHVzdGVycywgZXNwZWNpYWxseSB3aGVuIHNvbWUgb2YgdGhvc2UgY2x1c3RlcnMgbWF5IGJlIG1vcmUgc2ltaWxhciB0byBlYWNoIG90aGVyIHRoYW4gb3RoZXJzLgoKQW5vdGhlciBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gdGVjaG5pcXVlIHRoYXQgeW91IG1heSBoYXZlIGhlYXJkIG9mIGlzICoqdC1TTkUqKiAodC1kaXN0cmlidXRlZCBTdG9jaGFzdGljIE5laWdoYm9yIEVtYmVkZGluZyksIHdoaWNoIGhhcyBzaW1pbGFyIHByb3BlcnRpZXMgdG8gVU1BUCwgYW5kIG9mdGVuIHByb2R1Y2VzIHNpbWlsYXIgcmVzdWx0cy4KVGhlcmUgaXMgc29tZSBvbmdvaW5nIGRlYmF0ZSBhYm91dCB3aGljaCBvZiB0aGVzZSB0d28gdGVjaG5pcXVlcyBpcyBzdXBlcmlvciwgYW5kIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2VzIGFyZSBkdWUgdG8gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIG9yIHRvIGltcGxlbWVudGF0aW9uIGFuZCBwYXJhbWV0ZXIgaW5pdGlhbGl6YXRpb24gZGVmYXVsdHMuClJlZ2FyZGxlc3Mgb2Ygd2h5LCBpbiBvdXIgZXhwZXJpZW5jZSwgVU1BUCBzZWVtcyB0byBwcm9kdWNlIHNsaWdodGx5IGJldHRlciByZXN1bHRzIGFuZCBydW4gYSBiaXQgZmFzdGVyLCBidXQgdGhlIGRpZmZlcmVuY2VzIGNhbiBiZSBzdWJ0bGUuCgojIyMjIERlZmF1bHQgcGFyYW1ldGVycwoKRm9yIGVhc2Ugb2YgdXNlIHdpdGggdGhpcyBkYXRhLCB3ZSB3aWxsIGJlIHVzaW5nIHRoZSBgc2NhdGVyOjpjYWxjdWxhdGVVTUFQKClgIGFuZCBgc2NhdGVyOjpydW5VTUFQKClgIGZ1bmN0aW9uIHRvIGFwcGx5IFVNQVAgdG8gb3VyIHNpbmdsZSBjZWxsIGRhdGEsIGJ1dCBzaW1pbGFyIGZ1bmN0aW9ucyB0aGUgYHV3b3RgIHBhY2thZ2UgKG5vdGFibHkgYHV3b3Q6OnVtYXAoKWApIGNhbiBiZSB1c2VkIHRvIGFwcGx5IFVNQVAgdG8gYW55IG51bWVyaWNhbCBtYXRyaXguCgpVTUFQIGNhbiBiZSBzbG93IGZvciBhIGxhcmdlIGRhdGEgc2V0IHdpdGggbG90cyBvZiBwYXJhbWV0ZXJzLgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgYHNjYXRlcjo6Y2FsY3VsYXRlVU1BUCgpYCBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBkb2VzIFBDQSBmaXJzdCwgYW5kIHRoZW4gcnVucyBVTUFQIG9uIHRoZSB0b3AgNTAgUENzLgpJZiB3ZSBoYXZlIGFscmVhZHkgY2FsY3VsYXRlZCBQQ0EgKGFzIHdlIGhhdmUpIHdlIGNhbiB0ZWxsIGl0IHRvIHVzZSB0aG9zZSByZXN1bHRzIHdpdGggdGhlIGBkaW1yZWRgIGFyZ3VtZW50LgoKQXMgd2l0aCBQQ0EsIHRoZXJlIGFyZSB0d28gZnVuY3Rpb25zIHdlIGNvdWxkIHVzZToKYHNjYXRlcjo6Y2FsY3VsYXRlVU1BUCgpYCB3aWxsIHJldHVybiBhIG1hdHJpeCBvZiByZXN1bHRzLCB3aXRoIG9uZSByb3cgZm9yIGVhY2ggc2FtcGxlLCBhbmQgYSBjb2x1bW4gZm9yIGVhY2ggb2YgdGhlIFVNQVAgZGltZW5zaW9ucyByZXR1cm5lZC4KYHNjYXRlcjo6cnVuVU1BUCgpYCBwZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiwgYnV0IHJldHVybnMgdGhlIHJlc3VsdHMgaW4gYSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmplY3QuCgpMZXQncyBzZWUgaG93IGl0IGxvb2tzIHdpdGggdGhlIChtb3N0bHkpIGRlZmF1bHQgcGFyYW1ldGVyczoKCmBgYHtyIGNhbGN1bGF0ZV91bWFwLCBsaXZlID0gVFJVRX0KIyBSdW4gVU1BUApub3JtYWxpemVkX3NjZSA8LSBydW5VTUFQKG5vcm1hbGl6ZWRfc2NlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXJlZCA9ICJQQ0EiKSAjIHVzZSBhbHJlYWR5IHN0b3JlZCBQQ0EgcmVzdWx0cwpgYGAKCk5vdyB3ZSBjYW4gcGxvdCB3aXRoIHRoZSBzYW1lIGBwbG90UmVkdWNlZERpbSgpYCBmdW5jdGlvbiwgc3BlY2lmeWluZyB3ZSB3YW50IHRvIHBsb3QgdGhlIFVNQVAgcmVzdWx0cyB0aGlzIHRpbWUuCldlIHdpbGwgYWxzbyBhZGQgc29tZSBjb2xvciB0aGlzIHRpbWUgd2l0aCB0aGUgYGNvbG9yX2J5YCBhcmd1bWVudCwgdXNpbmcgdGhlIG51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBpbiBlYWNoIGNlbGwgdG8gYXNzaWduIGEgaHVlLgoKYGBge3IgcGxvdF91bWFwLCBsaXZlID0gVFJVRX0KIyBtYWtlIGEgVU1BUCBwbG90IHdpdGggYHBsb3RSZWR1Y2VkRGltKClgCnBsb3RSZWR1Y2VkRGltKG5vcm1hbGl6ZWRfc2NlLCAiVU1BUCIsIGNvbG9yX2J5ID0gImRldGVjdGVkIikKYGBgCgpUaGVyZSBpcyBjbGVhcmx5IGEgbG90IG9mIHN0cnVjdHVyZSBpbiB0aGVyZSwgYnV0IGlzIGl0IG1lYW5pbmdmdWw/CkRvIHRoZSBjbHVzdGVycyB3ZSBzZWUgZGlmZmVyZW50aWF0ZSBjZWxsIHR5cGVzPyBIb3cgc2hvdWxkIHdlIGRpdmlkZSB0aGVtIHVwPwoKV2Ugd2lsbCBjb21lIGJhY2sgdG8gdGhpcyBxdWVzdGlvbiBsYXRlciEKCiMjIyBVTUFQIGV4cGVyaW1lbnRzCgpOb3cgdGhhdCB3ZSBoYXZlIGFuIGlkZWEgb2Ygd2hhdCBhIFVNQVAgcGxvdCB3aXRoIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgbG9va3MgbGlrZSwgbGV0J3MgdHJ5IGV4cGVyaW1lbnRpbmcgd2l0aCB0aGUgYG5fbmVpZ2hib3JzYCBwYXJhbWV0ZXIuCkZpcnN0LCB3ZSBzaG91bGQgc2VlIHdoYXQgdGhpcyBwYXJhbWV0ZXIgaXMsIGFuZCB3aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGlzLgpJbiB0aGUgY29uc29sZSwgcnVuIGA/c2NhdGVyOjpjYWxjdWxhdGVVTUFQYCB0byBzZWUgd2hhdCB0aGlzIChhbmQgb3RoZXIgcGFyYW1ldGVycykgYXJlLgpGb3IgZXZlbiBtb3JlIHBhcmFtZXRlcnMsIHlvdSBjYW4gbG9vayBhdCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBjb2RlIHRoYXQgYGNhbGN1bGF0ZVVNQVAoKWAgdXNlcywgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uIGB1d290Ojp1bWFwKClgCgpJbiBvcmRlciB0byBtYWtlIG91ciBleHBlcmltZW50YXRpb24gZWFzaWVyLCB3ZSB3aWxsIGNyZWF0ZSBhICpmdW5jdGlvbiogdGhhdCBhbGxvd3MgdXMgdG8gcmVydW4gdGhlIHNhbWUgY29kZSBlYXNpbHksIGJ1dCBjcmVhdGUgYW4gYXJndW1lbnQgdGhhdCBhbGxvd3MgdXMgdG8gY2hhbmdlIG9uZSB2YXJpYWJsZTogdGhlIGBuX25laWdoYm9yc2AgdmFyaWFibGUuCkhlcmUgd2UgYXJlIHNhdmluZyBvbmx5IGEgbGluZSBvZiBjb2RlLCBidXQgd2UgY291bGQgYXBwbHkgdGhpcyB0byBhIG11Y2ggbW9yZSBjb21wbGV4IHNlcmllcyBvZiBvcGVyYXRpb25zIGlmIHdlIHdhbnRlZCB0byEKCmBgYHtyIFVNQVAtZnVuY3Rpb259ClVNQVBfcGxvdF93cmFwcGVyIDwtIGZ1bmN0aW9uKHNjZSA9IG5vcm1hbGl6ZWRfc2NlLCBubl9wYXJhbSA9IDE1KSB7CiAgIyBQdXJwb3NlOiBSdW4gVU1BUCBhbmQgcGxvdCB0aGUgb3V0cHV0CiAgIyBBcmdzOiBubl9wYXJhbTogYSBzaW5nbGUgbnVtZXJpYyBhcmd1bWVudCB0aGF0IHdpbGwgY2hhbmdlIHRoZQogICMgICAgICAgICAgICAgICAgIG5fbmVpZ2hib3JzIHZhcmlhYmxlIGluIHRoZSBjYWxjdWxhdGVVTUFQKCkgZnVuY3Rpb24uCiAgIyBPdXRwdXQ6IGEgc2NhdHRlcnBsb3Qgd2l0aCB0aGUgdHdvIFVNQVAgY29vcmRpbmF0ZXMgcGxvdHRlZCBhbmQKICAjICAgICAgICAgY2VsbC10eXBlcyBsYWJlbGVkIHdpdGggZGF0YSBwb2ludCBjb2xvcnMuCgogICMgUnVuIFVNQVAgd2l0aCBhIHNwZWNpZmllZCBuX25laWdoYm9ycyBwYXJhbWV0ZXIKICBzY2VfdW1hcCA8LSBzY2F0ZXI6OnJ1blVNQVAoc2NlLCBkaW1yZWQgPSAiUENBIiwgbl9uZWlnaGJvcnMgPSBubl9wYXJhbSkKICBzY2F0ZXI6OnBsb3RSZWR1Y2VkRGltKHNjZV91bWFwLCAiVU1BUCIsIGNvbG9yX2J5ID0gImRldGVjdGVkIikgKwogICAgIyBtYWtlIHRoZSBsZWdlbmQgbGFiZWwgbW9yZSBpbmZvcm1hdGl2ZSAodGhpcyBpcyBnZ3Bsb3QyIGNvZGUhKQogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfY29sb3JiYXIodGl0bGU9ImdlbmVzXG5leHByZXNzZWQiKSkKfQpgYGAKCkxldCdzIG1ha2Ugc3VyZSB0aGF0IHdvcmtzIGFuZCBnaXZlcyB0aGUgc2FtZSByZXN1bHQgYXMgYmVmb3JlIHdoZW4gd2UgdXNlIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCgpgYGB7ciBmdW5jdGlvbi10ZXN0fQpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDE1KQpgYGAKCipLaW5kIG9mPyoKClRoaXMgaXNuJ3QgeW91ciBmYXVsdCEKVU1BUCBpcyBhIG5vbi1kZXRlcm1pbmlzdGljIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmFuZG9tIGNvbXBvbmVudCB0byB0aGUgcmVzdWx0cy4KV2UgY2FuIHVzZSBgc2V0LnNlZWQoKWAgdG8gYmUgc3VyZSB0aGF0IGFuIGluZGl2aWR1YWwgcnVuIChvciBzZXQgb2YgcnVucykgaXMgdGhlIHNhbWUgZXZlcnkgdGltZSB5b3UgcnVuIHlvdXIgYW5hbHlzaXMsIGJ1dCBpdCBpcyBpbXBvcnRhbnQgdG8gY2hlY2sgeW91ciByZXN1bHRzIGEgZmV3IHRpbWVzIHdpdGggZGlmZmVyZW50IHJhbmRvbSBzdGFydGluZyBwb2ludHMgdG8gYmUgc3VyZSB0aGF0IHRoZSByYW5kb20gY29tcG9uZW50IGlzIG5vdCBnaXZpbmcgeW91IGFub21hbG91cyByZXN1bHRzLgpTZXR0aW5nIGEgZGlmZmVyZW50IHJhbmRvbSBudW1iZXIgc2VlZCB3aXRoIGBzZXQuc2VlZCgpYCBpcyBvbmUgd2F5IHRvIGRvIHRoaXMsIG9yIHlvdSBjYW4gcnVuIHRoZSBhbmFseXNpcyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzZXNzaW9uLCBhcyB3ZSBoYXZlIGRvbmUgaGVyZS4KCkZpbGwgaW4gdGhlIG5leHQgZmV3IGNvZGUgY2h1bmtzIHdpdGggdGhlIGZ1bmN0aW9uIGFuZCB0aGUgYG5fbmVpZ2hib3JzYCBhcmd1bWVudCB5b3Ugd291bGQgbGlrZSB0byB1c2UgZm9yIGVhY2guCihGZWVsIGZyZWUgdG8gYWRkIG1vcmUgdGVzdHMhKQpUaGVuIHJ1biB0aGUgY2h1bmtzIGFuZCBjb21wYXJlIHlvdXIgb3V0cHV0IGdyYXBocy4KCmBgYHtyIHJ1bi1VTUFQLTEsIGxpdmUgPSBUUlVFfQojIFRyeSBzb21ldGhpbmcgbG93PwpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDMpCmBgYAoKYGBge3IgcnVuLVVNQVAtMiwgbGl2ZSA9IFRSVUV9CiMgVHJ5IHNvbWV0aGluZyBoaWdoPwpVTUFQX3Bsb3Rfd3JhcHBlcihubl9wYXJhbSA9IDEwMCkKYGBgCgpgYGB7ciBydW4tVU1BUC0zLCBsaXZlID0gVFJVRX0KIyBUcnkgd2hhdGV2ZXIgeW91IGxpa2UhClVNQVBfcGxvdF93cmFwcGVyKG5uX3BhcmFtID0gNSkKYGBgCgojIyMjIFNvbWUgJ2JpZyBwaWN0dXJlJyB0aG91Z2h0cyB0byB0YWtlIGZyb20gdGhpcyBleHBlcmltZW50OgoKMS4gQW5hbHlzZXMgc3VjaCBhcyBVTUFQIGhhdmUgdmFyaW91cyBsaW1pdGF0aW9ucyBmb3IgaW50ZXJwcmV0YWJpbGl0eS4KVGhlIGNvb3JkaW5hdGVzIG9mIFVNQVAgb3V0cHV0IGZvciBhbnkgZ2l2ZW4gY2VsbCBjYW4gY2hhbmdlIGRyYW1hdGljYWxseSBkZXBlbmRpbmcgb24gcGFyYW1ldGVycywgYW5kIGV2ZW4gcnVuIHRvIHJ1biB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuClRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB5b3Ugc2hvdWxkbid0IHJlbHkgb24gdGhlIGV4YWN0IHZhbHVlcyBvZiBVTUFQJ3Mgb3V0cHV0LgoKICAgIC0gT25lIHBhcnRpY3VsYXIgbGltaXRhdGlvbiBvZiBVTUFQIChhbmQgdC1TTkUpIGlzIHRoYXQgd2hpbGUgb2JzZXJ2ZWQgY2x1c3RlcnMgaGF2ZSBzb21lIG1lYW5pbmcsIHRoZSBkaXN0YW5jZSAqYmV0d2VlbiogY2x1c3RlcnMgdXN1YWxseSBkb2VzIG5vdCAobm9yIGRvZXMgY2x1c3RlciBkZW5zaXR5KS4KICAgIFRoZSBmYWN0IHRoYXQgdHdvIGNsdXN0ZXJzIGFyZSBuZWFyIGVhY2ggb3RoZXIgc2hvdWxkIE5PVCBiZSBpbnRlcnByZXRlZCB0byBtZWFuIHRoYXQgdGhleSBhcmUgbW9yZSByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdGhhbiB0byBtb3JlIGRpc3RhbnQgY2x1c3RlcnMuCiAgICAoVGhlcmUgaXMgc29tZSBkaXNhZ3JlZW1lbnQgYWJvdXQgd2hldGhlciBVTUFQIGRpc3RhbmNlcyBoYXZlIG1vcmUgbWVhbmluZywgYnV0IGl0IGlzIHByb2JhYmx5IHNhZmVyIHRvIGFzc3VtZSB0aGV5IGRvbid0LikKCgoyLiBQbGF5aW5nIHdpdGggcGFyYW1ldGVycyBzbyB5b3UgY2FuIGZpbmUtdHVuZSB0aGVtIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3UgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgYW5hbHlzaXMgYXMgd2VsbCBhcyB0aGUgZGF0YSBpdHNlbGYuCgozLiBXaGVyZSByZXN1bHRzIGFyZSBjb25zaXN0ZW50LCB0aGV5IGFyZSBtb3JlIGxpa2VseSB0byBoYXZlIG1lYW5pbmcuCldoaWxlIHdlIGRvIG5vdCBoYXZlIGxhYmVsZWQgY2VsbCB0eXBlcyBpbiB0aGlzIGNhc2UsIHRoZXJlIGRvZXMgc2VlbSB0byBiZSBzb21lIGNvbnNpc3RlbmN5IG9mIHRoZSBvdmVyYWxsIHBhdHRlcm5zIHRoYXQgd2Ugc2VlIChpZiBub3QgcHJlY2lzZSB2YWx1ZXMpLCBhbmQgdGhpcyBsaWtlbHkgcmVmbGVjdHMgYmlvbG9naWNhbCBpbmZvcm1hdGlvbiAob3IgdGVjaG5pY2FsIGFydGlmYWN0cykuCgpJbiBzdW1tYXJ5LCBpZiB0aGUgcmVzdWx0cyBvZiBhbiBhbmFseXNpcyBjYW4gYmUgY29tcGxldGVseSBjaGFuZ2VkIGJ5IGNoYW5naW5nIGl0cyBwYXJhbWV0ZXJzLCB5b3Ugc2hvdWxkIGJlIG1vcmUgY2F1dGlvdXMgd2hlbiBpdCBjb21lcyB0byB0aGUgY29uY2x1c2lvbnMgeW91IGRyYXcgZnJvbSBpdCBhcyB3ZWxsIGFzIGhhdmluZyBnb29kIHJhdGlvbmFsZSBmb3IgdGhlIHBhcmFtZXRlcnMgeW91IGNob29zZS4KCiMjIyB0LVNORSBjb21wYXJpc29uCgpJbiB0aGUgYmxvY2sgYmVsb3cgaXMgYSBzaW1pbGFyIGFuYWx5c2lzIGFuZCBwbG90IHdpdGggdC1TTkUgKHQtZGlzdHJpYnV0ZWQgU3RvY2hhc3RpYyBOZWlnaGJvciBFbWJlZGRpbmcpLgpOb3RlIHRoYXQgdGhpcyBhbmFseXNpcyBhbHNvIHVzZXMgUENBIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIGZhbmN5IG1hY2hpbmUgbGVhcm5pbmcuCgpgYGB7ciB0c25lLCBsaXZlID0gVFJVRX0KIyBSdW4gVFNORQpub3JtYWxpemVkX3NjZSA8LSBydW5UU05FKG5vcm1hbGl6ZWRfc2NlLCBkaW1yZWQgPSAiUENBIikKCiMgcGxvdCB3aXRoIHNjYXRlciBmdW5jdGlvbgpwbG90UmVkdWNlZERpbShub3JtYWxpemVkX3NjZSwgIlRTTkUiLCBjb2xvcl9ieSA9ICJkZXRlY3RlZCIpCmBgYAoKRGlmZmVyZW50ISAoU2xvd2VyISkgSXMgaXQgYmV0dGVyIG9yIHdvcnNlPyBIYXJkIHRvIHNheSEKRGlmZmVyZW50IHBlb3BsZSBsaWtlIGRpZmZlcmVudCB0aGluZ3MsIGFuZCBvbmUgcGxvdCBtaWdodCBpbGx1c3RyYXRlIGEgcGFydGljdWxhciBwb2ludCBiZXR0ZXIgdGhhbiBhbm90aGVyLgoKIyMgU2F2ZSByZXN1bHRzCgpXZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgZGF0YSBtb3JlIGluIHRoZSBuZXh0IG5vdGVib29rLCBzbyBsZXQncyBzYXZlIGl0IGFzIGFuIGBSRFNgIGZpbGUuCgpgYGB7ciBzYXZlfQpyZWFkcjo6d3JpdGVfcmRzKG5vcm1hbGl6ZWRfc2NlLCBmaWxlID0gb3V0cHV0X3NjZV9maWxlKQpgYGAKCgojIyMgU29tZSBmdXJ0aGVyIHJlYWRpbmcgb24gZGltZW5zaW9uIHJlZHVjdGlvbjoKCi0gVGhpcyB3ZWJzaXRlIGV4cGxhaW5zIFtQQ0EgdmlzdWFsbHldKGh0dHA6Ly9zZXRvc2EuaW8vZXYvcHJpbmNpcGFsLWNvbXBvbmVudC1hbmFseXNpcy8pLgotIFtCZWNodCAqZXQgYWwuKiAoMjAxOCldKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvbmJ0LjQzMTQpIGRpc2N1c3NlcyB1c2luZyBbVU1BUF0oaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXApIGZvciBzaW5nbGUtY2VsbCBkYXRhLgotIFtXYXR0ZW5iZXJnICpldCBhbC4qICgyMDE2KV0oaHR0cHM6Ly9kaXN0aWxsLnB1Yi8yMDE2L21pc3JlYWQtdHNuZS8pIGRpc2N1c3MgaG93IHRvIHVzZSB0LVNORSBwcm9wZXJseSB3aXRoIGdyZWF0IHZpc3VhbHMuCihUaGUgbGVzc29ucyBhcHBseSB0byBVTUFQIGFzIHdlbGwsIHdpdGggYSBicm9hZCBzdWJzdGl0dXRpb24gb2YgdGhlIGBuX25laWdoYm9yc2AgcGFyYW1ldGVyIGZvciBgcGVycGxleGl0eWAuKQotIFtOZ3V5ZW4gJiBIb2xtZXMgKDIwMTkpXShodHRwczovL2pvdXJuYWxzLnBsb3Mub3JnL3Bsb3Njb21wYmlvbC9hcnRpY2xlP2lkPTEwLjEzNzEvam91cm5hbC5wY2JpLjEwMDY5MDcpIGxheSBvdXQgZ3VpZGVsaW5lcyBvbiBjaG9vc2luZyBkaW1lbnNpb25zIHJlZHVjdGlvbiBtZXRob2RzLgotIFtGcmVpdGFnICgyMDE5KV0oaHR0cHM6Ly9ycHVicy5jb20vU2Fza2lhLzUyMDIxNikgaXMgYSBuaWNlIGV4cGxhbmF0aW9uIGFuZCBjb21wYXJpc29uIG9mIG1hbnkgZGlmZmVyZW50IGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiB0ZWNobmlxdWVzIHRoYXQgeW91IG1heSBlbmNvdW50ZXIuCgoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7ciBzZXNzaW9ufQpzZXNzaW9uSW5mbygpCmBgYAo=</div> </div>