\ No newline at end of file
diff --git a/v2.6.0/_sources/api.rst.txt b/v2.6.0/_sources/api.rst.txt
new file mode 100644
index 00000000..419de938
--- /dev/null
+++ b/v2.6.0/_sources/api.rst.txt
@@ -0,0 +1,51 @@
+Happi API
+*********
+
+Client
+^^^^^^
+
+.. autoclass:: happi.Client
+ :members:
+
+
+.. autoclass:: happi.SearchResult
+ :members:
+
+
+Backends
+^^^^^^^^
+
+.. autoclass:: happi.backends.core._Backend
+ :members:
+
+.. autosummary::
+ :toctree: generated
+
+ happi.backends.mongo_db.MongoBackend
+ happi.backends.json_db.JSONBackend
+ happi.backends.qs_db.QSBackend
+
+
+Containers
+^^^^^^^^^^^
+
+Built-ins
++++++++++
+
+.. autoclass:: happi.HappiItem
+ :members:
+
+.. autoclass:: happi.OphydItem
+ :members:
+
+Loading
++++++++
+
+.. autofunction:: happi.from_container
+
+.. autofunction:: happi.load_devices
+
+Registry
+++++++++
+
+.. autoclass:: happi.containers.HappiRegistry
diff --git a/v2.6.0/_sources/cli.rst.txt b/v2.6.0/_sources/cli.rst.txt
new file mode 100644
index 00000000..4d1e053b
--- /dev/null
+++ b/v2.6.0/_sources/cli.rst.txt
@@ -0,0 +1,7 @@
+===================================
+Command Line Interface
+===================================
+
+.. click:: happi.cli:happi_cli
+ :prog: happi
+ :nested: full
diff --git a/v2.6.0/_sources/client.rst.txt b/v2.6.0/_sources/client.rst.txt
new file mode 100644
index 00000000..c199b9bb
--- /dev/null
+++ b/v2.6.0/_sources/client.rst.txt
@@ -0,0 +1,272 @@
+.. _client_label:
+
+Using the Client
+****************
+Users will interact with the database by using the :class:`happi.Client`, this
+will handle the authentication, and methods for adding, editing and removing
+items.
+
+Happi is incredibly flexible, allowing us to put arbitrary key-value pair
+information into the database. While this will make adding functionality easy in
+the future, it also means that any rules on the structure of the data we allow
+will need to be performed by the :class:`.Client` itself. To make this
+intuitive, the Client deals primarily with :ref:`containers`, which are objects
+that hold and specify these rules.
+
+.. _entry_code:
+
+Creating a New Entry
+^^^^^^^^^^^^^^^^^^^^
+A new item must be a subclass of the basic :class:`.HappiItem` container.
+While you are free to use the initialized object wherever you see fit, the client
+has a hook to create new items.
+
+Before we can create our first client, we need to create a backend for our item
+information to be stored.
+
+.. ipython:: python
+ :suppress:
+
+ rm -f doc_test.json
+
+.. ipython:: python
+
+ from happi.backends.json_db import JSONBackend
+
+ db = JSONBackend(path='doc_test.json', initialize=True)
+
+If you are connecting to an existing database you can pass the information
+directly into the :class:`.Client` itself at ``__init__``. See :ref:`db_choice`
+about how to configure your default backend choice.
+
+.. ipython:: python
+
+ from happi import Client, HappiItem
+
+ client = Client(path='doc_test.json')
+
+ item = client.create_item(
+ "HappiItem",
+ name="my_device",
+ device_class="types.SimpleNamespace",
+ args=[],
+ kwargs={},
+ position=345.5, # <- this is an extra field which happi allows
+ )
+
+ item
+
+ item.save()
+
+For this example, we have added an "extraneous" field to the item called
+"position". This is something that happi allows for. If you wish to make
+this a recognized field of an eforced type (e.g., don't allow the user to
+make position a string value instead of a floating point value), please
+see the documentation on making your own container class.
+
+Alternatively, you can create the item separately and add it explicitly using
+:meth:`.HappiItem.save`
+
+.. ipython:: python
+
+ item = HappiItem(
+ name="my_device2",
+ device_class="types.SimpleNamespace",
+ position=355.5, # <- this is an extra field which happi allows
+ )
+
+ item
+
+ client.add_item(item)
+
+The main advantage of the first method is that all of the container classes are
+already managed by the client so they can be easily accessed with a string.
+Keep in mind, that either way, all of the mandatory information needs to be
+given to the item before it can be loaded into the database.
+
+Searching the Database
+^^^^^^^^^^^^^^^^^^^^^^
+There are several ways to load information from the database
+:meth:`.Client.find_item`, :meth:`.Client.search`, and dictionary-like access.
+
+:meth:`.Client.find_item` is intended to only load one item at at a time. Both
+accept criteria in the from of keyword-value pairs to find the item or items
+you desire.
+
+You can quickly query the client by item name and get a ``SearchResult`` that
+can be used to introspect metadata or even instantiate the corresponding item
+instance.
+
+.. ipython:: python
+
+ result = client["my_device"]
+
+The client acts as a Python mapping, so you may inspect it as you would a
+dictionary. For example:
+
+.. ipython:: python
+
+ # All of the item names:
+ list(client.keys())
+ # All of the database entries as SearchResults:
+ list(client.values())
+ # Pairs of (name, SearchResult):
+ list(client.items())
+
+
+You could, for example, grab the first key by name and access it using
+``__getitem__``:
+
+.. ipython:: python
+
+ key_0 = list(client)[0]
+ key_0
+ client[key_0]
+
+Or see how many entries are in the database:
+
+.. ipython:: python
+
+ len(client)
+
+Here's a search that gets all the items of type generic ``HappiItem``:
+
+.. ipython:: python
+
+ results = client.search(type="HappiItem")
+
+
+Working with the SearchResult
+"""""""""""""""""""""""""""""
+
+Representing a single search result from ``Client.search`` and its variants, a
+:class:`SearchResult` can be used in multiple ways.
+
+This result can be keyed for metadata as in:
+
+.. ipython:: python
+
+ result = results[0]
+ result['name']
+
+
+The :class:`HappiItem` can be readily retrieved:
+
+
+.. ipython:: python
+
+ result.item
+ type(result.item)
+
+
+Or the object may be instantiated:
+
+.. ipython:: python
+
+ result.get()
+
+
+See that :meth:`.SearchResult.get` returns the class we expect, based on the
+`device_class`.
+
+.. ipython:: python
+
+ result['device_class']
+ type(result.get())
+
+There are also some more advance methods to search specific areas of the
+beamline or use programmer-friendly regular expressions, described in the
+upcoming sections.
+
+
+Searching for items on a beamline
+"""""""""""""""""""""""""""""""""
+
+To search for items on a beamline such as 'MFX', one would use the following:
+
+
+.. ipython:: python
+
+ client.search(type='HappiItem', beamline='MFX')
+
+
+Searching a range
+"""""""""""""""""
+
+In this example, we have added an extraneous field ``position`` that is not
+present normally in the ``HappiItem`` container.
+
+We can search a range of values with any arbitrary key using
+:meth:`.Client.search_range`. For example:
+
+.. ipython:: python
+
+ client.search_range("position", start=314.4, end=348.6)
+
+This would return all items between positions 314.4 and 348.6.
+
+Any numeric key can be filtered in the same way, replacing ``'position'`` with
+the key name.
+
+Searching with regular expressions
+""""""""""""""""""""""""""""""""""
+
+Any key can use a regular expression for searching by using :meth:`.Client.search_regex`
+
+.. ipython:: python
+
+ client.search_regex(name='my_device[2345]')
+
+
+Editing Item Information
+^^^^^^^^^^^^^^^^^^^^^^^^
+The workflow for editing an item looks very similar to the code within
+:ref:`entry_code`, but instead of instantiating the item you use either
+:meth:`.Client.find_item` or :meth:`.Client.search`. When the item is retrieved
+this way the class method :meth:`.HappiItem.save` is overwritten, simply call
+this when you are done editing.
+
+.. ipython:: python
+
+ my_motor = client.find_item(name="my_device")
+
+ my_motor.position = 425.4
+
+ my_motor.save()
+
+.. note::
+
+ Because the database uses the ``name`` key as an item's identification you
+ can not edit this information in the same way. Instead you must explicitly
+ remove the item and then use :meth:`.Client.add_item` to create a new
+ entry.
+
+Finally, lets clean up our example objects by using
+:meth:`.Client.remove_item` to clean them from the database
+
+.. ipython:: python
+
+ item_1 = client.find_item(name='my_device')
+
+ item_2 = client.find_item(name='my_device2')
+
+ for item in (item_1, item_2):
+ client.remove_item(item)
+
+.. _db_choice:
+
+Selecting a Backend
+^^^^^^^^^^^^^^^^^^^
+Happi supports both JSON and MongoDB backends. You can always import your
+chosen backend directly, but in order to save time you can create an
+environment variable ``HAPPI_BACKEND`` and set this to ``"mongodb"``. This well
+tell the library to assume you want to use the :class:`.MongoBackend`.
+Otherwise, the library uses the :class:`.JSONBackend`.
+
+..
+ Remove test file created by initializing a JSONBackend above
+
+.. ipython:: python
+ :suppress:
+
+ rm -f doc_test.json
diff --git a/v2.6.0/_sources/containers.rst.txt b/v2.6.0/_sources/containers.rst.txt
new file mode 100644
index 00000000..8bc2885d
--- /dev/null
+++ b/v2.6.0/_sources/containers.rst.txt
@@ -0,0 +1,312 @@
+.. _containers:
+
+Containers
+**********
+
+In order to regulate and template the information that gets entered into the
+Happi database, we use the concept of containers. Containers serve two primary
+roles:
+
+* Identifying how to instantiate the object it represents (by way of class
+ name, arguments, and keyword arguments).
+* Storing pertinent and structured metadata for the given instance.
+
+Containers are created by instantiating the :class:`.HappiItem` class or a
+subclass of it. The metadata associated with the instance is broken up into
+fields or "entries" of type :class:`.EntryInfo`. This allows a developer to
+specify fields that are essential to every instance of a specific container
+type.
+
+EntryInfo
+^^^^^^^^^
+
+These fields are specified using an instance of :class:`.EntryInfo`. This class
+provides several primary features:
+
+* Mark a field as required (or optional)
+* Add default values when unspecified
+* Enforce - or validate - a certain format for the field
+
+.. autoclass:: happi.EntryInfo
+ :members:
+
+HappiItem
+^^^^^^^^^
+
+In order to ensure that information is entered into the database in an
+organized fashion, the client will only accept classes that inherit from
+:class:`.HappiItem`. Each item will have the key information represented as
+class attributes, available to be manipulated like any other regular property
+
+Editing the information for a container is a simple as:
+
+.. ipython:: python
+
+ from happi import HappiItem
+
+ item = HappiItem(name='my_device')
+
+ item.name = 'new_name'
+
+
+.. note::
+
+ :class:`happi.Device` class is **deprecated** due to ambiguous name,
+ conflicting with :class:`ophyd.Device`.
+ :class:`happi.HappiItem` should be used instead.
+
+
+Example Container
+^^^^^^^^^^^^^^^^^
+
+In order to show the flexibility of the :class:`.EntryInfo` class, we'll put
+together a new example container. The class can be invoked in the same way you
+would usually handle class inheritance, the only difference is that you specify
+class attributes as EntryInfo objects:
+
+.. ipython:: python
+
+ import re
+ from happi import HappiItem, EntryInfo
+
+ class MyItem(HappiItem):
+ """My new item, with a known model number."""
+ model_no = EntryInfo('Model Number of Item', optional=False)
+ count = EntryInfo('Count of Item', enforce=int, default=0)
+ choices = EntryInfo('Choice Info', enforce=['a','b','c'])
+ no_whitespace = EntryInfo('Enforce no whitespace',
+ enforce = re.compile(r'[\S]*$'),
+ enforce_doc = 'This item cannot have whitespace')
+
+By default, :class:`.EntryInfo` will create an optional init keyword argument with a
+default of ``None`` with the same name as the class attribute. A quick way
+to see how this information will be put into the the database is taking a look
+at ``dict(item)``:
+
+.. ipython:: python
+
+ item = MyItem(name="my_item", model_no="QABC1234")
+ dict(item)
+
+As shown in the example above, using the EntryInfo keywords, you can put a
+short docstring to give a better explanation of the field, and also enforce
+that user enter a specific format of information.
+
+While the user will always be able to enter ``None`` for the attribute, if a
+real value is given it will be checked against the specified ``enforce``
+keyword, raising ``ValueError`` if invalid. Here is a table for how the
+:class:`.EntryInfo` check the type
+
+======== ===========================
+Enforce Method of enforcement
+======== ===========================
+None Any value will work
+type type(value)
+list list.index(value)
+regex regex.match(value) != None
+function function(value)
+======== ===========================
+
+If your enforce condition is complicated or obfuscated, you can add a
+docstring using the ``enforce_doc`` keyword that explains the rule.
+(This may be helpful for regex matches which are difficult for humans
+to read)
+
+Fields that are important to the item can be marked as mandatory with
+``optional=False`` and should have no default value.
+
+When entering information you will not necessarily see a difference between
+optional and mandatory :class:`.EntryInfo`, however the database client will
+reject the item if these fields do not have the requisite values set.
+
+Loading your Object
+^^^^^^^^^^^^^^^^^^^
+
+A container's primary role is containing the information necessary to load the
+Python representation of an object.
+
+Internally, happi keeps track of all containers by way of its registry, the
+:class:`~happi.containers.HappiRegistry`.
+
+This information is stored as a ``device_class``, ``args`` and ``kwargs``. The
+former stores a string that indicates the Python class of the item, the other
+two indicate the information that is needed to instantiate it. With this
+information both :func:`.from_container` and :func:`.load_device` are able to
+handle importing modules and instantiating your object.
+
+.. note::
+
+ happi will attach the original metadata with a fixed attribute name ``.md``
+ to your object. You can use this to keep track of the container metadata
+ used to instantiate your object.
+
+ This can be disabled by setting ``attach_md`` to ``False`` in
+ :func:`.from_container`.
+
+Often, information contained in the ``args`` or ``kwargs`` will be duplicated
+in other parts of the container. For instance, most ``ophyd`` objects will want
+a ``name`` and ``prefix`` on initialization. Instead of repeating that
+information you can just use a template and have the information automatically
+populated for you by the container itself. For instance, in the aforementioned
+example, ``container.args = ["{{name}}"]`` would substitute the value of
+``container.name`` in as an argument. If the template contains the substituted
+attribute alone, the type will also be converted.
+
+.. ipython:: python
+
+ from happi import from_container
+
+ container = MyItem(name="my_item", model_no="QABC1234",
+ device_class='ophyd.sim.SynSignal',
+ kwargs={'name': '{{name}}'})
+ obj = from_container(container, attach_md=True)
+ obj
+
+
+Integrating with your package
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Happi provides some containers for your convenience, but intentionally does
+not support all use cases or control systems in a monolithic fashion.
+
+The suggested method for supporting your new package would be to make your
+package have a dependency on happi, of course, and subclass :class:`.HappiItem`
+to make a new container in your own package.
+
+Then, add an
+`entry point `_
+specified by the **happi.containers** keyword to your package's ``pyproject.toml``.
+Example entry points can be found `here
+`_.
+
+:class:`~happi.containers.HappiRegistry` takes care of loading the entry points
+and making them available throughout the library.
+
+
+.. _convention_label:
+
+Built-in Container Conventions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In order for the database to be as easy to parse as possible we need to
+establish conventions on how information is entered. Please read through this
+before entering any information into the database.
+
+
+HappiItem Entries
++++++++++++++++++
+
+These are fields that are common to all Happi items.
+
+ **name**
+
+ This is simply a short name we can use to refer to the item.
+
+
+ **device_class**
+
+ This is the full class name, which lets happi know how to instantiate your
+ item.
+
+ The ``device_class`` name remains for backward-compatibility reasons. Thinking
+ of it as ``class_name`` or ``creator_callable`` would be more apt.
+
+ .. note::
+
+ This may also be the name of a factory function - happi only cares that
+ it's callable.
+
+ **args**
+
+ Argument list to be passed on instantiation. May contain templated macros such
+ as ``{{name}}``.
+
+ **kwargs**
+
+ Keyword argument dictionary to be passed on instantiation. May contain
+ templated macros such as ``{{name}}``.
+
+ **active**
+
+ Is the object actively deployed?
+
+ **documentation**
+
+ A brief set of information about the object.
+
+
+OphydItem entries
++++++++++++++++++
+
+`ophyd `_ has first-class support in happi - but
+not much is required on top of the base HappiItem to support it.
+
+ **prefix**
+
+ This should be the prefix for all of the PVs contained within the device. It
+ does not matter if this is an invalid record by itself.
+
+LCLSItem entries
+++++++++++++++++
+
+This class is now part of `pcdsdevices
+`_. It remains documented here as
+PCDS is the original developer and primary user of happi as of the time of
+writing. If you intend to use the same metadata that we do, please copy and
+repurpose the ``LCLSItem`` class.
+
+ **beamline**
+
+ Beamline is required. While it is expected to be one of the following, it
+ is not enforced::
+
+ CXI
+ HXD
+ ICL
+ KFE
+ LFE
+ MEC
+ MFX
+ PBT
+ RIX
+ TMO
+ TXI
+ XCS
+ XPP
+
+
+ **z**
+
+ Position of the device on the z-axis in the LCLS coordinates.
+
+ **location_group**
+
+ The group of this device in terms of its location. This is primarily
+ used for LUCID's grid.
+
+ **functional_group**
+
+ The group of this device in terms of its function. This is primarily
+ used for LUCID's grid.
+
+ **stand**
+
+ Acronym for stand, must be three alphanumeric characters like an LCLSI stand
+ (e.g. DG3) or follow the LCLSII stand naming convention (e.g. L0S04).
+
+ **lightpath**
+
+ If the device should be included in the LCLS `Lightpath
+ `_.
+
+ **embedded_screen**
+
+ Path to an embeddable PyDM control screen for this device.
+
+ **detailed_screen**
+
+ Path to a detailed PyDM control screen for this device.
+
+ **engineering_screen**
+
+ Path to a detailed engineering PyDM control screen for this device.
diff --git a/v2.6.0/_sources/generated/happi.backends.json_db.JSONBackend.rst.txt b/v2.6.0/_sources/generated/happi.backends.json_db.JSONBackend.rst.txt
new file mode 100644
index 00000000..0a8591d5
--- /dev/null
+++ b/v2.6.0/_sources/generated/happi.backends.json_db.JSONBackend.rst.txt
@@ -0,0 +1,38 @@
+happi.backends.json\_db.JSONBackend
+===================================
+
+.. currentmodule:: happi.backends.json_db
+
+.. autoclass:: JSONBackend
+
+
+ .. automethod:: __init__
+
+
+ .. rubric:: Methods
+
+ .. autosummary::
+
+ ~JSONBackend.__init__
+ ~JSONBackend.clear_cache
+ ~JSONBackend.delete
+ ~JSONBackend.find
+ ~JSONBackend.find_range
+ ~JSONBackend.find_regex
+ ~JSONBackend.get_by_id
+ ~JSONBackend.initialize
+ ~JSONBackend.load
+ ~JSONBackend.save
+ ~JSONBackend.store
+
+
+
+
+
+ .. rubric:: Attributes
+
+ .. autosummary::
+
+ ~JSONBackend.all_items
+
+
\ No newline at end of file
diff --git a/v2.6.0/_sources/generated/happi.backends.mongo_db.MongoBackend.rst.txt b/v2.6.0/_sources/generated/happi.backends.mongo_db.MongoBackend.rst.txt
new file mode 100644
index 00000000..983eda3d
--- /dev/null
+++ b/v2.6.0/_sources/generated/happi.backends.mongo_db.MongoBackend.rst.txt
@@ -0,0 +1,35 @@
+happi.backends.mongo\_db.MongoBackend
+=====================================
+
+.. currentmodule:: happi.backends.mongo_db
+
+.. autoclass:: MongoBackend
+
+
+ .. automethod:: __init__
+
+
+ .. rubric:: Methods
+
+ .. autosummary::
+
+ ~MongoBackend.__init__
+ ~MongoBackend.clear_cache
+ ~MongoBackend.delete
+ ~MongoBackend.find
+ ~MongoBackend.find_range
+ ~MongoBackend.find_regex
+ ~MongoBackend.get_by_id
+ ~MongoBackend.save
+
+
+
+
+
+ .. rubric:: Attributes
+
+ .. autosummary::
+
+ ~MongoBackend.all_items
+
+
\ No newline at end of file
diff --git a/v2.6.0/_sources/generated/happi.backends.qs_db.QSBackend.rst.txt b/v2.6.0/_sources/generated/happi.backends.qs_db.QSBackend.rst.txt
new file mode 100644
index 00000000..5babcbc1
--- /dev/null
+++ b/v2.6.0/_sources/generated/happi.backends.qs_db.QSBackend.rst.txt
@@ -0,0 +1,39 @@
+happi.backends.qs\_db.QSBackend
+===============================
+
+.. currentmodule:: happi.backends.qs_db
+
+.. autoclass:: QSBackend
+
+
+ .. automethod:: __init__
+
+
+ .. rubric:: Methods
+
+ .. autosummary::
+
+ ~QSBackend.__init__
+ ~QSBackend.clear_cache
+ ~QSBackend.delete
+ ~QSBackend.find
+ ~QSBackend.find_range
+ ~QSBackend.find_regex
+ ~QSBackend.get_by_id
+ ~QSBackend.initialize
+ ~QSBackend.load
+ ~QSBackend.save
+ ~QSBackend.store
+
+
+
+
+
+ .. rubric:: Attributes
+
+ .. autosummary::
+
+ ~QSBackend.all_items
+ ~QSBackend.translations
+
+
\ No newline at end of file
diff --git a/v2.6.0/_sources/index.rst.txt b/v2.6.0/_sources/index.rst.txt
new file mode 100644
index 00000000..beae100e
--- /dev/null
+++ b/v2.6.0/_sources/index.rst.txt
@@ -0,0 +1,54 @@
+HAPPI - Heuristic Access to Positions of Photon Instruments
+===========================================================
+
+Background
+^^^^^^^^^^
+
+Happi is a database-backed library that was originally created to hold
+information about devices along SLAC's Linac Coherent Light Source beamline.
+Though initially purpose-built, happi provides a framework for general indexing
+of devices or *things* that correspond to Python objects.
+
+Happi will help you create and index your objects, search through them, and
+provide relevant metadata based on the object type.
+
+Terminology Summary
+^^^^^^^^^^^^^^^^^^^
+
+* The happi client communicates with pre-configured database using an internal
+ "backend". Supported backends include JSON (with a file on disk) and MongoDB
+ currently.
+* A ``HappiItem`` container class describes metadata about a Python object and
+ information on how to instantiate it.
+* ``HappiItem`` may be customized for your own purposes through subclassing.
+* Container classes have entries - marked by ``EntryInfo`` instances - that
+ define the top-level keys and values of the item.
+* The basic ``HappiItem`` has entries that tell happi how to import and
+ instantiate a specific Python object. The fields required for this are
+ ``device_class``, ``args``, and ``kwargs``. In short, the effect of loading
+ this device would be to ``import device_class`` and instantiate it by way of
+ ``device_class(*args, **kwargs)``.
+* This resulting object is also referred to as a ``Device``, borrowing the name
+ from the library ophyd.
+
+
+ .. toctree::
+ :maxdepth: 3
+ :caption: Usage
+
+ containers.rst
+ client.rst
+ cli.rst
+
+.. toctree::
+ :maxdepth: 3
+ :caption: API Documentation
+
+ api.rst
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Information
+
+ releases.rst
+ upcoming_changes.rst
diff --git a/v2.6.0/_sources/releases.rst.txt b/v2.6.0/_sources/releases.rst.txt
new file mode 100644
index 00000000..624c0111
--- /dev/null
+++ b/v2.6.0/_sources/releases.rst.txt
@@ -0,0 +1,876 @@
+Release History
+###############
+
+
+v2.6.0 (2024-12-19)
+===================
+
+Features
+--------
+- Updated `happi load` to support searching and loading in one user-friendly expression. The load function now gathers the results of each search term individually and loads the union of the results.
+
+Maintenance
+-----------
+- Make running happi repair only saves an item if it actually got changed during the repair process
+- Fixes issue in test suite, making tst_base_pim2 a loadable SimpleNamespacce
+- Add example .cfg and some more instructions on using happi cli
+- Make pre-release notes script default to just using vi if EDITOR env var is not set.
+- Fix a few dead links in the docs, add to contributing doc to make 1st time dev instructions bit more clear
+
+Contributors
+------------
+- janeliu-slac
+- nstelter-slac
+- tangkong
+
+
+
+v2.5.0 (2023-12-19)
+===================
+
+Features
+--------
+- Adds more user-friendly qt search widget
+
+Bugfixes
+--------
+- Fixes audit output table, preventing names from being dropped
+
+Maintenance
+-----------
+- Adjusts cli audit output to work better for file redirects
+- Fix conda recipe to use "run_constrained" not "run-constrained"
+
+Contributors
+------------
+- tangkong
+- klauer
+
+
+
+v2.4.0 (2023-09-27)
+===================
+
+Features
+--------
+- Added ``happi.audit.audit()`` which can be used to programmatically audit
+ happi items.
+
+Bugfixes
+--------
+- Fixes bug where `happi transfer` was not filling default values properly
+- Fixes conftest.trim_split_output, which was effectively a no-op. Touches up affected tests
+- Issue 302: Add functionality to happi 'repair' that ensures that the name and id fields of a device are the same.
+- Removes an extra pcdsutils import from test_cli.py that is not properly caught by error handling
+
+Maintenance
+-----------
+- Adds error handling for the temporary file created when initializing a json backend object.
+- Changes format of temporary file name generation to contain only a unique hash.
+- Tests modified to no longer assert stdout matches expected strings. Rather the effect of the
+ command being tested is verified independently. The `assert_match_expected` helper is still
+ used, but will now print mismatches instead of asserting them.
+- Allows `happi update` to handle json-backend-type payloads
+- Adds pcdsutils and pcdsdevices to environment requirements in conda recipe and dev requirements
+- Removes pcdsutils and pcdsdevices from extra testing requirements in github workflow
+- The ``happi audit`` CLI entrypoint has been modified to use
+ ``happi.audit.audit()``.
+- Updates mongo backend to handle authSource, require connection information (host, user, etc)
+- Documents bson dependency. Bson is vendored by pymongo, which instructs
+ users to not install bson from pypi (`pymongo readme `)
+
+Contributors
+------------
+- klauer
+- laura-king
+- tangkong
+
+
+
+v2.3.0 (2023-06-30)
+===================
+
+Features
+--------
+- CLI command ``happi config edit`` - open config file in ``$EDITOR``
+- CLI command ``happi config init`` - create new config file with default options
+- CLI command ``happi config show`` - show location & contents of config file
+- Extend the config searching mechanism to check the platformdirs config directory.
+ The happi config file path is taken from the ``HAPPI_CFG`` environment variable,
+ but if the variable is not set then the following locations are searched in order
+ for files named ``.happi.cfg`` or ``happi.cfg``:
+
+ - The location specified by the ``XDG_CONFIG_HOME`` environment variable
+ - ``~/.config``
+ - (**new**) The location specified by ``platformdirs.user_config_dir("happi")``
+
+Maintenance
+-----------
+- Add dependency on `platformdirs `_.
+- Update build requirements to use pip-provided extras for documentation and test builds
+
+Contributors
+------------
+- tangkong
+- untzag
+
+
+
+v2.2.0 (2023-05-08)
+===================
+
+Features
+--------
+- Adds a hook in ``happi.loader.from_container`` that runs the method
+ ``post_happi_md`` on an instantiated object after the metadata
+ container has been attached.
+ This allows a clear method for objects to interact with
+ happi metadata if desired.
+
+Maintenance
+-----------
+- Makes ``HappiDeviceTreeView`` more tolerant of items with missing metadata keys.
+ Items missing the key used to group the tree view will be organized
+ into a catch-all "[KEY NOT FOUND]" group.
+
+Contributors
+------------
+- tangkong
+
+
+
+v2.1.0 (2023-04-03)
+===================
+
+Features
+--------
+- Adds ``happi repair`` command, for synchronizing backend database with fields expected by container.
+ Adds a corresponding audit function.
+- Adds audit functions that check the connection status of all signals in an
+ ophyd device (``check_wait_connection``) and verify any fields requested by
+ args/kwargs exist in the database (``check_args_kwargs_match``).
+- Adds ``happi audit -d/--details`` option to print the source of a requested
+ audit function.
+- Adds the ``happi delete`` CLI tool for deleting entries from the happi database.
+
+Bugfixes
+--------
+- Fix an issue where an ill-timed interrupt of the json backend's
+ ``store`` operation could truncate the data file. This also removes
+ the implicit/optional dependency on ``fcntl``.
+
+Maintenance
+-----------
+- Migrates from Travis CI to GitHub Actions for continuous integration testing, and documentation deployment.
+- Updates happi to use setuptools-scm, replacing versioneer, as its version-string management tool of choice.
+- Syntax has been updated to Python 3.9+ via ``pyupgrade``.
+- happi has migrated to modern ``pyproject.toml``, replacing ``setup.py``.
+- Sphinx 6.0 now supported for documentation building.
+
+Contributors
+------------
+- tangkong
+- zllentz
+
+
+
+v2.0.0 (2022-10-20)
+===================
+
+API Changes
+-----------
+- Removed deprecated ``happi.containers.Device`` container.
+- Removed deprecated methods:
+ * ``happi.Client.create_device``
+ * ``happi.Client.add_device``
+ * ``happi.Client.find_device``
+ * ``happi.Client.all_devices``
+ * ``happi.Client.remove_device``
+ * ``happi.SearchResult.device``
+
+Features
+--------
+- Added ``EntryInfo`` keyword argument ``include_default_as_kwarg``. If set to ``False``,
+ any keys that are included in an item's ``kwargs`` that match the default of their
+ corresponding ``EntryInfo`` will be omitted from the keyword arguments passed to
+ ``device_class`` when instantiating (loading) the item as in ``happi.loader.load_device`` or
+ ``SearchResult.get()``.
+ If the ``kwargs`` EntryInfo sets ``include_default_as_kwarg = True``,
+ the setting on the corresponding ``EntryInfo`` will be used to decide
+ whether or not to omit a keyword argument.
+ If the ``kwargs`` EntryInfo sets ``include_default_as_kwarg = False``,
+ the setting on corresponding ``EntryInfo`` will be ignored.
+ The default value is True on all EntryInfo instances, retaining the original behavior.
+- For happi load, fall back to Python REPL if IPython is not available.
+- Added MultiBackend, which allows a happi Client to serve information
+ from multiple databases simultaneously. Updates config parsing logic
+ to match.
+- Added ``happi audit`` function for running checks on happi database items.
+- Restored --json option for ``happi search``.
+
+Bugfixes
+--------
+- Removed extraneous extraneous print in ``happi load``.
+- Calculate a max width for shown tables based on the current terminal size
+ to prevent bad line wrapping.
+
+Maintenance
+-----------
+- Prevent ophyd / pyepics teardown during test suite.
+- Improved error logging in happi CLI to be more consistent.
+
+Contributors
+------------
+- JJL772
+- klauer
+- tangkong
+
+
+
+v1.14.0 (2022-07-06)
+====================
+
+API Changes
+-----------
+- Added ``happi.Client.create_item`` and deprecated
+ ``happi.Client.create_device``.
+- Added ``happi.Client.add_item`` and deprecated ``happi.Client.add_device``.
+- Added ``happi.Client.find_item`` and deprecated ``happi.Client.find_device``.
+- Added ``happi.Client.all_items`` and deprecated ``happi.Client.all_devices``.
+- Added ``happi.Client.remove_item`` and deprecated
+ ``happi.Client.remove_device``.
+- Deprecated ``happi.SearchResult.device`` and above deprecated items are now
+ scheduled for removal in the next major happi release.
+- Internal backend API ``all_devices`` has been changed to ``all_items``.
+- Added ``happi.Client.retain_cache_context`` for clients that desire to
+ control when reloading the database from a happi backend happens.
+- Backend implementations may now optionally support a caching mechanism with
+ ``clear_cache`` being called externally by the client when desirable.
+- The happi container registry now supports adding new container classes
+ manually by way of
+ ``happi.containers.registry["ContainerName"] = ContainerClass``.
+
+Features
+--------
+- Significant performance increase for JSON-backed happi clients.
+- Makes ``SearchResult`` hashable
+- Uses hashable ``SearchResult`` in happi search cli command
+- JSON database paths may now be relative to the configuration file.
+- Added ``happi benchmark`` for identifying which items are slow to load.
+- Added ``happi profile`` for identifying why particular items are slow to load.
+
+Bugfixes
+--------
+- Fix a rare race condition related to reading a json device database
+ twice in a command line search command between database updates.
+- Issue where happi Client would repeatedly (and unnecessarily) make database
+ backend calls has been fixed.
+- Allow int search values to match their float counterparts
+- The happi container registry is loaded at first use and not on import. This
+ can result in increased performance where the happi database is not used.
+ It also fixes a scenario in which a module that defines a happi container
+ attempts to import certain classes from happi.
+
+Maintenance
+-----------
+- Old terminology for ``HappiItem`` instances has been scrubbed and clarified
+ in documentation.
+- Test suite and documentation has been updated to reflect trajectory of
+ deprecated methods and naming.
+- Added relaxed flake8 configuration.
+- Remove happi.device.Device from tests to avoid deprecation warnings
+- Add type annotations to test suite
+- Clean up fixture usage and separate ``three_valves`` fixture into ``three_valves`` and ``client_with_three_valves``
+- add pre-release notes scripts
+- More documentation about the happi container registry was added.
+- Refactored CLI slightly to re-use searching logic.
+
+Contributors
+------------
+- JJL772
+- klauer
+- tangkong
+- zllentz
+
+
+v1.13.0 (2022-06-03)
+====================
+
+Features
+--------
+- Added the ``enforce_doc`` argument to ``EntryInfo``. This lets us explain
+ what the entry info represents and how it is meant to be filled out
+ in more explicit words when it would be helpful to do.
+- Added methods to client and cli entry points for changing the container
+ of a happi item. This will walk the user through the process of
+ switching to or between custom containers while making sure we adhere
+ to the defined ``EntryInfo``. Check out ``happi transfer --help`` for
+ command-line usage or ``Client.change_container`` for library usage.
+- Added the option to pick between glob and regex searching from the CLI,
+ rather than only allowing glob as in the past.
+ Give ``happi search --regex`` a try and check out ``happi search --help``
+ for more information.
+
+Fixes
+-----
+- Fixed an issue where it was previously impossible to input dictionary
+ and list fields using the CLI.
+- Fixed handling of numeric values in ``happi search``.
+- Fixed range searching logic for multiple range searches in one query.
+- Fixed the ambiguity between a search returning no results (exit code 0)
+ and a search being malformed (exit code 1).
+
+Maintenance
+-----------
+- Refactored the CLI to use ``click`` instead of bare ``argparse``.
+ This implementation is much cleaner and will lead to more advanced
+ CLI features in the future.
+- ``psdm_qs_cli`` and ``pymongo`` are no longer required dependencies of
+ ``happi``. These have been reclassified into the ``run_constrained``
+ portion of the conda recipe bundled in this repository and will also
+ be adjusted on conda-forge.
+- Improved usage and cleanup of temporary files when running the happi
+ test suite.
+- Restored the automatic documention uploads.
+- Added/modified test cases to better cover search behavior.
+
+Contributors
+------------
+- tangkong
+
+
+v1.12.0 (2022-03-31)
+====================
+
+Features
+--------
+- Add optional per-device load timers to help identify slow-loading devices.
+
+Fixes
+-----
+- Fixed an issue where missing keys could cause a find match to fail.
+- Switch on-import fcntl warning to debug to reduce spam.
+
+Contributors
+------------
+- klauer
+
+
+v1.11.0 (2022-02-07)
+====================
+
+Features
+--------
+- Add ``--names`` flag to the ``happi search`` command. This causes the
+ search to output only the names of the matching devices. This is useful
+ for using the output of ``happi search`` inside another ``happi`` command,
+ for example: ``happi load $(happi search "*" --names)``.
+
+Contributors
+------------
+- unztag
+
+
+v1.10.1 (2021-11-15)
+====================
+
+Bugfixes
+--------
+- Fix a logging format error in ``Client.from_config``
+
+Contributors
+------------
+- klauer
+
+
+v1.10.0 (2021-09-27)
+====================
+
+Features
+--------
+- Add ``happi container-registry`` command-line utility. This shows the user
+ which ``happi`` containers are registered and available in their session.
+ This is very useful for debugging purposes and more generally to
+ understand which containers are available.
+
+Maintenance
+-----------
+- Fix error in the docs build.
+- Misc updates to the CI.
+
+Contributors
+------------
+- unztag
+- zrylettc
+
+
+v1.9.0 (2021-02-10)
+===================
+
+Features
+--------
+- Add ``happi update `` command-line utility. This allows the user to
+ pipe in a json blob to the happi CLI to update their database. This enables
+ bulk updates in a convenient way.
+- Allow short (under 3) and long (over 80) character names. Users who want
+ further restrictions on names for their projects are encouraged to create
+ a custom container.
+- Allow arbitrary user functions to be passed in to the EntryInfo ``enforce``
+ field, for custom validation of data. These functions should mimic the
+ signature and behavior of the built-in types: take one argument, return the
+ value back as-is or cast to the type, raise ValueError if there is an issue.
+
+Bugfixes
+--------
+- Properly expand home directory (~) in the JSON backend database path.
+- Require that the name field does not conflict with reserved Python keywords.
+- Fix an issue where boolean fields edited from the command-line were always
+ interpreted as True.
+
+Maintenance
+-----------
+- Update CI to PCDS standards.
+
+Contributors
+------------
+- klauer
+- unztag
+- zllentz
+
+
+v1.8.4 (2021-01-08)
+===================
+
+Bugfixes
+--------
+- Fix an issue where a package implementing a happi containers entrypoint
+ could fail to be picked up by the happi registry based on the import order.
+
+Maintenance
+-----------
+- Revisions, clarifications, and additions to the documentation.
+- Docstring style fixes.
+
+Contributors
+------------
+- klauer
+- untzag
+- zrylettc
+
+
+v1.8.3 (2020-11-17)
+===================
+
+Bugfixes
+--------
+- Fix loading of acromag io channels from the lcls questionnaire.
+ Previously, these were loading full acromag devices instead of
+ individual channels and were using the incorrect PVs.
+- Fix loading of Beckhoff axis motors from the lcls questionnaire.
+ Previously, these were misidentified as IMS motors.
+
+Maintenance
+-----------
+- Refactor questionnaire entry creation to accomplish the above.
+
+Contributors
+------------
+- cristinasewell
+
+
+v1.8.2 (2020-10-20)
+===================
+
+Bugfixes
+--------
+- Removed hanging raise command from qs loader (hotfix)
+
+
+v1.8.1 (2020-10-21)
+===================
+
+Bugfixes
+--------
+- Fix various issues causing questionnaire loads to fail.
+- Fix clarity issues for failed questionnaire loads.
+
+Maintenance
+-----------
+- Break up the questionnaire loading routines into more maintainable
+ chunks, reorganizing and cleaning up the code.
+- Allow introspection of questionnaire state for debugging.
+
+
+v1.8.0 (2020-10-07)
+===================
+
+Features
+--------
+- Adds bash/fzf-based fuzzy finding of happi items with corresponding
+ activate/deactivate scripts.
+- Adds ``happi search --json`` option to output JSON instead of a table.
+
+Maintenance
+-----------
+- Move IPython import to where it's needed in ``happi load``, saving
+ approximately half a second on any other ``happi`` CLI invocation.
+
+
+v1.7.2 (2020-09-17)
+===================
+
+Bugfixes
+--------
+- Fix issue with edge cases in lcls questionnaire loader
+- Fix issue with unclear warnings on creating malformed entries
+
+Maintenance
+-----------
+- Improve testing coverage for CLI functions
+
+
+v1.7.1 (2020-08-20)
+===================
+
+Bugfixes
+--------
+- Fix cli issue where the ``--clone`` argument would fail.
+- Make sure the happi cli returns usage information
+ if the user passes no arguments.
+
+
+v1.7.0 (2020-08-18)
+===================
+
+Features
+--------
+- Add cli search globbing, e.g. now the following will work:
+ ``happi search xpp*`` (show all devices whose names start with xpp)
+
+Bugfixes
+--------
+- Fix issue with silent failure when editing a non-existent field.
+- Fix issues related to changing an entry's name field.
+
+Maintenance
+-----------
+- Add documentation for the happi cli
+- Update the db.json examples to use OphydItem
+
+
+v1.6.1 (2020-07-01)
+===================
+
+Bugfixes
+--------
+- Do not raise an exception on single malformed entries uncovered during
+ a search. Treat these as missing entries. This was causing an issue
+ where queries like ``all_devices`` would fail outright.
+- Fix issue where ``device_cls`` string would leak through and raise a
+ bad/confusing exception during ``create_device``
+
+Maintenance
+-----------
+- Reduce missing backends log messages from ``warning`` to ``debug``.
+- Fix docs failing to build and related issues.
+- Add ``requirements.txt`` file to ``MANIFEST.in``.
+
+
+v1.6.0 (2020-04-30)
+===================
+
+- LCLS-specific containers are moved out of happi, and into
+ `pcdsdevices `__
+- ``OphydItem`` is now the preferred basic ``ophyd.Device``
+ container, with the intention of fully deprecating ``Device`` to
+ avoid naming confusion
+- Minor internal fixes
+
+
+v1.5.0 (2020-04-06)
+===================
+
+- Refactor search methods, supporting mongo and JSON backends
+
+ - ``search`` - search by key/value pairs as kwargs
+ - ``search_range`` - search for a range of values in a specific key
+ - ``search_regex`` - search for key/value pairs as kwargs, with
+ values being regular expressions
+ - Adds ``SearchResult`` container, allowing for access of metadata
+ or device instantiation
+
+- ``Client['item']`` supported
+- ``happi.Device`` is now marked as deprecated
+
+ - Migrate to ``happi.OphydItem``
+
+- Documentation building fixed and made more accurate
+- Internal refactoring
+
+ - Reduce usage of metaclasses
+ - pymongo/mongomock are truly optional test dependencies now
+ - Added pre-commit configuration for developer quality-of-life
+ - ``HappiItem``\ s are now ``copy.copy()``-able
+ - Backends supply generators and not lists
+
+- Fixed many oustanding issues with the JSON backend
+
+
+v1.4.0 (2020-03-13)
+===================
+
+Enhancements
+------------
+
+- Add an add command for cli, e.g. ``happi add`` to start an interactive
+ device adder
+- Add an edit command for cli, e.g. ``happi edit im3l0 location=750``
+ prefix=IM3L0:PPM
+- Change search command syntax to be simpler (more like edit)
+- Add a load command for cli, e.g. ``happi load im3l0 im1l1`` -> IPython
+ session plus other changes made in dev to get it working
+- Add two new Happi-aware Qt widgets: HappiDeviceListView &
+ HappiDeviceTreeView
+
+Bug Fixes
+---------
+
+- Initialize database if it does not yet exists
+- Fix broken tests
+
+
+v1.3.0 (2019-12-10)
+===================
+
+Enhancements
+------------
+
+- Command line script allow users to search and add devices
+ `#84 `__
+- Base ``Container`` object now available with minimum amount of
+ ``EntryInfo`` `#92 `__
+- Allow Happi to load more devices from LCLS questionnaire
+ `#94 `__
+- New function ``list_choices`` added to ``happi.Client`` to allow user
+ to know what beamlines, prefixes, names, etc. will return results.
+- Threaded ``load_devices`` with option to specify a callback when
+ devices are ready
+ `#67 `__
+
+
+v1.2.1 (2019-03-07)
+===================
+
+Bug Fixes
+---------
+
+- The test suite now passes without the ``mongomock`` backend
+ (`#89 `__)
+- Ensure our file handles are properly closed in the JSON backend by
+ using context managers
+ (`#87 `__)
+
+
+v1.2.0 (2018-12-19)
+===================
+
+Enhancements
+------------
+
+- ``Client`` now has a method ``load_device`` for searching the
+ database for a ``Container`` and then loading the corresponding
+ object based on ``device_class``, ``args`` and ``kwargs``. This is a
+ shortcut to combine two previously existing features
+ ``Client.find_device`` and ``happi.loader.from_container``
+
+- ``Client.from_config`` will create a ``Client`` object from a
+ provided configuration file. You can either pass this file in
+ explicitly, specify it via the the environment variable
+ ``$HAPPI_CFG``, or it will be searched for in ``~config`` or wherever
+ you specify your \`$XDG_CONFIG_HOME environment variable
+
+- Additional keywords were added to the base ``Device`` container;
+ ``lightpath``, ``documentation`` and ``embedded_screen``,
+ ``detailed_screen`` and ``engineering_screen``
+
+- There is now a base container for a ``Motor`` object.
+
+Deprecations
+------------
+
+- ``screen`` is longer a supported key. This was too generic and the
+ three keys detailed above allow the user more specificity.
+
+Fixes
+-----
+
+- The ``JSONBackend`` no longer relies on ``fcntl`` a Linux only module
+ of the Python standard library.
+
+
+v1.1.2 (2018-08-30)
+===================
+
+Maintenance
+-----------
+
+- In ``from_container``, the provided container is compared against the
+ cached version of the device to find discrepancies. This means that
+ modified container objects will always load a new Device.
+ (`#62 `__)
+- The QSBackend uses newer methods available in the psdm_qs_cli to
+ determine the proposal from the experiment name. This is more robust
+ against exotic experiment naming schemas than prior implementations
+ (`#68 `__)
+
+
+v1.1.1 (2018-03-08)
+===================
+
+Enhancements
+------------
+
+- The ``QSBackend`` guesses which a type of motor based on the
+ ``prefix``. Currently this supports ``Newport``, ``IMS``, and
+ ``PMC100`` motors. While there is not an explicit dependency, this
+ will require ``pcdsdevices >= 0.5.0`` to load properly
+ (`#51 `__)
+
+Bug Fixes
+---------
+
+- Templating is more robust when dealing with types. This includes a
+ fatal case where the default for an ``EntryInfo`` is ``None``
+ (`#50 `__)
+- A proper error message is returned if an entry in the table does not
+ have the requisite information to load
+ (`#53 `__ )
+
+
+v1.1.0 (2018-02-13)
+===================
+
+Ownership of this repository has been transferred to
+https://github.com/pcdshub
+
+Enhancements
+------------
+
+Happi now has a cache so the repeated requests to load the same device
+do not spawn multiple objects.
+
+Maintenance
+-----------
+
+- Cleaner logging messages
+- ``QSBackend`` was expanded to accommodate different keyword arguments
+ associated with different authentication methods.
+
+
+v1.0.0 (2018-01-31)
+===================
+
+Enhancements
+------------
+
+- ``happi`` now handles loading devices with the built-in ``EntryInfo``
+ -> args, kwargs and device_class. Simply enter the proper information
+ in these fields, either directly inputting information or using
+ ``jinja2`` templating. The functions ``from_container`` and
+ ``load_devices`` will then handle the necessary imports and
+ initialize devices for you
+- Select which backend you want to use with the environment variable
+ ``$HAPPI_BACKEND``
+- Backend to read from the PCDS Questionnaire
+- All containers work out of the box with ``pcdsdevices >= 0.3.0`` ##
+ API
+- All backends are stored in the ``backends`` directory.
+- The default plugin is now considered to be ``JSONBackend``
+- The function formerly called ``load_device`` is now ``find_device``.
+
+Build
+-----
+
+- ``jinja2`` is now a dependency
+- ``psdm_qs_cli`` is now an optional dependency if you want to use the
+ Questionnaire backend
+- ``pymongo`` is now an optional dependency if you do not want to use
+ the MongoDB backend
+- Only tested against Python ``3.5.x`` and ``3.6.x``
+- Sent to the ``pcds-tag`` and ``pcds-dev`` Anaconda channels instead
+ of the ``skywalker`` channels
+
+
+v0.5.0 (2017-11-11)
+===================
+
+Enhancements
+------------
+
+- ``happi`` now supports multiple backends. The required database
+ operations are templated in the ``happi.backends.Backend`` The
+ existing mongoDB support was kept as the default, but the an
+ additional JSON backend was added. The choice of database type can be
+ entered as an argument to the ``happi.Client``
+- Conda builds of ``happi`` are now available at ``skywalker-tag`` and
+ ``skywalker-dev``
+
+Bug Fixes
+---------
+
+- Devices comparison now works properly. The listed prefix and names
+ are compared.
+
+API Changes
+-----------
+
+- ``Mirror`` container has been changed to the more specific name
+ ``OffsetMirror``
+
+Deprecations
+------------
+
+- ``happi`` will no longer support Python 2.7
+
+
+v0.4.0 (2017-04-04)
+===================
+
+Bug Fixes
+---------
+
+- Removed dependency on mongomock in conda-recipe
+- ``MockClient`` creates entire ``device_types`` container mapping
+
+API Changes
+-----------
+
+- Renamed alias -> name, and base -> prefix for Ophyd compatibility
+
+
+v0.3.0 (2017-03-22)
+===================
+
+Enhancements
+------------
+
+- Added Python 2.7 support
+- Added macros keyword for EDM support
+- Added CI tools for Travis, Codecov
+- Changed tests to use a ``mongomock.MockClient`` instead of an actual
+ mongoDB instance
+- Device can now ``show_info`` and print a table output of all entered
+ information
+
+Bug Fixes
+---------
+
+- ``active`` EntryInfo should default to True
+
+API Changes
+-----------
+
+- Moved the tests directory into the package to make it easily
+ importable by other modules hoping to use a MockClient
+- Introduced explicit dependencies on ``six``, ``mongomock``, and
+ ``prettytable``
diff --git a/v2.6.0/_sources/upcoming_changes.rst.txt b/v2.6.0/_sources/upcoming_changes.rst.txt
new file mode 100644
index 00000000..1323597c
--- /dev/null
+++ b/v2.6.0/_sources/upcoming_changes.rst.txt
@@ -0,0 +1,8 @@
+Upcoming Changes
+################
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ upcoming_release_notes/[0-9]*
diff --git a/v2.6.0/_static/_sphinx_javascript_frameworks_compat.js b/v2.6.0/_static/_sphinx_javascript_frameworks_compat.js
new file mode 100644
index 00000000..81415803
--- /dev/null
+++ b/v2.6.0/_static/_sphinx_javascript_frameworks_compat.js
@@ -0,0 +1,123 @@
+/* Compatability shim for jQuery and underscores.js.
+ *
+ * Copyright Sphinx contributors
+ * Released under the two clause BSD licence
+ */
+
+/**
+ * small helper function to urldecode strings
+ *
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
+ */
+jQuery.urldecode = function(x) {
+ if (!x) {
+ return x
+ }
+ return decodeURIComponent(x.replace(/\+/g, ' '));
+};
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+ if (typeof s === 'undefined')
+ s = document.location.search;
+ var parts = s.substr(s.indexOf('?') + 1).split('&');
+ var result = {};
+ for (var i = 0; i < parts.length; i++) {
+ var tmp = parts[i].split('=', 2);
+ var key = jQuery.urldecode(tmp[0]);
+ var value = jQuery.urldecode(tmp[1]);
+ if (key in result)
+ result[key].push(value);
+ else
+ result[key] = [value];
+ }
+ return result;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+ function highlight(node, addItems) {
+ if (node.nodeType === 3) {
+ var val = node.nodeValue;
+ var pos = val.toLowerCase().indexOf(text);
+ if (pos >= 0 &&
+ !jQuery(node.parentNode).hasClass(className) &&
+ !jQuery(node.parentNode).hasClass("nohighlight")) {
+ var span;
+ var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.className = className;
+ }
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+ document.createTextNode(val.substr(pos + text.length)),
+ node.nextSibling));
+ node.nodeValue = val.substr(0, pos);
+ if (isInSVG) {
+ var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+ var bbox = node.parentElement.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute('class', className);
+ addItems.push({
+ "parent": node.parentNode,
+ "target": rect});
+ }
+ }
+ }
+ else if (!jQuery(node).is("button, select, textarea")) {
+ jQuery.each(node.childNodes, function() {
+ highlight(this, addItems);
+ });
+ }
+ }
+ var addItems = [];
+ var result = this.each(function() {
+ highlight(this, addItems);
+ });
+ for (var i = 0; i < addItems.length; ++i) {
+ jQuery(addItems[i].parent).before(addItems[i].target);
+ }
+ return result;
+};
+
+/*
+ * backward compatibility for jQuery.browser
+ * This will be supported until firefox bug is fixed.
+ */
+if (!jQuery.browser) {
+ jQuery.uaMatch = function(ua) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+ /(msie) ([\w.]+)/.exec(ua) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+ };
+ jQuery.browser = {};
+ jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
+}
diff --git a/v2.6.0/_static/basic.css b/v2.6.0/_static/basic.css
new file mode 100644
index 00000000..f316efcb
--- /dev/null
+++ b/v2.6.0/_static/basic.css
@@ -0,0 +1,925 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: 360px;
+ max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+ float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+ padding-right: 0.5em;
+}
+aside.footnote > p {
+ margin-left: 2em;
+}
+div.citation > p {
+ margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+ margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.sig dd {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.sig dl {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+.translated {
+ background-color: rgba(207, 255, 207, 0.2)
+}
+
+.untranslated {
+ background-color: rgba(255, 207, 207, 0.2)
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/v2.6.0/_static/css/badge_only.css b/v2.6.0/_static/css/badge_only.css
new file mode 100644
index 00000000..88ba55b9
--- /dev/null
+++ b/v2.6.0/_static/css/badge_only.css
@@ -0,0 +1 @@
+.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-other-versions .rtd-current-item{font-weight:700}.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}}#flyout-search-form{padding:6px}
\ No newline at end of file
diff --git a/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff b/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff
new file mode 100644
index 00000000..6cb60000
Binary files /dev/null and b/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff differ
diff --git a/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2
new file mode 100644
index 00000000..7059e231
Binary files /dev/null and b/v2.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff b/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff
new file mode 100644
index 00000000..f815f63f
Binary files /dev/null and b/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff differ
diff --git a/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2
new file mode 100644
index 00000000..f2c76e5b
Binary files /dev/null and b/v2.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/fontawesome-webfont.eot b/v2.6.0/_static/css/fonts/fontawesome-webfont.eot
new file mode 100644
index 00000000..e9f60ca9
Binary files /dev/null and b/v2.6.0/_static/css/fonts/fontawesome-webfont.eot differ
diff --git a/v2.6.0/_static/css/fonts/fontawesome-webfont.svg b/v2.6.0/_static/css/fonts/fontawesome-webfont.svg
new file mode 100644
index 00000000..855c845e
--- /dev/null
+++ b/v2.6.0/_static/css/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/v2.6.0/_static/css/fonts/fontawesome-webfont.ttf b/v2.6.0/_static/css/fonts/fontawesome-webfont.ttf
new file mode 100644
index 00000000..35acda2f
Binary files /dev/null and b/v2.6.0/_static/css/fonts/fontawesome-webfont.ttf differ
diff --git a/v2.6.0/_static/css/fonts/fontawesome-webfont.woff b/v2.6.0/_static/css/fonts/fontawesome-webfont.woff
new file mode 100644
index 00000000..400014a4
Binary files /dev/null and b/v2.6.0/_static/css/fonts/fontawesome-webfont.woff differ
diff --git a/v2.6.0/_static/css/fonts/fontawesome-webfont.woff2 b/v2.6.0/_static/css/fonts/fontawesome-webfont.woff2
new file mode 100644
index 00000000..4d13fc60
Binary files /dev/null and b/v2.6.0/_static/css/fonts/fontawesome-webfont.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/lato-bold-italic.woff b/v2.6.0/_static/css/fonts/lato-bold-italic.woff
new file mode 100644
index 00000000..88ad05b9
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-bold-italic.woff differ
diff --git a/v2.6.0/_static/css/fonts/lato-bold-italic.woff2 b/v2.6.0/_static/css/fonts/lato-bold-italic.woff2
new file mode 100644
index 00000000..c4e3d804
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-bold-italic.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/lato-bold.woff b/v2.6.0/_static/css/fonts/lato-bold.woff
new file mode 100644
index 00000000..c6dff51f
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-bold.woff differ
diff --git a/v2.6.0/_static/css/fonts/lato-bold.woff2 b/v2.6.0/_static/css/fonts/lato-bold.woff2
new file mode 100644
index 00000000..bb195043
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-bold.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/lato-normal-italic.woff b/v2.6.0/_static/css/fonts/lato-normal-italic.woff
new file mode 100644
index 00000000..76114bc0
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-normal-italic.woff differ
diff --git a/v2.6.0/_static/css/fonts/lato-normal-italic.woff2 b/v2.6.0/_static/css/fonts/lato-normal-italic.woff2
new file mode 100644
index 00000000..3404f37e
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-normal-italic.woff2 differ
diff --git a/v2.6.0/_static/css/fonts/lato-normal.woff b/v2.6.0/_static/css/fonts/lato-normal.woff
new file mode 100644
index 00000000..ae1307ff
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-normal.woff differ
diff --git a/v2.6.0/_static/css/fonts/lato-normal.woff2 b/v2.6.0/_static/css/fonts/lato-normal.woff2
new file mode 100644
index 00000000..3bf98433
Binary files /dev/null and b/v2.6.0/_static/css/fonts/lato-normal.woff2 differ
diff --git a/v2.6.0/_static/css/theme.css b/v2.6.0/_static/css/theme.css
new file mode 100644
index 00000000..0f14f106
--- /dev/null
+++ b/v2.6.0/_static/css/theme.css
@@ -0,0 +1,4 @@
+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 .eqno .headerlink:before,.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 p .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 button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,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 .eqno .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 p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.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 .eqno .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 .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 button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.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 .eqno .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 .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 button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.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 .eqno .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 .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 button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .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 .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 button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.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 button.toctree-expand:before,.wy-menu-vertical li.on a button.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 button.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 .eqno .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 p .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 button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .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 p .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 button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.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 .eqno 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 p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .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 p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.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 .eqno .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 .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .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 .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .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 .btn .headerlink,.rst-content p .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 button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .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 .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 button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .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 .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 button.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 .eqno .btn .fa-large.headerlink,.rst-content .eqno .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 .btn .fa-large.headerlink,.rst-content p .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 button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.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 .eqno .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 .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 button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .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 .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 button.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 .eqno .btn .fa-spin.headerlink,.rst-content .eqno .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 .btn .fa-spin.headerlink,.rst-content p .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 button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.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 .eqno .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 .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.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 .eqno .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 .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 button.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 .eqno .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 .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 button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .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 .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 button.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,.rst-content section 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,.rst-content section 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,.rst-content section ul li p:last-child,.rst-content section 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,.rst-content section 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,.rst-content section 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,.rst-content section 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 .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol 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.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol 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;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.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 button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.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 button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;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 button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.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{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.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 1.618em .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 button.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 button.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 button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.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;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{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,.wy-side-nav-search>a.icon{display:block}.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.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.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 .eqno .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 .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 .eqno .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 .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 button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.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-other-versions .rtd-current-item{font-weight:700}.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}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.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,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.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,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.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,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.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>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.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,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.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,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.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,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.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,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.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,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.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 .eqno .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 p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.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 .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}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.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,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.citation>dd,html.writer-html5 .rst-content dl.citation>dt,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.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,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.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}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 aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.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 aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.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{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;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.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}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):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(.citation):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(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>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(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>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(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}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(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):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(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.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,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.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/v2.6.0/_static/doctools.js b/v2.6.0/_static/doctools.js
new file mode 100644
index 00000000..4d67807d
--- /dev/null
+++ b/v2.6.0/_static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
+const _ready = (callback) => {
+ if (document.readyState !== "loading") {
+ callback();
+ } else {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+ init: () => {
+ Documentation.initDomainIndexTable();
+ Documentation.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS: {},
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+ LOCALE: "unknown",
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext: (string) => {
+ const translated = Documentation.TRANSLATIONS[string];
+ switch (typeof translated) {
+ case "undefined":
+ return string; // no translation
+ case "string":
+ return translated; // translation exists
+ default:
+ return translated[0]; // (singular, plural) translation tuple exists
+ }
+ },
+
+ ngettext: (singular, plural, n) => {
+ const translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated !== "undefined")
+ return translated[Documentation.PLURAL_EXPR(n)];
+ return n === 1 ? singular : plural;
+ },
+
+ addTranslations: (catalog) => {
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+ Documentation.PLURAL_EXPR = new Function(
+ "n",
+ `return (${catalog.plural_expr})`
+ );
+ Documentation.LOCALE = catalog.locale;
+ },
+
+ /**
+ * helper function to focus on search bar
+ */
+ focusSearchBar: () => {
+ document.querySelectorAll("input[name=q]")[0]?.focus();
+ },
+
+ /**
+ * Initialise the domain index toggle buttons
+ */
+ initDomainIndexTable: () => {
+ const toggler = (el) => {
+ const idNumber = el.id.substr(7);
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+ if (el.src.substr(-9) === "minus.png") {
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+ toggledRows.forEach((el) => (el.style.display = "none"));
+ } else {
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+ toggledRows.forEach((el) => (el.style.display = ""));
+ }
+ };
+
+ const togglerElements = document.querySelectorAll("img.toggler");
+ togglerElements.forEach((el) =>
+ el.addEventListener("click", (event) => toggler(event.currentTarget))
+ );
+ togglerElements.forEach((el) => (el.style.display = ""));
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+ },
+
+ initOnKeyListeners: () => {
+ // only install a listener if it is really needed
+ if (
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+ !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ )
+ return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+ if (!event.shiftKey) {
+ switch (event.key) {
+ case "ArrowLeft":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const prevLink = document.querySelector('link[rel="prev"]');
+ if (prevLink && prevLink.href) {
+ window.location.href = prevLink.href;
+ event.preventDefault();
+ }
+ break;
+ case "ArrowRight":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const nextLink = document.querySelector('link[rel="next"]');
+ if (nextLink && nextLink.href) {
+ window.location.href = nextLink.href;
+ event.preventDefault();
+ }
+ break;
+ }
+ }
+
+ // some keyboard layouts may need Shift to get /
+ switch (event.key) {
+ case "/":
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+ Documentation.focusSearchBar();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/v2.6.0/_static/documentation_options.js b/v2.6.0/_static/documentation_options.js
new file mode 100644
index 00000000..544667a0
--- /dev/null
+++ b/v2.6.0/_static/documentation_options.js
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+ VERSION: '2.6.0',
+ LANGUAGE: 'en',
+ COLLAPSE_INDEX: false,
+ BUILDER: 'html',
+ FILE_SUFFIX: '.html',
+ LINK_SUFFIX: '.html',
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt',
+ NAVIGATION_WITH_KEYS: false,
+ SHOW_SEARCH_SUMMARY: true,
+ ENABLE_SEARCH_SHORTCUTS: true,
+};
\ No newline at end of file
diff --git a/v2.6.0/_static/file.png b/v2.6.0/_static/file.png
new file mode 100644
index 00000000..a858a410
Binary files /dev/null and b/v2.6.0/_static/file.png differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bold.eot b/v2.6.0/_static/fonts/Lato/lato-bold.eot
new file mode 100644
index 00000000..3361183a
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bold.eot differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bold.ttf b/v2.6.0/_static/fonts/Lato/lato-bold.ttf
new file mode 100644
index 00000000..29f691d5
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bold.ttf differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bold.woff b/v2.6.0/_static/fonts/Lato/lato-bold.woff
new file mode 100644
index 00000000..c6dff51f
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bold.woff differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bold.woff2 b/v2.6.0/_static/fonts/Lato/lato-bold.woff2
new file mode 100644
index 00000000..bb195043
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bold.woff2 differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bolditalic.eot b/v2.6.0/_static/fonts/Lato/lato-bolditalic.eot
new file mode 100644
index 00000000..3d415493
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bolditalic.eot differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bolditalic.ttf b/v2.6.0/_static/fonts/Lato/lato-bolditalic.ttf
new file mode 100644
index 00000000..f402040b
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bolditalic.ttf differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff b/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff
new file mode 100644
index 00000000..88ad05b9
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff2 b/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff2
new file mode 100644
index 00000000..c4e3d804
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-bolditalic.woff2 differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-italic.eot b/v2.6.0/_static/fonts/Lato/lato-italic.eot
new file mode 100644
index 00000000..3f826421
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-italic.eot differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-italic.ttf b/v2.6.0/_static/fonts/Lato/lato-italic.ttf
new file mode 100644
index 00000000..b4bfc9b2
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-italic.ttf differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-italic.woff b/v2.6.0/_static/fonts/Lato/lato-italic.woff
new file mode 100644
index 00000000..76114bc0
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-italic.woff differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-italic.woff2 b/v2.6.0/_static/fonts/Lato/lato-italic.woff2
new file mode 100644
index 00000000..3404f37e
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-italic.woff2 differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-regular.eot b/v2.6.0/_static/fonts/Lato/lato-regular.eot
new file mode 100644
index 00000000..11e3f2a5
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-regular.eot differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-regular.ttf b/v2.6.0/_static/fonts/Lato/lato-regular.ttf
new file mode 100644
index 00000000..74decd9e
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-regular.ttf differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-regular.woff b/v2.6.0/_static/fonts/Lato/lato-regular.woff
new file mode 100644
index 00000000..ae1307ff
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-regular.woff differ
diff --git a/v2.6.0/_static/fonts/Lato/lato-regular.woff2 b/v2.6.0/_static/fonts/Lato/lato-regular.woff2
new file mode 100644
index 00000000..3bf98433
Binary files /dev/null and b/v2.6.0/_static/fonts/Lato/lato-regular.woff2 differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
new file mode 100644
index 00000000..79dc8efe
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
new file mode 100644
index 00000000..df5d1df2
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
new file mode 100644
index 00000000..6cb60000
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
new file mode 100644
index 00000000..7059e231
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
new file mode 100644
index 00000000..2f7ca78a
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
new file mode 100644
index 00000000..eb52a790
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
new file mode 100644
index 00000000..f815f63f
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ
diff --git a/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
new file mode 100644
index 00000000..f2c76e5b
Binary files /dev/null and b/v2.6.0/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ
diff --git a/v2.6.0/_static/jquery.js b/v2.6.0/_static/jquery.js
new file mode 100644
index 00000000..c4c6022f
--- /dev/null
+++ b/v2.6.0/_static/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"
Return the kwargs necessary to transfer the information from
+item into a container target. Checks are performed to ensure
+the contents are compatible (following enforce requirements in the
+target container)
+
This function is built to be a helper function for an interactive
+cli tool, and passes information up accordingly. If keys are not
+significantly mismatched, this function can be used as is.
+
+
Parameters:
+
+
item (happi.HappiItem) – HappiItem instance to be transferred to a new container
+
target (Type[happi.HappiItem]) – Container to contain new item
+
edits (dict[str, Any], optional) – Dictionary of edits to supersede values in original item
+
how (str, optional) – Method of resolving the entries between the original item
+and target container. Can be:
+- “right” : Expect a value for every entry in target container
+- “inner” : Expect values for only entries in BOTH original
+item and target container
+
+
+
Raises:
+
TransferError – If there is a problem tranferring item into container
We first query the environment variable $HAPPI_CFG to see if this
+points to a specific configuration file. If this is not present, the
+variable set by $XDG_CONFIG_HOME or if that is not set
+~/.config
If multiple matches are found, a single document will be returned to
+the user. How the database will choose to select this item is based
+on each individual implementation
+
+
Parameters:
+
kwargs – Keyword pairs of information used to locate the item
+
+
Returns:
+
document – A dict that matches the specified information.
Create a client from a configuration file specification.
+
Configuration files looking something along the lines of:
+
[DEFAULT]
+path=path/to/my/db.json
+
+
+
All key value pairs will be passed directly into backend construction
+with the exception of the key backend which can be used to specify
+a specific type of backend if this differs from the configured default.
+
+
Parameters:
+
cfg (str, optional) – Path to a configuration file. If not entered, find_config()
+will be use.
flags (int, optional) – Defaulting to re.IGNORECASE, these flags are used for the
+regular expressions passed in.
+
**kwargs – Information to filter through the database structured as key, value
+pairs for the desired pieces of EntryInfo. Every value is allowed
+to contain a Python regular expression.
The smallest description of an object that can be entered in happi.
+
The class does not need to be intialized with any specific piece of
+information except a name, but all of the attributes listed by
+HappiItem.info_names can be used to assign values to
+EntryInfo upon initialization. Pieces of information that are
+deemed mandatory by the class must be filled in before the device is loaded
+into the database. See mandatory_info to see which
+attributes are neccesary.
+
Additional metadata can be given to the device in the form of keywords on
+initialization, this information is kept in the extraneous
+attribute, and will be saved in to the database as long as it does not
+clash with an existing piece of metadata that the client uses to organize
+devices.
Load an object (or “device”) from a compatible HappiItem.
+
The item container is queried for the device_class, args, and
+kwargs. If the associated Python module is not already loaded it will
+be imported. The specified class is then instantiated with the given args
+and kwargs provided.
+
The name device here refers to what is created after instantiating
+device_class.
+
This function does not attempt to catch exceptions either during module
+imports or object creation. If you would like a series of independent
+devices to be loaded use load_devices().
+
By default, the instantiated object has the original container added on as
+.md. This allows applications to utilize additional metadata
+information that may not be included in the basic class constructor. On
+later calls, the container you request is checked against this stored
+metadata. If a discrepancy is found the object is forced to reload, not
+retrieved from the cache.
attach_md (bool, optional) – Attach the container to the instantiated object as md.
+
run_post_attach_hook (bool, optional) – Run post_happi_md method on the device after attaching the container
+if possible.
+
use_cache (bool, optional) – When devices are loaded they are stored in the happi.cache
+dictionary. This means that repeated attempts to load the device will
+return the same object. This prevents unnecessary EPICS connections
+from being initialized in the same process. If a new object is
+needed, set use_cache to False and a new object will be created,
+overriding the current cached object. An object with matching name
+and differing metadata will always return a new instantiation of the
+device.
+
threaded (bool, optional) – Set this to True when calling inside a thread. This is currently
+unused.
+
+
+
Returns:
+
obj – This will be of the same type as the return value of the provided
+item’s device_class. As that may be a factory function or a
+class, the exact return type is not guaranteed.
Load a series of devices by way of their HappiItems into a namespace.
+
+
Parameters:
+
+
*items (HappiItem) – List of happi containers to load.
+
pprint (bool, optional) – Print results of device loads.
+
namespace (object, optional) – Namespace to collect loaded devices in. By default this will be a
+types.SimpleNamespace.
+
use_cache (bool, optional) – If set to False, we’ll ignore the cache and always make new
+devices.
+
threaded (bool, optional) – Set to True to create each device in a background thread. Note that
+this assumes that no two devices provided are the same. You are not
+guaranteed to load from the cache correctly if you ask for the same
+device to be loaded twice in the same threaded load.
+
post_load (function, optional) – Function of one argument to run on each device after instantiation.
+This could be especially useful during the threaded loading process.
+
include_load_time (bool, optional) – Include load time in each message.
+
load_time_threshold (float, optional) – Load time above this value, in seconds, will be shown if
+include_load_time is set.
+
kwargs – Additional keyword arguments passed to from_container().
This registry keeps a mapping of full happi container names to their
+respective HappiItem subclasses.
+
Entries in the registry are populated in the following order:
+
+
From the happi.containers.DEFAULT_REGISTRY dictionary. The names
+of the containers are assumed to already include any relevant qualifiers
+such as package names. That is, the default "OphydItem" will be
+used as-is and retrieved from the registry by that name alone.
+
Through Python package-defined entrypoints with the key
+happi.containers.
+
For example, consider a package named "mypackagename" that defines
+the happi container ContainerName inside of the Python module
+mypackagename.happi.containers_module.ContainerName.
+The fully qualified name - as accessed through the happi client for each
+item in the database - may be customized in the entrypoint.
+
Here, we want the container to be accessible by way of
+"desired_prefix.ContainerName". The following would be how this
+entrypoint should be configured in setup.py.
Runs checks on the devices matching the provided SEARCH_CRITERIA.
+Checks are simple functions that raise exceptions on failure,
+whether naturally or via assert calls. These functions take a single
+happi.SearchResult as an positional argument and returns None if
+successful.
+
To import additional checks, provide a file with your check function
+and a list named checks containing the desired functions.
This will generate a table that shows you how long each device took
+to instantiate.
+
Repeats for at least the (-d, –duration) arg (default = 0 seconds)
+and for at least the number of the (-i, –iterations) arg (default = 1
+iteration), showing stats and averages.
+
By default we time only the duration of __init__, but you can also
+(wait_connected) to see the full time until the device is fully ready
+to go, presuming the device has a wait_for_connection method.
+
Search terms are standard as in the same search terms as the search
+cli function. A blank search term means to load all the devices.
This will go through the happi loading process and show
+information about the execution time of all the
+functions called during the process.
+
Contains options for picking which devices to check and which
+part of the loading process to profile. You can choose to
+profile the happi database loading (-d, –database), the
+class imports (-i, –import), the object instantiation
+(-o, –object), or all of the above (-a, –all).
+
By default this will use whichever profiler you have installed,
+but this can also be overriden with the (-p, –profiler) option.
+The priority order is, first, the pcdsutils line_profiler wrapper
+(–profiler pcdsutils), and second, the built-in cProfile module
+(–profiler cprofile). More options may be added later.
+
Search terms are standard as in the same search terms as the search
+cli function. A blank search term means to load all the devices.
Search the happi database. SEARCH_CRITERIA take the form: field=value.
+If ‘field=’ is omitted, it will assumed to be ‘name’.
+You may include as many search criteria as you like; these will
+be combined with ANDs.
Users will interact with the database by using the happi.Client, this
+will handle the authentication, and methods for adding, editing and removing
+items.
+
Happi is incredibly flexible, allowing us to put arbitrary key-value pair
+information into the database. While this will make adding functionality easy in
+the future, it also means that any rules on the structure of the data we allow
+will need to be performed by the Client itself. To make this
+intuitive, the Client deals primarily with Containers, which are objects
+that hold and specify these rules.
A new item must be a subclass of the basic HappiItem container.
+While you are free to use the initialized object wherever you see fit, the client
+has a hook to create new items.
+
Before we can create our first client, we need to create a backend for our item
+information to be stored.
+
In [1]: fromhappi.backends.json_dbimportJSONBackend
+
+In [2]: db=JSONBackend(path='doc_test.json',initialize=True)
+
+
+
If you are connecting to an existing database you can pass the information
+directly into the Client itself at __init__. See Selecting a Backend
+about how to configure your default backend choice.
+
In [3]: fromhappiimportClient,HappiItem
+
+In [4]: client=Client(path='doc_test.json')
+
+In [5]: item=client.create_item(
+ ...: "HappiItem",
+ ...: name="my_device",
+ ...: device_class="types.SimpleNamespace",
+ ...: args=[],
+ ...: kwargs={},
+ ...: position=345.5,# <- this is an extra field which happi allows
+ ...: )
+ ...:
+
+In [6]: item
+Out[6]: HappiItem (name=my_device)
+
+In [7]: item.save()
+
+
+
For this example, we have added an “extraneous” field to the item called
+“position”. This is something that happi allows for. If you wish to make
+this a recognized field of an eforced type (e.g., don’t allow the user to
+make position a string value instead of a floating point value), please
+see the documentation on making your own container class.
+
Alternatively, you can create the item separately and add it explicitly using
+HappiItem.save()
+
In [8]: item=HappiItem(
+ ...: name="my_device2",
+ ...: device_class="types.SimpleNamespace",
+ ...: position=355.5,# <- this is an extra field which happi allows
+ ...: )
+ ...:
+
+In [9]: item
+Out[9]: HappiItem (name=my_device2)
+
+In [10]: client.add_item(item)
+Out[10]: 'my_device2'
+
+
+
The main advantage of the first method is that all of the container classes are
+already managed by the client so they can be easily accessed with a string.
+Keep in mind, that either way, all of the mandatory information needs to be
+given to the item before it can be loaded into the database.
Client.find_item() is intended to only load one item at at a time. Both
+accept criteria in the from of keyword-value pairs to find the item or items
+you desire.
+
You can quickly query the client by item name and get a SearchResult that
+can be used to introspect metadata or even instantiate the corresponding item
+instance.
+
In [11]: result=client["my_device"]
+
+
+
The client acts as a Python mapping, so you may inspect it as you would a
+dictionary. For example:
+
# All of the item names:
+In [12]: list(client.keys())
+Out[12]: ['my_device', 'my_device2']
+
+# All of the database entries as SearchResults:
+In [13]: list(client.values())
+Out[13]:
+[SearchResult(client=<happi.client.Client object at 0x7fd4beebc850>, metadata={'name': 'my_device', 'device_class': 'types.SimpleNamespace', 'args': [], 'kwargs': {}, 'active': True, 'documentation': None, '_id': 'my_device', 'creation': 'Fri Dec 20 19:42:10 2024', 'last_edit': 'Fri Dec 20 19:42:10 2024', 'position': 345.5, 'type': 'HappiItem'}),
+ SearchResult(client=<happi.client.Client object at 0x7fd4beebc850>, metadata={'name': 'my_device2', 'device_class': 'types.SimpleNamespace', 'args': [], 'kwargs': {}, 'active': True, 'documentation': None, '_id': 'my_device2', 'creation': 'Fri Dec 20 19:42:10 2024', 'last_edit': 'Fri Dec 20 19:42:10 2024', 'position': 355.5, 'type': 'HappiItem'})]
+
+# Pairs of (name, SearchResult):
+In [14]: list(client.items())
+Out[14]:
+[('my_device',
+ SearchResult(client=<happi.client.Client object at 0x7fd4beebc850>, metadata={'name': 'my_device', 'device_class': 'types.SimpleNamespace', 'args': [], 'kwargs': {}, 'active': True, 'documentation': None, '_id': 'my_device', 'creation': 'Fri Dec 20 19:42:10 2024', 'last_edit': 'Fri Dec 20 19:42:10 2024', 'position': 345.5, 'type': 'HappiItem'})),
+ ('my_device2',
+ SearchResult(client=<happi.client.Client object at 0x7fd4beebc850>, metadata={'name': 'my_device2', 'device_class': 'types.SimpleNamespace', 'args': [], 'kwargs': {}, 'active': True, 'documentation': None, '_id': 'my_device2', 'creation': 'Fri Dec 20 19:42:10 2024', 'last_edit': 'Fri Dec 20 19:42:10 2024', 'position': 355.5, 'type': 'HappiItem'}))]
+
+
+
You could, for example, grab the first key by name and access it using
+__getitem__:
There are also some more advance methods to search specific areas of the
+beamline or use programmer-friendly regular expressions, described in the
+upcoming sections.
The workflow for editing an item looks very similar to the code within
+Creating a New Entry, but instead of instantiating the item you use either
+Client.find_item() or Client.search(). When the item is retrieved
+this way the class method HappiItem.save() is overwritten, simply call
+this when you are done editing.
Because the database uses the name key as an item’s identification you
+can not edit this information in the same way. Instead you must explicitly
+remove the item and then use Client.add_item() to create a new
+entry.
+
+
Finally, lets clean up our example objects by using
+Client.remove_item() to clean them from the database
Happi supports both JSON and MongoDB backends. You can always import your
+chosen backend directly, but in order to save time you can create an
+environment variable HAPPI_BACKEND and set this to "mongodb". This well
+tell the library to assume you want to use the MongoBackend.
+Otherwise, the library uses the JSONBackend.
In order to regulate and template the information that gets entered into the
+Happi database, we use the concept of containers. Containers serve two primary
+roles:
+
+
Identifying how to instantiate the object it represents (by way of class
+name, arguments, and keyword arguments).
+
Storing pertinent and structured metadata for the given instance.
+
+
Containers are created by instantiating the HappiItem class or a
+subclass of it. The metadata associated with the instance is broken up into
+fields or “entries” of type EntryInfo. This allows a developer to
+specify fields that are essential to every instance of a specific container
+type.
A piece of information related to a specific device.
+
These are entered as class attributes for a given device container. They
+help control the information entered into a device.
+
+
Parameters:
+
+
doc (str) – A short string to document the device.
+
optional (bool, optional) – By default all EntryInfo is optional, but in certain cases you may want
+to demand a particular piece of information upon initialization.
+
enforce (type, list, compiled regex, or function, optional) – Specify that all entered information is entered in a specific format.
+This can either by a Python type i.e. int, float e.t.c., a list of
+acceptable values, a compiled regex pattern i.e re.compile(...),
+or custom handling by passing a function that takes in one argument,
+the value. This function must do one of: return the value back as-is,
+return the value back converted to a corrected form, or raise a
+EnforceError.
+
default (optional) – A default value for the trait to have if the user does not specify.
+Keep in mind that this should be the same type as enforce if you
+are demanding a certain type.
+
enforce_doc (str, optional) – A human-readable explanation of the enforce field. Will be printed
+if the entered information does not follow the enforce type
+
include_default_as_kwarg (bool, optional) – Defaults to True. If a kwargs EntryInfo sets this to False, all kwargs
+will be compared to their corresponding Entries in the item and
+omitted from the kwargs dictionary if their value matches the Entry’s
+default.
+This can also be set on an individual Entry basis. The setting on
+an individual entry will only be taken into consideration if the
+kwarg EntryInfo has this set to True (default).
+
+
+
Raises:
+
ContainerError – If there is an error with the way the enforced value interacts with its
+ default value, or if the piece of information entered is unenforcable
+ based on the the settings.
+
+
+
Example
+
classMyItem(HappiItem):
+ my_field=EntryInfo('My generated field')
+ number=EntryInfo('Device number',enforce=int,default=0,
+ enforce_doc='This must be a number')
+
Accepts a value, verifies that it meets the criteria specified in
+the enforce attribute, and returns the same value, except that it
+will be converted to the correct type if enforce is a type.
+
+
Raises:
+
EnforceError – If the value is not the correct type, or does not match the
+ pattern.
In order to ensure that information is entered into the database in an
+organized fashion, the client will only accept classes that inherit from
+HappiItem. Each item will have the key information represented as
+class attributes, available to be manipulated like any other regular property
+
Editing the information for a container is a simple as:
In order to show the flexibility of the EntryInfo class, we’ll put
+together a new example container. The class can be invoked in the same way you
+would usually handle class inheritance, the only difference is that you specify
+class attributes as EntryInfo objects:
+
In [4]: importre
+
+In [5]: fromhappiimportHappiItem,EntryInfo
+
+In [6]: classMyItem(HappiItem):
+ ...: """My new item, with a known model number."""
+ ...: model_no=EntryInfo('Model Number of Item',optional=False)
+ ...: count=EntryInfo('Count of Item',enforce=int,default=0)
+ ...: choices=EntryInfo('Choice Info',enforce=['a','b','c'])
+ ...: no_whitespace=EntryInfo('Enforce no whitespace',
+ ...: enforce=re.compile(r'[\S]*$'),
+ ...: enforce_doc='This item cannot have whitespace')
+ ...:
+
+
+
By default, EntryInfo will create an optional init keyword argument with a
+default of None with the same name as the class attribute. A quick way
+to see how this information will be put into the the database is taking a look
+at dict(item):
As shown in the example above, using the EntryInfo keywords, you can put a
+short docstring to give a better explanation of the field, and also enforce
+that user enter a specific format of information.
+
While the user will always be able to enter None for the attribute, if a
+real value is given it will be checked against the specified enforce
+keyword, raising ValueError if invalid. Here is a table for how the
+EntryInfo check the type
+
+
+
Enforce
+
Method of enforcement
+
+
+
+
None
+
Any value will work
+
+
type
+
type(value)
+
+
list
+
list.index(value)
+
+
regex
+
regex.match(value) != None
+
+
function
+
function(value)
+
+
+
+
If your enforce condition is complicated or obfuscated, you can add a
+docstring using the enforce_doc keyword that explains the rule.
+(This may be helpful for regex matches which are difficult for humans
+to read)
+
Fields that are important to the item can be marked as mandatory with
+optional=False and should have no default value.
+
When entering information you will not necessarily see a difference between
+optional and mandatory EntryInfo, however the database client will
+reject the item if these fields do not have the requisite values set.
A container’s primary role is containing the information necessary to load the
+Python representation of an object.
+
Internally, happi keeps track of all containers by way of its registry, the
+HappiRegistry.
+
This information is stored as a device_class, args and kwargs. The
+former stores a string that indicates the Python class of the item, the other
+two indicate the information that is needed to instantiate it. With this
+information both from_container() and load_device() are able to
+handle importing modules and instantiating your object.
+
+
Note
+
happi will attach the original metadata with a fixed attribute name .md
+to your object. You can use this to keep track of the container metadata
+used to instantiate your object.
+
This can be disabled by setting attach_md to False in
+from_container().
+
+
Often, information contained in the args or kwargs will be duplicated
+in other parts of the container. For instance, most ophyd objects will want
+a name and prefix on initialization. Instead of repeating that
+information you can just use a template and have the information automatically
+populated for you by the container itself. For instance, in the aforementioned
+example, container.args=["{{name}}"] would substitute the value of
+container.name in as an argument. If the template contains the substituted
+attribute alone, the type will also be converted.
Happi provides some containers for your convenience, but intentionally does
+not support all use cases or control systems in a monolithic fashion.
+
The suggested method for supporting your new package would be to make your
+package have a dependency on happi, of course, and subclass HappiItem
+to make a new container in your own package.
+
Then, add an
+entry point
+specified by the happi.containers keyword to your package’s pyproject.toml.
+Example entry points can be found here.
+
HappiRegistry takes care of loading the entry points
+and making them available throughout the library.
In order for the database to be as easy to parse as possible we need to
+establish conventions on how information is entered. Please read through this
+before entering any information into the database.
This class is now part of pcdsdevices. It remains documented here as
+PCDS is the original developer and primary user of happi as of the time of
+writing. If you intend to use the same metadata that we do, please copy and
+repurpose the LCLSItem class.
+
+
beamline
+
Beamline is required. While it is expected to be one of the following, it
+is not enforced:
This backend connects to the LCLS questionnaire and looks at items with the
+key pattern pcds-{}-setup-{}-{}. These fields are then combined and turned
+into proper happi items. The translation of table name to happi.HappiItem
+is determined by the translations dictionary. The beamline is
+determined by looking where the proposal was submitted.
+
Unlike the other backends, this one is read-only. All changes to the device
+information should be done via the web interface. Finally, in order to
+avoid duplicating any code needed to search the device database, the
+QSBackend inherits directly from JSONBackend. Many of the methods are
+unmodified with exception being that this backend merely searches through
+an in-memory dictionary whereas the JSONBackend reads from a file before
+searches.
+
+
Parameters:
+
+
expname (str) – The experiment name from the elog, e.g. xcslp1915.
+
url (str, optional) – Provide a base URL for the Questionnaire. If left as None the
+appropriate URL will be chosen based on your authentication method.
+
use_kerberos (bool, optional) – Use a Kerberos ticket to login to the Questionnaire. This is the
+default authentication method.
+
user (str, optional) – A username for ws_auth sign-in. If not provided the current login name
+is used.
+
pw (str, optional) – A password for ws_auth sign-in. If not provided a password will be
+requested.
+
cfg_path (str, optional) – Path to the happi config.
Happi is a database-backed library that was originally created to hold
+information about devices along SLAC’s Linac Coherent Light Source beamline.
+Though initially purpose-built, happi provides a framework for general indexing
+of devices or things that correspond to Python objects.
+
Happi will help you create and index your objects, search through them, and
+provide relevant metadata based on the object type.
The happi client communicates with pre-configured database using an internal
+“backend”. Supported backends include JSON (with a file on disk) and MongoDB
+currently.
+
A HappiItem container class describes metadata about a Python object and
+information on how to instantiate it.
+
HappiItem may be customized for your own purposes through subclassing.
+
Container classes have entries - marked by EntryInfo instances - that
+define the top-level keys and values of the item.
+
The basic HappiItem has entries that tell happi how to import and
+instantiate a specific Python object. The fields required for this are
+device_class, args, and kwargs. In short, the effect of loading
+this device would be to importdevice_class and instantiate it by way of
+device_class(*args,**kwargs).
+
This resulting object is also referred to as a Device, borrowing the name
+from the library ophyd.
Updated happiload to support searching and loading in one user-friendly expression. The load function now gathers the results of each search term individually and loads the union of the results.
Adds error handling for the temporary file created when initializing a json backend object.
+
Changes format of temporary file name generation to contain only a unique hash.
+
Tests modified to no longer assert stdout matches expected strings. Rather the effect of the
+command being tested is verified independently. The assert_match_expected helper is still
+used, but will now print mismatches instead of asserting them.
+
Allows happiupdate to handle json-backend-type payloads
+
Adds pcdsutils and pcdsdevices to environment requirements in conda recipe and dev requirements
+
Removes pcdsutils and pcdsdevices from extra testing requirements in github workflow
+
The happiaudit CLI entrypoint has been modified to use
+happi.audit.audit().
+
Updates mongo backend to handle authSource, require connection information (host, user, etc)
+
Documents bson dependency. Bson is vendored by pymongo, which instructs
+users to not install bson from pypi (pymongoreadme)
CLI command happiconfigedit - open config file in $EDITOR
+
CLI command happiconfiginit - create new config file with default options
+
CLI command happiconfigshow - show location & contents of config file
+
Extend the config searching mechanism to check the platformdirs config directory.
+The happi config file path is taken from the HAPPI_CFG environment variable,
+but if the variable is not set then the following locations are searched in order
+for files named .happi.cfg or happi.cfg:
+
+
The location specified by the XDG_CONFIG_HOME environment variable
+
~/.config
+
(new) The location specified by platformdirs.user_config_dir("happi")
Adds a hook in happi.loader.from_container that runs the method
+post_happi_md on an instantiated object after the metadata
+container has been attached.
+This allows a clear method for objects to interact with
+happi metadata if desired.
Makes HappiDeviceTreeView more tolerant of items with missing metadata keys.
+Items missing the key used to group the tree view will be organized
+into a catch-all “[KEY NOT FOUND]” group.
Adds happirepair command, for synchronizing backend database with fields expected by container.
+Adds a corresponding audit function.
+
Adds audit functions that check the connection status of all signals in an
+ophyd device (check_wait_connection) and verify any fields requested by
+args/kwargs exist in the database (check_args_kwargs_match).
+
Adds happiaudit-d/--details option to print the source of a requested
+audit function.
+
Adds the happidelete CLI tool for deleting entries from the happi database.
Fix an issue where an ill-timed interrupt of the json backend’s
+store operation could truncate the data file. This also removes
+the implicit/optional dependency on fcntl.
Added EntryInfo keyword argument include_default_as_kwarg. If set to False,
+any keys that are included in an item’s kwargs that match the default of their
+corresponding EntryInfo will be omitted from the keyword arguments passed to
+device_class when instantiating (loading) the item as in happi.loader.load_device or
+SearchResult.get().
+If the kwargs EntryInfo sets include_default_as_kwarg=True,
+the setting on the corresponding EntryInfo will be used to decide
+whether or not to omit a keyword argument.
+If the kwargs EntryInfo sets include_default_as_kwarg=False,
+the setting on corresponding EntryInfo will be ignored.
+The default value is True on all EntryInfo instances, retaining the original behavior.
+
For happi load, fall back to Python REPL if IPython is not available.
+
Added MultiBackend, which allows a happi Client to serve information
+from multiple databases simultaneously. Updates config parsing logic
+to match.
+
Added happiaudit function for running checks on happi database items.
Fix a rare race condition related to reading a json device database
+twice in a command line search command between database updates.
+
Issue where happi Client would repeatedly (and unnecessarily) make database
+backend calls has been fixed.
+
Allow int search values to match their float counterparts
+
The happi container registry is loaded at first use and not on import. This
+can result in increased performance where the happi database is not used.
+It also fixes a scenario in which a module that defines a happi container
+attempts to import certain classes from happi.
Added the enforce_doc argument to EntryInfo. This lets us explain
+what the entry info represents and how it is meant to be filled out
+in more explicit words when it would be helpful to do.
+
Added methods to client and cli entry points for changing the container
+of a happi item. This will walk the user through the process of
+switching to or between custom containers while making sure we adhere
+to the defined EntryInfo. Check out happitransfer--help for
+command-line usage or Client.change_container for library usage.
+
Added the option to pick between glob and regex searching from the CLI,
+rather than only allowing glob as in the past.
+Give happisearch--regex a try and check out happisearch--help
+for more information.
Refactored the CLI to use click instead of bare argparse.
+This implementation is much cleaner and will lead to more advanced
+CLI features in the future.
+
psdm_qs_cli and pymongo are no longer required dependencies of
+happi. These have been reclassified into the run_constrained
+portion of the conda recipe bundled in this repository and will also
+be adjusted on conda-forge.
+
Improved usage and cleanup of temporary files when running the happi
+test suite.
+
Restored the automatic documention uploads.
+
Added/modified test cases to better cover search behavior.
Add --names flag to the happisearch command. This causes the
+search to output only the names of the matching devices. This is useful
+for using the output of happisearch inside another happi command,
+for example: happiload$(happisearch"*"--names).
Add happicontainer-registry command-line utility. This shows the user
+which happi containers are registered and available in their session.
+This is very useful for debugging purposes and more generally to
+understand which containers are available.
Add happiupdate<json> command-line utility. This allows the user to
+pipe in a json blob to the happi CLI to update their database. This enables
+bulk updates in a convenient way.
+
Allow short (under 3) and long (over 80) character names. Users who want
+further restrictions on names for their projects are encouraged to create
+a custom container.
+
Allow arbitrary user functions to be passed in to the EntryInfo enforce
+field, for custom validation of data. These functions should mimic the
+signature and behavior of the built-in types: take one argument, return the
+value back as-is or cast to the type, raise ValueError if there is an issue.
Fix loading of acromag io channels from the lcls questionnaire.
+Previously, these were loading full acromag devices instead of
+individual channels and were using the incorrect PVs.
+
Fix loading of Beckhoff axis motors from the lcls questionnaire.
+Previously, these were misidentified as IMS motors.
Do not raise an exception on single malformed entries uncovered during
+a search. Treat these as missing entries. This was causing an issue
+where queries like all_devices would fail outright.
+
Fix issue where device_cls string would leak through and raise a
+bad/confusing exception during create_device
Client now has a method load_device for searching the
+database for a Container and then loading the corresponding
+object based on device_class, args and kwargs. This is a
+shortcut to combine two previously existing features
+Client.find_device and happi.loader.from_container
+
Client.from_config will create a Client object from a
+provided configuration file. You can either pass this file in
+explicitly, specify it via the the environment variable
+$HAPPI_CFG, or it will be searched for in ~config or wherever
+you specify your `$XDG_CONFIG_HOME environment variable
+
Additional keywords were added to the base Device container;
+lightpath, documentation and embedded_screen,
+detailed_screen and engineering_screen
In from_container, the provided container is compared against the
+cached version of the device to find discrepancies. This means that
+modified container objects will always load a new Device.
+(#62)
+
The QSBackend uses newer methods available in the psdm_qs_cli to
+determine the proposal from the experiment name. This is more robust
+against exotic experiment naming schemas than prior implementations
+(#68)
The QSBackend guesses which a type of motor based on the
+prefix. Currently this supports Newport, IMS, and
+PMC100 motors. While there is not an explicit dependency, this
+will require pcdsdevices>=0.5.0 to load properly
+(#51)
happi now handles loading devices with the built-in EntryInfo
+-> args, kwargs and device_class. Simply enter the proper information
+in these fields, either directly inputting information or using
+jinja2 templating. The functions from_container and
+load_devices will then handle the necessary imports and
+initialize devices for you
+
Select which backend you want to use with the environment variable
+$HAPPI_BACKEND
+
Backend to read from the PCDS Questionnaire
+
All containers work out of the box with pcdsdevices>=0.3.0 ##
+API
+
All backends are stored in the backends directory.
+
The default plugin is now considered to be JSONBackend
+
The function formerly called load_device is now find_device.
happi now supports multiple backends. The required database
+operations are templated in the happi.backends.Backend The
+existing mongoDB support was kept as the default, but the an
+additional JSON backend was added. The choice of database type can be
+entered as an argument to the happi.Client
+
Conda builds of happi are now available at skywalker-tag and
+skywalker-dev