Repository: pydicom/pylibjpeg-openjpeg (language: python)

Issue:
Don't include source in wheel builds
Try and figure out how to not include the C source files with the wheel builds ([see also](https://twitter.com/eborisch/status/1324014037206708226)).


Discussion / hints:
Hey, I came here puzzled by your MANIFEST.in file which tells not only to include C source, but also CMake utilities and a bunch of other unnecessary stuff. Since I'm working on an Anaconda packaging, all those *.bin files rub `conda-build` the wrong way. Would it be possible to exclude the entire `openjpeg/src/openjpeg` directory from the wheel? 
Also, you have, in `setup.py`:

``` python
include_package_data = True,
```

Which is the reason why when you'd run `setup.py bdist_wheel` you'd get all those C source files and other stuff that's not Pythons source.
My original thinking was that the source files would be needed if the package [needed to be rebuilt](https://github.com/pydicom/pylibjpeg-openjpeg/issues/45) during install (for whatever reason). And I'd prefer not to rely on the library already being installed.

But I'm pretty new to this, maybe there's a better way?
Well, MANIFEST.in is only considered for source distributions, but, my understanding is that `include_package_data` will just grab everything in the source directory and put it in the wheel, even if it's a binary wheel.

I'm not really sure what's the best practice is about including a dependent library in the source distribution... To be fair, I don't really understand who are the intended audience of source distribution. In practice, it ends up being people who either somehow screwed their Python setup in such a way that they cannot install binary packages, or people on unsupported platforms (eg. weird compiler / ARM architecture etc.) The second case sounds legitimate, but, on the other hand, if this is the case, why not just clone the Git repository and build from there?

There's another weird thing about source distributions. Someone may try installing them by running `setup.py install` rather than building a wheel / egg and installing that... and that screws with the layout of an install (i.e. puts files in unexpected location).

At work, I just tell people never to use `setup.py install` or equivalent `pip` command to prevent the above from happening. Or, if, I can, I override the `setup.py install` to do the equivalent of `setup.py bdist_egg && easy_install ./dist/*.egg`, I'd do that... but this is a lot of work... because it also means overriding every other possible `setuptools` command that needs installing (eg. `setup.py test`).

Anyways, for now I changed `include_package_data` to `package_data` with manually specifying only the source files that belong to `pylibjpeg-openjpeg` but not those coming from the submodule + this requires manually specifying packages to build (instead of calling `find_packages()`. I'll see what I can do about source distribution. If you think it's best to keep all  the CMake stuff in it, then I'll keep it there.
Oh, I wrote this before reading about the problem in another ticket. It's funny, I kinda guessed what the problem was.

Idk... in the case of that person, I'd just tell them to do a Git checkout and build from Git. They chose to work with a bad OS, unsupported CPU architecture--it's on them to deal with the consequences... if because of people like this everyone else needs to get files in the package they have never asked for, that doesn't sound like a good deal.

Fix patch:
diff --git a/.github/workflows/release-wheels.yml b/.github/workflows/release-wheels.yml
index 6702c4c..18e0697 100644
--- a/.github/workflows/release-wheels.yml
+++ b/.github/workflows/release-wheels.yml
@@ -31,7 +31,7 @@ jobs:
     - name: Store artifacts
       uses: actions/upload-artifact@v4
       with:
-        name: wheels
+        name: sdist
         path: ./dist
 
   build-wheels:
@@ -184,7 +184,7 @@ jobs:
     - name: Store artifacts
       uses: actions/upload-artifact@v4
       with:
-        name: wheels
+        name: wheel-${{ matrix.python }}-${{ matrix.platform_id }}
         path: ./dist
 
   test-package:
@@ -206,8 +206,8 @@ jobs:
     - name: Download the wheels
       uses: actions/download-artifact@v4
       with:
-        name: wheels
         path: dist/
+        merge-multiple: true
 
     - name: Install from package wheels and test
       run: |
diff --git a/.gitmodules b/.gitmodules
index 5b4b988..75bc1f4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
-[submodule "openjpeg/src/openjpeg"]
-	path = openjpeg/src/openjpeg
-	url = https://github.com/uclouvain/openjpeg.git
+
+[submodule "lib/openjpeg"]
+	path = lib/openjpeg
+	url = https://github.com/uclouvain/openjpeg
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index bb7848e..0000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,11 +0,0 @@
-recursive-include openjpeg/src/interface *
-
-# openjpeg source file includes
-recursive-include openjpeg/src/openjpeg/src/lib/openjp2 *
-include openjpeg/src/openjpeg/src/lib/CMakeLists.txt
-include openjpeg/src/openjpeg/src/CMakeLists.txt
-recursive-include openjpeg/src/openjpeg/cmake *
-include openjpeg/src/openjpeg/*.md
-include openjpeg/src/openjpeg/LICENSE
-
-recursive-include build_tools *
diff --git a/README.md b/README.md
index e3c54f6..32d64fa 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ python -m pip install pylibjpeg-openjpeg
 | ISO/IEC Standard | ITU Equivalent | JPEG Format |
 | --- | --- | --- |
 | [15444-1](https://www.iso.org/standard/78321.html) | [T.800](https://www.itu.int/rec/T-REC-T.800/en) | [JPEG 2000](https://jpeg.org/jpeg2000/) |
+| [15444-1](https://www.iso.org/standard/78321.html) | [T.800](https://www.itu.int/rec/T-REC-T.800/en) | [High-Throughput JPEG 2000](https://jpeg.org/jpeg2000/) |
 
 #### Encoding
 Encoding of JPEG 2000 images is not currently supported
@@ -46,6 +47,9 @@ Encoding of JPEG 2000 images is not currently supported
 | --- | --- |
 | 1.2.840.10008.1.2.4.90 | JPEG 2000 Image Compression (Lossless Only) |
 | 1.2.840.10008.1.2.4.91 | JPEG 2000 Image Compression |
+| 1.2.840.10008.1.2.4.201 | High-Throughput JPEG 2000 Image Compression (Lossless Only) |
+| 1.2.840.10008.1.2.4.202 | High-Throughput JPEG 2000 with RPCL Options Image Compression (Lossless Only) |
+| 1.2.840.10008.1.2.4.203 | High-Throughput JPEG 2000 Image Compression |
 
 
 ### Usage
diff --git a/build.py b/build.py
index b6d4824..6e6e9f7 100644
--- a/build.py
+++ b/build.py
@@ -8,9 +8,12 @@
 
 
 PACKAGE_DIR = Path(__file__).parent / "openjpeg"
-BUILD_TOOLS = PACKAGE_DIR.parent / "build_tools"
-OPENJPEG_SRC = PACKAGE_DIR / "src" / "openjpeg" / "src" / "lib" / "openjp2"
-INTERFACE_SRC = PACKAGE_DIR / "src" / "interface"
+LIB_DIR = Path(__file__).parent / "lib"
+BUILD_TOOLS = Path(__file__).parent / "build_tools"
+OPENJPEG_SRC = LIB_DIR / "openjpeg" / "src" / "lib" / "openjp2"
+INTERFACE_SRC = LIB_DIR / "interface"
+BUILD_DIR = LIB_DIR / "openjpeg" / "build"
+BACKUP_DIR = BUILD_TOOLS / "backup"
 
 
 def build(setup_kwargs: Any) -> Any:
@@ -72,37 +75,36 @@ def get_source_files() -> List[Path]:
         if fname.suffix == ".c":
             source_files.append(fname)
 
-    source_files = [p.relative_to(PACKAGE_DIR.parent) for p in source_files]
-    source_files.insert(0, Path("openjpeg/_openjpeg.pyx"))
+    source_files = [p.relative_to(Path(__file__).parent) for p in source_files]
+    source_files.insert(0, PACKAGE_DIR / "_openjpeg.pyx")
 
     return source_files
 
 
 def setup_oj() -> None:
     """Run custom cmake."""
-    base_dir = PACKAGE_DIR / "src" / "openjpeg"
+    base_dir = LIB_DIR / "openjpeg"
     p_openjpeg = base_dir / "src" / "lib" / "openjp2" / "openjpeg.c"
 
     # Backup original CMakeLists.txt and openjpeg.c files
-    backup_dir = BUILD_TOOLS / "backup"
-    if os.path.exists(backup_dir):
-        shutil.rmtree(backup_dir)
+    if os.path.exists(BACKUP_DIR):
+        shutil.rmtree(BACKUP_DIR)
 
-    backup_dir.mkdir(exist_ok=True, parents=True)
+    BACKUP_DIR.mkdir(exist_ok=True, parents=True)
 
     shutil.copy(
-        base_dir / "CMakeLists.txt",
-        backup_dir / "CMakeLists.txt.backup",
+        LIB_DIR / "openjpeg" / "CMakeLists.txt",
+        BACKUP_DIR / "CMakeLists.txt.backup",
     )
     shutil.copy(
-        p_openjpeg,
-        backup_dir / "openjpeg.c.backup",
+        OPENJPEG_SRC / "openjpeg.c",
+        BACKUP_DIR / "openjpeg.c.backup",
     )
 
     # Copy custom CMakeLists.txt file to openjpeg base dir
     shutil.copy(
         BUILD_TOOLS / "cmake" / "CMakeLists.txt",
-        base_dir,
+        LIB_DIR / "openjpeg" / "CMakeLists.txt",
     )
     # Edit openjpeg.c to remove the OPJ_API declaration
     with p_openjpeg.open("r") as f:
@@ -115,9 +117,8 @@ def setup_oj() -> None:
     with p_openjpeg.open("w") as f:
         f.write("".join(data))
 
-    build_dir = base_dir / "build"
-    if os.path.exists(build_dir):
-        shutil.rmtree(build_dir)
+    if os.path.exists(BUILD_DIR):
+        shutil.rmtree(BUILD_DIR)
 
     try:
         os.remove(INTERFACE_SRC / "opj_config.h")
@@ -125,11 +126,10 @@ def setup_oj() -> None:
     except:
         pass
 
-    os.mkdir(build_dir)
-    fpath = os.path.abspath(base_dir)
+    os.mkdir(BUILD_DIR)
     cur_dir = os.getcwd()
-    os.chdir(build_dir)
-    subprocess.call(['cmake', fpath])
+    os.chdir(BUILD_DIR)
+    subprocess.call(['cmake', os.fspath((LIB_DIR / "openjpeg").resolve(strict=True))])
     os.chdir(cur_dir)
 
     # Turn off JPIP
@@ -142,26 +142,21 @@ def setup_oj() -> None:
 def reset_oj() -> None:
     # Restore submodule to original state
     # Restore CMakeLists.txt and openjpeg.c files
-    base_dir = PACKAGE_DIR / "src" / "openjpeg"
-    build_dir = base_dir / "build"
-    backup_dir = BUILD_TOOLS / "backup"
-    p_openjpeg = base_dir / "src" / "lib" / "openjp2" / "openjpeg.c"
-
-    if (backup_dir / "CMakeLists.txt.backup").exists():
+    if (BACKUP_DIR / "CMakeLists.txt.backup").exists():
         shutil.copy(
-            backup_dir / "CMakeLists.txt.backup",
-            base_dir / "CMakeLists.txt",
+            BACKUP_DIR / "CMakeLists.txt.backup",
+            LIB_DIR / "openjpeg" / "CMakeLists.txt",
         )
 
-    if (backup_dir / "openjpeg.c.backup").exists():
+    if (BACKUP_DIR / "openjpeg.c.backup").exists():
         shutil.copy(
-            BUILD_TOOLS / "backup" / "openjpeg.c.backup",
-            p_openjpeg,
+            BACKUP_DIR / "openjpeg.c.backup",
+            OPENJPEG_SRC / "openjpeg.c",
         )
 
     # Cleanup added directories
-    if os.path.exists(build_dir):
-        shutil.rmtree(build_dir)
+    if os.path.exists(BUILD_DIR):
+        shutil.rmtree(BUILD_DIR)
 
-    if os.path.exists(backup_dir):
-        shutil.rmtree(backup_dir)
+    if os.path.exists(BACKUP_DIR):
+        shutil.rmtree(BACKUP_DIR)
diff --git a/openjpeg/src/interface/color.c b/lib/interface/color.c
similarity index 100%
rename from openjpeg/src/interface/color.c
rename to lib/interface/color.c
diff --git a/openjpeg/src/interface/color.h b/lib/interface/color.h
similarity index 100%
rename from openjpeg/src/interface/color.h
rename to lib/interface/color.h
diff --git a/openjpeg/src/interface/decode.c b/lib/interface/decode.c
similarity index 100%
rename from openjpeg/src/interface/decode.c
rename to lib/interface/decode.c
diff --git a/openjpeg/src/openjpeg b/lib/openjpeg
similarity index 100%
rename from openjpeg/src/openjpeg
rename to lib/openjpeg
diff --git a/openjpeg/_openjpeg.c b/openjpeg/_openjpeg.c
index d445045..5bc7c7c 100644
--- a/openjpeg/_openjpeg.c
+++ b/openjpeg/_openjpeg.c
@@ -4,52 +4,52 @@
 {
     "distutils": {
         "depends": [
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include/numpy/arrayobject.h",
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include/numpy/arrayscalars.h",
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include/numpy/ndarrayobject.h",
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include/numpy/ndarraytypes.h",
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include/numpy/ufuncobject.h"
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h",
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include/numpy/arrayscalars.h",
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h",
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h",
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include/numpy/ufuncobject.h"
         ],
         "include_dirs": [
-            "/home/dean/Coding/src/pylibjpeg-openjpeg/openjpeg/src/openjpeg/src/lib/openjp2",
-            "/home/dean/Coding/src/pylibjpeg-openjpeg/openjpeg/src/interface",
-            "/tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/core/include"
+            "/home/dean/Coding/src/pylibjpeg-openjpeg/lib/openjpeg/src/lib/openjp2",
+            "/home/dean/Coding/src/pylibjpeg-openjpeg/lib/interface",
+            "/tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/core/include"
         ],
         "language": "c",
         "name": "_openjpeg",
         "sources": [
-            "openjpeg/_openjpeg.pyx",
-            "openjpeg/src/interface/decode.c",
-            "openjpeg/src/interface/color.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/openjpeg.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/cio.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/sparse_array.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/tgt.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/mqc.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/thread.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/t1_ht_generate_luts.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/t2.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/pi.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/image.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/opj_malloc.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/tcd.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/event.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/cidx_manager.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/mct.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/thix_manager.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/bio.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/invert.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/jp2.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/phix_manager.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/j2k.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/tpix_manager.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/ppix_manager.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/ht_dec.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/t1.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/function_list.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/dwt.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/t1_generate_luts.c",
-            "openjpeg/src/openjpeg/src/lib/openjp2/opj_clock.c"
+            "/home/dean/Coding/src/pylibjpeg-openjpeg/openjpeg/_openjpeg.pyx",
+            "lib/interface/decode.c",
+            "lib/interface/color.c",
+            "lib/openjpeg/src/lib/openjp2/function_list.c",
+            "lib/openjpeg/src/lib/openjp2/pi.c",
+            "lib/openjpeg/src/lib/openjp2/t2.c",
+            "lib/openjpeg/src/lib/openjp2/t1_generate_luts.c",
+            "lib/openjpeg/src/lib/openjp2/ht_dec.c",
+            "lib/openjpeg/src/lib/openjp2/bio.c",
+            "lib/openjpeg/src/lib/openjp2/j2k.c",
+            "lib/openjpeg/src/lib/openjp2/tgt.c",
+            "lib/openjpeg/src/lib/openjp2/sparse_array.c",
+            "lib/openjpeg/src/lib/openjp2/jp2.c",
+            "lib/openjpeg/src/lib/openjp2/mct.c",
+            "lib/openjpeg/src/lib/openjp2/opj_malloc.c",
+            "lib/openjpeg/src/lib/openjp2/event.c",
+            "lib/openjpeg/src/lib/openjp2/ppix_manager.c",
+            "lib/openjpeg/src/lib/openjp2/dwt.c",
+            "lib/openjpeg/src/lib/openjp2/t1_ht_generate_luts.c",
+            "lib/openjpeg/src/lib/openjp2/t1.c",
+            "lib/openjpeg/src/lib/openjp2/phix_manager.c",
+            "lib/openjpeg/src/lib/openjp2/thread.c",
+            "lib/openjpeg/src/lib/openjp2/image.c",
+            "lib/openjpeg/src/lib/openjp2/tcd.c",
+            "lib/openjpeg/src/lib/openjp2/opj_clock.c",
+            "lib/openjpeg/src/lib/openjp2/tpix_manager.c",
+            "lib/openjpeg/src/lib/openjp2/mqc.c",
+            "lib/openjpeg/src/lib/openjp2/openjpeg.c",
+            "lib/openjpeg/src/lib/openjp2/thix_manager.c",
+            "lib/openjpeg/src/lib/openjp2/invert.c",
+            "lib/openjpeg/src/lib/openjp2/cio.c",
+            "lib/openjpeg/src/lib/openjp2/cidx_manager.c"
         ]
     },
     "module_name": "_openjpeg"
@@ -1550,7 +1550,7 @@ static const char *__pyx_f[] = {
 
 /* #### Code section: numeric_typedefs ### */
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":730
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":731
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -1559,7 +1559,7 @@ static const char *__pyx_f[] = {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":731
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":732
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -1568,7 +1568,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":732
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":733
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -1577,7 +1577,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":733
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":734
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -1586,7 +1586,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":737
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":738
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -1595,7 +1595,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":738
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":739
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -1604,7 +1604,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":739
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":740
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -1613,7 +1613,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":740
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":741
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -1622,7 +1622,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":744
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":745
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -1631,7 +1631,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":745
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":746
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -1640,43 +1640,61 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":754
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":755
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
+ * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t
- * 
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":755
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":756
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
+ * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
+ * ctypedef npy_longlong   longlong_t
+ * 
+ */
+typedef npy_longlong __pyx_t_5numpy_long_t;
+
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":757
+ * ctypedef npy_long       int_t
+ * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
  * 
  * ctypedef npy_ulong      uint_t
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":757
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":759
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
+ * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t
- * 
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":758
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":760
  * 
  * ctypedef npy_ulong      uint_t
+ * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
+ * ctypedef npy_ulonglong  ulonglong_t
+ * 
+ */
+typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":761
+ * ctypedef npy_ulong      uint_t
+ * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
  * 
  * ctypedef npy_intp       intp_t
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":760
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":763
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1685,7 +1703,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":761
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":764
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1694,7 +1712,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":763
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":766
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1703,7 +1721,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":764
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":767
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1712,7 +1730,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":765
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":768
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1749,7 +1767,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 /*--- Type declarations ---*/
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":767
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":770
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1758,7 +1776,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":768
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":771
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1767,7 +1785,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":769
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":772
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1776,7 +1794,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":771
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":774
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -3369,7 +3387,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) {
 #define __pyx_codeobj__11 __pyx_mstate_global->__pyx_codeobj__11
 /* #### Code section: module_code ### */
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":245
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":245
  * 
  *         @property
  *         cdef inline PyObject* base(self) nogil:             # <<<<<<<<<<<<<<
@@ -3380,7 +3398,7 @@ static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) {
 static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject *__pyx_v_self) {
   PyObject *__pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":248
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":248
  *             """Returns a borrowed reference to the object owning the data/memory.
  *             """
  *             return PyArray_BASE(self)             # <<<<<<<<<<<<<<
@@ -3390,7 +3408,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject
   __pyx_r = PyArray_BASE(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":245
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":245
  * 
  *         @property
  *         cdef inline PyObject* base(self) nogil:             # <<<<<<<<<<<<<<
@@ -3403,7 +3421,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_7ndarray_4base_base(PyArrayObject
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":251
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":251
  * 
  *         @property
  *         cdef inline dtype descr(self):             # <<<<<<<<<<<<<<
@@ -3417,7 +3435,7 @@ static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArray
   PyArray_Descr *__pyx_t_1;
   __Pyx_RefNannySetupContext("descr", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":254
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":254
  *             """Returns an owned reference to the dtype of the array.
  *             """
  *             return <dtype>PyArray_DESCR(self)             # <<<<<<<<<<<<<<
@@ -3430,7 +3448,7 @@ static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArray
   __pyx_r = ((PyArray_Descr *)__pyx_t_1);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":251
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":251
  * 
  *         @property
  *         cdef inline dtype descr(self):             # <<<<<<<<<<<<<<
@@ -3445,7 +3463,7 @@ static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArray
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":257
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":257
  * 
  *         @property
  *         cdef inline int ndim(self) nogil:             # <<<<<<<<<<<<<<
@@ -3456,7 +3474,7 @@ static CYTHON_INLINE PyArray_Descr *__pyx_f_5numpy_7ndarray_5descr_descr(PyArray
 static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx_v_self) {
   int __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":260
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":260
  *             """Returns the number of dimensions in the array.
  *             """
  *             return PyArray_NDIM(self)             # <<<<<<<<<<<<<<
@@ -3466,7 +3484,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx
   __pyx_r = PyArray_NDIM(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":257
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":257
  * 
  *         @property
  *         cdef inline int ndim(self) nogil:             # <<<<<<<<<<<<<<
@@ -3479,7 +3497,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":263
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":263
  * 
  *         @property
  *         cdef inline npy_intp *shape(self) nogil:             # <<<<<<<<<<<<<<
@@ -3490,7 +3508,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_7ndarray_4ndim_ndim(PyArrayObject *__pyx
 static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObject *__pyx_v_self) {
   npy_intp *__pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":268
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":268
  *             Can return NULL for 0-dimensional arrays.
  *             """
  *             return PyArray_DIMS(self)             # <<<<<<<<<<<<<<
@@ -3500,7 +3518,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObjec
   __pyx_r = PyArray_DIMS(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":263
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":263
  * 
  *         @property
  *         cdef inline npy_intp *shape(self) nogil:             # <<<<<<<<<<<<<<
@@ -3513,7 +3531,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObjec
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":271
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":271
  * 
  *         @property
  *         cdef inline npy_intp *strides(self) nogil:             # <<<<<<<<<<<<<<
@@ -3524,7 +3542,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_5shape_shape(PyArrayObjec
 static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayObject *__pyx_v_self) {
   npy_intp *__pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":275
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":275
  *             The number of elements matches the number of dimensions of the array (ndim).
  *             """
  *             return PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
@@ -3534,7 +3552,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayO
   __pyx_r = PyArray_STRIDES(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":271
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":271
  * 
  *         @property
  *         cdef inline npy_intp *strides(self) nogil:             # <<<<<<<<<<<<<<
@@ -3547,7 +3565,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayO
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":278
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":278
  * 
  *         @property
  *         cdef inline npy_intp size(self) nogil:             # <<<<<<<<<<<<<<
@@ -3558,7 +3576,7 @@ static CYTHON_INLINE npy_intp *__pyx_f_5numpy_7ndarray_7strides_strides(PyArrayO
 static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *__pyx_v_self) {
   npy_intp __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":281
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":281
  *             """Returns the total size (in number of elements) of the array.
  *             """
  *             return PyArray_SIZE(self)             # <<<<<<<<<<<<<<
@@ -3568,7 +3586,7 @@ static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *
   __pyx_r = PyArray_SIZE(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":278
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":278
  * 
  *         @property
  *         cdef inline npy_intp size(self) nogil:             # <<<<<<<<<<<<<<
@@ -3581,7 +3599,7 @@ static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":284
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":284
  * 
  *         @property
  *         cdef inline char* data(self) nogil:             # <<<<<<<<<<<<<<
@@ -3592,7 +3610,7 @@ static CYTHON_INLINE npy_intp __pyx_f_5numpy_7ndarray_4size_size(PyArrayObject *
 static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__pyx_v_self) {
   char *__pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":290
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":290
  *             of `PyArray_DATA()` instead, which returns a 'void*'.
  *             """
  *             return PyArray_BYTES(self)             # <<<<<<<<<<<<<<
@@ -3602,7 +3620,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__p
   __pyx_r = PyArray_BYTES(__pyx_v_self);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":284
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":284
  * 
  *         @property
  *         cdef inline char* data(self) nogil:             # <<<<<<<<<<<<<<
@@ -3615,7 +3633,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy_7ndarray_4data_data(PyArrayObject *__p
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":773
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":776
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3632,7 +3650,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":774
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":777
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -3640,13 +3658,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":773
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":776
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3665,7 +3683,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":776
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":779
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3682,7 +3700,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":777
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":780
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -3690,13 +3708,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":776
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":779
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3715,7 +3733,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":779
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":782
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3732,7 +3750,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":780
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":783
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -3740,13 +3758,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":779
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":782
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3765,7 +3783,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":782
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":785
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3782,7 +3800,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":783
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":786
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -3790,13 +3808,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":782
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":785
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3815,7 +3833,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":785
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":788
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3832,7 +3850,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":786
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":789
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -3840,13 +3858,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 786, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 789, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":785
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":788
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3865,7 +3883,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":788
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":791
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3879,7 +3897,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":789
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":792
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3889,7 +3907,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = PyDataType_HASSUBARRAY(__pyx_v_d);
   if (__pyx_t_1) {
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":790
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":793
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -3901,7 +3919,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":789
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":792
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3910,7 +3928,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":792
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":795
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
@@ -3924,7 +3942,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":788
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":791
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3939,7 +3957,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":968
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":970
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3948,12 +3966,8 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
 
 static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
-  int __pyx_t_1;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":969
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":971
  * 
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
@@ -3962,16 +3976,16 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_INCREF(__pyx_v_base);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":970
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":972
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!
  *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
  * 
  * cdef inline object get_array_base(ndarray arr):
  */
-  __pyx_t_1 = PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 970, __pyx_L1_error)
+  (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":968
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":970
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3980,13 +3994,9 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
 
   /* function exit code */
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("numpy.set_array_base", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_L0:;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":972
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":974
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -4001,7 +4011,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":973
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":975
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
@@ -4010,7 +4020,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":974
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":976
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -4020,7 +4030,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = (__pyx_v_base == NULL);
   if (__pyx_t_1) {
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":975
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":977
  *     base = PyArray_BASE(arr)
  *     if base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -4031,7 +4041,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":974
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":976
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -4040,7 +4050,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":976
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":978
  *     if base is NULL:
  *         return None
  *     return <object>base             # <<<<<<<<<<<<<<
@@ -4052,7 +4062,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_r = ((PyObject *)__pyx_v_base);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":972
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":974
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -4067,7 +4077,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":980
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":982
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -4091,7 +4101,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":981
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":983
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4107,16 +4117,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":982
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":984
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 982, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 984, __pyx_L3_error)
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":981
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":983
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4130,7 +4140,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":983
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":985
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4140,27 +4150,27 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 983, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 985, __pyx_L5_except_error)
       __Pyx_XGOTREF(__pyx_t_5);
       __Pyx_XGOTREF(__pyx_t_6);
       __Pyx_XGOTREF(__pyx_t_7);
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":984
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":986
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 984, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 986, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 984, __pyx_L5_except_error)
+      __PYX_ERR(1, 986, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":981
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":983
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4176,7 +4186,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":980
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":982
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -4199,7 +4209,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":986
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":988
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -4223,7 +4233,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":987
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":989
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4239,16 +4249,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":988
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":990
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 988, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 990, __pyx_L3_error)
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":987
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":989
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4262,7 +4272,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":989
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":991
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4272,27 +4282,27 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 989, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 991, __pyx_L5_except_error)
       __Pyx_XGOTREF(__pyx_t_5);
       __Pyx_XGOTREF(__pyx_t_6);
       __Pyx_XGOTREF(__pyx_t_7);
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":990
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":992
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 990, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 992, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 990, __pyx_L5_except_error)
+      __PYX_ERR(1, 992, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":987
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":989
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4308,7 +4318,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":986
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":988
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -4331,7 +4341,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":992
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":994
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4355,7 +4365,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 1);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":993
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":995
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4371,16 +4381,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":994
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":996
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 994, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 996, __pyx_L3_error)
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":993
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":995
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4394,7 +4404,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":995
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":997
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4404,27 +4414,27 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 995, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 997, __pyx_L5_except_error)
       __Pyx_XGOTREF(__pyx_t_5);
       __Pyx_XGOTREF(__pyx_t_6);
       __Pyx_XGOTREF(__pyx_t_7);
 
-      /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":996
+      /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":998
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * 
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 996, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 998, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 996, __pyx_L5_except_error)
+      __PYX_ERR(1, 998, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
 
-    /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":993
+    /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":995
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4440,7 +4450,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":992
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":994
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4463,7 +4473,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":999
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1001
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4474,7 +4484,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
 static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) {
   int __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1011
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1013
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
@@ -4484,7 +4494,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":999
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1001
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4497,7 +4507,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1014
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1016
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4508,7 +4518,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
 static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) {
   int __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1026
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1028
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
@@ -4518,7 +4528,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1014
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1016
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4531,7 +4541,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1029
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1031
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4542,7 +4552,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
 static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
   npy_datetime __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1036
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1038
  *     also needed.  That can be found using `get_datetime64_unit`.
  *     """
  *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4552,7 +4562,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1029
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1031
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4565,7 +4575,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1039
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1041
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4576,7 +4586,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
 static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
   npy_timedelta __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1043
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1045
  *     returns the int64 value underlying scalar numpy timedelta64 object
  *     """
  *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4586,7 +4596,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1039
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1041
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4599,7 +4609,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   return __pyx_r;
 }
 
-/* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1046
+/* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1048
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4610,7 +4620,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
 static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
   NPY_DATETIMEUNIT __pyx_r;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1050
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1052
  *     returns the unit part of the dtype for a numpy datetime64 object.
  *     """
  *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
@@ -4618,7 +4628,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
   goto __pyx_L0;
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":1046
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":1048
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -6012,7 +6022,7 @@ static int __Pyx_CreateStringTabAndInitStrings(void) {
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(0, 94, __pyx_L1_error)
   __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(0, 149, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 984, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 986, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -6023,25 +6033,25 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":984
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":986
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 984, __pyx_L1_error)
+  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 986, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple_);
   __Pyx_GIVEREF(__pyx_tuple_);
 
-  /* "../../../../../tmp/pip-build-env-u57ay04s/overlay/local/lib/python3.10/dist-packages/numpy/__init__.cython-30.pxd":990
+  /* "../../../../../tmp/tmpkhqunq9n/.venv/lib/python3.8/site-packages/numpy/__init__.cython-30.pxd":992
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 990, __pyx_L1_error)
+  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 992, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__2);
   __Pyx_GIVEREF(__pyx_tuple__2);
 
@@ -6198,17 +6208,17 @@ static int __Pyx_modinit_type_import_code(void) {
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyArrayIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_7); if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 225, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyArrayMultiIterObject),__Pyx_ImportType_CheckSize_Ignore_3_0_7); if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 229, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyArrayObject),__Pyx_ImportType_CheckSize_Ignore_3_0_7); if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error)
-  __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 809, __pyx_L1_error)
-  __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 811, __pyx_L1_error)
-  __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 813, __pyx_L1_error)
-  __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 815, __pyx_L1_error)
-  __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 817, __pyx_L1_error)
-  __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 819, __pyx_L1_error)
-  __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 821, __pyx_L1_error)
-  __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 823, __pyx_L1_error)
-  __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 825, __pyx_L1_error)
-  __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 827, __pyx_L1_error)
-  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_7); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 866, __pyx_L1_error)
+  __pyx_ptype_5numpy_generic = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 812, __pyx_L1_error)
+  __pyx_ptype_5numpy_number = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "number", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 814, __pyx_L1_error)
+  __pyx_ptype_5numpy_integer = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 816, __pyx_L1_error)
+  __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 818, __pyx_L1_error)
+  __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 820, __pyx_L1_error)
+  __pyx_ptype_5numpy_inexact = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 822, __pyx_L1_error)
+  __pyx_ptype_5numpy_floating = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 824, __pyx_L1_error)
+  __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 826, __pyx_L1_error)
+  __pyx_ptype_5numpy_flexible = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 828, __pyx_L1_error)
+  __pyx_ptype_5numpy_character = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "character", sizeof(PyObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyObject),__Pyx_ImportType_CheckSize_Warn_3_0_7); if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 830, __pyx_L1_error)
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType_3_0_7(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_7(PyUFuncObject),__Pyx_ImportType_CheckSize_Ignore_3_0_7); if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 868, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
diff --git a/pyproject.toml b/pyproject.toml
index 397606b..3e0dedc 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -34,23 +34,18 @@ description = """\
     "for pylibjpeg"\
 """
 homepage = "https://github.com/pydicom/pylibjpeg-openjpeg"
-include = [
-    "openjpeg/src/interface/*",
-    # openjpeg source file includes
-    "openjpeg/src/openjpeg/src/lib/openjp2/*",
-    "openjpeg/src/openjpeg/src/lib/CMakeLists.txt",
-    "openjpeg/src/openjpeg/src/CMakeLists.txt",
-    "openjpeg/src/openjpeg/cmake/*",
-    "openjpeg/src/openjpeg/*.md",
-    "openjpeg/src/openjpeg/LICENSE",
-    "build_tools/*",
-]
 keywords = ["dicom pydicom python imaging jpg jpeg jpeg2k jpeg2000 pylibjpeg openjpeg"]
 license = "MIT"
 maintainers = ["scaramallion <scaramallion@users.noreply.github.com>"]
 name = "pylibjpeg-openjpeg"
+# We want to be able to build from sdist, so include required openjpeg src
+#   But don't include any openjpeg src in the built wheels
+include = [
+    { path = "lib", format="sdist" },
+    { path = "build_tools", format="sdist" },
+]
 packages = [
-    {include = "openjpeg"}
+    {include = "openjpeg" },
 ]
 readme = "README.md"
 version = "2.0.0.dev0"


Test patch:
diff --git a/.github/workflows/pytest-builds.yml b/.github/workflows/pytest-builds.yml
index 3458af2..fb6a76b 100644
--- a/.github/workflows/pytest-builds.yml
+++ b/.github/workflows/pytest-builds.yml
@@ -35,12 +35,12 @@ jobs:
 
     - name: Run pytest
       run: |
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
     - name: Install pydicom release and rerun pytest
       run: |
         pip install pydicom pylibjpeg
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
   osx:
     runs-on: macos-latest
@@ -69,12 +69,12 @@ jobs:
 
     - name: Run pytest
       run: |
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
     - name: Install pydicom release and rerun pytest
       run: |
         pip install pydicom pylibjpeg
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
   ubuntu:
     runs-on: ubuntu-latest
@@ -103,19 +103,19 @@ jobs:
 
     - name: Run pytest
       run: |
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
     - name: Install pydicom release and rerun pytest
       run: |
         pip install pydicom pylibjpeg
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
     - name: Switch to pydicom dev and rerun pytest (3.10+)
       if: ${{ contains('3.10 3.11 3.12', matrix.python-version) }}
       run: |
         pip uninstall -y pydicom
         pip install git+https://github.com/pydicom/pydicom
-        pytest --cov openjpeg --ignore=openjpeg/src/openjpeg
+        pytest --cov openjpeg openjpeg/tests
 
     - name: Send coverage results
       if: ${{ success() && matrix.coverage == 'coverage' }}