diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb9e..0000000000
--- 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/README.rst b/docs/README.rst
deleted file mode 100644
index a05c4ddd93..0000000000
--- a/docs/README.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-README
-======
-
-.. mdinclude:: ../README.md
-
-https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html
-
diff --git a/docs/StartHere.py b/docs/StartHere.py
deleted file mode 100644
index adba2560c4..0000000000
--- a/docs/StartHere.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-# coding: utf-8
-
-get_ipython().run_line_magic("load_ext", "autoreload")
-get_ipython().run_line_magic("autoreload", "2")
-
-import matplotlib.pylab as plt
-
-import sys
-
-sys.path.append("..")
-
-import tidy3d as td
-import tidy3d.web as web
-
-
-# set up parameters of simulation
-dl = 0.01
-pml = td.PML(profile="standard", num_layers=10)
-sim_size = [4, 4, 4]
-freq0 = 3e14
-fwidth = 1e13
-run_time = 10 / fwidth
-
-# create structure
-dielectric = td.nk_to_medium(n=2, k=0, freq=freq0)
-square = td.Structure(geometry=td.Box(center=[0, 0, 0], size=[1.5, 1.5, 1.5]), medium=dielectric)
-
-# create source
-source = td.VolumeSource(
- center=(-1.5, 0, 0),
- size=(0, 0.4, 0.4),
- source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),
- polarization="Ex",
-)
-
-# create monitor
-monitor = td.FieldMonitor(fields=["Ex", "Hy"], center=(0, 0, 0), size=(4, 4, 0), freqs=[freq0])
-
-# Initialize simulation
-sim = td.Simulation(
- size=sim_size,
- grid_size=(dl, dl, dl),
- structures=[square],
- sources={"source": source},
- monitors={"monitor": monitor},
- run_time=run_time,
- pml_layers=(pml, pml, pml),
-)
-
-
-task_id = web.upload(sim, task_name="quickstart")
-web.start(task_id)
-web.monitor(task_id)
-
-
-web.download(task_id, simulation=sim, path="data/sim_data.hdf5")
-
-
-sim_data = web.load_data(task_id, simulation=sim, path="data/sim_data.hdf5")
-ax = (
- sim_data["monitor"]
- .Ex.isel(f=0, z=0)
- .imag.plot.pcolormesh(x="x", y="y", vmin=-5e-13, vmax=5e-13, cmap="RdBu")
-)
-
-plt.show()
-
-
-sim_data.log
diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css
deleted file mode 100644
index d2d8344a66..0000000000
--- a/docs/_static/css/custom.css
+++ /dev/null
@@ -1,8 +0,0 @@
-
-.wy-side-nav-search { background-color: #b5445b; }
-.wy-nav-top { background-color: #666666; }
-.wy-menu > .caption > span.caption-text { color: #b5445b; }
-
-.wy-nav-content { max-width: 900px !important; }
-.wy-table-responsive table td { white-space: normal !important; }
-.wy-table-responsive { overflow: visible !important; }
diff --git a/docs/_static/logo.svg b/docs/_static/logo.svg
deleted file mode 100644
index 57c7adf9b6..0000000000
--- a/docs/_static/logo.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/docs/_static/pml_right_wrong.png b/docs/_static/pml_right_wrong.png
deleted file mode 100644
index f153f7c5db..0000000000
Binary files a/docs/_static/pml_right_wrong.png and /dev/null differ
diff --git a/docs/_static/quickstart_fields.png b/docs/_static/quickstart_fields.png
deleted file mode 100644
index 3727490178..0000000000
Binary files a/docs/_static/quickstart_fields.png and /dev/null differ
diff --git a/docs/_templates/material_class.rst b/docs/_templates/material_class.rst
deleted file mode 100644
index b57a7ceebb..0000000000
--- a/docs/_templates/material_class.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-{{ fullname }}
-{{ underline }}
-
-.. currentmodule:: {{ module }}
-
-.. autoclass:: {{ objname }}
\ No newline at end of file
diff --git a/docs/_templates/material_functions.rst b/docs/_templates/material_functions.rst
deleted file mode 100644
index 5184e98d11..0000000000
--- a/docs/_templates/material_functions.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-Material library
-{{ underline }}
-
-.. automodule:: {{ fullname }}
-
- {% block functions %}
- {% if functions %}
-
- .. autosummary::
- :toctree: {{ objname }}
- {% for item in functions %}
- {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
diff --git a/docs/_templates/materials.rst b/docs/_templates/materials.rst
deleted file mode 100644
index 5a913ec6bd..0000000000
--- a/docs/_templates/materials.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-Material library
-{{ underline }}
-
-.. automodule:: {{ fullname }}
-
- {% block classes %}
- {% if classes %}
-
- .. autosummary::
- :toctree: {{ objname }}
- :template: material_class.rst
- {% for item in classes %}
- {{ item }}
- {%- endfor %}
- {% endif %}
- {% endblock %}
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/__init__.py b/docs/_themes/sphinx_rtd_theme/__init__.py
deleted file mode 100644
index 130b2b326d..0000000000
--- a/docs/_themes/sphinx_rtd_theme/__init__.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""
-Sphinx Read the Docs theme.
-
-From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
-"""
-
-from os import path
-
-from sphinx import version_info
-from sphinx.locale import _
-
-try:
- # Avaliable from Sphinx 1.6
- from sphinx.util.logging import getLogger
-except ImportError:
- from logging import getLogger
-
-
-__version__ = "0.5.1"
-__version_full__ = __version__
-
-logger = getLogger(__name__)
-
-
-def get_html_theme_path():
- """Return list of HTML theme paths."""
- cur_dir = path.abspath(path.dirname(path.dirname(__file__)))
- return cur_dir
-
-
-def config_initiated(app, config):
- theme_options = config.html_theme_options or {}
- if theme_options.get("canonical_url"):
- logger.warning(
- _(
- "The canonical_url option is deprecated, use the html_baseurl option from Sphinx instead."
- )
- )
-
-
-# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
-def setup(app):
- if version_info >= (1, 6, 0):
- # Register the theme that can be referenced without adding a theme path
- app.add_html_theme("sphinx_rtd_theme", path.abspath(path.dirname(__file__)))
-
- if version_info >= (1, 8, 0):
- # Add Sphinx message catalog for newer versions of Sphinx
- # See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog
- rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), "locale")
- app.add_message_catalog("sphinx", rtd_locale_path)
- app.connect("config-inited", config_initiated)
-
- return {"parallel_read_safe": True, "parallel_write_safe": True}
diff --git a/docs/_themes/sphinx_rtd_theme/breadcrumbs.html b/docs/_themes/sphinx_rtd_theme/breadcrumbs.html
deleted file mode 100644
index f58eff5962..0000000000
--- a/docs/_themes/sphinx_rtd_theme/breadcrumbs.html
+++ /dev/null
@@ -1,84 +0,0 @@
-{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
-
-{% if page_source_suffix %}
-{% set suffix = page_source_suffix %}
-{% else %}
-{% set suffix = source_suffix %}
-{% endif %}
-
-{% if meta is defined and meta is not none %}
-{% set check_meta = True %}
-{% else %}
-{% set check_meta = False %}
-{% endif %}
-
-{% if check_meta and 'github_url' in meta %}
-{% set display_github = True %}
-{% endif %}
-
-{% if check_meta and 'bitbucket_url' in meta %}
-{% set display_bitbucket = True %}
-{% endif %}
-
-{% if check_meta and 'gitlab_url' in meta %}
-{% set display_gitlab = True %}
-{% endif %}
-
-{% set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %}
-
-
-
-
-
- {% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
-
- {% endif %}
-
-
diff --git a/docs/_themes/sphinx_rtd_theme/footer.html b/docs/_themes/sphinx_rtd_theme/footer.html
deleted file mode 100644
index 1284a24368..0000000000
--- a/docs/_themes/sphinx_rtd_theme/footer.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
diff --git a/docs/_themes/sphinx_rtd_theme/layout.html b/docs/_themes/sphinx_rtd_theme/layout.html
deleted file mode 100644
index 1f2f42a1c8..0000000000
--- a/docs/_themes/sphinx_rtd_theme/layout.html
+++ /dev/null
@@ -1,258 +0,0 @@
-{# TEMPLATE VAR SETTINGS #}
-{%- set url_root = pathto('', 1) %}
-{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
-{%- if not embedded and docstitle %}
- {%- set titlesuffix = " — "|safe + docstitle|e %}
-{%- else %}
- {%- set titlesuffix = "" %}
-{%- endif %}
-{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
-{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
-
-
-
-
-
- {{ metatags }}
-
- {% block htmltitle %}
- {{ title|striptags|e }}{{ titlesuffix }}
- {% endblock %}
-
- {# CSS #}
-
-
- {%- for css in css_files %}
- {%- if css|attr("rel") %}
-
- {%- else %}
-
- {%- endif %}
- {%- endfor %}
-
- {%- for cssfile in extra_css_files %}
-
- {%- endfor %}
-
- {# FAVICON #}
- {% if favicon %}
-
- {% endif %}
-
- {# CANONICAL URL (deprecated) #}
- {% if theme_canonical_url and not pageurl %}
-
- {% endif %}
-
- {# CANONICAL URL #}
- {%- if pageurl %}
-
- {%- endif %}
-
- {# JAVASCRIPTS #}
- {%- block scripts %}
-
- {%- if not embedded %}
- {# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
- {% if sphinx_version >= "1.8.0" %}
-
- {%- for scriptfile in script_files %}
- {{ js_tag(scriptfile) }}
- {%- endfor %}
- {% else %}
-
- {%- for scriptfile in script_files %}
-
- {%- endfor %}
- {% endif %}
-
-
- {# OPENSEARCH #}
- {%- if use_opensearch %}
-
- {%- endif %}
- {%- endif %}
- {%- endblock %}
-
- {%- block linktags %}
- {%- if hasdoc('about') %}
-
- {%- endif %}
- {%- if hasdoc('genindex') %}
-
- {%- endif %}
- {%- if hasdoc('search') %}
-
- {%- endif %}
- {%- if hasdoc('copyright') %}
-
- {%- endif %}
- {%- if next %}
-
- {%- endif %}
- {%- if prev %}
-
- {%- endif %}
- {%- endblock %}
- {%- block extrahead %} {% endblock %}
-
-
-
-
- {% block extrabody %} {% endblock %}
-
- {# SIDE NAV, TOGGLES ON MOBILE #}
-
-
-
-
- {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
-
-
-
-
- {%- block content %}
- {% if theme_style_external_links|tobool %}
-
- {% else %}
-
- {% endif %}
- {% include "breadcrumbs.html" %}
-
- {%- block document %}
-
- {% block body %}{% endblock %}
-
- {% if self.comments()|trim %}
-
- {% block comments %}{% endblock %}
-
- {% endif%}
-
- {%- endblock %}
- {% include "footer.html" %}
-
- {%- endblock %}
-
-
-
-
-
- {% include "versions.html" %}
-
-
-
- {# Do not conflict with RTD insertion of analytics script #}
- {% if not READTHEDOCS %}
- {% if theme_analytics_id %}
-
-
-
- {% endif %}
- {% endif %}
-
- {%- block footer %} {% endblock %}
-
-
-
-
-
diff --git a/docs/_themes/sphinx_rtd_theme/layout_old.html b/docs/_themes/sphinx_rtd_theme/layout_old.html
deleted file mode 100644
index f0dc2af650..0000000000
--- a/docs/_themes/sphinx_rtd_theme/layout_old.html
+++ /dev/null
@@ -1,206 +0,0 @@
-{#
- basic/layout.html
- ~~~~~~~~~~~~~~~~~
-
- Master layout template for Sphinx themes.
-
- :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
- :license: BSD, see LICENSE for details.
-#}
-{%- block doctype -%}
-
-{%- endblock %}
-{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %}
-{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
-{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
- (sidebars != []) %}
-{%- set url_root = pathto('', 1) %}
-{# XXX necessary? #}
-{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
-{%- if not embedded and docstitle %}
- {%- set titlesuffix = " — "|safe + docstitle|e %}
-{%- else %}
- {%- set titlesuffix = "" %}
-{%- endif %}
-
-{%- macro relbar() %}
-
-{%- endmacro %}
-
-{%- macro sidebar() %}
- {%- if render_sidebar %}
-
- {%- endif %}
-{%- endmacro %}
-
-{%- macro script() %}
-
- {%- for scriptfile in script_files %}
-
- {%- endfor %}
-{%- endmacro %}
-
-{%- macro css() %}
-
-
- {%- for cssfile in css_files %}
-
- {%- endfor %}
-{%- endmacro %}
-
-
-
-
- {{ metatags }}
- {%- block htmltitle %}
- {{ title|striptags|e }}{{ titlesuffix }}
- {%- endblock %}
- {{ css() }}
- {%- if not embedded %}
- {{ script() }}
- {%- if use_opensearch %}
-
- {%- endif %}
- {%- if favicon %}
-
- {%- endif %}
- {%- endif %}
-{%- block linktags %}
- {%- if hasdoc('about') %}
-
- {%- endif %}
- {%- if hasdoc('genindex') %}
-
- {%- endif %}
- {%- if hasdoc('search') %}
-
- {%- endif %}
- {%- if hasdoc('copyright') %}
-
- {%- endif %}
-
- {%- if parents %}
-
- {%- endif %}
- {%- if next %}
-
- {%- endif %}
- {%- if prev %}
-
- {%- endif %}
-{%- endblock %}
-{%- block extrahead %} {% endblock %}
-
-
-{%- block header %}{% endblock %}
-
-{%- block relbar1 %}{{ relbar() }}{% endblock %}
-
-{%- block content %}
- {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
-
-
- {%- block document %}
-
- {%- if render_sidebar %}
-
- {%- endif %}
-
- {% block body %} {% endblock %}
-
- {%- if render_sidebar %}
-
- {%- endif %}
-
- {%- endblock %}
-
- {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
-
-
-{%- endblock %}
-
-{%- block relbar2 %}{{ relbar() }}{% endblock %}
-
-{%- block footer %}
-
- asdf asdf asdf asdf 22
-{%- endblock %}
-
-
-
diff --git a/docs/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 44b82f29cc..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,142 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Tom Kunze , 2019
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Tom Kunze , 2019\n"
-"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: de\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Auf GitHub bearbeiten"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Auf Bitbucket bearbeiten"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Auf GitLab bearbeiten"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Quelltext anzeigen"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Weiter"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Zurück"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Build"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Zuletzt aktualisiert am %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Erstellt mit %(sphinx_web)s mit einem"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "bereitgestellt von %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "%(docstitle)s durchsuchen"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Über diese Dokumentation"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Index"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Suche"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Suchergebnisse"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Es wurden keine mit deiner Suchanfrage übereinstimmenden Dokumente gefunden."
-" Achte darauf, dass alle Wörter richtig geschrieben sind und dass genug "
-"Kategorien ausgewählt sind."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Dokumentation durchsuchen"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versionen"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "Auf Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Projektübersicht"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Builds"
-
-#~ msgid "Docs"
-#~ msgstr "Dokumentation"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Kostenloses Dokumentationen-Hosting zur Verfügung gestellt von"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 766536417a..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,164 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 15:43-0600\n"
-"Last-Translator: FULL NAME \n"
-"Language: en\n"
-"Language-Team: en \n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr ""
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr ""
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr ""
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr ""
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr ""
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr ""
-
-#: sphinx_rtd_theme/footer.html:20
-#, python-format
-msgid "© Copyright %(copyright)s."
-msgstr ""
-
-#: sphinx_rtd_theme/footer.html:22
-#, python-format
-msgid "© Copyright %(copyright)s."
-msgstr ""
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr ""
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr ""
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr ""
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr ""
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr ""
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr ""
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr ""
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr ""
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr ""
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words "
-"are spelled correctly and that you've selected enough categories."
-msgstr ""
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr ""
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr ""
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr ""
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr ""
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr ""
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr ""
-
-#~ msgid "Docs"
-#~ msgstr ""
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr ""
-
-#~ msgid "Documentation Home"
-#~ msgstr ""
-
diff --git a/docs/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
deleted file mode 100644
index f7e07777e5..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,162 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Anthony , 2019
-# Leonardo J. Caballero G. , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Leonardo J. Caballero G. , 2020\n"
-"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: es\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Editar en GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Editar en Bitbucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Editar en GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Ver código fuente de la página"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Siguiente"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Anterior"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Construido"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Revisión"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Actualizado por última vez en %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Construido con %(sphinx_web)s usando un"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "tema"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "proporcionado por %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Buscar en %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Sobre esta documentación"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Índice"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Búsqueda"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Derechos de autor"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logotipo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr ""
-"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Resultados de la búsqueda"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Su búsqueda no coincide con ningún documento. Por favor, asegúrese de que "
-"todas las palabras estén correctamente escritas y que usted haya "
-"seleccionado las suficientes categorías."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Buscar documentos"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versiones"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Descargas"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "En Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Página de Proyecto"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Construcciones"
-
-#~ msgid "Docs"
-#~ msgstr "Documentos"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Alojamiento gratuito de documentos proporcionado por"
-
-#~ msgid "Documentation Home"
-#~ msgstr "Inicio de Documentación"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 33f2ed7d3c..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,153 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Anthony , 2020
-# Ivar Smolin , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Ivar Smolin , 2020\n"
-"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: et\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Muuda GitHubis"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Muuda Bitbucketis"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Muuda GitLabis"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Vaata lehe lähtekoodi"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Järgmine"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Eelmine"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Ehitus"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Redaktsioon"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Viimati uuendatud %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Ehitatud %(sphinx_web)s'iga,"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "kujundusteema"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Otsi dokumendist %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Nende dokumentide kirjeldused"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Indeks"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Otsing"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Autoriõigus"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Otsingu tulemused"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Sinu otsingule ei vastanud ükski dokument. Palun veendu, et kõik sisestatud "
-"sõnad on õigesti kirjutatud ja sa oled valikud piisaval hulgal kategooriaid."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Otsi dokumente"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versioonid"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Allalaadimised"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "Saidil Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Projekti kodu"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Ehitused"
-
-#~ msgid "Docs"
-#~ msgstr "Dokumendid"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Dokumentatsiooni majutab tasuta"
-
-#~ msgid "Documentation Home"
-#~ msgstr "Dokumentatsiooni kodu"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 92634861b5..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,153 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Radina Matic , 2020
-# Anthony , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Anthony , 2020\n"
-"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Éditer sur GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Éditer sur Bitbucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Éditer sur GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Afficher la source de la page"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Suivant"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Précédent"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Compilation"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Révision"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Dernière mise à jour le %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Compilé avec %(sphinx_web)s en utilisant un"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "thème"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "fourni par %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Rechercher dans %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "À propos de cette documentation"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Index"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Rechercher"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Droits d'auteur"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "Activez JavaScript pour accéder à la fonction de recherche."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Résultats de la recherche"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Votre recherche ne correspond à aucun document. Assurez-vous que tous les "
-"mots sont correctement orthographiés et que vous avez sélectionné "
-"suffisamment de catégories."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Rechercher docs"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versions"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Téléchargements"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Accueil du projet"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Compilations"
-
-#~ msgid "Docs"
-#~ msgstr "Docs"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Hébergement gratuit de documents fourni par"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 464d68fe0e..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Jesse Tan, 2019
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Jesse Tan, 2019\n"
-"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: nl\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Bewerk op GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Bewerk op BitBucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Bewerk op GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Bekijk paginabron"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Volgende"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Vorige"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Bouwresultaat"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Revisie"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Laatste update op %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Gebouwd met %(sphinx_web)s met een"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "thema"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "geleverd door %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Zoek binnen %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Over deze documenten"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Index"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Zoek"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Zoekresultaten"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Zoekpoging vond geen documenten. Zorg ervoor dat alle woorden correct zijn "
-"gespeld en dat voldoende categorieën zijn geselecteerd."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Zoek in documentatie"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versies"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Downloads"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "Op Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Project Home"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Bouwresultaten"
-
-#~ msgid "Docs"
-#~ msgstr "Documentatie"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Gratis hosting voor documentatie verzorgd door"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
deleted file mode 100644
index eb1ff5b70d..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,158 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Rafael Fontenelle , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Rafael Fontenelle , 2020\n"
-"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: pt_BR\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Editar no GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Editar no Bitbucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Editar no GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Ver código-fonte da página"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Próximo"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Anterior"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Compilação"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Revisão"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Última atualização em %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Compilado com %(sphinx_web)s usando um"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "tema"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "fornecido por %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Pesquisar em %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Sobre esses documentos"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Índice"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Pesquisar"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Copyright"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr ""
-"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Resultados da pesquisa"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"A sua pesquisa não encontrou nenhum documento correspondente. Verifique se "
-"todas as palavras estão escritas corretamente e se você selecionou "
-"categorias suficientes."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Pesquisar documentos"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versões"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Downloads"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "No Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Página inicial"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Compilações"
-
-#~ msgid "Docs"
-#~ msgstr "Docs"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Hospedagem de documentos livres fornecida por"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 7b6564a73d..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,157 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Dmitry Shachnev , 2019
-# lvv83 , 2019
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: lvv83 , 2019\n"
-"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: ru\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Редактировать на GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Редактировать на BitBucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Редактировать на GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Просмотреть исходный код страницы"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Следующая"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Предыдущая"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Сборка"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Ревизия"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Последний раз обновлено %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Собрано при помощи %(sphinx_web)s с использованием"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "темы,"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "предоставленной %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Поиск в %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Об этих документах"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Алфавитный указатель"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Поиск"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Авторские права"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Логотип"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Результаты поиска"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"По Вашему запросу не найдено результатов. Пожалуйста, проверьте, что все "
-"слова написаны правильно, и Вы выбрали нужные категории."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Поиск в документации"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Версии"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Загрузки"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "На Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Домашняя страница проекта"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Сборки"
-
-#~ msgid "Docs"
-#~ msgstr "Документация"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Бесплатный хостинг документов, предоставленный"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 78d91a85f7..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Daniel Holmberg , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: Daniel Holmberg , 2020\n"
-"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: sv\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "Editera på GitHub"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Editera på Bitbucket"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "Editera på GitLab"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Visa sidkälla"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Nästa"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Tillbaka"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Bygg"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Ändra"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Senast uppdaterad %(last_updated)s."
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "Gjord med %(sphinx_web)s med hjälp av"
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "tema"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "erhållet av %(readthedocs_web)s"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "Sök i %(docstitle)s"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Om dessa dokument"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Index"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Sök"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Upphovsrätt"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr ""
-"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Sökresultat"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Din sökning gav inga träffar. Var vänlig och se till att alla ord är rätt "
-"stavade och att du har valt tillräckligt många kategorier."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Sök i dokumentationen"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Versioner"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "Nerladdningar"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "På Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Projekt Hem"
-
-#~ msgid "Docs"
-#~ msgstr "Dokumentation"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Gratis dokumentations hysning erhållen av"
-
-#~ msgid "Documentation Home"
-#~ msgstr "Dokumentation Hem"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 3705a81449..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,146 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# BouRock, 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: BouRock, 2020\n"
-"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: tr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "GitHub'da Düzenle"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "Bitbucket'ta Düzenle"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "GitLab'ta Düzenle"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "Sayfa kaynağını görüntüle"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "Sonraki"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "Önceki"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "Oluşturma"
-
-#. the phrase "revision" comes from Git, referring to a commit
-#: sphinx_rtd_theme/footer.html:35
-msgid "Revision"
-msgstr "Gözden geçirme"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "tema"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "%(docstitle)s içinde ara"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "Bu belgeler hakkında"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "Dizin"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "Arama"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "Telif hakkı"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr ""
-"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "Arama Sonuçları"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr ""
-"Aramanız hiçbir belgeyle eşleşmedi. Lütfen tüm kelimelerin doğru "
-"yazıldığından ve yeterli kategori seçtiğinizden emin olun."
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "Belgeleri arayın"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "Sürümler"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "İndirmeler"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "Read the Docs Üzerinde"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "Proje Ana Sayfa"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "Oluşturmalar"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "Ücretsiz belge barındırmayı sağlayan"
diff --git a/docs/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po b/docs/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
deleted file mode 100644
index 26dfb3228b..0000000000
--- a/docs/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
+++ /dev/null
@@ -1,150 +0,0 @@
-# English translations for sphinx_rtd_theme.
-# Copyright (C) 2019 ORGANIZATION
-# This file is distributed under the same license as the sphinx_rtd_theme
-# project.
-# FIRST AUTHOR , 2019.
-#
-# Translators:
-# Anthony , 2020
-# 王赛 , 2020
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2021-01-04 13:48-0800\n"
-"PO-Revision-Date: 2019-07-16 21:44+0000\n"
-"Last-Translator: 王赛 , 2020\n"
-"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-"Language: zh_CN\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: sphinx_rtd_theme/breadcrumbs.html:45 sphinx_rtd_theme/breadcrumbs.html:47
-msgid "Edit on GitHub"
-msgstr "在 GitHub 上修改"
-
-#: sphinx_rtd_theme/breadcrumbs.html:52 sphinx_rtd_theme/breadcrumbs.html:54
-msgid "Edit on Bitbucket"
-msgstr "在 Bitbucket 上修改"
-
-#: sphinx_rtd_theme/breadcrumbs.html:59 sphinx_rtd_theme/breadcrumbs.html:61
-msgid "Edit on GitLab"
-msgstr "在 GitLab 上修改"
-
-#: sphinx_rtd_theme/breadcrumbs.html:64 sphinx_rtd_theme/breadcrumbs.html:66
-msgid "View page source"
-msgstr "查看页面源码"
-
-#: sphinx_rtd_theme/breadcrumbs.html:76 sphinx_rtd_theme/footer.html:5
-msgid "Next"
-msgstr "下一页"
-
-#: sphinx_rtd_theme/breadcrumbs.html:79 sphinx_rtd_theme/footer.html:8
-msgid "Previous"
-msgstr "上一页"
-
-#. Build is a noun, not a verb
-#: sphinx_rtd_theme/footer.html:29
-msgid "Build"
-msgstr "构建"
-
-#: sphinx_rtd_theme/footer.html:40
-#, python-format
-msgid "Last updated on %(last_updated)s."
-msgstr "最后更新时间 %(last_updated)s。"
-
-#. the variable "sphinx_web" is a link to the Sphinx project documentation
-#. with
-#. the text "Sphinx"
-#: sphinx_rtd_theme/footer.html:52
-#, python-format
-msgid "Built with %(sphinx_web)s using a"
-msgstr "利用 %(sphinx_web)s 构建,使用了 "
-
-#. "theme" refers to a theme for Sphinx, which alters the appearance of the
-#. generated documenation
-#: sphinx_rtd_theme/footer.html:54
-msgid "theme"
-msgstr "主题"
-
-#. this is always used as "provided by Read the Docs", and should not imply
-#. Read the Docs is an author of the generated documentation.
-#: sphinx_rtd_theme/footer.html:56
-#, python-format
-msgid "provided by %(readthedocs_web)s"
-msgstr "由 %(readthedocs_web)s开发"
-
-#: sphinx_rtd_theme/layout.html:85
-#, python-format
-msgid "Search within %(docstitle)s"
-msgstr "在 %(docstitle)s中搜索"
-
-#: sphinx_rtd_theme/layout.html:93
-msgid "About these documents"
-msgstr "关于此文档"
-
-#: sphinx_rtd_theme/layout.html:96
-msgid "Index"
-msgstr "索引"
-
-#: sphinx_rtd_theme/layout.html:99 sphinx_rtd_theme/search.html:11
-msgid "Search"
-msgstr "搜索"
-
-#: sphinx_rtd_theme/layout.html:102
-msgid "Copyright"
-msgstr "版权所有"
-
-#: sphinx_rtd_theme/layout.html:134
-msgid "Logo"
-msgstr "Logo"
-
-#: sphinx_rtd_theme/search.html:31
-msgid "Please activate JavaScript to enable the search functionality."
-msgstr "请启用 JavaScript 以便使用搜索功能"
-
-#. Search is a noun, not a verb
-#: sphinx_rtd_theme/search.html:39
-msgid "Search Results"
-msgstr "搜索结果"
-
-#: sphinx_rtd_theme/search.html:41
-msgid ""
-"Your search did not match any documents. Please make sure that all words are"
-" spelled correctly and that you've selected enough categories."
-msgstr "您的搜索没有匹配到任何文档。请确保所有单词拼写正确,并选择了足够多的类别。"
-
-#: sphinx_rtd_theme/searchbox.html:4
-msgid "Search docs"
-msgstr "在文档中搜索"
-
-#: sphinx_rtd_theme/versions.html:11
-msgid "Versions"
-msgstr "版本列表"
-
-#: sphinx_rtd_theme/versions.html:17
-msgid "Downloads"
-msgstr "下载链接"
-
-#. The phrase "Read the Docs" is not translated
-#: sphinx_rtd_theme/versions.html:24
-msgid "On Read the Docs"
-msgstr "托管于 Read the Docs"
-
-#: sphinx_rtd_theme/versions.html:26
-msgid "Project Home"
-msgstr "项目首页"
-
-#: sphinx_rtd_theme/versions.html:29
-msgid "Builds"
-msgstr "构建"
-
-#~ msgid "Docs"
-#~ msgstr "文档"
-
-#~ msgid "Free document hosting provided by"
-#~ msgstr "此文档免费托管于"
diff --git a/docs/_themes/sphinx_rtd_theme/search.html b/docs/_themes/sphinx_rtd_theme/search.html
deleted file mode 100644
index e519e30ae4..0000000000
--- a/docs/_themes/sphinx_rtd_theme/search.html
+++ /dev/null
@@ -1,56 +0,0 @@
-{#
- basic/search.html
- ~~~~~~~~~~~~~~~~~
-
- Template for the search page.
-
- :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
- :license: BSD, see https://github.com/sphinx-doc/sphinx/blob/master/LICENSE for details.
-#}
-{%- extends "layout.html" %}
-{% set title = _('Search') %}
-{% set display_vcs_links = False %}
-{%- block scripts %}
- {{ super() }}
-
-
-{%- endblock %}
-{% block footer %}
-
- {# this is used when loading the search index using $.ajax fails,
- such as on Chrome for documents on localhost #}
-
- {{ super() }}
-{% endblock %}
-{% block body %}
-
-
- {% if search_performed %}
- {# Translators: Search is a noun, not a verb #}
- {{ _('Search Results') }}
- {% if not search_results %}
- {{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}
- {% endif %}
- {% endif %}
-
- {% if search_results %}
-
- {% for href, caption, context in search_results %}
- -
- {{ caption }}
-
{{ context|e }}
-
- {% endfor %}
-
- {% endif %}
-
-{% endblock %}
diff --git a/docs/_themes/sphinx_rtd_theme/searchbox.html b/docs/_themes/sphinx_rtd_theme/searchbox.html
deleted file mode 100644
index bc3ee5f0d8..0000000000
--- a/docs/_themes/sphinx_rtd_theme/searchbox.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{%- if 'singlehtml' not in builder %}
-
-
-
-{%- endif %}
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/badge_only.css b/docs/_themes/sphinx_rtd_theme/static/css/badge_only.css
deleted file mode 100644
index e380325bc6..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/css/badge_only.css
+++ /dev/null
@@ -1 +0,0 @@
-.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff
deleted file mode 100644
index 6cb6000018..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2
deleted file mode 100644
index 7059e23142..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff
deleted file mode 100644
index f815f63f99..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2
deleted file mode 100644
index f2c76e5bda..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot b/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca953..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg b/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 4bf3529595..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-
-
-
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf b/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2fa1..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a4b0..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc6040..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff
deleted file mode 100644
index 88ad05b9ff..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2
deleted file mode 100644
index c4e3d804b5..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff
deleted file mode 100644
index c6dff51f06..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2
deleted file mode 100644
index bb195043cf..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff
deleted file mode 100644
index 76114bc033..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2
deleted file mode 100644
index 3404f37e2e..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff
deleted file mode 100644
index ae1307ff5f..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2 b/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2
deleted file mode 100644
index 3bf9843328..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/css/theme.css b/docs/_themes/sphinx_rtd_theme/static/css/theme.css
deleted file mode 100644
index 8cd4f101a9..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/css/theme.css
+++ /dev/null
@@ -1,4 +0,0 @@
-html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*!
- * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li span.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li span.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li span.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li span.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li span.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p.caption .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.btn .wy-menu-vertical li span.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p.caption .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.nav .wy-menu-vertical li span.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p.caption .btn .headerlink,.rst-content p.caption .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li span.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol li,.rst-content ol.arabic li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content ol.arabic li p:last-child,.rst-content ol.arabic li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover span.toctree-expand,.wy-menu-vertical li.on a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp{user-select:none;pointer-events:none}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink{visibility:hidden;font-size:14px}.rst-content .code-block-caption .headerlink:after,.rst-content .toctree-wrapper>p.caption .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after{content:"\f0c1";font-family:FontAwesome}.rst-content .code-block-caption:hover .headerlink:after,.rst-content .toctree-wrapper>p.caption:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl dt span.classifier:before{content:" : "}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code,html.writer-html4 .rst-content dl:not(.docutils) tt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block}
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Bold.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Bold.ttf
deleted file mode 100644
index 809c1f5828..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Bold.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Regular.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Regular.ttf
deleted file mode 100644
index fc981ce7ad..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata-Regular.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata.ttf
deleted file mode 100644
index 4b8a36d249..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Inconsolata.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Bold.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Bold.ttf
deleted file mode 100644
index 1d23c7066e..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Bold.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Regular.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Regular.ttf
deleted file mode 100644
index 0f3d0f837d..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato-Regular.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot
deleted file mode 100644
index 3361183a41..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf
deleted file mode 100644
index 29f691d5ed..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff
deleted file mode 100644
index c6dff51f06..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2
deleted file mode 100644
index bb195043cf..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bold.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot
deleted file mode 100644
index 3d4154936b..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf
deleted file mode 100644
index f402040b3e..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff
deleted file mode 100644
index 88ad05b9ff..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2
deleted file mode 100644
index c4e3d804b5..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-bolditalic.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot
deleted file mode 100644
index 3f826421a1..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf
deleted file mode 100644
index b4bfc9b24a..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff
deleted file mode 100644
index 76114bc033..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2
deleted file mode 100644
index 3404f37e2e..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-italic.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot
deleted file mode 100644
index 11e3f2a5f0..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf
deleted file mode 100644
index 74decd9ebb..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff
deleted file mode 100644
index ae1307ff5f..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2
deleted file mode 100644
index 3bf9843328..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/Lato/lato-regular.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Bold.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Bold.ttf
deleted file mode 100644
index df5d1df273..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Bold.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Regular.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Regular.ttf
deleted file mode 100644
index eb52a79073..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab-Regular.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
deleted file mode 100644
index 79dc8efed3..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
deleted file mode 100644
index df5d1df273..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
deleted file mode 100644
index 6cb6000018..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
deleted file mode 100644
index 7059e23142..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
deleted file mode 100644
index 2f7ca78a1e..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
deleted file mode 100644
index eb52a79073..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
deleted file mode 100644
index f815f63f99..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
deleted file mode 100644
index f2c76e5bda..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot b/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot
deleted file mode 100644
index e9f60ca953..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg b/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 4bf3529595..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-
-
-
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf b/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 35acda2fa1..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff b/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 400014a4b0..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2 b/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 4d13fc6040..0000000000
Binary files a/docs/_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/docs/_themes/sphinx_rtd_theme/static/js/badge_only.js b/docs/_themes/sphinx_rtd_theme/static/js/badge_only.js
deleted file mode 100644
index 526d7234b6..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/js/badge_only.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js b/docs/_themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js
deleted file mode 100644
index 2b43bd062e..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/js/html5shiv-printshiv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document);
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/static/js/html5shiv.min.js b/docs/_themes/sphinx_rtd_theme/static/js/html5shiv.min.js
deleted file mode 100644
index cd1c674f5e..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/js/html5shiv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
-* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
\ No newline at end of file
diff --git a/docs/_themes/sphinx_rtd_theme/static/js/modernizr.min.js b/docs/_themes/sphinx_rtd_theme/static/js/modernizr.min.js
deleted file mode 100644
index 323279940c..0000000000
--- a/docs/_themes/sphinx_rtd_theme/static/js/modernizr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.length="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f "),n("table.docutils.footnote").wrap(""),n("table.docutils.citation").wrap(""),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t
-
- Read the Docs
- v: {{ current_version }}
-
-
-
-
- - {{ _('Versions') }}
- {% for slug, url in versions %}
- - {{ slug }}
- {% endfor %}
-
-
- - {{ _('Downloads') }}
- {% for type, url in downloads %}
- - {{ type }}
- {% endfor %}
-
-
- {# Translators: The phrase "Read the Docs" is not translated #}
- - {{ _('On Read the Docs') }}
- -
- {{ _('Project Home') }}
-
- -
- {{ _('Builds') }}
-
-
-
-
-{% endif %}
diff --git a/docs/api.rst b/docs/api.rst
deleted file mode 100644
index 566ecc8f22..0000000000
--- a/docs/api.rst
+++ /dev/null
@@ -1,367 +0,0 @@
-*************
-API Reference
-*************
-
-.. currentmodule:: tidy3d
-
-
-Simulation
-==========
-
-.. autosummary::
- :toctree: _autosummary/
-
- Simulation
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- Simulation.plot
- Simulation.plot_eps
- Simulation.plot_structures
- Simulation.plot_structures_eps
- Simulation.plot_sources
- Simulation.plot_monitors
- Simulation.plot_symmetries
- Simulation.plot_pml
- Simulation.plot_grid
- Simulation.grid
- Simulation.dt
- Simulation.tmesh
- Simulation.wvl_mat_min
- Simulation.frequency_range
- Simulation.pml_thicknesses
- Simulation.num_pml_layers
- Simulation.discretize
- Simulation.epsilon
-
-
-Grid
-====
-
-.. autosummary::
- :toctree: _autosummary/
-
- Coords
- FieldGrid
- YeeGrid
- Coords1D
- Grid
- Grid.centers
- Grid.sizes
- Grid.yee
-
-
-Absorbing Boundaries
-====================
-
-.. autosummary::
- :toctree: _autosummary/
-
- PML
- StablePML
- Absorber
-
-Absorber Parameters
--------------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- AbsorberParams
- PMLParams
-
-
-Geometry
-========
-
-.. autosummary::
- :toctree: _autosummary/
-
- Box
- Sphere
- Cylinder
- PolySlab
- PolySlab.from_gdspy
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- Geometry.plot
- Geometry.inside
- Geometry.intersections
- Geometry.intersects
- Geometry.intersects_plane
- Geometry.bounds
- Geometry.bounding_box
- Geometry.pop_axis
- Geometry.unpop_axis
-
-
-Mediums
-=======
-
-.. autosummary::
- :toctree: _autosummary/
-
- Medium
- AnisotropicMedium
- PEC
- PoleResidue
- Sellmeier
- Debye
- Lorentz
- Drude
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- AbstractMedium.eps_model
-
-
-Structures
-==========
-
-.. autosummary::
- :toctree: _autosummary/
-
- Structure
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- Structure.plot
-
-
-Modes
-=====
-
-.. autosummary::
- :toctree: _autosummary/
-
- Mode
-
-
-Sources
-=======
-
-.. autosummary::
- :toctree: _autosummary/
-
- VolumeSource
- PlaneWave
- ModeSource
- GaussianPulse
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- Source.geometry
- Source.plot
- Source.inside
- Source.intersections
- Source.intersects
- Source.intersects_plane
- Source.bounds
- Source.bounding_box
- Source.pop_axis
- Source.unpop_axis
-
-Source Time Dependence
-----------------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- GaussianPulse
- ContinuousWave
- SourceTime.amp_time
- SourceTime.plot
- SourceTime.frequency_range
-
-
-Monitors
-========
-
-.. autosummary::
- :toctree: _autosummary/
-
- FieldMonitor
- FieldTimeMonitor
- FluxMonitor
- FluxTimeMonitor
- ModeMonitor
-
-Methods
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- Monitor.geometry
- Monitor.plot
- Monitor.inside
- Monitor.intersections
- Monitor.intersects
- Monitor.intersects_plane
- Monitor.bounds
- Monitor.bounding_box
- Monitor.pop_axis
- Monitor.unpop_axis
-
-
-
-Output Data
-===========
-
-.. autosummary::
- :toctree: _autosummary/
-
- SimulationData
- FieldData
- FluxData
- FluxTimeData
- ModeData
-
-
-Tidy3dBaseModel
-===============
-
-.. autosummary::
- :toctree: _autosummary/
-
- components.base.Tidy3dBaseModel
- components.base.Tidy3dBaseModel.export
- components.base.Tidy3dBaseModel.load
- components.base.Tidy3dBaseModel.help
-
-.. Constants
-.. =========
-.. .. autosummary::
-.. :toctree: _autosummary/
-.. constants
-
-Log
-===
-
-.. autosummary::
- :toctree: _autosummary/
-
- log
- set_logging_level
- set_logging_file
-
-
-Submitting Simulations
-======================
-
-Web API
--------
-
-.. autosummary::
- :toctree: _autosummary/
-
- web.run
- web.upload
- web.get_info
- web.start
- web.monitor
- web.download
- web.load_data
- web.delete
-
-Job Interface
--------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- web.Job
- web.Job.run
- web.Job.upload
- web.Job.get_info
- web.Job.start
- web.Job.monitor
- web.Job.download
- web.Job.load_data
- web.Job.delete
-
-Batch Processing
-----------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- web.Batch
- web.Batch.run
- web.Batch.upload
- web.Batch.get_info
- web.Batch.start
- web.Batch.monitor
- web.Batch.download
- web.Batch.load_data
- web.Batch.delete
-
-Info Containers
----------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- web.task.Task
- web.task.TaskInfo
- web.task.TaskStatus
-
-
-Plugins
-=======
-
-Dispersive Model Fitting Tool
------------------------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- plugins.DispersionFitter
- plugins.DispersionFitter.load
- plugins.DispersionFitter.fit
- plugins.DispersionFitter.plot
-
-Mode Solver
------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- plugins.ModeSolver
- plugins.ModeSolver.solve
- plugins.mode.mode_solver.ModeInfo
-
-Near Field to Far Field Transformation
---------------------------------------
-
-.. autosummary::
- :toctree: _autosummary/
-
- plugins.Near2Far
- plugins.Near2Far.fields_cartesian
- plugins.Near2Far.fields_spherical
- plugins.Near2Far.power_cartesian
- plugins.Near2Far.power_spherical
- plugins.Near2Far.radar_cross_section
-
diff --git a/docs/build_docs.sh b/docs/build_docs.sh
deleted file mode 100755
index 7520882f57..0000000000
--- a/docs/build_docs.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-rm -rf _autosummary
-sphinx-build -b html . _build
-
-# jupyter nbconvert --output-dir='.' --to script ../notebooks/StartHere.ipynb --no-prompt
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index fb966d21c0..0000000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# -- Path setup --------------------------------------------------------------
-
-import os
-import re
-import codecs
-import sys
-
-here = os.path.abspath(os.path.dirname(__file__))
-sys.path.append(os.path.abspath("../"))
-sys.path.append(os.path.abspath("../tidy3d/components"))
-print(sys.path)
-
-
-def read(*parts):
- with codecs.open(os.path.join(here, *parts), "r") as fp:
- return fp.read()
-
-
-def find_version(*file_paths):
- version_file = read(*file_paths)
- version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M)
- if version_match:
- return version_match.group(1)
- raise RuntimeError("Unable to find version string.")
-
-
-# -- Project information -----------------------------------------------------
-
-project = "Tidy3d"
-copyright = "Flexcompute 2020"
-# release = find_version('..', 'legume', '__init__.py')
-
-master_doc = "index"
-
-# -- 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 = [
- "sphinx.ext.autodoc",
- "sphinxcontrib.autodoc_pydantic",
- "sphinx.ext.autosummary",
- "sphinx.ext.extlinks",
- "sphinx.ext.mathjax",
- "sphinx.ext.napoleon",
- "IPython.sphinxext.ipython_directive",
- "IPython.sphinxext.ipython_console_highlighting",
- "sphinx_copybutton",
- "nbsphinx",
- "m2r2",
-]
-
-source_suffix = [".rst", ".md"]
-
-autodoc_inherit_docstrings = True
-autosummary_generate = True
-autodoc_pydantic_model_show_json = False
-autodoc_pydantic_settings_show_json = False
-autodoc_pydantic_model_show_config_member = False
-autodoc_pydantic_model_show_config_summary = False
-autodoc_pydantic_model_show_validator_summary = False
-autodoc_pydantic_model_show_validator_members = False
-autodoc_pydantic_model_show_field_summary = False
-autodoc_pydantic_model_members = False
-
-extlinks = {}
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ["_templates"]
-
-# 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", "**.ipynb_checkpoints"]
-
-autosummary_generate = True
-autodoc_typehints = "none"
-
-napoleon_google_docstring = False
-napoleon_numpy_docstring = True
-napoleon_include_init_with_doc = False
-napoleon_include_private_with_doc = False
-napoleon_include_special_with_doc = True
-napoleon_use_admonition_for_examples = False
-napoleon_use_admonition_for_notes = False
-napoleon_use_admonition_for_references = False
-napoleon_use_ivar = False
-napoleon_use_param = True
-napoleon_use_rtype = True
-
-# python prompts for copy / paste. Ignore `>>>` and `...` stuff so pasted runs in interpreter.
-copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: "
-copybutton_prompt_is_regexp = True
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.
-html_theme_path = ["_themes"]
-html_theme = "sphinx_rtd_theme"
-# pygments_style = 'monokai-dark'
-
-# import stanford_theme
-# html_theme = "stanford_theme"
-# html_theme_path = [stanford_theme.get_html_theme_path()]
-
-# 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"]
-
-html_theme_options = {"logo_only": True}
-# html_logo = "_static/logo.svg"
-html_favicon = "_static/logo.svg"
-
-
-def setup(app):
- app.add_css_file("css/custom.css")
diff --git a/docs/draw_package.py b/docs/draw_package.py
deleted file mode 100644
index 1d6c1f0a40..0000000000
--- a/docs/draw_package.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import sys
-
-sys.path.append("../")
-
-# note, run from docs/
-
-import tidy3d as td
-from tidy3d.components import Geometry, Source, Monitor
-import erdantic as erd
-
-
-def save_diagram(obj):
- name = obj.__name__
- fname = f"img/diagram_{name}.png"
- model = erd.create(obj)
- model.draw(fname)
-
-
-def main():
- objects = [Geometry, td.Simulation, td.Structure, Source, Monitor]
- for obj in objects:
- save_diagram(obj)
-
-
-if __name__ == "__main__":
- main()
diff --git a/docs/howdoi.rst b/docs/howdoi.rst
deleted file mode 100644
index 1fc60120bb..0000000000
--- a/docs/howdoi.rst
+++ /dev/null
@@ -1,125 +0,0 @@
-.. currentmodule:: tidy3d
-
-.. _howdoi:
-
-How do I ...
-============
-
-
-Work with Tidy3d Components
----------------------------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
- * - How do I...
- - Solution
- * - Get help related to any Tidy3d component?
- - ``obj.help()`` will print a useful message. ``obj.help(methods=True)`` will list out more information about the object's methods.
- * - Save and load any Tidy3d object?
- - If the object ``obj`` is an instance of ``ObjClass``, you can export and load to & from json through ``obj.export(path='path/to/file.json')`` and ``obj = ObjClass.load(path='path/to/file.hdf5')``.
-
-
-Work with Simulation Data
--------------------------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
- * - How do I...
- - Solution
- * - Get the data for a specific :class:`Monitor`?
- - ``sim_data[monitor_name]`` or ``sim_data.monitor_data[monitor_name].data`` returns the xarray data object and ``sim_data.monitor_data[monitor_name]`` returns the :class:`MonitorData` container.
- * - Save and load the :class:`SimulationData` object?
- - ``sim_data.export(path='path/to/file.hdf5')`` to save and ``sim_data = SimulationData.load(path='path/to/file.hdf5')`` to load.
- * - Access the original :class:`Simulation` that created the data?
- - ``sim_data.simulation`` returns a copy of the original :class:`Simulation`.
-
-Work with Monitor Data
-----------------------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
- * - How do I...
- - Solution
- * - Get my monitor's data from a :class:`SimulationData` object?
- - ``mon_data = sim_data[monitor_name]`` where ``monitor_name`` was the key of your :class:`Monitor` in the original :attr:`Simulation.monitors` dictionary.
- * - Get the data at a certain coordinate value (ie. ``x=0.0``, ``f=200e12``?
- - For data with coordinate ``name`` equal to ``value``, use ``mon_data.sel(name: value)``, eg. ``mon_data.sel(z=0, f=200e12)``. If the data is not stored at that exact value, an error will be raised, use ``mon_data.interp`` instead.
- * - Get the data at certin index into a coordinate (ie ``t=0`` for "first time step".)
- - For data at index ``index`` into coordinate ``name``, use ``mon_data.isel(name: index)``, eg. ``mon_data.isel(t=0)``. Note, like ``.sel`` you can pass multiple ``name: index`` pairs.
- * - Interpolate the data at various coordinate values, eg. field data at ``x=y=z=0``?
- - ``mon_data.interp(x=0, y=0, z=0)`` performs linear interpolation of the data, where the values must be within the range recorded by the original monitor specification.
- * - Access a specific ``field`` component from a :class:`FieldMonitor` or :class:`FieldTimeMonitor`?
- - If eg. ``'Ey'`` is in the :attr:`Monitor.fields` list, you can grab it through ``field_mon.Ey`` or ``field_mon['Ey']``.
- * - Get the real part, imagninary part, or absolute value of complex-valued data.
- - ``mon_data.real``, ``mon_data.imag``, ``np.abs(mon_data)``, respectively.
- * - Get the original :class:`Monitor` that created this :class:`MonitorData`?
- - ``mon_data.monitor`` returns a copy of the :class:`Monitor` and ``mon_data.monitor_name`` gives its name in the :attr:`Simulation.monitors` dictionary.
- * - Access the xarray representation of the data from a raw :class:`MonitorData` instance?
- - if ``isinstance(mon_data, MonitorData)``, then ``mon_data.data`` provides the interface for all of the functionality described above. (Eg. ``mon_data.data.isel(x=0)``).
- * - Get the raw data values as a ``numpy`` array?
- - ``mon_data.values``
-
-
-Plot Tidy3D Components
-----------------------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
- * - How do I...
- - Solution
- * - Plot an object with some spatial definition? (:class:`Simulation`, :class:`Structure`, etc.)
- - ``obj.plot(x=0)`` will plot the object on the ``x=0`` plane with ``y`` and ``z`` also accepted to specify other planar axes. If ``ax`` argument is supplied, will plot to an existing axis, ie. ``obj.plot(y=0, ax=ax)``.
- * - Change the plot characteristics (facecolor, edgecolor, etc).
- - Plotting keyword arguments can be supplied to ``plot()``, for example ``obj.plot(x=0, edgecolor='blue', fill=False)``. These keyword arguments correspond to those fed to `Matplotlib Patches `__.
-
-
-Plot Data
----------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
-
- * - How do I...
- - Solution
- * - Plot the :class:`MonitorData` as a function of one of its coordinates.
- - ``mon_data.plot()`` if the data is already 1D. To select x axis explicitly or plot all the data on same plot, ``mon_data.plot.line(x='f', ax=ax)``. Note, for all plotting, if ``ax`` not supplied, will be created.
- * - Plot the :class:`MonitorData` as a function of two of its coordinates?
- - ``mon_data.plot()`` if data is 2D, otherwise one can use ``mon_data.plot.pcolormesh(x='x', y='y')`` to specify the ``x`` and ``y`` coordinates explicitly.
- * - Plot the simulation structure on top of my field plot?
- - ``sim_data.simulation.plot_structures_eps(z=0.0, ax=ax, alpha=.5, cbar=False, lw=0)`` will plot the ``z=0`` cross-section, where ``ax`` is the axis where your fields are plotted on.
-
-Submit Jobs to Server
----------------------
-
-.. list-table::
- :header-rows: 1
- :widths: 40 60
-
- * - How do I...
- - Solution
- * - Submit my simulations to run on Flexcompute's servers?
- - The simplest way is to create a :class:`Job` object from your :class:`Simulation` object and call the ``.run()`` method, which does all steps. For example: ``job = Job(simulation=simulation, task_name='my_sim'); job.run()``.
- * - Upload a job to the web without running it so I can inspect it first?
- - Once you've created a :class:`Job`, you can upload it to our servers with ``job.upload()`` and it will not run until you excplicitly tell it to with ``job.start()``.
- * - Monitor the progress of a simulation?
- - ``web.monitor(task_id)``, ``Job.monitor()``, or ``Batch.monitor()`` will display the progress of your simulation(s).
- * - Load the results of a simulation?
- - ``sim_data = job.load_results(path)`` will download the results to ``path`` and load them as :class:`SimulationData` object.
- * - See information about my :class:`Job`, such as how many credits it will take?
- - After uploading your job with ``job.upload()`` you can get a host of information about it through ``task_info = job.get_info()``.
- * - Submit multiple simulations?
- - The :class:`Batch` interface was created to manage multiple :class:`Job` instances and gives a similar interface with large number of jobs in mind.
- * - Loop through :class:`Batch` data without loading all of the data into memory?
- - ``for task_name, sim_data in batch.items():`` will ``yield`` the :class:`SimulationData` for each :class:`Job` in the batch one by one, so you can perform your postprocessing in the loop body without loading each of the simulations' data into memory at once.
- * - Save or load a :class:`Job` or :class:`Batch` so I can work with it later?
- - Like most other tidy3d objects, :class:`Job` and :class:`Batch` instances have ``.export(path)`` and ``.load()`` methods that will export and load thier metadata as .json files. This is especially useful for loading batches for analysis long after they have run.
diff --git a/docs/img/diagram_Geometry.png b/docs/img/diagram_Geometry.png
deleted file mode 100644
index 0358c005f2..0000000000
Binary files a/docs/img/diagram_Geometry.png and /dev/null differ
diff --git a/docs/img/diagram_Monitor.png b/docs/img/diagram_Monitor.png
deleted file mode 100644
index d793b3e94b..0000000000
Binary files a/docs/img/diagram_Monitor.png and /dev/null differ
diff --git a/docs/img/diagram_Simulation.png b/docs/img/diagram_Simulation.png
deleted file mode 100644
index 216ed335e6..0000000000
Binary files a/docs/img/diagram_Simulation.png and /dev/null differ
diff --git a/docs/img/diagram_Source.png b/docs/img/diagram_Source.png
deleted file mode 100644
index f2afbb34ff..0000000000
Binary files a/docs/img/diagram_Source.png and /dev/null differ
diff --git a/docs/img/diagram_Structure.png b/docs/img/diagram_Structure.png
deleted file mode 100644
index 6c2e940c47..0000000000
Binary files a/docs/img/diagram_Structure.png and /dev/null differ
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 04a83e0785..0000000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-Tidy3D Documentation
-====================
-
-Tidy3D is a finite-difference time-domain solver providing speed and scale for extremely large problems.
-The Python API can be used to build simulation models, submit jobs, and analyze results of complete runs.
-
-.. toctree::
- :maxdepth: 1
- :caption: User Guide
-
- quickstart
- howdoi
- api
\ No newline at end of file
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 922152e96a..0000000000
--- 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.http://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/quickstart.rst b/docs/quickstart.rst
deleted file mode 100644
index 0d851fbdb7..0000000000
--- a/docs/quickstart.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-**********
-Start Here
-**********
-
-Example Script
-==============
-
-.. literalinclude:: StartHere.py
- :language: python
diff --git a/explore/Dataclasses.ipynb b/explore/Dataclasses.ipynb
deleted file mode 100644
index 9a76363002..0000000000
--- a/explore/Dataclasses.ipynb
+++ /dev/null
@@ -1,190 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 92,
- "id": "49b749eb-5b6b-46c8-a457-8fa4614e5eeb",
- "metadata": {},
- "outputs": [],
- "source": [
- "from typing import Tuple\n",
- "from dataclasses_json import dataclass_json\n",
- "import json\n",
- "\n",
- "import dataclasses\n",
- "from pydantic import BaseModel\n",
- "from pydantic import dataclasses as pddataclasses"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 93,
- "id": "37789e91-a2bf-4a53-a55d-e98601a5a0bc",
- "metadata": {},
- "outputs": [],
- "source": [
- "class PydanticSphere(BaseModel):\n",
- " center: Tuple[float, float, float]\n",
- " radius: float\n",
- "\n",
- "@pddataclasses.dataclass\n",
- "class PydanticDCSphere:\n",
- " center: Tuple[float, float, float]\n",
- " radius: float\n",
- "\n",
- "@dataclasses.dataclass\n",
- "class DataclassSphere:\n",
- " center: Tuple[float, float, float]\n",
- " radius: float\n",
- "\n",
- "models = (PydanticSphere, DataclassSphere, PydanticDCSphere)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 94,
- "id": "5a9924ce-9814-49dc-8185-4c87f0c1059c",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "positional arguments\n",
- "---\n",
- "\terrored for PydanticSphere\n",
- "\terror = __init__() takes exactly 1 positional argument (3 given)\n",
- "---\n",
- "DataclassSphere(center=(1, 1, 1), radius=1.0)\n",
- "\tworked for DataclassSphere\n",
- "---\n",
- "PydanticDCSphere(center=(1.0, 1.0, 1.0), radius=1.0)\n",
- "\tworked for PydanticDCSphere\n"
- ]
- }
- ],
- "source": [
- "# winner: dataclasses, pydantic.dataclasses\n",
- "print('positional arguments')\n",
- "for m in models:\n",
- " print('---')\n",
- " try:\n",
- " sphere = m((1,1,1), 1.0)\n",
- " print(sphere)\n",
- " print(f'\\tworked for {m.__name__}')\n",
- " except Exception as e:\n",
- " print(f'\\terrored for {m.__name__}')\n",
- " print(f'\\terror = {e}')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 95,
- "id": "504148d8-acb7-4a57-87c3-6eda9ff95e48",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "type conversion\n",
- "---\n",
- "center=(1.0, 1.0, 1.0) radius=1.0\n",
- "\tworked for PydanticSphere\n",
- "---\n",
- "DataclassSphere(center=(1, 1, 1), radius=1)\n",
- "\terrored for DataclassSphere\n",
- "\terror = radius not converted to float\n",
- "---\n",
- "PydanticDCSphere(center=(1.0, 1.0, 1.0), radius=1.0)\n",
- "\tworked for PydanticDCSphere\n"
- ]
- }
- ],
- "source": [
- "# winner: pydantic, pydantic.dataclasses\n",
- "print('type conversion')\n",
- "for m in models:\n",
- " print('---')\n",
- " try:\n",
- " sphere = m(center=(1,1,1), radius=1)\n",
- " print(sphere)\n",
- " assert isinstance(sphere.radius, float), \"radius not converted to float\"\n",
- " print(f'\\tworked for {m.__name__}')\n",
- " except Exception as e:\n",
- " print(f'\\terrored for {m.__name__}')\n",
- " print(f'\\terror = {e}')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 96,
- "id": "2e7bce6b-2917-4055-8f7f-1e53dbb2fd0e",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "catches wrong types conversion\n",
- "---\n",
- "\terrored for PydanticSphere\n",
- "\terror = 1 validation error for PydanticSphere\n",
- "center -> 0\n",
- " value is not a valid float (type=type_error.float)\n",
- "---\n",
- "DataclassSphere(center=('s', 1, 1), radius=1.0)\n",
- "\tworked for DataclassSphere\n",
- "---\n",
- "\terrored for PydanticDCSphere\n",
- "\terror = 1 validation error for PydanticDCSphere\n",
- "center -> 0\n",
- " value is not a valid float (type=type_error.float)\n"
- ]
- }
- ],
- "source": [
- "# winner: pydantic, pydantic.dataclasses\n",
- "print('catches wrong types conversion')\n",
- "for m in models:\n",
- " print('---')\n",
- " try:\n",
- " sphere = m(center=('s',1,1), radius=1.0)\n",
- " print(sphere)\n",
- " print(f'\\tworked for {m.__name__}')\n",
- " except Exception as e:\n",
- " print(f'\\terrored for {m.__name__}')\n",
- " print(f'\\terror = {e}')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "19bf7f9c-f3da-4728-9c3e-af2016ecc06f",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "env",
- "language": "python",
- "name": "env"
- },
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Inf.ipynb b/explore/Inf.ipynb
deleted file mode 100644
index 0e9e20a660..0000000000
--- a/explore/Inf.ipynb
+++ /dev/null
@@ -1,206 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "b5b474ee-7312-46a7-ad1d-fb7e43c0ec2c",
- "metadata": {},
- "outputs": [],
- "source": [
- "import sys\n",
- "sys.path.append('..')\n",
- "\n",
- "from tidy3d.components.base import Tidy3dBaseModel\n",
- "from typing import Literal"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "id": "ec27769e-03ee-40b2-b0b9-078243b5e8d3",
- "metadata": {},
- "outputs": [],
- "source": [
- "class Inf(Tidy3dBaseModel):\n",
- " type: Literal['Inf'] = 'Inf'\n",
- " value: float = 1 # fictional \"value\" in the inf world, units of np.inf\n",
- "\n",
- " def __neg__(self):\n",
- " return Inf(value=-self.value)\n",
- " \n",
- " def __add__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " new_value = self.value + other.value\n",
- " # special case, if it's exactly, 0 just return zero\n",
- " if new_value == 0.0:\n",
- " return 0.0\n",
- " return Inf(value=new_value)\n",
- " return Inf(value=self.value + other)\n",
- "\n",
- " def __sub__(self, other):\n",
- " return self + -other\n",
- "\n",
- " def __mul__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " new_value = self.value * other.value\n",
- " # special case, if it's exactly, 0 just return zero\n",
- " if new_value == 0.0:\n",
- " return 0.0 \n",
- " return Inf(value=new_value)\n",
- " return Inf(value=self.value * other)\n",
- "\n",
- " def __div__(self, other):\n",
- " return self.__mul__(1.0 / other)\n",
- "\n",
- " def __truediv__(self, other):\n",
- " return self.__mul__(1.0 / other)\n",
- "\n",
- " def __eq__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " return self.value == other.value\n",
- " return False\n",
- "\n",
- " def __lt__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " return self.value < other.value\n",
- " return True if self.value < 0 else False\n",
- "\n",
- " def __gt__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " return self.value > other.value\n",
- " return True if self.value > 0 else False\n",
- "\n",
- " def __le__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " return self.value < other.value\n",
- " return True if self.value < 0 else False\n",
- "\n",
- " def __ge__(self, other):\n",
- " if isinstance(other, Inf):\n",
- " return self.value >= other.value\n",
- " return True if self.value >= 0 else False"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "id": "91058320-429c-49b2-9908-bce983a113a7",
- "metadata": {},
- "outputs": [],
- "source": [
- "inf = Inf()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 61,
- "id": "6957c5d9-617f-462f-a7f7-6eb43d01547c",
- "metadata": {},
- "outputs": [],
- "source": [
- "# properties to support\n",
- "\n",
- "# can be negative\n",
- "assert -inf < inf\n",
- "\n",
- "# is larger (smaller) than any number\n",
- "assert inf > 1e122\n",
- "assert -inf < -1e122\n",
- "\n",
- "# can be compared to versions of itself modified with basic algebra\n",
- "assert inf < inf*2\n",
- "assert inf < inf + 1.0\n",
- "assert inf > inf/2\n",
- "assert inf > inf - 1.0\n",
- "assert -inf > -inf*2\n",
- "assert -inf < -inf + 1.0\n",
- "assert -inf < -inf/2\n",
- "assert -inf > -inf - 1.0\n",
- "\n",
- "# algebra between two infs leads to values that are expected intuitively\n",
- "assert inf/2 - inf/2 == 0.0\n",
- "assert -inf/3 + inf/3 == 0.0\n",
- "assert inf/2 + inf/3 < inf\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "id": "8f0b6360-314d-4d8a-9b49-eefefd03ce62",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "type='Inf' value=1.5\n"
- ]
- }
- ],
- "source": [
- "print(inf+inf/2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "id": "a64c4a0f-f003-4942-bb6e-2a882ce51008",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "0.5\n",
- "
\n"
- ],
- "text/plain": [
- "\u001b[1;36m0.5\u001b[0m\n"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "center.value"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e99b2fe0-8b83-409f-a046-1d11d4daf9e8",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "2e5eebe5-55fc-4079-8921-6b580782de60",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Inside.ipynb b/explore/Inside.ipynb
deleted file mode 100644
index c21f08e175..0000000000
--- a/explore/Inside.ipynb
+++ /dev/null
@@ -1,249 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 23,
- "id": "039409fc-0111-4b8d-bd83-d451455b2be9",
- "metadata": {},
- "outputs": [],
- "source": [
- "from typing import Union, Tuple, Any, List\n",
- "from abc import ABC, abstractmethod\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pylab as plt\n",
- "\n",
- "from dataclasses import dataclass\n",
- "from shapely.geometry import Point, LineString, Polygon, box, asMultiPoint\n",
- "from descartes import PolygonPatch \n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "id": "a882cba7-442d-44be-aa21-9aeb6a492ab1",
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "@dataclass\n",
- "class Geometry(ABC):\n",
- " \n",
- " center: Tuple[float, float, float]\n",
- " \n",
- " def __post_init__(self):\n",
- " self.contains_vectorized = np.vectorize(self.contains_pointwise, signature=\"(n),(n)->()\")\n",
- " self.geometry_vectorized = np.vectorize(self.geometry_z, signature=\"()->()\")\n",
- "\n",
- " @abstractmethod\n",
- " def geometry(self, x=None, y=None, z=None) -> list:\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- "\n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\" is point (x,y,z) inside volume of Geometry? (note: here is slow (point by point) way, implement vectorized on subclasses. \"\"\"\n",
- " insides = []\n",
- " for (_x, _y, _z) in zip(x, y, z):\n",
- " geo = self.geometry_z(_z)\n",
- " loc = Point(_x, _y)\n",
- " insides.append(geo.contains(loc))\n",
- " return np.array(insides)\n",
- "\n",
- " def contains_pointwise(self, xy_point, z_point):\n",
- " point = Point(xy_point)\n",
- " geo = self.geometry_vectorized(z_point)\n",
- " return geo.contains(point)\n",
- "\n",
- " def inside_vectorized(self, x, y, z) -> bool:\n",
- " xy_points = np.stack((x, y), axis=0)\n",
- " z_points = z[None, :]\n",
- " return self.contains_vectorized(xy_points, z_points)\n",
- " \n",
- " @staticmethod\n",
- " def pop_axis(coord: Tuple[Any, Any, Any], axis: int) -> Tuple[Any, Tuple[Any, Any]]:\n",
- " \"\"\"separate coordinate at `axis` index from coordinates on the plane tangent to `axis`\"\"\"\n",
- " plane_vals = list(coord)\n",
- " axis_val = plane_vals.pop(axis)\n",
- " return axis_val, plane_vals\n",
- "\n",
- " def plot(self, x=None, y=None, z=None, ax=None, **patch_kwargs):\n",
- " \"\"\" plot structure \"\"\"\n",
- " if ax is None:\n",
- " _, ax = plt.subplots()\n",
- " geo = self.geometry(x=x, y=y, z=z)\n",
- " for shape in geo:\n",
- " patch = PolygonPatch(shape, **patch_kwargs)\n",
- " ax.add_artist(patch)\n",
- " return ax\n",
- "\n",
- " @staticmethod\n",
- " def _parse_xyz_kwargs(**xyz) -> Tuple[int, float]:\n",
- " \"\"\" turns kwargs for plane specification like {x=None, y=None, z=None} into axis (0,1,2) and position along axis \"\"\"\n",
- " xyz_filtered = {k : v for k, v in xyz.items() if v is not None}\n",
- " assert len(xyz_filtered) == 1, f\"exatly one kwarg in [x,y,z] must be specified, given {xyz_filtered}.\"\n",
- " axis_label, position = list(xyz_filtered.items())[0]\n",
- " axis = 'xyz'.index(axis_label)\n",
- " return axis, position\n",
- " \n",
- "@dataclass\n",
- "class Sphere(Geometry):\n",
- " \n",
- " radius: float\n",
- " \n",
- " def _intersect_dist(self, position, z0):\n",
- " \"\"\" distance between points on circle at z=position where center of circle at z=z0 \"\"\"\n",
- " dz = np.abs(z0 - position)\n",
- " return (dz <= self.radius) * 2 * np.sqrt(self.radius**2 - dz**2)\n",
- "\n",
- " def geometry(self, x=None, y=None, z=None):\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- " axis, position = self._parse_xyz_kwargs(x=x, y=y, z=z)\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=axis)\n",
- " intersect_dist = self._intersect_dist(position, z0)\n",
- " center = Point(x0, y0)\n",
- " return center.buffer(0.5 * intersect_dist)\n",
- "\n",
- " def geometry_z(self, zs):\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- " (x0, y0, z0) = self.center\n",
- " intersect_dist = self._intersect_dist(zs, z0)\n",
- " center = Point(x0, y0)\n",
- " return center.buffer(0.5 * intersect_dist)\n",
- "\n",
- " def inside_numpy(self, x, y, z) -> bool:\n",
- " \"\"\"returns True if (x,y,z) is inside of geometry\"\"\"\n",
- " x0, y0, z0 = self.center\n",
- " dist_x = np.abs(x - x0)\n",
- " dist_y = np.abs(y - y0)\n",
- " dist_z = np.abs(z - z0)\n",
- " return (dist_x ** 2 + dist_y ** 2 + dist_z ** 2) <= (self.radius ** 2)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "id": "1d56336f-967e-4742-b210-71d72f652626",
- "metadata": {},
- "outputs": [],
- "source": [
- "# sphere\n",
- "N = 100\n",
- "xs = np.linspace(-1, 1, N)\n",
- "ys = np.linspace(-1, 1, N)\n",
- "zs = np.linspace(-1, 1, 1)\n",
- "xx, yy, zz = np.meshgrid(xs, ys, zs, indexing='ij')\n",
- "x = xx.flatten()\n",
- "y = yy.flatten()\n",
- "z = zz.flatten()\n",
- "\n",
- "s = Sphere(center=(0,0,0), radius=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 64,
- "id": "918865b7-93c1-470e-8895-8b5981e2a1c0",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 475 ms, sys: 6.24 ms, total: 481 ms\n",
- "Wall time: 484 ms\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "s1 = s.inside(x=x, y=y, z=z)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 65,
- "id": "6fe89387-848e-4bb0-895c-2f0e1c1fda1b",
- "metadata": {},
- "outputs": [
- {
- "ename": "AttributeError",
- "evalue": "'numpy.ndarray' object has no attribute 'contains'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n",
- "\u001b[0;32m/var/folders/jx/9y0mtn3s3zzb6mzgmsw6s6gr0000gn/T/ipykernel_66175/1566549411.py\u001b[0m in \u001b[0;36minside_vectorized\u001b[0;34m(self, x, y, z)\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mxy_points\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0mz_points\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mz\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 31\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontains_vectorized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy_points\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz_points\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 32\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/Documents/Flexcompute/Tidy3D-client-revamp/env/lib/python3.9/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2161\u001b[0m \u001b[0mvargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0m_n\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_n\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnames\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2163\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_vectorize_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2165\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_ufunc_and_otypes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/Documents/Flexcompute/Tidy3D-client-revamp/env/lib/python3.9/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m_vectorize_call\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2235\u001b[0m \u001b[0;34m\"\"\"Vectorized call to `func` over positional `args`.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msignature\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2237\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_vectorize_call_with_signature\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2238\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2239\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m~/Documents/Flexcompute/Tidy3D-client-revamp/env/lib/python3.9/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36m_vectorize_call_with_signature\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2275\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2276\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mbroadcast_shape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2277\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2278\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2279\u001b[0m \u001b[0mn_results\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;32m/var/folders/jx/9y0mtn3s3zzb6mzgmsw6s6gr0000gn/T/ipykernel_66175/1566549411.py\u001b[0m in \u001b[0;36mcontains_pointwise\u001b[0;34m(self, xy_point, z_point)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mpoint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxy_point\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mgeo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgeometry_vectorized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mz_point\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mgeo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontains\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpoint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minside_vectorized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mAttributeError\u001b[0m: 'numpy.ndarray' object has no attribute 'contains'"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "s1 = s.inside_vectorized(x=x, y=y, z=z)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 66,
- "id": "7239fbd1-15dd-44cc-a3dd-500a0529f0d5",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 1.02 ms, sys: 1.1 ms, total: 2.12 ms\n",
- "Wall time: 1.19 ms\n"
- ]
- }
- ],
- "source": [
- "%%time\n",
- "s2 = s.inside_numpy(x=x, y=y, z=z)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "id": "b6d5f688-d749-4851-8909-519ba2d2573d",
- "metadata": {},
- "outputs": [],
- "source": [
- "assert np.all(s1 == s2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "2884ceb3-5434-43a9-ae0c-7761ed549710",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "env",
- "language": "python",
- "name": "env"
- },
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Polygon_Intersect.ipynb b/explore/Polygon_Intersect.ipynb
deleted file mode 100644
index 129a8bb431..0000000000
--- a/explore/Polygon_Intersect.ipynb
+++ /dev/null
@@ -1,367 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "3c2e6e60-2134-4746-b035-a305a545ab13",
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pylab as plt\n",
- "import matplotlib as mpl"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 80,
- "id": "25a64a63-5067-4256-92fe-da68228b57c9",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "def _shift_vertices(vertices, dists):\n",
- " \"\"\" shifts the vertices of a polygon inward uniformly by distances \n",
- " `dists`. Returns new polygon vertices, one for each dist.\n",
- " \"\"\"\n",
- "\n",
- " # cast dists to array just to be safe (if float)\n",
- " dists = np.array(dists)\n",
- "\n",
- " if np.all(np.isclose(dists, 0)):\n",
- " return vertices\n",
- "\n",
- " def rot90(v):\n",
- " \"\"\" 90 degree rotation of 2d vector\n",
- " vx -> vy\n",
- " vy -> -vx\n",
- " \"\"\"\n",
- " vxs, vys = v\n",
- " return np.stack((-vys, vxs), axis=0)\n",
- " \n",
- " def cross(v1, v2):\n",
- " return np.cross(v1, v2, axis=0)\n",
- " \n",
- " def normalize(v):\n",
- " return v / (np.linalg.norm(v, axis=0))\n",
- " \n",
- " num_verts = vertices.shape[0]\n",
- " \n",
- " vs = vertices.T.copy()\n",
- " vsp = np.roll(vs.copy(), axis=-1, shift=-1)\n",
- " vsm = np.roll(vs.copy(), axis=-1, shift=+1)\n",
- " \n",
- " asp = normalize(vsp - vs)\n",
- " asm = normalize(vs - vsm)\n",
- "\n",
- " vs_new = vs + dists[..., None, None] * rot90(asm)\n",
- " det = cross(asp, asm)\n",
- "\n",
- " det_nz = 1.0 - 1.0 * np.isclose(det, 0)\n",
- "\n",
- " tmp = (cross(asm, rot90(asm-asp)) / (det + 1e-9))\n",
- " corrections = (1 - np.isclose(det, 0)) * dists[..., None, None] * tmp\n",
- "\n",
- " return np.swapaxes(vs_new + corrections * asm, -2, -1)\n",
- "\n",
- "class Polygon:\n",
- " def __init__(self, vertices, zbounds, side_angle=0.0):\n",
- " # note: vertices are 'base' vertices (at zmin or zbounds[0])\n",
- " self.vertices = np.array(vertices)\n",
- " self.zbounds = self.zmin, self.zmax = zbounds\n",
- " # note: side angle is in degrees with 0 meaning straight, >0 meaning smaller top\n",
- " self.side_angle = side_angle\n",
- " self.side_angle_rad = side_angle / 180 * np.pi\n",
- " \n",
- " def intersects(self, axis='z', pos=0.0):\n",
- " \"\"\" returns list of (N,2) polygon vertices in the plane normal to axis at position axis=pos \"\"\"\n",
- " if axis == 'x':\n",
- " return self._intersects_x(pos)\n",
- " elif axis == 'y':\n",
- " return self._intersects_y(pos)\n",
- " elif axis == 'z':\n",
- " return self._intersects_z(pos)\n",
- " \n",
- " def _intersects_side(self, pos, axis='x'):\n",
- " \"\"\" finds intersection with polygon at position axis=pos, for axis=x or y \"\"\"\n",
- "\n",
- " assert axis in ('x', 'y')\n",
- "\n",
- " # get all segments\n",
- " v1 = self.vertices\n",
- " \n",
- " # if axis is y, just flip x,y coordinates and do the same as for x\n",
- " if axis == 'y':\n",
- " v1 = np.roll(v1, shift=1, axis=1)\n",
- "\n",
- " # get 'next' segments\n",
- " v2 = np.roll(v1, shift=1, axis=0)\n",
- "\n",
- " # find which segments intersect\n",
- " intersects_forward = np.logical_and((v1[:,0] <= pos), (v2[:,0] > pos))\n",
- " intersects_backward = np.logical_and((v2[:,0] <= pos), (v1[:,0] > pos))\n",
- " intersects_segment = np.logical_or(intersects_forward, intersects_backward)\n",
- " ints_v1 = v1[intersects_segment]\n",
- " ints_v2 = v2[intersects_segment]\n",
- "\n",
- " # for each intersecting segment, find specific intersection point (in y) assuming straight line\n",
- " ints_y = []\n",
- " for (_v1, _v2) in zip(ints_v1, ints_v2):\n",
- " # find the interescting y\n",
- " x1, y1 = _v1\n",
- " x2, y2 = _v2\n",
- " slope = (y2 - y1) / (x2 - x1)\n",
- " y = y1 + slope * (pos - x1)\n",
- " ints_y.append(y)\n",
- "\n",
- " # sort the intersections just to be safe\n",
- " ints_y.sort()\n",
- " \n",
- " # make polygon with intersections and z axis information\n",
- " polys = []\n",
- " for i in range(len(ints_y) // 2):\n",
- "\n",
- " # consecutive smaller and larger y points, respectively, assumed material between them\n",
- " y1 = ints_y[2*i]\n",
- " y2 = ints_y[2*i + 1]\n",
- " \n",
- " # make the polygon\n",
- " if np.isclose(self.side_angle, 0.0):\n",
- " # normal case, just make a rectangle\n",
- " poly = [(y1, self.zmin), (y2, self.zmin), (y2, self.zmax), (y1, self.zmax)]\n",
- " else:\n",
- " # sidewall angle case, get distances needed for calculation\n",
- " dist_y = np.abs(y2 - y1)\n",
- " dist_z = np.abs(self.zmax - self.zmin)\n",
- " \n",
- " # distance in z where the sidewalls would intersect\n",
- " hz = np.abs(dist_y / 2 / np.tan(self.side_angle_rad))\n",
- " if hz < dist_z and self.side_angle > 0:\n",
- " # if they do intersect before reaching top of polygon (and it's positive side wall) make triangle\n",
- " y_mid = (y1 + y2) / 2\n",
- " poly = [(y1, self.zmin), (y2, self.zmin), (y_mid, self.zmin + hz)]\n",
- " else:\n",
- " # otherwise, just adjust the y positions of the top part of the polygon to shift based on sidewall\n",
- " dy = dist_z * np.tan(self.side_angle_rad)\n",
- " poly = [(y1, self.zmin), (y2, self.zmin), (y2-dy, self.zmax), (y1+dy, self.zmax)] \n",
- "\n",
- " polys.append(poly)\n",
- " return polys\n",
- " \n",
- " def _intersects_x(self, pos):\n",
- " return self._intersects_side(pos, axis='x')\n",
- "\n",
- " def _intersects_y(self, pos):\n",
- " return self._intersects_side(pos, axis='y')\n",
- " \n",
- " def _intersects_z(self, pos):\n",
- " if (self.zmin > pos) or (self.zmax < pos):\n",
- " # if outside of z bounds, return nothing\n",
- " return []\n",
- " elif np.isclose(self.side_angle, 0.0):\n",
- " # if inside bounds and no side angle, return orginal vertices\n",
- " return [self.vertices]\n",
- " else:\n",
- " # if side angle present, compute shifting of polygon as function of pos and return shifted\n",
- " dist_z = pos - self.zmin\n",
- " dist_shift = dist_z * np.tan(self.side_angle_rad)\n",
- " vertices_shifted = _shift_vertices(self.vertices, dist_shift)\n",
- " return [vertices_shifted]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 81,
- "id": "9f2d3942-d1c2-4ac7-aa33-36993892c465",
- "metadata": {},
- "outputs": [],
- "source": [
- "# constructs star polygon\n",
- "\n",
- "# inner and outer radii of star\n",
- "r_in = 0.4\n",
- "r_out = 1.0\n",
- "\n",
- "# inner and outer star vertices\n",
- "inner_vertices = [(r_in * np.cos(2*np.pi*i/5 + np.pi/2 - np.pi/5), r_in * np.sin(2*np.pi*i/5 + np.pi/2 - np.pi/5)) for i in range(5)]\n",
- "outer_vertices = [(r_out * np.cos(2*np.pi*i/5 + np.pi/2), r_out * np.sin(2*np.pi*i/5 + np.pi/2)) for i in range(5)]\n",
- "\n",
- "# interweave inner and outer vertices to make star\n",
- "star_vertices = []\n",
- "for i in range(5):\n",
- " star_vertices.append(inner_vertices[i])\n",
- " star_vertices.append(outer_vertices[i])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "id": "ca33c2dd-9595-41de-939f-c2bdc2d2a0fb",
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_polygons(vertices_list, ax=None):\n",
- " if ax is None:\n",
- " f, ax = plt.subplots(1,1)\n",
- " for vertices in vertices_list:\n",
- " patch = mpl.patches.Polygon(vertices)\n",
- " ax.add_patch(patch)\n",
- " ax.set_xlim(-2, 2)\n",
- " ax.set_ylim(-2, 2)\n",
- " return ax"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 76,
- "id": "6f95e41d-c7d5-4779-9ff4-e5fbed199939",
- "metadata": {},
- "outputs": [],
- "source": [
- "p = Polygon(star_vertices, zbounds=(-1, 1), side_angle=5)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 77,
- "id": "e254ff81-c15c-4655-a6b0-4fbf0930a049",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# z direction\n",
- "pos_list = np.linspace(-2, 2, 5)\n",
- "\n",
- "n_pos = len(pos_list)\n",
- "f, axes = plt.subplots(1, n_pos, tight_layout=True, figsize=(12, 12/n_pos))\n",
- "for ax, pos in zip(axes, pos_list):\n",
- " polygons = p.intersects(axis='z', pos=pos)\n",
- " ax = plot_polygons(polygons, ax=ax)\n",
- " ax.set_title(f'pos={pos:.1f}')\n",
- " ax.set_xlabel('x')\n",
- " ax.set_ylabel('y') \n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 78,
- "id": "59b14043-f492-4370-9bf2-9fb8b93bacb4",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# x direction\n",
- "pos_list = np.linspace(-1, 1, 5)\n",
- "\n",
- "n_pos = len(pos_list)\n",
- "f, axes = plt.subplots(1, n_pos, tight_layout=True, figsize=(12, 12/n_pos))\n",
- "\n",
- "for ax, pos in zip(axes, pos_list):\n",
- " polygons = p.intersects(axis='x', pos=pos)\n",
- " ax = plot_polygons(polygons, ax=ax)\n",
- " ax.set_title(f'pos={pos:.1f}')\n",
- " ax.set_xlabel('y')\n",
- " ax.set_ylabel('z')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 79,
- "id": "3444b359-af43-4668-9541-e129bd599770",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# x direction\n",
- "pos_list = np.linspace(-0.5, 1, 5)\n",
- "\n",
- "n_pos = len(pos_list)\n",
- "f, axes = plt.subplots(1, n_pos, tight_layout=True, figsize=(12, 12/n_pos))\n",
- "\n",
- "for ax, pos in zip(axes, pos_list):\n",
- " polygons = p.intersects(axis='y', pos=pos)\n",
- " ax = plot_polygons(polygons, ax=ax)\n",
- " ax.set_title(f'pos={pos:.1f}')\n",
- " ax.set_xlabel('x')\n",
- " ax.set_ylabel('z')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "66b1ef2a-6a26-4783-826a-ab892dc1bfdd",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "4b75ce75-8205-4405-9ef7-3ba7103733b3",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Progressbar.ipynb b/explore/Progressbar.ipynb
deleted file mode 100644
index 8cde6c99bb..0000000000
--- a/explore/Progressbar.ipynb
+++ /dev/null
@@ -1,338 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "9efbc84f-78ca-4c2b-8e3f-ee7e33700338",
- "metadata": {},
- "outputs": [],
- "source": [
- "import rich\n",
- "from rich.progress import Progress\n",
- "from rich.status import Status\n",
- "from rich.console import Console\n",
- "import time\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "04850b1d-e5b2-4801-8e8b-a3426d9bf0f1",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8dc0de1f188d49e09a764a7ccaa2d229",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "dce275d274fe41c694de7820c8ed65b1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a39beaf045e84824a05e260d6bd53095",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "ename": "KeyboardInterrupt",
- "evalue": "",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m/var/folders/jx/9y0mtn3s3zzb6mzgmsw6s6gr0000gn/T/ipykernel_25332/3032989008.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mprogress\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtask\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0madvance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.05\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
- ]
- }
- ],
- "source": [
- "import time\n",
- "from rich.progress import Progress\n",
- "from rich.console import Console\n",
- "\n",
- "# outer status bar\n",
- "console = Console()\n",
- "for status_name in ('status1', 'status2', 'status3'):\n",
- " with console.status(f\"[bold green]Status = {status_name}\") as status:\n",
- "\n",
- " # progressbar for status\n",
- " with Progress() as progress:\n",
- " task = progress.add_task('running', total=100)\n",
- "\n",
- " for i in range(100):\n",
- " progress.update(task, advance=1)\n",
- " time.sleep(0.05)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "848143db-6708-4dea-a2c3-5577ec859dd4",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8a2ede96600a435e874fc411c33a0809",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5826cdd8a0d74deab35767ef4c65451d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "1607856d447d46c487fdff1ad4d04edb",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "Output()"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/html": [
- "\n"
- ],
- "text/plain": []
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "import time\n",
- "from rich.progress import Progress\n",
- "from rich.console import Console\n",
- "\n",
- "# outer status bar\n",
- "console = Console()\n",
- "for status_name in ('status1', 'status2', 'status3'):\n",
- " with console.status(f\"[bold green]Status = {status_name}\") as status:\n",
- "\n",
- " # progressbar for status\n",
- " with Progress() as progress:\n",
- " task = progress.add_task('running', total=100)\n",
- "\n",
- " for i in range(100):\n",
- " progress.update(task, advance=1)\n",
- " time.sleep(0.05)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "745bb0e9-b095-422a-b660-c29ccf019062",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Shapely.ipynb b/explore/Shapely.ipynb
deleted file mode 100644
index c617051bbd..0000000000
--- a/explore/Shapely.ipynb
+++ /dev/null
@@ -1,490 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 358,
- "id": "039409fc-0111-4b8d-bd83-d451455b2be9",
- "metadata": {},
- "outputs": [],
- "source": [
- "from typing import Union, Tuple, Any, List\n",
- "from abc import ABC, abstractmethod\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pylab as plt\n",
- "\n",
- "from dataclasses import dataclass\n",
- "from shapely.geometry import Point, LineString, Polygon, box, asMultiPoint\n",
- "from descartes import PolygonPatch \n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 492,
- "id": "a882cba7-442d-44be-aa21-9aeb6a492ab1",
- "metadata": {},
- "outputs": [],
- "source": [
- "@dataclass\n",
- "class Geometry(ABC):\n",
- " \n",
- " center: Tuple[float, float, float]\n",
- " \n",
- " @abstractmethod\n",
- " def geometry(self, x=None, y=None, z=None) -> list:\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- "\n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\" is point (x,y,z) inside volume of Geometry? (note: here is slow (point by point) way, implement vectorized on subclasses. \"\"\"\n",
- " geo = self.geometry(z=z)\n",
- " loc = Point(x,y)\n",
- " return any([shape.contains(loc) for shape in geo])\n",
- "\n",
- " @staticmethod\n",
- " def pop_axis(coord: Tuple[Any, Any, Any], axis: int) -> Tuple[Any, Tuple[Any, Any]]:\n",
- " \"\"\"separate coordinate at `axis` index from coordinates on the plane tangent to `axis`\"\"\"\n",
- " plane_vals = list(coord)\n",
- " axis_val = plane_vals.pop(axis)\n",
- " return axis_val, plane_vals\n",
- "\n",
- " def plot(self, x=None, y=None, z=None, ax=None, **patch_kwargs):\n",
- " \"\"\" plot structure \"\"\"\n",
- " if ax is None:\n",
- " _, ax = plt.subplots()\n",
- " geo = self.geometry(x=x, y=y, z=z)\n",
- " for shape in geo:\n",
- " patch = PolygonPatch(shape, **patch_kwargs)\n",
- " ax.add_artist(patch)\n",
- " return ax\n",
- "\n",
- " @staticmethod\n",
- " def _parse_xyz_kwargs(**xyz) -> Tuple[int, float]:\n",
- " \"\"\" turns kwargs for plane specification like {x=None, y=None, z=None} into axis (0,1,2) and position along axis \"\"\"\n",
- " xyz_filtered = {k : v for k, v in xyz.items() if v is not None}\n",
- " assert len(xyz_filtered) == 1, f\"exatly one kwarg in [x,y,z] must be specified, given {xyz_filtered}.\"\n",
- " axis_label, position = list(xyz_filtered.items())[0]\n",
- " axis = 'xyz'.index(axis_label)\n",
- " return axis, position\n",
- " \n",
- "@dataclass\n",
- "class Planar(Geometry, ABC):\n",
- "\n",
- " axis: int\n",
- " height: float\n",
- " \n",
- " def _order_by_axis(self, plane_val: Any, axis_val: Any, axis: int) -> Tuple[Any, Any]:\n",
- " \"\"\" orders a value in the plane and value along axis in correct (x,y) order for plotting \"\"\"\n",
- " vals = 3 * [plane_val]\n",
- " vals[self.axis] = axis_val\n",
- " _, (val_x, val_y) = self.pop_axis(vals, axis=axis)\n",
- " return val_x, val_y\n",
- "\n",
- " def geometry(self, x=None, y=None, z=None):\n",
- " \"\"\" returns shapely geometry at plane specified by one non None value of x,y,z \"\"\"\n",
- " axis, position = self._parse_xyz_kwargs(x=x, y=y, z=z)\n",
- " if axis == self.axis:\n",
- " z0, _ = self.pop_axis(self.center, axis=self.axis)\n",
- " if (position < z0 - self.height/2) or (position > z0 + self.height/2):\n",
- " return []\n",
- " return self._geometry_normal()\n",
- " return self._geometry_side(position, axis)\n",
- "\n",
- " @abstractmethod\n",
- " def _geometry_normal(self) -> list:\n",
- " \"\"\" shapely geometry with axis normal to slab \"\"\"\n",
- " \n",
- " @abstractmethod\n",
- " def _geometry_side(self, position, axis) -> list:\n",
- " \"\"\" shapely geometry with axis orthogonal to slab \"\"\"\n",
- "\n",
- "@dataclass\n",
- "class Circular(Geometry):\n",
- " \n",
- " radius: float\n",
- " \n",
- " def _intersect_dist(self, position, z0):\n",
- " \"\"\" distance between points on circle at z=position where center of circle at z=z0 \"\"\"\n",
- " dz = np.abs(z0 - position)\n",
- " if dz > self.radius:\n",
- " return\n",
- " return 2 * np.sqrt(self.radius**2 - dz**2)\n",
- "\n",
- "@dataclass\n",
- "class Sphere(Circular):\n",
- " \"\"\" Sphere(center=(0,0,0), radius=1.0) \"\"\"\n",
- "\n",
- " radius: float\n",
- "\n",
- " def geometry(self, x=None, y=None, z=None):\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- " axis, position = self._parse_xyz_kwargs(x=x, y=y, z=z)\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=axis)\n",
- " intersect_dist = self._intersect_dist(position, z0)\n",
- " if not intersect_dist:\n",
- " return []\n",
- " return [Point(x0, y0).buffer(0.5 * intersect_dist)]\n",
- "\n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\"returns True if (x,y,z) is inside of geometry\"\"\"\n",
- " x0, y0, z0 = self.center\n",
- " dist_x = np.abs(x - x0)\n",
- " dist_y = np.abs(y - y0)\n",
- " dist_z = np.abs(z - z0)\n",
- " return (dist_x ** 2 + dist_y ** 2 + dist_z ** 2) <= (self.radius ** 2)\n",
- "\n",
- "@dataclass\n",
- "class Cylinder(Circular, Planar):\n",
- " \"\"\" Cylinder(center=(0,0,0), radius=1.0, axis=2, length=1) \"\"\"\n",
- " \n",
- " def _geometry_normal(self):\n",
- " \"\"\" shapely geometry with axis normal to slab \"\"\"\n",
- " _, (x0, y0) = self.pop_axis(self.center, axis=self.axis)\n",
- " return [Point(x0, y0).buffer(self.radius)]\n",
- "\n",
- " def _geometry_side(self, position, axis):\n",
- " \"\"\" shapely geometry with axis orthogonal to slab \"\"\"\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=self.axis)\n",
- " intersect_dist = self._intersect_dist(position, z0)\n",
- " if not intersect_dist:\n",
- " return []\n",
- " Lx, Ly = self._order_by_axis(plane_val=intersect_dist, axis_val=self.height, axis=axis)\n",
- " return [box(minx=x0-Lx/2, miny=y0-Ly/2, maxx=x0+Lx/2, maxy=y0+Ly/2)]\n",
- "\n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\"returns True if (x,y,z) is inside of geometry\"\"\"\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=self.axis)\n",
- " dist_x = np.abs(x - x0)\n",
- " dist_y = np.abs(y - y0)\n",
- " dist_z = np.abs(z - z0)\n",
- " inside_radius = (dist_x ** 2 + dist_y ** 2) <= (self.radius ** 2)\n",
- " inside_height = dist_z < (self.height / 2)\n",
- " return inside_radius * inside_height\n",
- "\n",
- "@dataclass\n",
- "class PolySlab(Planar):\n",
- " \"\"\" PolySlab(center=(0,0,0), vertices=[(0,0), (1,0), (1,1)], length=1.0, axis=2) \"\"\"\n",
- " \n",
- " vertices: List[Tuple[float, float]]\n",
- " \n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\"returns True if (x,y,z) is inside of geometry\"\"\"\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=self.axis)\n",
- " dist_z = np.abs(z - z0)\n",
- " inside_height = dist_z < (self.height / 2)\n",
- " face_polygon = Polygon(self.vertices)\n",
- " if isinstance(x, np.ndarray):\n",
- " inside_polygon = np.zeros_like(inside_height)\n",
- " xs_slab = x[inside_height]\n",
- " ys_slab = y[inside_height]\n",
- " def contains_pointwise(xy_point):\n",
- " point = Point(xy_point)\n",
- " return face_polygon.contains(point)\n",
- " contains_vectorized = np.vectorize(contains_pointwise, signature='(n)->()')\n",
- " points_stacked = np.stack((xs_slab, ys_slab), axis=1)\n",
- " inside_polygon_slab = contains_vectorized(points_stacked)\n",
- " inside_polygon[inside_height] = inside_polygon_slab\n",
- " else:\n",
- " point = Point(x,y)\n",
- " inside_polygon = face_polygon.contains(point)\n",
- " return inside_height * inside_polygon\n",
- " \n",
- " def _geometry_normal(self):\n",
- " \"\"\" shapely geometry with axis normal to slab \"\"\"\n",
- " return [Polygon(self.vertices)]\n",
- "\n",
- " def _geometry_side(self, position, axis) -> list:\n",
- " \"\"\" shapely geometry with axis orthogonal to slab \"\"\"\n",
- "\n",
- " z0, _ = self.pop_axis(self.center, axis=self.axis)\n",
- " z_min, z_max = z0 - self.height/2, z0 + self.height/2\n",
- " iverts_b, iverts_f = self._find_intersecting_vertices(position, axis)\n",
- " ints_y = self._find_intersecting_ys(iverts_b, iverts_f, position)\n",
- "\n",
- " # make polygon with intersections and z axis information\n",
- " polys = []\n",
- " for y_index in range(len(ints_y) // 2):\n",
- " y_min = ints_y[2 * y_index]\n",
- " y_max = ints_y[2 * y_index + 1]\n",
- " minx, miny = self._order_by_axis(plane_val=y_min, axis_val=z_min, axis=axis)\n",
- " maxx, maxy = self._order_by_axis(plane_val=y_max, axis_val=z_max, axis=axis)\n",
- " polys.append(box(minx=minx, miny=miny, maxx=maxx, maxy=maxy))\n",
- "\n",
- " return polys\n",
- "\n",
- " def _find_intersecting_vertices(self, position: float, axis: int) -> Tuple[np.ndarray, np.ndarray]:\n",
- " \"\"\"find pairs of forward and backwards vertices where interescets\"\"\"\n",
- "\n",
- " vertices_b = np.array(self.vertices)\n",
- "\n",
- " # if the first coordinate refers to bounds, need to flip the vertices x,y\n",
- " if (axis == 2) or ((self.axis == 2) and (axis == 1)):\n",
- " vertices_b = np.roll(vertices_b, shift=1, axis=1)\n",
- "\n",
- " # get the forward vertices\n",
- " vertices_f = np.roll(vertices_b, shift=1, axis=0)\n",
- "\n",
- " # find which segments intersect\n",
- " intersects_b = np.logical_and((vertices_f[:, 0] <= position), (vertices_b[:, 0] > position))\n",
- " intersects_f = np.logical_and((vertices_b[:, 0] <= position), (vertices_f[:, 0] > position))\n",
- " intersects_segment = np.logical_or(intersects_b, intersects_f)\n",
- " iverts_b = vertices_b[intersects_segment]\n",
- " iverts_f = vertices_f[intersects_segment]\n",
- "\n",
- " return iverts_b, iverts_f\n",
- "\n",
- " @staticmethod\n",
- " def _find_intersecting_ys(iverts_b: np.ndarray, iverts_f: np.ndarray, position: float) -> List[float]:\n",
- " \"\"\"for each intersecting segment, find intersection point (in y) assuming straight line\"\"\"\n",
- "\n",
- " ints_y = []\n",
- " for (vertices_f, vertices_b) in zip(iverts_b, iverts_f):\n",
- " x1, y1 = vertices_f\n",
- " x2, y2 = vertices_b\n",
- " slope = (y2 - y1) / (x2 - x1)\n",
- " y = y1 + slope * (position - x1)\n",
- " ints_y.append(y)\n",
- " ints_y.sort()\n",
- " return ints_y\n",
- "\n",
- "@dataclass\n",
- "class Box(Geometry):\n",
- " \"\"\" Box(center=(0,0,0), size=(1,1,1)) \"\"\"\n",
- "\n",
- " size: Tuple[float, float, float]\n",
- " \n",
- " def geometry(self, x=None, y=None, z=None):\n",
- " \"\"\" returns shapely geoemtry at plane specified by one non None value of x,y,z \"\"\"\n",
- " axis, position = self._parse_xyz_kwargs(x=x, y=y, z=z)\n",
- " z0, (x0, y0) = self.pop_axis(self.center, axis=axis)\n",
- " Lz, (Lx, Ly) = self.pop_axis(self.size, axis=axis)\n",
- " dz = np.abs(z0 - position)\n",
- " if dz > Lz/2:\n",
- " return []\n",
- " return [box(minx=x0-Lx/2, miny=y0-Ly/2, maxx=x0+Lx/2, maxy=y0+Ly/2)] \n",
- " \n",
- " def inside(self, x, y, z) -> bool:\n",
- " \"\"\"returns True if (x,y,z) is inside of geometry\"\"\"\n",
- " x0, y0, z0 = self.center\n",
- " Lx, Ly, Lz = self.size\n",
- " dist_x = np.abs(x - x0)\n",
- " dist_y = np.abs(y - y0)\n",
- " dist_z = np.abs(z - z0)\n",
- " return (dist_x < Lx / 2) * (dist_y < Ly / 2) * (dist_z < Lz / 2)\n",
- "\n",
- "@dataclass\n",
- "class Structure:\n",
- " geometry: Geometry\n",
- " medium: str"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 493,
- "id": "985d66ec-2196-4ad3-9907-dc56d805d51c",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# sphere\n",
- "s = Sphere(center=(1,1,0), radius=1)\n",
- "ax = s.plot(z=0.1)\n",
- "ax.set_xlim(-1,3)\n",
- "ax.set_ylim(-1,3)\n",
- "ax.set_aspect('equal')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 494,
- "id": "f54a93c0-ff18-4c6e-a63b-474ffc308c87",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# box\n",
- "s1 = Sphere(center=(0.5,1.5,0), radius=.3)\n",
- "s2 = Sphere(center=(1.5,1.5,0), radius=.3)\n",
- "b = Box(center=(1,0.5,0), size=(2,.3,0))\n",
- "\n",
- "ax = s1.plot(z=0, facecolor='crimson')\n",
- "ax = s2.plot(z=0, edgecolor='brown', fill=False, ax=ax)\n",
- "ax = b.plot(z=0, ax=ax, alpha=0.5)\n",
- "\n",
- "ax.set_xlim(-1,3)\n",
- "ax.set_ylim(-1,3)\n",
- "ax.set_aspect('equal')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 495,
- "id": "24c75cb6-266b-4be2-86a7-516c00dfa6cd",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1.8841986941728517"
- ]
- },
- "execution_count": 495,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "s1.geometry(z=0)[0].length"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 496,
- "id": "3f95cb0c-c3d8-4b97-8133-e644766db8a6",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "c = Cylinder(center=(1,1,1), radius=1, length=2, axis=1)\n",
- "ax = c.plot(x=1.1)\n",
- "ax.set_xlim(-1,3)\n",
- "ax.set_ylim(-1,3)\n",
- "ax.set_aspect('equal')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 497,
- "id": "e5bc2a8f-35ed-49a4-8695-7d415af88261",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "p = PolySlab(center=(1,1,1), vertices=[(0, 0), (1, 0.5), (2, 0), (1.5, 1), (2, 2), (1, 1.5), (0, 2), (0.5, 1)], length=2, axis=2)\n",
- "ax = p.plot(z=1.8)\n",
- "ax.set_xlim(-1,3)\n",
- "ax.set_ylim(-1,3)\n",
- "ax.set_aspect('equal')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 498,
- "id": "e83e8b8e-6eed-4ccc-93bb-cf86563f1a7c",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "num = 100\n",
- "pts = np.linspace(-1, 3, num)\n",
- "x, y, z = np.meshgrid(pts, pts, pts, indexing='ij')\n",
- "x, y, z = x.flatten(), y.flatten(), z.flatten()\n",
- "inside = p.inside(x, y, z)\n",
- "inside = inside.reshape((num, num, num))\n",
- "im = plt.imshow(inside[..., num//2], cmap='gist_yarg')\n",
- "plt.colorbar(im)\n",
- "plt.title('indside(x, y; z=1)')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "77ce50c6-034d-4963-bda2-c4719032263c",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "b70b41ff-fd77-449d-8045-096810d37072",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "env",
- "language": "python",
- "name": "env"
- },
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/Untitled.ipynb b/explore/Untitled.ipynb
deleted file mode 100644
index 643a84eaa5..0000000000
--- a/explore/Untitled.ipynb
+++ /dev/null
@@ -1,111 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "d7113e68-34c7-4e7f-bb80-9b2ed2b85b7d",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pydantic as pd\n",
- "\n",
- "class P(pd.BaseModel):\n",
- " \n",
- " a: int\n",
- " \n",
- " def __post_init_parse__(self):\n",
- " self.b = a * 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "id": "223778dd-25d5-4e6a-a790-cc5f9662b96b",
- "metadata": {},
- "outputs": [],
- "source": [
- "p = P(a=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "id": "be583dfa-1e27-4012-93ee-eee8c2837872",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "P(a=1)"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "p"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "id": "b506a367-bde7-4b3f-9071-72b3a8b87f94",
- "metadata": {},
- "outputs": [
- {
- "ename": "AttributeError",
- "evalue": "'P' object has no attribute 'b'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m/var/folders/jx/9y0mtn3s3zzb6mzgmsw6s6gr0000gn/T/ipykernel_57495/3203497313.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[0;31mAttributeError\u001b[0m: 'P' object has no attribute 'b'"
- ]
- }
- ],
- "source": [
- "p.b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "05e4237b-cce0-4e7b-a4e3-68dca101a186",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "5df505be-2cc8-48ea-81ab-eccad31777b9",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "env",
- "language": "python",
- "name": "env"
- },
- "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.9.7"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/explore/container.py b/explore/container.py
deleted file mode 100644
index dfd701ea63..0000000000
--- a/explore/container.py
+++ /dev/null
@@ -1,209 +0,0 @@
-""" higher level wrappers for webapi functions for individual (Job) and batch (Batch) tasks. """
-
-import os
-from abc import ABC
-from typing import Dict
-import time
-
-from rich.console import Console
-from rich.progress import Progress
-
-from . import webapi as web
-from .task import TaskId, TaskInfo, RunInfo, TaskStatus
-from ..components.simulation import Simulation
-from ..components.data import SimulationData
-from ..components.base import Tidy3dBaseModel
-
-
-class WebContainer(Tidy3dBaseModel, ABC):
- """base class for job and batch, technically not used"""
-
-
-# type of task_name
-TaskName = str
-
-
-class Job(WebContainer):
- """Holds a task and its simulation"""
-
- simulation: Simulation
- task_name: TaskName
- task_id: TaskId = None
-
- def upload(self) -> None:
- """upload simulation to server, record task id"""
- task_id = web.upload(simulation=self.simulation)
- self.task_id = task_id
-
- def get_info(self) -> TaskInfo:
- """return general information about a job's task"""
- task_info = web.get_info(task_id=self.task_id)
- return task_info
-
- def run(self) -> None:
- """start running a task"""
- web.run(self.task_id)
-
- def get_run_info(self) -> RunInfo:
- """get information about a running task"""
- run_info = web.get_run_info(task_id=self.task_id)
- return run_info
-
- def get_status(self) -> TaskStatus:
- """gets current status"""
- task = web.monitor(task_id=self.task_id)
- return task.info.status
-
- def monitor(self) -> None:
- """monitor progress of running task"""
- console = Console()
- prev_status = self.get_status()
- console.log(f"status = {prev_status.value}")
- with console.status(f"[bold green]Monitoring Job '{self.task_name}' ...") as console_status:
- for _ in web.run(task_id=self.task_id):
- time.sleep(0.01)
- status = self.get_status()
- if status != prev_status:
- prev_status = status
- console.log(f"status = {prev_status.value}")
- if status == TaskStatus.RUN:
- break
-
- perc_done = 0
- field_decay = 0
- with Progress() as progress:
-
- task1 = progress.add_task("[red]% Done", total=100.0)
- task2 = progress.add_task("[green]Field Decay", total=1.0)
- for _ in web.run(task_id=self.task_id):
- time.sleep(0.01)
- task = web.monitor(task_id=self.task_id)
- run_info = task.run_info
- if run_info is None:
- break
-
- perc_done_update = run_info.perc_done - perc_done
- perc_done = run_info.perc_done
- feld_decay_update = run_info.field_decay - field_decay
- field_decay = run_info.field_decay
-
- progress.update(task1, advance=perc_done_update)
- progress.update(task2, advance=feld_decay_update)
-
- prev_status = TaskStatus.POST
-
- console.log(f"status = {prev_status.value}")
- prev_status = TaskStatus.SUCCESS
- time.sleep(1)
- console.log(f"status = {prev_status.value}")
-
- def download(self, path: str) -> None:
- """download results."""
- web.download(task_id=self.task_id, path=path)
-
- def load_results(self, path: str) -> SimulationData:
- """download results and load them into SimulationData object."""
- if not os.path.exists(path):
- self.download(path=path)
- sim_data = SimulationData.load(path)
- return sim_data
-
- def delete(self):
- """delete server-side data associated with job"""
- web.delete(self.task_id)
- self.task_id = None
-
-
-class Batch(WebContainer):
- """Holds a dictionary of jobs"""
-
- simulations: Dict[TaskName, Simulation]
- jobs: Dict[TaskName, Job] = None
-
- def __init__(self, **kwargs):
- """hacky way to create jobs if not supplied or use supplied ones if saved"""
- jobs = kwargs.get("jobs")
- if jobs is None:
- jobs = {}
- for task_name, simulation in kwargs["simulations"].items():
- job = Job(simulation=simulation, task_name=task_name)
- jobs[task_name] = job
- kwargs["jobs"] = jobs
- super().__init__(**kwargs)
-
- def upload(self) -> None:
- """upload simulations to server, record task ids"""
- for _, job in self.jobs.items():
- job.upload()
-
- def get_info(self) -> Dict[TaskName, TaskInfo]:
- """get general information about all job's task"""
- info_dict = {}
- for task_name, job in self.jobs.items():
- task_info = job.get_info()
- info_dict[task_name] = task_info
- return info_dict
-
- def run(self) -> None:
- """start running a task"""
- for _, job in self.jobs.items():
- job.run()
-
- def get_run_info(self) -> Dict[TaskName, RunInfo]:
- """get information about a running task"""
- run_info_dict = {}
- for task_name, job in self.jobs.items():
- run_info = job.get_run_info()
- run_info_dict[task_name] = run_info
- return run_info_dict
-
- def monitor(self, mon_frequency=0.1) -> None:
- """monitor progress of running task"""
- console = Console()
- with console.status("[bold green]Monitoring Batch...") as status:
- for task_name, job in self.jobs.items():
- while True:
- task = job.monitor()
- time.sleep(mon_frequency)
- console.log(f"task '{task_name}' complete")
-
- @staticmethod
- def _job_data_path(task_id: TaskId, path_dir: str):
- """returns path of a job data given task name and directory path"""
- return os.path.join(path_dir, f"{str(task_id)}.hdf5")
-
- def download(self, path_dir: str) -> None:
- """download results."""
- # console = Console()
- # with console.status("[bold green]Downloading Batch...") as status:
- for task_name, job in self.jobs.items():
- job_path = self._job_data_path(task_name, path_dir)
- job.download(path=job_path)
- # console.log(f"task '{task_name}' downloaded")
-
- def load_results(self, path_dir: str) -> Dict[TaskName, SimulationData]:
- """download results and load them into SimulationData object."""
- sim_data_dir = {}
- self.download(path_dir=path_dir)
- for task_name, job in self.jobs.items():
- job_path = self._job_data_path(task_id=job.task_id, path_dir=path_dir)
- sim_data = job.load_results(path=job_path)
- sim_data_dir[task_name] = sim_data
- return sim_data_dir
-
- def delete(self):
- """delete server-side data associated with job"""
- for _, job in self.jobs.items():
- job.delete()
- self.jobs = None
-
- def save(self, fname: str) -> None:
- """alias for self.export"""
- self.export(fname=fname)
-
- def items(self, path_dir: str):
- """simple iterator, `for task_name, sim_data in batch: `do something`"""
- for task_name, job in self.jobs.items():
- job_path = self._job_data_path(task_id=job.task_id, path_dir=path_dir)
- sim_data = job.load_results(path=job_path)
- yield task_name, sim_data
diff --git a/explore/monitor_interp.py b/explore/monitor_interp.py
deleted file mode 100644
index efa85faa53..0000000000
--- a/explore/monitor_interp.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import numpy as np
-from scipy.interpolate import interp1d
-from scipy.interpolate import LinearNDInterpolator
-
-
-def make_interpolator(xs, ys, zs, fn):
-
- xx, yy, zz = np.meshgrid(xs, ys, zs, indexing="ij")
- values = fn(xx, yy, zz)
- values = values.flatten()
- pts = np.stack((xx.flatten(), yy.flatten(), zz.flatten()), axis=1)
- return LinearNDInterpolator(pts, values)
-
-
-Nx, Ny, Nz = 13, 14, 15
-xs = np.linspace(-10, 10, Nx)
-ys = np.linspace(-10, 10, Ny)
-zs = np.linspace(-10, 10, Nz)
-
-interpolator = make_interpolator(xs, ys, zs, lambda x, y, z: np.abs(x) + np.abs(y) + np.abs(z))
-
-print(interpolator(1.0, -1.0, 1.0))
-# should be around array(3)
diff --git a/explore/pbar.py b/explore/pbar.py
deleted file mode 100644
index 3c40636fa7..0000000000
--- a/explore/pbar.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import tidy3d.web as web
-from tidy3d import *
-from tidy3d.web.task import TaskStatus
-
-from tests.utils import clear_dir
-from tests.utils import SIM_FULL as sim
-
-# sim = {f"sim_{i}": sim for i in range(10)}
-job = web.Job(simulation=sim, task_name="test")
-job.upload()
-job.get_info()
-job.run()
-job.monitor()
diff --git a/explore/pbar2.py b/explore/pbar2.py
deleted file mode 100644
index 3c40636fa7..0000000000
--- a/explore/pbar2.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import tidy3d.web as web
-from tidy3d import *
-from tidy3d.web.task import TaskStatus
-
-from tests.utils import clear_dir
-from tests.utils import SIM_FULL as sim
-
-# sim = {f"sim_{i}": sim for i in range(10)}
-job = web.Job(simulation=sim, task_name="test")
-job.upload()
-job.get_info()
-job.run()
-job.monitor()
diff --git a/explore/pbars.py b/explore/pbars.py
deleted file mode 100644
index 89c07e4933..0000000000
--- a/explore/pbars.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# from time import sleep
-# from rich.console import Console
-
-# console = Console()
-# console.print()
-
-# tasks = [f"task {n}" for n in range(1, 11)]
-
-# with console.status("[bold green]Working on tasks...") as status:
-# while tasks:
-# task = tasks.pop(0)
-# for i in range(100):
-# sleep(.01)
-# console.log(f"{task} complete")
-
-
-from time import sleep
-
-from rich.live import Live
-from rich.panel import Panel
-from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn
-from rich.table import Table
-
-
-job_progress = Progress(
- "{task.description}",
- SpinnerColumn(),
- BarColumn(),
- TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
-)
-job1 = job_progress.add_task("[green]Cooking")
-job2 = job_progress.add_task("[magenta]Baking", total=200)
-job3 = job_progress.add_task("[cyan]Mixing", total=400)
-
-total = sum(task.total for task in job_progress.tasks)
-overall_progress = Progress()
-overall_task = overall_progress.add_task("All Jobs", total=int(total))
-
-progress_table = Table.grid()
-progress_table.add_row(
- Panel.fit(overall_progress, title="Overall Progress", border_style="green", padding=(2, 2)),
- Panel.fit(job_progress, title="[b]Jobs", border_style="red", padding=(1, 2)),
-)
-
-with Live(progress_table, refresh_per_second=10):
- while not overall_progress.finished:
- sleep(0.1)
- for job in job_progress.tasks:
- if not job.finished:
- job_progress.advance(job.id)
-
- completed = sum(task.completed for task in job_progress.tasks)
- overall_progress.update(overall_task, completed=completed)
diff --git a/explore/schema/schema.json b/explore/schema/schema.json
deleted file mode 100644
index b34a85e83a..0000000000
--- a/explore/schema/schema.json
+++ /dev/null
@@ -1,2249 +0,0 @@
-{
- "title": "Simulation",
- "description": "Contains all information about simulation.\n\nParameters\n----------\ncenter : Tuple[float, float, float], optional\n Center of simulation domain in x,y,z, defualts to (0.0, 0.0, 0.0)\nsize : Tuple[float, float, float]\n Size of simulation domain in x,y,z.\ngrid_size : Tuple[float, float, float]\n Grid size in x,y,z direction.\nrun_time: float, optional\n Maximum run time of simulation in seconds, defaults to 0.0.\nmedium : ``tidy3d.Medium``, optional\n Background medium of simulation, defaults to air.\nstructures : List[``tidy3d.Structure``], optional\n Structures in simulation, in case of overlap, prefernce goes to those later in list.\nsources : Dict[str: ``Source``], optional\n Names and sources in the simulation.\nmonitors :\n Names and monitors in the simulation.\npml_layers: Tuple[``tidy3d.PMLLayer``, ``PMLLayer``, ``PMLLayer``], optional.\n Specifies PML layers (aborbers) in x,y,z location, defaults to no PML\nsymmetry : Tuple[int], optional\n Specifies symmetry in x,y,z with values 0, 1, -1 specifying no symmetry, even symmetry, and\n odd symmetry, respectively.\nshutoff : float, optional\n Simulation ends when field intensity gets below this value, defaults to 1e-5\ncourant : float, optional\n Courant stability factor, controls time step to spatial step ratio, defaults to 0.9.\nsubpixel : bool, optional\n Uses subpixel averaging of permittivity if True for much higher accuracy, defaults to True.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "grid_size": {
- "title": "Grid Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "exclusiveMinimum": 0
- },
- {
- "type": "array",
- "items": {
- "type": "number",
- "exclusiveMinimum": 0
- }
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "exclusiveMinimum": 0
- },
- {
- "type": "array",
- "items": {
- "type": "number",
- "exclusiveMinimum": 0
- }
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "exclusiveMinimum": 0
- },
- {
- "type": "array",
- "items": {
- "type": "number",
- "exclusiveMinimum": 0
- }
- }
- ]
- }
- ]
- },
- "medium": {
- "title": "Medium",
- "default": {
- "frequency_range": [
- -10000000000.0,
- 10000000000.0
- ],
- "permittivity": 1.0,
- "conductivity": 0.0,
- "type": "Medium"
- },
- "anyOf": [
- {
- "$ref": "#/definitions/Medium"
- },
- {
- "$ref": "#/definitions/PoleResidue"
- },
- {
- "$ref": "#/definitions/Sellmeier"
- },
- {
- "$ref": "#/definitions/Lorentz"
- },
- {
- "$ref": "#/definitions/Debye"
- }
- ]
- },
- "run_time": {
- "title": "Run Time",
- "default": 0.0,
- "minimum": 0,
- "type": "number"
- },
- "structures": {
- "title": "Structures",
- "default": [],
- "type": "array",
- "items": {
- "$ref": "#/definitions/Structure"
- }
- },
- "sources": {
- "title": "Sources",
- "default": {},
- "type": "object",
- "additionalProperties": {
- "anyOf": [
- {
- "$ref": "#/definitions/VolumeSource"
- },
- {
- "$ref": "#/definitions/PlaneWave"
- },
- {
- "$ref": "#/definitions/ModeSource"
- },
- {
- "$ref": "#/definitions/GaussianBeam"
- }
- ]
- }
- },
- "monitors": {
- "title": "Monitors",
- "default": {},
- "type": "object",
- "additionalProperties": {
- "anyOf": [
- {
- "$ref": "#/definitions/FieldMonitor"
- },
- {
- "$ref": "#/definitions/FieldTimeMonitor"
- },
- {
- "$ref": "#/definitions/FluxMonitor"
- },
- {
- "$ref": "#/definitions/FluxTimeMonitor"
- },
- {
- "$ref": "#/definitions/ModeMonitor"
- }
- ]
- }
- },
- "pml_layers": {
- "title": "Pml Layers",
- "default": [
- {
- "profile": "standard",
- "num_layers": 0
- },
- {
- "profile": "standard",
- "num_layers": 0
- },
- {
- "profile": "standard",
- "num_layers": 0
- }
- ],
- "type": "array",
- "items": [
- {
- "$ref": "#/definitions/PMLLayer"
- },
- {
- "$ref": "#/definitions/PMLLayer"
- },
- {
- "$ref": "#/definitions/PMLLayer"
- }
- ]
- },
- "symmetry": {
- "title": "Symmetry",
- "default": [
- 0,
- 0,
- 0
- ],
- "type": "array",
- "items": [
- {
- "enum": [
- 0,
- -1,
- 1
- ],
- "type": "integer"
- },
- {
- "enum": [
- 0,
- -1,
- 1
- ],
- "type": "integer"
- },
- {
- "enum": [
- 0,
- -1,
- 1
- ],
- "type": "integer"
- }
- ]
- },
- "shutoff": {
- "title": "Shutoff",
- "default": 1e-05,
- "minimum": 0,
- "type": "number"
- },
- "courant": {
- "title": "Courant",
- "default": 0.9,
- "minimum": 0.0,
- "maximum": 1.0,
- "type": "number"
- },
- "subpixel": {
- "title": "Subpixel",
- "default": true,
- "type": "boolean"
- }
- },
- "required": [
- "size",
- "grid_size"
- ],
- "additionalProperties": false,
- "definitions": {
- "Medium": {
- "title": "Medium",
- "description": "Dispersionless medium",
- "type": "object",
- "properties": {
- "frequency_range": {
- "title": "Frequency Range",
- "default": [
- -10000000000.0,
- 10000000000.0
- ],
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "permittivity": {
- "title": "Permittivity",
- "default": 1.0,
- "minimum": 1.0,
- "type": "number"
- },
- "conductivity": {
- "title": "Conductivity",
- "default": 0.0,
- "minimum": 0.0,
- "type": "number"
- },
- "type": {
- "title": "Type",
- "default": "Medium",
- "enum": [
- "Medium"
- ],
- "type": "string"
- }
- },
- "additionalProperties": false
- },
- "PoleResidue": {
- "title": "PoleResidue",
- "description": "defines a dispersion model",
- "type": "object",
- "properties": {
- "frequency_range": {
- "title": "Frequency Range",
- "default": [
- -10000000000.0,
- 10000000000.0
- ],
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "eps_inf": {
- "title": "Eps Inf",
- "default": 1.0,
- "type": "number"
- },
- "poles": {
- "title": "Poles",
- "type": "array",
- "items": {
- "type": "array",
- "items": [
- {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- }
- ]
- }
- },
- "type": {
- "title": "Type",
- "default": "PoleResidue",
- "enum": [
- "PoleResidue"
- ],
- "type": "string"
- }
- },
- "required": [
- "poles"
- ],
- "additionalProperties": false
- },
- "Sellmeier": {
- "title": "Sellmeier",
- "description": "Sellmeier model for dispersion",
- "type": "object",
- "properties": {
- "frequency_range": {
- "title": "Frequency Range",
- "default": [
- -10000000000.0,
- 10000000000.0
- ],
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "coeffs": {
- "title": "Coeffs",
- "type": "array",
- "items": {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- }
- },
- "type": {
- "title": "Type",
- "default": "Sellmeier",
- "enum": [
- "Sellmeier"
- ],
- "type": "string"
- }
- },
- "required": [
- "coeffs"
- ],
- "additionalProperties": false
- },
- "Lorentz": {
- "title": "Lorentz",
- "description": "Lorentz model for dispersion",
- "type": "object",
- "properties": {
- "frequency_range": {
- "title": "Frequency Range",
- "default": [
- -10000000000.0,
- 10000000000.0
- ],
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "eps_inf": {
- "title": "Eps Inf",
- "default": 1.0,
- "type": "number"
- },
- "coeffs": {
- "title": "Coeffs",
- "type": "array",
- "items": {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- }
- },
- "type": {
- "title": "Type",
- "default": "Lorentz",
- "enum": [
- "Lorentz"
- ],
- "type": "string"
- }
- },
- "required": [
- "coeffs"
- ],
- "additionalProperties": false
- },
- "Debye": {
- "title": "Debye",
- "description": "Debye model for dispersion",
- "type": "object",
- "properties": {
- "frequency_range": {
- "title": "Frequency Range",
- "default": [
- -10000000000.0,
- 10000000000.0
- ],
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number"
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- },
- {
- "enum": [
- -10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "eps_inf": {
- "title": "Eps Inf",
- "default": 1.0,
- "type": "number"
- },
- "coeffs": {
- "title": "Coeffs",
- "type": "array",
- "items": {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- }
- },
- "type": {
- "title": "Type",
- "default": "Debye",
- "enum": [
- "Debye"
- ],
- "type": "string"
- }
- },
- "required": [
- "coeffs"
- ],
- "additionalProperties": false
- },
- "Box": {
- "title": "Box",
- "description": "Rectangular prism.\n Also base class for :class:`Simulation`, :class:`Monitor`, and :class:`Source`.\n\nParameters\n----------\ncenter : ``(float, float, float)``\n center of box in x,y,z. Defaults to ``(0,0,0)``.\nsize : ``(float, float, float)``\n Size of box in x,y,z.\n\nExample\n-------\n>>> b = Box(center=(1,2,3), size=(2,2,2))",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- }
- },
- "required": [
- "size"
- ],
- "additionalProperties": false
- },
- "Sphere": {
- "title": "Sphere",
- "description": "Sphere geometry.\n\nParameters\n----------\ncenter : ``(float, float, float)``\n center of sphere in x,y,z. Defaults to ``(0,0,0)``.\nradius : ``float``\n Radius of sphere.\n\nExample\n-------\n>>> b = Sphere(center=(1,2,3), radius=2)",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "radius": {
- "title": "Radius",
- "minimum": 0,
- "type": "number"
- },
- "type": {
- "title": "Type",
- "default": "Sphere",
- "enum": [
- "Sphere"
- ],
- "type": "string"
- }
- },
- "required": [
- "radius"
- ],
- "additionalProperties": false
- },
- "Cylinder": {
- "title": "Cylinder",
- "description": "Cylinder geometry.\n\nParameters\n----------\ncenter : ``(float, float, float)``\n center of cylinder in x,y,z. Defaults to ``(0,0,0)``.\nradius : ``float``\n Radius of cylinder.\nlength : ``float``\n Length of sphere along axis.\naxis : ``int``\n Integer index into the cylinder's ``length`` axis (0,1,2) -> (x,y,z)\n\nExample\n-------\n>>> c = Cylinder(center=(1,2,3), radius=2, length=5, axis=2)",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "axis": {
- "title": "Axis",
- "default": 2,
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "integer"
- },
- "length": {
- "title": "Length",
- "minimum": 0,
- "type": "number"
- },
- "radius": {
- "title": "Radius",
- "minimum": 0,
- "type": "number"
- },
- "type": {
- "title": "Type",
- "default": "Cylinder",
- "enum": [
- "Cylinder"
- ],
- "type": "string"
- }
- },
- "required": [
- "length",
- "radius"
- ],
- "additionalProperties": false
- },
- "PolySlab": {
- "title": "PolySlab",
- "description": "Polygon with constant thickness along 3rd axis.\n\nParameters\n----------\nvertices : ``[(float, float)]``\n List of (x,y) vertices defining the polygon face.\naxis : ``int``\n Integer index into the polygon's slab axis. (0,1,2) -> (x,y,z)\nslab_bounds: ``(float, float)``\n Minimum and maximum position in slab axis.\n\nExample\n-------\n>>> p = PolySlab(vertices=[(0,0), (1,0), (1,1)], axis=2, slab_bounds=(-1, 1))",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "axis": {
- "title": "Axis",
- "default": 2,
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "integer"
- },
- "length": {
- "title": "Length",
- "minimum": 0,
- "type": "number"
- },
- "slab_bounds": {
- "title": "Slab Bounds",
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "vertices": {
- "title": "Vertices",
- "type": "array",
- "items": {
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- }
- },
- "type": {
- "title": "Type",
- "default": "PolySlab",
- "enum": [
- "PolySlab"
- ],
- "type": "string"
- }
- },
- "required": [
- "slab_bounds",
- "vertices"
- ],
- "additionalProperties": false
- },
- "Structure": {
- "title": "Structure",
- "description": "An object that interacts with the electromagnetic fields",
- "type": "object",
- "properties": {
- "geometry": {
- "title": "Geometry",
- "anyOf": [
- {
- "$ref": "#/definitions/Box"
- },
- {
- "$ref": "#/definitions/Sphere"
- },
- {
- "$ref": "#/definitions/Cylinder"
- },
- {
- "$ref": "#/definitions/PolySlab"
- }
- ]
- },
- "medium": {
- "title": "Medium",
- "anyOf": [
- {
- "$ref": "#/definitions/Medium"
- },
- {
- "$ref": "#/definitions/PoleResidue"
- },
- {
- "$ref": "#/definitions/Sellmeier"
- },
- {
- "$ref": "#/definitions/Lorentz"
- },
- {
- "$ref": "#/definitions/Debye"
- }
- ]
- }
- },
- "required": [
- "geometry",
- "medium"
- ],
- "additionalProperties": false
- },
- "GaussianPulse": {
- "title": "GaussianPulse",
- "description": "A gaussian pulse time dependence",
- "type": "object",
- "properties": {
- "amplitude": {
- "title": "Amplitude",
- "default": 1.0,
- "minimum": 0,
- "type": "number"
- },
- "phase": {
- "title": "Phase",
- "default": 0.0,
- "type": "number"
- },
- "freq0": {
- "title": "Freq0",
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "fwidth": {
- "title": "Fwidth",
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "offset": {
- "title": "Offset",
- "default": 5.0,
- "minimum": 2.5,
- "type": "number"
- }
- },
- "required": [
- "freq0",
- "fwidth"
- ],
- "additionalProperties": false
- },
- "CW": {
- "title": "CW",
- "description": "ramping up and holding steady",
- "type": "object",
- "properties": {
- "amplitude": {
- "title": "Amplitude",
- "default": 1.0,
- "minimum": 0,
- "type": "number"
- },
- "phase": {
- "title": "Phase",
- "default": 0.0,
- "type": "number"
- },
- "freq0": {
- "title": "Freq0",
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "fwidth": {
- "title": "Fwidth",
- "exclusiveMinimum": 0,
- "type": "number"
- },
- "offset": {
- "title": "Offset",
- "default": 5.0,
- "minimum": 2.5,
- "type": "number"
- }
- },
- "required": [
- "freq0",
- "fwidth"
- ],
- "additionalProperties": false
- },
- "VolumeSource": {
- "title": "VolumeSource",
- "description": "Volume Source with time dependence and polarization",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "source_time": {
- "title": "Source Time",
- "anyOf": [
- {
- "$ref": "#/definitions/GaussianPulse"
- },
- {
- "$ref": "#/definitions/CW"
- }
- ]
- },
- "polarization": {
- "title": "Polarization",
- "enum": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "string"
- },
- "type": {
- "title": "Type",
- "default": "VolumeSource",
- "enum": [
- "VolumeSource"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "source_time",
- "polarization"
- ],
- "additionalProperties": false
- },
- "PlaneWave": {
- "title": "PlaneWave",
- "description": "uniform distribution on infinite extent plane",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "source_time": {
- "title": "Source Time",
- "anyOf": [
- {
- "$ref": "#/definitions/GaussianPulse"
- },
- {
- "$ref": "#/definitions/CW"
- }
- ]
- },
- "direction": {
- "title": "Direction",
- "enum": [
- "+",
- "-"
- ],
- "type": "string"
- },
- "polarization": {
- "title": "Polarization",
- "enum": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "string"
- },
- "type": {
- "title": "Type",
- "default": "PlaneWave",
- "enum": [
- "PlaneWave"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "source_time",
- "direction",
- "polarization"
- ],
- "additionalProperties": false
- },
- "Mode": {
- "title": "Mode",
- "description": "Stores Specifications of a Mode to input into mode solver.\n\nParameters\n----------\nmode_index : int\n Return the mode solver output at ``mode_index``.\ntarget_neff : float, optional\n Guess for effective index of mode.\nsymmetries : Tuple[int, int], optional\n Symmetries (0,1,-1) = (none, even, odd) in (x,y) of mode plane, default = (0, 0).\nnum_pml: Tuple[int, int], optional\n number of pml layers to add in (x,y) of mode plane, default = (0, 0)",
- "type": "object",
- "properties": {
- "mode_index": {
- "title": "Mode Index",
- "minimum": 0,
- "type": "integer"
- },
- "target_neff": {
- "title": "Target Neff",
- "type": "number"
- },
- "symmetries": {
- "title": "Symmetries",
- "default": [
- 0,
- 0
- ],
- "type": "array",
- "items": [
- {
- "enum": [
- 0,
- -1,
- 1
- ],
- "type": "integer"
- },
- {
- "enum": [
- 0,
- -1,
- 1
- ],
- "type": "integer"
- }
- ]
- },
- "num_pml": {
- "title": "Num Pml",
- "default": [
- 0,
- 0
- ],
- "type": "array",
- "items": [
- {
- "type": "integer",
- "minimum": 0
- },
- {
- "type": "integer",
- "minimum": 0
- }
- ]
- }
- },
- "required": [
- "mode_index"
- ],
- "additionalProperties": false
- },
- "ModeSource": {
- "title": "ModeSource",
- "description": "Modal profile on finite extent plane",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "source_time": {
- "title": "Source Time",
- "anyOf": [
- {
- "$ref": "#/definitions/GaussianPulse"
- },
- {
- "$ref": "#/definitions/CW"
- }
- ]
- },
- "direction": {
- "title": "Direction",
- "enum": [
- "+",
- "-"
- ],
- "type": "string"
- },
- "mode": {
- "$ref": "#/definitions/Mode"
- },
- "type": {
- "title": "Type",
- "default": "ModeSource",
- "enum": [
- "ModeSource"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "source_time",
- "direction",
- "mode"
- ],
- "additionalProperties": false
- },
- "GaussianBeam": {
- "title": "GaussianBeam",
- "description": "guassian distribution on finite extent plane",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "source_time": {
- "title": "Source Time",
- "anyOf": [
- {
- "$ref": "#/definitions/GaussianPulse"
- },
- {
- "$ref": "#/definitions/CW"
- }
- ]
- },
- "direction": {
- "title": "Direction",
- "enum": [
- "+",
- "-"
- ],
- "type": "string"
- },
- "polarization": {
- "title": "Polarization",
- "enum": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "string"
- },
- "waist_size": {
- "title": "Waist Size",
- "type": "array",
- "items": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "type": "number",
- "minimum": 0
- }
- ]
- },
- "type": {
- "title": "Type",
- "default": "GaussianBeam",
- "enum": [
- "GaussianBeam"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "source_time",
- "direction",
- "polarization",
- "waist_size"
- ],
- "additionalProperties": false
- },
- "FieldMonitor": {
- "title": "FieldMonitor",
- "description": "Stores EM fields or permittivity as a function of frequency.\n\nParameters\n----------\ncenter: Tuple[float, float, float], optional.\n Center of monitor ``Box``, defaults to (0, 0, 0)\nsize: Tuple[float, float, float].\n Size of monitor ``Box``, must have one element = 0.0 to define plane.\nfields: List[str], optional\n Electromagnetic field(s) to measure (E, H), defaults to ``['Ex', 'Ey', 'Ez', 'Hx', 'Hy',\n 'Hz']``, also accepts diagonal components of permittivity tensor as ``'eps_xx', 'eps_yy',\n 'eps_zz'``.\nfreqs: List[float]\n Frequencies to measure fields at at.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "freqs": {
- "title": "Freqs",
- "type": "array",
- "items": {
- "type": "number"
- }
- },
- "fields": {
- "title": "Fields",
- "default": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "array",
- "items": {
- "enum": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz",
- "eps_xx",
- "eps_yy",
- "eps_zz"
- ],
- "type": "string"
- }
- },
- "type": {
- "title": "Type",
- "default": "FieldMonitor",
- "enum": [
- "FieldMonitor"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "freqs"
- ],
- "additionalProperties": false
- },
- "FieldTimeMonitor": {
- "title": "FieldTimeMonitor",
- "description": "Stores EM fields as a function of time.\n\nParameters\n----------\ncenter: Tuple[float, float, float], optional.\n Center of monitor ``Box``, defaults to (0, 0, 0)\nsize: Tuple[float, float, float].\n Size of monitor ``Box``, must have one element = 0.0 to define plane.\nfields: List[str], optional\n Electromagnetic field(s) to measure (E, H), defaults to ``['Ex', 'Ey', 'Ez', 'Hx', 'Hy',\n 'Hz']``.\ntimes: List[int]\n Time steps to measure the fields at.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "times": {
- "title": "Times",
- "type": "array",
- "items": {
- "type": "integer"
- }
- },
- "fields": {
- "title": "Fields",
- "default": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "array",
- "items": {
- "enum": [
- "Ex",
- "Ey",
- "Ez",
- "Hx",
- "Hy",
- "Hz"
- ],
- "type": "string"
- }
- },
- "type": {
- "title": "Type",
- "default": "FieldTimeMonitor",
- "enum": [
- "FieldTimeMonitor"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "times"
- ],
- "additionalProperties": false
- },
- "FluxMonitor": {
- "title": "FluxMonitor",
- "description": "Stores power flux through a plane as a function of frequency.\n\nParameters\n----------\ncenter: Tuple[float, float, float], optional.\n Center of monitor ``Box``, defaults to (0, 0, 0)\nsize: Tuple[float, float, float].\n Size of monitor ``Box``, must have one element = 0.0 to define plane.\nfreqs: List[float]\n Frequencies to measure flux at.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "freqs": {
- "title": "Freqs",
- "type": "array",
- "items": {
- "type": "number"
- }
- },
- "type": {
- "title": "Type",
- "default": "FluxMonitor",
- "enum": [
- "FluxMonitor"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "freqs"
- ],
- "additionalProperties": false
- },
- "FluxTimeMonitor": {
- "title": "FluxTimeMonitor",
- "description": "Stores power flux through a plane as a function of frequency.\n\nParameters\n----------\ncenter: Tuple[float, float, float], optional.\n Center of monitor ``Box``, defaults to (0, 0, 0)\nsize: Tuple[float, float, float].\n Size of monitor ``Box``, must have one element = 0.0 to define plane.\ntimes: List[int]\n Time steps to measure flux at.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "times": {
- "title": "Times",
- "type": "array",
- "items": {
- "type": "integer"
- }
- },
- "type": {
- "title": "Type",
- "default": "FluxTimeMonitor",
- "enum": [
- "FluxTimeMonitor"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "times"
- ],
- "additionalProperties": false
- },
- "ModeMonitor": {
- "title": "ModeMonitor",
- "description": "stores overlap amplitudes associated with modes.\n\nParameters\n----------\ncenter: Tuple[float, float, float], optional.\n Center of monitor ``Box``, defaults to (0, 0, 0)\nsize: Tuple[float, float, float].\n Size of monitor ``Box``, must have one element = 0.0 to define plane.\nfreqs: List[float]\n Frequencies to measure flux at.\nmodes: List[``Mode``]\n List of ``Mode`` objects specifying the modal profiles to measure amplitude overalap with.",
- "type": "object",
- "properties": {
- "center": {
- "title": "Center",
- "default": [
- 0.0,
- 0.0,
- 0.0
- ],
- "type": "array",
- "items": [
- {
- "type": "number"
- },
- {
- "type": "number"
- },
- {
- "type": "number"
- }
- ]
- },
- "size": {
- "title": "Size",
- "type": "array",
- "items": [
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- },
- {
- "anyOf": [
- {
- "type": "number",
- "minimum": 0
- },
- {
- "enum": [
- 10000000000.0
- ],
- "type": "number"
- }
- ]
- }
- ]
- },
- "freqs": {
- "title": "Freqs",
- "type": "array",
- "items": {
- "type": "number"
- }
- },
- "direction": {
- "title": "Direction",
- "default": [
- "+",
- "-"
- ],
- "type": "array",
- "items": {
- "enum": [
- "+",
- "-"
- ],
- "type": "string"
- }
- },
- "modes": {
- "title": "Modes",
- "type": "array",
- "items": {
- "$ref": "#/definitions/Mode"
- }
- },
- "type": {
- "title": "Type",
- "default": "ModeMonitor",
- "enum": [
- "ModeMonitor"
- ],
- "type": "string"
- }
- },
- "required": [
- "size",
- "freqs",
- "modes"
- ],
- "additionalProperties": false
- },
- "PMLLayer": {
- "title": "PMLLayer",
- "description": "single layer of a PML (profile and num layers)\n\nParameters\n----------\nprofile : str, optional\n Specifies type of PML, one of ``'standard'``, ``'stable'``, ``'absorber'``, defaults to\n ``'standard'``\nnum_layers : int, default\n Number of layers added to + and - boundaries, defaults to 0 (no PML)",
- "type": "object",
- "properties": {
- "profile": {
- "title": "Profile",
- "default": "standard",
- "enum": [
- "standard",
- "stable",
- "absorber"
- ],
- "type": "string"
- },
- "num_layers": {
- "title": "Num Layers",
- "default": 0,
- "minimum": 0,
- "type": "integer"
- }
- },
- "additionalProperties": false
- }
- }
-}
\ No newline at end of file
diff --git a/explore/schema/schema.py b/explore/schema/schema.py
deleted file mode 100644
index 5420cfeed8..0000000000
--- a/explore/schema/schema.py
+++ /dev/null
@@ -1,69 +0,0 @@
-import json
-from jsonschema import Draft3Validator
-from jsonschema.validators import extend
-import jsonschema2md
-
-import sys
-
-sys.path.append("../../")
-
-from tidy3d import Simulation
-
-""" creates schema validator and function for validating simulation dict """
-
-
-def load_json(fname: str) -> dict:
- """loads a json file into dictionary"""
- with open(fname, "r") as fp:
- data_dict = json.load(fp)
- return data_dict
-
-
-def _accepts_tuple(checker, instance):
- """custom validator for array types, accept tuple as ok"""
- is_array = VALIDATOR.TYPE_CHECKER.is_type(instance, "array")
- is_tuple = isinstance(instance, tuple)
- return is_array or is_tuple
-
-
-def _create_validator(schema: dict) -> Draft3Validator:
- """generates custom validator with array type accepting tuples"""
- array_checker = VALIDATOR.TYPE_CHECKER.redefine("array", _accepts_tuple)
- custom_validator = extend(VALIDATOR, type_checker=array_checker)
- validator = custom_validator(schema)
- return validator
-
-
-def validate_dict(sim_dict: dict) -> None:
- """makes sure a simulation dict is consistent with schema"""
- SCHEMA_VALIDATOR.is_valid(sim_dict)
-
-
-def generate_schema_docs(fname_schema: str, fname_readme: str = "SCHEMA.md") -> None:
- """make some docs, note this doesnt really work yet"""
- parser = jsonschema2md.Parser()
- with open(fname_schema, "r") as fp:
- md_lines = parser.parse_schema(json.load(fp))
- with open(fname_readme, "w") as fp:
- for line in md_lines:
- fp.write(md_lines)
-
-
-def write_schema(fname_schema: str = "schema.json") -> None:
- """saves simulation object schema to json"""
- schema_str = Simulation.schema_json(indent=2)
- with open(fname_schema, "w") as fp:
- fp.write(schema_str)
-
-
-# VALIDATOR = Draft3Validator
-# SCHEMA_PATH = "schema.json"
-# SCHEMA_DICT = load_json(SCHEMA_PATH)
-# SCHEMA_VALIDATOR = _create_validator(SCHEMA_DICT)
-
-if __name__ == "__main__":
- pass
- # write_schema(SCHEMA_PATH)
- # SCHEMA_DICT = load_json(SCHEMA_PATH)
- # SCHEMA_VALIDATOR = _create_validator(SCHEMA_DICT)
- # generate_schema_docs(SCHEMA_PATH)
diff --git a/explore/schema/schema_doc.css b/explore/schema/schema_doc.css
deleted file mode 100644
index 83897d896b..0000000000
--- a/explore/schema/schema_doc.css
+++ /dev/null
@@ -1,180 +0,0 @@
-body {
- font: 16px/1.5em "Overpass", "Open Sans", Helvetica, sans-serif;
- color: #333;
- font-weight: 300;
- padding: 40px;
-}
-
-.btn.btn-link {
- font-size: 18px;
-}
-
-.jsfh-animated-property {
- animation: eclair;
- animation-iteration-count: 1;
- animation-fill-mode: forwards;
- animation-duration: .75s;
-
-}
-
-@keyframes eclair {
- 0%,100% {
- transform: scale(1);
- }
- 50% {
- transform: scale(1.03);
- }
-}
-
-.btn.btn-primary {
- margin: 10px;
-}
-
-.btn.example-show.collapsed:before {
- content: "show"
-}
-
-.btn.example-show:before {
- content: "hide"
-}
-
-.description.collapse:not(.show) {
- max-height: 100px !important;
- overflow: hidden;
-
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
-}
-
-.description.collapsing {
- min-height: 100px !important;
-}
-
-.collapse-description-link.collapsed:after {
- content: '+ Read More';
-}
-
-.collapse-description-link:not(.collapsed):after {
- content: '- Read Less';
-}
-
-.badge {
- font-size: 100%;
- margin-bottom: 0.5rem;
- margin-top: 0.5rem;
-}
-
-.badge.value-type {
- font-size: 120%;
- margin-right: 5px;
- margin-bottom: 10px;
-}
-
-
-.badge.default-value {
- font-size: 120%;
- margin-left: 5px;
- margin-bottom: 10px;
-}
-
-.badge.restriction {
- display: inline-block;
-}
-
-.badge.required-property,.badge.deprecated-property,.badge.pattern-property,.badge.no-additional {
- font-size: 100%;
- margin-left: 10px;
-}
-
-.accordion div.card:only-child {
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.examples {
- padding: 1rem !important;
-}
-
-.examples pre {
- margin-bottom: 0;
-}
-
-.highlight.jumbotron {
- padding: 1rem !important;
-}
-
-.generated-by-footer {
- margin-top: 1em;
- text-align: right;
-}
-
-/* From https://github.com/richleland/pygments-css/blob/master/friendly.css, see https://github.com/trentm/python-markdown2/wiki/fenced-code-blocks */
-.highlight { background: #e9ecef; } /* Changed from #f0f0f0 in the original style to be the same as bootstrap's jumbotron */
-.highlight .hll { background-color: #ffffcc }
-.highlight .c { color: #60a0b0; font-style: italic } /* Comment */
-.highlight .err { border: 1px solid #FF0000 } /* Error */
-.highlight .k { color: #007020; font-weight: bold } /* Keyword */
-.highlight .o { color: #666666 } /* Operator */
-.highlight .ch { color: #60a0b0; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #007020 } /* Comment.Preproc */
-.highlight .cpf { color: #60a0b0; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
-.highlight .gd { color: #A00000 } /* Generic.Deleted */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
-.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #888888 } /* Generic.Output */
-.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0044DD } /* Generic.Traceback */
-.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #007020 } /* Keyword.Pseudo */
-.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #902000 } /* Keyword.Type */
-.highlight .m { color: #40a070 } /* Literal.Number */
-.highlight .s { color: #4070a0 } /* Literal.String */
-.highlight .na { color: #4070a0 } /* Name.Attribute */
-.highlight .nb { color: #007020 } /* Name.Builtin */
-.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
-.highlight .no { color: #60add5 } /* Name.Constant */
-.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
-.highlight .ne { color: #007020 } /* Name.Exception */
-.highlight .nf { color: #06287e } /* Name.Function */
-.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
-.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
-.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #bb60d5 } /* Name.Variable */
-.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
-.highlight .mb { color: #40a070 } /* Literal.Number.Bin */
-.highlight .mf { color: #40a070 } /* Literal.Number.Float */
-.highlight .mh { color: #40a070 } /* Literal.Number.Hex */
-.highlight .mi { color: #40a070 } /* Literal.Number.Integer */
-.highlight .mo { color: #40a070 } /* Literal.Number.Oct */
-.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
-.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
-.highlight .sc { color: #4070a0 } /* Literal.String.Char */
-.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
-.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
-.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
-.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
-.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
-.highlight .sx { color: #c65d09 } /* Literal.String.Other */
-.highlight .sr { color: #235388 } /* Literal.String.Regex */
-.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
-.highlight .ss { color: #517918 } /* Literal.String.Symbol */
-.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #06287e } /* Name.Function.Magic */
-.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
-.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
-.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
-.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
-.highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/explore/schema/schema_doc.html b/explore/schema/schema_doc.html
deleted file mode 100644
index 0b47fd3ac2..0000000000
--- a/explore/schema/schema_doc.html
+++ /dev/null
@@ -1 +0,0 @@
- Simulation Simulation
Type: object
Contains all information about simulation
No Additional Properties Type: array Each item of this array must be:
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: array Default: [0.0, 0.0, 0.0] Each item of this array must be:
Type: number Value must be strictly greater than 0
Type: array Each item of this array must be:
Type: number Value must be strictly greater than 0
Type: array of number Each item of this array must be:
Type: number Value must be strictly greater than 0
Type: number Value must be strictly greater than 0
Type: array of number Each item of this array must be:
Type: number Value must be strictly greater than 0
Type: number Value must be strictly greater than 0
Type: array of number Each item of this array must be:
Type: number Value must be strictly greater than 0
Default: {"frequency_range": [-1e+20, 1e+20], "permittivity": 1.0, "conductivity": 0.0} Type: object Dispersionless medium
No Additional Properties Type: array Default: [-1e+20, 1e+20] Each item of this array must be:
Type: number Default: 1.0 Type: number Default: 0.0 Type: number Default: 0.0 Value must be greater or equal to 0
Type: object Default: {} Each additional property must conform to the following schema
Type: object An object that interacts with the electromagnetic fields
No Additional Properties Type: object abstract base class, defines where something exists in space
Type: object Default: {} Each additional property must conform to the following schema
Type: object Volume Source with time dependence and polarization
No Additional Properties Type: array Each item of this array must be:
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: array Default: [0.0, 0.0, 0.0] Each item of this array must be:
Type: object Base class describing the time dependence of a source
No Additional Properties Type: number Default: 1.0 Value must be greater or equal to 0
Type: number Default: 0.0 Type: object Default: {} Each additional property must conform to the following schema
Type: object base class for monitors, which all have Box shape
No Additional Properties Type: array Each item of this array must be:
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: number Value must be greater or equal to 0
Type: array Default: [0.0, 0.0, 0.0] Each item of this array must be:
Type: array Default: [{"profile": "standard", "num_layers": 0}, {"profile": "standard", "num_layers": 0}, {"profile": "standard", "num_layers": 0}] Each item of this array must be:
Type: object single layer of a PML (profile and num layers)
No Additional Properties Type: enum (of string) Default: "standard" Must be one of:
- "standard"
- "stable"
- "absorber"
Type: integer Default: 0 Value must be greater or equal to 0
Type: array Default: [0, 0, 0] Each item of this array must be:
Type: number Default: 1e-05 Value must be greater or equal to 0
Type: number Default: 0.9 Value must be greater or equal to 0
Type: boolean Default: true
\ No newline at end of file
diff --git a/explore/schema/schema_doc.min.js b/explore/schema/schema_doc.min.js
deleted file mode 100644
index 0d9c7882d8..0000000000
--- a/explore/schema/schema_doc.min.js
+++ /dev/null
@@ -1 +0,0 @@
-function flashElement(t){myElement=document.getElementById(t),myElement.classList.add("jsfh-animated-property"),setTimeout(function(){myElement.classList.remove("jsfh-animated-property")},1e3)}function setAnchor(t){history.pushState({},"",t)}function anchorOnLoad(){let t=window.location.hash.split("?")[0].split("&")[0];"#"===t[0]&&(t=t.substr(1)),t.length>0&&anchorLink(t)}function anchorLink(t){$("#"+t).parents().addBack().filter(".collapse:not(.show), .tab-pane, [role='tab']").each(function(t){if($(this).hasClass("collapse"))$(this).collapse("show");else if($(this).hasClass("tab-pane")){const t=$("a[href='#"+$(this).attr("id")+"']");t&&t.tab("show")}else"tab"===$(this).attr("role")&&$(this).tab("show")}),setTimeout(function(){let e=document.getElementById(t);e&&(e.scrollIntoView({block:"center",behavior:"smooth"}),setTimeout(function(){flashElement(t)},500))},1e3)}$(document).on("click",'a[href^="#"]',function(t){t.preventDefault(),history.pushState({},"",this.href)});
\ No newline at end of file
diff --git a/explore/task.py b/explore/task.py
deleted file mode 100644
index 8a6e7ebf4b..0000000000
--- a/explore/task.py
+++ /dev/null
@@ -1,58 +0,0 @@
-""" Defnes information about a task """
-
-from enum import Enum
-from abc import ABC
-
-import pydantic
-
-from ..components.base import Tidy3dBaseModel
-
-
-class TaskStatus(Enum):
- """the statuses that the task can be in"""
-
- INIT = "initialized"
- QUEUE = "queued"
- PRE = "preprocessing"
- RUN = "running"
- POST = "postprocessing"
- SUCCESS = "success"
- ERROR = "error"
-
-
-class TaskBase(Tidy3dBaseModel, ABC):
- """base config for all task objects"""
-
-
-# type of the task_id
-TaskId = str
-
-
-class TaskInfo(TaskBase):
- """general information about task"""
-
- task_id: TaskId
- task_name: str
- status: TaskStatus
- size_bytes: int
- credits: pydantic.confloat(ge=0.0)
-
-
-class RunInfo(TaskBase):
- """information about the run"""
-
- perc_done: pydantic.confloat(ge=0.0, le=100.0)
- field_decay: pydantic.confloat(ge=0.0, le=1.0)
-
- def display(self):
- """print some info"""
- print(f" - {self.perc_done:.2f} (%) done")
- print(f" - {self.field_decay:.2e} field decay from max")
-
-
-class Task(TaskBase):
- """container for a task"""
-
- id: TaskId
- info: TaskInfo
- run_info: RunInfo = None
diff --git a/explore/tree.py b/explore/tree.py
deleted file mode 100644
index 99277192b3..0000000000
--- a/explore/tree.py
+++ /dev/null
@@ -1,55 +0,0 @@
-"""
-Demonstrates how to display a tree of files / directories with the Tree renderable.
-"""
-
-import os
-import pathlib
-import sys
-
-from rich import print
-from rich.filesize import decimal
-from rich.markup import escape
-from rich.text import Text
-from rich.tree import Tree
-
-
-def walk_directory(directory: pathlib.Path, tree: Tree) -> None:
- """Recursively build a Tree with directory contents."""
- # Sort dirs first then by filename
- paths = sorted(
- pathlib.Path(directory).iterdir(),
- key=lambda path: (path.is_file(), path.name.lower()),
- )
- for path in paths:
- # Remove hidden files
- if path.name.startswith("."):
- continue
- if path.is_dir():
- style = "dim" if path.name.startswith("__") else ""
- branch = tree.add(
- f"[bold magenta]:open_file_folder: [link file://{path}]{escape(path.name)}",
- style=style,
- guide_style=style,
- )
- walk_directory(path, branch)
- else:
- text_filename = Text(path.name, "green")
- text_filename.highlight_regex(r"\..*$", "bold red")
- text_filename.stylize(f"link file://{path}")
- file_size = path.stat().st_size
- text_filename.append(f" ({decimal(file_size)})", "blue")
- icon = "🐍 " if path.suffix == ".py" else "📄 "
- tree.add(Text(icon) + text_filename)
-
-
-try:
- directory = os.path.abspath(sys.argv[1])
-except IndexError:
- print("[b]Usage:[/] python tree.py ")
-else:
- tree = Tree(
- f":open_file_folder: [link file://{directory}]{directory}",
- guide_style="bold bright_blue",
- )
- walk_directory(pathlib.Path(directory), tree)
- print(tree)
diff --git a/explore/type_annotations.py b/explore/type_annotations.py
deleted file mode 100644
index e7f140c421..0000000000
--- a/explore/type_annotations.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# note: functions below are my attempt to automatically register subclasses distinct
-def register_subclasses(fields: tuple):
- """attempt at a decorator factory"""
- field_map = {field.__name__: field for field in fields}
-
- def _register_subclasses(cls):
- """attempt at a decorator"""
- orig_init = cls.__init__
-
- class _class:
- class_name: str
-
- def __init__(self, **kwargs):
- print(kwargs)
- class_name = type(self).__name__
- kwargs["class_name"] = class_name
- print(kwargs)
- orig_init(**kwargs)
-
- @classmethod
- def __get_validators__(cls):
- yield cls.validate
-
- @classmethod
- def validate(cls, v):
- if isinstance(v, dict):
- class_name = v.get("class_name")
- json_string = json.dumps(v)
- else:
- class_name = v.class_name
- json_string = v.json()
- cls_type = field_map[class_name]
- return cls_type.parse_raw(json_string)
-
- return _class
-
- return _register_subclasses
-
-
-from typing import Literal
-from pydantic.fields import ModelField
-
-
-def make_subclass_distinct(cls):
- def tag_subclass(**kwargs):
- name = "tag"
- value = cls.__name__
- annotation = Literal[value]
- tag_field = ModelField.infer(
- name=name,
- value=value,
- annotation=annotation,
- class_validators=None,
- config=cls.__config__,
- )
- cls.__fields__[name] = tag_field
- cls.__annotations__[name] = annotation
-
- cls.__init_subclass__ = tag_subclass
- return cls
diff --git a/explore/webapi.py b/explore/webapi.py
deleted file mode 100644
index 6f5be88bf5..0000000000
--- a/explore/webapi.py
+++ /dev/null
@@ -1,216 +0,0 @@
-""" Provides lowest level, user-facing interface to server """
-
-import os
-import sys
-import time
-from shutil import copyfile
-
-from rich.progress import track
-import numpy as np
-
-from .task import TaskId, Task, TaskInfo, RunInfo, TaskStatus
-from ..components.simulation import Simulation
-
-""" filesystem emulation for tests """
-
-SERVER_DIR = "tests/tmp/server"
-
-
-def server_path(fname):
- """gets path to fname in server dir"""
- return os.path.join(SERVER_DIR, fname)
-
-
-CLIENT_DIR = "tests/tmp/client"
-
-
-def client_path(fname):
- """gets path to fname in client dir"""
- return os.path.join(CLIENT_DIR, fname)
-
-
-def make_fake_task_id(num_letters=4):
- """constructs a fake task_id with `num_letters` letters"""
- alphabet = list("abcdefghijklmnopqrstuvwxyz")
- task_str_list = [np.random.choice(alphabet) for _ in range(num_letters)]
- task_str = "".join(task_str_list)
- return f"task_{task_str}"
-
-
-def make_fake_task() -> Task:
- """make a fake task"""
- task_id = make_fake_task_id()
- task_info = make_fake_info()
- return Task(id=task_id, info=task_info)
-
-
-def make_fake_info() -> TaskInfo:
- """make fake task info"""
- return TaskInfo(
- task_id=make_fake_task_id(),
- task_name=make_fake_task_id(),
- status=TaskStatus.INIT,
- size_bytes=1e4 * np.random.random(),
- credits=100 * np.random.random(),
- )
-
-
-def make_fake_run_info(task_id: TaskId) -> RunInfo:
- """make fake run info"""
- # print(task_id)
- return RunInfo(
- perc_done=100 * np.random.random(),
- field_decay=1 * np.random.random(),
- )
-
-
-# global variable maps TaskID -> Task
-TASKS = {}
-
-
-def get_task_by_id(task_id: TaskId) -> Task:
- """look up Task by task_id in TASKS"""
- task = TASKS.get(task_id)
- assert task is not None, f"task_id {task_id} not found"
- return task
-
-
-def _get_sim_path(task_id: TaskId):
- """get path to simulation file on server"""
- return server_path(f"sim_{task_id}.json")
-
-
-def _get_data_path_server(task_id: TaskId):
- """get path to data file on server"""
- return server_path(f"sim_{task_id}.hdf5")
-
-
-def _get_data_path_client(task_id: TaskId):
- """get path to data file on client"""
- return client_path(f"sim_{task_id}.hdf5")
-
-
-""" webapi functions """
-
-
-def upload(simulation: Simulation) -> TaskId:
- """upload simulation to server (as draft, dont run)."""
-
- # create the task
- task = make_fake_task()
- task.info.status = TaskStatus.INIT
- task_id = task.id
-
- # export simulation json
- sim_path = _get_sim_path(task_id)
- simulation.export(sim_path)
-
- # add task to 'server' and return id
- TASKS[task_id] = task
- return task_id
-
-
-def get_info(task_id: TaskId) -> TaskInfo:
- """get information about task (status, size, credits, etc)."""
- task = get_task_by_id(task_id)
- # call server
- return task.info
-
-
-def get_run_info(task_id: TaskId) -> RunInfo:
- """get information about running status of task"""
- # task = get_task_by_id(task_id)
- # call server
- return make_fake_run_info(task_id)
-
-
-def run(task_id: TaskId) -> None:
- """start running the task."""
- task = get_task_by_id(task_id)
-
- # load json file
- sim_path = _get_sim_path(task_id)
- sim_core = Simulation.load(sim_path)
-
- # import tidy3d core to emulate solve
- sys.path.append("../../")
- import tidy3d_core as tdcore # pylint: disable=import-outside-toplevel
-
- time.sleep(1)
-
- task.info.status = TaskStatus.QUEUE
- yield
- time.sleep(1)
-
- task.info.status = TaskStatus.PRE
- yield
-
- task.info.status = TaskStatus.RUN
- num_steps = 100
- for i in range(num_steps):
- task.run_info = RunInfo(
- perc_done=100 * (i + 1) / num_steps,
- field_decay=np.exp(-i / num_steps),
- )
- yield
- time.sleep(0.005)
-
- # get raw results in dict of dict of Numpy
- solver_data_dict = tdcore.solve(sim_core)
-
- # load these results as SimulationData server side if you want
- # sim_data_core = tdcore.load_solver_results(sim_core, solver_data_dict)
-
- # or, download these results to hdf5 file
- data_path = _get_data_path_server(task_id)
- tdcore.save_solver_results(data_path, sim_core, solver_data_dict)
-
- task.info.status = TaskStatus.POST
- task.run_info = None
- yield
- time.sleep(1)
-
- task.info.status = TaskStatus.SUCCESS
- yield
-
-
-MONITOR_MESSAGE = {
- TaskStatus.INIT: "task hasnt been run, start with `web.run(task)`",
- TaskStatus.SUCCESS: "task finished succesfully, download with `web.download(task, path)`",
- TaskStatus.ERROR: "task errored",
-}
-
-
-def monitor(task_id: TaskId) -> None:
- """monitor the task progress (% done, time step, total time step, field_decay)."""
-
- # emulate running the task
- task = get_task_by_id(task_id)
- return task
-
-
-def download(task_id: TaskId, path: str) -> None:
- """download results of simulation run to client side"""
-
- # load the file into SimulationData
- data_path_server = _get_data_path_server(task_id)
- copyfile(data_path_server, path)
-
-
-def _rm(path: str):
- if os.path.exists(path) and not os.path.isdir(path):
- os.remove(path)
-
-
-def delete(task_id: TaskId) -> None:
- """delete data associated with task_id from server"""
-
- # remove from server directories
- sim_path = _get_sim_path(task_id)
- data_path = _get_data_path_server(task_id)
- _rm(sim_path)
- _rm(data_path)
-
- # remove task from emulated server queue if still there
- if task_id in TASKS:
- TASKS.pop(task_id)
diff --git a/requirements.txt b/requirements.txt
index 3850dda8be..594b959788 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,26 +9,7 @@ shapely
descartes
pydantic
PyYAML
+boto3
# required to get xarray to not complain
dask
-
-# required for code quality checking
-black
-pylint
-
-# required for testing only
-pytest
-jupyter
-nbconvert
-
-# for docs only
-sphinx_rtd_theme
-nbsphinx
-ipython
-autodoc_pydantic
-sphinx-copybutton
-m2r2
-
-# required for web
-boto3
diff --git a/tests/requirements.txt b/tests/requirements.txt
new file mode 100644
index 0000000000..7a3834ee03
--- /dev/null
+++ b/tests/requirements.txt
@@ -0,0 +1,4 @@
+# required for development
+black
+pylint
+pytest
\ No newline at end of file