Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-nethsm for openSUSE:Factory 
checked in at 2026-06-23 17:40:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-nethsm (Old)
 and      /work/SRC/openSUSE:Factory/.python-nethsm.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-nethsm"

Tue Jun 23 17:40:57 2026 rev:12 rq:1361253 version:2.1.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-nethsm/python-nethsm.changes      
2026-05-13 17:23:56.914765622 +0200
+++ /work/SRC/openSUSE:Factory/.python-nethsm.new.1956/python-nethsm.changes    
2026-06-23 17:43:47.796429079 +0200
@@ -1,0 +2,7 @@
+Tue Jun 23 05:10:39 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- update to 2.1.2:
+  * Changes
+    - Patch generated client to remove the python-dateutil dependency.
+
+-------------------------------------------------------------------

Old:
----
  nethsm-2.1.1.tar.gz

New:
----
  nethsm-2.1.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-nethsm.spec ++++++
--- /var/tmp/diff_new_pack.5Svep8/_old  2026-06-23 17:43:48.548455287 +0200
+++ /var/tmp/diff_new_pack.5Svep8/_new  2026-06-23 17:43:48.552455427 +0200
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-nethsm
-Version:        2.1.1
+Version:        2.1.2
 Release:        0
 Summary:        Python Library to manage NetHSM(s)
 License:        Apache-2.0
@@ -30,7 +30,6 @@
 # Runtime dependencies
 BuildRequires:  %{python_module certifi}
 BuildRequires:  %{python_module cryptography >= 41.0}
-BuildRequires:  %{python_module python-dateutil > 2 with 
%python-python-dateutil < 3}
 BuildRequires:  %{python_module typing_extensions >= 4.3.0 with 
%python-typing_extensions < 5}
 BuildRequires:  %{python_module urllib3 >= 2.0 with %python-urllib3 < 3}
 # SECTION test requirements
@@ -42,7 +41,6 @@
 BuildRequires:  fdupes
 Requires:       python-certifi
 Requires:       python-cryptography >= 41.0
-Requires:       (python-python-dateutil > 2 with python-python-dateutil < 3)
 Requires:       (python-typing_extensions >= 4.3.0 with 
python-typing_extensions < 5)
 Requires:       (python-urllib3 >= 2.0 with python-urllib3 < 3)
 BuildArch:      noarch

++++++ nethsm-2.1.1.tar.gz -> nethsm-2.1.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/.github/CODEOWNERS 
new/nethsm-sdk-py-2.1.2/.github/CODEOWNERS
--- old/nethsm-sdk-py-2.1.1/.github/CODEOWNERS  1970-01-01 01:00:00.000000000 
+0100
+++ new/nethsm-sdk-py-2.1.2/.github/CODEOWNERS  2026-06-22 17:49:14.000000000 
+0200
@@ -0,0 +1 @@
+* @Nitrokey/nethsm-reviewers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/.github/pull_request_template.md 
new/nethsm-sdk-py-2.1.2/.github/pull_request_template.md
--- old/nethsm-sdk-py-2.1.1/.github/pull_request_template.md    2026-05-12 
10:00:43.000000000 +0200
+++ new/nethsm-sdk-py-2.1.2/.github/pull_request_template.md    1970-01-01 
01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-<!-- (an executive summary of the changes, ideally in one sentence) -->
-This PR...
-
-## Changes
-<!-- (major technical changes list) -->
-
--
-
-## Checklist
-
-Make sure to run `make check` and `make fix` before creating a PR, otherwise 
the CI will fail.
-
-- [ ] tested with Python3.9
-- [ ] signed commits
-- [ ] updated documentation (e.g. parameter description, inline doc, 
docs.nitrokey)
-- [ ] added labels
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/CHANGELOG.md 
new/nethsm-sdk-py-2.1.2/CHANGELOG.md
--- old/nethsm-sdk-py-2.1.1/CHANGELOG.md        2026-05-12 10:00:43.000000000 
+0200
+++ new/nethsm-sdk-py-2.1.2/CHANGELOG.md        2026-06-22 17:49:14.000000000 
+0200
@@ -4,7 +4,15 @@
 
 -
 
