From f587a63ba268841ef3998f8cfbe6705d21fd5f94 Mon Sep 17 00:00:00 2001
From: shitohana <43905117+shitohana@users.noreply.github.com>
Date: Fri, 29 Dec 2023 15:32:47 +0300
Subject: [PATCH] Plotly (#8)
* Clusters added into master (#6)
* flank regions fix
* new labels
* draw to cluster
* __init__.py Clustering added
BismarkPlot.py Clustering done and confidence bands
console_metagene.py confidence bands added
index.rst new classes and methods added in documentation
* documentation fix
* documentation fix
* v1.2.2 release
* v1.2.2 release
* v1.2.3 release
* v1.2.3 release
* v1.3
* console_chrs.py fixed path
BismarkPlot.py Genome.__trim_genes take flank length anyway
LinePlot added all contexts support
* console_metagene.py empty genome check
* BismarkPlot.py cpu check
console_metagene.py and console_chrs.py file_format fix
* v1.3.0a
* BismarkPlot.py fix cpu_count
console fix dpi, plot types
* v1.3.0a1
* v1.3.0b0
* v1.3.1
* Update README.md
* Update README.md
* Update README.md
* add_flank_lines for heatmap into method
added Modules class
fix for neat_TSS intersection mode
added genes IDs into genome
* v1.3.2a
* v1.3.2pr
* v1.3.2rc0
* v1.3.2
* 1. main file split into parts
2. added different summary stats
3. started adding plotly
* 1. main file split into parts
2. added different summary stats
* custom labels
* plotly wip
* added seq_reader
* - major cleanup
- Moved to ArrowReaders.py
- Added PlotBase to Base.py
- Added more constructors to Metagene
- Added schema check for Metagene
* some fixes... more are coming 4 sure
* P_CG
and A LOT of documentation
* first merge to main
---
.github/workflows/publish.yaml | 16 +-
README.md | 200 ++-
docs/_binom.rst | 14 +
docs/_genome.rst | 41 +
docs/_metagene.rst | 14 +
docs/_plots.rst | 16 +
docs/_templates/autosummary/module.rst | 6 -
docs/_templates/class.rst | 25 +
docs/_templates/class_native.rst | 29 +
docs/_templates/method.rst | 4 +
docs/_templates/module.rst | 6 -
docs/conf.py | 24 +-
docs/images/boxplot/bp_ara_bradi_mpl.png | Bin 0 -> 11787 bytes
docs/images/boxplot/bp_ara_bradi_plotly.png | Bin 0 -> 24117 bytes
.../boxplot/bp_ara_bradi_plotly_nofilter.png | Bin 0 -> 26682 bytes
docs/images/boxplot/vp_ara_bradi_mpl.png | Bin 0 -> 18045 bytes
docs/images/boxplot/vp_ara_bradi_plotly.png | Bin 0 -> 33241 bytes
docs/images/heatmap/ara_bradi_mpl.png | Bin 0 -> 91972 bytes
docs/images/heatmap/ara_bradi_plotly.png | Bin 0 -> 100364 bytes
docs/images/heatmap/ara_mpl.png | Bin 0 -> 67312 bytes
docs/images/heatmap/ara_plotly.png | Bin 0 -> 119433 bytes
docs/images/lineplot/ara_NO_major_labels.png | Bin 0 -> 30140 bytes
docs/images/lineplot/ara_NO_minor_labels.png | Bin 0 -> 28073 bytes
docs/images/lineplot/ara_bradi_mpl.png | Bin 0 -> 41185 bytes
docs/images/lineplot/ara_bradi_plotly.png | Bin 0 -> 42775 bytes
docs/images/lineplot/ara_custom_label.png | Bin 0 -> 33508 bytes
docs/images/lineplot/ara_major_labels.png | Bin 0 -> 28482 bytes
docs/images/lineplot/ara_minor_labels.png | Bin 0 -> 30783 bytes
docs/images/lineplot/ara_multi_mpl.png | Bin 0 -> 41010 bytes
docs/images/lineplot/ara_multi_plotly.png | Bin 0 -> 82950 bytes
docs/images/lineplot/lp_ara_mpl.png | Bin 0 -> 33858 bytes
docs/index.rst | 22 +-
docs/markdowns/test.md | 128 ++
docs/requirements.txt | 2 +
pyproject.toml | 20 +-
src/bismarkplot/ArrowReaders.py | 122 ++
src/bismarkplot/Base.py | 226 +++
src/bismarkplot/Binom.py | 538 ++++++
src/bismarkplot/BismarkPlot.py | 1499 -----------------
src/bismarkplot/ChrLevels.py | 300 ++++
src/bismarkplot/Clusters.py | 294 ++++
src/bismarkplot/GenomeClass.py | 567 +++++++
src/bismarkplot/MetageneClasses.py | 1466 ++++++++++++++++
src/bismarkplot/Plots.py | 692 ++++++++
src/bismarkplot/SeqMapper.py | 460 +++++
src/bismarkplot/__init__.py | 8 +-
src/bismarkplot/console_chrs.py | 26 +-
src/bismarkplot/console_metagene.py | 78 +-
src/bismarkplot/utils.py | 110 ++
49 files changed, 5306 insertions(+), 1647 deletions(-)
create mode 100644 docs/_binom.rst
create mode 100644 docs/_genome.rst
create mode 100644 docs/_metagene.rst
create mode 100644 docs/_plots.rst
delete mode 100644 docs/_templates/autosummary/module.rst
create mode 100644 docs/_templates/class.rst
create mode 100644 docs/_templates/class_native.rst
create mode 100644 docs/_templates/method.rst
delete mode 100644 docs/_templates/module.rst
create mode 100644 docs/images/boxplot/bp_ara_bradi_mpl.png
create mode 100644 docs/images/boxplot/bp_ara_bradi_plotly.png
create mode 100644 docs/images/boxplot/bp_ara_bradi_plotly_nofilter.png
create mode 100644 docs/images/boxplot/vp_ara_bradi_mpl.png
create mode 100644 docs/images/boxplot/vp_ara_bradi_plotly.png
create mode 100644 docs/images/heatmap/ara_bradi_mpl.png
create mode 100644 docs/images/heatmap/ara_bradi_plotly.png
create mode 100644 docs/images/heatmap/ara_mpl.png
create mode 100644 docs/images/heatmap/ara_plotly.png
create mode 100644 docs/images/lineplot/ara_NO_major_labels.png
create mode 100644 docs/images/lineplot/ara_NO_minor_labels.png
create mode 100644 docs/images/lineplot/ara_bradi_mpl.png
create mode 100644 docs/images/lineplot/ara_bradi_plotly.png
create mode 100644 docs/images/lineplot/ara_custom_label.png
create mode 100644 docs/images/lineplot/ara_major_labels.png
create mode 100644 docs/images/lineplot/ara_minor_labels.png
create mode 100644 docs/images/lineplot/ara_multi_mpl.png
create mode 100644 docs/images/lineplot/ara_multi_plotly.png
create mode 100644 docs/images/lineplot/lp_ara_mpl.png
create mode 100644 docs/markdowns/test.md
create mode 100644 src/bismarkplot/ArrowReaders.py
create mode 100644 src/bismarkplot/Base.py
create mode 100644 src/bismarkplot/Binom.py
delete mode 100644 src/bismarkplot/BismarkPlot.py
create mode 100644 src/bismarkplot/ChrLevels.py
create mode 100644 src/bismarkplot/Clusters.py
create mode 100644 src/bismarkplot/GenomeClass.py
create mode 100644 src/bismarkplot/MetageneClasses.py
create mode 100644 src/bismarkplot/Plots.py
create mode 100644 src/bismarkplot/SeqMapper.py
create mode 100644 src/bismarkplot/utils.py
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index e1f1d36..ce89bc4 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -1,8 +1,6 @@
name: Publish to PyPI and TestPyPI
-on:
- push:
- branches: [master] # branch to trigger deployment
+on: push
jobs:
build-n-publish:
@@ -24,12 +22,12 @@ jobs:
run: >-
python -m
build
- - name: Publish distribution 📦 to Test PyPI
- if: startsWith(github.ref, 'refs/tags')
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
- password: ${{ secrets.TEST_PYPI_API_TOKEN }}
- repository-url: https://test.pypi.org/legacy/
+# - name: Publish distribution 📦 to Test PyPI
+# if: startsWith(github.ref, 'refs/tags')
+# uses: pypa/gh-action-pypi-publish@release/v1
+# with:
+# password: ${{ secrets.TEST_PYPI_API_TOKEN }}
+# repository-url: https://test.pypi.org/legacy/
- name: Publish distribution 📦 to PyPI
if: startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@release/v1
diff --git a/README.md b/README.md
index 9bac9db..aa19e8d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
# BismarkPlot
-Comprehensive tool for visualizing genome-wide cytosine data.
+
+Analytical framework for BS-seq data comparison and visualization.
See the docs: https://shitohana.github.io/BismarkPlot
@@ -15,15 +16,14 @@ pip install bismarkplot
You can use ```bismarkplot``` either as python library or directly from console after installing it.
Console options:
-- *bismarkplot-metagene* - methylation density visualizing tool.
-- *bismarkplot-chrs* - chromosome methylation levels visualizing tool.
+- `bismarkplot-metagene` - methylation density visualizing tool.
+- `bismarkplot-chrs` - chromosome methylation levels visualizing tool.
### bismarkplot-metagene
```commandline
-usage: BismarkPlot. [-h] [-o OUT] [-g GENOME] [-r {gene,exon,tss,tes}] [-b BATCH] [-c CORES] [-f FLENGTH] [-u UWINDOWS] [-d DWINDOWS] [-m MLENGTH]
- [-w GWINDOWS] [--line] [--heatmap] [--box] [--violin] [-S SMOOTH] [-L LABELS [LABELS ...]] [-C CONFIDENCE] [-H H] [-V V] [--dpi DPI]
- [-F {png,pdf,svg}]
+usage: BismarkPlot. [-h] [-o NAME] [--dir DIR] [-g GENOME] [-r {gene,exon,tss,tes}] [-b BATCH] [-c CORES] [-f FLENGTH] [-u UWINDOWS] [-d DWINDOWS] [-m MLENGTH] [-w GWINDOWS] [--line] [--heatmap]
+ [--box] [--violin] [-S SMOOTH] [-L LABELS [LABELS ...]] [-C CONFIDENCE] [-H VRESOLUTION] [-V HRESOLUTION] [--dpi DPI] [-F {png,pdf,svg}]
filename [filename ...]
Metagene visualizing tool.
@@ -33,7 +33,8 @@ positional arguments:
optional arguments:
-h, --help show this help message and exit
- -o OUT, --out OUT output base name (default: /Users/shitohana/Desktop/PycharmProjects/BismarkPlot)
+ -o NAME, --out NAME output base name (default: plot)
+ --dir DIR output dir (default: /Users/shitohana/PycharmProjects/BismarkPlot_test)
-g GENOME, --genome GENOME
path to GFF genome file (default: None)
-r {gene,exon,tss,tes}, --region {gene,exon,tss,tes}
@@ -62,8 +63,8 @@ optional arguments:
labels for plots (default: None)
-C CONFIDENCE, --confidence CONFIDENCE
probability for confidence bands for line-plot. 0 if disabled (default: 0)
- -H H vertical resolution for heat-map (default: 100)
- -V V vertical resolution for heat-map (default: 100)
+ -H VRESOLUTION vertical resolution for heat-map (default: 100)
+ -V HRESOLUTION vertical resolution for heat-map (default: 100)
--dpi DPI dpi of output plot (default: 200)
-F {png,pdf,svg}, --format {png,pdf,svg}
format of output plots (default: pdf)
@@ -80,25 +81,27 @@ bismarkplot-metagene -g path/to/genome.gff -r gene -f 2000 -m 4000 -u 500 -d 50
### bismarkplot-chrs
```commandline
-usage: BismarkPlot [-h] [-o DIR] [-b N] [-c CORES] [-w N] [-m N] [-S FLOAT] [-F {png,pdf,svg}] path/to/txt [path/to/txt ...]
+usage: BismarkPlot [-h] [-o NAME] [-d DIR] [-b N] [-c CORES] [-w N] [-m N] [-S FLOAT] [-F {png,pdf,svg}] [--dpi DPI] path/to/txt
Chromosome methylation levels visualization.
positional arguments:
path/to/txt path to bismark methylation_extractor file
-options:
+optional arguments:
-h, --help show this help message and exit
- -o DIR, --out DIR output base name (default: current/path)
+ -o NAME, --out NAME output base name (default: plot)
+ -d DIR, --dir DIR output dir (default: /Users/shitohana/PycharmProjects/BismarkPlot_test)
-b N, --batch N number of rows to be read from bismark file by batch (default: 1000000)
-c CORES, --cores CORES
number of cores to use (default: None)
- -w N, --wlength N number of windows for genes (default: 100000)
+ -w N, --wlength N number of windows for chromosome (default: 100000)
-m N, --mlength N minimum chromosome length (default: 1000000)
-S FLOAT, --smooth FLOAT
windows for smoothing (0 - no smoothing, 1 - straight line (default: 50)
- -F {png,pdf,svg}, --format {png,pdf,svg}
+ -F {png,pdf,svg}, --fmt {png,pdf,svg}
format of output plots (default: pdf)
+ --dpi DPI dpi of output plot (default: 200)
```
Example:
@@ -120,36 +123,110 @@ Below we will show the basic BismarkPlot workflow.
### Single sample
```python
+import src.bismarkplot.Genome
import bismarkplot
+
# Firstly, we need to read the regions annotation (e.g. reference genome .gff)
-genome = bismarkplot.Genome.from_gff("path/to/genome.gff")
+genome = src.bismarkplot.genome.Genome.from_gff("path/to/genome.gff")
# Next we need to filter regions of interest from the genome
genes = genome.gene_body(min_length=4000, flank_length=2000)
# Now we need to calculate metagene data
-metagene = bismarkplot.Metagene.from_file(
- file = "path/to/CX_report.txt",
- genome=genes, # filtered regions
- upstream_windows = 500,
- gene_windows = 1000,
- downstream_windows = 500,
- batch_size= 10**7 # number of lines to be read simultaneously
+metagene = bismarkplot.Metagene.from_bismark(
+ file="path/to/CX_report.txt",
+ genome=genes, # filtered regions
+ up_windows=500,
+ body_windows=1000,
+ down_windows=500,
+ batch_size=10 ** 7 # number of lines to be read simultaneously
)
# Our metagene contains all methylation contexts and both strands, so we need to filter it (as in dplyr)
-filtered = metagene.filter(context = "CG", strand = "+")
+filtered = metagene.filter(context="CG", strand="+")
# We are ready to plot
-lp = filtered.line_plot() # line plot data
-lp.draw().savefig("path/to/lp.pdf") # matplotlib.Figure
+lp = filtered.line_plot() # line plot data
+lp.draw_mpl().savefig("path/to/lp.pdf") # matplotlib.Figure
hm = filtered.heat_map(ncol=200, nrow=200)
-hm.draw().savefig("path/to/hm.pdf") # matplotlib.Figure
+hm.draw_mpl().savefig("path/to/hm.pdf") # matplotlib.Figure
```
-Output:
+Output for _Brachypodium distachyon_:
-
-
+
+
+
+
+If metagene is not filtered by context, **all available contexts will be plotted**:
+
+```python
+filtered_by_strand = metagene.filter(strand == "+")
+lp = filtered_by_strand.line_plot()
+lp.draw_mpl()
+```
+
+Output for _Brachypodium distachyon_:
+
+
+
+
+
+**Confidence bands** can be visualized via setting the `confidence` parameter in `LinePlot.draw()`
+
+```python
+lp.draw_mpl(confidence=.95)
+```
+
+Output for _Brachypodium distachyon_:
+
+
+
+
+
+### Heat-map clusterisation
+
+Genes can be clustered to minimize distances between them before plotting heat-map. This can be useful for capturing
+overall methylation patterns in sample. _This operation is very time consuming. It is advised to set small number of
+windows (< 50)_.
+
+```python
+metagene = bismarkplot.Metagene.from_bismark(
+ file="path/to/CX_report.txt",
+ genome=genes, # filtered regions
+ up_windows=5, body_windows=10, down_windows=5,
+)
+clustered = metagene.clustering(
+ count_threshold=5, # Minimum counts per window
+ dist_method="euclidean", # See scipy.spatial.distance.pdist
+ clust_method="average" # See scipy.cluster.hierarchy.linkage
+)
+
+# Heatmap with optimized distances between genes will be drawn
+clustered.draw_mpl().savefig("path/to/clustered_hm.pdf")
+```
+Output for _Brachypodium distachyon_ - CHG
+
+
+
+
+
+### Genes dynamicTreeCut
+
+To shrink clustered heat-map and capture main patterns genes can be split into modules using
+[dynamicTreeCut algorithm](https://github.com/kylessmith/dynamicTreeCut/tree/master) by Peter Langfelder and Bin Zhang.
+Then genes can be plotted as heat-map as previous example:
+
+```python
+# Parameters are the same as for cutreeHybrid (see dynamicTreeCut)
+modules = clustered.modules(deepSplit=1)
+
+modules.draw_mpl().savefig("path/to/modules_hm.pdf")
+```
+
+Output for _Brachypodium distachyon_ - CHG
+
+
+
### Smoothing the line plot
@@ -158,12 +235,12 @@ Smoothing is very useful, when input signal is very weak (e.g. mammalian non-CpG
```python
# mouse CHG methylation example
-filtered = metagene.filter(context = "CHG", strand = "+")
-lp.draw(smooth = 0).savefig("path/to/lp.pdf") # no smooth
-lp.draw(smooth = 50).savefig("path/to/lp.pdf") # smoothed with window length = 50
+filtered = metagene.filter(context="CHG", strand="+")
+lp.draw_mpl(smooth=0).savefig("path/to/lp.pdf") # no smooth
+lp.draw_mpl(smooth=50).savefig("path/to/lp.pdf") # smoothed with window length = 50
```
-Output:
+Output for _Mus musculus_:
@@ -190,7 +267,7 @@ trimmed.violin_plot().savefig(...)
merged = filtered.merge()
```
-Output:
+Output for _Brachypodium distachyon_:
@@ -205,17 +282,19 @@ Output:
```python
# For analyzing samples with different reference genomes, we need to initialize several genomes instances
+import src.bismarkplot.Genome
+
genome_filenames = ["arabidopsis.gff", "brachypodium.gff", "cucumis.gff", "mus.gff"]
reports_filenames = ["arabidopsis.txt", "brachypodium.txt", "cucumis.txt", "mus.txt"]
genomes = [
- bismarkplot.Genome.from_gff(file).gene_body(...) for file in genome_filenames
+ src.bismarkplot.genome.Genome.from_gff(file).gene_body(...) for file in genome_filenames
]
# Now we read reports
metagenes = []
for report, genome in zip(reports_filenames, genomes):
- metagene = bismarkplot.Metagene(report, genome = genome, ...)
+ metagene = bismarkplot.Metagene(report, genome=genome, ...)
metagenes.append(metagene)
# Initialize MetageneFiles
@@ -240,26 +319,29 @@ Output:
Other genomic regions from .gff can be analyzed too with ```.exon``` or ```.near_tss/.near_tes``` option for ```bismarkplot.Genome```
```python
+import src.bismarkplot.Genome
+
exons = [
- bismarkplot.Genome.from_gff(file).exon(min_length=100) for file in genome_filenames
+ src.bismarkplot.genome.Genome.from_gff(file).exon(min_length=100) for file in genome_filenames
]
metagenes = []
for report, exon in zip(reports_filenames, exons):
- metagene = bismarkplot.Metagene(report, genome = exon,
- upstream_windows = 0, # !!!
- downstream_windows = 0, # !!!
+ metagene = bismarkplot.Metagene(report, genome=exon,
+ upstream_windows=0, # !!!
+ downstream_windows=0, # !!!
...)
metagenes.append(metagene)
# OR
tss = [
- bismarkplot.Genome.from_gff(file).near_tss(min_length = 2000, flank_length = 2000) for file in genome_filenames
+ src.bismarkplot.genome.Genome.from_gff(file).near_tss(min_length=2000, flank_length=2000) for file in
+ genome_filenames
]
metagenes = []
for report, t in zip(reports_filenames, tss):
- metagene = bismarkplot.Metagene(report, genome = t,
- upstream_windows = 1000,# same number of windows
- gene_windows = 1000, # same number of windows
- downstream_windows = 0, # !!!
+ metagene = bismarkplot.Metagene(report, genome=t,
+ upstream_windows=1000, # same number of windows
+ gene_windows=1000, # same number of windows
+ downstream_windows=0, # !!!
...)
metagenes.append(metagene)
```
@@ -281,29 +363,31 @@ TSS output:
BismarkPlot allows user to visualize chromosome methylation levels across full genome
```python
+import src.bismarkplot.ChrLevels
import bismarkplot
-chr = bismarkplot.ChrLevels.from_file(
+
+chr = src.bismarkplot.levels.ChrLevels.from_file(
"path/to/CX_report.txt",
- window_length=10**5, # window length in bp
- batch_size=10**7,
- chr_min_length = 10**6, # minimum chr length in bp
+ window_length=10 ** 5, # window length in bp
+ batch_size=10 ** 7,
+ chr_min_length=10 ** 6, # minimum chr length in bp
)
fig, axes = plt.subplots()
for context in ["CG", "CHG", "CHH"]:
- chr.filter(strand="+", context=context).draw(
- (fig, axes), # to plot contexts on same axes
- smooth=10, # window number for smoothing
- label=context # labels for lines
- )
+ chr.filter(strand="+", context=context).draw_mpl(
+ (fig, axes), # to plot contexts on same axes
+ smooth=10, # window number for smoothing
+ label=context # labels for lines
+ )
-fig.savefig(f"chrom.pdf", dpi = 200)
+fig.savefig(f"chrom.pdf", dpi=200)
```
-Output for Arabidopsis t.:
+Output for _Arabidopsis thaliana_:
-Output for Brachypodium d.:
+Output for _Brachypodium distachyon_:
-
\ No newline at end of file
+
diff --git a/docs/_binom.rst b/docs/_binom.rst
new file mode 100644
index 0000000..27b0d1a
--- /dev/null
+++ b/docs/_binom.rst
@@ -0,0 +1,14 @@
+Binomial
+========
+
+Methods for calculating P-value for cytosine residues or genomic regions.
+
+.. currentmodule:: bismarkplot
+
+.. autosummary::
+ :nosignatures:
+ :toctree: _Binom
+ :template: class.rst
+
+ RegionStat
+ BinomialData
\ No newline at end of file
diff --git a/docs/_genome.rst b/docs/_genome.rst
new file mode 100644
index 0000000..a30a7d2
--- /dev/null
+++ b/docs/_genome.rst
@@ -0,0 +1,41 @@
+Genome
+======
+
+Genome class
+
+.. currentmodule:: bismarkplot
+
+.. class:: Genome
+
+ .. rubric:: Methods
+
+ .. autosummary::
+ :nosignatures:
+ :toctree: _Genome/_method
+ :template: method.rst
+
+ ~Genome.all
+
+
+ ~Genome.cds
+
+
+ ~Genome.exon
+
+
+ ~Genome.from_custom
+
+
+ ~Genome.from_gff
+
+
+ ~Genome.gene_body
+
+
+ ~Genome.near_TES
+
+
+ ~Genome.near_TSS
+
+
+ ~Genome.other
diff --git a/docs/_metagene.rst b/docs/_metagene.rst
new file mode 100644
index 0000000..a24ccb1
--- /dev/null
+++ b/docs/_metagene.rst
@@ -0,0 +1,14 @@
+Metagene
+========
+
+Metagene calculation and plotting related methods.
+
+.. currentmodule:: bismarkplot
+
+.. autosummary::
+ :nosignatures:
+ :toctree: _Metagene
+ :template: class.rst
+
+ Metagene
+ MetageneFiles
diff --git a/docs/_plots.rst b/docs/_plots.rst
new file mode 100644
index 0000000..98e004a
--- /dev/null
+++ b/docs/_plots.rst
@@ -0,0 +1,16 @@
+Plots
+=====
+
+Reference for plotting classes.
+
+.. currentmodule:: bismarkplot
+
+.. autosummary::
+ :nosignatures:
+ :toctree: _Plots
+ :template: class.rst
+
+ LinePlot
+ LinePlotFiles
+ HeatMap
+ HeatMapFiles
\ No newline at end of file
diff --git a/docs/_templates/autosummary/module.rst b/docs/_templates/autosummary/module.rst
deleted file mode 100644
index 6c4a104..0000000
--- a/docs/_templates/autosummary/module.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-{{ name }}
-{{ underline }}
-
-.. autoclass:: {{ fullname }}
- :special-members: __init__
- :members:
\ No newline at end of file
diff --git a/docs/_templates/class.rst b/docs/_templates/class.rst
new file mode 100644
index 0000000..d0b26c8
--- /dev/null
+++ b/docs/_templates/class.rst
@@ -0,0 +1,25 @@
+{{ fullname }}
+{{ underline }}
+
+.. currentmodule:: {{ module }}
+
+.. class:: {{ objname }}
+
+ {% block methods %}
+
+ {% if methods %}
+ .. rubric:: {{ _('Methods') }}
+
+ .. autosummary::
+ :nosignatures:
+ :toctree: _method
+ :template: method.rst
+ {% for item in methods %}
+ {% if item != "__init__" %}
+ {%- if item not in inherited_members %}
+ ~{{ name }}.{{ item }}
+ {% endif %}
+ {% endif %}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
diff --git a/docs/_templates/class_native.rst b/docs/_templates/class_native.rst
new file mode 100644
index 0000000..0f7d6f3
--- /dev/null
+++ b/docs/_templates/class_native.rst
@@ -0,0 +1,29 @@
+{{ fullname | escape | underline}}
+
+.. currentmodule:: {{ module }}
+
+.. autoclass:: {{ objname }}
+
+ {% block methods %}
+ .. automethod:: __init__
+
+ {% if methods %}
+ .. rubric:: {{ _('Methods') }}
+
+ .. autosummary::
+ {% for item in methods %}
+ ~{{ name }}.{{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+ {% block attributes %}
+ {% if attributes %}
+ .. rubric:: {{ _('Attributes') }}
+
+ .. autosummary::
+ {% for item in attributes %}
+ ~{{ name }}.{{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
diff --git a/docs/_templates/method.rst b/docs/_templates/method.rst
new file mode 100644
index 0000000..205c26f
--- /dev/null
+++ b/docs/_templates/method.rst
@@ -0,0 +1,4 @@
+{{ fullname }}
+{{ underline }}
+
+.. automethod:: {{ fullname }}
\ No newline at end of file
diff --git a/docs/_templates/module.rst b/docs/_templates/module.rst
deleted file mode 100644
index 6c4a104..0000000
--- a/docs/_templates/module.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-{{ name }}
-{{ underline }}
-
-.. autoclass:: {{ fullname }}
- :special-members: __init__
- :members:
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
index 1985e0d..d4ab189 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,29 +1,35 @@
+import os
+import sys
+
project = 'BismarkPlot'
copyright = '2023, shitohana'
author = 'shitohana'
-release = '1.2'
-import os
-import sys
+release = '1.4.1'
sys.path.insert(0, os.path.abspath('../src'))
sys.path.insert(0, os.path.abspath('../src/bismarkplot'))
sys.path.append(os.path.abspath('.'))
-
extensions = [
+ # TODO add myst_parser to dependencies
+ 'myst_parser',
+ 'sphinx.ext.intersphinx',
'sphinx.ext.autodoc',
'sphinx.ext.autosummary',
- 'sphinx_autodoc_typehints'
+ 'sphinx.ext.napoleon'
]
templates_path = ['_templates']
-autodoc_mock_imports = ['polars', 'matplotlib', 'numpy', 'scipy', 'pandas', 'pyarrow', 'pyreadr', 'dynamicTreeCut']
+autodoc_mock_imports = ['polars', 'matplotlib', 'numpy', 'scipy', 'pandas', 'pyarrow', 'pyreadr', 'dynamicTreeCut', 'plotly', 'numba', 'pathlib']
autodoc_default_options = {
'members': True,
- # 'exclude-members': '__init__'
+ 'exclude-members': '__init__'
}
autosummary_generate = True
+autodoc_member_order = 'bysource'
add_module_names = False
-html_short_title = 'BismarkPlot'
+html_short_title = 'BismarkPlot Documentation'
+
+html_theme = 'sphinx_rtd_theme'
+html_show_sourcelink = False
-html_theme = 'sphinx_book_theme'
diff --git a/docs/images/boxplot/bp_ara_bradi_mpl.png b/docs/images/boxplot/bp_ara_bradi_mpl.png
new file mode 100644
index 0000000000000000000000000000000000000000..e404674a455b56117a243ebe16b6f20c9924a51f
GIT binary patch
literal 11787
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
HH^28U+~kYI
literal 0
HcmV?d00001
diff --git a/docs/images/boxplot/bp_ara_bradi_plotly.png b/docs/images/boxplot/bp_ara_bradi_plotly.png
new file mode 100644
index 0000000000000000000000000000000000000000..24d2bf3ab1081fce11c4763630be754a5693edbf
GIT binary patch
literal 24117
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
literal 0
HcmV?d00001
diff --git a/docs/images/boxplot/bp_ara_bradi_plotly_nofilter.png b/docs/images/boxplot/bp_ara_bradi_plotly_nofilter.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d525ebd1345f149585d6a2b03c3d9c7e2befe49
GIT binary patch
literal 26682
zcmeFZc{r7Q`#vfuBvYo4Ide#o%rhbLlxazl5GvC$lc|iEi;#J?WDLs?MF<&}acL#V
zybQ}c?9Z*|dEe)KpXd1Py^mub`*-YPfB&dIaNnQtx~}s&uk*TJ=xC{uo?|$NhlfY1
zc1uYQ4-X%Shj(g|=q&ijw8_yl9v&;6nv%Q$9JZ83{9e=WxTD#_wa3N0^Ci2UTJ|0t
z!+Bi>9qP`6gq*l6dF94NnobQnzro84YHf^m%$C&ZIXv~eO7FMp2X|$?x6zFBD`Ot3
zl_;5gpWcm4WM8B0;fQl-pL5#8oJDD+yWZssFP_s8u;QH}lEcHN2*4vyP-i8^klNY2
zrv3L%12pk4Hf(?V0ra=QDR`}n3+va!|9lGkFgRKC-)~{1u*WBIF6i$5@t0Rqz((-?
z{ZhFCVpe3Ppiq3!zketPH#rSW;*W~Co}u~LyQgS|4ih6cI1EV$iH@g
z;{O?|LCrGkcv?qyGZTgV@oH8|qM>3F8Ol8R&*JPz!R}|+dV*Uwe;X&OJP|AM=ea0s
z{r#B#?LU4`iN19?%ZA^`VRqZ0+HS*WxX{p|lw9%-Zec{7!fPe(1-5>MI~c_&*UI+W
zM-eN$Eon`~Epkmg-L~GtZsZo}$S8^y8IFvXOh2-huCEy!b=db*c&rL*GWEEaBk6Q8
z$B9XMGe^5P{tj;OegF}I%GCQ|#DA_lK^aa$5;5fcYkBXe0?kT2AR_Exc9ex=vvZzcsYzSMW
zFI=ae_c|WrOu2DrC}3JY;MZ)He?0h>q(MFQd0Cxfk)FQZl5k#r{@4>l6D~8|-!0Io
zY44t<*ZmRLKF&du6)C7z*|vCr74zGB2NJO9&|(@Lx+=Y%{!HDoM_a3_siFA`Q9pgN
z7M=WcxS0p_(#Bbe#n8K7WbmJCYbMV}>c^XvA$QN;#mz%d^*Um_s``l)8zl^Npc432hu*Vmy%z|%kp*!PZw=;K|^lhqk
zSXuOP^w?tm>0%a#j_u3_guwj%!aM!VDe^`2cHCzXgxz;Vk>wc*a#?9r(yeK2{gsPW
z8WO4u3gs=7XbS3B-ajIn4=c2L3qSqmi=B<^j=sF`X0lpKZaurTl0_Nholuo}b=lLK
z+r8h6eB!&qGM09AhgM9Y%0f2kl2_m!ZmCLDxTjA@r+AQX+%ln9zd=Q9+F_)uwvSTC
z3>$pdkd^g3blSD~r~muUGV9m_MQg+Ar^@@%!KkoLG>g$M#2rB%(|0`);1im7=pRlHFG5
zxfiz<_a;`COQ$c+pmV)@vGqAUWC)FbV8!1^=t8iZNia&mWl)x7Fv4ZJviY{VQ*yjv
z-MurVrj=US&Da`Er}iqdC6~%=X(^55E%Cvldt*p)+Jz6?menyg@2E0`H&@jNVXF5S
zt}VbEC(?_B+k^&^N+;YlDSMVCXxp_@%1$-*mN&moN;ZD`soQ8=O#058m;a8ihQ&Tw
zXFa!i&Q|Da>9&j&34*i9dl6MX_5nfHx)^u8b@9U8H^H`(1KORfvD2zbLsI7CU(3{!W*~N6i4Ah{|QT`9#
z#jbb7gxlqaa}zbvsvT~1k78`$hz4Y`;7Wgg^!`qSO})$dplS6_+x@vdOMji&fx%@z
zZrQCkU#Hp~8)EENKilHDZ|~fr^YbSQo*p+OErBbK`}wSI^Lut}u}S>ttx*JyQ?eOG
zgwPlO{{o&|h{m?7WnSb0haZSX#Z!!3k>YefxplKl7-XB$7#7{}s~t1lUOrl1R2iN^
zrCd|;%II|I9i5H6Sw6EieX276Z
zC_=aqcS<5(a2O74KAw$!FQz17&3Cdf-_D#83PwddxqOd>2+>`{ffPIy%5w=rsw@2Z
z95kVeAe>s`iFOH6qIu+(OX;D#e%=bqlP10pGSBCyP6dmd)yZDEfQh<54Ss8YAIyOy
z*14ZY1e|uunNz{2Gg8T!&_b6$c(|DLI9N>S)BTgd@5$j|qD~F*G$_Hd2|j_lrbA2-
zjpdSyea#LT0v!Pbj1Fra3S#Z43gAuuYuvy)=T<{C2ii3$JF?46IMk}`Z<0kc;02>>
zIw@euc#71~*wBJkx6c5uEO(yhqaNJSvr(sVn&+w1f`}w%v6=00I{YU*fcXsY*7DF8
z|Fv$cBD^##IdS^Xle(dYi(9pVIpt>v)>Ql1#QS-2!(!9IA8HOZA8e(sw|Nmfjao>Y
z#aV|@qALvU=U@E2J4YpAa?dE9r2dS8`KCYke2YhGBvm~^46QsT{>^`lA8jD_A#?fJuG?&O1BFM_pT
zJCW)ei?wmnX|9u23|?zv70ek+pGYunYLpl^;;Tv+BIoDfod!^b@G(H{RWQoyi`
zqJOP4)#1li5`$WI(o&OJSd5IMaSypuL4>#KWHz?x#wyjJ_4*)Z>;4ywjq82`u2GFO
z84_=NBKZ=8@>h)z@wold3&SJdB6>G-E`S4#gbtPMoGM(=;C3E9IBnLm1g)2m+p>Gl
z9`wTA)}}WY&x#CqWF|InXw%OQXwaZ#Yix=&QJM8e;pm0I#x|#qr5t4bs|_VK^6+l;
z75^vy{K6nrbhZlNeS6>pR}vH4az2bNJNoIg#od@L+tZCm_O)Hb3YymI(OC$?RvTTL
z?Tru@PJj1z10d%kgh>AD%CX*Vop^`3g_A07Ji94jozZHB&=L?WvCPluNvU3}ey}W5
zgEh7FKrl-hYD{~YtEs7t13xg*`($k~XND{p7efc^g;V(-j@aq~a4@I~W5R9wOZxER
zqulDWKCIs^jt|G|)qsBOma$cAs5w#Tg8LSa7(Z-0Xy32@g(R!5BDaNGms6*CyueD>
z(vA=Xic)yG-Lyhh=SGNVvcCO#XD`W0^|b)
z{9fG>^>;1ww{{{?Oj85ckC9@o+o$`+#H3xNOQU>~SL;hi8E!m?tA8_c78BK@=ZfZU
zU3_D5hl2uLZj|IH53C;>3f(UDiuJH+2HAOD-zK;x@!OFw(P8lNLYvB8D;R+*R|blm
zeG58c8VhjEhp++d1}am#ThmTkzD+RX&9=oj_J43Gvca`}jh96WG7J`e`I|HLk7sbC
zOW6qs30X4UaD3-sd+dkI912_-YVqny!F{S8uP$245#|1N03hg|ytvF$R^*y4w+b=j
zfv8W(2BYRDk?^YW!8csv0G7o`{Cz~onS^D~cJ6h|FMgbfvpJ;N0->d%^&f8JJzk{n
zMW=##CAdWr)!)qxFaf6vblqQIRfz4Kd;Y-_u_A>77;KV>oD<%H-@d)TdI_T$z%HT;
zaR-7RixB))cU~E8fqy^j#Bu+J7kNjG&a$jDsKU^7WNVcf8h7s7NJK}}LQe0~KMVz&
zo=b+mL0u)YhtxvkN-|IO9A3whHQE4deaXeYZvxmUu|gkZPQxOw?Hm&|ym6HlFd}Dp
ztIQitdu@JLrMk^3>7TuwJ@L4^FBpdTy^nNW=yCHCW1>Ri?$dShJ;W6ydc2SW&ioZ#
z4+WZl=bC;n@P6N(1+cWHjvo-^GLP2}>C#>?D|qJI0c_k##LXYmS#
zUVTKm>`_zU@>JA*@_Ntloitxk&i>FbksVP#VQKvOpS|HJ(%*6-di#km3^NHLcK1OqRen>qCnzP*w)!mps@RN
z&j}~7zfCw)T>617jb3B2VKWMQqz!L)Gok{}yBU7I{cQNw$N@(mGVgUI-NU^f!h9LA
zW!+^N1?{BQ-1glLDPhw|c0QLC;4|4;kr#kb2JqrrT|n=%_R2L2MYm7Qi;C%K-G
zZ29(vMcBd~zgMyLHdzB(ZS>6pX~85ndH69m^00R`$EEM4r`X68;ZzoY*!>_e8DBLq
z+c1tvE6QD!D$B{a><+iClb9)S4i@V@*Zvqv^LB0n*9U=ldsn$U6-!SHGw*-7&F>=f
zQ-f^CV=8nwO?ReqMb#T7`5AVLd33w?P3?w3Z~;A`TZmydVrOkx7wO9ud5%
z$`Fabw4BGoklyCKNCa)N9JI;qOQL$xef9_d>P9&ho1H0~Cek?^jNk9L4Lk|!-s=G1
zjo+?oMu=CO(@mFPv@XtDaGUVDGIC~tYJ&I{XVyj&yH
zyw)Trfd~>@Zlg!P5_mo!(F-z&4m8K`9Prpbp7m~#t?n!m7Aa0-FMn-b#jbo7x>Blv
z)~3K$wiFtOUNh#+_2kc;zR4^9py&Fw(%ZLJvxcaHlZQ{8B3e>^Yi_Fk<>ih5l8Pmz
zkZ!IiUo4~1jHb(W=^A3`4bxVS(Fi>nbGmP0x!dkgbuxFxv=%_H8iuT;odXSL!wKL%
ze|?&|pN6S!`f{V(gHAF<1gWcVyXCo0W!0J1>W2ADRa@zaj6?`#K!S!xp4e_3)&VkM9`<1nnJ@%
zi(SGR_6|mfBC+Y++u7~fgYnxjBf4Q?!)@Aq{Uze7PI7YLPC_iaHZs;yYJ|#k7}ni
z#;YVV6GJzbjh-4KRN>oWnynd_>fqXG!{gChifqBv+$L#>@oyy}+$i)`0DAw2#=dQF
zKzs*zZC~~sp{A;z9oM2_E)hBV4871*0D|(+>VpkAca2ftth^VSq_lHJ65G
z-Bg3Ynr=KAzqk7B=n$^>gmLi{Y=jPFk1A@9A5kyWieyk?rv$b%qR3Sul$D#e-{nq5BQXVDtzj~
zd2O&C>897Hp#6BqN}+-2F}rF!BCBONzufy0r#)&35cj!%K-|xBvF&%?XD(d8xS44E
z1JEFHKL1u_jI))Iv!GE_5rm5Kx;I-Hv+iA^fkqN$4ZybJ*(X@ABXyrCz%8Ds2LQ}{
zD*OvIm?Jw$)q9qO^440Ea6{u+~@2#X8HMSTf2Ktzc`_t16wG-
zWXgIcibOrlnEI-%ylh0(5lc4((fAEL@GQ%Ud?ItEE_rwYBEJzF
zP@s!=?TV7#=<>bjQLY=;dnF_kT>G|Mhf(a%N*11F?qyn7r+HltZlS08w;6zQcQoVG
zU*=o2%-nJ#H%H)4^irZtdGcWZy%O7>N?3S3%h9!mATpjlcYVhO58)
ziL3Xi(ap7M_d3B&@IvVZ13=ECf!qR+za-!SNU!m@pYFQL7JegcvJnK1CJjRuj~~1z
z3_)Hs$PsNtDbYJ6jM<@3M$rdB?Y|=9>dPZf&N$T8?#h#DjQcb!s0zTgrUWICxz%e~
zKSAo1^ZcJyP-~5dUGOyWCjI5sE)!AqPNu?EA;gEG`xo4F;OkoDP{ZH#>pxK(Ra_)KLAcyc647a|;<+d`31Gqtu$
zV&w7t?x5=n;pmEJ&O4|CX_*-}C%fl!%JsGHIFM^5hQVSoi|qx_<^CuVc$FAo7?vno
zGQ6XvJ-_j(Tcc~>UtXtO8o7ov@?ex~Wz3jW0^>PFGC(Vlq5`>|St6p)h{ho?+-_})
z)bved|8Nj@c>IsqSqG3_Z^e%soj}f=p#Y)MIs(A+{?}~)5NDAZK^H^oo-(N94UEVa=jHs~>cmSHne@)_l9{S@n{Ie`i*1d+#Vk}amAz*~RSfv=GvGB=|K
zRl1A~dV`ahIw--N2L|?mEdZNRdUF>ZMLa+>08jBoEw)NCr{2arcT_2?P)Y&p+)V#t6$gVO2Gb4v|aLGubd
zz=@kf+{qR8pp3ltx`K#sZ>zW;Ammh3<*vj0!K5xs>%UU<Q(6^U`Y`
z5n!Xw&fO6S7Q1`K>gGv&2!Iy$xrxMi&7k(+odtkh77)+fQ6-_oad!JFr9jFn4&C-I
zM9%ad=*bk}q;vtBC(pfvp8M4vTnq1NcAP8;%kb0GZr)+32Joot(&O|LQSp{bv5oi9
z^#W#RLPCmQ)$4)+6zG;jzM@lXz)@sTLYRaIehUwSqsVJ3izHr+SsZcbA6PZWeR^h}
zD2TI({9vC3un&X_US5nAAb%1aZH{i6fA7$=l1wVGAICVnxTNoj1L3i^MCfZ2gP7)q
ztoi+8A9w^;iqwkwaFOot5x6!TlLpsY9m1tNA;)`J5b%8F%f57Iz^3oPJi}-OEKIH~
zo|_ffT%ejsG|A61D%~~FXZBZf7Thss>3dzom&muH&@uj@5xf4x{RpH8Jd|kFbWcqY
z!0~Q&S{ul4SR`A>>P9i%UjVc;2eL_c;Z@?FS^xvC8)_8j(Z{*Q(2b=Sl?0a38rj$I``_1HNe}t;zkQi_j+fxNU4^v?MNwMHGr=O
z_|qVm8PFmF)%}vfR$CjsWq(T9{CuTx=ht%0RZ}4cRgd8msOmLD^a3QgrqhSzMuSJ5
zQ7TdX59u(~E2o*o>;nWEN4hVpF$Z-lWRK|^fV#tB1#idaS85B<0i4LfN@fGyY()dt
zU;Qf*5jL(zWVubE`myUY)z;s;-+fVC^SR2u8t$lDUz#H0=qxGtEGO(?e|W#rLa5<
zmhXUZ443;c?e7HRQno)R>|^LYbzCfALa(974Z>>tSMZN~!;(2jRl0sk@TxMHbL5;p
zIsC`B0ys#?0zF43pJTml`k^d(;5JP)kEUP)F>V@4QTB$eKj$4?{c80=#XTC&Jq-2vbpNSV#^=|r5}mj`WytNV1k<6Lv!{1&1>w?hcOy+)(ACa%1v*V{LL*aJ
z1W1356x+V0g!SnR{I)VBH9%lrFgOp~p?}bx2WBcgt=PfYTW-~NJ$I_Yrm{Un%I`g3
z{d$gGbC3$(NtAJYf!)J;gNq-mj4rjLcU@La8z3mPZioq2~+&0Mglz)2zkVCmYbMrW@)6?vXDf%
ze4aQT*)X6{Fk-vdVr*^=7vjK?`*B3thP3u*mU
z#w`rHN04&;WYs!Qc&WXJ&yD=Vb7jrqXews!QNLJ`X>qN
z1ZXHpAzvofVvSFP=#XP_rMrW1yGod?NeRo|>3(wwBOoGy54j(?w~+)C=xfh5Siclt
zVg4P8Ta7i+eUI|b?xWW3N*s9vV)yzcBLH7bM?DX5p?Cyuz!K8FuGf_6Vtlt|JyWha
z=J^`cP7#+5?Y|iu`dOfu_~y-za-8HP^*K}T74%t^Gww%C;mJk1h3VM)*k(lKmjVMZ+5mKaFg8|*N@wjx4uZ!
zNE)sB?5cCbfMrYdopYLIW*Wk6QbA5=cIETn;)d+7*{WYA;gN9brCeVSxlfxU=@Eutlfs{$
zJvqs5!r=Z|za^^|;X}5y->&d*oxzbf(Aoy0KG>7!=m(3*eY(p7{pE#V=$d|23GqPh
zlMFAtJ-w7R1@~nG&|Unm&>e~(xX5#>qu%LXKM<}UNcyCG>F@!^uLc5vypYt>)FR{3
zN6}i;uR$q_^-MW&D`QL6)yt6avT;Kwr(73P9eus(;m9rE>T5^>r*AkJHEfg(l!Q4O
zZUix={2e+xkz=*lWzX&P?HY_#u^%#mH7`mp$M-%1W-V$=$Im^QeLn3EL#*X3`davkpc4V;;Lf=n5vt8Ruolq2Q
zIhQfq6f9?ITExKel3px^PUSxhS)Jph@EQXrVn@A>W5q~!&?r}Q?vMb2lKfSa7=d&r
zAgcg~tk~QuMI2ucAe_IXtk99BvWB?d)C@+kT_sQ57eq4pA1ih@@9UP5I}}adI4Uch
zc)BH#rbuRgm*mMyOCslg*IdphFi^Aq|9sVcIov516=H7ll^SDt85uBr>KYkQAd%
zdn(tP8D927x7Aw#+rPxSMTL5Hpa2gtX9BmSxUGN|W`a`;KGvnv4F2769n#h4St)KEv*HPZU2Q
zLKt73Cj=OW3MdNQ-f;s@Sm$PC0GHfiC}B+@x|Qq*D3vs!8wHXV9m0){q!MU
z{F7n4>93beS2{q}S}3dm<^(4|zW2X|e`yhp|*v-Ee4g5_#m}
zO5)ui_8EZx&%62wwutz0Xuq=MS}jrSz#}f+c`1$O
zT4fvKnH;mqJ+X>7ZLo;98>r0%)!rI8RT!O`J
zRzJRWAs9t0Fb;sG76|8BFE~{|K5w2Db#Ap_Z7?CjvVhn+EQRCSHId(0UoeUSKA>=-
zL?hOF7&fQ`XTskouLBWodqzlfGxWtCimA=8);($}Z+NribV6L*62`T0^&AG5UdSTN
zj`Y*vA|$ww3@rP7^)%`Wxb=&z1)vrRpYwnJ5K%d&;qa4IWfV99E5y}}pa2ta6-|!h
zd!j+^8L5l00Nnl2XuU6@(ivUFhKhS_#+ca~`G;P$9n8O7gW~fk5P!Pv8NhoqCmOz7
zvcpE_W=OLk{RX(`2rk5cf#ISt588>GuP59aY=4jS1EQtI&At5!cki%GaSc!j$b@Vz
zWw_{99En87gAwMfaA*fR$|ztgR`KWXi9yz**^;FyYy+i;!uDXKWZwo;X(6U!iRxm9
z#hOb~Qdx-JrN_@84-N@Vj+=I0UhB&3c({Oejlg=f^{>JxV9hV$$?;zRK&V;br7CF_
zEM}^Qt_4v}>~KREGShe`#ykx~gRyP8-!lQ^NOow$R--&ZMi{2au)KO$BE3Wj#9R1;vSbLmz>~xo%yJx;Uvgm;R&zSX{o+@4{@O3Hfx@Yl2y5IU8?NX{fzCVuZCjB8jXG8
zh8cnfD$80Aa~Z()t`MdVj-?%G&mdSXX4`qA1X>p%`%+Im&Kh_i^ERuVl-h1|sBftE
zDGe>pY{VHpK1=yJD%cZR4F>?%E&>a^xF^RA0#0HFxIu${ep~oc(l~K|5R-I%JzZF1
za4}>tEH&>JyEaiX_iJ0g%n?&|ht0YcX;y1f42a(0Vk7h{kYLqb@JuPV1D9UD9-796
z6b{xv{V6z6{K^SH#q;(MREifM^hb^=J|v;{+#HHcht-=X-#vxFcW(ms>ZqpW(6PJ6
zFIdIm@TgJNezGc#yOjx@^@1y=L9g20pn3wNmWf@1N`(<<{VqxL$}27#XZ`j1)#a(t
zTZchXOwKvxq3ePyt9BW#X92+&4a&QcHEWY1U~sQM5O)WYOVXyGT*@g;%b-!Bdb6KS
zL-hU-fo6u3DHIC-S2-;g30=!%CqFH}_4iveqSEFd4wHT(qQ3x2rgUHng$C9V34wPJ
znhx2nd7-_~)|aFtYQ30rwi)QC>~Rul!_JW~PahLg{{N37lI~K!_=0@#e05vnCLRy}S^73uGSM7D4xj5#5
z_Pf4|E;%1!7Cx$yftbDUk%#RYAy^Q3*IM#vFsR5hgnc2pDDClW4bsN<6M_UKLKT{R
zn`e45#C7fL3Y)&}KA2^IV#)F0f?2iWpn9#j?>jwx{h^9O&J?dXqW##8kzzRE&NBTr
zU!|5N4UMu7J&W2i?YDQw6l|tt%nJof3tM~QgJkcjTol3gJfp0xtr=}{?0U%uf2@{N
z{{t$*5R<2-E?wn@CHz9<%k~n$eGTTgC9M{4U&)hyL6rES|B4_-Ws{t{)-hw06#QQI
z$g)J~oM^qB5=+`JM#(!2RnJ@sDuCPX+fu7}!`#lCN|jr$jWAsCw}pF{_t2x2V6?H%
z6FxShE_f0bOa?n7Aiwi3Uwl#Hy;koNYG5dLe?uAnxGQy_fYA8OoNHRi{yM8q3p
z`qW(@(9eLI=%>TSo?}geZq8)sO5|^-ZPi&Uo_EgQ>af4ND!8?Cv(4dQZo9l`^!1PO
zu@~71eAruJ&t}MVm@q_Nf5ra__~eQMLW`?EjJ&r-=*RY6S64rr_b`2bKLkn`sM^V*
z#9u3G7%!wI$}UvJN9$Gd(cs3B+O9JeF$uX}Fs-_ud&3cJuYst}9&bj`
zH-Qc86q|PVMM||i`3a$$ysZZ^j%Aiw+qs4D3Ffcf89sK$lNBb`n#{81pceb!_)GH0
z7XkEJ8x?qv5oP=7Q!Wt9T?%?b4{i|C49Jic{B5F@*vAh#ZtQEJ>-UEZOzpdz+A4at
ze$LS)NIlMa57PVKb7!s36FFa9XyIX{AOH@KqKE=145AQJ&^eK6|63mP7@!lNp2`87
zeO)W4(2Q|sVf`AenXvf$S~mXbFdSZBhGI`1zRCz9-mJDe5y1=K407xVY_EU^OhH)(
zdf>>zssi?UW|=7)ca4MLTESNv(J!GK$OpUeO!)Hb0ob#J3?Jx8fcKz<()JfT$cY+G
zySC5)54h#)_?)QJxTUm-6wxhGiAHm!q|NpX5=_+Gg0MRgTmuk#Nw#;q6agg+3WJ?8
zlp$iK_sON+6qQ`D``m&*TukR^a8RQNpQ&|^yo3*=D*FY2<<9
zXp}-~wi%D8%{C*|7tFY{NNdBkJu6b)v@jBIHQ0E()%1t2*PD4}~#gT>{?qXFpRl~yU}
zc)jduGVP?*eyN~_NC^D>*#(ZyyQ~yM-~d^>DBc5z{!<+Uch#tjyn_P;h-ABTDj84|
z!E_k6T{iYh_-vQKi^~g`Zxds1c=zZVuJR!vy?H45s_t>U_4|bp^dY(^kC6Fo0=4t1
zw*W_eV<;OE47G^M4?kl4TZX|v16w@5dO%LM?3UwWCs5CRwwk8)IzjcdND@%05(N%*
zBzUIMAE2`-umqqZ!*z@-d#CwsLCqrI~=+IVEGzJ$8SkO
zC++*1diukPREE3ucAC4ZKyv_TeR(k`flmD#&@Ty*`U;(GbVq@(c|RIy!Kybi4g?{
z0wW3K^O7YDMtSG;Z#^`CYfE^)+S~f|aP{ZPf$4VlS-1D!OhLF*0UZiA$LlWIg@Nlq
zgouq{R%4@h2qy8i+xpRCB82efH9jOH@}ucW9#r(OY#<37bN0bMHzUEn&Q8v3ZDBf3Oou%e*3GCA)%CJ8!?@nf>IKc%_J4nS-7Hp%YL|>EJ;Q6@Cga+DgAX6^(QK@TT
zF@7E@d}2iXK6(#N2Yv)@h0CZhJ58XKQGj=K;&(EAWl^F6%B9s}z6_+2$V@MusC5ka
zjW_)OZhn5U$6+iy_0QyP0al2OH>YDz4laFm;jJWq8~ZGk*XLwe3Z1v3O{*T|jvO6K
zz``arO1Ait(|-a+O-%V@caHm*=-DV-!5Mw!zyH982tmJMWONeToemDkb8~Zx)N{`@
zP<)<>m1r1hWU!7DR;KJ
z(!Qk=oYtFLk={`K;CCVmjzlb+{G2B1%e&x62>9U%gUUc|MicZPkQ!ZrV{{weMg97u
z>TF!eMfmaVI2wpRp}XXf!R_@-?haU|Rbfu;2Jnot^EqN1t&%f|yIs9wY>OYLKx@pv
z3)R{y^e%q#fj=9Ybz~9KZ_fzb)>Bunh~M2o(}EKP@-12S%fWKrKsFO76dMZ~R8-0*
z)S`%-0e4+}!=ca8s2KFkENef^b!m80GGkVIRh6sj%ZW9p>{?~g6X2`AJ$UY<-ql0)
z>z6x=5p28L;PFD;6A{?iJqYnl+FxZyei}TSORyb&ZS!As(Ea-b^#>H752g(S
z!L~EE-fn`BbB~b*;Lj~Vk&`X`?NGUhs7aiU=B0D1T&WbF^VxQxEO|U}Pv5mM(v->F
zPykW-6UeJ}cJ-iZUt>GBq=H${=ri7p{C2eV?rh}AZq>=&y&oC?sjr2222`(ujfRrw
zD3C`wqPgo=wg_#~CVF~14cqqImIyUV0Eb}@Xe?C5Q9hsH6_(W3-b4H+Gh+6A_3JEt
zDA@JT7Vf*ik(u{LopWw3KC+5f7C>zd65GPcj-@z_+$@>QKBbxdv^_{Q%ZOeeJ
z?4gyy%`4yqx>4s4Zf0#j@3t^0qBUZbZ=PkFhtA?s2CUh|);%V9goOG^6+w!#qfH$?1Lx^nt7PdWlftT8*@Acrsjx~m)D?j39QWgN%K>e|tl
zXeb1pI)#JE=J!0Z56Zuu$3F$xOx0DkOSIq>1t8XH4+`>ypAZfI=|u2Vz>@FCD@a`e
zOMU_>b1bM*)QDrlbX@~CLD;1sIbPn*pTCr1>7k2_=8@sK9w-+8F7_!wtP0
zUqFwI=C&+S*gcP%_p1jcm;XgVw1@J^tCNj^g|RTCD6&G{CV=Mh$2NH|7^(nEt36R)
zX9a*UZmD}CF)h9rs4#U`U9?V0>w0?S2p+`~2RX@d^_pS}31CV<<$;3%I7*1x;G$?X
zldA49tFar6+IGOi(QF}7u9xJ4sq4+@N5||w2@^1@b?AupSvD>nXI68bN-72J-whXZ=osYRX$k|K2yZK13?R*^|8+wj%xV5e4bNt
znQW_>y7K#^D_j~$TA;QQ1Fj_V>D-3KlcEb5D7paI`}h6odhF!jQ0dHZp*_t8`Rj7`
zREQ9rk5?_mS!oXYeihhyea``f@-kWX{j+?#d(Ry{hOr4l{qvy!DiOlS3`>^WIx*ya
z^SEs{C=miZ7sV>oUH>3{4bQ+oK`PFVj&Anz6C8jjyr-NZ1st>JT?2STzJ&p`uGUKQ
z6pum4OAP;Oph+@Z&75(45))mYbu1pP#BM)!bV0MxC3w6>yp_4TXn4`ps9D&{yS;G>
zXD7KH;lpGt#kt?{k^QhrFiY2%vsnJ{?sN_23@QsjXWy|?oG^e)9B@WXM+nYyXc1G>
zDksEUIud2cpB-}?6+bPhCO)PH;XS>nuU-t>@RXoaPPmG>%Kxc`s7-9BNb0_
z(s^b@aGVG?KlkxXW86qXhQr{`(grpjv@$NJr{3~LL0|crMBXr4{mh;`XG8DEzf`Xv
z=WSSvk&+FiOBP@8XH{GDO9~}@QE+thMEs0ukd|rFt*ZzYU7bd{`6M}2-(>K3?dEOO_pIu|dz;N;2m2!EkdZFj_@c!G9=;)sI>1Lp
z?`KpvKX`u-=ThZAWvZ^JITqqpQu!3`kM9C_gvG}g0Sf<%0~YiZx^_PI|CMm;P@1Z;
zX=vYNIaA(?b+`8~0lk9vVuD1F{mDT>rOJKbNkDroj(^GSYKKfefZiX>KY^g2W=pOg
zBQi1Hb?WC)#zJke-$31IC%t6-7*zSGIX>~-zT-)qOdoMju?9HY+Vb^-se!wPPN3&<
za)4si3j!j_B7pw-O;87`gEW!9Ru{try4@f_a}+(g<6I+rD+7_V3|n^&lpS2R8-mWaEPIC{%9AJZWPE>w1c(8T*TuD9o2cF;Shy{k7#vw3Nvz0NaCpDJGyUbdufeQgw~8>PValu60$Z!iIt*
zl(eH_6C`-0swB04)bqMWOC4J4E!I(OOkLN6o9|IT$sTTTP=%T3BY1+5v23&cL+pHoa5j%)H`H=+oJ!GM%3k_i_y1&xua
z#I>FfJX~jEr35_2ejjgN(UZ2@xL@PF|CP^%0yh{+@=|X8k6P476-VrIqvOp8zg@R@
zvPXBc-RzA~KT_k=@_rdR(c9E0xuu|xN$RkHW)oR5CQ~@B9EA7}KqZgG2
zEvDtfcVgD7ndiM{HMbpbG0ne*{im&>ZzufDN21o-6hw#!62M%)wgx}G1E!kAK!b)F
zF@LC9esxpyo-d?3%8uxjoT5ed(F&kAIgT7t=I_~?5fCr%&
z0!+Hw+QYP|-Q%I-XCgqYYFLb#FY&Y99C6uxcwArorT+!{Z+NWhqw^3SYOkb4l}
z&YX2?zI`S?ol&UG=8Ys^FnRxc;Cl~I81cVgT@scLNc`YkXZEu>iv#UVt*dnB|DUt>EH8gok
zU-$pU0it`9m&FOpK{9K>krTuNUak8qTpl8FF>#3tB9D9w^mqTSLqz^2Oa8?pi^bu5
zZ^E>x`C|h?X~&oihda$>aq;o@L_M_ke&?6*F&EPQEGGnOM1pnHK@y^2iIKa$y33e+
zOMR8P>!ir?;(8Ce;&7U4Ut)Qze}m=j9Sj=)%Ya@wn?pf-^*q49u^>-db1h|Lc+iZ?
zWPWp0RO8g$58?mm6()nid!8;zmwwv}3KJIklY$6TF@Tzncu)9UD@!dm
z?6T=SuyEdYm6T(a!X&Y-QCtPMS+q@>vXUM7v&iW-ymV^H7=0i|E-gCYhy7S*`{vOq
zmU)zQ@KV&Z`(zPVw2zrR{R3ygA4`?tL-mQZ&sN-T5FyN-eN=2Y50KgUZKW^afU&Cw
zoAYADMW}CZ$iMlXtnTu6W~SkMRaKi6Tf}GfWdck#10s
zgJ&7Jwp`oUWtx%WWI^I);1GRX>79}tknkq}iI2^T9l&7WB3$u;J;rK_-EgD4x;^lb
zw%Venx#x7NMTdz%l~oE9|D7x3!FM%SkuP*+?|z{K)Gpz)2PhAU-T?L9(Z^F}2qHu?
zvh!@95-7%VDI^97gQAu>6VRhCL3(s1K&_Gm_FuxM;7J4m89sIfxDpta=stZtXeq^W
zoTGpQ&|!elRlIv0e8)o_WKWQQg&A19G`>lw6HpDwfi4CG7s_bR7NN=mWLc`vR(2*Qo4pIcY{F=m#SkeYqKoXmTi;G&U6NBT?^lAuui
zDdGO>3Usa@b8no#1^N-R$wO4y*
zvT~wmcfA;ml^{@Y0f>qSTymnV7H+7@K=l9R!O>}>bkwwb;=CrEooWq+_ZMp(nXDS0
zBz6=qe>%WFLk59|Z^HrZX_VP$Ht;<(D)8eD86Y&9vy?CbUzgCg(010>i(PtS{x5Cr
z3YJ#$y60qK5eWTwM2+hzj8nm=Oy6znK(3_gHBU(01ebq
zYai)5!P24TIb-sbx(KX0i)#cZE2#ttF4-H;g9grd@Y#dv&9sihgoKY|h&~4Z*644}
zgRpoF+@bDZflYY;CN6LwCEu-%I^=}nWIgCG(*N9I2uMpMxG$`M2+`M~MhFZL6kg1@
z9%Yh4eAY$GRM>xuS8L6yz0!IY#8jO7-W$Jmv$ywl3anf3eC4@Q@O;WFOg}egs=0E`
zip#@7z=Er^J5KPXw!O=v^0N%P4`R=)T*~~R7_HOwOKpWq-PN4xxze*k@o
zfH>HBfP)-g}_epxWhXvWp$XwnHxKp&;k=1itpZ+
z(I3uT*K%MXuEGlLbE(PNs!8|7M(?`}O5a4xMo`x++H*2J4Zgn6^er+Xc1PU3U_n?lkTEEMZ=FRk7%GS=fxTwLBrciJm84CiS-PYn2WclD+0IrC;U-{E
z#+_?HTOa7iL-|z~jmf%@Bbp
zDHKSizGed#q{=!Ebc)Y;LEz1U&(yepyEgy-V`uTV82A6On*?y7luYQU+T|LIY+2$B
zNA;1hsqmq_=Xaw-|1-IKcSe2{bYZ*&s4!44=G_N2Wcyd}F^W!^M?jbq=8T!Dr(Gx*
zp`2bp^0A4hf>^tW_gd(>)HtzLe4eRa08H+Fp^eiY+Y
z=R^$d@;y-dj1riJFGE@@aS&bh%ZZ&Q;?E@}{J5Zgz6~_5D84_*ZUN^c
zn*VDfeNRSLty~)8xAk
zy)RP|a?Bhq75gQocJOdaolR`9KGs_Ed6*_i!&|9U-mI-No&);mh&X@lgX>=pgp^~D
zm{Q`rDiCNz=x%KId+M|NcyL&{{k+NPtC?YZ_a`3ysk5;yJ+--BG9^d85km#K<@U6&
zt;-ZJ1rI6~mgsbowQ^S{M@kuWRaEAe)iocLpMqG_0DTUS7(!Tw9>vA&Qg;8GQL0=m
z{`3&kc&x@iy~^PMGubXaAd?+wu;+xO{>+`o!D4;y1aGHp>rwNryLW6xgmjMA2&k!6
z3+m0PqmSk~e}>(9?bf*LVyVGqgL}#g3Non)sqkf|RT^e@{u{?>>LC%%HC|&-!7BS`p90`BTSjvwFrp-@;MHAWvl*
zK6dp!=EAV*&$pVf7Vb>!CT*H#IUMHOFZvH|r4VD>bb={FA@ZFomO7AlUUvp#5rGA=gCh9x3DUJfvNw
z*QLooBslXs5(JCQgu>L(2dRg?rMKb|4159uuV6@5W6u_^gKlbBR$}lqC3Yln#gIlC
z7f1-QUWr1t5ZdJ`H59MoZtGNr)B`5FyJ4tV?nvxafJ-USS4*sgegZ5n|L&15!16Oj
z7ec^0W>=c@c=?l$+(cjdY8Wf=@#t)Etk#=beIT<96C1@5cl`o%ju;Qv<(vQBWlBK7
zi{Vm_`8s9#$_Lx7vg>VK2Vc@UcuvWT4{asmGn=JOY6_V4)uckI;M&`xN9Pp43^oa!
z^cIp?j(0<5JQd>(-fwPNxX1_gAIaGS-`7y(8xkZXMqxJ{lu
zigMLY^2ypP6yq!W>h*ox5*4R>jgQZEV2S6}Cub@k402xHy0N}X5?A%D@q7NSPaOwN
z4P##GmgO*dDunKOI3hvvyAut#g+Yc)F4>^E@eXPzwGB&Vf%MSf%A2`0VSpQYtU?
zpqZov^)bA2b