Repository: r5py/r5py (language: python)

Issue:
Handling of `r5_classpath` config option is unintuitive
In the current implementation, if the user does not configure `r5_classpath`, r5py would 1) use `/usr/share/java/r5/r5-all.jar` if it exists, 2) use a cached copy of the current r5py version’s R5 Jar, if it exists (and check its sha256 digest), 3) download the R5 Jar (and check its digest), in this order

I think the default value of `r5_classpath` should be `None`, or an empty string, and the logic should be: if `r5_classpath is None`: continue with steps 2) and 3) from above, else, try to use the Jar or directory referenced by the path in `r5_classpath` 




Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index d0dc31bd..fee35fb5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-<img class="r5py_logo" align="right" src="https://github.com/r5py/r5py/raw/main/docs/_static/r5py_blue.svg" alt="r5py logo" style="width:180px; max-width:30vW;">
+<img class="r5py_logo" align="right" src="https://github.com/r5py/r5py/raw/main/docs/_static/images/r5py_blue.svg" alt="r5py logo" style="width:180px; max-width:30vW;">
 
 # r5py: Rapid Realistic Routing with R5 in Python
 
@@ -73,7 +73,7 @@ You can choose between the two depending on which license fits your project bett
 
 <!-- (1) badges -->
 [binder-badge]: https://img.shields.io/badge/Try%20r5py%20with-binder-F5A252.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAABZCAMAAABi1XidAAAB8lBMVEX///9XmsrmZYH1olJXmsr1olJXmsrmZYH1olJXmsr1olJXmsrmZYH1olL1olJXmsr1olJXmsrmZYH1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olJXmsrmZYH1olL1olL0nFf1olJXmsrmZYH1olJXmsq8dZb1olJXmsrmZYH1olJXmspXmspXmsr1olL1olJXmsrmZYH1olJXmsr1olL1olJXmsrmZYH1olL1olLeaIVXmsrmZYH1olL1olL1olJXmsrmZYH1olLna31Xmsr1olJXmsr1olJXmsrmZYH1olLqoVr1olJXmsr1olJXmsrmZYH1olL1olKkfaPobXvviGabgadXmsqThKuofKHmZ4Dobnr1olJXmsr1olJXmspXmsr1olJXmsrfZ4TuhWn1olL1olJXmsqBi7X1olJXmspZmslbmMhbmsdemsVfl8ZgmsNim8Jpk8F0m7R4m7F5nLB6jbh7jbiDirOEibOGnKaMhq+PnaCVg6qWg6qegKaff6WhnpKofKGtnomxeZy3noG6dZi+n3vCcpPDcpPGn3bLb4/Mb47UbIrVa4rYoGjdaIbeaIXhoWHmZYHobXvpcHjqdHXreHLroVrsfG/uhGnuh2bwj2Hxk17yl1vzmljzm1j0nlX1olL3AJXWAAAAbXRSTlMAEBAQHx8gICAuLjAwMDw9PUBAQEpQUFBXV1hgYGBkcHBwcXl8gICAgoiIkJCQlJicnJ2goKCmqK+wsLC4usDAwMjP0NDQ1NbW3Nzg4ODi5+3v8PDw8/T09PX29vb39/f5+fr7+/z8/Pz9/v7+zczCxgAABC5JREFUeAHN1ul3k0UUBvCb1CTVpmpaitAGSLSpSuKCLWpbTKNJFGlcSMAFF63iUmRccNG6gLbuxkXU66JAUef/9LSpmXnyLr3T5AO/rzl5zj137p136BISy44fKJXuGN/d19PUfYeO67Znqtf2KH33Id1psXoFdW30sPZ1sMvs2D060AHqws4FHeJojLZqnw53cmfvg+XR8mC0OEjuxrXEkX5ydeVJLVIlV0e10PXk5k7dYeHu7Cj1j+49uKg7uLU61tGLw1lq27ugQYlclHC4bgv7VQ+TAyj5Zc/UjsPvs1sd5cWryWObtvWT2EPa4rtnWW3JkpjggEpbOsPr7F7EyNewtpBIslA7p43HCsnwooXTEc3UmPmCNn5lrqTJxy6nRmcavGZVt/3Da2pD5NHvsOHJCrdc1G2r3DITpU7yic7w/7Rxnjc0kt5GC4djiv2Sz3Fb2iEZg41/ddsFDoyuYrIkmFehz0HR2thPgQqMyQYb2OtB0WxsZ3BeG3+wpRb1vzl2UYBog8FfGhttFKjtAclnZYrRo9ryG9uG/FZQU4AEg8ZE9LjGMzTmqKXPLnlWVnIlQQTvxJf8ip7VgjZjyVPrjw1te5otM7RmP7xm+sK2Gv9I8Gi++BRbEkR9EBw8zRUcKxwp73xkaLiqQb+kGduJTNHG72zcW9LoJgqQxpP3/Tj//c3yB0tqzaml05/+orHLksVO+95kX7/7qgJvnjlrfr2Ggsyx0eoy9uPzN5SPd86aXggOsEKW2Prz7du3VID3/tzs/sSRs2w7ovVHKtjrX2pd7ZMlTxAYfBAL9jiDwfLkq55Tm7ifhMlTGPyCAs7RFRhn47JnlcB9RM5T97ASuZXIcVNuUDIndpDbdsfrqsOppeXl5Y+XVKdjFCTh+zGaVuj0d9zy05PPK3QzBamxdwtTCrzyg/2Rvf2EstUjordGwa/kx9mSJLr8mLLtCW8HHGJc2R5hS219IiF6PnTusOqcMl57gm0Z8kanKMAQg0qSyuZfn7zItsbGyO9QlnxY0eCuD1XL2ys/MsrQhltE7Ug0uFOzufJFE2PxBo/YAx8XPPdDwWN0MrDRYIZF0mSMKCNHgaIVFoBbNoLJ7tEQDKxGF0kcLQimojCZopv0OkNOyWCCg9XMVAi7ARJzQdM2QUh0gmBozjc3Skg6dSBRqDGYSUOu66Zg+I2fNZs/M3/f/Grl/XnyF1Gw3VKCez0PN5IUfFLqvgUN4C0qNqYs5YhPL+aVZYDE4IpUk57oSFnJm4FyCqqOE0jhY2SMyLFoo56zyo6becOS5UVDdj7Vih0zp+tcMhwRpBeLyqtIjlJKAIZSbI8SGSF3k0pA3mR5tHuwPFoa7N7reoq2bqCsAk1HqCu5uvI1n6JuRXI+S1Mco54YmYTwcn6Aeic+kssXi8XpXC4V3t7/ADuTNKaQJdScAAAAAElFTkSuQmCC
-[binder-link]: https://notebooks.gesis.org/binder/v2/gh/r5py/r5py/stable?urlpath=lab/tree/docs/notebooks/basic-usage.ipynb
+[binder-link]: https://notebooks.gesis.org/binder/v2/gh/r5py/r5py/stable?urlpath=tree/docs/user-guide/user-manual/quickstart.md
 [build-status-badge]: https://github.com/r5py/r5py/actions/workflows/build-merged-pull-requests.yml/badge.svg
 [build-status-link]: https://github.com/r5py/r5py/actions/workflows/build-merged-pull-requests.yml
 [coverage-badge]: https://codecov.io/gh/r5py/r5py/branch/main/graph/badge.svg?token=WG8RBMZBK6
diff --git a/ci/python_310.yaml b/ci/python_310.yaml
index 6883cd69..f9714728 100644
--- a/ci/python_310.yaml
+++ b/ci/python_310.yaml
@@ -9,6 +9,7 @@ dependencies:
     - filelock
     - fiona
     - geopandas
+    - importlib_resources
     - joblib
     - jpype1
     - numpy
diff --git a/ci/python_311_dev.yaml b/ci/python_311_dev.yaml
index 966ce102..6a5cbbcc 100644
--- a/ci/python_311_dev.yaml
+++ b/ci/python_311_dev.yaml
@@ -33,6 +33,7 @@ dependencies:
     - nbsphinx
     - nbstripout
     - openjdk
+    - pybtex-apa7-style
     - pytest
     - pytest-asyncio
     - pytest-cov
diff --git a/ci/python_38.yaml b/ci/python_38.yaml
index 44caf19c..1a05a47a 100644
--- a/ci/python_38.yaml
+++ b/ci/python_38.yaml
@@ -9,6 +9,7 @@ dependencies:
     - filelock
     - fiona
     - geopandas
+    - importlib_resources
     - joblib
     - jpype1
     - numpy
diff --git a/ci/python_39.yaml b/ci/python_39.yaml
index 9b32641a..e15c5664 100644
--- a/ci/python_39.yaml
+++ b/ci/python_39.yaml
@@ -9,6 +9,7 @@ dependencies:
     - filelock
     - fiona
     - geopandas
+    - importlib_resources
     - joblib
     - jpype1
     - numpy
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
deleted file mode 100644
index aa79c954..00000000
--- a/docs/CONTRIBUTING.md
+++ /dev/null
@@ -1,199 +0,0 @@
-# Contributing to r5py
-
-Contributions of any kind to r5py are more than welcome. That does not mean
-new code only, but also improvements of documentation and user guide, additional
-tests (ideally filling the gaps in existing suite) or a bug report. In addition, we
-warmly welcome ideas of new features that could be added to the r5py, 
-or ideas how to improve the existing codebase.
-
-All contributions should go through our GitHub repository. Bug reports, ideas or
-even questions should be raised by opening an issue on the GitHub tracker.
-Suggestions for changes in code or documentation should be submitted as a pull
-request. However, if you are not sure what to do, feel free to open an issue.
-All discussion will then take place on GitHub to keep the development of
-r5py transparent.
-
-If you decide to contribute to the codebase, ensure that you are using an
-up-to-date `main` branch. The latest development version will always be there,
-including the documentation (powered by [sphinx](https://www.sphinx-doc.org/)).
-
-## Seven Steps for Contributing
-
-There are seven basic steps to contributing to r5py:
-
-1. Fork the r5py git repository
-2. Create a development environment with r5py dependencies
-3. Make a development build of r5py
-4. Make changes to code and add tests
-5. Update the documentation
-6. Format code
-7. Submit a Pull Request
-
-Each of the steps is detailed below.
-
-### 1. Fork the r5py git repository
-
-Git can be complicated for new users, but you no longer need to use command line
-to work with git. If you are not familiar with git, we recommend using tools on
-Github.com, GitHub Desktop or tools with included git like Atom or PyCharm. However, if you
-want to use command line, you can fork r5py repository using following:
-
-    git clone git@github.com:your-user-name/r5py.git r5py-yourname
-    cd r5py-yourname
-    git remote add upstream git://github.com/r5py/r5py.git
-
-This creates the directory `r5py-yourname` and connects your repository to
-the upstream (main project) r5py repository.
-
-Then simply create a new branch of main branch.
-
-### 2. Create a development environment
-
-A development environment is a virtual space where you can keep an independent
-installation of r5py. This makes it easy to keep both a stable version of
-python in one place you use for work, and a development version (which you may
-break while playing with code) in another.
-
-An easy way to create a r5py development environment is as follows:
-
-- Install [MambaForge](https://github.com/conda-forge/miniforge#mambaforge) (or [install mamba using conda](https://r5py.readthedocs.io/en/latest/installation.html#install-mamba)) 
-- Make sure that you have **cloned the r5py repository**
-- `cd` to the *r5py* source directory (the root folder)
-
-Tell `mamba` to create a new environment from a [YAML file](https://github.com/r5py/r5py/blob/main/ci/python_311_dev.yaml) inside `ci` directory, by running:
-
-      mamba env create -f ci/python_311_dev.yaml
-
-This will create a new environment called `r5py`, and not touch any of your existing environments,
-nor existing python installations. The environment includes all necessary dependencies for r5py, 
-as well as optional packages for running tests and building docs. 
-With this environment, you can directly start working with r5py.  
-
-To work in this environment, you should `activate` it as follows:
-
-      conda activate r5py
-
-You will then see a confirmation message to indicate you are in the new development environment.
-
-To view your environments:
-
-      conda info -e
-
-To return to you home root environment::
-
-      deactivate
-
-See the full conda docs [here](http://conda.pydata.org/docs).
-
-### 3. Making a development build
-
-Once dependencies are in place, make an in-place build by navigating to the git
-clone of the *r5py* repository and run:
-
-    pip install .
-
-This will install r5py from the source into your environment.
-
-### 4. Making changes and writing tests
-
-*r5py* is serious about testing and strongly encourages contributors to embrace
-[test-driven development (TDD)](http://en.wikipedia.org/wiki/Test-driven_development).
-This development process "relies on the repetition of a very short development cycle:
-first the developer writes an (initially failing) automated test case that defines a desired
-improvement or new function, then produces the minimum amount of code to pass that test."
-So, before actually writing any code, you should write your tests. Often the test can be
-taken from the original GitHub issue. However, it is always worth considering additional
-use cases and writing corresponding tests.
-
-*r5py* uses the [pytest testing system](http://doc.pytest.org/en/latest).
-
-### Writing tests
-
-All tests should go into the `tests` directory. This folder contains many
-current examples of tests, and we suggest looking to these for inspiration.
-
-#### Running the test suite
-
-The tests can then be run directly inside your Git clone without having to
-install *r5py*. Run the tests by typing (`v` means *verbose*):
-
-    pytest -v
-
-### 5. Updating the Documentation and User Guide
-
-*r5py* documentation resides in the `docs` folder. Changes to the docs are
-make by modifying the appropriate file within `docs`.
-*r5py* docs use a combination of reStructuredText syntax [which is explained here](http://www.sphinx-doc.org/en/stable/rest.html#rst-primer), 
-Jupyter Notebooks ([read more here](https://docs.jupyter.org/en/latest)),
-and the docstrings follow the [Numpy Docstring standard](https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt).
-
-Once you have made your changes, you may try if they render correctly by building the docs using Sphinx 
-(comes with `r5py` environment if [installed from the YAML file](#2-create-a-development-environment)).
-To do so, you can navigate to the docs folder and type:
-
-    make html
-
-The resulting html pages will be located in `docs/_build/html/`. 
-
-For minor updates, you can skip whole make html part as reStructuredText syntax is
-usually quite straightforward.
-
-#### Updating User Guide
-
-Updating user guide might be slightly more complicated as it
-consists of collection of reStructuredText files and Jupyter notebooks.
-Changes in reStructuredText are straightforward, changes in notebooks should be done using Jupyter. 
-Once pushing changes, make sure that all the cells are **without outputs** as notebooks
-are executed by readthedocs.
-
-### 6. Formatting the code
-
-#### Python (PEP8 / black)
-
-*r5py* follows the [PEP8](http://www.python.org/dev/peps/pep-0008) standard
-and uses [Black](https://black.readthedocs.io/en/stable/) to ensure a consistent code format throughout the project.
-
-CI will run `black --check` and fails if there are files which would be
-auto-formatted by `black`. Therefore, it is helpful before submitting code to
-auto-format your code::
-
-    black src
-
-Additionally, many editors have plugins that will apply `black` as you edit files.
-If you don't have black, you can install it using pip:
-
-    pip install black
-
-#### Import order, import of submodules
-
-**R5py** uses [jpype](https://jpype.readthedocs.io), with the help of which Java classes
-can be imported using normal `import` statements. As a consequence, the order of import
-statements at the beginning of source files plays a crucial role. 
-
-By convention, in r5py source files, the import statements should be grouped in the 
-following order:
-
-1. Imports of modules of the Python Standard Library
-2. Imports of third-party Python modules
-3. Relative imports of other r5py modules
-4. Imports of Java classes
-
-The modules of each group should be sorted alphabetically, the groups be separated by an
-empty line.
-
-The import of submodules (`from ... import ...`), as well as the use of aliases for
-imported modules (`import ... as ...`) are discouraged. An exception to this rule,
-assets from other modules from within r5py should always be imported as submodules
-(`from . import TravelTimeMatrixComputer`).
-
-
-### 7. Submitting a Pull Request
-
-Once you've made changes and pushed them to your forked repository, you then
-submit a pull request to have them integrated into the *r5py* code base.
-
-You can find a pull request (or PR) tutorial in the [GitHub's Help Docs](https://help.github.com/articles/using-pull-requests).
-
-### References
-
-These contribution guidelines are largely based on [pyrosm](https://pyrosm.readthedocs.io/en/latest/) and [momepy](http://docs.momepy.org/en/stable/) -libraries.
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb..00000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS    ?=
-SPHINXBUILD   ?= sphinx-build
-SOURCEDIR     = .
-BUILDDIR      = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
-	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
-	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_extensions/bibliography_as_sphinxdesign_cards/__init__.py b/docs/_extensions/bibliography_as_sphinxdesign_cards/__init__.py
new file mode 100644
index 00000000..770e947a
--- /dev/null
+++ b/docs/_extensions/bibliography_as_sphinxdesign_cards/__init__.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+
+"""Modify the bibliography entries created by sphinxcontrib.bibtex to be sphinx-design cards."""
+
+# The default `:::{bibliography}` blocks are not very nicely formatted.
+# In the docutils tree, they look like this:
+#
+# <citation backrefs="id2" docname="user-guide/user-manual/travel-time-matrices" ids="fink-r5py-2022">
+#     <label support_smartquotes="False">
+#         Fink et al., 2022
+#     </label>
+#     <paragraph>
+#         Fink, C., Klumpenhouwer, W., Saraiva, M., Pereira, R., & Tenkanen, H.
+#         (2022 , September). <emphasis>r5py: Rapid Realistic Routing with R5 in
+#         Python</emphasis>.
+#         <reference refuri="https://doi.org/10.5281/ZENODO.7060437">
+#             DOI:10.5281/ZENODO.7060437
+#         </reference>
+#     </paragraph>
+# </citation>
+#
+# After experimenting with `sphinx-design`’s cards in the data-requirements.md
+# and also in early versions of the citations.md documents, I started to like
+# their look also for the references: They are prominent, cleanly formatted, and
+# can be clicked as a whole.
+#
+# In the docutil tree, they would look like this:
+#
+# <container classes="sd-card sd-sphinx-override sd-mb-3 sd-shadow-sm sd-card-hover" design_component="card" is_div="True">
+#     <container classes="sd-card-body" design_component="card-body" is_div="True">
+#         <paragraph classes="sd-card-text">
+#             Fink, C., Klumpenhouwer, W., Saraiva, M., Pereira, R., & Tenkanen,
+#             H., 2022: <emphasis>r5py: Rapid Realistic Routing with R⁵ in Python</emphasis>.
+#             <reference refuri="https://doi.org/10.5281/zenodo.7060437">
+#                   DOI:10.5281/zenodo.7060437
+#             </reference>
+#         </paragraph>
+#     </container>
+#     <PassthroughTextElement>
+#         <reference classes="['sd-stretched-link']" refuri="https://doi.org/10.5281/zenodo.7060437"/>
+#     </PassthroughTextElement>
+# </container>
+#
+# This sphinx extension triggers at a very late stage of running sphinx,
+# searches for all <citations>, and converts them from the above subtree
+# to the below format
+# It uses the sphinx.transforms.post_transform hook, see
+# https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx-core-events
+
+
+import docutils.nodes
+import sphinx.transforms.post_transforms
+import sphinx_design.shared
+
+
+__version__ = "0.0.1"
+
+
+class CitationsToSphinxDesignCardsTransformer(
+    sphinx.transforms.post_transforms.SphinxPostTransform
+):
+    default_priority = (
+        198  # before anything from sphinx_design, but after sphinxcontrib.bibtex
+    )
+
+    def apply(self, **kwargs):
+        for node in self.document.findall(docutils.nodes.citation):
+            self.handle(node)
+
+    def handle(self, node):
+        new_node = self._create_empty_sdcard_container()
+        for attribute in ["backrefs", "docname", "ids"]:
+            new_node[attribute] = node[attribute]
+
+        # paragraph (first child of first child), see _create_empty...()
+        new_paragraph = new_node[0][0]
+        old_paragraph = node[node.first_child_matching_class(docutils.nodes.paragraph)]
+        new_paragraph.children = old_paragraph.children
+
+        # convert <tt> (docutils.nodes.literal) into more nicely formatted titles
+        # (see also format_title() in ../_helpers/citation_style.py)
+        for tt in new_paragraph.findall(docutils.nodes.literal):
+            span = docutils.nodes.inline(classes=["article-title"])
+            span += tt.children
+            new_paragraph.replace(tt, span)
+
+        if r := new_paragraph.first_child_matching_class(docutils.nodes.reference):
+            old_reference = new_paragraph[r]
+            new_reference = sphinx_design.shared.PassthroughTextElement()
+            new_reference += docutils.nodes.reference(
+                classes=["sd-stretched-link"],
+                refuri=old_reference["refuri"],
+            )
+            new_node += new_reference
+
+        # node.replace_self(new_node)  # <- does not work - why?
+        node.parent.replace(node, new_node)
+
+    @staticmethod
+    def _create_empty_sdcard_container():
+        container = docutils.nodes.container(
+            classes=[
+                "sd-card",
+                "sd-sphinx-override",
+                "sd-mb-3",
+                "sd-shadow-sm",
+                "sd-card-hover",
+            ],
+            design_component="card",
+            is_div="True",
+        )
+        container += docutils.nodes.container(
+            classes=["sd-card-body"],
+            design_component="card-body",
+            is_div="True",
+        )
+        container[0] += docutils.nodes.paragraph(
+            classes=["sd-card-text"],
+        )
+        return container
+
+
+def setup(app):
+    """
+    Register extension with sphinx.
+
+    This is a callback function called by sphinx when it loads the extension.
+    """
+    app.add_post_transform(CitationsToSphinxDesignCardsTransformer)
+
+    return {
+        "parallel_read_safe": True,
+        "parallel_write_safe": False,  # not sure, but let’s err on the safe side
+    }
diff --git a/docs/_extensions/bibliography_as_sphinxdesign_cards/__main__.py b/docs/_extensions/bibliography_as_sphinxdesign_cards/__main__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/_helpers/binder_ref.py b/docs/_helpers/binder_ref.py
new file mode 100644
index 00000000..71472345
--- /dev/null
+++ b/docs/_helpers/binder_ref.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+
+"""Find a Git reference (branch/commit) to open in Binder."""
+
+# if we are building a stable version,
+# point the binder link to branch `stable`,
+# otherwise, point to branch `main`
+
+
+import git
+import os
+
+
+__all__ = ["BINDER_REF"]
+
+
+def get_binder_ref():
+    try:
+        READTHEDOCS_VERSION = os.environ["READTHEDOCS_VERSION"]
+    except KeyError:  # not running on RTD
+        READTHEDOCS_VERSION = ""
+
+    if READTHEDOCS_VERSION == "stable":
+        binder_ref = "stable"  # stable is synced with last version tag/release
+    elif READTHEDOCS_VERSION == "latest":
+        binder_ref = "main"
+    else:
+        repository = git.Repo(search_parent_directories=True)
+        binder_ref = repository.git.rev_parse(repository.head.commit.hexsha, short=True)
+    return binder_ref
+
+
+BINDER_REF = get_binder_ref()
diff --git a/docs/_helpers/citation_style.py b/docs/_helpers/citation_style.py
new file mode 100644
index 00000000..a17061a9
--- /dev/null
+++ b/docs/_helpers/citation_style.py
@@ -0,0 +1,219 @@
+#!/usr/bin/env python3
+
+
+"""Modify sphinxcontrib.bibtex so that the reference style is closer to what’s used in transport geography."""
+
+
+# The modifications below change two different parts of how citations are
+# formatted by sphinxcontrib.bibtex.
+#
+# On the one hand, the format of citations (in the text) is governed by
+# sphinxcontrib.bibtex’s own `sphinxcontrib.bibtex.style.referencing`,
+# see its documentation, here:
+# https://sphinxcontrib-bibtex.readthedocs.io/en/2.5.0/usage.html#custom-inline-citation-references
+#
+# On the other hand, the format of bibliographies (lists of references, inserted,
+# for instance, on the bottom of a page, using `:::{bibliography}` markup) is
+# defined in pybtex.style.formatting classes (see also sphinxcontrib-bibtex’
+# documentation:
+# https://sphinxcontrib-bibtex.readthedocs.io/en/2.5.0/usage.html#custom-formatting-sorting-and-labelling
+#
+# There is an almost-perfect APA style implemented in `pybtex-apa7-style`;
+# however, (1) it does not add DOIs to entries referring to bibtex’ @misc categories,
+# which includes Zenodo software packages. It would be nice, if people could
+# actually see the reference we ask them to cite. Also, (2) it uses the default
+# sphinxcontrib-bibtex formatting of the inline citations, which means it uses
+# (a) brackets around the publication year, and (b) makes _only_ the year clickable.
+#
+# That’s why, below, I first define two custom names for our citation and reference
+# styles (these are then imported by `conf.py`), and then create (I) a pybtex.BaseStyle
+# to define the format of the bibliography entries, and (II) a custom
+# sphinxcontrib.bibtex.ReferenceStyle that substitutes brackets with parentheses and
+# formats the entire citation as a link.
+
+
+import dataclasses
+import typing
+
+import pybtex.plugin
+import pybtex.richtext
+import pybtex.style.formatting
+import pybtex.style.template
+import sphinxcontrib.bibtex.style.referencing
+import sphinxcontrib.bibtex.style.referencing.author_year
+import sphinxcontrib.bibtex.style.referencing.basic_author_year
+import sphinxcontrib.bibtex.style.referencing.extra_author
+import sphinxcontrib.bibtex.style.referencing.extra_empty
+import sphinxcontrib.bibtex.style.referencing.extra_label
+import sphinxcontrib.bibtex.style.referencing.extra_year
+import sphinxcontrib.bibtex.style.template
+
+
+__all__ = ["R5PY_CITATION_STYLE", "R5PY_REFERENCE_STYLE"]
+
+
+# Define (custom) names for the styles we create below
+R5PY_CITATION_STYLE = "apa7_with_doi_for_misc"
+R5PY_REFERENCE_STYLE = "author_year_apa7_full_link"
+
+
+# -----------------------------------------------------------
+# (I) custom pybtex style for the bibliography/reference list
+# -----------------------------------------------------------
+
+
+# Use APA style, provided upstream by https://github.com/cproctor/pybtex-apa7-style,
+# and modify it to output DOIs for @misc entries (e.g., our Zenodo link)
+class ApaMiscDoiStyle(pybtex.plugin.find_plugin("pybtex.style.formatting", "apa7")):
+    name = R5PY_CITATION_STYLE
+
+    def format_date(self, e):
+        return pybtex.style.template.join[
+            "(",
+            pybtex.style.template.first_of[
+                pybtex.style.template.optional[pybtex.style.template.field("year")],
+                "n.d.",
+            ],
+            "):",
+        ]
+
+    def format_doi(self, e):
+        return pybtex.style.template.href[
+            pybtex.style.template.join[
+                "https://doi.org/", pybtex.style.template.field("doi", raw=True)
+            ],
+            pybtex.style.template.join[
+                "DOI:", pybtex.style.template.field("doi", raw=True)
+            ],
+        ]
+
+    def format_title(self, e, which_field, as_sentence=True):
+        formatted_title = pybtex.style.template.tag("tt")[
+            pybtex.style.template.field(
+                which_field, apply_func=lambda text: text.capitalize()
+            )
+        ]
+        if as_sentence:
+            return pybtex.style.template.sentence[formatted_title]
+        else:
+            return formatted_title
+
+    def get_misc_template(self, e):
+        if "author" in e.persons:
+            return pybtex.style.formatting.toplevel[
+                self.format_names("author"),
+                self.format_date(e),
+                pybtex.style.template.optional[self.format_title(e, "title")],
+                pybtex.style.template.sentence[
+                    pybtex.style.template.optional_field("note")
+                ],
+                self.format_web_refs(e),
+            ]
+        else:
+            return pybtex.style.formatting.toplevel[
+                pybtex.style.template.optional[self.format_btitle(e, "title")],
+                self.format_date(e),
+                pybtex.style.template.sentence[
+                    pybtex.style.template.optional_field("note")
+                ],
+                self.format_web_refs(e),
+            ]
+
+
+# Register this custom Style as a pybtex plugin
+pybtex.plugin.register_plugin(
+    "pybtex.style.formatting", R5PY_CITATION_STYLE, ApaMiscDoiStyle
+)
+
+
+# -----------------------------------------------------------
+# (II) custom sphinxcontrib-bibtex style for inline citations
+# -----------------------------------------------------------
+
+
+# Change square brackets to round parentheses
+@dataclasses.dataclass
+class ParenthesisStyle(sphinxcontrib.bibtex.style.referencing.BracketStyle):
+    left: typing.Union["pybtex.richtext.BaseText", str] = "("
+    right: typing.Union["pybtex.richtext.BaseText", str] = ")"
+
+
+# Make entire reference text the link to the bibliography entry
+# (by default, only the year is clickable/blue)
+@dataclasses.dataclass
+class BasicAuthorYearTextualFullLinkReferenceStyle(
+    sphinxcontrib.bibtex.style.referencing.basic_author_year.BasicAuthorYearTextualReferenceStyle
+):
+    def inner(self, role_name: str) -> "pybtex.style.template.Node":
+        return sphinxcontrib.bibtex.style.template.reference[
+            sphinxcontrib.bibtex.style.template.join(sep=self.text_reference_sep)[
+                self.person.author_or_editor_or_title(full="s" in role_name),
+                sphinxcontrib.bibtex.style.template.join[
+                    self.bracket.left,
+                    sphinxcontrib.bibtex.style.template.year,
+                    self.bracket.right,
+                ],
+            ]
+        ]
+
+
+# Put the above changes together:
+# - parentheses instead of brackets
+# - fully clickable reference
+@dataclasses.dataclass
+class AuthorYearParenthesisFullLinkReferenceStyle(
+    sphinxcontrib.bibtex.style.referencing.author_year.AuthorYearReferenceStyle
+):
+    bracket_textual: sphinxcontrib.bibtex.style.referencing.BracketStyle = (
+        dataclasses.field(default_factory=ParenthesisStyle)
+    )
+    bracket_parenthetical: sphinxcontrib.bibtex.style.referencing.BracketStyle = (
+        dataclasses.field(default_factory=ParenthesisStyle)
+    )
+    bracket_author: sphinxcontrib.bibtex.style.referencing.BracketStyle = (
+        dataclasses.field(default_factory=ParenthesisStyle)
+    )
+    bracket_label: sphinxcontrib.bibtex.style.referencing.BracketStyle = (
+        dataclasses.field(default_factory=ParenthesisStyle)
+    )
+    bracket_year: sphinxcontrib.bibtex.style.referencing.BracketStyle = (
+        dataclasses.field(default_factory=ParenthesisStyle)
+    )
+
+    def __post_init__(self):
+        self.styles.extend(
+            [
+                sphinxcontrib.bibtex.style.referencing.basic_author_year.BasicAuthorYearParentheticalReferenceStyle(
+                    bracket=self.bracket_parenthetical,
+                    person=self.person,
+                    author_year_sep=self.author_year_sep,
+                ),
+                BasicAuthorYearTextualFullLinkReferenceStyle(  # <- our custom Style class
+                    bracket=self.bracket_textual,
+                    person=self.person,
+                    text_reference_sep=self.text_reference_sep,
+                ),
+                sphinxcontrib.bibtex.style.referencing.extra_author.ExtraAuthorReferenceStyle(
+                    bracket=self.bracket_author, person=self.person
+                ),
+                sphinxcontrib.bibtex.style.referencing.extra_label.ExtraLabelReferenceStyle(
+                    bracket=self.bracket_label
+                ),
+                sphinxcontrib.bibtex.style.referencing.extra_year.ExtraYearReferenceStyle(
+                    bracket=self.bracket_year
+                ),
+                sphinxcontrib.bibtex.style.referencing.extra_empty.ExtraEmptyReferenceStyle(),
+            ]
+        )
+
+        # initialise only the grandparent, not super() (self.styles would be extended twice)
+        sphinxcontrib.bibtex.style.referencing.GroupReferenceStyle.__post_init__(self)
+
+
+# Register this custom style with sphinxcontrib.bibtex,
+# using the name defined above
+sphinxcontrib.bibtex.plugin.register_plugin(
+    "sphinxcontrib.bibtex.style.referencing",
+    R5PY_REFERENCE_STYLE,
+    AuthorYearParenthesisFullLinkReferenceStyle,
+)
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
new file mode 100644
index 00000000..e8d6c249
--- /dev/null
+++ b/docs/_static/custom.css
@@ -0,0 +1,26 @@
+:root {
+  /* heading font sizes */
+  --pst-font-size-h1: 32px;
+  --pst-font-size-h2: 24px;
+  --pst-font-size-h3: 20px;
+  --pst-font-size-h4: 18px;
+  --pst-font-size-h5: 16px;
+  --pst-font-size-h6: 16px;
+}
+
+figcaption {
+    font-size: var(--sbt-font-size-small-1);
+}
+
+div.code-block-caption {
+  font-size: x-small;
+  color: var(--fbc-secondary-text);
+}
+
+span.article-title {
+    font-weight: 600;
+}
+
+img.logo__image {
+    padding: 5% 25% 20% 0;
+}
diff --git a/docs/data/Helsinki/GTFS.zip b/docs/_static/data/Helsinki/GTFS.zip
similarity index 100%
rename from docs/data/Helsinki/GTFS.zip
rename to docs/_static/data/Helsinki/GTFS.zip
diff --git a/docs/data/Helsinki/kantakaupunki.osm.pbf b/docs/_static/data/Helsinki/kantakaupunki.osm.pbf
similarity index 100%
rename from docs/data/Helsinki/kantakaupunki.osm.pbf
rename to docs/_static/data/Helsinki/kantakaupunki.osm.pbf
diff --git a/docs/data/Helsinki/population_grid_2020.gpkg b/docs/_static/data/Helsinki/population_grid_2020.gpkg
similarity index 100%
rename from docs/data/Helsinki/population_grid_2020.gpkg
rename to docs/_static/data/Helsinki/population_grid_2020.gpkg
diff --git a/docs/data/Helsinki/scripts/download_population_grid.py b/docs/_static/data/Helsinki/scripts/download_population_grid.py
similarity index 100%
rename from docs/data/Helsinki/scripts/download_population_grid.py
rename to docs/_static/data/Helsinki/scripts/download_population_grid.py
diff --git a/docs/data/README.md b/docs/_static/data/README.md
similarity index 97%
rename from docs/data/README.md
rename to docs/_static/data/README.md
index a37a37a8..ce1e5e0e 100644
--- a/docs/data/README.md
+++ b/docs/_static/data/README.md
@@ -26,7 +26,7 @@ We used [osmium](https://osmcode.org/osmium-tool/) to crop the data to the given
 
 ### `population_points_2020.gpkg`, `population_grid_2020.gpkg`
 
-A sample dataset distributed with the package representing populated points in Helsinki.
+A sample dataset representing the population of Helsinki.
 The data is obtained from Helsinki Region Environmental Services (HSY).
 The data is licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
 
diff --git "a/docs/data/S\303\243o Paulo/spo_gtfs.zip" "b/docs/_static/data/S\303\243o Paulo/spo_gtfs.zip"
similarity index 100%
rename from "docs/data/S\303\243o Paulo/spo_gtfs.zip"
rename to "docs/_static/data/S\303\243o Paulo/spo_gtfs.zip"
diff --git "a/docs/data/S\303\243o Paulo/spo_hexgrid.csv" "b/docs/_static/data/S\303\243o Paulo/spo_hexgrid.csv"
similarity index 100%
rename from "docs/data/S\303\243o Paulo/spo_hexgrid.csv"
rename to "docs/_static/data/S\303\243o Paulo/spo_hexgrid.csv"
diff --git "a/docs/_static/data/S\303\243o Paulo/spo_hexgrid_EPSG32723.gpkg.zip" "b/docs/_static/data/S\303\243o Paulo/spo_hexgrid_EPSG32723.gpkg.zip"
new file mode 100644
index 00000000..1fa87997
Binary files /dev/null and "b/docs/_static/data/S\303\243o Paulo/spo_hexgrid_EPSG32723.gpkg.zip" differ
diff --git "a/docs/data/S\303\243o Paulo/spo_osm.pbf" "b/docs/_static/data/S\303\243o Paulo/spo_osm.pbf"
similarity index 100%
rename from "docs/data/S\303\243o Paulo/spo_osm.pbf"
rename to "docs/_static/data/S\303\243o Paulo/spo_osm.pbf"
diff --git a/docs/_static/images/HowWellDoesPublicTransportWorkForSlowWalkers_1200x720px.png b/docs/_static/images/HowWellDoesPublicTransportWorkForSlowWalkers_1200x720px.png
new file mode 100644
index 00000000..bce175c5
Binary files /dev/null and b/docs/_static/images/HowWellDoesPublicTransportWorkForSlowWalkers_1200x720px.png differ
diff --git a/docs/_static/images/favicon.png b/docs/_static/images/favicon.png
new file mode 100644
index 00000000..d10d9541
Binary files /dev/null and b/docs/_static/images/favicon.png differ
diff --git a/docs/_static/images/favicon.svg b/docs/_static/images/favicon.svg
new file mode 100644
index 00000000..0207a9be
--- /dev/null
+++ b/docs/_static/images/favicon.svg
@@ -0,0 +1,601 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="32"
+   height="32"
+   viewBox="0 0 32 32"
+   version="1.1"
+   xml:space="preserve"
+   style="clip-rule:evenodd;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:1.5"
+   id="svg877"
+   sodipodi:docname="favicon.svg"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   inkscape:export-filename="favicon.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+   id="defs881">
+        
+    
+            
+            
+        
+                
+                
+                
+                
+                
+                
+                
+                
+                
+            
+                        
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                        
+                    
+                        
+                        
+                    </defs><sodipodi:namedview
+   id="namedview879"
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1.0"
+   inkscape:showpageshadow="2"
+   inkscape:pageopacity="0.0"
+   inkscape:pagecheckerboard="0"
+   inkscape:deskcolor="#d1d1d1"
+   showgrid="false"
+   inkscape:zoom="16.914082"
+   inkscape:cx="17.027232"
+   inkscape:cy="13.479892"
+   inkscape:window-width="2560"
+   inkscape:window-height="1371"
+   inkscape:window-x="0"
+   inkscape:window-y="0"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="main_paths"
+   showguides="true"><sodipodi:guide
+     position="114.13032,-274.52928"
+     orientation="0,-1"
+     id="guide4649"
+     inkscape:locked="false" /><sodipodi:guide
+     position="286.24227,-47.7432"
+     orientation="0,-1"
+     id="guide4651"
+     inkscape:locked="false" /><sodipodi:guide
+     position="113.49166,333.43986"
+     orientation="1,0"
+     id="guide4653"
+     inkscape:locked="false" /><sodipodi:guide
+     position="389.48855,-350.16052"
+     orientation="1,0"
+     id="guide4655"
+     inkscape:locked="false" /><sodipodi:guide
+     position="389.48855,-350.16052"
+     orientation="0,-1"
+     id="guide4657"
+     inkscape:locked="false" /><sodipodi:guide
+     position="286.24227,-47.7432"
+     orientation="1,0"
+     id="guide4659"
+     inkscape:locked="false" /><sodipodi:guide
+     position="0,0"
+     orientation="-0.70710678,0.70710678"
+     id="guide5879"
+     inkscape:locked="false"
+     inkscape:label=""
+     inkscape:color="rgb(0,134,229)" /></sodipodi:namedview>
+    <g
+   id="g395"
+   transform="matrix(0.01848481,0,0,0.01848491,-7.1988653,-15.272438)"
+   inkscape:label="background"
+   inkscape:groupmode="layer">
+                    <circle
+   cx="1255.0184"
+   cy="1691.782"
+   r="865.57086"
+   style="fill:#0d8bb1;stroke-width:3.80638"
+   id="circle263" />
+                    
+                    
+                </g><g
+   id="main_paths"
+   transform="matrix(0.94288745,0,0,0.9428925,-17651.735,-13.229458)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                <path
+   id="path726"
+   style="color:#000000;fill:#ffffff;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"
+   d="M 18739.46 14.105288 L 18737.583 24.742022 L 18732.401 23.828527 L 18733.391 18.214983 A 0.43746673 0.43746673 0 0 0 18733.035 17.707485 L 18728.488 16.905846 A 16.969057 16.969057 0 0 0 18727.527 17.624628 L 18732.45 18.494624 L 18731.537 23.677313 L 18723.4 22.24182 A 16.969057 16.969057 0 0 0 18722.452 23.998383 L 18724.662 24.38781 L 18723.835 29.069216 L 18721.107 28.588647 A 16.969057 16.969057 0 0 0 18720.971 30.490209 L 18723.508 30.937635 L 18722.595 36.120324 L 18721.689 35.960825 A 16.969057 16.969057 0 0 0 18722.046 36.913678 L 18722.87 37.058677 A 0.43742299 0.43742299 0 0 0 18723.069 37.042106 A 0.43742299 0.43742299 0 0 0 18723.112 37.029677 A 0.43742299 0.43742299 0 0 0 18723.27 36.917821 A 0.43742299 0.43742299 0 0 0 18723.293 36.888821 A 0.43742299 0.43742299 0 0 0 18723.38 36.702393 L 18724.368 31.09092 L 18736.098 33.158196 L 18735.185 38.340885 L 18729.569 37.350747 A 0.43742299 0.43742299 0 0 0 18729.414 37.35489 A 0.43742299 0.43742299 0 0 0 18729.368 37.36939 A 0.43742299 0.43742299 0 0 0 18729.267 37.414961 A 0.43742299 0.43742299 0 0 0 18729.227 37.441889 A 0.43742299 0.43742299 0 0 0 18729.153 37.520603 A 0.43742299 0.43742299 0 0 0 18729.12 37.566175 A 0.43742299 0.43742299 0 0 0 18729.064 37.707031 L 18727.984 43.82393 L 18726.537 43.569145 A 16.969057 16.969057 0 0 0 18727.976 44.710497 L 18728.264 44.762283 A 0.43746673 0.43746673 0 0 0 18728.772 44.40807 L 18729.851 38.2891 L 18735.034 39.200524 L 18733.592 47.382627 A 16.969057 16.969057 0 0 0 18735.446 47.786554 L 18738.13 32.555413 A 0.947465 0.947465 0 0 0 18738.13 32.553342 A 0.947465 0.947465 0 0 0 18738.13 32.55127 A 0.947465 0.947465 0 0 0 18738.13 32.549199 A 0.947465 0.947465 0 0 0 18738.13 32.547127 L 18739.12 26.937726 L 18743.789 27.760079 L 18740.256 47.801054 A 16.969057 16.969057 0 0 0 18742.25 47.376413 L 18743.431 40.675374 L 18749.494 41.680012 A 0.43742299 0.43742299 0 0 0 18749.995 41.317514 A 0.43742299 0.43742299 0 0 0 18749.637 40.81623 L 18743.582 39.813664 L 18745.693 27.836722 L 18751.122 27.03094 L 18754.223 35.612827 A 16.969057 16.969057 0 0 0 18754.571 34.005406 L 18752.005 26.900441 L 18754.279 26.562799 A 16.969057 16.969057 0 0 0 18753.67 24.73788 L 18752.454 24.918093 L 18752.811 22.896389 A 16.969057 16.969057 0 0 0 18752.125 21.750894 L 18751.543 25.054807 L 18744.92 26.036659 L 18739.45 25.071378 L 18741.335 14.382858 A 16.969057 16.969057 0 0 0 18739.46 14.105288 z M 18725.524 24.539023 L 18737.254 26.608371 L 18736.428 31.291848 L 18724.697 29.222501 L 18725.524 24.539023 z " /></g><g
+   inkscape:groupmode="layer"
+   id="layer1"
+   inkscape:label="paths"
+   style="clip-rule:evenodd;display:none;fill-rule:evenodd;stroke-linecap:square;stroke-miterlimit:1.5"><path
+     id="path4839"
+     style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3.23653;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
+     d="m -19.057916,-6.2225403 h -4.40204 v -3.58823 l -6.25026,0.0387 v 8.29063 h -3.88289 v 3.90402 h 10.34362 v 5.64646 h 4.48839"
+     sodipodi:nodetypes="ccccc" /></g><g
+   id="Origin"
+   transform="matrix(0.91109602,0,0,0.91110091,-441.04407,-1115.7948)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <ellipse
+   cx="559.28955"
+   cy="-1181.6154"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:1.64636"
+   id="circle759"
+   rx="3.793375"
+   ry="3.7933958"
+   transform="matrix(-0.70710868,0.70710488,-0.70710868,-0.70710488,0,0)" />
+                    
+                <ellipse
+   cx="484.75821"
+   cy="-1258.7692"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:1.64636"
+   id="ellipse5764"
+   rx="3.793375"
+   ry="3.7933958"
+   transform="matrix(-0.70710868,0.70710488,-0.70710868,-0.70710488,0,0)" /><ellipse
+   cx="486.60052"
+   cy="-1275.5369"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:1.64636"
+   id="ellipse5800"
+   rx="3.793375"
+   ry="3.7933958"
+   transform="matrix(-0.70710868,0.70710488,-0.70710868,-0.70710488,0,0)" /><ellipse
+   cx="567.81909"
+   cy="-1192.5837"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:1.64636"
+   id="ellipse454"
+   rx="3.793375"
+   ry="3.7933958"
+   transform="matrix(-0.70710868,0.70710488,-0.70710868,-0.70710488,0,0)" /></g><g
+   id="Destinations"
+   transform="matrix(0.35819826,0,0,0.35820018,-150.52041,-352.23226)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    
+                    <ellipse
+   cx="307.91736"
+   cy="-1013.6407"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:2.75698px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle840"
+   rx="4.8196425"
+   ry="4.8196688"
+   transform="matrix(-0.70710868,0.70710489,-0.70710868,-0.70710489,0,0)" />
+                    
+                    
+                    
+                <path
+   sodipodi:type="star"
+   style="fill:#0d8bb1;stroke:none;stroke-width:44.6679;stroke-linecap:butt;stroke-linejoin:miter;stop-color:#000000"
+   id="path4727"
+   inkscape:flatsided="true"
+   sodipodi:sides="3"
+   sodipodi:cx="231.2095"
+   sodipodi:cy="196.48665"
+   sodipodi:r1="80.002594"
+   sodipodi:r2="40.001297"
+   sodipodi:arg1="-0.52359878"
+   sodipodi:arg2="0.52359878"
+   inkscape:rounded="0"
+   inkscape:randomized="0"
+   d="M 300.49378,156.48535 231.2095,276.48924 161.92522,156.48535 Z"
+   transform="matrix(-0.09221907,0.15972728,-0.15972814,-0.09221859,311.2397,996.84941)"
+   inkscape:transform-center-y="1.3213454" /><ellipse
+   cx="559.05066"
+   cy="-924.67102"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:5.58349;stroke-linecap:round;stroke-linejoin:round"
+   id="ellipse5629"
+   rx="15.513384"
+   ry="15.513469"
+   transform="matrix(-0.70710868,0.70710489,-0.70710868,-0.70710489,0,0)" /><ellipse
+   cx="291.08542"
+   cy="-1053.1495"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:2.75698px;stroke-linecap:round;stroke-linejoin:round"
+   id="ellipse5633"
+   rx="4.8196425"
+   ry="4.8196688"
+   transform="matrix(-0.70710868,0.70710489,-0.70710868,-0.70710489,0,0)" /><ellipse
+   cx="274.79059"
+   cy="-1046.9596"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:2.75698px;stroke-linecap:round;stroke-linejoin:round"
+   id="ellipse5637"
+   rx="4.8196425"
+   ry="4.8196688"
+   transform="matrix(-0.70710868,0.70710489,-0.70710868,-0.70710489,0,0)" /><path
+   style="fill:none;stroke:#0d8bb1;stroke-width:5.58349;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+   d="m 258.53333,1008.2824 v -8.82778 h 40.04371"
+   id="path5881"
+   sodipodi:nodetypes="ccc" /><path
+   sodipodi:type="star"
+   style="fill:#0d8bb1;stroke:none;stroke-width:44.6679;stroke-linecap:butt;stroke-linejoin:miter;stop-color:#000000"
+   id="path456"
+   inkscape:flatsided="true"
+   sodipodi:sides="3"
+   sodipodi:cx="231.2095"
+   sodipodi:cy="196.48665"
+   sodipodi:r1="80.002594"
+   sodipodi:r2="40.001297"
+   sodipodi:arg1="-0.52359878"
+   sodipodi:arg2="0.52359878"
+   inkscape:rounded="0"
+   inkscape:randomized="0"
+   d="M 300.49378,156.48535 231.2095,276.48924 161.92522,156.48535 Z"
+   transform="matrix(0.17815358,-0.04773586,0.04773611,0.17815263,341.79021,969.17319)"
+   inkscape:transform-center-x="0.6839846"
+   inkscape:transform-center-y="0.68398428" /><path
+   style="fill:none;stroke:#0d8bb1;stroke-width:5.58349;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+   d="m 387.14365,998.3577 -16.24956,16.2494"
+   id="path458" /><path
+   sodipodi:type="star"
+   style="fill:#0d8bb1;stroke:none;stroke-width:44.6679;stroke-linecap:butt;stroke-linejoin:miter;stop-color:#000000"
+   id="path614"
+   inkscape:flatsided="true"
+   sodipodi:sides="3"
+   sodipodi:cx="231.2095"
+   sodipodi:cy="196.48665"
+   sodipodi:r1="80.002594"
+   sodipodi:r2="40.001297"
+   sodipodi:arg1="-0.52359878"
+   sodipodi:arg2="0.52359878"
+   inkscape:rounded="0"
+   inkscape:randomized="0"
+   d="M 300.49378,156.48535 231.2095,276.48924 161.92522,156.48535 Z"
+   transform="matrix(0.15972814,0.09221858,-0.09221908,0.15972728,435.77287,1054.5035)"
+   inkscape:transform-center-x="-1.3213475" /><path
+   sodipodi:type="star"
+   style="fill:#0d8bb1;stroke:none;stroke-width:44.6679;stroke-linecap:butt;stroke-linejoin:miter;stop-color:#000000"
+   id="path616"
+   inkscape:flatsided="true"
+   sodipodi:sides="3"
+   sodipodi:cx="231.2095"
+   sodipodi:cy="196.48665"
+   sodipodi:r1="80.002594"
+   sodipodi:r2="40.001297"
+   sodipodi:arg1="-0.52359878"
+   sodipodi:arg2="0.52359878"
+   inkscape:rounded="0"
+   inkscape:randomized="0"
+   d="M 300.49378,156.48535 231.2095,276.48924 161.92522,156.48535 Z"
+   transform="matrix(-0.17784569,-0.04887046,0.04887072,-0.17784473,319.1238,1087.0476)"
+   inkscape:transform-center-x="-9.6476318"
+   inkscape:transform-center-y="-3.6643862" /><path
+   style="fill:none;stroke:#0d8bb1;stroke-width:5.58349;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+   d="m 294.74506,1038.9402 7.91516,-2.0668"
+   id="path618"
+   inkscape:transform-center-x="-16.887066"
+   inkscape:transform-center-y="-4.7042189"
+   sodipodi:nodetypes="cc" /></g><g
+   id="Fast"
+   transform="matrix(0.42243909,0,0,0.42244135,5.7450796,-633.73354)"
+   inkscape:label="name"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <path
+   d="m 19.699578,1468.1654 0.9689,-3.6386 h 3.9353 l -0.1881,1.1915 h -2.7633 l -0.4747,1.5572 c 0.2932,-0.1846 0.6393,-0.2768 1.0383,-0.2768 0.6161,0 1.0934,0.2183 1.4311,0.655 0.338,0.4367 0.4805,1.0127 0.4276,1.7279 -0.04,0.4746 -0.1789,0.9014 -0.4177,1.2804 -0.2388,0.379 -0.553,0.6707 -0.9417,0.875 -0.3891,0.2044 -0.8175,0.3016 -1.2856,0.2917 -0.4052,0 -0.7737,-0.096 -1.1048,-0.2793 -0.3314,-0.1829 -0.5893,-0.435 -0.7737,-0.7564 -0.1845,-0.3214 -0.2785,-0.6798 -0.2818,-1.0752 h 1.3693 c 0.013,0.2933 0.094,0.5231 0.2425,0.6896 0.1481,0.1664 0.3494,0.2529 0.6029,0.2595 0.3296,0.01 0.6007,-0.1104 0.8135,-0.3608 0.2123,-0.2506 0.3402,-0.5867 0.3832,-1.0086 0.039,-0.3757 -0.018,-0.6723 -0.1709,-0.8899 -0.1532,-0.2175 -0.3865,-0.3295 -0.6995,-0.3361 -0.3494,-0.01 -0.6724,0.1219 -0.9689,0.3856 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.20869px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path857" />
+                    <path
+   d="m 13.188478,1473.5059 h -2.0459 l -0.7993,4.5824 H 7.8238779 l 2.175,-12.5178 4.1442001,0.01 c 1.3872,0 2.4548,0.3267 3.2024,0.98 0.7482,0.6535 1.0792,1.562 0.9929,2.7255 -0.1201,1.7194 -1.037,2.9145 -2.7506,3.5851 l 1.7622,5.081 v 0.1376 h -2.6823 z m -1.6849,-2.0892 1.8741,0.017 c 0.6651,-0.011 1.214,-0.1906 1.6465,-0.5373 0.4326,-0.3468 0.692,-0.8182 0.7783,-1.4143 0.08,-0.556 -0.01,-0.9916 -0.2665,-1.3068 -0.2581,-0.3153 -0.6677,-0.4843 -1.2293,-0.5073 l -2.1494,-0.01 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.208297px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path861" />
+                    <path
+   d="m 32.783078,1473.4559 c -0.1202,0.9759 -0.3757,1.8426 -0.7661,2.6003 -0.3904,0.7578 -0.8754,1.3203 -1.4549,1.6877 -0.5802,0.3674 -1.223,0.5424 -1.929,0.5252 -0.9009,-0.023 -1.6127,-0.3588 -2.1354,-1.0074 l -0.8523,4.4085 h -2.428 l 2.2299,-12.8984 2.2389,-0.01 -0.1636,0.9386 c 0.6716,-0.7577 1.4638,-1.1251 2.3763,-1.1021 0.913,0.023 1.6216,0.3544 2.127,0.9945 0.5048,0.64 0.7744,1.5082 0.8089,2.6046 0.012,0.3559 -0.01,0.7749 -0.052,1.2571 z m -2.4108,-0.1808 0.052,-0.8266 c 0.012,-0.5568 -0.09,-0.9988 -0.3054,-1.326 -0.2154,-0.3272 -0.5297,-0.4966 -0.9431,-0.508 -0.7061,-0.023 -1.2888,0.2755 -1.7482,0.8954 l -0.6971,3.8403 c 0.2122,0.5798 0.669,0.8811 1.3693,0.9041 0.5853,0.017 1.0734,-0.2095 1.4638,-0.6802 0.3898,-0.4707 0.66,-1.2371 0.8089,-2.299 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.208297px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path865" /><path
+   d="m 37.407078,1474.5408 2.6606,-5.769 h 2.7034 l -5.4502,10.72 c -0.3904,0.8208 -0.8479,1.4236 -1.3731,1.8082 -0.5252,0.3846 -1.1322,0.5769 -1.821,0.5769 -0.2697,0 -0.6601,-0.06 -1.1712,-0.1809 l 0.1808,-1.8943 0.3355,0.017 c 0.7923,0.023 1.3724,-0.2669 1.7398,-0.8696 l 0.5335,-0.9902 -1.5239,-9.1873 h 2.5143 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.208297px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path867" />
+                </g>
+</svg>
diff --git a/docs/_static/r5py_black.svg b/docs/_static/images/r5py_black.svg
similarity index 100%
rename from docs/_static/r5py_black.svg
rename to docs/_static/images/r5py_black.svg
diff --git a/docs/_static/images/r5py_blue.svg b/docs/_static/images/r5py_blue.svg
new file mode 100644
index 00000000..f6e6e1fb
--- /dev/null
+++ b/docs/_static/images/r5py_blue.svg
@@ -0,0 +1,1046 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="100%"
+   height="100%"
+   viewBox="0 0 530 530"
+   version="1.1"
+   xml:space="preserve"
+   style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-miterlimit:1.5;"
+   id="svg877"
+   sodipodi:docname="r5py_blue.svg"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+   id="defs881">
+        
+    
+            
+            
+        
+                
+                
+                
+                
+                
+                
+                
+                
+                
+            
+                        
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                        
+                    
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                            
+                        
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                                
+                            
+                        
+                    
+                        
+                        
+                    </defs><sodipodi:namedview
+   id="namedview879"
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1.0"
+   inkscape:showpageshadow="2"
+   inkscape:pageopacity="0.0"
+   inkscape:pagecheckerboard="0"
+   inkscape:deskcolor="#d1d1d1"
+   showgrid="false"
+   inkscape:zoom="1.9867925"
+   inkscape:cx="265.25166"
+   inkscape:cy="265.25166"
+   inkscape:window-width="2560"
+   inkscape:window-height="1371"
+   inkscape:window-x="0"
+   inkscape:window-y="0"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="svg877" />
+    <g
+   id="g395"
+   transform="matrix(0.30603988,0,0,0.30604152,-119.10848,-252.75469)"
+   inkscape:label="background">
+                    <circle
+   cx="1255.0232"
+   cy="1691.782"
+   r="847.1145"
+   style="display:inline;fill:#ffffff;stroke:#000000;stroke-width:4.07787px"
+   id="circle269" /><circle
+   cx="1255.0232"
+   cy="1691.782"
+   r="806.35223"
+   style="fill:#0d8bb1;stroke-width:3.54597"
+   id="circle263" />
+                    
+                    
+                </g><g
+   id="grid"
+   transform="matrix(0.31528841,0.05559428,-0.05559398,0.31529009,-11.389787,-354.81433)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <path
+   d="m 1290.62,2125.98 h 303.87"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path397"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1299.45,2185.0351 h 294.87"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path399"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1367.87,2244.09 h 226.65"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path403"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 1465.09,2303.145 H 1592.5"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path407"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1182.3,2066.9249 h 412.19"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path411"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1082.76,2008.88 393.62,-1.01"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path415"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 961.398,1948.815 H 1476.38"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path419"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 971.721,1889.76 H 1476.38"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path423"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 983.823,1830.704 H 1476.38"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path427"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1017.9,1771.649 h 458.48"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path431"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1048.29,1712.594 h 428.09"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path435"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1074.97,1666.419 284.53,-6.33"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path439"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1003.937,1789.37 v 179.57"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path443"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1062.992,1687.15 v 315.91"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path447"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1122.047,1665.37 v 371.81"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path451"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 1181.102,1664.06 V 2071.3"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path455"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1240.157,1662.74 v 442.67"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path459"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1299.212,1661.43 v 542.21"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path463"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1358.267,1659.64 v 581.73"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path467"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1417.322,1712.6 v 560.33"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path471"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1476.378,1712.6 v 594.66"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path475"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1535.433,2066.93 v 236.22"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path479"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="m 1594.488,2066.93 v 236.94"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#666666;stroke-width:2.6px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path483"
+   transform="matrix(0.50024974,0.86588559,-0.86588557,0.50024977,2501.8735,-52.593108)" /><path
+   d="M 708.661,2125.98 H 1240.58"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path488" />
+                    <path
+   d="M 708.661,2185.0351 H 1240.58"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path490" />
+                    <path
+   d="M 885.827,2244.09 H 1240.58"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path494" />
+                    <path
+   d="M 944.979,2303.145 H 1242.13"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path498" />
+                    <path
+   d="m 1117.46,2362.2 h 123.85"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path502" />
+                    <path
+   d="m 1122.05,2420.416 147.87,-0.3"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path506" />
+                    <path
+   d="m 1122.05,2480.311 h 170.59"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path510" />
+                    <path
+   d="M 708.661,2066.9249 H 1297.88"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path514" />
+                    <path
+   d="M 826.772,2007.87 H 1240.58"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path518" />
+                    <path
+   d="M 826.772,1948.815 H 1299.21"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path522" />
+                    <path
+   d="M 825.138,1889.76 H 1298.56"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path526" />
+                    <path
+   d="M 824.107,1830.704 H 1299.15"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path530" />
+                    <path
+   d="m 825.101,1771.649 415.479,-0.47"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path534" />
+                    <path
+   d="M 885.827,1712.594 H 1653.54"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path538" />
+                    <path
+   d="M 885.827,1653.539 H 1653.54"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path542" />
+                    <path
+   d="M 885.827,1594.484 H 1417.6"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path546" />
+                    <path
+   d="m 1122.051,1533.75 h 177.16"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path550" />
+                    <path
+   d="m 708.661,2066.93 v 118.18"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path554" />
+                    <path
+   d="m 767.7161,2066.93 v 118.64"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path556" />
+                    <path
+   d="m 826.771,1772.21 v 414.81"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path560" />
+                    <path
+   d="m 885.826,1594.49 v 649.6"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path564" />
+                    <path
+   d="M 944.881,1594.49 V 2302.6"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path568" />
+                    <path
+   d="m 1003.937,1594.49 v 708.66"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path572" />
+                    <path
+   d="m 1062.992,1594.49 v 708.66"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path576" />
+                    <path
+   d="m 1122.047,1533.75 v 946.57"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path580" />
+                    <path
+   d="m 1181.102,1533.75 v 946.57"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path584" />
+                    <path
+   d="m 1240.157,1594.49 v 885.83"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path588" />
+                    <path
+   d="m 1299.212,1533.75 v 594.58"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path592" />
+                    <path
+   d="m 1358.267,1594.49 v 141.14"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path596" />
+                    <path
+   d="m 1417.322,1594.49 v 117.57"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path600" />
+                    <path
+   d="m 1476.378,1653.54 v 58.29"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path604" />
+                    <path
+   d="m 1535.433,1653.54 v 58.29"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path608" />
+                    <path
+   d="m 1594.488,1653.54 v 58.29"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path612" />
+                    <path
+   d="m 1653.543,1653.54 v 153.03"
+   style="fill:none;stroke:#666666;stroke-width:2.6px"
+   id="path616" />
+                </g><g
+   id="main_paths"
+   transform="matrix(0.94288745,0,0,0.9428925,-17651.735,-13.229458)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <path
+   d="m 18900.171,282.13386 119.082,20.9973"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path726" />
+                    <path
+   d="M 885.827,2066.93 H 767.717"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path621"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1122.05,1889.76 h -59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path623"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1062.99,1889.76 v 236.22"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path625"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 826.772,1653.54 v 236.22"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path627"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1003.94,1653.54 v 118.11"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path629"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="M 1003.94,1771.65 H 944.882"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path631"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 944.882,1889.76 h -59.055 v 177.17"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path633"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="M 944.882,1712.6 H 885.827"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path635"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1122.05,1771.65 h -59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path637"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1062.99,1771.65 v 59.06 h -59.05"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path639"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1003.94,1830.71 v 177.16"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path641"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1062.99,1653.54 v -59.05 H 944.882 v -59.06 h -118.11"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path643"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 826.772,1653.54 h -59.055 v 59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path645"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="M 826.772,1771.65 H 767.717"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path647"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 826.772,1889.76 h -59.055 v 118.11 h -59.056"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path649"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1003.94,2066.93 v -59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path651"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 944.882,2007.87 h 59.058"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path653"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 944.882,2007.87 v 118.11"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path655"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 885.827,2125.98 h 59.055"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path657"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1181.1,2185.04 h -59.05 v 59.05 h -59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-miterlimit:1.5"
+   id="path659"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1181.1,2185.04 v 177.16 h 59.06"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path661"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1122.05,1535.43 h 59.05 v -118.11"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path663"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="M 1666.05,1912.42 1476.38,1594.49"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path665"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1529.3349,1791.33 -112.01,-196.84"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path667"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1433.7979,1862.351 -67.1,-116.28"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path671"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1432.52,1979.4751 -197.46,-343.92"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path675"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1483.626,1949.95 -49.29,29.54"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path679"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1666.0411,1912.4201 -59.05,35.44"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path683"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1365.8544,1746.4369 -50.6005,28.7946"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.76525px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path687"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1472.394,2024.41 -59.05,35.44"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path691"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1458.79,2235.15 -59.05,35.44"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path695"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1413.34,2059.845 -169.46,-288.85"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path699"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1399.05,2154.576 -154.67,-265.01"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path703"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1399.74,2270.586 -153.27,-261.07"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path707"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1347.126,2300.054 -160.3,-278.11"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path711"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 18999.407,299.63188 -13.998,79.38811"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path730" />
+                    <path
+   d="m 18999.407,299.63188 10.499,-59.5394"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path734" />
+                    <path
+   d="m 18956.213,312.48145 -19.848,-3.49974"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path738" />
+                    <path
+   d="m 19019.204,303.13137 -31.496,178.62343"
+   style="fill:none;stroke:#ffffff;stroke-width:5.72625px;stroke-linecap:round;stroke-linejoin:bevel"
+   id="path742" />
+                    <path
+   d="m 18956.213,312.48145 39.694,6.99914"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path746" />
+                    <path
+   d="m 19019.253,303.13116 63.042,-9.34634 59.539,10.49841 25.227,65.83869"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path750" />
+                    <path
+   d="m 18936.365,308.98171 -10.498,59.5394"
+   style="fill:none;stroke:#ffffff;stroke-width:5.74343px;stroke-linecap:round;stroke-linejoin:round"
+   id="path754" /><path
+   d="m 1243.88,1771 -62.78,0.65"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path715"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1244.38,1889.57 -63.28,0.19"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path717"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1246.47,2009.52 -65.37,-1.65"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path719"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" /><path
+   d="m 1240.0808,1638.3531 v -102.2 h 68.6"
+   style="clip-rule:evenodd;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5"
+   id="path721"
+   transform="matrix(0.33607709,0.0592597,-0.0592597,0.33607709,18720.303,-322.57727)" />
+                </g><g
+   id="Origin"
+   transform="matrix(0.91109602,0,0,0.91110091,-441.04407,-1115.7948)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <circle
+   cx="772.25098"
+   cy="1520.1899"
+   r="15.244"
+   style="fill:#006b8b"
+   id="circle759" />
+                    <path
+   d="m 772.251,1504.94 c 8.414,0 15.244,6.84 15.244,15.25 0,8.41 -6.83,15.24 -15.244,15.24 -8.413,0 -15.244,-6.83 -15.244,-15.24 0,-8.41 6.831,-15.25 15.244,-15.25 z m 0,5.49 c 5.385,0 9.757,4.37 9.757,9.76 0,5.38 -4.372,9.75 -9.757,9.75 -5.384,0 -9.756,-4.37 -9.756,-9.75 0,-5.39 4.372,-9.76 9.756,-9.76 z"
+   style="fill:#ffffff"
+   id="path761" />
+                </g><g
+   id="Destinations"
+   transform="matrix(0.35819826,0,0,0.35820018,-150.52041,-352.23226)"
+   inkscape:groupmode="layer"
+   style="display:inline">
+                    <circle
+   cx="1245.436"
+   cy="1535.4342"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle764" />
+                    <circle
+   cx="1181.605"
+   cy="1579.245"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle768" />
+                    <circle
+   cx="910.42896"
+   cy="1584.5964"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle772" />
+                    <circle
+   cx="830.52649"
+   cy="1728.9879"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle776" />
+                    <circle
+   cx="931.60895"
+   cy="1750.2549"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle780" />
+                    <circle
+   cx="817.28217"
+   cy="1781.3639"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle784" />
+                    <circle
+   cx="723.90546"
+   cy="1981.3719"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle788" />
+                    <circle
+   cx="778.401"
+   cy="2045.554"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle792" />
+                    <circle
+   cx="868.99628"
+   cy="2114.595"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle796" />
+                    <circle
+   cx="985.61499"
+   cy="2084.1069"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle800" />
+                    <circle
+   cx="1027.194"
+   cy="2136.0908"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle804" />
+                    <circle
+   cx="1004.027"
+   cy="2244.0959"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle808" />
+                    <circle
+   cx="1137.822"
+   cy="2377.45"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle812" />
+                    <circle
+   cx="1251.5079"
+   cy="2342.1809"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle816" />
+                    <circle
+   cx="1350.7479"
+   cy="2306.189"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle820" />
+                    <circle
+   cx="1319.172"
+   cy="2221.6609"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle824" />
+                    <circle
+   cx="1394.064"
+   cy="2119.4729"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle828" />
+                    <circle
+   cx="1426.881"
+   cy="2053.75"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle832" />
+                    <circle
+   cx="1392.308"
+   cy="1957.7699"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle836" />
+                    <circle
+   cx="1544.2219"
+   cy="2068.373"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle840" />
+                    <circle
+   cx="1492.0549"
+   cy="1920.558"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle844" />
+                    <circle
+   cx="1594.488"
+   cy="1919.8989"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle848" />
+                    <circle
+   cx="1326.522"
+   cy="1661.7679"
+   r="15.244"
+   style="fill:#006b8b;stroke:#ffffff;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round"
+   id="circle852" />
+                </g><g
+   transform="matrix(0.99999449,0,0,0.99999985,-19843.532,-43.018622)"
+   id="g393"
+   style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-miterlimit:1.5;display:inline"
+   inkscape:label="url"
+   inkscape:groupmode="layer">
+                        <path
+   d="m 20196.358,529.18609 c -0.496,-1.19632 -0.612,-2.25958 -0.354,-3.20437 0.258,-0.94479 0.857,-1.6035 1.761,-1.97862 0.948,-0.39327 1.817,-0.36023 2.615,0.0785 l -0.278,-0.87643 1.196,-0.49613 3.116,7.51348 c 0.417,1.00666 0.452,1.91549 0.09,2.73254 -0.348,0.81099 -1.029,1.43554 -2.021,1.84697 -0.554,0.22991 -1.143,0.33706 -1.779,0.32749 -0.628,-0.0302 -1.17,-0.18176 -1.617,-0.4753 l 0.359,-1.07219 c 0.839,0.45579 1.685,0.51551 2.502,0.17669 0.642,-0.26621 1.065,-0.64699 1.264,-1.15693 0.213,-0.51599 0.183,-1.08463 -0.09,-1.74115 l -0.279,-0.67111 c -0.271,0.83056 -0.859,1.43341 -1.778,1.81458 -0.89,0.36907 -1.785,0.3129 -2.642,-0.18665 -0.857,-0.49955 -1.546,-1.37666 -2.066,-2.63134 z m 1.394,-0.3901 c 0.357,0.86077 0.817,1.47386 1.373,1.82469 0.57,0.34477 1.169,0.38708 1.811,0.12086 0.831,-0.34486 1.287,-0.9783 1.352,-1.89425 l -1.459,-3.51602 c -0.696,-0.5661 -1.46,-0.67672 -2.262,-0.34395 -0.642,0.26621 -1.035,0.71994 -1.195,1.36724 -0.159,0.64729 -0.02,1.46395 0.38,2.44143 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path273" />
+                        <path
+   d="m 20207.702,528.96163 -1.313,0.58569 -3.398,-7.61548 1.312,-0.58568 z m -5.713,-9.00399 c -0.1,-0.21635 -0.116,-0.41517 -0.06,-0.63175 0.06,-0.20216 0.221,-0.35795 0.48,-0.4738 0.26,-0.11585 0.48,-0.1274 0.674,-0.0411 0.2,0.10073 0.35,0.24163 0.446,0.45798 0.09,0.20192 0.1,0.40718 0.03,0.60934 -0.07,0.20216 -0.221,0.35794 -0.48,0.47379 -0.26,0.11585 -0.48,0.1274 -0.674,0.0411 -0.194,-0.0863 -0.329,-0.23365 -0.419,-0.43557 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path279" />
+                        <path
+   d="m 20207.057,517.84421 0.856,1.83176 1.417,-0.6616 0.467,1.00175 -1.416,0.66159 2.185,4.67957 c 0.14,0.30053 0.304,0.50277 0.507,0.60004 0.195,0.083 0.45,0.0686 0.751,-0.0718 0.143,-0.0668 0.344,-0.19569 0.575,-0.37322 l 0.488,1.04467 c -0.297,0.26056 -0.606,0.4572 -0.921,0.60422 -0.587,0.274 -1.096,0.30275 -1.564,0.0853 -0.446,-0.2098 -0.823,-0.64385 -1.124,-1.28782 l -2.185,-4.67958 -1.388,0.64824 -0.468,-1.00175 1.388,-0.64823 -0.856,-1.83176 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path285" />
+                        <path
+   d="m 20212.252,518.71837 c 0.21,-0.9894 0.773,-1.69717 1.676,-2.15152 1.58,-0.79511 2.817,-0.30382 3.726,1.46677 l 2.478,4.92393 -1.27,0.63893 -2.485,-4.93804 c -0.284,-0.52903 -0.595,-0.86728 -0.977,-0.99345 -0.368,-0.13327 -0.799,-0.0757 -1.306,0.17991 -0.424,0.21297 -0.727,0.48921 -0.938,0.87823 -0.196,0.38193 -0.294,0.78479 -0.279,1.2368 l 2.669,5.30487 -1.284,0.64602 -5.324,-10.5815 1.284,-0.64603 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path291" />
+                        <path
+   d="m 20225.983,518.85493 c -0.187,0.84114 -0.734,1.51913 -1.676,2.03531 -0.789,0.43269 -1.5,0.51605 -2.159,0.30057 -0.652,-0.23693 -1.224,-0.78788 -1.731,-1.68056 l -2.604,-4.75066 1.261,-0.69078 2.588,4.72297 c 0.607,1.10802 1.354,1.41913 2.254,0.92572 0.956,-0.52378 1.396,-1.23307 1.327,-2.11402 l -2.915,-5.31853 1.247,-0.68318 4.008,7.31297 -1.191,0.65282 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path297" />
+                        <path
+   d="m 20233.322,510.83334 c 0.647,1.08522 0.915,2.12066 0.809,3.08466 -0.105,0.964 -0.581,1.7076 -1.422,2.20914 -0.909,0.54199 -1.809,0.63707 -2.677,0.29072 l 0.425,0.86793 -1.126,0.67141 -6.067,-10.17393 1.235,-0.73613 2.265,3.79827 c 0.124,-0.90166 0.616,-1.61813 1.498,-2.14393 0.868,-0.51772 1.741,-0.59662 2.639,-0.23123 0.877,0.35991 1.676,1.11509 2.356,2.25457 z m -1.324,0.58691 c -0.493,-0.82748 -1.044,-1.38154 -1.623,-1.64314 -0.601,-0.26707 -1.192,-0.20907 -1.802,0.15495 -0.8,0.47727 -1.165,1.19137 -1.065,2.16135 l 1.844,3.09288 c 0.812,0.52767 1.621,0.55966 2.422,0.0824 0.583,-0.34784 0.907,-0.85349 0.965,-1.49528 0.05,-0.65537 -0.191,-1.4307 -0.741,-2.35314 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path303" />
+                        <path
+   d="m 20236.441,512.75796 c -0.135,-0.2137 -0.178,-0.42948 -0.142,-0.63891 0.04,-0.23122 0.172,-0.4076 0.426,-0.56777 0.254,-0.16018 0.483,-0.21142 0.696,-0.14038 0.218,0.0493 0.394,0.18074 0.529,0.39443 0.126,0.20034 0.161,0.40277 0.112,0.62063 -0.04,0.20943 -0.181,0.39424 -0.435,0.55441 -0.254,0.16018 -0.47,0.20299 -0.687,0.15374 -0.205,-0.0577 -0.373,-0.17581 -0.499,-0.37615 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path309" />
+                        <path
+   d="m 20242.427,508.59614 c 0.433,-0.28949 0.713,-0.66646 0.862,-1.12654 0.14,-0.47322 0.1,-0.90247 -0.124,-1.3228 l 1.117,-0.74566 c 0.258,0.41592 0.368,0.8933 0.356,1.41459 -0.01,0.52129 -0.162,1.03832 -0.441,1.52918 -0.272,0.50399 -0.648,0.90732 -1.121,1.22313 -0.945,0.63162 -1.905,0.81644 -2.877,0.55445 -0.986,-0.2532 -1.841,-0.93582 -2.569,-2.02592 l -0.132,-0.19701 c -0.456,-0.68296 -0.741,-1.36607 -0.842,-2.0581 -0.102,-0.69203 -0.02,-1.33603 0.261,-1.94079 0.266,-0.59598 0.721,-1.10889 1.352,-1.52997 0.775,-0.51758 1.576,-0.71102 2.396,-0.59346 0.841,0.12192 1.52,0.54186 2.038,1.25981 l -1.117,0.74566 c -0.338,-0.42024 -0.754,-0.67394 -1.249,-0.76112 -0.495,-0.0872 -0.972,0.0227 -1.419,0.32101 -0.604,0.40354 -0.928,0.94262 -0.967,1.59535 -0.04,0.65273 0.212,1.39719 0.756,2.21149 l 0.149,0.22327 c 0.535,0.80117 1.118,1.30442 1.736,1.51852 0.618,0.21411 1.231,0.10844 1.835,-0.29509 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path315" />
+                        <path
+   d="m 20244.178,503.46287 c -0.479,-0.66683 -0.762,-1.35813 -0.893,-2.08112 -0.122,-0.71017 -0.04,-1.38791 0.214,-2.00195 0.249,-0.62686 0.687,-1.15517 1.276,-1.57929 0.924,-0.66384 1.898,-0.87802 2.936,-0.65175 1.016,0.22268 1.916,0.87901 2.672,1.93055 l 0.06,0.0898 c 0.47,0.654 0.779,1.32687 0.9,2.03703 0.122,0.71017 0.06,1.37869 -0.205,2.01477 -0.259,0.61404 -0.687,1.15517 -1.302,1.59773 -0.911,0.65463 -1.885,0.8688 -2.923,0.64253 -1.025,-0.23549 -1.929,-0.86979 -2.685,-1.92132 z m 1.268,-0.69797 c 0.535,0.74377 1.148,1.21739 1.826,1.4301 0.669,0.19988 1.31,0.0896 1.887,-0.32534 0.59,-0.42412 0.898,-0.99609 0.912,-1.70668 0.01,-0.71059 -0.28,-1.47163 -0.879,-2.30516 -0.535,-0.74377 -1.148,-1.2174 -1.826,-1.4301 -0.691,-0.20349 -1.318,-0.10239 -1.908,0.32173 -0.564,0.40569 -0.86,0.96843 -0.897,1.67542 -0.01,0.71059 0.277,1.49367 0.885,2.34003 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path321" />
+                        <path
+   d="m 20249.924,494.27766 0.605,0.689 c 0.03,-0.92977 0.461,-1.73404 1.279,-2.38082 0.904,-0.71538 1.81,-0.86835 2.691,-0.41713 -0.03,-0.49844 0.06,-0.97156 0.247,-1.44413 0.199,-0.46019 0.53,-0.88267 1.013,-1.26486 1.437,-1.13677 2.765,-0.9594 3.995,0.54451 l 3.469,4.38472 -1.127,0.89178 -3.42,-4.32279 c -0.362,-0.45829 -0.746,-0.73909 -1.145,-0.78565 -0.397,-0.0687 -0.844,0.10397 -1.352,0.50576 -0.409,0.32339 -0.658,0.72165 -0.734,1.18497 -0.08,0.46332 0.03,0.92514 0.301,1.37309 l 3.44,4.34756 -1.115,0.88198 -3.391,-4.28563 c -0.755,-0.95374 -1.598,-1.05203 -2.527,-0.31705 -0.73,0.57819 -0.993,1.28963 -0.776,2.12454 l 3.783,4.78108 -1.115,0.88198 -5.174,-6.53993 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path327" />
+                        <path
+   d="m 20265.557,493.62702 -0.922,0.79238 -4.386,-12.30605 0.922,-0.79238 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path333" />
+                        <path
+   d="m 20267.762,480.98298 c -0.196,0.1133 -0.382,0.26062 -0.569,0.43025 -0.691,0.6255 -0.883,1.35395 -0.599,2.16195 l 3.975,4.39018 -1.065,0.96475 -5.598,-6.18138 1.031,-0.93294 0.67,0.69293 c -0.159,-0.85769 0.08,-1.58393 0.722,-2.16702 0.199,-0.18023 0.384,-0.30524 0.543,-0.34212 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path339" />
+                        <path
+   d="m 20269.866,481.00476 -3.468,-4.44262 4.152,-3.97649 0.918,0.95816 -3.285,3.14623 1.869,2.43089 c 0.181,-0.61049 0.516,-1.15061 1.03,-1.64221 0.73,-0.69916 1.552,-1.02769 2.455,-0.95234 0.903,0.0754 1.754,0.52937 2.54,1.35065 0.809,0.84409 1.203,1.71275 1.228,2.62929 0,0.91605 -0.395,1.75643 -1.205,2.53207 -0.719,0.68824 -1.497,1.04007 -2.325,1.08922 -0.838,0.0378 -1.614,-0.26943 -2.359,-0.9111 l 0.981,-0.9395 c 0.505,0.41305 1.003,0.59138 1.495,0.57966 0.503,-0.0226 0.955,-0.23632 1.4,-0.66237 0.479,-0.45882 0.702,-0.97902 0.659,-1.572 -0.04,-0.59298 -0.332,-1.16893 -0.889,-1.75066 -0.514,-0.53611 -1.077,-0.82755 -1.691,-0.8743 -0.613,-0.0468 -1.154,0.16498 -1.644,0.63473 -0.456,0.43698 -0.723,0.86689 -0.777,1.31254 l -0.07,0.47891 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path345" />
+                        <path
+   d="m 20281.663,471.48489 c 0.905,0.88115 1.432,1.81215 1.579,2.77069 0.158,0.94721 -0.109,1.78856 -0.803,2.50171 -0.705,0.72447 -1.505,1.07048 -2.354,1.03743 l 2.875,2.79763 -1.002,1.03011 -8.275,-8.05147 0.914,-0.93954 0.701,0.59355 c -0.102,-0.91448 0.199,-1.74512 0.926,-2.49223 0.694,-0.71315 1.517,-1.0148 2.468,-0.90495 0.95,0.10986 1.907,0.62172 2.869,1.55794 z m -1.127,0.90895 c -0.668,-0.64985 -1.332,-1.03168 -2.015,-1.12287 -0.66,-0.0915 -1.238,0.11746 -1.722,0.61554 -0.606,0.62259 -0.786,1.35104 -0.54,2.18537 l 2.864,2.78662 c 0.841,0.22305 1.564,0.0233 2.181,-0.61063 0.473,-0.48675 0.655,-1.05887 0.557,-1.72767 -0.11,-0.67982 -0.555,-1.37739 -1.325,-2.12636 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path351" />
+                        <path
+   d="m 20285.938,469.74179 -3.309,-5.65185 1.033,-1.13138 4.857,8.96893 c 0.663,1.31141 0.612,2.39817 -0.144,3.22628 l -0.193,0.18764 -0.432,0.33266 -0.863,-0.78807 0.279,-0.25862 c 0.33,-0.36158 0.516,-0.7054 0.557,-1.03148 0.03,-0.33672 -0.08,-0.7343 -0.346,-1.21404 l -0.417,-0.80835 -8.09,-3.36631 1.043,-1.14304 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path357" />
+                        <path
+   d="m 20291.506,468.06173 -0.795,0.92036 -6.161,-11.52012 0.795,-0.92036 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path363" />
+                        <path
+   d="m 20291.786,455.27967 c -0.176,0.14103 -0.339,0.31429 -0.499,0.50978 -0.59,0.72087 -0.673,1.46981 -0.272,2.22682 l 4.581,3.75324 -0.91,1.11184 -6.452,-5.28455 0.881,-1.07519 0.766,0.58609 c -0.284,-0.82473 -0.157,-1.5781 0.393,-2.25009 0.17,-0.20771 0.335,-0.35874 0.486,-0.41866 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path369" />
+                        <path
+   d="m 20293.915,454.89215 -4.088,-3.87964 3.517,-4.54794 1.049,0.81157 -2.782,3.59836 2.208,2.12706 c 0.09,-0.63053 0.341,-1.21442 0.775,-1.77667 0.619,-0.79964 1.383,-1.24645 2.288,-1.30579 0.904,-0.0593 1.813,0.26364 2.712,0.95927 0.925,0.71495 1.444,1.51555 1.604,2.41827 0.138,0.90556 -0.131,1.79564 -0.817,2.68274 -0.608,0.78714 -1.326,1.25044 -2.137,1.42173 -0.824,0.16162 -1.636,-0.0273 -2.469,-0.55131 l 0.831,-1.07451 c 0.561,0.33365 1.08,0.43608 1.565,0.3516 0.494,-0.097 0.909,-0.37519 1.286,-0.86247 0.406,-0.52476 0.55,-1.07233 0.419,-1.65238 -0.13,-0.58005 -0.502,-1.10678 -1.139,-1.59952 -0.587,-0.45409 -1.188,-0.6588 -1.801,-0.61413 -0.614,0.0447 -1.117,0.33421 -1.532,0.87147 -0.387,0.49977 -0.586,0.96439 -0.574,1.41317 v 0.48343 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path375" />
+                        <path
+   d="m 20304.136,443.82644 c 1.026,0.73713 1.685,1.57977 1.972,2.50589 0.297,0.9133 0.157,1.78504 -0.423,2.5932 -0.59,0.82098 -1.329,1.28171 -2.174,1.37495 l 3.258,2.34037 -0.838,1.16734 -9.378,-6.73549 0.765,-1.06471 0.781,0.4831 c -0.236,-0.88926 -0.06,-1.75541 0.547,-2.60205 0.58,-0.80815 1.349,-1.22841 2.305,-1.26076 0.957,-0.0324 1.979,0.33204 3.069,1.11524 z m -0.98,1.06598 c -0.757,-0.54363 -1.47,-0.82275 -2.159,-0.81172 -0.666,0.007 -1.207,0.29975 -1.612,0.86418 -0.507,0.70553 -0.577,1.45261 -0.21,2.24124 l 3.245,2.33116 c 0.865,0.0959 1.551,-0.20888 2.067,-0.92724 0.396,-0.5516 0.491,-1.14439 0.294,-1.79119 -0.209,-0.65602 -0.753,-1.27987 -1.625,-1.90643 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path381" />
+                        <path
+   d="m 20308.117,441.4654 -4.111,-5.09824 0.854,-1.27214 6.134,8.14883 c 0.85,1.19846 0.961,2.28078 0.336,3.21194 l -0.163,0.21415 -0.378,0.3931 -0.97,-0.65126 0.237,-0.29715 c 0.273,-0.40656 0.406,-0.77412 0.398,-1.10269 -0.02,-0.33736 -0.186,-0.71458 -0.522,-1.14927 l -0.532,-0.73754 -8.501,-2.12842 0.863,-1.28526 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke-width:15.7941"
+   id="path387" />
+                    </g><g
+   id="Fast"
+   transform="matrix(0.42243909,0,0,0.42244135,5.7450796,-633.73354)"
+   inkscape:label="name"
+   inkscape:groupmode="layer">
+                    <path
+   d="m 529.31975,1716.6535 16.0408,-60.2415 h 65.15469 l -3.11448,19.7259 h -45.75002 l -7.8592,25.7826 c 4.85421,-3.0561 10.58437,-4.5835 17.19048,-4.5835 10.20114,0 18.10291,3.6151 23.69316,10.8447 5.59634,7.2302 7.95653,16.7659 7.08058,28.607 -0.65696,7.8574 -2.96241,14.924 -6.91634,21.1992 -3.95393,6.2752 -9.15487,11.1044 -15.59065,14.4872 -6.44186,3.3833 -13.53461,4.9929 -21.28431,4.8292 -6.70952,-0.055 -12.81073,-1.5961 -18.29149,-4.6242 -5.48684,-3.0287 -9.75708,-7.2029 -12.81074,-12.523 -3.05365,-5.3208 -4.61089,-11.2548 -4.66563,-17.8025 h 22.67123 c 0.21898,4.8561 1.55724,8.6622 4.01476,11.4178 2.45143,2.7556 5.7849,4.1881 9.98215,4.297 5.45642,0.1636 9.94566,-1.8279 13.4677,-5.9747 3.51595,-4.1474 5.63283,-9.7133 6.34453,-16.6978 0.65088,-6.2204 -0.29198,-11.1312 -2.82858,-14.7329 -2.5366,-3.6011 -6.39928,-5.4564 -11.58197,-5.5659 -5.78491,-0.1089 -11.13184,2.0189 -16.0408,6.3847 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:3.45513px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path857" />
+                    <path
+   d="M 421.52048,1805.0718 H 387.6478 l -13.23382,75.8676 h -41.71142 l 36.00955,-207.2485 68.6128,0.1417 c 22.96614,0 40.64298,5.4089 53.01994,16.2266 12.38754,10.8187 17.86726,25.8593 16.43915,45.123 -1.98878,28.468 -17.16907,48.2532 -45.54088,59.3565 l 29.17578,84.1231 v 2.2776 h -44.40896 z m -27.89577,-34.5888 31.02704,0.2845 c 11.01232,-0.1904 20.09934,-3.1556 27.26105,-8.8966 7.16171,-5.741 11.45662,-13.5459 12.88473,-23.4146 1.32233,-9.2055 -0.13752,-16.417 -4.41127,-21.6365 -4.27376,-5.2194 -11.05464,-8.0185 -20.35323,-8.3983 l -35.58641,-0.1418 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:3.44862px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path861" />
+                    <path
+   d="m 745.93351,1804.2446 c -1.98877,16.1567 -6.22021,30.5065 -12.68374,43.0517 -6.46352,12.5452 -14.49268,21.8586 -24.08747,27.9413 -9.60537,6.0826 -20.24744,8.9812 -31.93679,8.6956 -14.91583,-0.3798 -26.70039,-5.9399 -35.35368,-16.6783 l -14.11186,72.9881 h -40.19868 l 36.91932,-213.5491 37.06741,-0.1428 -2.70812,15.5389 c 11.11811,-12.5452 24.23557,-18.6268 39.34181,-18.247 15.11682,0.3797 26.84849,5.8679 35.21616,16.4656 8.3571,10.5966 12.82127,24.9708 13.39251,43.1226 0.19041,5.8923 -0.0952,12.8297 -0.85687,20.8134 z m -39.91305,-2.9938 0.85686,-13.6855 c 0.19042,-9.2182 -1.49158,-16.5365 -5.05657,-21.9538 -3.56499,-5.4173 -8.76966,-8.2206 -15.61401,-8.41 -11.68936,-0.3808 -21.33704,4.5615 -28.94305,14.8249 l -11.54125,63.5805 c 3.51209,9.5991 11.07579,14.5879 22.66994,14.9688 9.68999,0.2845 17.77204,-3.4688 24.23557,-11.262 6.45294,-7.7933 10.92769,-20.4812 13.39251,-38.0629 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:3.44862px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path865" /><path
+   d="m 822.49084,1822.207 44.04929,-95.5131 h 44.75806 l -90.23546,177.4825 c -6.46352,13.5903 -14.0378,23.5691 -22.73341,29.9374 -8.69561,6.3673 -18.74528,9.5504 -30.14901,9.5504 -4.46417,0 -10.92769,-0.9976 -19.39057,-2.9938 l 2.99374,-31.3624 5.55376,0.2857 c 13.11747,0.3797 22.72284,-4.4198 28.80553,-14.3986 l 8.83313,-16.3936 -25.22996,-152.1076 h 41.62679 z"
+   style="fill:#ffffff;fill-rule:nonzero;stroke:#ffffff;stroke-width:3.44862px;stroke-linecap:butt;stroke-miterlimit:2"
+   id="path867" />
+                </g>
+</svg>
diff --git a/docs/_static/r5py_blue.svg b/docs/_static/r5py_blue.svg
deleted file mode 100644
index 53129323..00000000
--- a/docs/_static/r5py_blue.svg
+++ /dev/null
@@ -1,473 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="100%" height="100%" viewBox="0 0 530 530" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-miterlimit:1.5;">
-    <g transform="matrix(1,0,0,1,-4605.25,-863)">
-        <g id="R5py-Azul-Circulo" serif:id="R5py Azul Circulo" transform="matrix(0.179961,0,0,0.376302,1752.21,252.063)">
-            <rect x="15853.6" y="1623.53" width="2945.08" height="1408.44" style="fill:none;"/>
-            <g id="Logo1" transform="matrix(1.70059,0,0,0.813287,15191.8,951.848)">
-                <g>
-                    <g transform="matrix(3.54597,0,0,3.54597,-70021.1,627.991)">
-                        <circle cx="20100.6" cy="300" r="238.895" style="fill:rgb(13,139,177);"/>
-                        <path d="M20100.6,61.105C20232.5,61.105 20339.5,168.15 20339.5,300C20339.5,431.85 20232.5,538.895 20100.6,538.895C19968.8,538.895 19861.7,431.85 19861.7,300C19861.7,168.15 19968.8,61.105 20100.6,61.105ZM20100.6,72.624C20226.1,72.624 20328,174.508 20328,300C20328,425.492 20226.1,527.376 20100.6,527.376C19975.1,527.376 19873.2,425.492 19873.2,300C19873.2,174.508 19975.1,72.624 20100.6,72.624Z" style="fill:white;"/>
-                    </g>
-                    <g transform="matrix(3.54597,0,0,3.54597,-70021.1,627.991)">
-                        <circle cx="20100.6" cy="300" r="238.895" style="fill:none;stroke:black;stroke-width:1.15px;"/>
-                    </g>
-                    <g transform="matrix(3.26753,0,0,3.26753,-64450.5,685.319)">
-                        <g transform="matrix(0.923717,-0.383076,0.383076,0.923717,1336.38,7777.79)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20197.3,533.395)">
-                                <path d="M0.047,-0.269C0.047,-0.351 0.066,-0.416 0.104,-0.465C0.142,-0.514 0.193,-0.538 0.255,-0.538C0.32,-0.538 0.37,-0.515 0.406,-0.47L0.411,-0.528L0.493,-0.528L0.493,-0.013C0.493,0.056 0.473,0.11 0.432,0.149C0.392,0.188 0.337,0.208 0.269,0.208C0.231,0.208 0.194,0.2 0.157,0.184C0.121,0.167 0.093,0.145 0.074,0.117L0.121,0.063C0.159,0.11 0.207,0.134 0.263,0.134C0.307,0.134 0.341,0.122 0.365,0.097C0.39,0.072 0.402,0.038 0.402,-0.007L0.402,-0.053C0.366,-0.011 0.317,0.01 0.254,0.01C0.193,0.01 0.142,-0.015 0.104,-0.065C0.066,-0.115 0.047,-0.183 0.047,-0.269ZM0.138,-0.258C0.138,-0.199 0.15,-0.152 0.174,-0.118C0.199,-0.084 0.233,-0.067 0.277,-0.067C0.334,-0.067 0.376,-0.093 0.402,-0.145L0.402,-0.386C0.375,-0.436 0.333,-0.461 0.278,-0.461C0.234,-0.461 0.2,-0.444 0.175,-0.41C0.15,-0.376 0.138,-0.325 0.138,-0.258Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.913205,-0.407499,0.407499,0.913205,1537.73,8279.66)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20205.3,530.019)">
-                                <path d="M0.167,-0L0.076,-0L0.076,-0.528L0.167,-0.528L0.167,-0ZM0.069,-0.668C0.069,-0.683 0.073,-0.695 0.082,-0.706C0.091,-0.716 0.104,-0.721 0.122,-0.721C0.14,-0.721 0.153,-0.716 0.162,-0.706C0.171,-0.695 0.176,-0.683 0.176,-0.668C0.176,-0.654 0.171,-0.642 0.162,-0.632C0.153,-0.622 0.14,-0.617 0.122,-0.617C0.104,-0.617 0.091,-0.622 0.082,-0.632C0.073,-0.642 0.069,-0.654 0.069,-0.668Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.906074,-0.42312,0.42312,0.906074,1674.51,8600.35)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20208.7,528.504)">
-                                <path d="M0.191,-0.656L0.191,-0.528L0.29,-0.528L0.29,-0.458L0.191,-0.458L0.191,-0.131C0.191,-0.11 0.195,-0.094 0.204,-0.083C0.213,-0.073 0.228,-0.067 0.249,-0.067C0.259,-0.067 0.274,-0.069 0.292,-0.073L0.292,-0C0.268,0.007 0.245,0.01 0.223,0.01C0.182,0.01 0.152,-0.002 0.131,-0.027C0.111,-0.051 0.101,-0.086 0.101,-0.131L0.101,-0.458L0.004,-0.458L0.004,-0.528L0.101,-0.528L0.101,-0.656L0.191,-0.656Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.893288,-0.449485,0.449485,0.893288,1920.4,9141.75)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20213.3,526.391)">
-                                <path d="M0.159,-0.464C0.199,-0.514 0.251,-0.538 0.315,-0.538C0.427,-0.538 0.483,-0.475 0.484,-0.349L0.484,-0L0.394,-0L0.394,-0.35C0.393,-0.388 0.385,-0.416 0.367,-0.434C0.35,-0.452 0.324,-0.461 0.288,-0.461C0.258,-0.461 0.233,-0.454 0.21,-0.438C0.188,-0.422 0.171,-0.402 0.159,-0.376L0.159,-0L0.068,-0L0.068,-0.75L0.159,-0.75L0.159,-0.464Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.876931,-0.480617,0.480617,0.876931,2237.42,9782.83)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20220.9,522.563)">
-                                <path d="M0.395,-0.052C0.359,-0.011 0.308,0.01 0.24,0.01C0.183,0.01 0.141,-0.007 0.111,-0.039C0.082,-0.072 0.067,-0.12 0.066,-0.185L0.066,-0.528L0.157,-0.528L0.157,-0.187C0.157,-0.107 0.189,-0.067 0.254,-0.067C0.323,-0.067 0.369,-0.093 0.392,-0.144L0.392,-0.528L0.482,-0.528L0.482,-0L0.396,-0L0.395,-0.052Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.858881,-0.512176,0.512176,0.858881,2589.07,10433.7)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20228.4,518.475)">
-                                <path d="M0.516,-0.258C0.516,-0.178 0.497,-0.113 0.46,-0.064C0.423,-0.015 0.373,0.01 0.311,0.01C0.244,0.01 0.192,-0.014 0.156,-0.061L0.151,-0L0.068,-0L0.068,-0.75L0.159,-0.75L0.159,-0.47C0.195,-0.515 0.245,-0.538 0.31,-0.538C0.374,-0.538 0.424,-0.514 0.461,-0.465C0.497,-0.417 0.516,-0.35 0.516,-0.266L0.516,-0.258ZM0.425,-0.269C0.425,-0.33 0.413,-0.378 0.39,-0.411C0.366,-0.445 0.332,-0.461 0.287,-0.461C0.228,-0.461 0.185,-0.434 0.159,-0.378L0.159,-0.15C0.186,-0.095 0.229,-0.067 0.288,-0.067C0.331,-0.067 0.365,-0.084 0.389,-0.117C0.413,-0.151 0.425,-0.201 0.425,-0.269Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.845635,-0.533762,0.533762,0.845635,2849.38,10880.5)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20235.9,513.969)">
-                                <path d="M0.07,-0.047C0.07,-0.063 0.075,-0.076 0.084,-0.086C0.094,-0.097 0.107,-0.102 0.126,-0.102C0.145,-0.102 0.159,-0.097 0.168,-0.086C0.178,-0.076 0.183,-0.063 0.183,-0.047C0.183,-0.032 0.178,-0.02 0.168,-0.01C0.159,0 0.145,0.005 0.126,0.005C0.107,0.005 0.094,0 0.084,-0.01C0.075,-0.02 0.07,-0.032 0.07,-0.047Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.831566,-0.555426,0.555426,0.831566,3124.71,11327.7)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20239.3,511.837)">
-                                <path d="M0.28,-0.064C0.313,-0.064 0.341,-0.074 0.365,-0.093C0.389,-0.113 0.402,-0.137 0.405,-0.167L0.49,-0.167C0.489,-0.136 0.478,-0.107 0.459,-0.08C0.44,-0.053 0.414,-0.031 0.382,-0.015C0.35,0.002 0.316,0.01 0.28,0.01C0.208,0.01 0.151,-0.014 0.109,-0.062C0.066,-0.11 0.045,-0.176 0.045,-0.259L0.045,-0.274C0.045,-0.326 0.054,-0.372 0.073,-0.412C0.092,-0.452 0.119,-0.483 0.155,-0.505C0.19,-0.527 0.232,-0.538 0.28,-0.538C0.339,-0.538 0.388,-0.52 0.427,-0.485C0.467,-0.449 0.488,-0.403 0.49,-0.347L0.405,-0.347C0.402,-0.381 0.389,-0.409 0.366,-0.431C0.343,-0.453 0.314,-0.464 0.28,-0.464C0.234,-0.464 0.198,-0.447 0.173,-0.414C0.148,-0.381 0.135,-0.333 0.135,-0.271L0.135,-0.254C0.135,-0.193 0.148,-0.146 0.173,-0.113C0.198,-0.08 0.234,-0.064 0.28,-0.064Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.811921,-0.583767,0.583767,0.811921,3511.69,11914.4)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20246.1,507.344)">
-                                <path d="M0.044,-0.269C0.044,-0.321 0.055,-0.367 0.075,-0.409C0.095,-0.45 0.124,-0.482 0.16,-0.504C0.196,-0.527 0.238,-0.538 0.284,-0.538C0.356,-0.538 0.414,-0.513 0.459,-0.463C0.503,-0.414 0.525,-0.347 0.525,-0.265L0.525,-0.258C0.525,-0.207 0.516,-0.161 0.496,-0.12C0.476,-0.079 0.448,-0.047 0.411,-0.024C0.375,-0.002 0.333,0.01 0.285,0.01C0.214,0.01 0.156,-0.015 0.111,-0.065C0.067,-0.115 0.044,-0.181 0.044,-0.263L0.044,-0.269ZM0.135,-0.258C0.135,-0.2 0.149,-0.153 0.176,-0.117C0.203,-0.082 0.24,-0.064 0.285,-0.064C0.331,-0.064 0.368,-0.082 0.395,-0.118C0.422,-0.154 0.435,-0.204 0.435,-0.269C0.435,-0.327 0.421,-0.374 0.394,-0.41C0.366,-0.446 0.33,-0.464 0.284,-0.464C0.24,-0.464 0.204,-0.446 0.176,-0.411C0.149,-0.375 0.135,-0.324 0.135,-0.258Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.784231,-0.620469,0.620469,0.784231,4058.37,12674.9)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20253.2,502.275)">
-                                <path d="M0.153,-0.528L0.156,-0.47C0.194,-0.515 0.247,-0.538 0.313,-0.538C0.386,-0.538 0.437,-0.51 0.463,-0.453C0.481,-0.479 0.504,-0.499 0.532,-0.515C0.56,-0.53 0.593,-0.538 0.632,-0.538C0.748,-0.538 0.807,-0.477 0.809,-0.354L0.809,-0L0.718,-0L0.718,-0.349C0.718,-0.386 0.71,-0.415 0.692,-0.433C0.675,-0.452 0.646,-0.461 0.605,-0.461C0.572,-0.461 0.544,-0.451 0.522,-0.431C0.5,-0.411 0.487,-0.384 0.483,-0.351L0.483,-0L0.393,-0L0.393,-0.346C0.393,-0.423 0.355,-0.461 0.28,-0.461C0.221,-0.461 0.18,-0.436 0.158,-0.386L0.158,-0L0.068,-0L0.068,-0.528L0.153,-0.528Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.758608,-0.651547,0.651547,0.758608,4569.84,13322.1)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20263.9,493.752)">
-                                <path d="M0.086,0.061L0.009,0.061L0.306,-0.711L0.383,-0.711L0.086,0.061Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.741236,-0.671244,0.671244,0.741236,4916.19,13732)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20268.7,489.58)">
-                                <path d="M0.324,-0.447C0.31,-0.45 0.295,-0.451 0.279,-0.451C0.22,-0.451 0.18,-0.425 0.159,-0.375L0.159,-0L0.068,-0L0.068,-0.528L0.156,-0.528L0.158,-0.467C0.187,-0.514 0.229,-0.538 0.284,-0.538C0.301,-0.538 0.315,-0.536 0.324,-0.531L0.324,-0.447Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.722206,-0.691678,0.691678,0.722206,5295.37,14157.2)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20272.6,486.122)">
-                                <path d="M0.101,-0.356L0.137,-0.711L0.501,-0.711L0.501,-0.627L0.213,-0.627L0.192,-0.434C0.227,-0.454 0.266,-0.464 0.311,-0.464C0.375,-0.464 0.427,-0.443 0.465,-0.4C0.503,-0.357 0.522,-0.299 0.522,-0.227C0.522,-0.153 0.502,-0.096 0.463,-0.053C0.423,-0.011 0.368,0.01 0.297,0.01C0.234,0.01 0.183,-0.008 0.143,-0.042C0.103,-0.077 0.081,-0.125 0.075,-0.187L0.161,-0.187C0.166,-0.146 0.181,-0.116 0.204,-0.095C0.228,-0.074 0.258,-0.064 0.297,-0.064C0.339,-0.064 0.372,-0.078 0.396,-0.107C0.42,-0.136 0.432,-0.175 0.432,-0.226C0.432,-0.273 0.419,-0.311 0.393,-0.34C0.367,-0.369 0.333,-0.383 0.29,-0.383C0.25,-0.383 0.219,-0.375 0.197,-0.357L0.173,-0.338L0.101,-0.356Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.697369,-0.716713,0.716713,0.697369,5792.94,14679.5)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20278.9,480.101)">
-                                <path d="M0.515,-0.258C0.515,-0.178 0.496,-0.113 0.459,-0.064C0.423,-0.015 0.373,0.01 0.31,0.01C0.246,0.01 0.195,-0.011 0.159,-0.051L0.159,0.203L0.068,0.203L0.068,-0.528L0.151,-0.528L0.155,-0.47C0.192,-0.515 0.243,-0.538 0.309,-0.538C0.372,-0.538 0.422,-0.514 0.459,-0.466C0.496,-0.418 0.515,-0.352 0.515,-0.267L0.515,-0.258ZM0.424,-0.269C0.424,-0.328 0.412,-0.375 0.386,-0.41C0.361,-0.444 0.326,-0.461 0.282,-0.461C0.227,-0.461 0.186,-0.437 0.159,-0.389L0.159,-0.136C0.186,-0.088 0.227,-0.064 0.283,-0.064C0.326,-0.064 0.36,-0.081 0.386,-0.115C0.412,-0.15 0.424,-0.201 0.424,-0.269Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.674275,-0.73848,0.73848,0.674275,6257.33,15134.4)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20284.9,473.919)">
-                                <path d="M0.241,-0.132L0.364,-0.528L0.461,-0.528L0.249,0.082C0.216,0.169 0.163,0.213 0.092,0.213L0.075,0.212L0.041,0.206L0.041,0.132L0.065,0.134C0.096,0.134 0.12,0.128 0.137,0.116C0.154,0.103 0.168,0.081 0.179,0.048L0.199,-0.006L0.011,-0.528L0.109,-0.528L0.241,-0.132Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.653665,-0.756784,0.756784,0.653665,6672.55,15517.3)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20289.9,468.484)">
-                                <path d="M0.086,0.061L0.009,0.061L0.306,-0.711L0.383,-0.711L0.086,0.061Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.633694,-0.773584,0.773584,0.633694,7075.13,15869)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20294,463.672)">
-                                <path d="M0.324,-0.447C0.31,-0.45 0.295,-0.451 0.279,-0.451C0.22,-0.451 0.18,-0.425 0.159,-0.375L0.159,-0L0.068,-0L0.068,-0.528L0.156,-0.528L0.158,-0.467C0.187,-0.514 0.229,-0.538 0.284,-0.538C0.301,-0.538 0.315,-0.536 0.324,-0.531L0.324,-0.447Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.611718,-0.791076,0.791076,0.611718,7517.48,16235.2)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20297.4,459.655)">
-                                <path d="M0.101,-0.356L0.137,-0.711L0.501,-0.711L0.501,-0.627L0.213,-0.627L0.192,-0.434C0.227,-0.454 0.266,-0.464 0.311,-0.464C0.375,-0.464 0.427,-0.443 0.465,-0.4C0.503,-0.357 0.522,-0.299 0.522,-0.227C0.522,-0.153 0.502,-0.096 0.463,-0.053C0.423,-0.011 0.368,0.01 0.297,0.01C0.234,0.01 0.183,-0.008 0.143,-0.042C0.103,-0.077 0.081,-0.125 0.075,-0.187L0.161,-0.187C0.166,-0.146 0.181,-0.116 0.204,-0.095C0.228,-0.074 0.258,-0.064 0.297,-0.064C0.339,-0.064 0.372,-0.078 0.396,-0.107C0.42,-0.136 0.432,-0.175 0.432,-0.226C0.432,-0.273 0.419,-0.311 0.393,-0.34C0.367,-0.369 0.333,-0.383 0.29,-0.383C0.25,-0.383 0.219,-0.375 0.197,-0.357L0.173,-0.338L0.101,-0.356Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.583387,-0.812194,0.812194,0.583387,8090.63,16678.4)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20302.7,452.772)">
-                                <path d="M0.515,-0.258C0.515,-0.178 0.496,-0.113 0.459,-0.064C0.423,-0.015 0.373,0.01 0.31,0.01C0.246,0.01 0.195,-0.011 0.159,-0.051L0.159,0.203L0.068,0.203L0.068,-0.528L0.151,-0.528L0.155,-0.47C0.192,-0.515 0.243,-0.538 0.309,-0.538C0.372,-0.538 0.422,-0.514 0.459,-0.466C0.496,-0.418 0.515,-0.352 0.515,-0.267L0.515,-0.258ZM0.424,-0.269C0.424,-0.328 0.412,-0.375 0.386,-0.41C0.361,-0.444 0.326,-0.461 0.282,-0.461C0.227,-0.461 0.186,-0.437 0.159,-0.389L0.159,-0.136C0.186,-0.088 0.227,-0.064 0.283,-0.064C0.326,-0.064 0.36,-0.081 0.386,-0.115C0.412,-0.15 0.424,-0.201 0.424,-0.269Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                        <g transform="matrix(0.55722,-0.830365,0.830365,0.55722,8621.72,17060.2)">
-                            <g transform="matrix(15.7941,0,0,15.7941,20307.7,445.768)">
-                                <path d="M0.241,-0.132L0.364,-0.528L0.461,-0.528L0.249,0.082C0.216,0.169 0.163,0.213 0.092,0.213L0.075,0.212L0.041,0.206L0.041,0.132L0.065,0.134C0.096,0.134 0.12,0.128 0.137,0.116C0.154,0.103 0.168,0.081 0.179,0.048L0.199,-0.006L0.011,-0.528L0.109,-0.528L0.241,-0.132Z" style="fill:white;fill-rule:nonzero;"/>
-                            </g>
-                        </g>
-                    </g>
-                </g>
-                <g id="grid_rotated" transform="matrix(0.358074,0.982926,-0.982926,0.358074,2939.01,66.8149)">
-                    <path d="M1290.62,2125.98L1594.49,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,59.0551)">
-                        <path d="M1299.45,2125.98L1594.32,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,118.11)">
-                        <path d="M1367.87,2125.98L1594.52,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,177.165)">
-                        <path d="M1465.09,2125.98L1592.5,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-59.0551)">
-                        <path d="M1182.3,2125.98L1594.49,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-118.11)">
-                        <path d="M1082.76,2126.99L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-177.165)">
-                        <path d="M961.398,2125.98L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-236.22)">
-                        <path d="M971.721,2125.98L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-295.276)">
-                        <path d="M983.823,2125.98L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-354.331)">
-                        <path d="M1017.9,2125.98L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-413.386)">
-                        <path d="M1048.29,2125.98L1476.38,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-472.441)">
-                        <path d="M1074.97,2138.86L1359.5,2132.53" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,295.276,0)">
-                        <path d="M708.661,1789.37L708.661,1968.94" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,354.331,0)">
-                        <path d="M708.661,1687.15L708.661,2003.06" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,413.386,0)">
-                        <path d="M708.661,1665.37L708.661,2037.18" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,472.441,0)">
-                        <path d="M708.661,1664.06L708.661,2071.3" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,531.496,0)">
-                        <path d="M708.661,1662.74L708.661,2105.41" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,590.551,0)">
-                        <path d="M708.661,1661.43L708.661,2203.64" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,649.606,0)">
-                        <path d="M708.661,1659.64L708.661,2241.37" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,708.661,0)">
-                        <path d="M708.661,1712.6L708.661,2272.93" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,767.717,0)">
-                        <path d="M708.661,1712.6L708.661,2307.26" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,826.772,0)">
-                        <path d="M708.661,2066.93L708.661,2303.15" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,885.827,0)">
-                        <path d="M708.661,2066.93L708.661,2303.87" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;stroke-linecap:round;"/>
-                    </g>
-                </g>
-                <g id="grid" transform="matrix(1.03022,0.181656,-0.181656,1.03022,351.976,-333.483)">
-                    <path d="M708.661,2125.98L1240.58,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,59.0551)">
-                        <path d="M708.661,2125.98L1240.58,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,118.11)">
-                        <path d="M885.827,2125.98L1240.58,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,177.165)">
-                        <path d="M944.979,2125.98L1242.13,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,236.22)">
-                        <path d="M1117.46,2125.98L1241.31,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,295.276)">
-                        <path d="M1122.05,2125.14L1269.92,2124.84" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,354.331)">
-                        <path d="M1122.05,2125.98L1292.64,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-59.0551)">
-                        <path d="M708.661,2125.98L1297.88,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-118.11)">
-                        <path d="M826.772,2125.98L1240.58,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-177.165)">
-                        <path d="M826.772,2125.98L1299.21,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-236.22)">
-                        <path d="M825.138,2125.98L1298.56,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-295.276)">
-                        <path d="M824.107,2125.98L1299.15,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-354.331)">
-                        <path d="M825.101,2125.98L1240.58,2125.51" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-413.386)">
-                        <path d="M885.827,2125.98L1653.54,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-472.441)">
-                        <path d="M885.827,2125.98L1653.54,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-7.10543e-15,-531.496)">
-                        <path d="M885.827,2125.98L1417.6,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,3.08149e-33,-3.08149e-33,1,-10.709,-592.23)">
-                        <path d="M1132.76,2125.98L1309.92,2125.98" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <path d="M708.661,2066.93L708.661,2185.11" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    <g transform="matrix(1,0,0,1,59.0551,0)">
-                        <path d="M708.661,2066.93L708.661,2185.57" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,118.11,0)">
-                        <path d="M708.661,1772.21L708.661,2187.02" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,177.165,0)">
-                        <path d="M708.661,1594.49L708.661,2244.09" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,236.22,0)">
-                        <path d="M708.661,1594.49L708.661,2302.6" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,295.276,0)">
-                        <path d="M708.661,1594.49L708.661,2303.15" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,354.331,0)">
-                        <path d="M708.661,1594.49L708.661,2303.15" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,413.386,0)">
-                        <path d="M708.661,1533.75L708.661,2480.32" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,472.441,0)">
-                        <path d="M708.661,1533.75L708.661,2480.32" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,531.496,0)">
-                        <path d="M708.661,1594.49L708.661,2480.32" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,590.551,0)">
-                        <path d="M708.661,1533.75L708.661,2128.33" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,649.606,0)">
-                        <path d="M708.661,1594.49L708.661,1735.63" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,708.661,0)">
-                        <path d="M708.661,1594.49L708.661,1712.06" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,767.717,0)">
-                        <path d="M708.661,1653.54L708.661,1711.83" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,826.772,0)">
-                        <path d="M708.661,1653.54L708.661,1711.83" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,885.827,0)">
-                        <path d="M708.661,1653.54L708.661,1711.83" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,944.882,0)">
-                        <path d="M708.661,1653.54L708.661,1806.57" style="fill:none;stroke:rgb(102,102,102);stroke-width:2.6px;"/>
-                    </g>
-                </g>
-                <g id="Layer1" transform="matrix(1.03543,0.182575,-0.182575,1.03543,387.245,-211.182)">
-                    <path d="M885.827,2066.93L767.717,2066.93" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1122.05,1889.76L1062.99,1889.76" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1062.99,1889.76L1062.99,2125.98" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M826.772,1653.54L826.772,1889.76" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1003.94,1653.54L1003.94,1771.65" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1003.94,1771.65L944.882,1771.65" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M944.882,1889.76L885.827,1889.76L885.827,2066.93" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M944.882,1712.6L885.827,1712.6" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1122.05,1771.65L1062.99,1771.65" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1062.99,1771.65L1062.99,1830.71L1003.94,1830.71" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1003.94,1830.71L1003.94,2007.87" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1062.99,1653.54L1062.99,1594.49L944.882,1594.49L944.882,1535.43L826.772,1535.43" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M826.772,1653.54L767.717,1653.54L767.717,1712.6" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M826.772,1771.65L767.717,1771.65" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M826.772,1889.76L767.717,1889.76L767.717,2007.87L708.661,2007.87" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1003.94,2066.93L1003.94,2007.87" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M944.882,2007.87L1003.94,2007.87" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M944.882,2007.87L944.882,2125.98" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M885.827,2125.98L944.882,2125.98" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1181.1,2185.04L1122.05,2185.04L1122.05,2244.09L1062.99,2244.09" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;"/>
-                    <path d="M1181.1,2185.04L1181.1,2362.2L1240.16,2362.2" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1122.05,1535.43L1181.1,1535.43L1181.1,1417.32" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1666.05,1912.42L1476.38,1594.49" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <g transform="matrix(1,0,0,1,-59.0551,4.44089e-16)">
-                        <path d="M1588.39,1791.33L1476.38,1594.49" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-60.2921,238.331)">
-                        <path d="M1494.09,1624.02L1426.99,1507.74" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-236.22,59.0551)">
-                        <path d="M1668.74,1920.42L1471.28,1576.5" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(6.12323e-17,-1,1,6.12323e-17,-144.244,3446.32)">
-                        <path d="M1496.37,1627.87L1466.83,1578.58" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1.44499e-16,-1,1,1.44499e-16,28.4111,3414.69)">
-                        <path d="M1502.27,1637.63L1466.83,1578.58" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(3.38982e-18,-0.834868,0.857053,7.56647e-17,-40.6039,2998.43)">
-                        <path d="M1499.63,1641.04L1465.14,1582" style="fill:none;stroke:white;stroke-width:9.18px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(6.12323e-17,-1,1,6.12323e-17,-165.236,3526.68)">
-                        <path d="M1502.27,1637.63L1466.83,1578.58" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(6.12323e-17,-1,1,6.12323e-17,-178.84,3737.42)">
-                        <path d="M1502.27,1637.63L1466.83,1578.58" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-236.22,177.165)">
-                        <path d="M1649.56,1882.68L1480.1,1593.83" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-236.22,295.276)">
-                        <path d="M1635.27,1859.3L1480.6,1594.29" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-236.22,413.386)">
-                        <path d="M1635.96,1857.2L1482.69,1596.13" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-289.554,427.454)">
-                        <path d="M1636.68,1872.6L1476.38,1594.49" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <path d="M1243.88,1771L1181.1,1771.65" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1244.38,1889.57L1181.1,1889.76" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <path d="M1246.47,2009.52L1181.1,2007.87" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    <g transform="matrix(1,0,0,1,9.47076,0.723113)">
-                        <path d="M1230.61,1637.63L1230.61,1535.43L1299.21,1535.43" style="fill:none;stroke:white;stroke-width:7.77px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                </g>
-                <g id="main_paths" transform="matrix(3.08093,0,0,3.08093,-57288.7,782.656)">
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M826.772,1653.54L1181.1,1653.54" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M1122.05,1653.54L1122.05,1889.76" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M1122.05,1653.54L1122.05,1476.38" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M1003.94,1712.6L944.882,1712.6" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.066667,0.378087,18732.5,-392.042)">
-                        <path d="M1181.1,1653.54L1181.1,2125.98" style="fill:none;stroke:white;stroke-width:15.82px;stroke-linecap:round;stroke-linejoin:bevel;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M1003.94,1712.6L1122.05,1712.6" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M1181.1,1653.54L1358.27,1594.49L1535.43,1594.49L1641.73,1771.65" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(0.336077,0.0592595,-0.0592595,0.336077,18720.3,-322.577)">
-                        <path d="M944.882,1712.6L944.882,1889.76" style="fill:none;stroke:white;stroke-width:16.83px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                </g>
-                <g id="Origin" transform="matrix(2.97705,-1.91125e-16,1.91125e-16,2.97705,-1051.94,-2820.01)">
-                    <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);"/>
-                    <path d="M772.251,1504.94C780.665,1504.94 787.495,1511.78 787.495,1520.19C787.495,1528.6 780.665,1535.43 772.251,1535.43C763.838,1535.43 757.007,1528.6 757.007,1520.19C757.007,1511.78 763.838,1504.94 772.251,1504.94ZM772.251,1510.43C777.636,1510.43 782.008,1514.8 782.008,1520.19C782.008,1525.57 777.636,1529.94 772.251,1529.94C766.867,1529.94 762.495,1525.57 762.495,1520.19C762.495,1514.8 766.867,1510.43 772.251,1510.43Z" style="fill:white;"/>
-                </g>
-                <g id="Destinations" transform="matrix(1.17043,0,0,1.17043,-102.64,-325.046)">
-                    <g transform="matrix(1,0,0,1,473.185,15.2443)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,409.354,59.0551)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,138.178,64.4065)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,58.2755,208.798)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,159.358,230.065)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,45.0312,261.174)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,-48.3455,461.182)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,6.15003,525.364)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,96.7453,594.405)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,213.364,563.917)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,254.943,615.901)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,231.776,723.906)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,365.571,857.26)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,479.257,821.991)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,578.497,785.999)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,546.921,701.471)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,621.813,599.283)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,654.63,533.56)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,620.057,437.58)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,771.971,548.183)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,719.804,400.368)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,822.237,399.709)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                    <g transform="matrix(1,0,0,1,554.271,141.578)">
-                        <circle cx="772.251" cy="1520.19" r="15.244" style="fill:rgb(0,107,139);stroke:white;stroke-width:8.72px;stroke-linecap:round;stroke-linejoin:round;"/>
-                    </g>
-                </g>
-                <g id="Fast" transform="matrix(1.38034,0,0,1.38034,407.965,-1244.86)">
-                    <g transform="matrix(0.608297,0,0,0.608297,-4370.47,1413.21)">
-                        <path d="M8054.93,498.841L8081.3,399.808L8188.41,399.808L8183.29,432.236L8108.08,432.236L8095.16,474.621C8103.14,469.597 8112.56,467.086 8123.42,467.086C8140.19,467.086 8153.18,473.029 8162.37,484.914C8171.57,496.8 8175.45,512.476 8174.01,531.942C8172.93,544.859 8169.14,556.476 8162.64,566.792C8156.14,577.108 8147.59,585.047 8137.01,590.608C8126.42,596.17 8114.76,598.816 8102.02,598.547C8090.99,598.457 8080.96,595.923 8071.95,590.945C8062.93,585.966 8055.91,579.104 8050.89,570.358C8045.87,561.611 8043.31,551.856 8043.22,541.092L8080.49,541.092C8080.85,549.075 8083.05,555.332 8087.09,559.862C8091.12,564.392 8096.6,566.747 8103.5,566.926C8112.47,567.195 8119.85,563.921 8125.64,557.104C8131.42,550.286 8134.9,541.136 8136.07,529.654C8137.14,519.428 8135.59,511.355 8131.42,505.434C8127.25,499.514 8120.9,496.464 8112.38,496.284C8102.87,496.105 8094.08,499.603 8086.01,506.78L8054.93,498.841Z" style="fill:white;fill-rule:nonzero;stroke:white;stroke-width:5.68px;stroke-linecap:butt;stroke-miterlimit:2;"/>
-                    </g>
-                    <g transform="matrix(1.05786,0,0,1.05786,-8169.35,1250.75)">
-                        <path d="M8120.99,524.003L8088.97,524.003L8076.46,595.721L8037.03,595.721L8071.07,399.808L8135.93,399.942C8157.64,399.942 8174.35,405.055 8186.05,415.281C8197.76,425.508 8202.94,439.726 8201.59,457.936C8199.71,484.847 8185.36,503.55 8158.54,514.046L8186.12,593.568L8186.12,595.721L8144.14,595.721L8120.99,524.003ZM8094.62,491.306L8123.95,491.575C8134.36,491.395 8142.95,488.592 8149.72,483.165C8156.49,477.738 8160.55,470.36 8161.9,461.031C8163.15,452.329 8161.77,445.512 8157.73,440.578C8153.69,435.644 8147.28,432.998 8138.49,432.639L8104.85,432.505L8094.62,491.306Z" style="fill:white;fill-rule:nonzero;stroke:white;stroke-width:3.26px;stroke-linecap:butt;stroke-miterlimit:2;"/>
-                    </g>
-                    <g transform="matrix(1.05786,0,0,1.05786,-7901.67,1250.75)">
-                        <path d="M8174.62,523.221C8172.74,538.494 8168.74,552.059 8162.63,563.918C8156.52,575.777 8148.93,584.581 8139.86,590.331C8130.78,596.081 8120.72,598.821 8109.67,598.551C8095.57,598.192 8084.43,592.936 8076.25,582.785L8062.91,651.781L8024.91,651.781L8059.81,449.912L8094.85,449.777L8092.29,464.466C8102.8,452.607 8115.2,446.858 8129.48,447.217C8143.77,447.576 8154.86,452.764 8162.77,462.782C8170.67,472.799 8174.89,486.387 8175.43,503.546C8175.61,509.116 8175.34,515.674 8174.62,523.221ZM8136.89,520.391L8137.7,507.454C8137.88,498.74 8136.29,491.822 8132.92,486.701C8129.55,481.58 8124.63,478.93 8118.16,478.751C8107.11,478.391 8097.99,483.063 8090.8,492.765L8079.89,552.868C8083.21,561.942 8090.36,566.658 8101.32,567.018C8110.48,567.287 8118.12,563.739 8124.23,556.372C8130.33,549.005 8134.56,537.011 8136.89,520.391Z" style="fill:white;fill-rule:nonzero;stroke:white;stroke-width:3.26px;stroke-linecap:butt;stroke-miterlimit:2;"/>
-                        <path d="M8246.99,540.201L8288.63,449.912L8330.94,449.912L8245.64,617.687C8239.53,630.534 8232.37,639.967 8224.15,645.987C8215.93,652.006 8206.43,655.015 8195.65,655.015C8191.43,655.015 8185.32,654.072 8177.32,652.185L8180.15,622.538L8185.4,622.808C8197.8,623.167 8206.88,618.63 8212.63,609.197L8220.98,593.7L8197.13,449.912L8236.48,449.912L8246.99,540.201Z" style="fill:white;fill-rule:nonzero;stroke:white;stroke-width:3.26px;stroke-linecap:butt;stroke-miterlimit:2;"/>
-                    </g>
-                </g>
-                <g id="Text">
-                </g>
-            </g>
-        </g>
-    </g>
-</svg>
diff --git a/docs/_static/references.bib b/docs/_static/references.bib
new file mode 100644
index 00000000..a5072f06
--- /dev/null
+++ b/docs/_static/references.bib
@@ -0,0 +1,123 @@
+
+@article{braga_evaluating_2023,
+	title = {Evaluating the impact of public transport travel time inaccuracy and variability on socio-spatial inequalities in accessibility},
+	volume = {109},
+	doi = {10.1016/j.jtrangeo.2023.103590},
+	journal = {Journal of Transport Geography},
+	author = {Braga, Carlos Kaue V. and Loureiro, Carlos Felipe Grangeiro and Pereira, Rafael H.M.},
+	year = {2023},
+	pages = {103590},
+}
+
+@article{conway_getting_2019,
+	title = {Getting {Charlie} off the {MTA}: a multiobjective optimization method to account for cost constraints in public transit accessibility metrics},
+	volume = {33},
+	issn = {1365-8816, 1362-3087},
+	shorttitle = {Getting {Charlie} off the {MTA}},
+	doi = {10.1080/13658816.2019.1605075},
+	number = {9},
+	journal = {International Journal of Geographical Information Science},
+	author = {Conway, Matthew Wigginton and Stewart, Anson F.},
+	year = {2019},
+	pages = {1759--1787},
+}
+
+@article{conway_accounting_2018,
+	title = {Accounting for uncertainty and variation in accessibility metrics for public transport sketch planning},
+	volume = {11},
+	issn = {1938-7849},
+	doi = {10.5198/jtlu.2018.1074},
+	number = {1},
+	journal = {Journal of Transport and Land Use},
+	author = {Conway, Matthew Wigginton and Byrd, Andrew and Van Eggermond, Michael},
+	year = {2018},
+}
+
+@article{conway_evidence-based_2017,
+	title = {Evidence-{Based} {Transit} and {Land} {Use} {Sketch} {Planning} {Using} {Interactive} {Accessibility} {Methods} on {Combined} {Schedule} and {Headway}-{Based} {Networks}},
+	volume = {2653},
+	issn = {0361-1981, 2169-4052},
+	doi = {10.3141/2653-06},
+	number = {1},
+	journal = {Transportation Research Record: Journal of the Transportation Research Board},
+	author = {Conway, Matthew Wigginton and Byrd, Andrew and van der Linden, Marco},
+	year = {2017},
+	pages = {45--53},
+}
+
+@article{farber_dynamic_pt_2017,
+	title = {Dynamic public transit accessibility using travel time cubes: {Comparing} the effects of infrastructure (dis)investments over time},
+	volume = {62},
+	shorttitle = {Dynamic public transit accessibility using travel time cubes},
+	doi = {10.1016/j.compenvurbsys.2016.10.005},
+	journal = {Computers, Environment and Urban Systems},
+	author = {Farber, Steven and Fu, Liwei},
+	year = {2017},
+	pages = {30--40},
+}
+
+@article{farber_temporal_variablity_2014,
+	title = {Temporal variability in transit-based accessibility to supermarkets},
+	volume = {53},
+	doi = {10.1016/j.apgeog.2014.06.012},
+	journal = {Applied Geography},
+	author = {Farber, Steven and Morang, Melinda Z. and Widener, Michael J.},
+	year = {2014},
+	pages = {149--159},
+}
+
+@misc{fink_r5py_2022,
+	title = {r5py: {Rapid} {Realistic} {Routing} with {R5} in {Python}},
+	copyright = {MIT License, Open Access},
+	shorttitle = {r5py},
+	publisher = {Zenodo},
+	author = {Fink, Christoph and Klumpenhouwer, Willem and Saraiva, Marcus and Pereira, Rafael and Tenkanen, Henrikki},
+	year = {2022},
+	doi = {10.5281/ZENODO.7060437},
+}
+
+@article{jarv_dynamic_2018,
+	title = {Dynamic cities: {Location}-based accessibility modelling as a function of time},
+	volume = {95},
+	issn = {01436228},
+	shorttitle = {Dynamic cities},
+	doi = {10.1016/j.apgeog.2018.04.009},
+	journal = {Applied Geography},
+	author = {Järv, Olle and Tenkanen, Henrikki and Salonen, Maria and Ahas, Rein and Toivonen, Tuuli},
+	year = {2018},
+	pages = {101--110},
+}
+
+@article{salonen_modelling_2013,
+	title = {Modelling travel time in urban networks: comparable measures for private car and public transport},
+	volume = {31},
+	issn = {09666923},
+	shorttitle = {Modelling travel time in urban networks},
+	doi = {10.1016/j.jtrangeo.2013.06.011},
+	journal = {Journal of Transport Geography},
+	author = {Salonen, Maria and Toivonen, Tuuli},
+	year = {2013},
+	pages = {143--153},
+}
+
+@article{herszenhut_impact_2022,
+	title = {The impact of transit monetary costs on transport inequality},
+	volume = {99},
+	doi = {10.1016/j.jtrangeo.2022.103309},
+	journal = {Journal of Transport Geography},
+	author = {Herszenhut, Daniel and Pereira, Rafael H.M. and Portugal, Licinio Da Silva and Oliveira, Matheus Henrique De Sousa},
+	year = {2022},
+	pages = {103309},
+}
+
+@article{tenkanen_longitudinal_2020,
+	title = {Longitudinal spatial dataset on travel times and distances by different travel modes in {Helsinki} {Region}},
+	volume = {7},
+	issn = {2052-4463},
+	doi = {10.1038/s41597-020-0413-y},
+	number = {1},
+	journal = {Scientific Data},
+	author = {Tenkanen, Henrikki and Toivonen, Tuuli},
+	year = {2020},
+	pages = {77},
+}
diff --git a/docs/citation.md b/docs/citation.md
deleted file mode 100644
index 76508858..00000000
--- a/docs/citation.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# License and citation
-
-## Citation
-
-If you use **r5py** for scientific research, please cite it in your publications: <br />
-Fink, C., Klumpenhouwer, W., Saraiva, M., Pereira, R., &amp; Tenkanen, H., 2022: *r5py: Rapid Realistic Routing with R5 in Python*. [DOI:10.5281/zenodo.7060437](https://doi.org/10.5281/zenodo.7060437)
-
-
-## License
-
-This work is dual-licensed under GNU General Public License v3.0 or later and MIT License.
-You can choose between the two depending on which license fits your project better.
-
-`SPDX-License-Identifier: GPL-3.0-or-later OR MIT`
-
diff --git a/docs/conf.py b/docs/conf.py
index f5452219..c5b10365 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,107 +1,116 @@
 # Configuration file for the Sphinx documentation builder.
 #
-# This file only contains a selection of the most common options. For a full
-# list see the documentation:
+# For the full list of built-in configuration values, see the documentation:
 # https://www.sphinx-doc.org/en/master/usage/configuration.html
 
-# -- Path setup --------------------------------------------------------------
 
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
+import pathlib
+import sys
+
+# import matplotlib here, otherwise we get the
+# ‘building font cache’ warning in the middle of
+# a notebook (when it runs for the first time)
+import matplotlib.pyplot
+
+# -- Add project paths -------------------------------------------------------
+sys.path = [
+    str(pathlib.Path().resolve().parent / "src"),
+    str(pathlib.Path().resolve()),
+    str(pathlib.Path().resolve() / "_extensions"),
+] + sys.path
+
+from _helpers.binder_ref import BINDER_REF
+from _helpers.citation_style import R5PY_CITATION_STYLE, R5PY_REFERENCE_STYLE
 
 
 # -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
 
 project = "r5py"
-copyright = "2022, r5py contributors"
+copyright = "2023, r5py contributors"
 author = "r5py contributors"
 
 
 # -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
 
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
 extensions = [
+    "bibliography_as_sphinxdesign_cards",
+    "myst_nb",
     "sphinx.ext.autodoc",
+    "sphinx.ext.intersphinx",
     "sphinx.ext.napoleon",
-    "IPython.sphinxext.ipython_console_highlighting",
-    "myst_nb",
+    "sphinx_design",
+    "sphinxcontrib.bibtex",
+    "sphinxcontrib.images",
 ]
 
-# Add any paths that contain templates here, relative to this directory.
 templates_path = ["_templates"]
+exclude_patterns = [
+    "_build",
+    "jupyter_execute",
+    "_static",
+]
 
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
-
-
-# -- Options for HTML output -------------------------------------------------
+source_suffix = {
+    ".rst": "restructuredtext",
+    ".ipynb": "myst-nb",
+    ".myst": "myst-nb",
+}
 
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sphinx_book_theme"
+myst_enable_extensions = [
+    "colon_fence",
+    "deflist",
+    "substitution",
+]
+myst_heading_anchors = 3  # add #id to h1-h3
 
-# if we are building a stable version, point the binder link to branch `stable`,
-# otherwise, point to branch `main`
-import os
 
-try:
-    READTHEDOCS_VERSION = os.environ["READTHEDOCS_VERSION"]
-except KeyError:  # not running on RTD
-    READTHEDOCS_VERSION = ""
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
 
-if READTHEDOCS_VERSION == "stable":
-    BINDER_REF = "stable"  # stable is synced with last version tag/release
-elif READTHEDOCS_VERSION == "latest":
-    BINDER_REF = "main"
-else:
-    import git
+html_logo = "_static/images/r5py_blue.svg"
+html_favicon = "_static/images/favicon.png"
+html_title = ""
+html_short_title = "r5py"
 
-    repository = git.Repo(search_parent_directories=True)
-    BINDER_REF = repository.git.rev_parse(repository.head.commit.hexsha, short=True)
+html_static_path = ["_static"]
+html_css_files = ["custom.css"]
+html_last_updated_fmt = "%d %B %Y"
 
+html_theme = "sphinx_book_theme"
 html_theme_options = {
-    # "external_links": [],
-    "repository_url": "https://github.com/r5py/r5py/",
-    "repository_branch": BINDER_REF,
-    "path_to_docs": "docs",
-    "use_edit_page_button": True,
+    "collapse_navigation": False,
     "launch_buttons": {
-        "binderhub_url": "https://notebooks.gesis.org/binder",
-        "thebelab": False,
-        "notebook_interface": "jupyterlab",
+        "binderhub_url": "https://notebooks.gesis.org",
+        "notebook_interface": "classic",
     },
+    "path_to_docs": "docs",
+    "repository_branch": BINDER_REF,
+    "repository_url": "https://github.com/r5py/r5py/",
+    "use_edit_page_button": True,
+    "use_repository_button": True,
 }
 
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ["_static"]
-
 # include __init__() in API doc
 autoclass_content = "init"
 
-# add r5py’s package directory to path
-import pathlib
-import sys
-
-sys.path.insert(0, str(pathlib.Path().absolute().parent / "src"))
-
-# Do not execute cells
-# (comment out following if you want to exclude executing notebooks during docs building)
-# jupyter_execute_notebooks = "off"
-
-# Hide title in left navbar
-html_title = ""
+intersphinx_mapping = {
+    "geopandas": ("https://geopandas.org/en/stable/", None),
+    "gtfslite": ("https://gtfs-lite.readthedocs.io/en/stable/", None),
+    "pandas": ("https://pandas.pydata.org/docs/", None),
+    "python": ("https://docs.python.org/3/", None),
+    "shapely": ("https://shapely.readthedocs.io/en/stable/", None),
+}
 
-# Logo
-html_logo = "_static/r5py_blue.svg"
+nb_execution_mode = "force"
+nb_execution_timeout = 120  # needed, e.g., when matplotlib updates its font cache
+nb_execution_show_tb = True  # show traceback in case of error
+
+# set bibtex citation style options
+bibtex_reference_style = "author_year"
+bibtex_bibfiles = ["_static/references.bib"]
+bibtex_default_style = R5PY_CITATION_STYLE
+bibtex_reference_style = R5PY_REFERENCE_STYLE
+bibtex_cite_id = "{key}"
+suppress_warnings = ["bibtex.duplicate_label"]
diff --git a/docs/configuration.md b/docs/configuration.md
deleted file mode 100644
index 01b769e9..00000000
--- a/docs/configuration.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# Configuration
-
-## Configuration via config files
-
-**R5py** can be configured using a configuration file `r5py.yml`, for which the
-package searches in the following paths:
-
-- On Unix-like operating systems (such as most Linux and BSD distributions,
-  as well as MacOS): 
-  - `${XDG_CONFIG_HOME}/r5py.yml` or `~/.config/r5py.yml` for per-user
-    configuration (if both files exist, only the former is read)
-  - `/etc/r5py.yml` for system-wide configuration (user config overrides system
-    config)
-- On Windows operating systems:
-  - `%APPDATA%\\r5py.yml`. The precise path of the `%APPDATA%` directory depends
-    on your user name and locale (enter `%APPDATA%` in a Windows Explorer’s search
-    bar to navigate to it).
-
-
-## Configuration from the command line
-
-When running **r5py** from the command line, you can supply command line arguments.
-To show available options, consult the [table below](#configuration-command-line-options), or run:
-
-```bash
-python -m r5py --help
-```
-
-
-## Using command line options in a script or notebook
-
-If you use **r5py** in a script, or run it from a notebook and don’t want to rely on a
-configuration file, you can set command line arguments *before* importing r5py::
-
-```python
-import sys
-sys.argv.append(["--max-memory", "12G"])
-import r5py
-```
-
-From the [table below](#configuration-command-line-options) , look up the available
-options from the *command line argument* column.
-
-
-## Configuration/command line options
-
-configuration file option | command line argument      | explanation                      | default value
-------------------------- | -------------------------- | -------------------------------- | ---------------------------------
-`max-memory: [value]`        | `--max-memory [value],`<br>`-m [value]` | Set the limit for the Java Virtual Machine’s heap size (`-Xmx`). This option accepts either absolute values (integer or decimal), optionally with a suffix to indicate Mibibytes, Gibibytes, or Tebibytes: `M`, `G`, `T`), or relative, expressed in a percentage of total memory, with a `%` suffix. | `80%`
-`r5-classpath: [classpath]` | `--r5-classpath [classpath],`<br>`-r [classpath]` | Point to R5’s JAR (or build directory) in case you want to use a custom R5 installation. | `/usr/share/java/r5/r5-all.jar`
-`verbose: [boolean]`        | `--verbose`, `-v`              | Show more detailed output        | `False` in configuration file, not specified on commandline
-
-
-## Setting the maximum Java heap size (memory use)
-
-A *Java Virtual Machine* (JVM) typically restricts the memory usage of programs it runs.
-More specifically, the *heap size* can be limited (see
-[this stackoverflow discussion](https://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting-jvm)
-for details). 
-
-The tasks carried out by **R5** under the hood of **r5py** are fairly memory-intensive,
-which is why, by default, r5py allows the JVM to grant up to 80% of total memory to R5 
-(but always leaving at least 2 GiB to the system and other processes).
-
-You might want to lower this limit if you are running other tasks in parallel, or raise
-it, if you have a dedicated computer with large memory and small operating system
-requirements.
-
-As outlined above, you can either create a configuration file, and set `max-memory`
-there, specify the `--max-memory` or `-m` command line arguments, or add the same
-arguments to `sys.argv`.
-
-For instance, to set the maximum heap size to a fixed 12 GiB, you can create a
-configuration file in the [location suitable for your operating
-system](#configuration-via-config-files), and add the following line:
-
-```yaml
-max-memory: 12G
-```
-
-
-## Using a custom installation of R5
-
-For some use cases, it can be useful to use a local copy of **R5**, rather than the one
-downloaded by **r5py**, for instance, in order to apply custom patches to extend or
-modify R5’s functionality, or to force the use of a certain version for longitudinal
-comparability. 
-
-This can be achieved by either installing R5 into the default class path
-`/usr/share/java/r5/r5-all.jar`, or by using a configuration option or command line
-argument to change the class path. 
-
-For example, to set a custom classpath inside a Python notebook, you can set `sys.argv`
-before importing `r5py`:
-
-```python
-import sys
-sys.argv.append(["--r5-classpath", "/opt/r5/"])
-import r5py
-```
diff --git a/docs/CODE_OF_CONDUCT.md b/docs/contributing/CODE_OF_CONDUCT.md
similarity index 100%
rename from docs/CODE_OF_CONDUCT.md
rename to docs/contributing/CODE_OF_CONDUCT.md
diff --git a/docs/contributing/CONTRIBUTING.md b/docs/contributing/CONTRIBUTING.md
new file mode 100644
index 00000000..2e96283b
--- /dev/null
+++ b/docs/contributing/CONTRIBUTING.md
@@ -0,0 +1,246 @@
+# How to contribute to *r5py*
+
+Contributions of any kind to *r5py* are more than welcome. That does not mean
+new code only, but also improvements of documentation and user guide, additional
+tests (ideally filling the gaps in existing suite) or a bug report. In addition,
+we warmly welcome ideas of new features that could be added to the *r5py*, or
+ideas how to improve the existing codebase.
+
+All contributions should go through our GitHub repository. Bug reports, ideas or
+even questions should be raised by opening an issue on the GitHub tracker.
+Suggestions for changes in code or documentation should be submitted as a pull
+request. However, if you are not sure what to do, feel free to open an issue.
+All discussion will then take place on GitHub to keep the development of *r5py*
+transparent.
+
+If you decide to contribute to the codebase, ensure that you are using an
+up-to-date `main` branch. The latest development version will always be there,
+including the documentation (powered by [sphinx](https://www.sphinx-doc.org/)).
+
+## Seven Steps for Contributing
+
+There are seven basic steps to contributing to *r5py*:
+
+1. [Fork the *r5py* git repository](#1-fork-the-r5py-git-repository)
+2. [Create a development environment with *r5py*
+   dependencies](#2-create-a-development-environment)
+3. [Make a development build of *r5py*](#3-make-a-development-build)
+4. [Make changes to the code and add tests](#4-make-changes-and-write-tests)
+5. [Update the documentation](#5-update-the-documentation-and-user-guide)
+6. [Format and lint the code](#6-format-the-code)
+7. [Submit a Pull Request](#7-submit-a-pull-request)
+
+Each of the steps is detailed below.
+
+### 1. Fork the *r5py* git repository
+
+Git can be complicated for new users, but you no longer need to use command line
+to work with git. If you are not familiar with git, we recommend using tools on
+Github.com, GitHub Desktop or tools with included git like Atom or PyCharm.
+However, if you want to use command line, you can fork the *r5py* repository
+using following:
+
+:::{code} sh
+
+git clone git@github.com:your-user-name/r5py.git r5py-yourname
+cd r5py-yourname
+git remote add upstream git://github.com/r5py/r5py.git
+
+:::
+
+This creates the directory `r5py-yourname` and connects your repository to
+the upstream (main project) r5py repository.
+
+Then simply create a new branch of main branch.
+
+### 2. Create a development environment
+
+A development environment is a virtual space where you can keep an independent
+installation of *r5py*. This makes it easy to keep both a stable version of
+python in one place you use for work, and a development version (which you may
+break while playing with code) in another.
+
+An easy way to create a *r5py* development environment is as follows:
+
+- Install [MambaForge](https://github.com/conda-forge/miniforge#mambaforge) (or
+  [install mamba using
+  conda](https://r5py.readthedocs.io/en/latest/installation.html#install-mamba))
+- Make sure that you have **cloned the *r5py* repository**
+- `cd` to the *r5py* source directory (the root folder)
+
+Tell `mamba` to create a new environment from a [YAML
+file](https://github.com/r5py/r5py/blob/main/ci/python_311_dev.yaml) inside `ci`
+directory, by running:
+
+:::{code} sh
+
+mamba env create -f ci/python_311_dev.yaml
+
+:::
+
+This will create a new environment called `r5py`, and not touch any of your
+existing environments, nor existing python installations. The environment
+includes all necessary dependencies for *r5py*, as well as optional packages for
+running tests and building docs.  With this environment, you can directly start
+working with *r5py*.
+
+To work in this environment, you should `activate` it as follows:
+
+:::{code} sh
+
+conda activate r5py
+
+:::
+
+You will then see a confirmation message to indicate you are in the new
+development environment.
+
+To view your environments:
+
+:::{code} sh
+
+  conda info -e
+
+:::
+
+To return to you home root environment::
+
+:::{code} sh
+
+  deactivate
+
+:::
+
+See the full conda docs [here](http://conda.pydata.org/docs).
+
+### 3. Make a development build
+
+Once dependencies are in place, make an in-place build by navigating to the git
+clone of the *r5py* repository and run:
+
+:::{code} sh
+
+pip install .
+
+:::
+
+This will install *r5py* from the source into your environment.
+
+### 4. Make changes and write tests
+
+*r5py* is serious about testing and strongly encourages contributors to embrace
+[test-driven development
+(TDD)](http://en.wikipedia.org/wiki/Test-driven_development).  This development
+process "relies on the repetition of a very short development cycle: first the
+developer writes an (initially failing) automated test case that defines a
+desired improvement or new function, then produces the minimum amount of code to
+pass that test." So, before actually writing any code, you should write your
+tests. Often the test can be taken from the original GitHub issue. However, it
+is always worth considering additional use cases and writing corresponding
+tests.
+
+*r5py* uses the [pytest testing system](http://doc.pytest.org/en/latest).
+
+#### Write tests
+
+All tests should go into the `tests` directory. This folder contains many
+current examples of tests, and we suggest looking to these for inspiration.
+
+#### Run the test suite
+
+The tests can then be run directly inside your Git clone without having to
+install *r5py*. Run the tests by typing (`v` means *verbose*):
+
+:::{code} sh
+
+pytest -v
+
+:::
+
+
+### 5. Update the documentation and user guide
+
+*r5py* documentation resides in the `docs` folder. Changes to the docs are make
+by modifying the appropriate file within `docs`.  *r5py* docs uses [Myst
+notebooks](https://myst-nb.readthedocs.io/), a format for executable notebooks
+using a syntax based on Markdown. Docstrings follow the [Numpy Docstring
+standard](https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt).
+
+Once you have made your changes, you may try if they render correctly by
+building the docs using Sphinx (comes with `r5py` environment if [installed from
+the YAML file](#2-create-a-development-environment)).  To do so, you can
+navigate to the `docs` folder and type:
+
+:::{code} python
+
+python -m sphinx . _build
+
+:::
+
+The resulting html pages will be located in `docs/_build/html/`.
+
+
+### 6. Format the code
+
+#### Python (PEP8 / black)
+
+*r5py* follows the [PEP8](http://www.python.org/dev/peps/pep-0008) standard
+and uses [Black](https://black.readthedocs.io/en/stable/) to ensure a consistent code format throughout the project.
+
+CI will run `black --check` and fails if there are files which would be
+auto-formatted by `black`. Therefore, it is helpful before submitting code to
+auto-format your code::
+
+:::{code} python
+
+black src
+
+:::
+
+Additionally, many editors have plugins that will apply `black` as you edit files.
+If you don't have black, you can install it using pip:
+
+:::{code} python
+
+pip install black
+
+:::
+
+
+#### Import order, import of submodules
+
+**R5py** uses [jpype](https://jpype.readthedocs.io), with the help of which Java
+classes can be imported using normal `import` statements. As a consequence, the
+order of import statements at the beginning of source files plays a crucial
+role.
+
+By convention, in *r5py* source files, the import statements should be grouped
+in the following order:
+
+1. Imports of modules of the Python Standard Library
+2. Imports of third-party Python modules
+3. Relative imports of other *r5py* modules
+4. Imports of Java classes
+
+The modules of each group should be sorted alphabetically, the groups be
+separated by an empty line.
+
+The import of submodules (`from ... import ...`), as well as the use of aliases
+for imported modules (`import ... as ...`) are discouraged. An exception to this
+rule, assets from other modules from within *r5py* should always be imported as
+submodules (`from . import TravelTimeMatrixComputer`).
+
+
+### 7. Submit a *Pull Request*
+
+Once you've made changes and pushed them to your forked repository, you then
+submit a pull request to have them integrated into the *r5py* code base.
+
+You can find a pull request (or PR) tutorial in the [GitHub's Help
+Docs](https://help.github.com/articles/using-pull-requests).
+
+### References
+
+These contribution guidelines are largely based on
+[pyrosm](https://pyrosm.readthedocs.io/en/latest/) and
+[momepy](http://docs.momepy.org/en/stable/) -libraries.
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..7926880e
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,52 @@
+# *R⁵py* – rapid realistic routing with Python
+
+
+:::{thumbnail} _static/images/HowWellDoesPublicTransportWorkForSlowWalkers_1200x720px.png
+:alt: A map showing the Helsinki metropolitan area, and how walking slowly changes the efficieny of the public transport network.
+:title: A travel time matrix made with <em>r5py</em>
+:show_caption: 1
+:class: align-default
+:::
+
+
+**R⁵py** is a Python library for rapid realistic routing on multimodal
+transport networks (walk, bike, public transport and car).  It provides a
+simple and friendly interface to R⁵, the Rapid Realistic Routing on
+Real-world and Reimagined networks, the [routing
+engine](https://github.com/conveyal/r5) developed by Conveyal. *r5py* is
+inspired by [r5r, a wrapper for R](https://ipeagit.github.io/r5r/), and it is
+designed to interact with [GeoPandas](https://geopandas.org/) GeoDataFrames.
+
+*R5py* offers a simple way to run R⁵ locally with Python, allowing the users to
+calculate travel time matrices and accessibility by different travel modes.  To
+get started, take a look at the [user
+manual](user-guide/user-manual/quickstart) that includes a detailed
+demonstration of *r5py* in action.  Over time, *r5py* will be expanded to
+incorporate other functionalities from R⁵.
+
+:::{toctree}
+:caption: User guide
+:maxdepth: 1
+:hidden:
+
+User manual <user-guide/user-manual/quickstart>
+user-guide/installation/installation
+user-guide/citation
+:::
+
+:::{toctree}
+:caption: Contributing
+:maxdepth: 1
+:hidden:
+
+contributing/CONTRIBUTING
+Code of conduct <contributing/CODE_OF_CONDUCT>
+:::
+
+:::{toctree}
+:caption: API reference
+:maxdepth: 1
+:hidden:
+
+Module contents <reference/reference>
+:::
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 9047091a..00000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-R5py
-====
-
-**R5py** is a Python library for rapid realistic routing on multimodal transport networks (walk, bike, public transport and car).
-It provides a simple and friendly interface to R\ :sup:`5`\ , the Rapid Realistic Routing on Real-world and Reimagined networks,
-the `routing engine <https://github.com/conveyal/r5>`_ developed by Conveyal. ``r5py`` is inspired by `r5r, a wrapper for R <https://ipeagit.github.io/r5r/>`_,
-and it is designed to interact with `GeoPandas <https://geopandas.org/>`_ GeoDataFrames.
-
-``R5py`` offers a simple way to run R5 locally with Python, allowing the users to calculate travel time matrices and accessibility by different travel modes.
-To get started, see a detailed demonstration of the ``r5py`` in action from the :doc:`notebooks/basic-usage` -section.
-Over time, ``r5py`` will be expanded to incorporate other functionalities from R5.
-
-
-.. toctree::
-   :maxdepth: 2
-   :caption: Contents
-
-   installation
-   configuration
-   notebooks/basic-usage.ipynb
-   CONTRIBUTING
-   Code of conduct <CODE_OF_CONDUCT>
-   citation
-
-.. toctree::
-    :caption: Reference
-
-    Module contents <reference>
diff --git a/docs/installation.md b/docs/installation.md
deleted file mode 100644
index 95bdfe95..00000000
--- a/docs/installation.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# Installation
-
-```{note}
-There are many different ways to install **r5py** on your computer. Below, we describe the most
-commonly used ones.  If you don’t have any particular preferences, we recommend to try `mamba`,
-which will install r5py and all dependencies (*except* a Java Development Kit) from conda-forge.
-
-Please see the [dependencies](#dependencies) section to understand what will be installed on your computer.
-```
-
-
-## Install using `mamba`
-
-[Mambaforge](https://github.com/conda-forge/miniforge#mambaforge) (available for Windows/Linux/Mac)
-is a drop-in replacement for the popular package manager [Miniconda](https://docs.conda.io/en/latest/miniconda.html).
-It comes with a significantly faster package manager called `mamba`. By default, MambaForge uses only the
-`conda-forge` channel to fetch packages. This helps to avoid dependency conflicts and potential
-issues with licensing (see [this blog post](https://florianwilhelm.info/2021/09/Handling_Anaconda_without_getting_constricted/)).
-
-If you are new to the (sometimes confusing) world of Python package managers, you can read more about them
-[here](https://python-gis-book.readthedocs.io/en/develop/part1/chapter-01/nb/05-installation.html).
-
-
-### Install `mamba`
-
-First, make sure that you have `mamba` available on your system. You can either download it from
-[Mambaforge](https://github.com/conda-forge/miniforge#mambaforge), or use `conda`:
-
-     conda install -n base -c conda-forge mamba
-
-
-### Install `r5py` in your existing environment
-
-To install r5py, run:
-
-     mamba install -c conda-forge r5py
-
-
-### Install `r5py` into a dedicated Python environment
-
-You can also install r5py (plus a few other Python packages that are useful
-when working with it, such as, e.g., [Geopandas](https://geopandas.org/)) into
-a dedicated conda environment.
-
-1. [Download the `r5py_distro.yaml` file](https://github.com/r5py/r5py/blob/main/ci/r5py_distro.yaml)
-2. Run the following command to install the packages into a new environment named `r5py-env`:
-
-        mamba env create -f r5py_distro.yaml
-
-
-4. Activate the `r5py-env` environment:
-
-        conda activate r5py-env
-
-After this, you can start using the `r5py` library in the environment, e.g., using
-[JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) (installed as part of the environment).
-
-## Install using `conda`
-
-If you prefer to use conda as your Python package manager, follow the same instructions as above,
-but replace `mamba` with `conda`:
-
-To install r5py with `conda`, run:
-
-     conda install -c conda-forge r5py
-
-Alternatively, to create a dedicated Python environment, [download the `r5py_distro.yaml`
-file](https://github.com/r5py/r5py/blob/main/ci/r5py_distro.yaml), and use conda to create and activate the environment:
-
-    conda env create -f r5py_distro.yaml
-    conda activate r5py-env
-
-## Install using `pip`
-
-The ‘classic’ way to install Python packages is from the PyPi repository, using `pip`:
-
-    pip install r5py
-
-## Dependencies
-
-**R5py** relies on a few external dependencies, most noteably a Java environment. 
-
-### Java Development Kit
-
-To interface with R5, **r5py** requires a *Java Development Kit* (jdk).
-Please install a JDK in version 11, for instance, [OpenJDK](https://openjdk.java.net/java-se-ri/11).
-
-
-### R5
-
-**R5py** searches for a local R5 installation in the default class path (`/usr/share/java/r5/r5-all.jar`).
-If it is not found, it automatically downloads its own copy of R5. The class path can be configured to
-point to a different location, see *[Configuration](configuration)*).
-
-```{note}
-We generally recommend to install OpenJDK 11 (and R5, if available) using your operating system’s
-package manager. That way, your system can keep track of installed packages and provide security
-updates; as a side effect, your project directories/environments stay smaller.
-```
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 153be5e2..00000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.https://www.sphinx-doc.org/
-	exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/md/basic-usage.md b/docs/md/basic-usage.md
deleted file mode 100644
index 197af54d..00000000
--- a/docs/md/basic-usage.md
+++ /dev/null
@@ -1,318 +0,0 @@
----
-jupyter:
-  jupytext:
-    text_representation:
-      extension: .md
-      format_name: markdown
-      format_version: '1.3'
-      jupytext_version: 1.14.4
-  kernelspec:
-    display_name: Python 3 (ipykernel)
-    language: python
-    name: python3
----
-
-# Usage
-
-## Introduction
-
-**R5py** is a Python library for routing and calculating travel time matrices on multimodal transport networks (walk, bike, public transport and car).
-It provides a simple and friendly interface to R<sup>5</sup> (*the Rapid Realistic Routing on Real-world and Reimagined networks*) which is a [routing engine](https://github.com/conveyal/r5) developed by [Conveyal](https://conveyal.com/). `R5py` is designed to interact with [GeoPandas](https://geopandas.org) GeoDataFrames, and it is inspired by [r5r](https://ipeagit.github.io/r5r) which is a similar wrapper developed for R. `R5py` exposes some of R5’s functionality via its [Python API](reference.html), in a syntax similar to r5r’s. At the time of this writing, only the computation of travel time matrices has been fully implemented. Over time, `r5py` will be expanded to incorporate other functionalities from R5. 
-
-<!-- #region -->
-## Data requirements
-
-### Data for creating a routable network
-
-When calculating travel times with `r5py`, you typically need a couple of datasets: 
-
-- **A road network dataset from OpenStreetMap** (OSM) in Protocolbuffer Binary (`.pbf`) format: 
-  - This data is used for finding the fastest routes and calculating the travel times based on walking, cycling and driving. In addition, this data is used for walking/cycling legs between stops when routing with transit. 
-  - *Hint*: Sometimes you might need modify the OSM data beforehand, e.g., by cropping the data or adding special costs for travelling (e.g., for considering slope when cycling/walking). When doing this, you should follow the instructions on the [Conveyal website](https://docs.conveyal.com/prepare-inputs#preparing-the-osm-data). For adding customized costs for pedestrian and cycling analyses, see [this repository](https://github.com/RSGInc/ladot_analysis_dataprep).
-
-- **A transit schedule dataset** in General Transit Feed Specification (GTFS.zip) format (optional):
-   - This data contains all the necessary information for calculating travel times based on public transport, such as stops, routes, trips and the schedules when the vehicles are passing a specific stop. You can read about the [GTFS standard here](https://developers.google.com/transit/gtfs/reference).
-   - *Hint*: `r5py` can also combine multiple GTFS files, as sometimes you might have different GTFS feeds representing, e.g., the bus and metro connections. 
-
-
-### Data for origin and destination locations
-
-In addition to OSM and GTFS datasets, you need data that represents the origin and destination locations (OD-data) for routings. This data is typically stored in one of the geospatial data formats, such as Shapefile, GeoJSON or GeoPackage. As `r5py` is built on top of `geopandas`, it is easy to read OD-data from various different data formats. 
-
-
-### Where to get these datasets?
-
-Here are a few places from where you can download the datasets for creating the routable network:
-
-- **OpenStreetMap data in PBF-format**:
-
-  - [pyrosm](https://pyrosm.readthedocs.io/en/latest/basics.html#protobuf-file-what-is-it-and-how-to-get-one)  library. Allows downloading data directly from Python (based on GeoFabrik and BBBike).
-  - [pydriosm](https://pydriosm.readthedocs.io/en/latest/quick-start.html#download-data) library. Allows downloading data directly from Python (based on GeoFabrik and BBBike).
-  - [GeoFabrik](http://download.geofabrik.de/) website. Has data extracts for many pre-defined areas (countries, regions, etc).
-  - [BBBike](https://download.bbbike.org/osm/bbbike/) website. Has data extracts readily available for many cities across the world. Also supports downloading data by [specifying your own area or interest](https://extract.bbbike.org/).
-  - [Protomaps](https://protomaps.com/downloads/osm) website. Allows to download the data with custom extent by specifying your own area of interest.
-
-
-- **GTFS data**:  
-  - [Transitfeeds](https://transitfeeds.com/) website. Easy to navigate and find GTFS data for different countries and cities. Includes current and historical GTFS data. Notice: The site will be deprecated in the future.  
-  - [Mobility Database](https://database.mobilitydata.org) website. Will eventually replace TransitFeeds. 
-  - [Transitland](https://www.transit.land/operators) website. Find data based on country, operator or feed name. Includes current and historical GTFS data.
-
-### Sample datasets
-
-In the following tutorial, we use various open source datasets:
-- The point dataset for Helsinki has been obtained from [Helsinki Region Environmental Services](https://www.hsy.fi/en/environmental-information/open-data/avoin-data---sivut/population-grid-of-helsinki-metropolitan-area/) (HSY) licensed under a Creative Commons By Attribution 4.0. 
-- The street network for Helsinki is a cropped and filtered extract of OpenStreetMap (© OpenStreetMap contributors, [ODbL license](https://www.openstreetmap.org/copyright))
-- The GTFS transport schedule dataset for Helsinki is a cropped and minimised copy of Helsingin seudun liikenne’s (HSL) open dataset ([Creative Commons BY 4.0](https://www.hsl.fi/hsl/avoin-data#aineistojen-kayttoehdot)).
-<!-- #endregion -->
-
-## Installation
-
-Before you can start using `r5py`, you need to install it and a few libraries. Check [installation instructions](../installation.md) for more details. 
-
-
-## Configuring `r5py` before using it
-
-It is possible to configure `r5py` in a few different ways (see [configuration instructions](../configuration.md) for details). One of the options that you most likely want to adjust, is **configuring how much memory** (RAM) `r5py` will consume during the calculations. `r5py` runs a powerful Java engine under the hood, and by default it will use **80 % of the available memory** for doing the calculations. However, you can easily adjust this. 
-
-If you want to allocate, e.g., a maximum of 5 Gb of RAM for the tool, you can do so by running:
-
-```python
-import sys
-sys.argv.append(["--max-memory", "5G"])
-```
-
-By running this, `r5py` will use **at maximum** 5 Gb of memory. However, it does not mean that the tool will necessary use all of this memory if it does not need it. 
-
-```{important} 
-Notice that changing the amount of allocated memory should alway be done as the first thing in your script, i.e. it should be run **before** importing `r5py`. 
-```
-
-
-## Getting started with `r5py`
-
-Next, we will learn how to calculate travel times with `r5py` between locations spread around the city center area of Helsinki, Finland. 
-
-### Load the origin and destination data
-
-Let's start by downloading a sample point dataset into a geopandas `GeoDataFrame` that we can use as our origin and destination locations. For the sake of this exercise, we have prepared a grid of points covering parts of Helsinki. The point data also contains the number of residents of each 250 meter cell:
-
-```python
-import geopandas 
-
-# temporary fix, this is not getting published as such, anyway, but only after PR #238 is merged
-points_url = "https://github.com/r5py/r5py/raw/stable/docs/data/Helsinki/population_points_2020.gpkg"
-points = geopandas.read_file(points_url)
-points.head()
-```
-
-The `points` GeoDataFrame contains a few columns, namely `id`, `population` and `geometry`. The `id` column with unique values and `geometry` columns are required for `r5py` to work. If your input point dataset does not have an `id` column with unique values, `r5py` will throw an error. 
-
-To get a better sense of the data, let's create a map that shows the locations of the points and visualise the number of people living in each cell (the cells are represented by their centre point):
-
-```python
-points.explore("population", cmap="Reds", marker_kwds={"radius": 12})
-```
-
-Let's pick one of these points to represent our **origin** and store it in a separate GeoDataFrame:
-
-```python
-origin = points.loc[points["id"] == 54].copy()
-origin.explore(color="blue", max_zoom=14, marker_kwds={"radius": 12})
-```
-
-<!-- #region tags=[] -->
-### Load transport network
-
-Virtually all operations of `r5py` require a transport network. In this example, we use data from Helsinki metropolitan area, which you can find in the source code repository of r5py in `docs/data/` [(see here)](https://github.com/r5py/r5py/tree/main/docs/data). To import the street and public transport networks, instantiate an `r5py.TransportNetwork` with the file paths to the OSM extract and the GTFS files:
-<!-- #endregion -->
-
-```python nbsphinx="hidden" tags=["remove-cell"]
-# this cell is hidden from output
-# it’s used to set sys.path to point to the local repo
-import pathlib
-import sys
-sys.path.insert(0, str(pathlib.Path().absolute().parent.parent / "src"))
-DATA_DIR = str(pathlib.Path().absolute().parent / "data")
-```
-
-```python
-# Allow 8 GB of memory
-import sys
-sys.argv.append(["--max-memory", "8G"])
-```
-
-```python
-from r5py import TransportNetwork
-
-transport_network = TransportNetwork(
-    f"{DATA_DIR}/Helsinki/kantakaupunki.osm.pbf",
-    [
-        f"{DATA_DIR}/Helsinki/GTFS.zip"
-    ]
-)
-```
-
-At this stage, `r5py` has created the routable transport network and it is stored in the `transport_network` variable. We can now start using this network for doing the travel time calculations. 
-
-
-### Compute travel time matrix from one to all locations
-
-A travel time matrix is a dataset detailing the travel costs (e.g., time) between given locations (origins and destinations) in a study area. To compute a travel time matrix with `r5py` based on public transportation, we first need to initialize an `r5py.TravelTimeMatrixComputer` object. As inputs, we pass following arguments for the `TravelTimeMatrixComputer`:
-- `transport_network`, which we created in the previous step representing the routable transport network. 
-- `origins`, which is a GeoDataFrame with one location that we created earlier (however, you can also use multiple locations as origins).
-- `destinations`, which is a GeoDataFrame representing the destinations (in our case, the `points` GeoDataFrame). 
-- `departure`, which should be Python's `datetime` object (in our case standing for "22nd of February 2022 at 08:30") to tell `r5py` that the schedules of this specific time and day should be used for doing the calculations. 
-   - *Note*: By default, `r5py` summarizes and calculates a median travel time from all possible connections within one hour from given depature time (with 1 minute frequency). It is possible to adjust this time window using `departure_time_window` parameter ([see details here]((https://r5py.readthedocs.io/en/stable/reference.html#r5py.RegionalTask))). 
-- `transport_modes`, which determines the travel modes that will be used in the calculations. These can be passed using the options from the `TransitMode` and `LegMode` classes. 
-  - *Hint*: To see all available options, run `help(TransitMode)` or `help(LegMode)`.  
-
-```{note} In addition to these ones, the constructor also accepts many other parameters [listed here](https://r5py.readthedocs.io/en/stable/reference.html#r5py.RegionalTask), such as walking and cycling speed, maximum trip duration, maximum number of transit connections used during the trip, etc. 
-```
-
-Now, we will first create a `travel_time_matrix_computer` instance as described above:
-
-```python
-import datetime
-from r5py import TravelTimeMatrixComputer, TransitMode, LegMode
-
-
-travel_time_matrix_computer = TravelTimeMatrixComputer(
-    transport_network,
-    origins=origin,
-    destinations=points,
-    departure=datetime.datetime(2022,2,22,8,30),
-    transport_modes=[TransitMode.TRANSIT, LegMode.WALK]
-)
-
-```
-
-Running this initializes the `TravelTimeMatrixComputer`, but any calculations were not done yet.
-To actually run the computations, we need to call `.compute_travel_times()` on the instance, which will calculate the travel times between all points:
-
-```python
-travel_time_matrix = travel_time_matrix_computer.compute_travel_times()
-travel_time_matrix.head()
-```
-
-As a result, this returns a `pandas.DataFrame` which we stored in the `travel_time_matrix` variable. The values in the `travel_time` column are travel times in minutes between the points identified by `from_id` and `to_id`. As you can see, the `id` value in the `from_id` column is the same for all rows because we only used one origin location as input. 
-
-To get a better sense of the results, let's create a travel time map based on our results. We can do this easily by making a table join between the `points` GeoDataFrame and the `travel_time_matrix`. The key in the `travel_time_matrix` table is the column `to_id` and the corresponding key in `points` GeoDataFrame is the column `id`:
-
-```python
-join = points.merge(travel_time_matrix, left_on="id", right_on="to_id")
-join.head()
-```
-
-Now we have the travel times attached to each point, and we can easily visualize them on a map:
-
-```python
-join.explore("travel_time", cmap="Greens", marker_kwds={"radius": 12})
-```
-
-### Compute travel time matrix from all to all locations
-
-Running the calculations between all points in our sample dataset can be done in a similar manner as calculating the travel times from one origin to all destinations. 
-Since, calculating these kind of all-to-all travel time matrices is quite typical when doing accessibility analyses, it is actually possible to calculate a cross-product between all points just by using the `origins` parameter (i.e. without needing to specify a separate set for destinations). `r5py` will use the same points as destinations and produce a full set of origins and destinations:
-
-
-```python
-travel_time_matrix_computer = TravelTimeMatrixComputer(
-    transport_network,
-    origins=points,
-    departure=datetime.datetime(2022,2,22,8,30),
-    transport_modes=[TransitMode.TRANSIT, LegMode.WALK]
-)
-travel_time_matrix_all = travel_time_matrix_computer.compute_travel_times()
-travel_time_matrix_all.head()
-```
-
-```python
-travel_time_matrix_all.tail()
-```
-
-```python
-len(travel_time_matrix_all)
-```
-
-As we can see from the outputs above, now we have calculated travel times between all points (n=92) in the study area. Hence, the resulting DataFrame has almost 8500 rows (92x92=8464). Based on these results, we can for example calculate the median travel time to or from a certain point, which gives a good estimate of the overall accessibility of the location in relation to other points:
-
-```python tags=[]
-median_times = travel_time_matrix_all.groupby("from_id")["travel_time"].median()
-median_times
-```
-
-To estimate, how long does it take in general to travel between locations in our study area (i.e. what is the baseline accessibility in the area), we can calculate the mean (or median) of the median travel times showing that it is approximately 22 minutes:
-
-```python
-median_times.mean()
-```
-
-Naturally, we can also visualize these values on a map:
-
-```python
-overall_access = points.merge(median_times.reset_index(), left_on="id", right_on="from_id")
-overall_access.head()
-```
-
-```python
-overall_access.explore("travel_time", cmap="Blues", scheme="natural_breaks", k=4, marker_kwds={"radius": 12})
-```
-
-In our study area, there seems to be a bit poorer accessibility in the Southern areas and on the edges of the region (i.e. we witness a classic edge-effect here). 
-
-
-## Advanced usage
-
-### Compute travel times with a detailed breakdown of the routing results
-
-
-In case you are interested in more detailed routing results, you can use a `DetailedItinerariesComputer` instead of the `TravelTimeMatrixComputer`. This will provide roughly the same information as in the previous examples, but it also brings more detailed information about the routes. `DetailedItinerariesComputer` produces information about the used routes for each origin-destination pair, as well as total time disaggregated by access, waiting, in-vehicle and transfer times:
-
-```python
-from r5py import DetailedItinerariesComputer
-
-detailed_itineraries_computer = DetailedItinerariesComputer(
-    transport_network,
-    origins=origin,
-    destinations=points,
-    departure=datetime.datetime(2022,2,22,8,30),
-    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],
-)
-travel_time_matrix_detailed = detailed_itineraries_computer.compute_travel_times()
-travel_time_matrix_detailed.head()
-```
-
-As you can see, the result contains much more information than earlier, see the following table for explanations:
-
-| Column        | Description                                                          | Data type |
-| ------------- | -------------------------------------------------------------------- | --------- |
-| **routes**        | The route-ids (lines) used during the trip                           | list      |
-| **board_stops**   | The stop-ids of the boarding stops                                   | list      |
-| **alight_stops**  | The stop-ids of the alighting stops                                  | list      |
-| **ride_times**    | In vehicle ride times of individual journey legs                     | list      |
-| **access_time**   | The time it takes for the "first mile" of a trip                     | float     |
-| **egress_time**   | The time it takes for the "last mile" of a trip                      | float     |
-| **transfer_time** | The time it takes to transfer from vechile to another                | float     |
-| **wait_times**    | The time(s) it take to wait for the vehicle at a stop                | list      |
-| **total_time**    | Sum(ride_times, access_time, egress_time, transfer_time, wait_times) | float     |
-| **n_iterations**  | Number of iterations used for calculating the travel times           | int       |
-
-
-
-### Compute travel times for different percentiles
-
-Because `r5py` calculates travel times for all possible transit departure possibilities within an hour (with one minute frequency), we basically get a distribution of travel times. It is possible to gather and return information about the travel times at different percentiles of this distribution based on all computed trips (sorted from the fastest to slowest connections). By default, the returned time in `r5py` is the median travel time (i.e. `50`). You can access these percentiles by using a parameter `percentiles` which accepts a list of integers representing different percentiles, such as `[25, 50, 75]` which returns the travel times at those percentiles:
-
-```python
-travel_time_matrix_computer = TravelTimeMatrixComputer(
-    transport_network,
-    origins=origin,
-    destinations=points,
-    departure=datetime.datetime(2022,2,22,8,30),
-    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],
-    percentiles=[25, 50, 75],
-)
-travel_time_matrix_detailed = travel_time_matrix_computer.compute_travel_times()
-travel_time_matrix_detailed.head()
-```
diff --git a/docs/notebooks/basic-usage.ipynb b/docs/notebooks/basic-usage.ipynb
deleted file mode 100644
index b1e9b8b3..00000000
--- a/docs/notebooks/basic-usage.ipynb
+++ /dev/null
@@ -1,595 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "id": "f1c4253e",
-   "metadata": {},
-   "source": [
-    "# Usage\n",
-    "\n",
-    "## Introduction\n",
-    "\n",
-    "**R5py** is a Python library for routing and calculating travel time matrices on multimodal transport networks (walk, bike, public transport and car).\n",
-    "It provides a simple and friendly interface to R<sup>5</sup> (*the Rapid Realistic Routing on Real-world and Reimagined networks*) which is a [routing engine](https://github.com/conveyal/r5) developed by [Conveyal](https://conveyal.com/). `R5py` is designed to interact with [GeoPandas](https://geopandas.org) GeoDataFrames, and it is inspired by [r5r](https://ipeagit.github.io/r5r) which is a similar wrapper developed for R. `R5py` exposes some of R5’s functionality via its [Python API](reference.html), in a syntax similar to r5r’s. At the time of this writing, only the computation of travel time matrices has been fully implemented. Over time, `r5py` will be expanded to incorporate other functionalities from R5. "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "af121919-dadf-44ae-8e49-9518049663ee",
-   "metadata": {},
-   "source": [
-    "## Data requirements\n",
-    "\n",
-    "### Data for creating a routable network\n",
-    "\n",
-    "When calculating travel times with `r5py`, you typically need a couple of datasets: \n",
-    "\n",
-    "- **A road network dataset from OpenStreetMap** (OSM) in Protocolbuffer Binary (`.pbf`) format: \n",
-    "  - This data is used for finding the fastest routes and calculating the travel times based on walking, cycling and driving. In addition, this data is used for walking/cycling legs between stops when routing with transit. \n",
-    "  - *Hint*: Sometimes you might need modify the OSM data beforehand, e.g., by cropping the data or adding special costs for travelling (e.g., for considering slope when cycling/walking). When doing this, you should follow the instructions on the [Conveyal website](https://docs.conveyal.com/prepare-inputs#preparing-the-osm-data). For adding customized costs for pedestrian and cycling analyses, see [this repository](https://github.com/RSGInc/ladot_analysis_dataprep).\n",
-    "\n",
-    "- **A transit schedule dataset** in General Transit Feed Specification (GTFS.zip) format (optional):\n",
-    "   - This data contains all the necessary information for calculating travel times based on public transport, such as stops, routes, trips and the schedules when the vehicles are passing a specific stop. You can read about the [GTFS standard here](https://developers.google.com/transit/gtfs/reference).\n",
-    "   - *Hint*: `r5py` can also combine multiple GTFS files, as sometimes you might have different GTFS feeds representing, e.g., the bus and metro connections. \n",
-    "\n",
-    "\n",
-    "### Data for origin and destination locations\n",
-    "\n",
-    "In addition to OSM and GTFS datasets, you need data that represents the origin and destination locations (OD-data) for routings. This data is typically stored in one of the geospatial data formats, such as Shapefile, GeoJSON or GeoPackage. As `r5py` is built on top of `geopandas`, it is easy to read OD-data from various different data formats. \n",
-    "\n",
-    "\n",
-    "### Where to get these datasets?\n",
-    "\n",
-    "Here are a few places from where you can download the datasets for creating the routable network:\n",
-    "\n",
-    "- **OpenStreetMap data in PBF-format**:\n",
-    "\n",
-    "  - [pyrosm](https://pyrosm.readthedocs.io/en/latest/basics.html#protobuf-file-what-is-it-and-how-to-get-one)  library. Allows downloading data directly from Python (based on GeoFabrik and BBBike).\n",
-    "  - [pydriosm](https://pydriosm.readthedocs.io/en/latest/quick-start.html#download-data) library. Allows downloading data directly from Python (based on GeoFabrik and BBBike).\n",
-    "  - [GeoFabrik](http://download.geofabrik.de/) website. Has data extracts for many pre-defined areas (countries, regions, etc).\n",
-    "  - [BBBike](https://download.bbbike.org/osm/bbbike/) website. Has data extracts readily available for many cities across the world. Also supports downloading data by [specifying your own area or interest](https://extract.bbbike.org/).\n",
-    "  - [Protomaps](https://protomaps.com/downloads/osm) website. Allows to download the data with custom extent by specifying your own area of interest.\n",
-    "\n",
-    "\n",
-    "- **GTFS data**:  \n",
-    "  - [Transitfeeds](https://transitfeeds.com/) website. Easy to navigate and find GTFS data for different countries and cities. Includes current and historical GTFS data. Notice: The site will be deprecated in the future.  \n",
-    "  - [Mobility Database](https://database.mobilitydata.org) website. Will eventually replace TransitFeeds. \n",
-    "  - [Transitland](https://www.transit.land/operators) website. Find data based on country, operator or feed name. Includes current and historical GTFS data.\n",
-    "\n",
-    "### Sample datasets\n",
-    "\n",
-    "In the following tutorial, we use various open source datasets:\n",
-    "- The point dataset for Helsinki has been obtained from [Helsinki Region Environmental Services](https://www.hsy.fi/en/environmental-information/open-data/avoin-data---sivut/population-grid-of-helsinki-metropolitan-area/) (HSY) licensed under a Creative Commons By Attribution 4.0. \n",
-    "- The street network for Helsinki is a cropped and filtered extract of OpenStreetMap (© OpenStreetMap contributors, [ODbL license](https://www.openstreetmap.org/copyright))\n",
-    "- The GTFS transport schedule dataset for Helsinki is a cropped and minimised copy of Helsingin seudun liikenne’s (HSL) open dataset ([Creative Commons BY 4.0](https://www.hsl.fi/hsl/avoin-data#aineistojen-kayttoehdot))."
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "cd6c9d3c-8eb9-499f-b2fa-0dc8761e26da",
-   "metadata": {},
-   "source": [
-    "## Installation\n",
-    "\n",
-    "Before you can start using `r5py`, you need to install it and a few libraries. Check [installation instructions](../installation.md) for more details. "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "809d5171-6536-43d3-aa20-f3f3a14aa502",
-   "metadata": {},
-   "source": [
-    "## Configuring `r5py` before using it\n",
-    "\n",
-    "It is possible to configure `r5py` in a few different ways (see [configuration instructions](../configuration.md) for details). One of the options that you most likely want to adjust, is **configuring how much memory** (RAM) `r5py` will consume during the calculations. `r5py` runs a powerful Java engine under the hood, and by default it will use **80 % of the available memory** for doing the calculations. However, you can easily adjust this. \n",
-    "\n",
-    "If you want to allocate, e.g., a maximum of 5 Gb of RAM for the tool, you can do so by running:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "d637c51a-eeed-400b-a625-5c4745db92f4",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import sys\n",
-    "\n",
-    "sys.argv.append([\"--max-memory\", \"5G\"])"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "f0925ade-74ae-4aaf-bfc2-e23fdd9c3ac8",
-   "metadata": {},
-   "source": [
-    "By running this, `r5py` will use **at maximum** 5 Gb of memory. However, it does not mean that the tool will necessary use all of this memory if it does not need it. \n",
-    "\n",
-    "```{important} \n",
-    "Notice that changing the amount of allocated memory should alway be done as the first thing in your script, i.e. it should be run **before** importing `r5py`. \n",
-    "```"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "a8e9dc27-2585-4559-808a-49e9ee44212a",
-   "metadata": {},
-   "source": [
-    "## Getting started with `r5py`\n",
-    "\n",
-    "Next, we will learn how to calculate travel times with `r5py` between locations spread around the city center area of Helsinki, Finland. \n",
-    "\n",
-    "### Load the origin and destination data\n",
-    "\n",
-    "Let's start by downloading a sample point dataset into a geopandas `GeoDataFrame` that we can use as our origin and destination locations. For the sake of this exercise, we have prepared a grid of points covering parts of Helsinki. The point data also contains the number of residents of each 250 meter cell:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "5c4701cf-31ce-4276-adb5-047c4e36af48",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import geopandas\n",
-    "\n",
-    "# temporary fix, this is not getting published as such, anyway, but only after PR #238 is merged\n",
-    "points_url = \"https://github.com/r5py/r5py/raw/stable/docs/data/Helsinki/population_points_2020.gpkg\"\n",
-    "points = geopandas.read_file(points_url)\n",
-    "points.head()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "7cd4d1c3-73eb-488a-820b-086abb645de7",
-   "metadata": {},
-   "source": [
-    "The `points` GeoDataFrame contains a few columns, namely `id`, `population` and `geometry`. The `id` column with unique values and `geometry` columns are required for `r5py` to work. If your input point dataset does not have an `id` column with unique values, `r5py` will throw an error. \n",
-    "\n",
-    "To get a better sense of the data, let's create a map that shows the locations of the points and visualise the number of people living in each cell (the cells are represented by their centre point):"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "8b08d5b4-a71d-46ea-a444-19751ed1c64c",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "points.explore(\"population\", cmap=\"Reds\", marker_kwds={\"radius\": 12})"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "9d8651ef-95b6-44e4-a1b6-f43159d8d3b4",
-   "metadata": {},
-   "source": [
-    "Let's pick one of these points to represent our **origin** and store it in a separate GeoDataFrame:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "41f07d2d-60f8-4060-a640-142f7603fb58",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "origin = points.loc[points[\"id\"] == 54].copy()\n",
-    "origin.explore(color=\"blue\", max_zoom=14, marker_kwds={\"radius\": 12})"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "53f7a7cc",
-   "metadata": {
-    "tags": []
-   },
-   "source": [
-    "### Load transport network\n",
-    "\n",
-    "Virtually all operations of `r5py` require a transport network. In this example, we use data from Helsinki metropolitan area, which you can find in the source code repository of r5py in `docs/data/` [(see here)](https://github.com/r5py/r5py/tree/main/docs/data). To import the street and public transport networks, instantiate an `r5py.TransportNetwork` with the file paths to the OSM extract and the GTFS files:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "439ee015",
-   "metadata": {
-    "nbsphinx": "hidden",
-    "tags": [
-     "remove-cell"
-    ]
-   },
-   "outputs": [],
-   "source": [
-    "# this cell is hidden from output\n",
-    "# it’s used to set sys.path to point to the local repo\n",
-    "import pathlib\n",
-    "import sys\n",
-    "\n",
-    "sys.path.insert(0, str(pathlib.Path().absolute().parent.parent / \"src\"))\n",
-    "DATA_DIR = str(pathlib.Path().absolute().parent / \"data\")"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "fadb5a78-b00d-4932-a531-8511c7b931b9",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Allow 8 GB of memory\n",
-    "import sys\n",
-    "\n",
-    "sys.argv.append([\"--max-memory\", \"8G\"])"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "846bfb43",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from r5py import TransportNetwork\n",
-    "\n",
-    "transport_network = TransportNetwork(\n",
-    "    f\"{DATA_DIR}/Helsinki/kantakaupunki.osm.pbf\", [f\"{DATA_DIR}/Helsinki/GTFS.zip\"]\n",
-    ")"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "5c6acb2c-89bb-4aab-8697-f8e9c676baf7",
-   "metadata": {},
-   "source": [
-    "At this stage, `r5py` has created the routable transport network and it is stored in the `transport_network` variable. We can now start using this network for doing the travel time calculations. "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "d7b1101f-1f01-462a-9ee2-aa3522d0bdd5",
-   "metadata": {},
-   "source": [
-    "### Compute travel time matrix from one to all locations\n",
-    "\n",
-    "A travel time matrix is a dataset detailing the travel costs (e.g., time) between given locations (origins and destinations) in a study area. To compute a travel time matrix with `r5py` based on public transportation, we first need to initialize an `r5py.TravelTimeMatrixComputer` object. As inputs, we pass following arguments for the `TravelTimeMatrixComputer`:\n",
-    "- `transport_network`, which we created in the previous step representing the routable transport network. \n",
-    "- `origins`, which is a GeoDataFrame with one location that we created earlier (however, you can also use multiple locations as origins).\n",
-    "- `destinations`, which is a GeoDataFrame representing the destinations (in our case, the `points` GeoDataFrame). \n",
-    "- `departure`, which should be Python's `datetime` object (in our case standing for \"22nd of February 2022 at 08:30\") to tell `r5py` that the schedules of this specific time and day should be used for doing the calculations. \n",
-    "   - *Note*: By default, `r5py` summarizes and calculates a median travel time from all possible connections within one hour from given depature time (with 1 minute frequency). It is possible to adjust this time window using `departure_time_window` parameter ([see details here]((https://r5py.readthedocs.io/en/stable/reference.html#r5py.RegionalTask))). \n",
-    "- `transport_modes`, which determines the travel modes that will be used in the calculations. These can be passed using the options from the `TransitMode` and `LegMode` classes. \n",
-    "  - *Hint*: To see all available options, run `help(TransitMode)` or `help(LegMode)`.  \n",
-    "\n",
-    "```{note} In addition to these ones, the constructor also accepts many other parameters [listed here](https://r5py.readthedocs.io/en/stable/reference.html#r5py.RegionalTask), such as walking and cycling speed, maximum trip duration, maximum number of transit connections used during the trip, etc. \n",
-    "```\n",
-    "\n",
-    "Now, we will first create a `travel_time_matrix_computer` instance as described above:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "b5dabcc1-95a4-4c9f-86ab-533d2c752716",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import datetime\n",
-    "from r5py import TravelTimeMatrixComputer, TransitMode, LegMode\n",
-    "\n",
-    "\n",
-    "travel_time_matrix_computer = TravelTimeMatrixComputer(\n",
-    "    transport_network,\n",
-    "    origins=origin,\n",
-    "    destinations=points,\n",
-    "    departure=datetime.datetime(2022, 2, 22, 8, 30),\n",
-    "    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],\n",
-    ")"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "a9b8e76f-ea2c-40bd-b55c-4d9d635c336c",
-   "metadata": {},
-   "source": [
-    "Running this initializes the `TravelTimeMatrixComputer`, but any calculations were not done yet.\n",
-    "To actually run the computations, we need to call `.compute_travel_times()` on the instance, which will calculate the travel times between all points:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "d7dbed21-6c3c-41be-8163-03674eb03641",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "travel_time_matrix = travel_time_matrix_computer.compute_travel_times()\n",
-    "travel_time_matrix.head()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "533e8704-3fa6-4883-8e2f-093403bb93b0",
-   "metadata": {},
-   "source": [
-    "As a result, this returns a `pandas.DataFrame` which we stored in the `travel_time_matrix` variable. The values in the `travel_time` column are travel times in minutes between the points identified by `from_id` and `to_id`. As you can see, the `id` value in the `from_id` column is the same for all rows because we only used one origin location as input. \n",
-    "\n",
-    "To get a better sense of the results, let's create a travel time map based on our results. We can do this easily by making a table join between the `points` GeoDataFrame and the `travel_time_matrix`. The key in the `travel_time_matrix` table is the column `to_id` and the corresponding key in `points` GeoDataFrame is the column `id`:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "9945deb5-bd5a-4110-a692-5be85b8e8d51",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "join = points.merge(travel_time_matrix, left_on=\"id\", right_on=\"to_id\")\n",
-    "join.head()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "38d0b6ea-a729-435a-bed6-ec69596492e1",
-   "metadata": {},
-   "source": [
-    "Now we have the travel times attached to each point, and we can easily visualize them on a map:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "1fe2cadc-41d7-46f7-b1b6-b6520cb3123b",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "join.explore(\"travel_time\", cmap=\"Greens\", marker_kwds={\"radius\": 12})"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "3f1cdb94-b40f-4b83-8be2-a813b2833fef",
-   "metadata": {},
-   "source": [
-    "### Compute travel time matrix from all to all locations\n",
-    "\n",
-    "Running the calculations between all points in our sample dataset can be done in a similar manner as calculating the travel times from one origin to all destinations. \n",
-    "Since, calculating these kind of all-to-all travel time matrices is quite typical when doing accessibility analyses, it is actually possible to calculate a cross-product between all points just by using the `origins` parameter (i.e. without needing to specify a separate set for destinations). `r5py` will use the same points as destinations and produce a full set of origins and destinations:\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "7eb531ce-0b03-41c6-ada6-bd8965d3a10d",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "travel_time_matrix_computer = TravelTimeMatrixComputer(\n",
-    "    transport_network,\n",
-    "    origins=points,\n",
-    "    departure=datetime.datetime(2022, 2, 22, 8, 30),\n",
-    "    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],\n",
-    ")\n",
-    "travel_time_matrix_all = travel_time_matrix_computer.compute_travel_times()\n",
-    "travel_time_matrix_all.head()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "17dda2cb-cee0-4a94-9c01-df79742d60fb",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "travel_time_matrix_all.tail()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "9536217c-636d-4c72-b0db-b58d48f2c8bf",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "len(travel_time_matrix_all)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "99a494be-0eae-457b-9b70-d0c499e193bc",
-   "metadata": {},
-   "source": [
-    "As we can see from the outputs above, now we have calculated travel times between all points (n=92) in the study area. Hence, the resulting DataFrame has almost 8500 rows (92x92=8464). Based on these results, we can for example calculate the median travel time to or from a certain point, which gives a good estimate of the overall accessibility of the location in relation to other points:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "d026f1e6-05ca-4c9d-ba5b-f45d7ac69d85",
-   "metadata": {
-    "tags": []
-   },
-   "outputs": [],
-   "source": [
-    "median_times = travel_time_matrix_all.groupby(\"from_id\")[\"travel_time\"].median()\n",
-    "median_times"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "e687ac07-0d00-4b5b-ac35-d35f9df2b141",
-   "metadata": {},
-   "source": [
-    "To estimate, how long does it take in general to travel between locations in our study area (i.e. what is the baseline accessibility in the area), we can calculate the mean (or median) of the median travel times showing that it is approximately 22 minutes:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "0efc3964-68a5-401d-8e4a-323fc44b5f3f",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "median_times.mean()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "b180a36f-6cf5-4640-9e37-3d2595473dbd",
-   "metadata": {},
-   "source": [
-    "Naturally, we can also visualize these values on a map:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "7b266697-bf4f-4009-8c9b-2c10c81b111a",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "overall_access = points.merge(\n",
-    "    median_times.reset_index(), left_on=\"id\", right_on=\"from_id\"\n",
-    ")\n",
-    "overall_access.head()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "b3eb8010-8952-46ec-bbf8-025f2acb3843",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "overall_access.explore(\n",
-    "    \"travel_time\",\n",
-    "    cmap=\"Blues\",\n",
-    "    scheme=\"natural_breaks\",\n",
-    "    k=4,\n",
-    "    marker_kwds={\"radius\": 12},\n",
-    ")"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "6574f358-5182-4dea-81fb-46e192f34d38",
-   "metadata": {},
-   "source": [
-    "In our study area, there seems to be a bit poorer accessibility in the Southern areas and on the edges of the region (i.e. we witness a classic edge-effect here). "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "8048ff99-b9d4-4c85-841f-739533a6693f",
-   "metadata": {},
-   "source": [
-    "## Advanced usage\n",
-    "\n",
-    "### Compute travel times with a detailed breakdown of the routing results"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "20a5ec17-ec4c-4085-b690-547fe8b80c0d",
-   "metadata": {},
-   "source": [
-    "In case you are interested in more detailed routing results, you can use a `DetailedItinerariesComputer` instead of the `TravelTimeMatrixComputer`. This will provide roughly the same information as in the previous examples, but it also brings more detailed information about the routes. `DetailedItinerariesComputer` produces information about the used routes for each origin-destination pair, as well as total time disaggregated by access, waiting, in-vehicle and transfer times:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "a4adba26-268c-41c2-b519-c40ec92d88ec",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from r5py import DetailedItinerariesComputer\n",
-    "\n",
-    "detailed_itineraries_computer = DetailedItinerariesComputer(\n",
-    "    transport_network,\n",
-    "    origins=origin,\n",
-    "    destinations=points,\n",
-    "    departure=datetime.datetime(2022, 2, 22, 8, 30),\n",
-    "    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],\n",
-    ")\n",
-    "travel_time_matrix_detailed = detailed_itineraries_computer.compute_travel_times()\n",
-    "travel_time_matrix_detailed.head()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "782b8531-4437-40ca-8fc7-c0941edbb163",
-   "metadata": {},
-   "source": [
-    "As you can see, the result contains much more information than earlier, see the following table for explanations:\n",
-    "\n",
-    "| Column        | Description                                                          | Data type |\n",
-    "| ------------- | -------------------------------------------------------------------- | --------- |\n",
-    "| **routes**        | The route-ids (lines) used during the trip                           | list      |\n",
-    "| **board_stops**   | The stop-ids of the boarding stops                                   | list      |\n",
-    "| **alight_stops**  | The stop-ids of the alighting stops                                  | list      |\n",
-    "| **ride_times**    | In vehicle ride times of individual journey legs                     | list      |\n",
-    "| **access_time**   | The time it takes for the \"first mile\" of a trip                     | float     |\n",
-    "| **egress_time**   | The time it takes for the \"last mile\" of a trip                      | float     |\n",
-    "| **transfer_time** | The time it takes to transfer from vechile to another                | float     |\n",
-    "| **wait_times**    | The time(s) it take to wait for the vehicle at a stop                | list      |\n",
-    "| **total_time**    | Sum(ride_times, access_time, egress_time, transfer_time, wait_times) | float     |\n",
-    "| **n_iterations**  | Number of iterations used for calculating the travel times           | int       |\n"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "id": "bfa6c86e-33e6-41ab-ac93-3bc5420fd12d",
-   "metadata": {},
-   "source": [
-    "### Compute travel times for different percentiles\n",
-    "\n",
-    "Because `r5py` calculates travel times for all possible transit departure possibilities within an hour (with one minute frequency), we basically get a distribution of travel times. It is possible to gather and return information about the travel times at different percentiles of this distribution based on all computed trips (sorted from the fastest to slowest connections). By default, the returned time in `r5py` is the median travel time (i.e. `50`). You can access these percentiles by using a parameter `percentiles` which accepts a list of integers representing different percentiles, such as `[25, 50, 75]` which returns the travel times at those percentiles:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "7cf036ed-9080-448a-b091-872892e50143",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "travel_time_matrix_computer = TravelTimeMatrixComputer(\n",
-    "    transport_network,\n",
-    "    origins=origin,\n",
-    "    destinations=points,\n",
-    "    departure=datetime.datetime(2022, 2, 22, 8, 30),\n",
-    "    transport_modes=[TransitMode.TRANSIT, LegMode.WALK],\n",
-    "    percentiles=[25, 50, 75],\n",
-    ")\n",
-    "travel_time_matrix_detailed = travel_time_matrix_computer.compute_travel_times()\n",
-    "travel_time_matrix_detailed.head()"
-   ]
-  }
- ],
- "metadata": {
-  "execution": {
-   "timeout": 360
-  },
-  "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.9"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/docs/reference.rst b/docs/reference.rst
deleted file mode 100644
index 414215cf..00000000
--- a/docs/reference.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. _reference:
-
-Reference
-=========
-
-.. automodule:: r5py
-    :members:
diff --git a/docs/reference/reference.md b/docs/reference/reference.md
new file mode 100644
index 00000000..326d1753
--- /dev/null
+++ b/docs/reference/reference.md
@@ -0,0 +1,8 @@
+(reference)=
+
+# Reference
+
+```{eval-rst}
+.. automodule:: r5py
+    :members:
+```
diff --git a/docs/requirements.txt b/docs/requirements.txt
index df9d976a..e561372e 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,37 +1,31 @@
+# sphinx + dependencies
+GitPython
+myst-nb
+pybtex-apa7-style
+sphinx
+sphinx-book-theme
+sphinx-design
+sphinxcontrib-bibtex
+sphinxcontrib-images
+
+# r5py:
 ConfigArgParse
 contextily
 filelock
 folium
 geopandas
-gitpython
-ipycache
-ipykernel
-ipyleaflet
-ipython
-ipython-genutils
-ipywidgets
+importlib_resources
 joblib
 jpype1
-jupyter-book>=0.7.0b
-mapclassify
-myst-nb
-myst-parser
-nbsphinx
 numpy
-numpydoc
 pandas
 pyproj
 psutil
-rasterio>=1.3a3
-shapely
-Sphinx
-sphinx-book-theme
-sphinx-togglebutton
-sphinx_copybutton
-sphinxcontrib-applehelp
-sphinxcontrib-devhelp
-sphinxcontrib-htmlhelp
-sphinxcontrib-jsmath
-sphinxcontrib-qthelp
-sphinxcontrib-serializinghtml
-sphinxcontrib.bibtex
+requests
+
+# documentation:
+contextily
+folium
+h3>=4.0.0b2
+mapclassify
+matplotlib
diff --git a/docs/user-guide/citation.md b/docs/user-guide/citation.md
new file mode 100644
index 00000000..0fb88b90
--- /dev/null
+++ b/docs/user-guide/citation.md
@@ -0,0 +1,33 @@
+# License and citation
+
+## Citation
+
+If you use *r5py* for scientific research, please cite it in your publications:
+
+:::{bibliography}
+:filter: False
+:keyprefix: r5py-
+
+fink_r5py_2022
+:::
+
+Please also cite the [relevant publications relating to the R⁵
+engine](https://github.com/conveyal/r5/#methodology) on which *r5py* builds up:
+
+:::{bibliography}
+:filter: False
+:keyprefix: further-reading-
+
+conway_evidence-based_2017
+conway_accounting_2018
+conway_getting_2019
+:::
+
+
+## License
+
+This work is dual-licensed under GNU General Public License v3.0 or later and
+MIT License.  You can choose between the two depending on which license fits
+your project better.
+
+`SPDX-License-Identifier: GPL-3.0-or-later OR MIT`
diff --git a/docs/user-guide/installation/installation.md b/docs/user-guide/installation/installation.md
new file mode 100644
index 00000000..bb353cd1
--- /dev/null
+++ b/docs/user-guide/installation/installation.md
@@ -0,0 +1,123 @@
+# Installation
+
+:::{toctree}
+:maxdepth: 1
+:caption: Installation
+:hidden:
+
+troubleshooting
+:::
+
+*R5py* is available from [PyPi](https://pypi.org/project/r5py/) and
+[conda-forge](https://anaconda.org/conda-forge/r5py), and can be installed
+using [`pip`](https://pip.pypa.io/en/stable/getting-started/),
+[`mamba`](https://github.com/conda-forge/miniforge#mambaforge), or
+[`conda`](https://docs.conda.io/projects/conda/). See below for detailed
+instructions for each installation method.
+
+For **Windows** users, we generally recommend to use [`mamba` or `conda` to
+create a new dedicated *environment*](#install-using-mambaconda) and install
+*r5py* and its dependencies into it.
+
+On **Linux** and **MacOS**, depending on your use case, either approach might be
+appropriate:
+- If *r5py* is [installed via `pip`](#install-using-pip),
+  system-wide resources can be re-used (and managed by the system package
+  manager), lowering both disk and memory footprint - but you need manually ensure
+  that a [Java environment](#dependencies) is installed.
+- If [installed via `conda`/`mamba`](#install-using-mambaconda), *r5py* is as
+  much a turnkey solution on Linux and MacOS as it is on Windows, at the expense
+  of a slight performance decrease. However, as additional package managers,
+  `conda` and `mamba` are not available from the default package sources on all
+  distributions; Debian and Debian-based systems, such as Ubuntu or Mint, for
+  instance, do not provide `conda` packages.
+
+:::{admonition} Python package/environment managers
+:class: hint
+
+If you are new to the (sometimes confusing) world of Python package managers,
+read more about them in [chapter 1 of *Python for Geographic Data
+Analysis*](https://pythongis.org/part1/chapter-01/nb/05-installation.html).
+:::
+
+
+## Install using `mamba`/`conda`
+
+:::{admonition} Mamba
+:class: note
+
+[Mambaforge](https://github.com/conda-forge/miniforge#mambaforge) (available
+for Windows/Linux/Mac) is a drop-in replacement for the popular package manager
+[Miniconda](https://docs.conda.io/en/latest/miniconda.html), sporting
+tremendously improved installation times.
+
+To use *Mambaforge*, simply replace `conda` with `mamba` in the code examples
+below.
+:::
+
+To install *r5py* and all its dependencies into a newly created [*conda
+environment*](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/environments.html),
+use `conda create` (or `mamba create`):
+
+```{code} sh
+conda create \
+    --name r5py \
+    --channel conda-forge \
+    r5py
+```
+
+This will create a new environment `r5py`, and installs *r5py* and its
+dependencies, using the *conda-forge* repository. To start work inside the newly
+created environment, run
+
+```{code} sh
+conda activate r5py
+```
+
+If you want to use *r5py* in a notebook environment, install
+[JupyterLab](https://jupyterlab.readthedocs.io/):
+
+```{code} sh
+conda install --channel conda-forge jupyterlab
+```
+
+
+### Install *r5py* into an existing environment
+
+If you already have an existing conda environment, and want to install *r5py*
+in addition to the packages installed there, *activate* the environment, and
+run:
+
+```{code} sh
+conda install --channel conda-forge r5py
+```
+
+
+## Install using `pip`
+
+To install *r5py* from *PyPi*, the official *Python package index*, use `pip`:
+
+```{code} sh
+pip install r5py
+```
+
+Note that this does not automatically install a [Java
+environment](#java-development-kit). You will have to ensure that a *Java
+Development Kit* is available, see instructions below.
+
+
+## Dependencies
+
+### Java Development Kit
+
+*R5py* relies on one notable external dependency: a Java environment.
+To interface with R⁵, *r5py* requires a *Java Development Kit* (jdk).
+
+If you installed *r5py* using `conda` or `mamba`, an appropriate version of
+OpenJDK has been installed as a dependency, and you are ready to go. If you used
+`pip`, or installed *r5py* manually, please install a JDK, for instance,
+[OpenJDK](https://openjdk.org/).
+
+Consider installing it from your system’s package manager, or the official
+[Microsoft build](https://learn.microsoft.com/en-gb/java/openjdk/download) in
+case you work on Windows.
diff --git a/docs/user-guide/installation/troubleshooting.md b/docs/user-guide/installation/troubleshooting.md
new file mode 100644
index 00000000..d4962762
--- /dev/null
+++ b/docs/user-guide/installation/troubleshooting.md
@@ -0,0 +1,3 @@
+# Troubleshooting
+
+TODO: Add here all the little issues one might have on Windows.
diff --git a/docs/user-guide/user-manual/advanced-usage.md b/docs/user-guide/user-manual/advanced-usage.md
new file mode 100644
index 00000000..198b4679
--- /dev/null
+++ b/docs/user-guide/user-manual/advanced-usage.md
@@ -0,0 +1,68 @@
+# Advanced Usage
+
+## Limit the maximum Java heap size (memory use)
+
+A *Java Virtual Machine* (JVM) typically restricts the memory usage of programs
+it runs.  More specifically, the *heap size* can be limited (see [this
+stackoverflow
+discussion](https://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting-jvm)
+for a detailed explanation). 
+
+The tasks carried out by *R⁵* under the hood of *r5py* are fairly
+memory-intensive, which is why, by default, *r5py* allows the JVM to grant up to
+80% of total memory to R⁵ (but ensures to always leave at least 2 GiB to the
+system and other processes).
+
+You want to lower this limit if you are running other tasks in parallel, or
+raise it, if you have a dedicated computer with large memory and small
+operating system requirements.
+
+As outlined above, you can either create a configuration file, and set
+`max-memory` there, specify the `--max-memory` or `-m` command line arguments,
+or add the same arguments to `sys.argv`.
+
+For instance, to set the maximum heap size to a fixed 12 GiB, you can create a
+configuration file in the [location suitable for your operating
+system](configuration.md#configuration-via-config-files), and add the following line:
+
+```{code-block} yaml
+:name: conf-yml-memory
+:caption: ~/.config/r5py.yml
+
+max-memory: 12G
+```
+
+
+## Use a custom installation of R⁵
+
+For some use cases, it can be useful to use a local copy of R⁵, rather than
+the one downloaded by *r5py*, for instance, in order to apply custom patches
+to extend or modify R⁵’s functionality, or to force the use of a certain
+version for longitudinal comparability. For retaining path geometries for public
+transport routes in {class}`DetailedItinerariesComputer`, 
+
+This can be achieved by passing a configuration option or command
+line argument to change the class path. 
+
+For example, to set a custom classpath inside a Python notebook, you can set
+`sys.argv` before importing `r5py`:
+
+```python
+import sys
+sys.argv.append(["--r5-classpath", "/opt/r5/"])
+import r5py
+```
+
+To use the patched R⁵ version the [Digital Geography
+Lab](https://www.helsinki.fi/en/researchgroups/digital-geography-lab) provides
+on their [GitHub pages](https://github.com/DigitalGeographyLab/r5/releases),
+pass the full URL, instead:
+
+```python
+import sys
+sys.argv.append([
+    "--r5-classpath", 
+    "https://github.com/DigitalGeographyLab/r5/releases/download/v6.9-post16-g1054c1e-20230619/r5-v6.9-post16-g1054c1e-20230619-all.jar"
+])
+import r5py
+```
diff --git a/docs/user-guide/user-manual/configuration.md b/docs/user-guide/user-manual/configuration.md
new file mode 100644
index 00000000..39de06c8
--- /dev/null
+++ b/docs/user-guide/user-manual/configuration.md
@@ -0,0 +1,95 @@
+# Configuration
+
+## Configuration options
+
+*R5py* can be configured in three different ways: in a [configuration
+file](#configuration-via-config-files), or using [command line
+arguments](#configuration-via-config-files) which can also be used [within
+script files or notebooks](#configuration-from-the-command-line). 
+
+The arguments and options of all three approaches share the the same names, in
+the configuration files the leading dash(es) are omitted (see
+[below](#configuration-via-config-files)).
+
+
+### Overview
+
+% option lists are not yet implemented in myst, 
+% cf. https://github.com/executablebooks/MyST-Parser/issues/286
+
+```{eval-rst}
+--max-memory=value, -m value
+              `Set the limit for the *Java Virtual Machine*’s heap
+              size <advanced-usage.html#setting-the-maximum-java-heap-size-memory-use>`_
+              (``-Xmx``).  This option accepts either absolute values
+              (integer or decimal), optionally with a suffix to indicate
+              Mibibytes, Gibibytes, or Tebibytes: ``M``, ``G``, ``T``),
+              or relative, expressed in a percentage of total memory, with
+              a ``%`` suffix. Default: ``80%``
+
+--r5-classpath=classpath, -r classpath
+              Point to R⁵’s JAR (or build directory) in case you want to use a
+              `custom R⁵ installation <advanced-usage.html#using-a-custom-installation-of-r⁵>`_.
+              Default: ``""`` (download latest compatible version of R5)
+
+--verbose, -v
+              Show more detailed output.
+```
+
+
+## Configuration via config files
+
+*R5py* can be configured using a configuration file `r5py.yml`, for which the
+package searches in the following paths:
+
+- On Unix-like operating systems (such as most Linux and BSD distributions,
+  as well as MacOS): 
+  - `${XDG_CONFIG_HOME}/r5py.yml` or `~/.config/r5py.yml` for per-user
+    configuration (if both files exist, only the former is read)
+  - `/etc/r5py.yml` for system-wide configuration (user config overrides system
+    config)
+- On Windows operating systems:
+  - `%APPDATA%\\r5py.yml`. The precise path of the `%APPDATA%` directory depends
+    on your user name and locale (enter `%APPDATA%` in a Windows Explorer’s search
+    bar to navigate to it).
+
+Consult the [list above](#configuration-options), omit any leading dashes from
+the option names, and specify in [YAML](https://yaml.org/) format (for
+instance, specify `--max-memory=12G` as `max-memory: 12G`).
+
+
+:::{admonition} Template configuration file
+:class: info
+
+When it is run for the first time, *r5py* creates template configuration files
+in all valid locations to which it has write-access.
+:::
+
+
+## Configuration from the command line
+
+When running *r5py* from the command line, you can supply command line
+arguments.  To show available options, consult the [list
+above](#configuration-options), or run:
+
+```bash
+python -m r5py --help
+```
+
+
+## Using command line options in a script or notebook
+
+If you use *r5py* in a script, or run it from a notebook and don’t want to
+rely on a configuration file, you can set command line arguments ***before***
+*importing r5py*:
+
+```python
+import sys
+sys.argv.append(["--max-memory", "99%"])
+
+import r5py  # noqa: F401
+```
+
+To find available options, consult the *command line argument* column of the
+[table above](#configuration-options).
+
diff --git a/docs/user-guide/user-manual/data-requirements.md b/docs/user-guide/user-manual/data-requirements.md
new file mode 100644
index 00000000..458f90cd
--- /dev/null
+++ b/docs/user-guide/user-manual/data-requirements.md
@@ -0,0 +1,155 @@
+# Data requirements
+
+## Data for creating a routable network
+
+When calculating travel times with *r5py*, you typically need two types of
+datasets:
+
+:::::{grid} 1 1 2 2
+
+::::{grid-item-card}
+a **road network** dataset from [OpenStreetMap
+(OSM)](https://wiki.openstreetmap.org/wiki/Data) in [*Protocol Buffer Binary*
+(`.pbf`)](https://wiki.openstreetmap.org/wiki/PBF_Format) format:
+
+These data are used for finding the fastest routes and calculating the travel
+times for walking, cycling and driving. In addition, these data are used
+for walking/cycling legs between stops when routing with public transport.
+::::
+
+::::{grid-item-card}
+a **public transport schedule** dataset in [*General Transit Feed
+Specification*](https://en.wikipedia.org/wiki/GTFS) format (optional):
+
+These data contain all information necessary to calculate travel times on
+public transport, such as the stops, routes, trips and schedules of busses,
+trams, trains, and other vehicles.
+::::
+
+::::{grid-item}
+:columns: 12
+
+:::{admonition} Data pre-processing
+:class: hint
+
+Often, it is useful to *crop an [OSM extract](#where-to-obtain-such-datasets)*
+beforehand, or to *add other cost factors* to the data (e.g., to account for
+slope). Check the detailed instructions for data preparation on the [Conveyal
+website](https://docs.conveyal.com/prepare-inputs#preparing-the-osm-data), and
+use the tools in [this
+repository](https://github.com/RSGInc/ladot_analysis_dataprep) to add
+customised costs for pedestrian and cycling analyses.
+
+*R5py* can *combine multiple GTFS data sets*. This is useful when you study
+areas covered by more than one transit authority, or when data from different
+modes of transport, such as bus and metro, are available in separate GTFS
+feeds, only.
+:::
+::::
+
+:::::
+
+### Where to obtain such datasets?
+
+Here are a few places from where you can download the datasets for creating the
+routable network. This list is of course by no means comprehensive, and [you are
+very welcome to add additional data sources](/contributing/CONTRIBUTING) that
+you are aware of.
+
+#### OpenStreetMap data in PBF format
+
+- [pydriosm](https://pydriosm.readthedocs.io/en/latest/quick-start.html#download-data)
+  is a Python package for downloading OSM extracts from GeoFabrik and BBBike.
+- [pyrosm](https://pyrosm.readthedocs.io/en/latest/basics.html#protobuf-file-what-is-it-and-how-to-get-one)
+  is a Python package for creating street networks from OSM extracts, and
+  includes tools to download OSM extracts from GeoFabrik and BBBike
+- [GeoFabrik](http://download.geofabrik.de/) is a website offering OSM extracts
+  for free download, covering many pre-defined areas (continents, countries,
+  regions, etc.)
+- [BBBike](https://download.bbbike.org/osm/bbbike/) is a website that offers OSM
+  extracts for free download, covering many pre-defined areas, including
+  individual city’s extents, and also supports data [downloads cut to custom
+  extents](https://extract.bbbike.org/)
+- [Protomaps](https://protomaps.com/downloads/osm) is a website that allows you
+  to download OSM extracts for a custom area of interest, drawn in an
+  interactive map, or taken from an uploaded polygon feature.
+
+
+#### Public transport schedules in GTFS format
+
+  - *Your local transit authority, city works, or public transport company*:
+    most of the time, you will find the most accurate and most up-to-date GTFS
+    schedule files available locally, usually as an open-data download. If you
+    cannot find a download, ask nicely, many transport authorities are happy to
+    share
+  - [Transitland](https://www.transit.land/operators) is an online data platform
+    that collects GTFS data from 2500 public transport operators world-wide.
+    Their database includes historical data sets.
+  - [Mobility Database](https://database.mobilitydata.org) is an online repository
+    storing current and historical GTFS data of 1800 operators from around the
+    globe, run by a non-profit organisation. Already functional, but still being
+    built, set to replace Transitfeeds (see below)
+  - [Transitfeeds](https://transitfeeds.com/) is an easy to navigate website
+    that hosts up-to-date and historical GTFS data for many countries and
+    cities. *Deprecated: will be replaced by* Mobility Database.
+
+
+:::{admonition} Check GTFS files
+:class: tip
+
+At times, it is worth to spot-check GTFS data sets downloaded from third-party
+websites for validity, and to assert that they cover the time period and
+geographic extent of a study area. 
+
+*MobilityData*’s [GTFS
+Validator](https://github.com/MobilityData/gtfs-validator) is a cross-platform
+Java tool to check file integrity, data types, and compliance with the GTFS
+standard.
+
+[*GTFS-Lite*](https://gtfs-lite.readthedocs.io/) is a Python package to read
+GTFS data sets into {class}`gtfslite.gtfs.GTFS` objects that store the
+information on stops, routes, fares, etc., in {class}`pandas.DataFrame`s. Use
+{meth}`GTFS.routes_summary()<gtfslite.gtfs.GTFS.routes_summary()>`,
+{meth}`GTFS.stop_summary()<gtfslite.gtfs.GTFS.stop_summary()>`, and
+{meth}`GTFS.summary()<gtfslite.gtfs.GTFS.summary()>` to gain a quick overview
+of the scope of a GTFS data set.
+
+:::
+
+
+## Origin and destination locations
+
+In addition to OSM and GTFS datasets, you need data that represents the origin
+and destination locations (OD-data) of routes. *R5py* accepts data sets as
+{class}`geopandas.GeoDataFrame`s.
+
+Use {func}`geopandas.read_file()` to read data sets from files in one of the
+many geospatial data formats, such as *GeoPackage*, *GeoJSON*, or *ESRI
+Shapefile*.
+
+If your data is in a non-spatial file format, such as spreadsheets, or CSV
+files with columns representing the latitude and longitude coordinates, [follow
+these
+instructions](https://geopandas.org/en/stable/gallery/create_geopandas_from_pandas.html)
+to convert them into a {class}`geopandas.GeoDataFrame`.
+
+
+## Sample datasets
+
+In this documentation, we use some open data sets, that you can also find in the
+[source code
+repository](https://github.com/r5py/r5py/tree/main/docs/_static/data/). In
+particular, the sample data comprises of the following data sets:
+
+- A population grid data set of Helsinki city centre, obtained from the
+  [Helsinki Region Environmental
+  Services](https://www.hsy.fi/en/environmental-information/open-data/avoin-data---sivut/population-grid-of-helsinki-metropolitan-area/)
+  (HSY), licensed under a Creative Commons By Attribution 4.0.
+
+- An OpenStreetMap extract covering Helsinki (© OpenStreetMap contributors,
+  [ODbL license](https://www.openstreetmap.org/copyright))
+
+- A GTFS public transport schedule dataset for Helsinki, cropped and minimised
+  from the official open-data download from *Helsingin seudun liikenne*’s (HSL)
+  [open data web page](https://github.com/r5py/r5py/tree/main/docs/_static/data/),
+  licensed under a Creative Commons By Attribution 4.0.
diff --git a/docs/user-guide/user-manual/detailed-itineraries.md b/docs/user-guide/user-manual/detailed-itineraries.md
new file mode 100644
index 00000000..d1ed48e8
--- /dev/null
+++ b/docs/user-guide/user-manual/detailed-itineraries.md
@@ -0,0 +1,273 @@
+---
+kernelspec:
+  name: python3
+  display_name: python3
+jupytext:
+  text_representation:
+    extension: .md
+    format_name: myst
+    format_version: '0.13'
+    jupytext_version: 1.14.1
+---
+
+
+```{code-cell}
+:tags: [remove-input, remove-output]
+
+# this cell is hidden from READTHEDOCS output
+# it’s used to
+#    - set sys.path to point to the local *r5py* source code, to
+#    - use a different upstream R5 jar, so we can display the 
+#      geometries of public transport routes, to
+#    - define a `DATA_DIRECTORY` pathlib.Path, and to
+#    - force pandas to show all columns of the (very wide)
+#      result data set
+
+import pathlib
+import sys
+
+import pandas
+
+NOTEBOOK_DIRECTORY = pathlib.Path().resolve()
+DOCS_DIRECTORY = NOTEBOOK_DIRECTORY.parent.parent
+DATA_DIRECTORY = DOCS_DIRECTORY / "_static" / "data"
+R5PY_DIRECTORY = DOCS_DIRECTORY.parent / "src"
+
+sys.argv.extend([
+    "--r5-classpath",
+    "https://github.com/DigitalGeographyLab/r5/releases/download/"
+    "v6.9-post16-g1054c1e-20230619/r5-v6.9-post16-g1054c1e-20230619-all.jar"
+])
+
+sys.path.insert(0, str(R5PY_DIRECTORY))
+
+pandas.set_option("display.max_columns", None)
+```
+
+```{code-cell}
+:tags: [remove-input, remove-output]
+
+# also this cell is hidden in READTHEDOCS
+# it loads input geodata for the examples below
+
+# if you opened this notebook elsewhere, be sure to run
+# this cell, so data is read from disk
+
+import geopandas
+import r5py
+import shapely
+
+population_grid = geopandas.read_file(DATA_DIRECTORY / "Helsinki" / "population_grid_2020.gpkg")
+RAILWAY_STATION = shapely.Point(24.941521, 60.170666)
+
+transport_network = r5py.TransportNetwork(
+    f"{DATA_DIRECTORY}/Helsinki/kantakaupunki.osm.pbf",
+    [
+        f"{DATA_DIRECTORY}/Helsinki/GTFS.zip",
+    ]
+)
+```
+
+# Compute travel times with a detailed breakdown of the routing results
+
+In case you are interested in more detailed routing results, you can use
+{class}`DetailedItinerariesComputer<r5py.DetailedItinerariesComputer>`. In
+contrast to {class}`TravelTimeMatrixComputer<r5py.TravelTimeMatrixComputer>`, it
+reports individual trip segments, and possibly multiple options for each trip. 
+
+As such,
+{class}`DetailedItinerariesComputer<r5py.DetailedItinerariesComputer>`’s output
+is structured in a different way, too. It provides one row per trip segment,
+multiple trip segments together constitute a trip option, of which there might
+be several per `from_id`/`to_id` pair. The results also include information on
+the public transport routes (e.g., bus line numbers) used on the trip, as well
+as a {class}`shapely.geometry` for each segment.
+
+:::{admonition} Detailed itineraries are computationally expensive
+:class: attention
+
+Computing detailed itineraries is significantly more expensive than simple
+travel times. As such, think twice whether you actually need the information
+contained.
+
+For the examples below, to reduce computation effort, we use a sample of 10
+origin points and one single destination: the railway station. 
+
+:::
+
+
+```{code-cell}
+:tags: ["remove-output"]
+
+import datetime
+import r5py
+
+origins = population_grid.sample(10).copy()
+origins.geometry = origins.geometry.centroid
+
+destinations = geopandas.GeoDataFrame(
+        {
+            "id": [1],
+            "geometry": [RAILWAY_STATION]
+        },
+        crs="EPSG:4326",
+)
+
+detailed_itineraries_computer = r5py.DetailedItinerariesComputer(
+    transport_network,
+    origins=origins,
+    destinations=destinations,
+    departure=datetime.datetime(2022,2,22,8,30),
+    transport_modes=[r5py.TransportMode.TRANSIT, r5py.TransportMode.WALK],
+    snap_to_network=True,
+)
+```
+
+```{code-cell}
+travel_details = detailed_itineraries_computer.compute_travel_details()
+travel_details
+```
+
+
+As you can see, the result contains much more information than earlier.
+Depending on your screen size, you might even have to scroll further right to
+see all columns. 
+
+Especially in the case of public transport routes, or when choosing a list of
+different {attr}`transport_modes<r5py.RegionalTask.transport_modes>`, also the
+table structure of the results is more complex: For each origin/destination
+pair, one or more possible `option` is reported, which in turn can consist of
+one or more `segment`s. Both options and segments are numbered sequentially,
+starting at `0`.
+
+Each segment, then, represents one row in the results table, and provides
+information about the transport mode used for a segment, time travelled,
+possible wait time (before the departure of a public transport vehicle), the
+route (e.g., bus number, metro line), and finally a line geometry representing
+the travelled path.
+
+See the following table for a complete list of columns returned by
+{meth}`DetailedItinerariesComputer.compute_detailed_itineraries()<r5py.DetailedItinerariesComputer.compute_detailed_itineraries()>`:
+
+
+`from_id` (same type as `origins["id"]`)
+: the origin of the trip this segment belongs to
+
+`to_id` (same type as `origins["id"]`)
+: the destination of the trip this segment belongs to
+
+`option` ({class}`int`)
+: sequential number enumerating the the different trip options found. Each trip
+option consists of one or more trip segments. (starts with `0`)
+
+`segment` ({class}`int`)
+: sequential number enumerating the segments the current trip option consists
+of. (starts with `0`)
+
+`transport_mode` ({class}`r5py.TransportMode`)
+: the transport mode used on the current segment
+
+`departure_time` ({class}`datetime.datetime`)
+: the departure date and time of the public transport vehicle used for the
+current segment; `NaT` in case of other modes of transport
+
+`distance` ({class}`float`)
+: the distance travelled on the current segment, in metres. For public
+transport, see [note below](detailed-geometries-with-upstream-r5).
+
+`travel_time` ({class}`datetime.timedelta`)
+: The time spent travelling on the current segment
+
+`wait_time` ({class}`datetime.timedelta`)
+: if the current segment is a public transport vehicle: wait time between the
+arrival of the previous trip segment and the departure of the current segment.
+
+`route` ({class}`str`)
+: if the current segment is a public transport vehicle: the route number (or
+other id), as specified in the input GTFS data set, e.g. bus numbers, metro line
+names
+
+`geometry` ({class}`shapely.LineString`)
+: the path travelled on the current segment. For public transport, see [note
+below](detailed-geometries-with-upstream-r5).
+
+
+(detailed-geometries-with-upstream-r5)=
+
+:::{admonition} Geometries of public transport routes, and distances travelled
+:class: important
+
+The default upstream version of R⁵ is compiled with
+`com.conveyal.r5.transit.TransitLayer.SAVE_SHAPES = false`, which improves
+performance by *not reading the geometries included in GTFS data sets*. 
+
+As a consequence, the `geometry` reported by
+{class}`DetailedItinerariesComputer` are straight lines in-between the stops of
+a public transport line, and do not reflect the actual path travelled.
+
+With this in mind, *r5py* does not attempt to compute the distance of public
+transport segments if `SAVE_SHAPES = false`, as distances would be very crude
+approximations, only. Instead it reports `NaN`/`None`.
+
+The [Digital Geography Lab](https://www.helsinki.fi/en/researchgroups/digital-geography-lab) maintains a patched version of R⁵ in its [GitHub repositories](https://github.com/DigitalGeographyLab/r5/releases). If you want to refrain from compiling your own R⁵ jar, but still would like to use detailed geometries of public transport routes, follow the instructions in [Advanced usage](advanced-usage.md#use-a-custom-installation-of-r⁵).
+:::
+
+
+## Visualise travel details
+
+It’s not difficult to plot the detailed routes in a map, however, a couple more
+steps are needed than with simple travel times. On the one hand, the resulting
+table needs to be converted into a {class}`geopandas.GeoDataFrame`. On the other
+hand, {meth}`GeoDataFrame.explore()<geopandas.GeoDataFrame.explore()>` cannot
+handle the column types {class}`r5py.TransportMode` and
+{class}`datetime.timedelta` - the conversion is quick and easy, though:
+
+```{code-cell}
+travel_details["mode"] = travel_details.transport_mode.astype(str)
+travel_details["travel time (min)"] = travel_details.travel_time.apply(
+    lambda t: round(t.total_seconds() / 60.0, 2)
+)
+travel_details["trip"] = travel_details.apply(
+    lambda row: f"{row.from_id}→{row.to_id}",
+    axis=1
+)
+
+m = (
+    geopandas.GeoDataFrame(travel_details)
+    .set_geometry("geometry")
+    .set_crs("EPSG:4326")[
+        [
+            "geometry",
+            "distance",
+            "mode",
+            "travel time (min)",
+            "from_id",
+            "to_id",
+            "trip",
+            "option",
+            "segment",
+        ]
+    ]
+    .explore(
+        tooltip=["trip", "option", "segment", "mode", "travel time (min)", "distance"],
+        column="mode",
+        tiles="CartoDB.Positron",
+    )
+)
+```
+
+Let’s also add the origins to the map:
+
+```{code-cell}
+
+points = geopandas.GeoDataFrame(
+    pandas.DataFrame(
+        {"id": detailed_itineraries_computer.od_pairs["id_origin"].unique()}
+    )
+    .set_index("id")
+    .join(population_grid.set_index("id"))
+)
+points.geometry = points.geometry.to_crs("EPSG:3875").centroid.to_crs("EPSG:4326")
+points.explore(marker_kwds={"radius": 10}, tooltip={"id"}, m=m)
+
+```
diff --git a/docs/user-guide/user-manual/quickstart.md b/docs/user-guide/user-manual/quickstart.md
new file mode 100644
index 00000000..8e7e3862
--- /dev/null
+++ b/docs/user-guide/user-manual/quickstart.md
@@ -0,0 +1,216 @@
+---
+jupytext:
+  text_representation:
+    extension: .md
+    format_name: myst
+    format_version: 0.13
+    jupytext_version: 1.14.6
+kernelspec:
+  display_name: Python 3 (ipykernel)
+  language: python
+  name: python3
+---
+
+
+# Quickstart
+
+
++++ {"jupyter": {"source_hidden": true}}
+
+:::{toctree}
+:maxdepth: 1
+:caption: User Manual
+:hidden:
+
+self
+data-requirements
+travel-time-matrices
+Detailed itineraries <detailed-itineraries>
+configuration
+advanced-usage
+:::
+
+
+```{code-cell}
+:tags: [remove-input, remove-output]
+
+# this cell is hidden from READTHEDOCS output
+# it’s used to set sys.path to point to the local *r5py* source code,
+# and to define a `DATA_DIRECTORY` pathlib.Path
+import pathlib
+import sys
+
+NOTEBOOK_DIRECTORY = pathlib.Path().resolve()
+DOCS_DIRECTORY = NOTEBOOK_DIRECTORY.parent.parent
+DATA_DIRECTORY = DOCS_DIRECTORY / "_static" / "data"
+R5PY_DIRECTORY = DOCS_DIRECTORY.parent / "src"
+
+sys.path.insert(0, str(R5PY_DIRECTORY))
+```
+
+```{code-cell}
+:tags: [remove-input, remove-output]
+
+# also this cell is hidden in READTHEDOCS
+# it loads the input geodata for the quickstart example
+
+# if you opened this notebook elsewhere, be sure to run
+# this cell, so data is read from disk
+
+import geopandas
+population_grid = geopandas.read_file(DATA_DIRECTORY / "Helsinki" / "population_grid_2020.gpkg")
+
+import shapely
+RAILWAY_STATION = shapely.Point(24.941521, 60.170666)
+```
+
+One of the core functionalities of *r5py* is to compute travel time matrices for
+large extents, such as entire cities or countries. This page walks you through
+the - pleasantly few - steps to do so.
+
+In our example below, we work with data from Helsinki, the capital of Finland.
+We calculate the travel times on public transport or on foot from the centre
+points of all cells in a population grid data set to the city’s main railway stations.
+
+
+## Origins and destination
+
+As we intend to compute the travel times from the centre points of population grid
+cells to the railway station, we need to know the locations of these places. 
+
+For this example, we prepared the data ahead of time: `population_grid` is a
+[`geopandas.GeoDataFrame`](https://geopandas.org/en/stable/docs/user_guide/data_structures.html)
+containing a 250 ⨉ 250 m grid covering parts of downtown Helsinki, and obtained
+from the [Helsinki Region Environmental Services
+(HSY)](https://hri.fi/data/en_GB/dataset/vaestotietoruudukko). The
+[constant](https://stackoverflow.com/q/44636868) `RAILWAY_STATION` is a
+[`shapely.Point`](https://shapely.readthedocs.io/en/stable/reference/shapely.Point.html),
+its coordinates refer to Helsinki’s main railway station in the
+[`EPSG:4326`](https://spatialreference.org/ref/epsg/4326/) reference system.
+
+
+```{code-cell}
+import folium
+import geopandas
+import shapely
+
+overview_map = population_grid.explore("population", cmap="Reds")
+folium.Marker((RAILWAY_STATION.y, RAILWAY_STATION.x)).add_to(overview_map)
+overview_map
+```
+
+
+## Transport network
+
+Virtually all operations of *r5py* require a transport network.
+
+- The street network, including infrastructure for cycling and walking, is
+  loaded from an [OpenStreetMap
+  extract](https://wiki.openstreetmap.org/wiki/Extracts) in *Protocol Buffer*
+  (`.pbf`) format.
+- The public transport schedule can be read from a
+  [GTFS](https://en.wikipedia.org/wiki/GTFS) file.
+
+For the quickstart example, you find sample data sets in the `DATA_DIRECTORY`
+([`docs/_static/data`](https://github.com/r5py/r5py/tree/main/docs/_static/data/)
+in the source code repository).
+
+To import the street and public transport networks, instantiate an
+{class}`r5py.TransportNetwork` with the file paths to the OSM extract and to
+zero or more GTFS files:
+
+```{code-cell}
+:tags: ["remove-output"]
+
+import r5py
+
+transport_network = r5py.TransportNetwork(
+    DATA_DIRECTORY / "Helsinki" / "kantakaupunki.osm.pbf",
+    [
+        DATA_DIRECTORY / "Helsinki" / "GTFS.zip",
+    ]
+)
+```
+
+At this stage, *r5py* has created a routable transport network, that is refered
+to by the `transport_network` variable. We can now use this network for travel
+time calculations.
+
+
+## Compute a travel time matrix
+
+A travel time matrix is a dataset of the travel costs (typically, time) between
+given locations (origins and destinations) in a study area.  In *r5py*,
+{class}`r5py.TravelTimeMatrixComputer`s calculate these matrices. A
+{class}`TravelTimeMatrixComputer<r5py.TravelTimeMatrixComputer>`, once initialised,
+can be used multiple times with adjusted parameters, such as a different
+departure time.
+
+A {class}`TravelTimeMatrixComputer<r5py.TravelTimeMatrixComputer>` needs (at least)
+the following input arguments:
+- a `transport_network` ({class}`r5py.TransportNetwork`), such as the one we
+  just created,
+- `origins`, a {class}`geopandas.GeoDataFrame` with one or more points
+  representing the departure points of routes, 
+- `destinations`, a {class}`geopandas.GeoDataFrame` with one or more points
+  representing the destinations of routes, 
+- `departure`, a {class}`datetime.datetime`
+  refering to the departure date and time for routing, and
+- `transport_modes`, a list of {class}`r5py.TransportMode`s: the travel modes
+  that will be used in the calculations
+
+Once instantiated, call
+{meth}`TravelTimeMatrixComputer.compute_travel_times()<r5py.TravelTimeMatrixComputer.compute_travel_times()>`
+to carry out the actual analysis.
+
+```{code-cell}
+:tags: ["remove-output"]
+
+import datetime
+
+origins = population_grid.copy()
+origins.geometry = origins.geometry.centroid
+
+destinations = geopandas.GeoDataFrame(
+        {
+            "id": [1],
+            "geometry": [RAILWAY_STATION]
+        },
+        crs="EPSG:4326",
+)
+
+travel_time_matrix_computer = r5py.TravelTimeMatrixComputer(
+    transport_network,
+    origins=origins,
+    destinations=destinations,
+    departure=datetime.datetime(2022, 2, 22, 8, 30),
+    transport_modes=[
+        r5py.TransportMode.TRANSIT,
+        r5py.TransportMode.WALK,
+    ],
+)
+
+travel_times = travel_time_matrix_computer.compute_travel_times()
+travel_times.head()
+```
+
+The result of {meth}`compute_travel_times()<r5py.TravelTimeMatrixComputer.compute_travel_times()>` is a
+{class}`pandas.DataFrame`. The values in its `travel_time` column are travel
+times in minutes between the points identified by `from_id` and `to_id` (the
+IDs of the origins and destinations, respectively). As you can see, the `id`
+value in the `to_id` column is the same for all rows because our example used
+only one destination point (the railway station).
+
+To quickly plot the results in a map, *join* the `travel_times` with the input
+data set `population_grid` and
+{meth}`explore()<geopandas.GeoDataFrame.explore()>` the joint data frame’s
+data.
+
+```{code-cell}
+travel_times = population_grid.merge(travel_times, left_on="id", right_on="from_id")
+travel_times.head()
+```
+
+```{code-cell}
+travel_times.explore("travel_time", cmap="Greens")
+```
diff --git a/docs/user-guide/user-manual/travel-time-matrices.md b/docs/user-guide/user-manual/travel-time-matrices.md
new file mode 100644
index 00000000..458753be
--- /dev/null
+++ b/docs/user-guide/user-manual/travel-time-matrices.md
@@ -0,0 +1,281 @@
+---
+jupytext:
+  formats: md:myst
+  text_representation:
+    extension: .md
+    format_name: myst
+    format_version: 0.13
+    jupytext_version: 1.14.6
+kernelspec:
+  display_name: Python 3 (ipykernel)
+  language: python
+  name: python3
+---
+
+# Travel-time matrices
+
+```{code-cell}
+:tags: [remove-input, remove-output]
+
+# this cell is hidden from output
+# it’s used to set sys.path to point to the local repo,
+# and to define a `DATA_DIRECTORY` pathlib.Path
+import pathlib
+import sys
+
+NOTEBOOK_DIRECTORY = pathlib.Path().resolve()
+DOCS_DIRECTORY = NOTEBOOK_DIRECTORY.parent.parent
+DATA_DIRECTORY = DOCS_DIRECTORY / "_static" / "data"
+R5PY_DIRECTORY = DOCS_DIRECTORY.parent / "src"
+sys.path.insert(0, str(R5PY_DIRECTORY))
+```
+
+:::{dropdown} What is a travel time matrix?
+:open:
+:color: light
+:margin: 1 5 0 0
+
+A travel time matrix is a tool and data set that allows researchers to study how
+easily people can reach different destination within and beyond cities, and how
+accessibility is influenced by factors such as the quality of public transport
+systems, street networks, and land use patterns.
+
+Typically, a travel time matrix is a table that shows the travel time (or other
+travel costs) between all pairs of a set of locations in an urban area. The
+locations represent typical origins and destinations, such as everyday services
+and residential homes, or are a complete set of locations covering the entire
+area wall-to-wall, such as census polygons or a regular grid.
+
+Travel time matrices can then be used to analyse accessibility patterns,
+evaluate the impacts of transport planning and land use policies, and to
+identify in which areas and for which groups of people a city works best and
+worst. This information can then help cities to become more equitable and more
+sustainable, and foster a good quality of life for their residents.
+
+Successful recent research that either used or produced travel time matrices
+include the work of the Digital Geography Lab at the University of Helsinki
+(e.g., {cite:t}`tenkanen_longitudinal_2020`, {cite:t}`salonen_modelling_2013`,
+or {cite:t}`jarv_dynamic_2018`), the Mobility Network at the University of
+Toronto (e.g., {cite:t}`farber_dynamic_pt_2017`,
+{cite:t}`farber_temporal_variablity_2014`), and the Institute for Applied
+Economic Research (IPEA, e.g., {cite:t}`braga_evaluating_2023`,
+{cite:t}`herszenhut_impact_2022`).
+:::
+
+
+***
+
+
+As briefly visited in [Quickstart](quickstart) and dicussed in detail in [Data
+Requirements](data-requirements), fundamentally, two types of input data are
+required for computing a travel time matrix:
+
+- a transport network, and
+- a set of origins and destinations
+
+First, create a {class}`TransportNetwork<r5py.TransportNetwork>` and load an
+OpenStreetMap extract of the São Paulo city centre as well as a public transport
+schedule in GTFS format covering the same area:
+
+```{code-cell}
+:tags: [remove-output]
+
+import r5py
+
+transport_network = r5py.TransportNetwork(
+    DATA_DIRECTORY / "São Paulo" / "spo_osm.pbf",
+    [
+        DATA_DIRECTORY / "São Paulo" / "spo_gtfs.zip",
+    ]
+)
+```
+
+Studies that compare accessibility (*potential* mobility) between different
+neighbourhoods tend to use a regular grid of points that covers the study area
+as origins or destinations. Recently, hexagonal grids, such as Uber’s [H3
+indexing system](https://h3geo.org/) have gained popularity, as they assure
+equidistant neighbourhood relationships (all neighbouring grid cells’ centroids
+are at the same distance; in a grid of squares, the diagonal neighbours are
+roughly 41% further than the horizontal and vertical ones).
+
+We prepared such a hexagonal grid for São Paulo, and added the counts of
+`population`, `jobs`, and `schools` within each cell as separate columns.
+The `id` column refers to the H3 address of the grid cells.
+
+```{code-cell}
+import geopandas
+
+hexagon_grid = geopandas.read_file(DATA_DIRECTORY / "São Paulo" / "spo_hexgrid_EPSG32723.gpkg.zip")
+hexagon_grid
+```
+
+We can use {meth}`explore()<geopandas.GeoDataFrame.explore()>` to plot the
+hexagonal grid in a map:
+
+```{code-cell}
+hexagon_grid.explore()
+```
+
+*R5py* expects origins and destinations to be point geometries. For grid cells,
+the geometric center point (‘centroid’) is a good approximisation. One can use
+{attr}`geopandas.GeoDataSeries.centroid` to quickly derive a centroid (point)
+geometry from a polygon. We will create one data frame for origins, and one for
+destinations:
+
+```{code-cell}
+origins = hexagon_grid.copy()
+origins["geometry"] = origins.geometry.centroid
+```
+
+```{code-cell}
+destinations = hexagon_grid.copy()
+destinations["geometry"] = destinations.geometry.centroid
+```
+
+***
+
+
+With this, we have all input data sets needed for computing a travel time
+matrix: a transport network, origins, and destinations. We still need to decide
+which modes of transport should be used, and when to depart.
+
+The modes of transport can be passed as a list of different
+{class}`r5py.TransportMode`s (or their {class}`str` equivalent), the departure
+must be a {class}`datetime.datetime`. If you search for public transport routes,
+double-check that the departure date/time is covered by the input GTFS data set.
+
+```{code-cell}
+import datetime
+
+travel_time_matrix = r5py.TravelTimeMatrixComputer(
+    transport_network,
+    origins=origins,
+    destinations=destinations,
+    transport_modes=[r5py.TransportMode.TRANSIT],
+    departure=datetime.datetime(2019, 5, 13, 14, 0, 0),
+).compute_travel_times()
+```
+
+The output of
+{meth}`compute_travel_times()<r5py.TravelTimeMatrixComputer.compute_travel_times()>`
+is a table in which each row describes the travel time (`travel_time`) from an
+origin (`from_id`), to a destination (`to_id`). The latter two refer to the `id`
+column in the origins and destinations input data sets, respectively.
+
+```{code-cell}
+travel_time_matrix
+```
+
+```{code-cell}
+:tags: [remove-output, remove-input]
+
+import myst_nb
+
+origins_length = len(origins)
+destinations_length = len(destinations)
+matrix_length = origins_length * destinations_length
+
+myst_nb.glue("origins_length", origins_length, display=False)
+myst_nb.glue("destinations_length", destinations_length, display=False)
+myst_nb.glue("matrix_length", matrix_length, display=False)
+```
+
+As {class}`TravelTimeMatrixComputer<r5py.TravelTimeMatrixComputer>` creates an
+all-to-all matrix, the results contain one row for every combination of origins
+and destinations. Since we have {glue:}`origins_length` origins and
+{glue:}`destinations_length` destinations, the output travel time matrix is
+{glue:}`matrix_length` rows long.
+
+
+Alternatively, and possibly more intuitively, we can display the travel time
+matrix table as a matrix, using {meth}`pandas.DataFrame.pivot()`:
+
+```{code-cell}
+travel_time_matrix.pivot(index="from_id", columns="to_id", values="travel_time")
+```
+
+***
+
+
+## Exploring results
+
+### Travel times from anywhere to a particular place
+
+Once the travel time matrix is computed, we can use the data to analyse and
+visualise different measures of accessibility. For instance, we can filter the
+table to show all rows for which the destination is the [Praça da
+Sé](https://en.wikipedia.org/wiki/Pra%C3%A7a_da_S%C3%A9), a public square in the
+centre of the city. By plotting the travel times in a map, we can quickly assess
+how equitable the public transport network of São Paulo is for the residents of
+different parts of the city.
+
+For this we first create a copy of the result data frame, filtered to contain
+only rows with `to_id` referencing the Praça da Sé. Then, we join this table to
+the input hexagonal grid, and drop any records that have `NaN` values, i.e., for
+which there was no result. Finally, as we did above, we use the
+{meth}`explore()<geopandas.GeoDataFrame.explore()>` to display the values in a
+map.
+
+```{code-cell}
+PRAÇA_DA_SÉ = "89a8100c02fffff"
+
+travel_times_to_centre = travel_time_matrix[travel_time_matrix["to_id"] == PRAÇA_DA_SÉ].copy()
+travel_times_to_centre = travel_times_to_centre.set_index("from_id")[["travel_time"]]
+
+hexagons_with_travel_time_to_centre = (
+    hexagon_grid.set_index("id").join(travel_times_to_centre)
+)
+
+hexagons_with_travel_time_to_centre
+```
+
+```{code-cell}
+hexagons_with_travel_time_to_centre.explore(column="travel_time", cmap="Oranges")
+```
+
+You can clearly see how travel times do not increase uniformly, but are shorter
+along the major transport axis (metro, railways, bus corridors).
+
+
+***
+
+
+### Aggregated/average accessibility
+
+Another quick way of getting an understanding of how well different parts of the
+city are served by public transport is to aggregate the travel times from or to
+each cell over the entire study region. Of course, this creates [edge
+effects](https://doi.org/10.1016/B978-008044910-4.00423-5), so in our limited
+example, grid cells further outside will have worse over-all accessibility
+values. However, if an entire city region, e.g., covering the entire public
+transport network, can be captured in one analysis, unwanted artefacts of the
+analysis have a smaller impact.
+
+To aggregate travel times, we can use the
+{meth}`groupby()<pandas.DataFrame.groupby()>` method of pandas’ data frames, and
+one of the different aggregation functions available for the resulting
+{class}`pandas.GroupBy` objects. For instance, to show the median travel time
+from any cell to any other cell in our grid, we group the results using
+`from_id` and {meth}`median()<pandas.GroupBy.median()>`:
+
+```{code-cell}
+median_travel_times = travel_time_matrix.groupby("from_id").median("travel_time")
+median_travel_times
+```
+
+Again, we can join these median travel times to the hexagonal grid to display a
+nice map:
+
+```{code-cell}
+hexagons_with_median_travel_times = (
+    hexagon_grid.set_index("id").join(median_travel_times)
+)
+
+hexagons_with_median_travel_times.explore(column="travel_time", cmap="Oranges")
+```
+
+## Bibliography
+
+:::{bibliography}
+:filter: docname in docnames
+:::
diff --git a/pyproject.toml b/pyproject.toml
index 825ef608..82809ae1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -43,6 +43,10 @@ license = {text = "GPL-3.0-or-later or MIT"}
 dynamic = ["version"]
 
 [project.optional-dependencies]
+docs = ["contextily", "folium", "h3", "mapclassify", "matplotlib", "myst-nb",
+        "nbsphinx", "pybtex-apa7-style", "shapely", "sphinx",
+        "sphinx-book-theme", "sphinx-design", "sphinxcontrib-bibtex",
+        "sphinxcontrib-images"]
 tests = ["pytest", "pytest-asyncio", "pytest-cov", "pytest-lazy-fixture"]
 
 [project.urls]
diff --git a/src/r5py/__init__.py b/src/r5py/__init__.py
index d02d7fd9..a645ece5 100644
--- a/src/r5py/__init__.py
+++ b/src/r5py/__init__.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-"""Python wrapper for R5."""
+"""Python wrapper for the R5 routing analysis engine."""
 
 __version__ = "0.0.4"
 
diff --git a/src/r5py/__main__.py b/src/r5py/__main__.py
index d5d8ea78..f3f5e955 100644
--- a/src/r5py/__main__.py
+++ b/src/r5py/__main__.py
@@ -1,1 +1,16 @@
-"""A Python wrapper for the [R5 routing analysis engine."""
+#!/usr/bin/env python3
+
+
+"""A Python wrapper for the R5 routing analysis engine."""
+
+
+from .util import Config
+
+
+def main():
+    config = Config()
+    arguments = config.get_arguments()  # noqa F401
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/r5py/util/config.py b/src/r5py/util/config.py
index ca809e31..00352d12 100644
--- a/src/r5py/util/config.py
+++ b/src/r5py/util/config.py
@@ -9,11 +9,21 @@
 import tempfile
 
 import configargparse
+import importlib_resources
 
 
 __all__ = ["Config"]
 
 
+PACKAGE = __package__.split(".")[0]
+CONFIG_FILE_TEMPLATE = importlib_resources.files(f"{PACKAGE}.util").joinpath(
+    f"{PACKAGE}.yml.template"
+)
+
+if "HOME" not in os.environ:  # e.g., testing environment or container
+    os.environ["HOME"] = "."
+
+
 class Config:
     """Load configuration from config files or command line arguments."""
 
@@ -21,13 +31,11 @@ class Config:
 
     def __init__(self):
         """Load configuration from config files or command line arguments."""
-        if "HOME" not in os.environ:  # e.g., testing environment or container
-            os.environ["HOME"] = "."
 
         self.argparser.add(
             "-v",
             "--verbose",
-            help="Enable verbose output from R5.",
+            help="Enable verbose output from R5 and r5py",
             action="store_true",
         )
 
@@ -38,24 +46,24 @@ def __new__(cls):
 
     @property
     def arguments(self):
-        """Parse arguments passed from command line or config file."""
-        arguments = self.argparser.parse_known_args()[0]
-        return arguments
+        """
+        Arguments passed from command line or config file.
 
-    _argparser = None  # class property: Singleton!
+        Ignores `--help`: can be used while not all modules have added arguments.
+        """
+        return self.get_arguments(ignore_help_args=True)
 
     @property
     def argparser(self):
-        if self._argparser is None:
-            try:
-                self._argparser = configargparse.get_argument_parser(
-                    prog=self.PACKAGE,
-                    description=sys.modules[self.PACKAGE].__doc__,
-                    default_config_files=self.CONFIG_FILES,
-                )
-            except ValueError:  # has been instantiated, already
-                self._argparser = configargparse.get_argument_parser()
-        return self._argparser
+        try:
+            argparser = configargparse.get_argument_parser(
+                prog=PACKAGE,
+                description=sys.modules[PACKAGE].__doc__,
+                default_config_files=self.CONFIG_FILES,
+            )
+        except ValueError:  # has been instantiated, already
+            argparser = configargparse.get_argument_parser()
+        return argparser
 
     @functools.cached_property
     def CACHE_DIR(self):
@@ -65,7 +73,7 @@ def CACHE_DIR(self):
                 or os.environ.get("XDG_CACHE_HOME")
                 or (pathlib.Path(os.environ["HOME"]) / ".cache")
             )
-            / self.PACKAGE
+            / PACKAGE
         )
         cache_dir.mkdir(parents=True, exist_ok=True)
         return cache_dir
@@ -73,21 +81,56 @@ def CACHE_DIR(self):
     @functools.cached_property
     def CONFIG_FILES(self):
         config_files = [
-            f"/etc/{self.PACKAGE}.yml",
-            str(
-                pathlib.Path(
-                    os.environ.get("APPDATA")
-                    or os.environ.get("XDG_CONFIG_HOME")
-                    or (pathlib.Path(os.environ["HOME"]) / ".config")
-                )
-                / f"{self.PACKAGE}.yml",
-            ),
+            pathlib.Path(f"/etc/{PACKAGE}.yml"),
+            pathlib.Path(
+                os.environ.get("APPDATA")
+                or os.environ.get("XDG_CONFIG_HOME")
+                or (pathlib.Path(os.environ["HOME"]) / ".config")
+            )
+            / f"{PACKAGE}.yml",
         ]
+
+        # write a template configuration file to possible locations
+        for config_file in config_files:
+            self._copy_config_file_template(config_file)
+
+        # argparse does not understand pathlib.Path
+        config_files = [str(config_file) for config_file in config_files]
+
         return config_files
 
+    @staticmethod
+    def _copy_config_file_template(destination_path):
+        """
+        Try to copy a configuration file template.
+
+        Arguments:
+        ----------
+        destination_path : pathlib.Path
+            Where could/should a configuration file exist?
+        """
+        if not destination_path.exists():
+            try:
+                destination_path.parent.mkdir(parents=True, exist_ok=True)
+
+                with importlib_resources.as_file(CONFIG_FILE_TEMPLATE) as template:
+                    destination_path.write_text(template.read_text())
+
+            except (
+                FileNotFoundError,
+                FileExistsError,
+                IsADirectoryError,
+                PermissionError,
+            ):
+                pass
+
+    def get_arguments(self, ignore_help_args=False):
+        """Parse arguments passed from command line or config file."""
+        return self.argparser.parse_known_args(ignore_help_args=ignore_help_args)[0]
+
     @functools.cached_property
     def TEMP_DIR(self):
         temp_dir = pathlib.Path(tempfile.mkdtemp(prefix=self.PACKAGE))
         return temp_dir
 
-    PACKAGE = __package__.split(".")[0]
+    PACKAGE = PACKAGE
diff --git a/src/r5py/util/jvm.py b/src/r5py/util/jvm.py
index 38b7311d..5c0688cc 100644
--- a/src/r5py/util/jvm.py
+++ b/src/r5py/util/jvm.py
@@ -55,6 +55,7 @@ def start_jvm():
             "-Duser.variant=",  # … values as a localised string
             f"-Djava.io.tmpdir={TEMP_DIR}",
             classpath=[R5_CLASSPATH],
+            interrupt=True,
         )
 
         # Add shutdown hook that cleans up the temporary directory
diff --git a/src/r5py/util/memory_footprint.py b/src/r5py/util/memory_footprint.py
index e4f809f3..06968e02 100644
--- a/src/r5py/util/memory_footprint.py
+++ b/src/r5py/util/memory_footprint.py
@@ -18,21 +18,18 @@
 
 
 config = Config()
-try:
-    config.argparser.add(
-        "-m",
-        "--max-memory",
-        help="""
-            Memory limit for the JVM running R5.
-
-            Use % as a suffix to specify a share of total RAM;
-            K, M, G, T to specify KiB, MiB, GiB, or TiB, respectively.
-            Values without suffix are interpreted as bytes.
-        """,
-        default="80%",
-    )
-except ValueError:
-    pass  # argument has been added, already
+config.argparser.add(
+    "-m",
+    "--max-memory",
+    help="""
+        Memory limit for the JVM running R5.
+
+        Use % as a suffix to specify a share of total RAM;
+        K, M, G, T to specify KiB, MiB, GiB, or TiB, respectively.
+        Values without suffix are interpreted as bytes.
+    """,
+    default="80%",
+)
 
 
 def _share_of_ram(share=0.8, leave_at_least=(2 * 1024**3)):
diff --git a/src/r5py/util/r5py.yml.template b/src/r5py/util/r5py.yml.template
new file mode 100644
index 00000000..002b54d1
--- /dev/null
+++ b/src/r5py/util/r5py.yml.template
@@ -0,0 +1,31 @@
+# Configuration file for r5py
+#
+# Uncomment and change options from their default values below
+# This list might be incomplete after upgrades (existing configuration files
+# are not overwritten), run `python -m r5py --help` for a complete list of
+# command line arguments. Strip leading dashes from command line arguments to
+# use them as configuration options.
+#
+# See https://r5py.readthedocs.io/ for up-to-date details
+
+
+
+# Set the limit for the Java Virtual Machine’s heap size (-Xmx). This option
+# accepts either absolute values (integer or decimal), optionally with a suffix
+# to indicate Mibibytes, Gibibytes, or Tebibytes: M, G, T), or relative,
+# expressed in a percentage of total memory, with a % suffix.
+
+#max-memory: 80%
+
+
+
+# Point to R5’s JAR (or build directory) in case you want to use a custom R5
+# installation.
+
+#r5-classpath: /usr/share/java/r5/r5-all.jar
+
+
+
+# Show more detailed output
+
+#verbose: False


Test patch:
diff --git a/.github/workflows/lint-test-upon-push.yml b/.github/workflows/lint-test-upon-push.yml
index 542019c2..711862bd 100644
--- a/.github/workflows/lint-test-upon-push.yml
+++ b/.github/workflows/lint-test-upon-push.yml
@@ -22,9 +22,9 @@ jobs:
       - name: Install black and flake8
         run: python -m pip install black flake8
       - name: Lint using black
-        run: python -m black --check src
+        run: python -m black --check .
       - name: Lint using flake8
-        run: python -m flake8 src
+        run: python -m flake8 .
 
   test:
     name: Run tests (${{ matrix.os }}, ${{ matrix.env }})
diff --git a/docs/data/test_data/test_detailed_itineraries_bicycle.gpkg.zip b/docs/_static/data/test_data/test_detailed_itineraries_bicycle.gpkg.zip
similarity index 100%
rename from docs/data/test_data/test_detailed_itineraries_bicycle.gpkg.zip
rename to docs/_static/data/test_data/test_detailed_itineraries_bicycle.gpkg.zip
diff --git a/docs/data/test_data/test_detailed_itineraries_car.gpkg.zip b/docs/_static/data/test_data/test_detailed_itineraries_car.gpkg.zip
similarity index 100%
rename from docs/data/test_data/test_detailed_itineraries_car.gpkg.zip
rename to docs/_static/data/test_data/test_detailed_itineraries_car.gpkg.zip
diff --git a/docs/data/test_data/test_detailed_itineraries_transit.gpkg.zip b/docs/_static/data/test_data/test_detailed_itineraries_transit.gpkg.zip
similarity index 100%
rename from docs/data/test_data/test_detailed_itineraries_transit.gpkg.zip
rename to docs/_static/data/test_data/test_detailed_itineraries_transit.gpkg.zip
diff --git a/docs/data/test_data/test_detailed_itineraries_walk.gpkg.zip b/docs/_static/data/test_data/test_detailed_itineraries_walk.gpkg.zip
similarity index 100%
rename from docs/data/test_data/test_detailed_itineraries_walk.gpkg.zip
rename to docs/_static/data/test_data/test_detailed_itineraries_walk.gpkg.zip
diff --git a/docs/data/test_data/test_invalid_points_duplicate_ids.geojson b/docs/_static/data/test_data/test_invalid_points_duplicate_ids.geojson
similarity index 100%
rename from docs/data/test_data/test_invalid_points_duplicate_ids.geojson
rename to docs/_static/data/test_data/test_invalid_points_duplicate_ids.geojson
diff --git a/docs/data/test_data/test_invalid_points_no_id_column.geojson b/docs/_static/data/test_data/test_invalid_points_no_id_column.geojson
similarity index 100%
rename from docs/data/test_data/test_invalid_points_no_id_column.geojson
rename to docs/_static/data/test_data/test_invalid_points_no_id_column.geojson
diff --git a/docs/data/test_data/test_snapped_population_grid_centroids.geojson b/docs/_static/data/test_data/test_snapped_population_grid_centroids.geojson
similarity index 100%
rename from docs/data/test_data/test_snapped_population_grid_centroids.geojson
rename to docs/_static/data/test_data/test_snapped_population_grid_centroids.geojson
diff --git a/docs/data/test_data/test_valid_points_data.geojson b/docs/_static/data/test_data/test_valid_points_data.geojson
similarity index 100%
rename from docs/data/test_data/test_valid_points_data.geojson
rename to docs/_static/data/test_data/test_valid_points_data.geojson
diff --git a/docs/data/test_data/test_valid_single_point_data.geojson b/docs/_static/data/test_data/test_valid_single_point_data.geojson
similarity index 100%
rename from docs/data/test_data/test_valid_single_point_data.geojson
rename to docs/_static/data/test_data/test_valid_single_point_data.geojson
diff --git a/docs/data/test_data/test_walking_details_not_snapped.csv b/docs/_static/data/test_data/test_walking_details_not_snapped.csv
similarity index 100%
rename from docs/data/test_data/test_walking_details_not_snapped.csv
rename to docs/_static/data/test_data/test_walking_details_not_snapped.csv
diff --git a/docs/data/test_data/test_walking_details_snapped.csv b/docs/_static/data/test_data/test_walking_details_snapped.csv
similarity index 100%
rename from docs/data/test_data/test_walking_details_snapped.csv
rename to docs/_static/data/test_data/test_walking_details_snapped.csv
diff --git a/docs/data/test_data/test_walking_times_not_snapped.csv b/docs/_static/data/test_data/test_walking_times_not_snapped.csv
similarity index 100%
rename from docs/data/test_data/test_walking_times_not_snapped.csv
rename to docs/_static/data/test_data/test_walking_times_not_snapped.csv
diff --git a/docs/data/test_data/test_walking_times_snapped.csv b/docs/_static/data/test_data/test_walking_times_snapped.csv
similarity index 100%
rename from docs/data/test_data/test_walking_times_snapped.csv
rename to docs/_static/data/test_data/test_walking_times_snapped.csv
diff --git a/tests/conftest.py b/tests/conftest.py
index c52842fd..252ce011 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -21,7 +21,10 @@
 import shapely
 
 
-DATA_DIRECTORY = pathlib.Path(__file__).absolute().parent.parent / "docs" / "data"
+# test_data
+DATA_DIRECTORY = (
+    pathlib.Path(__file__).resolve().parent.parent / "docs" / "_static" / "data"
+)
 
 
 OSM_PBF = DATA_DIRECTORY / "Helsinki" / "kantakaupunki.osm.pbf"
@@ -131,6 +134,11 @@ def not_a_gtfs_file():
     yield OSM_PBF
 
 
+@pytest.fixture
+def gtfs_file_path():
+    yield GTFS
+
+
 @pytest.fixture
 def gtfs_timezone_helsinki():
     yield "Europe/Helsinki"
@@ -159,6 +167,11 @@ def origins_valid_ids():
     yield origins
 
 
+@pytest.fixture
+def osm_pbf_file_path():
+    yield OSM_PBF
+
+
 @pytest.fixture(scope="session")
 def population_grid():
     yield geopandas.read_file(POPULATION_GRID)
@@ -220,8 +233,12 @@ def r5_jar_url():
     yield R5_JAR_URL
 
 
-@pytest.fixture()
-def regional_task(transport_network, population_grid_points, departure_datetime):
+@pytest.fixture
+def regional_task(
+    population_grid_points,
+    transport_network,
+    departure_datetime,
+):
     import r5py
 
     regional_task = r5py.RegionalTask(
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 00000000..a67b981b
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+
+
+import importlib
+import os
+
+import r5py.util.config
+
+
+class TestConfig:
+    def test_setdefaulthome(self):
+        del os.environ["HOME"]
+        importlib.reload(r5py.util.config)
+        assert os.environ["HOME"] == "."
diff --git a/tests/test_detailed_itineraries_computer.py b/tests/test_detailed_itineraries_computer.py
index 9f4eb63d..39ecd61a 100644
--- a/tests/test_detailed_itineraries_computer.py
+++ b/tests/test_detailed_itineraries_computer.py
@@ -179,7 +179,9 @@ def test_detailed_itineraries_initialization(
             departure=departure_datetime,
             transport_modes=[r5py.TransportMode.TRANSIT, r5py.TransportMode.WALK],
         )
-        assert isinstance(detailed_itineraries_computer.transport_network, r5py.TransportNetwork)
+        assert isinstance(
+            detailed_itineraries_computer.transport_network, r5py.TransportNetwork
+        )
 
     def test_detailed_itineraries_initialization_with_files(
         self,
@@ -191,7 +193,9 @@ def test_detailed_itineraries_initialization_with_files(
             departure=departure_datetime,
             transport_modes=[r5py.TransportMode.TRANSIT, r5py.TransportMode.WALK],
         )
-        assert isinstance(detailed_itineraries_computer.transport_network, r5py.TransportNetwork)
+        assert isinstance(
+            detailed_itineraries_computer.transport_network, r5py.TransportNetwork
+        )
 
     @pytest.mark.parametrize(
         [
@@ -362,11 +366,15 @@ def test_snap_to_network(
         travel_details = detailed_itineraries_computer.compute_travel_details()
 
         travel_details = (
-            travel_details.groupby(["from_id", "to_id", "option"]).sum(["travel_time", "distance"]).reset_index()
+            travel_details.groupby(["from_id", "to_id", "option"])
+            .sum(["travel_time", "distance"])
+            .reset_index()
         )
 
         travel_details = travel_details.set_index(["from_id", "to_id"]).sort_index()
-        expected_travel_details = expected_travel_details.set_index(["from_id", "to_id"]).sort_index()
+        expected_travel_details = expected_travel_details.set_index(
+            ["from_id", "to_id"]
+        ).sort_index()
 
         pandas.testing.assert_frame_equal(travel_details, expected_travel_details)
 
@@ -377,7 +385,9 @@ def test_snap_to_network_with_unsnappable_origins(
         population_grid_points,
         departure_datetime,
     ):
-        origins = pandas.concat([population_grid_points[-3:], unsnappable_points]).reset_index(drop=False)
+        origins = pandas.concat(
+            [population_grid_points[-3:], unsnappable_points]
+        ).reset_index(drop=False)
         with pytest.warns(
             RuntimeWarning,
             match="Some destination points could not be snapped to the street network",
@@ -397,7 +407,9 @@ def test_snap_to_network_with_only_unsnappable_origins(
         unsnappable_points,
         departure_datetime,
     ):
-        with pytest.raises(ValueError, match="After snapping, no valid origin points remain"):
+        with pytest.raises(
+            ValueError, match="After snapping, no valid origin points remain"
+        ):
             with pytest.warns(
                 RuntimeWarning,
                 match="Some origin points could not be snapped to the street network",
@@ -418,7 +430,9 @@ def test_snap_to_network_with_unsnappable_destinations(
         unsnappable_points,
         departure_datetime,
     ):
-        destinations = pandas.concat([population_grid_points[-3:], unsnappable_points]).reset_index(drop=False)
+        destinations = pandas.concat(
+            [population_grid_points[-3:], unsnappable_points]
+        ).reset_index(drop=False)
         with pytest.warns(
             RuntimeWarning,
             match="Some destination points could not be snapped to the street network",
@@ -440,7 +454,9 @@ def test_snap_to_network_with_only_unsnappable_destinations(
         unsnappable_points,
         departure_datetime,
     ):
-        with pytest.raises(ValueError, match="After snapping, no valid destination points remain"):
+        with pytest.raises(
+            ValueError, match="After snapping, no valid destination points remain"
+        ):
             with pytest.warns(
                 RuntimeWarning,
                 match="Some destination points could not be snapped to the street network",
@@ -513,7 +529,9 @@ def test_travel_details_by_transport_mode(
             transport_network,
             origins=origins,
             departure=departure_datetime,
-            departure_time_window=datetime.timedelta(hours=1),  # using old default for simplicity
+            departure_time_window=datetime.timedelta(
+                hours=1
+            ),  # using old default for simplicity
             transport_modes=[transport_mode],
         )
         if transport_mode == r5py.TransportMode.TRANSIT:
@@ -525,9 +543,15 @@ def test_travel_details_by_transport_mode(
         else:
             travel_details = detailed_itineraries_computer.compute_travel_details()
 
-        travel_details.travel_time = travel_details.travel_time.apply(lambda t: t.total_seconds())
-        travel_details.wait_time = travel_details.wait_time.apply(lambda t: None if t is None else t.total_seconds())
-        travel_details.transport_mode = travel_details.transport_mode.apply(lambda t: t.value)
+        travel_details.travel_time = travel_details.travel_time.apply(
+            lambda t: t.total_seconds()
+        )
+        travel_details.wait_time = travel_details.wait_time.apply(
+            lambda t: None if t is None else t.total_seconds()
+        )
+        travel_details.transport_mode = travel_details.transport_mode.apply(
+            lambda t: t.value
+        )
 
         travel_details.replace(to_replace=[None], value=numpy.nan, inplace=True)