-[All Changes](https://github.com/Nitrokey/nethsm-sdk-py/compare/v2.1.1...HEAD)
+[All Changes](https://github.com/Nitrokey/nethsm-sdk-py/compare/v2.1.2...HEAD)
+
+## [v2.1.2](https://github.com/Nitrokey/nethsm-sdk-py/releases/tag/v2.1.2) 
(2026-06-22)
+
+### Changes
+
+- Patch generated client to remove the `python-dateutil` dependency.
+
+[All 
Changes](https://github.com/Nitrokey/nethsm-sdk-py/compare/v2.1.1...v2.1.2)
 
 ## [v2.1.1](https://github.com/Nitrokey/nethsm-sdk-py/releases/tag/v2.1.1) 
(2026-05-11)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/Makefile 
new/nethsm-sdk-py-2.1.2/Makefile
--- old/nethsm-sdk-py-2.1.1/Makefile    2026-05-12 10:00:43.000000000 +0200
+++ new/nethsm-sdk-py-2.1.2/Makefile    2026-06-22 17:49:14.000000000 +0200
@@ -65,6 +65,7 @@
                -i=/out/nethsm-api.yaml \
                -g=python -o=/out/python --package-name=nethsm.client
        cp -r "${OPENAPI_OUTPUT_DIR}/python/src/nethsm/client" nethsm
+       patch -p1 < patches/01-replace-dateutil.diff
 
 .PHONY: test
 test:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/nethsm/client/schemas/format.py 
new/nethsm-sdk-py-2.1.2/nethsm/client/schemas/format.py
--- old/nethsm-sdk-py-2.1.1/nethsm/client/schemas/format.py     2026-05-12 
10:00:43.000000000 +0200
+++ new/nethsm-sdk-py-2.1.2/nethsm/client/schemas/format.py     2026-06-22 
17:49:14.000000000 +0200
@@ -1,85 +1,8 @@
 import datetime
 import decimal
 import functools
-import typing
 import uuid
 
-from dateutil import parser, tz
-
-
-class CustomIsoparser(parser.isoparser):
-    def __init__(self, sep: typing.Optional[str] = None):
-        """
-        :param sep:
-            A single character that separates date and time portions. If
-            ``None``, the parser will accept any single character.
-            For strict ISO-8601 adherence, pass ``'T'``.
-        """
-        if sep is not None:
-            if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'):
-                raise ValueError('Separator must be a single, non-numeric ' +
-                                 'ASCII character')
-
-            used_sep = sep.encode('ascii')
-        else:
-            used_sep = None
-
-        self._sep = used_sep
-
-    @staticmethod
-    def __get_ascii_bytes(str_in: str) -> bytes:
-        # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII
-        # ASCII is the same in UTF-8
-        try:
-            return str_in.encode('ascii')
-        except UnicodeEncodeError as e:
-            msg = 'ISO-8601 strings should contain only ASCII characters'
-            raise ValueError(msg) from e
-
-    def __parse_isodate(self, dt_str: str) -> typing.Tuple[typing.Tuple[int, 
int, int], int]:
-        dt_str_ascii = self.__get_ascii_bytes(dt_str)
-        values = self._parse_isodate(dt_str_ascii) # type: ignore
-        values = typing.cast(typing.Tuple[typing.List[int], int], values)
-        components = typing.cast( typing.Tuple[int, int, int], 
tuple(values[0]))
-        pos = values[1]
-        return components, pos
-
-    def __parse_isotime(self, dt_str: str) -> typing.Tuple[int, int, int, int, 
typing.Optional[typing.Union[tz.tzutc, tz.tzoffset]]]:
-        dt_str_ascii = self.__get_ascii_bytes(dt_str)
-        values = self._parse_isotime(dt_str_ascii) # type: ignore
-        components: typing.Tuple[int, int, int, int, 
typing.Optional[typing.Union[tz.tzutc, tz.tzoffset]]] = tuple(values) # type: 
ignore
-        return components
-
-    def parse_isodatetime(self, dt_str: str) -> datetime.datetime:
-        date_components, pos = self.__parse_isodate(dt_str)
-        if len(dt_str) <= pos:
-            # len(components) <= 3
-            raise ValueError('Value is not a datetime')
-        if self._sep is None or dt_str[pos:pos + 1] == self._sep:
-            hour, minute, second, microsecond, tzinfo = 
self.__parse_isotime(dt_str[pos + 1:])
-            if hour == 24:
-                hour = 0
-                components = (*date_components, hour, minute, second, 
microsecond, tzinfo)
-                return datetime.datetime(*components) + 
datetime.timedelta(days=1)
-            else:
-                components = (*date_components, hour, minute, second, 
microsecond, tzinfo)
-        else:
-            raise ValueError('String contains unknown ISO components')
-
-        return datetime.datetime(*components)
-
-    def parse_isodate_str(self, datestr: str) -> datetime.date:
-        components, pos = self.__parse_isodate(datestr)
-
-        if len(datestr) > pos:
-            raise ValueError('String contains invalid time components')
-
-        if len(components) > 3:
-            raise ValueError('String contains invalid time components')
-
-        return datetime.date(*components)
-
-DEFAULT_ISOPARSER = CustomIsoparser()
 
 @functools.lru_cache()
 def as_date(arg: str) -> datetime.date:
@@ -87,7 +10,7 @@
     type = "string"
     format = "date"
     """
-    return DEFAULT_ISOPARSER.parse_isodate_str(arg)
+    return datetime.date.fromisoformat(arg)
 
 @functools.lru_cache()
 def as_datetime(arg: str) -> datetime.datetime:
@@ -95,7 +18,10 @@
     type = "string"
     format = "date-time"
     """
-    return DEFAULT_ISOPARSER.parse_isodatetime(arg)
+    # datetime.fromisoformat() only accepts a trailing "Z" on Python 3.11+.
+    if arg.endswith(("Z", "z")):
+        arg = arg[:-1] + "+00:00"
+    return datetime.datetime.fromisoformat(arg)
 
 @functools.lru_cache()
 def as_decimal(arg: str) -> decimal.Decimal:
@@ -112,4 +38,4 @@
     type = "string"
     format = "uuid"
     """
-    return uuid.UUID(arg)
\ No newline at end of file
+    return uuid.UUID(arg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nethsm-sdk-py-2.1.1/nethsm/client/schemas/validation.py 
new/nethsm-sdk-py-2.1.2/nethsm/client/schemas/validation.py
--- old/nethsm-sdk-py-2.1.1/nethsm/client/schemas/validation.py 2026-05-12 
10:00:43.000000000 +0200
+++ new/nethsm-sdk-py-2.1.2/nethsm/client/schemas/validation.py 2026-06-22 
17:49:14.000000000 +0200
@@ -626,7 +626,7 @@
             )
     elif format_value == 'date':
         try:
-            format.DEFAULT_ISOPARSER.parse_isodate_str(arg)
+            format.as_date(arg)
             return None
         except ValueError:
             raise exceptions.ApiValueError(
@@ -635,7 +635,7 @@
             )
     elif format_value == 'date-time':
         try:
-            format.DEFAULT_ISOPARSER.parse_isodatetime(arg)
+            format.as_datetime(arg)
             return None
         except ValueError:
             raise exceptions.ApiValueError(
@@ -1327,4 +1327,4 @@
     'prefix_items': validate_prefix_items,
     'unevaluated_items': validate_unevaluated_items,
     'unevaluated_properties': validate_unevaluated_properties
-}
\ No newline at end of file
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/patches/01-replace-dateutil.diff 
new/nethsm-sdk-py-2.1.2/patches/01-replace-dateutil.diff
--- old/nethsm-sdk-py-2.1.1/patches/01-replace-dateutil.diff    1970-01-01 
01:00:00.000000000 +0100
+++ new/nethsm-sdk-py-2.1.2/patches/01-replace-dateutil.diff    2026-06-22 
17:49:14.000000000 +0200
@@ -0,0 +1,174 @@
+commit c50c4f34bc7aab1b32dfb8dc8fb5bab4f7cc8462
+Author: Zbigniew JÄ™drzejewski-Szmek <[email protected]>
+Date:   Sun Jun 21 19:42:44 2026 +0200
+
+    Replace dateutil with stdlib datetime in format.py
+    
+    dateutil is weakly maintained [1] with possibly unaddressed security
+    issues [2]. Fedora decided to drop it from the repo [3]. It is always
+    better to have one dependency less, and the existing use can be replaced
+    by what is available in the standard library with some simple wrapper
+    code.
+    
+    The schemas/format.py support file only used dateutil to parse ISO-8601
+    date and date-time strings. datetime.date.fromisoformat /
+    datetime.datetime.fromisoformat cover this since Python 3.7; a small shim
+    rewrites a trailing "Z" to "+00:00" so date-times parse on Python 3.9/3.10
+    (fromisoformat only accepts "Z" on 3.11+).
+    
+    Drop python-dateutil and types-python-dateutil from pyproject.toml and
+    regenerate poetry.lock.
+    
+    [1] https://github.com/dateutil/dateutil/issues/1404
+    [2] https://github.com/dateutil/dateutil/issues/1450
+    [3] https://fedoraproject.org/wiki/Changes/DeprecatePython-dateutil
+    
+    Signed-off-by: Zbigniew JÄ™drzejewski-Szmek <[email protected]>
+
+diff --git a/nethsm/client/schemas/format.py b/nethsm/client/schemas/format.py
+index bb61490..99a5872 100644
+--- a/nethsm/client/schemas/format.py
++++ b/nethsm/client/schemas/format.py
+@@ -1,85 +1,8 @@
+ import datetime
+ import decimal
+ import functools
+-import typing
+ import uuid
+ 
+-from dateutil import parser, tz
+-
+-
+-class CustomIsoparser(parser.isoparser):
+-    def __init__(self, sep: typing.Optional[str] = None):
+-        """
+-        :param sep:
+-            A single character that separates date and time portions. If
+-            ``None``, the parser will accept any single character.
+-            For strict ISO-8601 adherence, pass ``'T'``.
+-        """
+-        if sep is not None:
+-            if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'):
+-                raise ValueError('Separator must be a single, non-numeric ' +
+-                                 'ASCII character')
+-
+-            used_sep = sep.encode('ascii')
+-        else:
+-            used_sep = None
+-
+-        self._sep = used_sep
+-
+-    @staticmethod
+-    def __get_ascii_bytes(str_in: str) -> bytes:
+-        # If it's unicode, turn it into bytes, since ISO-8601 only covers 
ASCII
+-        # ASCII is the same in UTF-8
+-        try:
+-            return str_in.encode('ascii')
+-        except UnicodeEncodeError as e:
+-            msg = 'ISO-8601 strings should contain only ASCII characters'
+-            raise ValueError(msg) from e
+-
+-    def __parse_isodate(self, dt_str: str) -> typing.Tuple[typing.Tuple[int, 
int, int], int]:
+-        dt_str_ascii = self.__get_ascii_bytes(dt_str)
+-        values = self._parse_isodate(dt_str_ascii) # type: ignore
+-        values = typing.cast(typing.Tuple[typing.List[int], int], values)
+-        components = typing.cast( typing.Tuple[int, int, int], 
tuple(values[0]))
+-        pos = values[1]
+-        return components, pos
+-
+-    def __parse_isotime(self, dt_str: str) -> typing.Tuple[int, int, int, 
int, typing.Optional[typing.Union[tz.tzutc, tz.tzoffset]]]:
+-        dt_str_ascii = self.__get_ascii_bytes(dt_str)
+-        values = self._parse_isotime(dt_str_ascii) # type: ignore
+-        components: typing.Tuple[int, int, int, int, 
typing.Optional[typing.Union[tz.tzutc, tz.tzoffset]]] = tuple(values) # type: 
ignore
+-        return components
+-
+-    def parse_isodatetime(self, dt_str: str) -> datetime.datetime:
+-        date_components, pos = self.__parse_isodate(dt_str)
+-        if len(dt_str) <= pos:
+-            # len(components) <= 3
+-            raise ValueError('Value is not a datetime')
+-        if self._sep is None or dt_str[pos:pos + 1] == self._sep:
+-            hour, minute, second, microsecond, tzinfo = 
self.__parse_isotime(dt_str[pos + 1:])
+-            if hour == 24:
+-                hour = 0
+-                components = (*date_components, hour, minute, second, 
microsecond, tzinfo)
+-                return datetime.datetime(*components) + 
datetime.timedelta(days=1)
+-            else:
+-                components = (*date_components, hour, minute, second, 
microsecond, tzinfo)
+-        else:
+-            raise ValueError('String contains unknown ISO components')
+-
+-        return datetime.datetime(*components)
+-
+-    def parse_isodate_str(self, datestr: str) -> datetime.date:
+-        components, pos = self.__parse_isodate(datestr)
+-
+-        if len(datestr) > pos:
+-            raise ValueError('String contains invalid time components')
+-
+-        if len(components) > 3:
+-            raise ValueError('String contains invalid time components')
+-
+-        return datetime.date(*components)
+-
+-DEFAULT_ISOPARSER = CustomIsoparser()
+ 
+ @functools.lru_cache()
+ def as_date(arg: str) -> datetime.date:
+@@ -87,7 +10,7 @@ def as_date(arg: str) -> datetime.date:
+     type = "string"
+     format = "date"
+     """
+-    return DEFAULT_ISOPARSER.parse_isodate_str(arg)
++    return datetime.date.fromisoformat(arg)
+ 
+ @functools.lru_cache()
+ def as_datetime(arg: str) -> datetime.datetime:
+@@ -95,7 +18,10 @@ def as_datetime(arg: str) -> datetime.datetime:
+     type = "string"
+     format = "date-time"
+     """
+-    return DEFAULT_ISOPARSER.parse_isodatetime(arg)
++    # datetime.fromisoformat() only accepts a trailing "Z" on Python 3.11+.
++    if arg.endswith(("Z", "z")):
++        arg = arg[:-1] + "+00:00"
++    return datetime.datetime.fromisoformat(arg)
+ 
+ @functools.lru_cache()
+ def as_decimal(arg: str) -> decimal.Decimal:
+@@ -112,4 +38,4 @@ def as_uuid(arg: str) -> uuid.UUID:
+     type = "string"
+     format = "uuid"
+     """
+-    return uuid.UUID(arg)
+\ No newline at end of file
++    return uuid.UUID(arg)
+diff --git a/nethsm/client/schemas/validation.py 
b/nethsm/client/schemas/validation.py
+index a50757a..5ae69eb 100644
+--- a/nethsm/client/schemas/validation.py
++++ b/nethsm/client/schemas/validation.py
+@@ -626,7 +626,7 @@ def __validate_string_format(
+             )
+     elif format_value == 'date':
+         try:
+-            format.DEFAULT_ISOPARSER.parse_isodate_str(arg)
++            format.as_date(arg)
+             return None
+         except ValueError:
+             raise exceptions.ApiValueError(
+@@ -635,7 +635,7 @@ def __validate_string_format(
+             )
+     elif format_value == 'date-time':
+         try:
+-            format.DEFAULT_ISOPARSER.parse_isodatetime(arg)
++            format.as_datetime(arg)
+             return None
+         except ValueError:
+             raise exceptions.ApiValueError(
+@@ -1327,4 +1327,4 @@ json_schema_keyword_to_validator: typing.Mapping[str, 
validator_type] = {
+     'prefix_items': validate_prefix_items,
+     'unevaluated_items': validate_unevaluated_items,
+     'unevaluated_properties': validate_unevaluated_properties
+-}
+\ No newline at end of file
++}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/poetry.lock 
new/nethsm-sdk-py-2.1.2/poetry.lock
--- old/nethsm-sdk-py-2.1.1/poetry.lock 2026-05-12 10:00:43.000000000 +0200
+++ new/nethsm-sdk-py-2.1.2/poetry.lock 2026-06-22 17:49:14.000000000 +0200
@@ -1,36 +1,4 @@
-# This file is automatically @generated by Poetry 2.2.1 and should not be 
changed by hand.
-
-[[package]]
-name = "ansi2html"
-version = "1.9.2"
-description = "Convert text with ANSI color codes to HTML or to LaTeX"
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
-    {file = "ansi2html-1.9.2-py3-none-any.whl", hash = 
"sha256:dccb75aa95fb018e5d299be2b45f802952377abfdce0504c17a6ee6ef0a420c5"},
-    {file = "ansi2html-1.9.2.tar.gz", hash = 
"sha256:3453bf87535d37b827b05245faaa756dbab4ec3d69925e352b6319c3c955c0a5"},
-]
-
-[package.extras]
-docs = ["mkdocs", "mkdocs-material", "mkdocs-material-extensions", 
"mkdocstrings", "mkdocstrings-python", "pymdown-extensions"]
-test = ["pytest", "pytest-cov"]
-
-[[package]]
-name = "asttokens"
-version = "3.0.1"
-description = "Annotate AST trees with source code positions"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "asttokens-3.0.1-py3-none-any.whl", hash = 
"sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"},
-    {file = "asttokens-3.0.1.tar.gz", hash = 
"sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"},
-]
-
-[package.extras]
-astroid = ["astroid (>=2,<5)"]
-test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"]
+# This file is automatically @generated by Poetry 2.4.1 and should not be 
changed by hand.
 
 [[package]]
 name = "certifi"
@@ -465,18 +433,6 @@
 test-randomorder = ["pytest-randomly"]
 
 [[package]]
-name = "decorator"
-version = "5.2.1"
-description = "Decorators for Humans"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "decorator-5.2.1-py3-none-any.whl", hash = 
"sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"},
-    {file = "decorator-5.2.1.tar.gz", hash = 
"sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"},
-]
-
-[[package]]
 name = "docker"
 version = "7.1.0"
 description = "A Python library for the Docker Engine API."
@@ -500,18 +456,6 @@
 websockets = ["websocket-client (>=1.3.0)"]
 
 [[package]]
-name = "docutils"
-version = "0.22.4"
-description = "Docutils -- Python Documentation Utilities"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "docutils-0.22.4-py3-none-any.whl", hash = 
"sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"},
-    {file = "docutils-0.22.4.tar.gz", hash = 
"sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"},
-]
-
-[[package]]
 name = "exceptiongroup"
 version = "1.3.1"
 description = "Backport of PEP 654 (exception groups)"
@@ -531,32 +475,6 @@
 test = ["pytest (>=6)"]
 
 [[package]]
-name = "executing"
-version = "2.2.1"
-description = "Get the currently executing AST node of a frame, and other 
information"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "executing-2.2.1-py2.py3-none-any.whl", hash = 
"sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"},
-    {file = "executing-2.2.1.tar.gz", hash = 
"sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"},
-]
-
-[package.extras]
-tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", 
"ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""]
-
-[[package]]
-name = "htmlmin2"
-version = "0.1.13"
-description = "An HTML Minifier"
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
-    {file = "htmlmin2-0.1.13-py3-none-any.whl", hash = 
"sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2"},
-]
-
-[[package]]
 name = "idna"
 version = "3.11"
 description = "Internationalized Domain Names in Applications (IDNA)"
@@ -584,199 +502,6 @@
 ]
 
 [[package]]
-name = "ipython"
-version = "8.18.1"
-description = "IPython: Productive Interactive Computing"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "ipython-8.18.1-py3-none-any.whl", hash = 
"sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"},
-    {file = "ipython-8.18.1.tar.gz", hash = 
"sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-decorator = "*"
-exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
-jedi = ">=0.16"
-matplotlib-inline = "*"
-pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
-prompt-toolkit = ">=3.0.41,<3.1.0"
-pygments = ">=2.4.0"
-stack-data = "*"
-traitlets = ">=5"
-typing-extensions = {version = "*", markers = "python_version < \"3.10\""}
-
-[package.extras]
-all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", 
"ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", 
"nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest 
(<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools 
(>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", 
"trio", "typing-extensions"]
-black = ["black"]
-doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", 
"pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools 
(>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", 
"typing-extensions"]
-kernel = ["ipykernel"]
-nbconvert = ["nbconvert"]
-nbformat = ["nbformat"]
-notebook = ["ipywidgets", "notebook"]
-parallel = ["ipyparallel"]
-qtconsole = ["qtconsole"]
-test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"]
-test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", 
"pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", 
"trio"]
-
-[[package]]
-name = "jedi"
-version = "0.19.2"
-description = "An autocompletion tool for Python that can be used for text 
editors."
-optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
-files = [
-    {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = 
"sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"},
-    {file = "jedi-0.19.2.tar.gz", hash = 
"sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"},
-]
-
-[package.dependencies]
-parso = ">=0.8.4,<0.9.0"
-
-[package.extras]
-docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", 
"alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark 
(==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", 
"imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing 
(==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", 
"recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", 
"snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", 
"sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport 
(==1.2.4)", "urllib3 (==1.26.4)"]
-qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
-
-[[package]]
-name = "jinja2"
-version = "3.1.6"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-groups = ["dev"]
-files = [
-    {file = "jinja2-3.1.6-py3-none-any.whl", hash = 
"sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
-    {file = "jinja2-3.1.6.tar.gz", hash = 
"sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "markupsafe"
-version = "3.0.3"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = 
"sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"},
-    {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = 
"sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"},
-    {file = 
"markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"},
-    {file = 
"markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"},
-    {file = 
"markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"},
-    {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = 
"sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"},
-    {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = 
"sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"},
-    {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = 
"sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"},
-    {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = 
"sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"},
-    {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = 
"sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"},
-    {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = 
"sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"},
-    {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = 
"sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"},
-    {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = 
"sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"},
-    {file = 
"markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"},
-    {file = 
"markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"},
-    {file = 
"markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"},
-    {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = 
"sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"},
-    {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = 
"sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"},
-    {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = 
"sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"},
-    {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = 
"sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"},
-    {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = 
"sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"},
-    {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = 
"sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"},
-    {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = 
"sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"},
-    {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = 
"sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"},
-    {file = 
"markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"},
-    {file = 
"markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"},
-    {file = 
"markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"},
-    {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = 
"sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"},
-    {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = 
"sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"},
-    {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = 
"sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"},
-    {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = 
"sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"},
-    {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = 
"sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"},
-    {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = 
"sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"},
-    {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = 
"sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"},
-    {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = 
"sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"},
-    {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = 
"sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"},
-    {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = 
"sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"},
-    {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = 
"sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"},
-    {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = 
"sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"},
-    {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = 
"sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"},
-    {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = 
"sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = 
"sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = 
"sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"},
-    {file = 
"markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = 
"sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = 
"sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = 
"sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = 
"sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = 
"sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"},
-    {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = 
"sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"},
-    {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = 
"sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"},
-    {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = 
"sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"},
-    {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = 
"sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"},
-    {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = 
"sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"},
-    {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = 
"sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"},
-    {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = 
"sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"},
-    {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = 
"sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"},
-    {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = 
"sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = 
"sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = 
"sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"},
-    {file = 
"markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl",
 hash = 
"sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = 
"sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = 
"sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = 
"sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = 
"sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = 
"sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"},
-    {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = 
"sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"},
-    {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = 
"sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"},
-    {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = 
"sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"},
-    {file = 
"markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"},
-    {file = 
"markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"},
-    {file = 
"markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", 
hash = 
"sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"},
-    {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = 
"sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"},
-    {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = 
"sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"},
-    {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = 
"sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"},
-    {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = 
"sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"},
-    {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = 
"sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"},
-    {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = 
"sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"},
-    {file = "markupsafe-3.0.3.tar.gz", hash = 
"sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"},
-]
-
-[[package]]
-name = "matplotlib-inline"
-version = "0.2.1"
-description = "Inline Matplotlib backend for Jupyter"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = 
"sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"},
-    {file = "matplotlib_inline-0.2.1.tar.gz", hash = 
"sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"},
-]
-
-[package.dependencies]
-traitlets = "*"
-
-[package.extras]
-test = ["flake8", "nbdime", "nbval", "notebook", "pytest"]
-
-[[package]]
 name = "mypy"
 version = "1.4.1"
 description = "Optional static typing for Python"
@@ -848,38 +573,6 @@
 ]
 
 [[package]]
-name = "parso"
-version = "0.8.6"
-description = "A Python Parser"
-optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
-files = [
-    {file = "parso-0.8.6-py2.py3-none-any.whl", hash = 
"sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"},
-    {file = "parso-0.8.6.tar.gz", hash = 
"sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"},
-]
-
-[package.extras]
-qa = ["flake8 (==5.0.4)", "types-setuptools (==67.2.0.1)", "zuban (==0.5.1)"]
-testing = ["docopt", "pytest"]
-
-[[package]]
-name = "pexpect"
-version = "4.9.0"
-description = "Pexpect allows easy control of interactive console 
applications."
-optional = false
-python-versions = "*"
-groups = ["dev"]
-markers = "sys_platform != \"win32\""
-files = [
-    {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = 
"sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
-    {file = "pexpect-4.9.0.tar.gz", hash = 
"sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
-]
-
-[package.dependencies]
-ptyprocess = ">=0.5"
-
-[[package]]
 name = "pluggy"
 version = "1.6.0"
 description = "plugin and hook calling mechanisms for python"
@@ -918,49 +611,6 @@
 test = ["coverage", "fixtures", "pytest", "requests-mock", "tox"]
 
 [[package]]
-name = "prompt-toolkit"
-version = "3.0.52"
-description = "Library for building powerful interactive command lines in 
Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = 
"sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"},
-    {file = "prompt_toolkit-3.0.52.tar.gz", hash = 
"sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"},
-]
-
-[package.dependencies]
-wcwidth = "*"
-
-[[package]]
-name = "ptyprocess"
-version = "0.7.0"
-description = "Run a subprocess in a pseudo terminal"
-optional = false
-python-versions = "*"
-groups = ["dev"]
-markers = "sys_platform != \"win32\""
-files = [
-    {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = 
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
-    {file = "ptyprocess-0.7.0.tar.gz", hash = 
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
-]
-
-[[package]]
-name = "pure-eval"
-version = "0.2.3"
-description = "Safely evaluate AST nodes without side effects"
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
-    {file = "pure_eval-0.2.3-py3-none-any.whl", hash = 
"sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"},
-    {file = "pure_eval-0.2.3.tar.gz", hash = 
"sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"},
-]
-
-[package.extras]
-tests = ["pytest"]
-
-[[package]]
 name = "pycparser"
 version = "2.23"
 description = "C parser in Python"
@@ -1084,55 +734,6 @@
 testing = ["process-tests", "pytest-xdist", "virtualenv"]
 
 [[package]]
-name = "pytest-reporter"
-version = "0.5.3"
-description = "Generate Pytest reports with templates"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "pytest-reporter-0.5.3.tar.gz", hash = 
"sha256:426ae38f3c5304659635eff1d4080c8acf4dc6cd833469caed427a9a80bb41aa"},
-    {file = "pytest_reporter-0.5.3-py3-none-any.whl", hash = 
"sha256:fa39fef46b1926b6f181c2759da0bcfd26b7697ef59d3c5cd260106c59b3a196"},
-]
-
-[package.dependencies]
-pytest = "*"
-
-[[package]]
-name = "pytest-reporter-html1"
-version = "0.9.4"
-description = "A basic HTML report template for Pytest"
-optional = false
-python-versions = ">=3.5"
-groups = ["dev"]
-files = [
-    {file = "pytest_reporter_html1-0.9.4-py3-none-any.whl", hash = 
"sha256:b7b510bb93bea60b2cf0a9e10142454c8e16976be27874917dcc9aea35ee13f2"},
-    {file = "pytest_reporter_html1-0.9.4.tar.gz", hash = 
"sha256:88ae00bff3d446a25d3dcfd575316b40aad538056eb8998f0a9aa956965fe81f"},
-]
-
-[package.dependencies]
-ansi2html = ">=1.3.0"
-docutils = "*"
-htmlmin2 = "*"
-Jinja2 = "*"
-pytest-reporter = ">=0.4.0"
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["main"]
-files = [
-    {file = "python-dateutil-2.9.0.post0.tar.gz", hash = 
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
-    {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = 
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
 name = "pywin32"
 version = "311"
 description = "Python for Window Extensions"
@@ -1164,89 +765,6 @@
 ]
 
 [[package]]
-name = "pyyaml"
-version = "6.0.3"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = 
"sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"},
-    {file = 
"PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"},
-    {file = 
"PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"},
-    {file = 
"PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"},
-    {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = 
"sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"},
-    {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = 
"sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"},
-    {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = 
"sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = 
"sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = 
"sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"},
-    {file = 
"pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"},
-    {file = 
"pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"},
-    {file = 
"pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"},
-    {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = 
"sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"},
-    {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = 
"sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"},
-    {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = 
"sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"},
-    {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = 
"sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"},
-    {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = 
"sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"},
-    {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = 
"sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"},
-    {file = 
"pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"},
-    {file = 
"pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"},
-    {file = 
"pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"},
-    {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = 
"sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"},
-    {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = 
"sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"},
-    {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = 
"sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"},
-    {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = 
"sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"},
-    {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = 
"sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"},
-    {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = 
"sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"},
-    {file = 
"pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"},
-    {file = 
"pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"},
-    {file = 
"pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"},
-    {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = 
"sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"},
-    {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = 
"sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = 
"sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = 
"sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"},
-    {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = 
"sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"},
-    {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = 
"sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"},
-    {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = 
"sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"},
-    {file = 
"pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"},
-    {file = 
"pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"},
-    {file = 
"pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"},
-    {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = 
"sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"},
-    {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = 
"sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = 
"sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = 
"sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"},
-    {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = 
"sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"},
-    {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = 
"sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"},
-    {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = 
"sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"},
-    {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = 
"sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"},
-    {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = 
"sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"},
-    {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = 
"sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"},
-    {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = 
"sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = 
"sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = 
"sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"},
-    {file = 
"pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = 
"sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = 
"sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = 
"sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"},
-    {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = 
"sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"},
-    {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = 
"sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"},
-    {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = 
"sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"},
-    {file = 
"pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"},
-    {file = 
"pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl",
 hash = 
"sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"},
-    {file = 
"pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"},
-    {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = 
"sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"},
-    {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = 
"sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"},
-    {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = 
"sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"},
-    {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = 
"sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"},
-    {file = "pyyaml-6.0.3.tar.gz", hash = 
"sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"},
-]
-
-[[package]]
 name = "requests"
 version = "2.31.0"
 description = "Python HTTP for Humans."
