From 1d42b6621a8f24e05d2b5d30fbd1f0fdab7eaf25 Mon Sep 17 00:00:00 2001 From: hendrikboeck Date: Thu, 4 Jul 2024 11:08:35 +0000 Subject: [PATCH] deploy: 8da37068265771e8a6e3c9358ac93f1a95d5732b --- .buildinfo | 4 + .nojekyll | 0 ...2263c356c7ea725ac29f0949d60e8d7614ce9c.svg | 59 + ...c43acde043479a83496d8f3036ceba8957582e.svg | 14 + ...d2bedb096a6730b5673a9d4efd8da64f582481.svg | 59 + ...215919847aa00e6a0376398b680c61b1eaa73e.svg | 59 + ...8f87b256968a87214c588d28086643edb374d0.svg | 14 + ...6231f82ac6bca7c1b1e595da997801dd2d6e84.svg | 29 + ...adf965a3a9c59730e7a18cf1da86ad1cad610e.svg | 59 + ...6223811730d01e91f824bb57a7755fe73b568d.svg | 59 + ...8095fba40cc35b9bb639268776d0e916515b4a.svg | 59 + ...83ad03c4cdfbb517202829513f97620363499d.svg | 59 + _modules/index.html | 276 +++++ _modules/parasite.html | 353 ++++++ _modules/parasite/any.html | 407 +++++++ _modules/parasite/array.html | 741 ++++++++++++ _modules/parasite/boolean.html | 581 ++++++++++ _modules/parasite/errors.html | 300 +++++ _modules/parasite/never.html | 318 ++++++ _modules/parasite/null.html | 410 +++++++ _modules/parasite/object.html | 931 +++++++++++++++ _modules/parasite/string.html | 964 ++++++++++++++++ _modules/parasite/variant.html | 709 ++++++++++++ _sources/apidocs/pkg_parasite/_const.rst.txt | 11 + _sources/apidocs/pkg_parasite/_root.rst.txt | 12 + _sources/apidocs/pkg_parasite/any.rst.txt | 36 + _sources/apidocs/pkg_parasite/array.rst.txt | 36 + _sources/apidocs/pkg_parasite/boolean.rst.txt | 37 + _sources/apidocs/pkg_parasite/errors.rst.txt | 32 + _sources/apidocs/pkg_parasite/index.rst.txt | 26 + _sources/apidocs/pkg_parasite/never.rst.txt | 35 + _sources/apidocs/pkg_parasite/null.rst.txt | 30 + _sources/apidocs/pkg_parasite/object.rst.txt | 36 + _sources/apidocs/pkg_parasite/string.rst.txt | 31 + _sources/apidocs/pkg_parasite/variant.rst.txt | 35 + _sources/index.rst.txt | 30 + .../_sphinx_javascript_frameworks_compat.js | 123 ++ _static/basic.css | 925 +++++++++++++++ _static/debug.css | 69 ++ _static/doctools.js | 156 +++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/graphviz.css | 19 + _static/images/ecosystem-logo.svg | 46 + _static/images/logo.png | Bin 0 -> 31503 bytes _static/jquery.js | 2 + _static/js/web-components/top-nav-bar.js | 632 ++++++++++ _static/language_data.js | 199 ++++ _static/minus.png | Bin 0 -> 90 bytes _static/parasite-logo.png | Bin 0 -> 73044 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 249 ++++ _static/scripts/furo-extensions.js | 0 _static/scripts/furo.js | 3 + _static/scripts/furo.js.LICENSE.txt | 7 + _static/scripts/furo.js.map | 1 + _static/scripts/qiskit-sphinx-theme.js | 3 + .../qiskit-sphinx-theme.js.LICENSE.txt | 9 + _static/scripts/qiskit-sphinx-theme.js.map | 1 + _static/searchtools.js | 619 ++++++++++ _static/skeleton.css | 296 +++++ _static/sphinx_highlight.js | 154 +++ _static/styles/furo-extensions.css | 2 + _static/styles/furo-extensions.css.map | 1 + _static/styles/furo.css | 2 + _static/styles/furo.css.map | 1 + _static/styles/qiskit-ecosystem.css | 22 + _static/styles/qiskit-sphinx-theme.css | 2 + _static/styles/qiskit-sphinx-theme.css.map | 1 + apidocs/pkg_parasite/_const.html | 387 +++++++ apidocs/pkg_parasite/_root.html | 451 ++++++++ apidocs/pkg_parasite/any.html | 506 ++++++++ apidocs/pkg_parasite/array.html | 840 ++++++++++++++ apidocs/pkg_parasite/boolean.html | 623 ++++++++++ apidocs/pkg_parasite/errors.html | 391 +++++++ apidocs/pkg_parasite/index.html | 427 +++++++ apidocs/pkg_parasite/never.html | 410 +++++++ apidocs/pkg_parasite/null.html | 499 ++++++++ apidocs/pkg_parasite/object.html | 1014 +++++++++++++++++ apidocs/pkg_parasite/string.html | 918 +++++++++++++++ apidocs/pkg_parasite/variant.html | 796 +++++++++++++ genindex.html | 795 +++++++++++++ index.html | 288 +++++ objects.inv | Bin 0 -> 1270 bytes py-modindex.html | 344 ++++++ search.html | 277 +++++ searchindex.js | 1 + 87 files changed, 19375 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 _images/inheritance-042263c356c7ea725ac29f0949d60e8d7614ce9c.svg create mode 100644 _images/inheritance-1ec43acde043479a83496d8f3036ceba8957582e.svg create mode 100644 _images/inheritance-2ad2bedb096a6730b5673a9d4efd8da64f582481.svg create mode 100644 _images/inheritance-57215919847aa00e6a0376398b680c61b1eaa73e.svg create mode 100644 _images/inheritance-9d8f87b256968a87214c588d28086643edb374d0.svg create mode 100644 _images/inheritance-ae6231f82ac6bca7c1b1e595da997801dd2d6e84.svg create mode 100644 _images/inheritance-b0adf965a3a9c59730e7a18cf1da86ad1cad610e.svg create mode 100644 _images/inheritance-be6223811730d01e91f824bb57a7755fe73b568d.svg create mode 100644 _images/inheritance-ea8095fba40cc35b9bb639268776d0e916515b4a.svg create mode 100644 _images/inheritance-fd83ad03c4cdfbb517202829513f97620363499d.svg create mode 100644 _modules/index.html create mode 100644 _modules/parasite.html create mode 100644 _modules/parasite/any.html create mode 100644 _modules/parasite/array.html create mode 100644 _modules/parasite/boolean.html create mode 100644 _modules/parasite/errors.html create mode 100644 _modules/parasite/never.html create mode 100644 _modules/parasite/null.html create mode 100644 _modules/parasite/object.html create mode 100644 _modules/parasite/string.html create mode 100644 _modules/parasite/variant.html create mode 100644 _sources/apidocs/pkg_parasite/_const.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/_root.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/any.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/array.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/boolean.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/errors.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/index.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/never.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/null.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/object.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/string.rst.txt create mode 100644 _sources/apidocs/pkg_parasite/variant.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _static/_sphinx_javascript_frameworks_compat.js create mode 100644 _static/basic.css create mode 100644 _static/debug.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/graphviz.css create mode 100644 _static/images/ecosystem-logo.svg create mode 100644 _static/images/logo.png create mode 100644 _static/jquery.js create mode 100644 _static/js/web-components/top-nav-bar.js create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/parasite-logo.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/scripts/furo-extensions.js create mode 100644 _static/scripts/furo.js create mode 100644 _static/scripts/furo.js.LICENSE.txt create mode 100644 _static/scripts/furo.js.map create mode 100644 _static/scripts/qiskit-sphinx-theme.js create mode 100644 _static/scripts/qiskit-sphinx-theme.js.LICENSE.txt create mode 100644 _static/scripts/qiskit-sphinx-theme.js.map create mode 100644 _static/searchtools.js create mode 100644 _static/skeleton.css create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/styles/furo-extensions.css create mode 100644 _static/styles/furo-extensions.css.map create mode 100644 _static/styles/furo.css create mode 100644 _static/styles/furo.css.map create mode 100644 _static/styles/qiskit-ecosystem.css create mode 100644 _static/styles/qiskit-sphinx-theme.css create mode 100644 _static/styles/qiskit-sphinx-theme.css.map create mode 100644 apidocs/pkg_parasite/_const.html create mode 100644 apidocs/pkg_parasite/_root.html create mode 100644 apidocs/pkg_parasite/any.html create mode 100644 apidocs/pkg_parasite/array.html create mode 100644 apidocs/pkg_parasite/boolean.html create mode 100644 apidocs/pkg_parasite/errors.html create mode 100644 apidocs/pkg_parasite/index.html create mode 100644 apidocs/pkg_parasite/never.html create mode 100644 apidocs/pkg_parasite/null.html create mode 100644 apidocs/pkg_parasite/object.html create mode 100644 apidocs/pkg_parasite/string.html create mode 100644 apidocs/pkg_parasite/variant.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..a033d69 --- /dev/null +++ b/.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: 690a48c20c97cb26fdfb9e82227088cc +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_images/inheritance-042263c356c7ea725ac29f0949d60e8d7614ce9c.svg b/_images/inheritance-042263c356c7ea725ac29f0949d60e8d7614ce9c.svg new file mode 100644 index 0000000..8a1dfba --- /dev/null +++ b/_images/inheritance-042263c356c7ea725ac29f0949d60e8d7614ce9c.svg @@ -0,0 +1,59 @@ + + +inheritance9162650a61 + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + +Variant + + +Variant + + + + + +ParasiteType->Variant + + + + + \ No newline at end of file diff --git a/_images/inheritance-1ec43acde043479a83496d8f3036ceba8957582e.svg b/_images/inheritance-1ec43acde043479a83496d8f3036ceba8957582e.svg new file mode 100644 index 0000000..4c5678b --- /dev/null +++ b/_images/inheritance-1ec43acde043479a83496d8f3036ceba8957582e.svg @@ -0,0 +1,14 @@ + + +inheritance780e59e6d9 + + +ValidationError + + +ValidationError + + + + + \ No newline at end of file diff --git a/_images/inheritance-2ad2bedb096a6730b5673a9d4efd8da64f582481.svg b/_images/inheritance-2ad2bedb096a6730b5673a9d4efd8da64f582481.svg new file mode 100644 index 0000000..178fab6 --- /dev/null +++ b/_images/inheritance-2ad2bedb096a6730b5673a9d4efd8da64f582481.svg @@ -0,0 +1,59 @@ + + +inheritance7ab52e72ca + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Array + + +Array + + + + + +ParasiteType->Array + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + \ No newline at end of file diff --git a/_images/inheritance-57215919847aa00e6a0376398b680c61b1eaa73e.svg b/_images/inheritance-57215919847aa00e6a0376398b680c61b1eaa73e.svg new file mode 100644 index 0000000..589b1b2 --- /dev/null +++ b/_images/inheritance-57215919847aa00e6a0376398b680c61b1eaa73e.svg @@ -0,0 +1,59 @@ + + +inheritanceb6e10ce7ea + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + +String + + +String + + + + + +ParasiteType->String + + + + + \ No newline at end of file diff --git a/_images/inheritance-9d8f87b256968a87214c588d28086643edb374d0.svg b/_images/inheritance-9d8f87b256968a87214c588d28086643edb374d0.svg new file mode 100644 index 0000000..f131509 --- /dev/null +++ b/_images/inheritance-9d8f87b256968a87214c588d28086643edb374d0.svg @@ -0,0 +1,14 @@ + + +inheritance1274570b0e + + +Namespace + + +Namespace + + + + + \ No newline at end of file diff --git a/_images/inheritance-ae6231f82ac6bca7c1b1e595da997801dd2d6e84.svg b/_images/inheritance-ae6231f82ac6bca7c1b1e595da997801dd2d6e84.svg new file mode 100644 index 0000000..3141271 --- /dev/null +++ b/_images/inheritance-ae6231f82ac6bca7c1b1e595da997801dd2d6e84.svg @@ -0,0 +1,29 @@ + + +inheritancedf92bc21f9 + + +Namespace + + +Namespace + + + + + +p + + +p + + + + + +Namespace->p + + + + + \ No newline at end of file diff --git a/_images/inheritance-b0adf965a3a9c59730e7a18cf1da86ad1cad610e.svg b/_images/inheritance-b0adf965a3a9c59730e7a18cf1da86ad1cad610e.svg new file mode 100644 index 0000000..87a89a5 --- /dev/null +++ b/_images/inheritance-b0adf965a3a9c59730e7a18cf1da86ad1cad610e.svg @@ -0,0 +1,59 @@ + + +inheritanced758366701 + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Any_ + + +Any_ + + + + + +ParasiteType->Any_ + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + \ No newline at end of file diff --git a/_images/inheritance-be6223811730d01e91f824bb57a7755fe73b568d.svg b/_images/inheritance-be6223811730d01e91f824bb57a7755fe73b568d.svg new file mode 100644 index 0000000..111f403 --- /dev/null +++ b/_images/inheritance-be6223811730d01e91f824bb57a7755fe73b568d.svg @@ -0,0 +1,59 @@ + + +inheritanced619d7279b + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + +Object + + +Object + + + + + +ParasiteType->Object + + + + + \ No newline at end of file diff --git a/_images/inheritance-ea8095fba40cc35b9bb639268776d0e916515b4a.svg b/_images/inheritance-ea8095fba40cc35b9bb639268776d0e916515b4a.svg new file mode 100644 index 0000000..d083732 --- /dev/null +++ b/_images/inheritance-ea8095fba40cc35b9bb639268776d0e916515b4a.svg @@ -0,0 +1,59 @@ + + +inheritance5de4b923af + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + +Null + + +Null + + + + + +ParasiteType->Null + + + + + \ No newline at end of file diff --git a/_images/inheritance-fd83ad03c4cdfbb517202829513f97620363499d.svg b/_images/inheritance-fd83ad03c4cdfbb517202829513f97620363499d.svg new file mode 100644 index 0000000..a3f0c2e --- /dev/null +++ b/_images/inheritance-fd83ad03c4cdfbb517202829513f97620363499d.svg @@ -0,0 +1,59 @@ + + +inheritanceac186137e7 + + +ABC + + +ABC + + + + + +ParasiteType + + +ParasiteType + + + + + +ABC->ParasiteType + + + + + +Boolean + + +Boolean + + + + + +ParasiteType->Boolean + + + + + +Generic + + +Generic + + + + + +Generic->ParasiteType + + + + + \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..04bc3cd --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,276 @@ + + + + + + + + Overview: module code - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+ +
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite.html b/_modules/parasite.html new file mode 100644 index 0000000..b8f5900 --- /dev/null +++ b/_modules/parasite.html @@ -0,0 +1,353 @@ + + + + + + + + parasite - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite

+# -- Package Imports --
+from parasite.any import Any_
+from parasite.array import Array
+from parasite.boolean import Boolean
+from parasite.null import Null
+from parasite.number import Number
+from parasite.object import Object
+from parasite.string import String
+from parasite.variant import Variant
+from parasite.never import Never
+
+
+
+[docs] +class Namespace: + """Abstract base class for all namespace implementations. This class tries to mimic the behavior + of a namespace in other programming languages. + + Warning: + Do not instantiate this class directly. It is only meant to be used as a base class for + namespace implementations. + + Inheritance: + .. inheritance-diagram:: parasite.Namespace + :parts: 1 + """ + + def __init__(self) -> None: + """ + Raises: + TypeError: Always, as this class is not meant to be instantiated. + """ + raise TypeError("cannot instantiate a namespace")
+ + + +
+[docs] +class p(Namespace): + """ + sudo-namespace for all ``parasite`` types. Makes it easier to import and call them. Tries to + mimic the behavior of the ``z`` object imported from ``zod`` library in JavaScript. + + Inheritance: + .. inheritance-diagram:: parasite.p + :parts: 1 + + Raises: + TypeError: Always, as this class is not meant to be instantiated. + + Example usage: + Let's assume we have the following schema:: + + from parasite import p + + schema = p.obj({ + "name": p.string().required(), + "age": p.number().integer().min(0).optional(), + }).strip() + + and the following data:: + + data = { + "name": "John Doe", + "age": 42, + "extra": "This will be stripped", + } + + The schema will parse the following objects:: + + >>> schema.parse(data) + { "name": "John Doe", "age": 42 } + + >>> schema.parse({}) + ValidationError: key "name" not found, but is required + """ + + any = Any_ + null = Null + number = Number + string = String + boolean = Boolean + never = Never + variant = Variant + obj = Object + array = Array
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/any.html b/_modules/parasite/any.html new file mode 100644 index 0000000..90d453e --- /dev/null +++ b/_modules/parasite/any.html @@ -0,0 +1,407 @@ + + + + + + + + parasite.any - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.any

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Some, Option
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Any_(ParasiteType[Any]): + """ + Parasite type for representing any values. This is the default type, when no other type is + specified. + + Note: + Please use ``p.any()`` instead of instantiating this class directly. ``p`` can be imported + with:: + + from parasite import p + + schema = p.any() + ... + + Inheritance: + .. inheritance-diagram:: parasite.any.Any_ + :parts: 1 + """ + + _f_optional: bool = False # Whether the value is optional + + def __init__(self) -> None: + pass + +
+[docs] + def optional(self) -> Any_: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Any_: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.any().optional() }) + schema2 = p.obj({ "name": p.any() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Any_: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Any_: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.any().optional().required() }) + schema2 = p.obj({ "name": p.any() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ }) + ValidationError: key "name" not found, but is required + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def parse(self, obj: Any) -> Any: + # can never fail, as it accepts any value + return obj
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[Any]: + # if key is found, just package ``parse(..)`` it into a Some + if (value := parent.get(key, _NotFound)) is not _NotFound: + return Some(self.parse(value)) + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/array.html b/_modules/parasite/array.html new file mode 100644 index 0000000..9ef9c7a --- /dev/null +++ b/_modules/parasite/array.html @@ -0,0 +1,741 @@ + + + + + + + + parasite.array - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.array

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Array(ParasiteType[list[Any]]): + """ + ``parasite`` type for creating and parsing list/array based schemas. Will return a python + ``list[Any]`` with the parsed values on success. + + Note: + Please use ``p.array(...)`` instead of instantiating this class directly. ``p`` can be + imported with:: + + from parasite import p + + schema = p.array(...) + ... + + Note: + Calling the constructor with an element type will set the element type of the list. This is + equivalent to calling ``p.array().element(element)`` (see :func:`element`). If no element + type is specified, the list will skip parsing the elements, and therefore accept any type of + object or value. + + Inheritance: + .. inheritance-diagram:: parasite.array.Array + :parts: 1 + """ + + _m_element: ParasiteType | None = None # The element type of the list. + + _f_optional: bool = False # Whether the value is optional. + _f_nullable: bool = False # Whether the value can be None. + + _m_ul: int | None = None # The upper limit of the list. + _m_ll: int | None = None # The lower limit of the list. + + def __init__(self, element: ParasiteType | None = None): + """ + Args: + element (ParasiteType | None): The element type of the list. Default: None + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array() + schema2 = p.array(p.string()) + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + >>> schema.parse(["John", 1]) + ["John", 1] + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + >>> schema.parse(["John", 1]) + ValidationError: element at index 1 is invalid: object has to be a string, but is 1 + """ + self.element(element) + +
+[docs] + def optional(self) -> Array: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({"name": p.array().optional()}) + schema2 = p.obj({"name": p.array()}) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Array: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({"name": p.array().optional().required()}) + schema2 = p.obj({"name": p.array()}) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema.parse({ }) + ValidationError: key "name" not found, but is required + + >>> schema2.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def nullable(self) -> Array: + """ + Makes the value nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`not_nullable`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({"name": p.array().nullable()}) + schema2 = p.obj({"name": p.array()}) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema.parse({ "name": None }) + { "name": None } + + >>> schema2.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema2.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + """ + self._f_nullable = True + return self
+ + +
+[docs] + def not_nullable(self) -> Array: + """ + Makes the value not-nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`nullable`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`nullable` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({"name": p.array().nullable().not_nullable()}) + schema2 = p.obj({"name": p.array()}) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + + >>> schema2.parse({ "name": ["John", "Doe"] }) + { "name": ["John", "Doe"] } + >>> schema2.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + """ + self._f_nullable = False + return self
+ + +
+[docs] + def min(self, value: int) -> Array: + """ + Enforce the minimum length of the list. + + Args: + value (int): The minimum length of the list. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().min(2) + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + + >>> schema.parse(["John"]) + ValidationError: list has to have at least 2 elements, but has 1 + """ + self._m_ll = value + return self
+ + +
+[docs] + def max(self, value: int) -> Array: + """ + Enforce the maximum length of the list. + + Args: + value (int): The maximum length of the list. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().max(2) + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + + >>> schema.parse(["John", "Doe", "Smith"]) + ValidationError: list has to have at most 2 elements, but has 3 + """ + self._m_ul = value + return self
+ + +
+[docs] + def not_empty(self) -> Array: + """ + Enforce the list to not be empty. Equivalent to calling ``min(1)``. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().not_empty() + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + + >>> schema.parse([ ]) + ValidationError: list has to have at least 1 elements, but has 0 + """ + return self.min(1)
+ + +
+[docs] + def empty(self) -> Array: + """ + Enforce the list to be empty. Equivalent to calling ``max(0)``. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().empty() + + The resulting schemas will parse the following objects:: + + >>> schema.parse([ ]) + [ ] + + >>> schema.parse(["John", "Doe"]) + ValidationError: list has to have at most 0 elements, but has 2 + """ + return self.max(0)
+ + +
+[docs] + def length(self, value: int) -> Array: + """ + Enforce the list to have exactly the given length. Equivalent to calling + ``min(value).max(value)``. + + Args: + value (int): The length of the list. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().length(2) + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + + >>> schema.parse(["John", "Doe", "Smith"]) + ValidationError: list has to have exactly 2 elements, but has 3 + + >>> schema.parse(["John"]) + ValidationError: list has to have exactly 2 elements, but has 1 + """ + return self.min(value).max(value)
+ + +
+[docs] + def element(self, element: ParasiteType) -> Array: + """ + Set the ParsiteType schema of the elements in the list. Can also be set in the constructor. + Note: + If not set, the list will skip parsing the elements, and therefore accept any type of + object or value. + + Args: + element (ParasiteType[T]): The element type of the list. + + Returns: + Array: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.array().element(p.string()) + + The resulting schemas will parse the following objects:: + + >>> schema.parse(["John", "Doe"]) + ["John", "Doe"] + + >>> schema.parse(["John", 1]) + ValidationError: element at index 1 is invalid: object has to be a string, but is 1 + """ + self._m_element = element + return self
+ + +
+[docs] + def parse(self, obj: Any) -> list[Any]: + if not isinstance(obj, list): + raise ValidationError(f"object has to be a list, but is {obj!r}") + + if self._m_ll is not None and len(obj) < self._m_ll: + raise ValidationError( + f"list has to have at least {self._m_ll} elements, but has {len(obj)}" + ) + + if self._m_ul is not None and len(obj) > self._m_ul: + raise ValidationError( + f"list has to have at most {self._m_ul} elements, but has {len(obj)}" + ) + + if self._m_element is not None: + # create a cache to not overwrite the original list on error + cache = [] + + # parse each element individually + for i, element in enumerate(obj): + try: + # may throw a ValidationError exception + cache.append(self._m_element.parse(element)) + + # handle ValidationError exceptions, if parsing fails + except ValidationError as exc: + raise ValidationError(f"element at index {i} is invalid: {exc}") from exc + + # if the parsing was successful, overwrite the original list + obj = cache + + return obj
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[list[Any] | None]: + if (value := parent.get(key, _NotFound)) is not _NotFound: + # if key is found, just package ``parse(..)`` it into a Some + if value is not None: + return Some(self.parse(value)) + + # if value is None, check if the value is nullable + if self._f_nullable: + return Some(None) + + raise ValidationError(f"key {key!r} is not nullable, but is None") + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/boolean.html b/_modules/parasite/boolean.html new file mode 100644 index 0000000..ba4ccf2 --- /dev/null +++ b/_modules/parasite/boolean.html @@ -0,0 +1,581 @@ + + + + + + + + parasite.boolean - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.boolean

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+import math
+import re
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Boolean(ParasiteType[bool]): + """ + Parasite type for representing boolean values. + + Note: + Please use ``p.boolean()`` instead of instantiating this class directly. ``p`` can be + imported with:: + + from parasite import p + + schema = p.boolean() + ... + + Warning: + When using the leaniant mode (see :func:`leaniant`), the regular expressions are + case-insensitive. This means that you only need to handle lowercase variations of your + regex. This also means that the regex can only handle case-insensitive cases. + + Inheritance: + .. inheritance-diagram:: parasite.boolean.Boolean + :parts: 1 + """ + + _f_optional: bool = False # Whether the value is optional. + _f_nullable: bool = False # Whether the value can be None. + _f_leaniant: bool = False # Whether the value is leaniant. + + _m_leaniant: tuple[str, str] = ( + r"^(true|1|yes|y)$", + r"^(false|0|no|n)$", + ) # The regular expressions for the true and false value. + _m_literal: bool | None = None # The literal value of the boolean. + + def __init__(self) -> None: + pass + +
+[docs] + def optional(self) -> Boolean: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Returns: + Boolean: The updated instance of the class. + + Example usage:: + + from parasite import p + + schema = p.obj({"name": p.boolean()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({}) # -> ValidationError: key "name" not found, but is required + + schema = p.obj({"name": p.boolean().optional()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({}) # -> { } + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Boolean: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Returns: + Boolean: The updated instance of the class. + + Example usage:: + + from parasite import p + + schema = p.obj({"name": p.boolean()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({}) # -> ValidationError: key "name" not found, but is required + + schema = p.obj({"name": p.boolean().required()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({}) # -> ValidationError: key "name" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def nullable(self) -> Boolean: + """ + Set the value to be nullable. + + Returns: + Boolean: The updated instance of the class. + + Example usage:: + + from parasite import p + + schema = p.obj({"name": p.boolean()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({"name": None}) # -> ValidationError: key "name" cannot be None + + schema = p.obj({"name": p.boolean().nullable()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({"name": None}) # -> { "name": None } + """ + self._f_nullable = True + return self
+ + +
+[docs] + def not_nullable(self) -> Boolean: + """ + Set the value to be not nullable. + + Returns: + Boolean: The updated instance of the class. + + Example usage:: + + from parasite import p + + schema = p.obj({"name": p.boolean()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({"name": None}) # -> ValidationError: key "name" cannot be None + + schema = p.obj({"name": p.boolean().not_nullable()}) + schema.parse({"name": True}) # -> { "name": True } + schema.parse({"name": None}) # -> ValidationError: key "name" cannot be None + """ + self._f_nullable = False + return self
+ + +
+[docs] + def literal(self, value: bool) -> Boolean: + """ + Set the literal value of the boolean. + + Args: + value (bool): The literal value of the boolean. + + Returns: + Boolean: The updated instance of the class. + + Example usage:: + + from parasite import p + + schema = p.boolean() + schema.parse(True) # -> True + schema.parse(False) # -> False + + schema = p.boolean().literal(True) + schema.parse(True) # -> True + schema.parse(False) # -> ValidationError: object has to be True, but is False + """ + self._m_literal = value + return self
+ + +
+[docs] + def leaniant(self, re_true: str | None = None, re_false: str | None = None) -> Boolean: + """ + Set the value to be leaniant. This allows the value to be read from a string or a number. As + numbers only ``0`` (converts to: ``False``) and ``1`` (converts to: ``True``) are accepted. + + Note: + All string input in leaniant mode is converted to lowercase before, so you only need to + handle lowercase variations of your regex. By default the following regular expressions + are used:: + + re_true = r"^(true|1|yes|y)$" + re_false = r"^(false|0|no|n)$" + + Args: + re_true (Optional[str]): The regular expression for the true value. Default: None + re_false (Optional[str]): The regular expression for the false value. Default: None + + Returns: + Boolean: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.boolean().leaniant() + schema2 = p.boolean() + + The resulting schemas will parse the following objects:: + + >>> schema.parse(True) + True + >>> schema.parse("true") + True + >>> schema.parse("false") + False + >>> schema.parse(1) + True + + >>> schema2.parse(True) + True + >>> schema2.parse("true") + ValidationError: object has to be a boolean, but is 'true' + >>> schema2.parse(1) + ValidationError: object has to be a boolean, but is '1' + """ + self._f_leaniant = True + + if re_true is not None: + self._m_leaniant = (re_true, self._m_leaniant[1]) + + if re_false is not None: + self._m_leaniant = (self._m_leaniant[0], re_false) + + return self
+ + +
+[docs] + def parse(self, obj: Any) -> bool: + # if obj is already a boolean, return it + if isinstance(obj, bool): + pass + + # if obj is a string and leaniant mode is active, try to convert it to a boolean + elif isinstance(obj, str) and self._f_leaniant: + # if obj is a string, try to convert it to a boolean + if re.match(self._m_leaniant[0], obj.lower()): + obj = True + + elif re.match(self._m_leaniant[1], obj.lower()): + obj = False + + else: + # raise an error if the value could not be matched to any regex + raise ValidationError( + f"object has to be regex (true: {self._m_leaniant[0]!r}, false: " + f"{self._m_leaniant[1]!r}) accepted boolean value, but is {obj!r}" + ) + + # if obj is a number, try to convert it to a boolean + elif isinstance(obj, int | float) and self._f_leaniant: + # first check if the number is an actual number + if math.isnan(obj): + obj = False + + elif int(obj) == 1: + obj = True + + elif int(obj) == 0: + obj = False + + else: + raise ValidationError(f"object has to be 1 or 0, but is {obj!r}") + + else: + # raise an error if the value could not be parsed + raise ValidationError(f"object has to be a boolean, but is {obj!r}") + + # if literal is set, check if obj is the literal value + if self._m_literal is not None and obj != self._m_literal: + raise ValidationError(f"object has to be {self._m_literal}, but is {obj}") + + return obj
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[bool | None]: + if (value := parent.get(key, _NotFound)) is not _NotFound: + # if key is found, just package ``parse(..)`` it into a Some + if value is not None: + return Some(self.parse(value)) + + # if value is None, check if the value is nullable + if self._f_nullable: + return Some(None) + + raise ValidationError(f"key {key!r} is not nullable, but is None") + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/errors.html b/_modules/parasite/errors.html new file mode 100644 index 0000000..e294f9e --- /dev/null +++ b/_modules/parasite/errors.html @@ -0,0 +1,300 @@ + + + + + + + + parasite.errors - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.errors

+
+[docs] +class ValidationError(Exception): + """ + Validation error that is raised when a value does not match the expected type. + + Inheritance: + .. inheritance-diagram:: parasite.errors.ValidationError + :parts: 1 + + Example usage: + Let's assume we have the following schema:: + + from parasite import p + + schema = p.obj( + { + "name": p.string().required(), + "age": p.number().integer().min(0).optional(), + } + ) + + The schema will parse the following objects:: + + from parasite import errors + + try: + schema.parse({}) + + except errors.ValidationError as e: + print(e) + # key "name" not found, but is required + """
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/never.html b/_modules/parasite/never.html new file mode 100644 index 0000000..5d77b16 --- /dev/null +++ b/_modules/parasite/never.html @@ -0,0 +1,318 @@ + + + + + + + + parasite.never - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.never

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Never(ParasiteType[None]): + """ + Parasite type for representing never values. + + Note: + Please use ``p.never()`` instead of instantiating this class directly. ``p`` can be + imported with:: + + from parasite import p + + schema = p.never() + ... + """ + + def __init__(self) -> None: + pass + +
+[docs] + def parse(self, obj: Any) -> None: + # always raise an error, as this type can never be parsed + raise ValidationError("this type can never be parsed")
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[None]: + # if key is found, raise an error + if parent.get(key, _NotFound) is not _NotFound: + raise ValidationError(f"key {key!r} found, but this type can never be parsed") + + return Nil
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/null.html b/_modules/parasite/null.html new file mode 100644 index 0000000..5928086 --- /dev/null +++ b/_modules/parasite/null.html @@ -0,0 +1,410 @@ + + + + + + + + parasite.null - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.null

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Null(ParasiteType[None]): + """ + ``parasite`` schema for ``None`` values. + + Note: + Please use ``p.null()`` instead of instantiating this class directly. ``p`` can be + imported with:: + + from parasite import p + + schema = p.null() + ... + + Inheritance: + .. inheritance-diagram:: parasite.null.Null + :parts: 1 + """ + + _f_optional: bool = False # Wether the value is optional + + def __init__(self) -> None: + pass + +
+[docs] + def optional(self) -> Null: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Null: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "null": p.null().optional() }) + schema2 = p.obj({ "null": p.null() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "null": None }) + { "null": None } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "null": None }) + { "null": None } + >>> schema2.parse({ }) + ValidationError: key "null" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Null: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Null: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "null": p.null().optional().required() }) + schema2 = p.obj({ "null": p.null() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "null": None }) + { "null": None } + >>> schema.parse({ }) + ValidationError: key "null" not found, but is required + + >>> schema2.parse({ "null": None }) + { "null": None } + >>> schema2.parse({ }) + ValidationError: key "null" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def parse(self, obj: Any) -> None: + # do a loose comparison to None, to allow for subclasses of None + if obj == None: # noqa: E711 + return None + + # else raise an error + raise ValidationError(f"object has to be None, but is {obj!r}")
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[None]: + # if key is found, just package ``parse(..)`` it into a Some + if (value := parent.get(key, _NotFound)) is not _NotFound: + return Some(self.parse(value)) + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/object.html b/_modules/parasite/object.html new file mode 100644 index 0000000..d94dc7c --- /dev/null +++ b/_modules/parasite/object.html @@ -0,0 +1,931 @@ + + + + + + + + parasite.object - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.object

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+import copy
+from dataclasses import dataclass, field
+from typing import Any, TypeVar
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+from parasite.variant import Variant
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Object(ParasiteType[dict[Any, Any]]): + """ + ``parasite`` type for creating and parsing dictionary based schemas. Will return a python + ``dict[Any, Any]`` with the parsed values on success. + + Note: + Please use ``p.obj(...)`` instead of instantiating this class directly. ``p`` can be + imported with:: + + from parasite import p + + schema = p.obj({...}) + ... + + Note: + Calling the constructor with a dictionary of keys and their respective schemas will create a + new schema. This is equivalent to calling :func:`add_item` for each key and schema. If no or + an empty dictionary is passed, the schema will accept any kind of dictionary. + + Inheritance: + .. inheritance-diagram:: parasite.object.Object + :parts: 1 + """ + + # The items of the dictionary schema. + _m_items: dict[Any, ParasiteType] = field(default_factory=lambda: {}) + + _f_optional: bool = False # Whether the value is optional. + _f_nullable: bool = False # Whether the value can be None. + # Whether the dictionary should be parsed and not allow any other keys to exist. + _f_strict: bool = False + # Whether the dictionary should be stripped of all keys that are not in the dictionary. + _f_strip: bool = False + + def __init__(self, items: dict[Any, ParasiteType] | None = None) -> None: + """ + Args: + items (dict[K, ParasiteType]): The schema of subitems of the dictionary. Default: {}. + + Example usage: + You can create a dictionary schema by passing a dictionary of keys and their respective + schemas. The following example shows how to create a schema for a dictionary with a + the keys "name","age":: + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer().optional(), + }) + schema2 = p.obj() + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ }) + ValidationError: key "name" not found, but is required + + >>> schema2.parse({ }) + { } + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + """ + self._m_items = items or {} + +
+[docs] + def optional(self) -> Object: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "sub": p.obj().optional() }) + schema2 = p.obj({ "sub": p.obj() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": { } }) + { "sub": { } } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "sub": { } }) + { "sub": { } } + >>> schema2.parse({ }) + ValidationError: key "sub" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Object: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "sub": p.obj().optional().required() }) + schema2 = p.obj({ "sub": p.obj() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": { } }) + { "sub": { } } + >>> schema.parse({ }) + ValidationError: key "sub" not found, but is required + + >>> schema2.parse({ "sub": { } }) + { "sub": { } } + >>> schema2.parse({ }) + ValidationError: key "sub" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def nullable(self) -> Object: + """ + Makes the value nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`not_nullable`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "sub": p.obj().nullable() }) + schema2 = p.obj({ "sub": p.obj() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": { } }) + { "sub": { } } + >>> schema.parse({ "sub": None }) + { "sub": None } + + >>> schema2.parse({ "sub": { } }) + { "sub": { } } + >>> schema2.parse({ "sub": None }) + ValidationError: key "sub" is not nullable, but is None + """ + self._f_nullable = True + return self
+ + +
+[docs] + def not_nullable(self) -> Object: + """ + Makes the value not-nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`nullable`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`nullable` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "sub": p.obj().nullable().not_nullable() }) + schema2 = p.obj({ "sub": p.obj() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": { } }) + { "sub": { } } + >>> schema.parse({ "sub": None }) + ValidationError: key "sub" is not nullable, but is None + + >>> schema2.parse({ "sub": { } }) + { "sub": { } } + >>> schema2.parse({ "sub": None }) + ValidationError: key "sub" is not nullable, but is None + """ + self._f_nullable = False + return self
+ + +
+[docs] + def strict(self) -> Object: + """ + Set the dictionary to be strict. This function ensures that only the keys in the schema are + allowed in the dictionary. If this function is used :func:`strip` has no effect. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string() }).strict() + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ "name": "John", "age": 20 }) + ValidationError: object has the key "age", but is not allowed to + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + """ + self._f_strict = True + return self
+ + +
+[docs] + def strip(self) -> Object: + """ + Set the dictionary to be stripped. This will remove all keys that are not in the schema. In + constrast to :func:`strict` this function does not raise an error if a key is not in the + schema. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string() }).strip() + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ "name": "John", "age": 20 }) + { "name": "John" } + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + """ + self._f_strip = True + return self
+ + +
+[docs] + def extend(self, other: Object) -> Object: + """ + Extend the dictionary with another dictionary. This will overwrite all values of the current + dictionary with the values of the other dictionary if the key exists in both dictionaries. + If you want to merge the dictionaries, use :func:`merge`. + + Args: + other (Object): The dictionary to extend with. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following two schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string(), "age": p.string() }) + schema2 = p.obj({ "age": p.number().integer() }) + + If we extend the two schemas, the resulting schema will be:: + + # -> schema.extend(schema2) + + p.obj({ + "name": p.string(), + "age": p.number().integer(), + }) + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + + >>> schema.parse({ "name": "John", "age": "20" }) + ValidationError: key "age" has to be an integer, but is 20 + """ + if not isinstance(other, Object): + raise ValidationError(f"object has to be a dictionary, but is '{other!r}'") + + self._m_items.update(other._m_items) + return self
+ + +
+[docs] + def merge(self, other: Object) -> Object: + """ + Merge the dictionary with another dictionary. This tries to merge the values of the current + dictionary with the values of the other dictionary. If the key exists in both dictionaries + the value of the current dictionary will not be overwritten, but the values will be merged. + This results in the following behavior: + + - If both values are objects, they will be merged (:func:`merge`) into a single dictionary. + - If both values are variants, they will be merged into a single variant. + - If one value is a variant and the other is not, the value will be added to the variant. + - If both values are something else, they will be merged into a new variant. + + Args: + other (Object): The dictionary to merge with. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following two schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string(), "age": p.string() }) + schema2 = p.obj({ "age": p.number().integer() }) + + If we merge the two schemas, the resulting schema will be:: + + # -> schema.merge(schema2) + + p.obj({ + "name": p.string(), + "age": p.variant([ + p.string(), + p.number().integer(), + ]) + }) + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + + >>> schema.parse({ "name": "John", "age": "20" }) + { "name": "John", "age": "20" } + """ + for key, value in other._m_items.items(): + # If the key is in the dictionary, merge the values. + if key in self._m_items: + # if both src and dest are objects, merge them + if isinstance(value, Object) and isinstance(self._m_items[key], Object): + self._m_items[key].merge(value) # type: ignore + + # if both src and dest are arrays, merge them + elif isinstance(value, Variant) and isinstance(self._m_items[key], Variant): + for variant in value._m_variants: + self._m_items[key].add_variant(variant) # type: ignore + + # if dest is already a variant, add the value to it + elif isinstance(self._m_items[key], Variant): + self._m_items[key].add_variant(value) # type: ignore + + # else, create a new variant and add both values + else: + org = self._m_items[key] + self._m_items[key] = Variant().add_variant(org).add_variant(value) + + # If the key is not in the dictionary, add it. + else: + self._m_items[key] = value + + return self
+ + +
+[docs] + def pick(self, keys: list) -> Object: + """ + Pick only the keys from the object. This will create a new :class:`Object` with only the + keys found in the list. If a key is not found in the object, it will raise a KeyError. If + you want to ignore keys that are not found, use :func:`pick_safe`. + + Args: + keys (list[K]): The keys to pick. + + Returns: + Object: New instance of the class with only the picked keys. + + Raises: + KeyError: If a key is not found in the object. + + Example usage: + Lets assume we have the following schema:: + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer(), + "city": p.string(), + }).strict() + + If we pick the keys "name" and "age", the resulting schema will be:: + + # -> schema = schema.pick(["name", "age"]) + + p.obj({ + "name": p.string(), + "age": p.number().integer(), + }).strict() + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + + >>> schema.parse({ "name": "John", "age": 20, "city": "New York" }) + ValidationError: object has the key "city", but is not allowed to + """ + new_obj = copy.deepcopy(self) + new_obj._m_items = {key: self._m_items[key] for key in keys} + return new_obj
+ + +
+[docs] + def pick_safe(self, keys: list) -> Object: + """ + Pick only the keys from the object. This will create a new :class:`Object` with only the + keys found in the list. If a key is not found in the object, it will be ignored. If you want + to raise an error if a key is not found, use :func:`pick`. + + Args: + keys (list[K]): The keys to pick. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schema:: + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer(), + "city": p.string(), + }).strict() + + If we pick the keys "name" and "age", the resulting schema will be:: + + # -> schema = schema.pick_safe(["name", "age"]) + + p.obj({ + "name": p.string(), + "age": p.number().integer(), + }).strict() + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20 }) + { "name": "John", "age": 20 } + + >>> schema.parse({ "name": "John", "age": 20, "city": "New York" }) + { "name": "John", "age": 20 } + """ + new_obj = copy.deepcopy(self) + new_obj._m_items = {key: self._m_items[key] for key in keys if key in self._m_items} + return new_obj
+ + +
+[docs] + def omit(self, keys: list) -> Object: + """ + Omit the keys from the object. This will create a new :class:`Object` with all keys except + the ones found in the list. + + Args: + keys (list[K]): The keys to omit. + + Returns: + Object: New instance of the class with the omitted keys. + + Example usage: + Lets assume we have the following schema:: + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer(), + "city": p.string(), + }).strict() + + If we omit the keys "name" and "age", the resulting schema will be:: + + # -> schema = schema.omit(["name", "age"]) + + p.obj({ + "city": p.string(), + }).strict() + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20, "city": "New York" }) + ValidationError: object has the key "name", but is not allowed to + + >>> schema.parse({ "city": "New York" }) + { "city": "New York" } + """ + new_obj = copy.deepcopy(self) + new_obj._m_items = {key: value for key, value in self._m_items.items() if key not in keys} + return new_obj
+ + +
+[docs] + def add_item(self, key: Any, item: ParasiteType) -> Object: + """ + Add an item to the object. This will also overwrite the item if it already exists. + + Args: + key (K): The key of the item. + item (ParasiteType): The item to add. + + Returns: + Object: The updated instance of the class. + + Example usage: + Lets assume we have the following schema:: + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer(), + }).strict() + + If we add the key "city" with a string schema, the resulting schema will be:: + + # -> schema.add_item("city", p.string()) + + p.obj({ + "name": p.string(), + "age": p.number().integer(), + "city": p.string(), + }).strict() + + The resulting schema will parse the following objects:: + + >>> schema.parse({ "name": "John", "age": 20, "city": "New York" }) + { "name": "John", "age": 20, "city": "New York" } + + >>> schema.parse({ "name": "John", "age": 20 }) + ValidationError: key "city" not found, but is required + """ + self._m_items[key] = item + return self
+ + +
+[docs] + def parse(self, obj: Any) -> dict[Any, Any]: + if not isinstance(obj, dict): + raise ValidationError(f"object has to be a dictionary, but is {obj!r}") + + # If the dictionary should be strict, check if all keys are allowed. + if self._f_strict: + for key in obj: + if key not in self._m_items: + raise ValidationError(f"object has the key {key!r}, but is not allowed to") + + # If the dictionary should be stripped, strip it. + if self._f_strip: + obj = {key: value for key, value in obj.items() if key in self._m_items} + + # Parse the dictionary. + for key, item in self._m_items.items(): + item._find_and_parse(obj, key).map(lambda x, k=key: obj.update({k: x})) + + return obj
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[dict[K, Any] | None]: + if (value := parent.get(key, _NotFound)) is not _NotFound: + # If key is found, just package ``parse(..)`` it into a Some. + if value is not None: + return Some(self.parse(value)) + + # If value is None, check if the value is nullable. + if self._f_nullable: + return Some(None) + + raise ValidationError(f"key {key!r} is not nullable, but is None") + + # If the value is optional, return a Nil. + if self._f_optional: + return Nil + + # If the value is required, raise an error. + raise ValidationError(f"object has to be a dictionary, but is '{value!r}'")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/string.html b/_modules/parasite/string.html new file mode 100644 index 0000000..4ad39a1 --- /dev/null +++ b/_modules/parasite/string.html @@ -0,0 +1,964 @@ + + + + + + + + parasite.string - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.string

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass
+from re import Pattern
+import re
+from typing import Any, TypeVar
+from enum import Enum, auto
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+import tracing
+
+# -- Package Imports --
+from parasite import _const
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class String(ParasiteType[str]): + """ + ``parasite`` type for creating and parsing string based schemas. Will return a python ``str`` + with the parsed values on success. + + Inheritance: + .. inheritance-diagram:: parasite.string.String + :parts: 1 + """ + + class _RegexType(Enum): + """ + Enum for the different types of regexes that can be used to validate a string. + + Inheritance: + .. inheritance-diagram:: parasite.string.String._RegexType + :parts: 1 + """ + + NONE = auto() + EMAIL = auto() + URL = auto() + UUID = auto() + CUID = auto() + CUID2 = auto() + ULID = auto() + IPV4 = auto() + IPV6 = auto() + REGEX = auto() + + # flags + _f_optional: bool = False # Whether the value is optional + _f_nullable: bool = False # Whether the value can be None + _f_transform_before_parse: bool = False # Whether to transform the value before parsing + + # transformation flags + _f_trim: bool = False # Whether to trim the value + _f_to_lower: bool = False # Whether to convert the value to lowercase + _f_to_upper: bool = False # Whether to convert the value to uppercase + + _m_regex_t: _RegexType = _RegexType.NONE # Type of regex to use for validation + _m_ul: int | None = None # Upper limit for the value + _m_ll: int | None = None # Lower limit for the value + + _m_starts: str | None = None # String that the value must start with + _m_ends: str | None = None # String that the value must end with + _m_contains: str | None = None # String that the value must contain + _m_regex: Pattern | None = None # Compiled regex pattern to use for validation + + def __init__(self) -> None: + pass + +
+[docs] + def optional(self) -> String: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + String: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string().optional() }) + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> String: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + String: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string().optional().required() }) + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ }) + ValidationError: key "name" not found, but is required + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ }) + ValidationError: key "name" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def nullable(self) -> String: + """ + Makes the value nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`not_nullable`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + String: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string().nullable() }) + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ "name": None }) + { "name": None } + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + """ + self._f_nullable = True + return self
+ + +
+[docs] + def not_nullable(self) -> String: + """ + Makes the value not-nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Default behavior. Inverse of :func:`nullable`. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`nullable` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + String: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ "name": p.string().nullable().not_nullable() }) + schema2 = p.obj({ "name": p.string() }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "name": "John" }) + { "name": "John" } + >>> schema.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + + >>> schema2.parse({ "name": "John" }) + { "name": "John" } + >>> schema2.parse({ "name": None }) + ValidationError: key "name" is not nullable, but is None + """ + self._f_nullable = False + return self
+ + +
+[docs] + def trim(self) -> String: + """ + Trims the value. + + Returns: + String: modified instance + """ + self._f_trim = True + return self
+ + +
+[docs] + def to_lower(self) -> String: + """ + Converts the value to lowercase. + + Returns: + String: modified instance + """ + self._f_to_lower = True + return self
+ + +
+[docs] + def to_upper(self) -> String: + """ + Converts the value to uppercase. + + Returns: + String: modified instance + """ + self._f_to_upper = True + return self
+ + +
+[docs] + def transform_before_parse(self) -> String: + """ + Transforms the value before parsing. + + Returns: + String: modified instance + """ + self._f_transform_before_parse = True + return self
+ + +
+[docs] + def min(self, value: int) -> String: + """ + Sets the lower length limit for the string value. + + Args: + value (int): lower limit + + Returns: + String: modified instance + """ + self._m_ll = value + return self
+ + +
+[docs] + def max(self, value: int) -> String: + """ + Sets the upper length limit for the string value. + + Args: + value (int): upper limit + + Returns: + String: modified instance + """ + self._m_ul = value + return self
+ + +
+[docs] + def length(self, value: int) -> String: + """ + Sets the lower and upper limit for the value. + + Args: + value (int): length of the value + + Returns: + String: modified instance + """ + self._m_ll = value + self._m_ul = value + return self
+ + +
+[docs] + def not_empty(self) -> String: + """ + Sets the lower limit for the value. The value has to be not-empty. + + Returns: + String: modified instance + """ + return self.min(1)
+ + +
+[docs] + def starts_with(self, value: str) -> String: + """ + Sets the value that the string must start with. + + Args: + value (str): string that the value must start with + + Returns: + String: modified instance + """ + self._m_starts = value + return self
+ + +
+[docs] + def ends_with(self, value: str) -> String: + """ + Sets the value that the string must end with. + + Args: + value (str): string that the value must end with + + Returns: + String: modified instance + """ + self._m_ends = value + return self
+ + +
+[docs] + def contains(self, value: str) -> String: + """ + Sets the value that the string must contain. + + Args: + value (str): string that the value must contain + + Returns: + String: modified instance + """ + self._m_contains = value + return self
+ + +
+[docs] + def email(self) -> String: + """ + Sets the regex type to email. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.EMAIL + return self
+ + +
+[docs] + def url(self) -> String: + """ + Sets the regex type to URL. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.URL + return self
+ + +
+[docs] + def uuid(self) -> String: + """ + Sets the regex type to UUID. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.UUID + return self
+ + +
+[docs] + def cuid(self) -> String: + """ + Sets the regex type to CUID. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.CUID + return self
+ + +
+[docs] + def cuid2(self) -> String: + """ + Sets the regex type to CUID2. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.CUID2 + return self
+ + +
+[docs] + def ulid(self) -> String: + """ + Sets the regex type to ULID. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.ULID + return self
+ + +
+[docs] + def ipv4(self) -> String: + """ + Sets the regex type to IPv4. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.IPV4 + return self
+ + +
+[docs] + def ipv6(self) -> String: + """ + Sets the regex type to IPv6. + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.IPV6 + return self
+ + +
+[docs] + def regex(self, value: Pattern) -> String: + """ + Sets the regex pattern to use for validation. + + Args: + value (Pattern): compiled regex pattern + + Returns: + String: modified instance + """ + self._m_regex_t = self._RegexType.REGEX + self._m_regex = value + return self
+ + +
+[docs] + def match(self, value: str) -> String: + """ + Sets the regex pattern to use for validation. + + Args: + value (str): regex pattern + + Returns: + String: modified instance + """ + return self.regex(re.compile(value))
+ + + def _apply_transformations(self, value: str) -> str: + """ + Applies the transformations on the value. + + Args: + value (str): value to transform + + Returns: + str: transformed value + """ + if self._f_trim: + value = value.strip() + + if self._f_to_lower: + value = value.lower() + + if self._f_to_upper: + value = value.upper() + + return value + + def _parse_bounds(self, value: str) -> str: + """ + Parses the value with the length _constraints. + + Args: + value (str): value to parse + + Returns: + str: parsed value + """ + if self._m_ll is not None and len(value) < self._m_ll: + raise ValidationError(f"length of value '{value}' is less than {self._m_ll}") + + if self._m_ul is not None and len(value) > self._m_ul: + raise ValidationError(f"length of value '{value}' is greater than {self._m_ul}") + + return value + + def _parse_basic(self, value: str) -> str: + """ + Parses the value with the basic _constraints. + + Args: + value (str): value to parse + + Returns: + str: parsed value + """ + if self._m_starts is not None and not value.startswith(self._m_starts): + raise ValidationError(f"value '{value}' does not start with '{self._m_starts}'") + + if self._m_ends is not None and not value.endswith(self._m_ends): + raise ValidationError(f"value '{value}' does not end with '{self._m_ends}'") + + if self._m_contains is not None and self._m_contains not in value: + raise ValidationError(f"value '{value}' does not contain '{self._m_contains}'") + + return value + + def _parse_regex(self, value: str) -> str: + """ + Parses the value with the regex _constraints. + + Args: + value (str): value to parse + + Returns: + str: parsed value + """ + match self._m_regex_t: + case self._RegexType.NONE: + return value + + case self._RegexType.EMAIL: + r = re.match(_const.RE_EMAIL, value) + print(f"r: {r!r}, regex = {_const.RE_EMAIL!r}") + + if not _const.RE_EMAIL.match(value): + raise ValidationError(f"value '{value}' is not a valid email") + return value + + case self._RegexType.URL: + if not _const.RE_URL.match(value): + raise ValidationError(f"value '{value}' is not a valid URL") + return value + + case self._RegexType.UUID: + if not _const.RE_UUID.match(value): + raise ValidationError(f"value '{value}' is not a valid UUID") + return value + + case self._RegexType.CUID: + if not _const.RE_CUID.match(value): + raise ValidationError(f"value '{value}' is not a valid CUID") + return value + + case self._RegexType.CUID2: + if not _const.RE_CUID2.match(value): + raise ValidationError(f"value '{value}' is not a valid CUID2") + return value + + case self._RegexType.ULID: + if not _const.RE_ULID.match(value): + raise ValidationError(f"value '{value}' is not a valid ULID") + return value + + case self._RegexType.IPV4: + if not _const.RE_IPV4.match(value): + raise ValidationError(f"value '{value}' is not a valid IPv4") + return value + + case self._RegexType.IPV6: + if not _const.RE_IPV6.match(value): + raise ValidationError(f"value '{value}' is not a valid IPv6") + return value + + case self._RegexType.REGEX: + if not self._m_regex: + raise ValidationError("no regex pattern provided") + if not self._m_regex.match(value): + raise ValidationError(f"value '{value}' does not match the regex pattern") + return value + + case _: + pass + + tracing.warn(f"unsupported regex type {self._m_regex_t!r}") + return value + +
+[docs] + def parse(self, obj: Any) -> str: + if not isinstance(obj, str): + raise ValidationError(f"expected a string, but got {obj!r}") + + if self._f_transform_before_parse: + obj = self._apply_transformations(obj) + + obj = self._parse_bounds(obj) + obj = self._parse_basic(obj) + obj = self._parse_regex(obj) + + if not self._f_transform_before_parse: + obj = self._apply_transformations(obj) + + return obj
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[str | None]: + if (value := parent.get(key, _NotFound)) is not _NotFound: + if value is not None: + # if key is found, just package ``parse(..)`` it into a Some + return Some(self.parse(value)) + + # if value is None, check if the value is nullable + if self._f_nullable: + return Some(None) + + raise ValidationError(f"key {key!r} is not nullable, but is None") + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/parasite/variant.html b/_modules/parasite/variant.html new file mode 100644 index 0000000..7fd9132 --- /dev/null +++ b/_modules/parasite/variant.html @@ -0,0 +1,709 @@ + + + + + + + + parasite.variant - Parasite v0.1.10 + + + + + + + + + + + + + + + + + + + + Contents + + + + + + + + Menu + + + + + + + + + + + Expand + + + + + + + + + + + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark mode + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+
+ +
+ +
+
+

Source code for parasite.variant

