diff -pruN 4.2.3-1/.github/workflows/ci.yml 4.3.1-1/.github/workflows/ci.yml
--- 4.2.3-1/.github/workflows/ci.yml	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/.github/workflows/ci.yml	2025-03-16 16:31:02.000000000 +0000
@@ -78,8 +78,7 @@ jobs:
           - name: 🐧
             runs-on: ubuntu-latest
           - name: 🍎
-            # This would preferably be macos-latest, but it has pip updating bugs right now.
-            runs-on: macos-12
+            runs-on: macos-13
           - name: 🪟
             runs-on: windows-latest
         python:
@@ -98,11 +97,9 @@ jobs:
           - name: CPython 3.12
             major_dot_minor: '3.12'
             action: '3.12'
-# Failing due to error using temporary file in a unittest. I think it's a PyPy bug, not a bitstring one!
-          # - name: PyPy 3.8
-            # major_dot_minor: '3.8'
-            # action: 'pypy-3.8'
-
+          - name: CPython 3.13
+            major_dot_minor: '3.13'
+            action: '3.13'
 
     steps:
       - uses: actions/checkout@v4
diff -pruN 4.2.3-1/LICENSE 4.3.1-1/LICENSE
--- 4.2.3-1/LICENSE	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/LICENSE	2025-03-16 16:31:02.000000000 +0000
@@ -1,6 +1,6 @@
 The MIT License
 