@@ -1298,38 +816,6 @@
 ]
 
 [[package]]
-name = "six"
-version = "1.17.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["main"]
-files = [
-    {file = "six-1.17.0-py2.py3-none-any.whl", hash = 
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
-    {file = "six-1.17.0.tar.gz", hash = 
"sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
-]
-
-[[package]]
-name = "stack-data"
-version = "0.6.3"
-description = "Extract data from python stack frames and tracebacks for 
informative displays"
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
-    {file = "stack_data-0.6.3-py3-none-any.whl", hash = 
"sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
-    {file = "stack_data-0.6.3.tar.gz", hash = 
"sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
-]
-
-[package.dependencies]
-asttokens = ">=2.1.0"
-executing = ">=1.2.0"
-pure-eval = "*"
-
-[package.extras]
-tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
-
-[[package]]
 name = "tomli"
 version = "2.4.0"
 description = "A lil' TOML parser"
@@ -1388,22 +874,6 @@
 ]
 
 [[package]]
-name = "traitlets"
-version = "5.14.3"
-description = "Traitlets Python configuration system"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "traitlets-5.14.3-py3-none-any.whl", hash = 
"sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"},
-    {file = "traitlets-5.14.3.tar.gz", hash = 
"sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"},
-]
-
-[package.extras]
-docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
-test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest 
(>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"]
-
-[[package]]
 name = "ty"
 version = "0.0.23"
 description = "An extremely fast Python type checker, written in Rust."
@@ -1431,33 +901,6 @@
 ]
 
 [[package]]