+# -- Future Imports -- (Use with caution, may not work as expected in all cases)
+from __future__ import annotations
+
+# -- STL Imports --
+from dataclasses import dataclass, field
+from typing import Any, TypeVar
+from collections.abc import Iterable
+
+# -- Library Imports --
+from rusttypes.option import Nil, Option, Some
+from rusttypes.result import Result, Err, Ok
+
+# -- Package Imports --
+from parasite.errors import ValidationError
+from parasite.type import ParasiteType, _NotFound
+
+K = TypeVar("K")
+"""Template type for the key in a dictionary."""
+
+
+
+[docs] +@dataclass +class Variant(ParasiteType[Any]): + """ + ``parasite`` type for representing variant values. The value can be one of the variants + specified in the constructor or added through the :func:`add_item` function. The value is parsed + by trying to parse it with each variant in the order they are added. If none of the variants can + parse the value, a :class:`ValidationError` is raised. + + Inheritance: + .. inheritance-diagram:: parasite.variant.Variant + :parts: 1 + """ + + # The variants of the variant. + _m_variants: list[ParasiteType] = field(default_factory=lambda: []) + + _f_optional: bool = False # Whether the value is optional. + _f_nullable: bool = False # Whether the value can be None. + + def __init__(self, variants: Iterable[ParasiteType] | None = None): + """ + Args: + variants (Iterable[ParasiteType], optional): The variants of the variant. Default: []. + + Example usage: + You can create a variant schema by passing the variants as a list to the constructor. + The variants can be any of the parasite types. The following example shows how to create + a variant schema with a string and an integer variant:: + + from parasite import p + + schema = p.variant([ + p.string(), + p.number().integer(), + ]) + + schema2 = p.variant() + + The resulting schemas will parse the following objects:: + + >>> schema.parse("42") + "42" + >>> schema.parse(42) + 42 + + >>> schema2.parse("42") + ValidationError: object has to be one of [], but is "42" + + """ + self._m_variants = list(variants or []) + +
+[docs] + def optional(self) -> Variant: + """ + Makes the value optional, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`required`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Variant: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]).optional() + }) + + schema2 = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]) + }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": "42" }) + { "sub": "42" } + >>> schema.parse({ }) + { } + + >>> schema2.parse({ "sub": 42 }) + { "sub": 42 } + >>> schema2.parse({ }) + ValidationError: key "sub" not found, but is required + """ + self._f_optional = True + return self
+ + +
+[docs] + def required(self) -> Variant: + """ + Makes the value required, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`optional`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`optional` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Variant: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]).optional().required() + }) + + schema2 = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]) + }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": "42" }) + { "sub": "42" } + >>> schema.parse({ }) + ValidationError: key "sub" not found, but is required + + >>> schema2.parse({ "sub": 42 }) + { "sub": 42 } + >>> schema2.parse({ }) + ValidationError: key "sub" not found, but is required + """ + self._f_optional = False + return self
+ + +
+[docs] + def nullable(self) -> Variant: + """ + Makes the value nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`not_nullable`. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Variant: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]).nullable() + }) + + schema2 = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]) + }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": "42" }) + { "sub": "42" } + >>> schema.parse({ "sub": None }) + { "sub": None } + + >>> schema2.parse({ "sub": 42 }) + { "sub": 42 } + >>> schema2.parse({ "sub": None }) + ValidationError: object has to be a dictionary, but is 'None' + """ + self._f_nullable = True + return self
+ + +
+[docs] + def not_nullable(self) -> Variant: + """ + Makes the value not-nullable, when parsing with :func:`_find_and_parse`. Has no effect on + :func:`parse`. Inverse of :func:`nullable`. Default behavior. + + Note: + This function is default behavior for the class and therefore only has an effect if the + function :func:`nullable` may have been called before. + + Warning: + This function has no effect if the value is parsed as a standalone value. + + Returns: + Variant: The updated instance of the class. + + Example usage: + Lets assume we have the following schemas:: + + from parasite import p + + schema = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]).nullable().not_nullable() + }) + + schema2 = p.obj({ + "sub": p.variant([ + p.string(), + p.number().integer(), + ]) + }) + + The resulting schemas will parse the following objects:: + + >>> schema.parse({ "sub": "42" }) + { "sub": "42" } + >>> schema.parse({ "sub": None }) + ValidationError: key "sub" cannot be None + + >>> schema2.parse({ "sub": 42 }) + { "sub": 42 } + >>> schema2.parse({ "sub": None }) + ValidationError: key "sub" not found, but is required + """ + self._f_nullable = False + return self
+ + +
+[docs] + def add_variant(self, variant: ParasiteType) -> Variant: + """ + Add a variant to the variant. + + Note: + The order of the variants is important, as the value is parsed by trying to parse it + with each variant in the order they are added. The first variant that can parse the + value is used. + + Args: + variant (ParasiteType): The variant to add. + + Returns: + Variant: The updated instance of the class. + + Example usage: + You can add a variant to the variant by calling the :func:`add_variant` function. The + following example shows how to add a string variant to a variant schema:: + + from parasite import p + + schema = p.variant() + schema.add_variant(p.string()) + + The resulting schema will parse the following objects:: + + >>> schema.parse("42") + "42" + + >>> schema.parse(42) + ValidationError: object has to be one of [String(...)], but is 42 + """ + self._m_variants.append(variant) + return self
+ + +
+[docs] + def rm_variant(self, variant: ParasiteType) -> Variant: + """ + Remove a variant from the variant. + + Warning: + The variant is removed by reference, so the variant has to be the same instance as the + one added to the variant. Equivalent ro the ``list.remove`` function. + + Throws: + ValueError: If the variant is not found in the variant. + + Args: + variant (ParasiteType): The variant to remove. + + Returns: + Variant: The updated instance of the class. + + Example usage: + You can remove a variant from the variant by calling the :func:`rm_variant` function. + The following example shows how to remove a string variant from a variant schema:: + + from parasite import p + + schema = p.variant([ + p.string(), + p.number().integer(), + ]) + schema.rm_variant(p.string()) + + The resulting schema will parse the following objects:: + + >>> schema.parse(42) + 42 + + >>> schema.parse("42") + ValidationError: object has to be one of [Number(...)], but is '42' + """ + try: + self._m_variants.remove(variant) + + except ValueError as exc: + raise ValueError(f"Variant {variant!r} not found in {self!r}") from exc + + return self
+ + +
+[docs] + def rm_variant_safe(self, variant: ParasiteType) -> Result[Variant, ValueError]: + """ + Remove a variant from the variant. + + Warning: + The variant is removed by reference, so the variant has to be the same instance as the + one added to the variant. Equivalent ro the ``list.remove`` function. + + Args: + variant (ParasiteType): The variant to remove. + + Returns: + Result[Variant, ValueError]: The updated instance of the class or an error + + Example usage: + You can remove a variant from the variant by calling the :func:`rm_variant_safe` + function. The following example shows how to remove a string variant from a variant + schema:: + + from parasite import p + + schema = ( + p.variant([ + p.string(), + p.number().integer(), + ]) + .rm_variant_safe(p.string()) + .expect("Variant not found") + ) + + The resulting schema will parse the following objects:: + + >>> schema.parse(42) + 42 + + >>> schema.parse("42") + ValidationError: object has to be one of [Number(...)], but is '42' + + If the variant is not found, an error is returned:: + + >>> schema.rm_variant_safe(p.string()) + Err(ValueError: "Variant String(...) not found in Variant(...)") + """ + try: + self.rm_variant(variant) + return Ok(self) + + except ValueError as exc: + return Err(exc)
+ + +
+[docs] + def parse(self, obj: Any) -> Any: + for variant in self._m_variants: + try: + return variant.parse(obj) + + except ValidationError: + continue + + raise ValidationError(f"object has to be one of {self._m_variants!r}, but is {obj!r}")
+ + + def _find_and_parse(self, parent: dict[K, Any], key: K) -> Option[Any | None]: + if (value := parent.get(key, _NotFound)) is not _NotFound: + # if key is found, just package ``parse(..)`` it into a Some + if value is not None: + return Some(self.parse(value)) + + # if value is None, check if the value is nullable + if self._f_nullable: + return Some(None) + + raise ValidationError(f"key {key!r} is not nullable, but is None") + + # if key is not found, return Nil if optional, else raise an error + if self._f_optional: + return Nil + + raise ValidationError(f"key {key!r} not found, but is required")
+ +
+
+
+
+ +
+
+ + Made with Sphinx and @pradyunsg's + + Furo + +
+
+ +
+
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/_const.rst.txt b/_sources/apidocs/pkg_parasite/_const.rst.txt new file mode 100644 index 0000000..222f3eb --- /dev/null +++ b/_sources/apidocs/pkg_parasite/_const.rst.txt @@ -0,0 +1,11 @@ +################### +``parasite._const`` +################### + +Member Reference +================ + +.. automodule:: parasite._const + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/_root.rst.txt b/_sources/apidocs/pkg_parasite/_root.rst.txt new file mode 100644 index 0000000..74aea26 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/_root.rst.txt @@ -0,0 +1,12 @@ +############ +``parasite`` +############ + +Member Reference +================ + +.. automodule:: parasite + :members: + :inherited-members: + :undoc-members: + :private-members: parasite._Namespace \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/any.rst.txt b/_sources/apidocs/pkg_parasite/any.rst.txt new file mode 100644 index 0000000..c7bc156 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/any.rst.txt @@ -0,0 +1,36 @@ +################ +``parasite.any`` +################ + +Brief +===== + +Reference for the ``any`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.any.Any_` class, which is a generic container for +any Python object. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.any() + schema.parse(1) # 1 + schema.parse('hello') # 'hello' + ... + + schema = p.obj({ "payload": p.any().optional() }) + schema.parse({ "payload": 1 }) # { "payload": 1 } + schema.parse({ }) # { } + ... + + +Member Reference +================ + +.. automodule:: parasite.any + :members: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/array.rst.txt b/_sources/apidocs/pkg_parasite/array.rst.txt new file mode 100644 index 0000000..3b21c12 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/array.rst.txt @@ -0,0 +1,36 @@ +################## +``parasite.array`` +################## + +Brief +===== + +Reference for the ``array`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.array.Array` class, which is a generic container for +a list of elements of a specific type. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.array() + schema.parse([1]) # 1 + schema.parse(['hello']) # 'hello' + ... + + schema = p.array(p.number().integer()) + schema.parse([1, 2, 3]) # [1, 2, 3] + schema.parse(["hello", "world"]) # ValidationError: Expected an integer, got 'hello' + ... + + +Member Reference +================ + +.. automodule:: parasite.array + :members: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/boolean.rst.txt b/_sources/apidocs/pkg_parasite/boolean.rst.txt new file mode 100644 index 0000000..11b6adf --- /dev/null +++ b/_sources/apidocs/pkg_parasite/boolean.rst.txt @@ -0,0 +1,37 @@ +#################### +``parasite.boolean`` +#################### + +Brief +===== + +Reference for the ``boolean`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.boolean.Boolean` class, which is a generic container for +any Python object. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.boolean() + schema.parse(True) # True + schema.parse(False) # False + schema.parse(1) # ValidationError: Expected a boolean, got 1 + ... + + schema = p.boolean().leaniant() + schema.parse(1) # True + schema.parse("true") # True + ... + + +Member Reference +================ + +.. automodule:: parasite.boolean + :members: + :inherited-members: + :undoc-members: \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/errors.rst.txt b/_sources/apidocs/pkg_parasite/errors.rst.txt new file mode 100644 index 0000000..eacf3d6 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/errors.rst.txt @@ -0,0 +1,32 @@ +################### +``parasite.errors`` +################### + +Brief +===== + +This submodule contains the custom exceptions used by the parasite package. + +Usage +===== + +The exceptions are used to signal errors in the code. They are raised when the code encounters an +error that it cannot handle. The exceptions are used to provide a detailed error message to the +user. + +.. code-block:: python + + from parasite import errors + + try: + # code that may raise an exception + except errors.ValidationError as e: + print(e) + +Member Reference +================ + +.. automodule:: parasite.errors + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/_sources/apidocs/pkg_parasite/index.rst.txt b/_sources/apidocs/pkg_parasite/index.rst.txt new file mode 100644 index 0000000..b80c80d --- /dev/null +++ b/_sources/apidocs/pkg_parasite/index.rst.txt @@ -0,0 +1,26 @@ +.. _apidocs: + +############# +API Reference +############# + +This section documents the API of the ``parasite`` package. Use the links below to +navigate the code documentation. + +Modules +======= + +.. toctree:: + :maxdepth: 3 + + _root + _const + errors + any + array + boolean + never + null + object + string + variant diff --git a/_sources/apidocs/pkg_parasite/never.rst.txt b/_sources/apidocs/pkg_parasite/never.rst.txt new file mode 100644 index 0000000..6afc9fc --- /dev/null +++ b/_sources/apidocs/pkg_parasite/never.rst.txt @@ -0,0 +1,35 @@ +################## +``parasite.never`` +################## + +Brief +===== + +Reference for the ``never`` submodule of the ``parasite`` package. This submodule +contains the :class:`Never` class, which is a simple class that always raises a +:class:`ValidationError` when called. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.never() + schema.parse(1) # ValidationError: this type can never be parsed + ... + + schema = p.obj({ "name": p.never() }) + schema.parse({ "name": "John" }) # ValidationError: key "name" found, but this type can never be parsed + ... + +Member Reference +================ + +.. automodule:: parasite.never + :members: + :inherited-members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/apidocs/pkg_parasite/null.rst.txt b/_sources/apidocs/pkg_parasite/null.rst.txt new file mode 100644 index 0000000..a6860e7 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/null.rst.txt @@ -0,0 +1,30 @@ +################# +``parasite.null`` +################# + +Brief +===== + +Reference for the ``null`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.null.Null` class, which is a generic container for +a Python ``None`` object. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.null() + schema.parse(None) # -> None + ... + +Member Reference +================ + +.. automodule:: parasite.null + :members: + :inherited-members: + :undoc-members: + diff --git a/_sources/apidocs/pkg_parasite/object.rst.txt b/_sources/apidocs/pkg_parasite/object.rst.txt new file mode 100644 index 0000000..3109eed --- /dev/null +++ b/_sources/apidocs/pkg_parasite/object.rst.txt @@ -0,0 +1,36 @@ +################### +``parasite.object`` +################### + +Brief +===== + +Reference for the ``object`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.object.Object` class, which is a generic container for a dictionary Python object. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.obj({ + "name": p.string(), + "age": p.number().integer().min(0), + }).strict() + + schema.parse({ + "name": "John", + "age": 30, + }) # -> {"name": "John", "age": 30 } + ... + +Member Reference +================ + +.. automodule:: parasite.object + :members: + :inherited-members: + :undoc-members: + diff --git a/_sources/apidocs/pkg_parasite/string.rst.txt b/_sources/apidocs/pkg_parasite/string.rst.txt new file mode 100644 index 0000000..a8fa219 --- /dev/null +++ b/_sources/apidocs/pkg_parasite/string.rst.txt @@ -0,0 +1,31 @@ +################### +``parasite.string`` +################### + +Brief +===== + +Reference for the ``string`` submodule of the ``parasite`` package. This submodule +contains the :class:`parasite.string.String` class, which is a generic container for a string +Python object. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.string().min(3).max(10) + + schema.parse("hello") # -> "hello" + ... + +Member Reference +================ + +.. automodule:: parasite.string + :members: + :inherited-members: + :undoc-members: + diff --git a/_sources/apidocs/pkg_parasite/variant.rst.txt b/_sources/apidocs/pkg_parasite/variant.rst.txt new file mode 100644 index 0000000..fd0419b --- /dev/null +++ b/_sources/apidocs/pkg_parasite/variant.rst.txt @@ -0,0 +1,35 @@ +#################### +``parasite.variant`` +#################### + +Brief +===== + +Reference for the ``variant`` submodule of the ``parasite`` package. This submodule +contains the :class:`Variant` class, which is a generic container for a union of various Python +objects. + +Usage +===== + +.. code-block:: python + + from parasite import p + + schema = p.variant([ + p.string(), + p.number().integer(), + ]) + + schema.parse("42") # -> "42" + schema.parse(42) # -> 42 + ... + +Member Reference +================ + +.. automodule:: parasite.variant + :members: + :inherited-members: + :undoc-members: + diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..e4d7a63 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,30 @@ +.. Parasite documentation master file, created by + sphinx-quickstart on Sat Jun 15 13:32:36 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Parasite's documentation! +==================================== + +.. toctree:: + :hidden: + + API Reference + GitHub + +.. Documentation Home +.. Getting Started +.. Tutorials +.. How-to Guides +.. API Reference +.. Explanations +.. Release Notes +.. GitHub + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8141580 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..f316efc --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/debug.css b/_static/debug.css new file mode 100644 index 0000000..74d4aec --- /dev/null +++ b/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..1e71483 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: 'v0.1.10', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 0000000..027576e --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/_static/images/ecosystem-logo.svg b/_static/images/ecosystem-logo.svg new file mode 100644 index 0000000..51b02dd --- /dev/null +++ b/_static/images/ecosystem-logo.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/images/logo.png b/_static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..769ddee14f6190cb3e18e8d1f984ab3ada506d5a GIT binary patch literal 31503 zcmc$_Ran$t)IU1(ATb~cNDU|8|LVOtH~(|N^9+0T-m5-qt-beJ6Zuk0h2j>&Ef5Gqq551|2LvKuz4-$Z z10z#T#MU5?�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]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0=0;o--)(s=e[o])&&(r=(a<3?s(r):a>3?s(t,i,r):s(t,i))||r);return a>3&&r&&Object.defineProperty(t,i,r),r}function i(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)} +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */const n=window,s=n.ShadowRoot&&(void 0===n.ShadyCSS||n.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,a=Symbol(),r=new WeakMap;let o=class{constructor(e,t,i){if(this._$cssResult$=!0,i!==a)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const t=this.t;if(s&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=r.get(t)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),i&&r.set(t,e))}return e}toString(){return this.cssText}};const d=s?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new o("string"==typeof e?e:e+"",void 0,a))(t)})(e):e +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */;var l;const c=window,h=c.trustedTypes,u=h?h.emptyScript:"",p=c.reactiveElementPolyfillSupport,v={toAttribute(e,t){switch(t){case Boolean:e=e?u:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},m=(e,t)=>t!==e&&(t==t||e==e),b={attribute:!0,type:String,converter:v,reflect:!1,hasChanged:m};let f=class extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(e){var t;this.finalize(),(null!==(t=this.h)&&void 0!==t?t:this.h=[]).push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach(((t,i)=>{const n=this._$Ep(i,t);void 0!==n&&(this._$Ev.set(n,i),e.push(n))})),e}static createProperty(e,t=b){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const i="symbol"==typeof e?Symbol():"__"+e,n=this.getPropertyDescriptor(e,i,t);void 0!==n&&Object.defineProperty(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){return{get(){return this[t]},set(n){const s=this[e];this[t]=n,this.requestUpdate(e,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||b}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),void 0!==e.h&&(this.h=[...e.h]),this.elementProperties=new Map(e.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const e=this.properties,t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];for(const i of t)this.createProperty(i,e[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(d(e))}else void 0!==e&&t.push(d(e));return t}static _$Ep(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}u(){var e;this._$E_=new Promise((e=>this.enableUpdating=e)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(e=this.constructor.h)||void 0===e||e.forEach((e=>e(this)))}addController(e){var t,i;(null!==(t=this._$ES)&&void 0!==t?t:this._$ES=[]).push(e),void 0!==this.renderRoot&&this.isConnected&&(null===(i=e.hostConnected)||void 0===i||i.call(e))}removeController(e){var t;null===(t=this._$ES)||void 0===t||t.splice(this._$ES.indexOf(e)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((e,t)=>{this.hasOwnProperty(t)&&(this._$Ei.set(t,this[t]),delete this[t])}))}createRenderRoot(){var e;const t=null!==(e=this.shadowRoot)&&void 0!==e?e:this.attachShadow(this.constructor.shadowRootOptions);return((e,t)=>{s?e.adoptedStyleSheets=t.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet)):t.forEach((t=>{const i=document.createElement("style"),s=n.litNonce;void 0!==s&&i.setAttribute("nonce",s),i.textContent=t.cssText,e.appendChild(i)}))})(t,this.constructor.elementStyles),t}connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostConnected)||void 0===t?void 0:t.call(e)}))}enableUpdating(e){}disconnectedCallback(){var e;null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostDisconnected)||void 0===t?void 0:t.call(e)}))}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$EO(e,t,i=b){var n;const s=this.constructor._$Ep(e,i);if(void 0!==s&&!0===i.reflect){const a=(void 0!==(null===(n=i.converter)||void 0===n?void 0:n.toAttribute)?i.converter:v).toAttribute(t,i.type);this._$El=e,null==a?this.removeAttribute(s):this.setAttribute(s,a),this._$El=null}}_$AK(e,t){var i;const n=this.constructor,s=n._$Ev.get(e);if(void 0!==s&&this._$El!==s){const e=n.getPropertyOptions(s),a="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==(null===(i=e.converter)||void 0===i?void 0:i.fromAttribute)?e.converter:v;this._$El=s,this[s]=a.fromAttribute(t,e.type),this._$El=null}}requestUpdate(e,t,i){let n=!0;void 0!==e&&(((i=i||this.constructor.getPropertyOptions(e)).hasChanged||m)(this[e],t)?(this._$AL.has(e)||this._$AL.set(e,t),!0===i.reflect&&this._$El!==e&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(e,i))):n=!1),!this.isUpdatePending&&n&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((e,t)=>this[t]=e)),this._$Ei=void 0);let t=!1;const i=this._$AL;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostUpdate)||void 0===t?void 0:t.call(e)})),this.update(i)):this._$Ek()}catch(e){throw t=!1,this._$Ek(),e}t&&this._$AE(i)}willUpdate(e){}_$AE(e){var t;null===(t=this._$ES)||void 0===t||t.forEach((e=>{var t;return null===(t=e.hostUpdated)||void 0===t?void 0:t.call(e)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(e){return!0}update(e){void 0!==this._$EC&&(this._$EC.forEach(((e,t)=>this._$EO(t,this[t],e))),this._$EC=void 0),this._$Ek()}updated(e){}firstUpdated(e){}}; +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +var g;f.finalized=!0,f.elementProperties=new Map,f.elementStyles=[],f.shadowRootOptions={mode:"open"},null==p||p({ReactiveElement:f}),(null!==(l=c.reactiveElementVersions)&&void 0!==l?l:c.reactiveElementVersions=[]).push("1.6.1");const x=window,_=x.trustedTypes,y=_?_.createPolicy("lit-html",{createHTML:e=>e}):void 0,k=`lit$${(Math.random()+"").slice(9)}$`,w="?"+k,$=`<${w}>`,S=document,A=(e="")=>S.createComment(e),z=e=>null===e||"object"!=typeof e&&"function"!=typeof e,C=Array.isArray,E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,P=/-->/g,q=/>/g,M=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),T=/'/g,N=/"/g,O=/^(?:script|style|textarea|title)$/i,R=(e=>(t,...i)=>({_$litType$:e,strings:t,values:i}))(1),I=Symbol.for("lit-noChange"),U=Symbol.for("lit-nothing"),H=new WeakMap,j=S.createTreeWalker(S,129,null,!1),L=(e,t)=>{const i=e.length-1,n=[];let s,a=2===t?"":"",r=E;for(let t=0;t"===d[0]?(r=null!=s?s:E,l=-1):void 0===d[1]?l=-2:(l=r.lastIndex-d[2].length,o=d[1],r=void 0===d[3]?M:'"'===d[3]?N:T):r===N||r===T?r=M:r===P||r===q?r=E:(r=M,s=void 0);const h=r===M&&e[t+1].startsWith("/>")?" ":"";a+=r===E?i+$:l>=0?(n.push(o),i.slice(0,l)+"$lit$"+i.slice(l)+k+h):i+k+(-2===l?(n.push(void 0),t):h)}const o=a+(e[i]||"")+(2===t?"":"");if(!Array.isArray(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==y?y.createHTML(o):o,n]};class V{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let s=0,a=0;const r=e.length-1,o=this.parts,[d,l]=L(e,t);if(this.el=V.createElement(d,i),j.currentNode=this.el.content,2===t){const e=this.el.content,t=e.firstChild;t.remove(),e.append(...t.childNodes)}for(;null!==(n=j.nextNode())&&o.length0){n.textContent=_?_.emptyScript:"";for(let i=0;iC(e)||"function"==typeof(null==e?void 0:e[Symbol.iterator]))(e)?this.k(e):this.g(e)}O(e,t=this._$AB){return this._$AA.parentNode.insertBefore(e,t)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}g(e){this._$AH!==U&&z(this._$AH)?this._$AA.nextSibling.data=e:this.T(S.createTextNode(e)),this._$AH=e}$(e){var t;const{values:i,_$litType$:n}=e,s="number"==typeof n?this._$AC(e):(void 0===n.el&&(n.el=V.createElement(n.h,this.options)),n);if((null===(t=this._$AH)||void 0===t?void 0:t._$AD)===s)this._$AH.p(i);else{const e=new D(s,this),t=e.v(this.options);e.p(i),this.T(t),this._$AH=e}}_$AC(e){let t=H.get(e.strings);return void 0===t&&H.set(e.strings,t=new V(e)),t}k(e){C(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const s of e)n===t.length?t.push(i=new F(this.O(A()),this.O(A()),this,this.options)):i=t[n],i._$AI(s),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=U}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(e,t=this,i,n){const s=this.strings;let a=!1;if(void 0===s)e=B(this,e,t,0),a=!z(e)||e!==this._$AH&&e!==I,a&&(this._$AH=e);else{const n=e;let r,o;for(e=s[0],r=0;r{var n,s;const a=null!==(n=null==i?void 0:i.renderBefore)&&void 0!==n?n:t;let r=a._$litPart$;if(void 0===r){const e=null!==(s=null==i?void 0:i.renderBefore)&&void 0!==s?s:null;a._$litPart$=r=new F(t.insertBefore(A(),e),e,void 0,null!=i?i:{})}return r._$AI(e),r})(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!1)}render(){return I}}te.finalized=!0,te._$litElement$=!0,null===(K=globalThis.litElementHydrateSupport)||void 0===K||K.call(globalThis,{LitElement:te});const ie=globalThis.litElementPolyfillSupport;null==ie||ie({LitElement:te}),(null!==(ee=globalThis.litElementVersions)&&void 0!==ee?ee:globalThis.litElementVersions=[]).push("3.2.2"); +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const ne=e=>t=>"function"==typeof t?((e,t)=>(customElements.define(e,t),t))(e,t):((e,t)=>{const{kind:i,elements:n}=t;return{kind:i,elements:n,finisher(t){customElements.define(e,t)}}})(e,t) +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */,se=(e,t)=>"method"===t.kind&&t.descriptor&&!("value"in t.descriptor)?{...t,finisher(i){i.createProperty(t.key,e)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:t.key,initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializer.call(this))},finisher(i){i.createProperty(t.key,e)}};function ae(e){return(t,i)=>void 0!==i?((e,t,i)=>{t.constructor.createProperty(i,e)})(e,t,i):se(e,t) +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */}var re;null===(re=window.HTMLSlotElement)||void 0===re||re.prototype.assignedElements; +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const oe=e=>null!=e?e:U;function de(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i=0;a--){var r=t[e.placement];r.splice(r.indexOf(e.key),1);var o=this.fromElementDescriptor(e),d=this.toElementFinisherExtras((0,s[a])(o)||o);e=d.element,this.addElementPlacement(e,t),d.finisher&&n.push(d.finisher);var l=d.extras;if(l){for(var c=0;c=0;n--){var s=this.fromClassDescriptor(e),a=this.toClassDescriptor((0,t[n])(s)||s);if(void 0!==a.finisher&&i.push(a.finisher),void 0!==a.elements){e=a.elements;for(var r=0;r(...t)=>{const i=e(...t);return _e.set(i,!0),i},ke=e=>"function"==typeof e&&_e.has(e),we="undefined"!=typeof window&&null!=window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback,$e=(e,t,i=null)=>{for(;t!==i;){const i=t.nextSibling;e.removeChild(t),t=i}},Se={},Ae={},ze=`{{lit-${String(Math.random()).slice(2)}}}`,Ce=`\x3c!--${ze}--\x3e`,Ee=new RegExp(`${ze}|${Ce}`),Pe="$lit$";class qe{constructor(e,t){this.parts=[],this.element=t;const i=[],n=[],s=document.createTreeWalker(t.content,133,null,!1);let a=0,r=-1,o=0;const{strings:d,values:{length:l}}=e;for(;o0;){const t=d[o],i=Oe.exec(t)[2],n=i.toLowerCase()+Pe,s=e.getAttribute(n);e.removeAttribute(n);const a=s.split(Ee);this.parts.push({type:"attribute",index:r,name:i,strings:a}),o+=a.length-1}}"TEMPLATE"===e.tagName&&(n.push(e),s.currentNode=e.content)}else if(3===e.nodeType){const t=e.data;if(t.indexOf(ze)>=0){const n=e.parentNode,s=t.split(Ee),a=s.length-1;for(let t=0;t{const i=e.length-t.length;return i>=0&&e.slice(i)===t},Te=e=>-1!==e.index,Ne=()=>document.createComment(""),Oe=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/; +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +class Re{constructor(e,t,i){this.__parts=[],this.template=e,this.processor=t,this.options=i}update(e){let t=0;for(const i of this.__parts)void 0!==i&&i.setValue(e[t]),t++;for(const e of this.__parts)void 0!==e&&e.commit()}_clone(){const e=we?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),t=[],i=this.template.parts,n=document.createTreeWalker(e,133,null,!1);let s,a=0,r=0,o=n.nextNode();for(;ae}),Ue=` ${ze} `;class He{constructor(e,t,i,n){this.strings=e,this.values=t,this.type=i,this.processor=n}getHTML(){const e=this.strings.length-1;let t="",i=!1;for(let n=0;n-1||i)&&-1===e.indexOf("--\x3e",s+1);const a=Oe.exec(e);t+=null===a?e+(i?Ue:Ce):e.substr(0,a.index)+a[1]+a[2]+Pe+a[3]+ze}return t+=this.strings[e],t}getTemplateElement(){const e=document.createElement("template");let t=this.getHTML();return void 0!==Ie&&(t=Ie.createHTML(t)),e.innerHTML=t,e}}class je extends He{getHTML(){return`${super.getHTML()}`}getTemplateElement(){const e=super.getTemplateElement(),t=e.content,i=t.firstChild;return t.removeChild(i),((e,t,i=null,n=null)=>{for(;t!==i;){const i=t.nextSibling;e.insertBefore(t,n),t=i}})(t,i.firstChild),e}} +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */const Le=e=>null===e||!("object"==typeof e||"function"==typeof e),Ve=e=>Array.isArray(e)||!(!e||!e[Symbol.iterator]);class Be{constructor(e,t,i){this.dirty=!0,this.element=e,this.name=t,this.strings=i,this.parts=[];for(let e=0;e{try{const e={get capture(){return Ye=!0,!1}};window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch(e){}})();class Qe{constructor(e,t,i){this.value=void 0,this.__pendingValue=void 0,this.element=e,this.eventName=t,this.eventContext=i,this.__boundHandleEvent=e=>this.handleEvent(e)}setValue(e){this.__pendingValue=e}commit(){for(;ke(this.__pendingValue);){const e=this.__pendingValue;this.__pendingValue=Se,e(this)}if(this.__pendingValue===Se)return;const e=this.__pendingValue,t=this.value,i=null==e||null!=t&&(e.capture!==t.capture||e.once!==t.once||e.passive!==t.passive),n=null!=e&&(null==t||i);i&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),n&&(this.__options=Je(e),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=e,this.__pendingValue=Se}handleEvent(e){"function"==typeof this.value?this.value.call(this.eventContext||this.element,e):this.value.handleEvent(e)}}const Je=e=>e&&(Ye?{capture:e.capture,passive:e.passive,once:e.once}:e.capture) +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */;const Ze=new class{handleAttributeExpressions(e,t,i,n){const s=t[0];if("."===s){return new We(e,t.slice(1),i).parts}if("@"===s)return[new Qe(e,t.slice(1),n.eventContext)];if("?"===s)return[new Xe(e,t.slice(1),i)];return new Be(e,t,i).parts}handleTextExpression(e){return new Fe(e)}}; +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */function Ke(e){let t=et.get(e.type);void 0===t&&(t={stringsArray:new WeakMap,keyString:new Map},et.set(e.type,t));let i=t.stringsArray.get(e.strings);if(void 0!==i)return i;const n=e.strings.join(ze);return i=t.keyString.get(n),void 0===i&&(i=new qe(e,e.getTemplateElement()),t.keyString.set(n,i)),t.stringsArray.set(e.strings,i),i}const et=new Map,tt=new WeakMap; +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +"undefined"!=typeof window&&(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.4.1");const it=(e,...t)=>new He(e,t,"html",Ze),nt=(e,...t)=>new je(e,t,"svg",Ze) +/** + * @license + * Copyright (c) 2018 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */;class st{constructor(e){this.classes=new Set,this.changed=!1,this.element=e;const t=(e.getAttribute("class")||"").split(/\s+/);for(const e of t)this.classes.add(e)}add(e){this.classes.add(e),this.changed=!0}remove(e){this.classes.delete(e),this.changed=!0}commit(){if(this.changed){let e="";this.classes.forEach((t=>e+=t+" ")),this.element.setAttribute("class",e)}}}const at=new WeakMap,rt=ye((e=>t=>{if(!(t instanceof De)||t instanceof Ge||"class"!==t.committer.name||t.committer.parts.length>1)throw new Error("The `classMap` directive must be used in the `class` attribute and must be the only part in the attribute.");const{committer:i}=t,{element:n}=i;let s=at.get(t);void 0===s&&(n.setAttribute("class",i.strings.join(" ")),at.set(t,s=new Set));const a=n.classList||new st(n);s.forEach((t=>{t in e||(a.remove(t),s.delete(t))}));for(const t in e){const i=e[t];i!=s.has(t)&&(i?(a.add(t),s.add(t)):(a.remove(t),s.delete(t)))}"function"==typeof a.commit&&a.commit()})),ot=133;function dt(e,t){const{element:{content:i},parts:n}=e,s=document.createTreeWalker(i,ot,null,!1);let a=ct(n),r=n[a],o=-1,d=0;const l=[];let c=null;for(;s.nextNode();){o++;const e=s.currentNode;for(e.previousSibling===c&&(c=null),t.has(e)&&(l.push(e),null===c&&(c=e)),null!==c&&d++;void 0!==r&&r.index===o;)r.index=null!==c?-1:r.index-d,a=ct(n,a),r=n[a]}l.forEach((e=>e.parentNode.removeChild(e)))}const lt=e=>{let t=11===e.nodeType?0:1;const i=document.createTreeWalker(e,ot,null,!1);for(;i.nextNode();)t++;return t},ct=(e,t=-1)=>{for(let i=t+1;i`${e}--${t}`;let ut=!0;void 0===window.ShadyCSS?ut=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),ut=!1);const pt=e=>t=>{const i=ht(t.type,e);let n=et.get(i);void 0===n&&(n={stringsArray:new WeakMap,keyString:new Map},et.set(i,n));let s=n.stringsArray.get(t.strings);if(void 0!==s)return s;const a=t.strings.join(ze);if(s=n.keyString.get(a),void 0===s){const i=t.getTemplateElement();ut&&window.ShadyCSS.prepareTemplateDom(i,e),s=new qe(t,i),n.keyString.set(a,s)}return n.stringsArray.set(t.strings,s),s},vt=["html","svg"],mt=new Set,bt=(e,t,i)=>{mt.add(e);const n=i?i.element:document.createElement("template"),s=t.querySelectorAll("style"),{length:a}=s;if(0===a)return void window.ShadyCSS.prepareTemplateStyles(n,e);const r=document.createElement("style");for(let e=0;e{vt.forEach((t=>{const i=et.get(ht(t,e));void 0!==i&&i.keyString.forEach((e=>{const{element:{content:t}}=e,i=new Set;Array.from(t.querySelectorAll("style")).forEach((e=>{i.add(e)})),dt(e,i)}))}))})(e);const o=n.content;i?function(e,t,i=null){const{element:{content:n},parts:s}=e;if(null==i)return void n.appendChild(t);const a=document.createTreeWalker(n,ot,null,!1);let r=ct(s),o=0,d=-1;for(;a.nextNode();)for(d++,a.currentNode===i&&(o=lt(t),i.parentNode.insertBefore(t,i));-1!==r&&s[r].index===d;){if(o>0){for(;-1!==r;)s[r].index+=o,r=ct(s,r);return}r=ct(s,r)}}(i,r,o.firstChild):o.insertBefore(r,o.firstChild),window.ShadyCSS.prepareTemplateStyles(n,e);const d=o.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==d)t.insertBefore(d.cloneNode(!0),t.firstChild);else if(i){o.insertBefore(r,o.firstChild);const e=new Set;e.add(r),dt(i,e)}};window.JSCompiler_renameProperty=(e,t)=>e;const ft={toAttribute(e,t){switch(t){case Boolean:return e?"":null;case Object:case Array:return null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){switch(t){case Boolean:return null!==e;case Number:return null===e?null:Number(e);case Object:case Array:return JSON.parse(e)}return e}},gt=(e,t)=>t!==e&&(t==t||e==e),xt={attribute:!0,type:String,converter:ft,reflect:!1,hasChanged:gt},_t="finalized";class yt extends HTMLElement{constructor(){super(),this.initialize()}static get observedAttributes(){this.finalize();const e=[];return this._classProperties.forEach(((t,i)=>{const n=this._attributeNameForProperty(i,t);void 0!==n&&(this._attributeToPropertyMap.set(n,i),e.push(n))})),e}static _ensureClassProperties(){if(!this.hasOwnProperty(JSCompiler_renameProperty("_classProperties",this))){this._classProperties=new Map;const e=Object.getPrototypeOf(this)._classProperties;void 0!==e&&e.forEach(((e,t)=>this._classProperties.set(t,e)))}}static createProperty(e,t=xt){if(this._ensureClassProperties(),this._classProperties.set(e,t),t.noAccessor||this.prototype.hasOwnProperty(e))return;const i="symbol"==typeof e?Symbol():`__${e}`,n=this.getPropertyDescriptor(e,i,t);void 0!==n&&Object.defineProperty(this.prototype,e,n)}static getPropertyDescriptor(e,t,i){return{get(){return this[t]},set(n){const s=this[e];this[t]=n,this.requestUpdateInternal(e,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this._classProperties&&this._classProperties.get(e)||xt}static finalize(){const e=Object.getPrototypeOf(this);if(e.hasOwnProperty(_t)||e.finalize(),this[_t]=!0,this._ensureClassProperties(),this._attributeToPropertyMap=new Map,this.hasOwnProperty(JSCompiler_renameProperty("properties",this))){const e=this.properties,t=[...Object.getOwnPropertyNames(e),..."function"==typeof Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e):[]];for(const i of t)this.createProperty(i,e[i])}}static _attributeNameForProperty(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}static _valueHasChanged(e,t,i=gt){return i(e,t)}static _propertyValueFromAttribute(e,t){const i=t.type,n=t.converter||ft,s="function"==typeof n?n:n.fromAttribute;return s?s(e,i):e}static _propertyValueToAttribute(e,t){if(void 0===t.reflect)return;const i=t.type,n=t.converter;return(n&&n.toAttribute||ft.toAttribute)(e,i)}initialize(){this._updateState=0,this._updatePromise=new Promise((e=>this._enableUpdatingResolver=e)),this._changedProperties=new Map,this._saveInstanceProperties(),this.requestUpdateInternal()}_saveInstanceProperties(){this.constructor._classProperties.forEach(((e,t)=>{if(this.hasOwnProperty(t)){const e=this[t];delete this[t],this._instanceProperties||(this._instanceProperties=new Map),this._instanceProperties.set(t,e)}}))}_applyInstanceProperties(){this._instanceProperties.forEach(((e,t)=>this[t]=e)),this._instanceProperties=void 0}connectedCallback(){this.enableUpdating()}enableUpdating(){void 0!==this._enableUpdatingResolver&&(this._enableUpdatingResolver(),this._enableUpdatingResolver=void 0)}disconnectedCallback(){}attributeChangedCallback(e,t,i){t!==i&&this._attributeToProperty(e,i)}_propertyToAttribute(e,t,i=xt){const n=this.constructor,s=n._attributeNameForProperty(e,i);if(void 0!==s){const e=n._propertyValueToAttribute(t,i);if(void 0===e)return;this._updateState=8|this._updateState,null==e?this.removeAttribute(s):this.setAttribute(s,e),this._updateState=-9&this._updateState}}_attributeToProperty(e,t){if(8&this._updateState)return;const i=this.constructor,n=i._attributeToPropertyMap.get(e);if(void 0!==n){const e=i.getPropertyOptions(n);this._updateState=16|this._updateState,this[n]=i._propertyValueFromAttribute(t,e),this._updateState=-17&this._updateState}}requestUpdateInternal(e,t,i){let n=!0;if(void 0!==e){const s=this.constructor;i=i||s.getPropertyOptions(e),s._valueHasChanged(this[e],t,i.hasChanged)?(this._changedProperties.has(e)||this._changedProperties.set(e,t),!0!==i.reflect||16&this._updateState||(void 0===this._reflectingProperties&&(this._reflectingProperties=new Map),this._reflectingProperties.set(e,i))):n=!1}!this._hasRequestedUpdate&&n&&(this._updatePromise=this._enqueueUpdate())}requestUpdate(e,t){return this.requestUpdateInternal(e,t),this.updateComplete}async _enqueueUpdate(){this._updateState=4|this._updateState;try{await this._updatePromise}catch(e){}const e=this.performUpdate();return null!=e&&await e,!this._hasRequestedUpdate}get _hasRequestedUpdate(){return 4&this._updateState}get hasUpdated(){return 1&this._updateState}performUpdate(){if(!this._hasRequestedUpdate)return;this._instanceProperties&&this._applyInstanceProperties();let e=!1;const t=this._changedProperties;try{e=this.shouldUpdate(t),e?this.update(t):this._markUpdated()}catch(t){throw e=!1,this._markUpdated(),t}e&&(1&this._updateState||(this._updateState=1|this._updateState,this.firstUpdated(t)),this.updated(t))}_markUpdated(){this._changedProperties=new Map,this._updateState=-5&this._updateState}get updateComplete(){return this._getUpdateComplete()}_getUpdateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._updatePromise}shouldUpdate(e){return!0}update(e){void 0!==this._reflectingProperties&&this._reflectingProperties.size>0&&(this._reflectingProperties.forEach(((e,t)=>this._propertyToAttribute(t,this[t],e))),this._reflectingProperties=void 0),this._markUpdated()}updated(e){}firstUpdated(e){}}yt[_t]=!0; +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +const kt=e=>t=>"function"==typeof t?((e,t)=>(window.customElements.define(e,t),t))(e,t):((e,t)=>{const{kind:i,elements:n}=t;return{kind:i,elements:n,finisher(t){window.customElements.define(e,t)}}})(e,t),wt=(e,t)=>"method"===t.kind&&t.descriptor&&!("value"in t.descriptor)?Object.assign(Object.assign({},t),{finisher(i){i.createProperty(t.key,e)}}):{kind:"field",key:Symbol(),placement:"own",descriptor:{},initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializer.call(this))},finisher(i){i.createProperty(t.key,e)}},$t=(e,t,i)=>{t.constructor.createProperty(i,e)};function St(e){return(t,i)=>void 0!==i?$t(e,t,i):wt(e,t)}function At(e,t){return(i,n)=>{const s={get(){return this.renderRoot.querySelector(e)},enumerable:!0,configurable:!0};if(t){const t=void 0!==n?n:i.key,a="symbol"==typeof t?Symbol():`__${t}`;s.get=function(){return void 0===this[a]&&(this[a]=this.renderRoot.querySelector(e)),this[a]}}return void 0!==n?zt(s,i,n):Ct(s,i)}}const zt=(e,t,i)=>{Object.defineProperty(t,i,e)},Ct=(e,t)=>({kind:"method",placement:"prototype",key:t.key,descriptor:e}) +/** + @license + Copyright (c) 2019 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at + http://polymer.github.io/LICENSE.txt The complete set of authors may be found at + http://polymer.github.io/AUTHORS.txt The complete set of contributors may be + found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as + part of the polymer project is also subject to an additional IP rights grant + found at http://polymer.github.io/PATENTS.txt + */,Et=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Pt=Symbol();class qt{constructor(e,t){if(t!==Pt)throw new Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e}get styleSheet(){return void 0===this._styleSheet&&(Et?(this._styleSheet=new CSSStyleSheet,this._styleSheet.replaceSync(this.cssText)):this._styleSheet=null),this._styleSheet}toString(){return this.cssText}}const Mt=(e,...t)=>{const i=t.reduce(((t,i,n)=>t+(e=>{if(e instanceof qt)return e.cssText;if("number"==typeof e)return e;throw new Error(`Value passed to 'css' function must be a 'css' function result: ${e}. Use 'unsafeCSS' to pass non-literal values, but\n take care to ensure page security.`)})(i)+e[n+1]),e[0]);return new qt(i,Pt)}; +/** + * @license + * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +(window.litElementVersions||(window.litElementVersions=[])).push("2.5.1");const Tt={};class Nt extends yt{static getStyles(){return this.styles}static _getUniqueStyles(){if(this.hasOwnProperty(JSCompiler_renameProperty("_styles",this)))return;const e=this.getStyles();if(Array.isArray(e)){const t=(e,i)=>e.reduceRight(((e,i)=>Array.isArray(i)?t(i,e):(e.add(i),e)),i),i=t(e,new Set),n=[];i.forEach((e=>n.unshift(e))),this._styles=n}else this._styles=void 0===e?[]:[e];this._styles=this._styles.map((e=>{if(e instanceof CSSStyleSheet&&!Et){const t=Array.prototype.slice.call(e.cssRules).reduce(((e,t)=>e+t.cssText),"");return new qt(String(t),Pt)}return e}))}initialize(){super.initialize(),this.constructor._getUniqueStyles(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow(this.constructor.shadowRootOptions)}adoptStyles(){const e=this.constructor._styles;0!==e.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?Et?this.renderRoot.adoptedStyleSheets=e.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet)):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(e.map((e=>e.cssText)),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(e){const t=this.render();super.update(e),t!==Tt&&this.constructor.render(t,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach((e=>{const t=document.createElement("style");t.textContent=e.cssText,this.renderRoot.appendChild(t)})))}render(){return Tt}}Nt.finalized=!0,Nt.render=(e,t,i)=>{if(!i||"object"!=typeof i||!i.scopeName)throw new Error("The `scopeName` option is required.");const n=i.scopeName,s=tt.has(t),a=ut&&11===t.nodeType&&!!t.host,r=a&&!mt.has(n),o=r?document.createDocumentFragment():t;if(((e,t,i)=>{let n=tt.get(t);void 0===n&&($e(t,t.firstChild),tt.set(t,n=new Fe(Object.assign({templateFactory:Ke},i))),n.appendInto(t)),n.setValue(e),n.commit()})(e,o,Object.assign({templateFactory:pt(n)},i)),r){const e=tt.get(o);tt.delete(o);const i=e.value instanceof Re?e.value.template:void 0;bt(n,o,i),$e(t,t.firstChild),t.appendChild(o),tt.set(t,e)}!s&&a&&window.ShadyCSS.styleElement(t.host)},Nt.shadowRootOptions={mode:"open"}; +/** + * @license + * + * Copyright IBM Corp. 2019, 2022 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ +const{prefix:Ot}=xe,Rt=`\n a[href], area[href], input:not([disabled]):not([tabindex='-1']),\n button:not([disabled]):not([tabindex='-1']),select:not([disabled]):not([tabindex='-1']),\n textarea:not([disabled]):not([tabindex='-1']),\n iframe, object, embed, *[tabindex]:not([tabindex='-1']), *[contenteditable=true],\n ${Ot}-accordion-item,\n ${Ot}-btn,\n ${Ot}-breadcrumb-link,\n ${Ot}-checkbox,\n ${Ot}-code-snippet,\n ${Ot}-combo-box,\n ${Ot}-content-switcher-item,\n ${Ot}-copy-button,\n ${Ot}-table-header-row,\n ${Ot}-table-row,\n ${Ot}-table-toolbar-search,\n ${Ot}-date-picker-input,\n ${Ot}-dropdown,\n ${Ot}-input,\n ${Ot}-link,\n ${Ot}-number-input,\n ${Ot}-modal,\n ${Ot}-modal-close-button,\n ${Ot}-multi-select,\n ${Ot}-inline-notification,\n ${Ot}-toast-notification,\n ${Ot}-overflow-menu,\n ${Ot}-overflow-menu-item,\n ${Ot}-page-sizes-select,\n ${Ot}-pages-select,\n ${Ot}-progress-step,\n ${Ot}-radio-button,\n ${Ot}-search,\n ${Ot}-slider,\n ${Ot}-slider-input,\n ${Ot}-structured-list,\n ${Ot}-tab,\n ${Ot}-filter-tag,\n ${Ot}-textarea,\n ${Ot}-clickable-tile,\n ${Ot}-expandable-tile,\n ${Ot}-radio-tile,\n ${Ot}-selectable-tile,\n ${Ot}-toggle,\n ${Ot}-tooltip,\n ${Ot}-tooltip-definition,\n ${Ot}-tooltip-icon,\n ${Ot}-header-menu,\n ${Ot}-header-menu-button,\n ${Ot}-header-menu-item,\n ${Ot}-header-name,\n ${Ot}-header-nav-item,\n ${Ot}-side-nav-link,\n ${Ot}-side-nav-menu,\n ${Ot}-side-nav-menu-item\n` +/** + * @license + * + * Copyright IBM Corp. 2019, 2022 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */,It=e=>class extends e{focus(){if(this.shadowRoot.delegatesFocus)super.focus();else{const e=this.shadowRoot.querySelector(Rt)||this.querySelector(Rt);e?e.focus():super.focus()}}} +/** + * @license + * + * Copyright IBM Corp. 2019, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */;var Ut=Mt(["a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{padding:0;border:0;margin:0;font:inherit;font-size:100%;vertical-align:baseline}button,input,select,textarea{border-radius:0;font-family:inherit}input[type=text]::-ms-clear{display:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}body{line-height:1}sup{vertical-align:super}sub{vertical-align:sub}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::after,blockquote::before,q::after,q::before{content:\"\"}table{border-collapse:collapse;border-spacing:0}*{box-sizing:border-box}button{margin:0}html{font-size:100%}body{font-weight:400;font-family:'IBM Plex Sans','Helvetica Neue',Arial,sans-serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}code{font-family:'IBM Plex Mono',Menlo,'DejaVu Sans Mono','Bitstream Vera Sans Mono',Courier,monospace}strong{font-weight:600}@media screen and (-ms-high-contrast:active){svg{fill:ButtonText}}h1{font-size:var(--cds-productive-heading-06-font-size,2.625rem);font-weight:var(--cds-productive-heading-06-font-weight,300);line-height:var(--cds-productive-heading-06-line-height,1.199);letter-spacing:var(--cds-productive-heading-06-letter-spacing,0)}h2{font-size:var(--cds-productive-heading-05-font-size,2rem);font-weight:var(--cds-productive-heading-05-font-weight,300);line-height:var(--cds-productive-heading-05-line-height,1.25);letter-spacing:var(--cds-productive-heading-05-letter-spacing,0)}h3{font-size:var(--cds-productive-heading-04-font-size,1.75rem);font-weight:var(--cds-productive-heading-04-font-weight,400);line-height:var(--cds-productive-heading-04-line-height,1.28572);letter-spacing:var(--cds-productive-heading-04-letter-spacing,0)}h4{font-size:var(--cds-productive-heading-03-font-size,1.25rem);font-weight:var(--cds-productive-heading-03-font-weight,400);line-height:var(--cds-productive-heading-03-line-height,1.4);letter-spacing:var(--cds-productive-heading-03-letter-spacing,0)}h5{font-size:var(--cds-productive-heading-02-font-size,1rem);font-weight:var(--cds-productive-heading-02-font-weight,600);line-height:var(--cds-productive-heading-02-line-height,1.375);letter-spacing:var(--cds-productive-heading-02-letter-spacing,0)}h6{font-size:var(--cds-productive-heading-01-font-size,.875rem);font-weight:var(--cds-productive-heading-01-font-weight,600);line-height:var(--cds-productive-heading-01-line-height,1.28572);letter-spacing:var(--cds-productive-heading-01-letter-spacing,.16px)}p{font-size:var(--cds-body-long-02-font-size,1rem);font-weight:var(--cds-body-long-02-font-weight,400);line-height:var(--cds-body-long-02-line-height,1.5);letter-spacing:var(--cds-body-long-02-letter-spacing,0)}a{color:#0f62fe}em{font-style:italic}.bx--assistive-text,.bx--visually-hidden{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip:rect(0,0,0,0);visibility:inherit;white-space:nowrap}.bx--body{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;font-size:var(--cds-body-short-01-font-size,.875rem);font-weight:var(--cds-body-short-01-font-weight,400);line-height:var(--cds-body-short-01-line-height,1.28572);letter-spacing:var(--cds-body-short-01-letter-spacing,.16px);background-color:var(--cds-ui-background,#fff);color:var(--cds-text-01,#161616);line-height:1}.bx--body *,.bx--body ::after,.bx--body ::before{box-sizing:inherit}@keyframes skeleton{0%{opacity:.3;transform:scaleX(0);transform-origin:left}20%{opacity:1;transform:scaleX(1);transform-origin:left}28%{transform:scaleX(1);transform-origin:right}51%{transform:scaleX(0);transform-origin:right}58%{transform:scaleX(0);transform-origin:right}82%{transform:scaleX(1);transform-origin:right}83%{transform:scaleX(1);transform-origin:left}96%{transform:scaleX(0);transform-origin:left}100%{opacity:.3;transform:scaleX(0);transform-origin:left}}.bx--text-truncate--end{display:inline-block;overflow:hidden;width:100%;text-overflow:ellipsis;white-space:nowrap}.bx--text-truncate--front{display:inline-block;overflow:hidden;width:100%;direction:rtl;text-overflow:ellipsis;white-space:nowrap}.bx--side-nav,:host(bx-side-nav){position:fixed;z-index:8000;top:0;bottom:0;left:0;overflow:hidden;width:3rem;max-width:16rem;background-color:#fff;color:#525252;transition:width .11s cubic-bezier(.2,0,1,.9);will-change:width}.bx--side-nav--ux,:host(bx-side-nav){top:var(--cds-spacing-09,3rem);width:16rem}@media (max-width:65.98rem){.bx--side-nav--ux,:host(bx-side-nav){width:0}}.bx--side-nav--rail{width:3rem}.bx--side-nav--hidden{width:0}.bx--side-nav--expanded,.bx--side-nav--rail:not(.bx--side-nav--fixed):hover:host(bx-side-nav),.bx--side-nav.bx--side-nav--rail:not(.bx--side-nav--fixed):hover,:host(bx-side-nav[collapse-mode][expanded]),:host(bx-side-nav[expanded]){width:16rem}.bx--side-nav__overlay{position:fixed;top:3rem;left:0;width:0;height:0;background-color:transparent;opacity:0;transition:opacity 240ms cubic-bezier(.2,0,.38,.9),background-color 240ms cubic-bezier(.2,0,.38,.9)}@media (max-width:65.98rem){.bx--side-nav__overlay-active{width:100vw;height:100vh;background-color:var(--cds-overlay-01,rgba(22,22,22,.5));opacity:1;transition:opacity 240ms cubic-bezier(.2,0,.38,.9),background-color 240ms cubic-bezier(.2,0,.38,.9)}}.bx--header~.bx--side-nav,.bx--header~:host(bx-side-nav){top:3rem;height:calc(100% - 48px)}.bx--side-nav--fixed{width:16rem}.bx--side-nav--collapsed{width:16rem;transform:translateX(-16rem)}.bx--side-nav__navigation,:host(bx-side-nav){display:flex;height:100%;flex-direction:column}.bx--side-nav__header{display:flex;width:100%;max-width:100%;height:3rem;border-bottom:1px solid #393939}.bx--side-nav--expanded .bx--side-nav__header,.bx--side-nav--fixed .bx--side-nav__header,.bx--side-nav:hover .bx--side-nav__header,:host(bx-side-nav[expanded]) .bx--side-nav__header,:hover:host(bx-side-nav) .bx--side-nav__header{height:auto}.bx--side-nav--ux .bx--side-nav__header,:host(bx-side-nav) .bx--side-nav__header{height:auto}.bx--side-nav__details{display:flex;min-width:0;flex:1;flex-direction:column;padding-right:1rem;opacity:0;visibility:hidden}.bx--side-nav--expanded .bx--side-nav__details,.bx--side-nav--fixed .bx--side-nav__details,.bx--side-nav:hover .bx--side-nav__details,:host(bx-side-nav[expanded]) .bx--side-nav__details,:hover:host(bx-side-nav) .bx--side-nav__details{visibility:inherit;opacity:1}.bx--side-nav--ux .bx--side-nav__details,:host(bx-side-nav) .bx--side-nav__details{opacity:1;visibility:inherit}.bx--side-nav__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1rem;font-size:.875rem;font-weight:600;letter-spacing:.1px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bx--side-nav__select,.bx--side-nav__title{padding-left:.5rem}.bx--side-nav__switcher{position:relative;display:flex;align-items:center;justify-content:space-between}.bx--side-nav__switcher-chevron{position:absolute;top:0;right:.5rem;bottom:0;display:flex;align-items:center;fill:#525252}.bx--side-nav__select{outline:2px solid transparent;outline-offset:-2px;min-width:0;height:2rem;flex:1 1 0%;padding-right:2rem;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#161616;border-radius:0;color:#f4f4f4;cursor:pointer;font-size:.75rem;transition:outline 110ms}.bx--side-nav__select:focus{outline:2px solid var(--cds-focus,#0f62fe);outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__select:focus{outline-style:dotted}}.bx--side-nav__footer{width:100%;flex:0 0 3rem;background-color:#fff}.bx--side-nav__toggle{outline:2px solid transparent;outline-offset:-2px;box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;cursor:pointer;width:100%;height:100%;padding-left:1rem;text-align:left;transition:outline 110ms}.bx--side-nav__toggle *,.bx--side-nav__toggle ::after,.bx--side-nav__toggle ::before{box-sizing:inherit}.bx--side-nav__toggle::-moz-focus-inner{border:0}.bx--side-nav__toggle:focus{outline:2px solid var(--cds-focus,#0f62fe);outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__toggle:focus{outline-style:dotted}}.bx--side-nav__items,:host(bx-side-nav-items){overflow:hidden;flex:1 1 0%;padding:1rem 0 0}.bx--side-nav--expanded .bx--side-nav__items,.bx--side-nav--expanded :host(bx-side-nav-items),.bx--side-nav--fixed .bx--side-nav__items,.bx--side-nav--fixed :host(bx-side-nav-items),.bx--side-nav:hover .bx--side-nav__items,.bx--side-nav:hover :host(bx-side-nav-items),:host(bx-side-nav[expanded]) .bx--side-nav__items,:host(bx-side-nav[expanded]) :host(bx-side-nav-items),:hover:host(bx-side-nav) .bx--side-nav__items,:hover:host(bx-side-nav) :host(bx-side-nav-items){overflow-y:auto}.bx--side-nav--ux .bx--side-nav__items,.bx--side-nav--ux :host(bx-side-nav-items),:host(bx-side-nav) .bx--side-nav__items,:host(bx-side-nav) :host(bx-side-nav-items){overflow-y:auto}.bx--side-nav__item,:host(bx-side-nav-link),:host(bx-side-nav-menu){overflow:hidden;width:auto;height:auto}.bx--side-nav--ux .bx--side-nav__item,.bx--side-nav--ux :host(bx-side-nav-link),.bx--side-nav--ux :host(bx-side-nav-menu),:host(bx-side-nav) .bx--side-nav__item,:host(bx-side-nav) :host(bx-side-nav-link),:host(bx-side-nav) :host(bx-side-nav-menu){width:auto;height:auto}.bx--side-nav .bx--header__menu-title[aria-expanded=true]:hover,.bx--side-nav a.bx--header__menu-item:hover,.bx--side-nav__item:not(.bx--side-nav__item--active):hover .bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active):hover :not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active):hover :not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__link:hover,.bx--side-nav__menu a.bx--side-nav__link:not(.bx--side-nav__link--current):not([aria-current=page]):hover,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]:hover,:host(bx-side-nav) a.bx--header__menu-item:hover,:not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__link:hover,:not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__link:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-link) .bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__submenu:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-link) :not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__submenu:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-link) :not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__submenu:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-menu) .bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__submenu:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-menu) :not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__submenu:hover,:not(.bx--side-nav__item--active):hover:host(bx-side-nav-menu) :not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__submenu:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__item:not(.bx--side-nav__item--active) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,.bx--side-nav__item:not(.bx--side-nav__item--active) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span,.bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__link:hover>span{color:#161616}.bx--side-nav__item--large{height:3rem}.bx--side-nav__divider,:host(bx-side-nav-divider){height:1px;margin:var(--cds-spacing-03,.5rem) var(--cds-spacing-05,1rem);background-color:#e0e0e0}.bx--side-nav__submenu{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;cursor:pointer;width:100%;font-size:var(--cds-productive-heading-01-font-size,.875rem);font-weight:var(--cds-productive-heading-01-font-weight,600);line-height:var(--cds-productive-heading-01-line-height,1.28572);letter-spacing:var(--cds-productive-heading-01-letter-spacing,.16px);outline:2px solid transparent;outline-offset:-2px;display:flex;height:2rem;align-items:center;padding:0 1rem;color:#525252;transition:color 110ms,background-color 110ms,outline 110ms;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bx--side-nav__submenu *,.bx--side-nav__submenu ::after,.bx--side-nav__submenu ::before{box-sizing:inherit}.bx--side-nav__submenu::-moz-focus-inner{border:0}.bx--side-nav__submenu:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__submenu:focus{outline:2px solid var(--cds-focus,#0f62fe);outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__submenu:focus{outline-style:dotted}}.bx--side-nav__submenu-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.bx--side-nav__icon.bx--side-nav__submenu-chevron{display:flex;flex:1;justify-content:flex-end}.bx--side-nav__submenu-chevron>svg{width:1rem;height:1rem;transition:transform 110ms}.bx--side-nav__submenu[aria-expanded=true] .bx--side-nav__submenu-chevron>svg{transform:rotate(180deg)}.bx--side-nav__item--large .bx--side-nav__submenu{height:3rem}.bx--side-nav__item--active .bx--side-nav__submenu:hover,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__item--active .bx--side-nav__submenu[aria-expanded=false],:host(bx-side-nav-menu[active]) .bx--side-nav__submenu[aria-expanded=false]{position:relative;background-color:#e5e5e5;color:#161616}.bx--side-nav__item--active .bx--side-nav__submenu[aria-expanded=false]::before,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu[aria-expanded=false]::before{position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe;content:\"\"}.bx--side-nav__item--active .bx--side-nav__submenu-title,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu-title{color:#161616;font-weight:600}.bx--side-nav__menu{display:block;max-height:0;visibility:hidden}.bx--side-nav__submenu[aria-expanded=true]+.bx--side-nav__menu{max-height:93.75rem;visibility:inherit}.bx--side-nav__menu a.bx--side-nav__link{height:2rem;min-height:2rem;padding-left:2rem;font-weight:400}.bx--side-nav__item--icon:host(bx-side-nav-link) a.bx--side-nav__link,.bx--side-nav__item--icon:host(bx-side-nav-menu) a.bx--side-nav__link,.bx--side-nav__item.bx--side-nav__item--icon a.bx--side-nav__link,:host(bx-side-nav-menu):host(bx-side-nav-menu[has-icon]) a.bx--side-nav__link{padding-left:4.5rem}.bx--side-nav__menu a.bx--side-nav__link--current,.bx--side-nav__menu a.bx--side-nav__link[aria-current=page],a.bx--side-nav__link--current{background-color:#e0e0e0}.bx--side-nav__menu a.bx--side-nav__link--current>span,.bx--side-nav__menu a.bx--side-nav__link[aria-current=page]>span,a.bx--side-nav__link--current>span{color:#161616;font-weight:600}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu,.bx--side-nav a.bx--header__menu-item,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu,:host(bx-side-nav) a.bx--header__menu-item,a.bx--side-nav__link{outline:2px solid transparent;outline-offset:-2px;font-size:var(--cds-productive-heading-01-font-size,.875rem);font-weight:var(--cds-productive-heading-01-font-weight,600);line-height:var(--cds-productive-heading-01-line-height,1.28572);letter-spacing:var(--cds-productive-heading-01-letter-spacing,.16px);position:relative;display:flex;min-height:2rem;align-items:center;padding:0 1rem;text-decoration:none;transition:color 110ms,background-color 110ms,outline 110ms}.bx--side-nav__item--large a.bx--side-nav__link{height:3rem}.bx--side-nav a.bx--header__menu-item .bx--text-truncate-end,:host(bx-side-nav) a.bx--header__menu-item .bx--text-truncate-end,a.bx--side-nav__link>.bx--side-nav__link-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#525252;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bx--side-nav a.bx--header__menu-item:focus,:host(bx-side-nav) a.bx--header__menu-item:focus,a.bx--side-nav__link:focus{outline:2px solid var(--cds-focus,#0f62fe);outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav a.bx--header__menu-item:focus,:host(bx-side-nav) a.bx--header__menu-item:focus,a.bx--side-nav__link:focus{outline-style:dotted}}a.bx--side-nav__link--current,a.bx--side-nav__link[aria-current=page]{background-color:#e5e5e5;font-weight:600}a.bx--side-nav__link--current .bx--side-nav__link-text,a.bx--side-nav__link[aria-current=page] .bx--side-nav__link-text{color:#161616}a.bx--side-nav__link--current::before,a.bx--side-nav__link[aria-current=page]::before{position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe;content:\"\"}.bx--side-nav__icon{display:flex;flex:0 0 1rem;align-items:center;justify-content:center}.bx--side-nav__icon:not(.bx--side-nav__submenu-chevron){margin-right:1.5rem}.bx--side-nav__icon>svg{width:1rem;height:1rem;fill:#525252}.bx--side-nav__icon>svg.bx--side-nav-collapse-icon{display:none}.bx--side-nav--expanded .bx--side-nav__icon>svg.bx--side-nav-expand-icon,:host(bx-side-nav[expanded]) .bx--side-nav__icon>svg.bx--side-nav-expand-icon{display:none}.bx--side-nav--expanded .bx--side-nav__icon>svg.bx--side-nav-collapse-icon,:host(bx-side-nav[expanded]) .bx--side-nav__icon>svg.bx--side-nav-collapse-icon{display:block}.bx--side-nav--fixed .bx--side-nav__submenu,.bx--side-nav--fixed a.bx--side-nav__link{padding-left:1rem}.bx--side-nav--fixed .bx--side-nav__item:not(.bx--side-nav__item--icon) .bx--side-nav__menu a.bx--side-nav__link,.bx--side-nav--fixed :not(.bx--side-nav__item--icon):host(bx-side-nav-link) .bx--side-nav__menu a.bx--side-nav__link,.bx--side-nav--fixed :not(.bx--side-nav__item--icon):host(bx-side-nav-menu) .bx--side-nav__menu a.bx--side-nav__link{padding-left:2rem}@media (max-width:65.98rem){.bx--side-nav .bx--header__nav,:host(bx-side-nav) .bx--header__nav{display:block}}.bx--side-nav__header-navigation{display:none}@media (max-width:65.98rem){.bx--side-nav__header-navigation{position:relative;display:block;margin-bottom:2rem}}.bx--side-nav__header-divider::after{position:absolute;bottom:-1rem;left:1rem;width:calc(100% - 32px);height:.0625rem;background:#e0e0e0;content:\"\"}.bx--side-nav a.bx--header__menu-item,:host(bx-side-nav) a.bx--header__menu-item{justify-content:space-between;color:#525252;white-space:nowrap}.bx--side-nav a.bx--header__menu-item[aria-expanded=true],:host(bx-side-nav) a.bx--header__menu-item[aria-expanded=true]{background-color:transparent}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu{bottom:inherit;width:100%;padding:0;background-color:transparent;box-shadow:none;transform:none}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu li,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu li{width:100%}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item{padding-left:4.25rem;font-weight:400}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item:hover,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav .bx--header__menu a.bx--header__menu-item,:host(bx-side-nav) .bx--header__menu a.bx--header__menu-item{height:inherit}.bx--side-nav .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:focus .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:hover .bx--header__menu-arrow,:host(bx-side-nav) .bx--header__menu-arrow{fill:#525252}@media screen and (-ms-high-contrast:active),(forced-colors:active){.bx--side-nav .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:focus .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:hover .bx--header__menu-arrow,.bx--side-nav__icon>svg,:host(bx-side-nav) .bx--header__menu-arrow{fill:ButtonText}}:host(bx-side-nav){top:0}:host(bx-side-nav[collapse-mode=fixed]){width:16rem}:host(bx-side-nav[collapse-mode=rail]){width:3rem}:host(bx-side-nav[collapse-mode=rail]):hover{width:16rem}:host(bx-side-nav[collapse-mode][usage-mode=header-nav]),:host(bx-side-nav[usage-mode=header-nav]){width:0}@media (max-width:65.98rem){:host(bx-side-nav[collapse-mode][expanded][usage-mode=header-nav]),:host(bx-side-nav[expanded][usage-mode=header-nav]){width:16rem}}:host(bx-side-nav-link){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-link) .bx--side-nav__icon{color:#525252}:host(bx-side-nav-link) .bx--side-nav__icon[hidden]{display:none}:host(bx-side-nav-divider){display:block}:host(bx-side-nav-menu){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-menu) .bx--side-nav__icon[hidden]{display:none}:host(bx-side-nav-menu[active]){background-color:#e5e5e5;color:#161616;position:relative}:host(bx-side-nav-menu[active])::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe}:host(bx-side-nav-menu[active][expanded]){background-color:inherit;color:inherit;position:inherit}:host(bx-side-nav-menu[active][expanded])::before{content:none}:host(bx-side-nav-menu-item){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-menu-item) a.bx--side-nav__link{height:2rem;min-height:2rem;padding-left:2rem;font-weight:400}:host(bx-side-nav-menu-item[parent-has-icon]) a.bx--side-nav__link{padding-left:4.5rem}:host(bx-side-nav-item) .bx--side-nav__link:hover,:host(bx-side-nav-menu) .bx--side-nav__submenu:hover,:host(bx-side-nav-menu-item) .bx--side-nav__link:hover{background-color:#e5e5e5;color:#161616}"]);let Ht,jt=e=>e;const{prefix:Lt}=xe;function Vt(e){return Vt=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},Vt(e)}function Bt(){return Bt="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,i){var n=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=Vt(e)););return e}(e,t);if(n){var s=Object.getOwnPropertyDescriptor(n,t);return s.get?s.get.call(arguments.length<3?e:i):s.value}},Bt.apply(this,arguments)} +/** + * @license + * + * Copyright IBM Corp. 2019, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ue([kt(`${Lt}-side-nav-menu-item`)],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"active",value:()=>!1},{kind:"field",decorators:[St()],key:"href",value:()=>""},{kind:"field",decorators:[St()],key:"title",value:void 0},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"shouldUpdate",value:function(e){if(e.has("active")&&this.active){const{selectorMenu:e}=this.constructor,t=this.closest(e);t&&(t.active=!0)}return!0}},{kind:"method",key:"render",value:function(){const{active:e,href:t,title:i}=this,n=rt({[`${Lt}--side-nav__link`]:!0,[`${Lt}--side-nav__link--current`]:e});return it(Ht||(Ht=jt` ${0} `),n,t,Lt,i)}},{kind:"get",static:!0,key:"selectorMenu",value:function(){return`${Lt}-side-nav-menu`}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),It(Nt));var Dt=Mt([".bx--text-truncate--end{display:inline-block;overflow:hidden;width:100%;text-overflow:ellipsis;white-space:nowrap}.bx--text-truncate--front{display:inline-block;overflow:hidden;width:100%;direction:rtl;text-overflow:ellipsis;white-space:nowrap}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{padding:0;border:0;margin:0;font:inherit;font-size:100%;vertical-align:baseline}button,input,select,textarea{border-radius:0;font-family:inherit}input[type=text]::-ms-clear{display:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}body{line-height:1}sup{vertical-align:super}sub{vertical-align:sub}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::after,blockquote::before,q::after,q::before{content:\"\"}table{border-collapse:collapse;border-spacing:0}*{box-sizing:border-box}button{margin:0}html{font-size:100%}body{font-weight:400;font-family:'IBM Plex Sans','Helvetica Neue',Arial,sans-serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}code{font-family:'IBM Plex Mono',Menlo,'DejaVu Sans Mono','Bitstream Vera Sans Mono',Courier,monospace}strong{font-weight:600}@media screen and (-ms-high-contrast:active){svg{fill:ButtonText}}h1{font-size:var(--cds-productive-heading-06-font-size,2.625rem);font-weight:var(--cds-productive-heading-06-font-weight,300);line-height:var(--cds-productive-heading-06-line-height,1.199);letter-spacing:var(--cds-productive-heading-06-letter-spacing,0)}h2{font-size:var(--cds-productive-heading-05-font-size,2rem);font-weight:var(--cds-productive-heading-05-font-weight,300);line-height:var(--cds-productive-heading-05-line-height,1.25);letter-spacing:var(--cds-productive-heading-05-letter-spacing,0)}h3{font-size:var(--cds-productive-heading-04-font-size,1.75rem);font-weight:var(--cds-productive-heading-04-font-weight,400);line-height:var(--cds-productive-heading-04-line-height,1.28572);letter-spacing:var(--cds-productive-heading-04-letter-spacing,0)}h4{font-size:var(--cds-productive-heading-03-font-size,1.25rem);font-weight:var(--cds-productive-heading-03-font-weight,400);line-height:var(--cds-productive-heading-03-line-height,1.4);letter-spacing:var(--cds-productive-heading-03-letter-spacing,0)}h5{font-size:var(--cds-productive-heading-02-font-size,1rem);font-weight:var(--cds-productive-heading-02-font-weight,600);line-height:var(--cds-productive-heading-02-line-height,1.375);letter-spacing:var(--cds-productive-heading-02-letter-spacing,0)}h6{font-size:var(--cds-productive-heading-01-font-size,.875rem);font-weight:var(--cds-productive-heading-01-font-weight,600);line-height:var(--cds-productive-heading-01-line-height,1.28572);letter-spacing:var(--cds-productive-heading-01-letter-spacing,.16px)}p{font-size:var(--cds-body-long-02-font-size,1rem);font-weight:var(--cds-body-long-02-font-weight,400);line-height:var(--cds-body-long-02-line-height,1.5);letter-spacing:var(--cds-body-long-02-letter-spacing,0)}a{color:#0f62fe}em{font-style:italic}@keyframes skeleton{0%{opacity:.3;transform:scaleX(0);transform-origin:left}20%{opacity:1;transform:scaleX(1);transform-origin:left}28%{transform:scaleX(1);transform-origin:right}51%{transform:scaleX(0);transform-origin:right}58%{transform:scaleX(0);transform-origin:right}82%{transform:scaleX(1);transform-origin:right}83%{transform:scaleX(1);transform-origin:left}96%{transform:scaleX(0);transform-origin:left}100%{opacity:.3;transform:scaleX(0);transform-origin:left}}.bx--header,:host(bx-header){position:fixed;z-index:8000;top:0;right:0;left:0;display:flex;height:3rem;align-items:center;border-bottom:1px solid #393939;background-color:#161616}.bx--header__action{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;cursor:pointer;width:100%;width:3rem;height:3rem;border:.0625rem solid transparent;transition:background-color 110ms,border-color 110ms}.bx--header__action *,.bx--header__action ::after,.bx--header__action ::before{box-sizing:inherit}.bx--header__action::-moz-focus-inner{border:0}.bx--header__action--active>svg.bx--navigation-menu-panel-expand-icon,.bx--header__action>svg.bx--navigation-menu-panel-collapse-icon{display:none}.bx--header__action--active>svg.bx--navigation-menu-panel-collapse-icon{display:inline}.bx--header__action:hover{background-color:#353535}.bx--header__action--active{border-right:1px solid #393939;border-bottom:1px solid #161616;border-left:1px solid #393939}.bx--header__action:focus{border-color:#fff;outline:0}.bx--header__action:active{background-color:#393939}.bx--header__action.bx--btn--icon-only.bx--tooltip__trigger{justify-content:center}.bx--header__action>svg{fill:#fff}.bx--header__menu-trigger>svg{fill:#f4f4f4}.bx--header__menu-trigger:hover{fill:#2c2c2c}.bx--header__menu-toggle{display:flex;align-items:center;justify-content:center}@media (min-width:66rem){.bx--header__menu-toggle__hidden{display:none}}a.bx--header__name{font-size:var(--cds-body-short-01-font-size,.875rem);font-weight:var(--cds-body-short-01-font-weight,400);line-height:var(--cds-body-short-01-line-height,1.28572);letter-spacing:var(--cds-body-short-01-letter-spacing,.16px);display:flex;height:100%;align-items:center;padding:0 2rem 0 1rem;border:.125rem solid transparent;font-weight:600;letter-spacing:.1px;line-height:1.25rem;outline:0;text-decoration:none;transition:border-color 110ms;-webkit-user-select:none;-moz-user-select:none;user-select:none}a.bx--header__name:focus{border-color:#fff}.bx--header__name--prefix{font-weight:400}a.bx--header__name,a.bx--header__name:hover{color:#f4f4f4}.bx--header__menu-toggle:not(.bx--header__menu-toggle__hidden)~.bx--header__name{padding-left:.5rem}.bx--header__nav,:host(bx-header-nav){position:relative;display:none;height:100%;padding-left:1rem}@media (min-width:66rem){.bx--header__nav,:host(bx-header-nav){display:block}}.bx--header__nav::before,:host(bx-header-nav)::before{position:absolute;top:50%;left:0;display:block;width:.0625rem;height:1.5rem;background-color:#393939;content:\"\";transform:translateY(-50%)}.bx--header__menu-bar{display:flex;height:100%;padding:0;margin:0;list-style:none}a.bx--header__menu-item{position:relative;display:flex;height:100%;align-items:center;padding:0 1rem;border:2px solid transparent;color:#c6c6c6;font-size:.875rem;font-weight:400;letter-spacing:0;line-height:1.125rem;text-decoration:none;transition:background-color 110ms,border-color 110ms,color 110ms;-webkit-user-select:none;-moz-user-select:none;user-select:none}a.bx--header__menu-item:hover{background-color:#2c2c2c;color:#f4f4f4}.bx--header__action:active,a.bx--header__menu-item:active{background-color:#393939;color:#f4f4f4}a.bx--header__menu-item:focus{border-color:#fff;color:#f4f4f4;outline:0}a.bx--header__menu-item:active>svg,a.bx--header__menu-item:focus>svg,a.bx--header__menu-item:hover>svg{fill:#f4f4f4}.bx--header__menu-item--current::after,a.bx--header__menu-item[aria-current=page]::after{position:absolute;top:0;right:0;bottom:-2px;left:0;width:100%;border-bottom:3px solid var(--cds-inverse-support-04,#4589ff);content:\"\"}.bx--header__menu-item--current:focus::after,a.bx--header__menu-item[aria-current=page]:focus::after{border:0}a.bx--header__menu-item.bx--header__menu-item--current:focus,a.bx--header__menu-item[aria-current=page]:focus{border:2px solid #fff}.bx--header__submenu,:host(bx-header-menu){position:relative}.bx--header__submenu--current::after{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;border-bottom:3px solid var(--cds-border-interactive,#0f62fe);content:\"\"}.bx--header__submenu--current:focus{border:2px solid var(--cds-focus,#0f62fe)}.bx--header__submenu--current:focus::after{border:0}.bx--header__menu-title[aria-haspopup=true]{position:relative}.bx--header__menu-title[aria-expanded=true]{z-index:8001;background-color:#262626;color:#fff}.bx--header__menu-title[aria-expanded=true]>.bx--header__menu-arrow{transform:rotate(180deg)}.bx--header__menu{display:none;padding:0;margin:0;list-style:none}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu{position:absolute;z-index:8000;bottom:0;left:0;display:flex;width:12.5rem;flex-direction:column;background-color:#262626;box-shadow:0 4px 8px 0 rgba(0,0,0,.5);transform:translateY(100%)}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu .bx--header__menu-item:hover{background-color:#353535}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu .bx--header__menu-item:active{background-color:#393939}.bx--header__menu .bx--header__menu-item{height:3rem}.bx--header__menu .bx--header__menu-item:hover{background-color:#262626;color:#f4f4f4}.bx--header__menu-arrow{margin-left:.5rem;fill:#c6c6c6;transition:transform 110ms,fill 110ms}.bx--header__global{display:flex;height:100%;flex:1 1 0%;justify-content:flex-end}.bx--skip-to-content{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip:rect(0,0,0,0);visibility:inherit;white-space:nowrap}.bx--skip-to-content:focus{z-index:9999;top:0;left:0;display:flex;width:auto;height:3rem;align-items:center;padding:0 1rem;border:4px solid #0f62fe;background-color:#161616;clip:auto;color:#f4f4f4;outline:0}:host(bx-header-nav) .bx-ce--header__divider{position:absolute;left:0;top:50%;transform:translateY(-50%);height:1.5rem;width:.0625rem;background-color:#393939}:host(bx-header-nav-item){outline:0}:host(bx-header-menu){outline:0}:host(bx-header-menu-item){outline:0}:host(bx-header-menu-item) a.bx--header__menu-item{height:3rem}:host(bx-header-menu-item) a.bx--header__menu-item:hover{background-color:#353535;color:#f4f4f4}:host(bx-header-menu-item) a.bx--header__menu-item:active{background-color:#393939}:host(bx-header-menu-button){display:content;outline:0}@media (min-width:66rem){:host(bx-header-menu-button){display:none}}:host(bx-header-menu-button[collapse-mode=fixed]){display:none}@media (min-width:66rem){:host(bx-header-menu-button[collapse-mode=rail]){display:block}}:host(bx-header-name){display:content;height:100%}"]);let Ft,Xt=e=>e;const{prefix:Wt}=xe;function Gt(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n `))}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),Nt);const Qt=/^((document|window|parentRoot|shadowRoot):)?([\w-]+)$/,Jt=e=>{class t extends e{constructor(...e){super(...e),Yt(this,"_handles",new Set)}connectedCallback(){super.connectedCallback();const e=this.constructor._hostListeners;Object.keys(e).forEach((t=>{Object.keys(e[t]).forEach((i=>{var n;const s=Qt.exec(i);if(!s)throw new Error(`Could not parse the event name: ${t}`);const[,,a,r]=s,o={document:this.ownerDocument,window:this.ownerDocument.defaultView,parentRoot:this.getRootNode(),shadowRoot:this.shadowRoot}[a]||this,{options:d}=e[t][i];this._handles.add(Gt(o,null!==(n=this.constructor[r])&&void 0!==n?n:r,this[t],d))}))}))}disconnectedCallback(){this._handles.forEach((e=>{e.release(),this._handles.delete(e)})),super.disconnectedCallback()}}return Yt(t,"_hostListeners",{}),t};function Zt(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function Kt(e){for(var t=1;t{const s=i._hostListeners;if(!s)throw new Error("The method `@HostListener()` is defined on has to be of a class that has `HostListerMixin`.");s[n]||(s[n]={}),s[n][e]={options:t}},ti=(e,t)=>(i,n)=>void 0!==n?ei(e,t,i.constructor,n):((e,t,i)=>{const{kind:n,key:s,placement:a}=i;if(!("method"===n&&"prototype"===a||"field"===n&&"own"===a))throw new Error("`@HostListener()` must be defined on instance methods, but you may have defined it on static, field, etc.");return Kt(Kt({},i),{},{finisher(i){ei(e,t,i,s)}})})(e,t,i) +/** + * @license + * + * Copyright IBM Corp. 2019, 2022 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */,ii=(e,t,i)=>Array.prototype.forEach.call(e,t,i) +/** + * @license + * + * Copyright IBM Corp. 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */;let ni,si;!function(e){e.FIXED="fixed",e.RAIL="rail",e.RESPONSIVE="responsive"}(ni||(ni={})),function(e){e.REGULAR="",e.HEADER_NAV="header-nav"}(si||(si={}));let ai,ri=e=>e;const{prefix:oi}=xe;ue([kt(`${oi}-side-nav`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",key:"_hovered",value:()=>!1},{kind:"field",key:"_hTransition",value:()=>null},{kind:"field",key:"_transitionPromise",value:()=>Promise.resolve()},{kind:"get",key:"_updateAndTransitionPromise",value:function(){return this.updateComplete.then((()=>this._transitionPromise))}},{kind:"method",key:"_cleanHTransition",value:function(){this._hTransition&&(this._hTransition=this._hTransition.release())}},{kind:"field",decorators:[ti("parentRoot:eventButtonToggle")],key:"_handleButtonToggle",value(){return async e=>{var t;(this.expanded=e.detail.active,this.expanded)&&(await this._updateAndTransitionPromise,this.expanded&&(null===(t=this.querySelector(this.constructor.selectorNavItems))||void 0===t||t.focus()))}}},{kind:"method",key:"_updatedSideNavMenuForceCollapsedState",value:function(){const{expanded:e,_hovered:t}=this;ii(this.querySelectorAll(this.constructor.selectorMenu),(i=>{i.forceCollapsed=!e&&!t}))}},{kind:"method",decorators:[ti("mouseover")],key:"_handleMouseover",value:function(){this._hovered=!0,this._updatedSideNavMenuForceCollapsedState()}},{kind:"method",decorators:[ti("mouseout")],key:"_handleMouseout",value:function(){this._hovered=!1,this._updatedSideNavMenuForceCollapsedState()}},{kind:"field",decorators:[St({reflect:!0,attribute:"collapse-mode"})],key:"collapseMode",value:()=>ni.RESPONSIVE},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"expanded",value:()=>!1},{kind:"field",decorators:[St({reflect:!0,attribute:"usage-mode"})],key:"usageMode",value:()=>si.REGULAR},{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","navigation"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"disconnectedCallback",value:function(){this._cleanHTransition(),Bt(Vt(i.prototype),"disconnectedCallback",this).call(this)}},{kind:"method",key:"shouldUpdate",value:function(e){return e.has("expanded")&&(this._transitionPromise=new Promise((e=>{this._cleanHTransition(),this._hTransition=Gt(this,"transitionend",(()=>{this._cleanHTransition(),e()}))}))),!0}},{kind:"method",key:"updated",value:function(e){if(e.has("collapseMode")||e.has("usageMode")){const{collapseMode:e,usageMode:t}=this;e!==ni.FIXED&&e!==ni.RAIL||t!==si.HEADER_NAV||console.warn("Fixed/rail modes of side nav cannot be used with header nav mode.")}const t=this.getRootNode();e.has("collapseMode")&&ii(t.querySelectorAll(this.constructor.selectorButtonToggle),(e=>{e.collapseMode=this.collapseMode})),e.has("expanded")&&(this._updatedSideNavMenuForceCollapsedState(),ii(t.querySelectorAll(this.constructor.selectorButtonToggle),(e=>{e.active=this.expanded}))),e.has("usageMode")&&ii(t.querySelectorAll(this.constructor.selectorButtonToggle),(e=>{e.usageMode=this.usageMode}))}},{kind:"method",key:"render",value:function(){return it(ai||(ai=ri` `))}},{kind:"get",static:!0,key:"selectorButtonToggle",value:function(){return`${oi}-header-menu-button`}},{kind:"get",static:!0,key:"selectorNavItems",value:function(){return`${oi}-side-nav-menu, ${oi}-side-nav-menu-item, ${oi}-side-nav-link`}},{kind:"get",static:!0,key:"selectorMenu",value:function(){return`${oi}-side-nav-menu`}},{kind:"get",static:!0,key:"eventButtonToggle",value:function(){return`${oi}-header-menu-button-toggled`}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),Jt(Nt));const{prefix:di}=xe;ue([kt(`${di}-side-nav-divider`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","separator"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),Nt); +/** + * @license + * Copyright (c) 2018 The Polymer Project Authors. All rights reserved. + * This code may only be used under the BSD style license found at + * http://polymer.github.io/LICENSE.txt + * The complete set of authors may be found at + * http://polymer.github.io/AUTHORS.txt + * The complete set of contributors may be found at + * http://polymer.github.io/CONTRIBUTORS.txt + * Code distributed by Google as part of the polymer project is also + * subject to an additional IP rights grant found at + * http://polymer.github.io/PATENTS.txt + */ +const li=new WeakMap,ci=ye((e=>t=>{const i=li.get(t);if(void 0===e&&t instanceof De){if(void 0!==i||!li.has(t)){const e=t.committer.name;t.committer.element.removeAttribute(e)}}else e!==i&&t.setValue(e);li.set(t,e)}));let hi,ui,pi=e=>e;const{prefix:vi}=xe;ue([kt(`${vi}-header-name`)],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[St()],key:"href",value:void 0},{kind:"field",decorators:[St()],key:"prefix",value:void 0},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"render",value:function(){const{href:e,prefix:t}=this,i=t?it(hi||(hi=pi` ${0} `),vi,t):void 0;return it(ui||(ui=pi` ${0}  `),vi,ci(e),i)}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),It(Nt));let mi,bi=e=>e;const{prefix:fi}=xe;ue([kt(`${fi}-header-nav`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",decorators:[St({attribute:"menu-bar-label"})],key:"menuBarLabel",value:void 0},{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","navigation"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"render",value:function(){const{menuBarLabel:e}=this;return it(mi||(mi=bi`
`),fi,fi,e)}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),Nt);let gi,xi=e=>e;const{prefix:_i}=xe;ue([kt(`${_i}-side-nav-link`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",decorators:[At("#title-icon-container")],key:"_titleIconContainerNode",value:void 0},{kind:"method",key:"_handleSlotChangeTitleIcon",value:function({target:e}){var t;null===(t=this._titleIconContainerNode)||void 0===t||t.toggleAttribute("hidden",0===e.assignedNodes().length)}},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"active",value:()=>!1},{kind:"field",decorators:[St()],key:"href",value:()=>""},{kind:"field",decorators:[St()],key:"title",value:void 0},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","listitem"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"render",value:function(){const{active:e,href:t,title:i,_handleSlotChangeTitleIcon:n}=this,s=rt({[`${_i}--side-nav__link`]:!0,[`${_i}--side-nav__link--current`]:e});return it(gi||(gi=xi` ${0} `),s,t,_i,n,_i,i)}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),It(Nt)); +/** + * @license + * + * Copyright IBM Corp. 2019, 2022 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ +const yi=new WeakMap,ki=ye((e=>t=>{if(!(t instanceof Ge)||".."!==t.committer.name||t.committer.parts.length>1)throw new Error("The `spread` directive must be used in with `...` name and must be the only part in the attribute.");const{committer:i}=t,{element:n}=i,s=yi.get(t);s&&Object.keys(s).forEach((t=>{t in e||n.removeAttribute(t)})),Object.keys(e).forEach((t=>{const i=e[t];s&&Object.is(i,s[t])||void 0===i||n.setAttribute(t,i)})),yi.set(t,e)}));let wi,$i=e=>e;const{prefix:Si}=xe;let Ai,zi=ue([kt(`${Si}-header-menu`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",decorators:[At("a")],key:"_trigger",value:void 0},{kind:"method",key:"_handleClick",value:function(){this._handleUserInitiatedToggle()}},{kind:"method",key:"_handleKeydownTrigger",value:function({key:e}){"Esc"!==e&&"Escape"!==e||this._handleUserInitiatedToggle(!1)}},{kind:"method",key:"_handleUserInitiatedToggle",value:function(e=!this.expanded){this.expanded=e,e||this._trigger.focus()}},{kind:"method",decorators:[ti("focusout")],key:"_handleBlur",value:function({relatedTarget:e}){this.contains(e)||(this.expanded=!1)}},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"expanded",value:()=>!1},{kind:"field",decorators:[St({attribute:"trigger-content"})],key:"triggerContent",value:()=>""},{kind:"field",decorators:[St({attribute:"menu-label"})],key:"menuLabel",value:void 0},{kind:"method",key:"createRenderRoot",value:function(){return this.attachShadow({mode:"open",delegatesFocus:!0})}},{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","listitem"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"updated",value:function(e){if(e.has("expanded")){const{selectorItem:e}=this.constructor,{expanded:t}=this;ii(this.querySelectorAll(e),(e=>{e.tabIndex=t?0:-1}))}}},{kind:"method",key:"render",value:function(){const{expanded:e,triggerContent:t,menuLabel:i,_handleClick:n,_handleKeydownTrigger:s}=this;return it(wi||(wi=$i` ${0}${0}
`),Si,Si,String(Boolean(e)),n,s,t,(({children:e,...t}={})=>nt``)({part:"trigger-icon",class:`${Si}--header__menu-arrow`}),Si,ci(i))}},{kind:"get",static:!0,key:"selectorItem",value:function(){return`${Si}-header-menu-item`}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),Jt(It(Nt))),Ci=e=>e;const{prefix:Ei}=xe;let Pi=ue([kt(`${Ei}-header-nav-item`)],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[St()],key:"href",value:void 0},{kind:"field",decorators:[St()],key:"title",value:void 0},{kind:"field",decorators:[St({reflect:!0})],key:"role",value:()=>"listitem"},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"render",value:function(){const{href:e,title:t}=this;return it(Ai||(Ai=Ci` ${0} `),Ei,ci(e),Ei,t)}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),It(Nt));const{prefix:qi}=xe;ue([kt(`${qi}-header-menu-item`)],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[]}}),Pi);let Mi,Ti=e=>e;const{prefix:Ni}=xe;ue([kt(`${Ni}-side-nav-items`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","list"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"render",value:function(){return it(Mi||(Mi=Ti` `))}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),Nt); +/** + * @license + * + * Copyright IBM Corp. 2019, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ +const Oi=({children:e,...t}={})=>nt`` +/** + * @license + * + * Copyright IBM Corp. 2019, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */,Ri=({children:e,...t}={})=>nt`` +/** + * @license + * + * Copyright IBM Corp. 2019, 2022 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */;let Ii,Ui=e=>e;const{prefix:Hi}=xe;let ji=ue([kt(`${Hi}-header-menu-button`)],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"method",key:"_handleClick",value:function(){const e=!this.active;this.active=e,this.dispatchEvent(new CustomEvent(this.constructor.eventToggle,{bubbles:!0,cancelable:!0,composed:!0,detail:{active:e}}))}},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"active",value:()=>!1},{kind:"field",decorators:[St({attribute:"button-label-active"})],key:"buttonLabelActive",value:()=>"Close navigation menu"},{kind:"field",decorators:[St({attribute:"button-label-inactive"})],key:"buttonLabelInactive",value:()=>"Open navigation menu"},{kind:"field",decorators:[St({reflect:!0,attribute:"collapse-mode"})],key:"collapseMode",value:()=>ni.RESPONSIVE},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[St({reflect:!0,attribute:"usage-mode"})],key:"usageMode",value:()=>si.REGULAR},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"render",value:function(){const{active:e,buttonLabelActive:t,buttonLabelInactive:i,disabled:n,_handleClick:s}=this,a=e?t:i,r=rt({[`${Hi}--header__action`]:!0,[`${Hi}--header__menu-trigger`]:!0,[`${Hi}--header__menu-toggle`]:!0,[`${Hi}--header__action--active`]:e});return it(Ii||(Ii=Ui` `),r,n,ci(null!=(o=a)?o:void 0),s,(e?Oi:Ri)({slot:"toggle-icon"}));var o}},{kind:"get",static:!0,key:"eventToggle",value:function(){return`${Hi}-header-menu-button-toggled`}},{kind:"field",static:!0,key:"styles",value:()=>Dt}]}}),It(Nt)); +/** + * @license + * + * Copyright IBM Corp. 2019, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */let Li,Vi=e=>e;const{prefix:Bi}=xe;ue([kt(`${Bi}-side-nav-menu`)],(function(e,t){class i extends t{constructor(...t){super(...t),e(this)}}return{F:i,d:[{kind:"field",key:"_hasIcon",value:()=>!1},{kind:"field",decorators:[At("#title-icon-container")],key:"_titleIconContainerNode",value:void 0},{kind:"method",key:"_handleUserInitiatedToggle",value:function(e=!this.expanded){const{eventBeforeToggle:t,eventToggle:i}=this.constructor,n={bubbles:!0,cancelable:!0,composed:!0,detail:{expanded:e}};this.dispatchEvent(new CustomEvent(t,n))&&(this.expanded=e,this.dispatchEvent(new CustomEvent(i,n)))}},{kind:"method",key:"_handleClickExpando",value:function(){this._handleUserInitiatedToggle()}},{kind:"method",key:"_handleSlotChange",value:function({target:e}){const{_hasIcon:t}=this;ii(e.assignedNodes(),(e=>{e.nodeType===Node.ELEMENT_NODE&&e.toggleAttribute(this.constructor.attribItemHasIcon,t)}))}},{kind:"method",key:"_handleSlotChangeTitleIcon",value:function({target:e}){var t;const i=this.constructor,n=e.assignedNodes().length>0;this._hasIcon=n,null===(t=this._titleIconContainerNode)||void 0===t||t.toggleAttribute("hidden",!n),ii(this.querySelectorAll(i.selectorItem),(e=>{e.toggleAttribute(i.attribItemHasIcon,n)}))}},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"active",value:()=>!1},{kind:"field",decorators:[St({type:Boolean,reflect:!0})],key:"expanded",value:()=>!1},{kind:"field",decorators:[St({type:Boolean,reflect:!0,attribute:"force-collapsed"})],key:"forceCollapsed",value:()=>!1},{kind:"field",decorators:[St()],key:"title",value:()=>""},{kind:"method",key:"createRenderRoot",value:function(){var e;return this.attachShadow({mode:"open",delegatesFocus:Number((null!==(e=/Safari\/(\d+)/.exec(navigator.userAgent))&&void 0!==e?e:["",0])[1])<=537})}},{kind:"method",key:"connectedCallback",value:function(){this.hasAttribute("role")||this.setAttribute("role","listitem"),Bt(Vt(i.prototype),"connectedCallback",this).call(this)}},{kind:"method",key:"updated",value:function(e){if(e.has("expanded")){const{selectorItem:e}=this.constructor,{expanded:t}=this;ii(this.querySelectorAll(e),(e=>{e.tabIndex=t?0:-1}))}}},{kind:"method",key:"render",value:function(){const{expanded:e,forceCollapsed:t,title:i,_handleClickExpando:n,_handleSlotChange:s,_handleSlotChangeTitleIcon:a}=this;return it(Li||(Li=Vi`
`),String(Boolean(e&&!t)),Bi,n,Bi,a,Bi,i,Bi,Bi,Bi,(({children:e,...t}={})=>nt``)({part:"expando-icon"}),Bi,s)}},{kind:"field",static:!0,key:"attribItemHasIcon",value:()=>"parent-has-icon"},{kind:"get",static:!0,key:"selectorItem",value:function(){return`${Bi}-side-nav-menu-item`}},{kind:"get",static:!0,key:"eventBeforeToggle",value:function(){return`${Bi}-side-nav-menu-beingtoggled`}},{kind:"get",static:!0,key:"eventToggle",value:function(){return`${Bi}-side-nav-menu-toggled`}},{kind:"field",static:!0,key:"styles",value:()=>Ut}]}}),It(Nt));const Di=((e,...t)=>{const i=1===e.length?e[0]:t.reduce(((t,i,n)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[n+1]),e[0]);return new o(i,e,a)})`.bx--text-truncate--end{display:inline-block;overflow:hidden;width:100%;text-overflow:ellipsis;white-space:nowrap}.bx--text-truncate--front{display:inline-block;overflow:hidden;width:100%;direction:rtl;text-overflow:ellipsis;white-space:nowrap}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{padding:0;border:0;margin:0;font:inherit;font-size:100%;vertical-align:baseline}button,select,input,textarea{border-radius:0;font-family:inherit}input[type=text]::-ms-clear{display:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}body{line-height:1}sup{vertical-align:super}sub{vertical-align:sub}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::before,blockquote::after,q::before,q::after{content:""}table{border-collapse:collapse;border-spacing:0}*{box-sizing:border-box}button{margin:0}html{font-size:100%}body{font-weight:400;font-family:'IBM Plex Sans','Helvetica Neue',Arial,sans-serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}code{font-family:'IBM Plex Mono','Menlo','DejaVu Sans Mono','Bitstream Vera Sans Mono',Courier,monospace}strong{font-weight:600}@media screen and (-ms-high-contrast:active){svg{fill:ButtonText}}h1{font-size:2rem;font-weight:300;line-height:1.199;letter-spacing:0}h2{font-size:2rem;font-weight:400;line-height:1.25;letter-spacing:0}h3{font-size:1.75rem;font-weight:400;line-height:1.29;letter-spacing:0}h4{font-size:1.25rem;font-weight:400;line-height:1.4;letter-spacing:0}h5{font-size:1rem;font-weight:600;line-height:1.375;letter-spacing:0}h6{font-size:.875rem;font-weight:600;line-height:1.29;letter-spacing:.16px}p{font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0}a{color:#0f62fe}em{font-style:italic}@keyframes skeleton{0%{opacity:.3;transform:scaleX(0);transform-origin:left}20%{opacity:1;transform:scaleX(1);transform-origin:left}28%{transform:scaleX(1);transform-origin:right}51%{transform:scaleX(0);transform-origin:right}58%{transform:scaleX(0);transform-origin:right}82%{transform:scaleX(1);transform-origin:right}83%{transform:scaleX(1);transform-origin:left}96%{transform:scaleX(0);transform-origin:left}100%{opacity:.3;transform:scaleX(0);transform-origin:left}}.bx--header,:host(bx-header){position:fixed;z-index:8000;top:0;right:0;left:0;display:flex;height:3rem;align-items:center;border-bottom:1px solid #393939;background-color:#161616}.bx--header__action{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;appearance:none;background:0;cursor:pointer;width:100%;width:3rem;height:3rem;border:.0625rem solid transparent;transition:background-color 110ms,border-color 110ms}.bx--header__action *,.bx--header__action *::before,.bx--header__action *::after{box-sizing:inherit}.bx--header__action::-moz-focus-inner{border:0}.bx--header__action>svg.bx--navigation-menu-panel-collapse-icon,.bx--header__action--active>svg.bx--navigation-menu-panel-expand-icon{display:none}.bx--header__action--active>svg.bx--navigation-menu-panel-collapse-icon{display:inline}.bx--header__action:hover{background-color:#353535}.bx--header__action--active{border-right:1px solid #393939;border-bottom:1px solid #161616;border-left:1px solid #393939}.bx--header__action:focus{border-color:#fff;outline:0}.bx--header__action:active{background-color:#393939}.bx--header__action.bx--btn--icon-only.bx--tooltip__trigger{justify-content:center}.bx--header__action>svg{fill:#fff}.bx--header__menu-trigger>svg{fill:#f4f4f4}.bx--header__menu-trigger:hover{fill:#2c2c2c}.bx--header__menu-toggle{display:flex;align-items:center;justify-content:center}@media(min-width:66rem){.bx--header__menu-toggle__hidden{display:none}}a.bx--header__name{font-size:.875rem;font-weight:400;line-height:1.29;letter-spacing:.16px;display:flex;height:100%;align-items:center;padding:0 2rem 0 1rem;border:.125rem solid transparent;font-weight:600;letter-spacing:.1px;line-height:1.25rem;outline:0;text-decoration:none;transition:border-color 110ms;user-select:none}a.bx--header__name:focus{border-color:#fff}.bx--header__name--prefix{font-weight:400}a.bx--header__name,a.bx--header__name:hover{color:#f4f4f4}.bx--header__menu-toggle:not(.bx--header__menu-toggle__hidden) ~ .bx--header__name{padding-left:.5rem}.bx--header__nav,:host(bx-header-nav){position:relative;display:none;height:100%;padding-left:1rem}@media(min-width:66rem){.bx--header__nav,:host(bx-header-nav){display:block}}.bx--header__nav::before{position:absolute;top:50%;left:0;display:block;width:.0625rem;height:1.5rem;background-color:#393939;content:"";transform:translateY(-50%)}.bx--header__menu-bar{display:flex;height:100%;padding:0;margin:0;list-style:none}a.bx--header__menu-item{position:relative;display:flex;height:100%;align-items:center;padding:0 1rem;border:2px solid transparent;color:#c6c6c6;font-size:.875rem;font-weight:400;letter-spacing:0;line-height:1.125rem;text-decoration:none;transition:background-color 110ms,border-color 110ms,color 110ms;user-select:none}a.bx--header__menu-item:hover{background-color:#2c2c2c;color:#f4f4f4}.bx--header__action:active,a.bx--header__menu-item:active{background-color:#393939;color:#f4f4f4}a.bx--header__menu-item:focus{border-color:#fff;color:#f4f4f4;outline:0}a.bx--header__menu-item:hover>svg,a.bx--header__menu-item:active>svg,a.bx--header__menu-item:focus>svg{fill:#f4f4f4}a.bx--header__menu-item[aria-current=page]::after,.bx--header__menu-item--current::after{position:absolute;top:0;right:0;bottom:-2px;left:0;width:100%;border-bottom:3px solid #4589ff;content:""}a.bx--header__menu-item[aria-current=page]:focus::after,.bx--header__menu-item--current:focus::after{border:0}a.bx--header__menu-item[aria-current=page]:focus,a.bx--header__menu-item.bx--header__menu-item--current:focus{border:2px solid #fff}.bx--header__submenu,:host(bx-header-menu),:host(qiskit-header-menu-mega),:host(qiskit-header-menu){position:relative}.bx--header__submenu--current::after{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;border-bottom:3px solid #0f62fe;content:""}.bx--header__submenu--current:focus{border:2px solid #0f62fe}.bx--header__submenu--current:focus::after{border:0}.bx--header__menu-title[aria-haspopup=true]{position:relative}.bx--header__menu-title[aria-expanded=true]{z-index:8001;background-color:#262626;color:#fff}.bx--header__menu-title[aria-expanded=true]>.bx--header__menu-arrow{transform:rotate(180deg)}.bx--header__menu{display:none;padding:0;margin:0;list-style:none}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu{position:absolute;z-index:8000;bottom:0;left:0;display:flex;width:12.5rem;flex-direction:column;background-color:#262626;box-shadow:0 4px 8px 0 rgba(0,0,0,0.5);transform:translateY(100%)}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu .bx--header__menu-item:hover{background-color:#353535}.bx--header__menu-title[aria-expanded=true]+.bx--header__menu .bx--header__menu-item:active{background-color:#393939}.bx--header__menu .bx--header__menu-item{height:3rem}.bx--header__menu .bx--header__menu-item:hover{background-color:#262626;color:#f4f4f4}.bx--header__menu-arrow{margin-left:.5rem;fill:#c6c6c6;transition:transform 110ms,fill 110ms}.bx--header__global{display:flex;height:100%;flex:1 1 0%;justify-content:flex-end}.bx--skip-to-content{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip:rect(0,0,0,0);visibility:inherit;white-space:nowrap}.bx--skip-to-content:focus{z-index:9999;top:0;left:0;display:flex;width:auto;height:3rem;align-items:center;padding:0 1rem;border:4px solid #0f62fe;background-color:#161616;clip:auto;color:#f4f4f4;outline:0}:host(bx-header-nav) .bx-ce--header__divider{position:absolute;left:0;top:50%;transform:translateY(-50%);height:1.5rem;width:.0625rem;background-color:#393939}:host(bx-header-nav-item){outline:0}:host(bx-header-menu),:host(qiskit-header-menu-mega),:host(qiskit-header-menu){outline:0}:host(bx-header-menu-item){outline:0}:host(bx-header-menu-item) a.bx--header__menu-item{height:3rem}:host(bx-header-menu-item) a.bx--header__menu-item:hover{background-color:#353535;color:#f4f4f4}:host(bx-header-menu-item) a.bx--header__menu-item:active{background-color:#393939}:host(bx-header-menu-button),:host(qiskit-header-menu-button){display:content;outline:0}@media(min-width:66rem){:host(bx-header-menu-button),:host(qiskit-header-menu-button){display:none}}:host(bx-header-menu-button[collapse-mode=fixed]){display:none}@media(min-width:66rem){:host(bx-header-menu-button[collapse-mode=rail]){display:block}}:host(bx-header-name){display:content;height:100%}.bx--assistive-text,.bx--visually-hidden{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip:rect(0,0,0,0);visibility:inherit;white-space:nowrap}.bx--body{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;font-size:.875rem;font-weight:400;line-height:1.29;letter-spacing:.16px;background-color:#fff;color:#161616;line-height:1}.bx--body *,.bx--body *::before,.bx--body *::after{box-sizing:inherit}.bx--side-nav,:host(bx-side-nav){position:fixed;z-index:8000;top:0;bottom:0;left:0;overflow:hidden;width:3rem;max-width:16rem;background-color:#fff;color:#525252;transition:width .11s cubic-bezier(0.2,0,1,0.9);will-change:width}.bx--side-nav--ux,:host(bx-side-nav){top:3rem;width:16rem}@media(max-width:65.98rem){.bx--side-nav--ux,:host(bx-side-nav){width:0}}.bx--side-nav--rail{width:3rem}.bx--side-nav--hidden{width:0}.bx--side-nav.bx--side-nav--rail:not(.bx--side-nav--fixed):hover,.bx--side-nav--expanded,:host(bx-side-nav[expanded]),:host(bx-side-nav[collapse-mode][expanded]){width:16rem}.bx--side-nav__overlay{position:fixed;top:3rem;left:0;width:0;height:0;background-color:transparent;opacity:0;transition:opacity 240ms cubic-bezier(0.2,0,0.38,0.9),background-color 240ms cubic-bezier(0.2,0,0.38,0.9)}@media(max-width:65.98rem){.bx--side-nav__overlay-active{width:100vw;height:100vh;background-color:rgba(22,22,22,0.5);opacity:1;transition:opacity 240ms cubic-bezier(0.2,0,0.38,0.9),background-color 240ms cubic-bezier(0.2,0,0.38,0.9)}}.bx--header ~ .bx--side-nav,.bx--header ~ :host(bx-side-nav),:host(bx-header) ~ .bx--side-nav,:host(bx-header) ~ :host(bx-side-nav){top:3rem;height:calc(100% - 48px)}.bx--side-nav--fixed{width:16rem}.bx--side-nav--collapsed{width:16rem;transform:translateX(-16rem)}.bx--side-nav__navigation,:host(bx-side-nav){display:flex;height:100%;flex-direction:column}.bx--side-nav__header{display:flex;width:100%;max-width:100%;height:3rem;border-bottom:1px solid #393939}.bx--side-nav:hover .bx--side-nav__header,.bx--side-nav--fixed .bx--side-nav__header,.bx--side-nav--expanded .bx--side-nav__header,:host(bx-side-nav[expanded]) .bx--side-nav__header{height:auto}.bx--side-nav--ux .bx--side-nav__header,:host(bx-side-nav) .bx--side-nav__header{height:auto}.bx--side-nav__details{display:flex;min-width:0;flex:1;flex-direction:column;padding-right:1rem;opacity:0;visibility:hidden}.bx--side-nav:hover .bx--side-nav__details,.bx--side-nav--fixed .bx--side-nav__details,.bx--side-nav--expanded .bx--side-nav__details,:host(bx-side-nav[expanded]) .bx--side-nav__details{visibility:inherit;opacity:1}.bx--side-nav--ux .bx--side-nav__details,:host(bx-side-nav) .bx--side-nav__details{opacity:1;visibility:inherit}.bx--side-nav__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:1rem;font-size:.875rem;font-weight:600;letter-spacing:.1px;user-select:none}.bx--side-nav__title,.bx--side-nav__select{padding-left:.5rem}.bx--side-nav__switcher{position:relative;display:flex;align-items:center;justify-content:space-between}.bx--side-nav__switcher-chevron{position:absolute;top:0;right:.5rem;bottom:0;display:flex;align-items:center;fill:#525252}.bx--side-nav__select{outline:2px solid transparent;outline-offset:-2px;min-width:0;height:2rem;flex:1 1 0%;padding-right:2rem;border:0;appearance:none;background-color:#161616;border-radius:0;color:#f4f4f4;cursor:pointer;font-size:.75rem;transition:outline 110ms}.bx--side-nav__select:focus{outline:2px solid #0f62fe;outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__select:focus{outline-style:dotted}}.bx--side-nav__footer{width:100%;flex:0 0 3rem;background-color:#fff}.bx--side-nav__toggle{outline:2px solid transparent;outline-offset:-2px;box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;appearance:none;background:0;cursor:pointer;width:100%;height:100%;padding-left:1rem;text-align:left;transition:outline 110ms}.bx--side-nav__toggle *,.bx--side-nav__toggle *::before,.bx--side-nav__toggle *::after{box-sizing:inherit}.bx--side-nav__toggle::-moz-focus-inner{border:0}.bx--side-nav__toggle:focus{outline:2px solid #0f62fe;outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__toggle:focus{outline-style:dotted}}.bx--side-nav__items,:host(bx-side-nav-items){overflow:hidden;flex:1 1 0%;padding:1rem 0 0}.bx--side-nav:hover .bx--side-nav__items,.bx--side-nav:hover :host(bx-side-nav-items),.bx--side-nav--fixed .bx--side-nav__items,.bx--side-nav--fixed :host(bx-side-nav-items),.bx--side-nav--expanded .bx--side-nav__items,.bx--side-nav--expanded :host(bx-side-nav-items),:host(bx-side-nav[expanded]) .bx--side-nav__items,:host(bx-side-nav[expanded]) :host(bx-side-nav-items){overflow-y:auto}.bx--side-nav--ux .bx--side-nav__items,.bx--side-nav--ux :host(bx-side-nav-items),:host(bx-side-nav) .bx--side-nav__items,:host(bx-side-nav) :host(bx-side-nav-items){overflow-y:auto}.bx--side-nav__item,:host(bx-side-nav-menu),:host(bx-side-nav-link){overflow:hidden;width:auto;height:auto}.bx--side-nav--ux .bx--side-nav__item,.bx--side-nav--ux :host(bx-side-nav-menu),.bx--side-nav--ux :host(bx-side-nav-link),:host(bx-side-nav) .bx--side-nav__item,:host(bx-side-nav) :host(bx-side-nav-menu),:host(bx-side-nav) :host(bx-side-nav-link){width:auto;height:auto}.bx--side-nav__item:not(.bx--side-nav__item--active):hover .bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active):hover :not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active):hover :not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__submenu:hover,.bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__link:hover,:not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__link:hover,:not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__link:hover,.bx--side-nav__menu a.bx--side-nav__link:not(.bx--side-nav__link--current):not([aria-current=page]):hover,.bx--side-nav a.bx--header__menu-item:hover,:host(bx-side-nav) a.bx--header__menu-item:hover,.bx--side-nav .bx--header__menu-title[aria-expanded=true]:hover,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__item:not(.bx--side-nav__item--active)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link)>.bx--side-nav__link:hover>span,.bx--side-nav__item:not(.bx--side-nav__item--active) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,.bx--side-nav__item:not(.bx--side-nav__item--active) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-menu) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link) .bx--side-nav__menu-item>.bx--side-nav__link:hover>span,:not(.bx--side-nav__item--active):host(bx-side-nav-link) :host(bx-side-nav-menu-item)>.bx--side-nav__link:hover>span{color:#161616}.bx--side-nav__item--large{height:3rem}.bx--side-nav__divider,:host(bx-side-nav-divider){height:1px;margin:.5rem 1rem;background-color:#e0e0e0}.bx--side-nav__submenu{box-sizing:border-box;padding:0;border:0;margin:0;font-family:inherit;font-size:100%;vertical-align:baseline;display:inline-block;padding:0;border:0;appearance:none;background:0;cursor:pointer;width:100%;font-size:.875rem;font-weight:600;line-height:1.29;letter-spacing:.16px;outline:2px solid transparent;outline-offset:-2px;display:flex;height:2rem;align-items:center;padding:0 1rem;color:#525252;transition:color 110ms,background-color 110ms,outline 110ms;user-select:none}.bx--side-nav__submenu *,.bx--side-nav__submenu *::before,.bx--side-nav__submenu *::after{box-sizing:inherit}.bx--side-nav__submenu::-moz-focus-inner{border:0}.bx--side-nav__submenu:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__submenu:focus{outline:2px solid #0f62fe;outline-offset:-2px}@media screen and (prefers-contrast){.bx--side-nav__submenu:focus{outline-style:dotted}}.bx--side-nav__submenu-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.bx--side-nav__icon.bx--side-nav__submenu-chevron{display:flex;flex:1;justify-content:flex-end}.bx--side-nav__submenu-chevron>svg{width:1rem;height:1rem;transition:transform 110ms}.bx--side-nav__submenu[aria-expanded=true] .bx--side-nav__submenu-chevron>svg{transform:rotate(180deg)}.bx--side-nav__item--large .bx--side-nav__submenu{height:3rem}.bx--side-nav__item--active .bx--side-nav__submenu:hover,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav__item--active .bx--side-nav__submenu[aria-expanded=false],:host(bx-side-nav-menu[active]) .bx--side-nav__submenu[aria-expanded=false]{position:relative;background-color:#e5e5e5;color:#161616}.bx--side-nav__item--active .bx--side-nav__submenu[aria-expanded=false]::before,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu[aria-expanded=false]::before{position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe;content:""}.bx--side-nav__item--active .bx--side-nav__submenu-title,:host(bx-side-nav-menu[active]) .bx--side-nav__submenu-title{color:#161616;font-weight:600}.bx--side-nav__menu{display:block;max-height:0;visibility:hidden}.bx--side-nav__submenu[aria-expanded=true]+.bx--side-nav__menu{max-height:93.75rem;visibility:inherit}.bx--side-nav__menu a.bx--side-nav__link{height:2rem;min-height:2rem;padding-left:2rem;font-weight:400}.bx--side-nav__item.bx--side-nav__item--icon a.bx--side-nav__link{padding-left:4.5rem}.bx--side-nav__menu a.bx--side-nav__link--current,.bx--side-nav__menu a.bx--side-nav__link[aria-current=page],a.bx--side-nav__link--current{background-color:#e0e0e0}.bx--side-nav__menu a.bx--side-nav__link--current>span,.bx--side-nav__menu a.bx--side-nav__link[aria-current=page]>span,a.bx--side-nav__link--current>span{color:#161616;font-weight:600}a.bx--side-nav__link,.bx--side-nav a.bx--header__menu-item,:host(bx-side-nav) a.bx--header__menu-item,.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu{outline:2px solid transparent;outline-offset:-2px;font-size:.875rem;font-weight:600;line-height:1.29;letter-spacing:.16px;position:relative;display:flex;min-height:2rem;align-items:center;padding:0 1rem;text-decoration:none;transition:color 110ms,background-color 110ms,outline 110ms}.bx--side-nav__item--large a.bx--side-nav__link{height:3rem}a.bx--side-nav__link>.bx--side-nav__link-text,.bx--side-nav a.bx--header__menu-item .bx--text-truncate-end,:host(bx-side-nav) a.bx--header__menu-item .bx--text-truncate-end{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#525252;font-size:.875rem;letter-spacing:.1px;line-height:1.25rem;user-select:none}a.bx--side-nav__link:focus,.bx--side-nav a.bx--header__menu-item:focus,:host(bx-side-nav) a.bx--header__menu-item:focus{outline:2px solid #0f62fe;outline-offset:-2px}@media screen and (prefers-contrast){a.bx--side-nav__link:focus,.bx--side-nav a.bx--header__menu-item:focus,:host(bx-side-nav) a.bx--header__menu-item:focus{outline-style:dotted}}a.bx--side-nav__link[aria-current=page],a.bx--side-nav__link--current{background-color:#e5e5e5;font-weight:600}a.bx--side-nav__link[aria-current=page] .bx--side-nav__link-text,a.bx--side-nav__link--current .bx--side-nav__link-text{color:#161616}a.bx--side-nav__link[aria-current=page]::before,a.bx--side-nav__link--current::before{position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe;content:""}.bx--side-nav__icon{display:flex;flex:0 0 1rem;align-items:center;justify-content:center}.bx--side-nav__icon:not(.bx--side-nav__submenu-chevron){margin-right:1.5rem}.bx--side-nav__icon>svg{width:1rem;height:1rem;fill:#525252}.bx--side-nav__icon>svg.bx--side-nav-collapse-icon{display:none}.bx--side-nav--expanded .bx--side-nav__icon>svg.bx--side-nav-expand-icon,:host(bx-side-nav[expanded]) .bx--side-nav__icon>svg.bx--side-nav-expand-icon{display:none}.bx--side-nav--expanded .bx--side-nav__icon>svg.bx--side-nav-collapse-icon,:host(bx-side-nav[expanded]) .bx--side-nav__icon>svg.bx--side-nav-collapse-icon{display:block}.bx--side-nav--fixed a.bx--side-nav__link,.bx--side-nav--fixed .bx--side-nav__submenu{padding-left:1rem}.bx--side-nav--fixed .bx--side-nav__item:not(.bx--side-nav__item--icon) .bx--side-nav__menu a.bx--side-nav__link,.bx--side-nav--fixed :not(.bx--side-nav__item--icon):host(bx-side-nav-menu) .bx--side-nav__menu a.bx--side-nav__link,.bx--side-nav--fixed :not(.bx--side-nav__item--icon):host(bx-side-nav-link) .bx--side-nav__menu a.bx--side-nav__link{padding-left:2rem}@media(max-width:65.98rem){.bx--side-nav .bx--header__nav,:host(bx-side-nav) .bx--header__nav,.bx--side-nav:host(bx-header-nav),:host(bx-side-nav):host(bx-header-nav){display:block}}.bx--side-nav__header-navigation{display:none}@media(max-width:65.98rem){.bx--side-nav__header-navigation{position:relative;display:block;margin-bottom:2rem}}.bx--side-nav__header-divider::after{position:absolute;bottom:-1rem;left:1rem;width:calc(100% - 32px);height:.0625rem;background:#e0e0e0;content:""}.bx--side-nav a.bx--header__menu-item,:host(bx-side-nav) a.bx--header__menu-item{justify-content:space-between;color:#525252;white-space:nowrap}.bx--side-nav a.bx--header__menu-item[aria-expanded=true],:host(bx-side-nav) a.bx--header__menu-item[aria-expanded=true]{background-color:transparent}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu{bottom:inherit;width:100%;padding:0;background-color:transparent;box-shadow:none;transform:none}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu li,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu li{width:100%}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item{padding-left:4.25rem;font-weight:400}.bx--side-nav .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item:hover,:host(bx-side-nav) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu a.bx--header__menu-item:hover{background-color:#e5e5e5;color:#161616}.bx--side-nav .bx--header__menu a.bx--header__menu-item,:host(bx-side-nav) .bx--header__menu a.bx--header__menu-item{height:inherit}.bx--side-nav a.bx--header__menu-item:hover .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:focus .bx--header__menu-arrow,.bx--side-nav .bx--header__menu-arrow,:host(bx-side-nav) .bx--header__menu-arrow{fill:#525252}@media screen and (-ms-high-contrast:active),(forced-colors:active){.bx--side-nav__icon>svg,.bx--side-nav a.bx--header__menu-item:hover .bx--header__menu-arrow,.bx--side-nav a.bx--header__menu-item:focus .bx--header__menu-arrow,.bx--side-nav .bx--header__menu-arrow,:host(bx-side-nav) .bx--header__menu-arrow{fill:ButtonText}}:host(bx-side-nav){top:0}:host(bx-side-nav[collapse-mode=fixed]){width:16rem}:host(bx-side-nav[collapse-mode=rail]){width:3rem}:host(bx-side-nav[collapse-mode=rail]):hover{width:16rem}:host(bx-side-nav[usage-mode=header-nav]),:host(bx-side-nav[collapse-mode][usage-mode=header-nav]){width:0}@media(max-width:65.98rem){:host(bx-side-nav[expanded][usage-mode=header-nav]),:host(bx-side-nav[collapse-mode][expanded][usage-mode=header-nav]){width:16rem}}:host(bx-side-nav-link){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-link) .bx--side-nav__icon{color:#525252}:host(bx-side-nav-link) .bx--side-nav__icon[hidden]{display:none}:host(bx-side-nav-divider){display:block}:host(bx-side-nav-menu){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-menu) .bx--side-nav__icon[hidden]{display:none}:host(bx-side-nav-menu[active]){background-color:#e5e5e5;color:#161616;position:relative}:host(bx-side-nav-menu[active])::before{content:"";position:absolute;top:0;bottom:0;left:0;width:4px;background-color:#0f62fe}:host(bx-side-nav-menu[active][expanded]){background-color:inherit;color:inherit;position:inherit}:host(bx-side-nav-menu[active][expanded])::before{content:none}:host(bx-side-nav-menu-item){display:block;outline:0;width:auto;height:auto}:host(bx-side-nav-menu-item) a.bx--side-nav__link{height:2rem;min-height:2rem;padding-left:2rem;font-weight:400}:host(bx-side-nav-menu-item[parent-has-icon]) a.bx--side-nav__link{padding-left:4.5rem}:host(bx-side-nav-item) .bx--side-nav__link:hover,:host(bx-side-nav-menu) .bx--side-nav__submenu:hover,:host(bx-side-nav-menu-item) .bx--side-nav__link:hover{background-color:#e5e5e5;color:#161616}:host{--cds-interactive-01:#0f62fe;--cds-interactive-02:#393939;--cds-interactive-03:#0f62fe;--cds-interactive-04:#0f62fe;--cds-ui-background:#fff;--cds-ui-01:#f4f4f4;--cds-ui-02:#fff;--cds-ui-03:#e0e0e0;--cds-ui-04:#8d8d8d;--cds-ui-05:#161616;--cds-text-01:#161616;--cds-text-02:#525252;--cds-text-03:#a8a8a8;--cds-text-04:#fff;--cds-text-05:#6f6f6f;--cds-text-error:#da1e28;--cds-icon-01:#161616;--cds-icon-02:#525252;--cds-icon-03:#fff;--cds-link-01:#0f62fe;--cds-link-02:#0043ce;--cds-inverse-link:#78a9ff;--cds-field-01:#f4f4f4;--cds-field-02:#fff;--cds-inverse-01:#fff;--cds-inverse-02:#393939;--cds-support-01:#da1e28;--cds-support-02:#198038;--cds-support-03:#f1c21b;--cds-support-04:#0043ce;--cds-inverse-support-01:#fa4d56;--cds-inverse-support-02:#42be65;--cds-inverse-support-03:#f1c21b;--cds-inverse-support-04:#4589ff;--cds-overlay-01:rgba(22,22,22,0.5);--cds-danger-01:#da1e28;--cds-danger-02:#da1e28;--cds-focus:#0f62fe;--cds-inverse-focus-ui:#fff;--cds-hover-primary:#0353e9;--cds-active-primary:#002d9c;--cds-hover-primary-text:#0043ce;--cds-hover-secondary:#4c4c4c;--cds-active-secondary:#6f6f6f;--cds-hover-tertiary:#0353e9;--cds-active-tertiary:#002d9c;--cds-hover-ui:#e5e5e5;--cds-hover-light-ui:#e5e5e5;--cds-hover-selected-ui:#cacaca;--cds-active-ui:#c6c6c6;--cds-active-light-ui:#c6c6c6;--cds-selected-ui:#e0e0e0;--cds-selected-light-ui:#e0e0e0;--cds-inverse-hover-ui:#4c4c4c;--cds-hover-danger:#b81921;--cds-active-danger:#750e13;--cds-hover-row:#e5e5e5;--cds-visited-link:#8a3ffc;--cds-disabled-01:#f4f4f4;--cds-disabled-02:#c6c6c6;--cds-disabled-03:#8d8d8d;--cds-highlight:#d0e2ff;--cds-decorative-01:#e0e0e0;--cds-button-separator:#e0e0e0;--cds-skeleton-01:#e5e5e5;--cds-skeleton-02:#c6c6c6;--cds-background:#fff;--cds-layer:#f4f4f4;--cds-layer-accent:#e0e0e0;--cds-layer-accent-hover:#d1d1d1;--cds-layer-accent-active:#a8a8a8;--cds-field:#f4f4f4;--cds-background-inverse:#393939;--cds-background-brand:#0f62fe;--cds-interactive:#0f62fe;--cds-border-subtle:#e0e0e0;--cds-border-strong:#8d8d8d;--cds-border-inverse:#161616;--cds-border-interactive:#0f62fe;--cds-text-primary:#161616;--cds-text-secondary:#525252;--cds-text-placeholder:#a8a8a8;--cds-text-helper:#6f6f6f;--cds-text-on-color:#fff;--cds-text-inverse:#fff;--cds-link-primary:#0f62fe;--cds-link-secondary:#0043ce;--cds-link-visited:#8a3ffc;--cds-link-inverse:#78a9ff;--cds-icon-primary:#161616;--cds-icon-secondary:#525252;--cds-icon-on-color:#fff;--cds-icon-inverse:#fff;--cds-support-error:#da1e28;--cds-support-success:#198038;--cds-support-warning:#f1c21b;--cds-support-info:#0043ce;--cds-support-error-inverse:#fa4d56;--cds-support-success-inverse:#42be65;--cds-support-warning-inverse:#f1c21b;--cds-support-info-inverse:#4589ff;--cds-overlay:rgba(22,22,22,0.5);--cds-toggle-off:#8d8d8d;--cds-shadow:rgba(0,0,0,0.3);--cds-button-primary:#0f62fe;--cds-button-secondary:#393939;--cds-button-tertiary:#0f62fe;--cds-button-danger-primary:#da1e28;--cds-button-danger-secondary:#da1e28;--cds-background-active:#c6c6c6;--cds-layer-active:#c6c6c6;--cds-button-danger-active:#750e13;--cds-button-primary-active:#002d9c;--cds-button-secondary-active:#6f6f6f;--cds-button-tertiary-active:#002d9c;--cds-focus-inset:#fff;--cds-focus-inverse:#fff;--cds-background-hover:#e5e5e5;--cds-layer-hover:#e5e5e5;--cds-field-hover:#e5e5e5;--cds-background-inverse-hover:#4c4c4c;--cds-link-primary-hover:#0043ce;--cds-button-danger-hover:#b81921;--cds-button-primary-hover:#0353e9;--cds-button-secondary-hover:#4c4c4c;--cds-button-tertiary-hover:#0353e9;--cds-background-selected:#e0e0e0;--cds-background-selected-hover:#cacaca;--cds-layer-selected:#e0e0e0;--cds-layer-selected-hover:#cacaca;--cds-layer-selected-inverse:#161616;--cds-border-subtle-selected:#c6c6c6;--cds-border-disabled:#f4f4f4;--cds-text-disabled:#c6c6c6;--cds-button-disabled:#c6c6c6;--cds-icon-disabled:#c6c6c6;--cds-text-on-color-disabled:#8d8d8d;--cds-icon-on-color-disabled:#8d8d8d;--cds-layer-selected-disabled:#8d8d8d;--cds-skeleton-background:#e5e5e5;--cds-skeleton-element:#c6c6c6;--cds-brand-01:#0f62fe;--cds-brand-02:#393939;--cds-brand-03:#0f62fe;--cds-active-01:#c6c6c6;--cds-hover-field:#e5e5e5;--cds-danger:#da1e28;--cds-caption-01-font-size:.75rem;--cds-caption-01-font-weight:400;--cds-caption-01-line-height:1.33333;--cds-caption-01-letter-spacing:.32px;--cds-caption-02-font-size:.875rem;--cds-caption-02-font-weight:400;--cds-caption-02-line-height:1.28572;--cds-caption-02-letter-spacing:.32px;--cds-label-01-font-size:.75rem;--cds-label-01-font-weight:400;--cds-label-01-line-height:1.33333;--cds-label-01-letter-spacing:.32px;--cds-label-02-font-size:.875rem;--cds-label-02-font-weight:400;--cds-label-02-line-height:1.28572;--cds-label-02-letter-spacing:.16px;--cds-helper-text-01-font-size:.75rem;--cds-helper-text-01-line-height:1.33333;--cds-helper-text-01-letter-spacing:.32px;--cds-helper-text-02-font-size:.875rem;--cds-helper-text-02-line-height:1.28572;--cds-helper-text-02-letter-spacing:.16px;--cds-body-short-01-font-size:.875rem;--cds-body-short-01-font-weight:400;--cds-body-short-01-line-height:1.28572;--cds-body-short-01-letter-spacing:.16px;--cds-body-long-01-font-size:.875rem;--cds-body-long-01-font-weight:400;--cds-body-long-01-line-height:1.42857;--cds-body-long-01-letter-spacing:.16px;--cds-body-short-02-font-size:1rem;--cds-body-short-02-font-weight:400;--cds-body-short-02-line-height:1.375;--cds-body-short-02-letter-spacing:0;--cds-body-long-02-font-size:1rem;--cds-body-long-02-font-weight:400;--cds-body-long-02-line-height:1.5;--cds-body-long-02-letter-spacing:0;--cds-code-01-font-family:'IBM Plex Mono','Menlo','DejaVu Sans Mono','Bitstream Vera Sans Mono',Courier,monospace;--cds-code-01-font-size:.75rem;--cds-code-01-font-weight:400;--cds-code-01-line-height:1.33333;--cds-code-01-letter-spacing:.32px;--cds-code-02-font-family:'IBM Plex Mono','Menlo','DejaVu Sans Mono','Bitstream Vera Sans Mono',Courier,monospace;--cds-code-02-font-size:.875rem;--cds-code-02-font-weight:400;--cds-code-02-line-height:1.42857;--cds-code-02-letter-spacing:.32px;--cds-heading-01-font-size:.875rem;--cds-heading-01-font-weight:600;--cds-heading-01-line-height:1.42857;--cds-heading-01-letter-spacing:.16px;--cds-productive-heading-01-font-size:.875rem;--cds-productive-heading-01-font-weight:600;--cds-productive-heading-01-line-height:1.28572;--cds-productive-heading-01-letter-spacing:.16px;--cds-heading-02-font-size:1rem;--cds-heading-02-font-weight:600;--cds-heading-02-line-height:1.5;--cds-heading-02-letter-spacing:0;--cds-productive-heading-02-font-size:1rem;--cds-productive-heading-02-font-weight:600;--cds-productive-heading-02-line-height:1.375;--cds-productive-heading-02-letter-spacing:0;--cds-productive-heading-03-font-size:1.25rem;--cds-productive-heading-03-font-weight:400;--cds-productive-heading-03-line-height:1.4;--cds-productive-heading-03-letter-spacing:0;--cds-productive-heading-04-font-size:1.75rem;--cds-productive-heading-04-font-weight:400;--cds-productive-heading-04-line-height:1.28572;--cds-productive-heading-04-letter-spacing:0;--cds-productive-heading-05-font-size:2rem;--cds-productive-heading-05-font-weight:300;--cds-productive-heading-05-line-height:1.25;--cds-productive-heading-05-letter-spacing:0;--cds-productive-heading-06-font-size:2.625rem;--cds-productive-heading-06-font-weight:300;--cds-productive-heading-06-line-height:1.199;--cds-productive-heading-06-letter-spacing:0;--cds-productive-heading-07-font-size:3.375rem;--cds-productive-heading-07-font-weight:300;--cds-productive-heading-07-line-height:1.199;--cds-productive-heading-07-letter-spacing:0;--cds-expressive-heading-01-font-size:.875rem;--cds-expressive-heading-01-font-weight:600;--cds-expressive-heading-01-line-height:1.25;--cds-expressive-heading-01-letter-spacing:.16px;--cds-expressive-heading-02-font-size:1rem;--cds-expressive-heading-02-font-weight:600;--cds-expressive-heading-02-line-height:1.5;--cds-expressive-heading-02-letter-spacing:0;--cds-expressive-heading-03-font-size:1.25rem;--cds-expressive-heading-03-font-weight:400;--cds-expressive-heading-03-line-height:1.4;--cds-expressive-heading-03-letter-spacing:0;--cds-expressive-heading-04-font-size:1.75rem;--cds-expressive-heading-04-font-weight:400;--cds-expressive-heading-04-line-height:1.28572;--cds-expressive-heading-04-letter-spacing:0;--cds-expressive-heading-05-font-size:2rem;--cds-expressive-heading-05-font-weight:300;--cds-expressive-heading-05-line-height:1.25;--cds-expressive-heading-05-letter-spacing:0;--cds-expressive-heading-06-font-size:2rem;--cds-expressive-heading-06-font-weight:600;--cds-expressive-heading-06-line-height:1.25;--cds-expressive-heading-06-letter-spacing:0;--cds-expressive-paragraph-01-font-size:1.5rem;--cds-expressive-paragraph-01-font-weight:300;--cds-expressive-paragraph-01-line-height:1.334;--cds-expressive-paragraph-01-letter-spacing:0;--cds-quotation-01-font-family:'IBM Plex Serif','Georgia',Times,serif;--cds-quotation-01-font-size:1.25rem;--cds-quotation-01-font-weight:400;--cds-quotation-01-line-height:1.3;--cds-quotation-01-letter-spacing:0;--cds-quotation-02-font-family:'IBM Plex Serif','Georgia',Times,serif;--cds-quotation-02-font-size:2rem;--cds-quotation-02-font-weight:300;--cds-quotation-02-line-height:1.25;--cds-quotation-02-letter-spacing:0;--cds-display-01-font-size:2.625rem;--cds-display-01-font-weight:300;--cds-display-01-line-height:1.19;--cds-display-01-letter-spacing:0;--cds-display-02-font-size:2.625rem;--cds-display-02-font-weight:600;--cds-display-02-line-height:1.19;--cds-display-02-letter-spacing:0;--cds-display-03-font-size:2.625rem;--cds-display-03-font-weight:300;--cds-display-03-line-height:1.19;--cds-display-03-letter-spacing:0;--cds-display-04-font-size:2.625rem;--cds-display-04-font-weight:300;--cds-display-04-line-height:1.19;--cds-display-04-letter-spacing:0;--cds-legal-01-font-size:.75rem;--cds-legal-01-font-weight:400;--cds-legal-01-line-height:1.33333;--cds-legal-01-letter-spacing:.32px;--cds-legal-02-font-size:.875rem;--cds-legal-02-font-weight:400;--cds-legal-02-line-height:1.28572;--cds-legal-02-letter-spacing:.16px;--cds-body-compact-01-font-size:.875rem;--cds-body-compact-01-font-weight:400;--cds-body-compact-01-line-height:1.28572;--cds-body-compact-01-letter-spacing:.16px;--cds-body-compact-02-font-size:1rem;--cds-body-compact-02-font-weight:400;--cds-body-compact-02-line-height:1.375;--cds-body-compact-02-letter-spacing:0;--cds-body-01-font-size:.875rem;--cds-body-01-font-weight:400;--cds-body-01-line-height:1.42857;--cds-body-01-letter-spacing:.16px;--cds-body-02-font-size:1rem;--cds-body-02-font-weight:400;--cds-body-02-line-height:1.5;--cds-body-02-letter-spacing:0;--cds-heading-compact-01-font-size:.875rem;--cds-heading-compact-01-font-weight:600;--cds-heading-compact-01-line-height:1.28572;--cds-heading-compact-01-letter-spacing:.16px;--cds-heading-compact-02-font-size:1rem;--cds-heading-compact-02-font-weight:600;--cds-heading-compact-02-line-height:1.375;--cds-heading-compact-02-letter-spacing:0;--cds-heading-03-font-size:1.25rem;--cds-heading-03-font-weight:400;--cds-heading-03-line-height:1.4;--cds-heading-03-letter-spacing:0;--cds-heading-04-font-size:1.75rem;--cds-heading-04-font-weight:400;--cds-heading-04-line-height:1.28572;--cds-heading-04-letter-spacing:0;--cds-heading-05-font-size:2rem;--cds-heading-05-font-weight:300;--cds-heading-05-line-height:1.25;--cds-heading-05-letter-spacing:0;--cds-heading-06-font-size:2.625rem;--cds-heading-06-font-weight:300;--cds-heading-06-line-height:1.199;--cds-heading-06-letter-spacing:0;--cds-heading-07-font-size:3.375rem;--cds-heading-07-font-weight:300;--cds-heading-07-line-height:1.199;--cds-heading-07-letter-spacing:0;--cds-fluid-heading-03-font-size:1.25rem;--cds-fluid-heading-03-font-weight:400;--cds-fluid-heading-03-line-height:1.4;--cds-fluid-heading-03-letter-spacing:0;--cds-fluid-heading-04-font-size:1.75rem;--cds-fluid-heading-04-font-weight:400;--cds-fluid-heading-04-line-height:1.28572;--cds-fluid-heading-04-letter-spacing:0;--cds-fluid-heading-05-font-size:2rem;--cds-fluid-heading-05-font-weight:300;--cds-fluid-heading-05-line-height:1.25;--cds-fluid-heading-05-letter-spacing:0;--cds-fluid-heading-06-font-size:2rem;--cds-fluid-heading-06-font-weight:600;--cds-fluid-heading-06-line-height:1.25;--cds-fluid-heading-06-letter-spacing:0;--cds-fluid-paragraph-01-font-size:1.5rem;--cds-fluid-paragraph-01-font-weight:300;--cds-fluid-paragraph-01-line-height:1.334;--cds-fluid-paragraph-01-letter-spacing:0;--cds-fluid-quotation-01-font-family:'IBM Plex Serif','Georgia',Times,serif;--cds-fluid-quotation-01-font-size:1.25rem;--cds-fluid-quotation-01-font-weight:400;--cds-fluid-quotation-01-line-height:1.3;--cds-fluid-quotation-01-letter-spacing:0;--cds-fluid-quotation-02-font-family:'IBM Plex Serif','Georgia',Times,serif;--cds-fluid-quotation-02-font-size:2rem;--cds-fluid-quotation-02-font-weight:300;--cds-fluid-quotation-02-line-height:1.25;--cds-fluid-quotation-02-letter-spacing:0;--cds-fluid-display-01-font-size:2.625rem;--cds-fluid-display-01-font-weight:300;--cds-fluid-display-01-line-height:1.19;--cds-fluid-display-01-letter-spacing:0;--cds-fluid-display-02-font-size:2.625rem;--cds-fluid-display-02-font-weight:600;--cds-fluid-display-02-line-height:1.19;--cds-fluid-display-02-letter-spacing:0;--cds-fluid-display-03-font-size:2.625rem;--cds-fluid-display-03-font-weight:300;--cds-fluid-display-03-line-height:1.19;--cds-fluid-display-03-letter-spacing:0;--cds-fluid-display-04-font-size:2.625rem;--cds-fluid-display-04-font-weight:300;--cds-fluid-display-04-line-height:1.19;--cds-fluid-display-04-letter-spacing:0;--cds-spacing-01:.125rem;--cds-spacing-02:.25rem;--cds-spacing-03:.5rem;--cds-spacing-04:.75rem;--cds-spacing-05:1rem;--cds-spacing-06:1.5rem;--cds-spacing-07:2rem;--cds-spacing-08:2.5rem;--cds-spacing-09:3rem;--cds-spacing-10:4rem;--cds-spacing-11:5rem;--cds-spacing-12:6rem;--cds-spacing-13:10rem;--cds-fluid-spacing-01:0;--cds-fluid-spacing-02:2vw;--cds-fluid-spacing-03:5vw;--cds-fluid-spacing-04:10vw;--cds-layout-01:1rem;--cds-layout-02:1.5rem;--cds-layout-03:2rem;--cds-layout-04:3rem;--cds-layout-05:4rem;--cds-layout-06:6rem;--cds-layout-07:10rem;--cds-container-01:1.5rem;--cds-container-02:2rem;--cds-container-03:2.5rem;--cds-container-04:3rem;--cds-container-05:4rem;--cds-size-xsmall:1.5rem;--cds-size-small:2rem;--cds-size-medium:2.5rem;--cds-size-large:3rem;--cds-size-xlarge:4rem;--cds-size-2XLarge:5rem;--cds-icon-size-01:1rem;--cds-icon-size-02:1.25rem}:host{--header-height:3.5rem;--header-content-max-width:none;--cool-gray-10:#f2f4f8;--cool-gray-20:#dde1e6;--cool-gray-30:#c1c7cd;--cool-gray-60:#697077;--cool-gray-80:#343a3f;--purple-70:#6929c4;--sidenav-item-height:3.5rem;--sidenav-item-height-short:2.8rem;--box-shadow:rgb(0 0 0 / 10%) 0 2px 3px 0;display:block;font-family:'IBM Plex Sans','Helvetica Neue',Arial,sans-serif}:host(qiskit-ui-shell){margin-top:var(--header-height)}bx-header ~ bx-side-nav{height:calc(100% - var(--header-height));margin-top:var(--header-height)}bx-header{display:flex;justify-content:space-between;height:var(--header-height);border-color:var(--cds-border-subtle);background-color:var(--cds-ui-background);color:var(--cds-text-secondary)}bx-header svg.menu__account__icon{display:block;overflow:hidden;box-sizing:border-box;width:2rem;height:2rem;border:.125rem solid var(--cds-icon-on-color);border-radius:50%;fill:var(--cds-icon-on-color)}bx-header svg{width:100%;height:auto}bx-header .qiskit-header-content{display:flex;justify-content:space-between;width:100%;max-width:var(--header-content-max-width);margin-right:auto;margin-left:auto}bx-header-name::part(link){width:8.75rem;height:calc(var(--header-height) - 1px);fill:var(--cool-gray-80)}bx-header-nav{height:calc(var(--header-height) - 1px)}bx-header-nav::before,bx-header-nav::part(divider){display:none}bx-header-nav-item.qiskit-user-account-icon::part(link),bx-header-nav-item.qiskit-user-account-icon::part(link):focus,bx-header-nav-item.qiskit-user-account-icon::part(link):hover{background-color:var(--purple-70);color:var(--cds-ui-background)}bx-header-nav-item::part(link),bx-header-menu-item::part(link),qiskit-header-menu::part(trigger),qiskit-header-menu-mega::part(trigger){font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0;background:var(--cds-ui-background);color:var(--cds-text-secondary)}bx-header-nav-item::part(link):active,bx-header-nav-item::part(link):focus,bx-header-nav-item::part(link):hover,bx-header-menu-item::part(link):active,bx-header-menu-item::part(link):focus,bx-header-menu-item::part(link):hover,qiskit-header-menu::part(trigger):active,qiskit-header-menu::part(trigger):focus,qiskit-header-menu::part(trigger):hover,qiskit-header-menu-mega::part(trigger):active,qiskit-header-menu-mega::part(trigger):focus,qiskit-header-menu-mega::part(trigger):hover{background-color:var(--cds-ui-background);color:var(--cds-text-secondary)}bx-header-nav-item::part(link):hover,bx-header-menu-item::part(link):hover,qiskit-header-menu::part(trigger):hover,qiskit-header-menu-mega::part(trigger):hover{text-decoration:underline}bx-header-nav-item::part(link):focus,bx-header-menu-item::part(link):focus,qiskit-header-menu::part(trigger):focus,qiskit-header-menu-mega::part(trigger):focus{border-color:var(--cds-border-subtle)}:host(qiskit-header-menu)::part(trigger-icon){fill:var(--cds-text-secondary) !important}:host(qiskit-header-menu)::part(menu-body){box-shadow:var(--box-shadow)}:host(qiskit-header-menu) .bx--header__menu-title{background-color:var(--cds-ui-background);color:var(--cds-text-secondary)}:host(qiskit-header-menu) .bx--header__menu-title[aria-expanded=true]{background-color:var(--cool-gray-10)}bx-header-menu-item{height:3rem;background-color:var(--cds-ui-01);color:var(--cds-text-secondary)}bx-header-menu-item::part(link),bx-header-menu-item::part(link):focus,bx-header-menu-item::part(link):hover{background-color:var(--cool-gray-10)}:host(qiskit-header-menu-mega)::part(trigger-icon){fill:var(--cds-text-secondary) !important}:host(qiskit-header-menu-mega) .bx--header__menu-title{color:var(--cds-text-secondary)}:host(qiskit-header-menu-mega) .bx--header__menu-title[aria-expanded=true]{background-color:var(--cool-gray-10)}:host(qiskit-header-menu-mega) .bx--header__menu-title[aria-expanded=true]+.bx--header__menu{position:fixed;top:var(--header-height);bottom:auto;left:0;display:grid;grid-template-columns:repeat(6,1fr);width:100vw;height:auto;padding:var(--cds-spacing-05) var(--cds-spacing-03);background-color:var(--cool-gray-10);box-shadow:var(--box-shadow);transform:translateZ(0)}:host(qiskit-header-menu-item-mega){padding:0 var(--cds-spacing-04)}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-heading{font-size:1rem;font-weight:600;line-height:1.375;letter-spacing:0;margin-bottom:var(--cds-spacing-04);color:var(--cds-text-primary)}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-list{font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-list li{margin-bottom:var(--cds-spacing-03)}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-list a{color:var(--cds-text-primary);text-decoration:none}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-list a:hover{text-decoration:underline}:host(qiskit-header-menu-item-mega) .qiskit-header-menu-item-mega-list a:focus{outline:2px solid var(--cds-border-subtle)}:host(qiskit-header-menu-button) .bx--header__menu-toggle,:host(qiskit-header-menu-button) .bx--header__menu-trigger{width:var(--header-height);height:var(--header-height);border:0}:host(qiskit-header-menu-button) .bx--header__menu-toggle>svg,:host(qiskit-header-menu-button) .bx--header__menu-trigger>svg{fill:var(--cds-text-secondary)}:host(qiskit-header-menu-button) .bx--header__menu-toggle:focus,:host(qiskit-header-menu-button) .bx--header__menu-toggle:active,:host(qiskit-header-menu-button) .bx--header__menu-toggle:hover,:host(qiskit-header-menu-button) .bx--header__menu-trigger:focus,:host(qiskit-header-menu-button) .bx--header__menu-trigger:active,:host(qiskit-header-menu-button) .bx--header__menu-trigger:hover{background-color:var(--cds-ui-01)}bx-side-nav{right:0;left:auto;box-shadow:0 .5rem .5rem rgba(0,0,0,0.25)}@media(max-width:41.98rem){bx-side-nav[expanded]{width:100%;max-width:none}}bx-side-nav svg.menu__account__icon{display:block;overflow:hidden;box-sizing:border-box;width:2rem;height:2rem;margin-right:var(--cds-spacing-03);border:.125rem solid var(--purple-70);border-radius:50%;fill:var(--purple-70)}bx-side-nav bx-side-nav-divider{margin-top:-1px;margin-bottom:-1px}bx-side-nav bx-side-nav-items{overflow-y:scroll;padding:0}bx-side-nav-link.qiskit-user-account-icon::part(link):hover,bx-side-nav-link.qiskit-user-account-icon::part(link){height:3rem;text-decoration-color:var(--purple-70)}bx-side-nav-link.qiskit-user-account-icon::part(title){display:flex;align-items:center;color:var(--purple-70)}bx-side-nav-link::part(link){min-height:var(--sidenav-item-height)}bx-side-nav-link::part(link):hover{text-decoration:underline;text-decoration-color:var(--cds-text-secondary)}bx-side-nav-link::part(link):focus{outline-color:var(--cds-border-subtle)}bx-side-nav-link::part(title){font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0}bx-side-nav-menu::part(expando){font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0;min-height:var(--sidenav-item-height)}bx-side-nav-menu::part(expando):hover{background-color:transparent;text-decoration:underline;text-decoration-color:var(--cds-text-secondary)}bx-side-nav-menu::part(expando):focus{outline-color:var(--cds-border-subtle)}bx-side-nav-menu[expanded]:not(.qiskit-side-nav-submenu)::part(title){font-weight:500}bx-side-nav-menu.qiskit-side-nav-submenu::part(expando){min-height:var(--sidenav-item-height-short);background-color:var(--cool-gray-10)}bx-side-nav-menu-item::part(link){min-height:var(--sidenav-item-height-short) !important}bx-side-nav-menu-item::part(link):hover{text-decoration:underline;text-decoration-color:var(--cds-text-secondary)}bx-side-nav-menu-item::part(link):focus{outline-color:var(--cds-border-subtle)}bx-side-nav-menu-item::part(title){font-size:1rem;font-weight:400;line-height:1.5;letter-spacing:0}bx-side-nav-menu-item.qiskit-nav-menu-item::part(link){background-color:var(--cool-gray-10) !important}bx-side-nav-menu-item.qiskit-nav-submenu-item{position:relative}bx-side-nav-menu-item.qiskit-nav-submenu-item::part(link){background-color:var(--cool-gray-20) !important}bx-side-nav-menu-item.qiskit-nav-submenu-item::part(link):focus{outline-color:var(--cool-gray-30)}bx-side-nav-menu-item.qiskit-nav-submenu-item::after{content:"";position:absolute;right:var(--cds-spacing-07);left:var(--cds-spacing-07);z-index:1;height:1px;background-color:var(--cool-gray-30)}bx-side-nav-menu-item.qiskit-nav-submenu-item:first-of-type{border-top:1px solid var(--cool-gray-30)}bx-side-nav-menu-item.qiskit-nav-submenu-item:last-of-type{border-bottom:1px solid var(--cool-gray-30)}@media(min-width:42rem){.qiskit-side-nav-footer{display:none}}.qiskit-side-nav-footer__social-container{margin:var(--cds-spacing-03) var(--cds-spacing-05)}.qiskit-side-nav-footer__social-icons{display:grid;grid-template-rows:1fr 1fr;grid-template-columns:25px 25px;grid-gap:var(--cds-spacing-02) var(--cds-spacing-05)}.qiskit-side-nav-footer__social-icons__icon{color:var(--cool-gray-60)}.qiskit-side-nav-footer__social-heading{font-size:.875rem;font-weight:600;line-height:1.29;letter-spacing:.16px;margin-bottom:var(--cds-spacing-04);color:var(--cool-gray-60)}.qiskit-side-nav-footer__copyright{font-size:.75rem;font-weight:400;line-height:1.34;letter-spacing:.32px;padding:var(--cds-spacing-05);background-color:var(--cool-gray-10)}`;let Fi=class extends zi{};Fi.styles=[Di],Fi=t([ne("qiskit-header-menu")],Fi);let Xi=class extends ji{};Xi.styles=[Di],Xi=t([ne("qiskit-header-menu-button")],Xi);let Wi=class extends zi{};Wi.styles=[Di],Wi=t([ne("qiskit-header-menu-mega")],Wi);let Gi=class extends te{constructor(){super(...arguments),this.item={},this.parentLabel="",this._handleClick=e=>{this.dispatchEvent(new CustomEvent("on-click",{detail:{label:`${this.parentLabel}-${e.label}`,url:e.url},bubbles:!0,composed:!0}))}}render(){var e,t,i;return R` +
+

${null===(e=this.item)||void 0===e?void 0:e.label}

+
    + ${null===(i=null===(t=this.item)||void 0===t?void 0:t.children)||void 0===i?void 0:i.map((e=>R`
  • + + ${e.label} + +
  • `))} +
+
+ `}};Gi.styles=[Di],t([ae({type:Object}),i("design:type",Object)],Gi.prototype,"item",void 0),t([ae({type:String}),i("design:type",Object)],Gi.prototype,"parentLabel",void 0),Gi=t([ne("qiskit-header-menu-item-mega")],Gi);const Yi=R` + +`,Qi=R` + +`,Ji=R` + +`,Zi=R` + +`;var Ki;!function(e){e.DEFAULT="",e.HIDE_ACCOUNT="hide-account"}(Ki||(Ki={}));const en=[{icon:Ji,label:"Twitter",url:"https://twitter.com/Qiskit"},{icon:Qi,label:"Slack",url:"https://qisk.it/join-slack"},{icon:Zi,label:"YouTube",url:"https://youtube.com/Qiskit"},{icon:Yi,label:"Medium",url:"https://medium.com/Qiskit"}],tn=[{label:"Documentation",children:[{label:"Home",url:"https://qiskit.org/documentation/"},{label:"Installation",url:"https://qiskit.org/documentation/getting_started.html"},{label:"Tutorials",url:"https://qiskit.org/documentation/tutorials.html"},{label:"API Reference",url:"https://qiskit.org/documentation/apidoc/index.html"},{label:"Contribute",url:"https://qiskit.org/documentation/contributing_to_qiskit.html"}]},{label:"Providers",url:"https://qiskit.org/providers/"},{label:"Community",children:[{label:"Events",url:"https://qiskit.org/events/"},{label:"Advocates",url:"https://qiskit.org/advocates/"},{label:"Ecosystem",url:"https://qiskit.org/ecosystem/"}]},{label:"Learn",url:"https://qiskit.org/learn/"}],nn=R` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`,sn=R` + +`,an="https://qiskit.org"===window.origin?"https://learn.qiskit.org":window.origin;e.QiskitUIShell=class extends te{constructor(){super(...arguments),this.variant=Ki.DEFAULT,this._NAV_ITEMS=tn,this._SOCIAL_LINKS=en,this._handleClick=(e,t)=>{const i=t?`${t}-${e.label}`:e.label;this.dispatchEvent(new CustomEvent("on-click",{detail:{label:i,url:e.url},bubbles:!0,composed:!0}))}}render(){return R` + +
+ + ${nn} + + + ${this._getHeaderItems()} + ${this.variant===Ki.HIDE_ACCOUNT?null:this._getAccountHeaderNavItem()} + + + +
+
+ + + + ${this._getSideNavItems()} + ${this.variant===Ki.HIDE_ACCOUNT?null:this._getAccountSideNavLink()} + + + + `}_getHeaderItems(){return this._NAV_ITEMS.map((e=>e.children?this._getHeaderMenu(e):this._getHeaderNavItem(e)))}_getHeaderNavItem(e){return R` + + ${null==e?void 0:e.label} + + `}_getHeaderMenu(e){var t;return R` + + ${null===(t=null==e?void 0:e.children)||void 0===t?void 0:t.map((t=>this._getHeaderMenuItem(t,null==e?void 0:e.label)))} + + `}_getHeaderMenuItem(e,t){return R` + + ${null==e?void 0:e.label} + + `}_getAccountHeaderNavItem(){return R` + + `}_getSideNavItems(){return this._NAV_ITEMS.map((e=>(null==e?void 0:e.children)?this._getSideNavMenu(e):this._getSideNavLink(e)))}_getSideNavLink(e){return R` + + ${null==e?void 0:e.label} + + + `}_getSideNavMenu(e){var t;return R` + + ${null===(t=null==e?void 0:e.children)||void 0===t?void 0:t.map((t=>this._getSideNavMenuItem(t,null==e?void 0:e.label)))} + + + `}_getSideNavMenuItem(e,t,i=!1){const n=i?"qiskit-nav-submenu-item":"qiskit-nav-menu-item";return R` + + ${null==e?void 0:e.label} + + `}_getAccountSideNavLink(){return R` + + `}_getSocialLinks(){return this._SOCIAL_LINKS.map((e=>R` + + `))}},e.QiskitUIShell.styles=[Di],t([ae({type:String}),i("design:type",String)],e.QiskitUIShell.prototype,"variant",void 0),e.QiskitUIShell=t([ne("qiskit-ui-shell")],e.QiskitUIShell)}({}); diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/parasite-logo.png b/_static/parasite-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6098e06c47150fa0416b6e8d8291e769e69e69f1 GIT binary patch literal 73044 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 literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..2e26d8e --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,249 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #008800; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #AA22FF; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #008800; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #008800; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #008800 } /* Comment.Preproc */ +.highlight .cpf { color: #008800; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #008800; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #008800; font-weight: bold } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #AA22FF; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #AA22FF; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #AA22FF; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #AA22FF } /* Keyword.Pseudo */ +.highlight .kr { color: #AA22FF; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #00BB00; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BB4444 } /* Literal.String */ +.highlight .na { color: #BB4444 } /* Name.Attribute */ +.highlight .nb { color: #AA22FF } /* Name.Builtin */ +.highlight .nc { color: #0000FF } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #00A000 } /* Name.Function */ +.highlight .nl { color: #A0A000 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #B8860B } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BB4444 } /* Literal.String.Affix */ +.highlight .sb { color: #BB4444 } /* Literal.String.Backtick */ +.highlight .sc { color: #BB4444 } /* Literal.String.Char */ +.highlight .dl { color: #BB4444 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BB4444; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BB4444 } /* Literal.String.Double */ +.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BB4444 } /* Literal.String.Heredoc */ +.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.highlight .s1 { color: #BB4444 } /* Literal.String.Single */ +.highlight .ss { color: #B8860B } /* Literal.String.Symbol */ +.highlight .bp { color: #AA22FF } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #00A000 } /* Name.Function.Magic */ +.highlight .vc { color: #B8860B } /* Name.Variable.Class */ +.highlight .vg { color: #B8860B } /* Name.Variable.Global */ +.highlight .vi { color: #B8860B } /* Name.Variable.Instance */ +.highlight .vm { color: #B8860B } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #ffffcc } +body[data-theme="dark"] .highlight { background: #282C34; color: #ABB2BF } +body[data-theme="dark"] .highlight .c { color: #7F848E } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #ABB2BF } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #ABB2BF } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #ABB2BF } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #C678DD } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #ABB2BF } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #E06C75 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #56B6C2 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #ABB2BF } /* Other */ +body[data-theme="dark"] .highlight .p { color: #ABB2BF } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #7F848E } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #7F848E } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #7F848E } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #7F848E } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #7F848E } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #7F848E } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #ABB2BF } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #ABB2BF } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #ABB2BF } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #ABB2BF } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #ABB2BF } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #ABB2BF } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #ABB2BF } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #ABB2BF } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #ABB2BF } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #ABB2BF } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #ABB2BF } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #E5C07B } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #C678DD } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #C678DD } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #C678DD } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #C678DD } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #E5C07B } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #ABB2BF } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #D19A66 } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #98C379 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #E06C75 } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #E5C07B } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #E5C07B } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #E06C75 } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #61AFEF } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #E06C75 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #E06C75 } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #61AFEF; font-weight: bold } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #E06C75 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #E06C75 } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #E06C75 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #E06C75 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #E06C75 } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #E06C75 } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #56B6C2 } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #ABB2BF } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #ABB2BF } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #D19A66 } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #D19A66 } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #D19A66 } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #D19A66 } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #D19A66 } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #98C379 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #98C379 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #98C379 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #98C379 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #98C379 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #98C379 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #98C379 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #98C379 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #98C379 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #98C379 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #98C379 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #98C379 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #98C379 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #E5C07B } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #E06C75 } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #E06C75 } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #E06C75 } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #E06C75 } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #D19A66 } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #ffffcc } +body:not([data-theme="light"]) .highlight { background: #282C34; color: #ABB2BF } +body:not([data-theme="light"]) .highlight .c { color: #7F848E } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #ABB2BF } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #ABB2BF } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #ABB2BF } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #C678DD } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #ABB2BF } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #E06C75 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #56B6C2 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #ABB2BF } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #ABB2BF } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #7F848E } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #7F848E } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #7F848E } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #7F848E } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #7F848E } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #7F848E } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #ABB2BF } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #ABB2BF } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #ABB2BF } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #ABB2BF } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #ABB2BF } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #ABB2BF } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #ABB2BF } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #ABB2BF } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #ABB2BF } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #ABB2BF } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #ABB2BF } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #E5C07B } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #C678DD } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #C678DD } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #C678DD } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #C678DD } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #E5C07B } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #ABB2BF } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #D19A66 } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #98C379 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #E06C75 } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #E5C07B } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #E5C07B } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #E06C75 } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #61AFEF } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #E06C75 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #E06C75 } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #61AFEF; font-weight: bold } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #E06C75 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #E06C75 } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #E06C75 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #E06C75 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #E06C75 } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #E06C75 } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #56B6C2 } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #ABB2BF } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #ABB2BF } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #D19A66 } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #D19A66 } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #D19A66 } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #D19A66 } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #D19A66 } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #98C379 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #98C379 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #98C379 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #98C379 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #98C379 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #98C379 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #98C379 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #98C379 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #98C379 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #98C379 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #98C379 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #98C379 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #98C379 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #E5C07B } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #E06C75 } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #E06C75 } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #E06C75 } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #E06C75 } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #D19A66 } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/_static/scripts/furo-extensions.js b/_static/scripts/furo-extensions.js new file mode 100644 index 0000000..e69de29 diff --git a/_static/scripts/furo.js b/_static/scripts/furo.js new file mode 100644 index 0000000..32e7c05 --- /dev/null +++ b/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={212:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(212),e=n.n(t),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;const s=64;function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function a(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",l)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),a()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/_static/scripts/furo.js.LICENSE.txt b/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 0000000..1632189 --- /dev/null +++ b/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/_static/scripts/furo.js.map b/_static/scripts/furo.js.map new file mode 100644 index 0000000..4705302 --- /dev/null +++ b/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 0.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/_static/scripts/qiskit-sphinx-theme.js b/_static/scripts/qiskit-sphinx-theme.js new file mode 100644 index 0000000..c047a7a --- /dev/null +++ b/_static/scripts/qiskit-sphinx-theme.js @@ -0,0 +1,3 @@ +/*! For license information please see qiskit-sphinx-theme.js.LICENSE.txt */ +(()=>{var e={729:function(e,t,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(e){"use strict";var t={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(e,t,n){if(n.settings.events){var o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t.dispatchEvent(o)}},o=function(e){var t=0;if(e.offsetParent)for(;e;)t+=e.offsetTop,e=e.offsetParent;return t>=0?t:0},r=function(e){e&&e.sort((function(e,t){return o(e.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(e,t){var n=e[e.length-1];if(function(e,t){return!(!s()||!c(e.content,t,!0))}(n,t))return n;for(var o=e.length-1;o>=0;o--)if(c(e[o].content,t))return e[o]},i=function(e,t){if(t.nested&&e.parentNode){var n=e.parentNode.closest("li");n&&(n.classList.remove(t.nestedClass),i(n,t))}},a=function(e,t){if(e){var o=e.nav.closest("li");o&&(o.classList.remove(t.navClass),e.content.classList.remove(t.contentClass),i(o,t),n("gumshoeDeactivate",o,{link:e.nav,content:e.content,settings:t}))}},u=function(e,t){if(t.nested){var n=e.parentNode.closest("li");n&&(n.classList.add(t.nestedClass),u(n,t))}};return function(o,c){var s,i,d,f,m,v={setup:function(){s=document.querySelectorAll(o),i=[],Array.prototype.forEach.call(s,(function(e){var t=document.getElementById(decodeURIComponent(e.hash.substr(1)));t&&i.push({nav:e,content:t})})),r(i)},detect:function(){var e=l(i,m);e?d&&e.content===d.content||(a(d,m),function(e,t){if(e){var o=e.nav.closest("li");o&&(o.classList.add(t.navClass),e.content.classList.add(t.contentClass),u(o,t),n("gumshoeActivate",o,{link:e.nav,content:e.content,settings:t}))}}(e,m),d=e):d&&(a(d,m),d=null)}},h=function(t){f&&e.cancelAnimationFrame(f),f=e.requestAnimationFrame(v.detect)},g=function(t){f&&e.cancelAnimationFrame(f),f=e.requestAnimationFrame((function(){r(i),v.detect()}))};return v.destroy=function(){d&&a(d,m),e.removeEventListener("scroll",h,!1),m.reflow&&e.removeEventListener("resize",g,!1),i=null,s=null,d=null,f=null,m=null},m=function(){var e={};return Array.prototype.forEach.call(arguments,(function(t){for(var n in t){if(!t.hasOwnProperty(n))return;e[n]=t[n]}})),e}(t,c||{}),v.setup(),v.detect(),e.addEventListener("scroll",h,!1),m.reflow&&e.addEventListener("resize",g,!1),v}}(r)}.apply(t,[]),void 0===o||(e.exports=o)}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var c=t[o]={exports:{}};return e[o].call(c.exports,c,c.exports,n),c.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(729),t=n.n(e),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;const s=64;function l(){const e=localStorage.getItem("theme")||"auto";var t;"light"!==(t=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===e?"light":"light"==e?"dark":"auto":"auto"===e?"dark":"dark"==e?"light":"auto")&&"dark"!==t&&"auto"!==t&&(console.error(`Got invalid theme mode: ${t}. Resetting to auto.`),t="auto"),document.body.dataset.theme=t,localStorage.setItem("theme",t),console.log(`Changed to ${t} mode.`)}function i(){!function(){const e=document.getElementsByClassName("theme-toggle");Array.from(e).forEach((e=>{e.addEventListener("click",l)}))}(),function(){let e=0,t=!1;window.addEventListener("scroll",(function(n){e=window.scrollY,t||(window.requestAnimationFrame((function(){var n;n=e,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(e){ec&&document.documentElement.classList.remove("show-back-to-top"),c=e}(n),function(e){null!==o&&(0==e?o.scrollTo(0,0):Math.ceil(e)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),t=!1})),t=!0)})),window.scroll()}(),null!==o&&new(t())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let e=parseFloat(getComputedStyle(document.documentElement).fontSize);const t=document.querySelector("qiskit-ui-shell"),n=t&&"none"!==getComputedStyle(t).display?3.5*e:0;return r.getBoundingClientRect().height+.5*e+1+n}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),i()}))})()})(); +//# sourceMappingURL=qiskit-sphinx-theme.js.map \ No newline at end of file diff --git a/_static/scripts/qiskit-sphinx-theme.js.LICENSE.txt b/_static/scripts/qiskit-sphinx-theme.js.LICENSE.txt new file mode 100644 index 0000000..bbd6389 --- /dev/null +++ b/_static/scripts/qiskit-sphinx-theme.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ + +/*! This file is vendored from Furo (created by Pradyun Gedam) and used under the MIT license. */ diff --git a/_static/scripts/qiskit-sphinx-theme.js.map b/_static/scripts/qiskit-sphinx-theme.js.map new file mode 100644 index 0000000..f996431 --- /dev/null +++ b/_static/scripts/qiskit-sphinx-theme.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/qiskit-sphinx-theme.js","mappings":";iCAAA,MASWA,SAWS,IAAX,EAAAC,EACH,EAAAA,EACkB,oBAAXC,OACPA,OACAC,KAbS,EAAF,WACP,OAaJ,SAAUD,GACR,aAMA,IAAIE,EAAW,CAEbC,SAAU,SACVC,aAAc,SAGdC,QAAQ,EACRC,YAAa,SAGbC,OAAQ,EACRC,QAAQ,EAGRC,QAAQ,GA6BNC,EAAY,SAAUC,EAAMC,EAAMC,GAEpC,GAAKA,EAAOC,SAASL,OAArB,CAGA,IAAIM,EAAQ,IAAIC,YAAYL,EAAM,CAChCM,SAAS,EACTC,YAAY,EACZL,OAAQA,IAIVD,EAAKO,cAAcJ,EAVgB,CAWrC,EAOIK,EAAe,SAAUR,GAC3B,IAAIS,EAAW,EACf,GAAIT,EAAKU,aACP,KAAOV,GACLS,GAAYT,EAAKW,UACjBX,EAAOA,EAAKU,aAGhB,OAAOD,GAAY,EAAIA,EAAW,CACpC,EAMIG,EAAe,SAAUC,GACvBA,GACFA,EAASC,MAAK,SAAUC,EAAOC,GAG7B,OAFcR,EAAaO,EAAME,SACnBT,EAAaQ,EAAMC,UACF,EACxB,CACT,GAEJ,EAwCIC,EAAW,SAAUlB,EAAME,EAAUiB,GACvC,IAAIC,EAASpB,EAAKqB,wBACd1B,EAnCU,SAAUO,GAExB,MAA+B,mBAApBA,EAASP,OACX2B,WAAWpB,EAASP,UAItB2B,WAAWpB,EAASP,OAC7B,CA2Be4B,CAAUrB,GACvB,OAAIiB,EAEAK,SAASJ,EAAOD,OAAQ,KACvB/B,EAAOqC,aAAeC,SAASC,gBAAgBC,cAG7CJ,SAASJ,EAAOS,IAAK,KAAOlC,CACrC,EAMImC,EAAa,WACf,OACEC,KAAKC,KAAK5C,EAAOqC,YAAcrC,EAAO6C,cAnCjCF,KAAKG,IACVR,SAASS,KAAKC,aACdV,SAASC,gBAAgBS,aACzBV,SAASS,KAAKE,aACdX,SAASC,gBAAgBU,aACzBX,SAASS,KAAKP,aACdF,SAASC,gBAAgBC,aAkC7B,EAmBIU,EAAY,SAAUzB,EAAUX,GAClC,IAAIqC,EAAO1B,EAASA,EAAS2B,OAAS,GACtC,GAbgB,SAAUC,EAAMvC,GAChC,SAAI4B,MAAgBZ,EAASuB,EAAKxB,QAASf,GAAU,GAEvD,CAUMwC,CAAYH,EAAMrC,GAAW,OAAOqC,EACxC,IAAK,IAAII,EAAI9B,EAAS2B,OAAS,EAAGG,GAAK,EAAGA,IACxC,GAAIzB,EAASL,EAAS8B,GAAG1B,QAASf,GAAW,OAAOW,EAAS8B,EAEjE,EAOIC,EAAmB,SAAUC,EAAK3C,GAEpC,GAAKA,EAAST,QAAWoD,EAAIC,WAA7B,CAGA,IAAIC,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASR,aAG7BkD,EAAiBG,EAAI7C,GAV0B,CAWjD,EAOIiD,EAAa,SAAUC,EAAOlD,GAEhC,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASX,UAC7B6D,EAAMnC,QAAQgC,UAAUC,OAAOhD,EAASV,cAGxCoD,EAAiBG,EAAI7C,GAGrBJ,EAAU,oBAAqBiD,EAAI,CACjCM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,EAOIoD,EAAiB,SAAUT,EAAK3C,GAElC,GAAKA,EAAST,OAAd,CAGA,IAAIsD,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASR,aAG1B4D,EAAeP,EAAI7C,GAVS,CAW9B,EA6LA,OA1JkB,SAAUsD,EAAUC,GAKpC,IACIC,EAAU7C,EAAU8C,EAASC,EAAS1D,EADtC2D,EAAa,CAUjBA,MAAmB,WAEjBH,EAAWhC,SAASoC,iBAAiBN,GAGrC3C,EAAW,GAGXkD,MAAMC,UAAUC,QAAQC,KAAKR,GAAU,SAAUjB,GAE/C,IAAIxB,EAAUS,SAASyC,eACrBC,mBAAmB3B,EAAK4B,KAAKC,OAAO,KAEjCrD,GAGLJ,EAAS0D,KAAK,CACZ1B,IAAKJ,EACLxB,QAASA,GAEb,IAGAL,EAAaC,EACf,EAKAgD,OAAoB,WAElB,IAAIW,EAASlC,EAAUzB,EAAUX,GAG5BsE,EASDb,GAAWa,EAAOvD,UAAY0C,EAAQ1C,UAG1CkC,EAAWQ,EAASzD,GAzFT,SAAUkD,EAAOlD,GAE9B,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASX,UAC1B6D,EAAMnC,QAAQgC,UAAUM,IAAIrD,EAASV,cAGrC8D,EAAeP,EAAI7C,GAGnBJ,EAAU,kBAAmBiD,EAAI,CAC/BM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,CAqEIuE,CAASD,EAAQtE,GAGjByD,EAAUa,GAfJb,IACFR,EAAWQ,EAASzD,GACpByD,EAAU,KAchB,GAMIe,EAAgB,SAAUvE,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,sBAAsBf,EAAWgB,OACpD,EAMIC,EAAgB,SAAU3E,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,uBAAsB,WACrChE,EAAaC,GACbgD,EAAWgB,QACb,GACF,EAkDA,OA7CAhB,EAAWkB,QAAU,WAEfpB,GACFR,EAAWQ,EAASzD,GAItBd,EAAO4F,oBAAoB,SAAUN,GAAe,GAChDxE,EAASN,QACXR,EAAO4F,oBAAoB,SAAUF,GAAe,GAItDjE,EAAW,KACX6C,EAAW,KACXC,EAAU,KACVC,EAAU,KACV1D,EAAW,IACb,EAOEA,EA3XS,WACX,IAAI+E,EAAS,CAAC,EAOd,OANAlB,MAAMC,UAAUC,QAAQC,KAAKgB,WAAW,SAAUC,GAChD,IAAK,IAAIC,KAAOD,EAAK,CACnB,IAAKA,EAAIE,eAAeD,GAAM,OAC9BH,EAAOG,GAAOD,EAAIC,EACpB,CACF,IACOH,CACT,CAkXeK,CAAOhG,EAAUmE,GAAW,CAAC,GAGxCI,EAAW0B,QAGX1B,EAAWgB,SAGXzF,EAAOoG,iBAAiB,SAAUd,GAAe,GAC7CxE,EAASN,QACXR,EAAOoG,iBAAiB,SAAUV,GAAe,GAS9CjB,CACT,CAOF,CArcW4B,CAAQvG,EAChB,UAFM,SAEN,uBCZDwG,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAU1B,KAAK8B,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CCrBAJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAInB,KAAOmB,EACXZ,EAAoBa,EAAED,EAAYnB,KAASO,EAAoBa,EAAET,EAASX,IAC5EqB,OAAOC,eAAeX,EAASX,EAAK,CAAEuB,YAAY,EAAMC,IAAKL,EAAWnB,IAE1E,ECNDO,EAAoBxG,EAAI,WACvB,GAA0B,iBAAf0H,WAAyB,OAAOA,WAC3C,IACC,OAAOxH,MAAQ,IAAIyH,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAX3H,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBuG,EAAoBa,EAAI,CAACrB,EAAK6B,IAAUP,OAAOzC,UAAUqB,eAAenB,KAAKiB,EAAK6B,4CCQ9EC,EAAY,KACZC,EAAS,KACTC,EAAgB/H,OAAO6C,aAAeP,SAASC,gBAAgByF,UACnE,MAAMC,EAAmB,GA2EzB,SAASC,IACP,MAAMC,EAAeC,aAAaC,QAAQ,UAAY,OAZxD,IAAkBC,EACH,WADGA,EAaItI,OAAOuI,WAAW,gCAAgCC,QAI/C,SAAjBL,EACO,QACgB,SAAhBA,EACA,OAEA,OAIU,SAAjBA,EACO,OACgB,QAAhBA,EACA,QAEA,SA9BoB,SAATG,GAA4B,SAATA,IACzCG,QAAQC,MAAM,2BAA2BJ,yBACzCA,EAAO,QAGThG,SAASS,KAAK4F,QAAQC,MAAQN,EAC9BF,aAAaS,QAAQ,QAASP,GAC9BG,QAAQK,IAAI,cAAcR,UA0B5B,CAyDA,SAASnC,KART,WAEE,MAAM4C,EAAUzG,SAAS0G,uBAAuB,gBAChDrE,MAAMsE,KAAKF,GAASlE,SAASqE,IAC3BA,EAAI9C,iBAAiB,QAAS8B,EAAe,GAEjD,CAGEiB,GArDF,WAEE,IAAIC,EAA6B,EAC7BC,GAAU,EAEdrJ,OAAOoG,iBAAiB,UAAU,SAAUuB,GAC1CyB,EAA6BpJ,OAAOsJ,QAE/BD,IACHrJ,OAAOwF,uBAAsB,WAzDnC,IAAuB+D,IA0DDH,EA9GkC,GAAlDzG,KAAK6G,MAAM1B,EAAO7F,wBAAwBQ,KAC5CqF,EAAOjE,UAAUM,IAAI,YAErB2D,EAAOjE,UAAUC,OAAO,YAI5B,SAAmCyF,GAC7BA,EAAYtB,EACd3F,SAASC,gBAAgBsB,UAAUC,OAAO,oBAEtCyF,EAAYxB,EACdzF,SAASC,gBAAgBsB,UAAUM,IAAI,oBAC9BoF,EAAYxB,GACrBzF,SAASC,gBAAgBsB,UAAUC,OAAO,oBAG9CiE,EAAgBwB,CAClB,CAoCEE,CAA0BF,GAlC5B,SAA6BA,GACT,OAAd1B,IAKa,GAAb0B,EACF1B,EAAU6B,SAAS,EAAG,GAGtB/G,KAAKC,KAAK2G,IACV5G,KAAK6G,MAAMlH,SAASC,gBAAgBS,aAAehD,OAAOqC,aAE1DwF,EAAU6B,SAAS,EAAG7B,EAAU7E,cAGhBV,SAASqH,cAAc,mBAc3C,CAKEC,CAAoBL,GAwDdF,GAAU,CACZ,IAEAA,GAAU,EAEd,IACArJ,OAAO6J,QACT,CAoCEC,GAjCkB,OAAdjC,GAKJ,IAAI,IAAJ,CAAY,cAAe,CACzBrH,QAAQ,EACRuJ,WAAW,EACX5J,SAAU,iBACVI,OAAQ,KACN,IAAIyJ,EAAM9H,WAAW+H,iBAAiB3H,SAASC,iBAAiB2H,UAGhE,MAAMC,EAAY7H,SAASqH,cAAc,mBACnCS,EAAmBD,GAAqD,SAAxCF,iBAAiBE,GAAWE,QAC9D,IAAML,EACN,EACJ,OAAOlC,EAAO7F,wBAAwBqI,OAAU,GAAMN,EAAO,EAAII,CAAe,GAkBtF,CAcA9H,SAAS8D,iBAAiB,oBAT1B,WACE9D,SAASS,KAAKW,WAAWG,UAAUC,OAAO,SAE1CgE,EAASxF,SAASqH,cAAc,UAChC9B,EAAYvF,SAASqH,cAAc,eAEnCxD,GACF","sources":["webpack://qiskit_sphinx_theme/./src/qiskit_sphinx_theme/assets/scripts/gumshoe-patched.js","webpack://qiskit_sphinx_theme/webpack/bootstrap","webpack://qiskit_sphinx_theme/webpack/runtime/compat get default export","webpack://qiskit_sphinx_theme/webpack/runtime/define property getters","webpack://qiskit_sphinx_theme/webpack/runtime/global","webpack://qiskit_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://qiskit_sphinx_theme/./src/qiskit_sphinx_theme/assets/scripts/qiskit-sphinx-theme.js"],"sourcesContent":["/*! This file is vendored from Furo (created by Pradyun Gedam) and used under the MIT license. */\n/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/*! This file is vendored from Furo (created by Pradyun Gedam) and used under the MIT license. */\n// When making changes, surround it with `QISKIT CHANGE: start` and `QISKIT CHANGE: end` comments.\n\nimport Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n // QISKIT CHANGE: start. Add 3.5rem for the Qiskit top nav bar, if visible.\n // See _top-nav-bar.scss for where the value comes from.\n const topNavBar = document.querySelector('qiskit-ui-shell');\n const topNavBarHeight = (topNavBar && getComputedStyle(topNavBar).display !== 'none')\n ? 3.5 * rem\n : 0;\n return header.getBoundingClientRect().height + (0.5 * rem) + 1 + topNavBarHeight;\n // QISKIT CHANGE: end.\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","topNavBar","topNavBarHeight","display","height"],"sourceRoot":""} \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..92da3f8 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/skeleton.css b/_static/skeleton.css new file mode 100644 index 0000000..467c878 --- /dev/null +++ b/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css new file mode 100644 index 0000000..bc447f2 --- /dev/null +++ b/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map new file mode 100644 index 0000000..9ba5637 --- /dev/null +++ b/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/styles/furo.css b/_static/styles/furo.css new file mode 100644 index 0000000..3d29a21 --- /dev/null +++ b/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#646776;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2962ff;--color-brand-content:#2a5adf;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link--hover:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link-underline--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto,body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link);text-decoration-color:var(--color-link-underline--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{background:var(--color-background-primary);color:var(--color-foreground-primary);height:100%}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1rem;vertical-align:middle;width:1rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1rem;width:1rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg{color:inherit;height:1rem;width:1rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{fill:currentColor;display:inline-block;height:1rem;width:1rem}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.25rem;width:1.25rem}:target{scroll-margin-top:var(--header-height)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:3.5rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}.versionmodified{font-style:italic}div.deprecated p,div.versionadded p,div.versionchanged p{margin-bottom:.125rem;margin-top:.125rem}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>p,div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23607D8B' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree .reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling.Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo.css.map b/_static/styles/furo.css.map new file mode 100644 index 0000000..1924b33 --- /dev/null +++ b/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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F,kBACA,CACE,wEACA,CARA,YACA,CAKF,mBAFF,MACE,CAIE,gBAJF,iCAJE,cAGJ,CANI,oBAEA,CAKF,SAIE,2BADA,UACA,kBAGF,sCACA,CAFF,WACE,WACA,mBACE,kDACA,0EACA,uDAKJ,aACE,mDAII,CAJJ,6CAII,4BACA,sCACE,kEACA,+CACE,aACA,WADA,+BACA,uEANN,YACE,mDAEE,mBADF,0CACE,CADF,qBACE,0DACA,YACE,4DACA,sEANN,YACE,8CACA,kBADA,UACA,2CACE,2EACA,cACE,kEACA,mEANN,yBACE,4DACA,sBACE,+EAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCrEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kEAGA,8CAEA,uDAKA,oCAEA,yDAEE,gEAKF,+CC5FA,0EAGE,CACA,qDCLJ,+DAIE,sCAIA,kEACE,yBACA,2FAMA,gBACA,yGCbF,mBAOA,2MAIA,4HAYA,0DACE,8GAYF,8HAQE,mBAEA,6HAOF,YAGA,mIAME,eACA,CAFF,YAEE,4FAMJ,8BAEE,uBAYA,sCAEE,CAJF,oBAEA,CARA,wCAEA,CAHA,8BACA,CAFA,eACA,CAGA,wCAEA,CAEA,mDAIE,kCACE,6BACA,4CAKJ,kDAIA,eACE,aAGF,8BACE,uDACA,sCACA,cAEA,+BACA,CA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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto\n display: block\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #646776; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2962ff;\n --color-brand-content: #2a5adf;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link-underline--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #ffffffcc; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2b8cee;\n --color-brand-content: #368ce2;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: 1rem\n width: 1rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1rem\n width: 1rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page svg\n color: inherit\n height: 1rem\n width: 1rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: var(--header-height)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 3.5rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\n.versionmodified\n font-style: italic\ndiv.versionadded, div.versionchanged, div.deprecated\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > p,\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 0.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(0.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(0.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the