-Copyright (c) 2006 Scott Griffiths (dr.scottgriffiths@gmail.com)
+Copyright (c) 2006-2025 Scott Griffiths (dr.scottgriffiths@gmail.com)
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff -pruN 4.2.3-1/README.md 4.3.1-1/README.md
--- 4.2.3-1/README.md	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/README.md	2025-03-16 16:31:02.000000000 +0000
@@ -2,9 +2,9 @@
 
 ![bitstring](https://raw.githubusercontent.com/scott-griffiths/bitstring/main/doc/bitstring_logo_small.png "bitstring")
 
-**bitstring** is a Python module to help make the creation and analysis of all types of bit-level binary data as simple and efficient as possible.
+**bitstring** is a Python library to help make the creation and analysis of all types of bit-level binary data as simple and efficient as possible. It has been actively maintained since 2006.
 
-It has been actively maintained since 2006.
+The library has has now been downloaded over 100 million times! &nbsp; &nbsp; ✨ [![Pepy Total Downloads](https://img.shields.io/pepy/dt/bitstring?label=Downloads:&labelColor=orange&color=orange)](https://www.pepy.tech/projects/bitstring) ✨
 
 
 
@@ -13,7 +13,7 @@ It has been actively maintained since 20
 [![Codacy Badge](https://img.shields.io/codacy/grade/8869499b2eed44548fa1a5149dd451f4?logo=codacy)](https://app.codacy.com/gh/scott-griffiths/bitstring/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
 [![Dependents (via libraries.io)](https://img.shields.io/librariesio/dependents/pypi/bitstring?logo=libraries.io&logoColor=white)](https://libraries.io/pypi/bitstring)
 &nbsp; &nbsp;
-[![Pepy Total Downlods](https://img.shields.io/pepy/dt/bitstring?logo=python&logoColor=white&labelColor=blue&color=blue)](https://www.pepy.tech/projects/bitstring)
+[![Pepy Total Downloads](https://img.shields.io/pepy/dt/bitstring?logo=python&logoColor=white&labelColor=blue&color=blue)](https://www.pepy.tech/projects/bitstring)
 [![PyPI - Downloads](https://img.shields.io/pypi/dm/bitstring?label=%40&labelColor=blue&color=blue)](https://pypistats.org/packages/bitstring)
 
 ----
@@ -35,7 +35,7 @@ It has been actively maintained since 20
 
 # Documentation
 
-Extensive documentation for the bitstring module is available.
+Extensive documentation for the bitstring library is available.
 Some starting points are given below:
 
 * [Overview](https://bitstring.readthedocs.io/en/stable/index.html)
@@ -106,4 +106,4 @@ Array('uint7', [45, 100, 15, 1])
 ```
 
 
-<sub>Copyright (c) 2006 - 2024 Scott Griffiths</sub>
+<sub>Copyright (c) 2006 - 2025 Scott Griffiths</sub>
diff -pruN 4.2.3-1/bitstring/__init__.py 4.3.1-1/bitstring/__init__.py
--- 4.2.3-1/bitstring/__init__.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/bitstring/__init__.py	2025-03-16 16:31:02.000000000 +0000
@@ -55,7 +55,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWAR
 THE SOFTWARE.
 """
 
-__version__ = "4.2.3"
+__version__ = "4.3.1"
 
 __author__ = "Scott Griffiths"
 
diff -pruN 4.2.3-1/bitstring/array_.py 4.3.1-1/bitstring/array_.py
--- 4.2.3-1/bitstring/array_.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/bitstring/array_.py	2025-03-16 16:31:02.000000000 +0000
@@ -760,12 +760,8 @@ class Array:
     def _eq_ne(self, op, other: Any) -> Array:
         if isinstance(other, (int, float, str, Bits)):
             return self._apply_op_to_all_elements(op, other, is_comparison=True)
-        try:
-            other = self.__class__(self.dtype, other)
-        except:
-            return NotImplemented
-        finally:
-            return self._apply_op_between_arrays(op, other, is_comparison=True)
+        other = self.__class__(self.dtype, other)
+        return self._apply_op_between_arrays(op, other, is_comparison=True)
 
     def __eq__(self, other: Any) -> Array:
         return self._eq_ne(operator.eq, other)
diff -pruN 4.2.3-1/bitstring/bits.py 4.3.1-1/bitstring/bits.py
--- 4.2.3-1/bitstring/bits.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/bitstring/bits.py	2025-03-16 16:31:02.000000000 +0000
@@ -159,7 +159,7 @@ class Bits:
                 f"The 'auto' parameter should not be given explicitly - just use the first positional argument. "
                 f"Instead of '{self.__class__.__name__}(auto=x)' use '{self.__class__.__name__}(x)'.")
         if offset is not None:
-            raise bitstring.CreationError("offset cannot be used when initialising with '{k}'.")
+            raise bitstring.CreationError(f"offset cannot be used when initialising with '{k}'.")
         try:
             Dtype(k, length).set_fn(self, v)
         except ValueError as e:
@@ -231,13 +231,8 @@ class Bits:
     def __getitem__(self: TBits, key: Union[slice, int], /) -> Union[TBits, bool]:
         """Return a new bitstring representing a slice of the current bitstring.
 
-        Indices are in units of the step parameter (default 1 bit).
-        Stepping is used to specify the number of bits in each item.
-
-        >>> print(BitArray('0b00110')[1:4])
+        >>> print(Bits('0b00110')[1:4])
         '0b011'
-        >>> print(BitArray('0x00112233')[1:3:8])
-        '0x1122'
 
         """
         if isinstance(key, numbers.Integral):
diff -pruN 4.2.3-1/bitstring/bitstore.py 4.3.1-1/bitstring/bitstore.py
--- 4.2.3-1/bitstring/bitstore.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/bitstring/bitstore.py	2025-03-16 16:31:02.000000000 +0000
@@ -4,24 +4,38 @@ import bitarray
 from bitstring.exceptions import CreationError
 from typing import Union, Iterable, Optional, overload, Iterator, Any
 
+if bitarray.__version__.startswith("2."):
+    raise ImportError(f"bitstring version 4.3 requires bitarray version 3 or higher. Found version {bitarray.__version__}.")
+
+def indices(s: slice, length: int) -> tuple[int, int | None, int]:
+    """A better implementation of slice.indices such that a
+    slice made from [start:stop:step] will actually equal the original slice."""
+    if s.step is None or s.step > 0:
+        return s.indices(length)
+    assert s.step < 0
+    start, stop, step = s.indices(length)
+    if stop < 0:
+        stop = None
+    return start, stop, step
 
 def offset_slice_indices_lsb0(key: slice, length: int) -> slice:
-    # First convert slice to all integers
-    # Length already should take account of the offset
-    start, stop, step = key.indices(length)
-    new_start = length - stop
-    new_stop = length - start
-    # For negative step we sometimes get a negative stop, which can't be used correctly in a new slice
-    return slice(new_start, None if new_stop < 0 else new_stop, step)
-
-
-def offset_start_stop_lsb0(start: Optional[int], stop: Optional[int], length: int) -> tuple[int, int]:
-    # First convert slice to all integers
-    # Length already should take account of the offset
-    start, stop, _ = slice(start, stop, None).indices(length)
-    new_start = length - stop
-    new_stop = length - start
-    return new_start, new_stop
+    start, stop, step = indices(key, length)
+    if step is not None and step < 0:
+        if stop is None:
+            new_start = start + 1
+            new_stop = None
+        else:
+            first_element = start
+            last_element = start + ((stop + 1 - start) // step) * step
+            new_start = length - last_element
+            new_stop = length - first_element - 1
+    else:
+        first_element = start
+        # The last element will usually be stop - 1, but needs to be adjusted if step != 1.
+        last_element = start + ((stop - 1 - start) // step) * step
+        new_start = length - last_element - 1
+        new_stop = length - first_element
+    return slice(new_start, new_stop, key.step)
 
 
 class BitStore:
@@ -150,7 +164,7 @@ class BitStore:
                 byte_pos = byte_pos + 1
             return
         # General case
-        i = self._bitarray.itersearch(bs._bitarray, start, end)
+        i = self._bitarray.search(bs._bitarray, start, end)
         if not bytealigned:
             for p in i:
                 yield p
@@ -160,7 +174,7 @@ class BitStore:
                     yield p
 
     def rfindall_msb0(self, bs: BitStore, start: int, end: int, bytealigned: bool = False) -> Iterator[int]:
-        i = self._bitarray.itersearch(bs._bitarray, start, end, right=True)
+        i = self._bitarray.search(bs._bitarray, start, end, right=True)
         if not bytealigned:
             for p in i:
                 yield p
@@ -213,8 +227,8 @@ class BitStore:
         return BitStore(self._bitarray[start:stop])
 
     def getslice_lsb0(self, start: Optional[int], stop: Optional[int], /) -> BitStore:
-        start, stop = offset_start_stop_lsb0(start, stop, len(self))
-        return BitStore(self._bitarray[start:stop])
+        s = offset_slice_indices_lsb0(slice(start, stop, None), len(self))
+        return BitStore(self._bitarray[s.start:s.stop])
 
     def getindex_lsb0(self, index: int, /) -> bool:
         return bool(self._bitarray.__getitem__(-index - 1))
diff -pruN 4.2.3-1/bitstring/utils.py 4.3.1-1/bitstring/utils.py
--- 4.2.3-1/bitstring/utils.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/bitstring/utils.py	2025-03-16 16:31:02.000000000 +0000
@@ -21,26 +21,28 @@ MULTIPLICATIVE_RE: Pattern[str] = re.com
 LITERAL_RE: Pattern[str] = re.compile(r'^(?P<name>0([xob]))(?P<value>.+)', re.IGNORECASE)
 
 # An endianness indicator followed by one or more struct.pack codes
-STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])(?P<fmt>(?:\d*[bBhHlLqQefd])+)$')
+STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])(?P<fmt>(?:\d*[bBhHlLiIqQefd])+)$')
 # The same as above, but it doesn't insist on an endianness as it's byteswapping anyway.
-BYTESWAP_STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])?(?P<fmt>(?:\d*[bBhHlLqQefd])+)$')
+BYTESWAP_STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])?(?P<fmt>(?:\d*[bBhHlLiIqQefd])+)$')
 # An endianness indicator followed by exactly one struct.pack codes
-SINGLE_STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])(?P<fmt>[bBhHlLqQefd])$')
+SINGLE_STRUCT_PACK_RE: Pattern[str] = re.compile(r'^(?P<endian>[<>@=])(?P<fmt>[bBhHlLiIqQefd])$')
 
 # A number followed by a single character struct.pack code
-STRUCT_SPLIT_RE: Pattern[str] = re.compile(r'\d*[bBhHlLqQefd]')
+STRUCT_SPLIT_RE: Pattern[str] = re.compile(r'\d*[bBhHlLiIqQefd]')
 
 # These replicate the struct.pack codes
 # Big-endian
 REPLACEMENTS_BE: Dict[str, str] = {'b': 'int8', 'B': 'uint8',
                                    'h': 'intbe16', 'H': 'uintbe16',
                                    'l': 'intbe32', 'L': 'uintbe32',
+                                   'i': 'intbe32', 'I': 'uintbe32',
                                    'q': 'intbe64', 'Q': 'uintbe64',
                                    'e': 'floatbe16', 'f': 'floatbe32', 'd': 'floatbe64'}
 # Little-endian
 REPLACEMENTS_LE: Dict[str, str] = {'b': 'int8', 'B': 'uint8',
                                    'h': 'intle16', 'H': 'uintle16',
                                    'l': 'intle32', 'L': 'uintle32',
+                                   'i': 'intle32', 'I': 'uintle32',
                                    'q': 'intle64', 'Q': 'uintle64',
                                    'e': 'floatle16', 'f': 'floatle32', 'd': 'floatle64'}
 
@@ -48,11 +50,12 @@ REPLACEMENTS_LE: Dict[str, str] = {'b':
 REPLACEMENTS_NE: Dict[str, str] = {'b': 'int8', 'B': 'uint8',
                                    'h': 'intne16', 'H': 'uintne16',
                                    'l': 'intne32', 'L': 'uintne32',
+                                   'i': 'intne32', 'I': 'uintne32',
                                    'q': 'intne64', 'Q': 'uintne64',
                                    'e': 'floatne16', 'f': 'floatne32', 'd': 'floatne64'}
 
 # Size in bytes of all the pack codes.
-PACK_CODE_SIZE: Dict[str, int] = {'b': 1, 'B': 1, 'h': 2, 'H': 2, 'l': 4, 'L': 4,
+PACK_CODE_SIZE: Dict[str, int] = {'b': 1, 'B': 1, 'h': 2, 'H': 2, 'l': 4, 'L': 4, 'i': 4, 'I': 4,
                                   'q': 8, 'Q': 8, 'e': 2, 'f': 4, 'd': 8}
 
 
diff -pruN 4.2.3-1/debian/.gitignore 4.3.1-1/debian/.gitignore
--- 4.2.3-1/debian/.gitignore	1970-01-01 00:00:00.000000000 +0000
+++ 4.3.1-1/debian/.gitignore	2025-08-17 00:07:48.000000000 +0000
@@ -0,0 +1 @@
+/files
diff -pruN 4.2.3-1/debian/changelog 4.3.1-1/debian/changelog
--- 4.2.3-1/debian/changelog	2024-05-28 19:03:34.000000000 +0000
+++ 4.3.1-1/debian/changelog	2025-08-17 00:07:48.000000000 +0000
@@ -1,3 +1,13 @@
+python-bitstring (4.3.1-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+  * Use dh-sequence-python3 and dh-sequence-sphinxdoc.
+  * Simplify a debhelper override slightly.
+  * Standards-Version: 4.7.2.
+
+ -- Colin Watson <cjwatson@debian.org>  Sun, 17 Aug 2025 01:07:48 +0100
+
 python-bitstring (4.2.3-1) unstable; urgency=medium
 
   * New upstream release
diff -pruN 4.2.3-1/debian/control 4.3.1-1/debian/control
--- 4.2.3-1/debian/control	2024-05-28 19:03:34.000000000 +0000
+++ 4.3.1-1/debian/control	2025-08-17 00:07:48.000000000 +0000
@@ -5,17 +5,18 @@ Uploaders: Scott Kitterman <scott@kitter
 Section: python
 Priority: optional
 Build-Depends: debhelper-compat (= 13),
-               dh-python,
+               dh-sequence-python3,
+               dh-sequence-sphinxdoc,
                pybuild-plugin-pyproject,
                python3-all,
-               python3-bitarray,
+               python3-bitarray (>= 3.0.0),
                python3-gfloat <!nocheck>,
                python3-hypothesis <!nocheck>,
                python3-setuptools,
                python3-sphinx,
                python3-pytest <!nocheck>,
                python3-pytest-benchmark <!nocheck>,
-Standards-Version: 4.7.0
+Standards-Version: 4.7.2
 Rules-Requires-Root: no
 Vcs-Browser: https://salsa.debian.org/python-team/packages/python-bitstring
 Vcs-Git: https://salsa.debian.org/python-team/packages/python-bitstring.git
diff -pruN 4.2.3-1/debian/rules 4.3.1-1/debian/rules
--- 4.2.3-1/debian/rules	2024-05-28 19:03:34.000000000 +0000
+++ 4.3.1-1/debian/rules	2025-08-17 00:07:48.000000000 +0000
@@ -6,10 +6,9 @@
 export PYBUILD_NAME=bitstring
 
 %:
-	dh $@ --with python3,sphinxdoc --buildsystem=pybuild
+	dh $@ --buildsystem=pybuild
 
-override_dh_auto_build:
-	dh_auto_build
+execute_after_dh_auto_build:
 	PYTHONPATH=. http_proxy='127.0.0.1:9' \
 		sphinx-build -N -D html_theme=default -b html doc build/html
 
diff -pruN 4.2.3-1/doc/array.rst 4.3.1-1/doc/array.rst
--- 4.2.3-1/doc/array.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/array.rst	2025-03-16 16:31:02.000000000 +0000
@@ -329,7 +329,10 @@ Methods
 
 .. method:: Array.tofile(f: BinaryIO) -> None
 
-    Write Array data to a file, padding with zero bits at the end if needed.
+    Writes the Array data to the file object *f*, which should have been opened in binary write mode.
+
+    The data written will be padded at the end with between zero and seven ``0`` bits to make it byte aligned.
+    The file object remains open so the user must call `.close()` on it once they are finished.::
 
 .. method:: Array.tolist() -> List[float | int | str | bytes]
 
diff -pruN 4.2.3-1/doc/bits.rst 4.3.1-1/doc/bits.rst
--- 4.2.3-1/doc/bits.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/bits.rst	2025-03-16 16:31:02.000000000 +0000
@@ -285,7 +285,8 @@ Methods
 
     Writes the bitstring to the file object *f*, which should have been opened in binary write mode.
 
-    The data written will be padded at the end with between zero and seven ``0`` bits to make it byte aligned. ::
+    The data written will be padded at the end with between zero and seven ``0`` bits to make it byte aligned.
+    The file object remains open so the user must call `.close()` on it once they are finished.::
 
         >>> f = open('newfile', 'wb')
         >>> Bits('0x1234').tofile(f)
diff -pruN 4.2.3-1/doc/conf.py 4.3.1-1/doc/conf.py
--- 4.2.3-1/doc/conf.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/conf.py	2025-03-16 16:31:02.000000000 +0000
@@ -12,7 +12,7 @@ year = datetime.datetime.utcfromtimestam
 project = 'bitstring'
 copyright = f'2006 - {year}, Scott Griffiths'
 author = 'Scott Griffiths'
-release = '4.2'
+release = '4.3'
 
 extensions = []
 
@@ -31,7 +31,7 @@ html_css_files = ["custom.css"]
 html_theme = 'piccolo_theme'
 
 html_theme_options = {
-    "banner_text": "New requirement of Python 3.8 or later - see release notes for full details.",
+    # "banner_text": "New requirement of Python 3.8 or later - see release notes for full details.",
     "banner_hiding": "permanent",
     "show_theme_credit": False,
     "globaltoc_maxdepth": 2,
diff -pruN 4.2.3-1/doc/exotic_floats.rst 4.3.1-1/doc/exotic_floats.rst
--- 4.2.3-1/doc/exotic_floats.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/exotic_floats.rst	2025-03-16 16:31:02.000000000 +0000
@@ -60,8 +60,6 @@ IEEE 8-bit Floating Point Types
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 .. note::
-    This is an experimental feature and may be modified in future point releases.
-
     In bitstring prior to version 4.2 the `p4binary8` and `p3binary8` formats were called `e4m3float` and `e5m2float` respectively.
     The two formats are almost identical, the difference being the addition of `inf` values that replace the largest positive and negative values that were previously available.
 
@@ -163,9 +161,6 @@ This is the standard method used in IEEE
 Microscaling Formats
 ^^^^^^^^^^^^^^^^^^^^
 
-.. note::
-    This is an experimental feature and may be modified in future point releases.
-
 A range of formats from the Microscaling Formats (MX) Alliance are supported. These are part of the Open Compute Project, and will usually have an external scale factor associated with them.
 
 Eight-bit floats similar to the IEEE `p3binary8` and `p4binary8`  are available, though these seem rather arbitrary and ugly in places in comparison to the IEEE definitions.
@@ -259,7 +254,7 @@ This is the same as is used in the IEEE
 Note that for efficiency reasons Python floats are converted to 16-bit IEEE floats before being converted to their final destination.
 This can mean that in edge cases the rounding to the 16-bit float will cause the next rounding to go in the other direction.
 The 16-bit float has 11 bits of precision, whereas the final format has at most 4 bits of precision, so this shouldn't be a real-world problem, but it could cause discrepancies when comparing with other methods.
-I could add a slower, more accurate mode if this is a problem (add a bug report).
+I plan to add a slower, more accurate mode - see Issue #342.
 
 Values that are out of range after rounding are dealt with as follows:
 
diff -pruN 4.2.3-1/doc/index.rst 4.3.1-1/doc/index.rst
--- 4.2.3-1/doc/index.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/index.rst	2025-03-16 16:31:02.000000000 +0000
@@ -42,7 +42,7 @@ Overview
 
 It is not difficult to manipulate binary data in Python, for example using the ``struct`` and ``array`` modules, but it can be quite fiddly and time consuming even for quite small tasks, especially if you are not dealing with whole-byte data.
 
-The bitstring module provides support many different bit formats, allowing easy and efficient storage, interpretation and construction.
+The bitstring module provides support for many different bit formats, allowing easy and efficient storage, interpretation and construction.
 
 
 Documentation Quick Start
@@ -100,7 +100,7 @@ Bitstrings are designed to be as lightwe
 
 The different views or interpretations on the data are accessed through properties such as :attr:`~Bits.hex`, :attr:`~Bits.bin` and :attr:`~Bits.int`, and an extensive set of functions is supplied for modifying, navigating and analysing the binary data.
 
-There are also a companion classes called :class:`Bits` and :class:`ConstBitStream` which are immutable versions of :class:`BitArray` and :class:`BitStream` respectively.
+There are also companion classes called :class:`Bits` and :class:`ConstBitStream` which are immutable versions of :class:`BitArray` and :class:`BitStream` respectively.
 See the reference documentation for full details.
 
 Arrays of bitstrings
diff -pruN 4.2.3-1/doc/introduction.rst 4.3.1-1/doc/introduction.rst
--- 4.2.3-1/doc/introduction.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/introduction.rst	2025-03-16 16:31:02.000000000 +0000
@@ -129,8 +129,8 @@ Methods that need another bitstring as a
 
 which illustrates a variety of methods promoting strings, iterables and a bytes object to bitstrings.
 
-Anything that can be used as the first parameter of the ``Bits`` constructor can be auto promoted to a bitstring where one is expected, with the exception of integers.
-Integers won't be auto promoted, but instead will raise a ``TypeError``::
+Anything that can be used as the first parameter of the ``Bits`` constructor can be automatically promoted to a bitstring where one is expected, with the exception of integers.
+Integers won't be promoted, but instead will raise a ``TypeError``::
 
     >>> a = BitArray(100)  # Create bitstring with 100 zeroed bits.
     >>> a += 0xff          # TypeError - 0xff is the same as the integer 255.
diff -pruN 4.2.3-1/doc/quick_reference.rst 4.3.1-1/doc/quick_reference.rst
--- 4.2.3-1/doc/quick_reference.rst	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/doc/quick_reference.rst	2025-03-16 16:31:02.000000000 +0000
@@ -65,7 +65,7 @@ Bits
 
 The first parameter (usually referred to as `auto`) can be many different types, including parsable strings, a file handle, a bytes or bytearray object, an integer or an iterable.
 
-A single initialiser from `kwargs` can be used instead of `auto`, including  ``bin``, ``hex``, ``oct``, ``bool``, ``uint``, ``int``, ``float``, ``bytes`` and ``filename``.
+A single initialiser from `kwargs` can be used instead of ``auto``, including  ``bin``, ``hex``, ``oct``, ``bool``, ``uint``, ``int``, ``float``, ``bytes`` and ``filename``.
 
 Examples::
 
@@ -487,19 +487,19 @@ The endianness character must start the
 
 This is followed by at least one of these format characters:
 
-=======   ===============================
-``'b'``   8 bit signed integer
-``'B'``   8 bit unsigned integer
-``'h'``   16 bit signed integer
-``'H'``   16 bit unsigned integer
-``'l'``   32 bit signed integer
-``'L'``   32 bit unsigned integer
-``'q'``   64 bit signed integer
-``'Q'``   64 bit unsigned integer
-``'e'``   16 bit floating point number
-``'f'``   32 bit floating point number
-``'d'``   64 bit floating point number
-=======   ===============================
+=============== ===============================
+``'b'``         8 bit signed integer
+``'B'``         8 bit unsigned integer
+``'h'``         16 bit signed integer
+``'H'``         16 bit unsigned integer
+``'i' / 'l'``   32 bit signed integer
+``'I' / 'L'``   32 bit unsigned integer
+``'q'``         64 bit signed integer
+``'Q'``         64 bit unsigned integer
+``'e'``         16 bit floating point number
+``'f'``         32 bit floating point number
+``'d'``         64 bit floating point number
+=============== ===============================
 
 The exact type is determined by combining the endianness character with the format character, but rather than give an exhaustive list a single example should explain:
 
diff -pruN 4.2.3-1/pyproject.toml 4.3.1-1/pyproject.toml
--- 4.2.3-1/pyproject.toml	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/pyproject.toml	2025-03-16 16:31:02.000000000 +0000
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "bitstring"
-version = "4.2.3"
+version = "4.3.1"
 authors = [
   { name="Scott Griffiths", email="dr.scottgriffiths@gmail.com" },
 ]
@@ -21,12 +21,13 @@ classifiers = [
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
     "License :: OSI Approved :: MIT License",
     "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 keywords = ["binary", "bitarray", "bitvector", "bitfield"]
 dependencies = [
-  "bitarray >= 2.9.0, < 3.0.0",
+  "bitarray >= 3.0.0, < 4.0"
 ]
 
 [project.urls]
diff -pruN 4.2.3-1/release_notes.md 4.3.1-1/release_notes.md
--- 4.2.3-1/release_notes.md	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/release_notes.md	2025-03-16 16:31:02.000000000 +0000
@@ -1,6 +1,20 @@
 
 # Release Notes
 
+### March 2025: version 4.3.1
+
+* Updated bitarray dependency to allow for v3.x.
+
+### January 2025: version 4.3.0
+
+#### A minor update.
+
+* Upgraded bitarray dependency to >= 3.0.0.
+* Explicit support for Python 3.13.
+* Added `i` and `I` struct codes for 32-bit ints. Bug #340.
+* Removed the 'experimental feature' label from the new exotic floating point types.
+* Fix for negative index LSB0 slicing issue. Bug #343.
+
 ### May 2024: version 4.2.3
 
 #### More small bug fixes related to some of the new (beta) float formats.
diff -pruN 4.2.3-1/tests/test_bits.py 4.3.1-1/tests/test_bits.py
--- 4.2.3-1/tests/test_bits.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/tests/test_bits.py	2025-03-16 16:31:02.000000000 +0000
@@ -8,9 +8,9 @@ import array
 import os
 import re
 from bitstring import InterpretError, Bits, BitArray
-from hypothesis import given, assume
+from hypothesis import given, assume, reproduce_failure, settings
 import hypothesis.strategies as st
-
+from bitstring.bitstore import offset_slice_indices_lsb0
 
 sys.path.insert(0, '..')
 
@@ -20,6 +20,33 @@ def remove_unprintable(s: str) -> str:
     colour_escape = re.compile(r'(?:\x1B[@-_])[0-?]*[ -/]*[@-~]')
     return colour_escape.sub('', s)
 
+
+@settings(max_examples=500)
+@given(length=st.integers(0, 9),
+       start=st.integers(-20, 20),
+       stop=st.integers(-20, 20),
+       step=st.integers(0, 7))
+def test_lsb0_slicing(length, start, stop, step):
+    if start == -20:
+        start = None
+    if stop == -20:
+        stop = None
+    if step == 0:
+        step = None
+    values_fwd = list(range(0, length))
+    values_bwd = list(range(0, length))
+    values_bwd.reverse()
+
+    # Convert the start, stop, step to a range over the length
+    start1, stop1, step1 = slice(start, stop, step).indices(length)
+    values1 = values_fwd[start1:stop1:step1]
+
+    lsb0key = offset_slice_indices_lsb0(slice(start, stop, step), length)
+    values2 = values_bwd[lsb0key.start:lsb0key.stop:lsb0key.step]
+    values2.reverse()
+    assert values1 == values2
+
+
 class TestCreation:
     def test_creation_from_bytes(self):
         s = Bits(bytes=b'\xa0\xff')
@@ -530,7 +557,7 @@ class TestLsb0Indexing:
         assert a[:-8] == '0xcdef'
 
     def test_extended_slicing(self):
-        a = Bits('0b100000100100100')
+        a = Bits('0b0100000100100100')
         assert a[2::3] == '0b10111'
 
     def test_all(self):
@@ -556,6 +583,15 @@ class TestLsb0Indexing:
         assert a.endswith('0x123')
         assert not a.endswith('0xabcd')
 
+    def test_lsb0_slicing_error(self):
+        a = Bits('0b01')
+        b = a[::-1]
+        assert b == '0b10'
+        t = Bits('0xf0a')[::-1]
+        assert t == '0x50f'
+        s = Bits('0xf0a')[::-1][::-1]
+        assert s == '0xf0a'
+
 
 class TestLsb0Interpretations:
 
diff -pruN 4.2.3-1/tests/test_bitstream.py 4.3.1-1/tests/test_bitstream.py
--- 4.2.3-1/tests/test_bitstream.py	2024-05-25 20:51:34.000000000 +0000
+++ 4.3.1-1/tests/test_bitstream.py	2025-03-16 16:31:02.000000000 +0000
@@ -2488,6 +2488,8 @@ class TestSplit2:
         assert pack('<H', 23) == BitStream('uintle:16=23')
         assert pack('<l', 23) == BitStream('intle:32=23')
         assert pack('<L', 23) == BitStream('uintle:32=23')
+        assert pack('<i', 23) == BitStream('intle:32=23')
+        assert pack('<I', 23) == BitStream('uintle:32=23')
         assert pack('<q', 23) == BitStream('intle:64=23')
         assert pack('<Q', 23) == BitStream('uintle:64=23')
         assert pack('>b', 23) == BitStream('intbe:8=23')
@@ -2496,6 +2498,8 @@ class TestSplit2:
         assert pack('>H', 23) == BitStream('uintbe:16=23')
         assert pack('>l', 23) == BitStream('intbe:32=23')
         assert pack('>L', 23) == BitStream('uintbe:32=23')
+        assert pack('>i', 23) == BitStream('intbe:32=23')
+        assert pack('>I', 23) == BitStream('uintbe:32=23')
         assert pack('>q', 23) == BitStream('intbe:64=23')
         assert pack('>Q', 23) == BitStream('uintbe:64=23')
         with pytest.raises(bitstring.CreationError):
@@ -2517,6 +2521,8 @@ class TestSplit2:
             assert pack('=H', 23) == BitStream('uintle:16=23')
             assert pack('@l', 23) == BitStream('intle:32=23')
             assert pack('@L', 23) == BitStream('uintle:32=23')
+            assert pack('@i', 23) == BitStream('intle:32=23')
+            assert pack('@I', 23) == BitStream('uintle:32=23')
             assert pack('@q', 23) == BitStream('intle:64=23')
             assert pack('@Q', 23) == BitStream('uintle:64=23')
         else:
@@ -2526,23 +2532,25 @@ class TestSplit2:
             assert pack('@H', 23) == BitStream('uintbe:16=23')
             assert pack('@l', 23) == BitStream('intbe:32=23')
             assert pack('@L', 23) == BitStream('uintbe:32=23')
+            assert pack('@i', 23) == BitStream('intbe:32=23')
+            assert pack('@I', 23) == BitStream('uintbe:32=23')
             assert pack('@q', 23) == BitStream('intbe:64=23')
             assert pack('@Q', 23) == BitStream('uintbe:64=23')
 
     def test_native_endianness(self):
-        s = pack('=2L', 40, 40)
+        s = pack('=2i', 40, 40)
         if sys.byteorder == 'little':
-            assert s == pack('<2L', 40, 40)
+            assert s == pack('<2i', 40, 40)
         else:
             assert sys.byteorder == 'big'
-            assert s == pack('>2L', 40, 40)
+            assert s == pack('>2i', 40, 40)
 
     def test_struct_tokens3(self):
         s = pack('>hhl', 1, 2, 3)
         a, b, c = s.unpack('>hhl')
         assert (a, b, c) == (1, 2, 3)
         s = pack('<QL, >Q \tL', 1001, 43, 21, 9999)
-        assert s.unpack('<QL, >QL') == [1001, 43, 21, 9999]
+        assert s.unpack('<QI, >QL') == [1001, 43, 21, 9999]
 
     def test_struct_tokens_multiplicative_factors(self):
         s = pack('<2h', 1, 2)