-name = "types-python-dateutil"
-version = "2.9.0.20260124"
-description = "Typing stubs for python-dateutil"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "types_python_dateutil-2.9.0.20260124-py3-none-any.whl", hash = 
"sha256:f802977ae08bf2260142e7ca1ab9d4403772a254409f7bbdf652229997124951"},
-    {file = "types_python_dateutil-2.9.0.20260124.tar.gz", hash = 
"sha256:7d2db9f860820c30e5b8152bfe78dbdf795f7d1c6176057424e8b3fdd1f581af"},
-]
-
-[[package]]
-name = "types-requests"
-version = "2.32.4.20260107"
-description = "Typing stubs for requests"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
-    {file = "types_requests-2.32.4.20260107-py3-none-any.whl", hash = 
"sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d"},
-    {file = "types_requests-2.32.4.20260107.tar.gz", hash = 
"sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f"},
-]
-
-[package.dependencies]
-urllib3 = ">=2"
-
-[[package]]
 name = "typing-extensions"
 version = "4.15.0"
 description = "Backported and Experimental Type Hints for Python 3.9+"
@@ -1487,19 +930,7 @@
 socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
 zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""]
 
-[[package]]
-name = "wcwidth"
-version = "0.6.0"
-description = "Measures the displayed width of unicode strings in a terminal"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
-    {file = "wcwidth-0.6.0-py3-none-any.whl", hash = 
"sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"},
-    {file = "wcwidth-0.6.0.tar.gz", hash = 
"sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"},
-]
-
 [metadata]
 lock-version = "2.1"
 python-versions = ">=3.9"
