diff --git a/.eggs/README.txt b/.eggs/README.txt
deleted file mode 100644
index 5d01668824f45c3a6683e12d1b9048bb1d273041..0000000000000000000000000000000000000000
--- a/.eggs/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins.
-
-This directory caches those eggs to prevent repeated downloads.
-
-However, it is safe to delete this directory.
-
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/LICENSE b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/LICENSE
deleted file mode 100644
index 353924be0e59b9ad7e6c22848c2189398481821d..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Jason R. Coombs
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/PKG-INFO b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/PKG-INFO
deleted file mode 100644
index 75c36d65e0bc03a2c5e8d7995f786956ebc4823e..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/PKG-INFO
+++ /dev/null
@@ -1,185 +0,0 @@
-Metadata-Version: 2.1
-Name: pytest-runner
-Version: 6.0.1
-Summary: Invoke py.test as distutils command with dependency resolution
-Home-page: https://github.com/pytest-dev/pytest-runner/
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
-Classifier: Development Status :: 7 - Inactive
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Framework :: Pytest
-Requires-Python: >=3.7
-License-File: LICENSE
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: jaraco.packaging >=9 ; extra == 'docs'
-Requires-Dist: rst.linker >=1.9 ; extra == 'docs'
-Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: pytest >=6 ; extra == 'testing'
-Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'testing'
-Requires-Dist: pytest-flake8 ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: pytest-enabler >=1.0.1 ; extra == 'testing'
-Requires-Dist: pytest-virtualenv ; extra == 'testing'
-Requires-Dist: types-setuptools ; extra == 'testing'
-Requires-Dist: pytest-black >=0.3.7 ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-mypy >=0.9.1 ; (platform_python_implementation != "PyPy") and extra == 'testing'
-
-.. image:: https://img.shields.io/pypi/v/pytest-runner.svg
-   :target: `PyPI link`_
-
-.. image:: https://img.shields.io/pypi/pyversions/pytest-runner.svg
-   :target: `PyPI link`_
-
-.. _PyPI link: https://pypi.org/project/pytest-runner
-
-.. image:: https://github.com/pytest-dev/pytest-runner/workflows/tests/badge.svg
-   :target: https://github.com/pytest-dev/pytest-runner/actions?query=workflow%3A%22tests%22
-   :alt: tests
-
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
-   :target: https://github.com/psf/black
-   :alt: Code style: Black
-
-.. .. image:: https://readthedocs.org/projects/skeleton/badge/?version=latest
-..    :target: https://skeleton.readthedocs.io/en/latest/?badge=latest
-
-.. image:: https://img.shields.io/badge/skeleton-2022-informational
-   :target: https://blog.jaraco.com/skeleton
-
-.. image:: https://tidelift.com/badges/package/pypi/pytest-runner
-   :target: https://tidelift.com/subscription/pkg/pypi-pytest-runner?utm_source=pypi-pytest-runner&utm_medium=readme
-
-Setup scripts can use pytest-runner to add setup.py test support for pytest
-runner.
-
-Deprecation Notice
-==================
-
-pytest-runner depends on deprecated features of setuptools and relies on features that break security
-mechanisms in pip. For example 'setup_requires' and 'tests_require' bypass ``pip --require-hashes``.
-See also `pypa/setuptools#1684 <https://github.com/pypa/setuptools/issues/1684>`_.
-
-It is recommended that you:
-
-- Remove ``'pytest-runner'`` from your ``setup_requires``, preferably removing the ``setup_requires`` option.
-- Remove ``'pytest'`` and any other testing requirements from ``tests_require``, preferably removing the ``tests_requires`` option.
-- Select a tool to bootstrap and then run tests such as tox.
-
-Usage
-=====
-
-- Add 'pytest-runner' to your 'setup_requires'. Pin to '>=2.0,<3dev' (or
-  similar) to avoid pulling in incompatible versions.
-- Include 'pytest' and any other testing requirements to 'tests_require'.
-- Invoke tests with ``setup.py pytest``.
-- Pass ``--index-url`` to have test requirements downloaded from an alternate
-  index URL (unnecessary if specified for easy_install in setup.cfg).
-- Pass additional py.test command-line options using ``--addopts``.
-- Set permanent options for the ``python setup.py pytest`` command (like ``index-url``)
-  in the ``[pytest]`` section of ``setup.cfg``.
-- Set permanent options for the ``py.test`` run (like ``addopts`` or ``pep8ignore``) in the ``[pytest]``
-  section of ``pytest.ini`` or ``tox.ini`` or put them in the ``[tool:pytest]``
-  section of ``setup.cfg``. See `pytest issue 567
-  <https://github.com/pytest-dev/pytest/issues/567>`_.
-- Optionally, set ``test=pytest`` in the ``[aliases]`` section of ``setup.cfg``
-  to cause ``python setup.py test`` to invoke pytest.
-
-Example
-=======
-
-The most simple usage looks like this in setup.py::
-
-    setup(
-        setup_requires=[
-            'pytest-runner',
-        ],
-        tests_require=[
-            'pytest',
-        ],
-    )
-
-Additional dependencies require to run the tests (e.g. mock or pytest
-plugins) may be added to tests_require and will be downloaded and
-required by the session before invoking pytest.
-
-Follow `this search on github
-<https://github.com/search?utf8=%E2%9C%93&q=filename%3Asetup.py+pytest-runner&type=Code&ref=searchresults>`_
-for examples of real-world usage.
-
-Standalone Example
-==================
-
-This technique is deprecated - if you have standalone scripts
-you wish to invoke with dependencies, `use pip-run
-<https://pypi.org/project/pip-run>`_.
-
-Although ``pytest-runner`` is typically used to add pytest test
-runner support to maintained packages, ``pytest-runner`` may
-also be used to create standalone tests. Consider `this example
-failure <https://gist.github.com/jaraco/d979a558bc0bf2194c23>`_,
-reported in `jsonpickle #117
-<https://github.com/jsonpickle/jsonpickle/issues/117>`_
-or `this MongoDB test
-<https://gist.github.com/jaraco/0b9e482f5c0a1300dc9a>`_
-demonstrating a technique that works even when dependencies
-are required in the test.
-
-Either example file may be cloned or downloaded and simply run on
-any system with Python and Setuptools. It will download the
-specified dependencies and run the tests. Afterward, the the
-cloned directory can be removed and with it all trace of
-invoking the test. No other dependencies are needed and no
-system configuration is altered.
-
-Then, anyone trying to replicate the failure can do so easily
-and with all the power of pytest (rewritten assertions,
-rich comparisons, interactive debugging, extensibility through
-plugins, etc).
-
-As a result, the communication barrier for describing and
-replicating failures is made almost trivially low.
-
-Considerations
-==============
-
-Conditional Requirement
------------------------
-
-Because it uses Setuptools setup_requires, pytest-runner will install itself
-on every invocation of setup.py. In some cases, this causes delays for
-invocations of setup.py that will never invoke pytest-runner. To help avoid
-this contingency, consider requiring pytest-runner only when pytest
-is invoked::
-
-    needs_pytest = {'pytest', 'test', 'ptr'}.intersection(sys.argv)
-    pytest_runner = ['pytest-runner'] if needs_pytest else []
-
-    # ...
-
-    setup(
-        #...
-        setup_requires=[
-            #... (other setup requirements)
-        ] + pytest_runner,
-    )
-
-For Enterprise
-==============
-
-Available as part of the Tidelift Subscription.
-
-This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
-
-`Learn more <https://tidelift.com/subscription/pkg/pypi-PROJECT?utm_source=pypi-PROJECT&utm_medium=referral&utm_campaign=github>`_.
-
-Security Contact
-================
-
-To report a security vulnerability, please use the
-`Tidelift security contact <https://tidelift.com/security>`_.
-Tidelift will coordinate the fix and disclosure.
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/RECORD b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/RECORD
deleted file mode 100644
index d7ff24dbeef0d3d0fe2e158334c12c4a101718ee..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/RECORD
+++ /dev/null
@@ -1,7 +0,0 @@
-ptr/__init__.py,sha256=0UfzhCooVgCNTBwVEOPOVGEPck4pnl_6PTfsC-QzNGM,6730
-pytest_runner-6.0.1.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
-pytest_runner-6.0.1.dist-info/METADATA,sha256=Ho3FvAFjFHeY5OQ64WFzkLigFaIpuNr4G3uSmOk3nho,7319
-pytest_runner-6.0.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
-pytest_runner-6.0.1.dist-info/entry_points.txt,sha256=BqezBqeO63XyzSYmHYE58gKEFIjJUd-XdsRQkXHy2ig,58
-pytest_runner-6.0.1.dist-info/top_level.txt,sha256=DPzHbWlKG8yq8EOD5UgEvVNDWeJRPyimrwfShwV6Iuw,4
-pytest_runner-6.0.1.dist-info/RECORD,,
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/WHEEL b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/WHEEL
deleted file mode 100644
index 98c0d20b7a64f4f998d7913e1d38a05dba20916c..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.42.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/entry_points.txt b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/entry_points.txt
deleted file mode 100644
index 08606705d825d4ad98f0a7acfdc654d1e6c1b8fa..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[distutils.commands]
-ptr = ptr:PyTest
-pytest = ptr:PyTest
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/requires.txt b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/requires.txt
deleted file mode 100644
index 153518886b4e238ea0fecf91de9d43e7f4ff31f9..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/requires.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-[docs]
-sphinx
-jaraco.packaging>=9
-rst.linker>=1.9
-jaraco.tidelift>=1.4
-
-[testing]
-pytest>=6
-pytest-checkdocs>=2.4
-pytest-flake8
-pytest-cov
-pytest-enabler>=1.0.1
-pytest-virtualenv
-types-setuptools
-pytest-black>=0.3.7
-pytest-mypy>=0.9.1
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/top_level.txt b/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/top_level.txt
deleted file mode 100644
index e9148ae387cc078aec4d97be87acde54320781de..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/EGG-INFO/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-ptr
diff --git a/.eggs/pytest_runner-6.0.1-py3.12.egg/ptr/__init__.py b/.eggs/pytest_runner-6.0.1-py3.12.egg/ptr/__init__.py
deleted file mode 100644
index 41192fa83ea9f3194d5a31f429e7fd5515c7529d..0000000000000000000000000000000000000000
--- a/.eggs/pytest_runner-6.0.1-py3.12.egg/ptr/__init__.py
+++ /dev/null
@@ -1,216 +0,0 @@
-"""
-Implementation
-"""
-
-import os as _os
-import shlex as _shlex
-import contextlib as _contextlib
-import sys as _sys
-import operator as _operator
-import itertools as _itertools
-import warnings as _warnings
-
-import pkg_resources
-import setuptools.command.test as orig
-from setuptools import Distribution
-
-
-@_contextlib.contextmanager
-def _save_argv(repl=None):
-    saved = _sys.argv[:]
-    if repl is not None:
-        _sys.argv[:] = repl
-    try:
-        yield saved
-    finally:
-        _sys.argv[:] = saved
-
-
-class CustomizedDist(Distribution):
-
-    allow_hosts = None
-    index_url = None
-
-    def fetch_build_egg(self, req):
-        """Specialized version of Distribution.fetch_build_egg
-        that respects respects allow_hosts and index_url."""
-        from setuptools.command.easy_install import easy_install
-
-        dist = Distribution({'script_args': ['easy_install']})
-        dist.parse_config_files()
-        opts = dist.get_option_dict('easy_install')
-        keep = (
-            'find_links',
-            'site_dirs',
-            'index_url',
-            'optimize',
-            'site_dirs',
-            'allow_hosts',
-        )
-        for key in list(opts):
-            if key not in keep:
-                del opts[key]  # don't use any other settings
-        if self.dependency_links:
-            links = self.dependency_links[:]
-            if 'find_links' in opts:
-                links = opts['find_links'][1].split() + links
-            opts['find_links'] = ('setup', links)
-        if self.allow_hosts:
-            opts['allow_hosts'] = ('test', self.allow_hosts)
-        if self.index_url:
-            opts['index_url'] = ('test', self.index_url)
-        install_dir_func = getattr(self, 'get_egg_cache_dir', _os.getcwd)
-        install_dir = install_dir_func()
-        cmd = easy_install(
-            dist,
-            args=["x"],
-            install_dir=install_dir,
-            exclude_scripts=True,
-            always_copy=False,
-            build_directory=None,
-            editable=False,
-            upgrade=False,
-            multi_version=True,
-            no_report=True,
-            user=False,
-        )
-        cmd.ensure_finalized()
-        return cmd.easy_install(req)
-
-
-class PyTest(orig.test):
-    """
-    >>> import setuptools
-    >>> dist = setuptools.Distribution()
-    >>> cmd = PyTest(dist)
-    """
-
-    user_options = [
-        ('extras', None, "Install (all) setuptools extras when running tests"),
-        (
-            'index-url=',
-            None,
-            "Specify an index url from which to retrieve dependencies",
-        ),
-        (
-            'allow-hosts=',
-            None,
-            "Whitelist of comma-separated hosts to allow "
-            "when retrieving dependencies",
-        ),
-        (
-            'addopts=',
-            None,
-            "Additional options to be passed verbatim to the pytest runner",
-        ),
-    ]
-
-    def initialize_options(self):
-        self.extras = False
-        self.index_url = None
-        self.allow_hosts = None
-        self.addopts = []
-        self.ensure_setuptools_version()
-
-    @staticmethod
-    def ensure_setuptools_version():
-        """
-        Due to the fact that pytest-runner is often required (via
-        setup-requires directive) by toolchains that never invoke
-        it (i.e. they're only installing the package, not testing it),
-        instead of declaring the dependency in the package
-        metadata, assert the requirement at run time.
-        """
-        pkg_resources.require('setuptools>=27.3')
-
-    def finalize_options(self):
-        if self.addopts:
-            self.addopts = _shlex.split(self.addopts)
-
-    @staticmethod
-    def marker_passes(marker):
-        """
-        Given an environment marker, return True if the marker is valid
-        and matches this environment.
-        """
-        return (
-            not marker
-            or not pkg_resources.invalid_marker(marker)
-            and pkg_resources.evaluate_marker(marker)
-        )
-
-    def install_dists(self, dist):
-        """
-        Extend install_dists to include extras support
-        """
-        return _itertools.chain(
-            orig.test.install_dists(dist), self.install_extra_dists(dist)
-        )
-
-    def install_extra_dists(self, dist):
-        """
-        Install extras that are indicated by markers or
-        install all extras if '--extras' is indicated.
-        """
-        extras_require = dist.extras_require or {}
-
-        spec_extras = (
-            (spec.partition(':'), reqs) for spec, reqs in extras_require.items()
-        )
-        matching_extras = (
-            reqs
-            for (name, sep, marker), reqs in spec_extras
-            # include unnamed extras or all if self.extras indicated
-            if (not name or self.extras)
-            # never include extras that fail to pass marker eval
-            and self.marker_passes(marker)
-        )
-        results = list(map(dist.fetch_build_eggs, matching_extras))
-        return _itertools.chain.from_iterable(results)
-
-    @staticmethod
-    def _warn_old_setuptools():
-        msg = (
-            "pytest-runner will stop working on this version of setuptools; "
-            "please upgrade to setuptools 30.4 or later or pin to "
-            "pytest-runner < 5."
-        )
-        ver_str = pkg_resources.get_distribution('setuptools').version
-        ver = pkg_resources.parse_version(ver_str)
-        if ver < pkg_resources.parse_version('30.4'):
-            _warnings.warn(msg)
-
-    def run(self):
-        """
-        Override run to ensure requirements are available in this session (but
-        don't install them anywhere).
-        """
-        self._warn_old_setuptools()
-        dist = CustomizedDist()
-        for attr in 'allow_hosts index_url'.split():
-            setattr(dist, attr, getattr(self, attr))
-        for attr in (
-            'dependency_links install_requires tests_require extras_require '
-        ).split():
-            setattr(dist, attr, getattr(self.distribution, attr))
-        installed_dists = self.install_dists(dist)
-        if self.dry_run:
-            self.announce('skipping tests (dry run)')
-            return
-        paths = map(_operator.attrgetter('location'), installed_dists)
-        with self.paths_on_pythonpath(paths):
-            with self.project_on_sys_path():
-                return self.run_tests()
-
-    @property
-    def _argv(self):
-        return ['pytest'] + self.addopts
-
-    def run_tests(self):
-        """
-        Invoke pytest, replacing argv. Return result code.
-        """
-        with _save_argv(_sys.argv[:1] + self.addopts):
-            result_code = __import__('pytest').main()
-            if result_code:
-                raise SystemExit(result_code)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d13d2b511415521555aacddc285321016222d5b1..cbad9c801ab13589f43199e69813ce249ea6e2d9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,7 @@ image: docker:20.10.16  # Define the Docker image
 stages:  # Define stages in the pipeline
   - prepare
   - build
-  # - test
+  - test
   - deploy
 
 prepare:
@@ -38,18 +38,18 @@ build-docs:
       - docs/build  # Save the build output for later stages
     expire_in: 12 month  # Optional: Set how long to keep the artifacts (default: 30 days)
 
-# # Job to test the implementation
-# test:
-#   stage: test
-#   dependencies:
-#   - prepare
-#   image:
-#     name: $CI_REGISTRY_IMAGE:latest
-#     entrypoint: [""]
-#   tags:
-#     - docker
-#   script:
-#     - python -m pytest # Run the tests
+# Job to test the implementation
+test:
+  stage: test
+  dependencies:
+  - prepare
+  image:
+    name: $CI_REGISTRY_IMAGE:latest
+    entrypoint: [""]
+  tags:
+    - docker
+  script:
+    - python -m pytest # Run the tests
   
 # Job to deploy documentation to GitLab Pages
 pages: