diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/doctrees/changelog.doctree b/doctrees/changelog.doctree new file mode 100644 index 00000000..6932afa2 Binary files /dev/null and b/doctrees/changelog.doctree differ diff --git a/doctrees/citing.doctree b/doctrees/citing.doctree new file mode 100644 index 00000000..182972f9 Binary files /dev/null and b/doctrees/citing.doctree differ diff --git a/doctrees/environment.pickle b/doctrees/environment.pickle new file mode 100644 index 00000000..cf781ee9 Binary files /dev/null and b/doctrees/environment.pickle differ diff --git a/doctrees/index.doctree b/doctrees/index.doctree new file mode 100644 index 00000000..80cb0cee Binary files /dev/null and b/doctrees/index.doctree differ diff --git a/doctrees/installation/configuration.doctree b/doctrees/installation/configuration.doctree new file mode 100644 index 00000000..47bcc6d5 Binary files /dev/null and b/doctrees/installation/configuration.doctree differ diff --git a/doctrees/installation/dependencies.doctree b/doctrees/installation/dependencies.doctree new file mode 100644 index 00000000..2b03ec5f Binary files /dev/null and b/doctrees/installation/dependencies.doctree differ diff --git a/doctrees/installation/index.doctree b/doctrees/installation/index.doctree new file mode 100644 index 00000000..434150d1 Binary files /dev/null and b/doctrees/installation/index.doctree differ diff --git a/doctrees/installation/test.doctree b/doctrees/installation/test.doctree new file mode 100644 index 00000000..163c7f16 Binary files /dev/null and b/doctrees/installation/test.doctree differ diff --git a/doctrees/keywords.doctree b/doctrees/keywords.doctree new file mode 100644 index 00000000..a564b5ab Binary files /dev/null and b/doctrees/keywords.doctree differ diff --git a/doctrees/license.doctree b/doctrees/license.doctree new file mode 100644 index 00000000..4dd56130 Binary files /dev/null and b/doctrees/license.doctree differ diff --git a/doctrees/mispr.common.doctree b/doctrees/mispr.common.doctree new file mode 100644 index 00000000..8366f451 Binary files /dev/null and b/doctrees/mispr.common.doctree differ diff --git a/doctrees/mispr.doctree b/doctrees/mispr.doctree new file mode 100644 index 00000000..4c45f249 Binary files /dev/null and b/doctrees/mispr.doctree differ diff --git a/doctrees/mispr.gaussian.doctree b/doctrees/mispr.gaussian.doctree new file mode 100644 index 00000000..0bde6820 Binary files /dev/null and b/doctrees/mispr.gaussian.doctree differ diff --git a/doctrees/mispr.gaussian.firetasks.doctree b/doctrees/mispr.gaussian.firetasks.doctree new file mode 100644 index 00000000..b0e7689c Binary files /dev/null and b/doctrees/mispr.gaussian.firetasks.doctree differ diff --git a/doctrees/mispr.gaussian.fireworks.doctree b/doctrees/mispr.gaussian.fireworks.doctree new file mode 100644 index 00000000..07fab70f Binary files /dev/null and b/doctrees/mispr.gaussian.fireworks.doctree differ diff --git a/doctrees/mispr.gaussian.utilities.doctree b/doctrees/mispr.gaussian.utilities.doctree new file mode 100644 index 00000000..c358fb0c Binary files /dev/null and b/doctrees/mispr.gaussian.utilities.doctree differ diff --git a/doctrees/mispr.gaussian.workflows.base.doctree b/doctrees/mispr.gaussian.workflows.base.doctree new file mode 100644 index 00000000..dd19ae35 Binary files /dev/null and b/doctrees/mispr.gaussian.workflows.base.doctree differ diff --git a/doctrees/mispr.gaussian.workflows.doctree b/doctrees/mispr.gaussian.workflows.doctree new file mode 100644 index 00000000..ce6ae330 Binary files /dev/null and b/doctrees/mispr.gaussian.workflows.doctree differ diff --git a/doctrees/mispr.hybrid.doctree b/doctrees/mispr.hybrid.doctree new file mode 100644 index 00000000..2dcb38f2 Binary files /dev/null and b/doctrees/mispr.hybrid.doctree differ diff --git a/doctrees/mispr.hybrid.firetasks.doctree b/doctrees/mispr.hybrid.firetasks.doctree new file mode 100644 index 00000000..b4ee6163 Binary files /dev/null and b/doctrees/mispr.hybrid.firetasks.doctree differ diff --git a/doctrees/mispr.hybrid.workflows.doctree b/doctrees/mispr.hybrid.workflows.doctree new file mode 100644 index 00000000..716189c0 Binary files /dev/null and b/doctrees/mispr.hybrid.workflows.doctree differ diff --git a/doctrees/mispr.lammps.doctree b/doctrees/mispr.lammps.doctree new file mode 100644 index 00000000..b8c706f3 Binary files /dev/null and b/doctrees/mispr.lammps.doctree differ diff --git a/doctrees/mispr.lammps.firetasks.doctree b/doctrees/mispr.lammps.firetasks.doctree new file mode 100644 index 00000000..2b9a5b3e Binary files /dev/null and b/doctrees/mispr.lammps.firetasks.doctree differ diff --git a/doctrees/mispr.lammps.fireworks.doctree b/doctrees/mispr.lammps.fireworks.doctree new file mode 100644 index 00000000..b000de45 Binary files /dev/null and b/doctrees/mispr.lammps.fireworks.doctree differ diff --git a/doctrees/mispr.lammps.tests.doctree b/doctrees/mispr.lammps.tests.doctree new file mode 100644 index 00000000..801dbf96 Binary files /dev/null and b/doctrees/mispr.lammps.tests.doctree differ diff --git a/doctrees/mispr.lammps.utilities.doctree b/doctrees/mispr.lammps.utilities.doctree new file mode 100644 index 00000000..d24df0e1 Binary files /dev/null and b/doctrees/mispr.lammps.utilities.doctree differ diff --git a/doctrees/mispr.lammps.workflows.doctree b/doctrees/mispr.lammps.workflows.doctree new file mode 100644 index 00000000..20898a63 Binary files /dev/null and b/doctrees/mispr.lammps.workflows.doctree differ diff --git a/doctrees/modules.doctree b/doctrees/modules.doctree new file mode 100644 index 00000000..8e30b6de Binary files /dev/null and b/doctrees/modules.doctree differ diff --git a/doctrees/overview.doctree b/doctrees/overview.doctree new file mode 100644 index 00000000..8f1cbd8b Binary files /dev/null and b/doctrees/overview.doctree differ diff --git a/doctrees/resources/faq.doctree b/doctrees/resources/faq.doctree new file mode 100644 index 00000000..e407c858 Binary files /dev/null and b/doctrees/resources/faq.doctree differ diff --git a/doctrees/resources/resources.doctree b/doctrees/resources/resources.doctree new file mode 100644 index 00000000..c0a4c0c0 Binary files /dev/null and b/doctrees/resources/resources.doctree differ diff --git a/doctrees/workflows/basics.doctree b/doctrees/workflows/basics.doctree new file mode 100644 index 00000000..785cc6ae Binary files /dev/null and b/doctrees/workflows/basics.doctree differ diff --git a/doctrees/workflows/custom.doctree b/doctrees/workflows/custom.doctree new file mode 100644 index 00000000..db747459 Binary files /dev/null and b/doctrees/workflows/custom.doctree differ diff --git a/doctrees/workflows/supported.doctree b/doctrees/workflows/supported.doctree new file mode 100644 index 00000000..e81c5455 Binary files /dev/null and b/doctrees/workflows/supported.doctree differ diff --git a/doctrees/workflows/tutorials.doctree b/doctrees/workflows/tutorials.doctree new file mode 100644 index 00000000..8e413367 Binary files /dev/null and b/doctrees/workflows/tutorials.doctree differ diff --git a/html/.buildinfo b/html/.buildinfo new file mode 100644 index 00000000..dfa58080 --- /dev/null +++ b/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 53aa0c497316ff79c248f7e4f876c526 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib b/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib new file mode 100644 index 00000000..af6f0ea5 --- /dev/null +++ b/html/_downloads/06920989aa58eec95718018206509e48/nmr_citation.bib @@ -0,0 +1,10 @@ +@article{atwi2022automated, + title={An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions}, + author={Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi}, + journal={Nature Computational Science}, + volume={2}, + number={2}, + pages={112--122}, + year={2022}, + publisher={Nature Publishing Group} +} diff --git a/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py b/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py new file mode 100644 index 00000000..3ab646df --- /dev/null +++ b/html/_downloads/d67a679cb2e669df06832fe26664fc83/esp_tutorial.py @@ -0,0 +1,16 @@ +from fireworks import LaunchPad + +from mispr.gaussian.workflows.base.esp import get_esp_charges + +lpad = LaunchPad.auto_load() + +wf, _ = get_esp_charges( + mol_operation_type="get_from_pubchem", # (1)! + mol="monoglyme", + format_chk=True, + save_to_db=True, + save_to_file=True, + additional_prop_doc_fields={"name": "monoglyme"}, + tag="mispr_tutorial", +) +lpad.add_wf(wf) # (2)! diff --git a/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib b/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib new file mode 100644 index 00000000..3d60a500 --- /dev/null +++ b/html/_downloads/fdd29a5720b48392c0789affcc4fb5e8/mispr_citation.bib @@ -0,0 +1,5 @@ +@article{atwi2022mispr, + title={MISPR: An automated infrastructure for high-throughput DFT and MD simulations}, + author={Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi}, + year={2022} +} diff --git a/html/_images/analysis.png b/html/_images/analysis.png new file mode 100644 index 00000000..2c8fa034 Binary files /dev/null and b/html/_images/analysis.png differ diff --git a/html/_images/convergence.png b/html/_images/convergence.png new file mode 100644 index 00000000..a0abc66c Binary files /dev/null and b/html/_images/convergence.png differ diff --git a/html/_images/document.png b/html/_images/document.png new file mode 100644 index 00000000..4a59e8ef Binary files /dev/null and b/html/_images/document.png differ diff --git a/html/_images/overview.png b/html/_images/overview.png new file mode 100644 index 00000000..da7be327 Binary files /dev/null and b/html/_images/overview.png differ diff --git a/html/_images/summary.jpeg b/html/_images/summary.jpeg new file mode 100644 index 00000000..e4ae3800 Binary files /dev/null and b/html/_images/summary.jpeg differ diff --git a/html/_images/workflow.png b/html/_images/workflow.png new file mode 100644 index 00000000..e124bfdb Binary files /dev/null and b/html/_images/workflow.png differ diff --git a/html/_modules/index.html b/html/_modules/index.html new file mode 100644 index 00000000..c539eaa3 --- /dev/null +++ b/html/_modules/index.html @@ -0,0 +1,737 @@ + + + + +
+ + + + + + + + + + +
+"""Define functions for cleaning up JSON documents."""
+
+import os
+import logging
+
+from pymatgen.io.gaussian import GaussianInput
+from pymatgen.core.structure import Molecule
+
+from mispr.gaussian.defaults import JOB_TYPES, SCRF_MODELS
+from mispr.gaussian.utilities.metadata import get_chem_schema
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+def _job_types(gin):
+ """
+ Determine the type of the Gaussian job (e.g. opt, freq, etc.) from a Gaussian input
+ dictionary.
+
+ Args:
+ gin (dict): Gaussian input dictionary.
+
+ Returns:
+ list: List of Gaussian job types.
+ """
+ return sorted(
+ list(
+ filter(
+ lambda x: x
+ in {k.lower(): v for k, v in gin["route_parameters"].items()},
+ JOB_TYPES,
+ )
+ )
+ )
+
+
+def _modify_gout(gout):
+ """
+ Modify the Gaussian output dictionary by removing unnecessary keys and restructuring
+ its format to match the schema of the db.
+
+ Args:
+ gout (dict): Gaussian output dictionary.
+
+ Returns:
+ dict: Modified Gaussian output dictionary.
+ """
+ gout["input"]["charge"] = gout["charge"]
+ gout["input"]["spin_multiplicity"] = gout["spin_multiplicity"]
+ del_keys_out = (
+ "nsites",
+ "unit_cell_formula",
+ "reduced_cell_formula",
+ "pretty_formula",
+ "elements",
+ "nelements",
+ "charge",
+ "spin_multiplicity",
+ )
+ [gout.pop(k, None) for k in del_keys_out]
+ return gout
+
+
+def _create_gin(gout, working_dir, input_file):
+ """
+ Create a Gaussian input dictionary to be used for creating Gaussian documents in
+ the db; if an input_file is provided, content of the dictionary is mostly taken from
+ it; otherwise, uses the gout to create the dictionary.
+
+ Args:
+ gout (dict): Gaussian output dictionary.
+ working_dir (str): Working directory of the Gaussian input_file.
+ input_file (str): Relative or absolute path to the input_file.
+
+ Returns:
+ dict: Gaussian input dictionary.
+ """
+ if input_file:
+ if not os.path.isabs(input_file):
+ input_path = os.path.join(working_dir, input_file)
+ else:
+ input_path = input_file
+ gin = GaussianInput.from_file(input_path).as_dict()
+ gin["nbasisfunctions"] = gout["input"]["nbasisfunctions"]
+ gin["pcm_parameters"] = gout["input"]["pcm_parameters"]
+ return gin
+ else:
+ gin = gout["input"]
+ gin["input_parameters"] = None
+ gin["@class"] = "GaussianInput"
+ gin["@module"] = "pymatgen.io.gaussian"
+ logger.info(
+ "input parameters at the end of the Gaussian input "
+ "section will not be saved to the database due to "
+ "a missing input file"
+ )
+ return gin
+
+
+def _cleanup_gout(gout, working_dir, input_file):
+ """
+ Clean up the Gaussian dictionary to be saved in the database.
+
+ Args:
+ gout (dict): Gaussian output dictionary.
+ working_dir (str): Working directory of the Gaussian input_file.
+ input_file (str): Relative or absolute path to the input_file.
+
+ Returns:
+ dict: Cleaned up Gaussian dictionary.
+ """
+ gout = _modify_gout(gout)
+ gin = _create_gin(gout, working_dir, input_file)
+ del gout["input"]
+ gauss_version = gout["output"]["gauss_version"]
+ del gout["output"]["gauss_version"]
+ job_types = _job_types(gin)
+ mol = Molecule.from_dict(gout["output"]["molecule"])
+ gout_dict = {
+ "input": gin,
+ "output": gout,
+ "functional": gin["functional"],
+ "basis": gin["basis_set"],
+ "phase": "solution" if gout["is_pcm"] else "gas",
+ "type": ";".join(job_types),
+ **get_chem_schema(mol),
+ "gauss_version": gauss_version,
+ }
+ gout_dict = {
+ i: j
+ for i, j in gout_dict.items()
+ if i not in ["sites", "@module", "@class", "charge", "spin_multiplicity"]
+ }
+ return gout_dict
+
+
+[docs]def add_solvent_to_prop_dict(prop_dict, solvent_gaussian_inputs, solvent_properties):
+ """
+ Add solvent properties to a property dictionary (e.g. BDE, BE, etc.).
+
+ Args:
+ prop_dict (dict): Property dictionary.
+ solvent_gaussian_inputs (str): Gaussian input parameters corresponding to the
+ implicit solvent model used in the Gaussian calculations, e.g.
+ "(Solvent=TetraHydroFuran)".
+ solvent_properties (dict): Additional solvent input parameters used in the
+ Gaussian calculations; e.g., {"EPS":12}.
+
+ Returns:
+ dict: Property dictionary with solvent properties added.
+ """
+ if not solvent_gaussian_inputs:
+ solvent = "water"
+ solvent_model = "pcm"
+ else:
+ solvent_inputs = [
+ i.lower() for i in solvent_gaussian_inputs.strip("()").split(",")
+ ]
+ solvent = [
+ string.split("=")[1] for string in solvent_inputs if "solvent" in string
+ ] or ["water"]
+ solvent_model = list(
+ filter(lambda x: x in {i for i in solvent_inputs}, SCRF_MODELS)
+ ) or ["pcm"]
+ prop_dict["solvent"] = "".join(solvent)
+ prop_dict["solvent_model"] = "".join(solvent_model)
+ prop_dict["solvent_properties"] = solvent_properties
+ return prop_dict
+
+"""Define utility functions for handling files and paths."""
+
+import os
+import logging
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+[docs]def bibtex_parser(bib_file, working_dir):
+ """
+ Parse a bibtex file and returns a dictionary of the entries.
+
+ Args:
+ bib_file (str): Relative or absolute path to the bibtex file.
+ working_dir (str): Name of the working directory where the bibtex file is
+ located if bib_file path is relative; else None.
+
+ Returns:
+ dict: Dictionary of the entries in the bibtex file.
+ """
+ try:
+ import bibtexparser
+ except ModuleNotFoundError:
+ raise ImportError(
+ "Defining standard electrode potential "
+ "references requires bibtexparser to be "
+ "installed."
+ )
+ bib_file = recursive_relative_to_absolute_path(bib_file, working_dir)
+ print(bib_file)
+ with open(bib_file) as bibfile:
+ bp = bibtexparser.load(bibfile)
+ entry = bp.entries[0]
+ return entry
+
+
+[docs]def recursive_relative_to_absolute_path(operand, working_dir):
+ """
+ Convert recursively relative paths to absolute paths.
+
+ Args:
+ operand (str, list, dict): File, list of files, or a dictionary where the values
+ are the files; the file(s) path can be relative or absolute.
+ working_dir (str): Name of the working directory where the file(s) is/are
+ located if operand path is relative; else None.
+
+ Returns:
+ str or list or dict: File, list of files, or dict where the values are the
+ absolute paths.
+ """
+ if isinstance(operand, str):
+ if os.path.isabs(operand):
+ return operand
+ elif os.path.exists(operand):
+ return os.path.join(os.getcwd(), operand)
+ else:
+ full_path = os.path.join(working_dir, operand)
+ if os.path.exists(full_path):
+ return full_path
+ else:
+ return operand
+ elif isinstance(operand, dict):
+ return {
+ i: recursive_relative_to_absolute_path(j, working_dir)
+ for i, j in operand.items()
+ }
+ elif isinstance(operand, list):
+ return [recursive_relative_to_absolute_path(i, working_dir) for i in operand]
+ else:
+ return operand
+
+"""Define functions for handling gaussian inputs."""
+
+import logging
+
+from copy import deepcopy
+
+from mispr.gaussian.defaults import STANDARD_OPT_GUASSIAN_INPUT
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+def _add_solvent_inputs(
+ gaussian_inputs, solvent_gaussian_inputs, solvent_properties=None
+):
+ """
+ Add solvent inputs to the gaussian_inputs dict. The input parameters relevant to
+ implicit solvation are required to be provided separate from the gaussian_inputs
+ dict to the Gaussian workflows. This is done in order to easily save the solvent
+ properties to the database or to the json files generated from the workflows.
+
+ Args:
+ gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs for one
+ or more Gaussian job type, e.g.
+
+ .. code-block:: python
+
+ {"opt": {
+ "functional": "B3LYP",
+ "basis_set": "6-31G",
+ "route_parameters": {
+ "Opt": "(calcfc, tight)",
+ "test": None},
+ }
+ }
+
+ solvent_gaussian_inputs (str): String of Gaussian inputs for the solvent, e.g.
+ "(Solvent=Generic, Read)".
+ solvent_properties (dict, optional): Dictionary of solvent properties, e.g.
+ {"Eps": 4.33, "EpsInf": 1.69}.
+
+ Returns:
+ dict: Dictionary of dictionaries of Gaussian inputs with solvent inputs added.
+ """
+ if "generic" in solvent_gaussian_inputs.lower() and not solvent_properties:
+ raise Exception(
+ "A generic solvent is provided as an input without "
+ "specifying its parameters."
+ )
+ for key, value in gaussian_inputs.items():
+ if "route_parameters" not in value:
+ gaussian_inputs[key]["route_parameters"] = {}
+ gaussian_inputs[key]["route_parameters"]["SCRF"] = solvent_gaussian_inputs
+ if solvent_properties:
+ if "input_parameters" not in gaussian_inputs[key]:
+ gaussian_inputs[key]["input_parameters"] = {}
+ gaussian_inputs[key]["input_parameters"].update(solvent_properties)
+ return gaussian_inputs
+
+
+def _check_solvent_inputs(gaussian_inputs):
+ """
+ Ensure that implicit solvent parameters are not included in the Gaussian input
+ dictionaries, since those should be provided separately.
+
+ Args:
+ gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs for one
+ or more Gaussian job type, e.g.
+
+ .. code-block:: python
+ {"opt": {
+ "functional": "B3LYP",
+ "basis_set": "6-31G",
+ "route_parameters": {
+ "Opt": "(calcfc, tight)",
+ "test": None},
+ }
+ }
+ """
+ route_params = {}
+ for key, value in gaussian_inputs.items():
+ if value:
+ route_params.update(value.get("route_parameters", {}))
+ assert "scrf" not in [i.lower() for i in route_params], (
+ "solvent inputs should be provided as separate inputs via "
+ "solvent_gaussian_inputs and solvent_properties"
+ )
+
+
+def _get_gaussian_inputs(gaussian_inputs, supported_jobs=None):
+ """
+ This function is meant to be used in workflows in which multiple Gaussian jobs are
+ performed and the jobs share similar Gaussian keywords; used to handle situations
+ in which the user is not explicitly defining every single job input dictionary.
+
+ Args:
+ gaussian_inputs (dict): Dictionary of dictionaries of Gaussian input parameters
+ for different job types in a given workflow, e.g.
+
+ .. code-block:: python
+ {"opt": {}, "freq": {}, "nmr": {}, "esp": {}, "sp": {}}
+
+ supported_jobs (dict, optional): Dictionary of dictionaries of supported job
+ types and their main inputs, e.g.
+
+ .. code-block:: python
+ {"opt": {"Opt": None}, "nmr": {"NMR": "GIAO"}}
+
+ Returns:
+ dict: Dictionary of dictionaries of Gaussian input parameters.
+ """
+ supported_jobs = supported_jobs or {}
+ supported_jobs = {
+ **{
+ "freq": {"Freq": None},
+ "nmr": {"NMR": "GIAO"},
+ "esp": {"pop": "MK", "iop(6/50=1)": None},
+ "sp": {"SP": None},
+ },
+ **{k.lower(): v for k, v in supported_jobs.items()},
+ }
+
+ gaussian_inputs = {
+ k.lower(): v if v is not None else {} for k, v in gaussian_inputs.items()
+ }
+
+ if "opt" not in gaussian_inputs:
+ gaussian_inputs["opt"] = {}
+ gaussian_inputs["opt"] = {**STANDARD_OPT_GUASSIAN_INPUT, **gaussian_inputs["opt"]}
+ if "opt" not in [i.lower() for i in gaussian_inputs["opt"]["route_parameters"]]:
+ gaussian_inputs["opt"]["route_parameters"].update({"Opt": None})
+
+ for job in gaussian_inputs:
+ if job in supported_jobs and job != "opt":
+ gaussian_inputs[job] = _update_gaussian_inputs(
+ deepcopy(gaussian_inputs["opt"]),
+ gaussian_inputs[job],
+ supported_jobs[job],
+ )
+ elif job == "opt":
+ pass
+ else:
+ logger.error(
+ "keyword for {} is not known. Please add keyword to "
+ "the supported_jobs dict.".format(job)
+ )
+ return gaussian_inputs
+
+
+def _update_gaussian_inputs(opt_gaussian_inputs, other_gaussian_inputs, main_keyword):
+ """
+ Use the fully defined optimization input parameters to fill in the input parameters
+ for other job types in a given workflow. Done to avoid having to define every single
+ job input dictionary.
+
+ Args:
+ opt_gaussian_inputs (dict): Dictionary of Gaussian input parameters for the
+ optimization step of a given workflow.
+ other_gaussian_inputs (dict): Dictionary of Gaussian inputs other than the
+ route_parameters (e.g. input_parameters) for a job other than optimization
+ in a given workflow.
+ main_keyword (dict): Simple dictionary containing the main Gaussian
+ route_parameters for the job type, e.g. {"Freq": None} for a frequency
+ analysis.
+
+ Returns:
+ dict: Dictionary of Gaussian input parameters for a job other than optimization.
+ """
+ gaussian_inputs = {**opt_gaussian_inputs, **other_gaussian_inputs}
+ if list(main_keyword.keys())[0].lower() not in [
+ i.lower() for i in gaussian_inputs["route_parameters"]
+ ]:
+ gaussian_inputs["route_parameters"].update(main_keyword)
+ for i in gaussian_inputs["route_parameters"]:
+ if i.lower() == "opt":
+ del gaussian_inputs["route_parameters"][i]
+ break
+ return gaussian_inputs
+
+
+[docs]def handle_gaussian_inputs(
+ gaussian_inputs, solvent_gaussian_inputs=None, solvent_properties=None
+):
+ """
+ Wrapper function to cleanup/modify the Gaussian input parameters for one or more
+ job in a workflow. Checks for implicit solvent parameters and adds missing keywords
+ for a given job.
+
+ Args:
+ gaussian_inputs (dict): Dictionary of dictionaries of Gaussian inputs, e.g.
+
+ .. code-block:: python
+
+ {"opt": {opt_gaussian_inputs}, "freq": {freq_gaussian_inputs}}
+
+ solvent_gaussian_inputs (str, optional): String of Gaussian inputs for the
+ solvent, e.g.
+
+ .. code-block:: python
+
+ "(Solvent=Generic, Read)"
+
+ solvent_properties (dict, optional): Dictionary of solvent properties, e.g.
+
+ .. code-block:: python
+
+ {"Eps": 4.33, "EpsInf": 1.69}
+
+ Returns:
+ dict: Dictionary of dictionaries of reformatted Gaussian inputs.
+ """
+ gaussian_inputs = _get_gaussian_inputs(gaussian_inputs)
+ _check_solvent_inputs(gaussian_inputs)
+ if solvent_gaussian_inputs:
+ gaussian_inputs = _add_solvent_inputs(
+ gaussian_inputs, solvent_gaussian_inputs, solvent_properties
+ )
+ return gaussian_inputs
+
+"""Define functions for creating db schema."""
+
+import logging
+
+from openbabel import pybel as pb
+
+from pymatgen.io.babel import BabelMolAdaptor
+from pymatgen.core.structure import Molecule
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+[docs]def get_chem_schema(mol):
+ """
+ Return a dictionary of chemical schema for a given molecule to use in building db
+ documents or json file.
+
+ Args:
+ mol (Molecule): Molecule object.
+
+ Returns:
+ dict: Chemical schema.
+ """
+ mol_dict = mol.as_dict()
+ comp = mol.composition
+ a = BabelMolAdaptor(mol)
+ pm = pb.Molecule(a.openbabel_mol)
+ # svg = pm.write('svg')
+ mol_dict.update(
+ {
+ "smiles": pm.write("smi").strip(),
+ "inchi": pm.write("inchi").strip("\n"),
+ "formula": comp.formula,
+ "formula_pretty": comp.reduced_formula,
+ "formula_anonymous": comp.anonymized_formula,
+ "formula_alphabetical": comp.alphabetical_formula,
+ "chemsys": comp.chemical_system,
+ "nsites": mol.num_sites,
+ "nelements": len(comp.chemical_system.replace("-", " ").split(" ")),
+ "is_ordered": mol.is_ordered,
+ "is_valid": mol.is_valid(),
+ }
+ )
+ return mol_dict
+
+
+[docs]def get_mol_formula(mol):
+ """
+ Get the alphabetical molecular formula for a molecule.
+
+ Args:
+ mol (Molecule): Molecule object
+
+ Returns:
+ str: Alphabetical molecular formula.
+ """
+ mol_schema = get_chem_schema(mol)
+ return mol_schema["formula_alphabetical"].replace(" ", "")
+
+
+[docs]def get_job_name(mol, name):
+ """
+ Append a molecule label to the name of a workflow for easy monitoring and
+ identification.
+
+ Args:
+ mol (Molecule or str): If a Molecule is provided, the appended label will be
+ the molecular formula; otherwise the label will be the provided string.
+ name (str): Original name of the workflow.
+
+ Returns:
+ str: Job name with molecule label.
+ """
+ if not isinstance(mol, Molecule):
+ job_name = "{}_{}".format(mol, name)
+ else:
+ mol_formula = get_mol_formula(mol)
+ job_name = "{}_{}".format(mol_formula, name)
+ return job_name
+
+"""Define miscellaneous functions useful in many of the mispr levels."""
+
+import logging
+
+__author__ = "Rasha Atwi"
+__maintainer__ = "Rasha Atwi"
+__email__ = "rasha.atwi@stonybrook.edu"
+__status__ = "Development"
+__date__ = "Jan 2021"
+__version__ = "0.0.4"
+
+logger = logging.getLogger(__name__)
+
+
+[docs]def pass_gout_dict(fw_spec, key):
+ """
+ Helper function used in the Gaussian Fireworks to pass Gaussian output dictionaries
+ from one task to the other, while checking that the criteria for starting the
+ following task are met (e.g. normal termination of the previous job, lack of
+ imaginary frequencies, etc.).
+
+ Args:
+ fw_spec (dict): Firework spec dictionary.
+ key (str): Unique key for the Gaussian output dictionary in fw_spec.
+
+ Returns:
+ dict: Gaussian output dictionary.
+ """
+ gout_dict = fw_spec.get("gaussian_output", {}).get(key)
+ proceed_keys = fw_spec.get("proceed", {})
+ for k, v in proceed_keys.items():
+ if gout_dict["output"].get(k, gout_dict["output"]["output"].get(k)) != v:
+ raise ValueError(f"The condition for {k} is not met, Terminating")
+ return gout_dict
+
+
+[docs]def recursive_signature_remove(d):
+ """
+ Remove Recursively the signature "@" from a dictionary (e.g. those in the name of
+ a module). Used when processing Gaussian runs before saving them to the db.
+
+ Args:
+ d (dict): Dictionary to remove the signature from.
+
+ Returns:
+ dict: Dictionary with the signature removed.
+ """
+ # TODO: check if this is no longer an issue with MongoDB 5.0
+ if isinstance(d, dict):
+ return {
+ i: recursive_signature_remove(j)
+ for i, j in d.items()
+ if not i.startswith("@")
+ }
+ else:
+ return d
+
+
+[docs]def recursive_compare_dicts(dict1, dict2, dict1_name, dict2_name, path=""):
+ """
+ Compare recursively two dictionaries and returns the differences.
+
+ Args:
+ dict1 (dict): First dictionary to compare.
+ dict2 (dict): Second dictionary to compare.
+ dict1_name (str): Name of the first dictionary (for messages on the differences).
+ dict2_name (str): Name of the second dictionary (for messages on the differences).
+ path (str, optional): Used internally to keep track of the keys in nested dicts,
+ meant to be "" for the top level
+
+ Returns:
+ str: Differences between the two dictionaries (if any).
+ """
+ error = ""
+ old_path = path
+ for key in dict1.keys():
+ path = f"{old_path}[{key}]"
+ if key not in dict2.keys():
+ error += f"Key {dict1_name}{path} not in {dict2_name}\n"
+ else:
+ if isinstance(dict1[key], dict) and isinstance(dict2[key], dict):
+ error += recursive_compare_dicts(
+ dict1[key], dict2[key], "d1", "d2", path
+ )
+ else:
+ if dict1[key] != dict2[key]:
+ error += (
+ f"Value of {dict1_name}{path} ({dict1[key]}) "
+ f"not same as {dict2_name}{path} ({dict2[key]})\n"
+ )
+
+ for key in dict2.keys():
+ path = f"{old_path}[{key}]"
+ if key not in dict1.keys():
+ error += f"Key {dict2_name}{path} not in {dict1_name}\n"
+ return error
+
Short
+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/html/_static/copybutton.js b/html/_static/copybutton.js new file mode 100644 index 00000000..2ea7ff3e --- /dev/null +++ b/html/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': 'Β‘Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'CopiΓ© !', + 'copy_failure': 'Γchec de la copie', + }, + 'ru': { + 'copy': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ', + 'copy_to_clipboard': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π±ΡΡΠ΅Ρ', + 'copy_success': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΎ!', + 'copy_failure': 'ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ', + }, + 'zh-CN': { + 'copy': 'ε€εΆ', + 'copy_to_clipboard': 'ε€εΆε°εͺθ΄΄ζΏ', + 'copy_success': 'ε€εΆζε!', + 'copy_failure': 'ε€εΆε€±θ΄₯', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = `` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = `` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/html/_static/copybutton_funcs.js b/html/_static/copybutton_funcs.js new file mode 100644 index 00000000..dbe1aaad --- /dev/null +++ b/html/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/html/_static/css/rtd_sphinx_search.min.css b/html/_static/css/rtd_sphinx_search.min.css new file mode 100644 index 00000000..b52e1909 --- /dev/null +++ b/html/_static/css/rtd_sphinx_search.min.css @@ -0,0 +1 @@ +@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.search__backdrop,.search__outer__wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:700}.search__backdrop{z-index:500;display:none;background-color:rgba(0,0,0,.502)}.search__outer{margin:auto;position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000;height:80%;width:80%;max-height:1000px;max-width:1500px;padding:10px;overflow-y:scroll;border:1px solid #e0e0e0;line-height:1.875;background-color:#fcfcfc;-webkit-box-shadow:1px 3px 4px rgba(0,0,0,.09);box-shadow:1px 3px 4px rgba(0,0,0,.09);text-align:left}.search__outer::-webkit-scrollbar-track{border-radius:10px;background-color:#fcfcfc}.search__outer::-webkit-scrollbar{width:7px;height:7px;background-color:#fcfcfc}.search__outer::-webkit-scrollbar-thumb{border-radius:10px;background-color:#8f8f8f}.search__cross__img{width:15px;height:15px;margin:12px}.search__cross{position:absolute;top:0;right:0}.search__cross:hover{cursor:pointer}.search__outer__input{width:90%;height:30px;font-size:19px;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fcfcfc;border:0;border-bottom:1px solid #757575;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDUxIDQ1MSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDUxIDQ1MTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ0Ny4wNSw0MjhsLTEwOS42LTEwOS42YzI5LjQtMzMuOCw0Ny4yLTc3LjksNDcuMi0xMjYuMUMzODQuNjUsODYuMiwyOTguMzUsMCwxOTIuMzUsMEM4Ni4yNSwwLDAuMDUsODYuMywwLjA1LDE5Mi4zDQoJCXM4Ni4zLDE5Mi4zLDE5Mi4zLDE5Mi4zYzQ4LjIsMCw5Mi4zLTE3LjgsMTI2LjEtNDcuMkw0MjguMDUsNDQ3YzIuNiwyLjYsNi4xLDQsOS41LDRzNi45LTEuMyw5LjUtNA0KCQlDNDUyLjI1LDQ0MS44LDQ1Mi4yNSw0MzMuMiw0NDcuMDUsNDI4eiBNMjYuOTUsMTkyLjNjMC05MS4yLDc0LjItMTY1LjMsMTY1LjMtMTY1LjNjOTEuMiwwLDE2NS4zLDc0LjIsMTY1LjMsMTY1LjMNCgkJcy03NC4xLDE2NS40LTE2NS4zLDE2NS40QzEwMS4xNSwzNTcuNywyNi45NSwyODMuNSwyNi45NSwxOTIuM3oiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-position:left;background-size:15px 15px;padding-left:25px}.search__outer__input:focus{outline:0}.search__outer .bar{position:relative;display:block;width:90%;margin-bottom:15px}.search__outer .bar:after,.search__outer .bar:before{content:"";height:2px;width:0;bottom:1px;position:absolute;background:#5264ae;-webkit-transition:.2s ease all;-o-transition:.2s ease all;transition:.2s ease all}.search__outer .bar:before{left:50%}.search__outer .bar:after{right:50%}.search__outer__input:focus~.bar:after,.search__outer__input:focus~.bar:before{width:50%}.search__result__box{padding:0 10px}.search__result__single{margin-top:10px;border-bottom:1px solid #e6e6e6}.outer_div_page_results:hover,.search__result__box .active{background-color:#f5f5f5}.search__error__box{color:#000;min-width:300px;font-weight:700}.outer_div_page_results{margin:5px 0;overflow:auto;padding:3px 5px}.search__result__single a{text-decoration:none;cursor:pointer}.search__result__title{display:inline-block;font-weight:500;margin-bottom:15px;margin-top:0;font-size:15px;color:#6ea0ec;border-bottom:1px solid #6ea0ec}.search__result__subheading{color:#000;font-weight:700;float:left;width:20%;font-size:15px;margin-right:10px;word-break:break-all;overflow-x:hidden}.search__result__content{text-decoration:none;color:#000;font-size:15px;display:block;margin:0;line-height:inherit;float:right;width:calc(80% - 15px);text-align:left}.search__outer span{font-style:normal}.search__outer .search__result__title span{background-color:#e5f6ff;padding-bottom:3px;border-bottom-color:#000}.search__outer .search__result__content span{background-color:#e5f6ff;border-bottom:1px solid #000}.search__result__subheading span{border-bottom:1px solid #000}.br-for-hits{display:block;content:"";margin-top:10px}.rtd_ui_search_subtitle{all:unset;color:inherit;font-size:85%}.rtd__search__credits{margin:auto;position:absolute;top:0;left:0;right:0;bottom:calc(-80% - 20px);width:80%;max-width:1500px;height:30px;overflow:hidden;background:#eee;z-index:100000;border:1px solid #eee;padding:5px 10px;text-align:center;color:#000}.rtd__search__credits a{color:#000;text-decoration:underline}.search__domain_role_name{font-size:80%;letter-spacing:1px}.search__filters{padding:0 10px}.search__filters li,.search__filters ul{display:-webkit-box;display:-ms-flexbox;display:flex}.search__filters ul{list-style:none;padding:0;margin:0}.search__filters li{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-right:15px}.search__filters label{margin:auto}.search__filters .search__filters__title,.search__filters label{color:#000;font-size:15px}@media (max-width:670px){.rtd__search__credits{height:50px;bottom:calc(-80% - 40px);overflow:hidden}}@media (min-height:1250px){.rtd__search__credits{bottom:calc(-1000px - 30px)}}@media (max-width:630px){.search__result__content,.search__result__subheading{float:none;width:90%}} \ No newline at end of file diff --git a/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/html/_static/design-tabs.js b/html/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/html/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/html/_static/document.png b/html/_static/document.png new file mode 100644 index 00000000..4a59e8ef Binary files /dev/null and b/html/_static/document.png differ diff --git a/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 b/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 new file mode 100644 index 00000000..ab301009 Binary files /dev/null and b/html/_static/fonts/0053ba6958e79f26751eabb555bd73d0.woff2 differ diff --git a/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 b/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 new file mode 100644 index 00000000..09e03c95 Binary files /dev/null and b/html/_static/fonts/029e176ad602329b4434892101db9cf3.woff2 differ diff --git a/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 b/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 new file mode 100644 index 00000000..d338178b Binary files /dev/null and b/html/_static/fonts/07ff82964967feebb9c96288e0e0df05.woff2 differ diff --git a/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 b/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 new file mode 100644 index 00000000..6b0b4afe Binary files /dev/null and b/html/_static/fonts/0948409a22b5979aa7e1ec20da9e61f1.woff2 differ diff --git a/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 b/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 new file mode 100644 index 00000000..f477fda0 Binary files /dev/null and b/html/_static/fonts/0a0ad0eae50e549ecd713b9ad417f1a1.woff2 differ diff --git a/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 b/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 new file mode 100644 index 00000000..9a378af0 Binary files /dev/null and b/html/_static/fonts/0b68e8634c96265eb32a0c769416b5b0.woff2 differ diff --git a/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 b/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 new file mode 100644 index 00000000..48a8c10f Binary files /dev/null and b/html/_static/fonts/0d1b73eee266eabb2cff35dfa4ce25a3.woff2 differ diff --git a/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 b/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 new file mode 100644 index 00000000..6aa28456 Binary files /dev/null and b/html/_static/fonts/0e1f73c6737cdf273efb4b79504e4c0a.woff2 differ diff --git a/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf b/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf new file mode 100644 index 00000000..fbb56251 Binary files /dev/null and b/html/_static/fonts/0e326670106c8eb6a11a8c30734ecfc8.ttf differ diff --git a/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 b/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 new file mode 100644 index 00000000..5b0171c1 Binary files /dev/null and b/html/_static/fonts/0ec3cc19652785204ea2e322330f0f1b.woff2 differ diff --git a/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 b/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 new file mode 100644 index 00000000..71c9bb7d Binary files /dev/null and b/html/_static/fonts/0f303f31706d39866cced9dcc17b61fb.woff2 differ diff --git a/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 b/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 new file mode 100644 index 00000000..186d9986 Binary files /dev/null and b/html/_static/fonts/101522bafe9c61c68698ecc784607772.woff2 differ diff --git a/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 b/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 new file mode 100644 index 00000000..02a27ead Binary files /dev/null and b/html/_static/fonts/10b31f4cad9ea78d43449886bfbb88ac.woff2 differ diff --git a/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 b/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 new file mode 100644 index 00000000..59ed385e Binary files /dev/null and b/html/_static/fonts/1181a8e619707033241139715eca64c6.woff2 differ diff --git a/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 b/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 new file mode 100644 index 00000000..40b9fda9 Binary files /dev/null and b/html/_static/fonts/122802d03aed4bf8cd6a03997a97aca4.woff2 differ diff --git a/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 b/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 new file mode 100644 index 00000000..d953103e Binary files /dev/null and b/html/_static/fonts/1383417807f7965daaf94e7c497dcddb.woff2 differ diff --git a/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 b/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 new file mode 100644 index 00000000..508baefb Binary files /dev/null and b/html/_static/fonts/144860ed1e48e186f08997e6388a9c3f.woff2 differ diff --git a/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 b/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 new file mode 100644 index 00000000..bdad3dfb Binary files /dev/null and b/html/_static/fonts/1488146d8b2e9859d6c90e6c2b48f7ef.woff2 differ diff --git a/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf b/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf new file mode 100644 index 00000000..1a6895d1 Binary files /dev/null and b/html/_static/fonts/1512b579343c6b61c7523cdd838d8328.ttf differ diff --git a/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 b/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 new file mode 100644 index 00000000..cb9bfa71 Binary files /dev/null and b/html/_static/fonts/1c9cc76fd52238330f0aabac35acd2ca.woff2 differ diff --git a/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 b/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 new file mode 100644 index 00000000..6d458ad0 Binary files /dev/null and b/html/_static/fonts/1f1481679a64a39f3427547aa1b13f0f.woff2 differ diff --git a/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf b/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf new file mode 100644 index 00000000..2cf147e1 Binary files /dev/null and b/html/_static/fonts/2096d27efc16cbdd79183bf295c8ebde.ttf differ diff --git a/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 b/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 new file mode 100644 index 00000000..87711c04 Binary files /dev/null and b/html/_static/fonts/20dc200cc43ab904876fb0c1697ebe39.woff2 differ diff --git a/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 b/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 new file mode 100644 index 00000000..bc7e1b2c Binary files /dev/null and b/html/_static/fonts/214adfc289a2f2af8b0008c59ed0c7f2.woff2 differ diff --git a/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 b/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 new file mode 100644 index 00000000..d4ec1890 Binary files /dev/null and b/html/_static/fonts/21953b998bab09c1f60c599caee56378.woff2 differ diff --git a/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 b/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 new file mode 100644 index 00000000..2950a77c Binary files /dev/null and b/html/_static/fonts/22aadc77cafa07b2db9ed560d0320616.woff2 differ diff --git a/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 b/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 new file mode 100644 index 00000000..51c88fde Binary files /dev/null and b/html/_static/fonts/2325b97b584755067ea4f7f56ee05430.woff2 differ diff --git a/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 b/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 new file mode 100644 index 00000000..81848e2c Binary files /dev/null and b/html/_static/fonts/2550c2e2d8495c3ed2d4d52f824374f1.woff2 differ diff --git a/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 b/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 new file mode 100644 index 00000000..7e931875 Binary files /dev/null and b/html/_static/fonts/255cf41e0317d95e3992683a76ef28a8.woff2 differ diff --git a/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 b/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 new file mode 100644 index 00000000..544eddca Binary files /dev/null and b/html/_static/fonts/25c52b9af13f0d1b10719f5289e8c803.woff2 differ diff --git a/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 b/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 new file mode 100644 index 00000000..cf61b889 Binary files /dev/null and b/html/_static/fonts/2781e9e7c3f369b8fc7965e679b17b60.woff2 differ diff --git a/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf b/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf new file mode 100644 index 00000000..d7455040 Binary files /dev/null and b/html/_static/fonts/28e6b81b1bc1964707edd4179e4268f5.ttf differ diff --git a/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 b/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 new file mode 100644 index 00000000..c8091bc9 Binary files /dev/null and b/html/_static/fonts/2a8c422bef4a7099e99dbf0e61ed5e49.woff2 differ diff --git a/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf b/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf new file mode 100644 index 00000000..64fca947 Binary files /dev/null and b/html/_static/fonts/2aadfad5aee7ceeaf4eb0924efabe5b4.ttf differ diff --git a/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 b/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 new file mode 100644 index 00000000..8c63b51b Binary files /dev/null and b/html/_static/fonts/2c0f74be498d2da814c0a84dd6833f70.woff2 differ diff --git a/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 b/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 new file mode 100644 index 00000000..1f579aa4 Binary files /dev/null and b/html/_static/fonts/2e10480d4154762bc7c8fbb40877e104.woff2 differ diff --git a/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 b/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 new file mode 100644 index 00000000..e0d3c435 Binary files /dev/null and b/html/_static/fonts/2ea7a97b7c976b121112a088eb398561.woff2 differ diff --git a/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf b/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf new file mode 100644 index 00000000..ea5c8fe0 Binary files /dev/null and b/html/_static/fonts/2f5c32f094829c0278bce28fe2bbe074.ttf differ diff --git a/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 b/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 new file mode 100644 index 00000000..4b7a373a Binary files /dev/null and b/html/_static/fonts/2f7c3c315334a99574ee4ceb21af654d.woff2 differ diff --git a/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf b/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf new file mode 100644 index 00000000..d25425d8 Binary files /dev/null and b/html/_static/fonts/302b0425bf5ea66f37a822a61d723adc.ttf differ diff --git a/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 b/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 new file mode 100644 index 00000000..c5776a5e Binary files /dev/null and b/html/_static/fonts/3177dacffeac1eb4102852811ae4a2c7.woff2 differ diff --git a/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf b/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf new file mode 100644 index 00000000..9c48d222 Binary files /dev/null and b/html/_static/fonts/3254c528e2ab56454a9f22191035c5fe.ttf differ diff --git a/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 b/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 new file mode 100644 index 00000000..53d081f3 Binary files /dev/null and b/html/_static/fonts/32c8a74ac0816253d69a7cc68a60986d.woff2 differ diff --git a/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 b/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 new file mode 100644 index 00000000..45eae25c Binary files /dev/null and b/html/_static/fonts/33c5d27ca0eaeb12ebe728ae2fc7106d.woff2 differ diff --git a/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 b/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 new file mode 100644 index 00000000..f3c5f6ac Binary files /dev/null and b/html/_static/fonts/36e39c6463ae1c71c71e69c05e593e1b.woff2 differ diff --git a/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 b/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 new file mode 100644 index 00000000..cb5834ff Binary files /dev/null and b/html/_static/fonts/3728fbdd191d75bad5b83a838dfe2fc1.woff2 differ diff --git a/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf b/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf new file mode 100644 index 00000000..7c38f724 Binary files /dev/null and b/html/_static/fonts/38f3ee1f96b758f95672c632d8759594.ttf differ diff --git a/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 b/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 new file mode 100644 index 00000000..b1dc168f Binary files /dev/null and b/html/_static/fonts/392ff374142585f7b886ee1fe66e686e.woff2 differ diff --git a/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 b/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 new file mode 100644 index 00000000..53b8d0dc Binary files /dev/null and b/html/_static/fonts/3a38c967413f7bce36d3baefc321aade.woff2 differ diff --git a/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 b/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 new file mode 100644 index 00000000..8a8de615 Binary files /dev/null and b/html/_static/fonts/3c23eb02de6b34e30f18cfb7167abd81.woff2 differ diff --git a/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 b/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 new file mode 100644 index 00000000..63995528 Binary files /dev/null and b/html/_static/fonts/3c505383d37d2078648e37868bbd1fad.woff2 differ diff --git a/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 b/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 new file mode 100644 index 00000000..59cab0f1 Binary files /dev/null and b/html/_static/fonts/3cf78ad3bcd1324e10a4acdc34bfc4a1.woff2 differ diff --git a/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 b/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 new file mode 100644 index 00000000..99b1da1b Binary files /dev/null and b/html/_static/fonts/3f1918538864f9681d47a4538d48289c.woff2 differ diff --git a/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 b/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 new file mode 100644 index 00000000..45f222cc Binary files /dev/null and b/html/_static/fonts/4039566f251699c4b421ed1a38a59b24.woff2 differ diff --git a/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 b/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 new file mode 100644 index 00000000..8ab91719 Binary files /dev/null and b/html/_static/fonts/4207cbc8cb7bc2cbd0bcce565298cbbc.woff2 differ diff --git a/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 b/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 new file mode 100644 index 00000000..1f384187 Binary files /dev/null and b/html/_static/fonts/43358c04243de546caddd0898dbf0757.woff2 differ diff --git a/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 b/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 new file mode 100644 index 00000000..0f6e60b8 Binary files /dev/null and b/html/_static/fonts/435e4b7f9f250d9d9243d4754799fc96.woff2 differ diff --git a/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 b/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 new file mode 100644 index 00000000..0bb27069 Binary files /dev/null and b/html/_static/fonts/437939342255944b82a49f916404c5fc.woff2 differ diff --git a/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 b/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 new file mode 100644 index 00000000..b289f002 Binary files /dev/null and b/html/_static/fonts/455c2c1af0a2bf20047a1864d7d7c174.woff2 differ diff --git a/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 b/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 new file mode 100644 index 00000000..9d7fb7f8 Binary files /dev/null and b/html/_static/fonts/47aa3bfad6cb9e2d63abdd58f4e6ce4f.woff2 differ diff --git a/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 b/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 new file mode 100644 index 00000000..47da3629 Binary files /dev/null and b/html/_static/fonts/495d38d4b9741e8aa4204002414069e2.woff2 differ diff --git a/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 b/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 new file mode 100644 index 00000000..997a45c6 Binary files /dev/null and b/html/_static/fonts/4c815fdc869f885520f7c8eae6730edf.woff2 differ diff --git a/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 b/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 new file mode 100644 index 00000000..3c450111 Binary files /dev/null and b/html/_static/fonts/4ec57f2a80b91090971b83970230ca09.woff2 differ diff --git a/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 b/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 new file mode 100644 index 00000000..fb22fec2 Binary files /dev/null and b/html/_static/fonts/4f17f22fc6bff4f3333ccf7ed7126e6d.woff2 differ diff --git a/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 b/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 new file mode 100644 index 00000000..de10a3cf Binary files /dev/null and b/html/_static/fonts/4f93c2808e3b69e525c118074e5de31f.woff2 differ diff --git a/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 b/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 new file mode 100644 index 00000000..2e71425c Binary files /dev/null and b/html/_static/fonts/50aacf068f685be0dd903a91d5bab7d8.woff2 differ diff --git a/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 b/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 new file mode 100644 index 00000000..c0099878 Binary files /dev/null and b/html/_static/fonts/51f3f41805329fb8341beb56ded833ea.woff2 differ diff --git a/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 b/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 new file mode 100644 index 00000000..a0f44185 Binary files /dev/null and b/html/_static/fonts/52f28cb4d065b4adfa78df4f9559c639.woff2 differ diff --git a/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 b/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 new file mode 100644 index 00000000..3df1d8a0 Binary files /dev/null and b/html/_static/fonts/555ceea3a65ffbbecf8b7e6d04966c7f.woff2 differ diff --git a/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 b/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 new file mode 100644 index 00000000..100e81a6 Binary files /dev/null and b/html/_static/fonts/5989ef3a21d7f252337ab3326f78bde7.woff2 differ diff --git a/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 b/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 new file mode 100644 index 00000000..a0d68e2b Binary files /dev/null and b/html/_static/fonts/5b6377da4c959db6d4b22738a27f1bee.woff2 differ diff --git a/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 b/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 new file mode 100644 index 00000000..f496f9e2 Binary files /dev/null and b/html/_static/fonts/5ce47d5195e59af38114d0b70217baf2.woff2 differ diff --git a/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 b/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 new file mode 100644 index 00000000..dd5a4a2e Binary files /dev/null and b/html/_static/fonts/5d7ff31ac7bf945e8d61878f8a941239.woff2 differ diff --git a/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 b/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 new file mode 100644 index 00000000..c2862d73 Binary files /dev/null and b/html/_static/fonts/5dc0e4b14e903ba7f45c581df7402b3f.woff2 differ diff --git a/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 b/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 new file mode 100644 index 00000000..6a258ac6 Binary files /dev/null and b/html/_static/fonts/60eb682678bbea5e8ad71f66f2f65536.woff2 differ diff --git a/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 b/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 new file mode 100644 index 00000000..fecc1855 Binary files /dev/null and b/html/_static/fonts/63111d307c01b52ffccf7b0319cb7917.woff2 differ diff --git a/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 b/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 new file mode 100644 index 00000000..122ac2c7 Binary files /dev/null and b/html/_static/fonts/638764dc2513deb09c55fc025f6dd36c.woff2 differ diff --git a/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 b/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 new file mode 100644 index 00000000..00a4a4be Binary files /dev/null and b/html/_static/fonts/63f4b74ebf127dbeb033126ea988f54e.woff2 differ diff --git a/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 b/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 new file mode 100644 index 00000000..edfc6cd0 Binary files /dev/null and b/html/_static/fonts/64a6b4e954cf84685cbf8de77eb47344.woff2 differ diff --git a/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 b/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 new file mode 100644 index 00000000..ae1933f3 Binary files /dev/null and b/html/_static/fonts/661d4b208656c006e7aab58acf778485.woff2 differ diff --git a/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 b/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 new file mode 100644 index 00000000..ece005fc Binary files /dev/null and b/html/_static/fonts/6725a7e91680edd1cdc9ed5c26ac05fd.woff2 differ diff --git a/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 b/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 new file mode 100644 index 00000000..1bb7737c Binary files /dev/null and b/html/_static/fonts/6a84eeee6a25e7c9a8a03191007a6720.woff2 differ diff --git a/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf b/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf new file mode 100644 index 00000000..3e69acbe Binary files /dev/null and b/html/_static/fonts/6ac1ee292434fac2313c42b0dfb7897c.ttf differ diff --git a/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf b/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf new file mode 100644 index 00000000..563f4493 Binary files /dev/null and b/html/_static/fonts/6ad3f6bbe6220cc476a0d3c731d3fb04.ttf differ diff --git a/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 b/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 new file mode 100644 index 00000000..a56a6ede Binary files /dev/null and b/html/_static/fonts/6be97ca17228a69c406231d89c003194.woff2 differ diff --git a/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf b/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf new file mode 100644 index 00000000..604934aa Binary files /dev/null and b/html/_static/fonts/6de03a64aa8100032abc6e836b3ed803.ttf differ diff --git a/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 b/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 new file mode 100644 index 00000000..cbe564b0 Binary files /dev/null and b/html/_static/fonts/6deb20301c65a96db17c433ad0cf8158.woff2 differ diff --git a/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 b/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 new file mode 100644 index 00000000..92fe38dd Binary files /dev/null and b/html/_static/fonts/6f8d857c5a8545e67de6b60aa0fe5c33.woff2 differ diff --git a/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 b/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 new file mode 100644 index 00000000..0933dfe8 Binary files /dev/null and b/html/_static/fonts/713780d8b30bda5583052ea847cdcb4f.woff2 differ diff --git a/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf b/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf new file mode 100644 index 00000000..454e5d05 Binary files /dev/null and b/html/_static/fonts/71e06579279fba7436d58a1c49288909.ttf differ diff --git a/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf b/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf new file mode 100644 index 00000000..10f8720c Binary files /dev/null and b/html/_static/fonts/765bd4a97597a4d7781193793477a6cd.ttf differ diff --git a/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 b/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 new file mode 100644 index 00000000..943c5a0a Binary files /dev/null and b/html/_static/fonts/76945c7494c20515bb45d1dedab8f706.woff2 differ diff --git a/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 b/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 new file mode 100644 index 00000000..9eda94a2 Binary files /dev/null and b/html/_static/fonts/76da333ab59c6d625cabfb0768f82b4a.woff2 differ diff --git a/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 b/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 new file mode 100644 index 00000000..c0f0f73b Binary files /dev/null and b/html/_static/fonts/770518db51bed1e082feecc532cfcbf8.woff2 differ diff --git a/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 b/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 new file mode 100644 index 00000000..6284d2e3 Binary files /dev/null and b/html/_static/fonts/77b24796a3d4ab521f66765651875338.woff2 differ diff --git a/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 b/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 new file mode 100644 index 00000000..dd0851d5 Binary files /dev/null and b/html/_static/fonts/77ff81100e5a1db3d925f713660700ad.woff2 differ diff --git a/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 b/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 new file mode 100644 index 00000000..be81ddf5 Binary files /dev/null and b/html/_static/fonts/78a9265759e7b861a1639a36f4c01d04.woff2 differ diff --git a/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 b/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 new file mode 100644 index 00000000..e0d41239 Binary files /dev/null and b/html/_static/fonts/7af61b2367eba2b1852e837c46a75696.woff2 differ diff --git a/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 b/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 new file mode 100644 index 00000000..ff1f96d3 Binary files /dev/null and b/html/_static/fonts/7b63598dcc2a26583b82594bd0e36d5b.woff2 differ diff --git a/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 b/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 new file mode 100644 index 00000000..66efc250 Binary files /dev/null and b/html/_static/fonts/7b8c2179b6b778308d2ff39bdb82e926.woff2 differ diff --git a/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 b/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 new file mode 100644 index 00000000..067cb322 Binary files /dev/null and b/html/_static/fonts/7e262106f82cc52663e403f5b73795bb.woff2 differ diff --git a/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 b/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 new file mode 100644 index 00000000..68f094cd Binary files /dev/null and b/html/_static/fonts/7f1c829b0c90fd664a03bb714a74f7d3.woff2 differ diff --git a/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf b/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf new file mode 100644 index 00000000..13a7f42e Binary files /dev/null and b/html/_static/fonts/7fa86b886bee5d6ab420a8e89b9f3052.ttf differ diff --git a/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 b/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 new file mode 100644 index 00000000..11c7018c Binary files /dev/null and b/html/_static/fonts/8007dfe835cfb201b8caaa9651098588.woff2 differ diff --git a/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 b/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 new file mode 100644 index 00000000..e836b518 Binary files /dev/null and b/html/_static/fonts/83614c36460a4a9734968789cb535de7.woff2 differ diff --git a/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf b/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf new file mode 100644 index 00000000..99c5795f Binary files /dev/null and b/html/_static/fonts/84e959dd07f302392f0ffd86f87db888.ttf differ diff --git a/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 b/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 new file mode 100644 index 00000000..8a81a2ff Binary files /dev/null and b/html/_static/fonts/85a41b80c5fdc14e3dc48636a30d87dd.woff2 differ diff --git a/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 b/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 new file mode 100644 index 00000000..ef9a2bdd Binary files /dev/null and b/html/_static/fonts/870e5928dd14fcfe0ce9386107666774.woff2 differ diff --git a/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 b/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 new file mode 100644 index 00000000..6b05020c Binary files /dev/null and b/html/_static/fonts/8898c4b754d5d96c1a5e1b1d54100554.woff2 differ diff --git a/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf b/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf new file mode 100644 index 00000000..57a6dc38 Binary files /dev/null and b/html/_static/fonts/89b4f174a5a728d2d8c85b87990c9ab4.ttf differ diff --git a/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 b/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 new file mode 100644 index 00000000..9756ba7c Binary files /dev/null and b/html/_static/fonts/8a8dca39f24b52e89e6fd6dcd8b6dd32.woff2 differ diff --git a/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf b/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf new file mode 100644 index 00000000..68ff2a47 Binary files /dev/null and b/html/_static/fonts/8aa562790559d61dd5178a88a296d70f.ttf differ diff --git a/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 b/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 new file mode 100644 index 00000000..72fc0214 Binary files /dev/null and b/html/_static/fonts/8c3798e37724f71bc0c63c44a5307413.woff2 differ diff --git a/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf b/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf new file mode 100644 index 00000000..9c039d63 Binary files /dev/null and b/html/_static/fonts/8c49ed8b472d38d3985ec9bbbccea601.ttf differ diff --git a/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 b/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 new file mode 100644 index 00000000..f8d7a0d4 Binary files /dev/null and b/html/_static/fonts/8e48cf20cf9f9e5feb7197c79028132b.woff2 differ diff --git a/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 b/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 new file mode 100644 index 00000000..472bf5a5 Binary files /dev/null and b/html/_static/fonts/9095d663e4d450059bcc2260bb75cd62.woff2 differ diff --git a/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 b/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 new file mode 100644 index 00000000..5fd10290 Binary files /dev/null and b/html/_static/fonts/90ebb29b5cffa197b184773983ba7e91.woff2 differ diff --git a/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 b/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 new file mode 100644 index 00000000..cb00b8b5 Binary files /dev/null and b/html/_static/fonts/93b6c99d936df38895a0d95e3ffea2fd.woff2 differ diff --git a/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 b/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 new file mode 100644 index 00000000..ef920e5a Binary files /dev/null and b/html/_static/fonts/9582ced8a675bf267cc7ac392a86413e.woff2 differ diff --git a/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 b/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 new file mode 100644 index 00000000..3f7f93ab Binary files /dev/null and b/html/_static/fonts/99be4d68845d66c27c7f7d3a48687b66.woff2 differ diff --git a/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 b/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 new file mode 100644 index 00000000..663ec4c2 Binary files /dev/null and b/html/_static/fonts/99cf36e763be9cce7b4c59b91841af58.woff2 differ diff --git a/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 b/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 new file mode 100644 index 00000000..d0c5aa5e Binary files /dev/null and b/html/_static/fonts/9a9bf2d91ebbb1b96eab8eb0b0514bcc.woff2 differ diff --git a/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 b/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 new file mode 100644 index 00000000..3f060b34 Binary files /dev/null and b/html/_static/fonts/9bcbc88b33b2efc2aee821b831499f1c.woff2 differ diff --git a/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 b/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 new file mode 100644 index 00000000..2f2cacd3 Binary files /dev/null and b/html/_static/fonts/9c9be791a58af8a04c611ca1d13f51c6.woff2 differ diff --git a/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 b/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 new file mode 100644 index 00000000..1d173f2a Binary files /dev/null and b/html/_static/fonts/9fdb12ceee3a402d3a54afe354552459.woff2 differ diff --git a/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 b/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 new file mode 100644 index 00000000..dd587a2b Binary files /dev/null and b/html/_static/fonts/a6933e678530b263486fa7b185a449ca.woff2 differ diff --git a/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 b/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 new file mode 100644 index 00000000..9213da01 Binary files /dev/null and b/html/_static/fonts/a6caf7b9888eb0c382948c1ca5e8bebb.woff2 differ diff --git a/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 b/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 new file mode 100644 index 00000000..c932cd45 Binary files /dev/null and b/html/_static/fonts/a70ff2592da5e3453943f727633aff54.woff2 differ diff --git a/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 b/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 new file mode 100644 index 00000000..cce41ce7 Binary files /dev/null and b/html/_static/fonts/aa28d99c7db60ad23f96a5c317615c42.woff2 differ diff --git a/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 b/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 new file mode 100644 index 00000000..c8ab3b2d Binary files /dev/null and b/html/_static/fonts/aab05142e0e2dadf7df633e061e612ad.woff2 differ diff --git a/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 b/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 new file mode 100644 index 00000000..477887e3 Binary files /dev/null and b/html/_static/fonts/ab03beb9091fa15ce4e783199e076bc6.woff2 differ diff --git a/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf b/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf new file mode 100644 index 00000000..aa6a46dd Binary files /dev/null and b/html/_static/fonts/ac848474638236e67a64bc654fb18de0.ttf differ diff --git a/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 b/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 new file mode 100644 index 00000000..c88b8aea Binary files /dev/null and b/html/_static/fonts/acaac043ca238f0e56e61864456777fa.woff2 differ diff --git a/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 b/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 new file mode 100644 index 00000000..8571683e Binary files /dev/null and b/html/_static/fonts/aeed0e51b0bac7c89e5c7e6cf086d7e0.woff2 differ diff --git a/html/_static/fonts/b019538234514166ec7665359d097403.woff2 b/html/_static/fonts/b019538234514166ec7665359d097403.woff2 new file mode 100644 index 00000000..29342a8d Binary files /dev/null and b/html/_static/fonts/b019538234514166ec7665359d097403.woff2 differ diff --git a/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 b/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 new file mode 100644 index 00000000..91231c9c Binary files /dev/null and b/html/_static/fonts/b076e86301cbee8c5c9aef51863a9c0a.woff2 differ diff --git a/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 b/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 new file mode 100644 index 00000000..4ccadd18 Binary files /dev/null and b/html/_static/fonts/b19ac4e57f2a56639eebd1c35319e5a7.woff2 differ diff --git a/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 b/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 new file mode 100644 index 00000000..38d4c74d Binary files /dev/null and b/html/_static/fonts/b4d3c40a77fd9e35a881a79077957055.woff2 differ diff --git a/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 b/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 new file mode 100644 index 00000000..ee64c936 Binary files /dev/null and b/html/_static/fonts/b4e42731e8d667ae87c3450c345754ae.woff2 differ diff --git a/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 b/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 new file mode 100644 index 00000000..18c3f128 Binary files /dev/null and b/html/_static/fonts/b57a5ada789f195d5d42f4073a6cf313.woff2 differ diff --git a/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 b/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 new file mode 100644 index 00000000..a4699c78 Binary files /dev/null and b/html/_static/fonts/b5b4146d87e5d22d0a4e0d04f3ee5626.woff2 differ diff --git a/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 b/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 new file mode 100644 index 00000000..22ddee9c Binary files /dev/null and b/html/_static/fonts/b7ef2cd1159a8cbfd271ff2abe07f237.woff2 differ diff --git a/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 b/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 new file mode 100644 index 00000000..fa67bec9 Binary files /dev/null and b/html/_static/fonts/b93199bb6f964f190f4da04ecdbaf5a4.woff2 differ diff --git a/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 b/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 new file mode 100644 index 00000000..22c57b01 Binary files /dev/null and b/html/_static/fonts/bb8007225d94a099cddbade7ea904667.woff2 differ diff --git a/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf b/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf new file mode 100644 index 00000000..ce5a5252 Binary files /dev/null and b/html/_static/fonts/bc67bba106323289ea3eda0826de1912.ttf differ diff --git a/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 b/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 new file mode 100644 index 00000000..20eb7ec2 Binary files /dev/null and b/html/_static/fonts/bcd47c2f3649cfcaa86a08fb741255d6.woff2 differ diff --git a/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 b/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 new file mode 100644 index 00000000..2900346b Binary files /dev/null and b/html/_static/fonts/bd0efe13f0d9d591b337ddc7f289f494.woff2 differ diff --git a/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 b/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 new file mode 100644 index 00000000..0f11176a Binary files /dev/null and b/html/_static/fonts/bd51fb0ca67e64c809ffcf7e1370f969.woff2 differ diff --git a/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 b/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 new file mode 100644 index 00000000..6363b1c7 Binary files /dev/null and b/html/_static/fonts/bdbb6b52604c2451fdcba9cdfd44f4e1.woff2 differ diff --git a/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf b/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf new file mode 100644 index 00000000..99e1e894 Binary files /dev/null and b/html/_static/fonts/bf2ad3287f13eb7076cccb516ec2986f.ttf differ diff --git a/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 b/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 new file mode 100644 index 00000000..27773c96 Binary files /dev/null and b/html/_static/fonts/bfd1a0c9c783e84595589f33e1828a57.woff2 differ diff --git a/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 b/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 new file mode 100644 index 00000000..b2ffb560 Binary files /dev/null and b/html/_static/fonts/c13b34dd5b6a35b309944b61c91b2ace.woff2 differ diff --git a/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 b/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 new file mode 100644 index 00000000..7148fac7 Binary files /dev/null and b/html/_static/fonts/c22066c14662d6c80415ae04c5dd9d51.woff2 differ diff --git a/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 b/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 new file mode 100644 index 00000000..fcadc912 Binary files /dev/null and b/html/_static/fonts/c28a41f656599f6694528b5463c6a445.woff2 differ diff --git a/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf b/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf new file mode 100644 index 00000000..7a8b630b Binary files /dev/null and b/html/_static/fonts/c6dc61b627bbc5af9130518297bd4f17.ttf differ diff --git a/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 b/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 new file mode 100644 index 00000000..d2f30b58 Binary files /dev/null and b/html/_static/fonts/c8a9fd4eab4e83382cc66fde70911b41.woff2 differ diff --git a/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 b/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 new file mode 100644 index 00000000..24a1bfd3 Binary files /dev/null and b/html/_static/fonts/ca7eea0cf248d6e8442c01074765bd33.woff2 differ diff --git a/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf b/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf new file mode 100644 index 00000000..4242da4d Binary files /dev/null and b/html/_static/fonts/cadfb311297a9362b07fab73934b432a.ttf differ diff --git a/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 b/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 new file mode 100644 index 00000000..65687e73 Binary files /dev/null and b/html/_static/fonts/cbfd26d5bcf084ee407a0b2b7599e84b.woff2 differ diff --git a/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 b/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 new file mode 100644 index 00000000..6abf54d0 Binary files /dev/null and b/html/_static/fonts/ccdebed88064e470c15f37c432922e57.woff2 differ diff --git a/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 b/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 new file mode 100644 index 00000000..b8dff97b Binary files /dev/null and b/html/_static/fonts/cce2217cc8323fe49789adefb3596291.woff2 differ diff --git a/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 b/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 new file mode 100644 index 00000000..93cd525d Binary files /dev/null and b/html/_static/fonts/cd3d1f17e048e2116f438bd7157baccf.woff2 differ diff --git a/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 b/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 new file mode 100644 index 00000000..bfa05a0f Binary files /dev/null and b/html/_static/fonts/d07f561ba87d93460742b060727d9e0d.woff2 differ diff --git a/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 b/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 new file mode 100644 index 00000000..72ce0e98 Binary files /dev/null and b/html/_static/fonts/d368cf5bed7856dbafa2af36b51acb9c.woff2 differ diff --git a/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf b/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf new file mode 100644 index 00000000..6a9fc931 Binary files /dev/null and b/html/_static/fonts/d422317033deb87342a5e56c7be67458.ttf differ diff --git a/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 b/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 new file mode 100644 index 00000000..b9cee29d Binary files /dev/null and b/html/_static/fonts/d6f9cdf1a40893111566fcdee3bbe5a9.woff2 differ diff --git a/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf b/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf new file mode 100644 index 00000000..11a1e9fe Binary files /dev/null and b/html/_static/fonts/d98f35e926c11f3d5c0c8e3205d43907.ttf differ diff --git a/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 b/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 new file mode 100644 index 00000000..0b792b0b Binary files /dev/null and b/html/_static/fonts/d9e6a498dac7e9e91f6e0b4f8930eba0.woff2 differ diff --git a/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 b/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 new file mode 100644 index 00000000..fe8fcec7 Binary files /dev/null and b/html/_static/fonts/da6cd48e6dad1888fccc91735e7522f7.woff2 differ diff --git a/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 b/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 new file mode 100644 index 00000000..3d0f604e Binary files /dev/null and b/html/_static/fonts/daf12b5f1889502004bba85ad71f9fa4.woff2 differ diff --git a/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 b/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 new file mode 100644 index 00000000..fc71d944 Binary files /dev/null and b/html/_static/fonts/daf51ab540602b2d0b87646621637bac.woff2 differ diff --git a/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 b/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 new file mode 100644 index 00000000..e1b7a79f Binary files /dev/null and b/html/_static/fonts/db0424fb67fb52e7e538490240cc7fb9.woff2 differ diff --git a/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 b/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 new file mode 100644 index 00000000..75d29cff Binary files /dev/null and b/html/_static/fonts/dc25cbf4baaf778bd8ae78fbc0e79479.woff2 differ diff --git a/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 b/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 new file mode 100644 index 00000000..44819272 Binary files /dev/null and b/html/_static/fonts/dd719f1662079ce6a61260f9af972379.woff2 differ diff --git a/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 b/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 new file mode 100644 index 00000000..a181dfe7 Binary files /dev/null and b/html/_static/fonts/de018865c95896bb57265fc97c48ebd7.woff2 differ diff --git a/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 b/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 new file mode 100644 index 00000000..b2391b92 Binary files /dev/null and b/html/_static/fonts/e33716333704ab19fdf9989e072ad49a.woff2 differ diff --git a/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 b/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 new file mode 100644 index 00000000..9997e98d Binary files /dev/null and b/html/_static/fonts/e56cc9fb5272752b78f144b4be43175d.woff2 differ diff --git a/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 b/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 new file mode 100644 index 00000000..bfcc76fa Binary files /dev/null and b/html/_static/fonts/e704ef18719c08839bc99a32437ef0f8.woff2 differ diff --git a/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 b/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 new file mode 100644 index 00000000..677de8b5 Binary files /dev/null and b/html/_static/fonts/e99627cd27de169d23ece4573006af2a.woff2 differ diff --git a/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 b/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 new file mode 100644 index 00000000..064e94b7 Binary files /dev/null and b/html/_static/fonts/ef8f0236a7e8b46bc9d642ecf4ab0cb7.woff2 differ diff --git a/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 b/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 new file mode 100644 index 00000000..074504d6 Binary files /dev/null and b/html/_static/fonts/f154d62b4879af7a22895af7a4ef03f0.woff2 differ diff --git a/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 b/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 new file mode 100644 index 00000000..0bfb07d7 Binary files /dev/null and b/html/_static/fonts/f17ee050ada0453f3bd07bc466c2dde2.woff2 differ diff --git a/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 b/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 new file mode 100644 index 00000000..f041fde3 Binary files /dev/null and b/html/_static/fonts/f265cee675c0e5b2d6ab263d0edcc754.woff2 differ diff --git a/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 b/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 new file mode 100644 index 00000000..5b19d60d Binary files /dev/null and b/html/_static/fonts/f2f69e8cd15fdd15a4244c95ec8a8514.woff2 differ diff --git a/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 b/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 new file mode 100644 index 00000000..23fcdf30 Binary files /dev/null and b/html/_static/fonts/f534242dea2255c25b9d05c2371986e3.woff2 differ diff --git a/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 b/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 new file mode 100644 index 00000000..2bfc2cee Binary files /dev/null and b/html/_static/fonts/f53f3b5a15d717b6d21d7885285e90ed.woff2 differ diff --git a/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 b/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 new file mode 100644 index 00000000..481279c0 Binary files /dev/null and b/html/_static/fonts/f55dac651a40fce74a5cf5728d9f8ffc.woff2 differ diff --git a/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 b/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 new file mode 100644 index 00000000..771fbecc Binary files /dev/null and b/html/_static/fonts/f5aebdfea35d1e7656ef4acc5db1f243.woff2 differ diff --git a/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 b/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 new file mode 100644 index 00000000..d87fe266 Binary files /dev/null and b/html/_static/fonts/f5f971e9640a9eb86ef553a7e7e999c7.woff2 differ diff --git a/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 b/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 new file mode 100644 index 00000000..020729ef Binary files /dev/null and b/html/_static/fonts/f6734f8177112c0839b961f96d813fcb.woff2 differ diff --git a/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 b/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 new file mode 100644 index 00000000..60681387 Binary files /dev/null and b/html/_static/fonts/f75911313e1c7802c23345ab57e754d8.woff2 differ diff --git a/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 b/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 new file mode 100644 index 00000000..4487ab7b Binary files /dev/null and b/html/_static/fonts/fb17f56622e45dd4ecee00bb5c63cd2b.woff2 differ diff --git a/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 b/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 new file mode 100644 index 00000000..1351aad4 Binary files /dev/null and b/html/_static/fonts/fb1aaa90783b8cb9375265abeb91b153.woff2 differ diff --git a/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 b/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 new file mode 100644 index 00000000..94ab5fb0 Binary files /dev/null and b/html/_static/fonts/fc66f942651a9fe1a598770d3d896529.woff2 differ diff --git a/html/_static/full_logo.png b/html/_static/full_logo.png new file mode 100644 index 00000000..b2e77b28 Binary files /dev/null and b/html/_static/full_logo.png differ diff --git a/html/_static/js/rtd_search_config.js b/html/_static/js/rtd_search_config.js new file mode 100644 index 00000000..c512b4db --- /dev/null +++ b/html/_static/js/rtd_search_config.js @@ -0,0 +1,2 @@ + +var RTD_SEARCH_CONFIG = {"default_filter": "project:/", "filters": []}; \ No newline at end of file diff --git a/html/_static/js/rtd_sphinx_search.min.js b/html/_static/js/rtd_sphinx_search.min.js new file mode 100644 index 00000000..ee0b3007 --- /dev/null +++ b/html/_static/js/rtd_sphinx_search.min.js @@ -0,0 +1 @@ +"use strict";function _createForOfIteratorHelper(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,t=function(){};return{s:t,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:t}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,l=!1;return{s:function(){r=e[Symbol.iterator]()},n:function(){var e=r.next();return o=e.done,e},e:function(e){l=!0,a=e},f:function(){try{o||null==r.return||r.return()}finally{if(l)throw a}}}}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(r="Object"===r&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);rv0.0.1
+Initial release (R. Atwi and M. Bliss)
v0.0.4
+Support for retrieving molecules from pubchem directly and using them in the workflows
Support for OPLS 2005 ff by running Maestro in the backend
Option for charge scaling of ionic species when preparing the lammps data file
Automatic identification of system element types when creating dump files in lammps simulations
Addition of MDPropTools package for analysis of MD trajectories as dependency
If you find MISPR useful in your research, please consider citing the following papers:
+Paper 1 (MISPR):
+@article{atwi2022mispr,
+ title = {MISPR: An automated infrastructure for high-throughput DFT and MD simulations},
+ author = {Atwi, Rasha and Bliss, Matthew and Makeev, Maxim and Rajput, Nav Nidhi},
+ year = {2022}
+}
+
Download as BibTeX
Paper 2 (Hybrid NMR Workflow):
+@article{atwi2022automated,
+ title = {An automated framework for high-throughput predictions of NMR chemical shifts within liquid solutions},
+ author = {Atwi, Rasha and Chen, Ying and Han, Kee Sung and Mueller, Karl T and Murugesan, Vijayakumar and Rajput, Nav Nidhi},
+ journal = {Nature Computational Science},
+ volume = {2},
+ number = {2},
+ pages = {112--122},
+ year = {2022},
+ publisher = {Nature Publishing Group}
+}
+
Download as BibTeX
MISPR is a Python library for computational materials science and contains +preset workflows for running complex hierarchical density functional +theory (DFT) and classical molecular dynamics (MD) simulations to compute +properties of materials.
+ +Install using pip:
+pip install mispr
+
Important
+Before you can start using MISPR, there are additional steps you need to follow. +Please refer to the installation guide for complete setup instructions, +including any dependencies or configuration files required.
+About MISPR
+Workflows
+Code documentation
+Contirbuting to MISPR can be in the form of:
+Requesting or adding new workflows and features
Reporting or fixing bugs and issues
Contributing to the documentation and/or examples
If you want to add or change something in the code, you can do this by +forking MISPR on GitHub and +submitting a pull request.
+If you submit a bug report, we will review it and move it to GitHub issues, +where its progress can be tracked.
+For other inquiries, please contact us at rasha.atwi@stonybrook.edu.
+ + + + + + + +After setting up the environment and installing the software, you will +need to configure the software to work with your system. This is done by +creating the following set of configuration files.
+Note
+This page is intended to help you get set-up for the first time using +FireWorks and MISPR so you can learn how these software work. Please +refer to the FireWorks +documentation for more information on these files and how FireWorks works. +Here, we will only discuss the basic configuration options which are +sufficient for using MISPR as in this tutorial.
+This file contains the basic MongoDB information like the +credentials required to connect to the database where the +calculation outputs will be stored. Note that +JSON strings require double quotes except for the value of +βportβ which is an integer.
+{
+ "admin_user": "|ADMIN_USERNAME|",
+ "admin_password": "|ADMIN_PASSWORD|",
+ "aliases": {},
+ "collection": "|COLLECTION|",
+ "database": "|DB_NAME|",
+ "host": "|HOSTNAME|",
+ "port": |PORT|,
+}
+
This file stores your FireWorkerβs credentials. In +the FireWorks, a +FireWorker can be as simple as the workstation used to host the +LaunchPad or complicated like a supercomputing center with a +queueing system.
+name: |WORKER_NAME|
+category: ''
+query: '{}'
+env:
+ db_file: |CODES_DIR|/config/db.json
+ scratch_dir: null
+
The following parameters are defined in the file:
+name
: the name of the worker where your job will be run;
+this is helpful when you have multiple workers; see
+FireWorks documentation on controlling the Worker
+if you need more information on setting up this file if you are
+using more than one worker.
category
and queue
: these parameters can control which
+calculations are run on which worker; the default settings will
+allow all calculations to be run
env
: defines worker-specific settings like the path to the
+db file and the scratch directory for fast disk access
This is the FireWorks LaunchPad file that contains the MongoDB
+credentials required to connect to the database for storing
+and managing workflows within FireWorks. Note that the db.json
+file we created earlier is used to connect to the database
+where the results are stored and is used by MISPR while
+my_launchpad.yaml
is used by FireWorks. The two databases
+can be the same or different databases. If they are the same databases,
+then the information here will be mostly the same as that in the
+db.json
file.
host: |HOSTNAME|
+port: |PORT|
+name: |LAUNCHPAD_NAME|
+username: |ADMIN_USERNAME|
+password: |ADMIN_PASSWORD|
+logdir: null
+strm_lvl: INFO
+user_indices: []
+wf_user_indices: []
+authsource: null
+uri_mode: |URI_MODE|
+mongoclient_kwargs: {}
+
The following parameters need to be defined in the file:
+host
: the hostname of the MongoDB server
port
: the port number of the MongoDB server
name
: the name of the MongoDB server
username
: the username to connect to the MongoDB server
password
: the password to connect to the MongoDB server
Note that if the uri_mode
is set to true, the host
+should be the full URI string.
+In this case, the username
and password
are not used.
If you want to pass other custom keyword arguments
+(e.g., SSL/TLS arguments) to the MongoClient connection, you
+can do that via mongoclient_kwargs
. See
+pymongo documentation
+for more details.
This is the queue adapter file required by FireWorks to +automatically communicate with the queueing system. +The example provided here is for SLURM machines and does not +include a full list of possible parameters, but you can +check the rest of the parameters or parameters that can be +specified for other queue systems (e.g., PBS, SGE, etc.) +here.
+_fw_name: CommonAdapter
+_fw_q_type: SLURM
+rocket_launch: rlaunch -w |CODES_DIR|/config singleshot
+nodes: 1
+walltime: 24:00:00
+queue: null
+account: null
+job_name: null
+pre_rocket: null
+post_rocket: null
+logdir: |CODES_DIR|/logs
+
The following parameters are defined in the file:
+_fw_name
: CommonAdapter
means that the queue is one of
+the built-in queue systems
_fw_q_type
: the queue system type (e.g., SLURM, PBS, SGE, etc.)
rocket_launch
: the method to use for launching Rockets
nodes
, walltime
, queue
, account
, job_name
:
+parameters you normally specify in your SLURM script for
+allocating resources
pre_rocket
and post_rocket
: the commands to run
+before and after launching the Rocket (e.g., module load
+packages)
logdir
: path to the log directory
Note
+Specifying singleshot in the file will limit each +reserved job to running only one firework at a time even if other +fireworks are waiting to be run. This can be changed to rapidfire +to run all fireworks in parallel. You can go over the FireWorks +documentation to learn the difference between these launching modes.
+This file contains the commands to run Gaussian, LAMMPS, and AmberTools. +These commands are specific to your computing resources you are +running on. The example provided here is meant to show how these +commands should be defined, but you need to change them to match your +system.
+[RunCalc]
+gcmd: g16 < "$input_path$" > "$output_path$"
+formchkcmd: formchk "$input_path$" "$output_path$"
+
+[LammpsRunCalc]
+lcmd: mpirun -np $SLURM_NTASKS lmp_mpi -in $control_path$
+lammps_gpu_cmd: null
+
+[AmbertoolsRunCalc]
+acmd: antechamber -i $input_file$ -fi $input_type$ -o $output_file$ -fo $output_type$ -c $charge_method$ -s 2
+pcmd: parmchk2 -i $input_file$ -f mol2 -o $output_file$
+tcmd: tleap -f $input_file$
+
+[MaestroCalc]
+mae_cmd: $SCHRODINGER/utilities/structconvert $input_file$ $output_file$
+ffld_cmd: $SCHRODINGER/utilities/ffld_server -imae $input_file$ -version 14 -print_parameters -out_file $output_file$
+
The following commands are defined in the file:
+gcmd
: the command to run Gaussian
formchkcmd
: the command to run Gaussian formchk to convert
+a Gaussian checkpoint file into formatted forms
lcmd
: the command to run LAMMPS
lammps_gpu_cmd
: the command to run LAMMPS on a GPU
acmd
: the command to run Antechamber
pcmd
: the command to run Parmchk2
tcmd
: the command to run tleap
Note
+Anything between two dollar signs ($ $) is a placeholder for +a variable and should not be changed.
+Anything between the square brackets ([]), e.g., [RunCalc], +or before the colons (:), e.g., gmcd, should not be changed +since these are used to point MISPR to the commands to run.
+This is the master FireWorks configuration file that controls +FireWorks settings and points to the location of the other +configuration files.
+CONFIG_FILE_DIR: |CODES_DIR|/config
+
The CONFIG_FILE_DIR
is expected to contain the
+other configuration files. For a list of control settings that
+can be added to this file, check
+FireWorks documentation on modifying the FW config.
After creating the above six configuration files and replacing the
+placeholders with your specific settings, create a directory in
+your |CODES_DIR|
(see Definition) called config
+and move the above configuration files into it. The |CODES_DIR|/config
+should look like:
config
+βββ config.ini
+βββ db.json
+βββ FW_config.yaml
+βββ my_fworker.yaml
+βββ my_launchpad.yaml
+βββ my_qadapter.yaml
+
Now, append the following lines to your .bash_profile
or .bashrc
+file in order to set an environment variable that tells FireWorks where
+to find the FW_config.yaml
file, which will in turn tell FireWorks
+where the rest of the configuration files are:
export FW_CONFIG_FILE=|CODES_DIR|/config/FW_config.yaml
+
MISPR depends on a number of third party Python packages, and usually on +specific versions of those packages. In order not to interfere with third +party packages needed by other software on your machine or cluster, we +strongly recommend isolating MISPR in a virtual python environment. In the +following, we describe how to create a virtual python environment using +the virtualenv tool, but +feel free to use your preferred environment manager +(e.g. conda).
+Recommendation
+We recommend that you use Python version 3.7 since this is the version that we have +tested MISPR with.
+To create and activate a new virtual environment, go to your
+|CODES_DIR|
(see Definition), and run the following commands:
pip install --user --upgrade virtualenv # install virtualenv tool
+python -m virtualenv mispr_env # create "mispr_env" environment
+source mispr_env/bin/activate # activate "mispr_env" environment
+
This will create a directory in your |CODES_DIR|
named mispr_env
,
+where all the packages will be installed. After activation, your prompt
+should have (mispr_env)
in front of it, indicating that you are
+working inside the virtual environment. The activation script ensures
+that python programs have access only to packages installed inside the
+virtualenv.
+To deactivate the enviornment, simply run:
deactivate
+
Note
+You may need to install pip
and setuptools
in your virtual
+enviornment in case the system or user version of these tools is old:
pip install -U setuptools pip
+
At the backend, MISPR uses:
+Gaussian software to perform DFT calculations
AmberTools to generate GAFF parameters
LAMMPS to run MD simulations
Packmol to +create initial configurations for MD simulations. To install packmol, +follow their user guide
Ensure that you have access to the executables of these software +before using MISPR. Gaussian is a commercial software +that requires a license while AmberTools, LAMMPS, and Packmol are open source. +If Gaussian, AmberTools, and LAMMPS are already installed on supercomputing +resources, the user typically needs to load their corresponding modules +before their use.
+pymatgen: MISPR uses pymatgen for handling
+different molecule representations and i/o operations specific to
+Gaussian and LAMMPS. We have made changes to the pymatgen library to
+make it compatible with our needs in MISPR. These changes have not
+been merged yet with the main pymatgen library. Therefore, in order
+to use MISPR, you need to install the MolMD version of pymatgen by
+running the following commands in your |CODES_DIR|
:
git clone https://github.com/molmd/pymatgen.git
+cd pymatgen
+python setup.py install
+
FireWorks: MISPR +uses FireWorks to design, manage, and execute workflows. To install, +simply type:
+pip install FireWorks
+
Further details can be found in the FireWorks documentation.
+Note
+While FireWorks is used in MISPR for managing the DFT and MD +workflows due to its many advantages, it takes some time to learn +and get used to it.
+custodian: MISPR uses
+custodian for handling errors that occur during the simulations and
+correcting them according to predefined rules. We have added a Gaussian
+plug-in to the custodian library, but similar to the pymatgen changes,
+these changes have not been merged yet with the main custodian library.
+Therefore, in order to use MISPR, you need to install the MolMD version
+of custodian by running the following commands in your |CODES_DIR|
:
git clone https://github.com/molmd/custodian.git
+cd custodian
+python setup.py install
+
Following the design decisions of the Materials Project, MISPR uses +MongoDB as the backend database. +MongoDB is a NoSQL database that is designed to store and retrieve +data in a highly efficient and scalable manner. It stores data in the +form of documents represented in the JSON (JavaScript Object Notation) +format, which is similar to a Python dictionary.
+MISPR uses MongoDB to:
+Add, remove, and search the status of workflows - feature of +FireWorks (required)
Create computational databases of DFT and MD predicted properties - +Feature of MISPR (optional but strongly recommended)
Options for getting MongoDB are:
+Install it yourself locally by following the instructions at +MongoDB. +This is pretty simple and typically works well if you are starting out +with MISPR and want to learn how to use a database. However, with this +option, you are limited with the storage space on your local machine and +you do not have the option to share the database with other users. You +also need to have the necessary privileges to install mongo on your machine.
Set up an account using a commercial service, which is typically +the simplest and easiest to use but is not free of charge for databases +with large size. Examples of such services include Atlas and MongoDB Atlas, +which offer 500 MB databases for free. This is typically enough to get +started for small projects.
Self-host a MongoDB server or ask your supercomputing center to offer +MongoDB hosting. This is more complicated than the other options and +will require continuous maintenance of the server.
After creating a new database, you need to keep record of your credentials. +These will be used later in setting up the configuration files required +by FireWorks.
+Note
+MongoDB must be accessible from the computers you are using to run +the workflows.
+Establishing a Connection to MongoDB Using Pymongo:
+You need to import MongoClient from pymongo and then create a new MongoClient instance. +This instance is used to connect to your MongoDB instance:
+from pymongo import MongoClient
+
+client = MongoClient("mongodb://localhost:27017/")
+
In this example, weβre connecting to a MongoDB instance that runs on the same machine +(localhost) on port 27017, which is the default port for MongoDB.
+Testing the Connection to MongoDB:
+We can check the connection by listing all the databases:
+print(client.list_database_names())
+
If the connection is successful, this command will return a list of names of the databases that are present in the +MongoDB instance.
+Remember, for you to connect to a MongoDB instance, the MongoDB server needs to be installed and running. +If itβs not running on localhost:27017, you will need to provide the appropriate connection string.
+ + + + + + + +Before installing MISPR, you need to follow the steps below in order:
+(Optional) Create a Virtual python environment
Make sure you have access to the Computational chemistry software +needed to run the DFT and MD simulations
Install Materials Project base libraries
Set up MongoDB database
Prepare the configuration files
Note
+Throughout the installation instructions, it is assumed that you are +familiar with Python and with basic Linux shell commands. If not, +Linux Journey and +Python For Beginners +are some recommended starting points.
+MISPR and MDPropTools can be installed either from the python package +index (good for most users) or directly from their GitHub +repositories (good for developers).
+To install, simply type:
+pip install mispr
+pip install mdproptools
+
To make changes directly to the source and contribute to the development +of MISPR, you can install MISPR and MDPropTools in development mode.
+Note
+If you had already installed MISPR via pip or conda, you +should uninstall that first before starting the installation in +development mode. This ensures that you will not have any conflicts +resulting from two different code installations.
+The steps for installing the packages in development mode are below.
+Activate your conda environment or virtual environment
Create a codes
directory in |CODES_DIR|
cd
to your newly created |CODES_DIR|/codes
directory
Clone the packages you want to install in development mode using git:
+git clone https://github.com/molmd/mdproptools.git
+git clone https://github.com/molmd/mispr.git
+
Now you should have mdproptools and mispr directories in your codes
+directory.
For each of these packages, cd
into their folders and run
+pip install -e .
or use the conda
equivalent. Once installed,
+if you make changes to the code in these packages, the changes
+will take effect immediately without having to reinstall the package.
Before you go any further, confirm your package installations are correct.
+First start IPython by typing ipython
in your terminal, then confirm that
+the commands import mdproptools
and import mispr
execute
+without any errors
To update these codes later on, execute git pull
followed by
+pip install -e .
or the conda
equivalent in the corresponding
+folder if you installed in development mode. If you installed via pip,
+you can simply execute pip install --upgrade mispr
.
After installing MISPR and its dependencies and setting up the configuration +files, it is important to make sure everything is working correctly. +Therefore, we will now run a very simple test workflow that optimizes the +structure of a molecule. Later in Workflow Tutorials, +we will show how to run more complex workflows.
+Note
+lpad
and qlaunch
that are used in this tutorial are part of
+FireWorks software. You can refer to FireWorks documentation if you
+need additional information.
Initialize the database by running the following command:
+lpad reset
+
Warning
+This command should only be executed one time when you are first +initializing the database set-up. If you reset your LaunchPad at a +later time, you will erase all existing entries in your FireWorks +database, which includes your fireworks, workflows, and launches +collections.
+Note
+Your Python environment where FireWorks is installed must be active +before you run this command.
+Running the above command will return something like this:
+Are you sure? This will RESET 0 workflows and all data. (Y/N)y
+2022-08-15 17:04:42,224 INFO Performing db tune-up
+2022-08-15 17:04:42,683 INFO LaunchPad was RESET.
+
The next step is to add a workflow to the database. We will run a
+workflow that optimizes the geometry of a monoglyme molecule starting
+from its xyz file. Note that you need to have the monoglyme.xyz file in
+your working directory. You will need to run the following Python code
+by creating a file called optimize_geometry.py
:
from mispr.gaussian.fireworks.core import CalcFromMolFW
+from fireworks import LaunchPad, Workflow
+
+lpad = LaunchPad.auto_load()
+wf = Workflow([CalcFromMolFW("monoglyme.xyz", "get_from_file",
+ gaussian_input_params={"route_parameters": {"opt": None}},
+ save_to_file=True, save_to_db=True)])
+lpad.add_wf(wf)
+
and then running the following command in terminal:
+python optimize_geometry.py
+
This will add a structure optimization workflow to the database.
+To check the status of this workflow in the database, run the following +command in terminal:
+lpad get_fws -s READY
+
It will return something like this:
+{
+ "fw_id": 1,
+ "created_on": "2022-08-16T20:32:54.554404",
+ "updated_on": "2022-08-16T20:32:54.554716",
+ "state": "READY",
+ "name": "calc_from_mol"
+}
+
Alternatively, you can query your fireworks
collection in the MongoDB
+database directly or start FireWorksβ LaunchPad
+web gui from your local machine (assuming you have also set up
+configuration files there):
lpad webgui
+
To launch this job through queue, use the qlaunch command from FireWorks. +qlaunch has 3 modes: singleshot, rapidfire, and multi:
+singleshot
: launches one job at a time
rapidfire
: launches multiple jobs at once; youβll most likely
+want to use this mode where it is important to add the -m
+flag to specify how many jobs to launch at once to prevent submitting
+too many jobs at once.
multi
: creates one job with multiple fireworks runs
Here is an example command for launching one job from the terminal in the +same working directory as before:
+qlaunch singleshot
+
If you are not running your jobs through a queue, replace the
+qlaunch
command with rlaunch
.
If all went well, you can determine the status of your running jobs by +using the following command in the terminal:
+lpad get_fws -s RUNNING
+
or:
+lpad get_fws -s COMPLETED
+
If your job has failed, your can rerun it using the following command
+(replacing fw_id
with 1, which is the id of your firework, since
+you only have one firework in your launchpad at this point):
lpad rerun_fws -i <fw_id>
+
Once this workflow is completed, you will see the generated Gaussian
+input and output files as well as a run.json
file that contains a
+summary of the job in the same working directory.
Additionally, you can query the database for the results of your jobs +by using the InChI representation of the monoglyme molecule as a query +criteria:
+from mispr.gaussian.utilities.db_utilities import get_db
+
+db = get_db()
+db.retrieve_run(inchi="InChI=1S/C4H10O2/c1-5-3-4-6-2/h3-4H2,1-2H3")[0]
+
This will return a dictionary of the results as they are saved in the
+database. Alternatively, you can the view the results using MongoDB
+Compass, and the generated documents from the run will appear like the
+following in the runs
collection of the gaussian
database:
Keyword |
+Definition |
+
---|---|
|
+Main directory where the virtual python environment is created and the configuration files are stored |
+
|
+FireWorks database that controls the workflows. It stores all the tasks to be run and their status (e.g., RUNNING, WAITING, COMPLETED, etc.) |
+
|
+Computing task to be performed |
+
|
+A list of FireTasks that are to be run in sequence |
+
MISPR is released under the MIT License.
+The MIT License (MIT)
+
+Copyright (c) 2022 Stony Brook University
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
Define functions for cleaning up JSON documents.
+Add solvent properties to a property dictionary (e.g. BDE, BE, etc.).
+Property dictionary.
+Gaussian input parameters corresponding to the +implicit solvent model used in the Gaussian calculations, e.g. +β(Solvent=TetraHydroFuran)β.
+Additional solvent input parameters used in the +Gaussian calculations; e.g., {βEPSβ:12}.
+Property dictionary with solvent properties added.
+dict
+Define utility functions for handling files and paths.
+Parse a bibtex file and returns a dictionary of the entries.
+ +Convert recursively relative paths to absolute paths.
+ +Define functions for handling gaussian inputs.
+None
, solvent_properties=None
)[source]ΒΆWrapper function to cleanup/modify the Gaussian input parameters for one or more +job in a workflow. Checks for implicit solvent parameters and adds missing keywords +for a given job.
+Dictionary of dictionaries of Gaussian inputs, e.g.
+{"opt": {opt_gaussian_inputs}, "freq": {freq_gaussian_inputs}}
+
String of Gaussian inputs for the +solvent, e.g.
+"(Solvent=Generic, Read)"
+
Dictionary of solvent properties, e.g.
+{"Eps": 4.33, "EpsInf": 1.69}
+
Dictionary of dictionaries of reformatted Gaussian inputs.
+dict
+Define functions for creating db schema.
+Return a dictionary of chemical schema for a given molecule to use in building db +documents or json file.
+ +Append a molecule label to the name of a workflow for easy monitoring and +identification.
+ +Get the alphabetical molecular formula for a molecule.
+ +Define miscellaneous functions useful in many of the mispr levels.
+Helper function used in the Gaussian Fireworks to pass Gaussian output dictionaries +from one task to the other, while checking that the criteria for starting the +following task are met (e.g. normal termination of the previous job, lack of +imaginary frequencies, etc.).
+ +''
)[source]ΒΆCompare recursively two dictionaries and returns the differences.
+First dictionary to compare.
+Second dictionary to compare.
+Name of the first dictionary (for messages on the differences).
+Name of the second dictionary (for messages on the differences).
+Used internally to keep track of the keys in nested dicts, +meant to be ββ for the top level
+Differences between the two dictionaries (if any).
+str
+Remove Recursively the signature β@β from a dictionary (e.g. those in the name of +a module). Used when processing Gaussian runs before saving them to the db.
+ +MISPR (Materials Informatics for Structure-Property Relationships) is a +high-throughput computational infrastructure aimed at guiding and +accelerating materials discovery, optimization, and deployment for +liquid solutions by seamlessly integrating density functional theory +(DFT) with classical molecular dynamics (MD) techniques.
+MISPR is motivated by the Materials Genome Initiative (MGI) principles and is +built on top of open-source Python packages developed for the Materials +Project such as pymatgen, +FireWorks , +and custodian, as +well as MDPropTools, which +is an in-house package for analyzing MD output and trajectory files.
+ +Features of MISPR include:
+Automation of DFT and MD simulations and all their underlying tasks +from file management and job submission to supercomputing resources, +to output parsing and data analytics; a task that can be done to a +single molecule/system or to a large number of systems in parallel
Creation of computational databases of force field parameters and DFT +and MD derived properties of molecular systems for establishing +structure-property relations and maintaining data provenance and +reproducibility
Detection of the inevitable errors that occur during the simulations +and their on-the-fly correction based on template responses that have +been designed relying on human intuition coupled with extensive +experience to significantly improve the success rate of high-throughput +simulations while eliminating human intervention
Support for flexible and well-tested DFT workflows that compute various +properties of individual molecular species or complexes such as bond +dissociation energy, binding energy, redox potential, and nuclear +magnetic resonance (NMR) tensors
Derivation of many molecular ensemble properties such as radial +distribution functions, diffusion coefficients, viscosity, and +conductivity of liquid solutions, which are critical to understanding +complex inter- and intra-atomic interactions controlling the performance +of solutions within various chemistry, biology, and materials science +applications
Seamless integration of DFT and MD simulations through hybrid +workflows that enable force field generation and information flow +between the two length scales to allow exploring wide chemical and +parameter spaces (e.g., temperature, pressure, concentration, etc.), +a task that can be infeasible experimentally and challenging using +manual calculations
Automatic extraction of hundreds of thousands of solvation structures +from MD ensembles and their use in DFT workflows to accurately represent +the electronic environment, which is crucial to derive reliable energetics +and other properties such as NMR chemical shifts and redox potentials +and match them to experimental data
This page is under construction.
+ + + + + + + +MISPR workshop for high-school students: +a compute capsule that stores the Python environment for the workshop +and includes Jupyter notebooks for predicting various materials +properties using MISPR
NMR tutorial: a compute +capsule that shows how to use the hybrid NMR workflow in MISPR to +sample solvation structures from MD simulations and predict their +NMR chemical shifts in a fully automated manner
A scientific workflow in MISPR provides a complete description of the +procedure leading to the final data used to predict the desired property +of a given molecule or system. It consists of multiple steps ranging +from the initial setup of a molecule or system of molecules to a +sequence of calculations with dependencies and optional automated +post-processing of parsed data to derive properties of interest.
+Note
+The workflow model we use to encode DFT and MD recipes in MISPR is +defined by the FireWorks workflow software.
+A workflow in FireWorks is modeled as a Directed Acyclic Graph +representing the chain of relationships between +computational operations. A workflow consists of one or more Fireworks +(jobs) with dependencies. The workflow contains information +about the links between Fireworks to execute them in the correct order. +Each Firework consists of one or more Firetasks that run sequentially. +A Firetask is an atomic computing job that can call shell scripts, +transfer files, write/delete files, or execute other Python functions. +An example of the structure of a DFT workflow in MISPR is shown below:
+ +Once a Workflow object is created, the user can use the FireWorks package +to execute the calculations on various computing resources. The goal of +MISPR infrastructure is to provide preset workflows for +computing properties relevant to the molecular science community and to +simplify the process of creating new workflows by using the implemented +FireWorks and Firetasks in MISPR as building blocks for custom workflows.
+At the end of each workflow in MISPR, an analysis FireTask is performed +to analyze the results and generate a report. The report is in the form +of a JSON file and/or MongoDB document. It contains all the input parameters +used in the calculations, the output data, general information about the +calculation like the software version used (Gaussian, LAMMPS, MISPR, etc.), +the wall time the full run took, and chemical metadata about the molecule +or system of molecules (e.g. SMILES, InChI, molecular formula, etc.).
+In general, each property predicted by MISPR workflows is the result of
+multiple Gaussian or LAMMPS calculations, and the predicted property is
+represented by a single file/document summarizing data and βrawβ information
+collected from different calculation steps. The MongoDB document
+corresponding to a predicted property is stored in a MongoDB collection
+named after the property. For example, bond dissociation energies are
+stored in a bde
collection in the database while electrostatic
+partial charges are saved in an esp
collection and so on. Some of
+the analysis FireTasks also include optional plotting of the results.
+Besides the final summary file/document, MISPR stores data from the
+intermediate calculation steps into a collection called runs
in the
+database.
The following diagram summarizes the process in MISPR workflows to generate +the analysis files/documents:
+ +Note
+The above diagram shows one example of the structure of a workflow +where the Fireworks are executed sequentially. Some workflows contain +parallel Fireworks. However, the analysis Firework +is always the last Firework in all the workflows in MISPR.
+This page is under construction.
+ + + + + + + +Some of the workflows available as of July 2022 are:
+Electrostatic partial charges (ESP)
NMR shifts
Redox potentials
Binding energies
Bond dissociation energies
Core workflow for optimizing the individual structure of the +mixture of components, generating their ESP charges, and using +them in MD simulations
NMR: deriving NMR chemicals for stable solvation structures +extracted from MD simulations
One can customize any of the above workflows or create their own by reusing
+the building blocks provided by MISPR. The above preset workflows are in
+mispr/gaussian/workflows/base
, mispr/lammps/workflows/base
, and
+mispr/hybrid/workflows
.
Note
+Other types of force field parameters can be provided as +inputs to the MD workflow, thereby skipping the force field +generation step.
+This page is under construction.
+The ESP workflow calculates the partial charges on atoms of a molecule. The charges are +fit to the electrostatic potential at points selected according to the Merz-Singh-Kollman +scheme, but other schemes supported by Gaussian can be used as well.
+The ESP workflow performs the following steps:
+Note
+The geometry optimization and frequency calculation steps (marked with a dashed +border in the above diagram) are optional. If the input structure is already +optimized, the workflow will skip these steps.
+In the following example, we will run the ESP workflow on a monoglyme molecule.
+1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +15 +16 |
|
mol_operation_type
refers to the operation to be performed on the input to process the molecule.
In this example, we are requesting to directly retrieve the molecule from PubChem by providing a
+common name for the molecule to be used as query criteria for searching the PubChem database via
+the mol
input argument. For a list of supported mol_operation_type
and the corresponding
+mol
, refer to mispr.gaussian.utilities.mol.process_mol()
.
Adds the workflow to the launchpad.
Download esp_tutorial.py
.
Run the script using the following command:
+python esp_tutorial.py
+
And then launch the job through the queueing system using the following command:
+qlaunch rapidfire # (1)!
+
This command can submit a large number of jobs at once +or maintain a certain number of jobs in the queue.
The workflow will run and create a directory named C4H10O2
in the current working
+directory. The directory will contain the following subdirectories:
C4H10O2
+βββ Optimization
+βββ Frequency
+βββ ESP
+βββ analysis
+
Inside the Optimization
, Frequency
, and ESP
subdirectories, you
+will find the Gaussian input and output files for the corresponding step. Inside the
+Optimization
subdirectory, you will also find a βconvergence.pngβ figure that
+shows the forces and displacement convergence during the course of the optimization.
The analysis
subdirectory contains the results of the workflow in the form of a
+esp.json
file. You can read the content of the esp.json
file using the
+following commands:
1 +2 +3 +4 +5 +6 |
|
This will output the partial charges on the atoms of the molecule:
+{
+"1": ["O", -0.374646],
+"2": ["O", -0.373831],
+"3": ["C", 0.132166],
+"4": ["C", 0.132716],
+"5": ["C", 0.034284],
+"6": ["C", 0.031733],
+"7": ["H", 0.033853],
+"8": ["H", 0.034024],
+"9": ["H", 0.034218],
+"10": ["H", 0.034388],
+"11": ["H", 0.070724],
+"12": ["H", 0.03474],
+"13": ["H", 0.03438],
+"14": ["H", 0.034621],
+"15": ["H", 0.071656],
+"16": ["H", 0.034974],
+}
+