-content-hash = 
"87702b5585f2d3d1bb277bbd321b2a670a6b4e2800800a9dcee1f8d63bc0445a"
+content-hash = 
"8aa7dfa2ec22020edc9aa2f7befd9ca00ea2210c7d1f8303da58717d541352a2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/pyproject.toml 
new/nethsm-sdk-py-2.1.2/pyproject.toml
--- old/nethsm-sdk-py-2.1.1/pyproject.toml      2026-05-12 10:00:43.000000000 
+0200
+++ new/nethsm-sdk-py-2.1.2/pyproject.toml      2026-06-22 17:49:14.000000000 
+0200
@@ -4,7 +4,7 @@
 
 [project]
 name = "nethsm"
-version = "2.1.1"
+version = "2.1.2"
 description = "Python Library to manage NetHSM(s)"
 authors = [{ name = "Nitrokey", email = "[email protected]" },]
 readme = "README.md"
@@ -14,7 +14,6 @@
 dependencies = [
   "certifi",
   "cryptography >=41",
-  "python-dateutil >=2, <3",
   "typing_extensions >=4.3, <5",
   "urllib3 >=2, <3",
 ]
@@ -31,21 +30,16 @@
 optional = true
 
 [tool.poetry.group.dev.dependencies]
-ipython = "*"
 mypy = ">=1.4,<1.5"
 pytest = "<9"
-pytest-reporter-html1 = "*"
 ruff = ">=0.14, <0.15"
 ty = "==0.0.23"
 docker = "*"
 podman = ">=5,<6"
 pycryptodome = "*"
+pytest-cov = "*"
 # for compatibility with docker, see 
https://github.com/docker/docker-py/issues/3256
 requests = "<2.32.0"
-types-python-dateutil = "*"
-types-requests = "*"
-pytest-cov = "*"
-pyyaml = "*"
 
 [tool.pytest.ini_options]
 testpaths = ["tests"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nethsm-sdk-py-2.1.1/tests/utilities.py 
new/nethsm-sdk-py-2.1.2/tests/utilities.py
--- old/nethsm-sdk-py-2.1.1/tests/utilities.py  2026-05-12 10:00:43.000000000 
+0200
+++ new/nethsm-sdk-py-2.1.2/tests/utilities.py  2026-06-22 17:49:14.000000000 
+0200
@@ -1,6 +1,5 @@
 import contextlib
 import datetime
-import os
 import subprocess
 from abc import ABC, abstractmethod
 from time import sleep
@@ -107,13 +106,13 @@
         self.process: Optional[subprocess.Popen[bytes]] = None
 
     def start(self) -> None:
-        os.system("pkill keyfender.unix")
-        os.system("pkill etcd")
+        subprocess.run(["pkill", "keyfender.unix"])
+        subprocess.run(["pkill", "etcd"])
 
         # Wait for everything to shut down, creates problems otherwise on the 
gitlab ci
         sleep(1)
 
-        os.system("rm -rf /data")
+        subprocess.run(["rm", "-rf", "/data"])
 
         self.process = subprocess.Popen(["/bin/sh", "-c", "/start.sh"])
 

Reply via email to